dcmtk-3.6.0/0000755000310500011400000000000011511320701012026 5ustar joergrdicom3dcmtk-3.6.0/FAQ0000644000310500011400000000014410144411672012370 0ustar joergrdicom3DCMTK FAQ - Frequently Asked Questions The FAQ is now available online: http://forum.dcmtk.org/faq dcmtk-3.6.0/VERSION0000644000310500011400000000000611511317013013074 0ustar joergrdicom33.6.0 dcmtk-3.6.0/dcmtls/0000755000310500011400000000000011511320700013313 5ustar joergrdicom3dcmtk-3.6.0/dcmtls/docs/0000755000310500011400000000000011511320700014243 5ustar joergrdicom3dcmtk-3.6.0/dcmtls/docs/dcmtls.dox0000644000310500011400000000366210365674213016275 0ustar joergrdicom3/*! \page mod_dcmtls dcmtls: security extensions for the network library This module contains classes that implement DICOM network communication tunneled through a Transport Layer Security (TLS) connection, conforming to the DICOM "Security Enhancements One" extension (formerly Supplement 31). This module requires the external OpenSSL library. The main interface classes are: \li \b DcmTLSTransportLayer \li \b DcmTLSConnection \section Files The following files provide further documentation: \li \ref file_ciphers \li \ref file_randseed \section Examples The following example shows a code fragment that enables TLS for an association requestor application. The complete network initialization code is not shown here and most error checking code is omitted for brevity. \code T_ASC_Network *net; // network initialization code not shown, T_ASC_Parameters *params; // we just assume these pointers to be valid // create TLS object that initializes the random generator through a file // "random.dat" containing random data (1 kByte is sufficient). DcmTLSTransportLayer *tLayer = new DcmTLSTransportLayer( DICOM_APPLICATION_REQUESTOR, "random.dat"); if (TCS_ok != tLayer->setPrivateKeyFile("privkey.pem", SSL_FILETYPE_PEM)) { cerr << "unable to load private key" << endl; return; } if (TCS_ok != tLayer->setCertificateFile("certificate.pem", SSL_FILETYPE_PEM)) { cerr << "unable to load certificate" << endl; return; } // enable the TLS_RSA_WITH_3DES_EDE_CBC_SHA ciphersuite tLayer->setCipherSuites(SSL3_TXT_RSA_DES_192_CBC3_SHA); // accept any certificate from the remote site (not recommended) tLayer->setCertificateVerification(DCV_ignoreCertificate); // register and activate TLS layer ASC_setTransportLayer(net, tLayer, 1); ASC_setTransportLayerType(params, 1); \endcode */ /*! \page file_ciphers ciphers.txt file \verbinclude ciphers.txt */ /*! \page file_randseed randseed.txt file \verbinclude randseed.txt */ dcmtk-3.6.0/dcmtls/docs/randseed.txt0000644000310500011400000001165311251203407016604 0ustar joergrdicom3 ========================================== RANDOM SEEDS FOR TLS TRANSMISSION IN DCMTK ========================================== The Transport Layer Security (TLS) protocol relies on a pseudo-random number generator (PRNG) for the creation of session keys. The ability of an attacker (e.g. eavesdropper) to predict the sequence of random numbers issued by the PRNG would facilitate cryptographic attacks against the TLS protected communication. For this reason it is important that the internal state of the PRNG is initialized with true random data which cannot be predicted by an attacker. The OpenSSL library on which DCMTK relies for its TLS functions initially tests whether the PRNG has been seeded with sufficient random data. If this test fails, the a warning is issued and no secure TLS connection can be negotiated: Warning: PRNG for TLS not seeded with sufficient random data. For this reason, all TLS-aware DCMTK applications allow to initialize the PRNG with a random seed which is read from file. Optionally the (modified) state of the PRNG can be written back to file upon termination of the application, providing a new random seed for the next application run. The command line options that control this behaviour for the storescu and storescp applications are: +rs --seed [f]ilename: string seed random generator with contents of [f] +ws --write-seed write back modified seed (only with --seed) +wf --write-seed-file [f]ilename: string (only with --seed) write modified seed to file [f] This document describes sources from which an initial random seed file containing physical random data can be obtained. 1. Kernel Random Number Source Device Some modern Unix operating systems (in particular Linux) have a kernel module that gathers environmental noise from device drivers and other sources and feeds them into an entropy pool. Random data can be read from this entropy pool using the /dev/random and /dev/urandom devices (see random(4) manual page.) For example, the following command creates a 1024 byte file "randseed.bin" that can be used to seed the OpenSSL PRNG: dd if=/dev/urandom of=randseed.bin count=2 2. GUI content The content of the screen on systems with graphical user interface is hardly predictable for an attacker (unless an application is run as a service in the background with a well-predictable blank or login screen.) For this reason, the Win32 version of OpenSSL always seeds the PRNG with the content of the current screen. This feature is built-in and does not require additional user interaction. 3. Entropy Gathering Demon (EGD) Entropy Gathering Demon is a user space application (Perl script) that can be run as a daemon on Unix systems that do not provide a kernel random number source device. EGD is available from http://www.lothar.com/tech/crypto/ On systems where EGD is installed, the "openssl" tool can be used to generate a random seeed for the PRNG from EGD. If the EGD socket is installed as /etc/entropy, the following command creates a 1024 byte file "randseed.bin" that can be used to seed the OpenSSL PRNG: openssl rand -rand /etc/entropy -out randseed.bin 1024 4. Pseudo Random Number Generator Daemon (PRNGD) Pseudo Random Number Generator Daemon is a user space application that "offers an EGD compatible interface to obtain random data and is intented to be used as an entropy source to feed other software, especially software based on OpenSSL. Like EGD it calls system programs to collect entropy. Unlike EGD it does not generate a pool of random bits that can be called from other software. Rather more it feeds the bits gathered into the OpenSSL PRNG from which the "random bits" are obtained when requested. This way, PRNGD is never drained and can never block (unlike EGD), so it is also suitable to seed inetd-started programs. It also features a seed-save file, so that it is immediately usable after system start." PRNGD is available from http://www.aet.tu-cottbus.de/personen/jaenicke/postfix_tls/prngd.html 5. Pretty Good Privacy (PGP) Pretty Good Privacy contains a random data generator that relies on the time intervals between keystrokes. The following Unix shell commands would cause PGP 2.6.3i to create a file /tmp/random_data/randseed.bin with about 1000 bits of random data, which can be used to seed the OpenSSL PRNG: mkdir /tmp/random_data chmod 700 /tmp/random_data setenv PGPPATH /tmp/random_data pgp -kg 1024 -u random 6. Medical Images Medical image modalities such as CT, MR, Ultrasound or CR produce lots of unpredictable random noise in the background that is perfectly suited to initialize a PRNG, given that the image is never made available to a third party. The following OpenSSL command line would read a DICOM file "image.dcm" and create a 1024 byte file "randseed.bin" that can be used to seed the OpenSSL PRNG: openssl rand -rand image.dcm -out randseed.bin 1024 dcmtk-3.6.0/dcmtls/docs/Makefile.in0000644000310500011400000000064210721577774016345 0ustar joergrdicom3# # Makefile for dcmtls/docs # @SET_MAKE@ SHELL = /bin/sh srcdir = @srcdir@ top_srcdir = @top_srcdir@ configdir = @top_srcdir@/@configdir@ include $(configdir)/@common_makefile@ files = ciphers.txt randseed.txt all: install: $(configdir)/mkinstalldirs $(DESTDIR)$(docdir) for file in $(files); do \ $(INSTALL_DATA) $$file $(DESTDIR)$(docdir) ;\ done clean: rm -f $(TRASH) distclean: rm -f $(DISTTRASH) dcmtk-3.6.0/dcmtls/docs/ciphers.txt0000644000310500011400000004140011465755701016465 0ustar joergrdicom3 ============================ CIPHERSUITE SUPPORT IN DCMTK ============================ When compiled with OpenSSL support, several of the DCMTK network applications optionally support TLS encapsulated secure DICOM communication as defined in the DICOM Security Enhancements One (Supplement 31). TLS (Transport Layer Security) can be used with different so-called "ciphersuites". Each ciphersuite defines - the algorithm to be used for key-exchange of session keys, - the algorithm to be used for bulk data encryption, and - the algorithm to be used for secure hash (message digest). The ciphersuites to be used for secure DICOM communication can be controlled in the TLS-enabled DCMTK tools, e.g. with appropriate command line parameters. The ciphersuite name constants known to DCMTK are exactly as defined in RFC 2246, RFC 3268 and in the draft IETF specifications draft-ietf-tls-56-bit-ciphersuites-00.txt and draft-ietf-tls-ecc-01.txt The TLS protocol allows a dynamic negotiation of the ciphersuite to be used. For this purpose, the TLS-enabled DCMTK tools allow that multiple ciphersuites be specified. During negotiation, the first ciphersuite that is supported by both communicating entities is selected, i.e. the order of the command line parameters decides in which order the ciphersuites are negotiated. It should be noted that DICOM applications supporting the "Basic TLS Secure Transport Connection Profile" defined in Part 15 of the DICOM standard must always support the TLS_RSA_WITH_3DES_EDE_CBC_SHA ciphersuite for secure DICOM communication. DICOM applications supporting the "AES TLS Secure Transport Connection Profile" defined in Part 15 of the DICOM standard must always support both TLS_RSA_WITH_AES_128_CBC_SHA and TLS_RSA_WITH_3DES_EDE_CBC_SHA ciphersuites for secure DICOM communication and must preferrably select the AES ciphersuite. Applications that wish to claim conformance to one of the DICOM Secure Transport Connection Profiles should make sure that the required ciphersuites are always included in the list of ciphersuites to be negotiated. The default behaviour of the TLS-enabled DCMTK tools, when compiled with an OpenSSL version prior to 0.9.7 is to only negotiate the TLS_RSA_WITH_3DES_EDE_CBC_SHA ciphersuite, conforming to the "Basic TLS Secure Transport Connection Profile". The default behaviour when compiled with OpenSSL release 0.9.7 or newer is to support TLS_RSA_WITH_AES_128_CBC_SHA and TLS_RSA_WITH_3DES_EDE_CBC_SHA, i.e. to conform to the "AES TLS Secure Transport Connection Profile". Note: OpenSSL 0.9.8a always includes and preferrably negotiates 256 bit AES (TLS_RSA_WITH_AES_256_CBC_SHA) in the list of ciphersuites whenever an application specifies support for TLS_RSA_WITH_AES_128_CBC_SHA. This does not break DICOM conformance, but may affect performance. There currently seems to be no way to avoid this behaviour, however, since it is hard-coded in OpenSSL. ============================== NOTES ON CIPHERSUITE SELECTION ============================== The selection of ciphersuites is a matter of Security Policy which is outside the scope of a technical specification (like the DICOM standard) or a tool-set like DCMTK. Nevertheless, when defining this local security policy there is a number of aspects users should be aware of. 1. Unencrypted Ciphersuites TLS defines two unencrypted ciphersuites, TLS_RSA_WITH_NULL_MD5 and TLS_RSA_WITH_NULL_SHA. These ciphersuites do not provide any confidentiality during data transmission - all data is transferred in unencrypted plain text and can be read by any man-in-the-middle. They do, however, provide peer entity authentication and integrity: they prevent any unauthorised modification of data during transfer and allow to identify the communicating entities. The use of these ciphersuites should be avoided if confidential (e.g. patient) data is transmitted over public networks. 2. Anonymous Ciphersuites TLS defines a number of ciphersuites which use anonymous Diffie-Hellman key exchange without signatures. These ciphersuites can be identified by a name starting with "TLS_DH_anon_". They do not allow an authentication of the communicating entities and, therefore, are susceptible to man-in-the-middle attacks. 3. Ciphersuites with Key Length Restrictions The length of the keys used for key exchange of session keys and bulk data encryption determines the effort needed to decrypt a TLS communication with "brute force" attacks (using massive computing power). A number of TLS ciphersuites restricts key lengths in order to comply with U.S. export regulations. These ciphersuites can be identified by the term "EXPORT" or "EXPORT1024" in their name. Users should be aware that the security offered by these ciphersuites is in general lower than the security offered by unrestricted ciphersuites. Whether or not a ciphersuite is considered "safe" for a particular application is a matter of the local security policy, though. Users in Europe should be aware of the European Prestandard ENV 13608-3 "Health informatics - Security for healthcare communication - Part 3: Secure data channels" which requires that no TLS ciphersuite providing less than 80 bits of symmetric effective key space or less than 768 bits of RSA or DH asymmetric key strength may be negotiated if conformance to ENV 13608-3 is claimed by an application. 4. Forward Secrecy Ciphersuites TLS defines a number of ciphersuites which implement a security feature called "forward secrecy", a technique of ensuring that the communicated data are only decipherable for a limited time span by the communicating parties. After that time the communicating parties typically achieve forward secrecy by destroying cryptographic keys. This prevents an attacker from coercing the communicating parties into decrypting old ciphertext. The forward secrecy ciphersuites can be identified by the name starting with "TLS_DHE_". Forward secrecy makes it harder for attackers to compromise confidential information in transit in encrypted form, and so is more secure than the use of non-forward secret cipher suites. However, some national legislations prohibit the use of forward secrecy in terms of non recoverable encryption. Users in Europe who want to use forward secrecy should be aware of the European Prestandard ENV 13608-3 "Health informatics - Security for healthcare communication - Part 3: Secure data channels" which requires that the TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA ciphersuite must be supported if forward secrecy is desired and must be negotiated before ciphersuites not offering forward secrecy if conformance to ENV 13608-3 is claimed by an application. 5. Ciphersuites not supported by OpenSSL DCMTK relies on the OpenSSL library to implement TLS-secured DICOM communication. However, the OpenSSL library does support Diffie-Hellman certificates and, therefore, does not implement the non-ephemeral (i.e., non forward secrecy) ciphersuites. The unsupported ciphersuites are documented in OpenSSL's ciphers(1) manual page and currently include: - TLS_DH_DSS_EXPORT_WITH_DES40_CBC_SHA - TLS_DH_DSS_WITH_DES_CBC_SHA - TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA - TLS_DH_RSA_EXPORT_WITH_DES40_CBC_SHA - TLS_DH_RSA_WITH_DES_CBC_SHA - TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA - TLS_DH_DSS_WITH_AES_128_CBC_SHA - TLS_DH_RSA_WITH_AES_128_CBC_SHA - TLS_DH_DSS_WITH_AES_256_CBC_SHA - TLS_DH_RSA_WITH_AES_256_CBC_SHA ============================== TLS Ciphersuites from RFC 2246 ============================== TLS_RSA_WITH_NULL_MD5 Key exchange : RSA Encryption : none Secure Hash : MD5 Note : UNENCRYPTED, NO CONFIDENTIALITY TLS_RSA_WITH_NULL_SHA Key exchange : RSA Encryption : none Secure Hash : SHA-1 Note : UNENCRYPTED, NO CONFIDENTIALITY TLS_RSA_EXPORT_WITH_RC4_40_MD5 Key exchange : RSA (max. 512 bit) Encryption : RC4 with 40 bit key Secure Hash : MD5 TLS_RSA_WITH_RC4_128_MD5 Key exchange : RSA Encryption : RC4 with 128 bit key Secure Hash : MD5 TLS_RSA_WITH_RC4_128_SHA Key exchange : RSA Encryption : RC4 with 128 bit key Secure Hash : SHA-1 TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5 Key exchange : RSA (max. 512 bit) Encryption : RC2 (CBC mode) with 40 bit key Secure Hash : MD5 TLS_RSA_WITH_IDEA_CBC_SHA Key exchange : RSA Encryption : IDEA (CBC mode, 128 bit key) Secure Hash : SHA-1 TLS_RSA_EXPORT_WITH_DES40_CBC_SHA Key exchange : RSA (max. 512 bit) Encryption : DES (CBC mode) with 40 bit key Secure Hash : SHA-1 TLS_RSA_WITH_DES_CBC_SHA Key exchange : RSA Encryption : DES (CBC mode) with 56 bit key Secure Hash : SHA-1 TLS_RSA_WITH_3DES_EDE_CBC_SHA Key exchange : RSA Encryption : 3DES (EDE CBC mode) with 168 bit key Secure Hash : SHA-1 TLS_DH_DSS_EXPORT_WITH_DES40_CBC_SHA Key exchange : Diffie-Hellman (max. 512 bit) with DSS certificate signature Encryption : DES (CBC mode) with 40 bit key Secure Hash : SHA-1 Note : not supported by OpenSSL TLS_DH_DSS_WITH_DES_CBC_SHA Key exchange : Diffie-Hellman with DSS certificate signature Encryption : DES (CBC mode) with 56 bit key Secure Hash : SHA-1 Note : not supported by OpenSSL TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA Key exchange : Diffie-Hellman with DSS certificate signature Encryption : 3DES (EDE CBC mode) with 168 bit key Secure Hash : SHA-1 Note : not supported by OpenSSL TLS_DH_RSA_EXPORT_WITH_DES40_CBC_SHA Key exchange : Diffie-Hellman (max. 512 bit) with RSA certificate signature Encryption : DES (CBC mode) with 40 bit key Secure Hash : SHA-1 Note : not supported by OpenSSL TLS_DH_RSA_WITH_DES_CBC_SHA Key exchange : Diffie-Hellman with RSA certificate signature Encryption : DES (CBC mode) with 56 bit key Secure Hash : SHA-1 Note : not supported by OpenSSL TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA Key exchange : Diffie-Hellman with RSA certificate signature Encryption : 3DES (EDE CBC mode) with 168 bit key Secure Hash : SHA-1 Note : not supported by OpenSSL TLS_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA Key exchange : Ephemeral Diffie-Hellman (max. 512 bit) with DSS certificate signature Encryption : DES (CBC mode) with 40 bit key Secure Hash : SHA-1 Note : provides forward secrecy TLS_DHE_DSS_WITH_DES_CBC_SHA Key exchange : Ephemeral Diffie-Hellman with DSS certificate signature Encryption : DES (CBC mode) with 56 bit key Secure Hash : SHA-1 Note : provides forward secrecy TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA Key exchange : Ephemeral Diffie-Hellman with DSS certificate signature Encryption : 3DES (EDE CBC mode) with 168 bit key Secure Hash : SHA-1 Note : provides forward secrecy TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA Key exchange : Ephemeral Diffie-Hellman (max. 512 bit) with RSA certificate signature Encryption : DES (CBC mode) with 40 bit key Secure Hash : SHA-1 Note : provides forward secrecy TLS_DHE_RSA_WITH_DES_CBC_SHA Key exchange : Ephemeral Diffie-Hellman with RSA certificate signature Encryption : DES (CBC mode) with 56 bit key Secure Hash : SHA-1 Note : provides forward secrecy TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA Key exchange : Ephemeral Diffie-Hellman with RSA certificate signature Encryption : 3DES (EDE CBC mode) with 168 bit key Secure Hash : SHA-1 Note : provides forward secrecy TLS_DH_anon_EXPORT_WITH_RC4_40_MD5 Key exchange : Anonymous Diffie-Hellman (max. 512 bit), no signatures Encryption : RC4 with 40 bit key Secure Hash : MD5 Note : anonymous ciphersuite, susceptible to man-in-the-middle attacks TLS_DH_anon_WITH_RC4_128_MD5 Key exchange : Anonymous Diffie-Hellman, no signatures Encryption : RC4 with 128 bit key Secure Hash : MD5 Note : anonymous ciphersuite, susceptible to man-in-the-middle attacks TLS_DH_anon_EXPORT_WITH_DES40_CBC_SHA Key exchange : Anonymous Diffie-Hellman (max. 512 bit), no signatures Encryption : DES (CBC mode) with 40 bit key Secure Hash : SHA-1 Note : anonymous ciphersuite, susceptible to man-in-the-middle attacks TLS_DH_anon_WITH_DES_CBC_SHA Key exchange : Anonymous Diffie-Hellman, no signatures Encryption : DES (CBC mode) with 56 bit key Secure Hash : SHA-1 Note : anonymous ciphersuite, susceptible to man-in-the-middle attacks TLS_DH_anon_WITH_3DES_EDE_CBC_SHA Key exchange : Anonymous Diffie-Hellman, no signatures Encryption : 3DES (EDE CBC mode) with 168 bit key Secure Hash : SHA-1 Note : anonymous ciphersuite, susceptible to man-in-the-middle attacks =============================================================== TLS Ciphersuites from draft-ietf-tls-56-bit-ciphersuites-00.txt =============================================================== TLS_RSA_EXPORT1024_WITH_DES_CBC_SHA Key exchange : RSA (max. 1024 bit) Encryption : DES (CBC mode) with 56 bit key Secure Hash : SHA-1 TLS_RSA_EXPORT1024_WITH_RC4_56_SHA Key exchange : RSA (max. 1024 bit) Encryption : RC4 with 56 bit key Secure Hash : SHA-1 TLS_DHE_DSS_EXPORT1024_WITH_DES_CBC_SHA Key exchange : Ephemeral Diffie-Hellman (max. 1024 bit) with DSS certificate signature Encryption : DES (CBC mode) with 56 bit key Secure Hash : SHA-1 Note : provides forward secrecy TLS_DHE_DSS_EXPORT1024_WITH_RC4_56_SHA Key exchange : Ephemeral Diffie-Hellman (max. 1024 bit) with DSS certificate signature Encryption : RC4 with 56 bit key Secure Hash : SHA-1 Note : provides forward secrecy TLS_DHE_DSS_WITH_RC4_128_SHA Key exchange : Ephemeral Diffie-Hellman with DSS certificate signature Encryption : RC4 with 128 bit key Secure Hash : SHA-1 Note : provides forward secrecy =================================================================== Additional Ciphersuites only available with OpenSSL 0.9.7 or newer. =================================================================== TLS_RSA_EXPORT_WITH_RC4_56_MD5 Key exchange : RSA (max. 512 bit) Encryption : RC4 with 56 bit key Secure Hash : MD5 TLS_RSA_EXPORT_WITH_RC2_CBC_56_MD5 Key exchange : RSA (max. 512 bit) Encryption : RC2 (CBC mode) with 56 bit key Secure Hash : MD5 ========================================================================== AES Ciphersuites from RFC3268. Only available with OpenSSL 0.9.7 or newer. ========================================================================== TLS_RSA_WITH_AES_128_CBC_SHA Key exchange : RSA Encryption : AES (CBC mode) with 128 bit key Secure Hash : SHA-1 TLS_DH_DSS_WITH_AES_128_CBC_SHA Key exchange : Diffie-Hellman with DSS certificate signature Encryption : AES (CBC mode) with 128 bit key Secure Hash : SHA-1 Note : not supported by OpenSSL TLS_DH_RSA_WITH_AES_128_CBC_SHA Key exchange : Diffie-Hellman with RSA certificate signature Encryption : AES (CBC mode) with 128 bit key Secure Hash : SHA-1 Note : not supported by OpenSSL TLS_DHE_DSS_WITH_AES_128_CBC_SHA Key exchange : Ephemeral Diffie-Hellman with DSS certificate signature Encryption : AES (CBC mode) with 128 bit key Secure Hash : SHA-1 Note : provides forward secrecy TLS_DHE_RSA_WITH_AES_128_CBC_SHA Key exchange : Ephemeral Diffie-Hellman with RSA certificate signature Encryption : AES (CBC mode) with 128 bit key Secure Hash : SHA-1 Note : provides forward secrecy TLS_DH_anon_WITH_AES_128_CBC_SHA Key exchange : Anonymous Diffie-Hellman, no signatures Encryption : AES (CBC mode) with 128 bit key Secure Hash : SHA-1 Note : anonymous ciphersuite, susceptible to man-in-the-middle attacks TLS_RSA_WITH_AES_256_CBC_SHA Key exchange : RSA Encryption : AES (CBC mode) with 256 bit key Secure Hash : SHA-1 TLS_DH_DSS_WITH_AES_256_CBC_SHA Key exchange : Diffie-Hellman with DSS certificate signature Encryption : AES (CBC mode) with 256 bit key Secure Hash : SHA-1 Note : not supported by OpenSSL TLS_DH_RSA_WITH_AES_256_CBC_SHA Key exchange : Diffie-Hellman with RSA certificate signature Encryption : AES (CBC mode) with 256 bit key Secure Hash : SHA-1 Note : not supported by OpenSSL TLS_DHE_DSS_WITH_AES_256_CBC_SHA Key exchange : Ephemeral Diffie-Hellman with DSS certificate signature Encryption : AES (CBC mode) with 256 bit key Secure Hash : SHA-1 Note : provides forward secrecy TLS_DHE_RSA_WITH_AES_256_CBC_SHA Key exchange : Ephemeral Diffie-Hellman with RSA certificate signature Encryption : AES (CBC mode) with 256 bit key Secure Hash : SHA-1 Note : provides forward secrecy TLS_DH_anon_WITH_AES_256_CBC_SHA Key exchange : Anonymous Diffie-Hellman, no signatures Encryption : AES (CBC mode) with 256 bit key Secure Hash : SHA-1 Note : anonymous ciphersuite, susceptible to man-in-the-middle attacks dcmtk-3.6.0/dcmtls/docs/CMakeLists.txt0000644000310500011400000000013510312227643017014 0ustar joergrdicom3# declare installation files INSTALL_FILES(${INSTALL_DOCDIR} FILES ciphers.txt randseed.txt) dcmtk-3.6.0/dcmtls/configure0000755000310500011400000000216311402146325015234 0ustar joergrdicom3#! /bin/sh parentdir=`pwd` thisdir=$parentdir # The following test constructs relative path from the module # directory to the configuration directory. If you know this path # you can substitute this with # configdir= # It is very important that the configdir path is relative. configdir="configdir" while test "$parentdir" != "/" -a "$configdir" = "configdir"; do if test -d "$parentdir/config" ; then configdir=$parentdir/config else parentdir=`echo $parentdir | sed 's/\/[^\/]*$//'` fi done if test "$configdir" = "configdir" ; then echo "Cannot find configure directory" exit 1 fi if test $# != 0; then case $1 in -a) shift cd "$configdir" echo "running configure in config-directory" ./configure $* cd $thisdir echo "running configure for this module" sh "$configdir/confmod" --srcdir=. $* ;; -c) shift cd "$configdir" echo "running configure in config-directory" ./configure $* ;; *) echo "running configure for this module" sh "$configdir/confmod" --srcdir=. $* ;; esac else echo "running configure for this module" sh "$configdir/confmod" --srcdir=. $* fi dcmtk-3.6.0/dcmtls/Makefile.in0000644000310500011400000000345110721602403015370 0ustar joergrdicom3# # Makefile for dcmtls # @SET_MAKE@ SHELL = /bin/sh VPATH = @srcdir@:@top_srcdir@/include:@top_srcdir@/@configdir@/include srcdir = @srcdir@ top_srcdir = @top_srcdir@ configdir = @top_srcdir@/@configdir@ include $(configdir)/@common_makefile@ all: include-all libsrc-all apps-all tests-all install: install-bin install-doc install-support install-bin: apps-install install-doc: docs-install install-data: data-install install-etc: etc-install install-include: include-install install-lib: libsrc-install install-include install-support: install-data install-etc include-all: (cd include && $(MAKE) ARCH="$(ARCH)" all) libsrc-all: include-all (cd libsrc && $(MAKE) ARCH="$(ARCH)" all) apps-all: libsrc-all (cd apps && $(MAKE) ARCH="$(ARCH)" all) tests-all: libsrc-all (cd apps && $(MAKE) ARCH="$(ARCH)" all) include-install: (cd include && $(MAKE) ARCH="$(ARCH)" install) libsrc-install: libsrc-all (cd libsrc && $(MAKE) ARCH="$(ARCH)" install) apps-install: apps-all (cd apps && $(MAKE) ARCH="$(ARCH)" install) docs-install: (cd docs && $(MAKE) install) data-install: (cd data && $(MAKE) install) etc-install: (cd etc && $(MAKE) install) clean: (cd include && $(MAKE) clean) (cd libsrc && $(MAKE) clean) (cd apps && $(MAKE) clean) (cd tests && $(MAKE) clean) (cd docs && $(MAKE) clean) (cd data && $(MAKE) clean) (cd etc && $(MAKE) clean) rm -f $(TRASH) distclean: (cd include && $(MAKE) distclean) (cd libsrc && $(MAKE) distclean) (cd apps && $(MAKE) distclean) (cd tests && $(MAKE) distclean) (cd docs && $(MAKE) distclean) (cd data && $(MAKE) distclean) (cd etc && $(MAKE) distclean) rm -f $(DISTTRASH) dependencies: (cd libsrc && touch $(DEP) && $(MAKE) dependencies) (cd apps && touch $(DEP) && $(MAKE) dependencies) # (cd tests && touch $(DEP) && $(MAKE) dependencies) dcmtk-3.6.0/dcmtls/tests/0000755000310500011400000000000011511320700014455 5ustar joergrdicom3dcmtk-3.6.0/dcmtls/tests/Makefile.in0000644000310500011400000000052510721600010016521 0ustar joergrdicom3# # Makefile for dcmtls/tests # @SET_MAKE@ SHELL = /bin/sh VPATH = @srcdir@:@top_srcdir@/include:@top_srcdir@/@configdir@/include srcdir = @srcdir@ top_srcdir = @top_srcdir@ configdir = @top_srcdir@/@configdir@ include $(configdir)/@common_makefile@ all: install: clean: rm -f $(TRASH) distclean: rm -f $(DISTTRASH) dependencies: dcmtk-3.6.0/dcmtls/tests/dcmtk_ca.pl0000755000310500011400000003414711455577567016633 0ustar joergrdicom3#!/usr/local/bin/perl # # Copyright (C) 1998-2010, 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: # This script simplifies the set-up and operation of a Certification # Authority by means of OpenSSL, for use with the TLS-enhanced # DCMTK DICOM Tools. # # Last Update: $Author: joergr $ # Update Date: $Date: 2010-10-14 13:02:47 $ # CVS/RCS Revision: $Revision: 1.4 $ # Status: $State: Exp $ # # CVS/RCS Log at end of file # $const_openssl="openssl"; $const_ca_key="cakey.pem"; $const_ca_cert="cacert.pem"; $const_ca_config="openssl.cnf"; $const_ca_seed="randseed.bin"; $numCommands = 0; for ($i=0; $i<=$#ARGV; $i++) { $_ = $ARGV[$i]; if (/^-/) { $options{$_} = $ARGV[++$i]; } else { $command[$numCommands++] = $_; } } if ($numCommands < 1) { &usageAndExit(); } if ($command[0] eq 'newca') { if ($numCommands != 2) { &usageAndExit(); } &createNewCA($command[1]); exit($?); } elsif ($command[0] eq 'mkcert') { if ($numCommands != 4) { &usageAndExit(); } &createNewCertificate($command[1], $command[2], $command[3]); exit($?); } else { &usageAndExit(); } exit(0); # # usageAndExit() # print usage string and terminate. # sub usageAndExit { print <${ca_directory}/serial"; print OUT "01\n"; close OUT; open OUT, ">${ca_directory}/index.txt"; close OUT; &createNewConfigFile($ca_directory); system ("$const_openssl rand -out ${ca_directory}/private/$const_ca_seed 1024"); if ($type eq 'dsa') { system ("$const_openssl dsaparam -out ${ca_directory}/private/dsaparam.pem $bits"); } else { } system ("$const_openssl req -config ${ca_directory}/$const_ca_config $keytype -x509 -keyout ${ca_directory}/private/$const_ca_key -out ${ca_directory}/$const_ca_cert $days"); system ("cp ${ca_directory}/$const_ca_cert ${ca_directory}/certs/00.pem"); system ("cd ${ca_directory}/certs; ln -s 00.pem `openssl x509 -hash -noout -in 00.pem`.0"); return $?; } # # createNewCertificate(string cadir, string certfile, string certkey) # creates a new key pair consisting of a private key file and a certificate file # signed by the CA. # @param cadir directory of the CA # @param certfile certificate file to be written # @param certkey private key file to be written # sub createNewCertificate { local($ca_directory, $certfile, $certkey) = @_; local($days) = $options{'-days'}; if ($days ne '') { $days = "-days $days"; } local($ca_certificate) = $options{'-cacert'}; local($bits) = $options{'-bits'}; if ($bits == 0) { $bits = 1024; } local($type) = $options{'-type'}; local($encryption); local($des) = $options{'-des'}; local($pkcs12) = $options{'-pkcs12'}; local($pkcs12name) = $options{'-pkcs12name'}; if ($pkcs12name eq '') { $pkcs12name = "OpenSSL generated DCMTK Certificate"; } if ($des eq 'no') { $encryption = '-nodes'; } local($keytype); if ($type eq 'dsa') { $keytype = "-newkey dsa:${ca_directory}/private/tempdh.pem"; } else { $keytype = "-newkey rsa:$bits"; } if (! -d "$ca_directory") { die "error: $ca_directory not found, bailing out."; } if ($type eq 'dsa') { system ("$const_openssl dsaparam -out ${ca_directory}/private/tempdh.pem $bits"); } system ("$const_openssl req -config ${ca_directory}/$const_ca_config $encryption $keytype -keyout $certkey -out ${ca_directory}/private/tempreq.pem"); system ("$const_openssl ca -config ${ca_directory}/$const_ca_config -policy policy_anything -in ${ca_directory}/private/tempreq.pem -out $certfile $days"); if ($type eq 'dsa') { unlink "${ca_directory}/private/tempdh.pem"; } unlink "${ca_directory}/private/tempreq.pem"; @newfiles = `cd ${ca_directory}/newcerts; ls *.pem`; foreach (@newfiles) { chop; system("mv ${ca_directory}/newcerts/$_ ${ca_directory}/certs"); system("cd ${ca_directory}/certs; ln -s $_ `$const_openssl x509 -hash -noout -in $_`.0"); } if ($pkcs12 ne '') { system ("$const_openssl pkcs12 -in $certfile -inkey $certkey -certfile ${ca_directory}/$const_ca_cert -out $pkcs12 -export -name \"$pkcs12name\""); } return $?; } # # createNewConfigFile(string directory) # creates new default configuration file named $const_ca_config in CA directory. # @param directory CA directory. # sub createNewConfigFile { local($ca_directory) = @_; open OUT, ">${ca_directory}/$const_ca_config"; ##################################################################### print OUT < END_EXTERN_C OFLogger DCM_dcmtlsGetLogger(); #define DCMTLS_TRACE(msg) OFLOG_TRACE(DCM_dcmtlsGetLogger(), msg) #define DCMTLS_DEBUG(msg) OFLOG_DEBUG(DCM_dcmtlsGetLogger(), msg) #define DCMTLS_INFO(msg) OFLOG_INFO(DCM_dcmtlsGetLogger(), msg) #define DCMTLS_WARN(msg) OFLOG_WARN(DCM_dcmtlsGetLogger(), msg) #define DCMTLS_ERROR(msg) OFLOG_ERROR(DCM_dcmtlsGetLogger(), msg) #define DCMTLS_FATAL(msg) OFLOG_FATAL(DCM_dcmtlsGetLogger(), msg) /** this enum describes how to handle X.509 certificates on a TLS based * secure transport connection. They can be ignored, validated if present * or validated and demanded. */ enum DcmCertificateVerification { /** check peer certificate, fail if no certificate is present */ DCV_requireCertificate, /** check peer certificate if present, succeed if no certificate is present */ DCV_checkCertificate, /** do not check peer certificate */ DCV_ignoreCertificate }; /** factory class which creates secure TLS transport layer connections * and maintains the parameters common to all TLS transport connections * in one application (e.g. the pool of trusted certificates, the key * and certificate to be used for authentication and the list of * ciphersuite to be used for association negotiation. */ class DcmTLSTransportLayer: public DcmTransportLayer { public: /** constructor. * @param networkRole network role to be used by the application, influences * the choice of the secure transport layer code. * @param randFile path to file used to feed the random generator */ DcmTLSTransportLayer(int networkRole, const char *randFile); /// destructor virtual ~DcmTLSTransportLayer(); /** factory method that returns a new transport connection for the * given socket. Depending on the second parameter, either a transparent * or a secure connection is established. If the object cannot be created * (e. g. because no secure layer is available), returns NULL. * @param openSocket TCP/IP socket to be used for the transport connection. * the connection must already be establised on socket level. If a non-null * pointer is returned, the new connection object takes over control of the socket. * @param useSecureLayer if true, a secure layer is used. If false, a * transparent layer is used. * @return pointer to new connection object if successful, NULL otherwise. */ virtual DcmTransportConnection *createConnection(int openSocket, OFBool useSecureLayer); /** loads the private key used for authentication of this application from a file. * @param fileName path to the private key file * @param fileType, must be SSL_FILETYPE_PEM or SSL_FILETYPE_ASN1 * @return TCS_ok if successful, an error code otherwise */ DcmTransportLayerStatus setPrivateKeyFile(const char *fileName, int fileType); /** loads the certificate (public key) used for authentication of this application from a file. * @param fileName path to the certificate file * @param fileType, must be SSL_FILETYPE_PEM or SSL_FILETYPE_ASN1 * @return TCS_ok if successful, an error code otherwise */ DcmTransportLayerStatus setCertificateFile(const char *fileName, int fileType); /** checks if the private key and the certificate set using setPrivateKeyFile() * and setCertificateFile() match, i.e. if they establish a private/public key pair. * @return OFTrue if private key and certificate match, OFFalse otherwise. */ OFBool checkPrivateKeyMatchesCertificate(); /** loads a certificate from a file and adds it to the pool of trusted certificates. * @param fileName path to the certificate file * @param fileType, must be SSL_FILETYPE_PEM or SSL_FILETYPE_ASN1 * @return TCS_ok if successful, an error code otherwise */ DcmTransportLayerStatus addTrustedCertificateFile(const char *fileName, int fileType); /** loads all files as certificates from the specified directory and adds them * to the pool of trusted certificates. * @param fileName path to the directory containing certificate files * @param fileType, must be SSL_FILETYPE_PEM or SSL_FILETYPE_ASN1 * @return TCS_ok if successful, an error code otherwise */ DcmTransportLayerStatus addTrustedCertificateDir(const char *pathName, int fileType); /** sets the list of ciphersuites to negotiate. * @param suites string containing the list of ciphersuites. * The list must be in OpenSSL syntax (use findOpenSSLCipherSuiteName to convert * from RFC 2246 ciphersuite names to OpenSSL names), with ciphersuites separated * by ':' characters. * @return TCS_ok if successful, an error code otherwise */ DcmTransportLayerStatus setCipherSuites(const char *suites); /** returns the number of known ciphersuites. * @return number of known ciphersuites */ static unsigned long getNumberOfCipherSuites(); /** returns a ciphersuite name in RFC 2246 (TLS) form * @param idx index, must be < getNumberOfCipherSuites() * @return ciphersuite name */ static const char *getTLSCipherSuiteName(unsigned long idx); /** returns a ciphersuite name in OpenSSL form * @param idx index, must be < getNumberOfCipherSuites() * @return ciphersuite name */ static const char *getOpenSSLCipherSuiteName(unsigned long idx); /** finds the OpenSSL ciphersuite name for a given RFC 2246 ciphersuite name. * @param tlsCipherSuiteName ciphersuite name in RFC 2246 form * @returns ciphersuite name in OpenSSL form, NULL if unknown. */ static const char *findOpenSSLCipherSuiteName(const char *tlsCipherSuiteName); /** checks if enough entropy data is available to write back a modified * random seed file. * @return OFTrue if random seed file can be written, OFFalse otherwise. */ OFBool canWriteRandomSeed() { return canWriteRandseed; } /** writes a modified random seed to file. * @param randFile path of file to write * @return OFTrue if successful, OFFalse otherwise. */ OFBool writeRandomSeed(const char *randFile); /** adds the contents of a file to the seed for the cryptographic * pseudo-random number generator. The file should contain real * random entropy data gathered from keystrokes, system events, * /dev/random (on Linux) or something similar. * If the TLS layer object is not initialized with sufficient * random data, negotiation of TLS connections may fail. * @param randFile path of the file containing random data */ void seedPRNG(const char *randFile); /** modifies the PRNG by adding random data from the given buffer * to the PRNG state. * @param buf pointer to buffer containing random data * @bufSize number of bytes in buffer */ void addPRNGseed(void *buf, size_t bufSize); /** defines how peer certificates should be treated when * negotiating a TLS connection. * @param vtype certificate verification mode */ void setCertificateVerification(DcmCertificateVerification vtype); /** sets the password string to be used when loading an * encrypted private key file. * Must be called prior to setPrivateKeyFile() in order to be effective. * @param thePasswd password string, may be "" or NULL in which case an empty * password is assumed. */ void setPrivateKeyPasswd(const char *thePasswd); /** sets the password string to be used when loading an * encrypted private key file to be read from the console stdin. */ void setPrivateKeyPasswdFromConsole(); /** loads a set of Diffie-Hellman parameters from file. * These parameters are required for DH, DHE or DSS ciphersuites. * @param filename path to the DH parameter file * @return OFTrue if successful, OFFalse otherwise. */ OFBool setTempDHParameters(const char *filename); /** gets the most important attributes of the given X.509 certificate. * @param peerCertificate X.509 certificate, may be NULL * @return a string describing the certificate */ static OFString dumpX509Certificate(X509 *peerCertificate); private: /// private undefined copy constructor DcmTLSTransportLayer(const DcmTLSTransportLayer&); /// private undefined assignment operator DcmTLSTransportLayer& operator=(const DcmTLSTransportLayer&); /// OpenSSL context data, needed only once per application SSL_CTX *transportLayerContext; /// true if there is enough random data to write a new random seed file OFBool canWriteRandseed; /// contains the password for the private key if set on command line OFString privateKeyPasswd; }; #endif /* WITH_OPENSSL */ #endif /* * $Log: tlslayer.h,v $ * Revision 1.9 2010-10-14 13:17:27 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.8 2009-11-18 12:11:19 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.7 2006-08-15 16:02:55 meichel * Updated the code in module dcmtls to correctly compile when * all standard C++ classes remain in namespace std. * * Revision 1.6 2005/12/08 16:05:38 meichel * Changed include path schema for all DCMTK header files * * Revision 1.5 2003/12/05 10:38:55 joergr * Removed leading underscore characters from preprocessor symbols (reserved * symbols). * * Revision 1.4 2003/07/04 13:28:32 meichel * Added include for ofstream.h, to make sure ofstream is correctly defined * * Revision 1.3 2001/06/01 15:51:12 meichel * Updated copyright header * * Revision 1.2 2000/10/10 12:13:31 meichel * Added routines for printing certificates and connection parameters. * * Revision 1.1 2000/08/10 14:50:26 meichel * Added initial OpenSSL support. * * */ dcmtk-3.6.0/dcmtls/include/dcmtk/dcmtls/tlstrans.h0000644000310500011400000001434011455601347021373 0ustar joergrdicom3/* * * Copyright (C) 1998-2010, 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: dcmnet * * Author: Marco Eichelberg * * Purpose: * classes: DcmTransportConnection * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:17:27 $ * CVS/RCS Revision: $Revision: 1.9 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef TLSTRANS_H #define TLSTRANS_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmnet/dcmtrans.h" /* for DcmTransportConnection */ #include "dcmtk/ofstd/ofstream.h" /* for ostream */ #ifdef WITH_OPENSSL BEGIN_EXTERN_C #include END_EXTERN_C /** this class represents a TLS (Transport Layer Security) V1 based secure * transport connection. */ class DcmTLSConnection: public DcmTransportConnection { public: /** constructor. * @param openSocket TCP/IP socket to be used for the transport connection. * the connection must already be establised on socket level. This object * takes over control of the socket. * @param newTLSConnection pointer to intialized OpenSSL connection object * to be used for this connection. */ DcmTLSConnection(int openSocket, SSL *newTLSConnection); /** destructor */ virtual ~DcmTLSConnection(); /** performs server side handshake on established socket. * This function is used to establish a secure transport connection * over the established TCP connection. * @return TCS_ok if successful, an error code otherwise. */ virtual DcmTransportLayerStatus serverSideHandshake(); /** performs client side handshake on established socket. * This function is used to establish a secure transport connection * over the established TCP connection. * @return TCS_ok if successful, an error code otherwise. */ virtual DcmTransportLayerStatus clientSideHandshake(); /** performs a re-negotiation of the connection with different * connection parameters. Used to change the parameters of the * secure transport connection. * @param newSuite string identifying the ciphersuite to be negotiated. * @return TCS_ok if successful, an error code otherwise. */ virtual DcmTransportLayerStatus renegotiate(const char *newSuite); /** attempts to read nbyte bytes from the transport connection and * writes them into the given buffer. * @param buf buffer * @param nbyte number of bytes to read * @return number of bytes read, negative number if unsuccessful. */ virtual ssize_t read(void *buf, size_t nbyte); /** attempts to write nbyte bytes from the given buffer * to the transport connection. * @param buf buffer * @param nbyte number of bytes to write * @return number of bytes written, negative number if unsuccessful. */ virtual ssize_t write(void *buf, size_t nbyte); /** Closes the transport connection. If a secure connection * is used, a closure alert is sent before the connection * is closed. */ virtual void close(); /** returns the size in bytes of the peer certificate of a secure connection. * @return peer certificate length in bytes */ virtual unsigned long getPeerCertificateLength(); /* copies the peer certificate of a secure connection into a buffer * specified by the caller. If the buffer is too small to hold the * certificate, nothing is copied and zero is returned. * @param buf buffer into which the certificate is written * @param bufLen size of the buffer in bytes * @return number of bytes written, always less or equal bufLen. */ virtual unsigned long getPeerCertificate(void *buf, unsigned long bufLen); /** checks if data is available to be read on the transport connection. * @param timeout maximum number of seconds to wait if no data is available. * If this parameter is 0, the function does not block. * @returns OFTrue if data is available, OFFalse otherwise. */ virtual OFBool networkDataAvailable(int timeout); /** returns OFTrue if this connection is a transparent TCP connection, * OFFalse if the connection is a secure connection. */ virtual OFBool isTransparentConnection(); /** dump the characteristics of the current connection * @param str the string to dump into * @return reference to string */ virtual OFString& dumpConnectionParameters(OFString& str); /** returns an error string for a given error code. * @param code error code * @return description for error code */ virtual const char *errorString(DcmTransportLayerStatus code); private: /// private undefined copy constructor DcmTLSConnection(const DcmTLSConnection&); /// private undefined assignment operator DcmTLSConnection& operator=(const DcmTLSConnection&); /// pointer to the TLS connection structure used by the OpenSSL library SSL *tlsConnection; /// last error code returned by the OpenSSL library unsigned long lastError; }; #endif /* WITH_OPENSSL */ #endif /* * $Log: tlstrans.h,v $ * Revision 1.9 2010-10-14 13:17:27 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.8 2009-11-18 12:11:19 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.7 2006-08-15 16:02:55 meichel * Updated the code in module dcmtls to correctly compile when * all standard C++ classes remain in namespace std. * * Revision 1.6 2005/12/08 16:05:39 meichel * Changed include path schema for all DCMTK header files * * Revision 1.5 2003/12/05 10:38:55 joergr * Removed leading underscore characters from preprocessor symbols (reserved * symbols). * * Revision 1.4 2003/07/04 13:28:32 meichel * Added include for ofstream.h, to make sure ofstream is correctly defined * * Revision 1.3 2001/06/01 15:51:12 meichel * Updated copyright header * * Revision 1.2 2000/10/10 12:13:32 meichel * Added routines for printing certificates and connection parameters. * * Revision 1.1 2000/08/10 14:50:27 meichel * Added initial OpenSSL support. * * */ dcmtk-3.6.0/dcmtls/include/dcmtk/dcmtls/CMakeLists.txt0000644000310500011400000000011610346064025022076 0ustar joergrdicom3# declare installation files INSTALL_FILES(${INSTALL_INCDIR}/dcmtk/dcmtls .h) dcmtk-3.6.0/dcmtls/include/dcmtk/dcmtls/tlsscu.h0000644000310500011400000002026711455601347021043 0ustar joergrdicom3/* * * Copyright (C) 2010, 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: dcmtls * * Author: Michael Onken * * Purpose: Base class for TLS-enabled Service Class Users (SCUs) * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:17:27 $ * CVS/RCS Revision: $Revision: 1.4 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef TLSSCU_H #define TLSSCU_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #ifdef WITH_OPENSSL #include "dcmtk/dcmnet/scu.h" #include "dcmtk/dcmtls/tlstrans.h" #include "dcmtk/dcmtls/tlslayer.h" /** Base class for implementing DICOM TLS-enabled Service Class User functionality. This * class is derived from the general DcmSCU class and just adds the corresponding TLS * capabilities. * @warning This class is EXPERIMENTAL. Be careful to use it in production environment. */ class DcmTLSSCU : public DcmSCU { public: /** Constructor, just initializes internal class members */ DcmTLSSCU(); /** Initialize SCU with connection peer information * @param peerHost [in] The hostname or IP of the host to talk to * @param peerAETtitle [in] AETitle of peer host to be used * @param portNum [in] TCP/IP port number to talk to */ DcmTLSSCU(const OFString& peerHost, const OFString& peerAETitle, const Uint16& portNum); /** Virtual destructor */ virtual ~DcmTLSSCU(); /** Initialize network, i.e. prepare for association negotiation. * @return EC_Normal if initialization was successful, otherwise error code */ virtual OFCondition initNetwork(); /** Negotiate association by using presentation contexts and parameters * as defined by earlier function calls. * @return EC_Normal if negotiation was successful, otherwise error code */ virtual OFCondition negotiateAssociation(); /** Closes the association of this SCU * @param closeType [in] Define whether to release or abort the association */ virtual void closeAssociation(const DcmCloseAssociationType closeType); /** TODO: Not documented yet * @param str [in] Not documented yet */ virtual void addTrustedCertFile(const OFString& str); /** TODO: Not documented yet * @param certDir [in] Not documented yet */ virtual void addTrustedCertDir(const OFString& certDir); /** TODO: Not documented yet * @param privateKey [in] File with private key to authenticate with * @param certFile [in] File with certificate to authenticate with * @param passphrase [in] Password to access key. NULL asks user on console. * "" will send empty password. Default is asking the * user to enter password. * @param privKeyFormat [in] Format of private key parameter. Default is * SSL_FILETYPE_PEM. * @param certFormat [in] Format of certificate file parameter. Default is * SSL_FILETYPE_PEM. */ virtual void enableAuthentication(const OFString& privateKey, const OFString& certFile, const char* passphrase = NULL, const int& privKeyFormat = SSL_FILETYPE_PEM, const int& certFormat = SSL_FILETYPE_PEM); /** Disables authentication. However, DcmTLSSCU will try to establish secured connection * in terms of encrypting data. Default is that authentication is disabled. */ virtual void disableAuthentication(); /** TODO: Not documented yet * @param cs [in] TODO: Not documented yet */ virtual void addCiphersuite(const OFString& cs); /** TODO: Not documented yet * @param seedFile [in] TODO: Not documented yet */ virtual void setReadSeedFile(const OFString& seedFile); /** TODO: Not documented yet * @param seedFile [in] TODO: Not documented yet */ virtual void setWriteSeedFile(const OFString& seedFile); /** Set whether peer's certificate must be there, only is checked if there or is ignored * @param cert [in] The following values are permitted: * DCV_requireCertificate, DCV_checkCertificate, DCV_ignoreCertificate */ virtual void setPeerCertVerification(const DcmCertificateVerification& cert); /** Not documented yet * @param dhParam [in] Not documented yet */ virtual void setDHParam(const OFString& dhParam); /** Returns OFTrue if authentication is enabled * @param TODO: Not documented yet * @return Return value OFTrue */ virtual OFBool getAuthenticationParams(OFString& privKeyFile, OFString& certFile, const char*& passphrase, int& privKeyFormat, int& certFormat) const; /** TODO: Not documented yet * @param files [out] TODO: Not documented yet */ virtual void getTrustedCertFiles(OFList& files /*out*/) const; /** TODO: Not documented yet * @param trustedDirs [out] TODO: Not documented yet */ virtual void getTrustedCertDirs(OFList& trustedDirs /*out*/) const; /** TODO: Not documented yet * @return TODO: Not documented yet */ virtual OFString getCiphersuites() const; /** TODO: Not documented yet * @return TODO: Not documented yet */ virtual OFString getReadSeedFile() const; /** TODO: Not documented yet * @return TODO: Not documented yet */ virtual OFString getWriteSeedFile() const; /** TODO: Not documented yet * @return TODO: Not documented yet */ virtual OFString getDHParam() const; private: /** Private undefined copy-constructor. Shall never be called. * @param src Source object */ DcmTLSSCU( const DcmTLSSCU &src ); /** Private undefined operator=. Shall never be called. * @param src Source object * @return Reference to this */ DcmTLSSCU &operator=( const DcmTLSSCU &src ); /// The TLS layer responsible for all encryption/authentication stuff DcmTLSTransportLayer *m_tLayer; /// If enabled, authentication of client/server is enabled OFBool m_doAuthenticate; /// A list of directories containing trusted certificates (if authentication is enabled) OFList m_trustedCertDirs; /// A list of files containing trusted certificates (if authentication is enabled) OFList m_trustedCertFiles; /// The file containing the private key (if authentication is enabled) OFString m_privateKeyFile ; /// Might be either "SSL_FILETYPE_PEM" (default) or "SSL_FILETYPE_ASN1" int m_privateKeyFileFormat; /// File containing the certificate the SCU should use for authentication OFString m_certificateFile; /// Might be either "SSL_FILETYPE_PEM" (default) or "SSL_FILETYPE_ASN1" int m_certKeyFileFormat; /// Password used for unlocking the private key file. If NULL, password is asked from /// STDIN. If empty string (""), password is sent empty. All others values are sent as /// given. char* m_passwd; /// String containing all ciphersuites being (additionally? TODO) configured OFString m_ciphersuites; /// TODO OFString m_readSeedFile; /// TODO OFString m_writeSeedFile; /// Denotes how certificates are handled, i.e. whether they are required, validated or /// only validated if present DcmCertificateVerification m_certVerification; /// File containing Diffie Hellman parameters to be used OFString m_dhparam; }; #endif // WITH_OPENSSL #endif // TLSSCU_H /* ** CVS Log ** $Log: tlsscu.h,v $ ** Revision 1.4 2010-10-14 13:17:27 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.3 2010-10-01 12:25:29 uli ** Fixed most compiler warnings in remaining modules. ** ** Revision 1.2 2010-06-22 15:49:38 joergr ** Introduced new enumeration type to be used for closeAssociation(). ** ** Revision 1.1 2010-04-29 16:18:00 onken ** Added new class DcmTLSSCU as base class for developing TLS-enabled SCUs. ** */ dcmtk-3.6.0/dcmtls/libsrc/0000755000310500011400000000000011511320700014571 5ustar joergrdicom3dcmtk-3.6.0/dcmtls/libsrc/tlstrans.cc0000644000310500011400000002635011455601106016771 0ustar joergrdicom3/* * * Copyright (C) 1998-2010, 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: dcmtls * * Author: Marco Eichelberg * * Purpose: * classes: DcmTLSConnection * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:14:46 $ * CVS/RCS Revision: $Revision: 1.18 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #ifdef WITH_OPENSSL #define INCLUDE_CSTDLIB #define INCLUDE_CSTDIO #define INCLUDE_CSTRING #define INCLUDE_CERRNO #define INCLUDE_CSIGNAL #define INCLUDE_CTIME #include "dcmtk/ofstd/ofstdinc.h" BEGIN_EXTERN_C #ifdef HAVE_SYS_TIME_H #include #endif #ifdef HAVE_SYS_TYPES_H #include #endif #ifdef HAVE_SYS_SELECT_H #include #endif #ifdef HAVE_WINDOWS_H #include #include #endif #include END_EXTERN_C #ifdef HAVE_GUSI_H #include /* Use the Grand Unified Sockets Interface (GUSI) on Macintosh */ #endif #include "dcmtk/ofstd/ofbmanip.h" #include "dcmtk/dcmtls/tlstrans.h" #include "dcmtk/dcmtls/tlslayer.h" #include "dcmtk/dcmnet/dcompat.h" /* to make sure we have a select prototype */ DcmTLSConnection::DcmTLSConnection(int openSocket, SSL *newTLSConnection) : DcmTransportConnection(openSocket) , tlsConnection(newTLSConnection) , lastError(0) { } DcmTLSConnection::~DcmTLSConnection() { close(); } DcmTransportLayerStatus DcmTLSConnection::serverSideHandshake() { if (tlsConnection == NULL) return TCS_noConnection; DcmTransportLayerStatus result = TCS_ok; lastError = 0; switch (SSL_get_error(tlsConnection, SSL_accept(tlsConnection))) { case SSL_ERROR_NONE: /* success */ break; case SSL_ERROR_SYSCALL: case SSL_ERROR_SSL: lastError = ERR_peek_error(); result = TCS_tlsError; break; default: // case SSL_ERROR_WANT_READ: // case SSL_ERROR_WANT_WRITE: // case SSL_ERROR_WANT_X509_LOOKUP: // case SSL_ERROR_WANT_CONNECT: // case SSL_ERROR_ZERO_RETURN: result = TCS_tlsError; break; } // if the certificate verification has failed, the certificate is already // unavailable at this point. We know that something has gone wrong, but // OpenSSL does not tell us who tried to connect. return result; } DcmTransportLayerStatus DcmTLSConnection::clientSideHandshake() { DCMTLS_TRACE("Starting TLS client handshake"); if (tlsConnection == NULL) return TCS_noConnection; lastError = 0; DcmTransportLayerStatus result = TCS_ok; switch (SSL_get_error(tlsConnection, SSL_connect(tlsConnection))) { case SSL_ERROR_NONE: /* success */ break; case SSL_ERROR_SYSCALL: case SSL_ERROR_SSL: lastError = ERR_peek_error(); result = TCS_tlsError; break; default: // case SSL_ERROR_WANT_READ: // case SSL_ERROR_WANT_WRITE: // case SSL_ERROR_WANT_X509_LOOKUP: // case SSL_ERROR_WANT_CONNECT: // case SSL_ERROR_ZERO_RETURN: result = TCS_tlsError; break; } return result; } DcmTransportLayerStatus DcmTLSConnection::renegotiate(const char *newSuite) { if (tlsConnection == NULL) return TCS_noConnection; if (newSuite == NULL) return TCS_illegalCall; DcmTransportLayerStatus result = TCS_ok; switch (SSL_get_error(tlsConnection, SSL_set_cipher_list(tlsConnection, newSuite))) { case SSL_ERROR_NONE: /* success */ break; case SSL_ERROR_SYSCALL: case SSL_ERROR_SSL: lastError = ERR_peek_error(); result = TCS_tlsError; break; default: // case SSL_ERROR_WANT_READ: // case SSL_ERROR_WANT_WRITE: // case SSL_ERROR_WANT_X509_LOOKUP: // case SSL_ERROR_WANT_CONNECT: // case SSL_ERROR_ZERO_RETURN: result = TCS_tlsError; break; } if (result != TCS_ok) return result; switch (SSL_get_error(tlsConnection, SSL_renegotiate(tlsConnection))) { case SSL_ERROR_NONE: /* success */ break; case SSL_ERROR_SYSCALL: case SSL_ERROR_SSL: lastError = ERR_peek_error(); result = TCS_tlsError; break; default: // case SSL_ERROR_WANT_READ: // case SSL_ERROR_WANT_WRITE: // case SSL_ERROR_WANT_X509_LOOKUP: // case SSL_ERROR_WANT_CONNECT: // case SSL_ERROR_ZERO_RETURN: result = TCS_tlsError; break; } return result; } ssize_t DcmTLSConnection::read(void *buf, size_t nbyte) { if (tlsConnection) return SSL_read(tlsConnection, OFreinterpret_cast(char*, buf), nbyte); errno = EIO; /* IO Error */ return -1; } ssize_t DcmTLSConnection::write(void *buf, size_t nbyte) { if (tlsConnection) return SSL_write(tlsConnection, OFreinterpret_cast(char*, buf), nbyte); errno = EIO; /* IO Error */ return -1; } void DcmTLSConnection::close() { if (tlsConnection != NULL) { SSL_shutdown(tlsConnection); SSL_free(tlsConnection); tlsConnection = NULL; } if (getSocket()!=-1) { #ifdef HAVE_WINSOCK_H (void) shutdown(getSocket(), 1 /* SD_SEND */); (void) closesocket(getSocket()); #else (void) ::close(getSocket()); #endif setSocket(-1); } } unsigned long DcmTLSConnection::getPeerCertificateLength() { unsigned long result = 0; if (tlsConnection) { X509 *peerCert = SSL_get_peer_certificate(tlsConnection); if (peerCert) { result = OFstatic_cast(unsigned long, i2d_X509(peerCert, NULL)); X509_free(peerCert); } } return result; } unsigned long DcmTLSConnection::getPeerCertificate(void *buf, unsigned long bufLen) { unsigned long result = 0; if (tlsConnection && buf) { X509 *peerCert = SSL_get_peer_certificate(tlsConnection); if (peerCert) { unsigned long certSize = OFstatic_cast(unsigned long, i2d_X509(peerCert, NULL)); if (certSize <= bufLen) { unsigned char *p = OFreinterpret_cast(unsigned char *, buf); result = OFstatic_cast(unsigned long, i2d_X509(peerCert, &p)); } X509_free(peerCert); } } return result; } OFBool DcmTLSConnection::networkDataAvailable(int timeout) { /* this is an approximation since SSL_pending does not support * waiting with a timeout. We first check SSL_pending and then * perform a conventional select(). */ if (tlsConnection == NULL) return OFFalse; if (SSL_pending(tlsConnection)) return OFTrue; struct timeval t; fd_set fdset; int nfound; FD_ZERO(&fdset); FD_SET(getSocket(), &fdset); t.tv_sec = timeout; t.tv_usec = 0; #ifdef HAVE_INTP_SELECT nfound = select(getSocket() + 1, (int *)(&fdset), NULL, NULL, &t); #else nfound = select(getSocket() + 1, &fdset, NULL, NULL, &t); #endif if (nfound <= 0) return OFFalse; else { if (FD_ISSET(getSocket(), &fdset)) return OFTrue; else return OFFalse; /* This should not really happen */ } } OFBool DcmTLSConnection::isTransparentConnection() { return OFFalse; } OFString& DcmTLSConnection::dumpConnectionParameters(OFString& str) { if (tlsConnection == NULL) { // This should never happen (famous last words) str = "Transport connection: TLS/SSL over TCP/IP\n Error: No Connection\n"; return str; } X509 *peerCert = SSL_get_peer_certificate(tlsConnection); OFOStringStream stream; stream << "Transport connection: TLS/SSL over TCP/IP" << OFendl << " Protocol: " << SSL_get_version(tlsConnection) << OFendl << " Ciphersuite: " << SSL_CIPHER_get_name(SSL_get_current_cipher(tlsConnection)) << ", version: " << SSL_CIPHER_get_version(SSL_get_current_cipher(tlsConnection)) << ", encryption: " << SSL_CIPHER_get_bits(SSL_get_current_cipher(tlsConnection), NULL) << " bits" << OFendl << DcmTLSTransportLayer::dumpX509Certificate(peerCert) << OFendl; // out << "Certificate verification: " << X509_verify_cert_error_string(SSL_get_verify_result(tlsConnection)) << OFendl; X509_free(peerCert); stream << OFStringStream_ends; OFSTRINGSTREAM_GETSTR(stream, res) str = res; OFSTRINGSTREAM_FREESTR(res) return str; } const char *DcmTLSConnection::errorString(DcmTransportLayerStatus code) { switch (code) { case TCS_ok: return "no error"; /* break; */ case TCS_noConnection: return "no secure connection in place"; /* break; */ case TCS_tlsError: if (lastError) { const char *result = ERR_reason_error_string(lastError); if (result) return result; } return "unspecified TLS error"; /* break; */ case TCS_illegalCall: return "illegal call"; /* break; */ case TCS_unspecifiedError: return "unspecified error"; /* break; */ } return "unknown error code"; } #else /* WITH_OPENSSL */ /* make sure that the object file is not completely empty if compiled * without OpenSSL because some linkers might fail otherwise. */ void tlstrans_dummy_function() { return; } #endif /* WITH_OPENSSL */ /* * $Log: tlstrans.cc,v $ * Revision 1.18 2010-10-14 13:14:46 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.17 2010-08-24 10:06:04 uli * Fixed some resource leaks in dcmtls (FDs and memory was leaked). * * Revision 1.16 2010-08-05 08:38:11 uli * Fixed some warnings from -Wold-style-cast. * * Revision 1.15 2010-06-02 12:32:58 joergr * Appended missing OFStringStream_ends to the end of output streams because * this is required when OFOStringStream is mapped to ostrstream. * * Revision 1.14 2010-04-29 16:18:51 onken * Added debug message noting the initiation of a TLS client handshake. * * Revision 1.13 2010-02-22 11:39:55 uli * Remove some unneeded includes. * * Revision 1.12 2009-11-18 12:11:19 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.11 2006-08-15 16:02:56 meichel * Updated the code in module dcmtls to correctly compile when * all standard C++ classes remain in namespace std. * * Revision 1.10 2005/12/08 15:48:29 meichel * Changed include path schema for all DCMTK header files * * Revision 1.9 2002/11/27 12:58:39 meichel * Adapted module dcmtls to use of new header file ofstdinc.h * * Revision 1.8 2001/12/19 10:00:04 meichel * Added include to avoid warning on Ultrix. * * Revision 1.7 2001/06/05 10:32:56 joergr * Replaced some #ifdef _WIN32 statements by #ifdef HAVE_WINDOWS_H or #ifdef * __CYGWIN__ respectively to reflect the fact that the latest Cygwin/gcc * version does not define _WIN32 any more. * * Revision 1.6 2001/06/01 15:51:13 meichel * Updated copyright header * * Revision 1.5 2000/12/19 12:24:27 meichel * updated tlstrans for Irix 5 compatibility issues. * * Revision 1.4 2000/10/19 08:12:29 meichel * Fixed dcmtls module so that openssl headers are includes only * if the symbol WITH_OPENSSL is defined. * * Revision 1.3 2000/10/11 16:15:35 meichel * Updated includes for Win32 environment * * Revision 1.2 2000/10/10 12:13:36 meichel * Added routines for printing certificates and connection parameters. * * Revision 1.1 2000/08/10 14:50:29 meichel * Added initial OpenSSL support. * * */ dcmtk-3.6.0/dcmtls/libsrc/tlsscu.cc0000644000310500011400000002270711502347376016447 0ustar joergrdicom3/* * * Copyright (C) 2010, 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: dcmtls * * Author: Michael Onken * * Purpose: Base class for TLS-enabled Service Class Users (SCUs) * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-12-16 08:34:06 $ * CVS/RCS Revision: $Revision: 1.4 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #ifdef WITH_OPENSSL #include "dcmtk/dcmtls/tlsscu.h" #include "dcmtk/dcmnet/diutil.h" /* for dcmnet logger */ DcmTLSSCU::DcmTLSSCU() : m_tLayer(NULL), m_doAuthenticate(OFFalse), m_trustedCertDirs(), m_trustedCertFiles(), m_privateKeyFile(""), m_privateKeyFileFormat(SSL_FILETYPE_PEM), m_certificateFile(""), m_certKeyFileFormat(SSL_FILETYPE_PEM), m_passwd(NULL), m_readSeedFile(""), m_writeSeedFile(""), m_certVerification(DCV_requireCertificate), m_dhparam("") { #if OPENSSL_VERSION_NUMBER >= 0x0090700fL m_ciphersuites = TLS1_TXT_RSA_WITH_AES_128_SHA; m_ciphersuites += ":"; m_ciphersuites += SSL3_TXT_RSA_DES_192_CBC3_SHA; #else m_ciphersuites = SSL3_TXT_RSA_DES_192_CBC3_SHA; #endif } DcmTLSSCU::DcmTLSSCU(const OFString& peerHost, const OFString& peerAETitle, const Uint16& portNum) : m_tLayer(NULL), m_doAuthenticate(OFFalse), m_trustedCertDirs(), m_trustedCertFiles(), m_privateKeyFile(""), m_privateKeyFileFormat(SSL_FILETYPE_PEM), m_certificateFile(""), m_certKeyFileFormat(SSL_FILETYPE_PEM), m_passwd(NULL), m_readSeedFile(""), m_writeSeedFile(""), m_certVerification(DCV_requireCertificate), m_dhparam("") { #if OPENSSL_VERSION_NUMBER >= 0x0090700fL m_ciphersuites = TLS1_TXT_RSA_WITH_AES_128_SHA; m_ciphersuites += ":"; m_ciphersuites += SSL3_TXT_RSA_DES_192_CBC3_SHA; #else m_ciphersuites = SSL3_TXT_RSA_DES_192_CBC3_SHA; #endif setPeerHostName(peerHost); setPeerAETitle(peerAETitle); setPeerPort(portNum); } DcmTLSSCU::~DcmTLSSCU() { if (m_passwd) { delete[] m_passwd; m_passwd = NULL; } } OFCondition DcmTLSSCU::initNetwork() { OFCondition cond; /* First, create TLS layer */ m_tLayer = new DcmTLSTransportLayer(DICOM_APPLICATION_REQUESTOR, m_readSeedFile.c_str()); if (m_tLayer == NULL) { DCMTLS_ERROR("Unable to create TLS transport layer for SCP, maybe problem with seed file?"); return EC_IllegalCall; // TODO: need to find better error code } /* If authentication of both sides (and not only encryption) is desired, * handle all associated parameters */ if (m_doAuthenticate) { // Set password. NULL password will ask user on commandline if (m_passwd) m_tLayer->setPrivateKeyPasswd(m_passwd); // Set file that contains the privatey key if ( cond.good() && (TCS_ok != m_tLayer->setPrivateKeyFile(m_privateKeyFile.c_str(), m_privateKeyFileFormat)) ) { DCMTLS_ERROR("Unable to create TLS transport layer for SCP: Unable to load private TLS key from file " << m_privateKeyFile); cond = EC_IllegalCall; // TODO: need to find better error code } // Set file that contains host certificate if ( cond.good() && (TCS_ok != m_tLayer->setCertificateFile(m_certificateFile.c_str(), m_certKeyFileFormat)) ) { DCMTLS_ERROR("Unable to load SCP certificate from file " << m_certificateFile); cond = EC_IllegalCall; // TODO: need to find better error code } // Set whether private key fits with certificate if (! m_tLayer->checkPrivateKeyMatchesCertificate() && cond.good()) { DCMTLS_ERROR("Private key from file " << m_privateKeyFile << " and certificate from file " << m_certificateFile << " do not match"); cond = EC_IllegalCall; // TODO: need to find better error code } } /* Set cipher suites to be supported */ if ( cond.good() && (TCS_ok != m_tLayer->setCipherSuites(m_ciphersuites.c_str())) ) { DCMTLS_ERROR("Unable to set selected cipher suites for SCP"); cond = EC_IllegalCall; // TODO: need to find better error code } /* Initiliaze Diffie-Hellman parameters from file if given */ if (!m_dhparam.empty() && cond.good()) { if (!m_tLayer->setTempDHParameters(m_dhparam.c_str())) cond = EC_IllegalCall; // TODO: need to find better error code } /* Set whether SCU should check the SCP's certificate for validity */ if (cond.good()) m_tLayer->setCertificateVerification(m_certVerification); /* Now we are ready to initialize scu's network structures */ if (cond.good()) cond = DcmSCU::initNetwork(); /* Set the transport layer type (type of network connection) in the params structure. The default is an insecure connection in DcmSCU. To make use of OPENSSL, it must "inject" the TLS layer here. */ if (cond.good()) cond = useSecureConnection(m_tLayer); /* Finally, look whether everyhting was successful. If not, * delete secure layer created above */ if (cond.bad()) { OFString msg; DimseCondition::dump(msg, cond); DCMTLS_ERROR(msg); delete m_tLayer; m_tLayer = NULL; } return cond; } OFCondition DcmTLSSCU::negotiateAssociation() { // Negotiate association OFCondition cond = DcmSCU::negotiateAssociation(); if (cond.bad()) { // if something goes wrong, delete TLS structures delete m_tLayer; m_tLayer = NULL; } return cond; } void DcmTLSSCU::closeAssociation(const DcmCloseAssociationType closeType) { // Close association DcmSCU::closeAssociation(closeType); if (m_tLayer && !m_writeSeedFile.empty()) { if (m_tLayer->canWriteRandomSeed()) { if (!m_tLayer->writeRandomSeed(m_writeSeedFile.c_str())) { DCMNET_WARN("Cannot write random seed file '" << m_writeSeedFile << "', ignoring."); } } else { DCMNET_WARN("Cannot write random seed, ignoring"); } } delete m_tLayer; m_tLayer = NULL; } void DcmTLSSCU::enableAuthentication(const OFString& privateKey, const OFString& certFile, const char* passphrase, const int& privKeyFormat, const int& certFormat) { m_doAuthenticate = OFTrue; m_privateKeyFile = privateKey; m_privateKeyFileFormat = privKeyFormat; m_certificateFile = certFile; m_certKeyFileFormat = certFormat; if (m_passwd != NULL) { delete[] m_passwd; m_passwd = NULL; } if (passphrase == NULL) { m_passwd = NULL; return; } int passLength = strlen(passphrase) + 1; m_passwd = new char[passLength]; strncpy(m_passwd, passphrase, passLength); return; } void DcmTLSSCU::addTrustedCertFile(const OFString& str) { m_trustedCertFiles.push_back(str); } void DcmTLSSCU::addTrustedCertDir(const OFString& certDir) { m_trustedCertDirs.push_back(certDir); } void DcmTLSSCU::disableAuthentication() { m_doAuthenticate = OFFalse; } void DcmTLSSCU::addCiphersuite(const OFString& cs) { if (m_ciphersuites.empty()) m_ciphersuites = cs; else { m_ciphersuites+= ":"; m_ciphersuites+= cs; } } void DcmTLSSCU::setReadSeedFile(const OFString& seedFile) { m_readSeedFile = seedFile; } void DcmTLSSCU::setWriteSeedFile(const OFString& seedFile) { m_writeSeedFile = seedFile; } void DcmTLSSCU::setPeerCertVerification(const DcmCertificateVerification& cert) { m_certVerification = cert; } void DcmTLSSCU::setDHParam(const OFString& dhParam) { m_dhparam = dhParam; } OFBool DcmTLSSCU::getAuthenticationParams(OFString& privKeyFile, OFString& certFile, const char*& passphrase, int& privKeyFormat, int& certFormat) const { if (!m_doAuthenticate) return OFFalse; privKeyFile = m_privateKeyFile; certFile = m_certificateFile; passphrase = m_passwd; privKeyFormat = m_privateKeyFileFormat; certFormat = m_certKeyFileFormat; return m_doAuthenticate; } void DcmTLSSCU::getTrustedCertFiles(OFList& files /*out*/) const { files.clear(); OFListConstIterator(OFString) it = m_trustedCertFiles.begin(); while (it != m_trustedCertFiles.end()) { files.push_back(*it); it++; } } void DcmTLSSCU::getTrustedCertDirs(OFList& trustedDirs /*out*/) const { OFListConstIterator(OFString) it = m_trustedCertDirs.begin(); while (it != m_trustedCertDirs.end()) { trustedDirs.push_back(*it); it++; } } OFString DcmTLSSCU::getCiphersuites() const { return m_ciphersuites; } OFString DcmTLSSCU::getReadSeedFile() const { return m_readSeedFile; } OFString DcmTLSSCU::getWriteSeedFile() const { return m_writeSeedFile; } OFString DcmTLSSCU::getDHParam() const { return m_dhparam; } #endif // WITH_OPENSSL /* ** CVS Log ** $Log: tlsscu.cc,v $ ** Revision 1.4 2010-12-16 08:34:06 joergr ** Fixed initialization of OFString variable (reported by gcc 2.95.3). ** ** Revision 1.3 2010-10-14 13:14:46 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.2 2010-06-22 15:50:09 joergr ** Introduced new enumeration type to be used for closeAssociation(). ** ** Revision 1.1 2010-04-29 16:17:56 onken ** Added new class DcmTLSSCU as base class for developing TLS-enabled SCUs. ** */ dcmtk-3.6.0/dcmtls/libsrc/Makefile.in0000644000310500011400000000202011366330537016651 0ustar joergrdicom3# # Makefile for dcmtls/libsrc # @SET_MAKE@ SHELL = /bin/sh VPATH = @srcdir@:@top_srcdir@/include:@top_srcdir@/@configdir@/include srcdir = @srcdir@ top_srcdir = @top_srcdir@ configdir = @top_srcdir@/@configdir@ include $(configdir)/@common_makefile@ ofstddir = $(top_srcdir)/../ofstd oflogdir = $(top_srcdir)/../oflog dcmdatadir = $(top_srcdir)/../dcmdata dcmnetdir = $(top_srcdir)/../dcmnet LOCALINCLUDES = -I$(ofstddir)/include -I$(oflogdir)/include -I$(dcmdatadir)/include -I$(dcmnetdir)/include LOCALDEFS = objs = tlstrans.o tlslayer.o tlsscu.o library = libdcmtls.$(LIBEXT) all: $(library) install: $(library) $(configdir)/mkinstalldirs $(DESTDIR)$(libdir) $(INSTALL_DATA) $(library) $(DESTDIR)$(libdir)/$(library) $(RANLIB) $(DESTDIR)$(libdir)/$(library) $(library): $(objs) $(AR) $(ARFLAGS) $@ $(objs) $(RANLIB) $@ clean: rm -f $(objs) $(library) $(TRASH) distclean: rm -f $(objs) $(library) $(DISTTRASH) dependencies: $(CXX) -MM $(defines) $(includes) $(CPPFLAGS) $(CXXFLAGS) *.cc > $(DEP) include $(DEP) dcmtk-3.6.0/dcmtls/libsrc/Makefile.dep0000644000310500011400000003770411465014467017035 0ustar joergrdicom3tlslayer.o: tlslayer.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmtls/tlslayer.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../dcmnet/include/dcmtk/dcmnet/dcmlayer.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../include/dcmtk/dcmtls/tlstrans.h \ ../../dcmnet/include/dcmtk/dcmnet/dcmtrans.h \ ../../dcmnet/include/dcmtk/dcmnet/dcmlayer.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../dcmnet/include/dcmtk/dcmnet/dicom.h \ ../../dcmnet/include/dcmtk/dcmnet/cond.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmnet/include/dcmtk/dcmnet/dcompat.h \ ../../ofstd/include/dcmtk/ofstd/ofbmanip.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../dcmdata/include/dcmtk/dcmdata/dcuid.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h tlsscu.o: tlsscu.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmtls/tlsscu.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../dcmnet/include/dcmtk/dcmnet/scu.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../dcmdata/include/dcmtk/dcmdata/dctk.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../dcmdata/include/dcmtk/dcmdata/dcswap.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dcxfer.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvr.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../dcmdata/include/dcmtk/dcmdata/dcistrma.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dcostrma.h \ ../../dcmdata/include/dcmtk/dcmdata/dcuid.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvm.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h \ ../../dcmdata/include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmdata/include/dcmtk/dcmdata/dctag.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdicent.h \ ../../dcmdata/include/dcmtk/dcmdata/dchashdi.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdict.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdeftag.h \ ../../dcmdata/include/dcmtk/dcmdata/dcobject.h \ ../../dcmdata/include/dcmtk/dcmdata/dcstack.h \ ../../dcmdata/include/dcmtk/dcmdata/dcelem.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../../dcmdata/include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpcache.h \ ../../dcmdata/include/dcmtk/dcmdata/dcmetinf.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdatset.h \ ../../dcmdata/include/dcmtk/dcmdata/dcsequen.h \ ../../dcmdata/include/dcmtk/dcmdata/dcfilefo.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdicdir.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdirrec.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrulup.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrul.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpixseq.h \ ../../dcmdata/include/dcmtk/dcmdata/dcofsetl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcbytstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrae.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvras.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrcs.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrda.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrds.h \ ../../ofstd/include/dcmtk/ofstd/ofvector.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrdt.h \ ../../ofstd/include/dcmtk/ofstd/ofdatime.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvris.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrtm.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrui.h \ ../../dcmdata/include/dcmtk/dcmdata/dcchrstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlo.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlt.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrpn.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsh.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrst.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrut.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrobow.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpixel.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrpobw.h \ ../../dcmdata/include/dcmtk/dcmdata/dcovlay.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrat.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrss.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrus.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrfl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrfd.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrof.h \ ../../dcmdata/include/dcmtk/dcmdata/cmdlnarg.h \ ../../dcmnet/include/dcmtk/dcmnet/dcompat.h \ ../../ofstd/include/dcmtk/ofstd/ofbmanip.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../dcmnet/include/dcmtk/dcmnet/dimse.h \ ../../dcmnet/include/dcmtk/dcmnet/dicom.h \ ../../dcmnet/include/dcmtk/dcmnet/cond.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../dcmdata/include/dcmtk/dcmdata/dcuid.h \ ../../dcmnet/include/dcmtk/dcmnet/lst.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../dcmnet/include/dcmtk/dcmnet/dul.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../dcmnet/include/dcmtk/dcmnet/extneg.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmnet/include/dcmtk/dcmnet/dcuserid.h \ ../../dcmnet/include/dcmtk/dcmnet/assoc.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdatset.h \ ../../dcmnet/include/dcmtk/dcmnet/dcasccff.h \ ../../dcmnet/include/dcmtk/dcmnet/dcasccfg.h \ ../../dcmnet/include/dcmtk/dcmnet/dccftsmp.h \ ../../dcmnet/include/dcmtk/dcmnet/dcmsmap.h \ ../../dcmnet/include/dcmtk/dcmnet/dccfuidh.h \ ../../dcmnet/include/dcmtk/dcmnet/dccfpcmp.h \ ../../dcmnet/include/dcmtk/dcmnet/dccfrsmp.h \ ../../dcmnet/include/dcmtk/dcmnet/dccfenmp.h \ ../../dcmnet/include/dcmtk/dcmnet/dccfprmp.h \ ../include/dcmtk/dcmtls/tlstrans.h \ ../../dcmnet/include/dcmtk/dcmnet/dcmtrans.h \ ../../dcmnet/include/dcmtk/dcmnet/dcmlayer.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../include/dcmtk/dcmtls/tlslayer.h \ ../../dcmnet/include/dcmtk/dcmnet/dcmlayer.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../dcmnet/include/dcmtk/dcmnet/diutil.h \ ../../oflog/include/dcmtk/oflog/oflog.h tlstrans.o: tlstrans.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofbmanip.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmtls/tlstrans.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../dcmnet/include/dcmtk/dcmnet/dcmtrans.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../dcmnet/include/dcmtk/dcmnet/dcmlayer.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../include/dcmtk/dcmtls/tlslayer.h \ ../../dcmnet/include/dcmtk/dcmnet/dcmlayer.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../dcmnet/include/dcmtk/dcmnet/dcompat.h \ ../../ofstd/include/dcmtk/ofstd/ofbmanip.h dcmtk-3.6.0/dcmtls/libsrc/CMakeLists.txt0000644000310500011400000000023011366330537017345 0ustar joergrdicom3# create library from source files ADD_LIBRARY(dcmtls tlslayer tlstrans tlsscu) # declare installation files INSTALL_TARGETS(${INSTALL_LIBDIR} dcmtls) dcmtk-3.6.0/dcmtls/libsrc/tlslayer.cc0000644000310500011400000004647611455601106016771 0ustar joergrdicom3/* * * Copyright (C) 2000-2010, 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: dcmnet * * Author: Marco Eichelberg * * Purpose: * classes: DcmTLSTransportLayer * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:14:46 $ * CVS/RCS Revision: $Revision: 1.19 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #ifdef WITH_OPENSSL #define INCLUDE_CSTDLIB #include "dcmtk/ofstd/ofstdinc.h" BEGIN_EXTERN_C #ifdef HAVE_WINDOWS_H #include #include #endif #include #include END_EXTERN_C #include "dcmtk/dcmtls/tlslayer.h" #include "dcmtk/dcmtls/tlstrans.h" #include "dcmtk/dcmnet/dicom.h" extern "C" int DcmTLSTransportLayer_certificateValidationCallback(int ok, X509_STORE_CTX *storeContext); OFLogger DCM_dcmtlsGetLogger() { // We don't just use a global variable, because constructors of globals are // executed in random order. This guarantees that the OFLogger is constructed // before first use. static OFLogger DCM_dcmtlsLogger = OFLog::getLogger("dcmtk.dcmtls"); return DCM_dcmtlsLogger; } int DcmTLSTransportLayer_certificateValidationCallback(int ok, X509_STORE_CTX * /* storeContext */) { // this callback is called whenever OpenSSL has validated a X.509 certificate. // we could for example print it: // DcmTLSTransportLayer::printX509Certificate(cout, storeContext->cert); return ok; } /* buf : buffer to write password into * size : length of buffer in bytes * rwflag : nonzero if the password will be used as a new password, i.e. user should be asked to repeat the password * userdata: arbitrary pointer that can be set with SSL_CTX_set_default_passwd_cb_userdata() * returns : number of bytes written to password buffer, -1 upon error */ extern "C" int DcmTLSTransportLayer_passwordCallback(char *buf, int size, int rwflag, void *userdata); int DcmTLSTransportLayer_passwordCallback(char *buf, int size, int /* rwflag */, void *userdata) { if (userdata == NULL) return -1; OFString *password = OFreinterpret_cast(OFString *, userdata); int passwordSize = password->length(); if (passwordSize > size) passwordSize = size; strncpy(buf, password->c_str(), passwordSize); return passwordSize; } struct DcmCipherSuiteList { const char *TLSname; const char *openSSLName; }; static const DcmCipherSuiteList cipherSuiteList[] = { {"TLS_RSA_WITH_NULL_MD5", SSL3_TXT_RSA_NULL_MD5}, {"TLS_RSA_WITH_NULL_SHA", SSL3_TXT_RSA_NULL_SHA}, {"TLS_RSA_EXPORT_WITH_RC4_40_MD5", SSL3_TXT_RSA_RC4_40_MD5}, {"TLS_RSA_WITH_RC4_128_MD5", SSL3_TXT_RSA_RC4_128_MD5}, {"TLS_RSA_WITH_RC4_128_SHA", SSL3_TXT_RSA_RC4_128_SHA}, {"TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5", SSL3_TXT_RSA_RC2_40_MD5}, {"TLS_RSA_WITH_IDEA_CBC_SHA", SSL3_TXT_RSA_IDEA_128_SHA}, {"TLS_RSA_EXPORT_WITH_DES40_CBC_SHA", SSL3_TXT_RSA_DES_40_CBC_SHA}, {"TLS_RSA_WITH_DES_CBC_SHA", SSL3_TXT_RSA_DES_64_CBC_SHA}, {"TLS_RSA_WITH_3DES_EDE_CBC_SHA", SSL3_TXT_RSA_DES_192_CBC3_SHA}, {"TLS_DH_DSS_EXPORT_WITH_DES40_CBC_SHA", SSL3_TXT_DH_DSS_DES_40_CBC_SHA}, {"TLS_DH_DSS_WITH_DES_CBC_SHA", SSL3_TXT_DH_DSS_DES_64_CBC_SHA}, {"TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA", SSL3_TXT_DH_DSS_DES_192_CBC3_SHA}, {"TLS_DH_RSA_EXPORT_WITH_DES40_CBC_SHA", SSL3_TXT_DH_RSA_DES_40_CBC_SHA}, {"TLS_DH_RSA_WITH_DES_CBC_SHA", SSL3_TXT_DH_RSA_DES_64_CBC_SHA}, {"TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA", SSL3_TXT_DH_RSA_DES_192_CBC3_SHA}, {"TLS_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA", SSL3_TXT_EDH_DSS_DES_40_CBC_SHA}, {"TLS_DHE_DSS_WITH_DES_CBC_SHA", SSL3_TXT_EDH_DSS_DES_64_CBC_SHA}, {"TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA", SSL3_TXT_EDH_DSS_DES_192_CBC3_SHA}, {"TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA", SSL3_TXT_EDH_RSA_DES_40_CBC_SHA}, {"TLS_DHE_RSA_WITH_DES_CBC_SHA", SSL3_TXT_EDH_RSA_DES_64_CBC_SHA}, {"TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA", SSL3_TXT_EDH_RSA_DES_192_CBC3_SHA}, {"TLS_DH_anon_EXPORT_WITH_RC4_40_MD5", SSL3_TXT_ADH_RC4_40_MD5}, {"TLS_DH_anon_WITH_RC4_128_MD5", SSL3_TXT_ADH_RC4_128_MD5}, {"TLS_DH_anon_EXPORT_WITH_DES40_CBC_SHA", SSL3_TXT_ADH_DES_40_CBC_SHA}, {"TLS_DH_anon_WITH_DES_CBC_SHA", SSL3_TXT_ADH_DES_64_CBC_SHA}, {"TLS_DH_anon_WITH_3DES_EDE_CBC_SHA", SSL3_TXT_ADH_DES_192_CBC_SHA}, {"TLS_RSA_EXPORT1024_WITH_DES_CBC_SHA", TLS1_TXT_RSA_EXPORT1024_WITH_DES_CBC_SHA}, {"TLS_RSA_EXPORT1024_WITH_RC4_56_SHA", TLS1_TXT_RSA_EXPORT1024_WITH_RC4_56_SHA}, {"TLS_DHE_DSS_EXPORT1024_WITH_DES_CBC_SHA", TLS1_TXT_DHE_DSS_EXPORT1024_WITH_DES_CBC_SHA}, {"TLS_DHE_DSS_EXPORT1024_WITH_RC4_56_SHA", TLS1_TXT_DHE_DSS_EXPORT1024_WITH_RC4_56_SHA}, {"TLS_DHE_DSS_WITH_RC4_128_SHA", TLS1_TXT_DHE_DSS_WITH_RC4_128_SHA} #if OPENSSL_VERSION_NUMBER >= 0x0090700fL // cipersuites added in OpenSSL 0.9.7 , {"TLS_RSA_EXPORT_WITH_RC4_56_MD5", TLS1_TXT_RSA_EXPORT1024_WITH_RC4_56_MD5}, {"TLS_RSA_EXPORT_WITH_RC2_CBC_56_MD5", TLS1_TXT_RSA_EXPORT1024_WITH_RC2_CBC_56_MD5}, /* AES ciphersuites from RFC3268 */ {"TLS_RSA_WITH_AES_128_CBC_SHA", TLS1_TXT_RSA_WITH_AES_128_SHA}, {"TLS_DH_DSS_WITH_AES_128_CBC_SHA", TLS1_TXT_DH_DSS_WITH_AES_128_SHA}, {"TLS_DH_RSA_WITH_AES_128_CBC_SHA", TLS1_TXT_DH_RSA_WITH_AES_128_SHA}, {"TLS_DHE_DSS_WITH_AES_128_CBC_SHA", TLS1_TXT_DHE_DSS_WITH_AES_128_SHA}, {"TLS_DHE_RSA_WITH_AES_128_CBC_SHA", TLS1_TXT_DHE_RSA_WITH_AES_128_SHA}, {"TLS_DH_anon_WITH_AES_128_CBC_SHA", TLS1_TXT_ADH_WITH_AES_128_SHA}, {"TLS_RSA_WITH_AES_256_CBC_SHA", TLS1_TXT_RSA_WITH_AES_256_SHA}, {"TLS_DH_DSS_WITH_AES_256_CBC_SHA", TLS1_TXT_DH_DSS_WITH_AES_256_SHA}, {"TLS_DH_RSA_WITH_AES_256_CBC_SHA", TLS1_TXT_DH_RSA_WITH_AES_256_SHA}, {"TLS_DHE_DSS_WITH_AES_256_CBC_SHA", TLS1_TXT_DHE_DSS_WITH_AES_256_SHA}, {"TLS_DHE_RSA_WITH_AES_256_CBC_SHA", TLS1_TXT_DHE_RSA_WITH_AES_256_SHA}, {"TLS_DH_anon_WITH_AES_256_CBC_SHA", TLS1_TXT_ADH_WITH_AES_256_SHA} #endif }; unsigned long DcmTLSTransportLayer::getNumberOfCipherSuites() { return sizeof(cipherSuiteList)/sizeof(DcmCipherSuiteList); } const char *DcmTLSTransportLayer::getTLSCipherSuiteName(unsigned long idx) { if (idx < sizeof(cipherSuiteList)/sizeof(DcmCipherSuiteList)) return cipherSuiteList[idx].TLSname; return NULL; } const char *DcmTLSTransportLayer::getOpenSSLCipherSuiteName(unsigned long idx) { if (idx < sizeof(cipherSuiteList)/sizeof(DcmCipherSuiteList)) return cipherSuiteList[idx].openSSLName; return NULL; } const char *DcmTLSTransportLayer::findOpenSSLCipherSuiteName(const char *tlsCipherSuiteName) { if (tlsCipherSuiteName == NULL) return NULL; OFString aString(tlsCipherSuiteName); unsigned long numEntries = sizeof(cipherSuiteList)/sizeof(DcmCipherSuiteList); for (unsigned long i = 0; i < numEntries; i++) { if (aString == cipherSuiteList[i].TLSname) return cipherSuiteList[i].openSSLName; } return NULL; } DcmTLSTransportLayer::DcmTLSTransportLayer(int networkRole, const char *randFile) : DcmTransportLayer(networkRole) , transportLayerContext(NULL) , canWriteRandseed(OFFalse) , privateKeyPasswd() { // the call to SSL_library_init was not needed in OpenSSL versions prior to 0.9.8, // but the API has been available at least since 0.9.5. SSL_library_init(); SSL_load_error_strings(); SSLeay_add_all_algorithms(); seedPRNG(randFile); if (networkRole == DICOM_APPLICATION_ACCEPTOR) { transportLayerContext = SSL_CTX_new(TLSv1_server_method()); } else if (networkRole == DICOM_APPLICATION_REQUESTOR) { transportLayerContext = SSL_CTX_new(TLSv1_client_method()); } else { transportLayerContext = SSL_CTX_new(TLSv1_method()); } #ifdef DEBUG if (transportLayerContext == NULL) { const char *result = ERR_reason_error_string(ERR_peek_error()); if (result == NULL) result = "unknown error in SSL_CTX_new()"; DCMTLS_ERROR("unable to create TLS transport layer: " << result); } #endif setCertificateVerification(DCV_requireCertificate); /* default */ } OFBool DcmTLSTransportLayer::setTempDHParameters(const char *filename) { if ((filename==NULL)||(transportLayerContext==NULL)) return OFFalse; DH *dh = NULL; BIO *bio = BIO_new_file(filename,"r"); if (bio) { dh = PEM_read_bio_DHparams(bio,NULL,NULL,NULL); BIO_free(bio); if (dh) { SSL_CTX_set_tmp_dh(transportLayerContext,dh); DH_free(dh); return OFTrue; } } return OFFalse; } void DcmTLSTransportLayer::setPrivateKeyPasswd(const char *thePasswd) { if (thePasswd) privateKeyPasswd = thePasswd; else privateKeyPasswd.clear(); if (transportLayerContext) { /* register callback that replaces console input */ SSL_CTX_set_default_passwd_cb(transportLayerContext, DcmTLSTransportLayer_passwordCallback); SSL_CTX_set_default_passwd_cb_userdata(transportLayerContext, &privateKeyPasswd); } return; } void DcmTLSTransportLayer::setPrivateKeyPasswdFromConsole() { privateKeyPasswd.clear(); if (transportLayerContext) { /* deregister callback that replaces console input */ SSL_CTX_set_default_passwd_cb(transportLayerContext, NULL); SSL_CTX_set_default_passwd_cb_userdata(transportLayerContext, NULL); } return; } void DcmTLSTransportLayer::setCertificateVerification(DcmCertificateVerification verificationType) { if (transportLayerContext) { int vmode = 0; switch (verificationType) { case DCV_requireCertificate: vmode = SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT; break; case DCV_checkCertificate: vmode = SSL_VERIFY_PEER; break; case DCV_ignoreCertificate: break; } SSL_CTX_set_verify(transportLayerContext, vmode, DcmTLSTransportLayer_certificateValidationCallback); } return; } DcmTransportLayerStatus DcmTLSTransportLayer::setCipherSuites(const char *suites) { if (transportLayerContext && suites) { if (!SSL_CTX_set_cipher_list(transportLayerContext, suites)) return TCS_tlsError; } else return TCS_illegalCall; return TCS_ok; } DcmTLSTransportLayer::~DcmTLSTransportLayer() { if (transportLayerContext) SSL_CTX_free(transportLayerContext); } DcmTransportLayerStatus DcmTLSTransportLayer::setPrivateKeyFile(const char *fileName, int fileType) { /* fileType should be SSL_FILETYPE_ASN1 or SSL_FILETYPE_PEM */ if (transportLayerContext) { if (0 >= SSL_CTX_use_PrivateKey_file(transportLayerContext, fileName, fileType)) return TCS_tlsError; } else return TCS_illegalCall; return TCS_ok; } DcmTransportLayerStatus DcmTLSTransportLayer::setCertificateFile(const char *fileName, int fileType) { /* fileType should be SSL_FILETYPE_ASN1 or SSL_FILETYPE_PEM */ if (transportLayerContext) { if (0 >= SSL_CTX_use_certificate_file(transportLayerContext, fileName, fileType)) return TCS_tlsError; } else return TCS_illegalCall; return TCS_ok; } OFBool DcmTLSTransportLayer::checkPrivateKeyMatchesCertificate() { if (transportLayerContext) { if (SSL_CTX_check_private_key(transportLayerContext)) return OFTrue; } return OFFalse; } DcmTransportLayerStatus DcmTLSTransportLayer::addTrustedCertificateFile(const char *fileName, int fileType) { /* fileType should be SSL_FILETYPE_ASN1 or SSL_FILETYPE_PEM */ if (transportLayerContext) { X509_LOOKUP *x509_lookup = X509_STORE_add_lookup(transportLayerContext->cert_store, X509_LOOKUP_file()); if (x509_lookup == NULL) return TCS_tlsError; if (! X509_LOOKUP_load_file(x509_lookup, fileName, fileType)) return TCS_tlsError; } else return TCS_illegalCall; return TCS_ok; } DcmTransportLayerStatus DcmTLSTransportLayer::addTrustedCertificateDir(const char *pathName, int fileType) { /* fileType should be SSL_FILETYPE_ASN1 or SSL_FILETYPE_PEM */ if (transportLayerContext) { X509_LOOKUP *x509_lookup = X509_STORE_add_lookup(transportLayerContext->cert_store, X509_LOOKUP_hash_dir()); if (x509_lookup == NULL) return TCS_tlsError; if (! X509_LOOKUP_add_dir(x509_lookup, pathName, fileType)) return TCS_tlsError; } else return TCS_illegalCall; return TCS_ok; } DcmTransportConnection *DcmTLSTransportLayer::createConnection(int openSocket, OFBool useSecureLayer) { if (useSecureLayer) { if (transportLayerContext) { SSL *newConnection = SSL_new(transportLayerContext); if (newConnection) { SSL_set_fd(newConnection, openSocket); return new DcmTLSConnection(openSocket, newConnection); } } return NULL; } else return new DcmTCPConnection(openSocket); } void DcmTLSTransportLayer::seedPRNG(const char *randFile) { #ifdef _WIN32 RAND_screen(); #endif if (randFile) { if (RAND_egd(randFile) <= 0) { RAND_load_file(randFile ,-1); } } if (RAND_status()) canWriteRandseed = OFTrue; else { /* warn user */ DCMTLS_WARN("PRNG for TLS not seeded with sufficient random data."); } } void DcmTLSTransportLayer::addPRNGseed(void *buf, size_t bufSize) { RAND_seed(buf,OFstatic_cast(int, bufSize)); } OFBool DcmTLSTransportLayer::writeRandomSeed(const char *randFile) { if (canWriteRandseed && randFile) { if (RAND_write_file(randFile)) return OFTrue; } return OFFalse; } OFString DcmTLSTransportLayer::dumpX509Certificate(X509 *peerCertificate) { if (peerCertificate) { long certVersion = 0; /* certificate type */ long certSerialNumber = -1; /* certificate serial number */ OFString certValidNotBefore; /* certificate validity - not before */ OFString certValidNotAfter; /* certificate validity - not after */ char certSubjectName[1024]; /* certificate subject name (DN) */ char certIssuerName[1024]; /* certificate issuer name (DN) */ const char *certPubKeyType = "unknown"; /* certificate public key type */ int certPubKeyBits = 0; /* certificate number of bits in public key */ certSubjectName[0]= '\0'; certIssuerName[0]= '\0'; certVersion = X509_get_version(peerCertificate) +1; certSerialNumber = ASN1_INTEGER_get(X509_get_serialNumber(peerCertificate)); BIO *certValidNotBeforeBIO = BIO_new(BIO_s_mem()); char *bufptr = NULL; if (certValidNotBeforeBIO) { ASN1_UTCTIME_print(certValidNotBeforeBIO, X509_get_notBefore(peerCertificate)); BIO_write(certValidNotBeforeBIO,"\0",1); BIO_get_mem_data(certValidNotBeforeBIO, OFreinterpret_cast(char *, &bufptr)); if (bufptr) certValidNotBefore = bufptr; BIO_free(certValidNotBeforeBIO); } bufptr = NULL; BIO *certValidNotAfterBIO = BIO_new(BIO_s_mem()); if (certValidNotAfterBIO) { ASN1_UTCTIME_print(certValidNotAfterBIO, X509_get_notAfter(peerCertificate)); BIO_write(certValidNotAfterBIO,"\0",1); BIO_get_mem_data(certValidNotAfterBIO, OFreinterpret_cast(char *, &bufptr)); if (bufptr) certValidNotAfter = bufptr; BIO_free(certValidNotAfterBIO); } X509_NAME_oneline(X509_get_subject_name(peerCertificate), certSubjectName, 1024); X509_NAME_oneline(X509_get_issuer_name(peerCertificate), certIssuerName, 1024); EVP_PKEY *pubkey = X509_get_pubkey(peerCertificate); // creates copy of public key if (pubkey) { switch (EVP_PKEY_type(pubkey->type)) { case EVP_PKEY_RSA: certPubKeyType = "RSA"; break; case EVP_PKEY_DSA: certPubKeyType = "DSA"; break; case EVP_PKEY_DH: certPubKeyType = "DH"; break; default: /* nothing */ break; } certPubKeyBits = EVP_PKEY_bits(pubkey); EVP_PKEY_free(pubkey); } OFOStringStream out; out << "X.509v" << certVersion << " Certificate" << OFendl << " Subject : " << certSubjectName << OFendl << " Issued by : " << certIssuerName << OFendl << " Serial no. : " << certSerialNumber << OFendl << " Validity : not before " << certValidNotBefore << ", not after " << certValidNotAfter << OFendl << " Public key : " << certPubKeyType << ", " << certPubKeyBits << " bits" << OFendl << OFStringStream_ends; OFSTRINGSTREAM_GETOFSTRING(out, ret) return ret; } else { return "No X.509 Certificate."; } } #else /* WITH_OPENSSL */ /* make sure that the object file is not completely empty if compiled * without OpenSSL because some linkers might fail otherwise. */ void tlslayer_dummy_function() { return; } #endif /* WITH_OPENSSL */ /* * $Log: tlslayer.cc,v $ * Revision 1.19 2010-10-14 13:14:46 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.18 2010-08-05 08:38:11 uli * Fixed some warnings from -Wold-style-cast. * * Revision 1.17 2010-06-02 12:32:58 joergr * Appended missing OFStringStream_ends to the end of output streams because * this is required when OFOStringStream is mapped to ostrstream. * * Revision 1.16 2010-02-22 11:39:55 uli * Remove some unneeded includes. * * Revision 1.15 2009-12-18 13:15:45 joergr * Fixed issue with beta version of OpenSSL 1.0 (const declaration changed). * * Revision 1.14 2009-11-18 12:11:19 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.13 2009-01-30 13:53:53 joergr * Replaced checking of macro WINDOWS by _WIN32. * * Revision 1.12 2006/08/15 16:02:56 meichel * Updated the code in module dcmtls to correctly compile when * all standard C++ classes remain in namespace std. * * Revision 1.11 2005/12/08 15:48:28 meichel * Changed include path schema for all DCMTK header files * * Revision 1.10 2005/11/23 16:10:28 meichel * Added support for AES ciphersuites in TLS module. All TLS-enabled * tools now support the "AES TLS Secure Transport Connection Profile". * * Revision 1.9 2003/12/18 17:16:05 meichel * Added standard includes needed by Borland Builder * * Revision 1.8 2001/06/05 10:32:55 joergr * Replaced some #ifdef _WIN32 statements by #ifdef HAVE_WINDOWS_H or #ifdef * __CYGWIN__ respectively to reflect the fact that the latest Cygwin/gcc * version does not define _WIN32 any more. * * Revision 1.7 2001/06/01 15:51:13 meichel * Updated copyright header * * Revision 1.6 2000/11/14 13:54:29 meichel * Renamed callback functions to avoid linker name clashes * * Revision 1.5 2000/11/08 11:21:13 meichel * iFixed trailing garbage characters problem in extracting validity * information from a X.509 certificate. * * Revision 1.4 2000/10/19 08:12:29 meichel * Fixed dcmtls module so that openssl headers are includes only * if the symbol WITH_OPENSSL is defined. * * Revision 1.3 2000/10/11 16:15:35 meichel * Updated includes for Win32 environment * * Revision 1.2 2000/10/10 12:13:35 meichel * Added routines for printing certificates and connection parameters. * * Revision 1.1 2000/08/10 14:50:29 meichel * Added initial OpenSSL support. * * */ dcmtk-3.6.0/dcmdata/0000755000310500011400000000000011511320675013435 5ustar joergrdicom3dcmtk-3.6.0/dcmdata/docs/0000755000310500011400000000000011511320675014365 5ustar joergrdicom3dcmtk-3.6.0/dcmdata/docs/dump2dcm.man0000644000310500011400000002514511455570715016615 0ustar joergrdicom3/*! \if MANPAGES \page dump2dcm Convert ASCII dump to DICOM file \else \page dump2dcm dump2dcm: Convert ASCII dump to DICOM file \endif \section synopsis SYNOPSIS \verbatim dump2dcm [options] dumpfile-in dcmfile-out \endverbatim \section description DESCRIPTION The \b dump2dcm utility converts an ASCII dump file to a DICOM file. The dump file has the same format as the output of \b dcmdump. Thus it is possible to capture the output of \b dcmdump into a file, modify some attributes and create a new DICOM file. \section parameters PARAMETERS \verbatim dumpfile-in dump input filename dcmfile-out DICOM output filename \endverbatim \section options OPTIONS \subsection general_options general options \verbatim -h --help print this help text and exit --version print version information and exit --arguments print expanded command line arguments -q --quiet quiet mode, print no warnings and errors -v --verbose verbose mode, print processing details -d --debug debug mode, print debug information -ll --log-level [l]evel: string constant (fatal, error, warn, info, debug, trace) use level l for the logger -lc --log-config [f]ilename: string use config file f for the logger \endverbatim \subsection input_options input options \verbatim input file format: +f --read-meta-info read meta information if present (default) -f --ignore-meta-info ignore file meta information other input options: +l --line [m]ax-length: integer maximum line length m (default: 4096) \endverbatim \subsection processing_options processing options \verbatim unique identifiers: +Ug --generate-new-uids generate new Study/Series/SOP Instance UID -Uo --dont-overwrite-uids do not overwrite existing UIDs (default) +Uo --overwrite-uids overwrite existing UIDs \endverbatim \subsection output_options output options \verbatim output file format: +F --write-file write file format (default) -F --write-dataset write data set without file meta information +Fu --update-meta-info update particular file meta information output transfer syntax: +t= --write-xfer-same write with same TS as input (default) +te --write-xfer-little write with explicit VR little endian +tb --write-xfer-big write with explicit VR big endian TS +ti --write-xfer-implicit write with implicit VR little endian TS +td --write-xfer-deflated write with deflated explicit VR little endian TS error handling: -E --stop-on-error do not write if dump is damaged (default) +E --ignore-errors attempt to write even if dump is damaged post-1993 value representations: +u --enable-new-vr enable support for new VRs (UN/UT) (default) -u --disable-new-vr disable support for new VRs, convert to OB group length encoding: +g= --group-length-recalc recalculate group lengths if present (default) +g --group-length-create always write with group length elements -g --group-length-remove always write without group length elements length encoding in sequences and items: +e --length-explicit write with explicit lengths (default) -e --length-undefined write with undefined lengths data set trailing padding (not with --write-dataset): -p= --padding-retain do not change padding (default if not --write-dataset) -p --padding-off no padding (implicit if --write-dataset) +p --padding-create [f]ile-pad [i]tem-pad: integer align file on multiple of f bytes and items on multiple of i bytes deflate compression level (only with --write-xfer-deflated): +cl --compression-level [l]evel: integer (default: 6) 0=uncompressed, 1=fastest, 9=best compression \endverbatim \section notes NOTES \subsection notes_description Dump File Description The input file can be an output of \b dcmdump (default indented format only). One element (tag, VR, value) must be written into one line separated by arbitrary spaces or tab characters. A '#' begins a comment that ends at the line end. Empty lines are allowed. The individual parts of a line have the following syntax: \verbatim Tag: (gggg,eeee) with gggg and eeee are 4 character hexadecimal values representing group and element tag. Spaces and tabs can be anywhere in a tag specification. VR: Value Representation must be written as 2 characters as in Part 6 of the DICOM standard. No spaces or tabs are allowed between the two characters. If the VR can be determined from the tag, this part of a line is optional. Value: There are several rules for writing values: 1. US, SS, SL, UL, FD, FL are written as decimal strings that can be read by scanf(). 2. AT is written as '(gggg,eeee)' with additional spaces stripped off automatically and gggg and eeee being decimal strings that can be read by scanf(). 3. OB and OW values are written as byte or word hexadecimal values separated by '\\' character. Alternatively, OB or OW values can be read from a separate file by writing the filename prefixed by a '=' character (e.g. '=largepix.dat'). The contents of the file will be read as is. OW data is expected to be little endian ordered and will be swapped if necessary. No checks will be made to ensure that the amount of data is reasonable in terms of other attributes such as Rows or Columns. In case of compressed pixel data, the line should start with '(7fe0,0010) OB (PixelSequence' in order to distinguish from uncompressed pixel data. 4. UI is written as '=Name' in data dictionary or as unique identifier string (see 6.), e.g. '[1.2.840.....]'. 5. Strings without () <> [] spaces, tabs and # can be written directly. 6. Other strings must be surrounded by '[' and ']'. No bracket structure is passed. The value ends at the last ']' in the line. Anything after the ']' is interpreted as comment. 7. '(' and '<' are interpreted special and may not be used when writing an input file by hand as beginning characters of a string. Multiple Value are separated by '\\'. The lines need not be sorted into ascending tag order. References in DICOM Directories are not supported. Semantic errors are not detected. \endverbatim \subsection notes_example Example \verbatim (0008,0020) DA [19921012] # 8, 1 StudyDate (0008,0016) UI =MRImageStorage # 26, 1 SOPClassUID (0002,0012) UI [1.2.276.0.7230010.100.1.1] (0020,0032) DS [0.0\\0.0] # 8, 2 ImagePositionPatient (0028,0009) AT (3004,000c) # 4, 1 FrameIncrementPointer (0028,0010) US 256 # 4, 1 Rows (0002,0001) OB 01\\00 \endverbatim \subsection limitations Limitations Please note that \b dump2dcm currently does not fully support DICOMDIR files. Specifically, the value of the various offset data elements is not updated automatically by this tool. \section logging LOGGING The level of logging output of the various command line tools and underlying libraries can be specified by the user. By default, only errors and warnings are written to the standard error stream. Using option \e --verbose also informational messages like processing details are reported. Option \e --debug can be used to get more details on the internal activity, e.g. for debugging purposes. Other logging levels can be selected using option \e --log-level. In \e --quiet mode only fatal errors are reported. In such very severe error events, the application will usually terminate. For more details on the different logging levels, see documentation of module "oflog". In case the logging output should be written to file (optionally with logfile rotation), to syslog (Unix) or the event log (Windows) option \e --log-config can be used. This configuration file also allows for directing only certain messages to a particular output stream and for filtering certain messages based on the module or application where they are generated. An example configuration file is provided in \/logger.cfg). \section command_line COMMAND LINE All command line tools use the following notation for parameters: square brackets enclose optional values (0-1), three trailing dots indicate that multiple values are allowed (1-n), a combination of both means 0 to n values. Command line options are distinguished from parameters by a leading '+' or '-' sign, respectively. Usually, order and position of command line options are arbitrary (i.e. they can appear anywhere). However, if options are mutually exclusive the rightmost appearance is used. This behaviour conforms to the standard evaluation rules of common Unix shells. In addition, one or more command files can be specified using an '@' sign as a prefix to the filename (e.g. \@command.txt). Such a command argument is replaced by the content of the corresponding text file (multiple whitespaces are treated as a single separator unless they appear between two quotation marks) prior to any further evaluation. Please note that a command file cannot contain another command file. This simple but effective approach allows to summarize common combinations of options/parameters and avoids longish and confusing command lines (an example is provided in file \/dumppat.txt). \section environment ENVIRONMENT The \b dump2dcm utility will attempt to load DICOM data dictionaries specified in the \e DCMDICTPATH environment variable. By default, i.e. if the \e DCMDICTPATH environment variable is not set, the file \/dicom.dic will be loaded unless the dictionary is built into the application (default for Windows). The default behaviour should be preferred and the \e DCMDICTPATH environment variable only used when alternative data dictionaries are required. The \e DCMDICTPATH environment variable has the same format as the Unix shell \e PATH variable in that a colon (":") separates entries. On Windows systems, a semicolon (";") is used as a separator. The data dictionary code will attempt to load each file specified in the \e DCMDICTPATH environment variable. It is an error if no data dictionary can be loaded. \section see_also SEE ALSO dcmdump(1) \section copyright COPYRIGHT Copyright (C) 1996-2010 by OFFIS e.V., Escherweg 2, 26121 Oldenburg, Germany. */ dcmtk-3.6.0/dcmdata/docs/dcmodify.man0000644000310500011400000005171311427776366016711 0ustar joergrdicom3/*! \if MANPAGES \page dcmodify Modify DICOM files \else \page dcmodify dcmodify: Modify DICOM files \endif \section synopsis SYNOPSIS \verbatim dcmodify [options] dcmfile-in... \endverbatim \section description DESCRIPTION \b dcmodify is a tool that allows to modify, insert and delete tags and items in DICOM files. Sequences and tags with a value multiplicity > 1 are also supported. Metaheader information and the tag's VR can not be modified directly by \b dcmodify at this time. In addition to tag modifications, \b dcmodify makes available some input options - forcing \b dcmodify to handle its input files as the user specifies - and output options to control the output format of the resulting files. In case multiple modifications have to be performed, \b dcmodify does the modifications in the same order as they appear on the command line. Please note that \b dcmodify does not check whether a given value matches its value representation (VR). Usually, an error message is printed but generally the user should take care of the right VR usage. If \b dcmodify doesn't know the tag it should insert, then the tag's VR is set to UN and the value provided on commandline is interpreted as being a series of hexadecimal numbers (like they are provided for VR=OB). Please insert these tags into the dictionary to avoid this behaviour. Also, specifying the \e -iun option, it is possible to force \b dcmodify to leave UN values untouched. Using option \e -u lets \b dcmodify saving all VR=UN attributes as OB. \b dcmodify is able to work with so-called tag paths to access tags in sequences. The (pseudo-formalized) syntax is \verbatim {sequence[item-no].}*element \endverbatim \if MANPAGES .fi \endif where 'sequence' is a sequence tag like (0008,1111) or a dictionary name for a tag. 'item-no' describes the item number to be accessed (counting from zero). 'element' defines the target tag to work on. A tag can either be specified directly as (0010,0010) or through the corresponding dictionary name "PatientName". The '*' denotes that you can repeat sequence statements to access deeper levels in DICOM files (see EXAMPLES section). For 'item-no', also a wildcard character '*' can be used selecting all items in surrounding sequence (see section WILDCARDS below). When inserting tag paths consisting of multiple nodes (i.e. not a single element) using the \e -i option, any missing path elements (items, sequences, leaf elements) are inserted automatically when missing. That does not work for item wildcards: When no single item exists in the surrounding sequence \b dcmodify of course can't decide, how many items should be generated. However, if specifying an item number like '5', all 6 items (counted from zero) can be (and are) automatically generated in insert mode. If already 2 items would exist, the rest (4) would be inserted. Please note that there are some issues concerning the modification of private tags (see PRIVATE TAGS section) and for changing UIDs (CHANGING UIDs section). \section parameters PARAMETERS \verbatim dcmfile-in DICOM input filename(s) to be modified \endverbatim \section options OPTIONS \subsection general_options general options \verbatim -h --help print this help text and exit --version print version information and exit --arguments print expanded command line arguments -q --quiet quiet mode, print no warnings and errors -v --verbose verbose mode, print processing details -d --debug debug mode, print debug information -ll --log-level [l]evel: string constant (fatal, error, warn, info, debug, trace) use level l for the logger -lc --log-config [f]ilename: string use config file f for the logger -ie --ignore-errors continue with file, if modify error occurs -nb --no-backup don't backup files (DANGEROUS) \endverbatim \subsection input_options input options \verbatim input file format: +f --read-file read file format or data set (default) +fo --read-file-only read file format only -f --read-dataset read data set without file meta information input transfer syntax: -t= --read-xfer-auto use TS recognition (default) -td --read-xfer-detect ignore TS specified in the file meta header -te --read-xfer-little read with explicit VR little endian TS -tb --read-xfer-big read with explicit VR big endian TS -ti --read-xfer-implicit read with implicit VR little endian TS parsing of odd-length attributes: +ao --accept-odd-length accept odd length attributes (default) +ae --assume-even-length assume real length is one byte larger automatic data correction: +dc --enable-correction enable automatic data correction (default) -dc --disable-correction disable automatic data correction bitstream format of deflated input: +bd --bitstream-deflated expect deflated bitstream (default) +bz --bitstream-zlib expect deflated zlib bitstream \endverbatim \subsection processing_options processing options \verbatim insert mode: -i --insert "[t]ag-path=[v]alue" insert (or overwrite) path at position t with value v -if --insert-from-file "[t]ag-path=[f]ilename" insert (or overwrite) path at position t with value from file f -nrc --no-reserv-check do not check private reservations modify mode: -m --modify "[t]ag-path=[v]alue" modify tag at position t to value v -mf --modify-from-file "[t]ag-path=[f]ilename" modify tag at position t to value from file f -ma --modify-all "[t]ag=[v]alue" modify ALL matching tags t in file to value v erase mode: -e --erase "[t]ag-path" erase tag/item at position t -ea --erase-all "[t]ag" erase ALL matching tags t in file -ep --erase-private erase ALL private data from file unique identifier: -gst --gen-stud-uid generate new Study Instance UID -gse --gen-ser-uid generate new Series Instance UID -gin --gen-inst-uid generate new SOP Instance UID -nmu --no-meta-uid do not update metaheader UIDs if related UIDs in the dataset are modified other processing options: -imt --ignore-missing-tags treat 'tag not found' as success when modifying or erasing in files -iun --ignore-un-values do not try writing any values to elements having VR of UN \endverbatim \subsection output_options output options \verbatim output file format: +F --write-file write file format (default) -F --write-dataset write data set without file meta information output transfer syntax: +t= --write-xfer-same write with same TS as input (default) +te --write-xfer-little write with explicit VR little endian TS +tb --write-xfer-big write with explicit VR big endian TS +ti --write-xfer-implicit write with implicit VR little endian TS post-1993 value representations: +u --enable-new-vr enable support for new VRs (UN/UT) (default) -u --disable-new-vr disable support for new VRs, convert to OB group length encoding: +g= --group-length-recalc recalculate group lengths if present (default) +g --group-length-create always write with group length elements -g --group-length-remove always write without group length elements length encoding in sequences and items: +le --length-explicit write with explicit lengths (default) -le --length-undefined write with undefined lengths data set trailing padding (not with --write-dataset): -p= --padding-retain do not change padding (default if not --write-dataset) -p --padding-off no padding (implicit if --write-dataset) +p --padding-create [f]ile-pad [i]tem-pad: integer align file on multiple of f bytes and items on multiple of i bytes \endverbatim \section private_tags PRIVATE TAGS There are some issues you have to consider when working with private tags. However, the insertion or modification of a reservation tag (gggg,00xx) should always work. \subsection private_insertions Insertions If you wish to insert a private tag (not a reservation with gggg,00xx), be sure, that you've listed it in your dictionary (see \/datadict.txt for details). If it's not listed, \b dcmodify will insert it with VR=UN. Also, for some cases insertion may even fail for some values. If you've got your private tag in the dictionary, \b dcmodify acts as follows: When it finds a reservation in the tag's enclosing dataset, whose private creator matches, insertion is done with the VR found in the dictionary and the value given on command line. But if the private creator doesn't match or none is set, \b dcmodify will return with an error. If a private tag should be inserted regardless whether a reservation does not exist, the option \e -nrc can be used, forcing an insertion. However, the VR is set to UN then, because the tag then cannot be found in the dictionary. See description above how inserting values into elements with unknown VR are handled. \subsection private_modifications Modifications If you modify a private tags value, \b dcmodify won't check its VR against the dictionary. So please be careful to enter only values that match the tag's VR. If you wish to change a private tags value \e and VR, because you just added this tag to your dictionary, you can delete it with \b dcmodify and re-insert it. Then \b dcmodify uses your dicitionary entry to determine the right VR (also see subsection insertions). Also, see description above how inserting values into elements with unknown VR are handled. \subsection private_deletions Deletions When you use \b dcmodify to delete a private reservation tag, please note that \b dcmodify won't touch the private tags that are under this reservation. The user is forced to handle the consistency between reservations and their pending private tags. For the deletion of private non-reservation tags there are no special issues. \section changing_uids CHANGING UIDS \b dcmodify will automatically correct 'Media Storage SOP Class UID' and 'Media Storage SOP Instance UID' in the metaheader, if you make changes to the related tags in the dataset ('SOP Class UID' and 'SOP Instance UID') via insert or modify mode options. You can disable this behaviour by using the \e -nmu option. If you generate new UID's with \e -gst, \e -gse or \e -gin, this will only affect the UID you choosed to generate. So if you use \e -gst to generate a new 'Study Instance UID', then 'Series Instance UID' and 'SOP Instance UID' will not be affected! This gives you the possibility to generate each value separately. Normally, you would also modify the 'underlying' UIDs. As a disadvantage of this flexibility, the user has to assure, that when creating 'new' DICOM files with new UIDs with \b dcmodify, other UIDs have to be updated by the user as necessary. When choosing the \e -gin option, the related metaheader tag ('Media Storage SOP Instance UID') is updated automatically. This behaviour cannot be disabled. \section element_values_from_file ELEMENT VALUES FROM FILE In order to read the element value from a file instead of specifying it on the command line, option \e -mf and \e -if can be used. Please note that for OW elements, the data is expected to be little endian ordered and will be swapped if necessary. The file size should always be an even number of bytes, i.e. no automatic padding is performed. \section wildcards WILDCARDS \b dcmodify also permits the usage of a wildcard character "*" for item numbers in path expressions, e.g. "ContentSequence[*].CodeValue" selects all "Code Value" attributes in all items of the ContentSequence. Using a wildcard is possible for all basic operations, i.e. modifying \e -m, inserting \e -i and \e -e options which makes it, together with the automatic creation of intermediate path nodes a powerful tool for construction and processing complex datasets. The options \e -ma and \e -ea for modifying or deleting all occurences of a DICOM element based on its tag do not accept any wildcards but only work on single elements (i.e. a single dictionary name or tag key). \section examples EXAMPLES \verbatim -i --insert: dcmodify -i "(0010,0010)=A Name" file.dcm Inserts the PatientName tag into 'file.dcm' at 1st level. If tag already exists, -i will overwrite it! If you want to insert an element with value multiplicity > 1 (e.g. 4) you can do this with: dcmodify -i "(0018,1310)=1\\2\\3\\4" dcmodify -i "(0008,1111)[0].PatientName=Another Name" *.dcm Inserts PatientName tag into the first item of sequence (0008,1111). Note that the use of wildcards for files is possible. You can specify longer tag paths, too (e.g. "(0008,1111)[0].(0008,1111)[1].(0010,0010)=A Third One"). If any part of the path, e.g. the sequence or the item "0" does not exist, it is automatically inserted by dcmodify. dcmodify -i "(0008,1111)[*].PatientName=Another Name" *.dcm Inserts PatientName tag into _every_ item of sequence (0008,1111). Note that the use of wildcards for files is possible. You can specify longer tag paths, too (e.g. "(0008,1111)[*].(0008,1111)[*].(0010,0010)=A Third One"). -if --insert-from-file: dcmodify -if "PixelData=pixel.raw" file.dcm Inserts the content of file 'pixel.raw' into the PixelData element of 'file.dcm'. The contents of the file will be read as is. OW data is expected to be little endian ordered and will be swapped if necessary. No checks will be made to ensure that the amount of data is reasonable in terms of other attributes such as Rows or Columns. -m --modify: dcmodify -m "(0010,0010)=A Name" file.dcm Changes tag (0010,0010) on 1st level to "A Name". This option also permits longer tag paths as demonstrated above for -i. If the leaf element or any intermediate part of the path does not exist, it is not inserted as it would be if using the '-i' option. dcmodify -m "(0010,0010)=A Name" -imt file.dcm Changes tag (0010,0010) on 1st level to "A Name". Due to the given option '-imt', success is returned instead of "tag not found", if the element/item (or any intermediate node in a longer path) does not exist. Note that for the '-m' option the last node in the path must be a leaf element, i.e. not a sequence or an item. -mf --modify-from-file: dcmodify -mf "PixelData=pixel.raw" file.dcm Does the same as -if in case there was already a PixelData element in 'file.dcm'. Otherwise nothing is changed. -ma --modify-all: dcmodify -ma "(0010,0010)=New Name" file.dcm Does the same as -m but works on all matching tags found in 'file.dcm'. Therefore, it searches the whole dataset including sequences for tag (0010,0010) and changes them to "New Name" -e --erase: dcmodify -e "(0010,0010)" *.dcm Erases tag (0010,0010) in all *.dcm files at 1st level. This option also allows longer tag paths as demonstrated above for -i. dcmodify -e "(0010,0010)" -imt *.dcm Erases tag (0010,0010) in all *.dcm files at 1st level. Due to the given option '-imt', success is returned instead of "tag not found", if the element/item (or any intermediate node in a longer path) does not exist. -ea --erase-all: dcmodify -ea "(0010,0010)" *.dcm Same as -e, but also searches in sequences and items. -ep --erase-private: dcmodify -ep *.dcm Deletes all private tags (i.e. tags having an odd group number) from all files matching *.dcm in the current directory. -gst --gen-stud-uid: dcmodify -gst file.dcm This generates a new value for the StudyInstanceUID (0020,000d). Other UIDs are not modified! -gse --gen-ser-uid: dcmodify -gse file.dcm This generates a new value for the SeriesInstanceUID (0020,000e). Other UIDs are not modified! -gin --gen-inst-uid: dcmodify -gin file.dcm This command generates a new value for the SOPInstanceUID (0008,0018). The corresponding MediaStorageSOPInstanceUID (0002,0003) is adjusted to the new value automatically. Please note that it's not possible to avoid this metaheader update via the -nmu option. -nmu --no-meta-uid: dcmodify -m "SOPInstanceUID=[UID]" -nmu *.dcm This will modify the SOPInstanceUID to the given [UID], but -nmu avoids, that dcmodify adjusts the MediaStorageSOPInstanceUID in the metaheader, too. \endverbatim \section error_handling ERROR HANDLING \b dcmodify tries executing each modify operation given on command line: If one returns an error, the others are being performed anyway. However in case of any error, the modified file is not saved, unless the \e --ignore-errors option is specified. If that option is selected, \b dcmodify also continues modifying further files specified on commandline; otherwise \b dcmodify exits after the first file that had modification errors. If the \e --ignore-missing-tags option is enabled, any modify or erase operations (i.e. not \e --insert) that fails because of a non-existing tag is treated as being successful. That does make sense if someone wants to be sure that specific tags are not present in the file or that - if they exist - that they are set to a specific value. \section logging LOGGING The level of logging output of the various command line tools and underlying libraries can be specified by the user. By default, only errors and warnings are written to the standard error stream. Using option \e --verbose also informational messages like processing details are reported. Option \e --debug can be used to get more details on the internal activity, e.g. for debugging purposes. Other logging levels can be selected using option \e --log-level. In \e --quiet mode only fatal errors are reported. In such very severe error events, the application will usually terminate. For more details on the different logging levels, see documentation of module "oflog". In case the logging output should be written to file (optionally with logfile rotation), to syslog (Unix) or the event log (Windows) option \e --log-config can be used. This configuration file also allows for directing only certain messages to a particular output stream and for filtering certain messages based on the module or application where they are generated. An example configuration file is provided in \/logger.cfg). \section command_line COMMAND LINE All command line tools use the following notation for parameters: square brackets enclose optional values (0-1), three trailing dots indicate that multiple values are allowed (1-n), a combination of both means 0 to n values. Command line options are distinguished from parameters by a leading '+' or '-' sign, respectively. Usually, order and position of command line options are arbitrary (i.e. they can appear anywhere). However, if options are mutually exclusive the rightmost appearance is used. This behaviour conforms to the standard evaluation rules of common Unix shells. In addition, one or more command files can be specified using an '@' sign as a prefix to the filename (e.g. \@command.txt). Such a command argument is replaced by the content of the corresponding text file (multiple whitespaces are treated as a single separator unless they appear between two quotation marks) prior to any further evaluation. Please note that a command file cannot contain another command file. This simple but effective approach allows to summarize common combinations of options/parameters and avoids longish and confusing command lines (an example is provided in file \/dumppat.txt). \section environment ENVIRONMENT The \b dcmodify utility will attempt to load DICOM data dictionaries specified in the \e DCMDICTPATH environment variable. By default, i.e. if the \e DCMDICTPATH environment variable is not set, the file \/dicom.dic will be loaded unless the dictionary is built into the application (default for Windows). The default behaviour should be preferred and the \e DCMDICTPATH environment variable only used when alternative data dictionaries are required. The \e DCMDICTPATH environment variable has the same format as the Unix shell \e PATH variable in that a colon (":") separates entries. On Windows systems, a semicolon (";") is used as a separator. The data dictionary code will attempt to load each file specified in the \e DCMDICTPATH environment variable. It is an error if no data dictionary can be loaded. \section copyright COPYRIGHT Copyright (C) 2003-2010 by OFFIS e.V., Escherweg 2, 26121 Oldenburg, Germany. */ dcmtk-3.6.0/dcmdata/docs/dcmftest.man0000644000310500011400000000226711455570715016713 0ustar joergrdicom3/*! \if MANPAGES \page dcmftest Test if file uses DICOM part 10 format \else \page dcmftest dcmftest: Test if file uses DICOM part 10 format \endif \section synopsis SYNOPSIS \verbatim dcmftest file... \endverbatim \section description DESCRIPTION The \b dcmftest utility checks whether the files specified on the command line are DICOM files in part 10 format (with meta-header). \section parameters PARAMETERS \verbatim dcmfile-in DICOM input filename to be dumped \endverbatim \section notes NOTES All files specified on the command line are checked for the presence of the DICOM "magic word" 'DICM' at byte position 128. No attempt is made to parse the complete data set. For each file the test result is printed to \e stdout in the form "yes: \n" or "no: \n". The utility terminates with a return code corresponding to the number of files found to be non-DICOM, i.e. if all files pass as DICOM files, the return value is 0. This behaviour is intended for use in shell script programming. \section see_also SEE ALSO dcmgpdir(1), dcmmkdir(1) \section copyright COPYRIGHT Copyright (C) 1997-2010 by OFFIS e.V., Escherweg 2, 26121 Oldenburg, Germany. */dcmtk-3.6.0/dcmdata/docs/dcmcrle.man0000644000310500011400000001722011455570715016506 0ustar joergrdicom3/*! \if MANPAGES \page dcmcrle Encode DICOM file to RLE transfer syntax \else \page dcmcrle dcmcrle: Encode DICOM file to RLE transfer syntax \endif \section synopsis SYNOPSIS \verbatim dcmcrle [options] dcmfile-in dcmfile-out \endverbatim \section description DESCRIPTION The \b dcmcrle utility reads an uncompressed DICOM image (\e dcmfile-in), performs RLE compression (i.e. conversion to an encapsulated DICOM transfer syntax) and writes the converted image to an output file (\e dcmfile-out). \section parameters PARAMETERS \verbatim dcmfile-in DICOM input filename to be converted dcmfile-out DICOM output filename \endverbatim \section options OPTIONS \subsection general_options general options \verbatim -h --help print this help text and exit --version print version information and exit --arguments print expanded command line arguments -q --quiet quiet mode, print no warnings and errors -v --verbose verbose mode, print processing details -d --debug debug mode, print debug information -ll --log-level [l]evel: string constant (fatal, error, warn, info, debug, trace) use level l for the logger -lc --log-config [f]ilename: string use config file f for the logger \endverbatim \subsection input_options input options \verbatim input file format: +f --read-file read file format or data set (default) +fo --read-file-only read file format only -f --read-dataset read data set without file meta information input transfer syntax: -t= --read-xfer-auto use TS recognition (default) -td --read-xfer-detect ignore TS specified in the file meta header -te --read-xfer-little read with explicit VR little endian TS -tb --read-xfer-big read with explicit VR big endian TS -ti --read-xfer-implicit read with implicit VR little endian TS \endverbatim \subsection enc_pix_data_encoding_opt encapsulated pixel data encoding options \verbatim pixel data fragmentation: +ff --fragment-per-frame encode each frame as one fragment (default) +fs --fragment-size [s]ize: integer limit fragment size to s kbytes (non-standard) basic offset table encoding: +ot --offset-table-create create offset table (default) -ot --offset-table-empty leave offset table empty SOP Class UID: +cd --class-default keep SOP Class UID (default) +cs --class-sc convert to Secondary Capture Image (implies --uid-always) SOP Instance UID: +un --uid-never never assign new UID (default) +ua --uid-always always assign new UID \endverbatim \subsection output_options output options \verbatim post-1993 value representations: +u --enable-new-vr enable support for new VRs (UN/UT) (default) -u --disable-new-vr disable support for new VRs, convert to OB group length encoding: +g= --group-length-recalc recalculate group lengths if present (default) +g --group-length-create always write with group length elements -g --group-length-remove always write without group length elements length encoding in sequences and items: +e --length-explicit write with explicit lengths (default) -e --length-undefined write with undefined lengths data set trailing padding: -p= --padding-retain do not change padding (default) -p --padding-off no padding +p --padding-create [f]ile-pad [i]tem-pad: integer align file on multiple of f bytes and items on multiple of i bytes \endverbatim \section transfer_syntaxes TRANSFER SYNTAXES \b dcmcrle supports the following transfer syntaxes for input (\e dcmfile-in): \verbatim LittleEndianImplicitTransferSyntax 1.2.840.10008.1.2 LittleEndianExplicitTransferSyntax 1.2.840.10008.1.2.1 DeflatedExplicitVRLittleEndianTransferSyntax 1.2.840.10008.1.2.1.99 (*) BigEndianExplicitTransferSyntax 1.2.840.10008.1.2.2 \endverbatim (*) if compiled with zlib support enabled \b dcmcrle supports the following transfer syntaxes for output (\e dcmfile-out): \verbatim RLELosslessTransferSyntax 1.2.840.10008.1.2.5 \endverbatim \section logging LOGGING The level of logging output of the various command line tools and underlying libraries can be specified by the user. By default, only errors and warnings are written to the standard error stream. Using option \e --verbose also informational messages like processing details are reported. Option \e --debug can be used to get more details on the internal activity, e.g. for debugging purposes. Other logging levels can be selected using option \e --log-level. In \e --quiet mode only fatal errors are reported. In such very severe error events, the application will usually terminate. For more details on the different logging levels, see documentation of module "oflog". In case the logging output should be written to file (optionally with logfile rotation), to syslog (Unix) or the event log (Windows) option \e --log-config can be used. This configuration file also allows for directing only certain messages to a particular output stream and for filtering certain messages based on the module or application where they are generated. An example configuration file is provided in \/logger.cfg). \section command_line COMMAND LINE All command line tools use the following notation for parameters: square brackets enclose optional values (0-1), three trailing dots indicate that multiple values are allowed (1-n), a combination of both means 0 to n values. Command line options are distinguished from parameters by a leading '+' or '-' sign, respectively. Usually, order and position of command line options are arbitrary (i.e. they can appear anywhere). However, if options are mutually exclusive the rightmost appearance is used. This behaviour conforms to the standard evaluation rules of common Unix shells. In addition, one or more command files can be specified using an '@' sign as a prefix to the filename (e.g. \@command.txt). Such a command argument is replaced by the content of the corresponding text file (multiple whitespaces are treated as a single separator unless they appear between two quotation marks) prior to any further evaluation. Please note that a command file cannot contain another command file. This simple but effective approach allows to summarize common combinations of options/parameters and avoids longish and confusing command lines (an example is provided in file \/dumppat.txt). \section environment ENVIRONMENT The \b dcmcrle utility will attempt to load DICOM data dictionaries specified in the \e DCMDICTPATH environment variable. By default, i.e. if the \e DCMDICTPATH environment variable is not set, the file \/dicom.dic will be loaded unless the dictionary is built into the application (default for Windows). The default behaviour should be preferred and the \e DCMDICTPATH environment variable only used when alternative data dictionaries are required. The \e DCMDICTPATH environment variable has the same format as the Unix shell \e PATH variable in that a colon (":") separates entries. On Windows systems, a semicolon (";") is used as a separator. The data dictionary code will attempt to load each file specified in the \e DCMDICTPATH environment variable. It is an error if no data dictionary can be loaded. \section see_also SEE ALSO dcmdrle(1) \section copyright COPYRIGHT Copyright (C) 2002-2010 by OFFIS e.V., Escherweg 2, 26121 Oldenburg, Germany. */ dcmtk-3.6.0/dcmdata/docs/pdf2dcm.man0000644000310500011400000001372111455570715016416 0ustar joergrdicom3/*! \if MANPAGES \page pdf2dcm Convert PDF file to DICOM \else \page pdf2dcm pdf2dcm: Convert PDF file to DICOM \endif \section synopsis SYNOPSIS \verbatim pdf2dcm [options] pdffile-in dcmfile-out \endverbatim \section description DESCRIPTION The \b pdf2dcm utility reads a PDF file (\e pdffile-in), converts it to a DICOM Encapsulated PDF Storage SOP instance and stores the converted data to an output file (\e dcmfile-out). \section parameters PARAMETERS \verbatim pdffile-in PDF input filename to be converted dcmfile-out DICOM output filename \endverbatim \section options OPTIONS \subsection general_options general options \verbatim -h --help print this help text and exit --version print version information and exit --arguments print expanded command line arguments -q --quiet quiet mode, print no warnings and errors -v --verbose verbose mode, print processing details -d --debug debug mode, print debug information -ll --log-level [l]evel: string constant (fatal, error, warn, info, debug, trace) use level l for the logger -lc --log-config [f]ilename: string use config file f for the logger \endverbatim \subsection dicom_document_options DICOM document options \verbatim burned-in annotation: +an --annotation-yes PDF contains patient identifying data (default) -an --annotation-no PDF does not contain patient identifying data document title: +t --title [t]itle: string (default: empty) document title +cn --concept-name [CSD] [CV] [CM]: string (default: empty) document title as concept name code sequence with coding scheme designator CSD, code value CV and code meaning CM patient data: +pn --patient-name [n]ame: string patient's name in DICOM PN syntax +pi --patient-id [i]d: string patient identifier +pb --patient-birthdate [d]ate: string (YYYYMMDD) patient's birth date +ps --patient-sex [s]ex: string (M, F or O) patient's sex study and series: +sg --generate generate new study and series UIDs (default) +st --study-from [f]ilename: string read patient/study data from DICOM file +se --series-from [f]ilename: string read patient/study/series data from DICOM file instance number: +i1 --instance-one use instance number 1 (default, not with +se) +ii --instance-inc increment instance number (only with +se) +is --instance-set [i]nstance number: integer use instance number i \endverbatim \section logging LOGGING The level of logging output of the various command line tools and underlying libraries can be specified by the user. By default, only errors and warnings are written to the standard error stream. Using option \e --verbose also informational messages like processing details are reported. Option \e --debug can be used to get more details on the internal activity, e.g. for debugging purposes. Other logging levels can be selected using option \e --log-level. In \e --quiet mode only fatal errors are reported. In such very severe error events, the application will usually terminate. For more details on the different logging levels, see documentation of module "oflog". In case the logging output should be written to file (optionally with logfile rotation), to syslog (Unix) or the event log (Windows) option \e --log-config can be used. This configuration file also allows for directing only certain messages to a particular output stream and for filtering certain messages based on the module or application where they are generated. An example configuration file is provided in \/logger.cfg). \section command_line COMMAND LINE All command line tools use the following notation for parameters: square brackets enclose optional values (0-1), three trailing dots indicate that multiple values are allowed (1-n), a combination of both means 0 to n values. Command line options are distinguished from parameters by a leading '+' or '-' sign, respectively. Usually, order and position of command line options are arbitrary (i.e. they can appear anywhere). However, if options are mutually exclusive the rightmost appearance is used. This behaviour conforms to the standard evaluation rules of common Unix shells. In addition, one or more command files can be specified using an '@' sign as a prefix to the filename (e.g. \@command.txt). Such a command argument is replaced by the content of the corresponding text file (multiple whitespaces are treated as a single separator unless they appear between two quotation marks) prior to any further evaluation. Please note that a command file cannot contain another command file. This simple but effective approach allows to summarize common combinations of options/parameters and avoids longish and confusing command lines (an example is provided in file \/dumppat.txt). \section environment ENVIRONMENT The \b pdf2dcm utility will attempt to load DICOM data dictionaries specified in the \e DCMDICTPATH environment variable. By default, i.e. if the \e DCMDICTPATH environment variable is not set, the file \/dicom.dic will be loaded unless the dictionary is built into the application (default for Windows). The default behaviour should be preferred and the \e DCMDICTPATH environment variable only used when alternative data dictionaries are required. The \e DCMDICTPATH environment variable has the same format as the Unix shell \e PATH variable in that a colon (":") separates entries. On Windows systems, a semicolon (";") is used as a separator. The data dictionary code will attempt to load each file specified in the \e DCMDICTPATH environment variable. It is an error if no data dictionary can be loaded. \section see_also SEE ALSO dcm2pdf(1) \section copyright COPYRIGHT Copyright (C) 2005-2010 by OFFIS e.V., Escherweg 2, 26121 Oldenburg, Germany. */ dcmtk-3.6.0/dcmdata/docs/dcm2pdf.man0000644000310500011400000001545411455570714016422 0ustar joergrdicom3/*! \if MANPAGES \page dcm2pdf Extract PDF file from DICOM encapsulated PDF \else \page dcm2pdf dcm2pdf: Extract PDF file from DICOM encapsulated PDF \endif \section synopsis SYNOPSIS \verbatim dcm2pdf [options] dcmfile-in pdffile-out \endverbatim \section description DESCRIPTION The \b dcm2pdf utility reads a DICOM file of the Encapsulated PDF Storage SOP Class (\e dcmfile-in), extracts the embedded PDF document and writes it to an output file (\e pdffile-out). Optionally a command can be executed after the creation of the PDF file. \section parameters PARAMETERS \verbatim dcmfile-in DICOM input filename pdffile-out PDF output filename \endverbatim \section options OPTIONS \subsection general_options general options \verbatim -h --help print this help text and exit --version print version information and exit --arguments print expanded command line arguments -q --quiet quiet mode, print no warnings and errors -v --verbose verbose mode, print processing details -d --debug debug mode, print debug information -ll --log-level [l]evel: string constant (fatal, error, warn, info, debug, trace) use level l for the logger -lc --log-config [f]ilename: string use config file f for the logger \endverbatim \subsection input_options input options \verbatim input file format: +f --read-file read file format or data set (default) +fo --read-file-only read file format only -f --read-dataset read data set without file meta information input transfer syntax: -t= --read-xfer-auto use TS recognition (default) -td --read-xfer-detect ignore TS specified in the file meta header -te --read-xfer-little read with explicit VR little endian TS -tb --read-xfer-big read with explicit VR big endian TS -ti --read-xfer-implicit read with implicit VR little endian TS parsing of odd-length attributes: +ao --accept-odd-length accept odd length attributes (default) +ae --assume-even-length assume real length is one byte larger handling of undefined length UN elements: +ui --enable-cp246 read undefined len UN as implicit VR (default) -ui --disable-cp246 read undefined len UN as explicit VR handling of defined length UN elements: -uc --retain-un retain elements as UN (default) +uc --convert-un convert to real VR if known automatic data correction: +dc --enable-correction enable automatic data correction (default) -dc --disable-correction disable automatic data correction bitstream format of deflated input: +bd --bitstream-deflated expect deflated bitstream (default) +bz --bitstream-zlib expect deflated zlib bitstream \endverbatim \subsection execution_options execution options \verbatim -x --exec [c]ommand: string execute command c after PDF extraction \endverbatim \section notes NOTES Option \e --exec allows for the execution of a certain command line after the creation of the PDF document. The command line to be executed is passed to this option as a parameter. The specified command line may contain the placeholder '\#f', which will be replaced by the PDF filename at run time. The specified command line is executed in the foreground, i.e. \b pdf2dcm will be blocked until the command terminates. \section logging LOGGING The level of logging output of the various command line tools and underlying libraries can be specified by the user. By default, only errors and warnings are written to the standard error stream. Using option \e --verbose also informational messages like processing details are reported. Option \e --debug can be used to get more details on the internal activity, e.g. for debugging purposes. Other logging levels can be selected using option \e --log-level. In \e --quiet mode only fatal errors are reported. In such very severe error events, the application will usually terminate. For more details on the different logging levels, see documentation of module "oflog". In case the logging output should be written to file (optionally with logfile rotation), to syslog (Unix) or the event log (Windows) option \e --log-config can be used. This configuration file also allows for directing only certain messages to a particular output stream and for filtering certain messages based on the module or application where they are generated. An example configuration file is provided in \/logger.cfg). \section command_line COMMAND LINE All command line tools use the following notation for parameters: square brackets enclose optional values (0-1), three trailing dots indicate that multiple values are allowed (1-n), a combination of both means 0 to n values. Command line options are distinguished from parameters by a leading '+' or '-' sign, respectively. Usually, order and position of command line options are arbitrary (i.e. they can appear anywhere). However, if options are mutually exclusive the rightmost appearance is used. This behaviour conforms to the standard evaluation rules of common Unix shells. In addition, one or more command files can be specified using an '@' sign as a prefix to the filename (e.g. \@command.txt). Such a command argument is replaced by the content of the corresponding text file (multiple whitespaces are treated as a single separator unless they appear between two quotation marks) prior to any further evaluation. Please note that a command file cannot contain another command file. This simple but effective approach allows to summarize common combinations of options/parameters and avoids longish and confusing command lines (an example is provided in file \/dumppat.txt). \section environment ENVIRONMENT The \b dcm2pdf utility will attempt to load DICOM data dictionaries specified in the \e DCMDICTPATH environment variable. By default, i.e. if the \e DCMDICTPATH environment variable is not set, the file \/dicom.dic will be loaded unless the dictionary is built into the application (default for Windows). The default behaviour should be preferred and the \e DCMDICTPATH environment variable only used when alternative data dictionaries are required. The \e DCMDICTPATH environment variable has the same format as the Unix shell \e PATH variable in that a colon (":") separates entries. On Windows systems, a semicolon (";") is used as a separator. The data dictionary code will attempt to load each file specified in the \e DCMDICTPATH environment variable. It is an error if no data dictionary can be loaded. \section see_also SEE ALSO pdf2dcm(1) \section copyright COPYRIGHT Copyright (C) 2007-2010 by OFFIS e.V., Escherweg 2, 26121 Oldenburg, Germany. */ dcmtk-3.6.0/dcmdata/docs/Makefile.in0000644000310500011400000000062710721543703016440 0ustar joergrdicom3# # Makefile for dcmdata/docs # @SET_MAKE@ SHELL = /bin/sh srcdir = @srcdir@ top_srcdir = @top_srcdir@ configdir = @top_srcdir@/@configdir@ include $(configdir)/@common_makefile@ files = datadict.txt all: install: $(configdir)/mkinstalldirs $(DESTDIR)$(docdir) for file in $(files); do \ $(INSTALL_DATA) $$file $(DESTDIR)$(docdir) ;\ done clean: rm -f $(TRASH) distclean: rm -f $(DISTTRASH) dcmtk-3.6.0/dcmdata/docs/dcmdump.man0000644000310500011400000002452411462551021016516 0ustar joergrdicom3/*! \if MANPAGES \page dcmdump Dump DICOM file and data set \else \page dcmdump dcmdump: Dump DICOM file and data set \endif \section synopsis SYNOPSIS \verbatim dcmdump [options] dcmfile-in... \endverbatim \section description DESCRIPTION The \b dcmdump utility dumps the contents of a DICOM file (file format or raw data set) to stdout in textual form. Attributes with very large value fields (e.g. pixel data) can be described as "(not loaded)". String value fields will be delimited with square brackets ([]). Known UIDs will be displayed by their names prefixed by an equals sign (e.g. "=MRImageStorage") unless this mapping would be explicitly switched off. Empty value fields are described as "(no value available)". If \b dcmdump reads a raw data set (DICOM data without a file format meta-header) it will attempt to guess the transfer syntax by examining the first few bytes of the file. It is not always possible to correctly guess the transfer syntax and it is better to convert a data set to a file format whenever possible (using the \b dcmconv utility). It is also possible to use the \e -f and -t[ieb] options to force \b dcmdump to read a dataset with a particular transfer syntax. \section parameters PARAMETERS \verbatim dcmfile-in DICOM input file or directory to be dumped \endverbatim \section options OPTIONS \subsection general_options general options \verbatim -h --help print this help text and exit --version print version information and exit --arguments print expanded command line arguments -q --quiet quiet mode, print no warnings and errors -v --verbose verbose mode, print processing details -d --debug debug mode, print debug information -ll --log-level [l]evel: string constant (fatal, error, warn, info, debug, trace) use level l for the logger -lc --log-config [f]ilename: string use config file f for the logger \endverbatim \subsection input_options input options \verbatim input file format: +f --read-file read file format or data set (default) +fo --read-file-only read file format only -f --read-dataset read data set without file meta information input transfer syntax: -t= --read-xfer-auto use TS recognition (default) -td --read-xfer-detect ignore TS specified in the file meta header -te --read-xfer-little read with explicit VR little endian TS -tb --read-xfer-big read with explicit VR big endian TS -ti --read-xfer-implicit read with implicit VR little endian TS input files: +sd --scan-directories scan directories for input files (dcmfile-in) +sp --scan-pattern [p]attern: string (only with --scan-directories) pattern for filename matching (wildcards) # possibly not available on all systems -r --no-recurse do not recurse within directories (default) +r --recurse recurse within specified directories parsing of file meta information: +ml --use-meta-length use file meta information group length (default) -ml --ignore-meta-length ignore file meta information group length parsing of odd-length attributes: +ao --accept-odd-length accept odd length attributes (default) +ae --assume-even-length assume real length is one byte larger handling of non-standard VR: +vr --treat-as-unknown treat non-standard VR as unknown (default) -vr --assume-implicit try to read with implicit VR little endian TS handling of undefined length UN elements: +ui --enable-cp246 read undefined len UN as implicit VR (default) -ui --disable-cp246 read undefined len UN as explicit VR handling of defined length UN elements: -uc --retain-un retain elements as UN (default) +uc --convert-un convert to real VR if known handling of private max-length elements (implicit VR): -sq --maxlength-dict read as defined in dictionary (default) +sq --maxlength-seq read as sequence with undefined length automatic data correction: +dc --enable-correction enable automatic data correction (default) -dc --disable-correction disable automatic data correction general handling of parser errors: +Ep --ignore-parse-errors try to recover from parse errors -Ep --handle-parse-errors handle parse errors and stop parsing (default) other parsing options: +st --stop-after-elem [t]ag: "gggg,eeee" or dictionary name stop parsing after element specified by t bitstream format of deflated input: +bd --bitstream-deflated expect deflated bitstream (default) +bz --bitstream-zlib expect deflated zlib bitstream \endverbatim \subsection output_options output options \verbatim loading: +M --load-all load very long tag values (default) -M --load-short do not load very long values (e.g. pixel data) +R --max-read-length [k]bytes: integer (4..4194302, default: 4) set threshold for long values to k kbytes printing: +L --print-all print long tag values completely -L --print-short print long tag values shortened (default) +T --print-tree print hierarchical structure as a simple tree -T --print-indented print hierarchical structure indented (default) +F --print-filename print header with filename for each input file +Fs --print-file-search print header with filename only for those input files that contain one of the searched tags +Un --map-uid-names map well-known UID numbers to names (default) -Un --no-uid-names do not map well-known UID numbers to names +Qn --quote-nonascii quote non-ASCII and control chars as XML markup -Qn --print-nonascii print non-ASCII and control chars (default) +C --print-color use ANSI escape codes for colored output # not available on Windows systems error handling: -E --stop-on-error do not print if file is damaged (default) +E --ignore-errors attempt to print even if file is damaged searching: +P --search [t]ag: "gggg,eeee" or dictionary name print the value of tag t this option can be specified multiple times (default: the complete file is printed) +s --search-all print all instances of searched tags (default) -s --search-first only print first instance of searched tags +p --prepend prepend sequence hierarchy to printed tag, denoted by: (gggg,eeee).(gggg,eeee).* (only with --search-all or --search-first) -p --no-prepend do not prepend hierarchy to tag (default) writing: +W --write-pixel [d]irectory: string write pixel data to a .raw file stored in d (little endian, filename created automatically) \endverbatim \section logging LOGGING The level of logging output of the various command line tools and underlying libraries can be specified by the user. By default, only errors and warnings are written to the standard error stream. Using option \e --verbose also informational messages like processing details are reported. Option \e --debug can be used to get more details on the internal activity, e.g. for debugging purposes. Other logging levels can be selected using option \e --log-level. In \e --quiet mode only fatal errors are reported. In such very severe error events, the application will usually terminate. For more details on the different logging levels, see documentation of module "oflog". In case the logging output should be written to file (optionally with logfile rotation), to syslog (Unix) or the event log (Windows) option \e --log-config can be used. This configuration file also allows for directing only certain messages to a particular output stream and for filtering certain messages based on the module or application where they are generated. An example configuration file is provided in \/logger.cfg). \section command_line COMMAND LINE All command line tools use the following notation for parameters: square brackets enclose optional values (0-1), three trailing dots indicate that multiple values are allowed (1-n), a combination of both means 0 to n values. Command line options are distinguished from parameters by a leading '+' or '-' sign, respectively. Usually, order and position of command line options are arbitrary (i.e. they can appear anywhere). However, if options are mutually exclusive the rightmost appearance is used. This behaviour conforms to the standard evaluation rules of common Unix shells. In addition, one or more command files can be specified using an '@' sign as a prefix to the filename (e.g. \@command.txt). Such a command argument is replaced by the content of the corresponding text file (multiple whitespaces are treated as a single separator unless they appear between two quotation marks) prior to any further evaluation. Please note that a command file cannot contain another command file. This simple but effective approach allows to summarize common combinations of options/parameters and avoids longish and confusing command lines (an example is provided in file \/dumppat.txt). \section environment ENVIRONMENT The \b dcmdump utility will attempt to load DICOM data dictionaries specified in the \e DCMDICTPATH environment variable. By default, i.e. if the \e DCMDICTPATH environment variable is not set, the file \/dicom.dic will be loaded unless the dictionary is built into the application (default for Windows). The default behaviour should be preferred and the \e DCMDICTPATH environment variable only used when alternative data dictionaries are required. The \e DCMDICTPATH environment variable has the same format as the Unix shell \e PATH variable in that a colon (":") separates entries. On Windows systems, a semicolon (";") is used as a separator. The data dictionary code will attempt to load each file specified in the \e DCMDICTPATH environment variable. It is an error if no data dictionary can be loaded. \section see_also SEE ALSO dump2dcm(1), dcmconv(1) \section copyright COPYRIGHT Copyright (C) 1994-2010 by OFFIS e.V., Escherweg 2, 26121 Oldenburg, Germany. */ dcmtk-3.6.0/dcmdata/docs/datadict.txt0000644000310500011400000001266111455602007016710 0ustar joergrdicom3 -- DICOM Data Dictionary The dcmdata library uses a loadable data dictionary. The data dictionary is loaded within a C++ constructor (prior to main) into the global DcmDataDictionary class instance called dcmDataDict. This approach has the advantage that application programs need not be recompiled if additions or corrections are made to the data dictionary. By default (on a Posix system) the global data dictionary will attempt to load the file /usr/local/share/dcmtk/dicom.dic (or an alternative default data dictionary file specified as DCM_DICT_DEFAULT_PATH in file config/include/dcmtk/config/cfunix.h, which is created by autoconf during the execution of the configure script). The default behaviour can be overridden by defining an environment variable DCMDICTPATH to contain the file system path to an alternative data dictionary. Thus the Unix csh command: setenv DCMDICTPATH $HOME/dicom.dic would cause all applications using the dcmdata library to load the data dictionary dicom.dic from the users home directory. The DCMDICTPATH environment variable can contain several data dictionaries separated by colons (":") on Unix systems. Thus the csh command: setenv DCMDICTPATH /usr/local/share/dcmtk/dicom.dic:$HOME/dicom.dic would cause all applications using the dcmdata library to first load the default data dictionary and subsequently load the data dictionary dicom.dic from the users home directory. On Windows systems, a semicolon (";") is used as a separator. Data dictionary entries loaded later in the load sequence override entries loaded earlier. Application programs should check that a data dictionary has been loaded before using the functionality of the dcmdata library. The absence of a data dictionary is likely to cause unexpected behaviour (e.g. unknown attributes will be encoded using VR=OB). An example DICOM data dictionary can be found in dcmdata/data/dicom.dic It should be copied to the default data dictionary location (as defined in config/include/dcmtk/config/cfunix.h). The format of the data dictionary file is described in the example. The example data dictionary is relatively complete and includes all standard DICOM tags (see the header of the file, where the implemented version of the standard plus all supplements and CPs are listed), obsolete ACR/NEMA version 2 tags, obsolete SPI tags, and the tags used by Papyrus version 3. An early version of this data dictionary was based on a data dictionary put together by David Clunie. -- Tag names for use in applications The include file dcmdata/include/dcmtk/dcmdata/dcdeftag.h can be generated from a data dictionary by the program mkdeftag. The include file defines tag names for use in application programs. The names are generated from the names specified in the data dictionary. Duplicate names in the data dictionary will result in compiler warnings due to duplicate #define's when compiling code which includes the dcdeftag.h header file. Thus, when adding new entries to the data dictionary, care should be taken to ensure that attribute names are not duplicated for distinct tags. The dcmdata library makefile (dcmdata/libsrc/Makefile.in) includes a target (gendeftag) which generates the dcmdata/include/dcmtk/dcmdata/dcdeftag.h header file. The header file should be regenerated whenever additions or name modifications are made to the data dictionary. Care should be taken before modifying any tag names since existing application programs may already use the old name and might subsequently fail to compile. -- Using a built-in data dictionary By default the data dictionary is loaded from a text file as described above. However, it is possible to use a built-in data dictionary and avoid loading the text file at each application start. You can even have the best of both worlds and have the main data dictionary built-in with additions loaded from text files (via the DCMDICTPATH environment variable). The default built-in data dictionary code (dcmdata/libsrc/dcdictbi.cc) currently does nothing. The code for a useful built-in data dictionary can be regenerated at any time by the mkdictbi program (dcmdata/libsrc/mkdictbi) and the dcmdata library makefile (dcmdata/libsrc/Makefile.in) includes a target (builtindict) for this purpose. The makefile also includes a target (nobuiltindict) to reset back to an empty built-in data dictionary. By making the built-in data dictionary, rebuilding the libdcmdata.a library and relinking all your applications will ensure that the built-in data dictionary is used. Also included in the sources is a pre-created built-in data dictionary which can be used instead (dcmdata/libsrc/dcdictzz.cc). For example, the project files for the Windows platform use this file instead of the default (empty) built-in data dictionary. Under Unix environments it should also be possible to selectively use a built-in data dictionary for specific applications by including dcdictzz.o earlier in the link path than libdcmdata.a (if your linker allows this). NOTE: Using a built-in data dictionary together with a default data dictionary installed (e.g. in /usr/local/share/dcmtk/dicom.dic) will actually make your programs start up slower. The data dictionary will be loaded twice. Once from the built-in version and again from file. The same is true of the DCMDICTPATH environment variable. However, this can be a useful technique if you want to override built-in data dictionary values. ------------ OFFIS e.V., Oldenburg, Germany Last revised: 2010-10-14 (Riesmeier). dcmtk-3.6.0/dcmdata/docs/xml2dcm.man0000644000310500011400000002513311455570715016445 0ustar joergrdicom3/*! \if MANPAGES \page xml2dcm Convert XML document to DICOM file or data set \else \page xml2dcm xml2dcm: Convert XML document to DICOM file or data set \endif \section synopsis SYNOPSIS \verbatim xml2dcm [options] xmlfile-in dcmfile-out \endverbatim \section description DESCRIPTION The \b xml2dcm utility converts the contents of an XML (Extensible Markup Language) document to DICOM file or data set. The XML document is expected to validate against the DTD (Document Type Definition) which is described in file dcm2xml.dtd. An appropriate XML file can be created using the \b dcm2xml tool (option \e +Wb recommended to include binary data). \section parameters PARAMETERS \verbatim xmlfile-in XML input filename to be converted (stdin: "-") dcmfile-out DICOM output filename \endverbatim \section options OPTIONS \subsection general_options general options \verbatim -h --help print this help text and exit --version print version information and exit --arguments print expanded command line arguments -q --quiet quiet mode, print no warnings and errors -v --verbose verbose mode, print processing details -d --debug debug mode, print debug information -ll --log-level [l]evel: string constant (fatal, error, warn, info, debug, trace) use level l for the logger -lc --log-config [f]ilename: string use config file f for the logger \endverbatim \subsection input_options input options \verbatim input file format: +f --read-meta-info read meta information if present (default) -f --ignore-meta-info ignore file meta information \endverbatim \subsection processing_options processing options \verbatim validation: +Vd --validate-document validate XML document against DTD +Vn --check-namespace check XML namespace in document root unique identifiers: +Ug --generate-new-uids generate new Study/Series/SOP Instance UID -Uo --dont-overwrite-uids do not overwrite existing UIDs (default) +Uo --overwrite-uids overwrite existing UIDs \endverbatim \subsection output_options output options \verbatim output file format: +F --write-file write file format (default) -F --write-dataset write data set without file meta information +Fu --update-meta-info update particular file meta information output transfer syntax: +t= --write-xfer-same write with same TS as input (default) +te --write-xfer-little write with explicit VR little endian TS +tb --write-xfer-big write with explicit VR big endian TS +ti --write-xfer-implicit write with implicit VR little endian TS +td --write-xfer-deflated write with deflated explicit VR little endian TS post-1993 value representations: +u --enable-new-vr enable support for new VRs (UN/UT) (default) -u --disable-new-vr disable support for new VRs, convert to OB group length encoding: +g= --group-length-recalc recalculate group lengths if present (default) +g --group-length-create always write with group length elements -g --group-length-remove always write without group length elements length encoding in sequences and items: +e --length-explicit write with explicit lengths (default) -e --length-undefined write with undefined lengths data set trailing padding (not with --write-dataset): -p= --padding-retain do not change padding (default if not --write-dataset) -p --padding-off no padding (implicit if --write-dataset) +p --padding-create [f]ile-pad [i]tem-pad: integer align file on multiple of f bytes and items on multiple of i bytes deflate compression level (only with --write-xfer-deflated): +cl --compression-level [l]evel: integer (default: 6) 0=uncompressed, 1=fastest, 9=best compression \endverbatim \section notes NOTES The basic structure of the XML input expected looks like the following: \verbatim 166 ... OFFIS_DCMTK_353 ISO_IR 100 ... 256\\0\\8 ... ... ... \endverbatim The "file-format" and "meta-header" tags may be absent for DICOM data sets. \subsection character_encoding Character Encoding The DICOM character encoding is determined automatically from the element with tag "0008,0005" (Specific Character Set) - if present. The following character sets are currently supported (requires \b libxml2 to include \b iconv support): \verbatim ASCII "ISO_IR 6" (UTF-8) UTF-8 "ISO_IR 192" (UTF-8) ISO Latin 1 "ISO_IR 100" (ISO-8859-1) ISO Latin 2 "ISO_IR 101" (ISO-8859-2) ISO Latin 3 "ISO_IR 109" (ISO-8859-3) ISO Latin 4 "ISO_IR 110" (ISO-8859-4) ISO Latin 5 "ISO_IR 148" (ISO-8859-9) Cyrillic "ISO_IR 144" (ISO-8859-5) Arabic "ISO_IR 127" (ISO-8859-6) Greek "ISO_IR 126" (ISO-8859-7) Hebrew "ISO_IR 138" (ISO-8859-8) \endverbatim Multiple character sets are not supported (only the first value of the "Specific Character Set" is used for the character encoding in case of value multiplicity). See \b dcm2xml documentation for more details on the XML structure. \subsection binary_data Binary Data Binary data can be encoded either as a sequence of hex numbers separated by a backslash "\" or in Base64 format (binary="base64"). In addition, binary data can also be read from file (binary="file"). In this case, the filename has to be specified as the element value, e.g. \verbatim subdir/pixeldata.raw \endverbatim Please note that the contents of the file will be read as is. OW data is expected to be little endian ordered and will be swapped if necessary. No checks will be made to ensure that the amount of data is reasonable in terms of other attributes such as Rows or Columns. \subsection limitations Limitations Please note that \b xml2dcm currently does not fully support DICOMDIR files. Specifically, the value of the various offset data elements is not updated automatically by this tool. \section logging LOGGING The level of logging output of the various command line tools and underlying libraries can be specified by the user. By default, only errors and warnings are written to the standard error stream. Using option \e --verbose also informational messages like processing details are reported. Option \e --debug can be used to get more details on the internal activity, e.g. for debugging purposes. Other logging levels can be selected using option \e --log-level. In \e --quiet mode only fatal errors are reported. In such very severe error events, the application will usually terminate. For more details on the different logging levels, see documentation of module "oflog". In case the logging output should be written to file (optionally with logfile rotation), to syslog (Unix) or the event log (Windows) option \e --log-config can be used. This configuration file also allows for directing only certain messages to a particular output stream and for filtering certain messages based on the module or application where they are generated. An example configuration file is provided in \/logger.cfg). \section command_line COMMAND LINE All command line tools use the following notation for parameters: square brackets enclose optional values (0-1), three trailing dots indicate that multiple values are allowed (1-n), a combination of both means 0 to n values. Command line options are distinguished from parameters by a leading '+' or '-' sign, respectively. Usually, order and position of command line options are arbitrary (i.e. they can appear anywhere). However, if options are mutually exclusive the rightmost appearance is used. This behaviour conforms to the standard evaluation rules of common Unix shells. In addition, one or more command files can be specified using an '@' sign as a prefix to the filename (e.g. \@command.txt). Such a command argument is replaced by the content of the corresponding text file (multiple whitespaces are treated as a single separator unless they appear between two quotation marks) prior to any further evaluation. Please note that a command file cannot contain another command file. This simple but effective approach allows to summarize common combinations of options/parameters and avoids longish and confusing command lines (an example is provided in file \/dumppat.txt). \section environment ENVIRONMENT The \b xml2dcm utility will attempt to load DICOM data dictionaries specified in the \e DCMDICTPATH environment variable. By default, i.e. if the \e DCMDICTPATH environment variable is not set, the file \/dicom.dic will be loaded unless the dictionary is built into the application (default for Windows). The default behaviour should be preferred and the \e DCMDICTPATH environment variable only used when alternative data dictionaries are required. The \e DCMDICTPATH environment variable has the same format as the Unix shell \e PATH variable in that a colon (":") separates entries. On Windows systems, a semicolon (";") is used as a separator. The data dictionary code will attempt to load each file specified in the \e DCMDICTPATH environment variable. It is an error if no data dictionary can be loaded. \section files FILES \/dcm2xml.dtd - Document Type Definition (DTD) file \section see_also SEE ALSO dcm2xml(1) \section copyright COPYRIGHT Copyright (C) 2003-2010 by OFFIS e.V., Escherweg 2, 26121 Oldenburg, Germany. */ dcmtk-3.6.0/dcmdata/docs/dcmdata.dox0000644000310500011400000000500011427776366016513 0ustar joergrdicom3/*! \page mod_dcmdata dcmdata: a data encoding/decoding library and utility apps This module contains classes to manage DICOM data structures and files. It also provides support for DICOMDIR files as required for DICOM storage media. The main interface classes are: \li \b DcmFileFormat \li \b DcmDataset \li \b DcmItem \li \b DcmElement \section Tools This module contains the following command line tools: \li \ref dcm2pdf \li \ref dcm2xml \li \ref dcmconv \li \ref dcmcrle \li \ref dcmdrle \li \ref dcmdump \li \ref dcmftest \li \ref dcmgpdir \li \ref dcmodify \li \ref dump2dcm \li \ref img2dcm \li \ref pdf2dcm \li \ref xml2dcm \section Files The following file provides further documentation: \li \ref file_datadict \section Examples The following example shows how to load a DICOM file and output the patient's name: \code DcmFileFormat fileformat; OFCondition status = fileformat.loadFile("test.dcm"); if (status.good()) { OFString patientName; if (fileformat.getDataset()->findAndGetOFString(DCM_PatientName, patientName).good()) { cout << "Patient's Name: " << patientName << endl; } else cerr << "Error: cannot access Patient's Name!" << endl; } else cerr << "Error: cannot read DICOM file (" << status.text() << ")" << endl; \endcode The following example shows how to create a DICOM dataset and save it to a file: \code char uid[100]; DcmFileFormat fileformat; DcmDataset *dataset = fileformat.getDataset(); dataset->putAndInsertString(DCM_SOPClassUID, UID_SecondaryCaptureImageStorage); dataset->putAndInsertString(DCM_SOPInstanceUID, dcmGenerateUniqueIdentifier(uid, SITE_INSTANCE_UID_ROOT)); dataset->putAndInsertString(DCM_PatientName, "Doe^John"); /* ... */ dataset->putAndInsertUint8Array(DCM_PixelData, pixelData, pixelLength); OFCondition status = fileformat.saveFile("test.dcm", EXS_LittleEndianExplicit); if (status.bad()) cerr << "Error: cannot write DICOM file (" << status.text() << ")" << endl; \endcode The following example shows how to create a general purpose DICOMDIR from multiple files: \code DicomDirInterface dicomdir; OFCondition status = dicomdir.createNewDicomDir(); if (status.good()) { while ( /* there are files */ ) dicomdir.addDicomFile( /* current filename */ ); status = dicomdir.writeDicomDir(); if (status.bad()) cerr << "Error: cannot write DICOMDIR (" << status.text() << ")" << endl; } else cerr << "Error: cannot create DICOMDIR (" << status.text() << ")" << endl; \endcode */ /*! \page file_datadict datadict.txt file \verbinclude datadict.txt */ dcmtk-3.6.0/dcmdata/docs/dcmdrle.man0000644000310500011400000002000411455570715016501 0ustar joergrdicom3/*! \if MANPAGES \page dcmdrle Decode RLE-compressed DICOM file \else \page dcmdrle dcmdrle: Decode RLE-compressed DICOM file \endif \section synopsis SYNOPSIS \verbatim dcmdrle [options] dcmfile-in dcmfile-out \endverbatim \section description DESCRIPTION The \b dcmdrle utility reads a RLE-compressed DICOM image (\e dcmfile-in), decompresses the image data (i.e. conversion to a native DICOM transfer syntax) and writes the converted image to an output file (\e dcmfile-out). \section parameters PARAMETERS \verbatim dcmfile-in DICOM input filename to be converted dcmfile-out DICOM output filename \endverbatim \section options OPTIONS \subsection general_options general options \verbatim -h --help print this help text and exit --version print version information and exit --arguments print expanded command line arguments -q --quiet quiet mode, print no warnings and errors -v --verbose verbose mode, print processing details -d --debug debug mode, print debug information -ll --log-level [l]evel: string constant (fatal, error, warn, info, debug, trace) use level l for the logger -lc --log-config [f]ilename: string use config file f for the logger \endverbatim \subsection input_options input options \verbatim input file format: +f --read-file read file format or data set (default) +fo --read-file-only read file format only -f --read-dataset read data set without file meta information # This option allows to decompress RLE compressed DICOM objects that have # been stored as dataset without meta-header. Such a thing should not exist # since the transfer syntax cannot be reliably determined without meta-header, # but unfortunately it does. \endverbatim \subsection processing_options processing options \verbatim SOP Instance UID: +ud --uid-default keep same SOP Instance UID (default) +ua --uid-always always assign new UID RLE byte segment order: +bd --byte-order-default most significant byte first (default) +br --byte-order-reverse least significant byte first # This option allows to decompress RLE compressed DICOM files in which the # order of byte segments is encoded in incorrect order. This only affects # images with more than one byte per sample. \endverbatim \subsection output_options output options \verbatim output file format: +F --write-file write file format (default) -F --write-dataset write data set without file meta information output transfer syntax: +te --write-xfer-little write with explicit VR little endian (default) +tb --write-xfer-big write with explicit VR big endian TS +ti --write-xfer-implicit write with implicit VR little endian TS post-1993 value representations: +u --enable-new-vr enable support for new VRs (UN/UT) (default) -u --disable-new-vr disable support for new VRs, convert to OB group length encoding: +g= --group-length-recalc recalculate group lengths if present (default) +g --group-length-create always write with group length elements -g --group-length-remove always write without group length elements length encoding in sequences and items: +e --length-explicit write with explicit lengths (default) -e --length-undefined write with undefined lengths data set trailing padding (not with --write-dataset): -p= --padding-retain do not change padding (default if not --write-dataset) -p --padding-off no padding (implicit if --write-dataset) +p --padding-create [f]ile-pad [i]tem-pad: integer align file on multiple of f bytes and items on multiple of i bytes \endverbatim \section transfer_syntaxes TRANSFER SYNTAXES \b dcmdrle supports the following transfer syntaxes for input (\e dcmfile-in): \verbatim LittleEndianImplicitTransferSyntax 1.2.840.10008.1.2 LittleEndianExplicitTransferSyntax 1.2.840.10008.1.2.1 DeflatedExplicitVRLittleEndianTransferSyntax 1.2.840.10008.1.2.1.99 (*) BigEndianExplicitTransferSyntax 1.2.840.10008.1.2.2 RLELosslessTransferSyntax 1.2.840.10008.1.2.5 \endverbatim (*) if compiled with zlib support enabled \b dcmdrle supports the following transfer syntaxes for output (\e dcmfile-out): \verbatim LittleEndianImplicitTransferSyntax 1.2.840.10008.1.2 LittleEndianExplicitTransferSyntax 1.2.840.10008.1.2.1 BigEndianExplicitTransferSyntax 1.2.840.10008.1.2.2 \endverbatim \section logging LOGGING The level of logging output of the various command line tools and underlying libraries can be specified by the user. By default, only errors and warnings are written to the standard error stream. Using option \e --verbose also informational messages like processing details are reported. Option \e --debug can be used to get more details on the internal activity, e.g. for debugging purposes. Other logging levels can be selected using option \e --log-level. In \e --quiet mode only fatal errors are reported. In such very severe error events, the application will usually terminate. For more details on the different logging levels, see documentation of module "oflog". In case the logging output should be written to file (optionally with logfile rotation), to syslog (Unix) or the event log (Windows) option \e --log-config can be used. This configuration file also allows for directing only certain messages to a particular output stream and for filtering certain messages based on the module or application where they are generated. An example configuration file is provided in \/logger.cfg). \section command_line COMMAND LINE All command line tools use the following notation for parameters: square brackets enclose optional values (0-1), three trailing dots indicate that multiple values are allowed (1-n), a combination of both means 0 to n values. Command line options are distinguished from parameters by a leading '+' or '-' sign, respectively. Usually, order and position of command line options are arbitrary (i.e. they can appear anywhere). However, if options are mutually exclusive the rightmost appearance is used. This behaviour conforms to the standard evaluation rules of common Unix shells. In addition, one or more command files can be specified using an '@' sign as a prefix to the filename (e.g. \@command.txt). Such a command argument is replaced by the content of the corresponding text file (multiple whitespaces are treated as a single separator unless they appear between two quotation marks) prior to any further evaluation. Please note that a command file cannot contain another command file. This simple but effective approach allows to summarize common combinations of options/parameters and avoids longish and confusing command lines (an example is provided in file \/dumppat.txt). \section environment ENVIRONMENT The \b dcmdrle utility will attempt to load DICOM data dictionaries specified in the \e DCMDICTPATH environment variable. By default, i.e. if the \e DCMDICTPATH environment variable is not set, the file \/dicom.dic will be loaded unless the dictionary is built into the application (default for Windows). The default behaviour should be preferred and the \e DCMDICTPATH environment variable only used when alternative data dictionaries are required. The \e DCMDICTPATH environment variable has the same format as the Unix shell \e PATH variable in that a colon (":") separates entries. On Windows systems, a semicolon (";") is used as a separator. The data dictionary code will attempt to load each file specified in the \e DCMDICTPATH environment variable. It is an error if no data dictionary can be loaded. \section see_also SEE ALSO dcmcrle(1) \section copyright COPYRIGHT Copyright (C) 2002-2010 by OFFIS e.V., Escherweg 2, 26121 Oldenburg, Germany */ dcmtk-3.6.0/dcmdata/docs/CMakeLists.txt0000644000310500011400000000012110312225561017113 0ustar joergrdicom3# declare installation files INSTALL_FILES(${INSTALL_DOCDIR} FILES datadict.txt) dcmtk-3.6.0/dcmdata/docs/dcm2xml.man0000644000310500011400000002601511455570715016445 0ustar joergrdicom3/*! \if MANPAGES \page dcm2xml Convert DICOM file and data set to XML \else \page dcm2xml dcm2xml: Convert DICOM file and data set to XML \endif \section synopsis SYNOPSIS \verbatim dcm2xml [options] dcmfile-in [xmlfile-out] \endverbatim \section description DESCRIPTION The \b dcm2xml utility converts the contents of a DICOM file (file format or raw data set) to XML (Extensible Markup Language). The DTD (Document Type Definition) is described in the file dcm2xml.dtd. If \b dcm2xml reads a raw data set (DICOM data without a file format meta-header) it will attempt to guess the transfer syntax by examining the first few bytes of the file. It is not always possible to correctly guess the transfer syntax and it is better to convert a data set to a file format whenever possible (using the \b dcmconv utility). It is also possible to use the \e -f and -t[ieb] options to force \b dcm2xml to read a data set with a particular transfer syntax. \section parameters PARAMETERS \verbatim dcmfile-in DICOM input filename to be converted xmlfile-out XML output filename (default: stdout) \endverbatim \section options OPTIONS \subsection general_options general options \verbatim -h --help print this help text and exit --version print version information and exit --arguments print expanded command line arguments -q --quiet quiet mode, print no warnings and errors -v --verbose verbose mode, print processing details -d --debug debug mode, print debug information -ll --log-level [l]evel: string constant (fatal, error, warn, info, debug, trace) use level l for the logger -lc --log-config [f]ilename: string use config file f for the logger \endverbatim \subsection input_options input options \verbatim input file format: +f --read-file read file format or data set (default) +fo --read-file-only read file format only -f --read-dataset read data set without file meta information input transfer syntax: -t= --read-xfer-auto use TS recognition (default) -td --read-xfer-detect ignore TS specified in the file meta header -te --read-xfer-little read with explicit VR little endian TS -tb --read-xfer-big read with explicit VR big endian TS -ti --read-xfer-implicit read with implicit VR little endian TS long tag values: +M --load-all load very long tag values (e.g. pixel data) -M --load-short do not load very long values (default) +R --max-read-length [k]bytes: integer (4..4194302, default: 4) set threshold for long values to k kbytes \endverbatim \subsection processing_options processing options \verbatim character set: +Cr --charset-require require declaration of extended charset (default) +Ca --charset-assume [c]harset: string constant (latin-1 to -5, cyrillic, arabic, greek, hebrew) assume charset c if no extended charset declared +Cc --charset-check-all check all data elements with string values (default: only PN, LO, LT, SH, ST and UT) \endverbatim \subsection output_options output options \verbatim XML structure: +Xd --add-dtd-reference add reference to document type definition (DTD) +Xe --embed-dtd-content embed document type definition into XML document +Xf --use-dtd-file [f]ilename: string use specified DTD file (only with +Xe) (default: /usr/local/share/dcmtk/dcm2xml.dtd) +Xn --use-xml-namespace add XML namespace declaration to root element DICOM data elements: +Wn --write-element-name write name of the DICOM data elements (default) -Wn --no-element-name do not write name of the DICOM data elements +Wb --write-binary-data write binary data of OB and OW elements (default: off, be careful with --load-all) +Eh --encode-hex encode binary data as hex numbers (default) +Eb --encode-base64 encode binary data as Base64 (RFC 2045, MIME) \endverbatim \section notes NOTES The basic structure of the XML output created from a DICOM image file looks like the following: \verbatim 166 ... OFFIS_DCMTK_353 ISO_IR 100 ... 256\\0\\8 ... ... ... \endverbatim The "file-format" and "meta-header" tags are absent for DICOM data sets. \subsection character_encoding Character Encoding The XML encoding is determined automatically from the DICOM attribute (0008,0005) "Specific Character Set" (if present) using the following mapping: \verbatim ASCII "ISO_IR 6" => "UTF-8" UTF-8 "ISO_IR 192" => "UTF-8" ISO Latin 1 "ISO_IR 100" => "ISO-8859-1" ISO Latin 2 "ISO_IR 101" => "ISO-8859-2" ISO Latin 3 "ISO_IR 109" => "ISO-8859-3" ISO Latin 4 "ISO_IR 110" => "ISO-8859-4" ISO Latin 5 "ISO_IR 148" => "ISO-8859-9" Cyrillic "ISO_IR 144" => "ISO-8859-5" Arabic "ISO_IR 127" => "ISO-8859-6" Greek "ISO_IR 126" => "ISO-8859-7" Hebrew "ISO_IR 138" => "ISO-8859-8" \endverbatim Multiple character sets are not supported (only the first attribute value is mapped in case of value multiplicity). \subsection xml_encoding XML Encoding Attributes with very large value fields (e.g. pixel data) are not loaded by default. They can be identified by the additional attribute "loaded" with a value of "no" (see example above). The command line option \e --load-all forces to load all value fields including the very long ones. Furthermore, binary information of OB and OW attributes are not written to the XML output file by default. These elements can be identified by the additional attribute "binary" with a value of "hidden" (default is "no"). The command line option \e --write-binary-data causes also binary value fields to be printed (attribute value is "yes" or "base64"). But, be careful when using this option together with \e --load-all because of the large amounts of pixel data that might be printed to the output. Multiple values (i.e. where the DICOM value multiplicity is greater than 1) are separated by a backslash "\" (except for Base64 encoded data). The "len" attribute indicates the number of bytes for the particular value field as stored in the DICOM data set, i.e. it might deviate from the XML encoded value length e.g. because of non-significant padding that has been removed. If this attribute is missing in "sequence" or "item" start tags, the corresponding DICOM element has been stored with undefined length. \section logging LOGGING The level of logging output of the various command line tools and underlying libraries can be specified by the user. By default, only errors and warnings are written to the standard error stream. Using option \e --verbose also informational messages like processing details are reported. Option \e --debug can be used to get more details on the internal activity, e.g. for debugging purposes. Other logging levels can be selected using option \e --log-level. In \e --quiet mode only fatal errors are reported. In such very severe error events, the application will usually terminate. For more details on the different logging levels, see documentation of module "oflog". In case the logging output should be written to file (optionally with logfile rotation), to syslog (Unix) or the event log (Windows) option \e --log-config can be used. This configuration file also allows for directing only certain messages to a particular output stream and for filtering certain messages based on the module or application where they are generated. An example configuration file is provided in \/logger.cfg). \section command_line COMMAND LINE All command line tools use the following notation for parameters: square brackets enclose optional values (0-1), three trailing dots indicate that multiple values are allowed (1-n), a combination of both means 0 to n values. Command line options are distinguished from parameters by a leading '+' or '-' sign, respectively. Usually, order and position of command line options are arbitrary (i.e. they can appear anywhere). However, if options are mutually exclusive the rightmost appearance is used. This behaviour conforms to the standard evaluation rules of common Unix shells. In addition, one or more command files can be specified using an '@' sign as a prefix to the filename (e.g. \@command.txt). Such a command argument is replaced by the content of the corresponding text file (multiple whitespaces are treated as a single separator unless they appear between two quotation marks) prior to any further evaluation. Please note that a command file cannot contain another command file. This simple but effective approach allows to summarize common combinations of options/parameters and avoids longish and confusing command lines (an example is provided in file \/dumppat.txt). \section environment ENVIRONMENT The \b dcm2xml utility will attempt to load DICOM data dictionaries specified in the \e DCMDICTPATH environment variable. By default, i.e. if the \e DCMDICTPATH environment variable is not set, the file \/dicom.dic will be loaded unless the dictionary is built into the application (default for Windows). The default behaviour should be preferred and the \e DCMDICTPATH environment variable only used when alternative data dictionaries are required. The \e DCMDICTPATH environment variable has the same format as the Unix shell \e PATH variable in that a colon (":") separates entries. On Windows systems, a semicolon (";") is used as a separator. The data dictionary code will attempt to load each file specified in the \e DCMDICTPATH environment variable. It is an error if no data dictionary can be loaded. \section files FILES \/dcm2xml.dtd - Document Type Definition (DTD) file \section see_also SEE ALSO xml2dcm(1), dcmconv(1) \section copyright COPYRIGHT Copyright (C) 2002-2010 by OFFIS e.V., Escherweg 2, 26121 Oldenburg, Germany. */ dcmtk-3.6.0/dcmdata/docs/dcmconv.man0000644000310500011400000002224611455570715016532 0ustar joergrdicom3/*! \if MANPAGES \page dcmconv Convert DICOM file encoding \else \page dcmconv dcmconv: Convert DICOM file encoding \endif \section synopsis SYNOPSIS \verbatim dcmconv [options] dcmfile-in dcmfile-out \endverbatim \section description DESCRIPTION The \b dcmconv utility reads a DICOM file (\e dcmfile-in), performs an encoding conversion and writes the converted data to an output file (\e dcmfile-out). \section parameters PARAMETERS \verbatim dcmfile-in DICOM input filename to be converted dcmfile-out DICOM output filename to write to \endverbatim \section options OPTIONS \subsection general_options general options \verbatim -h --help print this help text and exit --version print version information and exit --arguments print expanded command line arguments -q --quiet quiet mode, print no warnings and errors -v --verbose verbose mode, print processing details -d --debug debug mode, print debug information -l --log-level [l]evel: string constant (fatal, error, warn, info, debug, trace) use level l for the logger -l --log-config [f]ilename: string use config file f for the logger \endverbatim \subsection input_options input options \verbatim input file format: +f --read-file read file format or data set (default) +fo --read-file-only read file format only -f --read-dataset read data set without file meta information input transfer syntax: -t= --read-xfer-auto use TS recognition (default) -td --read-xfer-detect ignore TS specified in the file meta header -te --read-xfer-little read with explicit VR little endian TS -tb --read-xfer-big read with explicit VR big endian TS -ti --read-xfer-implicit read with implicit VR little endian TS parsing of file meta information: +ml --use-meta-length use file meta information group length (default) -ml --ignore-meta-length ignore file meta information group length parsing of odd-length attributes: +ao --accept-odd-length accept odd length attributes (default) +ae --assume-even-length assume real length is one byte larger handling of non-standard VR: +vr --treat-as-unknown treat non-standard VR as unknown (default) -vr --assume-implicit try to read with implicit VR little endian TS handling of undefined length UN elements: +ui --enable-cp246 read undefined len UN as implicit VR (default) -ui --disable-cp246 read undefined len UN as explicit VR handling of defined length UN elements: -uc --retain-un retain elements as UN (default) +uc --convert-un convert to real VR if known handling of private max-length elements (implicit VR): -sq --maxlength-dict read as defined in dictionary (default) +sq --maxlength-seq read as sequence with undefined length general handling of parser errors: +Ep --ignore-parse-errors try to recover from parse errors -Ep --handle-parse-errors handle parse errors and stop parsing (default) other parsing options: +st --stop-after-elem [t]ag: "gggg,eeee" or dictionary name stop parsing after element specified by t automatic data correction: +dc --enable-correction enable automatic data correction (default) -dc --disable-correction disable automatic data correction bitstream format of deflated input: +bd --bitstream-deflated expect deflated bitstream (default) +bz --bitstream-zlib expect deflated zlib bitstream \endverbatim \subsection output_options output options \verbatim output file format: +F --write-file write file format (default) +Fm --write-new-meta-info write file format with new meta information -F --write-dataset write data set without file meta information output transfer syntax: +t= --write-xfer-same write with same TS as input (default) +te --write-xfer-little write with explicit VR little endian TS +tb --write-xfer-big write with explicit VR big endian TS +ti --write-xfer-implicit write with implicit VR little endian TS +td --write-xfer-deflated write with deflated explicit VR little endian TS post-1993 value representations: +u --enable-new-vr enable support for new VRs (UN/UT) (default) -u --disable-new-vr disable support for new VRs, convert to OB group length encoding: +g= --group-length-recalc recalculate group lengths if present (default) +g --group-length-create always write with group length elements -g --group-length-remove always write without group length elements length encoding in sequences and items: +e --length-explicit write with explicit lengths (default) -e --length-undefined write with undefined lengths +eo --write-oversized write oversized explicit length sequences and items with undefined length (default) -eo --abort-oversized abort on oversized explicit sequences/items data set trailing padding (not with --write-dataset): -p= --padding-retain do not change padding (default if not --write-dataset) -p --padding-off no padding (implicit if --write-dataset) +p --padding-create [f]ile-pad [i]tem-pad: integer align file on multiple of f bytes and items on multiple of i bytes deflate compression level (only with --write-xfer-deflated): +cl --compression-level [l]evel: integer (default: 6) 0=uncompressed, 1=fastest, 9=best compression other output options: -ig --no-invalid-groups don't write elements with invalid group number \endverbatim \section logging LOGGING The level of logging output of the various command line tools and underlying libraries can be specified by the user. By default, only errors and warnings are written to the standard error stream. Using option \e --verbose also informational messages like processing details are reported. Option \e --debug can be used to get more details on the internal activity, e.g. for debugging purposes. Other logging levels can be selected using option \e --log-level. In \e --quiet mode only fatal errors are reported. In such very severe error events, the application will usually terminate. For more details on the different logging levels, see documentation of module "oflog". In case the logging output should be written to file (optionally with logfile rotation), to syslog (Unix) or the event log (Windows) option \e --log-config can be used. This configuration file also allows for directing only certain messages to a particular output stream and for filtering certain messages based on the module or application where they are generated. An example configuration file is provided in \/logger.cfg). \section command_line COMMAND LINE All command line tools use the following notation for parameters: square brackets enclose optional values (0-1), three trailing dots indicate that multiple values are allowed (1-n), a combination of both means 0 to n values. Command line options are distinguished from parameters by a leading '+' or '-' sign, respectively. Usually, order and position of command line options are arbitrary (i.e. they can appear anywhere). However, if options are mutually exclusive the rightmost appearance is used. This behaviour conforms to the standard evaluation rules of common Unix shells. In addition, one or more command files can be specified using an '@' sign as a prefix to the filename (e.g. \@command.txt). Such a command argument is replaced by the content of the corresponding text file (multiple whitespaces are treated as a single separator unless they appear between two quotation marks) prior to any further evaluation. Please note that a command file cannot contain another command file. This simple but effective approach allows to summarize common combinations of options/parameters and avoids longish and confusing command lines (an example is provided in file \/dumppat.txt). \section environment ENVIRONMENT The \b dcmconv utility will attempt to load DICOM data dictionaries specified in the \e DCMDICTPATH environment variable. By default, i.e. if the \e DCMDICTPATH environment variable is not set, the file \/dicom.dic will be loaded unless the dictionary is built into the application (default for Windows). The default behaviour should be preferred and the \e DCMDICTPATH environment variable only used when alternative data dictionaries are required. The \e DCMDICTPATH environment variable has the same format as the Unix shell \e PATH variable in that a colon (":") separates entries. On Windows systems, a semicolon (";") is used as a separator. The data dictionary code will attempt to load each file specified in the \e DCMDICTPATH environment variable. It is an error if no data dictionary can be loaded. \section see_also SEE ALSO dcmdump(1) \section copyright COPYRIGHT Copyright (C) 1994-2010 by OFFIS e.V., Escherweg 2, 26121 Oldenburg, Germany. */ dcmtk-3.6.0/dcmdata/docs/img2dcm.man0000644000310500011400000004556511453036762016431 0ustar joergrdicom3/*! \if MANPAGES \page img2dcm Convert standard image formats into DICOM format \else \page img2dcm img2dcm: Convert standard image formats into DICOM format \endif \section synopsis SYNOPSIS \verbatim img2dcm [options] imgfile-in dcmfile-out \endverbatim \section description DESCRIPTION The \b img2dcm tool serves as a conversion tool from a standard image format like JPEG or BMP to DICOM. Different output SOP Classes can be selected. The additional information (regarding patients, series, etc.) stored in the DICOM output file can be extracted from other DICOM files which serve as a "template" for the resulting DICOM object. \b img2dcm can also be configured to invent missing DICOM type 1 and type 2 attributes to work even without any template dataset. \section parameters PARAMETERS \verbatim imgfile-in image file to be imported dcmfile-out DICOM output file \endverbatim \section options OPTIONS \subsection general_options general options \verbatim -h --help print this help text and exit --version print version information and exit --arguments print expanded command line arguments -q --quiet quiet mode, print no warnings and errors -v --verbose verbose mode, print processing details -d --debug debug mode, print debug information -ll --log-level [l]evel: string constant (fatal, error, warn, info, debug, trace) use level l for the logger -lc --log-config [f]ilename: string use config file f for the logger \endverbatim \subsection input_options input options \verbatim general: -i --input-format [i]nput file format: string supported formats: JPEG (default), BMP -df --dataset-from [f]ilename: string use dataset from DICOM file f -stf --study-from [f]ilename: string read patient/study from DICOM file f -sef --series-from [f]ilename: string read patient/study/series from DICOM file f -ii --instance-inc increase instance number read from DICOM file JPEG format: -dp --disable-progr disable support for progressive JPEG -de --disable-ext disable support for extended sequential JPEG -jf --insist-on-jfif insist on JFIF header existence -ka --keep-appn keep APPn sections (except JFIF) \endverbatim \subsection processing_options processing options \verbatim attribute checking: --do-checks enable attribute validity checking (default) --no-checks disable attribute validity checking +i2 --insert-type2 insert missing type 2 attributes (default) (only with --do-checks) -i2 --no-type2-insert do not insert missing type 2 attributes (only with --do-checks) +i1 --invent-type1 invent missing type 1 attributes (only with --do-checks) -i1 --no-type1-invent do not invent missing type 1 attributes (only with --do-checks) character set: +l1 --latin1 set latin-1 as standard character set (default) -l1 --no-latin1 keep 7-bit ASCII as standard character set other processing options: -k --key [k]ey: gggg,eeee="str", path or dictionary name="str" add further attribute \endverbatim \subsection output_options output options \verbatim target SOP class: -sc --sec-capture write Secondary Capture SOP class -nsc --new-sc write new Secondary Capture SOP classes -vlp --vl-photo write Visible Light Photographic SOP class (default) output file format: +F --write-file write file format (default) -F --write-dataset write data set without file meta information group length encoding: +g= --group-length-recalc recalculate group lengths if present (default) +g --group-length-create always write with group length elements -g --group-length-remove always write without group length elements length encoding in sequences and items: +e --length-explicit write with explicit lengths (default) -e --length-undefined write with undefined lengths data set trailing padding (not with --write-dataset): -p --padding-off no padding (implicit if --write-dataset) +p --padding-create [f]ile-pad [i]tem-pad: integer align file on multiple of f bytes and items on multiple of i bytes \endverbatim \section notes NOTES \subsection attribute_sources Attribute Sources For converting a general image format into DICOM format, the \b img2dcm application may be fed with some additional input for filling mandatory (and optional) attributes in the new DICOM file like patient, study and series information. This information can be collected using different approaches, which can be combined and are applied to the result file in the following order: \li Using the \e --dataset-from option \b img2dcm is forced to import attributes from an existing DICOM file. The given DICOM file is fully imported and serves as the basis for all further export operations. As an exception, the SOP Instance UID is not copied by this option. Also image related data like Rows, Columns etc. is exchanged during conversion. Note that \b img2dcm does not check any other attribute values for validity, e. g. it does not look into sequences to adapt any attributes to the new object (referenced images etc.). Therefore, it is recommended to use the templates in the data directory for (old) SC and VLP objects. See also section "Input Templates". \li The \e --study-from and \e --series-from options (mutually exclusive) can be used to import patient, study and series information from an existing DICOM file. If \e --series-from is specified, then the given DICOM file is opened by \b img2dcm and all mandatory information down to the series level is imported. Note that this includes patient, study and series information. In case of \e --study-from, the series information is excluded. The following attributes are taken over: \verbatim Patient Level: Patient's Name Patient ID Patient's Sex Patient's Birth Date Specific Character Set Study Level: Study Instance UID Study Date Study Time Referring Physician's Name Study ID Accession Number Series Level (only in case of option --series-from): Series Instance UID Series Number Manufacturer \endverbatim \li With the \e --insert-type2 and \e --invent-type1 options (both enabled per default), missing attributes (type 2 attributes) and/or missing attribute values (for type 1 attributes) are automatically added and invented by \b img2dcm. Please note that these options are only evaluated if option \e --do-checks is enabled (default). If the \e --no-checks options is enabled, no automatic attribute insertion will take place. \li The \e --key option can be used to add further attributes to the DICOM output file. This option is applied at the very end, just before saving the DICOM file. It is also possible to specify sequences, items and nested attributes using the \e --key option. In these cases, a special "path" notation has to be used. Details on this path notation can be found in the documentation of \b dcmodify. \subsection uids UIDs New Study and Series Instance UIDs are generated if necessary after applying the \e --study-from and \e --series options. If Study Instance UID or Series Instance UID are not present after these steps, they are newly generated, independently from each other. A contrary behaviour is choosen for the SOP Instance UID that one could expect to be taken over when using the \e --dataset-from option. This is \b not the case, the SOP Instance UID is \b not copied to the new object. This should be the desirable behaviour for most use cases. However, if a certain SOP Instance UID should be inserted into the new object, the \e --key option should be used. \subsection inputtemplates Input Templates For supporting the conversion into DICOM, \b img2dcm comes with some pre-defined templates which can be used for the \e --dataset-from option (see sample files \e SC.dump and \e VLP.dump). These templates should be filled with the desired values and then must be dumped (converted) to a DICOM file before actually being used with \b img2dcm. Use \b dump2dcm to convert the dump to DICOM. Example: \verbatim dump2dcm SC.dump SC.dcm \endverbatim It is possible to use any DICOM file as a template. Please note that the complete DICOM dataset is imported; hence, it should be assured that only attributes are present which should be part of the constructed DICOM object. The SOP Class UID and the Pixel Data attributes (including attributes like Rows, Columns etc.) are not copied but replaced by \b img2dcm during conversion. \subsection inputplugins Input Plugins The \b img2dcm application currently supports the JPEG and the BMP image format as input. \subsubsection jpeginputplugin JPEG Input Plugin For JPEG, the original JPEG from the source file is not decoded but extracted and slightly transformed (e. g. JFIF header is cut off) to allow fast conversion of even big JPEG files without the need of decoding and re-encoding. The JPEG plugin chooses the necessary output transfer syntax automatically depending on the actual encoding of the data inside the JPEG file. Therefore, the following Transfer Syntaxes (and their corresponding JPEG encodings) are used by the JPEG plugin: \li JPEG Coding Process 1 Baseline, Lossy, Non-Hierarchical, Sequential, DCT, Huffman, 8 Bit SOP Class = 1.2.840.10008.1.2.4.50 \li JPEG Coding Process 2 (8-bit) and 4 (12-bit) Extended, Lossy, Non-Hierarchical, Sequential, DCT, Huffman, 8/12 Bit SOP Class = 1.2.840.10008.1.2.4.51 \li JPEG Coding Process 10 (8-bit) and 12 (12-bit) Full Progression, lossy, Non-Hierarch., Progressive, DCT, Huffman, 8/12 Bit SOP Class = 1.2.840.10008.1.2.4.55 Color and grayscale images are supported. The support for the Extended JPEG Transfer Syntax can be disabled (\e --disable-ext option) as well as the support for the (retired) Progressive JPEG Transfer Syntax (\e --disable-progr option). JPEG lossless encoding as well as any arithmethic or hierarchical JPEG encoding modes are not supported by the plugin. JFIF (JPEG File Interchange Format) information facilitates optional APPn markers in a JPEG file. Many digital cameras do not integrate such JFIF information into the JPEG output they create. For example, JFIF contains information about the pixel aspect ratio of the compressed image. If you want the \b img2dcm application to insist on a JFIF header in the JPEG stream, you can use the option \e --insist-on-jfif which will abort if no JFIF information can be found. By default, missing JFIF information is ignored. For DICOM it is kind of a "gray zone", whether the integration of JFIF (or any other APPn) data into the DICOM object's internal JPEG stream is allowed or not. However, the most reliable approach is to cut those markers and their information off the JPEG stream. This approach is also taken by the \b img2dcm application. By default, all APPn markers are cut off from the original JPEG stream. However, if you want to keep other APPn markers than JFIF (e. g. EXIF information) inside the DICOM stream, the option \e --keep-appn does the trick. It should also be slightly faster than cutting off APPn information, because it is not necessary to scan the whole JPEG stream for such data. JFIF information is \b always removed by \b img2dcm. \subsubsection bmpinputplugin BMP Input Plugin \b img2dcm supports BMP as input format. However, so far only the most commmon BMP images are supported. In particular, BMP images which use bitfields or run length encoding will be rejected. Such images are uncommon. All input images will be converted into a DICOM image with RGB color model and a bit depth of 24. There are no specific options for fine-tuning BMP format conversion. \subsection outputplugins Output Plugins The desired output SOP Class can be selected on the command line. Currently, an export plugin for the Secondary Capture Image SOP class (default, option \e -sc), the new Secondary Capture Image SOP classes (option \e -nsc) and Visible Light Photographic Image SOP class (option \e -vl) are available. Please note that the first one is deprecated according to the DICOM standard but is selected as a default because it is widely supported. Future versions of \b img2dcm might provide further output plugins for other SOP Classes. For the new Secondary Capture SOP classes, it is not possible to specifiy which specific SOP class should be used for output. That is because these new SOP classes are differentiated from each other by colour depth (1/8/16) and the fact whether the image is black/white or colour. That is why \b img2dcm decides during conversion, which output SOP class is suitable for a given source image. \section examples EXAMPLES Here are some examples that show how the \b img2dcm application can be used.
  1. img2dcm image.jpg out.dcm
    Read JPEG file "image.jpg", convert to the old Secondary Capture SOP class and save the result to DICOM file "out.dcm". This is the easiest way of using \b img2dcm. Any type 1 and type 2 attributes required for writing valid objects of this SOP class are inserted automatically.
  2. img2dcm -i BMP image.bmp out.dcm
    Same as above but tells img2dcm to read a BMP file instead of JPEG.
  3. img2dcm image.jpg out.dcm -vlp -k "PatientName=Bond^James"
    Same as first example, but writes Visible Light Photographic Image object to "out.dcm" and sets PatientName to "Bond^James" which otherwise would be left empty.
  4. img2dcm image.jpg out.dcm --series-from template.dcm -k "PatientName=Bond^James"
    Same as 1), but imports patient/study/series infomation from DICOM file "template.dcm". Please note that attribute PatientName will contain "Bond^James" at the end, any value from "template.dcm" will be overwritten. That is, because the -k option is applied at the very end of the conversion pipeline (see above).
  5. img2dcm image.jpg out.dcm --no-checks
    Same as 1), but does not perform any attribute checking and no type 1 and type 2 attribute insertion! So in this case, an invalid DICOM object would be generated. This can be interesting if the output file is not meant to be completed but will undergo further transformations, e. g. adding attributes using \b dcmodify. Only use option \e --no-checks if you know what you are doing!
  6. img2dcm image.jpg out.dcm --no-type1-invent
    Same as 1), but does not insert missing type 1 attributes and/or their values. Type 2 attributes will be inserted. Note that in this case it must be assured that all type 1 attributes are provided by other means, i. e. by adding them with the \e --key option. Otherwise, \b img2dcm will report an error and will stop converting.
  7. img2dcm image.jpg out.dcm --keep-appn --insist-on-jfif
    Same as 1), but takes over APPn information like EXIF into the DICOM object's resulting JPEG stream. Further, \e --insist-on-jfif will force \b img2dcm to abort if no JFIF information is existent in the source file.
\section logging LOGGING The level of logging output of the various command line tools and underlying libraries can be specified by the user. By default, only errors and warnings are written to the standard error stream. Using option \e --verbose also informational messages like processing details are reported. Option \e --debug can be used to get more details on the internal activity, e.g. for debugging purposes. Other logging levels can be selected using option \e --log-level. In \e --quiet mode only fatal errors are reported. In such very severe error events, the application will usually terminate. For more details on the different logging levels, see documentation of module "oflog". In case the logging output should be written to file (optionally with logfile rotation), to syslog (Unix) or the event log (Windows) option \e --log-config can be used. This configuration file also allows for directing only certain messages to a particular output stream and for filtering certain messages based on the module or application where they are generated. An example configuration file is provided in \/logger.cfg). \section command_line COMMAND LINE All command line tools use the following notation for parameters: square brackets enclose optional values (0-1), three trailing dots indicate that multiple values are allowed (1-n), a combination of both means 0 to n values. Command line options are distinguished from parameters by a leading '+' or '-' sign, respectively. Usually, order and position of command line options are arbitrary (i.e. they can appear anywhere). However, if options are mutually exclusive the rightmost appearance is used. This behaviour conforms to the standard evaluation rules of common Unix shells. In addition, one or more command files can be specified using an '@' sign as a prefix to the filename (e.g. \@command.txt). Such a command argument is replaced by the content of the corresponding text file (multiple whitespaces are treated as a single separator unless they appear between two quotation marks) prior to any further evaluation. Please note that a command file cannot contain another command file. This simple but effective approach allows to summarize common combinations of options/parameters and avoids longish and confusing command lines (an example is provided in file \/dumppat.txt). \section environment ENVIRONMENT The \b img2dcm utility will attempt to load DICOM data dictionaries specified in the \e DCMDICTPATH environment variable. By default, i.e. if the \e DCMDICTPATH environment variable is not set, the file \/dicom.dic will be loaded unless the dictionary is built into the application (default for Windows). The default behaviour should be preferred and the \e DCMDICTPATH environment variable only used when alternative data dictionaries are required. The \e DCMDICTPATH environment variable has the same format as the Unix shell \e PATH variable in that a colon (":") separates entries. On Windows systems, a semicolon (";") is used as a separator. The data dictionary code will attempt to load each file specified in the \e DCMDICTPATH environment variable. It is an error if no data dictionary can be loaded. \section files FILES \/SC.dump - Sample dump file for Secondary Capture images \n\/VLP.dump - Sample dump file for Visible Light Photographic images \section see_also SEE ALSO dcm2pnm(1), dcmj2pnm(1), dump2dcm(1), dcmconv(1), dcmodify(1) \section copyright COPYRIGHT Copyright (C) 2007-2010 by OFFIS e.V., Escherweg 2, 26121 Oldenburg, Germany. */ dcmtk-3.6.0/dcmdata/docs/dcmgpdir.man0000644000310500011400000002233511455570715016671 0ustar joergrdicom3/*! \if MANPAGES \page dcmgpdir Create a general purpose DICOMDIR \else \page dcmgpdir dcmgpdir: Create a general purpose DICOMDIR \endif \section synopsis SYNOPSIS \verbatim dcmgpdir [options] [dcmfile-in...] \endverbatim \section description DESCRIPTION The \b dcmgpdir utility creates a \e DICOMDIR file from the specified referenced DICOM files according to the DICOM Part 11 Media Storage Application Profiles. Currently, the following profiles are supported: \li General Purpose CD-R Interchange (STD-GEN-CD) \li General Purpose Interchange on DVD-RAM Media (STD-GEN-DVD-RAM) \b dcmmkdir is an extended version of this tool which also supports other Media Storage Application Profiles than the general purpose one (e.g. both cardio profiles requiring the use of icon images). \section parameters PARAMETERS \verbatim dcmfile-in referenced DICOM file \endverbatim \section options OPTIONS \subsection general_options general options \verbatim -h --help print this help text and exit --version print version information and exit --arguments print expanded command line arguments -q --quiet quiet mode, print no warnings and errors -v --verbose verbose mode, print processing details -d --debug debug mode, print debug information -ll --log-level [l]evel: string constant (fatal, error, warn, info, debug, trace) use level l for the logger -lc --log-config [f]ilename: string use config file f for the logger \endverbatim \subsection input_options input options \verbatim DICOMDIR identifiers: +D --output-file [f]ilename: string generate specific DICOMDIR file (default: DICOMDIR in current directory) +F --fileset-id [i]d: string (default: DCMTK_MEDIA_DEMO) use specific file set ID +R --descriptor [f]ilename: string add a file set descriptor file ID (e.g. README, default: no descriptor) +C --char-set [c]harset: string add a specific character set for descriptor (default: "ISO_IR 100" if descriptor present) reading: +id --input-directory [d]irectory: string read referenced DICOM files from directory d (default for --recurse: current directory) -m --keep-filenames expect filenames to be in DICOM format (default) +m --map-filenames map to DICOM filenames (lowercase->uppercase, and remove trailing period) -r --no-recurse do not recurse within directories (default) +r --recurse recurse within filesystem directories +p --pattern [p]attern: string (only with --recurse) pattern for filename matching (wildcards) # possibly not available on all systems \endverbatim \subsection processing_options processing options \verbatim consistency check: -W --no-consistency-check do not check files for consistency +W --warn-inconsist-files warn about inconsistent files (default) -a --abort-inconsist-file abort on first inconsistent file type 1 attributes: -I --strict exit with error if DICOMDIR type 1 attributes are missing in DICOM file (default) +I --invent invent DICOMDIR type 1 attributes if missing in DICOM file +Ipi --invent-patient-id invent new PatientID in case of inconsistent PatientName attributes other checks: +Nrs --allow-retired-sop allow retired SOP classes defined in previous editions of the DICOM standard -Nxc --no-xfer-check do not reject images with non-standard transfer syntax (just warn) \endverbatim \subsection output_options output options \verbatim writing: -A --replace replace existing DICOMDIR (default) +A --append append to existing DICOMDIR +U --update update existing DICOMDIR -w --discard do not write out DICOMDIR -nb --no-backup do not create a backup of existing DICOMDIR post-1993 value representations: +u --enable-new-vr enable support for new VRs (UN/UT) (default) -u --disable-new-vr disable support for new VRs, convert to OB group length encoding: -g --group-length-remove write without group length elements (default) +g --group-length-create write with group length elements length encoding in sequences and items: +e --length-explicit write with explicit lengths (default) -e --length-undefined write with undefined lengths \endverbatim \section notes NOTES All files specified on the command line (or discovered by recursivly examining the contents of directories with the \e +r option) are first evaluated for their compatibility with the General Purpose CD-R Image Interchange Profile (Supplement 19). Only appropriate files encoded using the Explicit VR Little Endian Uncompressed Transfer Syntax will be accepted. Files having invalid filenames will be rejected (the rules can be relaxed via the \e +m option). Files missing required attributes will be rejected (the \e +I option can relax this behaviour). A \e DICOMDIR file will only be constructed if all files have passed initial tests. The \b dcmgpdir utility also allows to append new entries to and to update existing entries in a \e DICOMDIR file. Using option \e +A new entries are only appended to the DICOMDIR, i.e. existing records like the ones for PATIENT information are not updated. Using option \e +U also existing records are updated according to the information found in the referenced DICOM files. Please note that this update process might be slower than just appending new entries. However, it makes sure that additional information that is required for the selected application profile is also added to existing records. \section logging LOGGING The level of logging output of the various command line tools and underlying libraries can be specified by the user. By default, only errors and warnings are written to the standard error stream. Using option \e --verbose also informational messages like processing details are reported. Option \e --debug can be used to get more details on the internal activity, e.g. for debugging purposes. Other logging levels can be selected using option \e --log-level. In \e --quiet mode only fatal errors are reported. In such very severe error events, the application will usually terminate. For more details on the different logging levels, see documentation of module "oflog". In case the logging output should be written to file (optionally with logfile rotation), to syslog (Unix) or the event log (Windows) option \e --log-config can be used. This configuration file also allows for directing only certain messages to a particular output stream and for filtering certain messages based on the module or application where they are generated. An example configuration file is provided in \/logger.cfg). \section command_line COMMAND LINE All command line tools use the following notation for parameters: square brackets enclose optional values (0-1), three trailing dots indicate that multiple values are allowed (1-n), a combination of both means 0 to n values. Command line options are distinguished from parameters by a leading '+' or '-' sign, respectively. Usually, order and position of command line options are arbitrary (i.e. they can appear anywhere). However, if options are mutually exclusive the rightmost appearance is used. This behaviour conforms to the standard evaluation rules of common Unix shells. In addition, one or more command files can be specified using an '@' sign as a prefix to the filename (e.g. \@command.txt). Such a command argument is replaced by the content of the corresponding text file (multiple whitespaces are treated as a single separator unless they appear between two quotation marks) prior to any further evaluation. Please note that a command file cannot contain another command file. This simple but effective approach allows to summarize common combinations of options/parameters and avoids longish and confusing command lines (an example is provided in file \/dumppat.txt). \section environment ENVIRONMENT The \b dcmgpdir utility will attempt to load DICOM data dictionaries specified in the \e DCMDICTPATH environment variable. By default, i.e. if the \e DCMDICTPATH environment variable is not set, the file \/dicom.dic will be loaded unless the dictionary is built into the application (default for Windows). The default behaviour should be preferred and the \e DCMDICTPATH environment variable only used when alternative data dictionaries are required. The \e DCMDICTPATH environment variable has the same format as the Unix shell \e PATH variable in that a colon (":") separates entries. On Windows systems, a semicolon (";") is used as a separator. The data dictionary code will attempt to load each file specified in the \e DCMDICTPATH environment variable. It is an error if no data dictionary can be loaded. \section see_also SEE ALSO dcmmkdir(1) \section copyright COPYRIGHT Copyright (C) 1996-2010 by OFFIS e.V., Escherweg 2, 26121 Oldenburg, Germany. */ dcmtk-3.6.0/dcmdata/configure0000755000310500011400000000216311402146323015341 0ustar joergrdicom3#! /bin/sh parentdir=`pwd` thisdir=$parentdir # The following test constructs relative path from the module # directory to the configuration directory. If you know this path # you can substitute this with # configdir= # It is very important that the configdir path is relative. configdir="configdir" while test "$parentdir" != "/" -a "$configdir" = "configdir"; do if test -d "$parentdir/config" ; then configdir=$parentdir/config else parentdir=`echo $parentdir | sed 's/\/[^\/]*$//'` fi done if test "$configdir" = "configdir" ; then echo "Cannot find configure directory" exit 1 fi if test $# != 0; then case $1 in -a) shift cd "$configdir" echo "running configure in config-directory" ./configure $* cd $thisdir echo "running configure for this module" sh "$configdir/confmod" --srcdir=. $* ;; -c) shift cd "$configdir" echo "running configure in config-directory" ./configure $* ;; *) echo "running configure for this module" sh "$configdir/confmod" --srcdir=. $* ;; esac else echo "running configure for this module" sh "$configdir/confmod" --srcdir=. $* fi dcmtk-3.6.0/dcmdata/Makefile.in0000644000310500011400000000400611133645657015514 0ustar joergrdicom3# # Makefile for dcmdata # @SET_MAKE@ SHELL = /bin/sh VPATH = @srcdir@:@top_srcdir@/include:@top_srcdir@/@configdir@/include srcdir = @srcdir@ top_srcdir = @top_srcdir@ configdir = @top_srcdir@/@configdir@ include $(configdir)/@common_makefile@ all: include-all libsrc-all apps-all tests-all install: install-bin install-doc install-support install-bin: apps-install install-doc: docs-install install-data: data-install install-etc: etc-install install-include: include-install install-lib: libsrc-install install-include install-support: install-data install-etc include-all: (cd include && $(MAKE) ARCH="$(ARCH)" all) libsrc-all: include-all (cd libsrc && $(MAKE) ARCH="$(ARCH)" all) (cd libi2d && $(MAKE) ARCH="$(ARCH)" all) apps-all: libsrc-all (cd apps && $(MAKE) ARCH="$(ARCH)" all) tests-all: libsrc-all (cd tests && $(MAKE) ARCH="$(ARCH)" all) include-install: (cd include && $(MAKE) ARCH="$(ARCH)" install) libsrc-install: libsrc-all (cd libsrc && $(MAKE) ARCH="$(ARCH)" install-lib) (cd libi2d && $(MAKE) ARCH="$(ARCH)" install-lib) apps-install: apps-all (cd apps && $(MAKE) ARCH="$(ARCH)" install) docs-install: (cd docs && $(MAKE) install) data-install: (cd data && $(MAKE) install) etc-install: (cd etc && $(MAKE) install) clean: (cd include && $(MAKE) clean) (cd libsrc && $(MAKE) clean) (cd libi2d && $(MAKE) clean) (cd apps && $(MAKE) clean) (cd tests && $(MAKE) clean) (cd docs && $(MAKE) clean) (cd data && $(MAKE) clean) (cd etc && $(MAKE) clean) rm -f $(TRASH) distclean: (cd include && $(MAKE) distclean) (cd libsrc && $(MAKE) distclean) (cd libi2d && $(MAKE) distclean) (cd apps && $(MAKE) distclean) (cd tests && $(MAKE) distclean) (cd docs && $(MAKE) distclean) (cd data && $(MAKE) distclean) (cd etc && $(MAKE) distclean) rm -f $(DISTTRASH) dependencies: (cd libsrc && touch $(DEP) && $(MAKE) dependencies) (cd libi2d && touch $(DEP) && $(MAKE) dependencies) (cd apps && touch $(DEP) && $(MAKE) dependencies) (cd tests && touch $(DEP) && $(MAKE) dependencies) dcmtk-3.6.0/dcmdata/tests/0000755000310500011400000000000011511320675014577 5ustar joergrdicom3dcmtk-3.6.0/dcmdata/tests/i2dbmp.cc0000644000310500011400000003011011502405622016252 0ustar joergrdicom3/* * * Copyright (C) 2010, 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: dcmdata * * Author: Uli Schlachter * * Purpose: test program for class I2DBmpSource * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-12-16 12:52:34 $ * CVS/RCS Revision: $Revision: 1.4 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/libi2d/i2dbmps.h" #include "dcmtk/dcmdata/cmdlnarg.h" #include "dcmtk/dcmdata/dcuid.h" /* for dcmtk version name */ #define OFFIS_CONSOLE_APPLICATION "i2dbmp" static char rcsid[] = "$dcmtk: " OFFIS_CONSOLE_APPLICATION " v" OFFIS_DCMTK_VERSION " " OFFIS_DCMTK_RELEASEDATE " $"; static OFLogger i2dbmpLogger = OFLog::getLogger("dcmtk.apps." OFFIS_CONSOLE_APPLICATION); enum offset { BMP_IMAGE_OFFSET = 10, BMP_WIDTH = 18, BMP_HEIGHT = 22, // BPP is only 2 bytes wide! BMP_BPP = 28, BMP_COLORS = 46 }; // 0 unless there were errors static int status = 0; // temporary file which will be used static const char *temporaryFile = "i2dbmp.tmp"; static Uint8 bmpHeader[] = { // Offset 0, Magic identification number 'B', 'M', // 2, File size, most likely wrong anyway 42, 0x42, 13, 37, // 6, Reservered 0x13, 0x37, 0xde, 0xad, // 10, Offset of the image data from start of data, this is IMPORTANT 0, 0, 0, 0, // 14, value is 40, the size of the BITMAPINFOHEADER struct (the following data) 40, 0, 0, 0, // 18, Width of the image 0, 0, 0, 0, // 22, height of image, if this is negative it's a top-down image 0, 0, 0, 0, // 26, number of planes, always 1 in BMP 1, 0, // 28, Bit depth 24, 0, // 30, compression info 0, 0, 0, 0, // 34, zero or size of image data in bytes 12, 11, 10, 9, // 38, X pixels per meter 8, 7, 6, 5, // 42, X pixels per meter 4, 3, 2, 1, // 46, colors used, 0 means the default value 5, 0, 0, 0, // 50, number of important colors, this field is useless 1, 2, 3, 4, // Now comes the color table, this one gives us just some colors (the fourth // byte is unused, let's write some garbage into it) // color 0, black 0x00, 0x00, 0x00, 18, // color 1, blue 0xff, 0x00, 0x00, 97, // color 2, green 0x00, 0xff, 0x00, 123, // color 3, red 0x00, 0x00, 0xff, 93, // color 4, white 0xff, 0xff, 0xff, 30, // Now you'd get the actual pixel data }; #define LOG_WARN(arg) OFLOG_WARN(i2dbmpLogger, arg) #define LOG_INFO(arg) OFLOG_INFO(i2dbmpLogger, arg) #define LOG_DEBUG(arg) OFLOG_DEBUG(i2dbmpLogger, arg) #define TEST(arg) LOG_INFO(arg << "...") #define EXPECT_SUCCESS(b) do { \ if (!(b)) { \ status |= 1; \ LOG_WARN("!! Test failed in line " << __LINE__); \ } \ } while (false) #define EXPECT_FAIL(b) EXPECT_SUCCESS(!(b)) static void setDWord(int offset, int width, bool sign = false) { Uint32 w = width; if (sign) w = ~w + 1; for (int i = 0; i < 4; i++) { bmpHeader[offset++] = OFstatic_cast(Uint8, w & 0xff); w >>= 8; } } static bool writeImage(const void *pixelData, unsigned int pixelDataLength) { OFFile file; if (!file.fopen(temporaryFile, "wb")) { LOG_WARN("Failed to open temporary file " << temporaryFile); return false; } file.fwrite(bmpHeader, 1, sizeof(bmpHeader)); if (pixelData != NULL) file.fwrite(pixelData, 1, pixelDataLength); file.fclose(); return true; } static bool readFile(char *&pixData, Uint32 &outputLength, Uint16 &rows, Uint16 &cols) { I2DBmpSource source; Uint16 samplesPerPixel, bitsAlloc, bitsStored; Uint16 highBit, pixelRepr, planConf, pixAspectH, pixAspectV; OFString photoMetrInt; E_TransferSyntax ts; source.setImageFile(temporaryFile); OFCondition res = source.readPixelData(rows, cols, samplesPerPixel, photoMetrInt, bitsAlloc, bitsStored, highBit, pixelRepr, planConf, pixAspectH, pixAspectV, pixData, outputLength, ts); if (res.bad()) { LOG_DEBUG("Reading file failed: " << res.text()); return false; } return true; } static bool canHandleImage(const void *pixelData, unsigned int pixelDataLength) { if (!writeImage(pixelData, pixelDataLength)) return false; char *pixData; Uint32 length; Uint16 rows, cols; if (!readFile(pixData, length, rows, cols)) return false; return true; } static bool compareImage(const void *pixelData, unsigned int pixelDataLength, void *expectedOutput, unsigned int expectedOutputLength, Uint16 width, Uint16 height) { if (!writeImage(pixelData, pixelDataLength)) return false; char *pixData; Uint32 length; Uint16 rows, cols; if (!readFile(pixData, length, rows, cols)) return false; if (expectedOutputLength != length) { LOG_DEBUG("Output length does not match!"); delete[] pixData; return false; } if (memcmp(expectedOutput, pixData, expectedOutputLength) != 0) { LOG_DEBUG("Output data does not match!"); delete[] pixData; return false; } delete[] pixData; if (width != cols) { LOG_DEBUG("Output width does not match!"); return false; } if (height != rows) { LOG_DEBUG("Output height does not match!"); return false; } return true; } static void testImages() { // This pixel data is used for all tests with at least 16bpp Uint8 pixelData1[] = { 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88 }; Uint8 expected1a[] = { 0x77, 0x66, 0x55, 0x33, 0x22, 0x11 }; // 32/24bpp, 1x2, bottom-up Uint8 expected1b[] = { 0x33, 0x22, 0x11, 0x77, 0x66, 0x55 }; // 32/24bpp, 1x2, top-down Uint8 expected1c[] = { 0x33, 0x22, 0x11, 0x66, 0x55, 0x44 }; // 24bpp, 2x1, bottom-up Uint8 expected1d[] = { 0xc8, 0x90, 0xa8, 0x10, 0x18, 0xb8, 0x40, 0x80, 0x88, 0x88, 0x08, 0x98, }; // 16bpp, 2x2, top-down // These are the values of the color table #define BLACK 0x00, 0x00, 0x00 #define BLUE 0x00, 0x00, 0xff #define GREEN 0x00, 0xff, 0x00 #define RED 0xff, 0x00, 0x00 #define WHITE 0xff, 0xff, 0xff Uint8 pixelData2[] = { 0, 1, 2, 3, 4, 3, 2, 1 }; Uint8 expected2[] = { BLACK, BLUE, GREEN, WHITE, RED, GREEN }; // 8bpp, 3x2, top-down // Only byte 0 and 4 are actually used Uint8 pixelData3[] = { 0x40, 0xff, 0xff, 0xff, 0x32, 0xff, 0xff, 0xff }; Uint8 expected3[] = { RED, GREEN, WHITE, BLACK }; // 4bpp, 2x2, bottom-up /* Only first three *bits* of byte 0 and 4 are important, * thanks to the 4 byte alignment requirement for rows. */ Uint8 pixelData4[] = { 0xaf, 0xff, 0x00, 0xad, 0x80, 0xde, 0xad, 0xab }; Uint8 expected4[] = { BLUE, BLACK, BLACK, BLUE, BLACK, BLUE }; // 1bpp, 3x2, bottom-up #undef BLACK #undef BLUE #undef GREEN #undef RED #undef WHITE setDWord(BMP_IMAGE_OFFSET, sizeof(bmpHeader)); TEST("Trying to read a 0x0 image"); setDWord(BMP_WIDTH, 0); setDWord(BMP_HEIGHT, 0); EXPECT_FAIL(canHandleImage(pixelData1, sizeof(pixelData1))); setDWord(BMP_WIDTH, 1); setDWord(BMP_HEIGHT, 2); TEST("Checking large bpp values"); bmpHeader[BMP_BPP ] = 0; bmpHeader[BMP_BPP + 1] = 0xef; EXPECT_FAIL(canHandleImage(pixelData1, sizeof(pixelData1))); bmpHeader[BMP_BPP ] = 32; bmpHeader[BMP_BPP + 1] = 0; TEST("Checking large number of colors"); setDWord(BMP_COLORS, 1 << 31); EXPECT_FAIL(canHandleImage(pixelData1, sizeof(pixelData1))); setDWord(BMP_COLORS, 5); TEST("Checking premature end of file"); EXPECT_FAIL(canHandleImage(pixelData1, sizeof(pixelData1) - 1)); TEST("Decoding a 32bpp image"); EXPECT_SUCCESS(compareImage(pixelData1, sizeof(pixelData1), expected1a, sizeof(expected1a), 1, 2)); TEST("Decoding a 24bpp image"); // Because rows are aligned to 4-bytes boundaries, this can use the // same pixel data as the 32bpp image bmpHeader[BMP_BPP] = 24; EXPECT_SUCCESS(compareImage(pixelData1, sizeof(pixelData1), expected1a, sizeof(expected1a), 1, 2)); TEST("Decoding a 24bpp top-down image"); setDWord(BMP_HEIGHT, -2); EXPECT_SUCCESS(compareImage(pixelData1, sizeof(pixelData1), expected1b, sizeof(expected1b), 1, 2)); TEST("Checking correct handling of row alignment"); setDWord(BMP_WIDTH, 2); setDWord(BMP_HEIGHT, 1); EXPECT_SUCCESS(compareImage(pixelData1, sizeof(pixelData1), expected1c, sizeof(expected1c), 2, 1)); TEST("Decoding a 16bpp image"); bmpHeader[BMP_BPP] = 16; setDWord(BMP_WIDTH, 2); setDWord(BMP_HEIGHT, 2); EXPECT_SUCCESS(compareImage(pixelData1, sizeof(pixelData1), expected1d, sizeof(expected1d), 2, 2)); // Everything starting from 8bpp uses color tables! TEST("Decoding a 8bpp top-down image"); setDWord(BMP_WIDTH, 3); setDWord(BMP_HEIGHT, -2); bmpHeader[BMP_BPP] = 8; EXPECT_SUCCESS(compareImage(pixelData2, sizeof(pixelData2), expected2, sizeof(expected2), 3, 2)); TEST("Decoding a 4bpp image"); bmpHeader[BMP_BPP] = 4; setDWord(BMP_WIDTH, 2); setDWord(BMP_HEIGHT, 2); EXPECT_SUCCESS(compareImage(pixelData3, sizeof(pixelData3), expected3, sizeof(expected3), 2, 2)); TEST("Decoding a 1bpp image"); bmpHeader[BMP_BPP] = 1; setDWord(BMP_WIDTH, 3); setDWord(BMP_HEIGHT, 2); EXPECT_SUCCESS(compareImage(pixelData4, sizeof(pixelData4), expected4, sizeof(expected4), 3, 2)); TEST("Decoding an image with too large color table"); setDWord(BMP_COLORS, -1); EXPECT_FAIL(canHandleImage(pixelData4, sizeof(pixelData4))); TEST("Decoding an image with too small color table"); setDWord(BMP_COLORS, 1); EXPECT_FAIL(canHandleImage(pixelData4, sizeof(pixelData4))); } #define SHORTCOL 3 #define LONGCOL 21 int main(int argc, char *argv[]) { OFConsoleApplication app(OFFIS_CONSOLE_APPLICATION, "Test libi2d's BMP support", rcsid); OFCommandLine cmd; cmd.setOptionColumns(LONGCOL, SHORTCOL); cmd.setParamColumn(LONGCOL + SHORTCOL + 4); cmd.addGroup("general options:", LONGCOL, SHORTCOL + 2); cmd.addOption("--help", "-h", "print this help text and exit", OFCommandLine::AF_Exclusive); cmd.addOption("--version", "print version information and exit", OFCommandLine::AF_Exclusive); OFLog::addOptions(cmd); /* evaluate command line */ prepareCmdLineArgs(argc, argv, OFFIS_CONSOLE_APPLICATION); if (app.parseCommandLine(cmd, argc, argv, OFCommandLine::PF_ExpandWildcards)) { /* check exclusive options first */ if (cmd.hasExclusiveOption()) { if (cmd.findOption("--version")) { app.printHeader(OFTrue /*print host identifier*/); return 0; } } } /* options */ OFLog::configureFromCommandLine(cmd, app); /* print resource identifier */ OFLOG_DEBUG(i2dbmpLogger, rcsid << OFendl); testImages(); /* Remove our temporary file */ unlink(temporaryFile); if (status) { LOG_WARN("!!! Some tests failed!"); } else { COUT << "*** All tests successful!" << OFendl; } return status; } /* * * CVS/RCS Log: * $Log: i2dbmp.cc,v $ * Revision 1.4 2010-12-16 12:52:34 joergr * Added explicit type cast in order to keep VisualStudio 2005 quiet. * * Revision 1.3 2010-12-06 11:26:43 uli * Fixed the i2dbmp test case for windows by opening files in binary mode. * * Revision 1.2 2010-10-14 13:15:05 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.1 2010-06-11 09:34:17 uli * Added test for i2d's BMP code. * * * */ dcmtk-3.6.0/dcmdata/tests/tstpath.cc0000644000310500011400000006065211455601131016602 0ustar joergrdicom3/* * * Copyright (C) 2008-2010, 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: dcmdata * * Author: Michael Onken * * Purpose: Test program for testing path features of DcmItem * and DcmSequenceOfItem * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:15:05 $ * CVS/RCS Revision: $Revision: 1.13 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dctk.h" #include "dcmtk/dcmdata/cmdlnarg.h" #include "dcmtk/ofstd/ofconapp.h" #include "dcmtk/dcmdata/dcpath.h" #define OFFIS_CONSOLE_APPLICATION "tstpath" static OFLogger tstpathLogger = OFLog::getLogger("dcmtk.apps." OFFIS_CONSOLE_APPLICATION); static char rcsid[] = "$dcmtk: " OFFIS_CONSOLE_APPLICATION " v" OFFIS_DCMTK_VERSION " " OFFIS_DCMTK_RELEASEDATE " $"; static void testPathInsertionsWithoutWildcard(const OFString& path, DcmDataset *dset, const Uint16& expectedNumObjects, const OFBool& expectFailed = OFFalse, const OFBool& createIfNecessary = OFTrue) { OFLOG_INFO(tstpathLogger, "Path: " << path); DcmPathProcessor proc; OFCondition result = proc.findOrCreatePath(dset, path, createIfNecessary); if (result.bad()) { if (!expectFailed) OFLOG_ERROR(tstpathLogger, " ...FAILED! Path " << (createIfNecessary ? "insertion" : "lookup") << " failed: " << result.text()); return; } // get results OFList< DcmPath* > results; Uint32 numResults = proc.getResults(results); if (numResults != 1) { // non-wildcard insertion should ALWAYS only return one result OFLOG_ERROR(tstpathLogger, "...FAILED! Returned path list does contain more than one result but no wildcard was specified"); return; } DcmPath* oneResult = * (results.begin()); if (oneResult->size() != expectedNumObjects) { if (!expectFailed) { OFLOG_ERROR(tstpathLogger, "...FAILED! Returned object list does not contain " << expectedNumObjects << " but only " << oneResult->size() << "elements"); return; } } else { OFListIterator(DcmPathNode*) it = oneResult->begin(); for (Uint16 i=0; i < expectedNumObjects; i++) { if (*it == NULL) { OFLOG_ERROR(tstpathLogger, " ...FAILED! Path insertion failed: One of the created objects is NULL"); return; } it++; } } OFLOG_INFO(tstpathLogger, " ...OK"); } static void testPathInsertionsWithWildcard(const OFString& path, DcmDataset *dset, const Uint16& expectedNumResults, const OFBool& expectFailed = OFFalse, const OFBool& createIfNecessary = OFTrue) { OFLOG_INFO(tstpathLogger, "Path: " << path); DcmPathProcessor proc; OFCondition result = proc.findOrCreatePath(dset, path, createIfNecessary); if (result.bad()) { if (!expectFailed) OFLOG_ERROR(tstpathLogger, " ...FAILED! Path " << (createIfNecessary ? "insertion" : "lookup") << " failed: " << result.text()); return; } // get results OFList< DcmPath* > results; Uint32 numResults = proc.getResults(results); if ( (numResults != expectedNumResults) && !expectFailed ) { OFLOG_ERROR(tstpathLogger, " ...FAILED!: Expected " << expectedNumResults << " but " << numResults << " results were returned"); return; } // check results OFListIterator(DcmPath*) oneResult = results.begin(); while (oneResult != results.end()) { if (*oneResult) { OFListIterator(DcmPathNode*) it = (*oneResult)->begin(); while (it != (*oneResult)->end()) { if (*it == NULL) { OFLOG_INFO(tstpathLogger, " ...FAILED! Path insertion failed: One of the result paths contains NULL"); return; } it++; } } else { OFLOG_INFO(tstpathLogger, " ...FAILED! Path insertion failed: One of the returned path is NULL"); return; } oneResult++; } OFLOG_INFO(tstpathLogger, " ...OK"); } int main(int argc, char *argv[]) { #ifdef HAVE_GUSI_H GUSISetup(GUSIwithSIOUXSockets); GUSISetup(GUSIwithInternetSockets); #endif OFConsoleApplication app(OFFIS_CONSOLE_APPLICATION , "Tests DcmItem/DcmSequenceOfItem's path access features", rcsid); OFCommandLine cmd; cmd.addGroup("general options:"); cmd.addOption("--help", "-h", "print this help text and exit", OFCommandLine::AF_Exclusive); cmd.addOption("--version", "print version information and exit", OFCommandLine::AF_Exclusive); OFLog::addOptions(cmd); /* evaluate command line */ prepareCmdLineArgs(argc, argv, OFFIS_CONSOLE_APPLICATION); if (app.parseCommandLine(cmd, argc, argv, OFCommandLine::PF_ExpandWildcards)) { /* check exclusive options first */ if (cmd.hasExclusiveOption()) { if (cmd.findOption("--version")) { app.printHeader(OFTrue /*print host identifier*/); COUT << OFendl << "External libraries used:"; COUT << " none" << OFendl; return 0; } } } /* command line parameters */ OFLog::configureFromCommandLine(cmd, app); /* make sure data dictionary is loaded */ if (!dcmDataDict.isDictionaryLoaded()) { OFLOG_WARN(tstpathLogger, "no data dictionary loaded, " << "check environment variable: " << DCM_DICT_ENVIRONMENT_VARIABLE); } DcmFileFormat dcmff; DcmDataset *dset = dcmff.getDataset(); OFString path; const OFString precalculatedDump = /* break the dump into smaller parts because MSVC6 only accepts 2048 character string constants maximum */ "# Dicom-Data-Set\n# Used TransferSyntax: Unknown Transfer Syntax\n(0040,a730) SQ (Sequence with explicit length #=6) # 0, 1 ContentSequence\n" " (fffe,e000) na (Item with explicit length #=0) # 0, 1 Item\n (fffe,e00d) na (ItemDelimitationItem for re-encoding) # 0, 0 ItemDelimitationItem\n" " (fffe,e000) na (Item with explicit length #=0) # 0, 1 Item\n (fffe,e00d) na (ItemDelimitationItem for re-encoding) # 0, 0 ItemDelimitationItem\n" " (fffe,e000) na (Item with explicit length #=0) # 0, 1 Item\n (fffe,e00d) na (ItemDelimitationItem for re-encoding) # 0, 0 ItemDelimitationItem\n" " (fffe,e000) na (Item with explicit length #=0) # 0, 1 Item\n (fffe,e00d) na (ItemDelimitationItem for re-encoding) # 0, 0 ItemDelimitationItem\n" " (fffe,e000) na (Item with explicit length #=0) # 0, 1 Item\n (fffe,e00d) na (ItemDelimitationItem for re-encoding) # 0, 0 ItemDelimitationItem\n" " (fffe,e000) na (Item with explicit length #=1) # 0, 1 Item\n (0040,a730) SQ (Sequence with explicit length #=4) # 0, 1 ContentSequence\n" " (fffe,e000) na (Item with explicit length #=0) # 0, 1 Item\n (fffe,e00d) na (ItemDelimitationItem for re-encoding) # 0, 0 ItemDelimitationItem\n" " (fffe,e000) na (Item with explicit length #=0) # 0, 1 Item\n (fffe,e00d) na (ItemDelimitationItem for re-encoding) # 0, 0 ItemDelimitationItem\n" " (fffe,e000) na (Item with explicit length #=0) # 0, 1 Item\n (fffe,e00d) na (ItemDelimitationItem for re-encoding) # 0, 0 ItemDelimitationItem\n" " (fffe,e000) na (Item with explicit length #=1) # 0, 1 Item\n (0040,a043) SQ (Sequence with explicit length #=1) # 0, 1 ConceptNameCodeSequence\n" " (fffe,e000) na (Item with explicit length #=2) # 0, 1 Item\n (0008,0100) SH (no value available) # 0, 0 CodeValue\n" " (0008,0104) LO (no value available) # 0, 0 CodeMeaning\n (fffe,e00d) na (ItemDelimitationItem for re-encoding) # 0, 0 ItemDelimitationItem\n" " (fffe,e0dd) na (SequenceDelimitationItem for re-encod.) # 0, 0 SequenceDelimitationItem\n (fffe,e00d) na (ItemDelimitationItem for re-encoding) # 0, 0 ItemDelimitationItem\n" " (fffe,e0dd) na (SequenceDelimitationItem for re-encod.) # 0, 0 SequenceDelimitationItem\n (fffe,e00d) na (ItemDelimitationItem for re-encoding) # 0, 0 ItemDelimitationItem\n" "(fffe,e0dd) na (SequenceDelimitationItem for re-encod.) # 0, 0 SequenceDelimitationItem\n"; const OFString precalculatedDump2 = "# Dicom-Data-Set\n# Used TransferSyntax: Unknown Transfer Syntax\n(0010,0020) LO (no value available) # 0, 0 PatientID\n" "(0040,a730) SQ (Sequence with explicit length #=6) # 0, 1 ContentSequence\n (fffe,e000) na (Item with explicit length #=1) # 0, 1 Item\n" " (0040,a730) SQ (Sequence with explicit length #=4) # 0, 1 ContentSequence\n (fffe,e000) na (Item with explicit length #=1) # 0, 1 Item\n" " (0010,0020) LO (no value available) # 0, 0 PatientID\n (fffe,e00d) na (ItemDelimitationItem for re-encoding) # 0, 0 ItemDelimitationItem\n" " (fffe,e000) na (Item with explicit length #=0) # 0, 1 Item\n (fffe,e00d) na (ItemDelimitationItem for re-encoding) # 0, 0 ItemDelimitationItem\n" " (fffe,e000) na (Item with explicit length #=0) # 0, 1 Item\n (fffe,e00d) na (ItemDelimitationItem for re-encoding) # 0, 0 ItemDelimitationItem\n" " (fffe,e000) na (Item with explicit length #=1) # 0, 1 Item\n (0010,0010) PN (no value available) # 0, 0 PatientName\n" " (fffe,e00d) na (ItemDelimitationItem for re-encoding) # 0, 0 ItemDelimitationItem\n (fffe,e0dd) na (SequenceDelimitationItem for re-encod.) # 0, 0 SequenceDelimitationItem\n" " (fffe,e00d) na (ItemDelimitationItem for re-encoding) # 0, 0 ItemDelimitationItem\n (fffe,e000) na (Item with explicit length #=1) # 0, 1 Item\n" " (0040,a730) SQ (Sequence with explicit length #=4) # 0, 1 ContentSequence\n (fffe,e000) na (Item with explicit length #=1) # 0, 1 Item\n" " (0010,0020) LO (no value available) # 0, 0 PatientID\n (fffe,e00d) na (ItemDelimitationItem for re-encoding) # 0, 0 ItemDelimitationItem\n" " (fffe,e000) na (Item with explicit length #=0) # 0, 1 Item\n (fffe,e00d) na (ItemDelimitationItem for re-encoding) # 0, 0 ItemDelimitationItem\n" " (fffe,e000) na (Item with explicit length #=0) # 0, 1 Item\n (fffe,e00d) na (ItemDelimitationItem for re-encoding) # 0, 0 ItemDelimitationItem\n" " (fffe,e000) na (Item with explicit length #=1) # 0, 1 Item\n (0010,0010) PN (no value available) # 0, 0 PatientName\n" " (fffe,e00d) na (ItemDelimitationItem for re-encoding) # 0, 0 ItemDelimitationItem\n (fffe,e0dd) na (SequenceDelimitationItem for re-encod.) # 0, 0 SequenceDelimitationItem\n" " (fffe,e00d) na (ItemDelimitationItem for re-encoding) # 0, 0 ItemDelimitationItem\n (fffe,e000) na (Item with explicit length #=1) # 0, 1 Item\n" " (0040,a730) SQ (Sequence with explicit length #=4) # 0, 1 ContentSequence\n (fffe,e000) na (Item with explicit length #=1) # 0, 1 Item\n" " (0010,0020) LO (no value available) # 0, 0 PatientID\n (fffe,e00d) na (ItemDelimitationItem for re-encoding) # 0, 0 ItemDelimitationItem\n" " (fffe,e000) na (Item with explicit length #=0) # 0, 1 Item\n (fffe,e00d) na (ItemDelimitationItem for re-encoding) # 0, 0 ItemDelimitationItem\n" " (fffe,e000) na (Item with explicit length #=0) # 0, 1 Item\n (fffe,e00d) na (ItemDelimitationItem for re-encoding) # 0, 0 ItemDelimitationItem\n" " (fffe,e000) na (Item with explicit length #=1) # 0, 1 Item\n (0010,0010) PN (no value available) # 0, 0 PatientName\n" " (fffe,e00d) na (ItemDelimitationItem for re-encoding) # 0, 0 ItemDelimitationItem\n (fffe,e0dd) na (SequenceDelimitationItem for re-encod.) # 0, 0 SequenceDelimitationItem\n" " (fffe,e00d) na (ItemDelimitationItem for re-encoding) # 0, 0 ItemDelimitationItem\n (fffe,e000) na (Item with explicit length #=1) # 0, 1 Item\n" " (0040,a730) SQ (Sequence with explicit length #=4) # 0, 1 ContentSequence\n (fffe,e000) na (Item with explicit length #=1) # 0, 1 Item\n" " (0010,0020) LO (no value available) # 0, 0 PatientID\n (fffe,e00d) na (ItemDelimitationItem for re-encoding) # 0, 0 ItemDelimitationItem\n" " (fffe,e000) na (Item with explicit length #=0) # 0, 1 Item\n (fffe,e00d) na (ItemDelimitationItem for re-encoding) # 0, 0 ItemDelimitationItem\n" " (fffe,e000) na (Item with explicit length #=0) # 0, 1 Item\n (fffe,e00d) na (ItemDelimitationItem for re-encoding) # 0, 0 ItemDelimitationItem\n" " (fffe,e000) na (Item with explicit length #=1) # 0, 1 Item\n (0010,0010) PN (no value available) # 0, 0 PatientName\n" " (fffe,e00d) na (ItemDelimitationItem for re-encoding) # 0, 0 ItemDelimitationItem\n (fffe,e0dd) na (SequenceDelimitationItem for re-encod.) # 0, 0 SequenceDelimitationItem\n" " (fffe,e00d) na (ItemDelimitationItem for re-encoding) # 0, 0 ItemDelimitationItem\n (fffe,e000) na (Item with explicit length #=1) # 0, 1 Item\n" " (0040,a730) SQ (Sequence with explicit length #=4) # 0, 1 ContentSequence\n (fffe,e000) na (Item with explicit length #=1) # 0, 1 Item\n" " (0010,0020) LO (no value available) # 0, 0 PatientID\n (fffe,e00d) na (ItemDelimitationItem for re-encoding) # 0, 0 ItemDelimitationItem\n" " (fffe,e000) na (Item with explicit length #=0) # 0, 1 Item\n (fffe,e00d) na (ItemDelimitationItem for re-encoding) # 0, 0 ItemDelimitationItem\n" " (fffe,e000) na (Item with explicit length #=0) # 0, 1 Item\n (fffe,e00d) na (ItemDelimitationItem for re-encoding) # 0, 0 ItemDelimitationItem\n" " (fffe,e000) na (Item with explicit length #=1) # 0, 1 Item\n (0010,0010) PN (no value available) # 0, 0 PatientName\n" " (fffe,e00d) na (ItemDelimitationItem for re-encoding) # 0, 0 ItemDelimitationItem\n (fffe,e0dd) na (SequenceDelimitationItem for re-encod.) # 0, 0 SequenceDelimitationItem\n" " (fffe,e00d) na (ItemDelimitationItem for re-encoding) # 0, 0 ItemDelimitationItem\n (fffe,e000) na (Item with explicit length #=1) # 0, 1 Item\n" " (0040,a730) SQ (Sequence with explicit length #=4) # 0, 1 ContentSequence\n (fffe,e000) na (Item with explicit length #=1) # 0, 1 Item\n" " (0010,0020) LO (no value available) # 0, 0 PatientID\n (fffe,e00d) na (ItemDelimitationItem for re-encoding) # 0, 0 ItemDelimitationItem\n" " (fffe,e000) na (Item with explicit length #=0) # 0, 1 Item\n (fffe,e00d) na (ItemDelimitationItem for re-encoding) # 0, 0 ItemDelimitationItem\n" " (fffe,e000) na (Item with explicit length #=0) # 0, 1 Item\n (fffe,e00d) na (ItemDelimitationItem for re-encoding) # 0, 0 ItemDelimitationItem\n" " (fffe,e000) na (Item with explicit length #=2) # 0, 1 Item\n (0010,0010) PN (no value available) # 0, 0 PatientName\n" " (0040,a043) SQ (Sequence with explicit length #=1) # 0, 1 ConceptNameCodeSequence\n (fffe,e000) na (Item with explicit length #=2) # 0, 1 Item\n" " (0008,0100) SH (no value available) # 0, 0 CodeValue\n (0008,0104) LO (no value available) # 0, 0 CodeMeaning\n" " (fffe,e00d) na (ItemDelimitationItem for re-encoding) # 0, 0 ItemDelimitationItem\n (fffe,e0dd) na (SequenceDelimitationItem for re-encod.) # 0, 0 SequenceDelimitationItem\n" " (fffe,e00d) na (ItemDelimitationItem for re-encoding) # 0, 0 ItemDelimitationItem\n (fffe,e0dd) na (SequenceDelimitationItem for re-encod.) # 0, 0 SequenceDelimitationItem\n" " (fffe,e00d) na (ItemDelimitationItem for re-encoding) # 0, 0 ItemDelimitationItem\n(fffe,e0dd) na (SequenceDelimitationItem for re-encod.) # 0, 0 SequenceDelimitationItem\n"; const Uint32 precalculatedLength = 148; const Uint32 precalculatedLength2 = 464; /* ********************************************************************* */ /* Test insertions using no wildcards */ /* ********************************************************************* */ OFLOG_INFO(tstpathLogger, "These insertions should work:\n" << "============================="); path = "PatientID"; testPathInsertionsWithoutWildcard(path, dset, 1); path = "ContentSequence"; testPathInsertionsWithoutWildcard(path, dset, 1); path = "(0040,A730)"; testPathInsertionsWithoutWildcard(path, dset, 1); path = "(0040,A730)[5]"; testPathInsertionsWithoutWildcard(path, dset, 2); path = "(0040,A730)[5].ContentSequence[3].ConceptNameCodeSequence[0].CodeValue"; testPathInsertionsWithoutWildcard(path, dset, 7); path = "ContentSequence[5].ContentSequence[3].ConceptNameCodeSequence[0].(0008,0104)"; testPathInsertionsWithoutWildcard(path, dset, 7); OFLOG_INFO(tstpathLogger, "\nThese insertions should NOT work (wrong syntax):\n" << "================================================"); path = "ContentSequences"; testPathInsertionsWithoutWildcard(path, dset, 1, OFTrue); path = "(1234,ContentSequences"; testPathInsertionsWithoutWildcard(path, dset, 1, OFTrue); path = "(00X4,A730)"; testPathInsertionsWithoutWildcard(path, dset, 1, OFTrue); path = "(0040,A730)[-5]"; testPathInsertionsWithoutWildcard(path, dset, 2, OFTrue); path = "(0040,A730)[a].ContentSequence[3].ConceptNameCodeSequence[0].CodeValue"; testPathInsertionsWithoutWildcard(path, dset, 7, OFTrue); OFLOG_INFO(tstpathLogger, "\nThese find routines should work:\n" << "================================"); path = "PatientID"; testPathInsertionsWithoutWildcard(path, dset, 1, OFFalse, OFFalse /* do not create */); path = "ContentSequence"; testPathInsertionsWithoutWildcard(path, dset, 1, OFFalse, OFFalse /* do not create */); path = "(0040,A730)"; testPathInsertionsWithoutWildcard(path, dset, 1, OFFalse, OFFalse /* do not create */); path = "(0040,A730)[5]"; testPathInsertionsWithoutWildcard(path, dset, 2, OFFalse, OFFalse /* do not create */); path = "(0040,A730)[5].ContentSequence[3].ConceptNameCodeSequence[0].CodeValue"; testPathInsertionsWithoutWildcard(path, dset, 7, OFFalse, OFFalse /* do not create */); path = "ContentSequence[5].ContentSequence[3].ConceptNameCodeSequence[0].(0008,0104)"; testPathInsertionsWithoutWildcard(path, dset, 7, OFFalse, OFFalse /* do not create */); OFLOG_INFO(tstpathLogger, "\nThese find routines should NOT work:\n" << "===================================="); path = "PatientName"; // was never inserted testPathInsertionsWithoutWildcard(path, dset, 1, OFTrue, OFFalse /* do not create */); path = "(0040,A730)[6]"; // we only have 6 items in there (not 7) testPathInsertionsWithoutWildcard(path, dset, 2, OFTrue, OFFalse /* do not create */); path = "ConceptNameCodeSequence"; // should not exist on main level testPathInsertionsWithoutWildcard(path, dset, 1, OFTrue, OFFalse /* do not create */); OFLOG_INFO(tstpathLogger, "\nChecking dataset length:\n" << "========================"); Uint32 length = dset->calcElementLength(EXS_LittleEndianExplicit,EET_ExplicitLength); OFLOG_INFO(tstpathLogger, "Checking whether length of encoded dataset matches pre-calculated length"); if (length == precalculatedLength) { OFLOG_INFO(tstpathLogger, " ...OK"); } else { OFLOG_ERROR(tstpathLogger, " ...FAILED: Length is " << length << ". Should be " << precalculatedLength << "\n" << "Please check dump and adapt test in case of false alarm:\n"); CERR << "Dump of assembled test object:" << OFendl; dset->print(CERR); CERR << OFendl; CERR << "Dump of pre-defined template:" << OFendl; CERR << precalculatedDump << OFendl; exit(1); } /* ********************************************************************* */ /* Test insertions using wildcards */ /* ********************************************************************* */ OFLOG_INFO(tstpathLogger, "\nThese wildcard insertions should work:\n" << "======================================"); path = "ContentSequence[*].ContentSequence[3].PatientName"; testPathInsertionsWithWildcard(path, dset, 6, OFFalse /* should work*/, OFTrue /*do create*/); path = "ContentSequence[*].ContentSequence[0].PatientID"; testPathInsertionsWithWildcard(path, dset, 6, OFFalse /* should work*/, OFTrue /*do create*/); OFLOG_INFO(tstpathLogger, "\nTesting wildcard insertions should NOT work:\n" << "============================================"); path = "SourceImageSequence[*]"; testPathInsertionsWithWildcard(path, dset, 0, OFTrue /* should fail*/, OFTrue /*do create*/); path = "ContentSequence[*].SourceImageSequence[*]"; testPathInsertionsWithWildcard(path, dset, 0, OFTrue /* should fail*/, OFTrue /*do create*/); OFLOG_INFO(tstpathLogger, "\nChecking dataset length:\n" << "========================"); length = dset->calcElementLength(EXS_LittleEndianExplicit,EET_ExplicitLength); OFLOG_INFO(tstpathLogger, "Checking whether length of encoded dataset matches pre-calculated length"); if (length == precalculatedLength2) { OFLOG_INFO(tstpathLogger, " ...OK"); } else { OFLOG_ERROR(tstpathLogger, " ...FAILED: Length is " << length << ". Should be " << precalculatedLength2 << "\n" << "Please check dump and adapt test in case of false alarm:"); CERR << "Dump of assembled test object:" << OFendl; dset->print(CERR); CERR << OFendl; CERR << "Dump of pre-defined template:" << OFendl; CERR << precalculatedDump2 << OFendl; exit(1); } exit(0); } /* * CVS/RCS Log: * $Log: tstpath.cc,v $ * Revision 1.13 2010-10-14 13:15:05 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.12 2010-08-23 07:22:56 meichel * Minor changes needed for compilation on MSVC6 * * Revision 1.11 2010-08-10 07:08:22 joergr * Re-added newline character removed by last commit and moved another newline * to the right place. * * Revision 1.10 2010-08-09 17:53:02 onken * Fixed path test. * * Revision 1.9 2010-08-09 13:41:54 joergr * Updated data dictionary to 2009 edition of the DICOM standard. From now on, * the official "keyword" is used for the attribute name which results in a * number of minor changes (e.g. "PatientsName" is now called "PatientName"). * * Revision 1.8 2009-11-04 09:58:11 uli * Switched to logging mechanism provided by the "new" oflog module * * Revision 1.7 2009-04-20 16:03:12 joergr * Fixed typo. * * Revision 1.6 2008-12-12 11:44:41 onken * Moved path access functions to separate classes * * Revision 1.5 2008-12-05 13:28:55 onken * Changed test application to test splitted findOrCreate() path API. * * Revision 1.4 2008-12-04 16:56:38 onken * Extended application to also test new findOrCreatePath() wildcard features. * * Revision 1.3 2008-11-21 16:18:32 onken * Changed implementation of findOrCreatePath() to make use of function * newDicomElement() which also knows how to handle EVRs like ox correctly. * * Revision 1.2 2008-10-15 16:07:08 onken * Fixed CVS information in source's header comment. * * Revision 1.1 2008-10-15 15:59:02 onken * Added test program for testing DcmItem's and DcmSequenceOfItem's path access * features. * */ dcmtk-3.6.0/dcmdata/tests/tvrdatim.cc0000644000310500011400000001104511455601133016737 0ustar joergrdicom3/* * * Copyright (C) 2002-2010, 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: dcmdata * * Author: Joerg Riesmeier * * Purpose: test program for classes DcmDate, DcmTime and DcmDateTime * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:15:07 $ * CVS/RCS Revision: $Revision: 1.8 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcvrda.h" #include "dcmtk/dcmdata/dcvrtm.h" #include "dcmtk/dcmdata/dcvrdt.h" #include "dcmtk/dcmdata/dcdeftag.h" #include "dcmtk/ofstd/ofconsol.h" int main() { double timeZone; OFDate dateVal; OFTime timeVal; OFDateTime dateTime; OFString string; DcmDate dcmDate(DCM_StudyDate); DcmTime dcmTime(DCM_StudyTime); DcmDateTime dcmDateTime(DCM_DateTime); dcmDate.setCurrentDate(); dcmDate.print(COUT); if (dcmDate.getOFDate(dateVal).good()) COUT << "current date: " << dateVal << OFendl; else COUT << "current date: " << OFendl; dcmTime.setCurrentTime(); dcmTime.print(COUT); if (dcmTime.getOFTime(timeVal).good()) COUT << "current time: " << timeVal << OFendl; else COUT << "current time: " << OFendl; dcmTime.putString("12"); dcmTime.print(COUT); if (dcmTime.getOFTime(timeVal).good()) COUT << "valid time: " << timeVal << OFendl; dcmTime.putString("1203"); dcmTime.print(COUT); if (dcmTime.getOFTime(timeVal).good()) COUT << "valid time: " << timeVal << OFendl; dcmTime.putString("120315"); dcmTime.print(COUT); if (dcmTime.getOFTime(timeVal).good()) COUT << "valid time: " << timeVal << OFendl; dcmTime.putString("120301.99"); dcmTime.print(COUT); if (dcmTime.getOFTime(timeVal).good()) { timeVal.getISOFormattedTime(string, OFTrue /*seconds*/, OFTrue /*fraction*/, OFTrue /*timeZone*/); COUT << "valid local time: " << string << OFendl; } dcmTime.putString("12:03"); dcmTime.print(COUT); if (dcmTime.getOFTime(timeVal).good()) COUT << "valid time: " << timeVal << OFendl; dcmTime.putString("12:03:15"); dcmTime.print(COUT); if (dcmTime.getOFTime(timeVal).good()) COUT << "valid time: " << timeVal << OFendl; if (DcmTime::getTimeZoneFromString("+1130", timeZone).good()) COUT << "time zone: " << timeZone << OFendl; if (DcmTime::getTimeZoneFromString("-0100", timeZone).good()) COUT << "time zone: " << timeZone << OFendl; dcmDateTime.putString("200204101203+0500"); dcmDateTime.print(COUT); if (dcmDateTime.getOFDateTime(dateTime).good()) COUT << "valid date/time: " << dateTime << OFendl; dcmDateTime.setCurrentDateTime(OFTrue /*seconds*/, OFTrue /*fraction*/, OFTrue /*timeZone*/); dcmDateTime.print(COUT); if (dcmDateTime.getOFDateTime(dateTime).good()) COUT << "current date/time: " << dateTime << OFendl; if (dateTime.getISOFormattedDateTime(string, OFTrue /*seconds*/, OFTrue /*fraction*/, OFTrue /*timeZone*/, OFFalse /*delimiter*/)) COUT << "current date/time: " << string << OFendl; dcmDateTime.putString("20020410"); dcmDateTime.print(COUT); if (dcmDateTime.getOFDateTime(dateTime).good()) { dateTime.getISOFormattedDateTime(string, OFTrue /*seconds*/, OFFalse /*fraction*/, OFTrue /*timeZone*/); COUT << "valid local date/time: " << string << OFendl; } return 0; } /* * * CVS/RCS Log: * $Log: tvrdatim.cc,v $ * Revision 1.8 2010-10-14 13:15:07 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.7 2006/08/15 15:50:10 meichel * Updated all code in module dcmdata to correctly compile when * all standard C++ classes remain in namespace std. * * Revision 1.6 2005/12/08 15:42:14 meichel * Changed include path schema for all DCMTK header files * * Revision 1.5 2004/02/04 16:53:23 joergr * Removed acknowledgements with e-mail addresses from CVS log. * * Revision 1.4 2002/07/16 14:22:24 joergr * Added test case. * * Revision 1.3 2002/05/24 09:50:13 joergr * Renamed some parameters/variables to avoid ambiguities. * * Revision 1.2 2002/04/16 13:46:10 joergr * Added configurable support for C++ ANSI standard includes (e.g. streams). * * */ dcmtk-3.6.0/dcmdata/tests/Makefile.in0000644000310500011400000000265611404401431016644 0ustar joergrdicom3# # Makefile for dcmdata/tests # @SET_MAKE@ SHELL = /bin/sh VPATH = @srcdir@:@top_srcdir@/include:@top_srcdir@/@configdir@/include srcdir = @srcdir@ top_srcdir = @top_srcdir@ configdir = @top_srcdir@/@configdir@ include $(configdir)/@common_makefile@ ofstddir = $(top_srcdir)/../ofstd oflogdir = $(top_srcdir)/../oflog LOCALINCLUDES = -I$(top_srcdir)/include -I$(ofstddir)/include -I$(oflogdir)/include LIBDIRS = -L$(top_srcdir)/libsrc -L$(top_srcdir)/libi2d -L$(ofstddir)/libsrc -L$(oflogdir)/libsrc LOCALLIBS = -ldcmdata -loflog -lofstd $(ZLIBLIBS) I2DLIBS = -li2d objs = tvrdatim.o tstpread.o tstpath.o tstchval.o i2dbmp.o progs = tvrdatim tstpread tstpath tstchval i2dbmp all: $(progs) tvrdatim: tvrdatim.o $(CXX) $(CXXFLAGS) $(LDFLAGS) $(LIBDIRS) -o $@ $@.o $(LOCALLIBS) $(MATHLIBS) $(LIBS) tstpread: tstpread.o $(CXX) $(CXXFLAGS) $(LDFLAGS) $(LIBDIRS) -o $@ $@.o $(LOCALLIBS) $(MATHLIBS) $(LIBS) tstpath: tstpath.o $(CXX) $(CXXFLAGS) $(LDFLAGS) $(LIBDIRS) -o $@ $@.o $(LOCALLIBS) $(MATHLIBS) $(LIBS) tstchval: tstchval.o $(CXX) $(CXXFLAGS) $(LDFLAGS) $(LIBDIRS) -o $@ $@.o $(LOCALLIBS) $(MATHLIBS) $(LIBS) i2dbmp: i2dbmp.o $(CXX) $(CXXFLAGS) $(LDFLAGS) $(LIBDIRS) -o $@ $@.o $(I2DLIBS) $(LOCALLIBS) $(MATHLIBS) $(LIBS) install: all clean: rm -f $(objs) $(progs) $(TRASH) distclean: rm -f $(objs) $(progs) $(DISTTRASH) dependencies: $(CXX) -MM $(defines) $(includes) $(CPPFLAGS) $(CXXFLAGS) *.cc > $(DEP) include $(DEP) dcmtk-3.6.0/dcmdata/tests/Makefile.dep0000644000310500011400000006156611461766751017041 0ustar joergrdicom3i2dbmp.o: i2dbmp.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmdata/libi2d/i2dbmps.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/libi2d/i2dimgs.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../include/dcmtk/dcmdata/dcxfer.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcvr.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/cmdlnarg.h ../include/dcmtk/dcmdata/dcuid.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h tstchval.o: tstchval.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmdata/dctk.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcswap.h ../include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dcvr.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../include/dcmtk/dcmdata/dcistrma.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcostrma.h ../include/dcmtk/dcmdata/dcuid.h \ ../include/dcmtk/dcmdata/dcvm.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h \ ../include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmdata/dctag.h ../include/dcmtk/dcmdata/dcdicent.h \ ../include/dcmtk/dcmdata/dchashdi.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../include/dcmtk/dcmdata/dcdict.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../include/dcmtk/dcmdata/dcdeftag.h ../include/dcmtk/dcmdata/dcobject.h \ ../include/dcmtk/dcmdata/dcstack.h ../include/dcmtk/dcmdata/dcelem.h \ ../include/dcmtk/dcmdata/dcitem.h ../include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../include/dcmtk/dcmdata/dcpcache.h ../include/dcmtk/dcmdata/dcmetinf.h \ ../include/dcmtk/dcmdata/dcdatset.h ../include/dcmtk/dcmdata/dcsequen.h \ ../include/dcmtk/dcmdata/dcfilefo.h ../include/dcmtk/dcmdata/dcdicdir.h \ ../include/dcmtk/dcmdata/dcdirrec.h ../include/dcmtk/dcmdata/dcvrulup.h \ ../include/dcmtk/dcmdata/dcvrul.h ../include/dcmtk/dcmdata/dcpixseq.h \ ../include/dcmtk/dcmdata/dcofsetl.h ../include/dcmtk/dcmdata/dcbytstr.h \ ../include/dcmtk/dcmdata/dcvrae.h ../include/dcmtk/dcmdata/dcvras.h \ ../include/dcmtk/dcmdata/dcvrcs.h ../include/dcmtk/dcmdata/dcvrda.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../include/dcmtk/dcmdata/dcvrds.h \ ../../ofstd/include/dcmtk/ofstd/ofvector.h \ ../include/dcmtk/dcmdata/dcvrdt.h \ ../../ofstd/include/dcmtk/ofstd/ofdatime.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../include/dcmtk/dcmdata/dcvris.h ../include/dcmtk/dcmdata/dcvrtm.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../include/dcmtk/dcmdata/dcvrui.h ../include/dcmtk/dcmdata/dcchrstr.h \ ../include/dcmtk/dcmdata/dcvrlo.h ../include/dcmtk/dcmdata/dcvrlt.h \ ../include/dcmtk/dcmdata/dcvrpn.h ../include/dcmtk/dcmdata/dcvrsh.h \ ../include/dcmtk/dcmdata/dcvrst.h ../include/dcmtk/dcmdata/dcvrut.h \ ../include/dcmtk/dcmdata/dcvrobow.h ../include/dcmtk/dcmdata/dcpixel.h \ ../include/dcmtk/dcmdata/dcvrpobw.h ../include/dcmtk/dcmdata/dcovlay.h \ ../include/dcmtk/dcmdata/dcvrat.h ../include/dcmtk/dcmdata/dcvrss.h \ ../include/dcmtk/dcmdata/dcvrus.h ../include/dcmtk/dcmdata/dcvrsl.h \ ../include/dcmtk/dcmdata/dcvrfl.h ../include/dcmtk/dcmdata/dcvrfd.h \ ../include/dcmtk/dcmdata/dcvrof.h ../include/dcmtk/dcmdata/cmdlnarg.h \ ../../ofstd/include/dcmtk/ofstd/ofbmanip.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h tstpath.o: tstpath.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmdata/dctk.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcswap.h ../include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dcvr.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../include/dcmtk/dcmdata/dcistrma.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcostrma.h ../include/dcmtk/dcmdata/dcuid.h \ ../include/dcmtk/dcmdata/dcvm.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h \ ../include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmdata/dctag.h ../include/dcmtk/dcmdata/dcdicent.h \ ../include/dcmtk/dcmdata/dchashdi.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../include/dcmtk/dcmdata/dcdict.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../include/dcmtk/dcmdata/dcdeftag.h ../include/dcmtk/dcmdata/dcobject.h \ ../include/dcmtk/dcmdata/dcstack.h ../include/dcmtk/dcmdata/dcelem.h \ ../include/dcmtk/dcmdata/dcitem.h ../include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../include/dcmtk/dcmdata/dcpcache.h ../include/dcmtk/dcmdata/dcmetinf.h \ ../include/dcmtk/dcmdata/dcdatset.h ../include/dcmtk/dcmdata/dcsequen.h \ ../include/dcmtk/dcmdata/dcfilefo.h ../include/dcmtk/dcmdata/dcdicdir.h \ ../include/dcmtk/dcmdata/dcdirrec.h ../include/dcmtk/dcmdata/dcvrulup.h \ ../include/dcmtk/dcmdata/dcvrul.h ../include/dcmtk/dcmdata/dcpixseq.h \ ../include/dcmtk/dcmdata/dcofsetl.h ../include/dcmtk/dcmdata/dcbytstr.h \ ../include/dcmtk/dcmdata/dcvrae.h ../include/dcmtk/dcmdata/dcvras.h \ ../include/dcmtk/dcmdata/dcvrcs.h ../include/dcmtk/dcmdata/dcvrda.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../include/dcmtk/dcmdata/dcvrds.h \ ../../ofstd/include/dcmtk/ofstd/ofvector.h \ ../include/dcmtk/dcmdata/dcvrdt.h \ ../../ofstd/include/dcmtk/ofstd/ofdatime.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../include/dcmtk/dcmdata/dcvris.h ../include/dcmtk/dcmdata/dcvrtm.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../include/dcmtk/dcmdata/dcvrui.h ../include/dcmtk/dcmdata/dcchrstr.h \ ../include/dcmtk/dcmdata/dcvrlo.h ../include/dcmtk/dcmdata/dcvrlt.h \ ../include/dcmtk/dcmdata/dcvrpn.h ../include/dcmtk/dcmdata/dcvrsh.h \ ../include/dcmtk/dcmdata/dcvrst.h ../include/dcmtk/dcmdata/dcvrut.h \ ../include/dcmtk/dcmdata/dcvrobow.h ../include/dcmtk/dcmdata/dcpixel.h \ ../include/dcmtk/dcmdata/dcvrpobw.h ../include/dcmtk/dcmdata/dcovlay.h \ ../include/dcmtk/dcmdata/dcvrat.h ../include/dcmtk/dcmdata/dcvrss.h \ ../include/dcmtk/dcmdata/dcvrus.h ../include/dcmtk/dcmdata/dcvrsl.h \ ../include/dcmtk/dcmdata/dcvrfl.h ../include/dcmtk/dcmdata/dcvrfd.h \ ../include/dcmtk/dcmdata/dcvrof.h ../include/dcmtk/dcmdata/cmdlnarg.h \ ../include/dcmtk/dcmdata/cmdlnarg.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../include/dcmtk/dcmdata/dcpath.h tstpread.o: tstpread.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dctk.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcswap.h ../include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dcvr.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../include/dcmtk/dcmdata/dcistrma.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcostrma.h ../include/dcmtk/dcmdata/dcuid.h \ ../include/dcmtk/dcmdata/dcvm.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h \ ../include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmdata/dctag.h ../include/dcmtk/dcmdata/dcdicent.h \ ../include/dcmtk/dcmdata/dchashdi.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../include/dcmtk/dcmdata/dcdict.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../include/dcmtk/dcmdata/dcdeftag.h ../include/dcmtk/dcmdata/dcobject.h \ ../include/dcmtk/dcmdata/dcstack.h ../include/dcmtk/dcmdata/dcelem.h \ ../include/dcmtk/dcmdata/dcitem.h ../include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../include/dcmtk/dcmdata/dcpcache.h ../include/dcmtk/dcmdata/dcmetinf.h \ ../include/dcmtk/dcmdata/dcdatset.h ../include/dcmtk/dcmdata/dcsequen.h \ ../include/dcmtk/dcmdata/dcfilefo.h ../include/dcmtk/dcmdata/dcdicdir.h \ ../include/dcmtk/dcmdata/dcdirrec.h ../include/dcmtk/dcmdata/dcvrulup.h \ ../include/dcmtk/dcmdata/dcvrul.h ../include/dcmtk/dcmdata/dcpixseq.h \ ../include/dcmtk/dcmdata/dcofsetl.h ../include/dcmtk/dcmdata/dcbytstr.h \ ../include/dcmtk/dcmdata/dcvrae.h ../include/dcmtk/dcmdata/dcvras.h \ ../include/dcmtk/dcmdata/dcvrcs.h ../include/dcmtk/dcmdata/dcvrda.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../include/dcmtk/dcmdata/dcvrds.h \ ../../ofstd/include/dcmtk/ofstd/ofvector.h \ ../include/dcmtk/dcmdata/dcvrdt.h \ ../../ofstd/include/dcmtk/ofstd/ofdatime.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../include/dcmtk/dcmdata/dcvris.h ../include/dcmtk/dcmdata/dcvrtm.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../include/dcmtk/dcmdata/dcvrui.h ../include/dcmtk/dcmdata/dcchrstr.h \ ../include/dcmtk/dcmdata/dcvrlo.h ../include/dcmtk/dcmdata/dcvrlt.h \ ../include/dcmtk/dcmdata/dcvrpn.h ../include/dcmtk/dcmdata/dcvrsh.h \ ../include/dcmtk/dcmdata/dcvrst.h ../include/dcmtk/dcmdata/dcvrut.h \ ../include/dcmtk/dcmdata/dcvrobow.h ../include/dcmtk/dcmdata/dcpixel.h \ ../include/dcmtk/dcmdata/dcvrpobw.h ../include/dcmtk/dcmdata/dcovlay.h \ ../include/dcmtk/dcmdata/dcvrat.h ../include/dcmtk/dcmdata/dcvrss.h \ ../include/dcmtk/dcmdata/dcvrus.h ../include/dcmtk/dcmdata/dcvrsl.h \ ../include/dcmtk/dcmdata/dcvrfl.h ../include/dcmtk/dcmdata/dcvrfd.h \ ../include/dcmtk/dcmdata/dcvrof.h ../include/dcmtk/dcmdata/cmdlnarg.h \ ../include/dcmtk/dcmdata/cmdlnarg.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../include/dcmtk/dcmdata/dcuid.h ../include/dcmtk/dcmdata/dcostrmz.h \ ../include/dcmtk/dcmdata/dcistrmz.h ../include/dcmtk/dcmdata/dcfcache.h tvrdatim.o: tvrdatim.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmdata/dcvrda.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dcbytstr.h ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcelem.h ../include/dcmtk/dcmdata/dcobject.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dcvr.h \ ../include/dcmtk/dcmdata/dctag.h ../include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmdata/dcstack.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../include/dcmtk/dcmdata/dcvrtm.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../include/dcmtk/dcmdata/dcvrdt.h \ ../../ofstd/include/dcmtk/ofstd/ofdatime.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../include/dcmtk/dcmdata/dcdeftag.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h dcmtk-3.6.0/dcmdata/tests/tstchval.cc0000644000310500011400000003500011455601131016730 0ustar joergrdicom3/* * * Copyright (C) 2009-2010, 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: dcmdata * * Author: Joerg Riesmeier * * Purpose: test program for checkStringValue() methods * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:15:05 $ * CVS/RCS Revision: $Revision: 1.7 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dctk.h" #include "dcmtk/ofstd/ofbmanip.h" #define CHECK_GOOD(number, check) \ COUT << "Test " << number << ": " << (check.good() ? "OK" : "Error") << OFendl; #define CHECK_BAD(number, check) \ COUT << "Test " << number << ": " << (check.bad() ? "OK" : "Error") << OFendl; int main(int , char *[]) { /* test "Application Entity" */ CHECK_BAD ( "AE-01", DcmApplicationEntity::checkStringValue(" ", "1") ) CHECK_GOOD( "AE-02", DcmApplicationEntity::checkStringValue("A\\") ) CHECK_GOOD( "AE-03", DcmApplicationEntity::checkStringValue(" AETITLE", "1") ) CHECK_GOOD( "AE-04", DcmApplicationEntity::checkStringValue("AE-Title ", "1") ) CHECK_GOOD( "AE-05", DcmApplicationEntity::checkStringValue(" AE Title ", "1") ) CHECK_GOOD( "AE-06", DcmApplicationEntity::checkStringValue("A \\ B", "2") ) CHECK_BAD ( "AE-07", DcmApplicationEntity::checkStringValue("Jörg", "1") ) CHECK_BAD ( "AE-08", DcmApplicationEntity::checkStringValue("1234567890-ABCDE ") ) CHECK_GOOD( "AE-09", DcmApplicationEntity::checkStringValue("\\ AE \\", "3-3n") ) COUT << OFendl; /* test "Age String" */ CHECK_GOOD( "AS-01", DcmAgeString::checkStringValue("001Y", "1") ) CHECK_GOOD( "AS-02", DcmAgeString::checkStringValue("099Y", "1") ) CHECK_BAD ( "AS-03", DcmAgeString::checkStringValue("099Z", "1") ) CHECK_GOOD( "AS-04", DcmAgeString::checkStringValue("199D\\000W\\500M", "2-n") ) CHECK_BAD ( "AS-05", DcmAgeString::checkStringValue("Y010", "1") ) CHECK_BAD ( "AS-06", DcmAgeString::checkStringValue("10Y", "1") ) CHECK_BAD ( "AS-07", DcmAgeString::checkStringValue("010 Y", "1") ) CHECK_BAD ( "AS-08", DcmAgeString::checkStringValue(" 010Y", "1") ) CHECK_BAD ( "AS-09", DcmAgeString::checkStringValue("010Y ", "1") ) CHECK_BAD ( "AS-10", DcmAgeString::checkStringValue("0109Y", "1") ) COUT << OFendl; /* test "Code String" */ CHECK_GOOD( "CS-01", DcmCodeString::checkStringValue("TEST 1234567890\\TEST", "2-2n") ) CHECK_BAD ( "CS-02", DcmCodeString::checkStringValue("TEST 1234567890\\TEST\\", "2-2n") ) CHECK_GOOD( "CS-03", DcmCodeString::checkStringValue("", "2-2n") ) CHECK_GOOD( "CS-04", DcmCodeString::checkStringValue("\\TEST 1234567890", "2") ) CHECK_GOOD( "CS-05", DcmCodeString::checkStringValue("\\ ", "2") ) CHECK_BAD ( "CS-06", DcmCodeString::checkStringValue("\\TEST 1234567890 A", "2") ) CHECK_BAD ( "CS-07", DcmCodeString::checkStringValue("Jörg", "1-2") ) CHECK_BAD ( "CS-08", DcmCodeString::checkStringValue("Joerg", "1-2") ) CHECK_GOOD( "CS-09", DcmCodeString::checkStringValue("MARCO \\ JOERG", "1-2") ) CHECK_GOOD( "CS-10", DcmCodeString::checkStringValue("MARCO\\ MICHAEL \\JOERG\\") ) CHECK_BAD ( "CS-11", DcmCodeString::checkStringValue(" 1234567890 ") ) CHECK_BAD ( "CS-12", DcmCodeString::checkStringValue("1234567890-ABCDE") ) CHECK_GOOD( "CS-13", DcmCodeString::checkStringValue(" ") ) CHECK_BAD ( "CS-14", DcmCodeString::checkStringValue(" ") ) COUT << OFendl; /* test "Date" */ CHECK_GOOD( "DA-01", DcmDate::checkStringValue("20090731", "1") ) CHECK_GOOD( "DA-02", DcmDate::checkStringValue("18200101", "1") ) CHECK_GOOD( "DA-03", DcmDate::checkStringValue("21001231", "1") ) CHECK_BAD ( "DA-04", DcmDate::checkStringValue("1820.01.01", "1", OFFalse) ) CHECK_GOOD( "DA-05", DcmDate::checkStringValue("1820.01.01", "1", OFTrue) ) CHECK_GOOD( "DA-06", DcmDate::checkStringValue("20090731\\18200101") ) CHECK_GOOD( "DA-07", DcmDate::checkStringValue("20090731\\18200101", "2-2n") ) CHECK_GOOD( "DA-08", DcmDate::checkStringValue("20090731\\18200101\\20000101\\21001231", "2-2n") ) CHECK_BAD ( "DA-09", DcmDate::checkStringValue("20090731", "6") ) CHECK_BAD ( "DA-10", DcmDate::checkStringValue("20000001", "1") ) CHECK_BAD ( "DA-11", DcmDate::checkStringValue("00001232", "1") ) CHECK_BAD ( "DA-12", DcmDate::checkStringValue("20000000", "1") ) COUT << OFendl; /* test "Date Time" */ CHECK_GOOD( "DT-01", DcmDateTime::checkStringValue("200907311230", "1") ) CHECK_GOOD( "DT-02", DcmDateTime::checkStringValue("18200101000000", "1") ) CHECK_GOOD( "DT-03", DcmDateTime::checkStringValue("21001231235959.000001", "1") ) CHECK_BAD ( "DT-04", DcmDateTime::checkStringValue("20090731", "1") ) CHECK_BAD ( "DT-05", DcmDateTime::checkStringValue("200907312400", "1") ) CHECK_BAD ( "DT-06", DcmDateTime::checkStringValue("20090731 1200") ) CHECK_GOOD( "DT-07", DcmDateTime::checkStringValue("2009073100\\1820010112", "2-2n") ) CHECK_GOOD( "DT-08", DcmDateTime::checkStringValue("2009073100\\1820010112\\200001010030\\21001231171540.123", "2-2n") ) CHECK_GOOD( "DT-09", DcmDateTime::checkStringValue("200907311230+0100", "1") ) CHECK_GOOD( "DT-10", DcmDateTime::checkStringValue("20090731123000+1000", "1") ) CHECK_BAD ( "DT-11", DcmDateTime::checkStringValue("200907311230+1900", "1") ) CHECK_GOOD( "DT-12", DcmDateTime::checkStringValue("20090731123000.123456+0100", "1") ) CHECK_BAD ( "DT-13", DcmDateTime::checkStringValue("20090731123000.123456+0100 ", "1") ) COUT << OFendl; /* test "Decimal String" */ CHECK_GOOD( "DS-01", DcmDecimalString::checkStringValue(" 0", "1") ) CHECK_GOOD( "DS-02", DcmDecimalString::checkStringValue("0.0 ", "1") ) CHECK_GOOD( "DS-03", DcmDecimalString::checkStringValue("-1", "1") ) CHECK_GOOD( "DS-04", DcmDecimalString::checkStringValue("+12345.67890", "1") ) CHECK_BAD ( "DS-05", DcmDecimalString::checkStringValue(" -12345.6789 ", "1") ) CHECK_GOOD( "DS-06", DcmDecimalString::checkStringValue("01.01", "1") ) CHECK_BAD ( "DS-06", DcmDecimalString::checkStringValue("0.1.01", "1") ) CHECK_BAD ( "DS-07", DcmDecimalString::checkStringValue("0 1", "1") ) CHECK_BAD ( "DS-08", DcmDecimalString::checkStringValue("0-1", "1") ) CHECK_GOOD( "DS-09", DcmDecimalString::checkStringValue("1.0E99", "1") ) CHECK_BAD ( "DS-10", DcmDecimalString::checkStringValue("1.099E", "1") ) CHECK_GOOD( "DS-11", DcmDecimalString::checkStringValue("-10e+99", "1") ) CHECK_GOOD( "DS-12", DcmDecimalString::checkStringValue("-10e+99\\+1E-1", "2") ) COUT << OFendl; /* test "Integer String" */ CHECK_GOOD( "IS-01", DcmIntegerString::checkStringValue("0", "1") ) CHECK_GOOD( "IS-02", DcmIntegerString::checkStringValue("+0", "1") ) CHECK_GOOD( "IS-03", DcmIntegerString::checkStringValue("-0", "1") ) CHECK_GOOD( "IS-04", DcmIntegerString::checkStringValue("00", "1") ) CHECK_GOOD( "IS-05", DcmIntegerString::checkStringValue("000000000001", "1") ) CHECK_BAD ( "IS-06", DcmIntegerString::checkStringValue("1000000000001", "1") ) CHECK_BAD ( "IS-07", DcmIntegerString::checkStringValue("-000000000001", "1") ) CHECK_BAD ( "IS-08", DcmIntegerString::checkStringValue("3000000000", "1") ) CHECK_GOOD( "IS-08", DcmIntegerString::checkStringValue("+2000000000", "1") ) CHECK_GOOD( "IS-09", DcmIntegerString::checkStringValue("+2147483647", "1") ) CHECK_BAD ( "IS-10", DcmIntegerString::checkStringValue("2147483648", "1") ) CHECK_GOOD( "IS-11", DcmIntegerString::checkStringValue("-2147483648", "1") ) CHECK_BAD ( "IS-12", DcmIntegerString::checkStringValue("-2147483649", "1") ) CHECK_GOOD( "IS-13", DcmIntegerString::checkStringValue(" -2147483648\\+2147483647 ", "2") ) CHECK_BAD ( "IS-14", DcmIntegerString::checkStringValue(" -2147483648 \\+2147483647", "2") ) COUT << OFendl; /* test "Long String" */ CHECK_GOOD( "LO-01", DcmLongString::checkStringValue(" ", "1") ) CHECK_GOOD( "LO-02", DcmLongString::checkStringValue(" . ", "1") ) CHECK_GOOD( "LO-03", DcmLongString::checkStringValue("ABC 123 abc _+-/", "1") ) CHECK_GOOD( "LO-04", DcmLongString::checkStringValue(" ", "1") ) CHECK_GOOD( "LO-05", DcmLongString::checkStringValue("ABC\\123", "2") ) CHECK_GOOD( "LO-06", DcmLongString::checkStringValue(" Jörg Riesmeier ", "1") ) // CHECK_BAD ( "LO-07", DcmLongString::checkStringValueu("OFFIS e.V., Escherweg 2, 26121 Oldenburg, Germany, http://www.offis.de/", "1") ) CHECK_GOOD( "LO-08", DcmLongString::checkStringValue("\\ _2_ \\ _3_ \\ _4_ \\ _5_ \\", "6") ) CHECK_GOOD( "LO-09", DcmLongString::checkStringValue("ESC\033aping", "1") ) CHECK_BAD ( "LO-10", DcmLongString::checkStringValue("not allowed: \r\014", "1") ) COUT << OFendl; /* test "Long Text" */ CHECK_GOOD( "LT-01", DcmLongText::checkStringValue(" Hallo \\ 12345 \\ äöüß ") ) COUT << OFendl; /* test "Person Name" */ CHECK_GOOD( "PN-01", DcmPersonName::checkStringValue("A^Riesmeier^^=R^Jörg", "1") ) CHECK_GOOD( "PN-02", DcmPersonName::checkStringValue("A^Riesmeier^^=R^Jörg\\", "1-n") ) CHECK_BAD ( "PN-03", DcmPersonName::checkStringValue("A^Riesmeier^^=R^Jörg\\", "1") ) CHECK_GOOD( "PN-03", DcmPersonName::checkStringValue("Eichelberg^Marco^^Dr.=Onken^Michael^=Riesmeier^Jörg^^Dr.^", "1") ) CHECK_GOOD( "PN-05", DcmPersonName::checkStringValue("Eichelberg\\Onken\\Riesmeier", "3", OFTrue) ) CHECK_BAD ( "PN-06", DcmPersonName::checkStringValue(" ") ) CHECK_GOOD( "PN-07", DcmPersonName::checkStringValue(" A") ) CHECK_GOOD( "PN-08", DcmPersonName::checkStringValue("^^^^") ) CHECK_GOOD( "PN-09", DcmPersonName::checkStringValue("^ Jörg ^") ) CHECK_GOOD( "PN-10", DcmPersonName::checkStringValue("^^^^MD ") ) CHECK_BAD ( "PN-11", DcmPersonName::checkStringValue("^^^^^") ) COUT << OFendl; /* test "Short String" */ CHECK_GOOD( "SH-01", DcmShortString::checkStringValue(" ", "1") ) CHECK_GOOD( "SH-02", DcmShortString::checkStringValue(" . ", "1") ) CHECK_GOOD( "SH-03", DcmShortString::checkStringValue("ABC 123 abc _+-/", "1") ) CHECK_GOOD( "SH-04", DcmShortString::checkStringValue(" ", "1") ) CHECK_GOOD( "SH-05", DcmShortString::checkStringValue("ABC\\123", "2") ) CHECK_GOOD( "SH-06", DcmShortString::checkStringValue(" Jörg Riesmeier ", "1") ) // CHECK_BAD ( "SH-07", DcmShortString::checkStringValue("OFFIS e.V., Oldenburg", "1") ) CHECK_GOOD( "SH-08", DcmShortString::checkStringValue("\\ _2_ \\ _3_ \\ _4_ \\ _5_ \\", "6") ) CHECK_BAD ( "SH-09", DcmShortString::checkStringValue(" ", "2") ) CHECK_GOOD( "SH-10", DcmShortString::checkStringValue("", "2") ) CHECK_GOOD( "SH-11", DcmShortString::checkStringValue("ESC\033aping", "1") ) CHECK_BAD ( "SH-12", DcmShortString::checkStringValue("not allowed: \n\010\r\014", "1") ) COUT << OFendl; /* test "Short Text" */ CHECK_GOOD( "ST-01", DcmShortText::checkStringValue(" umlaut characters are allowed: ÄÖÜäöü\naccented characters also: áàéèíìâêô\rand control characters, of course, including \033=ESC ") ) CHECK_BAD ( "ST-02", DcmShortText::checkStringValue(" other control characters are not allowed: \013 \010 \200 ") ) COUT << OFendl; /* test "Time" */ CHECK_GOOD( "TM-01", DcmTime::checkStringValue("0000", "1") ) CHECK_BAD ( "TM-02", DcmTime::checkStringValue("2400", "1") ) CHECK_GOOD( "TM-03", DcmTime::checkStringValue("123045", "1") ) CHECK_GOOD( "TM-04", DcmTime::checkStringValue("235959.123", "1") ) CHECK_GOOD( "TM-05", DcmTime::checkStringValue("235959.987654", "1") ) CHECK_BAD ( "TM-06", DcmTime::checkStringValue("000000.0000000", "1") ) CHECK_GOOD( "TM-07", DcmTime::checkStringValue("1215 ", "1") ) CHECK_BAD ( "TM-08", DcmTime::checkStringValue(" 1215", "1") ) CHECK_BAD ( "TM-09", DcmTime::checkStringValue("12 15", "1") ) CHECK_BAD ( "TM-10", DcmTime::checkStringValue("235959.987654 ", "1") ) CHECK_GOOD( "TM-11", DcmTime::checkStringValue("0000 \\010101 \\020202.02 \\030303.0303", "4") ) CHECK_BAD ( "TM-12", DcmTime::checkStringValue("12:30:00.123456", "1", OFFalse) ) CHECK_GOOD( "TM-13", DcmTime::checkStringValue("12:30:00.123456", "1", OFTrue) ) CHECK_BAD ( "TM-14", DcmTime::checkStringValue("12:30", "1", OFTrue) ) COUT << OFendl; /* test "Unique Identifier" */ CHECK_GOOD( "UI-01", DcmUniqueIdentifier::checkStringValue("0", "1") ) CHECK_GOOD( "UI-02", DcmUniqueIdentifier::checkStringValue("0.1", "1") ) CHECK_GOOD( "UI-03", DcmUniqueIdentifier::checkStringValue("1.2.3.4.5.6.7.8.9.0.123.4321", "1") ) CHECK_BAD ( "UI-04", DcmUniqueIdentifier::checkStringValue("1.02", "1") ) CHECK_BAD ( "UI-05", DcmUniqueIdentifier::checkStringValue(".2", "1") ) CHECK_BAD ( "UI-06", DcmUniqueIdentifier::checkStringValue("1.", "1") ) CHECK_BAD ( "UI-07", DcmUniqueIdentifier::checkStringValue("1.2.3.4.5.6.7.8.9.0 ", "1") ) CHECK_BAD ( "UI-08", DcmUniqueIdentifier::checkStringValue(" 1.2.3.4.5.6.7.8.9.0", "1") ) CHECK_BAD ( "UI-09", DcmUniqueIdentifier::checkStringValue("1.2.3.4.5. 6.7.8.9.0", "1") ) CHECK_GOOD( "UI-10", DcmUniqueIdentifier::checkStringValue("1.2.3.4.5.6.7.8.9.0\\99", "2") ) CHECK_GOOD( "UI-11", DcmUniqueIdentifier::checkStringValue("1.2.3.4.5.6.7.8.9.0.123.456.789.0.111222333444555666777888999000", "1") ) CHECK_BAD ( "UI-12", DcmUniqueIdentifier::checkStringValue("1.2.3.4.5.6.7.8.9.0.123.456.789.10.111222333444555666777888999000", "1") ) COUT << OFendl; /* test "Unlimited Text" */ OFString hugeString(1024 * 512, 'n'); CHECK_GOOD( "UT-01", DcmUnlimitedText::checkStringValue(" This text can be pretty long ... ") ) CHECK_GOOD( "UT-02", DcmUnlimitedText::checkStringValue(hugeString) ) hugeString[hugeString.length() / 2] = '\t'; CHECK_BAD ( "UT-03", DcmUnlimitedText::checkStringValue(hugeString) ) COUT << OFendl; return 0; } /* * * CVS/RCS Log: * $Log: tstchval.cc,v $ * Revision 1.7 2010-10-14 13:15:05 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.6 2010-09-02 10:26:17 uli * Added a test for UT VR with an invalid character. * * Revision 1.5 2010-08-26 12:18:09 uli * Added a test that breaks DcmUnlimitedText. This has to be fixed. * * Revision 1.4 2010-08-26 08:39:50 uli * Added a test that breaks DcmUnlimitedText. This has to be fixed. * * Revision 1.3 2010-04-23 14:34:45 joergr * Renamed static helper function checkValue() to checkStringValue(). * * Revision 1.2 2010-01-07 17:49:31 joergr * Added tests for old time format "HH:MM:SS.FFFFFF". * * Revision 1.1 2009-08-03 09:07:59 joergr * Added methods that check whether a given string value conforms to the VR and * VM definitions of the DICOM standards. * * */ dcmtk-3.6.0/dcmdata/tests/dcmpsdmp.tcl0000644000310500011400000001243707770344546017140 0ustar joergrdicom3#!/bin/sh # the next line restarts using wish \ exec wish4.2 "$0" "$@" # inserts the tag value proc insertTagValue {w s} { set sp [string index $s 0] if {$sp == "("} { if {[string match {*\,*} $s] == 0} { $w insert end $s tag_val1 } else { $w insert end $s tag_val2 } } elseif {$sp == "\["} { $w insert end $s tag_val2 } elseif {$sp == "="} { $w insert end $s tag_val3 } else { $w insert end $s tag_val4 } } # load text from file into window proc loadText {w name} { # $w configure -state normal set f [open $name] while {![eof $f]} { gets $f s set sp [string index $s 0] if {$sp == "#" || $sp == "*"} { $w insert end $s tag_emph } elseif {[string match {(\ )*\(*\)*\#*} $s] == 0} { set sp1 [string first ")" $s] $w insert end [string range $s 0 $sp1] tag_tag set sp1 [expr int ($sp1 + 1)] set sp2 [expr int ($sp1 + 3)] $w insert end [string range $s $sp1 $sp2] tag_vr set sp3 [string last "#" $s] set sp1 [expr int ($sp2 + 1)] set sp2 [expr int ($sp3 - 1)] insertTagValue $w [string range $s $sp1 $sp2] set ss [string range $s $sp3 end] set sp3 [string last " " $ss] set sp2 [expr int ($sp3)] $w insert end [string range $ss 0 $sp2] tag_len set sp1 [expr int ($sp3 + 1)] $w insert end [string range $ss $sp1 end] tag_name } else { $w insert end $s } $w insert end "\n" } close $f # $w configure -state disabled } # search string in text window and mark all positions with tag proc findText {w name tag} { $w tag remove $tag 1.0 end set hits 0 set pos -1 if {$name != ""} { set cur 1.0 while 1 { set cur [$w search -count length -- $name $cur end] if {$cur == ""} { break } if {$pos < 0} { set pos $cur } $w tag add $tag $cur "$cur + $length char" set cur [$w index "$cur + $length char"] incr hits } } if {$pos >= 0} { $w see $pos } return $hits } # search string in both text windows proc findTextCommand {name} { global hitsText set dh [findText .dump.text $name tag_found] set hitsText [concat "Hits: " $dh] focus .find.entry .find.entry delete 0 end } # set up text window proc setupTextWindow {} { global findName global hitsText set hitsText "Hits: 0" frame .find button .find.button -text "Find" -command "findTextCommand \$findName" -width 4 -anchor w entry .find.entry -textvariable findName label .find.label -textvariable hitsText -width 13 pack .find.button -side left pack .find.label -side right pack .find.entry -fill x -expand yes -padx 5 frame .dump text .dump.text -height 1 -wrap none -background #fff7e9 -selectbackground lightgray -font -*-Courier-Medium-R-Normal--*-150-*-*-*-*-*-* -xscrollcommand ".dump.xscroll set" -yscrollcommand ".dump.yscroll set" scrollbar .dump.xscroll -orient horizontal -command ".dump.text xview" scrollbar .dump.yscroll -orient vertical -command ".dump.text yview" pack .dump.xscroll -side bottom -fill x pack .dump.yscroll -side right -fill y pack .dump.text -expand yes -fill both .dump.text tag configure tag_emph -foreground black -font -*-Courier-Bold-R-Normal--*-150-*-*-*-*-*-* .dump.text tag configure tag_found -background lightgray -underline true .dump.text tag configure tag_tag -foreground darkblue .dump.text tag configure tag_vr -foreground darkred .dump.text tag configure tag_val1 -foreground darkgray .dump.text tag configure tag_val2 -foreground black .dump.text tag configure tag_val3 -foreground darkblue .dump.text tag configure tag_val4 -foreground black .dump.text tag configure tag_len -foreground darkgray .dump.text tag configure tag_name -foreground darkblue pack .find -side top -fill x pack .dump -expand yes -fill both bind .find.entry "findTextCommand \$findName" bind .dump.text {if {[.dump.text tag nextrange sel 1.0] != ""} {findTextCommand [selection get]}} focus .find.entry } # main window catch {eval destroy [winfo child .]} errMsg if {$errMsg > 0} { exit 1 } # initialization set temp "/tmp" if [info exists env(TEMP)] { set temp $env(TEMP) } elseif [info exists env(TMP)] { set temp $env(TMP) } set dumpReport [file join $temp dcmdump.report] set dumpApp "dcmdump" # set up window wm iconname . "DICOM Dump" if {$tcl_platform(os) == "SunOS"} { wm geometry . 956x903 } else { wm geometry . [expr int([winfo screenwidth .] * 0.995)]x[expr int([winfo screenheight .] * 0.938)] } wm geometry . +0+0 wm minsize . 400 165 setupTextWindow # set up bindings bind all {destroy .} # start dump process if {$argc > 0} { set fileName [lindex $argv 0] wm title . "Please wait ..." catch {exec $dumpApp $fileName >& $dumpReport} loadText .dump.text $dumpReport update wm title . [format "DICOM File Contents - %s" $fileName] } else { wm title . [format "DICOM File Contents - "] } dcmtk-3.6.0/dcmdata/tests/CMakeLists.txt0000644000310500011400000000146011430037561017337 0ustar joergrdicom3# declare directories containing used libraries LINK_DIRECTORIES(${dcmdata_BINARY_DIR} ${ofstd_BINARY_DIR} ${oflog_BINARY_DIR} ${ZLIB_LIBDIR} ${LIBXML_LIBDIR}) # declare executables FOREACH(PROGRAM i2dbmp tstpath tstchval tstpread tvrdatim) ADD_EXECUTABLE(${PROGRAM} ${PROGRAM}) ENDFOREACH(PROGRAM) # make sure executables are linked to the corresponding libraries FOREACH(PROGRAM tstpath tstchval tstpread tvrdatim) TARGET_LINK_LIBRARIES(${PROGRAM} dcmdata oflog ofstd ${ZLIB_LIBS} ${THREAD_LIBS} ${WIN32_STD_LIBRARIES}) ENDFOREACH(PROGRAM) TARGET_LINK_LIBRARIES(i2dbmp libi2d dcmdata oflog ofstd ${ZLIB_LIBS} ${THREAD_LIBS} ${WIN32_STD_LIBRARIES}) # declare installation files #FOREACH(PROGRAM i2dbmp tstpath tstchval tstpread tvrdatim) # INSTALL_TARGETS(${INSTALL_BINDIR} ${PROGRAM}) #ENDFOREACH(PROGRAM)dcmtk-3.6.0/dcmdata/tests/tstpread.cc0000644000310500011400000003700111503635714016741 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Marco Eichelberg * * Purpose: Test application for partial element access API * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-12-20 11:19:40 $ * CVS/RCS Revision: $Revision: 1.10 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #define INCLUDE_CSTDLIB #define INCLUDE_CSTDIO #define INCLUDE_CSTRING #include "dcmtk/ofstd/ofstdinc.h" #ifdef HAVE_GUSI_H #include #endif #include "dcmtk/dcmdata/dctk.h" #include "dcmtk/dcmdata/cmdlnarg.h" #include "dcmtk/ofstd/ofconapp.h" #include "dcmtk/dcmdata/dcuid.h" /* for dcmtk version name */ #include "dcmtk/dcmdata/dcostrmz.h" /* for dcmZlibCompressionLevel */ #include "dcmtk/dcmdata/dcistrmz.h" /* for dcmZlibExpectRFC1950Encoding */ #include "dcmtk/dcmdata/dcfcache.h" #ifdef WITH_ZLIB #include /* for zlibVersion() */ #endif #define OFFIS_CONSOLE_APPLICATION "tstpread" static OFLogger tstpreadLogger = OFLog::getLogger("dcmtk.apps." OFFIS_CONSOLE_APPLICATION); static char rcsid[] = "$dcmtk: " OFFIS_CONSOLE_APPLICATION " v" OFFIS_DCMTK_VERSION " " OFFIS_DCMTK_RELEASEDATE " $"; // ******************************************** #define BUFSIZE 32768 void createTestDataset(DcmDataset *dset, unsigned char *buffer) { // byte array, VR=OB dset->putAndInsertUint8Array(DCM_EncapsulatedDocument, buffer, BUFSIZE); // short array, VR=US dset->putAndInsertUint16Array(DCM_RWavePointer, OFreinterpret_cast(Uint16 *, buffer), BUFSIZE/sizeof(Uint16)); // long array, VR=UL DcmElement *elem = new DcmUnsignedLong(DCM_TableOfPixelValues); elem->putUint32Array(OFreinterpret_cast(Uint32 *, buffer), BUFSIZE/sizeof(Uint32)); dset->insert(elem); // double array, VR=FD elem = new DcmFloatingPointDouble(DCM_TableOfYBreakPoints); elem->putFloat64Array(OFreinterpret_cast(Float64 *, buffer), BUFSIZE/sizeof(Float64)); dset->insert(elem); } OFCondition sequentialNonOverlappingRead(DcmElement *delem, DcmFileCache *dcache, unsigned char *buffer) { unsigned char *target = new unsigned char[BUFSIZE]; Uint32 offset = 0; Uint32 bytes_to_read = 0; OFCondition cond; while (offset < BUFSIZE) { bytes_to_read = (rand() % 20)+1; // read 1 to 20 bytes // make sure we don't attempt to read beyond the end of the attribute value if (offset + bytes_to_read > BUFSIZE) bytes_to_read = BUFSIZE - offset; cond = delem->getPartialValue(target, offset, bytes_to_read, dcache); if (cond.bad()) { delete[] target; return cond; } if (0 != memcmp(target, buffer+offset, bytes_to_read)) { OFOStringStream str; str << "Error: unexpected sequence of " << bytes_to_read << " bytes found at offset " << offset << OFendl; str << "Expected: "; for (Uint32 i=0; i BUFSIZE) bytes_to_read = BUFSIZE - offset; cond = delem->getPartialValue(target, offset, bytes_to_read, dcache); if (cond.bad()) { delete[] target; return cond; } if (0 != memcmp(target, buffer+offset, bytes_to_read)) { OFOStringStream str; str << "Error: unexpected sequence of " << bytes_to_read << " bytes found at offset " << offset << OFendl; str << "Expected: "; for (Uint32 i=0; i 4) offset -= (rand() % 4); // let the read operations overlap by 0-3 bytes } delete[] target; return EC_Normal; } OFCondition randomRead(DcmElement *delem, DcmFileCache *dcache, unsigned char *buffer) { unsigned char *target = new unsigned char[BUFSIZE]; Uint32 offset = 0; Uint32 bytes_to_read = 0; OFCondition cond; for (int i=1000; i; --i) { bytes_to_read = (rand() % 20)+1; // read 1 to 20 bytes offset = rand() % BUFSIZE; // make sure we don't attempt to read beyond the end of the attribute value if (offset + bytes_to_read > BUFSIZE) bytes_to_read = BUFSIZE - offset; cond = delem->getPartialValue(target, offset, bytes_to_read, dcache); if (cond.bad()) { delete[] target; return cond; } if (0 != memcmp(target, buffer+offset, bytes_to_read)) { OFOStringStream str; str << "Error: unexpected sequence of " << bytes_to_read << " bytes found at offset " << offset << OFendl; str << "Expected: "; for (Uint32 k=0; kfindAndGetElement(DCM_EncapsulatedDocument, delem); if (cond.bad()) return cond; cond = sequentialNonOverlappingRead(delem, &cache, buffer); if (cond.bad()) return cond; cond = dset->findAndGetElement(DCM_RWavePointer, delem); if (cond.bad()) return cond; cond = sequentialNonOverlappingRead(delem, &cache, buffer); if (cond.bad()) return cond; cond = dset->findAndGetElement(DCM_TableOfPixelValues, delem); if (cond.bad()) return cond; cond = sequentialNonOverlappingRead(delem, &cache, buffer); if (cond.bad()) return cond; cond = dset->findAndGetElement(DCM_TableOfYBreakPoints, delem); if (cond.bad()) return cond; cond = sequentialNonOverlappingRead(delem, &cache, buffer); return cond; } OFCondition sequentialOverlappingRead(DcmDataset *dset, unsigned char *buffer) { DcmFileCache cache; DcmElement *delem = NULL; OFCondition cond; cond = dset->findAndGetElement(DCM_EncapsulatedDocument, delem); if (cond.bad()) return cond; cond = sequentialOverlappingRead(delem, &cache, buffer); if (cond.bad()) return cond; cond = dset->findAndGetElement(DCM_RWavePointer, delem); if (cond.bad()) return cond; cond = sequentialOverlappingRead(delem, &cache, buffer); if (cond.bad()) return cond; cond = dset->findAndGetElement(DCM_TableOfPixelValues, delem); if (cond.bad()) return cond; cond = sequentialOverlappingRead(delem, &cache, buffer); if (cond.bad()) return cond; cond = dset->findAndGetElement(DCM_TableOfYBreakPoints, delem); if (cond.bad()) return cond; cond = sequentialOverlappingRead(delem, &cache, buffer); return cond; } OFCondition randomRead(DcmDataset *dset, unsigned char *buffer) { DcmFileCache cache; DcmElement *delem = NULL; OFCondition cond; cond = dset->findAndGetElement(DCM_EncapsulatedDocument, delem); if (cond.bad()) return cond; cond = randomRead(delem, &cache, buffer); if (cond.bad()) return cond; cond = dset->findAndGetElement(DCM_RWavePointer, delem); if (cond.bad()) return cond; cond = randomRead(delem, &cache, buffer); if (cond.bad()) return cond; cond = dset->findAndGetElement(DCM_TableOfPixelValues, delem); if (cond.bad()) return cond; cond = randomRead(delem, &cache, buffer); if (cond.bad()) return cond; cond = dset->findAndGetElement(DCM_TableOfYBreakPoints, delem); if (cond.bad()) return cond; cond = randomRead(delem, &cache, buffer); return cond; } int main(int argc, char *argv[]) { #ifdef HAVE_GUSI_H GUSISetup(GUSIwithSIOUXSockets); GUSISetup(GUSIwithInternetSockets); #endif OFConsoleApplication app(OFFIS_CONSOLE_APPLICATION , "Test partial element access API", rcsid); OFCommandLine cmd; cmd.addGroup("general options:"); cmd.addOption("--help", "-h", "print this help text and exit", OFCommandLine::AF_Exclusive); cmd.addOption("--version", "print version information and exit", OFCommandLine::AF_Exclusive); OFLog::addOptions(cmd); /* evaluate command line */ prepareCmdLineArgs(argc, argv, OFFIS_CONSOLE_APPLICATION); if (app.parseCommandLine(cmd, argc, argv, OFCommandLine::PF_ExpandWildcards)) { /* check exclusive options first */ if (cmd.hasExclusiveOption()) { if (cmd.findOption("--version")) { app.printHeader(OFTrue /*print host identifier*/); COUT << OFendl << "External libraries used:"; #ifdef WITH_ZLIB COUT << OFendl << "- ZLIB, Version " << zlibVersion() << OFendl; #else COUT << " none" << OFendl; #endif return 0; } } /* command line parameters */ OFLog::configureFromCommandLine(cmd, app); } /* print resource identifier */ OFLOG_DEBUG(tstpreadLogger, rcsid << OFendl); /* make sure data dictionary is loaded */ if (!dcmDataDict.isDictionaryLoaded()) { OFLOG_WARN(tstpreadLogger, "no data dictionary loaded, check environment variable: " << DCM_DICT_ENVIRONMENT_VARIABLE); } OFLOG_INFO(tstpreadLogger, "Creating test dataset"); DcmFileFormat dfile; unsigned char *buffer = new unsigned char[BUFSIZE]; unsigned char *bufptr = buffer; srand(OFstatic_cast(unsigned int, time(NULL))); for (int i = BUFSIZE; i; --i) { *bufptr++ = OFstatic_cast(unsigned char, rand()); } createTestDataset(dfile.getDataset(), buffer); OFCondition cond = EC_Normal; OFLOG_INFO(tstpreadLogger, "Writing test files"); cond = dfile.saveFile("test_be.dcm", EXS_BigEndianExplicit); if (cond.bad()) { OFLOG_FATAL(tstpreadLogger, cond.text()); return 10; } cond = dfile.saveFile("test_le.dcm", EXS_LittleEndianExplicit); if (cond.bad()) { OFLOG_FATAL(tstpreadLogger, cond.text()); return 10; } #ifdef WITH_ZLIB cond = dfile.saveFile("test_df.dcm", EXS_DeflatedLittleEndianExplicit); if (cond.bad()) { OFLOG_FATAL(tstpreadLogger, cond.text()); return 10; } #endif OFLOG_INFO(tstpreadLogger, "Opening test files"); DcmFileFormat dfile_be; DcmFileFormat dfile_le; DcmFileFormat dfile_df; cond = dfile_be.loadFile("test_be.dcm"); if (cond.bad()) { OFLOG_FATAL(tstpreadLogger, cond.text()); return 10; } cond = dfile_le.loadFile("test_le.dcm"); if (cond.bad()) { OFLOG_FATAL(tstpreadLogger, cond.text()); return 10; } #ifdef WITH_ZLIB cond = dfile_df.loadFile("test_df.dcm"); if (cond.bad()) { OFLOG_FATAL(tstpreadLogger, cond.text()); return 10; } #endif // testing sequential, non overlapping reads of partial element values OFLOG_INFO(tstpreadLogger, "Testing sequential, non overlapping reads of partial element values"); cond = sequentialNonOverlappingRead(dfile_be.getDataset(), buffer); if (cond.bad()) { OFLOG_FATAL(tstpreadLogger, cond.text()); return 10; } cond = sequentialNonOverlappingRead(dfile_le.getDataset(), buffer); if (cond.bad()) { OFLOG_FATAL(tstpreadLogger, cond.text()); return 10; } #ifdef WITH_ZLIB cond = sequentialNonOverlappingRead(dfile_df.getDataset(), buffer); if (cond.bad()) { OFLOG_FATAL(tstpreadLogger, cond.text()); return 10; } #endif // testing random reads of partial element values OFLOG_INFO(tstpreadLogger, "Testing random reads of partial element values"); cond = randomRead(dfile_be.getDataset(), buffer); if (cond.bad()) { OFLOG_FATAL(tstpreadLogger, cond.text()); return 10; } cond = randomRead(dfile_le.getDataset(), buffer); if (cond.bad()) { OFLOG_FATAL(tstpreadLogger, cond.text()); return 10; } #ifdef WITH_ZLIB cond = randomRead(dfile_df.getDataset(), buffer); if (cond.bad()) { OFLOG_FATAL(tstpreadLogger, cond.text()); return 10; } #endif // testing overlapping reads of partial element values OFLOG_INFO(tstpreadLogger, "Testing overlapping reads of partial element values"); cond = sequentialOverlappingRead(dfile_be.getDataset(), buffer); if (cond.bad()) { OFLOG_FATAL(tstpreadLogger, cond.text()); return 10; } cond = sequentialOverlappingRead(dfile_le.getDataset(), buffer); if (cond.bad()) { OFLOG_FATAL(tstpreadLogger, cond.text()); return 10; } #ifdef WITH_ZLIB cond = sequentialOverlappingRead(dfile_df.getDataset(), buffer); if (cond.bad()) { OFLOG_FATAL(tstpreadLogger, cond.text()); return 10; } #endif delete[] buffer; return 0; } /* * CVS/RCS Log: * $Log: tstpread.cc,v $ * Revision 1.10 2010-12-20 11:19:40 joergr * Fixed wrong console application description (apparently copied from another * tool) and output the resource identifier in debug mode to the logger. * * Revision 1.9 2010-11-01 10:42:44 uli * Fixed some compiler warnings reported by gcc with additional flags. * * Revision 1.8 2010-10-14 13:15:07 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.7 2010-10-04 12:51:34 joergr * Added explicit type cast in order to keep VisualStudio 2008 quiet. * * Revision 1.6 2010-08-23 07:22:56 meichel * Minor changes needed for compilation on MSVC6 * * Revision 1.5 2010-08-05 08:38:10 uli * Fixed some warnings from -Wold-style-cast. * * Revision 1.4 2009-11-04 09:58:11 uli * Switched to logging mechanism provided by the "new" oflog module * * Revision 1.3 2008-09-25 15:43:22 joergr * Added support for printing the expanded command line arguments. * Always output the resource identifier of the command line tool in debug mode. * * Revision 1.2 2007/07/11 10:42:28 joergr * Fixed layout and other minor issues of the usage output (--help). * * Revision 1.1 2007/07/11 08:52:22 meichel * Added regression test for new method DcmElement::getPartialValue. * * */ dcmtk-3.6.0/dcmdata/apps/0000755000310500011400000000000011511320675014400 5ustar joergrdicom3dcmtk-3.6.0/dcmdata/apps/mdfconen.h0000644000310500011400000002273611455601400016347 0ustar joergrdicom3/* * * Copyright (C) 2003-2010, 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: dcmdata * * Author: Michael Onken * * Purpose: Class for modifying DICOM files from comandline * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:17:52 $ * CVS/RCS Revision: $Revision: 1.19 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef MDFCONEN_H #define MDFCONEN_H #include "dcmtk/config/osconfig.h" // make sure OS specific configuration is included first #include "dcmtk/ofstd/ofcond.h" #include "dcmtk/dcmdata/dcxfer.h" // forward declarations class MdfDatasetManager; class OFConsoleApplication; class OFCommandLine; /** class reflecting a modify operation (called Job in this context) */ class MdfJob { public : OFString option; OFString path; OFString value; /** Comparison operator between Jobs */ OFBool operator==(const MdfJob &j) const; private : /** private undefined copy constructor */ MdfJob &operator=(const MdfJob &j); }; /** This class encapsulates data structures and operations for modifying * Dicom files from the commandline */ class MdfConsoleEngine { public: /** Constructor * @param argc Number of commandline arguments * @param argv Array holding the commandline arguments * @param appl_name Name of calling application, that instantiates * this class */ MdfConsoleEngine(int argc, char *argv[], const char *appl_name); /** Destructor */ ~MdfConsoleEngine(); /** This function looks at commandline options and decides what to do. * It evaluates option values from commandline and prepares them for * starting the corresponding private functions. * @return Returns 0 if successful, another value if errors occurreds */ int startProvidingService(); protected: /** Checks for non-job commandline options like --debug etc. and * sets corresponding internal flags */ void parseNonJobOptions(); /** Parses commandline options into corresponding file- and job lists and * enables debug/verbose mode. The joblist is built in order of modify * options on commandline */ void parseCommandLine(); /** Checks whether given job expects more values on commandline, e. g. a * a tag path or any kind of value. * @param job [in] The job option to check (e. g. "i", "m", "ma"...) * @return OFTrue, if a value is expected. */ static OFBool jobOptionExpectsParameters(const OFString &job); /** This function splits a modify option (inclusive value) as * found on commandline into to parts (path and value) * e.g. "(0010,0010)=value" into path "(0010,0010)" and "value" * @param whole string to be splitted * @param path returns part containing the path * @param value returns part containing the value(if theres one) */ static void splitPathAndValue(const OFString &whole, OFString &path, OFString &value); /** Executes given modify job * @param job job to be executed * @param filename name of the file to be processed (optional) * @return returns 0 if no error occured, else the number of errors */ int executeJob(const MdfJob &job, const char *filename = NULL); /** Backup and load file into internal MdfDatasetManager * @param filename name of file to load * @return OFCondition, whether loading/backuping was successful including * error description */ OFCondition loadFile(const char *filename); /** Backup given file from file to file.bak * @param file_name filename of file, that should be backuped * @return OFCondition, whether backup was successful or not */ OFCondition backupFile(const char *file_name); /** Restore given file from file.bak to original (without .bak) * @param filename restore "filename".bak to original without .bak * @return OFCondition, whether restoring was successful */ OFCondition restoreFile(const char *filename); private: /// helper class for console applications OFConsoleApplication *app; /// helper class for commandline parsing OFCommandLine *cmd; /// dataset manager that is used for modify operations MdfDatasetManager *ds_man; /// ignore errors option OFBool ignore_errors_option; /// if false, metaheader UIDs are not updated when related dataset UIDs change OFBool update_metaheader_uids_option; /// if true, no backup is made before modifying a file OFBool no_backup_option; /// read file with or without metaheader E_FileReadMode read_mode_option; /// denotes the expected transfersyntax E_TransferSyntax input_xfer_option; /// decides whether to with/without metaheader OFBool output_dataset_option; /// denotes the transfer syntax that should be written E_TransferSyntax output_xfer_option; /// option for group length recalcing E_GrpLenEncoding glenc_option; /// write explicit or implicit length encoding E_EncodingType enctype_option; /// padding output E_PaddingEncoding padenc_option; /// internal padding variables OFCmdUnsignedInt filepad_option; OFCmdUnsignedInt itempad_option; /// if true, 'tag not found' errors are treated as being successful for /// modify and erase operations OFBool ignore_missing_tags_option; /// If true, it is not checked whether there is a corresponding private /// reservation during insertion of private tags OFBool no_reservation_checks; /// If enabled, any value modifications of UN leaf elements are not /// executed OFBool ignore_un_modifies; /// list of jobs to be executed OFList *jobs; /// list of files to be modified OFList *files; /** private undefined assignment operator */ MdfConsoleEngine &operator=(const MdfConsoleEngine &); /** private undefined copy constructor */ MdfConsoleEngine(const MdfConsoleEngine &); }; #endif // MDFCONEN_H /* ** CVS/RCS Log: ** $Log: mdfconen.h,v $ ** Revision 1.19 2010-10-14 13:17:52 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.18 2010-05-20 15:45:21 joergr ** Removed some unnecessary include directives. ** ** Revision 1.17 2009-11-04 09:58:06 uli ** Switched to logging mechanism provided by the "new" oflog module ** ** Revision 1.16 2009-01-15 16:11:55 onken ** Reworked dcmodify to work with the new DcmPath classes for supporting ** wildcard paths and automatic insertion of missing attributes and items. ** Added options for private tag handling and modification of UN values and ** for ignoring errors resulting from missing tags during modify and erase ** operations. Further cleanups. ** ** Revision 1.15 2008-06-23 13:39:16 joergr ** Fixed inconsistencies in Doxygen API documentation. ** ** Revision 1.14 2006/12/06 09:31:49 onken ** Added "--no-backup" option to prevent dcmodify from creating backup files ** ** Revision 1.13 2006/11/23 15:32:58 onken ** Made member variables private (before: protected) ** ** Revision 1.12 2005/12/08 15:46:50 meichel ** Updated Makefiles to correctly install header files ** ** Revision 1.11 2005/12/02 09:19:26 joergr ** Added new command line option that checks whether a given file starts with a ** valid DICOM meta header. ** ** Revision 1.10 2004/11/05 17:17:24 onken ** Added input and output options for dcmodify. minor code enhancements. ** ** Revision 1.9 2004/10/22 16:53:26 onken ** - fixed ignore-errors-option ** - major enhancements for supporting private tags ** - removed '0 Errors' output ** - modifications to groups 0000,0001,0002,0003,0005 and 0007 are blocked, ** removing tags with group 0001,0003,0005 and 0007 is still possible ** - UID options: ** - generate new study, series and instance UIDs ** - When changing UIDs in dataset, related metaheader tags are updated ** automatically ** - minor code improvements ** ** Revision 1.8 2004/04/19 14:45:07 onken ** Restructured code to avoid default parameter values for "complex types" like ** OFString. Required for Sun CC 2.0.1. ** ** Revision 1.7 2003/12/10 16:19:20 onken ** Changed API of MdfDatasetManager, so that its transparent for user, whether ** he wants to modify itemtags or tags at 1. level. ** ** Complete rewrite of MdfConsoleEngine. It doesn't support a batchfile any more, ** but now a user can give different modify-options at the same time on ** commandline. Other purifications and simplifications were made. ** ** Revision 1.6 2003/11/11 10:55:51 onken ** - debug-mechanism doesn't use debug(..) any more ** - comments purified ** - headers adjustet to debug-modifications ** ** Revision 1.5 2003/10/13 14:51:49 onken ** improved backup-strategy ** ** Revision 1.4 2003/10/01 14:04:03 onken ** Corrected doxygen-information in headerfiles ** ** Revision 1.3 2003/09/19 12:43:54 onken ** major bug fixes, corrections for "dcmtk-coding-style", better error-handling ** ** Revision 1.2 2003/07/09 12:13:13 meichel ** Included dcmodify in MSVC build system, updated headers ** ** Revision 1.1 2003/06/26 09:17:18 onken ** Added commandline-application dcmodify. ** ** */ dcmtk-3.6.0/dcmdata/apps/dcmdump.cc0000644000310500011400000012440311462551016016344 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Gerd Ehlers * * Purpose: List the contents of a dicom file * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-29 13:54:22 $ * CVS/RCS Revision: $Revision: 1.86 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/ofstd/ofstream.h" #include "dcmtk/dcmdata/dctk.h" #include "dcmtk/dcmdata/cmdlnarg.h" #include "dcmtk/ofstd/ofconapp.h" #include "dcmtk/ofstd/ofstd.h" #include "dcmtk/dcmdata/dcuid.h" /* for dcmtk version name */ #include "dcmtk/dcmdata/dcistrmz.h" /* for dcmZlibExpectRFC1950Encoding */ #define INCLUDE_CSTDLIB #define INCLUDE_CSTRING #include "dcmtk/ofstd/ofstdinc.h" #ifdef WITH_ZLIB #include /* for zlibVersion() */ #endif #if defined (HAVE_WINDOWS_H) || defined(HAVE_FNMATCH_H) #define PATTERN_MATCHING_AVAILABLE #endif #ifndef HAVE_WINDOWS_H #define ANSI_ESCAPE_CODES_AVAILABLE #endif #define OFFIS_CONSOLE_APPLICATION "dcmdump" static OFLogger dcmdumpLogger = OFLog::getLogger("dcmtk.apps." OFFIS_CONSOLE_APPLICATION); static char rcsid[] = "$dcmtk: " OFFIS_CONSOLE_APPLICATION " v" OFFIS_DCMTK_VERSION " " OFFIS_DCMTK_RELEASEDATE " $"; #ifdef HAVE_GUSI_H /* needed for Macintosh */ #include #include #endif static int dumpFile(STD_NAMESPACE ostream &out, const char *ifname, const E_FileReadMode readMode, const E_TransferSyntax xfer, const size_t printFlags, const OFBool loadIntoMemory, const OFBool stopOnErrors, const char *pixelDirectory); // ******************************************** static OFBool printFilename = OFFalse; static OFBool printFileSearch = OFFalse; static OFBool printAllInstances = OFTrue; static OFBool prependSequenceHierarchy = OFFalse; static int printTagCount = 0; static const int MAX_PRINT_TAG_NAMES = 1024; static const char *printTagNames[MAX_PRINT_TAG_NAMES]; static const DcmTagKey *printTagKeys[MAX_PRINT_TAG_NAMES]; static OFCmdUnsignedInt maxReadLength = 4096; // default is 4 KB static size_t fileCounter = 0; static DcmTagKey parseTagKey(const char *tagName) { unsigned int group = 0xffff; unsigned int elem = 0xffff; if (sscanf(tagName, "%x,%x", &group, &elem) != 2) { DcmTagKey tagKey; /* it is a name */ const DcmDataDictionary &globalDataDict = dcmDataDict.rdlock(); const DcmDictEntry *dicent = globalDataDict.findEntry(tagName); if (dicent == NULL) { OFLOG_WARN(dcmdumpLogger, "unrecognized tag name: '" << tagName << "'"); tagKey = DCM_UndefinedTagKey; } else { tagKey = dicent->getKey(); } dcmDataDict.unlock(); return tagKey; } else /* tag name has format "gggg,eeee" */ { return DcmTagKey(group,elem); } } static OFBool addPrintTagName(const char *tagName) { if (printTagCount >= MAX_PRINT_TAG_NAMES) { OFLOG_WARN(dcmdumpLogger, "too many print tag options (max: " << MAX_PRINT_TAG_NAMES << ")"); return OFFalse; } unsigned int group = 0xffff; unsigned int elem = 0xffff; if (sscanf(tagName, "%x,%x", &group, &elem) != 2) { /* it is a name */ const DcmDataDictionary &globalDataDict = dcmDataDict.rdlock(); const DcmDictEntry *dicent = globalDataDict.findEntry(tagName); if (dicent == NULL) { OFLOG_WARN(dcmdumpLogger, "unrecognized tag name: '" << tagName << "'"); dcmDataDict.unlock(); return OFFalse; } else { /* note for later */ printTagKeys[printTagCount] = new DcmTagKey(dicent->getKey()); } dcmDataDict.unlock(); } else { /* tag name has format xxxx,xxxx */ /* do not lookup in dictionary, tag could be private */ printTagKeys[printTagCount] = NULL; } printTagNames[printTagCount] = strcpy(OFstatic_cast(char*, malloc(strlen(tagName)+1)), tagName); printTagCount++; return OFTrue; } #define SHORTCOL 3 #define LONGCOL 21 int main(int argc, char *argv[]) { OFBool loadIntoMemory = OFTrue; size_t printFlags = DCMTypes::PF_shortenLongTagValues; E_FileReadMode readMode = ERM_autoDetect; E_TransferSyntax xfer = EXS_Unknown; OFBool stopOnErrors = OFTrue; OFBool scanDir = OFFalse; OFBool recurse = OFFalse; const char *scanPattern = ""; const char *pixelDirectory = NULL; #ifdef HAVE_GUSI_H /* needed for Macintosh */ /* set options for the Metrowerks CodeWarrior SIOUX console */ SIOUXSettings.autocloseonquit = OFFalse; SIOUXSettings.asktosaveonclose = OFFalse; SIOUXSettings.showstatusline = OFTrue; SIOUXSettings.setupmenus = OFTrue; /* set options for the GUSI sockets library */ GUSISetup(GUSIwithSIOUXSockets); GUSISetup(GUSIwithInternetSockets); #endif OFConsoleApplication app(OFFIS_CONSOLE_APPLICATION, "Dump DICOM file and data set", rcsid); OFCommandLine cmd; cmd.setOptionColumns(LONGCOL, SHORTCOL); cmd.setParamColumn(LONGCOL + SHORTCOL + 4); cmd.addParam("dcmfile-in", "DICOM input file or directory to be dumped", OFCmdParam::PM_MultiMandatory); cmd.addGroup("general options:", LONGCOL, SHORTCOL + 2); cmd.addOption("--help", "-h", "print this help text and exit", OFCommandLine::AF_Exclusive); cmd.addOption("--version", "print version information and exit", OFCommandLine::AF_Exclusive); OFLog::addOptions(cmd); cmd.addGroup("input options:"); cmd.addSubGroup("input file format:"); cmd.addOption("--read-file", "+f", "read file format or data set (default)"); cmd.addOption("--read-file-only", "+fo", "read file format only"); cmd.addOption("--read-dataset", "-f", "read data set without file meta information"); cmd.addSubGroup("input transfer syntax:"); cmd.addOption("--read-xfer-auto", "-t=", "use TS recognition (default)"); cmd.addOption("--read-xfer-detect", "-td", "ignore TS specified in the file meta header"); cmd.addOption("--read-xfer-little", "-te", "read with explicit VR little endian TS"); cmd.addOption("--read-xfer-big", "-tb", "read with explicit VR big endian TS"); cmd.addOption("--read-xfer-implicit", "-ti", "read with implicit VR little endian TS"); cmd.addSubGroup("input files:"); cmd.addOption("--scan-directories", "+sd", "scan directories for input files (dcmfile-in)"); #ifdef PATTERN_MATCHING_AVAILABLE cmd.addOption("--scan-pattern", "+sp", 1, "[p]attern: string (only with --scan-directories)", "pattern for filename matching (wildcards)"); #endif cmd.addOption("--no-recurse", "-r", "do not recurse within directories (default)"); cmd.addOption("--recurse", "+r", "recurse within specified directories"); cmd.addSubGroup("parsing of file meta information:"); cmd.addOption("--use-meta-length", "+ml", "use file meta information group length (default)"); cmd.addOption("--ignore-meta-length", "-ml", "ignore file meta information group length"); cmd.addSubGroup("parsing of odd-length attributes:"); cmd.addOption("--accept-odd-length", "+ao", "accept odd length attributes (default)"); cmd.addOption("--assume-even-length", "+ae", "assume real length is one byte larger"); cmd.addSubGroup("handling of non-standard VR:"); cmd.addOption("--treat-as-unknown", "+vr", "treat non-standard VR as unknown (default)"); cmd.addOption("--assume-implicit", "-vr", "try to read with implicit VR little endian TS"); cmd.addSubGroup("handling of undefined length UN elements:"); cmd.addOption("--enable-cp246", "+ui", "read undefined len UN as implicit VR (default)"); cmd.addOption("--disable-cp246", "-ui", "read undefined len UN as explicit VR"); cmd.addSubGroup("handling of defined length UN elements:"); cmd.addOption("--retain-un", "-uc", "retain elements as UN (default)"); cmd.addOption("--convert-un", "+uc", "convert to real VR if known"); cmd.addSubGroup("handling of private max-length elements (implicit VR):"); cmd.addOption("--maxlength-dict", "-sq", "read as defined in dictionary (default)"); cmd.addOption("--maxlength-seq", "+sq", "read as sequence with undefined length"); cmd.addSubGroup("general handling of parser errors: "); cmd.addOption("--ignore-parse-errors", "+Ep", "try to recover from parse errors"); cmd.addOption("--handle-parse-errors", "-Ep", "handle parse errors and stop parsing (default)"); cmd.addSubGroup("other parsing options:"); cmd.addOption("--stop-after-elem", "+st", 1, "[t]ag: \"gggg,eeee\" or dictionary name", "stop parsing after element specified by t"); cmd.addSubGroup("automatic data correction:"); cmd.addOption("--enable-correction", "+dc", "enable automatic data correction (default)"); cmd.addOption("--disable-correction", "-dc", "disable automatic data correction"); #ifdef WITH_ZLIB cmd.addSubGroup("bitstream format of deflated input:"); cmd.addOption("--bitstream-deflated", "+bd", "expect deflated bitstream (default)"); cmd.addOption("--bitstream-zlib", "+bz", "expect deflated zlib bitstream"); #endif cmd.addGroup("output options:"); cmd.addSubGroup("loading:"); cmd.addOption("--load-all", "+M", "load very long tag values (default)"); cmd.addOption("--load-short", "-M", "do not load very long values (e.g. pixel data)"); cmd.addOption("--max-read-length", "+R", 1, "[k]bytes: integer (4..4194302, default: 4)", "set threshold for long values to k kbytes"); cmd.addSubGroup("printing:"); cmd.addOption("--print-all", "+L", "print long tag values completely"); cmd.addOption("--print-short", "-L", "print long tag values shortened (default)"); cmd.addOption("--print-tree", "+T", "print hierarchical structure as a simple tree"); cmd.addOption("--print-indented", "-T", "print hierarchical structure indented (default)"); cmd.addOption("--print-filename", "+F", "print header with filename for each input file"); cmd.addOption("--print-file-search", "+Fs", "print header with filename only for those input\nfiles that contain one of the searched tags"); cmd.addOption("--map-uid-names", "+Un", "map well-known UID numbers to names (default)"); cmd.addOption("--no-uid-names", "-Un", "do not map well-known UID numbers to names"); cmd.addOption("--quote-nonascii", "+Qn", "quote non-ASCII and control chars as XML markup"); cmd.addOption("--print-nonascii", "-Qn", "print non-ASCII and control chars (default)"); #ifdef ANSI_ESCAPE_CODES_AVAILABLE cmd.addOption("--print-color", "+C", "use ANSI escape codes for colored output"); #endif cmd.addSubGroup("error handling:"); cmd.addOption("--stop-on-error", "-E", "do not print if file is damaged (default)"); cmd.addOption("--ignore-errors", "+E", "attempt to print even if file is damaged"); cmd.addSubGroup("searching:"); cmd.addOption("--search", "+P", 1, "[t]ag: \"gggg,eeee\" or dictionary name", "print the value of tag t\nthis option can be specified multiple times\n(default: the complete file is printed)"); cmd.addOption("--search-all", "+s", "print all instances of searched tags (default)"); cmd.addOption("--search-first", "-s", "only print first instance of searched tags"); cmd.addOption("--prepend", "+p", "prepend sequence hierarchy to printed tag,\ndenoted by: (gggg,eeee).(gggg,eeee).*\n(only with --search-all or --search-first)"); cmd.addOption("--no-prepend", "-p", "do not prepend hierarchy to tag (default)"); cmd.addSubGroup("writing:"); cmd.addOption("--write-pixel", "+W", 1, "[d]irectory: string", "write pixel data to a .raw file stored in d\n(little endian, filename created automatically)"); /* evaluate command line */ prepareCmdLineArgs(argc, argv, OFFIS_CONSOLE_APPLICATION); if (app.parseCommandLine(cmd, argc, argv, OFCommandLine::PF_ExpandWildcards)) { /* check exclusive options first */ if (cmd.hasExclusiveOption()) { if (cmd.findOption("--version")) { app.printHeader(OFTrue /*print host identifier*/); COUT << OFendl << "External libraries used:"; #ifdef WITH_ZLIB COUT << OFendl << "- ZLIB, Version " << zlibVersion() << OFendl; #else COUT << " none" << OFendl; #endif return 0; } } /* options */ OFLog::configureFromCommandLine(cmd, app); cmd.beginOptionBlock(); if (cmd.findOption("--read-file")) readMode = ERM_autoDetect; if (cmd.findOption("--read-file-only")) readMode = ERM_fileOnly; if (cmd.findOption("--read-dataset")) readMode = ERM_dataset; cmd.endOptionBlock(); cmd.beginOptionBlock(); if (cmd.findOption("--read-xfer-auto")) xfer = EXS_Unknown; if (cmd.findOption("--read-xfer-detect")) dcmAutoDetectDatasetXfer.set(OFTrue); if (cmd.findOption("--read-xfer-little")) { app.checkDependence("--read-xfer-little", "--read-dataset", readMode == ERM_dataset); xfer = EXS_LittleEndianExplicit; } if (cmd.findOption("--read-xfer-big")) { app.checkDependence("--read-xfer-big", "--read-dataset", readMode == ERM_dataset); xfer = EXS_BigEndianExplicit; } if (cmd.findOption("--read-xfer-implicit")) { app.checkDependence("--read-xfer-implicit", "--read-dataset", readMode == ERM_dataset); xfer = EXS_LittleEndianImplicit; } cmd.endOptionBlock(); if (cmd.findOption("--scan-directories")) scanDir = OFTrue; #ifdef PATTERN_MATCHING_AVAILABLE if (cmd.findOption("--scan-pattern")) { app.checkDependence("--scan-pattern", "--scan-directories", scanDir); app.checkValue(cmd.getValue(scanPattern)); } #endif cmd.beginOptionBlock(); if (cmd.findOption("--no-recurse")) recurse = OFFalse; if (cmd.findOption("--recurse")) { app.checkDependence("--recurse", "--scan-directories", scanDir); recurse = OFTrue; } cmd.endOptionBlock(); cmd.beginOptionBlock(); if (cmd.findOption("--use-meta-length")) { dcmIgnoreFileMetaInformationGroupLength.set(OFFalse); } if (cmd.findOption("--ignore-meta-length")) { dcmIgnoreFileMetaInformationGroupLength.set(OFTrue); } cmd.endOptionBlock(); cmd.beginOptionBlock(); if (cmd.findOption("--accept-odd-length")) { dcmAcceptOddAttributeLength.set(OFTrue); } if (cmd.findOption("--assume-even-length")) { dcmAcceptOddAttributeLength.set(OFFalse); } cmd.endOptionBlock(); cmd.beginOptionBlock(); if (cmd.findOption("--treat-as-unknown")) { dcmAcceptUnexpectedImplicitEncoding.set(OFFalse); } if (cmd.findOption("--assume-implicit")) { dcmAcceptUnexpectedImplicitEncoding.set(OFTrue); } cmd.beginOptionBlock(); if (cmd.findOption("--enable-cp246")) { dcmEnableCP246Support.set(OFTrue); } if (cmd.findOption("--disable-cp246")) { dcmEnableCP246Support.set(OFFalse); } cmd.endOptionBlock(); cmd.beginOptionBlock(); if (cmd.findOption("--retain-un")) { dcmEnableUnknownVRConversion.set(OFFalse); } if (cmd.findOption("--convert-un")) { dcmEnableUnknownVRConversion.set(OFTrue); } cmd.endOptionBlock(); cmd.beginOptionBlock(); if (cmd.findOption("--maxlength-dict")) { dcmReadImplPrivAttribMaxLengthAsSQ.set(OFFalse); } if (cmd.findOption("--maxlength-seq")) { dcmReadImplPrivAttribMaxLengthAsSQ.set(OFTrue); } cmd.endOptionBlock(); cmd.beginOptionBlock(); if (cmd.findOption("--ignore-parse-errors")) { dcmIgnoreParsingErrors.set(OFTrue); } if (cmd.findOption("--handle-parse-errors")) { dcmIgnoreParsingErrors.set(OFFalse); } cmd.endOptionBlock(); cmd.beginOptionBlock(); if (cmd.findOption("--enable-correction")) { dcmEnableAutomaticInputDataCorrection.set(OFTrue); } if (cmd.findOption("--disable-correction")) { dcmEnableAutomaticInputDataCorrection.set(OFFalse); } cmd.endOptionBlock(); #ifdef WITH_ZLIB cmd.beginOptionBlock(); if (cmd.findOption("--bitstream-deflated")) { dcmZlibExpectRFC1950Encoding.set(OFFalse); } if (cmd.findOption("--bitstream-zlib")) { dcmZlibExpectRFC1950Encoding.set(OFTrue); } cmd.endOptionBlock(); #endif if (cmd.findOption("--max-read-length")) { app.checkValue(cmd.getValueAndCheckMinMax(maxReadLength, 4, 4194302)); maxReadLength *= 1024; // convert kbytes to bytes } cmd.beginOptionBlock(); if (cmd.findOption("--load-all")) loadIntoMemory = OFTrue; if (cmd.findOption("--load-short")) loadIntoMemory = OFFalse; cmd.endOptionBlock(); cmd.beginOptionBlock(); if (cmd.findOption("--print-all")) printFlags &= ~DCMTypes::PF_shortenLongTagValues; if (cmd.findOption("--print-short")) printFlags |= DCMTypes::PF_shortenLongTagValues; cmd.endOptionBlock(); cmd.beginOptionBlock(); if (cmd.findOption("--print-tree")) printFlags |= DCMTypes::PF_showTreeStructure; if (cmd.findOption("--print-indented")) printFlags &= ~DCMTypes::PF_showTreeStructure; cmd.endOptionBlock(); cmd.beginOptionBlock(); if (cmd.findOption("--print-filename")) { printFilename = OFTrue; printFileSearch = OFFalse; } if (cmd.findOption("--print-file-search")) { printFileSearch = OFTrue; printFilename = OFFalse; } cmd.endOptionBlock(); cmd.beginOptionBlock(); if (cmd.findOption("--map-uid-names")) printFlags &= ~DCMTypes::PF_doNotMapUIDsToNames; if (cmd.findOption("--no-uid-names")) printFlags |= DCMTypes::PF_doNotMapUIDsToNames; cmd.endOptionBlock(); cmd.beginOptionBlock(); if (cmd.findOption("--quote-nonascii")) printFlags |= DCMTypes::PF_convertToMarkup; if (cmd.findOption("--print-nonascii")) printFlags &= ~DCMTypes::PF_convertToMarkup; cmd.endOptionBlock(); #ifdef ANSI_ESCAPE_CODES_AVAILABLE if (cmd.findOption("--print-color")) printFlags |= DCMTypes::PF_useANSIEscapeCodes; #endif cmd.beginOptionBlock(); if (cmd.findOption("--stop-on-error")) stopOnErrors = OFTrue; if (cmd.findOption("--ignore-errors")) stopOnErrors = OFFalse; cmd.endOptionBlock(); if (cmd.findOption("--stop-after-elem")) { const char *tagName = NULL; app.checkValue(cmd.getValue(tagName)); DcmTagKey key = parseTagKey(tagName); if (key != DCM_UndefinedTagKey) dcmStopParsingAfterElement.set(key); else app.printError("no valid key given for option --stop-after-elem"); } if (cmd.findOption("--search", 0, OFCommandLine::FOM_FirstFromLeft)) { const char *tagName = NULL; do { app.checkValue(cmd.getValue(tagName)); if (!addPrintTagName(tagName)) return 1; } while (cmd.findOption("--search", 0, OFCommandLine::FOM_NextFromLeft)); } if (printFileSearch) app.checkDependence("--print-file-search", "--search", printTagCount > 0); cmd.beginOptionBlock(); if (cmd.findOption("--search-all")) { app.checkDependence("--search-all", "--search", printTagCount > 0); printAllInstances = OFTrue; } if (cmd.findOption("--search-first")) { app.checkDependence("--search-first", "--search", printTagCount > 0); printAllInstances = OFFalse; } cmd.endOptionBlock(); cmd.beginOptionBlock(); if (cmd.findOption("--prepend")) { app.checkDependence("--prepend", "--search", printTagCount > 0); prependSequenceHierarchy = OFTrue; } if (cmd.findOption("--no-prepend")) { app.checkDependence("--no-prepend", "--search", printTagCount > 0); prependSequenceHierarchy = OFFalse; } cmd.endOptionBlock(); app.checkConflict("--prepend", "--print-tree", prependSequenceHierarchy && (printFlags & DCMTypes::PF_showTreeStructure) > 0); if (cmd.findOption("--write-pixel")) app.checkValue(cmd.getValue(pixelDirectory)); } /* print resource identifier */ OFLOG_DEBUG(dcmdumpLogger, rcsid << OFendl); /* make sure data dictionary is loaded */ if (!dcmDataDict.isDictionaryLoaded()) { OFLOG_WARN(dcmdumpLogger, "no data dictionary loaded, check environment variable: " << DCM_DICT_ENVIRONMENT_VARIABLE); } /* make sure the pixel data directory exists and is writable */ if (pixelDirectory != NULL) { if (!OFStandard::dirExists(pixelDirectory)) { OFLOG_WARN(dcmdumpLogger, "directory specified for --write-pixel does not exist, ignoring this option"); pixelDirectory = NULL; } else if (!OFStandard::isWriteable(pixelDirectory)) { OFLOG_WARN(dcmdumpLogger, "directory specified for --write-pixel is not writeable, ignoring this option"); pixelDirectory = NULL; } } int errorCount = 0; /* create list of input files */ const char *paramString = NULL; const int paramCount = cmd.getParamCount(); OFList inputFiles; /* iterate over all input filenames */ for (int i = 1; i <= paramCount; i++) { cmd.getParam(i, paramString); /* search directory recursively (if required) */ if (OFStandard::dirExists(paramString)) { if (scanDir) OFStandard::searchDirectoryRecursively(paramString, inputFiles, scanPattern, "" /*dirPrefix*/, recurse); else OFLOG_WARN(dcmdumpLogger, "ignoring directory because option --scan-directories is not set: " << paramString); } else inputFiles.push_back(paramString); } /* check whether there are any input files at all */ if (inputFiles.empty()) { OFLOG_FATAL(dcmdumpLogger, "no input files to be dumped"); return 1; } const size_t count = inputFiles.size(); const char *current = NULL; OFListIterator(OFString) if_iter = inputFiles.begin(); OFListIterator(OFString) if_last = inputFiles.end(); /* iterate over all input filenames */ while (if_iter != if_last) { current = (*if_iter++).c_str(); if (printFilename) { /* a newline separates two consecutive "dumps" */ if (++fileCounter > 1) COUT << OFendl; /* print header with filename */ COUT << "# " << OFFIS_CONSOLE_APPLICATION << " (" << fileCounter << "/" << count << "): " << current << OFendl; } errorCount += dumpFile(COUT, current, readMode, xfer, printFlags, loadIntoMemory, stopOnErrors, pixelDirectory); } return errorCount; } static void printResult(STD_NAMESPACE ostream &out, DcmStack &stack, size_t printFlags, const char*pixelFileName = NULL, size_t *pixelCounter = NULL) { unsigned long n = stack.card(); if (n == 0) { return; } if (prependSequenceHierarchy) { if (printFlags & DCMTypes::PF_useANSIEscapeCodes) out << ANSI_ESCAPE_CODE_TAG; /* print the path leading up to the top stack elem */ for (unsigned long i = n - 1; i >= 1; i--) { DcmObject *dobj = stack.elem(i); /* do not print if a DCM_Item as this is not * very helpful to distinguish instances. */ if (dobj != NULL && dobj->getTag().getXTag() != DCM_Item) { out << dobj->getTag() << "."; } } } /* print the tag and its value */ DcmObject *dobj = stack.top(); dobj->print(out, printFlags, 1 /*level*/, pixelFileName, pixelCounter); } static int dumpFile(STD_NAMESPACE ostream &out, const char *ifname, const E_FileReadMode readMode, const E_TransferSyntax xfer, const size_t printFlags, const OFBool loadIntoMemory, const OFBool stopOnErrors, const char *pixelDirectory) { int result = 0; if ((ifname == NULL) || (strlen(ifname) == 0)) { OFLOG_ERROR(dcmdumpLogger, OFFIS_CONSOLE_APPLICATION << ": invalid filename: "); return 1; } DcmFileFormat dfile; DcmObject *dset = &dfile; if (readMode == ERM_dataset) dset = dfile.getDataset(); OFCondition cond = dfile.loadFile(ifname, xfer, EGL_noChange, maxReadLength, readMode); if (cond.bad()) { OFLOG_ERROR(dcmdumpLogger, OFFIS_CONSOLE_APPLICATION << ": " << cond.text() << ": reading file: "<< ifname); result = 1; if (stopOnErrors) return result; } if (loadIntoMemory) dfile.loadAllDataIntoMemory(); size_t pixelCounter = 0; const char *pixelFileName = NULL; OFString pixelFilenameStr; if (pixelDirectory != NULL) { /* create filename for pixel data */ OFString fileName; OFStandard::getFilenameFromPath(fileName, ifname); OFStandard::combineDirAndFilename(pixelFilenameStr, pixelDirectory, fileName); pixelFileName = pixelFilenameStr.c_str(); } /* dump complete file content */ if (printTagCount == 0) { dset->print(out, printFlags, 0 /*level*/, pixelFileName, &pixelCounter); } else { OFBool firstTag = OFTrue; /* only print specified tags */ for (int i = 0; i < printTagCount; i++) { unsigned int group = 0xffff; unsigned int elem = 0xffff; DcmTagKey searchKey; const char *tagName = printTagNames[i]; if (printTagKeys[i]) searchKey = *printTagKeys[i]; else if (sscanf(tagName, "%x,%x", &group, &elem) == 2) searchKey.set(group, elem); else { OFLOG_FATAL(dcmdumpLogger, "Internal ERROR in File " << __FILE__ << ", Line " << __LINE__ << OFendl << " -- Named tag inconsistency"); abort(); } DcmStack stack; if (dset->search(searchKey, stack, ESM_fromHere, OFTrue) == EC_Normal) { if (firstTag) { if (!printFilename) { /* a newline separates two consecutive "dumps" */ if (++fileCounter > 1) COUT << OFendl; } /* print header with filename */ if (printFileSearch) COUT << "# " << OFFIS_CONSOLE_APPLICATION << " (" << fileCounter << "): " << ifname << OFendl; firstTag = OFFalse; } printResult(out, stack, printFlags, pixelFileName, &pixelCounter); if (printAllInstances) { while (dset->search(searchKey, stack, ESM_afterStackTop, OFTrue) == EC_Normal) printResult(out, stack, printFlags, pixelFileName, &pixelCounter); } } } } return result; } /* * CVS/RCS Log: * $Log: dcmdump.cc,v $ * Revision 1.86 2010-10-29 13:54:22 joergr * Remove new --print-color option for Windows system since the ANSI escape * codes are not supported by the standard command shell. * * Revision 1.85 2010-10-29 10:59:34 joergr * Added new option for colored output of the textual dump. * * Revision 1.84 2010-10-14 13:13:30 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.83 2010-07-21 12:54:45 joergr * Made sure that no NULL pointer is passed to the OFString constructor. This * occurred when option --scan-directories was used without --scan-pattern. * * Revision 1.82 2010-03-23 15:17:24 joergr * Use printError() method for command line parsing errors only. After the * resource identifier has been printed to the log stream use "oflog" instead. * * Revision 1.81 2010-03-04 09:42:42 joergr * Fixed possible issue with read locks on global data dictionary. * Use return value of getTag() for stream output where possible. * * Revision 1.80 2009-11-13 13:20:23 joergr * Fixed minor issues in log output. * * Revision 1.79 2009-11-04 09:58:06 uli * Switched to logging mechanism provided by the "new" oflog module * * Revision 1.78 2009-06-04 16:50:18 joergr * Added new command line option that allows for ignoring the value of File Meta * Information Group Length (0002,0000). * * Revision 1.77 2009-04-24 12:20:41 joergr * Fixed minor inconsistencies regarding layout/formatting in syntax usage. * * Revision 1.76 2009-04-21 14:02:49 joergr * Fixed minor inconsistencies in manpage / syntax usage. * * Revision 1.75 2009-03-18 13:57:16 joergr * Removed redundant call to OFString constructor. * * Revision 1.74 2009-03-13 10:13:36 joergr * Added check on pixel data directory (option --write-pixel), i.e. whether it * exists and whether it is writable. Added support for option --write-pixel * when --search is used to print selected tags only. * * Revision 1.73 2009-02-11 16:55:31 joergr * Renamed option --stop-at-elem to --stop-after-elem and fixed typo. * * Revision 1.72 2009-02-11 13:16:17 onken * Added global parser flag permitting to stop parsing after a specific * element was parsed on dataset level (useful for removing garbage at * end of file). * * Revision 1.71 2009-02-04 14:30:07 joergr * Fixed small issue with syntax usage layout. * Introduced new syntax usage output subsection "loading". * * Revision 1.70 2009-02-04 14:07:10 onken * Added command line options making use of the parser's error ignoring flag. * * Revision 1.69 2009-01-29 15:36:52 onken * *** empty log message *** * * Revision 1.68 2009-01-06 16:30:29 joergr * Made command line option --quiet visible by default (not only in experimental * mode). * Added new command line options for changing the output format (tree structure * vs. indented output). * * Revision 1.67 2009-01-05 15:30:15 joergr * Added command line options that allow for reading incorrectly encoded DICOM * datasets where particular data elements are encoded with a differing transfer * syntax (Implicit VR Little endian instead of Explicit VR encoding). * * Revision 1.66 2008-09-25 14:53:12 joergr * Moved output of resource identifier in order to avoid printing the same * information twice. * * Revision 1.65 2008-09-25 11:16:32 joergr * Added method for printing the resource identifier of an application. * * Revision 1.64 2008-09-24 13:30:24 joergr * Added support for printing the expanded command line arguments to standard * output stream. * Always output the resource identifier of the command line tool in debug mode. * * Revision 1.63 2008-04-28 09:30:10 meichel * Implemented new command line option --quote-nonascii in dcmdump that * quotes non-ASCII and control characters as XML markup. * * Revision 1.62 2008-04-16 12:36:28 joergr * Changed order of command line evaluation for option --search (now: from left * to right). * * Revision 1.61 2008-02-26 16:54:12 joergr * Added new command line option that disables the mapping of well-known UID * numbers to their associated names (e.g. transfer syntax or SOP class). * * Revision 1.60 2007/10/24 17:13:33 joergr * Added new command line option which prints a header with the filename only * for those input files that contain one of the searched tags. * Fixed small layout and formatting issues in the dump output (missing * indentation and leading zeros). * Replaced sprintf() call by an appropriate use of the C++ stream manipulators. * * Revision 1.59 2007/10/01 16:52:38 joergr * Added support for searching directories recursively for DICOM files. * Enhanced experimental quiet mode. * * Revision 1.58 2007/03/09 14:58:31 joergr * Fixed wrong output of status variable after calling loadFile(). * * Revision 1.57 2006/08/15 15:50:56 meichel * Updated all code in module dcmdata to correctly compile when * all standard C++ classes remain in namespace std. * * Revision 1.56 2006/07/27 13:52:42 joergr * Changed parameter "exclusive" of method addOption() from type OFBool into an * integer parameter "flags". Prepended prefix "PF_" to parseLine() flags. * Option "--help" is no longer an exclusive option by default. * * Revision 1.55 2005/12/08 15:40:46 meichel * Changed include path schema for all DCMTK header files * * Revision 1.54 2005/12/07 16:42:49 onken * Changed default and minimum value of --max-read-length to 4 KB * * Revision 1.53 2005/12/02 09:16:17 joergr * Added new command line option that ignores the transfer syntax specified in * the meta header and tries to detect the transfer syntax automatically from * the dataset. * Added new command line option that checks whether a given file starts with a * valid DICOM meta header. * Added experimental support for a "quiet" mode. * Made description of option --max-read-length more consistent with the other * command line tools. * * Revision 1.52 2005/12/01 11:25:44 joergr * Removed superfluous local variable. Changed type of variable "maxReadLength". * * Revision 1.51 2005/11/17 11:26:11 onken * Option --max-read-length now uses OFCommandLine to check, whether option * value is in range * * Revision 1.50 2005/11/16 14:59:11 onken * *** empty log message *** * * Revision 1.49 2005/11/16 14:55:56 onken * Added "--max-read-length" option to dcmdump and dcm2xml to override * DCMTK-internal threshold (4096K) for long attribute values. * * Revision 1.48 2005/11/15 18:33:20 meichel * Added new command line option --convert-un that enables the re-conversion of * defined length UN elements. * * Revision 1.47 2004/01/16 10:52:42 joergr * Adapted type casts to new-style typecast operators defined in ofcast.h. * Removed acknowledgements with e-mail addresses from CVS log. * * Revision 1.46 2002/12/13 13:44:29 meichel * Fixed problem in dcmdump, --ignore-errors now works correctly again. * * Revision 1.45 2002/12/06 12:05:44 joergr * Enhanced "print()" function by re-working the implementation and replacing * the boolean "showFullData" parameter by a more general integer flag. * * Revision 1.44 2002/11/27 12:07:16 meichel * Adapted module dcmdata to use of new header file ofstdinc.h * * Revision 1.43 2002/11/26 08:43:00 meichel * Replaced all includes for "zlib.h" with * to avoid inclusion of zlib.h in the makefile dependencies. * * Revision 1.42 2002/09/23 17:52:02 joergr * Prepared code for future support of 'config.guess' host identifiers. * * Revision 1.41 2002/09/23 13:50:41 joergr * Added new command line option "--version" which prints the name and version * number of external libraries used. * * Revision 1.40 2002/08/27 16:55:26 meichel * Initial release of new DICOM I/O stream classes that add support for stream * compression (deflated little endian explicit VR transfer syntax) * * Revision 1.39 2002/08/20 12:19:57 meichel * Adapted code to new loadFile and saveFile methods, thus removing direct * use of the DICOM stream classes. * * Revision 1.38 2002/08/02 08:43:16 joergr * Fixed bug in dcmdump that was preventing the +p option from working. * * Revision 1.37 2002/07/08 14:44:54 meichel * Improved dcmdata behaviour when reading odd tag length. Depending on the * global boolean flag dcmAcceptOddAttributeLength, the parser now either accepts * odd length attributes or implements the old behaviour, i.e. assumes a real * length larger by one. * * Revision 1.36 2002/04/16 13:38:53 joergr * Added configurable support for C++ ANSI standard includes (e.g. streams). * * Revision 1.35 2002/01/11 14:34:20 joergr * Added new option to dcmdump tool which prints a header with the filename. * * Revision 1.34 2001/09/28 14:18:45 joergr * Changed formatting. * * Revision 1.33 2001/09/25 17:20:59 meichel * Adapted dcmdata to class OFCondition * * Revision 1.32 2001/06/01 15:48:28 meichel * Updated copyright header * * Revision 1.31 2000/06/14 11:26:47 joergr * Corrected wrong filename creation for option +W. * * Revision 1.30 2000/05/03 14:19:05 meichel * Added new class GlobalDcmDataDictionary which implements read/write lock * semantics for safe access to the DICOM dictionary from multiple threads * in parallel. The global dcmDataDict now uses this class. * * Revision 1.29 2000/03/08 16:26:05 meichel * Updated copyright header. * * Revision 1.28 2000/03/06 18:09:37 joergr * Avoid empty statement in the body of if-statements (MSVC6 reports warnings). * * Revision 1.27 2000/03/03 14:05:15 meichel * Implemented library support for redirecting error messages into memory * instead of printing them to stdout/stderr for GUI applications. * * Revision 1.26 2000/02/23 15:11:31 meichel * Corrected macro for Borland C++ Builder 4 workaround. * * Revision 1.25 2000/02/10 11:05:25 joergr * Modified help text for new command line option. * * Revision 1.23 2000/02/01 10:11:57 meichel * Avoiding to include as extern "C" on Borland C++ Builder 4, * workaround for bug in compiler header files. * * Revision 1.22 1999/04/27 17:50:50 joergr * Adapted console applications to new OFCommandLine and OFConsoleApplication * functionality. * * Revision 1.21 1999/04/26 16:38:25 joergr * Removed bug: empty parameters have always been interpreted as options. * Added support to check dependences between different options and report * error messages if necessary. * * Revision 1.20 1999/03/31 09:24:19 meichel * Updated copyright header in module dcmdata * * Revision 1.19 1999/03/29 10:14:12 meichel * Adapted command line options of dcmdata applications to new scheme. * * Revision 1.18 1999/03/22 16:12:16 meichel * Added -d flag to dcmdump. * * Revision 1.17 1997/07/21 08:04:24 andreas * - Replace all boolean types (BOOLEAN, CTNBOOLEAN, DICOM_BOOL, BOOL) * with one unique boolean type OFBool. * - With flag DEBUG dcmdump now tries to print the DICOM file even if * an error in reading the file was detected. * * Revision 1.16 1997/07/03 15:09:38 andreas * - removed debugging functions Bdebug() and Edebug() since * they write a static array and are not very useful at all. * Cdebug and Vdebug are merged since they have the same semantics. * The debugging functions in dcmdata changed their interfaces * (see dcmdata/include/dcdebug.h) * * Revision 1.15 1997/05/29 15:52:50 meichel * Added constant for dcmtk release date in dcuid.h. * All dcmtk applications now contain a version string * which is displayed with the command line options ("usage" message) * and which can be queried in the binary with the "ident" command. * * Revision 1.14 1997/05/27 13:46:53 andreas * - Corrected usage string in dcmdump * * Revision 1.13 1997/05/22 16:53:32 andreas * - Changed default options and documentation for dcmdump. * * Revision 1.12 1997/05/22 13:26:23 hewett * Modified the test for presence of a data dictionary to use the * method DcmDataDictionary::isDictionaryLoaded(). * * Revision 1.11 1997/05/20 07:57:11 andreas * - Removed obsolete applications file2ds and ds2file. The functionality of these * applications is now peformed by dcmconv. Unified calling parameters * are implemented in dump2dcm, dcmdump and dcmconv. * * Revision 1.10 1997/05/16 08:31:04 andreas * - Revised handling of GroupLength elements and support of * DataSetTrailingPadding elements. The enumeratio E_GrpLenEncoding * got additional enumeration values (for a description see dctypes.h). * addGroupLength and removeGroupLength methods are replaced by * computeGroupLengthAndPadding. To support Padding, the parameters of * element and sequence write functions changed. * * Revision 1.9 1997/04/18 08:04:47 andreas * - Minor corrections: correct some warnings of the SUN-C++ Compiler * concerning the assignments of wrong types and inline compiler * errors * * Revision 1.8 1997/02/06 11:19:22 hewett * Update for CodeWarrior 11 on Macintrosh. Now explicitly sets flags * for the SIOUX console. * * Revision 1.7 1996/09/24 16:13:50 hewett * Added preliminary support for the Macintosh environment (GUSI library). * * Revision 1.6 1996/09/18 16:34:16 hewett * Added optional code to the dcmdump program to restrict its * output to specified named tags. * * Revision 1.5 1996/08/05 08:43:36 andreas * new print routine with additional parameters: * - print into files * - fix output length for elements * * Revision 1.4 1996/03/12 15:11:38 hewett * Added call to prepareCmdLineArgs to enable command line arguments * in environments which do not provide them. * * Revision 1.3 1996/01/05 13:29:34 andreas * - new streaming facilities * - unique read/write methods for block and file transfer * - more cleanups * * Revision 1.2 1995/11/23 17:10:31 hewett * Updated for loadable data dictionary. * */ dcmtk-3.6.0/dcmdata/apps/dcmgpdir.cc0000644000310500011400000010253111455600772016510 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Andrew Hewett, Joerg Riesmeier * * Purpose: * Make a DICOMDIR according to the DICOM Part 11 Media Storage Application * Profiles. Supports the following profiles: * - General Purpose CD-R Interchange (STD-GEN-CD) * - General Purpose Interchange on DVD-RAM Media (STD-GEN-DVD-RAM) * If build with 'BUILD_DCMGPDIR_AS_DCMMKDIR' it also supports: * - General Purpose DVD with Compression Interchange (STD-GEN-DVD-JPEG/J2K) * - General Purpose USB and Flash Memory with Compression Interchange (STD-GEN-USB/MMC/CF/SD-JPEG/J2K) * - General Purpose MIME Interchange (STD-GEN-MIME) * - DVD Interchange with MPEG2 MP@ML (STD-DVD-MPEG2-MPML) * - Basic Cardiac X-Ray Angiographic Studies on CD-R Media (STD-XABC-CD) * - 1024 X-Ray Angiographic Studies on CD-R Media (STD-XA1K-CD) * - 1024 X-Ray Angiographic Studies on DVD Media (STD-XA1K-DVD) * - Dental Radiograph Interchange (STD-DEN-CD) * - CT/MR Studies on various Media (STD-CTMR-xxxx) * - Ultrasound Single Frame for Image Display (STD-US-ID-SF-xxxx) * - Ultrasound Single Frame with Spatial Calibration (STD-US-SC-SF-xxxx) * - Ultrasound Single Frame with Combined Calibration (STD-US-CC-SF-xxxx) * - Ultrasound Single & Multi-Frame for Image Display (STD-US-ID-MF-xxxx) * - Ultrasound Single & Multi-Frame with Spatial Calibration (STD-US-SC-MF-xxxx) * - Ultrasound Single & Multi-Frame with Combined Calibration (STD-US-CC-MF-xxxx) * - 12-lead ECG Interchange on Diskette (STD-WVFM-ECG-FD) * - Hemodynamic Waveform Interchange on Diskette (STD-WVFM-HD-FD) * There should be no need to set this compiler flag manually, just compile * dcmjpeg/apps/dcmmkdir.cc. * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:13:30 $ * CVS/RCS Revision: $Revision: 1.95 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dctk.h" #include "dcmtk/dcmdata/dcuid.h" /* for dcmtk version name */ #include "dcmtk/dcmdata/dcddirif.h" /* for class DicomDirInterface */ #include "dcmtk/ofstd/ofstd.h" /* for class OFStandard */ #include "dcmtk/ofstd/ofconapp.h" /* for class OFConsoleApplication */ #include "dcmtk/ofstd/ofcond.h" /* for class OFCondition */ #ifdef BUILD_DCMGPDIR_AS_DCMMKDIR #include "dcmtk/dcmimage/diregist.h" /* include to support color images */ #include "dcmtk/dcmdata/dcrledrg.h" /* for DcmRLEDecoderRegistration */ #include "dcmtk/dcmjpeg/djdecode.h" /* for dcmjpeg decoders */ #include "dcmtk/dcmjpeg/dipijpeg.h" /* for dcmimage JPEG plugin */ #include "dcmtk/dcmjpeg/ddpiimpl.h" /* for class DicomDirImageImplementation */ #endif #ifdef WITH_ZLIB #include /* for zlibVersion() */ #endif #ifdef BUILD_DCMGPDIR_AS_DCMMKDIR #define OFFIS_CONSOLE_APPLICATION "dcmmkdir" #define OFFIS_CONSOLE_DESCRIPTION "Create a DICOMDIR file" #else #define OFFIS_CONSOLE_APPLICATION "dcmgpdir" #define OFFIS_CONSOLE_DESCRIPTION "Create a general purpose DICOMDIR" #endif #if defined (HAVE_WINDOWS_H) || defined(HAVE_FNMATCH_H) #define PATTERN_MATCHING_AVAILABLE #endif static char rcsid[] = "$dcmtk: " OFFIS_CONSOLE_APPLICATION " v" OFFIS_DCMTK_VERSION " " OFFIS_DCMTK_RELEASEDATE " $"; static OFLogger dcmgpdirLogger = OFLog::getLogger("dcmtk.dcmdata." OFFIS_CONSOLE_APPLICATION); #define SHORTCOL 4 #define LONGCOL 23 // ******************************************** int main(int argc, char *argv[]) { OFBool opt_write = OFTrue; OFBool opt_append = OFFalse; OFBool opt_update = OFFalse; OFBool opt_recurse = OFFalse; E_EncodingType opt_enctype = EET_ExplicitLength; E_GrpLenEncoding opt_glenc = EGL_withoutGL; const char *opt_output = DEFAULT_DICOMDIR_NAME; const char *opt_fileset = DEFAULT_FILESETID; const char *opt_descriptor = NULL; const char *opt_charset = DEFAULT_DESCRIPTOR_CHARSET; const char *opt_directory = ""; const char *opt_pattern = ""; DicomDirInterface::E_ApplicationProfile opt_profile = DicomDirInterface::AP_GeneralPurpose; #ifdef BUILD_DCMGPDIR_AS_DCMMKDIR // register global decompression codecs (no verbose/debug mode set) DcmRLEDecoderRegistration::registerCodecs(); DJDecoderRegistration::registerCodecs(); // enable the following lines for JPEG 2000 decompression support /* D2JPEG2000Library::initialize(); D2DecoderRegistration::registerCodecs(); */ #endif /* DICOMDIR interface (checks for JPEG/RLE availability) */ DicomDirInterface ddir; /* set-up command line parameters and options */ OFConsoleApplication app(OFFIS_CONSOLE_APPLICATION, OFFIS_CONSOLE_DESCRIPTION, rcsid); OFCommandLine cmd; cmd.setOptionColumns(LONGCOL, SHORTCOL); cmd.setParamColumn(LONGCOL + SHORTCOL + 4); cmd.addParam("dcmfile-in", "referenced DICOM file", OFCmdParam::PM_MultiOptional); cmd.addGroup("general options:", LONGCOL, SHORTCOL + 2); cmd.addOption("--help", "-h", "print this help text and exit", OFCommandLine::AF_Exclusive); cmd.addOption("--version", "print version information and exit", OFCommandLine::AF_Exclusive); OFLog::addOptions(cmd); cmd.addGroup("input options:"); cmd.addSubGroup("DICOMDIR identifiers:"); cmd.addOption("--output-file", "+D", 1, "[f]ilename: string", "generate specific DICOMDIR file\n(default: " DEFAULT_DICOMDIR_NAME " in current directory)"); cmd.addOption("--fileset-id", "+F", 1, "[i]d: string (default: " DEFAULT_FILESETID ")", "use specific file set ID"); cmd.addOption("--descriptor", "+R", 1, "[f]ilename: string", "add a file set descriptor file ID\n(e.g. README, default: no descriptor)"); cmd.addOption("--char-set", "+C", 1, "[c]harset: string", "add a specific character set for descriptor\n(default: \"" DEFAULT_DESCRIPTOR_CHARSET "\" if descriptor present)"); cmd.addSubGroup("reading:"); cmd.addOption("--input-directory", "+id", 1, "[d]irectory: string", "read referenced DICOM files from directory d\n(default for --recurse: current directory)"); cmd.addOption("--keep-filenames", "-m", "expect filenames to be in DICOM format (def.)"); cmd.addOption("--map-filenames", "+m", "map to DICOM filenames (lowercase->uppercase,\nand remove trailing period)"); cmd.addOption("--no-recurse", "-r", "do not recurse within directories (default)"); cmd.addOption("--recurse", "+r", "recurse within filesystem directories"); #ifdef PATTERN_MATCHING_AVAILABLE cmd.addOption("--pattern", "+p", 1, "[p]attern: string (only with --recurse)", "pattern for filename matching (wildcards)"); #endif cmd.addGroup("processing options:"); cmd.addSubGroup("consistency check:"); cmd.addOption("--no-consistency-check", "-W", "do not check files for consistency"); cmd.addOption("--warn-inconsist-files", "+W", "warn about inconsistent files (default)"); cmd.addOption("--abort-inconsist-file", "-a", "abort on first inconsistent file"); cmd.addSubGroup("type 1 attributes:"); cmd.addOption("--strict", "-I", "exit with error if DICOMDIR type 1 attributes\nare missing in DICOM file (default)"); cmd.addOption("--invent", "+I", "invent DICOMDIR type 1 attributes\nif missing in DICOM file"); cmd.addOption("--invent-patient-id", "+Ipi", "invent new PatientID in case of inconsistent\nPatientName attributes"); cmd.addSubGroup("other checks:"); cmd.addOption("--allow-retired-sop", "+Nrs", "allow retired SOP classes defined in previous\neditions of the DICOM standard"); cmd.addOption("--no-xfer-check", "-Nxc", "do not reject images with non-standard\ntransfer syntax (just warn)"); #ifdef BUILD_DCMGPDIR_AS_DCMMKDIR cmd.addOption("--no-encoding-check", "-Nec", "do not reject images with non-standard\npixel encoding (just warn)"); cmd.addOption("--no-resolution-check", "-Nrc", "do not reject images with non-standard\nspatial resolution (just warn)"); cmd.addSubGroup("icon images:"); cmd.addOption("--add-icon-image", "+X", "add monochrome icon image on IMAGE level\n(default for cardiac profiles)"); cmd.addOption("--icon-image-size", "-Xs", 1, "[s]ize: integer (1..128)", "width and height of the icon image (in pixel)\n(fixed: 128 for XA, 64 for CT/MR profile)"); cmd.addOption("--icon-file-prefix", "-Xi", 1, "[p]refix: string", "use PGM image 'prefix'+'dcmfile-in' as icon\n(default: create icon from DICOM image)"); cmd.addOption("--default-icon", "-Xd", 1, "[f]ilename: string", "use specified PGM image if icon cannot be\ncreated automatically (default: black image)"); #endif cmd.addGroup("output options:"); #ifdef BUILD_DCMGPDIR_AS_DCMMKDIR cmd.addSubGroup("profiles:"); cmd.addOption("--general-purpose", "-Pgp", "General Purpose Interchange on CD-R or\nDVD-RAM Media (STD-GEN-CD/DVD-RAM, default)"); cmd.addOption("--general-purpose-dvd", "-Pdv", "General Purpose DVD with Compression\nInterchange (STD-GEN-DVD-JPEG/J2K)"); cmd.addOption("--general-purpose-mime", "-Pmi", "General Purpose MIME Interchange\n(STD-GEN-MIME)"); cmd.addOption("--usb-and-flash", "-Pfl", "General Purpose USB/Flash Memory with Compr.\nInterchange (STD-GEN-USB/MMC/CF/SD-JPEG/J2K)"); cmd.addOption("--mpeg2-mpml-dvd", "-Pmp", "DVD Interchange with MPEG2 Main Profile @\nMain Level (STD-DVD-MPEG2-MPML)"); cmd.addOption("--basic-cardiac", "-Pbc", "Basic Cardiac X-Ray Angiographic Studies on\nCD-R Media (STD-XABC-CD)"); cmd.addOption("--xray-angiographic", "-Pxa", "1024 X-Ray Angiographic Studies on CD-R Media\n(STD-XA1K-CD)"); cmd.addOption("--xray-angiographic-dvd", "-Pxd", "1024 X-Ray Angiographic Studies on DVD Media\n(STD-XA1K-DVD)"); cmd.addOption("--dental-radiograph", "-Pde", "Dental Radiograph Interchange (STD-DEN-CD)"); cmd.addOption("--ct-and-mr", "-Pcm", "CT/MR Studies (STD-CTMR-xxxx)"); cmd.addOption("--ultrasound-id-sf", "-Pus", "Ultrasound Single Frame for Image Display\n(STD-US-ID-SF-xxxx)"); cmd.addOption("--ultrasound-sc-sf", "Ultrasound Single Frame with Spatial\nCalibration (STD-US-SC-SF-xxxx)"); cmd.addOption("--ultrasound-cc-sf", "Ultrasound Single Frame with Combined\nCalibration (STD-US-CC-SF-xxxx)"); cmd.addOption("--ultrasound-id-mf", "-Pum", "Ultrasound Single & Multi-Frame for Image\nDisplay (STD-US-ID-MF-xxxx)"); cmd.addOption("--ultrasound-sc-mf", "Ultrasound Single & Multi-Frame with Spatial\nCalibration (STD-UD-SC-MF-xxxx)"); cmd.addOption("--ultrasound-cc-mf", "Ultrasound Single & Multi-Frame with Combined\nCalibration (STD-UD-CC-MF-xxxx)"); cmd.addOption("--12-lead-ecg", "-Pec", "12-lead ECG Interchange on Diskette\n(STD-WVFM-ECG-FD)"); cmd.addOption("--hemodynamic-waveform", "-Phd", "Hemodynamic Waveform Interchange on Diskette\n(STD-WVFM-HD-FD)"); #endif cmd.addSubGroup("writing:"); cmd.addOption("--replace", "-A", "replace existing DICOMDIR (default)"); cmd.addOption("--append", "+A", "append to existing DICOMDIR"); cmd.addOption("--update", "+U", "update existing DICOMDIR"); cmd.addOption("--discard", "-w", "do not write out DICOMDIR"); cmd.addOption("--no-backup", "-nb", "do not create a backup of existing DICOMDIR"); cmd.addSubGroup("post-1993 value representations:"); cmd.addOption("--enable-new-vr", "+u", "enable support for new VRs (UN/UT) (default)"); cmd.addOption("--disable-new-vr", "-u", "disable support for new VRs, convert to OB"); cmd.addSubGroup("group length encoding:"); cmd.addOption("--group-length-remove", "-g", "write without group length elements (default)"); cmd.addOption("--group-length-create", "+g", "write with group length elements"); cmd.addSubGroup("length encoding in sequences and items:"); cmd.addOption("--length-explicit", "+e", "write with explicit lengths (default)"); cmd.addOption("--length-undefined", "-e", "write with undefined lengths"); /* evaluate command line */ prepareCmdLineArgs(argc, argv, OFFIS_CONSOLE_APPLICATION); if (app.parseCommandLine(cmd, argc, argv, OFCommandLine::PF_ExpandWildcards)) { /* print help text and exit */ if (cmd.getArgCount() == 0) app.printUsage(); /* check exclusive options first */ if (cmd.hasExclusiveOption()) { if (cmd.findOption("--version")) { app.printHeader(OFTrue /*print host identifier*/); COUT << OFendl << "External libraries used:"; #if !defined(WITH_ZLIB) && !defined(BUILD_DCMGPDIR_AS_DCMMKDIR) COUT << " none" << OFendl; #else COUT << OFendl; #endif #ifdef WITH_ZLIB COUT << "- ZLIB, Version " << zlibVersion() << OFendl; #endif #ifdef BUILD_DCMGPDIR_AS_DCMMKDIR COUT << "- " << DiJPEGPlugin::getLibraryVersionString() << OFendl; #endif return 0; } } /* general options */ OFLog::configureFromCommandLine(cmd, app); /* input options */ if (cmd.findOption("--output-file")) app.checkValue(cmd.getValue(opt_output)); if (cmd.findOption("--fileset-id")) app.checkValue(cmd.getValue(opt_fileset)); if (cmd.findOption("--descriptor")) app.checkValue(cmd.getValue(opt_descriptor)); if (cmd.findOption("--char-set")) app.checkValue(cmd.getValue(opt_charset)); if (cmd.findOption("--input-directory")) app.checkValue(cmd.getValue(opt_directory)); cmd.beginOptionBlock(); if (cmd.findOption("--keep-filenames")) ddir.enableMapFilenamesMode(OFFalse); if (cmd.findOption("--map-filenames")) ddir.enableMapFilenamesMode(OFTrue); cmd.endOptionBlock(); cmd.beginOptionBlock(); if (cmd.findOption("--no-recurse")) opt_recurse = OFFalse; if (cmd.findOption("--recurse")) { opt_recurse = OFTrue; if ((opt_directory == NULL) || (strlen(opt_directory) == 0)) opt_directory = "."; } cmd.endOptionBlock(); #ifdef PATTERN_MATCHING_AVAILABLE if (cmd.findOption("--pattern")) { app.checkDependence("--pattern", "--recurse", opt_recurse); app.checkValue(cmd.getValue(opt_pattern)); } #endif /* processing options */ cmd.beginOptionBlock(); if (cmd.findOption("--no-consistency-check")) ddir.disableConsistencyCheck(); if (cmd.findOption("--warn-inconsist-files")) ddir.enableAbortMode(OFFalse); if (cmd.findOption("--abort-inconsist-file")) ddir.enableAbortMode(OFTrue); cmd.endOptionBlock(); cmd.beginOptionBlock(); if (cmd.findOption("--strict")) ddir.enableInventMode(OFFalse); if (cmd.findOption("--invent")) ddir.enableInventMode(OFTrue); cmd.endOptionBlock(); if (cmd.findOption("--invent-patient-id")) ddir.enableInventPatientIDMode(); if (cmd.findOption("--allow-retired-sop")) ddir.enableRetiredSOPClassSupport(); if (cmd.findOption("--no-xfer-check")) ddir.disableTransferSyntaxCheck(); #ifdef BUILD_DCMGPDIR_AS_DCMMKDIR if (cmd.findOption("--no-encoding-check")) ddir.disableEncodingCheck(); if (cmd.findOption("--no-resolution-check")) ddir.disableResolutionCheck(); if (cmd.findOption("--add-icon-image")) ddir.enableIconImageMode(); if (cmd.findOption("--icon-image-size")) { OFCmdUnsignedInt iconSize = 0; app.checkValue(cmd.getValueAndCheckMinMax(iconSize, 1, 128)); ddir.setIconSize(OFstatic_cast(unsigned int, iconSize)); } if (cmd.findOption("--icon-file-prefix")) { const char *iconPrefix = NULL; app.checkValue(cmd.getValue(iconPrefix)); ddir.setIconPrefix(iconPrefix); } if (cmd.findOption("--default-icon")) { const char *defaultIcon = NULL; app.checkValue(cmd.getValue(defaultIcon)); ddir.setDefaultIcon(defaultIcon); } #endif /* output options */ #ifdef BUILD_DCMGPDIR_AS_DCMMKDIR cmd.beginOptionBlock(); if (cmd.findOption("--general-purpose")) opt_profile = DicomDirInterface::AP_GeneralPurpose; if (cmd.findOption("--general-purpose-dvd")) opt_profile = DicomDirInterface::AP_GeneralPurposeDVD; if (cmd.findOption("--general-purpose-mime")) opt_profile = DicomDirInterface::AP_GeneralPurposeMIME; if (cmd.findOption("--usb-and-flash")) opt_profile = DicomDirInterface::AP_USBandFlash; if (cmd.findOption("--mpeg2-mpml-dvd")) opt_profile = DicomDirInterface::AP_MPEG2MPatMLDVD; if (cmd.findOption("--basic-cardiac")) opt_profile = DicomDirInterface::AP_BasicCardiac; if (cmd.findOption("--xray-angiographic")) opt_profile = DicomDirInterface::AP_XrayAngiographic; if (cmd.findOption("--xray-angiographic-dvd")) opt_profile = DicomDirInterface::AP_XrayAngiographicDVD; if (cmd.findOption("--dental-radiograph")) opt_profile = DicomDirInterface::AP_DentalRadiograph; if (cmd.findOption("--ct-and-mr")) opt_profile = DicomDirInterface::AP_CTandMR; if (cmd.findOption("--ultrasound-id-sf")) opt_profile = DicomDirInterface::AP_UltrasoundIDSF; if (cmd.findOption("--ultrasound-sc-sf")) opt_profile = DicomDirInterface::AP_UltrasoundSCSF; if (cmd.findOption("--ultrasound-cc-sf")) opt_profile = DicomDirInterface::AP_UltrasoundCCSF; if (cmd.findOption("--ultrasound-id-mf")) opt_profile = DicomDirInterface::AP_UltrasoundIDMF; if (cmd.findOption("--ultrasound-sc-mf")) opt_profile = DicomDirInterface::AP_UltrasoundSCMF; if (cmd.findOption("--ultrasound-cc-mf")) opt_profile = DicomDirInterface::AP_UltrasoundCCMF; if (cmd.findOption("--12-lead-ecg")) opt_profile = DicomDirInterface::AP_TwelveLeadECG; if (cmd.findOption("--hemodynamic-waveform")) opt_profile = DicomDirInterface::AP_HemodynamicWaveform; cmd.endOptionBlock(); #endif cmd.beginOptionBlock(); if (cmd.findOption("--replace")) { opt_write = OFTrue; opt_append = OFFalse; opt_update = OFFalse; } if (cmd.findOption("--append")) { opt_write = OFTrue; opt_append = OFTrue; opt_update = OFFalse; } if (cmd.findOption("--update")) { opt_write = OFTrue; opt_append = OFFalse; opt_update = OFTrue; } if (cmd.findOption("--discard")) { opt_write = OFFalse; opt_append = OFFalse; opt_update = OFFalse; } cmd.endOptionBlock(); if (cmd.findOption("--no-backup")) ddir.disableBackupMode(); cmd.beginOptionBlock(); if (cmd.findOption("--enable-new-vr")) { dcmEnableUnknownVRGeneration.set(OFTrue); dcmEnableUnlimitedTextVRGeneration.set(OFTrue); } if (cmd.findOption("--disable-new-vr")) { dcmEnableUnknownVRGeneration.set(OFFalse); dcmEnableUnlimitedTextVRGeneration.set(OFFalse); } cmd.endOptionBlock(); cmd.beginOptionBlock(); if (cmd.findOption("--group-length-create")) opt_glenc = EGL_withGL; if (cmd.findOption("--group-length-remove")) opt_glenc = EGL_withoutGL; cmd.endOptionBlock(); cmd.beginOptionBlock(); if (cmd.findOption("--length-explicit")) opt_enctype = EET_ExplicitLength; if (cmd.findOption("--length-undefined")) opt_enctype = EET_UndefinedLength; cmd.endOptionBlock(); /* post check */ if ((opt_profile == DicomDirInterface::AP_BasicCardiac) || (opt_profile == DicomDirInterface::AP_XrayAngiographic) || (opt_profile == DicomDirInterface::AP_CTandMR)) { app.checkConflict("--icon-image-size", "--basic-cardiac, --xray-angiographic or --ct-and-mr", cmd.findOption("--icon-image-size")); } } /* print resource identifier */ OFLOG_DEBUG(dcmgpdirLogger, rcsid << OFendl); /* make sure data dictionary is loaded */ if (!dcmDataDict.isDictionaryLoaded()) { OFLOG_FATAL(dcmgpdirLogger, "no data dictionary loaded, check environment variable: " << DCM_DICT_ENVIRONMENT_VARIABLE); return 1; /* DcmDicomDir class dumps core when no data dictionary present */ } /* create list of input files */ OFList fileNames; OFString pathname; const char *param = NULL; const int count = cmd.getParamCount(); if (opt_recurse) OFLOG_INFO(dcmgpdirLogger, "determining input files ..."); /* no parameters? */ if (count == 0) { if (opt_recurse) OFStandard::searchDirectoryRecursively("", fileNames, opt_pattern, opt_directory); else { OFLOG_FATAL(dcmgpdirLogger, "missing parameter dcmfile-in"); return 1; } } else { /* iterate over all input filenames */ for (int i = 1; i <= count; i++) { cmd.getParam(i, param); /* add input directory */ OFStandard::combineDirAndFilename(pathname, opt_directory, param, OFTrue /*allowEmptyDirName*/); /* search directory recursively (if required) */ if (opt_recurse && OFStandard::dirExists(pathname)) OFStandard::searchDirectoryRecursively(param, fileNames, opt_pattern, opt_directory); else fileNames.push_back(param); } } /* check whether there are any input files */ if (fileNames.empty()) { OFLOG_FATAL(dcmgpdirLogger, "no input files: DICOMDIR not created"); return 1; } #ifdef BUILD_DCMGPDIR_AS_DCMMKDIR // add image support to DICOMDIR class DicomDirImageImplementation imagePlugin; ddir.addImageSupport(&imagePlugin); #endif OFCondition result; /* create new general purpose DICOMDIR, append to or update existing one */ if (opt_append) result = ddir.appendToDicomDir(opt_profile, opt_output); else if (opt_update) result = ddir.updateDicomDir(opt_profile, opt_output); else result = ddir.createNewDicomDir(opt_profile, opt_output, opt_fileset); if (result.good()) { /* set fileset descriptor and character set */ result = ddir.setFilesetDescriptor(opt_descriptor, opt_charset); if (result.good()) { /* collect 'bad' files */ OFList badFiles; unsigned int goodFiles = 0; OFListIterator(OFString) iter = fileNames.begin(); OFListIterator(OFString) last = fileNames.end(); /* iterate over all input filenames */ while ((iter != last) && result.good()) { /* add files to the DICOMDIR */ result = ddir.addDicomFile((*iter).c_str(), opt_directory); if (result.bad()) { badFiles.push_back(*iter); if (!ddir.abortMode()) { /* ignore inconsistent file, just warn (already done inside "ddir") */ result = EC_Normal; } } else ++goodFiles; ++iter; } /* evaluate result of file checking/adding procedure */ if (goodFiles == 0) { OFLOG_ERROR(dcmgpdirLogger, "no good files: DICOMDIR not created"); result = EC_IllegalCall; } else if (!badFiles.empty()) { OFOStringStream oss; oss << badFiles.size() << " file(s) cannot be added to DICOMDIR: "; iter = badFiles.begin(); last = badFiles.end(); while (iter != last) { oss << OFendl << " " << (*iter); ++iter; } oss << OFStringStream_ends; OFSTRINGSTREAM_GETSTR(oss, tmpString) OFLOG_WARN(dcmgpdirLogger, tmpString); OFSTRINGSTREAM_FREESTR(tmpString) } /* write DICOMDIR file */ if (result.good() && opt_write) result = ddir.writeDicomDir(opt_enctype, opt_glenc); } } #ifdef BUILD_DCMGPDIR_AS_DCMMKDIR // deregister global decompression codecs DcmRLEDecoderRegistration::cleanup(); DJDecoderRegistration::cleanup(); // enable the following lines for JPEG 2000 decompression support /* D2DecoderRegistration::cleanup(); D2JPEG2000Library::cleanup(); */ #endif #ifdef DEBUG dcmDataDict.clear(); /* useful for debugging with dmalloc */ #endif return result.status(); } /* * CVS/RCS Log: * $Log: dcmgpdir.cc,v $ * Revision 1.95 2010-10-14 13:13:30 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.94 2010-08-09 13:04:19 joergr * Updated data dictionary to 2009 edition of the DICOM standard. From now on, * the official "keyword" is used for the attribute name which results in a * number of minor changes (e.g. "PatientsName" is now called "PatientName"). * * Revision 1.93 2010-07-21 14:28:19 joergr * Enhanced check of input directory variable (also check for empty string). * * Revision 1.92 2010-07-21 13:29:48 joergr * Made sure that no NULL pointer is passed to the OFString constructor. This * occurred when option --recurse was used without --pattern, or option * --no-recurse was used without --input-directory. * * Revision 1.91 2010-03-23 15:17:24 joergr * Use printError() method for command line parsing errors only. After the * resource identifier has been printed to the log stream use "oflog" instead. * * Revision 1.90 2009-11-04 09:58:06 uli * Switched to logging mechanism provided by the "new" oflog module * * Revision 1.89 2009-04-21 14:02:49 joergr * Fixed minor inconsistencies in manpage / syntax usage. * * Revision 1.88 2009-01-15 10:15:23 joergr * Added support for optional JPEG 2000 decompression (currently uncommented). * * Revision 1.87 2008-09-25 14:38:48 joergr * Moved output of resource identifier in order to avoid printing the same * information twice. * * Revision 1.86 2008-09-25 11:19:48 joergr * Added support for printing the expanded command line arguments. * Always output the resource identifier of the command line tool in debug mode. * * Revision 1.85 2007/01/10 13:05:18 joergr * Added new option that enables support for retired SOP classes. * Re-ordered and re-structured command line options. * * Revision 1.84 2006/12/15 14:26:14 joergr * Added new option that allows to update existing entries in a DICOMDIR. This * also adds support for mixed media stored application profiles. * Fixed wrong spelling of command line option which prevented the MPEG2-DVD * application profile from working. * Changed name of enum value for the MPEG2-DVD application profile in order to * be more consistent with other names. * * Revision 1.83 2006/08/15 15:50:56 meichel * Updated all code in module dcmdata to correctly compile when * all standard C++ classes remain in namespace std. * * Revision 1.82 2006/07/27 13:52:42 joergr * Changed parameter "exclusive" of method addOption() from type OFBool into an * integer parameter "flags". Prepended prefix "PF_" to parseLine() flags. * Option "--help" is no longer an exclusive option by default. * * Revision 1.81 2005/12/08 15:40:48 meichel * Changed include path schema for all DCMTK header files * * Revision 1.80 2005/11/28 15:28:54 meichel * File dcdebug.h is not included by any other header file in the toolkit * anymore, to minimize the risk of name clashes of macro debug(). * * Revision 1.79 2005/06/13 14:36:07 joergr * Added new options to disable check on pixel encoding and transfer syntax. * * Revision 1.78 2005/03/09 17:56:20 joergr * Added support for new Media Storage Application Profiles according to DICOM * PS 3.12-2004. Removed support for non-standard conformant "No profile". * * Revision 1.77 2004/05/06 16:37:47 joergr * Added typecasts to keep Sun CC 2.0.1 quiet. * * Revision 1.76 2004/01/16 10:52:58 joergr * Removed acknowledgements with e-mail addresses from CVS log. * * Revision 1.75 2003/08/12 15:22:05 joergr * Replaced call of OFCommandLine::getValueAndCheckMin() by OFCommandLine:: * getValueAndCheckMinMax() - warning reported by MSVC 5. * * Revision 1.74 2003/08/12 14:34:00 joergr * Adapted implementation to use new DICOMDIR class. Added new command line * options (e.g. --input-directory or --pattern). * * Revision 1.73 2003/05/20 08:50:19 joergr * Added support for SOP Class "Chest CAD SR" (Supplement 65). * * Revision 1.72 2003/03/12 17:32:38 meichel * Updated DcmObject::print() flags * * Revision 1.71 2002/11/27 12:07:17 meichel * Adapted module dcmdata to use of new header file ofstdinc.h * * Revision 1.70 2002/11/26 14:03:02 joergr * Numerous code purifications, e.g. made local functions "static". * * Revision 1.69 2002/11/26 08:43:00 meichel * Replaced all includes for "zlib.h" with * to avoid inclusion of zlib.h in the makefile dependencies. * * Revision 1.68 2002/11/04 16:39:18 joergr * Added new command line option preventing the creation of a backup of an * existing DICOMDIR. * * Revision 1.67 2002/09/23 17:52:03 joergr * Prepared code for future support of 'config.guess' host identifiers. * * Revision 1.66 2002/09/23 13:50:41 joergr * Added new command line option "--version" which prints the name and version * number of external libraries used. * * Revision 1.65 2002/08/21 10:14:15 meichel * Adapted code to new loadFile and saveFile methods, thus removing direct * use of the DICOM stream classes. * * Revision 1.64 2002/08/13 09:56:44 joergr * Added new profile (NONE) based on STD-GEN-xxxx which allows DICOM objects * of any transfer syntax to be referenced from a DICOMDIR. NB: there's no * equivilent application profile in the DICOM standard. * * Revision 1.63 2002/07/11 16:08:26 joergr * Added support for CT/MR application profile. Added general support for * monochrome icon images. * Added new command line flags to handle inconsistent header information * (patient ID and name). * * Revision 1.62 2002/07/02 16:52:14 joergr * Minor fixes to keep MSVC6 quiet. * * Revision 1.61 2002/07/02 16:16:16 joergr * Added support for ultrasound and waveform media storage application profiles. * Added Mammography CAD SR to the list of supported SOP classes. * * Revision 1.60 2002/04/16 13:38:54 joergr * Added configurable support for C++ ANSI standard includes (e.g. streams). * * Revision 1.59 2002/04/11 12:35:54 joergr * Replaced direct call of system routines by new standard date and time * functions. * Use the new standard file system routines like fileExists() etc. * * Revision 1.58 2001/12/06 14:03:16 joergr * Minor "stylistic" changes. * * Revision 1.57 2001/11/29 16:51:45 joergr * Added new command line option to dcmmkdir that allows to ignore non-standard * conformant spatial resolutions for images (e.g. images larger than 1024*1024 * for the cardiac profiles). * * Revision 1.56 2001/11/19 17:53:36 joergr * Implemented performance optimization for the generation of icon images of * compressed multi-frame images. * * Revision 1.55 2001/11/19 12:43:17 joergr * Re-added dcmgpdir tool to dcmdata module. * * Revision 1.1 2001/11/13 17:57:14 joergr * Replaced utility dcmgpdir with dcmmkdir which supports other Media Storage * Application Profiles in addition to the General Purpose one. * * */ dcmtk-3.6.0/dcmdata/apps/dcmftest.cc0000644000310500011400000001341011455600772016525 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Andrew Hewett * * Purpose: Test if a file uses DICOM Part 10 format. * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:13:30 $ * CVS/RCS Revision: $Revision: 1.22 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #define INCLUDE_CSTDLIB #define INCLUDE_CSTDIO #define INCLUDE_CSTRING #define INCLUDE_LIBC #define INCLUDE_UNISTD #include "dcmtk/ofstd/ofstdinc.h" #include "dcmtk/dcmdata/dcmetinf.h" #include "dcmtk/ofstd/ofconapp.h" #include "dcmtk/dcmdata/dcuid.h" /* for dcmtk version name */ #define OFFIS_CONSOLE_APPLICATION "dcmftest" static char rcsid[] = "$dcmtk: " OFFIS_CONSOLE_APPLICATION " v" OFFIS_DCMTK_VERSION " " OFFIS_DCMTK_RELEASEDATE " $"; // ******************************************** int main(int argc, char *argv[]) { OFConsoleApplication app(OFFIS_CONSOLE_APPLICATION , "Test if file uses DICOM part 10 format", rcsid); OFCommandLine cmd; /* evaluate command line */ cmd.addParam("file", OFCmdParam::PM_MultiMandatory); app.parseCommandLine(cmd, argc, argv, OFCommandLine::PF_ExpandWildcards); int badCount = 0; int count = cmd.getParamCount(); const char *fname = NULL; for (int i=1; i<=count; i++) { cmd.getParam(i, fname); OFBool ok = OFFalse; FILE* f = NULL; if (fname && (strlen(fname) > 0)) f = fopen(fname, "rb"); if (f == 0) { ok = OFFalse; } else { char signature[4]; if ((fseek(f, DCM_PreambleLen, SEEK_SET) < 0) || (fread(signature, 1, DCM_MagicLen, f) != DCM_MagicLen)) { ok = OFFalse; } else if (strncmp(signature, DCM_Magic, DCM_MagicLen) != 0) { ok = OFFalse; } else { /* looks ok */ ok = OFTrue; } fclose(f); } if (ok) { COUT << "yes: " << fname << OFendl; } else { COUT << "no: " << fname << OFendl; badCount++; } } /* ** if all files are ok then return zero, otherwise the ** number of non-dicom files. */ return badCount; } /* ** CVS/RCS Log: ** $Log: dcmftest.cc,v $ ** Revision 1.22 2010-10-14 13:13:30 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.21 2009-11-04 09:58:06 uli ** Switched to logging mechanism provided by the "new" oflog module ** ** Revision 1.20 2006-08-15 15:50:56 meichel ** Updated all code in module dcmdata to correctly compile when ** all standard C++ classes remain in namespace std. ** ** Revision 1.19 2006/07/27 13:34:18 joergr ** Prepended prefix "PF_" to parseLine() flags. ** ** Revision 1.18 2005/12/08 15:40:47 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.17 2004/08/03 11:41:04 meichel ** Headers libc.h and unistd.h are now included via ofstdinc.h ** ** Revision 1.16 2003/11/13 10:53:26 joergr ** Made help text consistent with revised man page. Replaced tabs by spaces. ** ** Revision 1.15 2002/11/27 12:07:17 meichel ** Adapted module dcmdata to use of new header file ofstdinc.h ** ** Revision 1.14 2001/06/01 15:48:28 meichel ** Updated copyright header ** ** Revision 1.13 2000/03/08 16:26:05 meichel ** Updated copyright header. ** ** Revision 1.12 2000/03/03 14:05:15 meichel ** Implemented library support for redirecting error messages into memory ** instead of printing them to stdout/stderr for GUI applications. ** ** Revision 1.11 2000/02/23 15:11:32 meichel ** Corrected macro for Borland C++ Builder 4 workaround. ** ** Revision 1.10 2000/02/01 10:11:57 meichel ** Avoiding to include as extern "C" on Borland C++ Builder 4, ** workaround for bug in compiler header files. ** ** Revision 1.9 1999/04/27 17:50:50 joergr ** Adapted console applications to new OFCommandLine and OFConsoleApplication ** functionality. ** ** Revision 1.8 1999/04/27 12:23:24 meichel ** Prevented dcmdata applications from opening a file with empty filename, ** leads to application crash on Win32. ** ** Revision 1.7 1999/03/31 09:24:19 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.6 1999/03/29 10:14:13 meichel ** Adapted command line options of dcmdata applications to new scheme. ** ** Revision 1.5 1997/08/06 12:20:01 andreas ** - Using Windows NT with Visual C++ 4.x the standard open mode for files ** is TEXT with conversions. For binary files (image files, imagectn database ** index) this must be changed (e.g. fopen(filename, "...b"); or ** open(filename, ..... |O_BINARY);) ** ** Revision 1.4 1997/07/21 08:25:00 andreas ** - Replace all boolean types (BOOLEAN, CTNBOOLEAN, DICOM_BOOL, BOOL) ** with one unique boolean type OFBool. ** ** Revision 1.3 1997/05/29 17:16:38 meichel ** dcmftest.cc now includes if available. Needed for SunOS. ** ** Revision 1.2 1997/05/29 15:52:51 meichel ** Added constant for dcmtk release date in dcuid.h. ** All dcmtk applications now contain a version string ** which is displayed with the command line options ("usage" message) ** and which can be queried in the binary with the "ident" command. ** ** Revision 1.1 1997/05/06 11:53:07 hewett ** Added program (dcmftest) to test if a file uses the DICOM Part 10 ** Format. The program terminates with exit code 0 if file looks ** Part 10 conform. This program is useful in Unix shell scripts. ** */ dcmtk-3.6.0/dcmdata/apps/Makefile.in0000644000310500011400000000540011274250055016444 0ustar joergrdicom3# # Makefile for dcmdata/apps # @SET_MAKE@ SHELL = /bin/sh VPATH = @srcdir@:@top_srcdir@/include:@top_srcdir@/@configdir@/include srcdir = @srcdir@ top_srcdir = @top_srcdir@ configdir = @top_srcdir@/@configdir@ include $(configdir)/@common_makefile@ ofstddir = $(top_srcdir)/../ofstd oflogdir = $(top_srcdir)/../oflog LOCALINCLUDES = -I$(ofstddir)/include -I$(oflogdir)/include LIBDIRS = -L$(top_srcdir)/libi2d -L$(top_srcdir)/libsrc -L$(ofstddir)/libsrc -L$(oflogdir)/libsrc LOCALLIBS = -ldcmdata -loflog -lofstd $(ZLIBLIBS) LIBI2D = -li2d objs = dcmftest.o dcmconv.o dcmdump.o dump2dcm.o dcmgpdir.o dcm2xml.o \ xml2dcm.o dcmcrle.o dcmdrle.o dcmodify.o mdfdsman.o mdfconen.o \ pdf2dcm.o dcm2pdf.o img2dcm.o progs = dcmftest dcmconv dcmdump dump2dcm dcmgpdir dcm2xml xml2dcm dcmcrle \ dcmdrle dcmodify pdf2dcm dcm2pdf img2dcm all: $(progs) # Note: dcmftest does not need LOCALLIBS on most platforms, but on OSF1 it is required. dcmftest: dcmftest.o $(CXX) $(CXXFLAGS) $(LDFLAGS) $(LIBDIRS) -o $@ $@.o $(LOCALLIBS) $(MATHLIBS) $(LIBS) dcmconv: dcmconv.o $(CXX) $(CXXFLAGS) $(LDFLAGS) $(LIBDIRS) -o $@ $@.o $(LOCALLIBS) $(MATHLIBS) $(LIBS) dcmdump: dcmdump.o $(CXX) $(CXXFLAGS) $(LDFLAGS) $(LIBDIRS) -o $@ $@.o $(LOCALLIBS) $(MATHLIBS) $(LIBS) dump2dcm: dump2dcm.o $(CXX) $(CXXFLAGS) $(LDFLAGS) $(LIBDIRS) -o $@ $@.o $(LOCALLIBS) $(MATHLIBS) $(LIBS) dcmgpdir: dcmgpdir.o $(CXX) $(CXXFLAGS) $(LDFLAGS) $(LIBDIRS) -o $@ $@.o $(LOCALLIBS) $(MATHLIBS) $(LIBS) dcmcrle: dcmcrle.o $(CXX) $(CXXFLAGS) $(LDFLAGS) $(LIBDIRS) -o $@ $@.o $(LOCALLIBS) $(MATHLIBS) $(LIBS) dcmdrle: dcmdrle.o $(CXX) $(CXXFLAGS) $(LDFLAGS) $(LIBDIRS) -o $@ $@.o $(LOCALLIBS) $(MATHLIBS) $(LIBS) dcm2xml: dcm2xml.o $(CXX) $(CXXFLAGS) $(LDFLAGS) $(LIBDIRS) -o $@ $@.o $(LOCALLIBS) $(MATHLIBS) $(LIBS) xml2dcm: xml2dcm.o $(CXX) $(CXXFLAGS) $(LDFLAGS) $(LIBDIRS) -o $@ $@.o $(XMLLIBS) $(LOCALLIBS) $(MATHLIBS) $(LIBS) dcmodify: dcmodify.o mdfconen.o mdfdsman.o $(CXX) $(CXXFLAGS) $(LDFLAGS) $(LIBDIRS) -o $@ $@.o mdfconen.o mdfdsman.o $(LOCALLIBS) $(MATHLIBS) $(LIBS) pdf2dcm: pdf2dcm.o $(CXX) $(CXXFLAGS) $(LDFLAGS) $(LIBDIRS) -o $@ $@.o $(LOCALLIBS) $(MATHLIBS) $(LIBS) dcm2pdf: dcm2pdf.o $(CXX) $(CXXFLAGS) $(LDFLAGS) $(LIBDIRS) -o $@ $@.o $(LOCALLIBS) $(MATHLIBS) $(LIBS) img2dcm: img2dcm.o $(CXX) $(CXXFLAGS) $(LDFLAGS) $(LIBDIRS) -o $@ $@.o $(LIBI2D) $(LOCALLIBS) $(MATHLIBS) $(LIBS) install: install-bin install-bin: all $(configdir)/mkinstalldirs $(DESTDIR)$(bindir) for prog in $(progs); do \ $(INSTALL_PROGRAM) $$prog$(BINEXT) $(DESTDIR)$(bindir) && strip $(DESTDIR)$(bindir)/$$prog$(BINEXT) ;\ done clean: rm -f $(objs) $(progs) $(TRASH) distclean: rm -f $(objs) $(progs) $(DISTTRASH) dependencies: $(CXX) -MM $(defines) $(includes) $(CPPFLAGS) $(CXXFLAGS) *.cc > $(DEP) include $(DEP) dcmtk-3.6.0/dcmdata/apps/Makefile.dep0000644000310500011400000025101311461766742016626 0ustar joergrdicom3dcm2pdf.o: dcm2pdf.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dctk.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcswap.h ../include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dcvr.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../include/dcmtk/dcmdata/dcistrma.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcostrma.h ../include/dcmtk/dcmdata/dcuid.h \ ../include/dcmtk/dcmdata/dcvm.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h \ ../include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmdata/dctag.h ../include/dcmtk/dcmdata/dcdicent.h \ ../include/dcmtk/dcmdata/dchashdi.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../include/dcmtk/dcmdata/dcdict.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../include/dcmtk/dcmdata/dcdeftag.h ../include/dcmtk/dcmdata/dcobject.h \ ../include/dcmtk/dcmdata/dcstack.h ../include/dcmtk/dcmdata/dcelem.h \ ../include/dcmtk/dcmdata/dcitem.h ../include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../include/dcmtk/dcmdata/dcpcache.h ../include/dcmtk/dcmdata/dcmetinf.h \ ../include/dcmtk/dcmdata/dcdatset.h ../include/dcmtk/dcmdata/dcsequen.h \ ../include/dcmtk/dcmdata/dcfilefo.h ../include/dcmtk/dcmdata/dcdicdir.h \ ../include/dcmtk/dcmdata/dcdirrec.h ../include/dcmtk/dcmdata/dcvrulup.h \ ../include/dcmtk/dcmdata/dcvrul.h ../include/dcmtk/dcmdata/dcpixseq.h \ ../include/dcmtk/dcmdata/dcofsetl.h ../include/dcmtk/dcmdata/dcbytstr.h \ ../include/dcmtk/dcmdata/dcvrae.h ../include/dcmtk/dcmdata/dcvras.h \ ../include/dcmtk/dcmdata/dcvrcs.h ../include/dcmtk/dcmdata/dcvrda.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../include/dcmtk/dcmdata/dcvrds.h \ ../../ofstd/include/dcmtk/ofstd/ofvector.h \ ../include/dcmtk/dcmdata/dcvrdt.h \ ../../ofstd/include/dcmtk/ofstd/ofdatime.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../include/dcmtk/dcmdata/dcvris.h ../include/dcmtk/dcmdata/dcvrtm.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../include/dcmtk/dcmdata/dcvrui.h ../include/dcmtk/dcmdata/dcchrstr.h \ ../include/dcmtk/dcmdata/dcvrlo.h ../include/dcmtk/dcmdata/dcvrlt.h \ ../include/dcmtk/dcmdata/dcvrpn.h ../include/dcmtk/dcmdata/dcvrsh.h \ ../include/dcmtk/dcmdata/dcvrst.h ../include/dcmtk/dcmdata/dcvrut.h \ ../include/dcmtk/dcmdata/dcvrobow.h ../include/dcmtk/dcmdata/dcpixel.h \ ../include/dcmtk/dcmdata/dcvrpobw.h ../include/dcmtk/dcmdata/dcovlay.h \ ../include/dcmtk/dcmdata/dcvrat.h ../include/dcmtk/dcmdata/dcvrss.h \ ../include/dcmtk/dcmdata/dcvrus.h ../include/dcmtk/dcmdata/dcvrsl.h \ ../include/dcmtk/dcmdata/dcvrfl.h ../include/dcmtk/dcmdata/dcvrfd.h \ ../include/dcmtk/dcmdata/dcvrof.h ../include/dcmtk/dcmdata/cmdlnarg.h \ ../include/dcmtk/dcmdata/cmdlnarg.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../include/dcmtk/dcmdata/dcuid.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../include/dcmtk/dcmdata/dcistrmz.h dcm2xml.o: dcm2xml.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmdata/dctk.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcswap.h ../include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dcvr.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../include/dcmtk/dcmdata/dcistrma.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcostrma.h ../include/dcmtk/dcmdata/dcuid.h \ ../include/dcmtk/dcmdata/dcvm.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h \ ../include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmdata/dctag.h ../include/dcmtk/dcmdata/dcdicent.h \ ../include/dcmtk/dcmdata/dchashdi.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../include/dcmtk/dcmdata/dcdict.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../include/dcmtk/dcmdata/dcdeftag.h ../include/dcmtk/dcmdata/dcobject.h \ ../include/dcmtk/dcmdata/dcstack.h ../include/dcmtk/dcmdata/dcelem.h \ ../include/dcmtk/dcmdata/dcitem.h ../include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../include/dcmtk/dcmdata/dcpcache.h ../include/dcmtk/dcmdata/dcmetinf.h \ ../include/dcmtk/dcmdata/dcdatset.h ../include/dcmtk/dcmdata/dcsequen.h \ ../include/dcmtk/dcmdata/dcfilefo.h ../include/dcmtk/dcmdata/dcdicdir.h \ ../include/dcmtk/dcmdata/dcdirrec.h ../include/dcmtk/dcmdata/dcvrulup.h \ ../include/dcmtk/dcmdata/dcvrul.h ../include/dcmtk/dcmdata/dcpixseq.h \ ../include/dcmtk/dcmdata/dcofsetl.h ../include/dcmtk/dcmdata/dcbytstr.h \ ../include/dcmtk/dcmdata/dcvrae.h ../include/dcmtk/dcmdata/dcvras.h \ ../include/dcmtk/dcmdata/dcvrcs.h ../include/dcmtk/dcmdata/dcvrda.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../include/dcmtk/dcmdata/dcvrds.h \ ../../ofstd/include/dcmtk/ofstd/ofvector.h \ ../include/dcmtk/dcmdata/dcvrdt.h \ ../../ofstd/include/dcmtk/ofstd/ofdatime.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../include/dcmtk/dcmdata/dcvris.h ../include/dcmtk/dcmdata/dcvrtm.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../include/dcmtk/dcmdata/dcvrui.h ../include/dcmtk/dcmdata/dcchrstr.h \ ../include/dcmtk/dcmdata/dcvrlo.h ../include/dcmtk/dcmdata/dcvrlt.h \ ../include/dcmtk/dcmdata/dcvrpn.h ../include/dcmtk/dcmdata/dcvrsh.h \ ../include/dcmtk/dcmdata/dcvrst.h ../include/dcmtk/dcmdata/dcvrut.h \ ../include/dcmtk/dcmdata/dcvrobow.h ../include/dcmtk/dcmdata/dcpixel.h \ ../include/dcmtk/dcmdata/dcvrpobw.h ../include/dcmtk/dcmdata/dcovlay.h \ ../include/dcmtk/dcmdata/dcvrat.h ../include/dcmtk/dcmdata/dcvrss.h \ ../include/dcmtk/dcmdata/dcvrus.h ../include/dcmtk/dcmdata/dcvrsl.h \ ../include/dcmtk/dcmdata/dcvrfl.h ../include/dcmtk/dcmdata/dcvrfd.h \ ../include/dcmtk/dcmdata/dcvrof.h ../include/dcmtk/dcmdata/cmdlnarg.h \ ../include/dcmtk/dcmdata/cmdlnarg.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h dcmconv.o: dcmconv.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dctk.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcswap.h ../include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dcvr.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../include/dcmtk/dcmdata/dcistrma.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcostrma.h ../include/dcmtk/dcmdata/dcuid.h \ ../include/dcmtk/dcmdata/dcvm.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h \ ../include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmdata/dctag.h ../include/dcmtk/dcmdata/dcdicent.h \ ../include/dcmtk/dcmdata/dchashdi.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../include/dcmtk/dcmdata/dcdict.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../include/dcmtk/dcmdata/dcdeftag.h ../include/dcmtk/dcmdata/dcobject.h \ ../include/dcmtk/dcmdata/dcstack.h ../include/dcmtk/dcmdata/dcelem.h \ ../include/dcmtk/dcmdata/dcitem.h ../include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../include/dcmtk/dcmdata/dcpcache.h ../include/dcmtk/dcmdata/dcmetinf.h \ ../include/dcmtk/dcmdata/dcdatset.h ../include/dcmtk/dcmdata/dcsequen.h \ ../include/dcmtk/dcmdata/dcfilefo.h ../include/dcmtk/dcmdata/dcdicdir.h \ ../include/dcmtk/dcmdata/dcdirrec.h ../include/dcmtk/dcmdata/dcvrulup.h \ ../include/dcmtk/dcmdata/dcvrul.h ../include/dcmtk/dcmdata/dcpixseq.h \ ../include/dcmtk/dcmdata/dcofsetl.h ../include/dcmtk/dcmdata/dcbytstr.h \ ../include/dcmtk/dcmdata/dcvrae.h ../include/dcmtk/dcmdata/dcvras.h \ ../include/dcmtk/dcmdata/dcvrcs.h ../include/dcmtk/dcmdata/dcvrda.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../include/dcmtk/dcmdata/dcvrds.h \ ../../ofstd/include/dcmtk/ofstd/ofvector.h \ ../include/dcmtk/dcmdata/dcvrdt.h \ ../../ofstd/include/dcmtk/ofstd/ofdatime.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../include/dcmtk/dcmdata/dcvris.h ../include/dcmtk/dcmdata/dcvrtm.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../include/dcmtk/dcmdata/dcvrui.h ../include/dcmtk/dcmdata/dcchrstr.h \ ../include/dcmtk/dcmdata/dcvrlo.h ../include/dcmtk/dcmdata/dcvrlt.h \ ../include/dcmtk/dcmdata/dcvrpn.h ../include/dcmtk/dcmdata/dcvrsh.h \ ../include/dcmtk/dcmdata/dcvrst.h ../include/dcmtk/dcmdata/dcvrut.h \ ../include/dcmtk/dcmdata/dcvrobow.h ../include/dcmtk/dcmdata/dcpixel.h \ ../include/dcmtk/dcmdata/dcvrpobw.h ../include/dcmtk/dcmdata/dcovlay.h \ ../include/dcmtk/dcmdata/dcvrat.h ../include/dcmtk/dcmdata/dcvrss.h \ ../include/dcmtk/dcmdata/dcvrus.h ../include/dcmtk/dcmdata/dcvrsl.h \ ../include/dcmtk/dcmdata/dcvrfl.h ../include/dcmtk/dcmdata/dcvrfd.h \ ../include/dcmtk/dcmdata/dcvrof.h ../include/dcmtk/dcmdata/cmdlnarg.h \ ../include/dcmtk/dcmdata/cmdlnarg.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../include/dcmtk/dcmdata/dcuid.h ../include/dcmtk/dcmdata/dcostrmz.h \ ../include/dcmtk/dcmdata/dcistrmz.h dcmcrle.o: dcmcrle.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dctk.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcswap.h ../include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dcvr.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../include/dcmtk/dcmdata/dcistrma.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcostrma.h ../include/dcmtk/dcmdata/dcuid.h \ ../include/dcmtk/dcmdata/dcvm.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h \ ../include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmdata/dctag.h ../include/dcmtk/dcmdata/dcdicent.h \ ../include/dcmtk/dcmdata/dchashdi.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../include/dcmtk/dcmdata/dcdict.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../include/dcmtk/dcmdata/dcdeftag.h ../include/dcmtk/dcmdata/dcobject.h \ ../include/dcmtk/dcmdata/dcstack.h ../include/dcmtk/dcmdata/dcelem.h \ ../include/dcmtk/dcmdata/dcitem.h ../include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../include/dcmtk/dcmdata/dcpcache.h ../include/dcmtk/dcmdata/dcmetinf.h \ ../include/dcmtk/dcmdata/dcdatset.h ../include/dcmtk/dcmdata/dcsequen.h \ ../include/dcmtk/dcmdata/dcfilefo.h ../include/dcmtk/dcmdata/dcdicdir.h \ ../include/dcmtk/dcmdata/dcdirrec.h ../include/dcmtk/dcmdata/dcvrulup.h \ ../include/dcmtk/dcmdata/dcvrul.h ../include/dcmtk/dcmdata/dcpixseq.h \ ../include/dcmtk/dcmdata/dcofsetl.h ../include/dcmtk/dcmdata/dcbytstr.h \ ../include/dcmtk/dcmdata/dcvrae.h ../include/dcmtk/dcmdata/dcvras.h \ ../include/dcmtk/dcmdata/dcvrcs.h ../include/dcmtk/dcmdata/dcvrda.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../include/dcmtk/dcmdata/dcvrds.h \ ../../ofstd/include/dcmtk/ofstd/ofvector.h \ ../include/dcmtk/dcmdata/dcvrdt.h \ ../../ofstd/include/dcmtk/ofstd/ofdatime.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../include/dcmtk/dcmdata/dcvris.h ../include/dcmtk/dcmdata/dcvrtm.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../include/dcmtk/dcmdata/dcvrui.h ../include/dcmtk/dcmdata/dcchrstr.h \ ../include/dcmtk/dcmdata/dcvrlo.h ../include/dcmtk/dcmdata/dcvrlt.h \ ../include/dcmtk/dcmdata/dcvrpn.h ../include/dcmtk/dcmdata/dcvrsh.h \ ../include/dcmtk/dcmdata/dcvrst.h ../include/dcmtk/dcmdata/dcvrut.h \ ../include/dcmtk/dcmdata/dcvrobow.h ../include/dcmtk/dcmdata/dcpixel.h \ ../include/dcmtk/dcmdata/dcvrpobw.h ../include/dcmtk/dcmdata/dcovlay.h \ ../include/dcmtk/dcmdata/dcvrat.h ../include/dcmtk/dcmdata/dcvrss.h \ ../include/dcmtk/dcmdata/dcvrus.h ../include/dcmtk/dcmdata/dcvrsl.h \ ../include/dcmtk/dcmdata/dcvrfl.h ../include/dcmtk/dcmdata/dcvrfd.h \ ../include/dcmtk/dcmdata/dcvrof.h ../include/dcmtk/dcmdata/cmdlnarg.h \ ../include/dcmtk/dcmdata/cmdlnarg.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../include/dcmtk/dcmdata/dcuid.h ../include/dcmtk/dcmdata/dcrleerg.h dcmdrle.o: dcmdrle.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dctk.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcswap.h ../include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dcvr.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../include/dcmtk/dcmdata/dcistrma.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcostrma.h ../include/dcmtk/dcmdata/dcuid.h \ ../include/dcmtk/dcmdata/dcvm.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h \ ../include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmdata/dctag.h ../include/dcmtk/dcmdata/dcdicent.h \ ../include/dcmtk/dcmdata/dchashdi.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../include/dcmtk/dcmdata/dcdict.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../include/dcmtk/dcmdata/dcdeftag.h ../include/dcmtk/dcmdata/dcobject.h \ ../include/dcmtk/dcmdata/dcstack.h ../include/dcmtk/dcmdata/dcelem.h \ ../include/dcmtk/dcmdata/dcitem.h ../include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../include/dcmtk/dcmdata/dcpcache.h ../include/dcmtk/dcmdata/dcmetinf.h \ ../include/dcmtk/dcmdata/dcdatset.h ../include/dcmtk/dcmdata/dcsequen.h \ ../include/dcmtk/dcmdata/dcfilefo.h ../include/dcmtk/dcmdata/dcdicdir.h \ ../include/dcmtk/dcmdata/dcdirrec.h ../include/dcmtk/dcmdata/dcvrulup.h \ ../include/dcmtk/dcmdata/dcvrul.h ../include/dcmtk/dcmdata/dcpixseq.h \ ../include/dcmtk/dcmdata/dcofsetl.h ../include/dcmtk/dcmdata/dcbytstr.h \ ../include/dcmtk/dcmdata/dcvrae.h ../include/dcmtk/dcmdata/dcvras.h \ ../include/dcmtk/dcmdata/dcvrcs.h ../include/dcmtk/dcmdata/dcvrda.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../include/dcmtk/dcmdata/dcvrds.h \ ../../ofstd/include/dcmtk/ofstd/ofvector.h \ ../include/dcmtk/dcmdata/dcvrdt.h \ ../../ofstd/include/dcmtk/ofstd/ofdatime.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../include/dcmtk/dcmdata/dcvris.h ../include/dcmtk/dcmdata/dcvrtm.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../include/dcmtk/dcmdata/dcvrui.h ../include/dcmtk/dcmdata/dcchrstr.h \ ../include/dcmtk/dcmdata/dcvrlo.h ../include/dcmtk/dcmdata/dcvrlt.h \ ../include/dcmtk/dcmdata/dcvrpn.h ../include/dcmtk/dcmdata/dcvrsh.h \ ../include/dcmtk/dcmdata/dcvrst.h ../include/dcmtk/dcmdata/dcvrut.h \ ../include/dcmtk/dcmdata/dcvrobow.h ../include/dcmtk/dcmdata/dcpixel.h \ ../include/dcmtk/dcmdata/dcvrpobw.h ../include/dcmtk/dcmdata/dcovlay.h \ ../include/dcmtk/dcmdata/dcvrat.h ../include/dcmtk/dcmdata/dcvrss.h \ ../include/dcmtk/dcmdata/dcvrus.h ../include/dcmtk/dcmdata/dcvrsl.h \ ../include/dcmtk/dcmdata/dcvrfl.h ../include/dcmtk/dcmdata/dcvrfd.h \ ../include/dcmtk/dcmdata/dcvrof.h ../include/dcmtk/dcmdata/cmdlnarg.h \ ../include/dcmtk/dcmdata/cmdlnarg.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../include/dcmtk/dcmdata/dcuid.h ../include/dcmtk/dcmdata/dcrledrg.h dcmdump.o: dcmdump.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dctk.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcswap.h ../include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dcvr.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../include/dcmtk/dcmdata/dcistrma.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcostrma.h ../include/dcmtk/dcmdata/dcuid.h \ ../include/dcmtk/dcmdata/dcvm.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h \ ../include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmdata/dctag.h ../include/dcmtk/dcmdata/dcdicent.h \ ../include/dcmtk/dcmdata/dchashdi.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../include/dcmtk/dcmdata/dcdict.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../include/dcmtk/dcmdata/dcdeftag.h ../include/dcmtk/dcmdata/dcobject.h \ ../include/dcmtk/dcmdata/dcstack.h ../include/dcmtk/dcmdata/dcelem.h \ ../include/dcmtk/dcmdata/dcitem.h ../include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../include/dcmtk/dcmdata/dcpcache.h ../include/dcmtk/dcmdata/dcmetinf.h \ ../include/dcmtk/dcmdata/dcdatset.h ../include/dcmtk/dcmdata/dcsequen.h \ ../include/dcmtk/dcmdata/dcfilefo.h ../include/dcmtk/dcmdata/dcdicdir.h \ ../include/dcmtk/dcmdata/dcdirrec.h ../include/dcmtk/dcmdata/dcvrulup.h \ ../include/dcmtk/dcmdata/dcvrul.h ../include/dcmtk/dcmdata/dcpixseq.h \ ../include/dcmtk/dcmdata/dcofsetl.h ../include/dcmtk/dcmdata/dcbytstr.h \ ../include/dcmtk/dcmdata/dcvrae.h ../include/dcmtk/dcmdata/dcvras.h \ ../include/dcmtk/dcmdata/dcvrcs.h ../include/dcmtk/dcmdata/dcvrda.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../include/dcmtk/dcmdata/dcvrds.h \ ../../ofstd/include/dcmtk/ofstd/ofvector.h \ ../include/dcmtk/dcmdata/dcvrdt.h \ ../../ofstd/include/dcmtk/ofstd/ofdatime.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../include/dcmtk/dcmdata/dcvris.h ../include/dcmtk/dcmdata/dcvrtm.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../include/dcmtk/dcmdata/dcvrui.h ../include/dcmtk/dcmdata/dcchrstr.h \ ../include/dcmtk/dcmdata/dcvrlo.h ../include/dcmtk/dcmdata/dcvrlt.h \ ../include/dcmtk/dcmdata/dcvrpn.h ../include/dcmtk/dcmdata/dcvrsh.h \ ../include/dcmtk/dcmdata/dcvrst.h ../include/dcmtk/dcmdata/dcvrut.h \ ../include/dcmtk/dcmdata/dcvrobow.h ../include/dcmtk/dcmdata/dcpixel.h \ ../include/dcmtk/dcmdata/dcvrpobw.h ../include/dcmtk/dcmdata/dcovlay.h \ ../include/dcmtk/dcmdata/dcvrat.h ../include/dcmtk/dcmdata/dcvrss.h \ ../include/dcmtk/dcmdata/dcvrus.h ../include/dcmtk/dcmdata/dcvrsl.h \ ../include/dcmtk/dcmdata/dcvrfl.h ../include/dcmtk/dcmdata/dcvrfd.h \ ../include/dcmtk/dcmdata/dcvrof.h ../include/dcmtk/dcmdata/cmdlnarg.h \ ../include/dcmtk/dcmdata/cmdlnarg.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../include/dcmtk/dcmdata/dcuid.h ../include/dcmtk/dcmdata/dcistrmz.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h dcmftest.o: dcmftest.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dcmetinf.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dcitem.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcobject.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dcvr.h \ ../include/dcmtk/dcmdata/dctag.h ../include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmdata/dcstack.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../include/dcmtk/dcmdata/dcpcache.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../include/dcmtk/dcmdata/dcuid.h dcmgpdir.o: dcmgpdir.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmdata/dctk.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcswap.h ../include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dcvr.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../include/dcmtk/dcmdata/dcistrma.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcostrma.h ../include/dcmtk/dcmdata/dcuid.h \ ../include/dcmtk/dcmdata/dcvm.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h \ ../include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmdata/dctag.h ../include/dcmtk/dcmdata/dcdicent.h \ ../include/dcmtk/dcmdata/dchashdi.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../include/dcmtk/dcmdata/dcdict.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../include/dcmtk/dcmdata/dcdeftag.h ../include/dcmtk/dcmdata/dcobject.h \ ../include/dcmtk/dcmdata/dcstack.h ../include/dcmtk/dcmdata/dcelem.h \ ../include/dcmtk/dcmdata/dcitem.h ../include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../include/dcmtk/dcmdata/dcpcache.h ../include/dcmtk/dcmdata/dcmetinf.h \ ../include/dcmtk/dcmdata/dcdatset.h ../include/dcmtk/dcmdata/dcsequen.h \ ../include/dcmtk/dcmdata/dcfilefo.h ../include/dcmtk/dcmdata/dcdicdir.h \ ../include/dcmtk/dcmdata/dcdirrec.h ../include/dcmtk/dcmdata/dcvrulup.h \ ../include/dcmtk/dcmdata/dcvrul.h ../include/dcmtk/dcmdata/dcpixseq.h \ ../include/dcmtk/dcmdata/dcofsetl.h ../include/dcmtk/dcmdata/dcbytstr.h \ ../include/dcmtk/dcmdata/dcvrae.h ../include/dcmtk/dcmdata/dcvras.h \ ../include/dcmtk/dcmdata/dcvrcs.h ../include/dcmtk/dcmdata/dcvrda.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../include/dcmtk/dcmdata/dcvrds.h \ ../../ofstd/include/dcmtk/ofstd/ofvector.h \ ../include/dcmtk/dcmdata/dcvrdt.h \ ../../ofstd/include/dcmtk/ofstd/ofdatime.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../include/dcmtk/dcmdata/dcvris.h ../include/dcmtk/dcmdata/dcvrtm.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../include/dcmtk/dcmdata/dcvrui.h ../include/dcmtk/dcmdata/dcchrstr.h \ ../include/dcmtk/dcmdata/dcvrlo.h ../include/dcmtk/dcmdata/dcvrlt.h \ ../include/dcmtk/dcmdata/dcvrpn.h ../include/dcmtk/dcmdata/dcvrsh.h \ ../include/dcmtk/dcmdata/dcvrst.h ../include/dcmtk/dcmdata/dcvrut.h \ ../include/dcmtk/dcmdata/dcvrobow.h ../include/dcmtk/dcmdata/dcpixel.h \ ../include/dcmtk/dcmdata/dcvrpobw.h ../include/dcmtk/dcmdata/dcovlay.h \ ../include/dcmtk/dcmdata/dcvrat.h ../include/dcmtk/dcmdata/dcvrss.h \ ../include/dcmtk/dcmdata/dcvrus.h ../include/dcmtk/dcmdata/dcvrsl.h \ ../include/dcmtk/dcmdata/dcvrfl.h ../include/dcmtk/dcmdata/dcvrfd.h \ ../include/dcmtk/dcmdata/dcvrof.h ../include/dcmtk/dcmdata/cmdlnarg.h \ ../include/dcmtk/dcmdata/dcuid.h ../include/dcmtk/dcmdata/dcddirif.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h dcmodify.o: dcmodify.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h mdfconen.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../include/dcmtk/dcmdata/dcxfer.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcvr.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../include/dcmtk/dcmdata/dcpath.h ../include/dcmtk/dcmdata/dcdatset.h \ ../include/dcmtk/dcmdata/dcitem.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcobject.h ../include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dctag.h \ ../include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmdata/dcstack.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../include/dcmtk/dcmdata/dcpcache.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h dump2dcm.o: dump2dcm.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../include/dcmtk/dcmdata/dctk.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcswap.h ../include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dcvr.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../include/dcmtk/dcmdata/dcistrma.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../include/dcmtk/dcmdata/dcostrma.h ../include/dcmtk/dcmdata/dcuid.h \ ../include/dcmtk/dcmdata/dcvm.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h \ ../include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmdata/dctag.h ../include/dcmtk/dcmdata/dcdicent.h \ ../include/dcmtk/dcmdata/dchashdi.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../include/dcmtk/dcmdata/dcdict.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../include/dcmtk/dcmdata/dcdeftag.h ../include/dcmtk/dcmdata/dcobject.h \ ../include/dcmtk/dcmdata/dcstack.h ../include/dcmtk/dcmdata/dcelem.h \ ../include/dcmtk/dcmdata/dcitem.h ../include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../include/dcmtk/dcmdata/dcpcache.h ../include/dcmtk/dcmdata/dcmetinf.h \ ../include/dcmtk/dcmdata/dcdatset.h ../include/dcmtk/dcmdata/dcsequen.h \ ../include/dcmtk/dcmdata/dcfilefo.h ../include/dcmtk/dcmdata/dcdicdir.h \ ../include/dcmtk/dcmdata/dcdirrec.h ../include/dcmtk/dcmdata/dcvrulup.h \ ../include/dcmtk/dcmdata/dcvrul.h ../include/dcmtk/dcmdata/dcpixseq.h \ ../include/dcmtk/dcmdata/dcofsetl.h ../include/dcmtk/dcmdata/dcbytstr.h \ ../include/dcmtk/dcmdata/dcvrae.h ../include/dcmtk/dcmdata/dcvras.h \ ../include/dcmtk/dcmdata/dcvrcs.h ../include/dcmtk/dcmdata/dcvrda.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../include/dcmtk/dcmdata/dcvrds.h \ ../../ofstd/include/dcmtk/ofstd/ofvector.h \ ../include/dcmtk/dcmdata/dcvrdt.h \ ../../ofstd/include/dcmtk/ofstd/ofdatime.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../include/dcmtk/dcmdata/dcvris.h ../include/dcmtk/dcmdata/dcvrtm.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../include/dcmtk/dcmdata/dcvrui.h ../include/dcmtk/dcmdata/dcchrstr.h \ ../include/dcmtk/dcmdata/dcvrlo.h ../include/dcmtk/dcmdata/dcvrlt.h \ ../include/dcmtk/dcmdata/dcvrpn.h ../include/dcmtk/dcmdata/dcvrsh.h \ ../include/dcmtk/dcmdata/dcvrst.h ../include/dcmtk/dcmdata/dcvrut.h \ ../include/dcmtk/dcmdata/dcvrobow.h ../include/dcmtk/dcmdata/dcpixel.h \ ../include/dcmtk/dcmdata/dcvrpobw.h ../include/dcmtk/dcmdata/dcovlay.h \ ../include/dcmtk/dcmdata/dcvrat.h ../include/dcmtk/dcmdata/dcvrss.h \ ../include/dcmtk/dcmdata/dcvrus.h ../include/dcmtk/dcmdata/dcvrsl.h \ ../include/dcmtk/dcmdata/dcvrfl.h ../include/dcmtk/dcmdata/dcvrfd.h \ ../include/dcmtk/dcmdata/dcvrof.h ../include/dcmtk/dcmdata/cmdlnarg.h \ ../include/dcmtk/dcmdata/dcpxitem.h ../include/dcmtk/dcmdata/cmdlnarg.h \ ../include/dcmtk/dcmdata/dcuid.h ../include/dcmtk/dcmdata/dcostrmz.h img2dcm.o: img2dcm.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmdata/cmdlnarg.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../include/dcmtk/dcmdata/dcuid.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcfilefo.h ../include/dcmtk/dcmdata/dcsequen.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcelem.h ../include/dcmtk/dcmdata/dcobject.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../include/dcmtk/dcmdata/dcvr.h ../include/dcmtk/dcmdata/dctag.h \ ../include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmdata/dcstack.h ../include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../include/dcmtk/dcmdata/dcdatset.h ../include/dcmtk/dcmdata/dcitem.h \ ../include/dcmtk/dcmdata/dcpcache.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../include/dcmtk/dcmdata/dcdict.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../include/dcmtk/dcmdata/dchashdi.h \ ../include/dcmtk/dcmdata/libi2d/i2d.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/libi2d/i2doutpl.h \ ../include/dcmtk/dcmdata/dcdatset.h ../include/dcmtk/dcmdata/dcelem.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../include/dcmtk/dcmdata/libi2d/i2dplvlp.h \ ../include/dcmtk/dcmdata/libi2d/i2dplsc.h \ ../include/dcmtk/dcmdata/libi2d/i2djpgs.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../include/dcmtk/dcmdata/libi2d/i2dimgs.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dcpixel.h \ ../include/dcmtk/dcmdata/dcvrpobw.h ../include/dcmtk/dcmdata/dcvrobow.h \ ../include/dcmtk/dcmdata/libi2d/i2djpgs.h \ ../include/dcmtk/dcmdata/libi2d/i2dbmps.h \ ../include/dcmtk/dcmdata/libi2d/i2dplsc.h \ ../include/dcmtk/dcmdata/libi2d/i2dplvlp.h \ ../include/dcmtk/dcmdata/libi2d/i2dplnsc.h mdfconen.o: mdfconen.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h mdfconen.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../include/dcmtk/dcmdata/dcxfer.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcvr.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h mdfdsman.h \ ../include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dctk.h ../include/dcmtk/dcmdata/dcswap.h \ ../include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dcistrma.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../include/dcmtk/dcmdata/dcostrma.h ../include/dcmtk/dcmdata/dcuid.h \ ../include/dcmtk/dcmdata/dcvm.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h \ ../include/dcmtk/dcmdata/dctagkey.h ../include/dcmtk/dcmdata/dctag.h \ ../include/dcmtk/dcmdata/dcdicent.h ../include/dcmtk/dcmdata/dchashdi.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../include/dcmtk/dcmdata/dcdict.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../include/dcmtk/dcmdata/dcdeftag.h ../include/dcmtk/dcmdata/dcobject.h \ ../include/dcmtk/dcmdata/dcstack.h ../include/dcmtk/dcmdata/dcelem.h \ ../include/dcmtk/dcmdata/dcitem.h ../include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../include/dcmtk/dcmdata/dcpcache.h ../include/dcmtk/dcmdata/dcmetinf.h \ ../include/dcmtk/dcmdata/dcdatset.h ../include/dcmtk/dcmdata/dcsequen.h \ ../include/dcmtk/dcmdata/dcfilefo.h ../include/dcmtk/dcmdata/dcdicdir.h \ ../include/dcmtk/dcmdata/dcdirrec.h ../include/dcmtk/dcmdata/dcvrulup.h \ ../include/dcmtk/dcmdata/dcvrul.h ../include/dcmtk/dcmdata/dcpixseq.h \ ../include/dcmtk/dcmdata/dcofsetl.h ../include/dcmtk/dcmdata/dcbytstr.h \ ../include/dcmtk/dcmdata/dcvrae.h ../include/dcmtk/dcmdata/dcvras.h \ ../include/dcmtk/dcmdata/dcvrcs.h ../include/dcmtk/dcmdata/dcvrda.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../include/dcmtk/dcmdata/dcvrds.h \ ../../ofstd/include/dcmtk/ofstd/ofvector.h \ ../include/dcmtk/dcmdata/dcvrdt.h \ ../../ofstd/include/dcmtk/ofstd/ofdatime.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../include/dcmtk/dcmdata/dcvris.h ../include/dcmtk/dcmdata/dcvrtm.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../include/dcmtk/dcmdata/dcvrui.h ../include/dcmtk/dcmdata/dcchrstr.h \ ../include/dcmtk/dcmdata/dcvrlo.h ../include/dcmtk/dcmdata/dcvrlt.h \ ../include/dcmtk/dcmdata/dcvrpn.h ../include/dcmtk/dcmdata/dcvrsh.h \ ../include/dcmtk/dcmdata/dcvrst.h ../include/dcmtk/dcmdata/dcvrut.h \ ../include/dcmtk/dcmdata/dcvrobow.h ../include/dcmtk/dcmdata/dcpixel.h \ ../include/dcmtk/dcmdata/dcvrpobw.h ../include/dcmtk/dcmdata/dcovlay.h \ ../include/dcmtk/dcmdata/dcvrat.h ../include/dcmtk/dcmdata/dcvrss.h \ ../include/dcmtk/dcmdata/dcvrus.h ../include/dcmtk/dcmdata/dcvrsl.h \ ../include/dcmtk/dcmdata/dcvrfl.h ../include/dcmtk/dcmdata/dcvrfd.h \ ../include/dcmtk/dcmdata/dcvrof.h ../include/dcmtk/dcmdata/cmdlnarg.h \ ../include/dcmtk/dcmdata/dcistrmz.h mdfdsman.o: mdfdsman.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h mdfdsman.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../include/dcmtk/dcmdata/dctagkey.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcvr.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dctk.h ../include/dcmtk/dcmdata/dcswap.h \ ../include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dcistrma.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../include/dcmtk/dcmdata/dcostrma.h ../include/dcmtk/dcmdata/dcuid.h \ ../include/dcmtk/dcmdata/dcvm.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h \ ../include/dcmtk/dcmdata/dctagkey.h ../include/dcmtk/dcmdata/dctag.h \ ../include/dcmtk/dcmdata/dcdicent.h ../include/dcmtk/dcmdata/dchashdi.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../include/dcmtk/dcmdata/dcdict.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../include/dcmtk/dcmdata/dcdeftag.h ../include/dcmtk/dcmdata/dcobject.h \ ../include/dcmtk/dcmdata/dcstack.h ../include/dcmtk/dcmdata/dcelem.h \ ../include/dcmtk/dcmdata/dcitem.h ../include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../include/dcmtk/dcmdata/dcpcache.h ../include/dcmtk/dcmdata/dcmetinf.h \ ../include/dcmtk/dcmdata/dcdatset.h ../include/dcmtk/dcmdata/dcsequen.h \ ../include/dcmtk/dcmdata/dcfilefo.h ../include/dcmtk/dcmdata/dcdicdir.h \ ../include/dcmtk/dcmdata/dcdirrec.h ../include/dcmtk/dcmdata/dcvrulup.h \ ../include/dcmtk/dcmdata/dcvrul.h ../include/dcmtk/dcmdata/dcpixseq.h \ ../include/dcmtk/dcmdata/dcofsetl.h ../include/dcmtk/dcmdata/dcbytstr.h \ ../include/dcmtk/dcmdata/dcvrae.h ../include/dcmtk/dcmdata/dcvras.h \ ../include/dcmtk/dcmdata/dcvrcs.h ../include/dcmtk/dcmdata/dcvrda.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../include/dcmtk/dcmdata/dcvrds.h \ ../../ofstd/include/dcmtk/ofstd/ofvector.h \ ../include/dcmtk/dcmdata/dcvrdt.h \ ../../ofstd/include/dcmtk/ofstd/ofdatime.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../include/dcmtk/dcmdata/dcvris.h ../include/dcmtk/dcmdata/dcvrtm.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../include/dcmtk/dcmdata/dcvrui.h ../include/dcmtk/dcmdata/dcchrstr.h \ ../include/dcmtk/dcmdata/dcvrlo.h ../include/dcmtk/dcmdata/dcvrlt.h \ ../include/dcmtk/dcmdata/dcvrpn.h ../include/dcmtk/dcmdata/dcvrsh.h \ ../include/dcmtk/dcmdata/dcvrst.h ../include/dcmtk/dcmdata/dcvrut.h \ ../include/dcmtk/dcmdata/dcvrobow.h ../include/dcmtk/dcmdata/dcpixel.h \ ../include/dcmtk/dcmdata/dcvrpobw.h ../include/dcmtk/dcmdata/dcovlay.h \ ../include/dcmtk/dcmdata/dcvrat.h ../include/dcmtk/dcmdata/dcvrss.h \ ../include/dcmtk/dcmdata/dcvrus.h ../include/dcmtk/dcmdata/dcvrsl.h \ ../include/dcmtk/dcmdata/dcvrfl.h ../include/dcmtk/dcmdata/dcvrfd.h \ ../include/dcmtk/dcmdata/dcvrof.h ../include/dcmtk/dcmdata/cmdlnarg.h \ ../include/dcmtk/dcmdata/dcpath.h ../include/dcmtk/dcmdata/dcistrmf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h pdf2dcm.o: pdf2dcm.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dctk.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcswap.h ../include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dcvr.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../include/dcmtk/dcmdata/dcistrma.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcostrma.h ../include/dcmtk/dcmdata/dcuid.h \ ../include/dcmtk/dcmdata/dcvm.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h \ ../include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmdata/dctag.h ../include/dcmtk/dcmdata/dcdicent.h \ ../include/dcmtk/dcmdata/dchashdi.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../include/dcmtk/dcmdata/dcdict.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../include/dcmtk/dcmdata/dcdeftag.h ../include/dcmtk/dcmdata/dcobject.h \ ../include/dcmtk/dcmdata/dcstack.h ../include/dcmtk/dcmdata/dcelem.h \ ../include/dcmtk/dcmdata/dcitem.h ../include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../include/dcmtk/dcmdata/dcpcache.h ../include/dcmtk/dcmdata/dcmetinf.h \ ../include/dcmtk/dcmdata/dcdatset.h ../include/dcmtk/dcmdata/dcsequen.h \ ../include/dcmtk/dcmdata/dcfilefo.h ../include/dcmtk/dcmdata/dcdicdir.h \ ../include/dcmtk/dcmdata/dcdirrec.h ../include/dcmtk/dcmdata/dcvrulup.h \ ../include/dcmtk/dcmdata/dcvrul.h ../include/dcmtk/dcmdata/dcpixseq.h \ ../include/dcmtk/dcmdata/dcofsetl.h ../include/dcmtk/dcmdata/dcbytstr.h \ ../include/dcmtk/dcmdata/dcvrae.h ../include/dcmtk/dcmdata/dcvras.h \ ../include/dcmtk/dcmdata/dcvrcs.h ../include/dcmtk/dcmdata/dcvrda.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../include/dcmtk/dcmdata/dcvrds.h \ ../../ofstd/include/dcmtk/ofstd/ofvector.h \ ../include/dcmtk/dcmdata/dcvrdt.h \ ../../ofstd/include/dcmtk/ofstd/ofdatime.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../include/dcmtk/dcmdata/dcvris.h ../include/dcmtk/dcmdata/dcvrtm.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../include/dcmtk/dcmdata/dcvrui.h ../include/dcmtk/dcmdata/dcchrstr.h \ ../include/dcmtk/dcmdata/dcvrlo.h ../include/dcmtk/dcmdata/dcvrlt.h \ ../include/dcmtk/dcmdata/dcvrpn.h ../include/dcmtk/dcmdata/dcvrsh.h \ ../include/dcmtk/dcmdata/dcvrst.h ../include/dcmtk/dcmdata/dcvrut.h \ ../include/dcmtk/dcmdata/dcvrobow.h ../include/dcmtk/dcmdata/dcpixel.h \ ../include/dcmtk/dcmdata/dcvrpobw.h ../include/dcmtk/dcmdata/dcovlay.h \ ../include/dcmtk/dcmdata/dcvrat.h ../include/dcmtk/dcmdata/dcvrss.h \ ../include/dcmtk/dcmdata/dcvrus.h ../include/dcmtk/dcmdata/dcvrsl.h \ ../include/dcmtk/dcmdata/dcvrfl.h ../include/dcmtk/dcmdata/dcvrfd.h \ ../include/dcmtk/dcmdata/dcvrof.h ../include/dcmtk/dcmdata/cmdlnarg.h \ ../include/dcmtk/dcmdata/cmdlnarg.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../include/dcmtk/dcmdata/dcuid.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/ofdatime.h \ ../include/dcmtk/dcmdata/dccodec.h xml2dcm.o: xml2dcm.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmdata/dctk.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcswap.h ../include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dcvr.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../include/dcmtk/dcmdata/dcistrma.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcostrma.h ../include/dcmtk/dcmdata/dcuid.h \ ../include/dcmtk/dcmdata/dcvm.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h \ ../include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmdata/dctag.h ../include/dcmtk/dcmdata/dcdicent.h \ ../include/dcmtk/dcmdata/dchashdi.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../include/dcmtk/dcmdata/dcdict.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../include/dcmtk/dcmdata/dcdeftag.h ../include/dcmtk/dcmdata/dcobject.h \ ../include/dcmtk/dcmdata/dcstack.h ../include/dcmtk/dcmdata/dcelem.h \ ../include/dcmtk/dcmdata/dcitem.h ../include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../include/dcmtk/dcmdata/dcpcache.h ../include/dcmtk/dcmdata/dcmetinf.h \ ../include/dcmtk/dcmdata/dcdatset.h ../include/dcmtk/dcmdata/dcsequen.h \ ../include/dcmtk/dcmdata/dcfilefo.h ../include/dcmtk/dcmdata/dcdicdir.h \ ../include/dcmtk/dcmdata/dcdirrec.h ../include/dcmtk/dcmdata/dcvrulup.h \ ../include/dcmtk/dcmdata/dcvrul.h ../include/dcmtk/dcmdata/dcpixseq.h \ ../include/dcmtk/dcmdata/dcofsetl.h ../include/dcmtk/dcmdata/dcbytstr.h \ ../include/dcmtk/dcmdata/dcvrae.h ../include/dcmtk/dcmdata/dcvras.h \ ../include/dcmtk/dcmdata/dcvrcs.h ../include/dcmtk/dcmdata/dcvrda.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../include/dcmtk/dcmdata/dcvrds.h \ ../../ofstd/include/dcmtk/ofstd/ofvector.h \ ../include/dcmtk/dcmdata/dcvrdt.h \ ../../ofstd/include/dcmtk/ofstd/ofdatime.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../include/dcmtk/dcmdata/dcvris.h ../include/dcmtk/dcmdata/dcvrtm.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../include/dcmtk/dcmdata/dcvrui.h ../include/dcmtk/dcmdata/dcchrstr.h \ ../include/dcmtk/dcmdata/dcvrlo.h ../include/dcmtk/dcmdata/dcvrlt.h \ ../include/dcmtk/dcmdata/dcvrpn.h ../include/dcmtk/dcmdata/dcvrsh.h \ ../include/dcmtk/dcmdata/dcvrst.h ../include/dcmtk/dcmdata/dcvrut.h \ ../include/dcmtk/dcmdata/dcvrobow.h ../include/dcmtk/dcmdata/dcpixel.h \ ../include/dcmtk/dcmdata/dcvrpobw.h ../include/dcmtk/dcmdata/dcovlay.h \ ../include/dcmtk/dcmdata/dcvrat.h ../include/dcmtk/dcmdata/dcvrss.h \ ../include/dcmtk/dcmdata/dcvrus.h ../include/dcmtk/dcmdata/dcvrsl.h \ ../include/dcmtk/dcmdata/dcvrfl.h ../include/dcmtk/dcmdata/dcvrfd.h \ ../include/dcmtk/dcmdata/dcvrof.h ../include/dcmtk/dcmdata/cmdlnarg.h \ ../include/dcmtk/dcmdata/dcpxitem.h ../include/dcmtk/dcmdata/cmdlnarg.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../include/dcmtk/dcmdata/dcostrmz.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h dcmtk-3.6.0/dcmdata/apps/dump2dcm.cc0000644000310500011400000014435011457516456016446 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Andreas Barth * * Purpose: create a Dicom FileFormat or DataSet from an ASCII-dump * * Last Update: $Author: uli $ * Update Date: $Date: 2010-10-20 07:41:34 $ * CVS/RCS Revision: $Revision: 1.70 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ /* * Input File Description: * The input file can be an output of dcmdump. One element (tag, VR, value) * must be written into one line separated by arbitrary spaces or tab characters. * A '#' begins a comment that ends at the line end. Empty lines are allowed. * The individual parts of a line have the following syntax: * Tag: (gggg,eeee) * with gggg and eeee are 4 character hexadecimal values representing * group and element tag. Spaces and tabs can be anywhere in a tag * specification. * VR: Value Representation must be written as 2 characters as in Part 6 * of the DICOM standard. No spaces or tabs are allowed between the * two characters. If the VR can determined from the tag, this part * of a line is optional. * Value: There are several rules for writing values: * 1. US, SS, SL, UL, FD, FL are written as decimal strings that can * be read by scanf(). * 2. AT is written as '(gggg,eeee)' with additional spaces stripped * off automatically and gggg and eeee being decimal strings that * can be read by scanf(). * 3. OB and OW values are written as byte or word hexadecimal values * separated by '\' character. Alternatively, OB or OW values can * be read from a separate file by writing the filename prefixed * by a '=' character (e.g. '=largepix.dat'). The contents of the * file will be read as is. OW data is expected to be little endian * ordered and will be swapped if necessary. No checks will be made * to ensure that the amount of data is reasonable in terms of other * attributes such as Rows or Columns. * In case of compressed pixel data, the line should start with * '(7fe0,0010) OB (PixelSequence' in order to distinguish from * uncompressed pixel data. * 4. UI is written as '=Name' in data dictionary or as unique * identifier string (see 6.) , e.g. '[1.2.840.....]' * 5. Strings without () <> [] spaces, tabs and # can be written * directly. * 6. Other strings must be surrounded by '[' and ']'. No bracket * structure is passed. The value ends at the last ']' in the * line. Anything after the ']' is interpreted as comment. * 7. '(' and '<' are interpreted special and may not be used when * writing an input file by hand as beginning characters of a * string. Multiple Value are separated by '\'. The sequence of * lines must not be ordered but they can. References in DICOM * Directories are not supported. Semantic errors are not detected. * * Examples: * (0008,0020) DA [19921012] # 8, 1 StudyDate * (0008,0016) UI =MRImageStorage # 26, 1 SOPClassUID * (0002,0012) UI [1.2.276.0.7230010.100.1.1] * (0020,0032) DS [0.0\0.0] # 8, 2 ImagePositionPatient * (0028,0009) AT (3004,000c) # 4, 1 FrameIncrementPointer * (0028,0010) US 256 # 4, 1 Rows * (0002,0001) OB 01\00 * */ #include "dcmtk/config/osconfig.h" // if defined, use createValueFromTempFile() for large binary data files //#define EXPERIMENTAL_READ_FROM_FILE #define INCLUDE_CSTDLIB #define INCLUDE_CSTDIO #define INCLUDE_CCTYPE #include "dcmtk/ofstd/ofstdinc.h" #ifdef HAVE_SYS_TYPES_H #include #endif #ifdef HAVE_GUSI_H #include #endif #include "dcmtk/ofstd/ofstd.h" #include "dcmtk/ofstd/ofconapp.h" #include "dcmtk/ofstd/ofstream.h" #include "dcmtk/dcmdata/dctk.h" #include "dcmtk/dcmdata/dcpxitem.h" #include "dcmtk/dcmdata/cmdlnarg.h" #include "dcmtk/dcmdata/dcuid.h" /* for dcmtk version name */ #include "dcmtk/dcmdata/dcostrmz.h" /* for dcmZlibCompressionLevel */ #ifdef EXPERIMENTAL_READ_FROM_FILE #include "dcmtk/dcmdata/dcistrmf.h" /* for class DcmInputFileStream */ #endif #ifdef WITH_ZLIB #include /* for zlibVersion() */ #endif #define OFFIS_CONSOLE_APPLICATION "dump2dcm" static OFLogger dump2dcmLogger = OFLog::getLogger("dcmtk.apps." OFFIS_CONSOLE_APPLICATION); static char rcsid[] = "$dcmtk: " OFFIS_CONSOLE_APPLICATION " v" OFFIS_DCMTK_VERSION " " OFFIS_DCMTK_RELEASEDATE " $"; #define SHORTCOL 3 #define LONGCOL 21 // Maximum Line Size (default) const unsigned int DCM_DumpMaxLineSize = 4096; // Field definition separators #define DCM_DumpCommentChar '#' #define DCM_DumpTagDelim ')' #define DCM_DumpOpenString '[' #define DCM_DumpCloseString ']' #define DCM_DumpOpenDescription '(' #define DCM_DumpOpenFile '<' #define DCM_DumpCloseFile '>' #define TO_UCHAR(s) OFstatic_cast(unsigned char, (s)) static void stripWhitespace(char *s) { char *p; if (s == NULL) return; p = s; while (*s != '\0') { if (isspace(TO_UCHAR(*s)) == OFFalse) { *p++ = *s; } s++; } *p = '\0'; } static char * stripTrailingWhitespace(char *s) { int i, n; if (s == NULL) return s; n = strlen(s); for (i = n - 1; i >= 0 && isspace(TO_UCHAR(s[i])); i--) s[i] = '\0'; return s; } static char * stripPrecedingWhitespace(char *s) { char *p; if (s == NULL) return s; for(p = s; *p && isspace(TO_UCHAR(*p)); p++) ; return p; } static OFBool onlyWhitespace(const char *s) { int len = strlen(s); int charsFound = OFFalse; for (int i = 0; (!charsFound) && (i < len); i++) { charsFound = !isspace(TO_UCHAR(s[i])); } return (!charsFound) ? OFTrue : OFFalse; } static char * getLine(char *line, int maxLineLen, FILE *f, const unsigned long lineNumber) { char *s; s = fgets(line, maxLineLen, f); // if line is too long, throw rest of it away if (s && strlen(s) == size_t(maxLineLen - 1) && s[maxLineLen - 2] != '\n') { int c = fgetc(f); while(c != '\n' && c != EOF) c = fgetc(f); OFLOG_ERROR(dump2dcmLogger, "line " << lineNumber << " too long"); } /* strip any trailing white space */ stripTrailingWhitespace(s); return s; } static OFBool isaCommentLine(const char *s) { OFBool isComment = OFFalse; /* assumption */ int len = strlen(s); int i = 0; for (i = 0; i < len && isspace(TO_UCHAR(s[i])); i++) /*loop*/; isComment = (s[i] == DCM_DumpCommentChar); return isComment; } static OFBool parseTag(char *&s, DcmTagKey &key) { OFBool ok = OFTrue; char *p; unsigned int g, e; // find tag begin p = strchr(s, DCM_DumpTagDelim); if (p) { // string all white spaces and read tag int len = p - s + 1; p = new char[len + 1]; OFStandard::strlcpy(p, s, len + 1); stripWhitespace(p); s += len; if (sscanf(p, "(%x,%x)", &g, &e) == 2) key.set(g, e); else ok = OFFalse; delete[] p; } else ok = OFFalse; return ok; } static OFBool parseVR(char *&s, DcmEVR &vr) { OFBool ok = OFTrue; s = stripPrecedingWhitespace(s); // Are there two upper characters? if (isupper(TO_UCHAR(*s)) && isupper(TO_UCHAR(*(s + 1)))) { char c_vr[3]; OFStandard::strlcpy(c_vr, s, 3); // Convert to VR DcmVR dcmVR(c_vr); vr = dcmVR.getEVR(); s += 2; } else if ((*s == 'p') && (*(s + 1) == 'i')) { vr = EVR_pixelItem; s += 2; } else if (((*s == 'o') && (*(s + 1) == 'x')) || ((*s == 'x') && (*(s + 1) == 's')) || ((*s == 'n') && (*(s + 1) == 'a')) || ((*s == 'u') && (*(s + 1) == 'p'))) { // swallow internal VRs vr = EVR_UNKNOWN; s += 2; } else ok = OFFalse; return ok; } #undef TO_UCHAR static int searchLastClose(char *s, const char closeChar) { // search last close bracket in a line // no bracket structure will be considered char *found = NULL; char *p = s; while(p && *p) { p = strchr(p, closeChar); if (p) { found = p; p++; } } if (found) return (found - s) + 1; else return 0; } static int searchCommentOrEol(char *s) { char *comment = strchr(s, DCM_DumpCommentChar); if (comment) return comment - s; else if (s) return strlen(s); else return 0; } static char * convertNewlineCharacters(char *s) { // convert the string "\n" into the \r\n combination required by DICOM if (s == NULL || s[0] == '\0') return s; int len = strlen(s); int i = 0; for (i = 0; i < (len - 1); i++) { if (s[i] == '\\' && s[i + 1] == 'n') { s[i] = '\r'; s[i + 1] = '\n'; i++; } } return s; } static OFBool parseValue(char *&s, char *&value, DcmEVR &vr, const DcmTagKey &tagkey) { OFBool ok = OFTrue; int len; value = NULL; s = stripPrecedingWhitespace(s); switch (*s) { case DCM_DumpOpenString: len = searchLastClose(s, DCM_DumpCloseString); if (len == 0) ok = OFFalse; else if (len > 2) { value = new char[len - 1]; OFStandard::strlcpy(value, s + 1, len - 1); value = convertNewlineCharacters(value); } else value = NULL; break; case DCM_DumpOpenDescription: /* need to distinguish VR=AT from description field */ /* NB: if the VR is unknown this workaround will not succeed */ if (vr == EVR_AT) { len = searchLastClose(s, DCM_DumpTagDelim); if (len >= 11) // (gggg,eeee) allow non-significant spaces { char *pv = s; DcmTagKey tag; if (parseTag(pv, tag)) // check for valid tag format { value = new char[len + 1]; OFStandard::strlcpy(value, s, len + 1); stripWhitespace(value); } else ok = OFFalse; // skip description } else ok = OFFalse; // skip description } /* need to distinguish pixel sequence */ else if ((tagkey == DCM_PixelData) && (vr == EVR_OB)) { if (strncmp(s + 1, "PixelSequence", 13) == 0) vr = EVR_pixelSQ; } break; case DCM_DumpOpenFile: ok = OFFalse; // currently not supported break; case DCM_DumpCommentChar: break; default: len = searchCommentOrEol(s); if (len) { value = new char[len + 1]; OFStandard::strlcpy(value, s, len + 1); stripTrailingWhitespace(value); } break; } return ok; } static OFCondition putFileContentsIntoElement(DcmElement *elem, const char *filename) { OFCondition ec = EC_Normal; #ifdef EXPERIMENTAL_READ_FROM_FILE /* create stream object for binary file */ DcmInputFileStream fileStream(filename); ec = fileStream.status(); if (ec.good()) { /* NB: if size is odd file will be rejected */ const size_t fileLen = OFStandard::getFileSize(filename); /* read element value from binary file (requires even length) */ ec = elem->createValueFromTempFile(fileStream.newFactory(), fileLen, EBO_LittleEndian); if (ec.bad()) OFLOG_ERROR(dump2dcmLogger, "cannot process binary data file: " << filename); } else { OFLOG_ERROR(dump2dcmLogger, "cannot open binary data file: " << filename); ec = EC_InvalidTag; } #else FILE *f = NULL; if ((f = fopen(filename, "rb")) == NULL) { OFLOG_ERROR(dump2dcmLogger, "cannot open binary data file: " << filename); return EC_InvalidTag; } const size_t len = OFStandard::getFileSize(filename); unsigned long buflen = len; if (buflen & 1) buflen++; /* if odd then make even (DICOM requires even length values) */ Uint8 *buf = NULL; const DcmEVR evr = elem->getVR(); /* create buffer of OB or OW data */ if (evr == EVR_OB || evr == EVR_pixelItem) ec = elem->createUint8Array(buflen, buf); else if (evr == EVR_OW) { Uint16 *buf16 = NULL; ec = elem->createUint16Array(buflen / 2, buf16); buf = OFreinterpret_cast(Uint8 *, buf16); } else ec = EC_IllegalCall; if (ec.good()) { /* read binary file into the buffer */ if (fread(buf, 1, OFstatic_cast(size_t, len), f) != len) { char errBuf[256]; OFLOG_ERROR(dump2dcmLogger, "error reading binary data file: " << filename << ": " << OFStandard::strerror(errno, errBuf, sizeof(errBuf))); ec = EC_CorruptedData; } else if (evr == EVR_OW) { /* swap 16 bit OW data (if necessary) */ swapIfNecessary(gLocalByteOrder, EBO_LittleEndian, buf, buflen, sizeof(Uint16)); } } else if (ec == EC_MemoryExhausted) OFLOG_ERROR(dump2dcmLogger, "out of memory reading binary data file: " << filename); else OFLOG_ERROR(dump2dcmLogger, "illegal call processing binary data file: " << filename); fclose(f); #endif return ec; } static OFCondition insertIntoSet(DcmStack &stack, const E_TransferSyntax xfer, const DcmTagKey &tagkey, const DcmEVR &vr, const char *value) { // insert new element into dataset or metaheader OFCondition l_error = EC_Normal; OFCondition newElementError = EC_Normal; if (stack.empty()) l_error = EC_CorruptedData; if (l_error == EC_Normal) { DcmElement *newElement = NULL; DcmObject *topOfStack = stack.top(); // convert tagkey to tag including VR DcmTag tag(tagkey); DcmVR dcmvr(vr); const DcmEVR tagvr = tag.getEVR(); /* check VR and consider various special cases */ if (tagvr != vr && vr != EVR_UNKNOWN && tagvr != EVR_UNKNOWN && (tagkey != DCM_LUTData || (vr != EVR_US && vr != EVR_SS && vr != EVR_OW)) && (tagkey != DCM_PixelData || (vr != EVR_OB && vr != EVR_OW && vr != EVR_pixelSQ)) && (tagvr != EVR_xs || (vr != EVR_US && vr != EVR_SS)) && (tagvr != EVR_ox || (vr != EVR_OB && vr != EVR_OW)) && (tagvr != EVR_na || vr != EVR_pixelItem)) { OFLOG_WARN(dump2dcmLogger, "Tag " << tag << " with wrong VR '" << dcmvr.getVRName() << "' found, correct is '" << tag.getVR().getVRName() << "'"); } if (vr != EVR_UNKNOWN) tag.setVR(dcmvr); const DcmEVR newTagVR = tag.getEVR(); // create new element (special handling for pixel sequence and item) if (newTagVR == EVR_pixelSQ) newElement = new DcmPixelData(tag); else if (newTagVR == EVR_pixelItem) newElement = new DcmPixelItem(DcmTag(DCM_Item, EVR_OB)); else newElementError = newDicomElement(newElement, tag); if (newElementError == EC_Normal) { // tag describes an element if (!newElement) { // Tag was ambiguous - should never happen according to the current implementation of newDicomElement() l_error = EC_InvalidVR; } else { // check for uncompressed pixel data (i.e. no pixel sequence present) if (tagkey == DCM_PixelData && (newTagVR == EVR_OB || newTagVR == EVR_OW)) OFstatic_cast(DcmPixelData *, newElement)->setNonEncapsulationFlag(OFTrue /*alwaysUnencapsulated*/); // fill value if (value) { if (value[0] == '=' && (newTagVR == EVR_OB || newTagVR == EVR_OW || newTagVR == EVR_pixelItem)) { /* * Special case handling for OB, OW and pixel item data. * Allow a value beginning with a '=' character to represent * a file containing data to be used as the attribute value. * A '=' character is not a normal value since OB and OW values * must be written as multivalued hexidecimal (e.g. "00\ff\0d\8f"); */ l_error = putFileContentsIntoElement(newElement, value + 1); } else { l_error = newElement->putString(value); } } // insert element into hierarchy if (l_error == EC_Normal) { switch(topOfStack->ident()) { case EVR_item: case EVR_dirRecord: case EVR_dataset: case EVR_metainfo: { DcmItem *item = OFstatic_cast(DcmItem *, topOfStack); item->insert(newElement); // special handling for pixel sequence if (newTagVR == EVR_pixelSQ) { DcmPixelSequence *pixelSeq = new DcmPixelSequence(DcmTag(DCM_PixelData, EVR_OB)); if (pixelSeq != NULL) { OFstatic_cast(DcmPixelData *, newElement)->putOriginalRepresentation(xfer, NULL, pixelSeq); stack.push(pixelSeq); } } else if (newElement->ident() == EVR_SQ) stack.push(newElement); } break; case EVR_pixelSQ: if (newTagVR == EVR_pixelItem) { DcmPixelSequence *pixelSeq = OFstatic_cast(DcmPixelSequence *, topOfStack); pixelSeq->insert(OFstatic_cast(DcmPixelItem *, newElement)); } else l_error = EC_InvalidTag; break; default: l_error = EC_InvalidTag; break; } } } } else if (newElementError == EC_SequEnd) { // pop stack if stack object was a sequence if (topOfStack->ident() == EVR_SQ || topOfStack->ident() == EVR_pixelSQ) stack.pop(); else l_error = EC_InvalidTag; } else if (newElementError == EC_ItemEnd) { // pop stack if stack object was an item switch (topOfStack->ident()) { case EVR_item: case EVR_dirRecord: case EVR_dataset: case EVR_metainfo: stack.pop(); break; default: l_error = EC_InvalidTag; break; } } else if (newElementError == EC_InvalidTag) { if (tag.getXTag() == DCM_Item) { DcmItem *item = NULL; if (topOfStack->getTag().getXTag() == DCM_DirectoryRecordSequence) { // an Item must be pushed to the stack item = new DcmDirectoryRecord(tag, 0); OFstatic_cast(DcmSequenceOfItems *, topOfStack)->insert(item); stack.push(item); } else if (topOfStack->ident() == EVR_SQ) { // an item must be pushed to the stack item = new DcmItem(tag); OFstatic_cast(DcmSequenceOfItems *, topOfStack)->insert(item); stack.push(item); } else l_error = EC_InvalidTag; } else l_error = EC_InvalidTag; } else l_error = EC_InvalidTag; } return l_error; } static OFBool readDumpFile(DcmMetaInfo *metaheader, DcmDataset *dataset, FILE *infile, const char *ifname, E_TransferSyntax &xfer, const OFBool stopOnErrors, const unsigned long maxLineLength) { char *lineBuf = new char[maxLineLength]; int lineNumber = 0; OFBool errorOnThisLine = OFFalse; char *parse = NULL; char *value = NULL; DcmEVR vr = EVR_UNKNOWN; int errorsEncountered = 0; DcmTagKey tagkey; DcmStack metaheaderStack; DcmStack datasetStack; xfer = EXS_Unknown; if (metaheader) metaheaderStack.push(metaheader); datasetStack.push(dataset); while (getLine(lineBuf, OFstatic_cast(int, maxLineLength), infile, lineNumber + 1)) { lineNumber++; // ignore empty lines and comment lines if (onlyWhitespace(lineBuf)) continue; if (isaCommentLine(lineBuf)) continue; errorOnThisLine = OFFalse; parse = &lineBuf[0]; // parse tag an the line if (!parseTag(parse, tagkey)) { OFLOG_ERROR(dump2dcmLogger, OFFIS_CONSOLE_APPLICATION ": "<< ifname << ": " << "no Tag found (line " << lineNumber << ")"); errorOnThisLine = OFTrue; } // parse optional VR if (!errorOnThisLine && !parseVR(parse, vr)) vr = EVR_UNKNOWN; // parse optional value if (!errorOnThisLine && !parseValue(parse, value, vr, tagkey)) { OFLOG_ERROR(dump2dcmLogger, OFFIS_CONSOLE_APPLICATION ": "<< ifname << ": " << "incorrect value specification (line " << lineNumber << ")"); errorOnThisLine = OFTrue; } // insert new element that consists of tag, VR, and value if (!errorOnThisLine) { OFCondition l_error = EC_Normal; if (tagkey.getGroup() == 0x0002) { if (metaheader) { l_error = insertIntoSet(metaheaderStack, xfer, tagkey, vr, value); // check for transfer syntax in meta-header if ((tagkey == DCM_TransferSyntaxUID) && (xfer == EXS_Unknown)) { const char *xferUID; // use resolved value (UID) if (metaheader->findAndGetString(DCM_TransferSyntaxUID, xferUID).good()) xfer = DcmXfer(xferUID).getXfer(); } } } else l_error = insertIntoSet(datasetStack, xfer, tagkey, vr, value); if (value) { delete[] value; value = NULL; } if (l_error != EC_Normal) { errorOnThisLine = OFTrue; OFLOG_ERROR(dump2dcmLogger, OFFIS_CONSOLE_APPLICATION ": " << ifname << ": Error in creating Element: " << l_error.text() << " (line " << lineNumber << ")"); } } if (errorOnThisLine) errorsEncountered++; } // test blocking structure if (metaheader && metaheaderStack.card() != 1) { OFLOG_ERROR(dump2dcmLogger, OFFIS_CONSOLE_APPLICATION ": " << ifname << ": Block Error in metaheader"); errorsEncountered++; } if (datasetStack.card() != 1) { OFLOG_ERROR(dump2dcmLogger, OFFIS_CONSOLE_APPLICATION ": " << ifname << ": Block Error in dataset"); errorsEncountered++; } delete[] lineBuf; if (errorsEncountered) { OFLOG_ERROR(dump2dcmLogger, errorsEncountered << " Errors found in " << ifname); return !stopOnErrors; } else return OFTrue; } // ******************************************** int main(int argc, char *argv[]) { #ifdef HAVE_GUSI_H GUSISetup(GUSIwithSIOUXSockets); GUSISetup(GUSIwithInternetSockets); #endif OFConsoleApplication app(OFFIS_CONSOLE_APPLICATION , "Convert ASCII dump to DICOM file", rcsid); OFCommandLine cmd; cmd.setOptionColumns(LONGCOL, SHORTCOL); cmd.setParamColumn(LONGCOL + SHORTCOL + 4); cmd.addParam("dumpfile-in", "dump input filename"); cmd.addParam("dcmfile-out", "DICOM output filename"); cmd.addGroup("general options:", LONGCOL, SHORTCOL + 2); cmd.addOption("--help", "-h", "print this help text and exit", OFCommandLine::AF_Exclusive); cmd.addOption("--version", "print version information and exit", OFCommandLine::AF_Exclusive); OFLog::addOptions(cmd); cmd.addGroup("input options:", LONGCOL, SHORTCOL + 2); cmd.addSubGroup("input file format:"); cmd.addOption("--read-meta-info", "+f", "read meta information if present (default)"); cmd.addOption("--ignore-meta-info", "-f", "ignore file meta information"); cmd.addSubGroup("other input options:"); cmd.addOption("--line", "+l", 1, "[m]ax-length: integer", "maximum line length m (default: 4096)"); cmd.addGroup("processing options:"); cmd.addSubGroup("unique identifiers:"); cmd.addOption("--generate-new-uids", "+Ug", "generate new Study/Series/SOP Instance UID"); cmd.addOption("--dont-overwrite-uids", "-Uo", "do not overwrite existing UIDs (default)"); cmd.addOption("--overwrite-uids", "+Uo", "overwrite existing UIDs"); cmd.addGroup("output options:"); cmd.addSubGroup("output file format:"); cmd.addOption("--write-file", "+F", "write file format (default)"); cmd.addOption("--write-dataset", "-F", "write data set without file meta information"); cmd.addOption("--update-meta-info", "+Fu", "update particular file meta information"); cmd.addSubGroup("output transfer syntax:"); cmd.addOption("--write-xfer-same", "+t=", "write with same TS as input (default)"); cmd.addOption("--write-xfer-little", "+te", "write with explicit VR little endian"); cmd.addOption("--write-xfer-big", "+tb", "write with explicit VR big endian TS"); cmd.addOption("--write-xfer-implicit", "+ti", "write with implicit VR little endian TS"); #ifdef WITH_ZLIB cmd.addOption("--write-xfer-deflated", "+td", "write with deflated expl. VR little endian TS"); #endif cmd.addSubGroup("error handling:"); cmd.addOption("--stop-on-error", "-E", "do not write if dump is damaged (default)"); cmd.addOption("--ignore-errors", "+E", "attempt to write even if dump is damaged"); cmd.addSubGroup("post-1993 value representations:"); cmd.addOption("--enable-new-vr", "+u", "enable support for new VRs (UN/UT) (default)"); cmd.addOption("--disable-new-vr", "-u", "disable support for new VRs, convert to OB"); cmd.addSubGroup("group length encoding:"); cmd.addOption("--group-length-recalc", "+g=", "recalculate group lengths if present (default)"); cmd.addOption("--group-length-create", "+g", "always write with group length elements"); cmd.addOption("--group-length-remove", "-g", "always write without group length elements"); cmd.addSubGroup("length encoding in sequences and items:"); cmd.addOption("--length-explicit", "+e", "write with explicit lengths (default)"); cmd.addOption("--length-undefined", "-e", "write with undefined lengths"); cmd.addSubGroup("data set trailing padding (not with --write-dataset):"); cmd.addOption("--padding-retain", "-p=", "do not change padding (default)"); cmd.addOption("--padding-off", "-p", "no padding (implicit if --write-dataset)"); cmd.addOption("--padding-create", "+p", 2, "[f]ile-pad [i]tem-pad: integer", "align file on multiple of f bytes\nand items on multiple of i bytes"); #ifdef WITH_ZLIB cmd.addSubGroup("deflate compression level (only with --write-xfer-deflated):"); cmd.addOption("--compression-level", "+cl", 1, "[l]evel: integer (default: 6)", "0=uncompressed, 1=fastest, 9=best compression"); #endif const char *opt_ifname = NULL; const char *opt_ofname = NULL; E_TransferSyntax opt_xfer = EXS_Unknown; E_EncodingType opt_enctype = EET_ExplicitLength; E_GrpLenEncoding opt_glenc = EGL_recalcGL; E_PaddingEncoding opt_padenc = EPD_withoutPadding; E_FileWriteMode opt_writeMode = EWM_fileformat; OFCmdUnsignedInt opt_filepad = 0; OFCmdUnsignedInt opt_itempad = 0; OFCmdUnsignedInt opt_linelength = DCM_DumpMaxLineSize; OFBool opt_stopOnErrors = OFTrue; OFBool opt_metaInfo = OFTrue; OFBool opt_generateUIDs = OFFalse; OFBool opt_overwriteUIDs = OFFalse; /* evaluate command line */ prepareCmdLineArgs(argc, argv, OFFIS_CONSOLE_APPLICATION); if (app.parseCommandLine(cmd, argc, argv, OFCommandLine::PF_ExpandWildcards)) { /* check exclusive options first */ if (cmd.hasExclusiveOption()) { if (cmd.findOption("--version")) { app.printHeader(OFTrue /*print host identifier*/); COUT << OFendl << "External libraries used:"; #ifdef WITH_ZLIB COUT << OFendl << "- ZLIB, Version " << zlibVersion() << OFendl; #else COUT << " none" << OFendl; #endif return 0; } } /* command line parameters */ cmd.getParam(1, opt_ifname); cmd.getParam(2, opt_ofname); OFLog::configureFromCommandLine(cmd, app); /* input options */ cmd.beginOptionBlock(); if (cmd.findOption("--read-meta-info")) opt_metaInfo = OFTrue; if (cmd.findOption("--ignore-meta-info")) opt_metaInfo = OFFalse; cmd.endOptionBlock(); if (cmd.findOption("--line")) app.checkValue(cmd.getValueAndCheckMin(opt_linelength, 80)); /* processing options */ if (cmd.findOption("--generate-new-uids")) opt_generateUIDs = OFTrue; cmd.beginOptionBlock(); if (cmd.findOption("--dont-overwrite-uids")) opt_overwriteUIDs = OFFalse; if (cmd.findOption("--overwrite-uids")) opt_overwriteUIDs = OFTrue; cmd.endOptionBlock(); /* output options */ cmd.beginOptionBlock(); if (cmd.findOption("--write-file")) opt_writeMode = EWM_fileformat; if (cmd.findOption("--write-dataset")) opt_writeMode = EWM_dataset; cmd.endOptionBlock(); if (cmd.findOption("--update-meta-info")) { app.checkConflict("--update-meta-info", "--write-dataset", opt_writeMode == EWM_dataset); opt_writeMode = EWM_updateMeta; } cmd.beginOptionBlock(); if (cmd.findOption("--write-xfer-same")) opt_xfer = EXS_Unknown;; if (cmd.findOption("--write-xfer-little")) opt_xfer = EXS_LittleEndianExplicit; if (cmd.findOption("--write-xfer-big")) opt_xfer = EXS_BigEndianExplicit; if (cmd.findOption("--write-xfer-implicit")) opt_xfer = EXS_LittleEndianImplicit; #ifdef WITH_ZLIB if (cmd.findOption("--write-xfer-deflated")) opt_xfer = EXS_DeflatedLittleEndianExplicit; #endif cmd.endOptionBlock(); cmd.beginOptionBlock(); if (cmd.findOption("--stop-on-error")) opt_stopOnErrors = OFTrue; if (cmd.findOption("--ignore-errors")) opt_stopOnErrors = OFFalse; cmd.endOptionBlock(); cmd.beginOptionBlock(); if (cmd.findOption("--enable-new-vr")) { dcmEnableUnknownVRGeneration.set(OFTrue); dcmEnableUnlimitedTextVRGeneration.set(OFTrue); } if (cmd.findOption("--disable-new-vr")) { dcmEnableUnknownVRGeneration.set(OFFalse); dcmEnableUnlimitedTextVRGeneration.set(OFFalse); } cmd.endOptionBlock(); cmd.beginOptionBlock(); if (cmd.findOption("--group-length-recalc")) opt_glenc = EGL_recalcGL; if (cmd.findOption("--group-length-create")) opt_glenc = EGL_withGL; if (cmd.findOption("--group-length-remove")) opt_glenc = EGL_withoutGL; cmd.endOptionBlock(); cmd.beginOptionBlock(); if (cmd.findOption("--length-explicit")) opt_enctype = EET_ExplicitLength; if (cmd.findOption("--length-undefined")) opt_enctype = EET_UndefinedLength; cmd.endOptionBlock(); cmd.beginOptionBlock(); if (cmd.findOption("--padding-retain")) { app.checkConflict("--padding-retain", "--write-dataset", opt_writeMode == EWM_dataset); opt_padenc = EPD_noChange; } if (cmd.findOption("--padding-off")) opt_padenc = EPD_withoutPadding; if (cmd.findOption("--padding-create")) { app.checkConflict("--padding-create", "--write-dataset", opt_writeMode == EWM_dataset); app.checkValue(cmd.getValueAndCheckMin(opt_filepad, 0)); app.checkValue(cmd.getValueAndCheckMin(opt_itempad, 0)); opt_padenc = EPD_withPadding; } cmd.endOptionBlock(); #ifdef WITH_ZLIB if (cmd.findOption("--compression-level")) { OFCmdUnsignedInt comprLevel = 0; app.checkDependence("--compression-level", "--write-xfer-deflated", opt_xfer == EXS_DeflatedLittleEndianExplicit); app.checkValue(cmd.getValueAndCheckMinMax(comprLevel, 0, 9)); dcmZlibCompressionLevel.set(OFstatic_cast(int, comprLevel)); } #endif } /* print resource identifier */ OFLOG_DEBUG(dump2dcmLogger, rcsid << OFendl); DcmFileFormat fileformat; DcmMetaInfo *metaheader = (opt_metaInfo) ? fileformat.getMetaInfo() : NULL; DcmDataset *dataset = fileformat.getDataset(); /* make sure data dictionary is loaded */ if (!dcmDataDict.isDictionaryLoaded()) { OFLOG_WARN(dump2dcmLogger, "no data dictionary loaded, check environment variable: " << DCM_DICT_ENVIRONMENT_VARIABLE); } // open input dump file if ((opt_ifname == NULL) || (strlen(opt_ifname) == 0)) { OFLOG_FATAL(dump2dcmLogger, "invalid input filename: "); return 1; } OFLOG_INFO(dump2dcmLogger, "reading dump file: " << opt_ifname); FILE *dumpfile = fopen(opt_ifname, "r"); if (!dumpfile) { OFLOG_FATAL(dump2dcmLogger, "input file does not exist: " << opt_ifname); return 1; } int status = 0; E_TransferSyntax xfer; // read dump file into metaheader and dataset if (readDumpFile(metaheader, dataset, dumpfile, opt_ifname, xfer, opt_stopOnErrors, OFstatic_cast(unsigned long, opt_linelength))) { /* generate new UIDs (if required) */ if (opt_generateUIDs) { char uid[100]; if (opt_overwriteUIDs || !dataset->tagExistsWithValue(DCM_StudyInstanceUID)) { OFLOG_INFO(dump2dcmLogger, "generating new Study Instance UID"); dataset->putAndInsertString(DCM_StudyInstanceUID, dcmGenerateUniqueIdentifier(uid, SITE_STUDY_UID_ROOT)); } if (opt_overwriteUIDs || !dataset->tagExistsWithValue(DCM_SeriesInstanceUID)) { OFLOG_INFO(dump2dcmLogger, "generating new Series Instance UID"); dataset->putAndInsertString(DCM_SeriesInstanceUID, dcmGenerateUniqueIdentifier(uid, SITE_SERIES_UID_ROOT)); } if (opt_overwriteUIDs || !dataset->tagExistsWithValue(DCM_SOPInstanceUID)) { OFLOG_INFO(dump2dcmLogger, "generating new SOP Instance UID"); dataset->putAndInsertString(DCM_SOPInstanceUID, dcmGenerateUniqueIdentifier(uid, SITE_INSTANCE_UID_ROOT)); /* make sure that the file meta information is updated correspondingly */ if (opt_writeMode == EWM_fileformat) opt_writeMode = EWM_updateMeta; } } // write into file format or dataset OFLOG_INFO(dump2dcmLogger, "writing DICOM file"); /* determine transfer syntax to write the file */ if (opt_xfer == EXS_Unknown) { opt_xfer = xfer; /* check whether output xfer is still unknown */ if (opt_xfer == EXS_Unknown) { OFLOG_WARN(dump2dcmLogger, "output transfer syntax unknown, assuming --write-xfer-little"); opt_xfer = EXS_LittleEndianExplicit; } } /* check whether it is possible to write the file */ if (fileformat.canWriteXfer(opt_xfer)) { /* check whether pixel data is compressed */ if ((opt_writeMode == EWM_dataset) && DcmXfer(xfer).isEncapsulated()) { OFLOG_WARN(dump2dcmLogger, "encapsulated pixel data require file format, ignoring --write-dataset"); opt_writeMode = EWM_fileformat; } OFCondition l_error = fileformat.saveFile(opt_ofname, opt_xfer, opt_enctype, opt_glenc, opt_padenc, OFstatic_cast(Uint32, opt_filepad), OFstatic_cast(Uint32, opt_itempad), opt_writeMode); if (l_error == EC_Normal) { OFLOG_INFO(dump2dcmLogger, "dump successfully converted"); } else { OFLOG_ERROR(dump2dcmLogger, l_error.text() << ": writing file: " << opt_ofname); status = 1; } } else { OFLOG_ERROR(dump2dcmLogger, "no conversion to transfer syntax " << DcmXfer(opt_xfer).getXferName() << " possible!"); status = 2; } } fclose(dumpfile); return status; } /* ** CVS/RCS Log: ** $Log: dump2dcm.cc,v $ ** Revision 1.70 2010-10-20 07:41:34 uli ** Made sure isalpha() & friends are only called with valid arguments. ** ** Revision 1.69 2010-10-14 13:13:30 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.68 2010-06-03 10:30:17 joergr ** Replaced calls to strerror() by new helper function OFStandard::strerror() ** which results in using the thread safe version of strerror() if available. ** ** Revision 1.67 2010-05-20 09:23:45 joergr ** Use new OFStandard::getFileSize() method where appropriate. ** ** Revision 1.66 2009-11-13 13:20:23 joergr ** Fixed minor issues in log output. ** ** Revision 1.65 2009-11-04 09:58:06 uli ** Switched to logging mechanism provided by the "new" oflog module ** ** Revision 1.64 2009-08-21 09:25:13 joergr ** Added parameter 'writeMode' to save/write methods which allows for specifying ** whether to write a dataset or fileformat as well as whether to update the ** file meta information or to create a new file meta information header. ** ** Revision 1.63 2009-05-07 09:08:03 joergr ** Added new command line options that allow for generating new Study/Series/SOP ** Instance UIDs (incl. an option for overwriting existing values). ** Added new command line options that allow for ignoring the file meta ** information and for updating particular file meta information. ** ** Revision 1.62 2008-11-26 12:07:42 joergr ** Updated documentation of newDicomElement() in order to reflect the current ** implementation. ** ** Revision 1.61 2008-11-03 16:42:59 joergr ** Added experimental support for importing very large binary files (e.g. pixel ** data) using new createValueFromTempFile() method. ** Added ZLIB related output options --write-xfer-deflated, --compression-level. ** ** Revision 1.60 2008-09-25 14:38:48 joergr ** Moved output of resource identifier in order to avoid printing the same ** information twice. ** ** Revision 1.59 2008-09-25 11:19:48 joergr ** Added support for printing the expanded command line arguments. ** Always output the resource identifier of the command line tool in debug mode. ** ** Revision 1.58 2007/06/07 09:06:01 joergr ** Enhanced support for very large binary data elements (by reducing the overall ** memory consumption). ** ** Revision 1.57 2007/03/09 15:01:02 joergr ** Updated documentation of dump input format. ** ** Revision 1.56 2007/03/07 12:30:13 joergr ** Fixed issue with uncompressed icon images in DICOM images with encapsulated ** transfer syntax ** ** Revision 1.55 2007/02/22 13:07:42 joergr ** Added support for compressed pixel data. ** Added new command line option --write-xfer-same. ** ** Revision 1.54 2006/08/15 15:50:56 meichel ** Updated all code in module dcmdata to correctly compile when ** all standard C++ classes remain in namespace std. ** ** Revision 1.53 2006/07/27 13:52:42 joergr ** Changed parameter "exclusive" of method addOption() from type OFBool into an ** integer parameter "flags". Prepended prefix "PF_" to parseLine() flags. ** Option "--help" is no longer an exclusive option by default. ** ** Revision 1.52 2006/03/23 17:16:21 joergr ** Added missing fclose() statement at the end of main(). ** ** Revision 1.51 2005/12/16 09:07:03 onken ** Added variable initialization to avoid compiler warning ** ** Revision 1.50 2005/12/08 15:40:50 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.49 2004/07/13 09:43:10 meichel ** Fixed memory leak occuring when raw data is read from file. ** ** Revision 1.48 2004/03/05 09:59:00 joergr ** Avoid wrong warning for LUTData (0028,3006) having a VR of US or SS. ** Added initial "hooks" for (compressed) pixel items. ** Added "ignore errors" option (similar to dcmdump). ** ** Revision 1.47 2004/01/16 10:53:16 joergr ** Adapted type casts to new-style typecast operators defined in ofcast.h. ** Removed acknowledgements with e-mail addresses from CVS log. ** ** Revision 1.46 2003/11/05 16:15:27 meichel ** Removed useless "--write-xfer-same" command line option ** ** Revision 1.45 2002/12/05 13:59:29 joergr ** Fixed typo. ** ** Revision 1.44 2002/11/27 12:07:18 meichel ** Adapted module dcmdata to use of new header file ofstdinc.h ** ** Revision 1.43 2002/11/26 08:43:02 meichel ** Replaced all includes for "zlib.h" with ** to avoid inclusion of zlib.h in the makefile dependencies. ** ** Revision 1.42 2002/09/23 17:52:04 joergr ** Prepared code for future support of 'config.guess' host identifiers. ** ** Revision 1.41 2002/09/23 13:50:42 joergr ** Added new command line option "--version" which prints the name and version ** number of external libraries used. ** ** Revision 1.40 2002/08/21 10:14:16 meichel ** Adapted code to new loadFile and saveFile methods, thus removing direct ** use of the DICOM stream classes. ** ** Revision 1.39 2002/04/16 13:38:55 joergr ** Added configurable support for C++ ANSI standard includes (e.g. streams). ** ** Revision 1.38 2001/12/11 14:00:39 joergr ** Fixed bug in 'dump2dcm' parser causing AT attribute values to be ignored. ** ** Revision 1.37 2001/11/09 15:50:53 joergr ** Renamed some of the getValue/getParam methods to avoid ambiguities reported ** by certain compilers. ** ** Revision 1.36 2001/09/25 17:21:01 meichel ** Adapted dcmdata to class OFCondition ** ** Revision 1.35 2001/06/01 15:48:30 meichel ** Updated copyright header ** ** Revision 1.34 2000/04/14 15:42:54 meichel ** Global VR generation flags are now derived from OFGlobal and, thus, ** safe for use in multi-thread applications. ** ** Revision 1.33 2000/03/08 16:26:06 meichel ** Updated copyright header. ** ** Revision 1.32 2000/03/06 18:09:38 joergr ** Avoid empty statement in the body of if-statements (MSVC6 reports warnings). ** ** Revision 1.31 2000/03/03 14:05:16 meichel ** Implemented library support for redirecting error messages into memory ** instead of printing them to stdout/stderr for GUI applications. ** ** Revision 1.30 2000/02/29 11:48:51 meichel ** Removed support for VS value representation. This was proposed in CP 101 ** but never became part of the standard. ** ** Revision 1.29 2000/02/23 15:11:36 meichel ** Corrected macro for Borland C++ Builder 4 workaround. ** ** Revision 1.28 2000/02/10 16:02:51 joergr ** Enhanced handling of PixelData/Item element. Externally stored raw data is ** now always imported as little endian and swapped if necessary. This change ** reflects the new 'export' feature of dcmdump. ** ** Revision 1.27 2000/02/01 10:11:58 meichel ** Avoiding to include as extern "C" on Borland C++ Builder 4, ** workaround for bug in compiler header files. ** ** Revision 1.26 1999/05/03 14:13:40 joergr ** Minor code purifications to keep Sun CC 2.0.1 quiet. ** ** Revision 1.25 1999/04/27 17:50:53 joergr ** Adapted console applications to new OFCommandLine and OFConsoleApplication ** functionality. ** ** Revision 1.24 1999/04/27 12:23:27 meichel ** Prevented dcmdata applications from opening a file with empty filename, ** leads to application crash on Win32. ** ** Revision 1.23 1999/03/31 09:24:23 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.22 1999/03/29 10:14:15 meichel ** Adapted command line options of dcmdata applications to new scheme. ** ** Revision 1.21 1999/03/22 16:16:01 meichel ** dump2dcm now allows to include the contents of binary files ** as OB/OW values while converting a dump to a DICOM file. ** ** Revision 1.20 1999/01/07 14:13:12 meichel ** Corrected bug in dump2dcm that prevented the correct processing of ** dumps created with dcmdump if they contained the "internal" VR markers ** "xs" (US or SS) or "ox" (OB or OW). ** ** Revision 1.19 1998/01/27 10:51:27 meichel ** Removed some unused variables, meaningless const modifiers ** and unreached statements. ** ** Revision 1.18 1998/01/14 14:41:15 hewett ** Modified existing -u command line option to also disable generation ** of UT and VS (previously just disabled generation of UN). ** ** Revision 1.17 1997/08/05 07:34:54 andreas ** Corrected Error handling of SQ in dump2dcm ** ** Revision 1.16 1997/07/21 07:59:02 andreas ** - Deleted support for DcmPixelItems and DcmPixelSequences in dump2dcm ** ToDo: New support should be added in the future compatible to ** the new DcmPixel class. ** - Replace all boolean types (BOOLEAN, CTNBOOLEAN, DICOM_BOOL, BOOL) ** with one unique boolean type OFBool. ** ** Revision 1.15 1997/07/03 15:09:40 andreas ** - removed debugging functions Bdebug() and Edebug() since ** they write a static array and are not very useful at all. ** Cdebug and Vdebug are merged since they have the same semantics. ** The debugging functions in dcmdata changed their interfaces ** (see dcmdata/include/dcdebug.h) ** ** Revision 1.14 1997/05/30 06:44:57 andreas ** - fixed scanf format problem leading to warnings on 64 bit machines. ** ** Revision 1.13 1997/05/29 15:52:52 meichel ** Added constant for dcmtk release date in dcuid.h. ** All dcmtk applications now contain a version string ** which is displayed with the command line options ("usage" message) ** and which can be queried in the binary with the "ident" command. ** ** Revision 1.12 1997/05/22 13:26:25 hewett ** Modified the test for presence of a data dictionary to use the ** method DcmDataDictionary::isDictionaryLoaded(). ** ** Revision 1.11 1997/05/20 07:57:12 andreas ** - Removed obsolete applications file2ds and ds2file. The functionality of these ** applications is now peformed by dcmconv. Unified calling parameters ** are implemented in dump2dcm, dcmdump and dcmconv. ** ** Revision 1.10 1997/05/16 08:31:06 andreas ** - Revised handling of GroupLength elements and support of ** DataSetTrailingPadding elements. The enumeratio E_GrpLenEncoding ** got additional enumeration values (for a description see dctypes.h). ** addGroupLength and removeGroupLength methods are replaced by ** computeGroupLengthAndPadding. To support Padding, the parameters of ** element and sequence write functions changed. ** ** Revision 1.9 1997/04/18 08:06:56 andreas ** - Minor corrections: correct some warnings of the SUN-C++ Compiler ** concerning the assignments of wrong types and inline compiler ** errors ** - The put/get-methods for all VRs did not conform to the C++-Standard ** draft. Some Compilers (e.g. SUN-C++ Compiler, Metroworks ** CodeWarrier, etc.) create many warnings concerning the hiding of ** overloaded get methods in all derived classes of DcmElement. ** So the interface of all value representation classes in the ** library are changed rapidly, e.g. ** OFCondition get(Uint16 & value, const unsigned long pos); ** becomes ** OFCondition getUint16(Uint16 & value, const unsigned long pos); ** All (retired) "returntype get(...)" methods are deleted. ** For more information see dcmdata/include/dcelem.h ** ** Revision 1.8 1997/03/27 15:47:25 hewett ** Added command line switche to allow generation of UN to be ** disabled (it is enabled by default). ** ** Revision 1.7 1996/09/24 16:13:51 hewett ** Added preliminary support for the Macintosh environment (GUSI library). ** ** Revision 1.6 1996/05/02 17:00:23 hewett ** Corrected program name in usage description. ** ** Revision 1.5 1996/05/02 15:55:11 hewett ** Stopped whitespace being stripped from inside value strings when ** no [] delimiter present. Now only leading and trailing whitespace ** is stripped. ** ** Revision 1.4 1996/04/27 12:13:01 hewett ** Corrected bug in last bug-fix. A tag value [some text] was being ** parsed as an empty string. Now both [] and [some text] appear to ** work as intended. ** ** Revision 1.3 1996/03/22 12:38:44 andreas ** Correct some mistakes: handling [] as empty string (no value field) ** handling =Name correct if Name is not correct ** ** Revision 1.2 1996/03/12 15:11:39 hewett ** Added call to prepareCmdLineArgs to enable command line arguments ** in environments which do not provide them. ** ** Revision 1.1 1996/01/29 13:36:38 andreas ** dump2dcm added convert ASCII descriptions into DICOM files ** ** */ dcmtk-3.6.0/dcmdata/apps/img2dcm.cc0000644000310500011400000004412211455600772016242 0ustar joergrdicom3/* * * Copyright (C) 2007-2010, 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: dcmdata * * Author: Michael Onken * * Purpose: Implements utility for converting standard image formats to DICOM * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:13:30 $ * CVS/RCS Revision: $Revision: 1.20 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" #include "dcmtk/dcmdata/cmdlnarg.h" #include "dcmtk/ofstd/ofconapp.h" #include "dcmtk/dcmdata/dcuid.h" #include "dcmtk/dcmdata/dcfilefo.h" #include "dcmtk/dcmdata/dcdict.h" #include "dcmtk/dcmdata/libi2d/i2d.h" #include "dcmtk/dcmdata/libi2d/i2djpgs.h" #include "dcmtk/dcmdata/libi2d/i2dbmps.h" #include "dcmtk/dcmdata/libi2d/i2dplsc.h" #include "dcmtk/dcmdata/libi2d/i2dplvlp.h" #include "dcmtk/dcmdata/libi2d/i2dplnsc.h" #define OFFIS_CONSOLE_APPLICATION "img2dcm" static char rcsid[] = "$dcmtk: " OFFIS_CONSOLE_APPLICATION " v" OFFIS_DCMTK_VERSION " " OFFIS_DCMTK_RELEASEDATE " $"; #define SHORTCOL 4 #define LONGCOL 21 static OFLogger img2dcmLogger = OFLog::getLogger("dcmtk.apps." OFFIS_CONSOLE_APPLICATION); static OFCondition evaluateFromFileOptions(OFCommandLine& cmd, Image2Dcm& converter) { OFCondition cond; // Parse command line options dealing with DICOM file import if ( cmd.findOption("--dataset-from") ) { OFString tempStr; OFCommandLine::E_ValueStatus valStatus; valStatus = cmd.getValue(tempStr); if (valStatus != OFCommandLine::VS_Normal) return makeOFCondition(OFM_dcmdata, 18, OF_error, "Unable to read value of --dataset-from option"); converter.setTemplateFile(tempStr); } if (cmd.findOption("--study-from")) { OFString tempStr; OFCommandLine::E_ValueStatus valStatus; valStatus = cmd.getValue(tempStr); if (valStatus != OFCommandLine::VS_Normal) return makeOFCondition(OFM_dcmdata, 18, OF_error, "Unable to read value of --study-from option"); converter.setStudyFrom(tempStr); } if (cmd.findOption("--series-from")) { OFString tempStr; OFCommandLine::E_ValueStatus valStatus; valStatus = cmd.getValue(tempStr); if (valStatus != OFCommandLine::VS_Normal) return makeOFCondition(OFM_dcmdata, 18, OF_error, "Unable to read value of --series-from option"); converter.setSeriesFrom(tempStr); } if (cmd.findOption("--instance-inc")) converter.setIncrementInstanceNumber(OFTrue); // Return success return EC_Normal; } static void addCmdLineOptions(OFCommandLine& cmd) { cmd.addParam("imgfile-in", "image input filename"); cmd.addParam("dcmfile-out", "DICOM output filename"); cmd.addGroup("general options:", LONGCOL, SHORTCOL + 2); cmd.addOption("--help", "-h", "print this help text and exit", OFCommandLine::AF_Exclusive); cmd.addOption("--version", "print version information and exit", OFCommandLine::AF_Exclusive); OFLog::addOptions(cmd); cmd.addGroup("input options:", LONGCOL, SHORTCOL + 2); cmd.addSubGroup("general:"); cmd.addOption("--input-format", "-i", 1, "[i]nput file format: string", "supported formats: JPEG (default), BMP"); cmd.addOption("--dataset-from", "-df", 1, "[f]ilename: string", "use dataset from DICOM file f"); cmd.addOption("--study-from", "-stf", 1, "[f]ilename: string", "read patient/study from DICOM file f"); cmd.addOption("--series-from", "-sef", 1, "[f]ilename: string", "read patient/study/series from DICOM file f"); cmd.addOption("--instance-inc", "-ii", "increase instance number read from DICOM file"); cmd.addSubGroup("JPEG format:"); cmd.addOption("--disable-progr", "-dp", "disable support for progressive JPEG"); cmd.addOption("--disable-ext", "-de", "disable support for extended sequential JPEG"); cmd.addOption("--insist-on-jfif", "-jf", "insist on JFIF header"); cmd.addOption("--keep-appn", "-ka", "keep APPn sections (except JFIF)"); cmd.addGroup("processing options:", LONGCOL, SHORTCOL + 2); cmd.addSubGroup("attribute checking:"); cmd.addOption("--do-checks", "enable attribute validity checking (default)"); cmd.addOption("--no-checks", "disable attribute validity checking"); cmd.addOption("--insert-type2", "+i2", "insert missing type 2 attributes (default)\n(only with --do-checks)"); cmd.addOption("--no-type2-insert", "-i2", "do not insert missing type 2 attributes \n(only with --do-checks)"); cmd.addOption("--invent-type1", "+i1", "invent missing type 1 attributes (default)\n(only with --do-checks)"); cmd.addOption("--no-type1-invent", "-i1", "do not invent missing type 1 attributes\n(only with --do-checks)"); cmd.addSubGroup("character set:"); cmd.addOption("--latin1", "+l1", "set latin-1 as standard character set (default)"); cmd.addOption("--no-latin1", "-l1", "keep 7-bit ASCII as standard character set"); cmd.addSubGroup("other processing options:"); cmd.addOption("--key", "-k", 1, "[k]ey: gggg,eeee=\"str\", path or dict. name=\"str\"", "add further attribute"); cmd.addGroup("output options:"); cmd.addSubGroup("target SOP class:"); cmd.addOption("--sec-capture", "-sc", "write Secondary Capture SOP class (default)"); cmd.addOption("--new-sc", "-nsc", "write new Secondary Capture SOP classes"); cmd.addOption("--vl-photo", "-vlp", "write Visible Light Photographic SOP class"); cmd.addSubGroup("output file format:"); cmd.addOption("--write-file", "+F", "write file format (default)"); cmd.addOption("--write-dataset", "-F", "write data set without file meta information"); cmd.addSubGroup("group length encoding:"); cmd.addOption("--group-length-recalc", "+g=", "recalculate group lengths if present (default)"); cmd.addOption("--group-length-create", "+g", "always write with group length elements"); cmd.addOption("--group-length-remove", "-g", "always write without group length elements"); cmd.addSubGroup("length encoding in sequences and items:"); cmd.addOption("--length-explicit", "+e", "write with explicit lengths (default)"); cmd.addOption("--length-undefined", "-e", "write with undefined lengths"); cmd.addSubGroup("data set trailing padding (not with --write-dataset):"); cmd.addOption("--padding-off", "-p", "no padding (implicit if --write-dataset)"); cmd.addOption("--padding-create", "+p", 2, "[f]ile-pad [i]tem-pad: integer", "align file on multiple of f bytes\nand items on multiple of i bytes"); } static OFCondition startConversion(OFCommandLine& cmd, int argc, char *argv[]) { // Parse command line and exclusive options prepareCmdLineArgs(argc, argv, OFFIS_CONSOLE_APPLICATION); OFConsoleApplication app(OFFIS_CONSOLE_APPLICATION, "Convert standard image formats into DICOM format", rcsid); if (app.parseCommandLine(cmd, argc, argv, OFCommandLine::PF_ExpandWildcards)) { /* check exclusive options first */ if (cmd.hasExclusiveOption()) { if (cmd.findOption("--version")) { app.printHeader(OFTrue /*print host identifier*/); exit(0); } } } /* print resource identifier */ OFLOG_DEBUG(img2dcmLogger, rcsid << OFendl); // Main class for controlling conversion Image2Dcm i2d; // Output plugin to use (ie. SOP class to write) I2DOutputPlug *outPlug = NULL; // Input plugin to use (ie. file format to read) I2DImgSource *inputPlug = NULL; // Group length encoding mode for output DICOM file E_GrpLenEncoding grpLengthEnc = EGL_recalcGL; // Item and Sequence encoding mode for output DICOM file E_EncodingType lengthEnc = EET_ExplicitLength; // Padding mode for output DICOM file E_PaddingEncoding padEnc = EPD_noChange; // File pad length for output DICOM file OFCmdUnsignedInt filepad = 0; // Item pad length for output DICOM file OFCmdUnsignedInt itempad = 0; // Write only pure dataset, i.e. without meta header E_FileWriteMode writeMode = EWM_fileformat; // Override keys are applied at the very end of the conversion "pipeline" OFList overrideKeys; // The transfersytanx proposed to be written by output plugin E_TransferSyntax writeXfer; // Parse rest of command line options OFLog::configureFromCommandLine(cmd, app); OFString pixDataFile, outputFile, tempStr; cmd.getParam(1, tempStr); if (tempStr.length() == 0) { OFLOG_ERROR(img2dcmLogger, "No image input filename specified"); return EC_IllegalCall; } else pixDataFile = tempStr; cmd.getParam(2, tempStr); if (tempStr.length() == 0) { OFLOG_ERROR(img2dcmLogger, "No DICOM output filename specified"); return EC_IllegalCall; } else outputFile = tempStr; if (cmd.findOption("--input-format")) { app.checkValue(cmd.getValue(tempStr)); if (tempStr == "JPEG") { inputPlug = new I2DJpegSource(); } else if (tempStr == "BMP") { inputPlug = new I2DBmpSource(); } else { return makeOFCondition(OFM_dcmdata, 18, OF_error, "No plugin for selected input format available"); } if (!inputPlug) { return EC_MemoryExhausted; } } else // default is JPEG { inputPlug = new I2DJpegSource(); } OFLOG_INFO(img2dcmLogger, OFFIS_CONSOLE_APPLICATION ": Instantiated input plugin: " << inputPlug->inputFormat()); // Find out which plugin to use cmd.beginOptionBlock(); if (cmd.findOption("--sec-capture")) outPlug = new I2DOutputPlugSC(); if (cmd.findOption("--vl-photo")) { outPlug = new I2DOutputPlugVLP(); } if (cmd.findOption("--new-sc")) outPlug = new I2DOutputPlugNewSC(); cmd.endOptionBlock(); if (!outPlug) // default is the old Secondary Capture object outPlug = new I2DOutputPlugSC(); if (outPlug == NULL) return EC_MemoryExhausted; OFLOG_INFO(img2dcmLogger, OFFIS_CONSOLE_APPLICATION ": Instantiatiated output plugin: " << outPlug->ident()); cmd.beginOptionBlock(); if (cmd.findOption("--write-file")) writeMode = EWM_fileformat; if (cmd.findOption("--write-dataset")) writeMode = EWM_dataset; cmd.endOptionBlock(); cmd.beginOptionBlock(); if (cmd.findOption("--group-length-recalc")) grpLengthEnc = EGL_recalcGL; if (cmd.findOption("--group-length-create")) grpLengthEnc = EGL_withGL; if (cmd.findOption("--group-length-remove")) grpLengthEnc = EGL_withoutGL; cmd.endOptionBlock(); cmd.beginOptionBlock(); if (cmd.findOption("--length-explicit")) lengthEnc = EET_ExplicitLength; if (cmd.findOption("--length-undefined")) lengthEnc = EET_UndefinedLength; cmd.endOptionBlock(); cmd.beginOptionBlock(); if (cmd.findOption("--padding-off")) { filepad = 0; itempad = 0; } else if (cmd.findOption("--padding-create")) { OFCmdUnsignedInt opt_filepad; OFCmdUnsignedInt opt_itempad; app.checkValue(cmd.getValueAndCheckMin(opt_filepad, 0)); app.checkValue(cmd.getValueAndCheckMin(opt_itempad, 0)); itempad = opt_itempad; filepad = opt_filepad; } cmd.endOptionBlock(); // create override attribute dataset (copied from findscu code) if (cmd.findOption("--key", 0, OFCommandLine::FOM_FirstFromLeft)) { const char *ovKey = NULL; do { app.checkValue(cmd.getValue(ovKey)); overrideKeys.push_back(ovKey); } while (cmd.findOption("--key", 0, OFCommandLine::FOM_NextFromLeft)); } i2d.setOverrideKeys(overrideKeys); // Test for ISO Latin 1 option OFBool insertLatin1 = OFTrue; cmd.beginOptionBlock(); if (cmd.findOption("--latin1")) insertLatin1 = OFTrue; if (cmd.findOption("--no-latin1")) insertLatin1 = OFFalse; cmd.endOptionBlock(); i2d.setISOLatin1(insertLatin1); // evaluate validity checking options OFBool insertType2 = OFTrue; OFBool inventType1 = OFTrue; OFBool doChecks = OFTrue; cmd.beginOptionBlock(); if (cmd.findOption("--no-checks")) doChecks = OFFalse; if (cmd.findOption("--do-checks")) doChecks = OFTrue; cmd.endOptionBlock(); cmd.beginOptionBlock(); if (cmd.findOption("--insert-type2")) insertType2 = OFTrue; if (cmd.findOption("--no-type2-insert")) insertType2 = OFFalse; cmd.endOptionBlock(); cmd.beginOptionBlock(); if (cmd.findOption("--invent-type1")) inventType1 = OFTrue; if (cmd.findOption("--no-type1-invent")) inventType1 = OFFalse; cmd.endOptionBlock(); i2d.setValidityChecking(doChecks, insertType2, inventType1); outPlug->setValidityChecking(doChecks, insertType2, inventType1); // evaluate --xxx-from options and transfer syntax options OFCondition cond; cond = evaluateFromFileOptions(cmd, i2d); if (cond.bad()) { delete outPlug; outPlug = NULL; delete inputPlug; inputPlug = NULL; return cond; } if (inputPlug->inputFormat() == "JPEG") { I2DJpegSource *jpgSource = OFstatic_cast(I2DJpegSource*, inputPlug); if (!jpgSource) { delete outPlug; outPlug = NULL; delete inputPlug; inputPlug = NULL; return EC_MemoryExhausted; } if ( cmd.findOption("--disable-progr") ) jpgSource->setProgrSupport(OFFalse); if ( cmd.findOption("--disable-ext") ) jpgSource->setExtSeqSupport(OFFalse); if ( cmd.findOption("--insist-on-jfif") ) jpgSource->setInsistOnJFIF(OFTrue); if ( cmd.findOption("--keep-appn") ) jpgSource->setKeepAPPn(OFTrue); } inputPlug->setImageFile(pixDataFile); /* make sure data dictionary is loaded */ if (!dcmDataDict.isDictionaryLoaded()) { OFLOG_WARN(img2dcmLogger, "no data dictionary loaded, check environment variable: " << DCM_DICT_ENVIRONMENT_VARIABLE); } DcmDataset *resultObject = NULL; OFLOG_INFO(img2dcmLogger, OFFIS_CONSOLE_APPLICATION ": Starting image conversion"); cond = i2d.convert(inputPlug, outPlug, resultObject, writeXfer); // Save if (cond.good()) { OFLOG_INFO(img2dcmLogger, OFFIS_CONSOLE_APPLICATION ": Saving output DICOM to file " << outputFile); DcmFileFormat dcmff(resultObject); cond = dcmff.saveFile(outputFile.c_str(), writeXfer, lengthEnc, grpLengthEnc, padEnc, filepad, itempad, writeMode); } // Cleanup and return delete outPlug; outPlug = NULL; delete inputPlug; inputPlug = NULL; delete resultObject; resultObject = NULL; return cond; } int main(int argc, char *argv[]) { // variables for command line OFConsoleApplication app(OFFIS_CONSOLE_APPLICATION, "Convert image file to DICOM", rcsid); OFCommandLine cmd; cmd.setOptionColumns(LONGCOL, SHORTCOL); cmd.setParamColumn(LONGCOL + SHORTCOL + 4); addCmdLineOptions(cmd); OFCondition cond = startConversion(cmd, argc, argv); if (cond.bad()) { OFLOG_FATAL(img2dcmLogger, "Error converting file: " << cond.text()); return 1; } return 0; } /* * CVS/RCS Log: * $Log: img2dcm.cc,v $ * Revision 1.20 2010-10-14 13:13:30 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.19 2010-10-06 09:14:23 joergr * Added text on the fact that the --key option also supports attribute paths. * Introduced meaningful sub groups for the processing command line options. * * Revision 1.18 2009-11-13 13:20:23 joergr * Fixed minor issues in log output. * * Revision 1.17 2009-11-04 09:58:06 uli * Switched to logging mechanism provided by the "new" oflog module * * Revision 1.16 2009-09-30 08:05:25 uli * Stop including dctk.h in libi2d's header files. * * Revision 1.15 2009-08-21 09:25:13 joergr * Added parameter 'writeMode' to save/write methods which allows for specifying * whether to write a dataset or fileformat as well as whether to update the * file meta information or to create a new file meta information header. * * Revision 1.14 2009-07-16 14:26:25 onken * Added img2dcm input plugin for the BMP graphics format (at the moment only * support for 24 Bit RGB). * * Revision 1.13 2009-07-10 13:16:10 onken * Added path functionality for --key option and lets the code make use * of the DcmPath classes. * * Revision 1.12 2009-04-24 12:20:42 joergr * Fixed minor inconsistencies regarding layout/formatting in syntax usage. * * Revision 1.11 2009-04-21 14:02:49 joergr * Fixed minor inconsistencies in manpage / syntax usage. * * Revision 1.10 2009-03-31 10:47:41 onken * Added NULL pointer check. * * Revision 1.9 2008-10-29 18:03:33 joergr * Fixed minor inconsistencies. * * Revision 1.8 2008-09-25 14:35:34 joergr * Moved checking on presence of the data dictionary. * * Revision 1.7 2008-09-25 11:19:48 joergr * Added support for printing the expanded command line arguments. * Always output the resource identifier of the command line tool in debug mode. * * Revision 1.6 2008-01-16 16:32:14 onken * Fixed some empty or doubled log messages in libi2d files. * * Revision 1.5 2008-01-16 15:19:41 onken * Moved library "i2dlib" from /dcmdata/libsrc/i2dlib to /dcmdata/libi2d * * Revision 1.4 2008-01-14 16:51:11 joergr * Fixed minor inconsistencies. * * Revision 1.3 2008-01-11 14:16:04 onken * Added various options to i2dlib. Changed logging to use a configurable * logstream. Added output plugin for the new Multiframe Secondary Capture SOP * Classes. Added mode for JPEG plugin to copy exsiting APPn markers (except * JFIF). Changed img2dcm default behaviour to invent type1/type2 attributes (no * need for templates any more). Added some bug fixes. * * Revision 1.1 2007/11/08 16:00:34 onken * Initial checkin of img2dcm application and corresponding library i2dlib. * * */ dcmtk-3.6.0/dcmdata/apps/dcmcrle.cc0000644000310500011400000004174011455600772016334 0ustar joergrdicom3/* * * Copyright (C) 2002-2010, 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: dcmdata * * Author: Marco Eichelberg * * Purpose: Compress DICOM file with RLE Transfer Syntax * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:13:30 $ * CVS/RCS Revision: $Revision: 1.22 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #define INCLUDE_CSTDLIB #define INCLUDE_CSTDIO #define INCLUDE_CSTRING #include "dcmtk/ofstd/ofstdinc.h" #ifdef HAVE_GUSI_H #include #endif #include "dcmtk/dcmdata/dctk.h" #include "dcmtk/dcmdata/cmdlnarg.h" #include "dcmtk/ofstd/ofconapp.h" #include "dcmtk/dcmdata/dcuid.h" /* for dcmtk version name */ #include "dcmtk/dcmdata/dcrleerg.h" /* for DcmRLEEncoderRegistration */ #ifdef WITH_ZLIB #include /* for zlibVersion() */ #endif #define OFFIS_CONSOLE_APPLICATION "dcmcrle" static OFLogger dcmcrleLogger = OFLog::getLogger("dcmtk.apps." OFFIS_CONSOLE_APPLICATION); static char rcsid[] = "$dcmtk: " OFFIS_CONSOLE_APPLICATION " v" OFFIS_DCMTK_VERSION " " OFFIS_DCMTK_RELEASEDATE " $"; // ******************************************** #define SHORTCOL 3 #define LONGCOL 21 int main(int argc, char *argv[]) { #ifdef HAVE_GUSI_H GUSISetup(GUSIwithSIOUXSockets); GUSISetup(GUSIwithInternetSockets); #endif const char *opt_ifname = NULL; const char *opt_ofname = NULL; E_FileReadMode opt_readMode = ERM_autoDetect; E_TransferSyntax opt_ixfer = EXS_Unknown; E_GrpLenEncoding opt_oglenc = EGL_recalcGL; E_EncodingType opt_oenctype = EET_ExplicitLength; E_PaddingEncoding opt_opadenc = EPD_noChange; OFCmdUnsignedInt opt_filepad = 0; OFCmdUnsignedInt opt_itempad = 0; // RLE options E_TransferSyntax opt_oxfer = EXS_RLELossless; OFCmdUnsignedInt opt_fragmentSize = 0; // 0=unlimited OFBool opt_createOffsetTable = OFTrue; OFBool opt_uidcreation = OFFalse; OFBool opt_secondarycapture = OFFalse; OFConsoleApplication app(OFFIS_CONSOLE_APPLICATION, "Encode DICOM file to RLE transfer syntax", rcsid); OFCommandLine cmd; cmd.setOptionColumns(LONGCOL, SHORTCOL); cmd.setParamColumn(LONGCOL + SHORTCOL + 4); cmd.addParam("dcmfile-in", "DICOM input filename to be converted"); cmd.addParam("dcmfile-out", "DICOM output filename"); cmd.addGroup("general options:", LONGCOL, SHORTCOL + 2); cmd.addOption("--help", "-h", "print this help text and exit", OFCommandLine::AF_Exclusive); cmd.addOption("--version", "print version information and exit", OFCommandLine::AF_Exclusive); OFLog::addOptions(cmd); cmd.addGroup("input options:"); cmd.addSubGroup("input file format:"); cmd.addOption("--read-file", "+f", "read file format or data set (default)"); cmd.addOption("--read-file-only", "+fo", "read file format only"); cmd.addOption("--read-dataset", "-f", "read data set without file meta information"); cmd.addSubGroup("input transfer syntax:", LONGCOL, SHORTCOL); cmd.addOption("--read-xfer-auto", "-t=", "use TS recognition (default)"); cmd.addOption("--read-xfer-detect", "-td", "ignore TS specified in the file meta header"); cmd.addOption("--read-xfer-little", "-te", "read with explicit VR little endian TS"); cmd.addOption("--read-xfer-big", "-tb", "read with explicit VR big endian TS"); cmd.addOption("--read-xfer-implicit", "-ti", "read with implicit VR little endian TS"); cmd.addGroup("encapsulated pixel data encoding options:"); cmd.addSubGroup("pixel data fragmentation:"); cmd.addOption("--fragment-per-frame", "+ff", "encode each frame as one fragment (default)"); cmd.addOption("--fragment-size", "+fs", 1, "[s]ize: integer", "limit fragment size to s kbytes (non-standard)"); cmd.addSubGroup("basic offset table encoding:"); cmd.addOption("--offset-table-create", "+ot", "create offset table (default)"); cmd.addOption("--offset-table-empty", "-ot", "leave offset table empty"); cmd.addSubGroup("SOP Class UID:"); cmd.addOption("--class-default", "+cd", "keep SOP Class UID (default)"); cmd.addOption("--class-sc", "+cs", "convert to Secondary Capture Image\n(implies --uid-always)"); cmd.addSubGroup("SOP Instance UID:"); cmd.addOption("--uid-never", "+un", "never assign new UID (default)"); cmd.addOption("--uid-always", "+ua", "always assign new UID"); cmd.addGroup("output options:"); cmd.addSubGroup("post-1993 value representations:"); cmd.addOption("--enable-new-vr", "+u", "enable support for new VRs (UN/UT) (default)"); cmd.addOption("--disable-new-vr", "-u", "disable support for new VRs, convert to OB"); cmd.addSubGroup("group length encoding:"); cmd.addOption("--group-length-recalc", "+g=", "recalculate group lengths if present (default)"); cmd.addOption("--group-length-create", "+g", "always write with group length elements"); cmd.addOption("--group-length-remove", "-g", "always write without group length elements"); cmd.addSubGroup("length encoding in sequences and items:"); cmd.addOption("--length-explicit", "+e", "write with explicit lengths (default)"); cmd.addOption("--length-undefined", "-e", "write with undefined lengths"); cmd.addSubGroup("data set trailing padding:"); cmd.addOption("--padding-retain", "-p=", "do not change padding (default)"); cmd.addOption("--padding-off", "-p", "no padding"); cmd.addOption("--padding-create", "+p", 2, "[f]ile-pad [i]tem-pad: integer", "align file on multiple of f bytes\nand items on multiple of i bytes"); /* evaluate command line */ prepareCmdLineArgs(argc, argv, OFFIS_CONSOLE_APPLICATION); if (app.parseCommandLine(cmd, argc, argv, OFCommandLine::PF_ExpandWildcards)) { /* check exclusive options first */ if (cmd.hasExclusiveOption()) { if (cmd.findOption("--version")) { app.printHeader(OFTrue /*print host identifier*/); COUT << OFendl << "External libraries used:"; #ifdef WITH_ZLIB COUT << OFendl << "- ZLIB, Version " << zlibVersion() << OFendl; #else COUT << " none" << OFendl; #endif return 0; } } /* command line parameters */ cmd.getParam(1, opt_ifname); cmd.getParam(2, opt_ofname); OFLog::configureFromCommandLine(cmd, app); cmd.beginOptionBlock(); if (cmd.findOption("--read-file")) opt_readMode = ERM_autoDetect; if (cmd.findOption("--read-file-only")) opt_readMode = ERM_fileOnly; if (cmd.findOption("--read-dataset")) opt_readMode = ERM_dataset; cmd.endOptionBlock(); cmd.beginOptionBlock(); if (cmd.findOption("--read-xfer-auto")) opt_ixfer = EXS_Unknown; if (cmd.findOption("--read-xfer-detect")) dcmAutoDetectDatasetXfer.set(OFTrue); if (cmd.findOption("--read-xfer-little")) { app.checkDependence("--read-xfer-little", "--read-dataset", opt_readMode == ERM_dataset); opt_ixfer = EXS_LittleEndianExplicit; } if (cmd.findOption("--read-xfer-big")) { app.checkDependence("--read-xfer-big", "--read-dataset", opt_readMode == ERM_dataset); opt_ixfer = EXS_BigEndianExplicit; } if (cmd.findOption("--read-xfer-implicit")) { app.checkDependence("--read-xfer-implicit", "--read-dataset", opt_readMode == ERM_dataset); opt_ixfer = EXS_LittleEndianImplicit; } cmd.endOptionBlock(); // RLE options cmd.beginOptionBlock(); if (cmd.findOption("--fragment-per-frame")) opt_fragmentSize = 0; if (cmd.findOption("--fragment-size")) { app.checkValue(cmd.getValueAndCheckMin(opt_fragmentSize, OFstatic_cast(OFCmdUnsignedInt, 1))); } cmd.endOptionBlock(); cmd.beginOptionBlock(); if (cmd.findOption("--offset-table-create")) opt_createOffsetTable = OFTrue; if (cmd.findOption("--offset-table-empty")) opt_createOffsetTable = OFFalse; cmd.endOptionBlock(); cmd.beginOptionBlock(); if (cmd.findOption("--class-default")) opt_secondarycapture = OFFalse; if (cmd.findOption("--class-sc")) opt_secondarycapture = OFTrue; cmd.endOptionBlock(); cmd.beginOptionBlock(); if (cmd.findOption("--uid-always")) opt_uidcreation = OFTrue; if (cmd.findOption("--uid-never")) opt_uidcreation = OFFalse; cmd.endOptionBlock(); cmd.beginOptionBlock(); if (cmd.findOption("--enable-new-vr")) { dcmEnableUnknownVRGeneration.set(OFTrue); dcmEnableUnlimitedTextVRGeneration.set(OFTrue); } if (cmd.findOption("--disable-new-vr")) { dcmEnableUnknownVRGeneration.set(OFFalse); dcmEnableUnlimitedTextVRGeneration.set(OFFalse); } cmd.endOptionBlock(); cmd.beginOptionBlock(); if (cmd.findOption("--group-length-recalc")) opt_oglenc = EGL_recalcGL; if (cmd.findOption("--group-length-create")) opt_oglenc = EGL_withGL; if (cmd.findOption("--group-length-remove")) opt_oglenc = EGL_withoutGL; cmd.endOptionBlock(); cmd.beginOptionBlock(); if (cmd.findOption("--length-explicit")) opt_oenctype = EET_ExplicitLength; if (cmd.findOption("--length-undefined")) opt_oenctype = EET_UndefinedLength; cmd.endOptionBlock(); cmd.beginOptionBlock(); if (cmd.findOption("--padding-retain")) opt_opadenc = EPD_noChange; if (cmd.findOption("--padding-off")) opt_opadenc = EPD_withoutPadding; if (cmd.findOption("--padding-create")) { app.checkValue(cmd.getValueAndCheckMin(opt_filepad, 0)); app.checkValue(cmd.getValueAndCheckMin(opt_itempad, 0)); opt_opadenc = EPD_withPadding; } cmd.endOptionBlock(); } /* print resource identifier */ OFLOG_DEBUG(dcmcrleLogger, rcsid << OFendl); // register RLE compression codec DcmRLEEncoderRegistration::registerCodecs(opt_uidcreation, opt_fragmentSize, opt_createOffsetTable, opt_secondarycapture); /* make sure data dictionary is loaded */ if (!dcmDataDict.isDictionaryLoaded()) { OFLOG_WARN(dcmcrleLogger, "no data dictionary loaded, check environment variable: " << DCM_DICT_ENVIRONMENT_VARIABLE); } // open inputfile if ((opt_ifname == NULL) || (strlen(opt_ifname) == 0)) { OFLOG_FATAL(dcmcrleLogger, "invalid filename: "); return 1; } DcmFileFormat fileformat; DcmDataset * dataset = fileformat.getDataset(); OFLOG_INFO(dcmcrleLogger, "open input file " << opt_ifname); OFCondition error = fileformat.loadFile(opt_ifname, opt_ixfer, EGL_noChange, DCM_MaxReadLength, opt_readMode); if (error.bad()) { OFLOG_FATAL(dcmcrleLogger, error.text() << ": reading file: " << opt_ifname); return 1; } DcmXfer original_xfer(dataset->getOriginalXfer()); if (original_xfer.isEncapsulated()) { OFLOG_INFO(dcmcrleLogger, "DICOM file is already compressed, converting to uncompressed transfer syntax first"); if (EC_Normal != dataset->chooseRepresentation(EXS_LittleEndianExplicit, NULL)) { OFLOG_FATAL(dcmcrleLogger, "No conversion from compressed original to uncompressed transfer syntax possible!"); return 1; } } OFString sopClass; if (fileformat.getMetaInfo()->findAndGetOFString(DCM_MediaStorageSOPClassUID, sopClass).good()) { /* check for DICOMDIR files */ if (sopClass == UID_MediaStorageDirectoryStorage) { OFLOG_FATAL(dcmcrleLogger, "DICOMDIR files (Media Storage Directory Storage SOP Class) cannot be compressed!"); return 1; } } OFLOG_INFO(dcmcrleLogger, "Convert DICOM file to compressed transfer syntax"); DcmXfer opt_oxferSyn(opt_oxfer); dataset->chooseRepresentation(opt_oxfer, NULL); if (dataset->canWriteXfer(opt_oxfer)) { OFLOG_INFO(dcmcrleLogger, "Output transfer syntax " << opt_oxferSyn.getXferName() << " can be written"); } else { OFLOG_FATAL(dcmcrleLogger, "No conversion to transfer syntax " << opt_oxferSyn.getXferName() << " possible!"); return 1; } OFLOG_INFO(dcmcrleLogger, "create output file " << opt_ofname); fileformat.loadAllDataIntoMemory(); error = fileformat.saveFile(opt_ofname, opt_oxfer, opt_oenctype, opt_oglenc, opt_opadenc, OFstatic_cast(Uint32, opt_filepad), OFstatic_cast(Uint32, opt_itempad), EWM_updateMeta); if (error.bad()) { OFLOG_FATAL(dcmcrleLogger, error.text() << ": writing file: " << opt_ofname); return 1; } OFLOG_INFO(dcmcrleLogger, "conversion successful"); // deregister RLE codec DcmRLEEncoderRegistration::cleanup(); return 0; } /* * CVS/RCS Log: * $Log: dcmcrle.cc,v $ * Revision 1.22 2010-10-14 13:13:30 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.21 2009-11-13 13:20:23 joergr * Fixed minor issues in log output. * * Revision 1.20 2009-11-04 09:58:06 uli * Switched to logging mechanism provided by the "new" oflog module * * Revision 1.19 2009-08-21 09:24:07 joergr * Added parameter 'writeMode' to save/write methods which allows for specifying * whether to write a dataset or fileformat as well as whether to update the * file meta information or to create a new file meta information header. * Added check making sure that a DICOMDIR file is never compressed. * Use helper function checkConflict() where appropriate. * Made error messages more consistent with other compression tools. * * Revision 1.18 2009-08-05 10:52:49 joergr * Fixed various issues with syntax usage (e.g. layout and formatting). * * Revision 1.17 2009-04-21 14:02:49 joergr * Fixed minor inconsistencies in manpage / syntax usage. * * Revision 1.16 2009-03-19 12:06:42 joergr * Replaced '\n' by OFendl where appropriate. * * Revision 1.15 2008-09-25 14:38:48 joergr * Moved output of resource identifier in order to avoid printing the same * information twice. * * Revision 1.14 2008-09-25 11:19:48 joergr * Added support for printing the expanded command line arguments. * Always output the resource identifier of the command line tool in debug mode. * * Revision 1.13 2006/08/15 15:50:56 meichel * Updated all code in module dcmdata to correctly compile when * all standard C++ classes remain in namespace std. * * Revision 1.12 2006/07/27 13:52:42 joergr * Changed parameter "exclusive" of method addOption() from type OFBool into an * integer parameter "flags". Prepended prefix "PF_" to parseLine() flags. * Option "--help" is no longer an exclusive option by default. * * Revision 1.11 2005/12/08 15:40:44 meichel * Changed include path schema for all DCMTK header files * * Revision 1.10 2005/12/02 09:01:30 joergr * Added new command line option that ignores the transfer syntax specified in * the meta header and tries to detect the transfer syntax automatically from * the dataset. * Added new command line option that checks whether a given file starts with a * valid DICOM meta header. * * Revision 1.9 2005/11/07 17:10:19 meichel * All tools that both read and write a DICOM file now call loadAllDataIntoMemory() * to make sure they do not destroy a file when output = input. * * Revision 1.8 2004/02/25 13:34:41 meichel * Marked option --fragment-size as non-standard since it violates a rule defined * in DICOM Part 5 A.4.2: "Each frame shall be encoded in one and only one fragment". * * Revision 1.7 2004/01/16 10:53:53 joergr * Adapted type casts to new-style typecast operators defined in ofcast.h. * * Revision 1.6 2002/11/27 12:07:16 meichel * Adapted module dcmdata to use of new header file ofstdinc.h * * Revision 1.5 2002/11/26 08:42:59 meichel * Replaced all includes for "zlib.h" with * to avoid inclusion of zlib.h in the makefile dependencies. * * Revision 1.4 2002/09/23 17:52:02 joergr * Prepared code for future support of 'config.guess' host identifiers. * * Revision 1.3 2002/09/23 13:50:40 joergr * Added new command line option "--version" which prints the name and version * number of external libraries used. * * Revision 1.2 2002/08/21 10:14:14 meichel * Adapted code to new loadFile and saveFile methods, thus removing direct * use of the DICOM stream classes. * * Revision 1.1 2002/06/06 14:52:31 meichel * Initial release of the new RLE codec classes * and the dcmcrle/dcmdrle tools in module dcmdata * * */ dcmtk-3.6.0/dcmdata/apps/dcmodify.cc0000644000310500011400000000645511455600772016525 0ustar joergrdicom3/* * * Copyright (C) 2003-2010, 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: dcmdata * * Author: Michael Onken * * Purpose: Commandline-Application to modify tags in DICOM-Files * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:13:30 $ * CVS/RCS Revision: $Revision: 1.12 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" // make sure OS specific configuration is included first #include "mdfconen.h" #include "dcmtk/dcmdata/dcpath.h" #define OFFIS_CONSOLE_APPLICATION "dcmodify" static OFLogger dcmodifyLogger = OFLog::getLogger("dcmtk.apps." OFFIS_CONSOLE_APPLICATION); int main(int argc, char *argv[]) { int error_count = 0; MdfConsoleEngine engine(argc, argv, OFFIS_CONSOLE_APPLICATION); error_count = engine.startProvidingService(); if (error_count == 1) OFLOG_ERROR(dcmodifyLogger, "There was 1 error"); else if (error_count > 1) OFLOG_ERROR(dcmodifyLogger, "There were " << error_count << " errors"); return(error_count); } /* ** CVS/RCS Log: ** $Log: dcmodify.cc,v $ ** Revision 1.12 2010-10-14 13:13:30 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.11 2009-11-04 09:58:06 uli ** Switched to logging mechanism provided by the "new" oflog module ** ** Revision 1.10 2009-01-15 16:11:55 onken ** Reworked dcmodify to work with the new DcmPath classes for supporting ** wildcard paths and automatic insertion of missing attributes and items. ** Added options for private tag handling and modification of UN values and ** for ignoring errors resulting from missing tags during modify and erase ** operations. Further cleanups. ** ** Revision 1.9 2008-09-25 11:19:48 joergr ** Added support for printing the expanded command line arguments. ** Always output the resource identifier of the command line tool in debug mode. ** ** Revision 1.8 2006/08/15 15:50:56 meichel ** Updated all code in module dcmdata to correctly compile when ** all standard C++ classes remain in namespace std. ** ** Revision 1.7 2006/07/27 13:34:35 joergr ** Updated copyright date. ** ** Revision 1.6 2005/12/08 15:40:49 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.5 2004/10/22 16:53:26 onken ** - fixed ignore-errors-option ** - major enhancements for supporting private tags ** - removed '0 Errors' output ** - modifications to groups 0000,0001,0002,0003,0005 and 0007 are blocked, ** removing tags with group 0001,0003,0005 and 0007 is still possible ** - UID options: ** - generate new study, series and instance UIDs ** - When changing UIDs in dataset, related metaheader tags are updated ** automatically ** - minor code improvements ** ** Revision 1.4 2003/10/13 14:52:59 onken ** error-message adapted to mdfconen.cc ** ** Revision 1.3 2003/09/19 12:47:21 onken ** return-value is now only zero, if no error occurred ** ** Revision 1.2 2003/07/09 12:13:13 meichel ** Included dcmodify in MSVC build system, updated headers ** ** Revision 1.1 2003/06/26 09:17:18 onken ** Added commandline-application dcmodify. ** ** */ dcmtk-3.6.0/dcmdata/apps/mdfconen.cc0000644000310500011400000010140011455600772016502 0ustar joergrdicom3/* * * Copyright (C) 2003-2010, 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: dcmdata * * Author: Michael Onken * * Purpose: Class for modifying DICOM files from comandline * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:13:30 $ * CVS/RCS Revision: $Revision: 1.38 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" // make sure OS specific configuration is included first #include "mdfconen.h" #include "mdfdsman.h" #include "dcmtk/ofstd/ofstd.h" #include "dcmtk/dcmdata/dctk.h" #include "dcmtk/dcmdata/dcistrmz.h" /* for dcmZlibExpectRFC1950Encoding */ #define SHORTCOL 4 #define LONGCOL 21 #ifdef WITH_ZLIB BEGIN_EXTERN_C #include END_EXTERN_C #endif static OFLogger dcmodifyLogger = OFLog::getLogger("dcmtk.apps.dcmodify"); OFBool MdfJob::operator==(const MdfJob &j) const { return (option == j.option) && (path == j.path) && (value == j.value); } MdfConsoleEngine::MdfConsoleEngine(int argc, char *argv[], const char *application_name) : app(NULL), cmd(NULL), ds_man(NULL), ignore_errors_option(OFFalse), update_metaheader_uids_option(OFTrue), no_backup_option(OFFalse), read_mode_option(ERM_autoDetect), input_xfer_option(EXS_Unknown), output_dataset_option(OFFalse), output_xfer_option(EXS_Unknown), glenc_option(EGL_recalcGL), enctype_option(EET_ExplicitLength), padenc_option(EPD_withoutPadding), filepad_option(0), itempad_option(0), ignore_missing_tags_option(OFFalse), no_reservation_checks(OFFalse), ignore_un_modifies(OFFalse), jobs(NULL), files(NULL) { char rcsid[200]; // print application header sprintf(rcsid, "$dcmtk: %s v%s %s $", application_name, OFFIS_DCMTK_VERSION, OFFIS_DCMTK_RELEASEDATE); // the next lines describe commandline arguments/options app = new OFConsoleApplication(application_name, "Modify DICOM files", rcsid); cmd = new OFCommandLine(); cmd->setOptionColumns(LONGCOL, SHORTCOL); cmd->setParamColumn(LONGCOL + SHORTCOL + 4); cmd->addParam("dcmfile-in", "DICOM input filename to be modified", OFCmdParam::PM_MultiMandatory); // add options to commandline application cmd->addGroup("general options:", LONGCOL, SHORTCOL + 2); cmd->addOption("--help", "-h", "print this help text and exit", OFCommandLine::AF_Exclusive); cmd->addOption("--version", "print version information and exit", OFCommandLine::AF_Exclusive); OFLog::addOptions(*cmd); cmd->addOption("--ignore-errors", "-ie", "continue with file, if modify error occurs"); cmd->addOption("--no-backup", "-nb", "don't backup files (DANGEROUS)"); cmd->addGroup("input options:"); cmd->addSubGroup("input file format:"); cmd->addOption("--read-file", "+f", "read file format or data set (default)"); cmd->addOption("--read-file-only", "+fo", "read file format only"); cmd->addOption("--read-dataset", "-f", "read data set without file meta information"); cmd->addSubGroup("input transfer syntax:"); cmd->addOption("--read-xfer-auto", "-t=", "use TS recognition (default)"); cmd->addOption("--read-xfer-detect", "-td", "ignore TS specified in the file meta header"); cmd->addOption("--read-xfer-little", "-te", "read with explicit VR little endian TS"); cmd->addOption("--read-xfer-big", "-tb", "read with explicit VR big endian TS"); cmd->addOption("--read-xfer-implicit", "-ti", "read with implicit VR little endian TS"); cmd->addSubGroup("parsing of odd-length attributes:"); cmd->addOption("--accept-odd-length", "+ao", "accept odd length attributes (default)"); cmd->addOption("--assume-even-length", "+ae", "assume real length is one byte larger"); cmd->addSubGroup("automatic data correction:"); cmd->addOption("--enable-correction", "+dc", "enable automatic data correction (default)"); cmd->addOption("--disable-correction", "-dc", "disable automatic data correction"); #ifdef WITH_ZLIB cmd->addSubGroup("bitstream format of deflated input:"); cmd->addOption("--bitstream-deflated", "+bd", "expect deflated bitstream (default)"); cmd->addOption("--bitstream-zlib", "+bz", "expect deflated zlib bitstream"); #endif cmd->addGroup("processing options:"); cmd->addSubGroup("insert mode:"); cmd->addOption("--insert", "-i", 1, "\"[t]ag-path=[v]alue\"", "insert (or overwrite) path at position t\nwith value v", OFCommandLine::AF_NoWarning); cmd->addOption("--insert-from-file", "-if", 1, "\"[t]ag-path=[f]ilename\"", "insert (or overwrite) path at position t\nwith value from file f", OFCommandLine::AF_NoWarning); cmd->addOption("--no-reserv-check", "-nrc", "do not check private reservations\nwhen inserting private tags"); cmd->addSubGroup("modify mode:"); cmd->addOption("--modify", "-m", 1, "\"[t]ag-path=[v]alue\"", "modify tag at position t to value v", OFCommandLine::AF_NoWarning); cmd->addOption("--modify-from-file", "-mf", 1, "\"[t]ag-path=[f]ilename\"", "modify tag at position t to value from file f", OFCommandLine::AF_NoWarning); cmd->addOption("--modify-all", "-ma", 1, "\"[t]ag=[v]alue\"", "modify ALL matching tags t in file to value v", OFCommandLine::AF_NoWarning); cmd->addSubGroup("erase mode:"); cmd->addOption("--erase", "-e", 1, "\"[t]ag-path\"", "erase tag/item at position t", OFCommandLine::AF_NoWarning); cmd->addOption("--erase-all", "-ea", 1, "\"[t]ag\"", "erase ALL matching tags t in file", OFCommandLine::AF_NoWarning); cmd->addOption("--erase-private", "-ep", "erase ALL private data from file", OFCommandLine::AF_NoWarning); cmd->addSubGroup("unique identifier:"); cmd->addOption("--gen-stud-uid", "-gst", "generate new Study Instance UID", OFCommandLine::AF_NoWarning); cmd->addOption("--gen-ser-uid", "-gse", "generate new Series Instance UID", OFCommandLine::AF_NoWarning); cmd->addOption("--gen-inst-uid", "-gin", "generate new SOP Instance UID", OFCommandLine::AF_NoWarning); cmd->addOption("--no-meta-uid", "-nmu", "do not update metaheader UIDs if related\nUIDs in the dataset are modified"); cmd->addSubGroup("other processing options:"); cmd->addOption("--ignore-missing-tags", "-imt", "treat 'tag not found' as success\nwhen modifying or erasing in datasets"); cmd->addOption("--ignore-un-values", "-iun", "do not try writing any values\nto elements having VR of UN"); cmd->addGroup("output options:"); cmd->addSubGroup("output file format:"); cmd->addOption("--write-file", "+F", "write file format (default)"); cmd->addOption("--write-dataset", "-F", "write data set without file meta information"); cmd->addSubGroup("output transfer syntax:"); cmd->addOption("--write-xfer-same", "+t=", "write with same TS as input (default)"); cmd->addOption("--write-xfer-little", "+te", "write with explicit VR little endian TS"); cmd->addOption("--write-xfer-big", "+tb", "write with explicit VR big endian TS"); cmd->addOption("--write-xfer-implicit", "+ti", "write with implicit VR little endian TS"); cmd->addSubGroup("post-1993 value representations:"); cmd->addOption("--enable-new-vr", "+u", "enable support for new VRs (UN/UT) (default)"); cmd->addOption("--disable-new-vr", "-u", "disable support for new VRs, convert to OB"); cmd->addSubGroup("group length encoding:"); cmd->addOption("--group-length-recalc", "+g=", "recalculate group lengths if present (default)"); cmd->addOption("--group-length-create", "+g", "always write with group length elements"); cmd->addOption("--group-length-remove", "-g", "always write without group length elements"); cmd->addSubGroup("length encoding in sequences and items:"); cmd->addOption("--length-explicit", "+le", "write with explicit lengths (default)"); cmd->addOption("--length-undefined", "-le", "write with undefined lengths"); cmd->addSubGroup("data set trailing padding (not with --write-dataset):"); cmd->addOption("--padding-retain", "-p=", "do not change padding\n(default if not --write-dataset)"); cmd->addOption("--padding-off", "-p", "no padding (implicit if --write-dataset)"); cmd->addOption("--padding-create", "+p", 2, "[f]ile-pad [i]tem-pad: integer", "align file on multiple of f bytes\nand items on multiple of i bytes"); // evaluate commandline prepareCmdLineArgs(argc, argv, application_name); if (app->parseCommandLine(*cmd, argc, argv, OFCommandLine::PF_ExpandWildcards)) { /* print help text and exit */ if (cmd->getArgCount() == 0) app->printUsage(); /* check exclusive options first */ if (cmd->hasExclusiveOption()) { if (cmd->findOption("--version")) { app->printHeader(OFTrue /*print host identifier*/); ofConsole.lockCout() << OFendl << "External libraries used:"; #ifdef WITH_ZLIB ofConsole.getCout() << OFendl << "- ZLIB, Version " << zlibVersion() << OFendl; #else ofConsole.getCout() << " none" << OFendl; #endif ofConsole.unlockCout(); delete app; delete cmd; exit(0); } } // iterate the files (parameters) and save them in list files = new OFList; OFString current_file; for (int i = 1; i <= cmd->getParamCount(); i++) { cmd->getParam(i,current_file); files->push_back(current_file); } // if no files are given: return with error message if (files->empty()) { OFLOG_ERROR(dcmodifyLogger, "no dicom files given!"); delete app; delete cmd; exit(1); } // make sure data dictionary is loaded if (!dcmDataDict.isDictionaryLoaded()) OFLOG_WARN(dcmodifyLogger, "no data dictionary loaded, " << "check environment variable: " << DCM_DICT_ENVIRONMENT_VARIABLE); } /* print resource identifier */ OFLOG_DEBUG(dcmodifyLogger, rcsid << OFendl); } void MdfConsoleEngine::parseNonJobOptions() { // catch "general" options OFLog::configureFromCommandLine(*cmd, *app); if (cmd->findOption("--ignore-errors")) ignore_errors_option = OFTrue; if (cmd->findOption("--no-meta-uid")) update_metaheader_uids_option = OFFalse; if (cmd->findOption("--no-backup")) no_backup_option = OFTrue; // input options cmd->beginOptionBlock(); if (cmd->findOption("--read-file")) read_mode_option = ERM_autoDetect; if (cmd->findOption("--read-file-only")) read_mode_option = ERM_fileOnly; if (cmd->findOption("--read-dataset")) read_mode_option = ERM_dataset; cmd->endOptionBlock(); cmd->beginOptionBlock(); if (cmd->findOption("--read-xfer-auto")) input_xfer_option = EXS_Unknown; if (cmd->findOption("--read-xfer-detect")) dcmAutoDetectDatasetXfer.set(OFTrue); if (cmd->findOption("--read-xfer-little")) { app->checkDependence("--read-xfer-little", "--read-dataset", read_mode_option == ERM_dataset); input_xfer_option = EXS_LittleEndianExplicit; } if (cmd->findOption("--read-xfer-big")) { app->checkDependence("--read-xfer-big", "--read-dataset", read_mode_option == ERM_dataset); input_xfer_option = EXS_BigEndianExplicit; } if (cmd->findOption("--read-xfer-implicit")) { app->checkDependence("--read-xfer-implicit", "--read-dataset", read_mode_option == ERM_dataset); input_xfer_option = EXS_LittleEndianImplicit; } cmd->endOptionBlock(); cmd->beginOptionBlock(); if (cmd->findOption("--accept-odd-length")) { dcmAcceptOddAttributeLength.set(OFTrue); } if (cmd->findOption("--assume-even-length")) { dcmAcceptOddAttributeLength.set(OFFalse); } cmd->endOptionBlock(); cmd->beginOptionBlock(); if (cmd->findOption("--enable-correction")) { dcmEnableAutomaticInputDataCorrection.set(OFTrue); } if (cmd->findOption("--disable-correction")) { dcmEnableAutomaticInputDataCorrection.set(OFFalse); } cmd->endOptionBlock(); #ifdef WITH_ZLIB cmd->beginOptionBlock(); if (cmd->findOption("--bitstream-deflated")) { dcmZlibExpectRFC1950Encoding.set(OFFalse); } if (cmd->findOption("--bitstream-zlib")) { dcmZlibExpectRFC1950Encoding.set(OFTrue); } cmd->endOptionBlock(); #endif // output options cmd->beginOptionBlock(); if (cmd->findOption("--write-file")) output_dataset_option = OFFalse; if (cmd->findOption("--write-dataset")) output_dataset_option = OFTrue; cmd->endOptionBlock(); cmd->beginOptionBlock(); if (cmd->findOption("--write-xfer-same")) output_xfer_option = EXS_Unknown; if (cmd->findOption("--write-xfer-little")) output_xfer_option = EXS_LittleEndianExplicit; if (cmd->findOption("--write-xfer-big")) output_xfer_option = EXS_BigEndianExplicit; if (cmd->findOption("--write-xfer-implicit")) output_xfer_option = EXS_LittleEndianImplicit; cmd->endOptionBlock(); cmd->beginOptionBlock(); if (cmd->findOption("--enable-new-vr")) { dcmEnableUnknownVRGeneration.set(OFTrue); dcmEnableUnlimitedTextVRGeneration.set(OFTrue); } if (cmd->findOption("--disable-new-vr")) { dcmEnableUnknownVRGeneration.set(OFFalse); dcmEnableUnlimitedTextVRGeneration.set(OFFalse); } cmd->endOptionBlock(); cmd->beginOptionBlock(); if (cmd->findOption("--group-length-recalc")) glenc_option = EGL_recalcGL; if (cmd->findOption("--group-length-create")) glenc_option = EGL_withGL; if (cmd->findOption("--group-length-remove")) glenc_option = EGL_withoutGL; cmd->endOptionBlock(); cmd->beginOptionBlock(); if (cmd->findOption("--length-explicit")) enctype_option = EET_ExplicitLength; if (cmd->findOption("--length-undefined")) enctype_option = EET_UndefinedLength; cmd->endOptionBlock(); cmd->beginOptionBlock(); if (cmd->findOption("--padding-retain")) { app->checkConflict("--padding-retain", "--write-dataset", output_dataset_option); padenc_option = EPD_noChange; } if (cmd->findOption("--padding-off")) padenc_option = EPD_withoutPadding; if (cmd->findOption("--padding-create")) { app->checkConflict("--padding-create", "--write-dataset", output_dataset_option); app->checkValue(cmd->getValueAndCheckMin(filepad_option, 0)); app->checkValue(cmd->getValueAndCheckMin(itempad_option, 0)); padenc_option = EPD_withPadding; } cmd->endOptionBlock(); if (cmd->findOption("--ignore-missing-tags")) { ignore_missing_tags_option = OFTrue; } if (cmd->findOption("--no-reserv-check")) { no_reservation_checks = OFTrue; } if (cmd->findOption("--ignore-un-values")) { ignore_un_modifies = OFTrue; } } void MdfConsoleEngine::parseCommandLine() { jobs = new OFList; OFString option_string; // check all options, that don't belong to a specific job parseNonJobOptions(); cmd->gotoFirstOption(); // iterate over commandline arguments from first to last do { if (cmd->getCurrentOption(option_string)) { MdfJob aJob; OFString option_value, tag_path, tag_value; if (option_string == "--insert") aJob.option = "i"; else if (option_string == "--insert-from-file") aJob.option = "if"; else if (option_string == "--modify") aJob.option = "m"; else if (option_string == "--modify-from-file") aJob.option = "mf"; else if (option_string == "--modify-all") aJob.option = "ma"; else if (option_string == "--erase") aJob.option = "e"; else if (option_string == "--erase-all") aJob.option = "ea"; else if (option_string == "--erase-private") aJob.option = "ep"; else if (option_string == "--gen-stud-uid") aJob.option = "gst"; else if (option_string == "--gen-ser-uid") aJob.option = "gse"; else if (option_string == "--gen-inst-uid") aJob.option = "gin"; // else this is a non job option, e.g. -v, -d, -f, ... else continue; // get any parameters if job expects some if (jobOptionExpectsParameters(aJob.option)) { cmd->getValue(option_value); splitPathAndValue(option_value, tag_path, tag_value); aJob.path = tag_path; aJob.value = tag_value; } // finally, and schedule job jobs->push_back(aJob); } } while (cmd->gotoNextOption()); } OFBool MdfConsoleEngine::jobOptionExpectsParameters(const OFString &job) { return (job != "ep") && (job != "gst") && (job != "gse") && (job != "gin"); } void MdfConsoleEngine::splitPathAndValue(const OFString &whole, OFString &path, OFString &value) { size_t pos = whole.find("="); if (pos != OFString_npos) { path = whole.substr(0, pos); value = whole.substr(pos + 1, value.length() - 1); } else path = whole; } int MdfConsoleEngine::executeJob(const MdfJob &job, const char *filename) { OFCondition result; int count = 0; int error_count = 0; OFLOG_INFO(dcmodifyLogger, "Executing (option|path|value): " << job.option << "|" << job.path << "|" << job.value); // start modify operation based on job option if (job.option=="i") result = ds_man->modifyOrInsertPath(job.path, job.value, OFFalse, update_metaheader_uids_option, ignore_missing_tags_option, no_reservation_checks); else if (job.option == "if") result = ds_man->modifyOrInsertFromFile(job.path, job.value /*filename*/, OFFalse, update_metaheader_uids_option, ignore_missing_tags_option, no_reservation_checks); else if (job.option == "m") result = ds_man->modifyOrInsertPath(job.path, job.value, OFTrue, update_metaheader_uids_option, ignore_missing_tags_option, no_reservation_checks); else if (job.option == "mf") result = ds_man->modifyOrInsertFromFile(job.path, job.value /*filename*/, OFTrue, update_metaheader_uids_option, ignore_missing_tags_option, no_reservation_checks); else if (job.option == "ma") result = ds_man->modifyAllTags(job.path, job.value, update_metaheader_uids_option, count); else if (job.option == "e") result = ds_man->deleteTag(job.path, OFFalse, ignore_missing_tags_option); else if (job.option == "ea") result = ds_man->deleteTag(job.path, OFTrue, ignore_missing_tags_option); else if (job.option == "ep") result = ds_man->deletePrivateData(); else if (job.option == "gst") result = ds_man->generateAndInsertUID(DCM_StudyInstanceUID); else if (job.option == "gse") result = ds_man->generateAndInsertUID(DCM_SeriesInstanceUID); else if (job.option == "gin") result = ds_man->generateAndInsertUID(DCM_SOPInstanceUID); // no valid job option found: else { error_count++; OFLOG_ERROR(dcmodifyLogger, "no valid option: " << job.option); } // if modify operation failed if (result.bad() && error_count == 0) { if (filename != NULL) OFLOG_ERROR(dcmodifyLogger, "modifying tag in file " << OFString(filename) << ": " << result.text()); else OFLOG_ERROR(dcmodifyLogger, "modifying tag: " << result.text()); error_count++; } return error_count; } int MdfConsoleEngine::startProvidingService() { OFCondition result; const char *filename; // return value of this function int errors = 0; // parse command line into file and job list parseCommandLine(); // iterators for job and file loops OFListIterator(MdfJob) job_it; OFListIterator(MdfJob) job_last = jobs->end();; OFListIterator(OFString) file_it = files->begin(); OFListIterator(OFString) file_last = files->end();; // outer loop: iterate over all files while (file_it != file_last) { filename = (*file_it).c_str(); result = loadFile(filename); // if file could be loaded: if (result.good()) { // for each file, set job iterator back to first entry job_it = jobs->begin(); // inner loop: iterate over jobs, execute all jobs for current file while (job_it != job_last) { errors += executeJob(*job_it, filename); job_it++; } // if there were no errors or user wants to override them, save: if (errors == 0 || ignore_errors_option) { result = ds_man->saveFile(filename, output_xfer_option, enctype_option, glenc_option, padenc_option, filepad_option, itempad_option, output_dataset_option); if (result.bad()) { OFLOG_ERROR(dcmodifyLogger, "couldn't save file: " << result.text()); errors++; if (!no_backup_option) { result = restoreFile(filename); if (result.bad()) { OFLOG_ERROR(dcmodifyLogger, "couldn't restore file: " << result.text()); errors++; } } } } // errors occured and user doesn't want to ignore them: else if (!no_backup_option) { result = restoreFile(filename); if (result.bad()) { OFLOG_ERROR(dcmodifyLogger, "couldn't restore file!"); errors++; } } } // if loading fails: else { errors++; OFLOG_ERROR(dcmodifyLogger, "unable to load file " << filename <<": " << result.text()); } file_it++; // output separator line if required if ((file_it != file_last) || (errors > 0)) OFLOG_INFO(dcmodifyLogger, "------------------------------------"); } return errors; } OFCondition MdfConsoleEngine::loadFile(const char *filename) { OFCondition result; // free memory delete ds_man; ds_man = new MdfDatasetManager(); ds_man->setModifyUNValues(!ignore_un_modifies); OFLOG_INFO(dcmodifyLogger, "Processing file: " << filename); // load file into dataset manager result = ds_man->loadFile(filename, read_mode_option, input_xfer_option); if (result.good() && !no_backup_option) result = backupFile(filename); return result; } OFCondition MdfConsoleEngine::backupFile(const char *file_name) { OFCondition backup_result; int result; OFString backup = file_name; backup += ".bak"; // delete backup file, if it already exists if (OFStandard::fileExists(backup.c_str())) { int del_result = remove(backup.c_str()); if (del_result != 0) { OFLOG_ERROR(dcmodifyLogger, "couldn't delete previous backup file, unable to backup!"); return EC_IllegalCall; } } // if backup file could be removed, backup original file result = rename(file_name, backup.c_str()); // set return value if (result != 0) { OFLOG_ERROR(dcmodifyLogger, "unable to backup, no write permission?"); return EC_IllegalCall; } return EC_Normal; } OFCondition MdfConsoleEngine::restoreFile(const char *filename) { int result; OFString backup = filename; backup += ".bak"; // delete the (original) file that dcmodify couldn't modify if (OFStandard::fileExists(filename)) { result = remove(filename); if (result != 0) { OFLOG_ERROR(dcmodifyLogger, "unable to delete original file for restoring backup!"); return EC_IllegalCall; } } // and rename backup file back to original filename result = rename(backup.c_str(), filename); // error renaming backup file if (result != 0) { OFLOG_ERROR(dcmodifyLogger, "unable to rename backup file to original filename!"); return EC_IllegalCall; } // successfully restored, throw out message else OFLOG_INFO(dcmodifyLogger, "Renamed backup file to original"); // you only get to this point, if restoring was completely successful return EC_Normal; } MdfConsoleEngine::~MdfConsoleEngine() { delete app; delete cmd; delete files; delete jobs; delete ds_man; } /* ** CVS/RCS Log: ** $Log: mdfconen.cc,v $ ** Revision 1.38 2010-10-14 13:13:30 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.37 2010-05-28 13:19:19 joergr ** Changed logger name from "dcmtk.dcmdata.mdfconen" to "dcmtk.apps.dcmodify". ** ** Revision 1.36 2010-05-21 08:53:34 joergr ** Fixed wrong use of if statement which prevented option --insert from working. ** ** Revision 1.35 2010-05-20 15:53:58 joergr ** Added support for reading the value of insert/modify statements from a file. ** Slightly modified log messages and log levels in order to be more consistent. ** Removed some unnecessary include directives. ** ** Revision 1.34 2010-02-05 09:56:58 joergr ** Fixed issue with double locking of ofConsole. ** Fixed inconsistent source code formatting. ** ** Revision 1.33 2009-11-26 13:10:56 onken ** Added better error message to dcmodify in case write permissions for creating ** the backup file are missing. ** ** Revision 1.32 2009-11-04 09:58:06 uli ** Switched to logging mechanism provided by the "new" oflog module ** ** Revision 1.31 2009-09-04 13:53:09 meichel ** Minor const iterator related changes needed to compile with VC6 with HAVE_STL ** ** Revision 1.30 2009-08-21 09:25:13 joergr ** Added parameter 'writeMode' to save/write methods which allows for specifying ** whether to write a dataset or fileformat as well as whether to update the ** file meta information or to create a new file meta information header. ** ** Revision 1.29 2009-06-04 10:21:00 joergr ** Added new flag that can be used to avoid wrong warning messages (in debug ** mode) that an option has possibly never been checked. ** ** Revision 1.28 2009-04-24 12:20:42 joergr ** Fixed minor inconsistencies regarding layout/formatting in syntax usage. ** ** Revision 1.27 2009-04-21 14:02:49 joergr ** Fixed minor inconsistencies in manpage / syntax usage. ** ** Revision 1.26 2009-01-16 10:03:22 onken ** Fixed dcmodify help output ** ** Revision 1.25 2009-01-15 16:11:55 onken ** Reworked dcmodify to work with the new DcmPath classes for supporting ** wildcard paths and automatic insertion of missing attributes and items. ** Added options for private tag handling and modification of UN values and ** for ignoring errors resulting from missing tags during modify and erase ** operations. Further cleanups. ** ** Revision 1.24 2008-09-25 11:19:48 joergr ** Added support for printing the expanded command line arguments. ** Always output the resource identifier of the command line tool in debug mode. ** ** Revision 1.23 2008-03-26 17:01:40 joergr ** Fixed various layout and formatting issues. ** ** Revision 1.22 2007/11/23 15:42:53 meichel ** Removed unwanted output on console when debug flag is not set ** ** Revision 1.21 2006/12/06 09:31:49 onken ** Added "--no-backup" option to prevent dcmodify from creating backup files ** ** Revision 1.20 2006/08/15 15:50:56 meichel ** Updated all code in module dcmdata to correctly compile when ** all standard C++ classes remain in namespace std. ** ** Revision 1.19 2006/07/27 13:37:47 joergr ** Changed parameter "exclusive" of method addOption() from type OFBool into an ** integer parameter "flags". Prepended prefix "PF_" to parseLine() flags. ** Option "--help" is no longer an exclusive option by default. ** Made command line parameter "dcmfile-in" mandatory. ** Print help text if no command line argument is specified. This is the default ** behaviour of most DCMTK tools. ** ** Revision 1.18 2006/02/09 15:41:41 joergr ** Fixed typo in CVS log. ** ** Revision 1.17 2006/02/09 15:20:28 joergr ** Replaced OFIterator<> by OFListIterator() in order to compile if HAVE_STL ** is defined. ** ** Revision 1.16 2005/12/16 13:04:01 meichel ** Changed type to size_t to make code safe on 64bit platforms ** ** Revision 1.15 2005/12/08 15:40:51 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.14 2005/12/02 09:18:15 joergr ** Added new command line option that ignores the transfer syntax specified in ** the meta header and tries to detect the transfer syntax automatically from ** the dataset. ** Added new command line option that checks whether a given file starts with a ** valid DICOM meta header. ** ** Revision 1.13 2005/03/09 17:58:00 joergr ** Replaced "," between two delete statements by ";" since this confuses some ** compilers. ** ** Revision 1.12 2004/11/05 17:17:23 onken ** Added input and output options for dcmodify. minor code enhancements. ** ** Revision 1.11 2004/10/22 16:53:26 onken ** - fixed ignore-errors-option ** - major enhancements for supporting private tags ** - removed '0 Errors' output ** - modifications to groups 0000,0001,0002,0003,0005 and 0007 are blocked, ** removing tags with group 0001,0003,0005 and 0007 is still possible ** - UID options: ** - generate new study, series and instance UIDs ** - When changing UIDs in dataset, related metaheader tags are updated ** automatically ** - minor code improvements ** ** Revision 1.10 2004/04/19 14:45:07 onken ** Restructured code to avoid default parameter values for "complex types" like ** OFString. Required for Sun CC 2.0.1. ** ** Revision 1.9 2003/12/10 16:19:20 onken ** Changed API of MdfDatasetManager, so that its transparent for user, whether ** he wants to modify itemtags or tags at 1. level. ** ** Complete rewrite of MdfConsoleEngine. It doesn't support a batchfile any more, ** but now a user can give different modify-options at the same time on ** commandline. Other purifications and simplifications were made. ** ** Revision 1.8 2003/11/13 10:34:22 joergr ** Made help text consistent with revised man page. ** ** Revision 1.7 2003/11/11 10:55:51 onken ** - debug-mechanism doesn't use debug(..) any more ** - comments purified ** - headers adjustet to debug-modifications ** ** Revision 1.6 2003/10/13 14:51:49 onken ** improved backup-strategy ** ** Revision 1.5 2003/10/13 13:28:28 meichel ** Minor code purifications, needed for Borland C++ ** ** Revision 1.4 2003/09/19 12:43:54 onken ** major bug fixes, corrections for "dcmtk-coding-style", better error-handling ** ** Revision 1.3 2003/07/09 12:13:13 meichel ** Included dcmodify in MSVC build system, updated headers ** ** Revision 1.2 2003/07/03 15:39:35 meichel ** Fixed problems with iterators, included zlib.h if needed ** ** Revision 1.1 2003/06/26 09:17:18 onken ** Added commandline-application dcmodify. ** ** */ dcmtk-3.6.0/dcmdata/apps/xml2dcm.cc0000644000310500011400000013220111502144735016255 0ustar joergrdicom3/* * * Copyright (C) 2003-2010, 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: dcmdata * * Author: Joerg Riesmeier * * Purpose: Convert XML document to DICOM file or data set * * Last Update: $Author: uli $ * Update Date: $Date: 2010-12-15 13:59:57 $ * CVS/RCS Revision: $Revision: 1.34 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dctk.h" #include "dcmtk/dcmdata/dcpxitem.h" /* for class DcmPixelItem */ #include "dcmtk/dcmdata/cmdlnarg.h" #include "dcmtk/ofstd/ofstd.h" #include "dcmtk/ofstd/ofconapp.h" #include "dcmtk/dcmdata/dcostrmz.h" /* for dcmZlibCompressionLevel */ #define INCLUDE_CSTDARG #include "dcmtk/ofstd/ofstdinc.h" #ifdef WITH_ZLIB #include /* for zlibVersion() */ #endif #define OFFIS_CONSOLE_APPLICATION "xml2dcm" #define OFFIS_CONSOLE_DESCRIPTION "Convert XML document to DICOM file or data set" // currently not used since DTD is always retrieved from XML document //#define DOCUMENT_TYPE_DEFINITION_FILE "dcm2xml.dtd" static OFLogger xml2dcmLogger = OFLog::getLogger("dcmtk.apps." OFFIS_CONSOLE_APPLICATION); static OFLogger xmlLogger = OFLog::getLogger("dcmtk.apps." OFFIS_CONSOLE_APPLICATION ".libxml"); static char rcsid[] = "$dcmtk: " OFFIS_CONSOLE_APPLICATION " v" OFFIS_DCMTK_VERSION " " OFFIS_DCMTK_RELEASEDATE " $"; // ******************************************** #ifdef WITH_LIBXML #include // stores pointer to character encoding handler static xmlCharEncodingHandlerPtr EncodingHandler = NULL; // This function is also used in dcmsr, try to stay in sync! extern "C" void errorFunction(void * ctx, const char *msg, ...) { OFString &buffer = *OFstatic_cast(OFString*, ctx); if (!xmlLogger.isEnabledFor(OFLogger::DEBUG_LOG_LEVEL)) return; #if defined(HAVE_VSNPRINTF) && defined(HAVE_PROTOTYPE_VSNPRINTF) // libxml calls us multiple times for one line of log output which would // result in garbled output. To avoid this, we buffer the output in a local // string in the caller which we get through our 'ctx' parameter. Then, we // output this string on one go when we receive a newline. va_list ap; char buf[1024]; va_start(ap, msg); #ifdef HAVE_PROTOTYPE_STD__VSNPRINTF std::vsnprintf(buf, 1024, msg, ap); #else vsnprintf(buf, 1024, msg, ap); #endif va_end(ap); // Since we can't do anything about a too small buffer for vsnprintf(), we // ignore it. But we do make sure the buffer is null-terminated! buf[1023] = '\0'; buffer += buf; // If there is a full line in the buffer... size_t pos = buffer.find('\n'); while (pos != OFString_npos) { // ..output it and remove it from the buffer OFLOG_DEBUG(xmlLogger, buffer.substr(0, pos)); buffer.erase(0, pos + 1); pos = buffer.find('\n'); } #elif defined(HAVE_VPRINTF) // No vsnprint, but at least vfprintf. Output the messages directly to stderr. va_list ap; va_start(ap, msg); #ifdef HAVE_PROTOTYPE_STD__VFPRINTF std::vfprintf(stderr, msg, ap); #else vfprintf(stderr, msg, ap); #endif va_end(ap); #else // We can only show the most basic part of the message, this will look bad :( printf("%s", msg); #endif #ifndef HAVE_VSNPRINTF // Only the vsnprintf() branch above uses 'buffer' which means the compiler // would warn about an unused variable if HAVE_VSNPRINTF is undefined. buffer += ""; #endif } static OFBool convertUtf8ToCharset(const xmlChar *fromString, OFString &toString) { OFBool result = OFFalse; if (EncodingHandler != NULL) { /* prepare input/output buffers */ xmlBufferPtr fromBuffer = xmlBufferCreate(); xmlBufferPtr toBuffer = xmlBufferCreate(); xmlBufferCat(fromBuffer, fromString); /* convert character encoding of given string */ result = (xmlCharEncOutFunc(EncodingHandler, toBuffer, fromBuffer) >= 0); if (result) toString = OFreinterpret_cast(const char *, xmlBufferContent(toBuffer)); /* free allocated memory */ xmlBufferFree(toBuffer); xmlBufferFree(fromBuffer); } return result; } static OFCondition checkNode(xmlNodePtr current, const char *name) { OFCondition result = EC_Normal; /* check whether node is valid at all */ if (current != NULL) { /* check whether node has expected name */ if (xmlStrcmp(current->name, OFreinterpret_cast(const xmlChar *, name)) != 0) { OFLOG_ERROR(xml2dcmLogger, "document of the wrong type, was '" << current->name << "', '" << name << "' expected"); result = EC_IllegalCall; } } else { OFLOG_ERROR(xml2dcmLogger, "document of the wrong type, '" << name << "' expected"); result = EC_IllegalCall; } return result; } static OFCondition createNewElement(xmlNodePtr current, DcmElement *&newElem) { OFCondition result = EC_IllegalCall; /* check whether node is valid */ if (current != NULL) { /* get required information from XML element */ xmlChar *elemTag = xmlGetProp(current, OFreinterpret_cast(const xmlChar *, "tag")); xmlChar *elemVR = xmlGetProp(current, OFreinterpret_cast(const xmlChar *, "vr")); /* convert tag string */ DcmTagKey dcmTagKey; unsigned int group = 0xffff; unsigned int elem = 0xffff; if (sscanf(OFreinterpret_cast(char *, elemTag), "%x,%x", &group, &elem ) == 2) { dcmTagKey.set(group, elem); DcmTag dcmTag(dcmTagKey); /* convert vr string */ DcmVR dcmVR(OFreinterpret_cast(char *, elemVR)); DcmEVR dcmEVR = dcmVR.getEVR(); if (dcmEVR == EVR_UNKNOWN) { OFLOG_WARN(xml2dcmLogger, "invalid 'vr' attribute (" << elemVR << ") for " << dcmTag << ", using unknown VR"); } /* check for correct vr */ const DcmEVR tagEVR = dcmTag.getEVR(); if ((tagEVR != dcmEVR) && (dcmEVR != EVR_UNKNOWN) && (tagEVR != EVR_UNKNOWN) && ((dcmTagKey != DCM_LUTData) || ((dcmEVR != EVR_US) && (dcmEVR != EVR_SS) && (dcmEVR != EVR_OW))) && ((tagEVR != EVR_xs) || ((dcmEVR != EVR_US) && (dcmEVR != EVR_SS))) && ((tagEVR != EVR_ox) || ((dcmEVR != EVR_OB) && (dcmEVR != EVR_OW)))) { OFLOG_WARN(xml2dcmLogger, "tag " << dcmTag << " has wrong VR (" << dcmVR.getVRName() << "), correct is " << dcmTag.getVR().getVRName()); } if (dcmEVR != EVR_UNKNOWN) dcmTag.setVR(dcmVR); /* create DICOM element */ result = newDicomElement(newElem, dcmTag); } else { OFLOG_WARN(xml2dcmLogger, "invalid 'tag' attribute (" << elemTag << "), ignoring node"); result = EC_InvalidTag; } if (result.bad()) { /* delete new element if an error occured */ delete newElem; newElem = NULL; } /* free allocated memory */ xmlFree(elemTag); xmlFree(elemVR); } return result; } static OFCondition putElementContent(xmlNodePtr current, DcmElement *element) { OFCondition result = EC_IllegalCall; /* check whether node and element are valid */ if ((current != NULL) && (element != NULL)) { DcmEVR dcmEVR = element->getVR(); /* get the XML node content */ xmlChar *elemVal = xmlNodeGetContent(current); xmlChar *attrVal = xmlGetProp(current, OFreinterpret_cast(const xmlChar *, "binary")); /* check whether node content is present */ if (xmlStrcmp(attrVal, OFreinterpret_cast(const xmlChar *, "hidden")) == 0) OFLOG_WARN(xml2dcmLogger, "content of node " << element->getTag() << " is 'hidden', empty element inserted"); /* check whether node content is base64 encoded */ else if (xmlStrcmp(attrVal, OFreinterpret_cast(const xmlChar *, "base64")) == 0) { Uint8 *data = NULL; const size_t length = OFStandard::decodeBase64(OFreinterpret_cast(char *, elemVal), data); if (length > 0) { if (dcmEVR == EVR_OW) { /* Base64 decoder produces big endian output data, convert to local byte order */ swapIfNecessary(gLocalByteOrder, EBO_BigEndian, data, length, sizeof(Uint16)); } result = element->putUint8Array(data, length); /* delete buffer since data is copied into the element */ delete[] data; } } /* check whether node content is stored in a file */ else if (xmlStrcmp(attrVal, OFreinterpret_cast(const xmlChar *, "file")) == 0) { if (xmlStrlen(elemVal) > 0) { const char *filename = OFreinterpret_cast(char *, elemVal); /* try to open binary file */ FILE *f = fopen(filename, "rb"); if (f != NULL) { /* determine filesize */ const size_t fileSize = OFStandard::getFileSize(filename); unsigned long buflen = fileSize; /* if odd then make even (DICOM requires even length values) */ if (buflen & 1) buflen++; Uint8 *buf = NULL; /* create buffer of OB or OW data */ if (dcmEVR == EVR_OW) { Uint16 *buf16 = NULL; result = element->createUint16Array(buflen / 2, buf16); buf = OFreinterpret_cast(Uint8 *, buf16); } else result = element->createUint8Array(buflen, buf); if (result.good()) { /* read binary file into the buffer */ if (fread(buf, 1, OFstatic_cast(size_t, fileSize), f) != fileSize) { char errBuf[256]; const char *text = OFStandard::strerror(errno, errBuf, sizeof(errBuf)); if (text == NULL) text = "(unknown error code)"; OFLOG_ERROR(xml2dcmLogger, "error reading binary data file: " << filename << ": " << text); result = EC_CorruptedData; } else if (dcmEVR == EVR_OW) { /* swap 16 bit OW data (if necessary) */ swapIfNecessary(gLocalByteOrder, EBO_LittleEndian, buf, buflen, sizeof(Uint16)); } } fclose(f); } else { OFLOG_ERROR(xml2dcmLogger, "cannot open binary data file: " << filename); result = EC_InvalidTag; } } else OFLOG_ERROR(xml2dcmLogger, "filename for element " << element->getTag() << " is missing, empty element inserted"); } else { OFString dicomVal; /* convert character set from UTF8 (for specific VRs only) */ if (((dcmEVR == EVR_PN) || (dcmEVR == EVR_SH) || (dcmEVR == EVR_LO) || (dcmEVR == EVR_ST) || (dcmEVR == EVR_LT) || (dcmEVR == EVR_UT)) && (xmlStrlen(elemVal) > 0) && convertUtf8ToCharset(elemVal, dicomVal)) { result = element->putString(dicomVal.c_str()); } else { /* set the value of the newly created element */ result = element->putString(OFreinterpret_cast(char *, elemVal)); } } /* free allocated memory */ xmlFree(elemVal); xmlFree(attrVal); } return result; } static OFCondition parseElement(DcmItem *dataset, xmlNodePtr current) { DcmElement *newElem = NULL; /* create new DICOM element from XML element */ OFCondition result = createNewElement(current, newElem); if (result.good()) { /* retrieve specific character set (only on main dataset level) */ if ((EncodingHandler == NULL) && (dataset->ident() == EVR_dataset) && (newElem->getTag() == DCM_SpecificCharacterSet)) { const char *encString = NULL; xmlChar *elemVal = xmlNodeGetContent(current); /* check for known character set */ if (xmlStrcmp(elemVal, OFreinterpret_cast(const xmlChar *, "ISO_IR 6")) == 0) encString = "UTF-8"; else if (xmlStrcmp(elemVal, OFreinterpret_cast(const xmlChar *, "ISO_IR 192")) == 0) encString = "UTF-8"; else if (xmlStrcmp(elemVal, OFreinterpret_cast(const xmlChar *, "ISO_IR 100")) == 0) encString = "ISO-8859-1"; else if (xmlStrcmp(elemVal, OFreinterpret_cast(const xmlChar *, "ISO_IR 101")) == 0) encString = "ISO-8859-2"; else if (xmlStrcmp(elemVal, OFreinterpret_cast(const xmlChar *, "ISO_IR 109")) == 0) encString = "ISO-8859-3"; else if (xmlStrcmp(elemVal, OFreinterpret_cast(const xmlChar *, "ISO_IR 110")) == 0) encString = "ISO-8859-4"; else if (xmlStrcmp(elemVal, OFreinterpret_cast(const xmlChar *, "ISO_IR 148")) == 0) encString = "ISO-8859-9"; else if (xmlStrcmp(elemVal, OFreinterpret_cast(const xmlChar *, "ISO_IR 144")) == 0) encString = "ISO-8859-5"; else if (xmlStrcmp(elemVal, OFreinterpret_cast(const xmlChar *, "ISO_IR 127")) == 0) encString = "ISO-8859-6"; else if (xmlStrcmp(elemVal, OFreinterpret_cast(const xmlChar *, "ISO_IR 126")) == 0) encString = "ISO-8859-7"; else if (xmlStrcmp(elemVal, OFreinterpret_cast(const xmlChar *, "ISO_IR 138")) == 0) encString = "ISO-8859-8"; else if (xmlStrlen(elemVal) > 0) OFLOG_ERROR(xml2dcmLogger, "character set '" << elemVal << "' not supported"); if (encString != NULL) { /* find appropriate encoding handler */ EncodingHandler = xmlFindCharEncodingHandler(encString); } xmlFree(elemVal); } /* set the element value */ result = putElementContent(current, newElem); /* insert the new element into the dataset */ if (result.good()) result = dataset->insert(newElem, OFTrue /*replaceOld*/); if (result.bad()) { /* delete element if insertion or putting the value failed */ delete newElem; } } return result; } // forward declaration static OFCondition parseDataSet(DcmItem *dataset, xmlNodePtr current, E_TransferSyntax xfer); static OFCondition parseSequence(DcmSequenceOfItems *sequence, xmlNodePtr current, E_TransferSyntax xfer) { OFCondition result = EC_IllegalCall; if (sequence != NULL) { /* ignore blank (empty or whitespace only) nodes */ while ((current != NULL) && xmlIsBlankNode(current)) current = current->next; while (current != NULL) { /* ignore non-item nodes */ if (xmlStrcmp(current->name, OFreinterpret_cast(const xmlChar *, "item")) == 0) { /* create new sequence item */ DcmItem *newItem = new DcmItem(); if (newItem != NULL) { sequence->insert(newItem); /* proceed parsing the item content */ parseDataSet(newItem, current->xmlChildrenNode, xfer); } } else if (!xmlIsBlankNode(current)) OFLOG_WARN(xml2dcmLogger, "unexpected node '" << current->name << "', 'item' expected, skipping"); /* proceed with next node */ current = current->next; } result = EC_Normal; } return result; } static OFCondition parsePixelSequence(DcmPixelSequence *sequence, xmlNodePtr current) { OFCondition result = EC_IllegalCall; if (sequence != NULL) { /* ignore blank (empty or whitespace only) nodes */ while ((current != NULL) && xmlIsBlankNode(current)) current = current->next; while (current != NULL) { /* ignore non-pixel-item nodes */ if (xmlStrcmp(current->name, OFreinterpret_cast(const xmlChar *, "pixel-item")) == 0) { /* create new pixel item */ DcmPixelItem *newItem = new DcmPixelItem(DcmTag(DCM_Item, EVR_OB)); if (newItem != NULL) { sequence->insert(newItem); /* put pixel data into the item */ putElementContent(current, newItem); } } else if (!xmlIsBlankNode(current)) OFLOG_WARN(xml2dcmLogger, "unexpected node '" << current->name << "', 'pixel-item' expected, skipping"); /* proceed with next node */ current = current->next; } result = EC_Normal; } return result; } static OFCondition parseMetaHeader(DcmMetaInfo *metainfo, xmlNodePtr current, const OFBool parse) { /* check for valid node and correct name */ OFCondition result = checkNode(current, "meta-header"); if (result.good() && parse) { /* get child nodes */ current = current->xmlChildrenNode; while (current != NULL) { /* ignore non-element nodes */ if (xmlStrcmp(current->name, OFreinterpret_cast(const xmlChar *, "element")) == 0) parseElement(metainfo, current); else if (!xmlIsBlankNode(current)) OFLOG_WARN(xml2dcmLogger, "unexpected node '" << current->name << "', 'element' expected, skipping"); /* proceed with next node */ current = current->next; } } return result; } static OFCondition parseDataSet(DcmItem *dataset, xmlNodePtr current, E_TransferSyntax xfer) { OFCondition result = EC_Normal; /* ignore blank (empty or whitespace only) nodes */ while ((current != NULL) && xmlIsBlankNode(current)) current = current->next; while (current != NULL) { /* ignore non-element/sequence nodes */ if (xmlStrcmp(current->name, OFreinterpret_cast(const xmlChar *, "element")) == 0) parseElement(dataset, current); else if (xmlStrcmp(current->name, OFreinterpret_cast(const xmlChar *, "sequence")) == 0) { DcmElement *newElem = NULL; /* create new sequence element */ if (createNewElement(current, newElem).good()) { /* insert new sequence element into the dataset */ result = dataset->insert(newElem, OFTrue /*replaceOld*/); if (result.good()) { /* special handling for compressed pixel data */ if (newElem->getTag() == DCM_PixelData) { /* create new pixel sequence */ DcmPixelSequence *sequence = new DcmPixelSequence(DcmTag(DCM_PixelData, EVR_OB)); if (sequence != NULL) { /* ... insert it into the dataset and proceed with the pixel items */ OFstatic_cast(DcmPixelData *, newElem)->putOriginalRepresentation(xfer, NULL, sequence); parsePixelSequence(sequence, current->xmlChildrenNode); } } else { /* proceed parsing the items of the sequence */ parseSequence(OFstatic_cast(DcmSequenceOfItems *, newElem), current->xmlChildrenNode, xfer); } } else { /* delete element if insertion failed */ delete newElem; } } } else if (!xmlIsBlankNode(current)) OFLOG_WARN(xml2dcmLogger, "unexpected node '" << current->name << "', skipping"); /* proceed with next node */ current = current->next; } return result; } static OFCondition validateXmlDocument(xmlDocPtr doc) { OFCondition result = EC_Normal; OFLOG_INFO(xml2dcmLogger, "validating XML document ..."); xmlGenericError(xmlGenericErrorContext, "--- libxml validating ---\n"); /* temporary buffer needed for errorFunction - more detailed explanation there */ OFString tmpErrorString; /* create context for document validation */ xmlValidCtxt cvp; cvp.userData = &tmpErrorString; cvp.error = errorFunction; cvp.warning = errorFunction; /* validate the document */ const int valid = xmlValidateDocument(&cvp, doc); xmlGenericError(xmlGenericErrorContext, "-------------------------\n"); if (!valid) { OFLOG_ERROR(xml2dcmLogger, "document does not validate"); result = EC_IllegalCall; } return result; } static OFCondition readXmlFile(const char *ifname, DcmFileFormat &fileformat, E_TransferSyntax &xfer, const OFBool metaInfo, const OFBool checkNamespace, const OFBool validateDocument) { OFCondition result = EC_Normal; xfer = EXS_Unknown; xmlGenericError(xmlGenericErrorContext, "--- libxml parsing ------\n"); /* build an XML tree from the file */ xmlDocPtr doc = xmlParseFile(ifname); xmlGenericError(xmlGenericErrorContext, "-------------------------\n"); if (doc != NULL) { /* validate document */ if (validateDocument) result = validateXmlDocument(doc); if (result.good()) { /* check whether the document is of the right kind */ xmlNodePtr current = xmlDocGetRootElement(doc); if (current != NULL) { /* check namespace declaration (if required) */ if (!checkNamespace || (xmlSearchNsByHref(doc, current, OFreinterpret_cast(const xmlChar *, DCMTK_XML_NAMESPACE_URI)) != NULL)) { /* check whether to parse a "file-format" or "data-set" */ if (xmlStrcmp(current->name, OFreinterpret_cast(const xmlChar *, "file-format")) == 0) { OFLOG_INFO(xml2dcmLogger, "parsing file-format ..."); if (metaInfo) OFLOG_INFO(xml2dcmLogger, "parsing meta-header ..."); else OFLOG_INFO(xml2dcmLogger, "skipping meta-header ..."); current = current->xmlChildrenNode; /* ignore blank (empty or whitespace only) nodes */ while ((current != NULL) && xmlIsBlankNode(current)) current = current->next; /* parse/skip "meta-header" */ result = parseMetaHeader(fileformat.getMetaInfo(), current, metaInfo /*parse*/); if (result.good()) { current = current->next; /* ignore blank (empty or whitespace only) nodes */ while ((current != NULL) && xmlIsBlankNode(current)) current = current->next; } } /* there should always be a "data-set" node */ if (result.good()) { OFLOG_INFO(xml2dcmLogger, "parsing data-set ..."); /* parse "data-set" */ result = checkNode(current, "data-set"); if (result.good()) { DcmDataset *dataset = fileformat.getDataset(); /* determine stored transfer syntax */ xmlChar *xferUID = xmlGetProp(current, OFreinterpret_cast(const xmlChar *, "xfer")); if (xferUID != NULL) xfer = DcmXfer(OFreinterpret_cast(char *, xferUID)).getXfer(); result = parseDataSet(dataset, current->xmlChildrenNode, xfer); /* free allocated memory */ xmlFree(xferUID); } } if (result.bad() && xmlLogger.isEnabledFor(OFLogger::DEBUG_LOG_LEVEL)) { /* dump XML document for debugging purposes */ xmlChar *str; int size; xmlDocDumpFormatMemory(doc, &str, &size, 1); OFLOG_DEBUG(xmlLogger, str); xmlFree(str); } } else { OFLOG_ERROR(xml2dcmLogger, "document has wrong type, dcmtk namespace not found"); result = EC_IllegalCall; } } else { OFLOG_ERROR(xml2dcmLogger, "document is empty: " << ifname); result = EC_IllegalCall; } } } else { OFLOG_ERROR(xml2dcmLogger, "could not parse document: " << ifname); result = EC_IllegalCall; } /* free allocated memory */ xmlFreeDoc(doc); return result; } #define SHORTCOL 3 #define LONGCOL 21 int main(int argc, char *argv[]) { OFBool opt_metaInfo = OFTrue; OFBool opt_namespace = OFFalse; OFBool opt_validate = OFFalse; OFBool opt_generateUIDs = OFFalse; OFBool opt_overwriteUIDs = OFFalse; E_TransferSyntax opt_xfer = EXS_Unknown; E_EncodingType opt_enctype = EET_ExplicitLength; E_GrpLenEncoding opt_glenc = EGL_recalcGL; E_PaddingEncoding opt_padenc = EPD_withoutPadding; E_FileWriteMode opt_writeMode = EWM_fileformat; OFCmdUnsignedInt opt_filepad = 0; OFCmdUnsignedInt opt_itempad = 0; /* set-up command line parameters and options */ OFConsoleApplication app(OFFIS_CONSOLE_APPLICATION, OFFIS_CONSOLE_DESCRIPTION, rcsid); OFCommandLine cmd; cmd.setOptionColumns(LONGCOL, SHORTCOL); cmd.setParamColumn(LONGCOL + SHORTCOL + 4); cmd.addParam("xmlfile-in", "XML input filename to be converted (stdin: \"-\")", OFCmdParam::PM_Mandatory); cmd.addParam("dcmfile-out", "DICOM output filename", OFCmdParam::PM_Mandatory); cmd.addGroup("general options:", LONGCOL, SHORTCOL + 2); cmd.addOption("--help", "-h", "print this help text and exit", OFCommandLine::AF_Exclusive); cmd.addOption("--version", "print version information and exit", OFCommandLine::AF_Exclusive); OFLog::addOptions(cmd); cmd.addGroup("input options:"); cmd.addSubGroup("input file format:"); cmd.addOption("--read-meta-info", "+f", "read meta information if present (default)"); cmd.addOption("--ignore-meta-info", "-f", "ignore file meta information"); cmd.addGroup("processing options:"); cmd.addSubGroup("validation:"); cmd.addOption("--validate-document", "+Vd", "validate XML document against DTD"); cmd.addOption("--check-namespace", "+Vn", "check XML namespace in document root"); cmd.addSubGroup("unique identifiers:"); cmd.addOption("--generate-new-uids", "+Ug", "generate new Study/Series/SOP Instance UID"); cmd.addOption("--dont-overwrite-uids", "-Uo", "do not overwrite existing UIDs (default)"); cmd.addOption("--overwrite-uids", "+Uo", "overwrite existing UIDs"); cmd.addGroup("output options:"); cmd.addSubGroup("output file format:"); cmd.addOption("--write-file", "+F", "write file format (default)"); cmd.addOption("--write-dataset", "-F", "write data set without file meta information"); cmd.addOption("--update-meta-info", "+Fu", "update particular file meta information"); cmd.addSubGroup("output transfer syntax:"); cmd.addOption("--write-xfer-same", "+t=", "write with same TS as input (default)"); cmd.addOption("--write-xfer-little", "+te", "write with explicit VR little endian TS"); cmd.addOption("--write-xfer-big", "+tb", "write with explicit VR big endian TS"); cmd.addOption("--write-xfer-implicit", "+ti", "write with implicit VR little endian TS"); #ifdef WITH_ZLIB cmd.addOption("--write-xfer-deflated", "+td", "write with deflated expl. VR little endian TS"); #endif cmd.addSubGroup("post-1993 value representations:"); cmd.addOption("--enable-new-vr", "+u", "enable support for new VRs (UN/UT) (default)"); cmd.addOption("--disable-new-vr", "-u", "disable support for new VRs, convert to OB"); cmd.addSubGroup("group length encoding:"); cmd.addOption("--group-length-recalc", "+g=", "recalculate group lengths if present (default)"); cmd.addOption("--group-length-create", "+g", "always write with group length elements"); cmd.addOption("--group-length-remove", "-g", "always write without group length elements"); cmd.addSubGroup("length encoding in sequences and items:"); cmd.addOption("--length-explicit", "+e", "write with explicit lengths (default)"); cmd.addOption("--length-undefined", "-e", "write with undefined lengths"); cmd.addSubGroup("data set trailing padding (not with --write-dataset):"); cmd.addOption("--padding-retain", "-p=", "do not change padding\n(default if not --write-dataset)"); cmd.addOption("--padding-off", "-p", "no padding (implicit if --write-dataset)"); cmd.addOption("--padding-create", "+p", 2, "[f]ile-pad [i]tem-pad: integer", "align file on multiple of f bytes\nand items on multiple of i bytes"); #ifdef WITH_ZLIB cmd.addSubGroup("deflate compression level (only with --write-xfer-deflated):"); cmd.addOption("--compression-level", "+cl", 1, "[l]evel: integer (default: 6)", "0=uncompressed, 1=fastest, 9=best compression"); #endif /* evaluate command line */ prepareCmdLineArgs(argc, argv, OFFIS_CONSOLE_APPLICATION); if (app.parseCommandLine(cmd, argc, argv, OFCommandLine::PF_ExpandWildcards)) { /* check exclusive options first */ if (cmd.hasExclusiveOption()) { if (cmd.findOption("--version")) { app.printHeader(OFTrue /*print host identifier*/); COUT << OFendl << "External libraries used:" << OFendl; #ifdef WITH_ZLIB COUT << "- ZLIB, Version " << zlibVersion() << OFendl; #endif COUT << "- LIBXML, Version " << LIBXML_DOTTED_VERSION << OFendl; return 0; } } /* general options */ OFLog::configureFromCommandLine(cmd, app); /* input options */ cmd.beginOptionBlock(); if (cmd.findOption("--read-meta-info")) opt_metaInfo = OFTrue; if (cmd.findOption("--ignore-meta-info")) opt_metaInfo = OFFalse; cmd.endOptionBlock(); /* processing options */ if (cmd.findOption("--validate-document")) opt_validate = OFTrue; if (cmd.findOption("--check-namespace")) opt_namespace = OFTrue; if (cmd.findOption("--generate-new-uids")) opt_generateUIDs = OFTrue; cmd.beginOptionBlock(); if (cmd.findOption("--dont-overwrite-uids")) opt_overwriteUIDs = OFFalse; if (cmd.findOption("--overwrite-uids")) opt_overwriteUIDs = OFTrue; cmd.endOptionBlock(); /* output options */ cmd.beginOptionBlock(); if (cmd.findOption("--write-file")) opt_writeMode = EWM_fileformat; if (cmd.findOption("--write-dataset")) opt_writeMode = EWM_dataset; cmd.endOptionBlock(); if (cmd.findOption("--update-meta-info")) { app.checkConflict("--update-meta-info", "--write-dataset", opt_writeMode == EWM_dataset); opt_writeMode = EWM_updateMeta; } cmd.beginOptionBlock(); if (cmd.findOption("--write-xfer-same")) opt_xfer = EXS_Unknown; if (cmd.findOption("--write-xfer-little")) opt_xfer = EXS_LittleEndianExplicit; if (cmd.findOption("--write-xfer-big")) opt_xfer = EXS_BigEndianExplicit; if (cmd.findOption("--write-xfer-implicit")) opt_xfer = EXS_LittleEndianImplicit; #ifdef WITH_ZLIB if (cmd.findOption("--write-xfer-deflated")) opt_xfer = EXS_DeflatedLittleEndianExplicit; #endif cmd.endOptionBlock(); cmd.beginOptionBlock(); if (cmd.findOption("--enable-new-vr")) { dcmEnableUnknownVRGeneration.set(OFTrue); dcmEnableUnlimitedTextVRGeneration.set(OFTrue); } if (cmd.findOption("--disable-new-vr")) { dcmEnableUnknownVRGeneration.set(OFFalse); dcmEnableUnlimitedTextVRGeneration.set(OFFalse); } cmd.endOptionBlock(); cmd.beginOptionBlock(); if (cmd.findOption("--group-length-recalc")) opt_glenc = EGL_recalcGL; if (cmd.findOption("--group-length-create")) opt_glenc = EGL_withGL; if (cmd.findOption("--group-length-remove")) opt_glenc = EGL_withoutGL; cmd.endOptionBlock(); cmd.beginOptionBlock(); if (cmd.findOption("--length-explicit")) opt_enctype = EET_ExplicitLength; if (cmd.findOption("--length-undefined")) opt_enctype = EET_UndefinedLength; cmd.endOptionBlock(); cmd.beginOptionBlock(); if (cmd.findOption("--padding-retain")) { app.checkConflict("--padding-retain", "--write-dataset", opt_writeMode == EWM_dataset); opt_padenc = EPD_noChange; } if (cmd.findOption("--padding-off")) opt_padenc = EPD_withoutPadding; if (cmd.findOption("--padding-create")) { app.checkConflict("--padding-create", "--write-dataset", opt_writeMode == EWM_dataset); app.checkValue(cmd.getValueAndCheckMin(opt_filepad, 0)); app.checkValue(cmd.getValueAndCheckMin(opt_itempad, 0)); opt_padenc = EPD_withPadding; } cmd.endOptionBlock(); #ifdef WITH_ZLIB if (cmd.findOption("--compression-level")) { OFCmdUnsignedInt comprLevel = 0; app.checkDependence("--compression-level", "--write-xfer-deflated", opt_xfer == EXS_DeflatedLittleEndianExplicit); app.checkValue(cmd.getValueAndCheckMinMax(comprLevel, 0, 9)); dcmZlibCompressionLevel.set(OFstatic_cast(int, comprLevel)); } #endif } /* print resource identifier */ OFLOG_DEBUG(xml2dcmLogger, rcsid << OFendl); /* make sure data dictionary is loaded */ if (!dcmDataDict.isDictionaryLoaded()) { OFLOG_WARN(xml2dcmLogger, "no data dictionary loaded, check environment variable: " << DCM_DICT_ENVIRONMENT_VARIABLE); } /* check for compatible libxml version */ LIBXML_TEST_VERSION /* temporary buffer needed for errorFunction - more detailed explanation there */ OFString tmpErrorString; /* initialize the XML library (only required for MT-safety) */ xmlInitParser(); /* substitute default entities (XML mnenonics) */ xmlSubstituteEntitiesDefault(1); /* add line number to debug messages */ xmlLineNumbersDefault(1); xmlGetWarningsDefaultValue = 1; xmlSetGenericErrorFunc(&tmpErrorString, errorFunction); OFCondition result = EC_Normal; const char *opt_ifname = NULL; const char *opt_ofname = NULL; cmd.getParam(1, opt_ifname); cmd.getParam(2, opt_ofname); /* check filenames */ if ((opt_ifname == NULL) || (strlen(opt_ifname) == 0)) { OFLOG_ERROR(xml2dcmLogger, OFFIS_CONSOLE_APPLICATION << ": invalid input filename: "); result = EC_IllegalParameter; } if ((opt_ofname == NULL) || (strlen(opt_ofname) == 0)) { OFLOG_ERROR(xml2dcmLogger, OFFIS_CONSOLE_APPLICATION << ": invalid output filename: "); result = EC_IllegalParameter; } if (result.good()) { DcmFileFormat fileformat; E_TransferSyntax xfer; OFLOG_INFO(xml2dcmLogger, "reading XML input file: " << opt_ifname); /* read XML file and feed data into DICOM fileformat */ result = readXmlFile(opt_ifname, fileformat, xfer, opt_metaInfo, opt_namespace, opt_validate); if (result.good()) { DcmDataset *dataset = fileformat.getDataset(); /* generate new UIDs (if required) */ if (opt_generateUIDs) { char uid[100]; if (opt_overwriteUIDs || !dataset->tagExistsWithValue(DCM_StudyInstanceUID)) { OFLOG_INFO(xml2dcmLogger, "generating new Study Instance UID"); dataset->putAndInsertString(DCM_StudyInstanceUID, dcmGenerateUniqueIdentifier(uid, SITE_STUDY_UID_ROOT)); } if (opt_overwriteUIDs || !dataset->tagExistsWithValue(DCM_SeriesInstanceUID)) { OFLOG_INFO(xml2dcmLogger, "generating new Series Instance UID"); dataset->putAndInsertString(DCM_SeriesInstanceUID, dcmGenerateUniqueIdentifier(uid, SITE_SERIES_UID_ROOT)); } if (opt_overwriteUIDs || !dataset->tagExistsWithValue(DCM_SOPInstanceUID)) { OFLOG_INFO(xml2dcmLogger, "generating new SOP Instance UID"); dataset->putAndInsertString(DCM_SOPInstanceUID, dcmGenerateUniqueIdentifier(uid, SITE_INSTANCE_UID_ROOT)); } } OFLOG_INFO(xml2dcmLogger, "writing DICOM output file: " << opt_ofname); /* determine transfer syntax to write the file */ if ((opt_xfer == EXS_Unknown) && (xfer != EXS_Unknown)) opt_xfer = xfer; /* check whether this is possible */ if (fileformat.canWriteXfer(opt_xfer)) { /* check whether pixel data is compressed */ if ((opt_writeMode == EWM_dataset) && DcmXfer(xfer).isEncapsulated()) { OFLOG_ERROR(xml2dcmLogger, "encapsulated pixel data require file format, ignoring --write-dataset"); opt_writeMode = EWM_fileformat; } /* write DICOM file */ result = fileformat.saveFile(opt_ofname, opt_xfer, opt_enctype, opt_glenc, opt_padenc, OFstatic_cast(Uint32, opt_filepad), OFstatic_cast(Uint32, opt_itempad), opt_writeMode); if (result.bad()) OFLOG_ERROR(xml2dcmLogger, result.text() << ": writing file: " << opt_ofname); } else { OFLOG_ERROR(xml2dcmLogger, "no conversion to transfer syntax " << DcmXfer(opt_xfer).getXferName() << " possible!"); result = EC_CannotChangeRepresentation; } } } /* clean up XML library before quitting */ xmlCleanupParser(); return result.status(); } #else /* WITH_LIBXML */ int main(int, char *[]) { CERR << rcsid << OFendl << OFFIS_CONSOLE_DESCRIPTION << OFendl << OFendl << OFFIS_CONSOLE_APPLICATION " requires the libxml library." << OFendl << "This " OFFIS_CONSOLE_APPLICATION " has been configured and compiled without libxml." << OFendl << "Please reconfigure your system and recompile if appropriate." << OFendl; return 0; } #endif /* WITH_LIBXML */ /* * CVS/RCS Log: * $Log: xml2dcm.cc,v $ * Revision 1.34 2010-12-15 13:59:57 uli * Fixed a problem with a missing prototype for vsnprintf on HP-UX. * * Revision 1.33 2010-10-21 08:35:41 joergr * Removed redundant definition of logger variable for libxml. * * Revision 1.32 2010-10-14 13:13:30 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.31 2010-06-03 10:30:17 joergr * Replaced calls to strerror() by new helper function OFStandard::strerror() * which results in using the thread safe version of strerror() if available. * * Revision 1.30 2010-05-20 09:22:31 joergr * Use new OFStandard::getFileSize() method where appropriate. * * Revision 1.29 2009-11-13 13:20:23 joergr * Fixed minor issues in log output. * * Revision 1.28 2009-11-04 09:58:06 uli * Switched to logging mechanism provided by the "new" oflog module * * Revision 1.27 2009-08-21 09:25:13 joergr * Added parameter 'writeMode' to save/write methods which allows for specifying * whether to write a dataset or fileformat as well as whether to update the * file meta information or to create a new file meta information header. * * Revision 1.26 2009-05-07 09:05:09 joergr * Added new command line options that allow for generating new Study/Series/SOP * Instance UIDs (incl. an option for overwriting existing values). * * Revision 1.25 2009-04-30 14:56:39 joergr * Fixed memory leak in putElementContent() for base64 encoded data. * * Revision 1.24 2008-11-03 15:50:42 joergr * Added ZLIB related output options --write-xfer-deflated, --compression-level. * * Revision 1.23 2008-09-25 14:38:48 joergr * Moved output of resource identifier in order to avoid printing the same * information twice. * * Revision 1.22 2008-09-25 11:19:48 joergr * Added support for printing the expanded command line arguments. * Always output the resource identifier of the command line tool in debug mode. * * Revision 1.21 2008-09-24 13:00:48 joergr * Added new command line option --update-meta-info that allows for updating * particular information in the file meta-header (e.g. SOP instance UID). * * Revision 1.20 2007/07/04 12:51:05 joergr * Added support for binary data (e.g. pixel data) stored in a separate file. * * Revision 1.19 2006/08/15 15:50:56 meichel * Updated all code in module dcmdata to correctly compile when * all standard C++ classes remain in namespace std. * * Revision 1.18 2006/07/27 13:52:42 joergr * Changed parameter "exclusive" of method addOption() from type OFBool into an * integer parameter "flags". Prepended prefix "PF_" to parseLine() flags. * Option "--help" is no longer an exclusive option by default. * * Revision 1.17 2006/07/11 13:59:20 joergr * Fixed wrong warning message about multiple Specific Character Set attributes * in DICOMDIR files. * * Revision 1.16 2005/12/16 15:46:41 meichel * Declared libxml2 callback functions as extern "C" * * Revision 1.15 2005/12/09 12:38:51 meichel * Added missing include for dcdebug.h * * Revision 1.14 2005/12/08 15:40:54 meichel * Changed include path schema for all DCMTK header files * * Revision 1.13 2005/11/30 12:51:45 joergr * Added missing header file "dcdebug.h". * * Revision 1.12 2005/03/22 13:55:50 joergr * Added call of macro LIBXML_TEST_VERSION. * * Revision 1.11 2004/11/29 17:04:08 joergr * Added support for UTF-8 character set. * * Revision 1.10 2004/08/03 10:06:18 joergr * Added new option that allows to ignore the file meta information. * * Revision 1.9 2004/03/25 17:27:36 joergr * Solved issue with function pointer to std::fprintf or fprintf, respectively. * * Revision 1.8 2004/03/22 16:55:11 joergr * Replaced tabs by spaces. * * Revision 1.7 2004/02/20 18:06:43 joergr * Avoid wrong warning for LUTData (0028,3006) having a VR of US or SS. * * Revision 1.6 2004/01/16 10:53:53 joergr * Adapted type casts to new-style typecast operators defined in ofcast.h. * * Revision 1.5 2003/08/08 14:46:24 joergr * Made libxml output consistent with new xml2dsr command line tool. * * Revision 1.4 2003/06/17 17:36:04 joergr * Distinguish more strictly between OFBool and int (required when HAVE_CXX_BOOL * is defined). * * Revision 1.3 2003/05/20 08:52:56 joergr * Minor code corrections. * * Revision 1.2 2003/04/22 08:25:48 joergr * Adapted code to also compile trouble-free without libxml support (report a * message that libxml library is required). * * Revision 1.1 2003/04/17 18:57:08 joergr * Added new command line tool that allows to convert an XML document to DICOM * file or dataset. * * */ dcmtk-3.6.0/dcmdata/apps/mdfdsman.cc0000644000310500011400000007401611463514643016516 0ustar joergrdicom3/* * * Copyright (C) 2003-2010, 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: dcmdata * * Author: Michael Onken * * Purpose: Class for modifying DICOM files * * Last Update: $Author: uli $ * Update Date: $Date: 2010-11-01 10:42:43 $ * CVS/RCS Revision: $Revision: 1.29 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" // make sure OS specific configuration is included first #include "mdfdsman.h" #include "dcmtk/ofstd/ofstd.h" #include "dcmtk/dcmdata/dctk.h" #include "dcmtk/dcmdata/dcpath.h" #include "dcmtk/dcmdata/dcistrmf.h" /* for class DcmInputFileStream */ #define INCLUDE_CSTDIO #include "dcmtk/ofstd/ofstdinc.h" static OFLogger mdfdsmanLogger = OFLog::getLogger("dcmtk.dcmdata.mdfdsman"); MdfDatasetManager::MdfDatasetManager() : current_file(""), dfile(NULL), dset(NULL), ignore_un_modifies(OFFalse) { } OFCondition MdfDatasetManager::loadFile(const char *file_name, const E_FileReadMode readMode, const E_TransferSyntax xfer) { OFCondition cond; // delete old dfile and free memory and reset current_file delete dfile; current_file = ""; dfile = new DcmFileFormat(); dset = dfile->getDataset(); // load file into dfile OFLOG_INFO(mdfdsmanLogger, "Loading file into dataset manager: " << file_name); cond = dfile->loadFile(file_name, xfer, EGL_noChange, DCM_MaxReadLength, readMode); // if there are errors: if (cond.bad()) { dset = NULL; } // file successfully loaded into dfile else { // get dataset from file OFLOG_INFO(mdfdsmanLogger, "Getting dataset from loaded file: " << file_name); dset=dfile->getDataset(); /* load also pixeldata into memory: * Without this command pixeldata wouldn't be included into the file, * that's saved after modifying, because original filename was renamed * meanwhile */ dset->loadAllDataIntoMemory(); // save filename to member variable current_file = file_name; } return cond; } static DcmTagKey getTagKeyFromDictionary(OFString tag) { DcmTagKey key(0xffff,0xffff); const DcmDataDictionary& globalDataDict = dcmDataDict.rdlock(); const DcmDictEntry *dicent = globalDataDict.findEntry(tag.c_str()); // successfull lookup in dictionary -> translate to tag and return if (dicent) { key = dicent->getKey(); } dcmDataDict.unlock(); return key; } static int readNextToken(const char *c, int& pos, DcmTagKey& key, Uint32& idx) { OFString aString; int lpos = pos; int spos = 0; if (c[lpos]=='\0') return -1; // EOF if (c[lpos]=='.') { ++pos; return 3; // period } // look for item index between [] if (c[lpos]=='[') { spos = ++lpos; while ((c[lpos] >= '0')&&(c[lpos] <= '9')) ++lpos; if (c[lpos] != ']') return 0; // parse error unsigned long newindex = 0; if (1 != sscanf(c+spos,"%lu", &newindex)) return 0; // parse error idx = OFstatic_cast(Uint32, newindex); pos = ++lpos; return 2; // index } // look for tag between () if (c[lpos]=='(') { spos = ++lpos; while ((c[lpos] != ')')&&(c[lpos] != '\0')) ++lpos; if (c[lpos] != ')') return 0; // parse error unsigned int group=0; unsigned int elem=0; if (2 != sscanf(c+spos,"%x,%x", &group, &elem)) return 0; // parse error key = DcmTagKey(group,elem); pos = ++lpos; return 1; // tag key } // so far no tag and no item index found. So check if it's a dictionary name spos = lpos; while ( ((c[lpos] >= 'a')&&(c[lpos] <= 'z')) || ((c[lpos] >= 'A')&&(c[lpos] <= 'Z')) || ((c[lpos] >= '0')&&(c[lpos] <= '9'))) ++lpos; aString.append(c + spos, (lpos-spos)); key=getTagKeyFromDictionary(aString); // if key was found in dictionary, return 1 for tag key if ( (key.getGroup()!=0xffff) && (key.getElement()!=0xffff) ) { pos=lpos; return 1; // tag key } // if no return command was processed this far, the token could not be parsed return 0; // parse error } static DcmItem* getItemFromPath(DcmItem &dataset, const char *location, OFString &message) { DcmTagKey key; Uint32 idx = 0; int pos = 0; int token = 0; int expected = 1; // first expected is a tagkey OFBool finished = OFFalse; DcmItem *result = &dataset; DcmSequenceOfItems *sq = NULL; DcmStack stack; message.clear(); do { token = readNextToken(location, pos, key, idx); if ((token != expected)&&(token != -1)) { message=message + "parse error in path '" + location + "'"; return NULL; } if (token == -1) { if (!finished) { message=message + "Error: path '" + location + "' incomplete"; return NULL; } return result; } if (token == 1) { // we have read a tag key stack.clear(); if (EC_Normal != result->search(key, stack, ESM_fromHere, OFFalse)) { message=message + "Error: attribute not found in dataset (path is '" + location + "')"; return NULL; } if (stack.top()->ident() == EVR_SQ) { sq = OFstatic_cast(DcmSequenceOfItems *, stack.top()); } else { message=message + "Error: attribute is not a sequence (path is '" + location + "')"; return NULL; } expected = 2; finished = OFFalse; } else if (token == 2) { // we have read an index if (sq == NULL) { message=message + "Error: sequence not found in path '" + location +"'"; return NULL; } if (idx >= sq->card()) { message=message + "Error: cannot allocate item in sequence (path is '" + location + "')"; return NULL; } result = sq->getItem(idx); if (result == NULL) { message=message + "Error: item not found in path '" + location + "'"; return NULL; } expected = 3; finished = OFTrue; } else if (token == 3) { // we have read a period expected = 1; finished = OFFalse; } } while (token > 0); return NULL; } static OFCondition splitTagPath(OFString &tag_path, DcmTagKey &key) { OFString target_tag; unsigned int group,elem; int lpos,rpos; rpos=tag_path.size()-1; lpos=rpos; if (tag_path[rpos]==')') { // get opening '(' of target tag; if its not found -> return error while ( (tag_path[lpos]!='(') && (lpos>0) ) --lpos; if (tag_path[lpos]!='(') return makeOFCondition(OFM_dcmdata,22,OF_error,"Invalid tag path!"); // now lpos and rpos "point" to braces of target tag // copy target tag from tag path target_tag=tag_path.substr(lpos,rpos-lpos+1); // delete target tag from path (inclusive trailing '.') tag_path.erase(lpos,tag_path.length()-lpos); // if there's a tag path left, remove the '.', too if ( (tag_path.length()>0) && (tag_path[tag_path.length()-1]=='.')) tag_path.erase(tag_path.length()-1,1); // parse target_tag into DcmTagKey if (2 != sscanf(target_tag.c_str(),"(%x,%x)", &group, &elem)) return makeOFCondition(OFM_dcmdata,22,OF_error,"Invalid target tag!"); key = DcmTagKey(group,elem); } else // otherwise we could have a dictionary name { while ( (lpos>0) && (((tag_path[lpos] >= 'a')&&(tag_path[lpos] <= 'z')) || ((tag_path[lpos] >= 'A')&&(tag_path[lpos] <= 'Z')) || ((tag_path[lpos] >= '0')&&(tag_path[lpos] <= '9'))) ) lpos--; target_tag=tag_path.substr(lpos,rpos-lpos+1); if (target_tag[0]=='.') target_tag.erase(0,1); tag_path.erase(lpos,tag_path.length()-lpos); key=getTagKeyFromDictionary(target_tag); if ( (key.getGroup()==0xffff) && (key.getElement()==0xffff) ) { OFString message=target_tag; message.append(" not found in dictionary!"); return makeOFCondition(OFM_dcmdata,22,OF_error,message.c_str()); } } return EC_Normal; } OFCondition MdfDatasetManager::modifyOrInsertPath(OFString tag_path, const OFString &value, const OFBool &only_modify, const OFBool update_metaheader, const OFBool ignore_missing_tags, const OFBool no_reservation_checks) { // if no file loaded: return an error if (dfile == NULL) return makeOFCondition(OFM_dcmdata,22,OF_error,"No file loaded yet!"); // find or create specified path DcmPathProcessor proc; proc.checkPrivateReservations(!no_reservation_checks); OFCondition result = proc.findOrCreatePath(dset, tag_path, !only_modify /*create if desired*/); // if desired, handle tag not found as being not an error if ( (result == EC_TagNotFound) && only_modify && ignore_missing_tags ) return EC_Normal; if (result.bad()) return result; OFList resultPaths; Uint32 numResultPaths = proc.getResults(resultPaths); if (numResultPaths == 0) return EC_IllegalCall; // general validity checking; must only be done for one result OFListIterator(DcmPath*) resultPath = resultPaths.begin(); // verify that groups 0 (invalid) and 2 (meta header) were not used if ( (*resultPath)->containsGroup(0) || (*resultPath)->containsGroup(2) ) return makeOFCondition(OFM_dcmdata,22,OF_error, "Cannot insert/modify tags with group 0000 or 0002!"); // also - according to the standard - groups 1,3,5,7,FF are illegal if ( (*resultPath)->containsGroup(1) || (*resultPath)->containsGroup(3) || (*resultPath)->containsGroup(5) || (*resultPath)->containsGroup(7) || (*resultPath)->containsGroup(0xffff) ) return makeOFCondition(OFM_dcmdata, 22, OF_error, "Groups 0001,0003,0005,0007,FFFF are illegal!"); DcmPathNode *lastElement = (*resultPath)->back(); if (lastElement == NULL) return EC_IllegalCall; DcmObject *obj = lastElement->m_obj; if (obj == NULL) return EC_IllegalCall; // if object at the end is not a leaf, the insertion is completed (or must fail) if (!obj->isLeaf()) { // if user specified a value to be inserted into non-leaf element, return error if (value.length() != 0) return makeOFCondition(OFM_dcmdata,22,OF_error,"Cannot put value into non-leaf elements!"); // non-leaf elements (items/sequences) cannot just be modified if (only_modify) return makeOFCondition(OFM_dcmdata,22,OF_error,"Cannot modify non-leaf elements!"); // we have inserted an item/sequence at the end -> job completed return EC_Normal; } // start modifying element value as desired resultPath = resultPaths.begin(); while (resultPath != resultPaths.end()) { lastElement = (*resultPath)->back(); if (lastElement == NULL) return EC_IllegalCall; // if tag is already present, start modify operation DcmElement *elem = OFstatic_cast(DcmElement*, lastElement->m_obj); if (elem == NULL) return EC_IllegalCall; result = startModify(elem, value); if (result.bad()) return result; if (update_metaheader) deleteRelatedMetaheaderTag(elem->getTag()); resultPath++; } return EC_Normal; } OFCondition MdfDatasetManager::modifyOrInsertFromFile(OFString tag_path, const OFString &filename, const OFBool &only_modify, const OFBool update_metaheader, const OFBool ignore_missing_tags, const OFBool no_reservation_checks) { // if no file loaded: return an error if (dfile == NULL) return makeOFCondition(OFM_dcmdata, 22, OF_error, "No file loaded yet!"); // first, perform some basic checks on the specified file(name) if (filename.empty()) return makeOFCondition(OFM_dcmdata, 22, OF_error, "No filename specified to read value from!"); if (!OFStandard::fileExists(filename)) return makeOFCondition(OFM_dcmdata, 22, OF_error, "File to read value from does not exist!"); if (!OFStandard::isReadable(filename)) return makeOFCondition(OFM_dcmdata, 22, OF_error, "File to read value from is not readable!"); // find or create specified path DcmPathProcessor proc; proc.checkPrivateReservations(!no_reservation_checks); OFCondition result = proc.findOrCreatePath(dset, tag_path, !only_modify /*create if desired*/); // if desired, handle tag not found as being not an error if ((result == EC_TagNotFound) && only_modify && ignore_missing_tags) return EC_Normal; if (result.bad()) return result; OFList resultPaths; Uint32 numResultPaths = proc.getResults(resultPaths); if (numResultPaths == 0) return EC_IllegalCall; // general validity checking; must only be done for one result OFListIterator(DcmPath*) resultPath = resultPaths.begin(); // verify that groups 0 (invalid) and 2 (meta header) were not used if ((*resultPath)->containsGroup(0) || (*resultPath)->containsGroup(2)) return makeOFCondition(OFM_dcmdata,22,OF_error, "Cannot insert/modify tags with group 0000 or 0002!"); // also - according to the standard - groups 1,3,5,7,FF are illegal if ((*resultPath)->containsGroup(1) || (*resultPath)->containsGroup(3) || (*resultPath)->containsGroup(5) || (*resultPath)->containsGroup(7) || (*resultPath)->containsGroup(0xffff)) return makeOFCondition(OFM_dcmdata, 22, OF_error, "Groups 0001,0003,0005,0007,FFFF are illegal!"); DcmPathNode *lastElement = (*resultPath)->back(); if (lastElement == NULL) return EC_IllegalCall; DcmObject *obj = lastElement->m_obj; if (obj == NULL) return EC_IllegalCall; // if object at the end is not a leaf, the insertion/modification fails if (!obj->isLeaf()) return makeOFCondition(OFM_dcmdata, 22, OF_error, "Cannot put value into non-leaf elements!"); // start modifying element value as desired resultPath = resultPaths.begin(); while (resultPath != resultPaths.end()) { lastElement = (*resultPath)->back(); if (lastElement == NULL) return EC_IllegalCall; // if tag is already present, start modify operation DcmElement *elem = OFstatic_cast(DcmElement*, lastElement->m_obj); if (elem == NULL) return EC_IllegalCall; // check whether VR is "unknown" DcmEVR vr = elem->getTag().getEVR(); if (ignore_un_modifies && ((vr == EVR_UN) || (vr == EVR_UNKNOWN) || (vr == EVR_UNKNOWN2B))) { OFLOG_WARN(mdfdsmanLogger, "will not write value to attribute having VR=UN: " << elem->getTag()); return EC_Normal; } // create stream object for binary file DcmInputFileStream fileStream(filename.c_str()); result = fileStream.status(); if (result.good()) { const size_t fileLen = OFStandard::getFileSize(filename); if (fileLen & 1) return makeOFCondition(OFM_dcmdata, 22, OF_error, "Cannot insert/modify value with odd length from file!"); // read element value from binary file (requires even length) result = elem->createValueFromTempFile(fileStream.newFactory(), fileLen, EBO_LittleEndian); } if (result.bad()) return result; if (update_metaheader) deleteRelatedMetaheaderTag(elem->getTag()); resultPath++; } return EC_Normal; } OFCondition MdfDatasetManager::modifyAllTags(OFString tag_path, const OFString &value, const OFBool update_metaheader, int &count, const OFBool ignore_missing_tags) { // if no file loaded: return an error if (dfile == NULL) return makeOFCondition(OFM_dcmdata,22,OF_error,"No file loaded yet!"); DcmTagKey key; OFCondition result; // split tag_path into the path itself and the target tag result=splitTagPath(tag_path, key); if ( result.bad() ) return result; // check whether tag with this group can be modified if (!key.hasValidGroup()) return makeOFCondition(OFM_dcmdata,22,OF_error,"Invalid group number!"); // modify metaheader if necessary; not necessary if not a main level tag if ( update_metaheader && tag_path.empty() ) deleteRelatedMetaheaderTag(key); // this stack will hold result of element search DcmStack result_stack; DcmObject *elem; // get references to all matching tags in dataset and store them in stack OFLOG_DEBUG(mdfdsmanLogger, "looking for occurences of: " << key.toString()); result=dset->findAndGetElements(key, result_stack); // if there are elements found, modify metaheader if necessary OFLOG_DEBUG(mdfdsmanLogger, "found " << result_stack.card() << " occurences"); // as long there are matching elements left on the stack while( result_stack.card() > 0 && result.good() ) { // get the top element elem=result_stack.pop(); // if user gives e.g. a sequence delimiter,don't try to change it! if (elem->isLeaf()) { // and put new value to element OFLOG_DEBUG(mdfdsmanLogger, "accessing existing tag for modify operation"); result=startModify(OFstatic_cast(DcmElement*,elem),value); if (result.good()) count++; } // if user gave "unchangeable" tag: else result = makeOFCondition(OFM_dcmdata,22,OF_error,"Unable to modify tag!"); } // if desired, handle "tag not found" as being OK if (ignore_missing_tags && (result == EC_TagNotFound)) return EC_Normal; return result; } OFCondition MdfDatasetManager::deleteTag(OFString tag_path, const OFBool all_tags, const OFBool ignore_missing_tags) { // if no file loaded: return an error if (dfile == NULL) return makeOFCondition(OFM_dcmdata,22,OF_error,"No file loaded yet!"); OFCondition result; if (all_tags) { // split tag path into item path and target tag DcmTagKey key; result = splitTagPath(tag_path, key); if (result.bad()) return result; // error parsing tag path // if group is 0 or 2: abort; deletion of tags with 1,3,5,7 should be allowed if ( (key.getGroup() == 0) || (key.getGroup() == 2) ) return makeOFCondition(OFM_dcmdata,22,OF_error, "Cannot delete tags with group 0000 or 0002!"); // if tag path still contains characters, user wants to modify item tag if (tag_path.length() > 0) { OFString error; DcmItem *item=NULL; item = getItemFromPath(*dset, tag_path.c_str(), error); if (item != NULL) result = item->findAndDeleteElement(key, all_tags, all_tags); else return makeOFCondition(OFM_dcmdata,22,OF_error,error.c_str()); } // other user specified single tag without path else { result = dset->findAndDeleteElement(key, all_tags, all_tags); } if (ignore_missing_tags && (result == EC_TagNotFound)) return EC_Normal; return result; } // do not delete all tags -> use path functions DcmPathProcessor pathProc; Uint32 numDeletions = 0; result = pathProc.findOrDeletePath(dset, tag_path, numDeletions); if (ignore_missing_tags && (result == EC_TagNotFound)) return EC_Normal; return result; } OFCondition MdfDatasetManager::deletePrivateData() { // if no file loaded : return an error if (dfile == NULL) return makeOFCondition(OFM_dcmdata,22,OF_error,"No file loaded yet!"); DcmStack stack; DcmObject *dobj = NULL; DcmTagKey tag; OFCondition status = dset->nextObject(stack, OFTrue); while (status.good()) { dobj = stack.top(); tag = dobj->getTag(); if (tag.getGroup() & 1) // private tag ? { stack.pop(); delete OFstatic_cast(DcmItem *, (stack.top()))->remove(dobj); } status = dset->nextObject(stack, OFTrue); } return EC_Normal; } OFCondition MdfDatasetManager::generateAndInsertUID(const DcmTagKey& uidKey) { // if no file loaded : return an error if (dfile==NULL) return makeOFCondition(OFM_dcmdata,22,OF_error,"No file loaded yet!"); OFCondition result; char uid[100]; if (uidKey == DCM_StudyInstanceUID) dcmGenerateUniqueIdentifier(uid, SITE_STUDY_UID_ROOT); else if (uidKey == DCM_SeriesInstanceUID) dcmGenerateUniqueIdentifier(uid, SITE_SERIES_UID_ROOT); else if (uidKey == DCM_SOPInstanceUID) { dcmGenerateUniqueIdentifier(uid, SITE_INSTANCE_UID_ROOT); // force meta-header to refresh SOP Class/Instance UIDs. DcmItem *meta_info = dfile->getMetaInfo(); if (meta_info) { delete meta_info->remove(DCM_MediaStorageSOPInstanceUID); } } else return EC_IllegalCall; result = dset->putAndInsertString(uidKey, uid); return result; } OFCondition MdfDatasetManager::saveFile(const char *file_name, E_TransferSyntax opt_xfer, E_EncodingType opt_enctype, E_GrpLenEncoding opt_glenc, E_PaddingEncoding opt_padenc, OFCmdUnsignedInt opt_filepad, OFCmdUnsignedInt opt_itempad, OFBool opt_dataset) { // if no file loaded: return an error if (dfile==NULL) return makeOFCondition(OFM_dcmdata,22,OF_error,"No file loaded yet!"); OFCondition result; /* check whether transfer syntax is possible */ if ( (opt_xfer==EXS_Unknown) || (dfile->canWriteXfer(opt_xfer)) ) { /* check whether pixel data is compressed */ if (opt_dataset && DcmXfer(opt_xfer).isEncapsulated()) { OFLOG_WARN(mdfdsmanLogger, "encapsulated pixel data require file format, ignoring --write-dataset"); opt_dataset = OFFalse; } /* write DICOM file */ result = dfile->saveFile(file_name, opt_xfer, opt_enctype, opt_glenc, opt_padenc, OFstatic_cast(Uint32, opt_filepad), OFstatic_cast(Uint32, opt_itempad), (opt_dataset) ? EWM_dataset : EWM_fileformat); } else { OFLOG_DEBUG(mdfdsmanLogger, "no conversion to transfer syntax " << DcmXfer(opt_xfer).getXferName() << " possible!"); result = EC_CannotChangeRepresentation; } // save file OFLOG_INFO(mdfdsmanLogger, "Saving current dataset to file: " << file_name); return result; } OFCondition MdfDatasetManager::saveFile() { // save file without changing any parameters return saveFile(current_file.c_str(), EXS_Unknown, EET_UndefinedLength, EGL_recalcGL, EPD_noChange, 0, 0, OFFalse); } OFCondition MdfDatasetManager::startModify(DcmElement *elem, const OFString &value) { OFCondition result; DcmEVR vr = elem->getTag().getEVR(); if ( ignore_un_modifies && ((vr == EVR_UN) || (vr == EVR_UNKNOWN) || (vr == EVR_UNKNOWN2B))) { OFLOG_WARN(mdfdsmanLogger, "will not write value to attribute having VR=UN: " << elem->getTag().toString()); return EC_Normal; } // start putString function being defined on all VRs result = elem->putString(value.c_str()); return result; } void MdfDatasetManager::deleteRelatedMetaheaderTag(const DcmTagKey &key) { DcmItem *meta_info=dfile->getMetaInfo(); if (meta_info) { if (key==DCM_SOPInstanceUID) delete meta_info->remove(DCM_MediaStorageSOPInstanceUID); else if (key==DCM_SOPClassUID) delete meta_info->remove(DCM_MediaStorageSOPClassUID); } } DcmDataset* MdfDatasetManager::getDataset() { return dset; } DcmFileFormat* MdfDatasetManager::getFileFormat() { return dfile; } OFString MdfDatasetManager::getFilename() const { return current_file; } OFBool MdfDatasetManager::isTagInDictionary(const DcmTagKey &search_key) { const DcmDataDictionary& globalDataDict = dcmDataDict.rdlock(); const DcmDictEntry *dicent = globalDataDict.findEntry(search_key,NULL); // successfull lookup in dictionary -> translate to tag and return dcmDataDict.unlock(); if (dicent) return OFTrue; else return OFFalse; } void MdfDatasetManager::setModifyUNValues(OFBool modifyUNValues) { ignore_un_modifies = !modifyUNValues; } MdfDatasetManager::~MdfDatasetManager() { // cleanup delete dfile; } /* ** CVS/RCS Log: ** $Log: mdfdsman.cc,v $ ** Revision 1.29 2010-11-01 10:42:43 uli ** Fixed some compiler warnings reported by gcc with additional flags. ** ** Revision 1.28 2010-10-14 13:13:30 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.27 2010-05-20 15:53:58 joergr ** Added support for reading the value of insert/modify statements from a file. ** Slightly modified log messages and log levels in order to be more consistent. ** Removed some unnecessary include directives. ** ** Revision 1.26 2009-11-04 09:58:06 uli ** Switched to logging mechanism provided by the "new" oflog module ** ** Revision 1.25 2009-08-21 09:25:13 joergr ** Added parameter 'writeMode' to save/write methods which allows for specifying ** whether to write a dataset or fileformat as well as whether to update the ** file meta information or to create a new file meta information header. ** ** Revision 1.24 2009-07-08 16:10:36 onken ** Adapted dcmodify to changes in DcmPath API. ** ** Revision 1.23 2009-01-16 10:03:13 onken ** Code simplification for VR checking. ** ** Revision 1.22 2009-01-15 16:11:55 onken ** Reworked dcmodify to work with the new DcmPath classes for supporting ** wildcard paths and automatic insertion of missing attributes and items. ** Added options for private tag handling and modification of UN values and ** for ignoring errors resulting from missing tags during modify and erase ** operations. Further cleanups. ** ** Revision 1.21 2006-08-15 15:50:56 meichel ** Updated all code in module dcmdata to correctly compile when ** all standard C++ classes remain in namespace std. ** ** Revision 1.20 2005/12/16 09:08:33 onken ** - Added variable initialization to avoid compiler warning ** ** Revision 1.19 2005/12/15 10:23:41 joergr ** Replaced "true" by "OFTrue" and "false" by "OFFalse". ** ** Revision 1.18 2005/12/08 15:40:52 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.17 2005/12/02 09:20:08 joergr ** Added new file read mode that makes it possible to distinguish between DICOM ** files, datasets and other non-DICOM files. For this reason, the last ** parameter of method loadFile() changed from OFBool to E_FileReadMode. ** ** Revision 1.16 2005/11/14 15:00:14 joergr ** Made method getFilename() const. ** ** Revision 1.15 2004/11/05 17:17:24 onken ** Added input and output options for dcmodify. minor code enhancements. ** ** Revision 1.14 2004/10/22 16:53:26 onken ** - fixed ignore-errors-option ** - major enhancements for supporting private tags ** - removed '0 Errors' output ** - modifications to groups 0000,0001,0002,0003,0005 and 0007 are blocked, ** removing tags with group 0001,0003,0005 and 0007 is still possible ** - UID options: ** - generate new study, series and instance UIDs ** - When changing UIDs in dataset, related metaheader tags are updated ** automatically ** - minor code improvements ** ** Revision 1.13 2004/05/14 12:08:36 onken ** Additional documentation added. ** ** Revision 1.12 2004/04/19 14:45:07 onken ** Restructured code to avoid default parameter values for "complex types" like ** OFString. Required for Sun CC 2.0.1. ** ** Revision 1.11 2004/04/07 12:25:53 joergr ** Changed type of integer variables to unsigned to avoid compiler warnings ** reported by gcc. ** ** Revision 1.10 2004/02/04 16:03:38 joergr ** Removed pointer declaration from parameter "resultStack" in method ** findAndGetElements(). ** ** Revision 1.9 2004/01/16 10:53:53 joergr ** Adapted type casts to new-style typecast operators defined in ofcast.h. ** ** Revision 1.8 2003/12/17 17:07:22 onken ** MdfDatasetManager now remembers loaded filename. Additional save function ** added. ** ** Revision 1.7 2003/12/10 16:19:20 onken ** Changed API of MdfDatasetManager, so that its transparent for user, whether ** he wants to modify itemtags or tags at 1. level. ** ** Complete rewrite of MdfConsoleEngine. It doesn't support a batchfile any more, ** but now a user can give different modify-options at the same time on ** commandline. Other purifications and simplifications were made. ** ** Revision 1.6 2003/11/11 10:55:51 onken ** - debug-mechanism doesn't use debug(..) any more ** - comments purified ** - headers adjustet to debug-modifications ** ** Revision 1.5 2003/10/13 14:46:50 onken ** startModify(...) simplified (uses only putString to put element-values), ** this also allows now inserting and modifying of elements with VRM>1. ** Method getDataset() added. ** ** Revision 1.4 2003/10/01 14:03:27 onken ** Bug fixed, that excluded pixel-data when saving a file loaded into a ** MdfDatasetManager ** ** Revision 1.3 2003/09/19 12:41:11 onken ** major bugfixes, new code structure, better error-handling, corrections for "dcmtk-coding-style",Handling of VR's corrected ** ** Revision 1.2 2003/07/09 12:13:13 meichel ** Included dcmodify in MSVC build system, updated headers ** ** Revision 1.1 2003/06/26 09:17:18 onken ** Added commandline-application dcmodify. ** ** */ dcmtk-3.6.0/dcmdata/apps/dcm2xml.cc0000644000310500011400000006233311455600772016272 0ustar joergrdicom3/* * * Copyright (C) 2002-2010, 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: dcmdata * * Author: Joerg Riesmeier * * Purpose: Convert the contents of a DICOM file to XML format * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:13:30 $ * CVS/RCS Revision: $Revision: 1.39 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dctk.h" #include "dcmtk/dcmdata/cmdlnarg.h" #include "dcmtk/ofstd/ofstd.h" #include "dcmtk/ofstd/ofstream.h" #include "dcmtk/ofstd/ofconapp.h" #ifdef WITH_ZLIB #include /* for zlibVersion() */ #endif #define OFFIS_CONSOLE_APPLICATION "dcm2xml" #define OFFIS_CONSOLE_DESCRIPTION "Convert DICOM file and data set to XML" #define DOCUMENT_TYPE_DEFINITION_FILE "dcm2xml.dtd" static OFLogger dcm2xmlLogger = OFLog::getLogger("dcmtk.apps." OFFIS_CONSOLE_APPLICATION); static char rcsid[] = "$dcmtk: " OFFIS_CONSOLE_APPLICATION " v" OFFIS_DCMTK_VERSION " " OFFIS_DCMTK_RELEASEDATE " $"; // ******************************************** static OFCondition writeFile(STD_NAMESPACE ostream &out, const char *ifname, DcmFileFormat *dfile, const E_FileReadMode readMode, const OFBool loadIntoMemory, const char *dtdFilename, const char *defaultCharset, const size_t writeFlags, const OFBool checkAllStrings) { OFCondition result = EC_IllegalParameter; if ((ifname != NULL) && (dfile != NULL)) { DcmDataset *dset = dfile->getDataset(); if (loadIntoMemory) dset->loadAllDataIntoMemory(); /* determine dataset character encoding */ OFString encString; OFString csetString; if (dset->findAndGetOFString(DCM_SpecificCharacterSet, csetString).good()) { if (csetString == "ISO_IR 6") encString = "UTF-8"; else if (csetString == "ISO_IR 192") encString = "UTF-8"; else if (csetString == "ISO_IR 100") encString = "ISO-8859-1"; else if (csetString == "ISO_IR 101") encString = "ISO-8859-2"; else if (csetString == "ISO_IR 109") encString = "ISO-8859-3"; else if (csetString == "ISO_IR 110") encString = "ISO-8859-4"; else if (csetString == "ISO_IR 148") encString = "ISO-8859-9"; else if (csetString == "ISO_IR 144") encString = "ISO-8859-5"; else if (csetString == "ISO_IR 127") encString = "ISO-8859-6"; else if (csetString == "ISO_IR 126") encString = "ISO-8859-7"; else if (csetString == "ISO_IR 138") encString = "ISO-8859-8"; else if (!csetString.empty()) OFLOG_WARN(dcm2xmlLogger, "(0008,0005) Specific Character Set '" << csetString << "' not supported"); } else { /* SpecificCharacterSet is not present in the dataset */ if (dset->containsExtendedCharacters(checkAllStrings)) { if (defaultCharset == NULL) { /* the dataset contains non-ASCII characters that really should not be there */ OFLOG_WARN(dcm2xmlLogger, OFFIS_CONSOLE_APPLICATION << ": (0008,0005) Specific Character Set absent " << "but extended characters used in file: " << ifname); return EC_IllegalCall; } else { OFString charset(defaultCharset); if (charset == "latin-1") { csetString = "ISO_IR 100"; encString = "ISO-8859-1"; } else if (charset == "latin-2") { csetString = "ISO_IR 101"; encString = "ISO-8859-2"; } else if (charset == "latin-3") { csetString = "ISO_IR 109"; encString = "ISO-8859-3"; } else if (charset == "latin-4") { csetString = "ISO_IR 110"; encString = "ISO-8859-4"; } else if (charset == "latin-5") { csetString = "ISO_IR 148"; encString = "ISO-8859-9"; } else if (charset == "cyrillic") { csetString = "ISO_IR 144"; encString = "ISO-8859-5"; } else if (charset == "arabic") { csetString = "ISO_IR 127"; encString = "ISO-8859-6"; } else if (charset == "greek") { csetString = "ISO_IR 126"; encString = "ISO-8859-7"; } else if (charset == "hebrew") { csetString = "ISO_IR 138"; encString = "ISO-8859-8"; } dset->putAndInsertString(DCM_SpecificCharacterSet, csetString.c_str()); } } } /* write XML document header */ out << " 0) out << " encoding=\"" << encString << "\""; out << "?>" << OFendl; /* add document type definition (DTD) */ if (writeFlags & DCMTypes::XF_addDocumentType) { out << "" << OFendl; } /* write XML document content */ if (readMode == ERM_dataset) result = dset->writeXML(out, writeFlags); else result = dfile->writeXML(out, writeFlags); } return result; } #define SHORTCOL 3 #define LONGCOL 20 int main(int argc, char *argv[]) { size_t opt_writeFlags = 0; OFBool opt_loadIntoMemory = OFFalse; OFBool opt_checkAllStrings = OFFalse; const char *opt_defaultCharset = NULL; E_FileReadMode opt_readMode = ERM_autoDetect; E_TransferSyntax opt_ixfer = EXS_Unknown; OFCmdUnsignedInt opt_maxReadLength = 4096; // default is 4 KB const char *opt_dtdFilename = DEFAULT_SUPPORT_DATA_DIR DOCUMENT_TYPE_DEFINITION_FILE; OFString optStr; OFConsoleApplication app(OFFIS_CONSOLE_APPLICATION, OFFIS_CONSOLE_DESCRIPTION, rcsid); OFCommandLine cmd; cmd.setOptionColumns(LONGCOL, SHORTCOL); cmd.setParamColumn(LONGCOL + SHORTCOL + 4); cmd.addParam("dcmfile-in", "DICOM input filename to be converted", OFCmdParam::PM_Mandatory); cmd.addParam("xmlfile-out", "XML output filename (default: stdout)", OFCmdParam::PM_Optional); cmd.addGroup("general options:", LONGCOL, SHORTCOL + 2); cmd.addOption("--help", "-h", "print this help text and exit", OFCommandLine::AF_Exclusive); cmd.addOption("--version", "print version information and exit", OFCommandLine::AF_Exclusive); OFLog::addOptions(cmd); cmd.addGroup("input options:"); cmd.addSubGroup("input file format:"); cmd.addOption("--read-file", "+f", "read file format or data set (default)"); cmd.addOption("--read-file-only", "+fo", "read file format only"); cmd.addOption("--read-dataset", "-f", "read data set without file meta information"); cmd.addSubGroup("input transfer syntax:"); cmd.addOption("--read-xfer-auto", "-t=", "use TS recognition (default)"); cmd.addOption("--read-xfer-detect", "-td", "ignore TS specified in the file meta header"); cmd.addOption("--read-xfer-little", "-te", "read with explicit VR little endian TS"); cmd.addOption("--read-xfer-big", "-tb", "read with explicit VR big endian TS"); cmd.addOption("--read-xfer-implicit", "-ti", "read with implicit VR little endian TS"); cmd.addSubGroup("long tag values:"); cmd.addOption("--load-all", "+M", "load very long tag values (e.g. pixel data)"); cmd.addOption("--load-short", "-M", "do not load very long values (default)"); cmd.addOption("--max-read-length", "+R", 1, "[k]bytes: integer (4..4194302, default: 4)", "set threshold for long values to k kbytes"); cmd.addGroup("processing options:"); cmd.addSubGroup("character set:"); cmd.addOption("--charset-require", "+Cr", "require declaration of extended charset (default)"); cmd.addOption("--charset-assume", "+Ca", 1, "[c]harset: string constant", "(latin-1 to -5, cyrillic, arabic, greek, hebrew)\n" "assume charset c if no extended charset declared"); cmd.addOption("--charset-check-all", "+Cc", "check all data elements with string values\n(default: only PN, LO, LT, SH, ST and UT)"); cmd.addGroup("output options:"); cmd.addSubGroup("XML structure:"); cmd.addOption("--add-dtd-reference", "+Xd", "add reference to document type definition (DTD)"); cmd.addOption("--embed-dtd-content", "+Xe", "embed document type definition into XML document"); optStr = "use specified DTD file (only with +Xe)\n(default: "; optStr += opt_dtdFilename; optStr += ")"; cmd.addOption("--use-dtd-file", "+Xf", 1, "[f]ilename: string", optStr.c_str()); cmd.addOption("--use-xml-namespace", "+Xn", "add XML namespace declaration to root element"); cmd.addSubGroup("DICOM data elements:"); cmd.addOption("--write-element-name", "+Wn", "write name of the DICOM data elements (default)"); cmd.addOption("--no-element-name", "-Wn", "do not write name of the DICOM data elements"); cmd.addOption("--write-binary-data", "+Wb", "write binary data of OB and OW elements\n(default: off, be careful with --load-all)"); cmd.addOption("--encode-hex", "+Eh", "encode binary data as hex numbers (default)"); cmd.addOption("--encode-base64", "+Eb", "encode binary data as Base64 (RFC 2045, MIME)"); /* evaluate command line */ prepareCmdLineArgs(argc, argv, OFFIS_CONSOLE_APPLICATION); if (app.parseCommandLine(cmd, argc, argv, OFCommandLine::PF_ExpandWildcards)) { /* check exclusive options first */ if (cmd.hasExclusiveOption()) { if (cmd.findOption("--version")) { app.printHeader(OFTrue /*print host identifier*/); COUT << OFendl << "External libraries used:"; #ifdef WITH_ZLIB COUT << OFendl << "- ZLIB, Version " << zlibVersion() << OFendl; #else COUT << " none" << OFendl; #endif return 0; } } /* general options */ OFLog::configureFromCommandLine(cmd, app); /* input options */ cmd.beginOptionBlock(); if (cmd.findOption("--read-file")) opt_readMode = ERM_autoDetect; if (cmd.findOption("--read-file-only")) opt_readMode = ERM_fileOnly; if (cmd.findOption("--read-dataset")) opt_readMode = ERM_dataset; cmd.endOptionBlock(); cmd.beginOptionBlock(); if (cmd.findOption("--read-xfer-auto")) opt_ixfer = EXS_Unknown; if (cmd.findOption("--read-xfer-detect")) dcmAutoDetectDatasetXfer.set(OFTrue); if (cmd.findOption("--read-xfer-little")) { app.checkDependence("--read-xfer-little", "--read-dataset", opt_readMode == ERM_dataset); opt_ixfer = EXS_LittleEndianExplicit; } if (cmd.findOption("--read-xfer-big")) { app.checkDependence("--read-xfer-big", "--read-dataset", opt_readMode == ERM_dataset); opt_ixfer = EXS_BigEndianExplicit; } if (cmd.findOption("--read-xfer-implicit")) { app.checkDependence("--read-xfer-implicit", "--read-dataset", opt_readMode == ERM_dataset); opt_ixfer = EXS_LittleEndianImplicit; } cmd.endOptionBlock(); if (cmd.findOption("--max-read-length")) { app.checkValue(cmd.getValueAndCheckMinMax(opt_maxReadLength, 4, 4194302)); opt_maxReadLength *= 1024; // convert kbytes to bytes } cmd.beginOptionBlock(); if (cmd.findOption("--load-all")) opt_loadIntoMemory = OFTrue; if (cmd.findOption("--load-short")) opt_loadIntoMemory = OFFalse; cmd.endOptionBlock(); /* processing options */ cmd.beginOptionBlock(); if (cmd.findOption("--charset-require")) opt_defaultCharset = NULL; if (cmd.findOption("--charset-assume")) { app.checkValue(cmd.getValue(opt_defaultCharset)); OFString charset(opt_defaultCharset); if (charset != "latin-1" && charset != "latin-2" && charset != "latin-3" && charset != "latin-4" && charset != "latin-5" && charset != "cyrillic" && charset != "arabic" && charset != "greek" && charset != "hebrew") { app.printError("unknown value for --charset-assume. known values are latin-1 to -5, cyrillic, arabic, greek, hebrew."); } } cmd.endOptionBlock(); if (cmd.findOption("--charset-check-all")) opt_checkAllStrings = OFTrue; /* output options */ cmd.beginOptionBlock(); if (cmd.findOption("--add-dtd-reference")) opt_writeFlags |= DCMTypes::XF_addDocumentType; if (cmd.findOption("--embed-dtd-content")) opt_writeFlags |= DCMTypes::XF_addDocumentType | DCMTypes::XF_embedDocumentType; cmd.endOptionBlock(); if (cmd.findOption("--use-dtd-file")) { app.checkDependence("--use-dtd-file", "--embed-dtd-content", (opt_writeFlags & DCMTypes::XF_embedDocumentType) > 0); app.checkValue(cmd.getValue(opt_dtdFilename)); } if (cmd.findOption("--use-xml-namespace")) opt_writeFlags |= DCMTypes::XF_useDcmtkNamespace; cmd.beginOptionBlock(); if (cmd.findOption("--write-element-name")) opt_writeFlags &= ~DCMTypes::XF_omitDataElementName; if (cmd.findOption("--no-element-name")) opt_writeFlags |= DCMTypes::XF_omitDataElementName; cmd.endOptionBlock(); if (cmd.findOption("--write-binary-data")) opt_writeFlags |= DCMTypes::XF_writeBinaryData; cmd.beginOptionBlock(); if (cmd.findOption("--encode-hex")) { app.checkDependence("--encode-hex", "--write-binary-data", (opt_writeFlags & DCMTypes::XF_writeBinaryData) > 0); opt_writeFlags &= ~DCMTypes::XF_encodeBase64; } if (cmd.findOption("--encode-base64")) { app.checkDependence("--encode-base64", "--write-binary-data", (opt_writeFlags & DCMTypes::XF_writeBinaryData) > 0); opt_writeFlags |= DCMTypes::XF_encodeBase64; } cmd.endOptionBlock(); } /* print resource identifier */ OFLOG_DEBUG(dcm2xmlLogger, rcsid << OFendl); /* make sure data dictionary is loaded */ if (!dcmDataDict.isDictionaryLoaded()) { OFLOG_WARN(dcm2xmlLogger, "no data dictionary loaded, check environment variable: " << DCM_DICT_ENVIRONMENT_VARIABLE); } /* make sure document type definition file exists */ if ((opt_writeFlags & DCMTypes::XF_embedDocumentType) && !OFStandard::fileExists(opt_dtdFilename)) { OFLOG_WARN(dcm2xmlLogger, OFFIS_CONSOLE_APPLICATION << ": DTD file \"" << opt_dtdFilename << "\" does not exist ... adding reference instead"); opt_writeFlags &= ~DCMTypes::XF_embedDocumentType; } int result = 0; /* first parameter is treated as the input filename */ const char *ifname = NULL; cmd.getParam(1, ifname); /* check input file */ if ((ifname != NULL) && (strlen(ifname) > 0)) { /* read DICOM file or data set */ DcmFileFormat dfile; OFCondition status = dfile.loadFile(ifname, opt_ixfer, EGL_noChange, opt_maxReadLength, opt_readMode); if (status.good()) { /* if second parameter is present, it is treated as the output filename ("stdout" otherwise) */ if (cmd.getParamCount() == 2) { const char *ofname = NULL; cmd.getParam(2, ofname); STD_NAMESPACE ofstream stream(ofname); if (stream.good()) { /* write content in XML format to file */ if (writeFile(stream, ifname, &dfile, opt_readMode, opt_loadIntoMemory, opt_dtdFilename, opt_defaultCharset, opt_writeFlags, opt_checkAllStrings).bad()) result = 2; } else result = 1; } else { /* write content in XML format to standard output */ if (writeFile(COUT, ifname, &dfile, opt_readMode, opt_loadIntoMemory, opt_dtdFilename, opt_defaultCharset, opt_writeFlags, opt_checkAllStrings).bad()) result = 3; } } else OFLOG_WARN(dcm2xmlLogger, OFFIS_CONSOLE_APPLICATION << ": (" << status.text() << ") reading file: "<< ifname); } else OFLOG_WARN(dcm2xmlLogger, OFFIS_CONSOLE_APPLICATION << ": invalid filename: "); return result; } /* * CVS/RCS Log: * $Log: dcm2xml.cc,v $ * Revision 1.39 2010-10-14 13:13:30 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.38 2009-11-13 13:20:23 joergr * Fixed minor issues in log output. * * Revision 1.37 2009-11-04 09:58:05 uli * Switched to logging mechanism provided by the "new" oflog module * * Revision 1.36 2009-04-24 12:20:41 joergr * Fixed minor inconsistencies regarding layout/formatting in syntax usage. * * Revision 1.35 2009-04-21 14:02:49 joergr * Fixed minor inconsistencies in manpage / syntax usage. * * Revision 1.34 2009-03-25 17:54:35 joergr * Added parentheses in order to keep MSVC quiet. * * Revision 1.33 2009-03-11 13:06:12 joergr * Added support for specifying the filename of the DTD on the command line. * Added command line option for quiet mode (print no warnings and errors). * * Revision 1.32 2009-02-04 18:08:18 joergr * Fixed various layout and formatting issues. * * Revision 1.31 2008-09-25 14:38:48 joergr * Moved output of resource identifier in order to avoid printing the same * information twice. * * Revision 1.30 2008-09-25 11:19:48 joergr * Added support for printing the expanded command line arguments. * Always output the resource identifier of the command line tool in debug mode. * * Revision 1.29 2008-01-23 15:09:26 joergr * Restructured code in order to avoid empty output file in case the input file * could not be read. * * Revision 1.28 2006/12/13 14:21:56 joergr * Removed dependence of the new command line option "--charset-check-all" from * option "--charset-assume". * * Revision 1.27 2006/12/13 13:55:38 joergr * Added new command line option that allows to check all data elements with * string values for extended characters, not only those affected by Specific * CharacterSet (0008,0005). * * Revision 1.26 2006/08/15 15:50:56 meichel * Updated all code in module dcmdata to correctly compile when * all standard C++ classes remain in namespace std. * * Revision 1.25 2006/07/27 13:52:42 joergr * Changed parameter "exclusive" of method addOption() from type OFBool into an * integer parameter "flags". Prepended prefix "PF_" to parseLine() flags. * Option "--help" is no longer an exclusive option by default. * * Revision 1.24 2006/05/11 08:44:57 joergr * Added new option that allows to omit the element name in the XML output. * Moved checkForNonASCIICharacters() from application to library. * * Revision 1.23 2006/02/23 12:46:51 joergr * Added new default option --encode-hex. Fixed layout and formatting issues. * * Revision 1.22 2005/12/08 15:40:42 meichel * Changed include path schema for all DCMTK header files * * Revision 1.21 2005/12/07 16:42:49 onken * Changed default and minimum value of --max-read-length to 4 KB * * Revision 1.20 2005/12/02 08:58:44 joergr * Added new command line option that ignores the transfer syntax specified in * the meta header and tries to detect the transfer syntax automatically from * the dataset. * Added new command line option that checks whether a given file starts with a * valid DICOM meta header. * Removed superfluous local variable. Changed type of variable "maxReadLength". * Made description of option --max-read-length more consistent with the other * command line tools. * * Revision 1.19 2005/12/01 11:25:44 joergr * Removed superfluous local variable. Changed type of variable "maxReadLength". * * Revision 1.18 2005/11/28 15:28:54 meichel * File dcdebug.h is not included by any other header file in the toolkit * anymore, to minimize the risk of name clashes of macro debug(). * * Revision 1.17 2005/11/17 11:26:11 onken * Option --max-read-length now uses OFCommandLine to check, whether option * value is in range * * Revision 1.16 2005/11/16 14:59:11 onken * *** empty log message *** * * Revision 1.15 2005/11/16 14:55:56 onken * Added "--max-read-length" option to dcmdump and dcm2xml to override * DCMTK-internal threshold (4096K) for long attribute values. * * Revision 1.14 2005/06/24 10:06:46 joergr * Check dependence between command line options --write-binary-data and * --encode-base64. * * Revision 1.13 2004/11/29 17:02:17 joergr * Added warning message when character set is unknown, unsupported or cannot * be mapped to the output format. Added support for UTF-8 character set. * * Revision 1.12 2004/11/22 16:30:19 meichel * Now checking whether extended characters are present in a DICOM dataset, * preventing generation of incorrect XML if undeclared extended charset used. * * Revision 1.11 2003/04/22 08:23:33 joergr * Added new command line option which allows to embed the content of the DTD * instead of referencing the DTD file. * * Revision 1.10 2003/04/01 14:56:14 joergr * Added support for XML namespaces. * * Revision 1.9 2002/11/26 08:42:58 meichel * Replaced all includes for "zlib.h" with * to avoid inclusion of zlib.h in the makefile dependencies. * * Revision 1.8 2002/09/23 17:52:01 joergr * Prepared code for future support of 'config.guess' host identifiers. * * Revision 1.7 2002/09/23 13:50:39 joergr * Added new command line option "--version" which prints the name and version * number of external libraries used. * * Revision 1.6 2002/08/21 10:14:13 meichel * Adapted code to new loadFile and saveFile methods, thus removing direct * use of the DICOM stream classes. * * Revision 1.5 2002/06/10 17:35:47 joergr * Fixed inconsistency regarding spelling of the "file-format" element. * * Revision 1.4 2002/05/14 08:19:22 joergr * Added support for Base64 (MIME) encoded binary data. * * Revision 1.3 2002/05/07 12:47:41 joergr * Fixed bug in an error message. * * Revision 1.2 2002/04/25 14:56:35 joergr * Removed unused function parameter to keep Sun CC 2.0.1 quiet. * * Revision 1.1 2002/04/25 10:08:35 joergr * Added new command line tool to convert DICOM files to XML. * * */ dcmtk-3.6.0/dcmdata/apps/dcmconv.cc0000644000310500011400000010012111455600772016341 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Andrew Hewett * * Purpose: Convert dicom file encoding * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:13:30 $ * CVS/RCS Revision: $Revision: 1.72 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #define INCLUDE_CSTDLIB #define INCLUDE_CSTDIO #define INCLUDE_CSTRING #include "dcmtk/ofstd/ofstdinc.h" #ifdef HAVE_GUSI_H #include #endif #include "dcmtk/dcmdata/dctk.h" #include "dcmtk/dcmdata/cmdlnarg.h" #include "dcmtk/ofstd/ofconapp.h" #include "dcmtk/dcmdata/dcuid.h" /* for dcmtk version name */ #include "dcmtk/dcmdata/dcostrmz.h" /* for dcmZlibCompressionLevel */ #include "dcmtk/dcmdata/dcistrmz.h" /* for dcmZlibExpectRFC1950Encoding */ #ifdef WITH_ZLIB #include /* for zlibVersion() */ #endif #define OFFIS_CONSOLE_APPLICATION "dcmconv" static OFLogger dcmconvLogger = OFLog::getLogger("dcmtk.apps." OFFIS_CONSOLE_APPLICATION); static char rcsid[] = "$dcmtk: " OFFIS_CONSOLE_APPLICATION " v" OFFIS_DCMTK_VERSION " " OFFIS_DCMTK_RELEASEDATE " $"; // ******************************************** #define SHORTCOL 3 #define LONGCOL 21 static DcmTagKey parseTagKey(const char *tagName) { unsigned int group = 0xffff; unsigned int elem = 0xffff; if (sscanf(tagName, "%x,%x", &group, &elem) != 2) { DcmTagKey tagKey; /* it is a name */ const DcmDataDictionary &globalDataDict = dcmDataDict.rdlock(); const DcmDictEntry *dicent = globalDataDict.findEntry(tagName); if (dicent == NULL) { OFLOG_ERROR(dcmconvLogger, "unrecognised tag name: '" << tagName << "'"); tagKey = DCM_UndefinedTagKey; } else { tagKey = dicent->getKey(); } dcmDataDict.unlock(); return tagKey; } else /* tag name has format "gggg,eeee" */ { return DcmTagKey(group,elem); } } int main(int argc, char *argv[]) { #ifdef HAVE_GUSI_H GUSISetup(GUSIwithSIOUXSockets); GUSISetup(GUSIwithInternetSockets); #endif const char *opt_ifname = NULL; const char *opt_ofname = NULL; E_FileReadMode opt_readMode = ERM_autoDetect; E_FileWriteMode opt_writeMode = EWM_fileformat; E_TransferSyntax opt_ixfer = EXS_Unknown; E_TransferSyntax opt_oxfer = EXS_Unknown; E_GrpLenEncoding opt_oglenc = EGL_recalcGL; E_EncodingType opt_oenctype = EET_ExplicitLength; E_PaddingEncoding opt_opadenc = EPD_noChange; OFCmdUnsignedInt opt_filepad = 0; OFCmdUnsignedInt opt_itempad = 0; #ifdef WITH_ZLIB OFCmdUnsignedInt opt_compressionLevel = 0; #endif OFBool opt_noInvalidGroups = OFFalse; OFConsoleApplication app(OFFIS_CONSOLE_APPLICATION , "Convert DICOM file encoding", rcsid); OFCommandLine cmd; cmd.setOptionColumns(LONGCOL, SHORTCOL); cmd.setParamColumn(LONGCOL + SHORTCOL + 4); cmd.addParam("dcmfile-in", "DICOM input filename to be converted"); cmd.addParam("dcmfile-out", "DICOM output filename"); cmd.addGroup("general options:", LONGCOL, SHORTCOL + 2); cmd.addOption("--help", "-h", "print this help text and exit", OFCommandLine::AF_Exclusive); cmd.addOption("--version", "print version information and exit", OFCommandLine::AF_Exclusive); OFLog::addOptions(cmd); cmd.addGroup("input options:"); cmd.addSubGroup("input file format:"); cmd.addOption("--read-file", "+f", "read file format or data set (default)"); cmd.addOption("--read-file-only", "+fo", "read file format only"); cmd.addOption("--read-dataset", "-f", "read data set without file meta information"); cmd.addSubGroup("input transfer syntax:", LONGCOL, SHORTCOL); cmd.addOption("--read-xfer-auto", "-t=", "use TS recognition (default)"); cmd.addOption("--read-xfer-detect", "-td", "ignore TS specified in the file meta header"); cmd.addOption("--read-xfer-little", "-te", "read with explicit VR little endian TS"); cmd.addOption("--read-xfer-big", "-tb", "read with explicit VR big endian TS"); cmd.addOption("--read-xfer-implicit", "-ti", "read with implicit VR little endian TS"); cmd.addSubGroup("parsing of file meta information:"); cmd.addOption("--use-meta-length", "+ml", "use file meta information group length (default)"); cmd.addOption("--ignore-meta-length", "-ml", "ignore file meta information group length"); cmd.addSubGroup("parsing of odd-length attributes:"); cmd.addOption("--accept-odd-length", "+ao", "accept odd length attributes (default)"); cmd.addOption("--assume-even-length", "+ae", "assume real length is one byte larger"); cmd.addSubGroup("handling of non-standard VR:"); cmd.addOption("--treat-as-unknown", "+vr", "treat non-standard VR as unknown (default)"); cmd.addOption("--assume-implicit", "-vr", "try to read with implicit VR little endian TS"); cmd.addSubGroup("handling of undefined length UN elements:"); cmd.addOption("--enable-cp246", "+ui", "read undefined len UN as implicit VR (default)"); cmd.addOption("--disable-cp246", "-ui", "read undefined len UN as explicit VR"); cmd.addSubGroup("handling of defined length UN elements:"); cmd.addOption("--retain-un", "-uc", "retain elements as UN (default)"); cmd.addOption("--convert-un", "+uc", "convert to real VR if known"); cmd.addSubGroup("handling of private max-length elements (implicit VR):"); cmd.addOption("--maxlength-dict", "-sq", "read as defined in dictionary (default)"); cmd.addOption("--maxlength-seq", "+sq", "read as sequence with undefined length"); cmd.addSubGroup("general handling of parser errors: "); cmd.addOption("--ignore-parse-errors", "+Ep", "try to recover from parse errors"); cmd.addOption("--handle-parse-errors", "-Ep", "handle parse errors and stop parsing (default)"); cmd.addSubGroup("other parsing options:"); cmd.addOption("--stop-after-elem", "+st", 1, "[t]ag: \"gggg,eeee\" or dictionary name", "stop parsing after element specified by t"); cmd.addSubGroup("automatic data correction:"); cmd.addOption("--enable-correction", "+dc", "enable automatic data correction (default)"); cmd.addOption("--disable-correction", "-dc", "disable automatic data correction"); #ifdef WITH_ZLIB cmd.addSubGroup("bitstream format of deflated input:"); cmd.addOption("--bitstream-deflated", "+bd", "expect deflated bitstream (default)"); cmd.addOption("--bitstream-zlib", "+bz", "expect deflated zlib bitstream"); #endif cmd.addGroup("output options:"); cmd.addSubGroup("output file format:"); cmd.addOption("--write-file", "+F", "write file format (default)"); cmd.addOption("--write-new-meta-info", "+Fm", "write file format with new meta information"); cmd.addOption("--write-dataset", "-F", "write data set without file meta information"); cmd.addSubGroup("output transfer syntax:"); cmd.addOption("--write-xfer-same", "+t=", "write with same TS as input (default)"); cmd.addOption("--write-xfer-little", "+te", "write with explicit VR little endian TS"); cmd.addOption("--write-xfer-big", "+tb", "write with explicit VR big endian TS"); cmd.addOption("--write-xfer-implicit", "+ti", "write with implicit VR little endian TS"); #ifdef WITH_ZLIB cmd.addOption("--write-xfer-deflated", "+td", "write with deflated explicit VR little endian TS"); #endif cmd.addSubGroup("post-1993 value representations:"); cmd.addOption("--enable-new-vr", "+u", "enable support for new VRs (UN/UT) (default)"); cmd.addOption("--disable-new-vr", "-u", "disable support for new VRs, convert to OB"); cmd.addSubGroup("group length encoding:"); cmd.addOption("--group-length-recalc", "+g=", "recalculate group lengths if present (default)"); cmd.addOption("--group-length-create", "+g", "always write with group length elements"); cmd.addOption("--group-length-remove", "-g", "always write without group length elements"); cmd.addSubGroup("length encoding in sequences and items:"); cmd.addOption("--length-explicit", "+e", "write with explicit lengths (default)"); cmd.addOption("--length-undefined", "-e", "write with undefined lengths"); cmd.addOption("--write-oversized", "+eo", "write oversized explict length sequences\nand items with undefined length (default)"); cmd.addOption("--abort-oversized", "-eo", "abort on oversized explicit sequences/items"); cmd.addSubGroup("data set trailing padding (not with --write-dataset):"); cmd.addOption("--padding-retain", "-p=", "do not change padding\n(default if not --write-dataset)"); cmd.addOption("--padding-off", "-p", "no padding (implicit if --write-dataset)"); cmd.addOption("--padding-create", "+p", 2, "[f]ile-pad [i]tem-pad: integer", "align file on multiple of f bytes\nand items on multiple of i bytes"); #ifdef WITH_ZLIB cmd.addSubGroup("deflate compression level (only with --write-xfer-deflated):"); cmd.addOption("--compression-level", "+cl", 1, "[l]evel: integer (default: 6)", "0=uncompressed, 1=fastest, 9=best compression"); #endif cmd.addSubGroup("other output options:"); cmd.addOption("--no-invalid-groups", "-ig", "don't write elements with invalid group number"); /* evaluate command line */ prepareCmdLineArgs(argc, argv, OFFIS_CONSOLE_APPLICATION); if (app.parseCommandLine(cmd, argc, argv, OFCommandLine::PF_ExpandWildcards)) { /* check exclusive options first */ if (cmd.hasExclusiveOption()) { if (cmd.findOption("--version")) { app.printHeader(OFTrue /*print host identifier*/); COUT << OFendl << "External libraries used:"; #ifdef WITH_ZLIB COUT << OFendl << "- ZLIB, Version " << zlibVersion() << OFendl; #else COUT << " none" << OFendl; #endif return 0; } } /* command line parameters */ cmd.getParam(1, opt_ifname); cmd.getParam(2, opt_ofname); OFLog::configureFromCommandLine(cmd, app); cmd.beginOptionBlock(); if (cmd.findOption("--read-file")) opt_readMode = ERM_autoDetect; if (cmd.findOption("--read-file-only")) opt_readMode = ERM_fileOnly; if (cmd.findOption("--read-dataset")) opt_readMode = ERM_dataset; cmd.endOptionBlock(); cmd.beginOptionBlock(); if (cmd.findOption("--read-xfer-auto")) opt_ixfer = EXS_Unknown; if (cmd.findOption("--read-xfer-detect")) dcmAutoDetectDatasetXfer.set(OFTrue); if (cmd.findOption("--read-xfer-little")) { app.checkDependence("--read-xfer-little", "--read-dataset", opt_readMode == ERM_dataset); opt_ixfer = EXS_LittleEndianExplicit; } if (cmd.findOption("--read-xfer-big")) { app.checkDependence("--read-xfer-big", "--read-dataset", opt_readMode == ERM_dataset); opt_ixfer = EXS_BigEndianExplicit; } if (cmd.findOption("--read-xfer-implicit")) { app.checkDependence("--read-xfer-implicit", "--read-dataset", opt_readMode == ERM_dataset); opt_ixfer = EXS_LittleEndianImplicit; } cmd.endOptionBlock(); cmd.beginOptionBlock(); if (cmd.findOption("--use-meta-length")) { dcmIgnoreFileMetaInformationGroupLength.set(OFFalse); } if (cmd.findOption("--ignore-meta-length")) { dcmIgnoreFileMetaInformationGroupLength.set(OFTrue); } cmd.endOptionBlock(); cmd.beginOptionBlock(); if (cmd.findOption("--accept-odd-length")) { dcmAcceptOddAttributeLength.set(OFTrue); } if (cmd.findOption("--assume-even-length")) { dcmAcceptOddAttributeLength.set(OFFalse); } cmd.endOptionBlock(); cmd.beginOptionBlock(); if (cmd.findOption("--treat-as-unknown")) { dcmAcceptUnexpectedImplicitEncoding.set(OFFalse); } if (cmd.findOption("--assume-implicit")) { dcmAcceptUnexpectedImplicitEncoding.set(OFTrue); } cmd.beginOptionBlock(); if (cmd.findOption("--enable-cp246")) { dcmEnableCP246Support.set(OFTrue); } if (cmd.findOption("--disable-cp246")) { dcmEnableCP246Support.set(OFFalse); } cmd.endOptionBlock(); cmd.beginOptionBlock(); if (cmd.findOption("--retain-un")) { dcmEnableUnknownVRConversion.set(OFFalse); } if (cmd.findOption("--convert-un")) { dcmEnableUnknownVRConversion.set(OFTrue); } cmd.endOptionBlock(); cmd.beginOptionBlock(); if (cmd.findOption("--maxlength-dict")) { dcmReadImplPrivAttribMaxLengthAsSQ.set(OFFalse); } if (cmd.findOption("--maxlength-seq")) { dcmReadImplPrivAttribMaxLengthAsSQ.set(OFTrue); } cmd.endOptionBlock(); if (cmd.findOption("--ignore-parse-errors")) { dcmIgnoreParsingErrors.set(OFTrue); } if (cmd.findOption("--handle-parse-errors")) { dcmIgnoreParsingErrors.set(OFFalse); } cmd.endOptionBlock(); if (cmd.findOption("--stop-after-elem")) { const char *tagName = NULL; app.checkValue(cmd.getValue(tagName)); DcmTagKey key = parseTagKey(tagName); if (key != DCM_UndefinedTagKey) dcmStopParsingAfterElement.set(key); else app.printError("no valid key given for option --stop-after-elem"); } cmd.beginOptionBlock(); if (cmd.findOption("--enable-correction")) { dcmEnableAutomaticInputDataCorrection.set(OFTrue); } if (cmd.findOption("--disable-correction")) { dcmEnableAutomaticInputDataCorrection.set(OFFalse); } cmd.endOptionBlock(); #ifdef WITH_ZLIB cmd.beginOptionBlock(); if (cmd.findOption("--bitstream-deflated")) { dcmZlibExpectRFC1950Encoding.set(OFFalse); } if (cmd.findOption("--bitstream-zlib")) { dcmZlibExpectRFC1950Encoding.set(OFTrue); } cmd.endOptionBlock(); #endif cmd.beginOptionBlock(); if (cmd.findOption("--write-file")) opt_writeMode = EWM_fileformat; if (cmd.findOption("--write-new-meta-info")) opt_writeMode = EWM_createNewMeta; if (cmd.findOption("--write-dataset")) opt_writeMode = EWM_dataset; cmd.endOptionBlock(); cmd.beginOptionBlock(); if (cmd.findOption("--write-xfer-same")) opt_oxfer = EXS_Unknown; if (cmd.findOption("--write-xfer-little")) opt_oxfer = EXS_LittleEndianExplicit; if (cmd.findOption("--write-xfer-big")) opt_oxfer = EXS_BigEndianExplicit; if (cmd.findOption("--write-xfer-implicit")) opt_oxfer = EXS_LittleEndianImplicit; #ifdef WITH_ZLIB if (cmd.findOption("--write-xfer-deflated")) opt_oxfer = EXS_DeflatedLittleEndianExplicit; #endif cmd.endOptionBlock(); cmd.beginOptionBlock(); if (cmd.findOption("--enable-new-vr")) { dcmEnableUnknownVRGeneration.set(OFTrue); dcmEnableUnlimitedTextVRGeneration.set(OFTrue); } if (cmd.findOption("--disable-new-vr")) { dcmEnableUnknownVRGeneration.set(OFFalse); dcmEnableUnlimitedTextVRGeneration.set(OFFalse); } cmd.endOptionBlock(); cmd.beginOptionBlock(); if (cmd.findOption("--group-length-recalc")) opt_oglenc = EGL_recalcGL; if (cmd.findOption("--group-length-create")) opt_oglenc = EGL_withGL; if (cmd.findOption("--group-length-remove")) opt_oglenc = EGL_withoutGL; cmd.endOptionBlock(); cmd.beginOptionBlock(); if (cmd.findOption("--length-explicit")) opt_oenctype = EET_ExplicitLength; if (cmd.findOption("--length-undefined")) opt_oenctype = EET_UndefinedLength; cmd.endOptionBlock(); cmd.beginOptionBlock(); if (cmd.findOption("--write-oversized")) dcmWriteOversizedSeqsAndItemsUndefined.set(OFTrue); if (cmd.findOption("--abort-oversized")) dcmWriteOversizedSeqsAndItemsUndefined.set(OFFalse); cmd.endOptionBlock(); cmd.beginOptionBlock(); if (cmd.findOption("--padding-retain")) { app.checkConflict("--padding-retain", "--write-dataset", opt_writeMode == EWM_dataset); opt_opadenc = EPD_noChange; } if (cmd.findOption("--padding-off")) opt_opadenc = EPD_withoutPadding; if (cmd.findOption("--padding-create")) { app.checkConflict("--padding-create", "--write-dataset", opt_writeMode == EWM_dataset); app.checkValue(cmd.getValueAndCheckMin(opt_filepad, 0)); app.checkValue(cmd.getValueAndCheckMin(opt_itempad, 0)); opt_opadenc = EPD_withPadding; } cmd.endOptionBlock(); #ifdef WITH_ZLIB if (cmd.findOption("--compression-level")) { app.checkDependence("--compression-level", "--write-xfer-deflated", opt_oxfer == EXS_DeflatedLittleEndianExplicit); app.checkValue(cmd.getValueAndCheckMinMax(opt_compressionLevel, 0, 9)); dcmZlibCompressionLevel.set(OFstatic_cast(int, opt_compressionLevel)); } #endif if (cmd.findOption("--no-invalid-groups")) opt_noInvalidGroups = OFTrue; } /* print resource identifier */ OFLOG_DEBUG(dcmconvLogger, rcsid << OFendl); /* make sure data dictionary is loaded */ if (!dcmDataDict.isDictionaryLoaded()) { OFLOG_WARN(dcmconvLogger, "no data dictionary loaded, check environment variable: " << DCM_DICT_ENVIRONMENT_VARIABLE); } // open inputfile if ((opt_ifname == NULL) || (strlen(opt_ifname) == 0)) { OFLOG_FATAL(dcmconvLogger, "invalid filename: "); return 1; } DcmFileFormat fileformat; DcmDataset *dataset = fileformat.getDataset(); OFLOG_INFO(dcmconvLogger, "open input file " << opt_ifname); OFCondition error = fileformat.loadFile(opt_ifname, opt_ixfer, EGL_noChange, DCM_MaxReadLength, opt_readMode); if (error.bad()) { OFLOG_FATAL(dcmconvLogger, error.text() << ": reading file: " << opt_ifname); return 1; } OFLOG_INFO(dcmconvLogger, "load all data into memory"); /* make sure that pixel data is loaded before output file is created */ dataset->loadAllDataIntoMemory(); if (opt_noInvalidGroups) { OFLOG_INFO(dcmconvLogger, "remove all elements with an invalid group number"); fileformat.removeInvalidGroups(); } if (opt_oxfer == EXS_Unknown) { OFLOG_INFO(dcmconvLogger, "set output transfer syntax to input transfer syntax"); opt_oxfer = dataset->getOriginalXfer(); } OFLOG_INFO(dcmconvLogger, "check if new output transfer syntax is possible"); DcmXfer opt_oxferSyn(opt_oxfer); dataset->chooseRepresentation(opt_oxfer, NULL); if (dataset->canWriteXfer(opt_oxfer)) { OFLOG_INFO(dcmconvLogger, "output transfer syntax " << opt_oxferSyn.getXferName() << " can be written"); } else { OFLOG_FATAL(dcmconvLogger, "no conversion to transfer syntax " << opt_oxferSyn.getXferName() << " possible!"); return 1; } OFLOG_INFO(dcmconvLogger, "create output file " << opt_ofname); error = fileformat.saveFile(opt_ofname, opt_oxfer, opt_oenctype, opt_oglenc, opt_opadenc, OFstatic_cast(Uint32, opt_filepad), OFstatic_cast(Uint32, opt_itempad), opt_writeMode); if (error.bad()) { OFLOG_FATAL(dcmconvLogger, error.text() << ": writing file: " << opt_ofname); return 1; } OFLOG_INFO(dcmconvLogger, "conversion successful"); return 0; } /* ** CVS/RCS Log: ** $Log: dcmconv.cc,v $ ** Revision 1.72 2010-10-14 13:13:30 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.71 2010-03-04 09:34:16 joergr ** Fixed possible issue with read locks on global data dictionary. ** ** Revision 1.70 2009-11-13 13:20:23 joergr ** Fixed minor issues in log output. ** ** Revision 1.69 2009-11-04 09:58:06 uli ** Switched to logging mechanism provided by the "new" oflog module ** ** Revision 1.68 2009-08-26 10:12:42 joergr ** Added new command line options --write-new-meta-info and --no-invalid-groups. ** ** Revision 1.67 2009-08-21 09:25:13 joergr ** Added parameter 'writeMode' to save/write methods which allows for specifying ** whether to write a dataset or fileformat as well as whether to update the ** file meta information or to create a new file meta information header. ** ** Revision 1.66 2009-06-04 17:22:17 joergr ** Fixed wrong name of command line option: used --impl-oversized instead of ** --write-oversized. ** ** Revision 1.65 2009-06-04 16:50:18 joergr ** Added new command line option that allows for ignoring the value of File Meta ** Information Group Length (0002,0000). ** ** Revision 1.64 2009-04-24 12:20:41 joergr ** Fixed minor inconsistencies regarding layout/formatting in syntax usage. ** ** Revision 1.63 2009-03-05 17:45:56 joergr ** Fixed description of command line option. ** ** Revision 1.62 2009-03-05 14:07:48 onken ** Fixed typo. ** ** Revision 1.61 2009-03-05 13:54:36 onken ** Fixed typo. ** ** Revision 1.60 2009-03-05 13:39:26 onken ** Added support for the new parser's global sequence/item length overflow flag. ** ** Revision 1.59 2009-02-11 16:55:31 joergr ** Renamed option --stop-at-elem to --stop-after-elem and fixed typo. ** ** Revision 1.58 2009-02-11 13:16:17 onken ** Added global parser flag permitting to stop parsing after a specific ** element was parsed on dataset level (useful for removing garbage at ** end of file). ** ** Revision 1.57 2009-02-04 14:07:10 onken ** Added command line options making use of the parser's error ignoring flag. ** ** Revision 1.56 2009-01-29 15:36:52 onken ** *** empty log message *** ** ** Revision 1.55 2009-01-05 15:30:15 joergr ** Added command line options that allow for reading incorrectly encoded DICOM ** datasets where particular data elements are encoded with a differing transfer ** syntax (Implicit VR Little endian instead of Explicit VR encoding). ** ** Revision 1.54 2008-11-03 16:42:23 joergr ** Removed "option block" encapsulation from option --compression-level. ** ** Revision 1.53 2008-11-03 15:33:06 joergr ** Made documentation of --compression-level more consistent with other options. ** ** Revision 1.52 2008-09-25 14:38:48 joergr ** Moved output of resource identifier in order to avoid printing the same ** information twice. ** ** Revision 1.51 2008-09-25 11:19:48 joergr ** Added support for printing the expanded command line arguments. ** Always output the resource identifier of the command line tool in debug mode. ** ** Revision 1.50 2006/08/15 15:50:56 meichel ** Updated all code in module dcmdata to correctly compile when ** all standard C++ classes remain in namespace std. ** ** Revision 1.49 2006/07/27 13:52:42 joergr ** Changed parameter "exclusive" of method addOption() from type OFBool into an ** integer parameter "flags". Prepended prefix "PF_" to parseLine() flags. ** Option "--help" is no longer an exclusive option by default. ** ** Revision 1.48 2005/12/08 15:40:43 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.47 2005/12/02 09:00:37 joergr ** Added new command line option that ignores the transfer syntax specified in ** the meta header and tries to detect the transfer syntax automatically from ** the dataset. ** Added new command line option that checks whether a given file starts with a ** valid DICOM meta header. ** ** Revision 1.46 2005/11/15 18:33:20 meichel ** Added new command line option --convert-un that enables the re-conversion of ** defined length UN elements. ** ** Revision 1.45 2005/05/10 15:27:09 meichel ** Added support for reading UN elements with undefined length according ** to CP 246. The global flag dcmEnableCP246Support allows to revert to the ** prior behaviour in which UN elements with undefined length were parsed ** like a normal explicit VR SQ element. ** ** Revision 1.44 2004/04/07 12:20:27 joergr ** Additional modifications for new-style type casts. ** ** Revision 1.43 2004/01/16 10:53:53 joergr ** Adapted type casts to new-style typecast operators defined in ofcast.h. ** ** Revision 1.42 2003/01/08 10:34:23 joergr ** Fixed typo (missing closing bracket). ** ** Revision 1.41 2002/11/27 12:07:15 meichel ** Adapted module dcmdata to use of new header file ofstdinc.h ** ** Revision 1.40 2002/11/26 08:42:59 meichel ** Replaced all includes for "zlib.h" with ** to avoid inclusion of zlib.h in the makefile dependencies. ** ** Revision 1.39 2002/11/25 10:15:07 joergr ** Used OFConsoleApplication::checkDependence() and checkConflict() routine ** wherever possible. ** Made declaration of compression level variable dependent on WITH_ZLIB define. ** Avoids warning about unused variable reported by gcc 2.95.3 on Cygwin. ** ** Revision 1.38 2002/09/23 17:52:01 joergr ** Prepared code for future support of 'config.guess' host identifiers. ** ** Revision 1.37 2002/09/23 13:50:39 joergr ** Added new command line option "--version" which prints the name and version ** number of external libraries used. ** ** Revision 1.36 2002/08/27 16:55:25 meichel ** Initial release of new DICOM I/O stream classes that add support for stream ** compression (deflated little endian explicit VR transfer syntax) ** ** Revision 1.35 2002/08/21 10:14:14 meichel ** Adapted code to new loadFile and saveFile methods, thus removing direct ** use of the DICOM stream classes. ** ** Revision 1.34 2002/07/08 14:44:53 meichel ** Improved dcmdata behaviour when reading odd tag length. Depending on the ** global boolean flag dcmAcceptOddAttributeLength, the parser now either accepts ** odd length attributes or implements the old behaviour, i.e. assumes a real ** length larger by one. ** ** Revision 1.33 2001/11/28 12:42:30 joergr ** Fixed bug in dcmconv that caused problems in cases where the same filename ** was used for input and output (e.g. pixel data was removed without any ** warnings). ** ** Revision 1.32 2001/11/09 15:50:52 joergr ** Renamed some of the getValue/getParam methods to avoid ambiguities reported ** by certain compilers. ** ** Revision 1.31 2001/09/25 17:20:59 meichel ** Adapted dcmdata to class OFCondition ** ** Revision 1.30 2001/06/01 15:48:27 meichel ** Updated copyright header ** ** Revision 1.29 2000/04/14 15:42:53 meichel ** Global VR generation flags are now derived from OFGlobal and, thus, ** safe for use in multi-thread applications. ** ** Revision 1.28 2000/03/08 16:26:04 meichel ** Updated copyright header. ** ** Revision 1.27 2000/03/06 18:09:36 joergr ** Avoid empty statement in the body of if-statements (MSVC6 reports warnings). ** ** Revision 1.26 2000/03/03 14:05:15 meichel ** Implemented library support for redirecting error messages into memory ** instead of printing them to stdout/stderr for GUI applications. ** ** Revision 1.25 2000/02/29 11:48:49 meichel ** Removed support for VS value representation. This was proposed in CP 101 ** but never became part of the standard. ** ** Revision 1.24 2000/02/23 15:11:29 meichel ** Corrected macro for Borland C++ Builder 4 workaround. ** ** Revision 1.23 2000/02/01 10:11:56 meichel ** Avoiding to include as extern "C" on Borland C++ Builder 4, ** workaround for bug in compiler header files. ** ** Revision 1.22 1999/10/07 17:27:03 meichel ** Corrected typo in dcmconv error message ** ** Revision 1.21 1999/04/27 17:50:49 joergr ** Adapted console applications to new OFCommandLine and OFConsoleApplication ** functionality. ** ** Revision 1.20 1999/04/27 12:23:22 meichel ** Prevented dcmdata applications from opening a file with empty filename, ** leads to application crash on Win32. ** ** Revision 1.19 1999/03/31 09:24:18 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.18 1999/03/29 10:14:11 meichel ** Adapted command line options of dcmdata applications to new scheme. ** ** Revision 1.17 1998/01/27 10:51:26 meichel ** Removed some unused variables, meaningless const modifiers ** and unreached statements. ** ** Revision 1.16 1998/01/14 14:41:13 hewett ** Modified existing -u command line option to also disable generation ** of UT and VS (previously just disabled generation of UN). ** ** Revision 1.15 1997/07/21 08:12:42 andreas ** - New environment for encapsulated pixel representations. DcmPixelData ** can contain different representations and uses codecs to convert ** between them. Codecs are derived from the DcmCodec class. New error ** codes are introduced for handling of representations. New internal ** value representation (only for ident()) for PixelData ** - Replace all boolean types (BOOLEAN, CTNBOOLEAN, DICOM_BOOL, BOOL) ** with one unique boolean type OFBool. ** ** Revision 1.14 1997/07/03 15:09:37 andreas ** - removed debugging functions Bdebug() and Edebug() since ** they write a static array and are not very useful at all. ** Cdebug and Vdebug are merged since they have the same semantics. ** The debugging functions in dcmdata changed their interfaces ** (see dcmdata/include/dcdebug.h) ** ** Revision 1.13 1997/05/30 06:44:56 andreas ** - fixed scanf format problem leading to warnings on 64 bit machines. ** ** Revision 1.12 1997/05/29 15:52:50 meichel ** Added constant for dcmtk release date in dcuid.h. ** All dcmtk applications now contain a version string ** which is displayed with the command line options ("usage" message) ** and which can be queried in the binary with the "ident" command. ** ** Revision 1.11 1997/05/27 13:47:40 andreas ** - Add method canWriteXfer to class DcmObject and all derived classes. ** This method checks whether it is possible to convert the original ** transfer syntax to an new transfer syntax. The check is used in the ** dcmconv utility to prohibit the change of a compressed transfer ** syntax to a uncompressed. ** ** Revision 1.10 1997/05/22 13:26:22 hewett ** Modified the test for presence of a data dictionary to use the ** method DcmDataDictionary::isDictionaryLoaded(). ** ** Revision 1.9 1997/05/20 07:57:10 andreas ** - Removed obsolete applications file2ds and ds2file. The functionality of these ** applications is now peformed by dcmconv. Unified calling parameters ** are implemented in dump2dcm, dcmdump and dcmconv. ** ** Revision 1.8 1997/05/16 08:31:04 andreas ** - Revised handling of GroupLength elements and support of ** DataSetTrailingPadding elements. The enumeratio E_GrpLenEncoding ** got additional enumeration values (for a description see dctypes.h). ** addGroupLength and removeGroupLength methods are replaced by ** computeGroupLengthAndPadding. To support Padding, the parameters of ** element and sequence write functions changed. ** ** Revision 1.7 1997/03/27 15:47:23 hewett ** Added command line switche to allow generation of UN to be ** disabled (it is enabled by default). ** ** Revision 1.6 1996/09/24 16:13:49 hewett ** Added preliminary support for the Macintosh environment (GUSI library). ** ** Revision 1.5 1996/03/12 15:11:37 hewett ** Added call to prepareCmdLineArgs to enable command line arguments ** in environments which do not provide them. ** ** Revision 1.4 1996/01/09 14:10:13 hewett ** Added check for presence of input and output files on command line. ** ** Revision 1.3 1996/01/09 11:05:59 andreas ** New Support for Visual C++ ** Correct problems with inconsistent const declarations ** Correct error in reading Item Delimitation Tags ** ** Revision 1.2 1996/01/05 13:29:34 andreas ** - new streaming facilities ** - unique read/write methods for block and file transfer ** - more cleanups ** ** Revision 1.1 1995/11/23 17:10:30 hewett ** Updated for loadable data dictionary. ** */ dcmtk-3.6.0/dcmdata/apps/CMakeLists.txt0000644000310500011400000000232111473445605017146 0ustar joergrdicom3# declare additional include directories INCLUDE_DIRECTORIES(${LIBXML_INCDIR}) # declare directories containing used libraries LINK_DIRECTORIES(${dcmdata_BINARY_DIR} ${ofstd_BINARY_DIR} ${oflog_BINARY_DIR} ${ZLIB_LIBDIR} ${LIBXML_LIBDIR}) # declare executables FOREACH(PROGRAM dcm2xml dcmconv dcmcrle dcmdrle dcmdump dcmftest dcmgpdir dump2dcm xml2dcm pdf2dcm dcm2pdf img2dcm) ADD_EXECUTABLE(${PROGRAM} ${PROGRAM}) ENDFOREACH(PROGRAM) ADD_EXECUTABLE(dcmodify dcmodify mdfconen mdfdsman) # declare installation files FOREACH(PROGRAM dcm2xml dcmconv dcmcrle dcmdrle dcmdump dcmftest dcmgpdir dcmodify dump2dcm xml2dcm pdf2dcm dcm2pdf img2dcm) INSTALL_TARGETS(${INSTALL_BINDIR} ${PROGRAM}) ENDFOREACH(PROGRAM) # make sure executables are linked to the corresponding libraries FOREACH(PROGRAM dcm2xml dcmconv dcmcrle dcmdrle dcmdump dcmgpdir dcmodify dump2dcm xml2dcm pdf2dcm dcm2pdf img2dcm) TARGET_LINK_LIBRARIES(${PROGRAM} dcmdata oflog ofstd ${ZLIB_LIBS} ${THREAD_LIBS} ${WIN32_STD_LIBRARIES}) ENDFOREACH(PROGRAM) TARGET_LINK_LIBRARIES(dcmftest ofstd ${ZLIB_LIBS} ${THREAD_LIBS}) TARGET_LINK_LIBRARIES(xml2dcm ${TARGET_LINK_LIBRARIES} ${LIBXML_LIBS}) TARGET_LINK_LIBRARIES(img2dcm ${TARGET_LINK_LIBRARIES} libi2d dcmdata) dcmtk-3.6.0/dcmdata/apps/pdf2dcm.cc0000644000310500011400000005675711455600772016260 0ustar joergrdicom3/* * * Copyright (C) 2005-2010, 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: dcmdata * * Author: Marco Eichelberg * * Purpose: Convert PDF file to DICOM format * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:13:30 $ * CVS/RCS Revision: $Revision: 1.18 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #define INCLUDE_CSTDLIB #define INCLUDE_CSTDIO #define INCLUDE_CSTRING #include "dcmtk/ofstd/ofstdinc.h" #ifdef HAVE_GUSI_H #include #endif BEGIN_EXTERN_C #ifdef HAVE_FCNTL_H #include /* for O_RDONLY */ #endif #ifdef HAVE_SYS_TYPES_H #include /* required for sys/stat.h */ #endif #ifdef HAVE_SYS_STAT_H #include /* for stat, fstat */ #endif END_EXTERN_C #include "dcmtk/dcmdata/dctk.h" #include "dcmtk/dcmdata/cmdlnarg.h" #include "dcmtk/ofstd/ofconapp.h" #include "dcmtk/dcmdata/dcuid.h" /* for dcmtk version name */ #include "dcmtk/ofstd/ofstd.h" #include "dcmtk/ofstd/ofdatime.h" #include "dcmtk/dcmdata/dccodec.h" #ifdef WITH_ZLIB #include /* for zlibVersion() */ #endif #define OFFIS_CONSOLE_APPLICATION "pdf2dcm" static OFLogger pdf2dcmLogger = OFLog::getLogger("dcmtk.apps." OFFIS_CONSOLE_APPLICATION); static char rcsid[] = "$dcmtk: " OFFIS_CONSOLE_APPLICATION " v" OFFIS_DCMTK_VERSION " " OFFIS_DCMTK_RELEASEDATE " $"; OFCondition createHeader( DcmItem *dataset, const char *opt_patientName, const char *opt_patientID, const char *opt_patientBirthdate, const char *opt_patientSex, OFBool opt_burnedInAnnotation, const char *opt_studyUID, const char *opt_seriesUID, const char *opt_documentTitle, const char *opt_conceptCSD, const char *opt_conceptCV, const char *opt_conceptCM, Sint32 opt_instanceNumber) { OFCondition result = EC_Normal; char buf[80]; // insert empty type 2 attributes if (result.good()) result = dataset->insertEmptyElement(DCM_StudyDate); if (result.good()) result = dataset->insertEmptyElement(DCM_StudyTime); if (result.good()) result = dataset->insertEmptyElement(DCM_AccessionNumber); if (result.good()) result = dataset->insertEmptyElement(DCM_Manufacturer); if (result.good()) result = dataset->insertEmptyElement(DCM_ReferringPhysicianName); if (result.good()) result = dataset->insertEmptyElement(DCM_StudyID); if (result.good()) result = dataset->insertEmptyElement(DCM_ContentDate); if (result.good()) result = dataset->insertEmptyElement(DCM_ContentTime); if (result.good()) result = dataset->insertEmptyElement(DCM_AcquisitionDateTime); if (result.good() && opt_conceptCSD && opt_conceptCV && opt_conceptCM) { result = DcmCodec::insertCodeSequence(dataset, DCM_ConceptNameCodeSequence, opt_conceptCSD, opt_conceptCV, opt_conceptCM); } else { result = dataset->insertEmptyElement(DCM_ConceptNameCodeSequence); } // insert const value attributes if (result.good()) result = dataset->putAndInsertString(DCM_SpecificCharacterSet, "ISO_IR 100"); if (result.good()) result = dataset->putAndInsertString(DCM_SOPClassUID, UID_EncapsulatedPDFStorage); if (result.good()) result = dataset->putAndInsertString(DCM_Modality, "OT"); if (result.good()) result = dataset->putAndInsertString(DCM_ConversionType, "WSD"); if (result.good()) result = dataset->putAndInsertString(DCM_MIMETypeOfEncapsulatedDocument, "application/pdf"); // there is no way we could determine a meaningful series number, so we just use a constant. if (result.good()) result = dataset->putAndInsertString(DCM_SeriesNumber, "1"); // insert variable value attributes if (result.good()) result = dataset->putAndInsertString(DCM_DocumentTitle, opt_documentTitle); if (result.good()) result = dataset->putAndInsertString(DCM_PatientName, opt_patientName); if (result.good()) result = dataset->putAndInsertString(DCM_PatientID, opt_patientID); if (result.good()) result = dataset->putAndInsertString(DCM_PatientBirthDate, opt_patientBirthdate); if (result.good()) result = dataset->putAndInsertString(DCM_PatientSex, opt_patientSex); if (result.good()) result = dataset->putAndInsertString(DCM_BurnedInAnnotation, opt_burnedInAnnotation ? "YES" : "NO"); sprintf(buf, "%ld", OFstatic_cast(long, opt_instanceNumber)); if (result.good()) result = dataset->putAndInsertString(DCM_InstanceNumber, buf); dcmGenerateUniqueIdentifier(buf, SITE_INSTANCE_UID_ROOT); if (result.good()) result = dataset->putAndInsertString(DCM_StudyInstanceUID, opt_studyUID); if (result.good()) result = dataset->putAndInsertString(DCM_SeriesInstanceUID, opt_seriesUID); if (result.good()) result = dataset->putAndInsertString(DCM_SOPInstanceUID, buf); // set instance creation date and time OFString s; if (result.good()) result = DcmDate::getCurrentDate(s); if (result.good()) result = dataset->putAndInsertOFStringArray(DCM_InstanceCreationDate, s); if (result.good()) result = DcmTime::getCurrentTime(s); if (result.good()) result = dataset->putAndInsertOFStringArray(DCM_InstanceCreationTime, s); return result; } OFCondition insertPDFFile( DcmItem *dataset, const char *filename) { size_t fileSize = 0; struct stat fileStat; char buf[100]; if (0 == stat(filename, &fileStat)) fileSize = OFstatic_cast(size_t, fileStat.st_size); else { OFLOG_ERROR(pdf2dcmLogger, "file " << filename << " not found"); return EC_IllegalCall; } if (fileSize == 0) { OFLOG_ERROR(pdf2dcmLogger, "file " << filename << " is empty"); return EC_IllegalCall; } FILE *pdffile = fopen(filename, "rb"); if (pdffile == NULL) { OFLOG_ERROR(pdf2dcmLogger, "unable to read file " << filename); return EC_IllegalCall; } size_t buflen = 100; if (fileSize < buflen) buflen = fileSize; if (buflen != fread(buf, 1, buflen, pdffile)) { OFLOG_ERROR(pdf2dcmLogger, "read error in file " << filename); fclose(pdffile); return EC_IllegalCall; } // check magic word for PDF file if (0 != strncmp("%PDF-", buf, 5)) { OFLOG_ERROR(pdf2dcmLogger, "file " << filename << " is not a PDF file"); fclose(pdffile); return EC_IllegalCall; } // check PDF version number char *version = buf + 5; OFBool found = OFFalse; for (int i = 0; i < 5; ++i) { if (version[i] == 10 || version[i] == 13) { version[i] = 0; // insert end of string found = OFTrue; break; } } if (! found) { OFLOG_ERROR(pdf2dcmLogger, "file " << filename << ": unable to decode PDF version number"); fclose(pdffile); return EC_IllegalCall; } OFLOG_INFO(pdf2dcmLogger, "file " << filename << ": PDF " << version << ", " << (fileSize + 1023) / 1024 << "kB"); if (0 != fseek(pdffile, 0, SEEK_SET)) { OFLOG_ERROR(pdf2dcmLogger, "file " << filename << ": seek error"); fclose(pdffile); return EC_IllegalCall; } OFCondition result = EC_Normal; DcmPolymorphOBOW *elem = new DcmPolymorphOBOW(DCM_EncapsulatedDocument); if (elem) { Uint32 numBytes = fileSize; if (numBytes & 1) ++numBytes; Uint8 *bytes = NULL; result = elem->createUint8Array(numBytes, bytes); if (result.good()) { // blank pad byte bytes[numBytes - 1] = 0; // read PDF content if (fileSize != fread(bytes, 1, fileSize, pdffile)) { OFLOG_ERROR(pdf2dcmLogger, "read error in file " << filename); result = EC_IllegalCall; } } } else result = EC_MemoryExhausted; // if successful, insert element into dataset if (result.good()) result = dataset->insert(elem); else delete elem; // close file fclose(pdffile); return result; } void createIdentifiers( OFBool opt_readSeriesInfo, const char *opt_seriesFile, OFString& studyUID, OFString& seriesUID, OFString& patientName, OFString& patientID, OFString& patientBirthDate, OFString& patientSex, Sint32& incrementedInstance) { char buf[100]; if (opt_seriesFile) { DcmFileFormat dfile; OFCondition cond = dfile.loadFile(opt_seriesFile, EXS_Unknown, EGL_noChange); if (cond.bad()) { OFLOG_WARN(pdf2dcmLogger, cond.text() << ": reading file: "<< opt_seriesFile); } else { const char *c = NULL; DcmDataset *dset = dfile.getDataset(); if (dset) { // read patient attributes c = NULL; if (dset->findAndGetString(DCM_PatientName, c).good() && c) patientName = c; c = NULL; if (dset->findAndGetString(DCM_PatientID, c).good() && c) patientID = c; c = NULL; if (dset->findAndGetString(DCM_PatientBirthDate, c).good() && c) patientBirthDate = c; c = NULL; if (dset->findAndGetString(DCM_PatientSex, c).good() && c) patientSex = c; // read study attributes c = NULL; if (dset->findAndGetString(DCM_StudyInstanceUID, c).good() && c) studyUID = c; // read series attributes if (opt_readSeriesInfo) { c = NULL; if (dset->findAndGetString(DCM_SeriesInstanceUID, c).good() && c) seriesUID = c; if (dset->findAndGetSint32(DCM_InstanceNumber, incrementedInstance).good()) ++incrementedInstance; else incrementedInstance = 0; } } } } if (studyUID.length() == 0) { dcmGenerateUniqueIdentifier(buf, SITE_STUDY_UID_ROOT); studyUID = buf; } if (seriesUID.length() == 0) { dcmGenerateUniqueIdentifier(buf, SITE_SERIES_UID_ROOT); seriesUID = buf; } } #define SHORTCOL 3 #define LONGCOL 19 int main(int argc, char *argv[]) { #ifdef HAVE_GUSI_H GUSISetup(GUSIwithSIOUXSockets); GUSISetup(GUSIwithInternetSockets); #endif const char *opt_ifname = NULL; const char *opt_ofname = NULL; E_TransferSyntax opt_oxfer = EXS_LittleEndianExplicit; E_GrpLenEncoding opt_oglenc = EGL_withoutGL; E_EncodingType opt_oenctype = EET_ExplicitLength; E_PaddingEncoding opt_opadenc = EPD_withoutPadding; OFCmdUnsignedInt opt_filepad = 0; OFCmdUnsignedInt opt_itempad = 0; // document specific options const char * opt_seriesFile = NULL; const char * opt_patientName = NULL; const char * opt_patientID = NULL; const char * opt_patientBirthdate = NULL; const char * opt_documentTitle = NULL; const char * opt_conceptCSD = NULL; const char * opt_conceptCV = NULL; const char * opt_conceptCM = NULL; OFBool opt_readSeriesInfo = OFFalse; const char * opt_patientSex = NULL; OFBool opt_annotation = OFTrue; OFCmdSignedInt opt_instance = 1; OFBool opt_increment = OFFalse; OFConsoleApplication app(OFFIS_CONSOLE_APPLICATION , "Convert PDF file to DICOM", rcsid); OFCommandLine cmd; cmd.setOptionColumns(LONGCOL, SHORTCOL); cmd.setParamColumn(LONGCOL + SHORTCOL + 4); cmd.addParam("pdffile-in", "PDF input filename to be converted"); cmd.addParam("dcmfile-out", "DICOM output filename"); cmd.addGroup("general options:", LONGCOL, SHORTCOL + 2); cmd.addOption("--help", "-h", "print this help text and exit", OFCommandLine::AF_Exclusive); cmd.addOption("--version", "print version information and exit", OFCommandLine::AF_Exclusive); OFLog::addOptions(cmd); cmd.addGroup("DICOM document options:"); cmd.addSubGroup("burned-in annotation:"); cmd.addOption("--annotation-yes", "+an", "PDF contains patient identifying data (default)"); cmd.addOption("--annotation-no", "-an", "PDF does not contain patient identifying data"); cmd.addSubGroup("document title:"); cmd.addOption("--title", "+t", 1, "[t]itle: string (default: empty)", "document title"); cmd.addOption("--concept-name", "+cn", 3, "[CSD] [CV] [CM]: string (default: empty)", "document title as concept name code sequence\n" "with coding scheme designator CSD, code value CV\n" "and code meaning CM"); cmd.addSubGroup("patient data:"); cmd.addOption("--patient-name", "+pn", 1, "[n]ame: string", "patient's name in DICOM PN syntax"); cmd.addOption("--patient-id", "+pi", 1, "[i]d: string", "patient identifier"); cmd.addOption("--patient-birthdate", "+pb", 1, "[d]ate: string (YYYYMMDD)", "patient's birth date"); cmd.addOption("--patient-sex", "+ps", 1, "[s]ex: string (M, F or O)", "patient's sex"); cmd.addSubGroup("study and series:"); cmd.addOption("--generate", "+sg", "generate new study and series UIDs (default)"); cmd.addOption("--study-from", "+st", 1, "[f]ilename: string", "read patient/study data from DICOM file"); cmd.addOption("--series-from", "+se", 1, "[f]ilename: string", "read patient/study/series data from DICOM file"); cmd.addSubGroup("instance number:"); cmd.addOption("--instance-one", "+i1", "use instance number 1 (default, not with +se)"); cmd.addOption("--instance-inc", "+ii", "increment instance number (only with +se)"); cmd.addOption("--instance-set", "+is", 1, "[i]nstance number: integer", "use instance number i"); /* evaluate command line */ prepareCmdLineArgs(argc, argv, OFFIS_CONSOLE_APPLICATION); if (app.parseCommandLine(cmd, argc, argv, OFCommandLine::PF_ExpandWildcards)) { /* check exclusive options first */ if (cmd.hasExclusiveOption()) { if (cmd.findOption("--version")) { app.printHeader(OFTrue /*print host identifier*/); ofConsole.lockCout() << OFendl << "External libraries used:"; ofConsole.unlockCout(); #ifdef WITH_ZLIB ofConsole.lockCout() << OFendl << "- ZLIB, Version " << zlibVersion() << OFendl; ofConsole.unlockCout(); #else ofConsole.lockCout() << " none" << OFendl; ofConsole.unlockCout(); #endif return 0; } } /* command line parameters and options */ cmd.getParam(1, opt_ifname); cmd.getParam(2, opt_ofname); OFLog::configureFromCommandLine(cmd, app); dcmEnableUnknownVRGeneration.set(OFTrue); dcmEnableUnlimitedTextVRGeneration.set(OFTrue); cmd.beginOptionBlock(); if (cmd.findOption("--generate")) { opt_seriesFile = NULL; opt_readSeriesInfo = OFFalse; } if (cmd.findOption("--series-from")) { app.checkValue(cmd.getValue(opt_seriesFile)); opt_readSeriesInfo = OFTrue; } if (cmd.findOption("--study-from")) { app.checkValue(cmd.getValue(opt_seriesFile)); opt_readSeriesInfo = OFFalse; } cmd.endOptionBlock(); if (cmd.findOption("--title")) { app.checkValue(cmd.getValue(opt_documentTitle)); } if (cmd.findOption("--concept-name")) { app.checkValue(cmd.getValue(opt_conceptCSD)); app.checkValue(cmd.getValue(opt_conceptCV)); app.checkValue(cmd.getValue(opt_conceptCM)); } if (cmd.findOption("--patient-name")) { app.checkValue(cmd.getValue(opt_patientName)); app.checkConflict("--patient-name", "--study-from or --series-from", opt_seriesFile != NULL); } if (cmd.findOption("--patient-id")) { app.checkValue(cmd.getValue(opt_patientID)); app.checkConflict("--patient-id", "--study-from or --series-from", opt_seriesFile != NULL); } if (cmd.findOption("--patient-birthdate")) { app.checkValue(cmd.getValue(opt_patientBirthdate)); app.checkConflict("--patient-birthdate", "--study-from or --series-from", opt_seriesFile != NULL); } if (cmd.findOption("--patient-sex")) { app.checkValue(cmd.getValue(opt_patientSex)); app.checkConflict("--patient-sex", "--study-from or --series-from", opt_seriesFile != NULL); } cmd.beginOptionBlock(); if (cmd.findOption("--annotation-yes")) { opt_annotation = OFTrue; } if (cmd.findOption("--annotation-no")) { opt_annotation = OFTrue; } cmd.endOptionBlock(); // initialize default for --series-from if (opt_seriesFile && opt_readSeriesInfo) opt_increment = OFTrue; cmd.beginOptionBlock(); if (cmd.findOption("--instance-one")) { app.checkConflict("--instance-one", "--series-from", (opt_seriesFile != NULL) && opt_readSeriesInfo); opt_increment = OFFalse; opt_instance = 1; } if (cmd.findOption("--instance-inc")) { app.checkDependence("--instance-inc", "--series-from", (opt_seriesFile != NULL) && opt_readSeriesInfo); opt_increment = OFTrue; } if (cmd.findOption("--instance-set")) { opt_increment = OFFalse; app.checkValue(cmd.getValueAndCheckMin(opt_instance, 1)); } } /* print resource identifier */ OFLOG_DEBUG(pdf2dcmLogger, rcsid << OFendl); /* make sure data dictionary is loaded */ if (!dcmDataDict.isDictionaryLoaded()) { OFLOG_WARN(pdf2dcmLogger, "no data dictionary loaded, check environment variable: " << DCM_DICT_ENVIRONMENT_VARIABLE); } // read raw file if ((opt_ifname == NULL) || (strlen(opt_ifname) == 0)) { OFLOG_FATAL(pdf2dcmLogger, "invalid filename: "); return 1; } // create study and series UID OFString studyUID; OFString seriesUID; OFString patientName; OFString patientID; OFString patientBirthDate; OFString patientSex; Sint32 incrementedInstance = 0; if (opt_patientName) patientName = opt_patientName; if (opt_patientID) patientID = opt_patientID; if (opt_patientBirthdate) patientBirthDate = opt_patientBirthdate; if (opt_patientSex) patientSex = opt_patientSex; createIdentifiers(opt_readSeriesInfo, opt_seriesFile, studyUID, seriesUID, patientName, patientID, patientBirthDate, patientSex, incrementedInstance); if (opt_increment) opt_instance = incrementedInstance; OFLOG_INFO(pdf2dcmLogger, "creating encapsulated PDF object"); DcmFileFormat fileformat; OFCondition result = insertPDFFile(fileformat.getDataset(), opt_ifname); if (result.bad()) { OFLOG_ERROR(pdf2dcmLogger, "unable to create PDF DICOM encapsulation"); return 10; } if (result.bad()) return 10; // now we need to generate an instance number that is guaranteed to be unique within a series. result = createHeader(fileformat.getDataset(), patientName.c_str(), patientID.c_str(), patientBirthDate.c_str(), patientSex.c_str(), opt_annotation, studyUID.c_str(), seriesUID.c_str(), opt_documentTitle, opt_conceptCSD, opt_conceptCV, opt_conceptCM, OFstatic_cast(Sint32, opt_instance)); if (result.bad()) { OFLOG_ERROR(pdf2dcmLogger, "unable to create DICOM header: " << result.text()); return 10; } OFLOG_INFO(pdf2dcmLogger, "writing encapsulated PDF object as file " << opt_ofname); OFCondition error = EC_Normal; OFLOG_INFO(pdf2dcmLogger, "Check if new output transfer syntax is possible"); DcmXfer opt_oxferSyn(opt_oxfer); fileformat.getDataset()->chooseRepresentation(opt_oxfer, NULL); if (fileformat.getDataset()->canWriteXfer(opt_oxfer)) { OFLOG_INFO(pdf2dcmLogger, "Output transfer syntax " << opt_oxferSyn.getXferName() << " can be written"); } else { OFLOG_ERROR(pdf2dcmLogger, "No conversion to transfer syntax " << opt_oxferSyn.getXferName() << " possible!"); return 1; } OFLOG_INFO(pdf2dcmLogger, "write converted DICOM file with metaheader"); error = fileformat.saveFile(opt_ofname, opt_oxfer, opt_oenctype, opt_oglenc, opt_opadenc, OFstatic_cast(Uint32, opt_filepad), OFstatic_cast(Uint32, opt_itempad)); if (error.bad()) { OFLOG_ERROR(pdf2dcmLogger, error.text() << ": writing file: " << opt_ofname); return 1; } OFLOG_INFO(pdf2dcmLogger, "conversion successful"); return 0; } /* ** CVS/RCS Log: ** $Log: pdf2dcm.cc,v $ ** Revision 1.18 2010-10-14 13:13:30 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.17 2010-08-09 13:04:19 joergr ** Updated data dictionary to 2009 edition of the DICOM standard. From now on, ** the official "keyword" is used for the attribute name which results in a ** number of minor changes (e.g. "PatientsName" is now called "PatientName"). ** ** Revision 1.16 2009-11-13 13:20:23 joergr ** Fixed minor issues in log output. ** ** Revision 1.15 2009-11-04 09:58:06 uli ** Switched to logging mechanism provided by the "new" oflog module ** ** Revision 1.14 2009-10-12 09:35:43 joergr ** Changed prefix of UIDs created for series and studies (now using constants ** SITE_SERIES_UID_ROOT and SITE_STUDY_UID_ROOT which are supposed to be used ** in these cases). ** ** Revision 1.13 2009-08-11 08:13:35 joergr ** Slightly modified code in order to avoid warning messages on MSVC compiler. ** ** Revision 1.12 2009-08-10 11:04:22 joergr ** Use helper functions checkDependence() and checkConflict() where appropriate. ** ** Revision 1.11 2009-08-10 10:25:23 joergr ** Replaced '\n' by OFendl where appropriate. ** ** Revision 1.10 2009-04-21 14:02:49 joergr ** Fixed minor inconsistencies in manpage / syntax usage. ** ** Revision 1.9 2008-09-25 14:38:48 joergr ** Moved output of resource identifier in order to avoid printing the same ** information twice. ** ** Revision 1.8 2008-09-25 11:19:48 joergr ** Added support for printing the expanded command line arguments. ** Always output the resource identifier of the command line tool in debug mode. ** ** Revision 1.7 2008-04-30 12:38:42 meichel ** Fixed compile errors due to changes in attribute tag names ** ** Revision 1.6 2006/08/15 15:50:56 meichel ** Updated all code in module dcmdata to correctly compile when ** all standard C++ classes remain in namespace std. ** ** Revision 1.5 2006/07/27 13:52:42 joergr ** Changed parameter "exclusive" of method addOption() from type OFBool into an ** integer parameter "flags". Prepended prefix "PF_" to parseLine() flags. ** Option "--help" is no longer an exclusive option by default. ** ** Revision 1.4 2005/12/08 15:40:53 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.3 2005/11/28 15:28:54 meichel ** File dcdebug.h is not included by any other header file in the toolkit ** anymore, to minimize the risk of name clashes of macro debug(). ** ** Revision 1.2 2005/10/26 13:33:49 joergr ** Slightly modified code to use more of the "new" helper functions. ** ** Revision 1.1 2005/10/25 13:01:02 meichel ** Added new tool pdf2dcm that allows to convert PDF files to DICOM ** Encapsulated PDF Storage SOP instances. ** */ dcmtk-3.6.0/dcmdata/apps/mdfdsman.h0000644000310500011400000003505411455601400016344 0ustar joergrdicom3/* * * Copyright (C) 2003-2010, 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: dcmdata * * Author: Michael Onken * * Purpose: Class for modifying DICOM files * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:17:52 $ * CVS/RCS Revision: $Revision: 1.22 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef MDFDSMAN_H #define MDFDSMAN_H #include "dcmtk/config/osconfig.h" // make sure OS specific configuration is included first #include "dcmtk/ofstd/ofcond.h" #include "dcmtk/dcmdata/dctagkey.h" #include "dcmtk/dcmdata/dcxfer.h" // forward declarations class DcmDataset; class DcmFileFormat; class DcmElement; /** This class encapsulates data structures and operations for modifying * Dicom files. Therefore it allows the process of load->modify->save to * provide this service. */ class MdfDatasetManager { public: /** Constructor, initializes member-variables */ MdfDatasetManager(); /** Destructor */ ~MdfDatasetManager(); /** Loads a file into dataset manager * @param file_name file to be loaded @param readMode read file with or without metaheader. Default=autodetect @param xfer try to read with this transfer syntax. Default=autodetect * @return returns EC_normal if everything is ok, else an error */ OFCondition loadFile(const char *file_name, const E_FileReadMode readMode = ERM_autoDetect, const E_TransferSyntax xfer = EXS_Unknown); /** Modifies/Inserts a path (with a specific value if desired). * @param tag_path path to item/element * @param value denotes new value of tag * @param only_modify if true, only existing tags are processed. If false, * any not existing tag is inserted * @param update_metaheader updates metaheader UIDs, if related UIDs in * dataset are changed (default=true) * @param ignore_missing_tags if true, tags that could not be found * while modifying (only_modify must be true) * are handled as non-errors * @param no_reservation_checks if true, any missing private reservation * tags are ignored when inserting private * tags. Only makes sense w/o only_modify * @return returns EC_normal if everything is ok, else an error */ OFCondition modifyOrInsertPath(OFString tag_path, const OFString &value, const OFBool &only_modify, const OFBool update_metaheader = OFTrue, const OFBool ignore_missing_tags = OFFalse, const OFBool no_reservation_checks = OFFalse); /** Modifies/Inserts a path with a specific value read from file * @param tag_path path to item/element * @param filename name of the file from which the value should be read * @param only_modify if true, only existing tags are processed. If false, * any not existing tag is inserted * @param update_metaheader updates metaheader UIDs, if related UIDs in * dataset are changed (default=true) * @param ignore_missing_tags if true, tags that could not be found * while modifying (only_modify must be true) * are handled as non-errors * @param no_reservation_checks if true, any missing private reservation * tags are ignored when inserting private * tags. Only makes sense w/o only_modify * @return returns EC_normal if everything is ok, else an error */ OFCondition modifyOrInsertFromFile(OFString tag_path, const OFString &filename, const OFBool &only_modify, const OFBool update_metaheader = OFTrue, const OFBool ignore_missing_tags = OFFalse, const OFBool no_reservation_checks = OFFalse); /** Modifies all matching tags in dataset to a new value * @param tag_path denotes, which tag to modify * @param value denotes new value of tag * @param update_metaheader if true, metaheader uids are updated, * if related dataset uids are changed, (default=true) * @param count returns holds the number of tags, that were affected * @param ignore_missing_tags if true, tags that could not be found * while modifying (only_modify must be true) * are handled as non-errors * @return returns EC_normal if everything is ok, else an error */ OFCondition modifyAllTags(OFString tag_path, const OFString &value, const OFBool update_metaheader, int &count, const OFBool ignore_missing_tags = OFFalse); /** Deletes tag in dataset * @param tag_path holds complete path to tag * @param all_tags if true, tag is deleted at all levels of dataset, * else only 1st level is accessed * @param ignore_missing_tags if true, tags that could not be found * while modifying (only_modify must be true) * are handled as non-errors * @return returns EC_normal if everything is ok, else an error */ OFCondition deleteTag(OFString tag_path, const OFBool all_tags, const OFBool ignore_missing_tags); /** Deletes all private data from file, ie. all tags having * odd group numbers. * @return EC_Normal, if deletion was successful; error code otherwise */ OFCondition deletePrivateData(); /** Inserts new Study, Series or SOP Instance UID. If SOP Instance * UID is generated, the related tag in the metaheader is deleted, too * so that the new UID is also applied there when saving to disk later. * @param uidkey [in] The Instance UID to insert (study, series or sop * instance UID key permitted). * @return EC_Normal, if insertion was successful, error otherwise */ OFCondition generateAndInsertUID(const DcmTagKey &uidKey); /** Saves current dataset back to a file. Caution: After saving * MdfDatasetManager keeps working on old filename. * @param file_name filename to save to * @param opt_xfer transfer syntax to save to (EXS_Unknown: dont change) * @param opt_enctype write with explicit or implicit length encoding * @param opt_glenc option to set group lenghth calculation mode * @param opt_padenc sets padding option * @param opt_filepad pad file to a multiple of this options value * @param opt_itempad pad item to a multiple of this options value * @param opt_dataset if true:ony write only dataset, else write fileformat * @return returns EC_normal if everything is ok, else an error */ OFCondition saveFile(const char *file_name, E_TransferSyntax opt_xfer = EXS_Unknown, E_EncodingType opt_enctype = EET_UndefinedLength, E_GrpLenEncoding opt_glenc = EGL_recalcGL, E_PaddingEncoding opt_padenc = EPD_noChange, OFCmdUnsignedInt opt_filepad = 0, OFCmdUnsignedInt opt_itempad = 0, OFBool opt_dataset = OFFalse); /** Saves current dataset back to file using original filename and original * parameters like transfer syntax, padding etc. * @return returns EC_normal if everything is ok, else an error */ OFCondition saveFile(); /** Returns the dataset, that this MdfDatasetManager handles. * You should use the returned object with care to avoid * sideeffects with other class methods, that modify this object, too. * @return returns the dataset, this MdfDatasetManager manages and NULL, if * no dataset is loaded */ DcmDataset* getDataset(); /** Returns the DcmFileFormat, that this MdfDatasetManager handles. * You should use the returned object with care to avoid * sideeffects with other class methods, that modify this object, too. * @return returns the DcmFileFormat, this MdfDatasetManager manages and * NULL, if no file is loaded */ DcmFileFormat* getFileFormat(); /** Returns filename of the file, that's loaded currently. * @return returns filename and "" if no file is loaded. */ OFString getFilename() const; /** Sets whether attributes with VR of UN should be modified or * left alone. * @param modifyUNValues [in] If set, UN values will be modified (default) */ void setModifyUNValues(OFBool modifyUNValues); protected: /** modifies element to a specific value * @param elem element, that should be changed * @param value the value, the element should be changed to * @return OFCondition, which returns an error code if an error occurs */ OFCondition startModify(DcmElement *elem, const OFString &value); /** If key is the tag for SOPInstanceUID or SOPClassUID, then this function * removes the related MediaStorage UIDs from the metaheader. The * metaheader is then updated automagically when the file is saved back to * disk. * @param key tag to examine */ void deleteRelatedMetaheaderTag(const DcmTagKey &key); /** Returns true, if given tag key can be found in dictionary * @param search_key tag to lookup * @return OFTrue if tag could be found, else OFFalse */ OFBool isTagInDictionary(const DcmTagKey &search_key); private: /// name of file, that is loaded currently OFString current_file; /// will hold file to modify DcmFileFormat *dfile; /// will hold the dataset, that should be modified DcmDataset *dset; /// if enabled, no value modifications on attributes having VR of UN /// are not executed OFBool ignore_un_modifies; /** private undefined assignment operator */ MdfDatasetManager &operator=(const MdfDatasetManager &); /** private undefined copy constructor */ MdfDatasetManager(const MdfDatasetManager &); }; #endif // MDFDSMAN_H /* ** CVS/RCS Log: ** $Log: mdfdsman.h,v $ ** Revision 1.22 2010-10-14 13:17:52 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.21 2010-05-20 15:44:55 joergr ** Added support for reading the value of insert/modify statements from a file. ** Removed some unnecessary include directives. ** ** Revision 1.20 2009-11-04 09:58:06 uli ** Switched to logging mechanism provided by the "new" oflog module ** ** Revision 1.19 2009-01-15 16:11:55 onken ** Reworked dcmodify to work with the new DcmPath classes for supporting ** wildcard paths and automatic insertion of missing attributes and items. ** Added options for private tag handling and modification of UN values and ** for ignoring errors resulting from missing tags during modify and erase ** operations. Further cleanups. ** ** Revision 1.18 2008-07-11 08:37:45 joergr ** Fixed typo in API documentation. ** ** Revision 1.17 2006/11/23 15:32:58 onken ** Made member variables private (before: protected) ** ** Revision 1.16 2005/12/08 15:46:50 meichel ** Updated Makefiles to correctly install header files ** ** Revision 1.15 2005/12/02 09:21:47 joergr ** Added new file read mode that makes it possible to distinguish between DICOM ** files, datasets and other non-DICOM files. For this reason, the last ** parameter of method loadFile() changed from OFBool to E_FileReadMode. ** ** Revision 1.14 2005/11/30 16:41:41 onken ** Added standard parameter values for saveFile() ** ** Revision 1.13 2005/11/14 15:00:14 joergr ** Made method getFilename() const. ** ** Revision 1.12 2004/11/05 17:17:24 onken ** Added input and output options for dcmodify. minor code enhancements. ** ** Revision 1.11 2004/10/22 16:53:26 onken ** - fixed ignore-errors-option ** - major enhancements for supporting private tags ** - removed '0 Errors' output ** - modifications to groups 0000,0001,0002,0003,0005 and 0007 are blocked, ** removing tags with group 0001,0003,0005 and 0007 is still possible ** - UID options: ** - generate new study, series and instance UIDs ** - When changing UIDs in dataset, related metaheader tags are updated ** automatically ** - minor code improvements ** ** Revision 1.10 2004/05/14 12:08:36 onken ** Additional documentation added. ** ** Revision 1.9 2004/04/19 14:45:07 onken ** Restructured code to avoid default parameter values for "complex types" like ** OFString. Required for Sun CC 2.0.1. ** ** Revision 1.8 2003/12/17 17:07:22 onken ** MdfDatasetManager now remembers loaded filename. Additional save function ** added. ** ** Revision 1.7 2003/12/10 16:19:20 onken ** Changed API of MdfDatasetManager, so that its transparent for user, whether ** he wants to modify itemtags or tags at 1. level. ** ** Complete rewrite of MdfConsoleEngine. It doesn't support a batchfile any more, ** but now a user can give different modify-options at the same time on ** commandline. Other purifications and simplifications were made. ** ** Revision 1.6 2003/11/11 10:55:51 onken ** - debug-mechanism doesn't use debug(..) any more ** - comments purified ** - headers adjustet to debug-modifications ** ** Revision 1.5 2003/10/13 14:46:50 onken ** startModify(...) simplified (uses only putString to put element-values), ** this also allows now inserting and modifying of elements with VRM>1. ** Method getDataset() added. ** ** Revision 1.4 2003/10/01 14:04:03 onken ** Corrected doxygen-information in headerfiles ** ** Revision 1.3 2003/09/19 12:41:11 onken ** major bugfixes, new code structure, better error-handling, corrections for "dcmtk-coding-style",Handling of VR's corrected ** ** Revision 1.2 2003/07/09 12:13:13 meichel ** Included dcmodify in MSVC build system, updated headers ** ** Revision 1.1 2003/06/26 09:17:18 onken ** Added commandline-application dcmodify. ** ** */ dcmtk-3.6.0/dcmdata/apps/dcm2pdf.cc0000644000310500011400000003222111457775225016244 0ustar joergrdicom3/* * * Copyright (C) 2007-2010, 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: dcmdata * * Author: Marco Eichelberg * * Purpose: Exctract PDF file from DICOM encapsulated PDF storage object * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-21 08:32:21 $ * CVS/RCS Revision: $Revision: 1.8 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #define INCLUDE_CSTDLIB #define INCLUDE_CSTDIO #define INCLUDE_CSTRING #include "dcmtk/ofstd/ofstdinc.h" BEGIN_EXTERN_C #ifdef HAVE_FCNTL_H #include /* for O_RDONLY */ #endif #ifdef HAVE_SYS_TYPES_H #include /* required for sys/stat.h */ #endif #ifdef HAVE_SYS_STAT_H #include /* for stat, fstat */ #endif END_EXTERN_C #include "dcmtk/dcmdata/dctk.h" #include "dcmtk/dcmdata/cmdlnarg.h" #include "dcmtk/ofstd/ofconapp.h" #include "dcmtk/dcmdata/dcuid.h" /* for dcmtk version name */ #include "dcmtk/ofstd/ofstd.h" #include "dcmtk/dcmdata/dcistrmz.h" /* for dcmZlibExpectRFC1950Encoding */ #ifdef WITH_ZLIB #include /* for zlibVersion() */ #endif #define OFFIS_CONSOLE_APPLICATION "dcm2pdf" static OFLogger dcm2pdfLogger = OFLog::getLogger("dcmtk.apps." OFFIS_CONSOLE_APPLICATION); static char rcsid[] = "$dcmtk: " OFFIS_CONSOLE_APPLICATION " v" OFFIS_DCMTK_VERSION " " OFFIS_DCMTK_RELEASEDATE " $"; #define FILENAME_PLACEHOLDER "#f" static OFString replaceChars(const OFString &srcstr, const OFString &pattern, const OFString &substitute) /* * This function replaces all occurrences of pattern in srcstr with substitute and returns * the result as a new OFString variable. Note that srcstr itself will not be changed. * * Parameters: * srcstr - [in] The source string. * pattern - [in] The pattern string which shall be substituted. * substitute - [in] The substitute for pattern in srcstr. */ { OFString result = srcstr; size_t pos = 0; while (pos != OFString_npos) { pos = result.find(pattern, pos); if (pos != OFString_npos) { result.replace(pos, pattern.size(), substitute); pos += substitute.size(); } } return result; } #define SHORTCOL 3 #define LONGCOL 20 int main(int argc, char *argv[]) { const char *opt_ifname = NULL; const char *opt_ofname = NULL; const char *opt_execString = NULL; E_FileReadMode opt_readMode = ERM_autoDetect; E_TransferSyntax opt_ixfer = EXS_Unknown; OFConsoleApplication app(OFFIS_CONSOLE_APPLICATION, "Extract PDF file from DICOM encapsulated PDF", rcsid); OFCommandLine cmd; cmd.setOptionColumns(LONGCOL, SHORTCOL); cmd.setParamColumn(LONGCOL + SHORTCOL + 4); cmd.addParam("dcmfile-in", "DICOM input filename"); cmd.addParam("pdffile-out", "PDF output filename"); cmd.addGroup("general options:", LONGCOL, SHORTCOL + 2); cmd.addOption("--help", "-h", "print this help text and exit", OFCommandLine::AF_Exclusive); cmd.addOption("--version", "print version information and exit", OFCommandLine::AF_Exclusive); OFLog::addOptions(cmd); cmd.addGroup("input options:"); cmd.addSubGroup("input file format:"); cmd.addOption("--read-file", "+f", "read file format or data set (default)"); cmd.addOption("--read-file-only", "+fo", "read file format only"); cmd.addOption("--read-dataset", "-f", "read data set without file meta information"); cmd.addSubGroup("input transfer syntax:", LONGCOL, SHORTCOL); cmd.addOption("--read-xfer-auto", "-t=", "use TS recognition (default)"); cmd.addOption("--read-xfer-detect", "-td", "ignore TS specified in the file meta header"); cmd.addOption("--read-xfer-little", "-te", "read with explicit VR little endian TS"); cmd.addOption("--read-xfer-big", "-tb", "read with explicit VR big endian TS"); cmd.addOption("--read-xfer-implicit", "-ti", "read with implicit VR little endian TS"); cmd.addSubGroup("parsing of odd-length attributes:"); cmd.addOption("--accept-odd-length", "+ao", "accept odd length attributes (default)"); cmd.addOption("--assume-even-length", "+ae", "assume real length is one byte larger"); cmd.addSubGroup("handling of undefined length UN elements:"); cmd.addOption("--enable-cp246", "+ui", "read undefined len UN as implicit VR (default)"); cmd.addOption("--disable-cp246", "-ui", "read undefined len UN as explicit VR"); cmd.addSubGroup("handling of defined length UN elements:"); cmd.addOption("--retain-un", "-uc", "retain elements as UN (default)"); cmd.addOption("--convert-un", "+uc", "convert to real VR if known"); cmd.addSubGroup("automatic data correction:"); cmd.addOption("--enable-correction", "+dc", "enable automatic data correction (default)"); cmd.addOption("--disable-correction", "-dc", "disable automatic data correction"); #ifdef WITH_ZLIB cmd.addSubGroup("bitstream format of deflated input:"); cmd.addOption("--bitstream-deflated", "+bd", "expect deflated bitstream (default)"); cmd.addOption("--bitstream-zlib", "+bz", "expect deflated zlib bitstream"); #endif cmd.addGroup("execution options:", LONGCOL, SHORTCOL + 2); cmd.addOption("--exec", "-x", 1, "[c]ommand: string", "execute command c after PDF extraction"); /* evaluate command line */ prepareCmdLineArgs(argc, argv, OFFIS_CONSOLE_APPLICATION); if (app.parseCommandLine(cmd, argc, argv, OFCommandLine::PF_ExpandWildcards)) { /* check exclusive options first */ if (cmd.hasExclusiveOption()) { if (cmd.findOption("--version")) { app.printHeader(OFTrue /*print host identifier*/); ofConsole.lockCout() << OFendl << "External libraries used:"; ofConsole.unlockCout(); #ifdef WITH_ZLIB ofConsole.lockCout() << OFendl << "- ZLIB, Version " << zlibVersion() << OFendl; ofConsole.unlockCout(); #else ofConsole.lockCout() << " none" << OFendl; ofConsole.unlockCout(); #endif return 0; } } /* command line parameters and options */ cmd.getParam(1, opt_ifname); cmd.getParam(2, opt_ofname); OFLog::configureFromCommandLine(cmd, app); cmd.beginOptionBlock(); if (cmd.findOption("--read-file")) opt_readMode = ERM_autoDetect; if (cmd.findOption("--read-file-only")) opt_readMode = ERM_fileOnly; if (cmd.findOption("--read-dataset")) opt_readMode = ERM_dataset; cmd.endOptionBlock(); cmd.beginOptionBlock(); if (cmd.findOption("--read-xfer-auto")) opt_ixfer = EXS_Unknown; if (cmd.findOption("--read-xfer-detect")) dcmAutoDetectDatasetXfer.set(OFTrue); if (cmd.findOption("--read-xfer-little")) { app.checkDependence("--read-xfer-little", "--read-dataset", opt_readMode == ERM_dataset); opt_ixfer = EXS_LittleEndianExplicit; } if (cmd.findOption("--read-xfer-big")) { app.checkDependence("--read-xfer-big", "--read-dataset", opt_readMode == ERM_dataset); opt_ixfer = EXS_BigEndianExplicit; } if (cmd.findOption("--read-xfer-implicit")) { app.checkDependence("--read-xfer-implicit", "--read-dataset", opt_readMode == ERM_dataset); opt_ixfer = EXS_LittleEndianImplicit; } cmd.endOptionBlock(); cmd.beginOptionBlock(); if (cmd.findOption("--accept-odd-length")) { dcmAcceptOddAttributeLength.set(OFTrue); } if (cmd.findOption("--assume-even-length")) { dcmAcceptOddAttributeLength.set(OFFalse); } cmd.endOptionBlock(); cmd.beginOptionBlock(); if (cmd.findOption("--enable-cp246")) { dcmEnableCP246Support.set(OFTrue); } if (cmd.findOption("--disable-cp246")) { dcmEnableCP246Support.set(OFFalse); } cmd.endOptionBlock(); cmd.beginOptionBlock(); if (cmd.findOption("--retain-un")) { dcmEnableUnknownVRConversion.set(OFFalse); } if (cmd.findOption("--convert-un")) { dcmEnableUnknownVRConversion.set(OFTrue); } cmd.endOptionBlock(); cmd.beginOptionBlock(); if (cmd.findOption("--enable-correction")) { dcmEnableAutomaticInputDataCorrection.set(OFTrue); } if (cmd.findOption("--disable-correction")) { dcmEnableAutomaticInputDataCorrection.set(OFFalse); } cmd.endOptionBlock(); #ifdef WITH_ZLIB cmd.beginOptionBlock(); if (cmd.findOption("--bitstream-deflated")) { dcmZlibExpectRFC1950Encoding.set(OFFalse); } if (cmd.findOption("--bitstream-zlib")) { dcmZlibExpectRFC1950Encoding.set(OFTrue); } cmd.endOptionBlock(); #endif if (cmd.findOption("--exec")) app.checkValue(cmd.getValue(opt_execString)); } /* print resource identifier */ OFLOG_DEBUG(dcm2pdfLogger, rcsid << OFendl); /* make sure data dictionary is loaded */ if (!dcmDataDict.isDictionaryLoaded()) { OFLOG_WARN(dcm2pdfLogger, "no data dictionary loaded, check environment variable: " << DCM_DICT_ENVIRONMENT_VARIABLE); } // open inputfile if ((opt_ifname == NULL) || (strlen(opt_ifname) == 0)) { OFLOG_FATAL(dcm2pdfLogger, "invalid filename: "); return 1; } DcmFileFormat fileformat; DcmDataset * dataset = fileformat.getDataset(); OFLOG_INFO(dcm2pdfLogger, "open input file " << opt_ifname); OFCondition error = fileformat.loadFile(opt_ifname, opt_ixfer, EGL_noChange, DCM_MaxReadLength, opt_readMode); if (error.bad()) { OFLOG_FATAL(dcm2pdfLogger, error.text() << ": reading file: " << opt_ifname); return 1; } OFString sopClass; error = dataset->findAndGetOFString(DCM_SOPClassUID, sopClass); if (error.bad() || sopClass != UID_EncapsulatedPDFStorage) { OFLOG_FATAL(dcm2pdfLogger, "not an Encapsulated PDF Storage object: " << opt_ifname); return 1; } DcmElement *delem = NULL; error = dataset->findAndGetElement(DCM_EncapsulatedDocument, delem); if (error.bad() || delem == NULL) { OFLOG_FATAL(dcm2pdfLogger, "attribute (0042,0011) Encapsulated Document missing."); return 1; } Uint32 len = delem->getLength(); Uint8 *pdfDocument = NULL; error = delem->getUint8Array(pdfDocument); if (error.bad() || pdfDocument == NULL || len == 0) { OFLOG_FATAL(dcm2pdfLogger, "attribute (0042,0011) Encapsulated Document empty or wrong VR."); return 1; } /* strip pad byte at end of file, if there is one. The PDF format expects * files to end with %%EOF followed by CR/LF. If the last character of the * file is not a CR or LF, we assume it is a pad byte and remove it. */ if (pdfDocument[len-1] != 10 && pdfDocument[len-1] != 13) { --len; } FILE *pdffile = fopen(opt_ofname, "wb"); if (pdffile == NULL) { OFLOG_FATAL(dcm2pdfLogger, "unable to create file " << opt_ofname); return 1; } if (len != fwrite(pdfDocument, 1, len, pdffile)) { OFLOG_FATAL(dcm2pdfLogger, "write error in file " << opt_ofname); fclose(pdffile); return 1; } fclose(pdffile); OFLOG_INFO(dcm2pdfLogger, "conversion successful"); if (opt_execString) { OFString cmdStr = opt_execString; cmdStr = replaceChars(cmdStr, OFString(FILENAME_PLACEHOLDER), opt_ofname); // Execute command and return result return system(cmdStr.c_str()); } return 0; } /* * CVS/RCS Log: * $Log: dcm2pdf.cc,v $ * Revision 1.8 2010-10-21 08:32:21 joergr * Renamed variable to avoid warning reported by gcc with additional flags. * * Revision 1.7 2010-10-14 13:13:30 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.6 2009-11-13 13:20:23 joergr * Fixed minor issues in log output. * * Revision 1.5 2009-11-04 09:58:05 uli * Switched to logging mechanism provided by the "new" oflog module * * Revision 1.4 2008-09-25 14:38:48 joergr * Moved output of resource identifier in order to avoid printing the same * information twice. * * Revision 1.3 2008-09-25 11:19:48 joergr * Added support for printing the expanded command line arguments. * Always output the resource identifier of the command line tool in debug mode. * * Revision 1.2 2007/07/11 10:41:21 joergr * Fixed layout and other minor issues of the usage output (--help). * * Revision 1.1 2007/07/11 09:10:29 meichel * Added new tool dcm2pdf that extracts a PDF document from a DICOM * Encapsulated PDF file, i.e. is the counterpart to pdf2dcm. * * */ dcmtk-3.6.0/dcmdata/apps/dcmdrle.cc0000644000310500011400000003706311455600772016340 0ustar joergrdicom3/* * * Copyright (C) 2002-2010, 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: dcmdata * * Author: Marco Eichelberg * * Purpose: Decompress RLE-compressed DICOM file * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:13:30 $ * CVS/RCS Revision: $Revision: 1.23 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #define INCLUDE_CSTDLIB #define INCLUDE_CSTDIO #define INCLUDE_CSTRING #include "dcmtk/ofstd/ofstdinc.h" #ifdef HAVE_GUSI_H #include #endif #include "dcmtk/dcmdata/dctk.h" #include "dcmtk/dcmdata/cmdlnarg.h" #include "dcmtk/ofstd/ofconapp.h" #include "dcmtk/dcmdata/dcuid.h" /* for dcmtk version name */ #include "dcmtk/dcmdata/dcrledrg.h" /* for DcmRLEDecoderRegistration */ #ifdef WITH_ZLIB #include /* for zlibVersion() */ #endif #define OFFIS_CONSOLE_APPLICATION "dcmdrle" static OFLogger dcmdrleLogger = OFLog::getLogger("dcmtk.apps." OFFIS_CONSOLE_APPLICATION); static char rcsid[] = "$dcmtk: " OFFIS_CONSOLE_APPLICATION " v" OFFIS_DCMTK_VERSION " " OFFIS_DCMTK_RELEASEDATE " $"; // ******************************************** #define SHORTCOL 3 #define LONGCOL 21 int main(int argc, char *argv[]) { #ifdef HAVE_GUSI_H GUSISetup(GUSIwithSIOUXSockets); GUSISetup(GUSIwithInternetSockets); #endif const char *opt_ifname = NULL; const char *opt_ofname = NULL; E_TransferSyntax opt_oxfer = EXS_LittleEndianExplicit; E_GrpLenEncoding opt_oglenc = EGL_recalcGL; E_EncodingType opt_oenctype = EET_ExplicitLength; E_PaddingEncoding opt_opadenc = EPD_noChange; OFCmdUnsignedInt opt_filepad = 0; OFCmdUnsignedInt opt_itempad = 0; E_FileReadMode opt_readMode = ERM_autoDetect; E_FileWriteMode opt_writeMode = EWM_fileformat; E_TransferSyntax opt_ixfer = EXS_Unknown; // RLE parameters OFBool opt_uidcreation = OFFalse; OFBool opt_reversebyteorder = OFFalse; OFConsoleApplication app(OFFIS_CONSOLE_APPLICATION, "Decode RLE-compressed DICOM file", rcsid); OFCommandLine cmd; cmd.setOptionColumns(LONGCOL, SHORTCOL); cmd.setParamColumn(LONGCOL + SHORTCOL + 4); cmd.addParam("dcmfile-in", "DICOM input filename to be converted"); cmd.addParam("dcmfile-out", "DICOM output filename"); cmd.addGroup("general options:", LONGCOL, SHORTCOL + 2); cmd.addOption("--help", "-h", "print this help text and exit", OFCommandLine::AF_Exclusive); cmd.addOption("--version", "print version information and exit", OFCommandLine::AF_Exclusive); OFLog::addOptions(cmd); cmd.addGroup("input options:"); cmd.addSubGroup("input file format:"); cmd.addOption("--read-file", "+f", "read file format or data set (default)"); cmd.addOption("--read-file-only", "+fo", "read file format only"); cmd.addOption("--read-dataset", "-f", "read data set without file meta information"); cmd.addGroup("processing options:"); cmd.addSubGroup("SOP Instance UID:"); cmd.addOption("--uid-default", "+ud", "keep same SOP Instance UID (default)"); cmd.addOption("--uid-always", "+ua", "always assign new UID"); cmd.addSubGroup("RLE byte segment order:"); cmd.addOption("--byte-order-default", "+bd", "most significant byte first (default)"); cmd.addOption("--byte-order-reverse", "+br", "least significant byte first"); cmd.addGroup("output options:"); cmd.addSubGroup("output file format:"); cmd.addOption("--write-file", "+F", "write file format (default)"); cmd.addOption("--write-dataset", "-F", "write data set without file meta information"); cmd.addSubGroup("output transfer syntax:"); cmd.addOption("--write-xfer-little", "+te", "write with explicit VR little endian (default)"); cmd.addOption("--write-xfer-big", "+tb", "write with explicit VR big endian TS"); cmd.addOption("--write-xfer-implicit", "+ti", "write with implicit VR little endian TS"); cmd.addSubGroup("post-1993 value representations:"); cmd.addOption("--enable-new-vr", "+u", "enable support for new VRs (UN/UT) (default)"); cmd.addOption("--disable-new-vr", "-u", "disable support for new VRs, convert to OB"); cmd.addSubGroup("group length encoding:"); cmd.addOption("--group-length-recalc", "+g=", "recalculate group lengths if present (default)"); cmd.addOption("--group-length-create", "+g", "always write with group length elements"); cmd.addOption("--group-length-remove", "-g", "always write without group length elements"); cmd.addSubGroup("length encoding in sequences and items:"); cmd.addOption("--length-explicit", "+e", "write with explicit lengths (default)"); cmd.addOption("--length-undefined", "-e", "write with undefined lengths"); cmd.addSubGroup("data set trailing padding (not with --write-dataset):"); cmd.addOption("--padding-retain", "-p=", "do not change padding\n(default if not --write-dataset)"); cmd.addOption("--padding-off", "-p", "no padding (implicit if --write-dataset)"); cmd.addOption("--padding-create", "+p", 2, "[f]ile-pad [i]tem-pad: integer", "align file on multiple of f bytes\nand items on multiple of i bytes"); /* evaluate command line */ prepareCmdLineArgs(argc, argv, OFFIS_CONSOLE_APPLICATION); if (app.parseCommandLine(cmd, argc, argv, OFCommandLine::PF_ExpandWildcards)) { /* check exclusive options first */ if (cmd.hasExclusiveOption()) { if (cmd.findOption("--version")) { app.printHeader(OFTrue /*print host identifier*/); COUT << OFendl << "External libraries used:"; #ifdef WITH_ZLIB COUT << OFendl << "- ZLIB, Version " << zlibVersion() << OFendl; #else COUT << " none" << OFendl; #endif return 0; } } /* command line parameters */ cmd.getParam(1, opt_ifname); cmd.getParam(2, opt_ofname); OFLog::configureFromCommandLine(cmd, app); cmd.beginOptionBlock(); if (cmd.findOption("--uid-default")) opt_uidcreation = OFFalse; if (cmd.findOption("--uid-always")) opt_uidcreation = OFTrue; cmd.endOptionBlock(); cmd.beginOptionBlock(); if (cmd.findOption("--byte-order-default")) opt_reversebyteorder = OFFalse; if (cmd.findOption("--byte-order-reverse")) opt_reversebyteorder = OFTrue; cmd.endOptionBlock(); cmd.beginOptionBlock(); if (cmd.findOption("--read-file")) { opt_readMode = ERM_autoDetect; opt_ixfer = EXS_Unknown; } if (cmd.findOption("--read-file-only")) { opt_readMode = ERM_fileOnly; opt_ixfer = EXS_Unknown; } if (cmd.findOption("--read-dataset")) { opt_readMode = ERM_dataset; opt_ixfer = EXS_RLELossless; } cmd.endOptionBlock(); cmd.beginOptionBlock(); if (cmd.findOption("--write-file")) opt_writeMode = EWM_fileformat; if (cmd.findOption("--write-dataset")) opt_writeMode = EWM_dataset; cmd.endOptionBlock(); cmd.beginOptionBlock(); if (cmd.findOption("--write-xfer-little")) opt_oxfer = EXS_LittleEndianExplicit; if (cmd.findOption("--write-xfer-big")) opt_oxfer = EXS_BigEndianExplicit; if (cmd.findOption("--write-xfer-implicit")) opt_oxfer = EXS_LittleEndianImplicit; cmd.endOptionBlock(); cmd.beginOptionBlock(); if (cmd.findOption("--enable-new-vr")) { dcmEnableUnknownVRGeneration.set(OFTrue); dcmEnableUnlimitedTextVRGeneration.set(OFTrue); } if (cmd.findOption("--disable-new-vr")) { dcmEnableUnknownVRGeneration.set(OFFalse); dcmEnableUnlimitedTextVRGeneration.set(OFFalse); } cmd.endOptionBlock(); cmd.beginOptionBlock(); if (cmd.findOption("--group-length-recalc")) opt_oglenc = EGL_recalcGL; if (cmd.findOption("--group-length-create")) opt_oglenc = EGL_withGL; if (cmd.findOption("--group-length-remove")) opt_oglenc = EGL_withoutGL; cmd.endOptionBlock(); cmd.beginOptionBlock(); if (cmd.findOption("--length-explicit")) opt_oenctype = EET_ExplicitLength; if (cmd.findOption("--length-undefined")) opt_oenctype = EET_UndefinedLength; cmd.endOptionBlock(); cmd.beginOptionBlock(); if (cmd.findOption("--padding-retain")) { app.checkConflict("--padding-retain", "--write-dataset", opt_writeMode == EWM_dataset); opt_opadenc = EPD_noChange; } if (cmd.findOption("--padding-off")) opt_opadenc = EPD_withoutPadding; if (cmd.findOption("--padding-create")) { app.checkConflict("--padding-create", "--write-dataset", opt_writeMode == EWM_dataset); app.checkValue(cmd.getValueAndCheckMin(opt_filepad, 0)); app.checkValue(cmd.getValueAndCheckMin(opt_itempad, 0)); opt_opadenc = EPD_withPadding; } cmd.endOptionBlock(); } /* print resource identifier */ OFLOG_DEBUG(dcmdrleLogger, rcsid << OFendl); // register global decompression codecs DcmRLEDecoderRegistration::registerCodecs(opt_uidcreation, opt_reversebyteorder); /* make sure data dictionary is loaded */ if (!dcmDataDict.isDictionaryLoaded()) { OFLOG_WARN(dcmdrleLogger, "no data dictionary loaded, check environment variable: " << DCM_DICT_ENVIRONMENT_VARIABLE); } // open inputfile if ((opt_ifname == NULL) || (strlen(opt_ifname) == 0)) { OFLOG_FATAL(dcmdrleLogger, "invalid filename: "); return 1; } DcmFileFormat fileformat; DcmDataset * dataset = fileformat.getDataset(); OFLOG_INFO(dcmdrleLogger, "open input file " << opt_ifname); OFCondition error = fileformat.loadFile(opt_ifname, opt_ixfer, EGL_noChange, DCM_MaxReadLength, opt_readMode); if (error.bad()) { OFLOG_FATAL(dcmdrleLogger, error.text() << ": reading file: " << opt_ifname); return 1; } OFLOG_INFO(dcmdrleLogger, "decompressing file"); DcmXfer opt_oxferSyn(opt_oxfer); DcmXfer original_xfer(dataset->getOriginalXfer()); error = dataset->chooseRepresentation(opt_oxfer, NULL); if (error.bad()) { OFLOG_FATAL(dcmdrleLogger, error.text() << ": decompressing file: " << opt_ifname); if (error == EC_CannotChangeRepresentation) OFLOG_FATAL(dcmdrleLogger, "input transfer syntax " << original_xfer.getXferName() << " not supported"); return 1; } if (! dataset->canWriteXfer(opt_oxfer)) { OFLOG_FATAL(dcmdrleLogger, "no conversion to transfer syntax " << opt_oxferSyn.getXferName() << " possible"); return 1; } OFLOG_INFO(dcmdrleLogger, "create output file " << opt_ofname); // update file meta information with new SOP Instance UID if (opt_uidcreation && (opt_writeMode == EWM_fileformat)) opt_writeMode = EWM_updateMeta; fileformat.loadAllDataIntoMemory(); error = fileformat.saveFile(opt_ofname, opt_oxfer, opt_oenctype, opt_oglenc, opt_opadenc, OFstatic_cast(Uint32, opt_filepad), OFstatic_cast(Uint32, opt_itempad), opt_writeMode); if (error.bad()) { OFLOG_FATAL(dcmdrleLogger, error.text() << ": writing file: " << opt_ofname); return 1; } OFLOG_INFO(dcmdrleLogger, "conversion successful"); // deregister RLE codec DcmRLEDecoderRegistration::cleanup(); return 0; } /* * CVS/RCS Log: * $Log: dcmdrle.cc,v $ * Revision 1.23 2010-10-14 13:13:30 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.22 2009-11-13 13:20:23 joergr * Fixed minor issues in log output. * * Revision 1.21 2009-11-04 09:58:06 uli * Switched to logging mechanism provided by the "new" oflog module * * Revision 1.20 2009-08-21 09:23:37 joergr * Added parameter 'writeMode' to save/write methods which allows for specifying * whether to write a dataset or fileformat as well as whether to update the * file meta information or to create a new file meta information header. * Use helper function checkConflict() where appropriate. * * Revision 1.19 2009-08-05 10:52:49 joergr * Fixed various issues with syntax usage (e.g. layout and formatting). * * Revision 1.18 2009-04-21 14:02:49 joergr * Fixed minor inconsistencies in manpage / syntax usage. * * Revision 1.17 2009-03-19 12:07:49 joergr * Added more explicit message in case input transfer syntax is not supported. * * Revision 1.16 2008-09-25 14:38:48 joergr * Moved output of resource identifier in order to avoid printing the same * information twice. * * Revision 1.15 2008-09-25 11:19:48 joergr * Added support for printing the expanded command line arguments. * Always output the resource identifier of the command line tool in debug mode. * * Revision 1.14 2006/08/15 15:50:56 meichel * Updated all code in module dcmdata to correctly compile when * all standard C++ classes remain in namespace std. * * Revision 1.13 2006/07/27 13:52:42 joergr * Changed parameter "exclusive" of method addOption() from type OFBool into an * integer parameter "flags". Prepended prefix "PF_" to parseLine() flags. * Option "--help" is no longer an exclusive option by default. * * Revision 1.12 2005/12/08 15:40:45 meichel * Changed include path schema for all DCMTK header files * * Revision 1.11 2005/12/02 09:03:52 joergr * Added new command line option that ignores the transfer syntax specified in * the meta header and tries to detect the transfer syntax automatically from * the dataset. * * Revision 1.10 2005/11/07 17:10:19 meichel * All tools that both read and write a DICOM file now call loadAllDataIntoMemory() * to make sure they do not destroy a file when output = input. * * Revision 1.9 2005/07/26 17:08:28 meichel * Added option to RLE decoder that allows to correctly decode images with * incorrect byte order of byte segments (LSB instead of MSB). * * Revision 1.8 2005/05/26 14:52:22 meichel * Added option --read-dataset to dcmdrle that allows to decompress RLE * compressed DICOM objects that have been stored as dataset without meta-header. * Such a thing should not exist since the transfer syntax cannot be reliably * determined without meta-header, but unfortunately it does. * * Revision 1.7 2004/01/16 10:53:53 joergr * Adapted type casts to new-style typecast operators defined in ofcast.h. * * Revision 1.6 2002/11/27 12:07:16 meichel * Adapted module dcmdata to use of new header file ofstdinc.h * * Revision 1.5 2002/11/26 08:43:00 meichel * Replaced all includes for "zlib.h" with * to avoid inclusion of zlib.h in the makefile dependencies. * * Revision 1.4 2002/09/23 17:52:02 joergr * Prepared code for future support of 'config.guess' host identifiers. * * Revision 1.3 2002/09/23 13:50:40 joergr * Added new command line option "--version" which prints the name and version * number of external libraries used. * * Revision 1.2 2002/08/21 10:14:14 meichel * Adapted code to new loadFile and saveFile methods, thus removing direct * use of the DICOM stream classes. * * Revision 1.1 2002/06/06 14:52:32 meichel * Initial release of the new RLE codec classes * and the dcmcrle/dcmdrle tools in module dcmdata * * */ dcmtk-3.6.0/dcmdata/data/0000755000310500011400000000000011511320675014346 5ustar joergrdicom3dcmtk-3.6.0/dcmdata/data/dicom.dic0000644000310500011400000056136211464745072016150 0ustar joergrdicom3# # Copyright (C) 1994-2010, 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: dcmdata # # Author: Andrew Hewett, Marco Eichelberg, Joerg Riesmeier # # Purpose: # This is the global DICOM data dictionary for the dcmtk class library. # # Last Update: $Author: joergr $ # Update Date: $Date: 2010-11-05 09:11:22 $ # CVS/RCS Revision: $Revision: 1.9 $ # Status: $State: Exp $ # # This file contains the complete data dictionary from the 2009 edition # of the DICOM standard. # In addition, the data dictionary entries from the following final text # supplements and correction items have been incorporated: # - Supplement 120, 131, 144, 145, 146. # - CP 650, 988, 1010, 1024. # # Each line represents an entry in the data dictionary. Each line # has 5 fields (Tag, VR, Name, VM, Version). Entries need not be # in ascending tag order. # # Entries may override existing entries. # # Each field must be separated by a single tab. The tag values (gggg,eeee) # must be in hexedecimal and must be surrounded by parentheses. Repeating # groups are represented by indicating the range (gggg-gggg,eeee). By default # the repeating notation only represents even numbers. A range where only # odd numbers are valid is represented using the notation (gggg-o-gggg,eeee). # A range can represent both even and odd numbers using the notation # (gggg-u-gggg,eeee). The element part of the tag can also be a range. # # Comments have a '#' at the beginning of the line. # # Tag VR Name VM Version # (0000,0000) UL CommandGroupLength 1 DICOM_2009 (0000,0002) UI AffectedSOPClassUID 1 DICOM_2009 (0000,0003) UI RequestedSOPClassUID 1 DICOM_2009 (0000,0100) US CommandField 1 DICOM_2009 (0000,0110) US MessageID 1 DICOM_2009 (0000,0120) US MessageIDBeingRespondedTo 1 DICOM_2009 (0000,0600) AE MoveDestination 1 DICOM_2009 (0000,0700) US Priority 1 DICOM_2009 (0000,0800) US DataSetType 1 DICOM_2009 (0000,0900) US Status 1 DICOM_2009 (0000,0901) AT OffendingElement 1-n DICOM_2009 (0000,0902) LO ErrorComment 1 DICOM_2009 (0000,0903) US ErrorID 1 DICOM_2009 (0000,1000) UI AffectedSOPInstanceUID 1 DICOM_2009 (0000,1001) UI RequestedSOPInstanceUID 1 DICOM_2009 (0000,1002) US EventTypeID 1 DICOM_2009 (0000,1005) AT AttributeIdentifierList 1-n DICOM_2009 (0000,1008) US ActionTypeID 1 DICOM_2009 (0000,1020) US NumberOfRemainingSubOperations 1 DICOM_2009 (0000,1021) US NumberOfCompletedSubOperations 1 DICOM_2009 (0000,1022) US NumberOfFailedSubOperations 1 DICOM_2009 (0000,1023) US NumberOfWarningSubOperations 1 DICOM_2009 (0000,1030) AE MoveOriginatorApplicationEntityTitle 1 DICOM_2009 (0000,1031) US MoveOriginatorMessageID 1 DICOM_2009 (0002,0000) UL FileMetaInformationGroupLength 1 DICOM_2009 (0002,0001) OB FileMetaInformationVersion 1 DICOM_2009 (0002,0002) UI MediaStorageSOPClassUID 1 DICOM_2009 (0002,0003) UI MediaStorageSOPInstanceUID 1 DICOM_2009 (0002,0010) UI TransferSyntaxUID 1 DICOM_2009 (0002,0012) UI ImplementationClassUID 1 DICOM_2009 (0002,0013) SH ImplementationVersionName 1 DICOM_2009 (0002,0016) AE SourceApplicationEntityTitle 1 DICOM_2009 (0002,0100) UI PrivateInformationCreatorUID 1 DICOM_2009 (0002,0102) OB PrivateInformation 1 DICOM_2009 (0004,1130) CS FileSetID 1 DICOM_2009 (0004,1141) CS FileSetDescriptorFileID 1-8 DICOM_2009 (0004,1142) CS SpecificCharacterSetOfFileSetDescriptorFile 1 DICOM_2009 (0004,1200) up OffsetOfTheFirstDirectoryRecordOfTheRootDirectoryEntity 1 DICOM_2009 (0004,1202) up OffsetOfTheLastDirectoryRecordOfTheRootDirectoryEntity 1 DICOM_2009 (0004,1212) US FileSetConsistencyFlag 1 DICOM_2009 (0004,1220) SQ DirectoryRecordSequence 1 DICOM_2009 (0004,1400) up OffsetOfTheNextDirectoryRecord 1 DICOM_2009 (0004,1410) US RecordInUseFlag 1 DICOM_2009 (0004,1420) up OffsetOfReferencedLowerLevelDirectoryEntity 1 DICOM_2009 (0004,1430) CS DirectoryRecordType 1 DICOM_2009 (0004,1432) UI PrivateRecordUID 1 DICOM_2009 (0004,1500) CS ReferencedFileID 1-8 DICOM_2009 (0004,1510) UI ReferencedSOPClassUIDInFile 1 DICOM_2009 (0004,1511) UI ReferencedSOPInstanceUIDInFile 1 DICOM_2009 (0004,1512) UI ReferencedTransferSyntaxUIDInFile 1 DICOM_2009 (0004,151A) UI ReferencedRelatedGeneralSOPClassUIDInFile 1-n DICOM_2009 (0008,0005) CS SpecificCharacterSet 1-n DICOM_2009 (0008,0006) SQ LanguageCodeSequence 1 DICOM_2009 (0008,0008) CS ImageType 2-n DICOM_2009 (0008,0012) DA InstanceCreationDate 1 DICOM_2009 (0008,0013) TM InstanceCreationTime 1 DICOM_2009 (0008,0014) UI InstanceCreatorUID 1 DICOM_2009 (0008,0016) UI SOPClassUID 1 DICOM_2009 (0008,0018) UI SOPInstanceUID 1 DICOM_2009 (0008,001A) UI RelatedGeneralSOPClassUID 1-n DICOM_2009 (0008,001B) UI OriginalSpecializedSOPClassUID 1 DICOM_2009 (0008,0020) DA StudyDate 1 DICOM_2009 (0008,0021) DA SeriesDate 1 DICOM_2009 (0008,0022) DA AcquisitionDate 1 DICOM_2009 (0008,0023) DA ContentDate 1 DICOM_2009 (0008,002A) DT AcquisitionDateTime 1 DICOM_2009 (0008,0030) TM StudyTime 1 DICOM_2009 (0008,0031) TM SeriesTime 1 DICOM_2009 (0008,0032) TM AcquisitionTime 1 DICOM_2009 (0008,0033) TM ContentTime 1 DICOM_2009 (0008,0050) SH AccessionNumber 1 DICOM_2009 (0008,0051) SQ IssuerOfAccessionNumberSequence 1 DICOM_2009 (0008,0052) CS QueryRetrieveLevel 1 DICOM_2009 (0008,0054) AE RetrieveAETitle 1-n DICOM_2009 (0008,0056) CS InstanceAvailability 1 DICOM_2009 (0008,0058) UI FailedSOPInstanceUIDList 1-n DICOM_2009 (0008,0060) CS Modality 1 DICOM_2009 (0008,0061) CS ModalitiesInStudy 1-n DICOM_2009 (0008,0062) UI SOPClassesInStudy 1-n DICOM_2009 (0008,0064) CS ConversionType 1 DICOM_2009 (0008,0068) CS PresentationIntentType 1 DICOM_2009 (0008,0070) LO Manufacturer 1 DICOM_2009 (0008,0080) LO InstitutionName 1 DICOM_2009 (0008,0081) ST InstitutionAddress 1 DICOM_2009 (0008,0082) SQ InstitutionCodeSequence 1 DICOM_2009 (0008,0090) PN ReferringPhysicianName 1 DICOM_2009 (0008,0092) ST ReferringPhysicianAddress 1 DICOM_2009 (0008,0094) SH ReferringPhysicianTelephoneNumbers 1-n DICOM_2009 (0008,0096) SQ ReferringPhysicianIdentificationSequence 1 DICOM_2009 (0008,0100) SH CodeValue 1 DICOM_2009 (0008,0102) SH CodingSchemeDesignator 1 DICOM_2009 (0008,0103) SH CodingSchemeVersion 1 DICOM_2009 (0008,0104) LO CodeMeaning 1 DICOM_2009 (0008,0105) CS MappingResource 1 DICOM_2009 (0008,0106) DT ContextGroupVersion 1 DICOM_2009 (0008,0107) DT ContextGroupLocalVersion 1 DICOM_2009 (0008,010B) CS ContextGroupExtensionFlag 1 DICOM_2009 (0008,010C) UI CodingSchemeUID 1 DICOM_2009 (0008,010D) UI ContextGroupExtensionCreatorUID 1 DICOM_2009 (0008,010F) CS ContextIdentifier 1 DICOM_2009 (0008,0110) SQ CodingSchemeIdentificationSequence 1 DICOM_2009 (0008,0112) LO CodingSchemeRegistry 1 DICOM_2009 (0008,0114) ST CodingSchemeExternalID 1 DICOM_2009 (0008,0115) ST CodingSchemeName 1 DICOM_2009 (0008,0116) ST CodingSchemeResponsibleOrganization 1 DICOM_2009 (0008,0117) UI ContextUID 1 DICOM_2009 (0008,0201) SH TimezoneOffsetFromUTC 1 DICOM_2009 (0008,1010) SH StationName 1 DICOM_2009 (0008,1030) LO StudyDescription 1 DICOM_2009 (0008,1032) SQ ProcedureCodeSequence 1 DICOM_2009 (0008,103E) LO SeriesDescription 1 DICOM_2009 (0008,103F) SQ SeriesDescriptionCodeSequence 1 DICOM_2009 (0008,1040) LO InstitutionalDepartmentName 1 DICOM_2009 (0008,1048) PN PhysiciansOfRecord 1-n DICOM_2009 (0008,1049) SQ PhysiciansOfRecordIdentificationSequence 1 DICOM_2009 (0008,1050) PN PerformingPhysicianName 1-n DICOM_2009 (0008,1052) SQ PerformingPhysicianIdentificationSequence 1 DICOM_2009 (0008,1060) PN NameOfPhysiciansReadingStudy 1-n DICOM_2009 (0008,1062) SQ PhysiciansReadingStudyIdentificationSequence 1 DICOM_2009 (0008,1070) PN OperatorsName 1-n DICOM_2009 (0008,1072) SQ OperatorIdentificationSequence 1 DICOM_2009 (0008,1080) LO AdmittingDiagnosesDescription 1-n DICOM_2009 (0008,1084) SQ AdmittingDiagnosesCodeSequence 1 DICOM_2009 (0008,1090) LO ManufacturerModelName 1 DICOM_2009 (0008,1110) SQ ReferencedStudySequence 1 DICOM_2009 (0008,1111) SQ ReferencedPerformedProcedureStepSequence 1 DICOM_2009 (0008,1115) SQ ReferencedSeriesSequence 1 DICOM_2009 (0008,1120) SQ ReferencedPatientSequence 1 DICOM_2009 (0008,1125) SQ ReferencedVisitSequence 1 DICOM_2009 (0008,1134) SQ ReferencedStereometricInstanceSequence 1 DICOM_2009 (0008,113A) SQ ReferencedWaveformSequence 1 DICOM_2009 (0008,1140) SQ ReferencedImageSequence 1 DICOM_2009 (0008,114A) SQ ReferencedInstanceSequence 1 DICOM_2009 (0008,114B) SQ ReferencedRealWorldValueMappingInstanceSequence 1 DICOM_2009 (0008,1150) UI ReferencedSOPClassUID 1 DICOM_2009 (0008,1155) UI ReferencedSOPInstanceUID 1 DICOM_2009 (0008,115A) UI SOPClassesSupported 1-n DICOM_2009 (0008,1160) IS ReferencedFrameNumber 1-n DICOM_2009 (0008,1161) UL SimpleFrameList 1-n DICOM_2009 (0008,1162) UL CalculatedFrameList 3-3n DICOM_2009 (0008,1163) FD TimeRange 2 DICOM_2009 (0008,1164) SQ FrameExtractionSequence 1 DICOM_2009 (0008,1167) UI MultiFrameSourceSOPInstanceUID 1 DICOM_2009 (0008,1195) UI TransactionUID 1 DICOM_2009 (0008,1197) US FailureReason 1 DICOM_2009 (0008,1198) SQ FailedSOPSequence 1 DICOM_2009 (0008,1199) SQ ReferencedSOPSequence 1 DICOM_2009 (0008,1200) SQ StudiesContainingOtherReferencedInstancesSequence 1 DICOM_2009 (0008,1250) SQ RelatedSeriesSequence 1 DICOM_2009 (0008,2111) ST DerivationDescription 1 DICOM_2009 (0008,2112) SQ SourceImageSequence 1 DICOM_2009 (0008,2120) SH StageName 1 DICOM_2009 (0008,2122) IS StageNumber 1 DICOM_2009 (0008,2124) IS NumberOfStages 1 DICOM_2009 (0008,2127) SH ViewName 1 DICOM_2009 (0008,2128) IS ViewNumber 1 DICOM_2009 (0008,2129) IS NumberOfEventTimers 1 DICOM_2009 (0008,212A) IS NumberOfViewsInStage 1 DICOM_2009 (0008,2130) DS EventElapsedTimes 1-n DICOM_2009 (0008,2132) LO EventTimerNames 1-n DICOM_2009 (0008,2133) SQ EventTimerSequence 1 DICOM_2009 (0008,2134) FD EventTimeOffset 1 DICOM_2009 (0008,2135) SQ EventCodeSequence 1 DICOM_2009 (0008,2142) IS StartTrim 1 DICOM_2009 (0008,2143) IS StopTrim 1 DICOM_2009 (0008,2144) IS RecommendedDisplayFrameRate 1 DICOM_2009 (0008,2218) SQ AnatomicRegionSequence 1 DICOM_2009 (0008,2220) SQ AnatomicRegionModifierSequence 1 DICOM_2009 (0008,2228) SQ PrimaryAnatomicStructureSequence 1 DICOM_2009 (0008,2229) SQ AnatomicStructureSpaceOrRegionSequence 1 DICOM_2009 (0008,2230) SQ PrimaryAnatomicStructureModifierSequence 1 DICOM_2009 (0008,3001) SQ AlternateRepresentationSequence 1 DICOM_2009 (0008,3010) UI IrradiationEventUID 1 DICOM_2009 (0008,9007) CS FrameType 4 DICOM_2009 (0008,9092) SQ ReferencedImageEvidenceSequence 1 DICOM_2009 (0008,9121) SQ ReferencedRawDataSequence 1 DICOM_2009 (0008,9123) UI CreatorVersionUID 1 DICOM_2009 (0008,9124) SQ DerivationImageSequence 1 DICOM_2009 (0008,9154) SQ SourceImageEvidenceSequence 1 DICOM_2009 (0008,9205) CS PixelPresentation 1 DICOM_2009 (0008,9206) CS VolumetricProperties 1 DICOM_2009 (0008,9207) CS VolumeBasedCalculationTechnique 1 DICOM_2009 (0008,9208) CS ComplexImageComponent 1 DICOM_2009 (0008,9209) CS AcquisitionContrast 1 DICOM_2009 (0008,9215) SQ DerivationCodeSequence 1 DICOM_2009 (0008,9237) SQ ReferencedPresentationStateSequence 1 DICOM_2009 (0008,9410) SQ ReferencedOtherPlaneSequence 1 DICOM_2009 (0008,9458) SQ FrameDisplaySequence 1 DICOM_2009 (0008,9459) FL RecommendedDisplayFrameRateInFloat 1 DICOM_2009 (0008,9460) CS SkipFrameRangeFlag 1 DICOM_2009 (0010,0010) PN PatientName 1 DICOM_2009 (0010,0020) LO PatientID 1 DICOM_2009 (0010,0021) LO IssuerOfPatientID 1 DICOM_2009 (0010,0022) CS TypeOfPatientID 1 DICOM_2009 (0010,0024) SQ IssuerOfPatientIDQualifiersSequence 1 DICOM_2009 (0010,0030) DA PatientBirthDate 1 DICOM_2009 (0010,0032) TM PatientBirthTime 1 DICOM_2009 (0010,0040) CS PatientSex 1 DICOM_2009 (0010,0050) SQ PatientInsurancePlanCodeSequence 1 DICOM_2009 (0010,0101) SQ PatientPrimaryLanguageCodeSequence 1 DICOM_2009 (0010,0102) SQ PatientPrimaryLanguageModifierCodeSequence 1 DICOM_2009 (0010,1000) LO OtherPatientIDs 1-n DICOM_2009 (0010,1001) PN OtherPatientNames 1-n DICOM_2009 (0010,1002) SQ OtherPatientIDsSequence 1 DICOM_2009 (0010,1005) PN PatientBirthName 1 DICOM_2009 (0010,1010) AS PatientAge 1 DICOM_2009 (0010,1020) DS PatientSize 1 DICOM_2009 (0010,1030) DS PatientWeight 1 DICOM_2009 (0010,1040) LO PatientAddress 1 DICOM_2009 (0010,1060) PN PatientMotherBirthName 1 DICOM_2009 (0010,1080) LO MilitaryRank 1 DICOM_2009 (0010,1081) LO BranchOfService 1 DICOM_2009 (0010,1090) LO MedicalRecordLocator 1 DICOM_2009 (0010,2000) LO MedicalAlerts 1-n DICOM_2009 (0010,2110) LO Allergies 1-n DICOM_2009 (0010,2150) LO CountryOfResidence 1 DICOM_2009 (0010,2152) LO RegionOfResidence 1 DICOM_2009 (0010,2154) SH PatientTelephoneNumbers 1-n DICOM_2009 (0010,2160) SH EthnicGroup 1 DICOM_2009 (0010,2180) SH Occupation 1 DICOM_2009 (0010,21A0) CS SmokingStatus 1 DICOM_2009 (0010,21B0) LT AdditionalPatientHistory 1 DICOM_2009 (0010,21C0) US PregnancyStatus 1 DICOM_2009 (0010,21D0) DA LastMenstrualDate 1 DICOM_2009 (0010,21F0) LO PatientReligiousPreference 1 DICOM_2009 (0010,2201) LO PatientSpeciesDescription 1 DICOM_2009 (0010,2202) SQ PatientSpeciesCodeSequence 1 DICOM_2009 (0010,2203) CS PatientSexNeutered 1 DICOM_2009 (0010,2210) CS AnatomicalOrientationType 1 DICOM_2009 (0010,2292) LO PatientBreedDescription 1 DICOM_2009 (0010,2293) SQ PatientBreedCodeSequence 1 DICOM_2009 (0010,2294) SQ BreedRegistrationSequence 1 DICOM_2009 (0010,2295) LO BreedRegistrationNumber 1 DICOM_2009 (0010,2296) SQ BreedRegistryCodeSequence 1 DICOM_2009 (0010,2297) PN ResponsiblePerson 1 DICOM_2009 (0010,2298) CS ResponsiblePersonRole 1 DICOM_2009 (0010,2299) LO ResponsibleOrganization 1 DICOM_2009 (0010,4000) LT PatientComments 1 DICOM_2009 (0010,9431) FL ExaminedBodyThickness 1 DICOM_2009 (0012,0010) LO ClinicalTrialSponsorName 1 DICOM_2009 (0012,0020) LO ClinicalTrialProtocolID 1 DICOM_2009 (0012,0021) LO ClinicalTrialProtocolName 1 DICOM_2009 (0012,0030) LO ClinicalTrialSiteID 1 DICOM_2009 (0012,0031) LO ClinicalTrialSiteName 1 DICOM_2009 (0012,0040) LO ClinicalTrialSubjectID 1 DICOM_2009 (0012,0042) LO ClinicalTrialSubjectReadingID 1 DICOM_2009 (0012,0050) LO ClinicalTrialTimePointID 1 DICOM_2009 (0012,0051) ST ClinicalTrialTimePointDescription 1 DICOM_2009 (0012,0060) LO ClinicalTrialCoordinatingCenterName 1 DICOM_2009 (0012,0062) CS PatientIdentityRemoved 1 DICOM_2009 (0012,0063) LO DeidentificationMethod 1-n DICOM_2009 (0012,0064) SQ DeidentificationMethodCodeSequence 1 DICOM_2009 (0012,0071) LO ClinicalTrialSeriesID 1 DICOM_2009 (0012,0072) LO ClinicalTrialSeriesDescription 1 DICOM_2009 (0012,0081) LO ClinicalTrialProtocolEthicsCommitteeName 1 DICOM_2009 (0012,0082) LO ClinicalTrialProtocolEthicsCommitteeApprovalNumber 1 DICOM_2009 (0012,0083) SQ ConsentForClinicalTrialUseSequence 1 DICOM_2009 (0012,0084) CS DistributionType 1 DICOM_2009 (0012,0085) CS ConsentForDistributionFlag 1 DICOM_2009 (0018,0010) LO ContrastBolusAgent 1 DICOM_2009 (0018,0012) SQ ContrastBolusAgentSequence 1 DICOM_2009 (0018,0014) SQ ContrastBolusAdministrationRouteSequence 1 DICOM_2009 (0018,0015) CS BodyPartExamined 1 DICOM_2009 (0018,0020) CS ScanningSequence 1-n DICOM_2009 (0018,0021) CS SequenceVariant 1-n DICOM_2009 (0018,0022) CS ScanOptions 1-n DICOM_2009 (0018,0023) CS MRAcquisitionType 1 DICOM_2009 (0018,0024) SH SequenceName 1 DICOM_2009 (0018,0025) CS AngioFlag 1 DICOM_2009 (0018,0026) SQ InterventionDrugInformationSequence 1 DICOM_2009 (0018,0027) TM InterventionDrugStopTime 1 DICOM_2009 (0018,0028) DS InterventionDrugDose 1 DICOM_2009 (0018,0029) SQ InterventionDrugCodeSequence 1 DICOM_2009 (0018,002A) SQ AdditionalDrugSequence 1 DICOM_2009 (0018,0031) LO Radiopharmaceutical 1 DICOM_2009 (0018,0034) LO InterventionDrugName 1 DICOM_2009 (0018,0035) TM InterventionDrugStartTime 1 DICOM_2009 (0018,0036) SQ InterventionSequence 1 DICOM_2009 (0018,0038) CS InterventionStatus 1 DICOM_2009 (0018,003A) ST InterventionDescription 1 DICOM_2009 (0018,0040) IS CineRate 1 DICOM_2009 (0018,0042) CS InitialCineRunState 1 DICOM_2009 (0018,0050) DS SliceThickness 1 DICOM_2009 (0018,0060) DS KVP 1 DICOM_2009 (0018,0070) IS CountsAccumulated 1 DICOM_2009 (0018,0071) CS AcquisitionTerminationCondition 1 DICOM_2009 (0018,0072) DS EffectiveDuration 1 DICOM_2009 (0018,0073) CS AcquisitionStartCondition 1 DICOM_2009 (0018,0074) IS AcquisitionStartConditionData 1 DICOM_2009 (0018,0075) IS AcquisitionTerminationConditionData 1 DICOM_2009 (0018,0080) DS RepetitionTime 1 DICOM_2009 (0018,0081) DS EchoTime 1 DICOM_2009 (0018,0082) DS InversionTime 1 DICOM_2009 (0018,0083) DS NumberOfAverages 1 DICOM_2009 (0018,0084) DS ImagingFrequency 1 DICOM_2009 (0018,0085) SH ImagedNucleus 1 DICOM_2009 (0018,0086) IS EchoNumbers 1-n DICOM_2009 (0018,0087) DS MagneticFieldStrength 1 DICOM_2009 (0018,0088) DS SpacingBetweenSlices 1 DICOM_2009 (0018,0089) IS NumberOfPhaseEncodingSteps 1 DICOM_2009 (0018,0090) DS DataCollectionDiameter 1 DICOM_2009 (0018,0091) IS EchoTrainLength 1 DICOM_2009 (0018,0093) DS PercentSampling 1 DICOM_2009 (0018,0094) DS PercentPhaseFieldOfView 1 DICOM_2009 (0018,0095) DS PixelBandwidth 1 DICOM_2009 (0018,1000) LO DeviceSerialNumber 1 DICOM_2009 (0018,1002) UI DeviceUID 1 DICOM_2009 (0018,1003) LO DeviceID 1 DICOM_2009 (0018,1004) LO PlateID 1 DICOM_2009 (0018,1005) LO GeneratorID 1 DICOM_2009 (0018,1006) LO GridID 1 DICOM_2009 (0018,1007) LO CassetteID 1 DICOM_2009 (0018,1008) LO GantryID 1 DICOM_2009 (0018,1010) LO SecondaryCaptureDeviceID 1 DICOM_2009 (0018,1012) DA DateOfSecondaryCapture 1 DICOM_2009 (0018,1014) TM TimeOfSecondaryCapture 1 DICOM_2009 (0018,1016) LO SecondaryCaptureDeviceManufacturer 1 DICOM_2009 (0018,1018) LO SecondaryCaptureDeviceManufacturerModelName 1 DICOM_2009 (0018,1019) LO SecondaryCaptureDeviceSoftwareVersions 1-n DICOM_2009 (0018,1020) LO SoftwareVersions 1-n DICOM_2009 (0018,1022) SH VideoImageFormatAcquired 1 DICOM_2009 (0018,1023) LO DigitalImageFormatAcquired 1 DICOM_2009 (0018,1030) LO ProtocolName 1 DICOM_2009 (0018,1040) LO ContrastBolusRoute 1 DICOM_2009 (0018,1041) DS ContrastBolusVolume 1 DICOM_2009 (0018,1042) TM ContrastBolusStartTime 1 DICOM_2009 (0018,1043) TM ContrastBolusStopTime 1 DICOM_2009 (0018,1044) DS ContrastBolusTotalDose 1 DICOM_2009 (0018,1045) IS SyringeCounts 1 DICOM_2009 (0018,1046) DS ContrastFlowRate 1-n DICOM_2009 (0018,1047) DS ContrastFlowDuration 1-n DICOM_2009 (0018,1048) CS ContrastBolusIngredient 1 DICOM_2009 (0018,1049) DS ContrastBolusIngredientConcentration 1 DICOM_2009 (0018,1050) DS SpatialResolution 1 DICOM_2009 (0018,1060) DS TriggerTime 1 DICOM_2009 (0018,1061) LO TriggerSourceOrType 1 DICOM_2009 (0018,1062) IS NominalInterval 1 DICOM_2009 (0018,1063) DS FrameTime 1 DICOM_2009 (0018,1064) LO CardiacFramingType 1 DICOM_2009 (0018,1065) DS FrameTimeVector 1-n DICOM_2009 (0018,1066) DS FrameDelay 1 DICOM_2009 (0018,1067) DS ImageTriggerDelay 1 DICOM_2009 (0018,1068) DS MultiplexGroupTimeOffset 1 DICOM_2009 (0018,1069) DS TriggerTimeOffset 1 DICOM_2009 (0018,106A) CS SynchronizationTrigger 1 DICOM_2009 (0018,106C) US SynchronizationChannel 2 DICOM_2009 (0018,106E) UL TriggerSamplePosition 1 DICOM_2009 (0018,1070) LO RadiopharmaceuticalRoute 1 DICOM_2009 (0018,1071) DS RadiopharmaceuticalVolume 1 DICOM_2009 (0018,1072) TM RadiopharmaceuticalStartTime 1 DICOM_2009 (0018,1073) TM RadiopharmaceuticalStopTime 1 DICOM_2009 (0018,1074) DS RadionuclideTotalDose 1 DICOM_2009 (0018,1075) DS RadionuclideHalfLife 1 DICOM_2009 (0018,1076) DS RadionuclidePositronFraction 1 DICOM_2009 (0018,1077) DS RadiopharmaceuticalSpecificActivity 1 DICOM_2009 (0018,1078) DT RadiopharmaceuticalStartDateTime 1 DICOM_2009 (0018,1079) DT RadiopharmaceuticalStopDateTime 1 DICOM_2009 (0018,1080) CS BeatRejectionFlag 1 DICOM_2009 (0018,1081) IS LowRRValue 1 DICOM_2009 (0018,1082) IS HighRRValue 1 DICOM_2009 (0018,1083) IS IntervalsAcquired 1 DICOM_2009 (0018,1084) IS IntervalsRejected 1 DICOM_2009 (0018,1085) LO PVCRejection 1 DICOM_2009 (0018,1086) IS SkipBeats 1 DICOM_2009 (0018,1088) IS HeartRate 1 DICOM_2009 (0018,1090) IS CardiacNumberOfImages 1 DICOM_2009 (0018,1094) IS TriggerWindow 1 DICOM_2009 (0018,1100) DS ReconstructionDiameter 1 DICOM_2009 (0018,1110) DS DistanceSourceToDetector 1 DICOM_2009 (0018,1111) DS DistanceSourceToPatient 1 DICOM_2009 (0018,1114) DS EstimatedRadiographicMagnificationFactor 1 DICOM_2009 (0018,1120) DS GantryDetectorTilt 1 DICOM_2009 (0018,1121) DS GantryDetectorSlew 1 DICOM_2009 (0018,1130) DS TableHeight 1 DICOM_2009 (0018,1131) DS TableTraverse 1 DICOM_2009 (0018,1134) CS TableMotion 1 DICOM_2009 (0018,1135) DS TableVerticalIncrement 1-n DICOM_2009 (0018,1136) DS TableLateralIncrement 1-n DICOM_2009 (0018,1137) DS TableLongitudinalIncrement 1-n DICOM_2009 (0018,1138) DS TableAngle 1 DICOM_2009 (0018,113A) CS TableType 1 DICOM_2009 (0018,1140) CS RotationDirection 1 DICOM_2009 (0018,1142) DS RadialPosition 1-n DICOM_2009 (0018,1143) DS ScanArc 1 DICOM_2009 (0018,1144) DS AngularStep 1 DICOM_2009 (0018,1145) DS CenterOfRotationOffset 1 DICOM_2009 (0018,1147) CS FieldOfViewShape 1 DICOM_2009 (0018,1149) IS FieldOfViewDimensions 1-2 DICOM_2009 (0018,1150) IS ExposureTime 1 DICOM_2009 (0018,1151) IS XRayTubeCurrent 1 DICOM_2009 (0018,1152) IS Exposure 1 DICOM_2009 (0018,1153) IS ExposureInuAs 1 DICOM_2009 (0018,1154) DS AveragePulseWidth 1 DICOM_2009 (0018,1155) CS RadiationSetting 1 DICOM_2009 (0018,1156) CS RectificationType 1 DICOM_2009 (0018,115A) CS RadiationMode 1 DICOM_2009 (0018,115E) DS ImageAndFluoroscopyAreaDoseProduct 1 DICOM_2009 (0018,1160) SH FilterType 1 DICOM_2009 (0018,1161) LO TypeOfFilters 1-n DICOM_2009 (0018,1162) DS IntensifierSize 1 DICOM_2009 (0018,1164) DS ImagerPixelSpacing 2 DICOM_2009 (0018,1166) CS Grid 1-n DICOM_2009 (0018,1170) IS GeneratorPower 1 DICOM_2009 (0018,1180) SH CollimatorGridName 1 DICOM_2009 (0018,1181) CS CollimatorType 1 DICOM_2009 (0018,1182) IS FocalDistance 1-2 DICOM_2009 (0018,1183) DS XFocusCenter 1-2 DICOM_2009 (0018,1184) DS YFocusCenter 1-2 DICOM_2009 (0018,1190) DS FocalSpots 1-n DICOM_2009 (0018,1191) CS AnodeTargetMaterial 1 DICOM_2009 (0018,11A0) DS BodyPartThickness 1 DICOM_2009 (0018,11A2) DS CompressionForce 1 DICOM_2009 (0018,1200) DA DateOfLastCalibration 1-n DICOM_2009 (0018,1201) TM TimeOfLastCalibration 1-n DICOM_2009 (0018,1210) SH ConvolutionKernel 1-n DICOM_2009 (0018,1242) IS ActualFrameDuration 1 DICOM_2009 (0018,1243) IS CountRate 1 DICOM_2009 (0018,1244) US PreferredPlaybackSequencing 1 DICOM_2009 (0018,1250) SH ReceiveCoilName 1 DICOM_2009 (0018,1251) SH TransmitCoilName 1 DICOM_2009 (0018,1260) SH PlateType 1 DICOM_2009 (0018,1261) LO PhosphorType 1 DICOM_2009 (0018,1300) DS ScanVelocity 1 DICOM_2009 (0018,1301) CS WholeBodyTechnique 1-n DICOM_2009 (0018,1302) IS ScanLength 1 DICOM_2009 (0018,1310) US AcquisitionMatrix 4 DICOM_2009 (0018,1312) CS InPlanePhaseEncodingDirection 1 DICOM_2009 (0018,1314) DS FlipAngle 1 DICOM_2009 (0018,1315) CS VariableFlipAngleFlag 1 DICOM_2009 (0018,1316) DS SAR 1 DICOM_2009 (0018,1318) DS dBdt 1 DICOM_2009 (0018,1400) LO AcquisitionDeviceProcessingDescription 1 DICOM_2009 (0018,1401) LO AcquisitionDeviceProcessingCode 1 DICOM_2009 (0018,1402) CS CassetteOrientation 1 DICOM_2009 (0018,1403) CS CassetteSize 1 DICOM_2009 (0018,1404) US ExposuresOnPlate 1 DICOM_2009 (0018,1405) IS RelativeXRayExposure 1 DICOM_2009 (0018,1450) DS ColumnAngulation 1 DICOM_2009 (0018,1460) DS TomoLayerHeight 1 DICOM_2009 (0018,1470) DS TomoAngle 1 DICOM_2009 (0018,1480) DS TomoTime 1 DICOM_2009 (0018,1490) CS TomoType 1 DICOM_2009 (0018,1491) CS TomoClass 1 DICOM_2009 (0018,1495) IS NumberOfTomosynthesisSourceImages 1 DICOM_2009 (0018,1500) CS PositionerMotion 1 DICOM_2009 (0018,1508) CS PositionerType 1 DICOM_2009 (0018,1510) DS PositionerPrimaryAngle 1 DICOM_2009 (0018,1511) DS PositionerSecondaryAngle 1 DICOM_2009 (0018,1520) DS PositionerPrimaryAngleIncrement 1-n DICOM_2009 (0018,1521) DS PositionerSecondaryAngleIncrement 1-n DICOM_2009 (0018,1530) DS DetectorPrimaryAngle 1 DICOM_2009 (0018,1531) DS DetectorSecondaryAngle 1 DICOM_2009 (0018,1600) CS ShutterShape 1-3 DICOM_2009 (0018,1602) IS ShutterLeftVerticalEdge 1 DICOM_2009 (0018,1604) IS ShutterRightVerticalEdge 1 DICOM_2009 (0018,1606) IS ShutterUpperHorizontalEdge 1 DICOM_2009 (0018,1608) IS ShutterLowerHorizontalEdge 1 DICOM_2009 (0018,1610) IS CenterOfCircularShutter 2 DICOM_2009 (0018,1612) IS RadiusOfCircularShutter 1 DICOM_2009 (0018,1620) IS VerticesOfThePolygonalShutter 2-2n DICOM_2009 (0018,1622) US ShutterPresentationValue 1 DICOM_2009 (0018,1623) US ShutterOverlayGroup 1 DICOM_2009 (0018,1624) US ShutterPresentationColorCIELabValue 3 DICOM_2009 (0018,1700) CS CollimatorShape 1-3 DICOM_2009 (0018,1702) IS CollimatorLeftVerticalEdge 1 DICOM_2009 (0018,1704) IS CollimatorRightVerticalEdge 1 DICOM_2009 (0018,1706) IS CollimatorUpperHorizontalEdge 1 DICOM_2009 (0018,1708) IS CollimatorLowerHorizontalEdge 1 DICOM_2009 (0018,1710) IS CenterOfCircularCollimator 2 DICOM_2009 (0018,1712) IS RadiusOfCircularCollimator 1 DICOM_2009 (0018,1720) IS VerticesOfThePolygonalCollimator 2-2n DICOM_2009 (0018,1800) CS AcquisitionTimeSynchronized 1 DICOM_2009 (0018,1801) SH TimeSource 1 DICOM_2009 (0018,1802) CS TimeDistributionProtocol 1 DICOM_2009 (0018,1803) LO NTPSourceAddress 1 DICOM_2009 (0018,2001) IS PageNumberVector 1-n DICOM_2009 (0018,2002) SH FrameLabelVector 1-n DICOM_2009 (0018,2003) DS FramePrimaryAngleVector 1-n DICOM_2009 (0018,2004) DS FrameSecondaryAngleVector 1-n DICOM_2009 (0018,2005) DS SliceLocationVector 1-n DICOM_2009 (0018,2006) SH DisplayWindowLabelVector 1-n DICOM_2009 (0018,2010) DS NominalScannedPixelSpacing 2 DICOM_2009 (0018,2020) CS DigitizingDeviceTransportDirection 1 DICOM_2009 (0018,2030) DS RotationOfScannedFilm 1 DICOM_2009 (0018,3100) CS IVUSAcquisition 1 DICOM_2009 (0018,3101) DS IVUSPullbackRate 1 DICOM_2009 (0018,3102) DS IVUSGatedRate 1 DICOM_2009 (0018,3103) IS IVUSPullbackStartFrameNumber 1 DICOM_2009 (0018,3104) IS IVUSPullbackStopFrameNumber 1 DICOM_2009 (0018,3105) IS LesionNumber 1-n DICOM_2009 (0018,5000) SH OutputPower 1-n DICOM_2009 (0018,5010) LO TransducerData 1-n DICOM_2009 (0018,5012) DS FocusDepth 1 DICOM_2009 (0018,5020) LO ProcessingFunction 1 DICOM_2009 (0018,5022) DS MechanicalIndex 1 DICOM_2009 (0018,5024) DS BoneThermalIndex 1 DICOM_2009 (0018,5026) DS CranialThermalIndex 1 DICOM_2009 (0018,5027) DS SoftTissueThermalIndex 1 DICOM_2009 (0018,5028) DS SoftTissueFocusThermalIndex 1 DICOM_2009 (0018,5029) DS SoftTissueSurfaceThermalIndex 1 DICOM_2009 (0018,5050) IS DepthOfScanField 1 DICOM_2009 (0018,5100) CS PatientPosition 1 DICOM_2009 (0018,5101) CS ViewPosition 1 DICOM_2009 (0018,5104) SQ ProjectionEponymousNameCodeSequence 1 DICOM_2009 (0018,6000) DS Sensitivity 1 DICOM_2009 (0018,6011) SQ SequenceOfUltrasoundRegions 1 DICOM_2009 (0018,6012) US RegionSpatialFormat 1 DICOM_2009 (0018,6014) US RegionDataType 1 DICOM_2009 (0018,6016) UL RegionFlags 1 DICOM_2009 (0018,6018) UL RegionLocationMinX0 1 DICOM_2009 (0018,601A) UL RegionLocationMinY0 1 DICOM_2009 (0018,601C) UL RegionLocationMaxX1 1 DICOM_2009 (0018,601E) UL RegionLocationMaxY1 1 DICOM_2009 (0018,6020) SL ReferencePixelX0 1 DICOM_2009 (0018,6022) SL ReferencePixelY0 1 DICOM_2009 (0018,6024) US PhysicalUnitsXDirection 1 DICOM_2009 (0018,6026) US PhysicalUnitsYDirection 1 DICOM_2009 (0018,6028) FD ReferencePixelPhysicalValueX 1 DICOM_2009 (0018,602A) FD ReferencePixelPhysicalValueY 1 DICOM_2009 (0018,602C) FD PhysicalDeltaX 1 DICOM_2009 (0018,602E) FD PhysicalDeltaY 1 DICOM_2009 (0018,6030) UL TransducerFrequency 1 DICOM_2009 (0018,6031) CS TransducerType 1 DICOM_2009 (0018,6032) UL PulseRepetitionFrequency 1 DICOM_2009 (0018,6034) FD DopplerCorrectionAngle 1 DICOM_2009 (0018,6036) FD SteeringAngle 1 DICOM_2009 (0018,6039) SL DopplerSampleVolumeXPosition 1 DICOM_2009 (0018,603B) SL DopplerSampleVolumeYPosition 1 DICOM_2009 (0018,603D) SL TMLinePositionX0 1 DICOM_2009 (0018,603F) SL TMLinePositionY0 1 DICOM_2009 (0018,6041) SL TMLinePositionX1 1 DICOM_2009 (0018,6043) SL TMLinePositionY1 1 DICOM_2009 (0018,6044) US PixelComponentOrganization 1 DICOM_2009 (0018,6046) UL PixelComponentMask 1 DICOM_2009 (0018,6048) UL PixelComponentRangeStart 1 DICOM_2009 (0018,604A) UL PixelComponentRangeStop 1 DICOM_2009 (0018,604C) US PixelComponentPhysicalUnits 1 DICOM_2009 (0018,604E) US PixelComponentDataType 1 DICOM_2009 (0018,6050) UL NumberOfTableBreakPoints 1 DICOM_2009 (0018,6052) UL TableOfXBreakPoints 1-n DICOM_2009 (0018,6054) FD TableOfYBreakPoints 1-n DICOM_2009 (0018,6056) UL NumberOfTableEntries 1 DICOM_2009 (0018,6058) UL TableOfPixelValues 1-n DICOM_2009 (0018,605A) FL TableOfParameterValues 1-n DICOM_2009 (0018,6060) FL RWaveTimeVector 1-n DICOM_2009 (0018,7000) CS DetectorConditionsNominalFlag 1 DICOM_2009 (0018,7001) DS DetectorTemperature 1 DICOM_2009 (0018,7004) CS DetectorType 1 DICOM_2009 (0018,7005) CS DetectorConfiguration 1 DICOM_2009 (0018,7006) LT DetectorDescription 1 DICOM_2009 (0018,7008) LT DetectorMode 1 DICOM_2009 (0018,700A) SH DetectorID 1 DICOM_2009 (0018,700C) DA DateOfLastDetectorCalibration 1 DICOM_2009 (0018,700E) TM TimeOfLastDetectorCalibration 1 DICOM_2009 (0018,7010) IS ExposuresOnDetectorSinceLastCalibration 1 DICOM_2009 (0018,7011) IS ExposuresOnDetectorSinceManufactured 1 DICOM_2009 (0018,7012) DS DetectorTimeSinceLastExposure 1 DICOM_2009 (0018,7014) DS DetectorActiveTime 1 DICOM_2009 (0018,7016) DS DetectorActivationOffsetFromExposure 1 DICOM_2009 (0018,701A) DS DetectorBinning 2 DICOM_2009 (0018,7020) DS DetectorElementPhysicalSize 2 DICOM_2009 (0018,7022) DS DetectorElementSpacing 2 DICOM_2009 (0018,7024) CS DetectorActiveShape 1 DICOM_2009 (0018,7026) DS DetectorActiveDimensions 1-2 DICOM_2009 (0018,7028) DS DetectorActiveOrigin 2 DICOM_2009 (0018,702A) LO DetectorManufacturerName 1 DICOM_2009 (0018,702B) LO DetectorManufacturerModelName 1 DICOM_2009 (0018,7030) DS FieldOfViewOrigin 2 DICOM_2009 (0018,7032) DS FieldOfViewRotation 1 DICOM_2009 (0018,7034) CS FieldOfViewHorizontalFlip 1 DICOM_2009 (0018,7040) LT GridAbsorbingMaterial 1 DICOM_2009 (0018,7041) LT GridSpacingMaterial 1 DICOM_2009 (0018,7042) DS GridThickness 1 DICOM_2009 (0018,7044) DS GridPitch 1 DICOM_2009 (0018,7046) IS GridAspectRatio 2 DICOM_2009 (0018,7048) DS GridPeriod 1 DICOM_2009 (0018,704C) DS GridFocalDistance 1 DICOM_2009 (0018,7050) CS FilterMaterial 1-n DICOM_2009 (0018,7052) DS FilterThicknessMinimum 1-n DICOM_2009 (0018,7054) DS FilterThicknessMaximum 1-n DICOM_2009 (0018,7056) FL FilterBeamPathLengthMinimum 1-n DICOM_2009 (0018,7058) FL FilterBeamPathLengthMaximum 1-n DICOM_2009 (0018,7060) CS ExposureControlMode 1 DICOM_2009 (0018,7062) LT ExposureControlModeDescription 1 DICOM_2009 (0018,7064) CS ExposureStatus 1 DICOM_2009 (0018,7065) DS PhototimerSetting 1 DICOM_2009 (0018,8150) DS ExposureTimeInuS 1 DICOM_2009 (0018,8151) DS XRayTubeCurrentInuA 1 DICOM_2009 (0018,9004) CS ContentQualification 1 DICOM_2009 (0018,9005) SH PulseSequenceName 1 DICOM_2009 (0018,9006) SQ MRImagingModifierSequence 1 DICOM_2009 (0018,9008) CS EchoPulseSequence 1 DICOM_2009 (0018,9009) CS InversionRecovery 1 DICOM_2009 (0018,9010) CS FlowCompensation 1 DICOM_2009 (0018,9011) CS MultipleSpinEcho 1 DICOM_2009 (0018,9012) CS MultiPlanarExcitation 1 DICOM_2009 (0018,9014) CS PhaseContrast 1 DICOM_2009 (0018,9015) CS TimeOfFlightContrast 1 DICOM_2009 (0018,9016) CS Spoiling 1 DICOM_2009 (0018,9017) CS SteadyStatePulseSequence 1 DICOM_2009 (0018,9018) CS EchoPlanarPulseSequence 1 DICOM_2009 (0018,9019) FD TagAngleFirstAxis 1 DICOM_2009 (0018,9020) CS MagnetizationTransfer 1 DICOM_2009 (0018,9021) CS T2Preparation 1 DICOM_2009 (0018,9022) CS BloodSignalNulling 1 DICOM_2009 (0018,9024) CS SaturationRecovery 1 DICOM_2009 (0018,9025) CS SpectrallySelectedSuppression 1 DICOM_2009 (0018,9026) CS SpectrallySelectedExcitation 1 DICOM_2009 (0018,9027) CS SpatialPresaturation 1 DICOM_2009 (0018,9028) CS Tagging 1 DICOM_2009 (0018,9029) CS OversamplingPhase 1 DICOM_2009 (0018,9030) FD TagSpacingFirstDimension 1 DICOM_2009 (0018,9032) CS GeometryOfKSpaceTraversal 1 DICOM_2009 (0018,9033) CS SegmentedKSpaceTraversal 1 DICOM_2009 (0018,9034) CS RectilinearPhaseEncodeReordering 1 DICOM_2009 (0018,9035) FD TagThickness 1 DICOM_2009 (0018,9036) CS PartialFourierDirection 1 DICOM_2009 (0018,9037) CS CardiacSynchronizationTechnique 1 DICOM_2009 (0018,9041) LO ReceiveCoilManufacturerName 1 DICOM_2009 (0018,9042) SQ MRReceiveCoilSequence 1 DICOM_2009 (0018,9043) CS ReceiveCoilType 1 DICOM_2009 (0018,9044) CS QuadratureReceiveCoil 1 DICOM_2009 (0018,9045) SQ MultiCoilDefinitionSequence 1 DICOM_2009 (0018,9046) LO MultiCoilConfiguration 1 DICOM_2009 (0018,9047) SH MultiCoilElementName 1 DICOM_2009 (0018,9048) CS MultiCoilElementUsed 1 DICOM_2009 (0018,9049) SQ MRTransmitCoilSequence 1 DICOM_2009 (0018,9050) LO TransmitCoilManufacturerName 1 DICOM_2009 (0018,9051) CS TransmitCoilType 1 DICOM_2009 (0018,9052) FD SpectralWidth 1-2 DICOM_2009 (0018,9053) FD ChemicalShiftReference 1-2 DICOM_2009 (0018,9054) CS VolumeLocalizationTechnique 1 DICOM_2009 (0018,9058) US MRAcquisitionFrequencyEncodingSteps 1 DICOM_2009 (0018,9059) CS Decoupling 1 DICOM_2009 (0018,9060) CS DecoupledNucleus 1-2 DICOM_2009 (0018,9061) FD DecouplingFrequency 1-2 DICOM_2009 (0018,9062) CS DecouplingMethod 1 DICOM_2009 (0018,9063) FD DecouplingChemicalShiftReference 1-2 DICOM_2009 (0018,9064) CS KSpaceFiltering 1 DICOM_2009 (0018,9065) CS TimeDomainFiltering 1-2 DICOM_2009 (0018,9066) US NumberOfZeroFills 1-2 DICOM_2009 (0018,9067) CS BaselineCorrection 1 DICOM_2009 (0018,9069) FD ParallelReductionFactorInPlane 1 DICOM_2009 (0018,9070) FD CardiacRRIntervalSpecified 1 DICOM_2009 (0018,9073) FD AcquisitionDuration 1 DICOM_2009 (0018,9074) DT FrameAcquisitionDateTime 1 DICOM_2009 (0018,9075) CS DiffusionDirectionality 1 DICOM_2009 (0018,9076) SQ DiffusionGradientDirectionSequence 1 DICOM_2009 (0018,9077) CS ParallelAcquisition 1 DICOM_2009 (0018,9078) CS ParallelAcquisitionTechnique 1 DICOM_2009 (0018,9079) FD InversionTimes 1-n DICOM_2009 (0018,9080) ST MetaboliteMapDescription 1 DICOM_2009 (0018,9081) CS PartialFourier 1 DICOM_2009 (0018,9082) FD EffectiveEchoTime 1 DICOM_2009 (0018,9083) SQ MetaboliteMapCodeSequence 1 DICOM_2009 (0018,9084) SQ ChemicalShiftSequence 1 DICOM_2009 (0018,9085) CS CardiacSignalSource 1 DICOM_2009 (0018,9087) FD DiffusionBValue 1 DICOM_2009 (0018,9089) FD DiffusionGradientOrientation 3 DICOM_2009 (0018,9090) FD VelocityEncodingDirection 3 DICOM_2009 (0018,9091) FD VelocityEncodingMinimumValue 1 DICOM_2009 (0018,9093) US NumberOfKSpaceTrajectories 1 DICOM_2009 (0018,9094) CS CoverageOfKSpace 1 DICOM_2009 (0018,9095) UL SpectroscopyAcquisitionPhaseRows 1 DICOM_2009 (0018,9098) FD TransmitterFrequency 1-2 DICOM_2009 (0018,9100) CS ResonantNucleus 1-2 DICOM_2009 (0018,9101) CS FrequencyCorrection 1 DICOM_2009 (0018,9103) SQ MRSpectroscopyFOVGeometrySequence 1 DICOM_2009 (0018,9104) FD SlabThickness 1 DICOM_2009 (0018,9105) FD SlabOrientation 3 DICOM_2009 (0018,9106) FD MidSlabPosition 3 DICOM_2009 (0018,9107) SQ MRSpatialSaturationSequence 1 DICOM_2009 (0018,9112) SQ MRTimingAndRelatedParametersSequence 1 DICOM_2009 (0018,9114) SQ MREchoSequence 1 DICOM_2009 (0018,9115) SQ MRModifierSequence 1 DICOM_2009 (0018,9117) SQ MRDiffusionSequence 1 DICOM_2009 (0018,9118) SQ CardiacSynchronizationSequence 1 DICOM_2009 (0018,9119) SQ MRAveragesSequence 1 DICOM_2009 (0018,9125) SQ MRFOVGeometrySequence 1 DICOM_2009 (0018,9126) SQ VolumeLocalizationSequence 1 DICOM_2009 (0018,9127) UL SpectroscopyAcquisitionDataColumns 1 DICOM_2009 (0018,9147) CS DiffusionAnisotropyType 1 DICOM_2009 (0018,9151) DT FrameReferenceDateTime 1 DICOM_2009 (0018,9152) SQ MRMetaboliteMapSequence 1 DICOM_2009 (0018,9155) FD ParallelReductionFactorOutOfPlane 1 DICOM_2009 (0018,9159) UL SpectroscopyAcquisitionOutOfPlanePhaseSteps 1 DICOM_2009 (0018,9168) FD ParallelReductionFactorSecondInPlane 1 DICOM_2009 (0018,9169) CS CardiacBeatRejectionTechnique 1 DICOM_2009 (0018,9170) CS RespiratoryMotionCompensationTechnique 1 DICOM_2009 (0018,9171) CS RespiratorySignalSource 1 DICOM_2009 (0018,9172) CS BulkMotionCompensationTechnique 1 DICOM_2009 (0018,9173) CS BulkMotionSignalSource 1 DICOM_2009 (0018,9174) CS ApplicableSafetyStandardAgency 1 DICOM_2009 (0018,9175) LO ApplicableSafetyStandardDescription 1 DICOM_2009 (0018,9176) SQ OperatingModeSequence 1 DICOM_2009 (0018,9177) CS OperatingModeType 1 DICOM_2009 (0018,9178) CS OperatingMode 1 DICOM_2009 (0018,9179) CS SpecificAbsorptionRateDefinition 1 DICOM_2009 (0018,9180) CS GradientOutputType 1 DICOM_2009 (0018,9181) FD SpecificAbsorptionRateValue 1 DICOM_2009 (0018,9182) FD GradientOutput 1 DICOM_2009 (0018,9183) CS FlowCompensationDirection 1 DICOM_2009 (0018,9184) FD TaggingDelay 1 DICOM_2009 (0018,9185) ST RespiratoryMotionCompensationTechniqueDescription 1 DICOM_2009 (0018,9186) SH RespiratorySignalSourceID 1 DICOM_2009 (0018,9197) SQ MRVelocityEncodingSequence 1 DICOM_2009 (0018,9198) CS FirstOrderPhaseCorrection 1 DICOM_2009 (0018,9199) CS WaterReferencedPhaseCorrection 1 DICOM_2009 (0018,9200) CS MRSpectroscopyAcquisitionType 1 DICOM_2009 (0018,9214) CS RespiratoryCyclePosition 1 DICOM_2009 (0018,9217) FD VelocityEncodingMaximumValue 1 DICOM_2009 (0018,9218) FD TagSpacingSecondDimension 1 DICOM_2009 (0018,9219) SS TagAngleSecondAxis 1 DICOM_2009 (0018,9220) FD FrameAcquisitionDuration 1 DICOM_2009 (0018,9226) SQ MRImageFrameTypeSequence 1 DICOM_2009 (0018,9227) SQ MRSpectroscopyFrameTypeSequence 1 DICOM_2009 (0018,9231) US MRAcquisitionPhaseEncodingStepsInPlane 1 DICOM_2009 (0018,9232) US MRAcquisitionPhaseEncodingStepsOutOfPlane 1 DICOM_2009 (0018,9234) UL SpectroscopyAcquisitionPhaseColumns 1 DICOM_2009 (0018,9236) CS CardiacCyclePosition 1 DICOM_2009 (0018,9239) SQ SpecificAbsorptionRateSequence 1 DICOM_2009 (0018,9240) US RFEchoTrainLength 1 DICOM_2009 (0018,9241) US GradientEchoTrainLength 1 DICOM_2009 (0018,9295) FD ChemicalShiftMinimumIntegrationLimitInppm 1 DICOM_2009 (0018,9296) FD ChemicalShiftMaximumIntegrationLimitInppm 1 DICOM_2009 (0018,9301) SQ CTAcquisitionTypeSequence 1 DICOM_2009 (0018,9302) CS AcquisitionType 1 DICOM_2009 (0018,9303) FD TubeAngle 1 DICOM_2009 (0018,9304) SQ CTAcquisitionDetailsSequence 1 DICOM_2009 (0018,9305) FD RevolutionTime 1 DICOM_2009 (0018,9306) FD SingleCollimationWidth 1 DICOM_2009 (0018,9307) FD TotalCollimationWidth 1 DICOM_2009 (0018,9308) SQ CTTableDynamicsSequence 1 DICOM_2009 (0018,9309) FD TableSpeed 1 DICOM_2009 (0018,9310) FD TableFeedPerRotation 1 DICOM_2009 (0018,9311) FD SpiralPitchFactor 1 DICOM_2009 (0018,9312) SQ CTGeometrySequence 1 DICOM_2009 (0018,9313) FD DataCollectionCenterPatient 3 DICOM_2009 (0018,9314) SQ CTReconstructionSequence 1 DICOM_2009 (0018,9315) CS ReconstructionAlgorithm 1 DICOM_2009 (0018,9316) CS ConvolutionKernelGroup 1 DICOM_2009 (0018,9317) FD ReconstructionFieldOfView 2 DICOM_2009 (0018,9318) FD ReconstructionTargetCenterPatient 3 DICOM_2009 (0018,9319) FD ReconstructionAngle 1 DICOM_2009 (0018,9320) SH ImageFilter 1 DICOM_2009 (0018,9321) SQ CTExposureSequence 1 DICOM_2009 (0018,9322) FD ReconstructionPixelSpacing 2 DICOM_2009 (0018,9323) CS ExposureModulationType 1 DICOM_2009 (0018,9324) FD EstimatedDoseSaving 1 DICOM_2009 (0018,9325) SQ CTXRayDetailsSequence 1 DICOM_2009 (0018,9326) SQ CTPositionSequence 1 DICOM_2009 (0018,9327) FD TablePosition 1 DICOM_2009 (0018,9328) FD ExposureTimeInms 1 DICOM_2009 (0018,9329) SQ CTImageFrameTypeSequence 1 DICOM_2009 (0018,9330) FD XRayTubeCurrentInmA 1 DICOM_2009 (0018,9332) FD ExposureInmAs 1 DICOM_2009 (0018,9333) CS ConstantVolumeFlag 1 DICOM_2009 (0018,9334) CS FluoroscopyFlag 1 DICOM_2009 (0018,9335) FD DistanceSourceToDataCollectionCenter 1 DICOM_2009 (0018,9337) US ContrastBolusAgentNumber 1 DICOM_2009 (0018,9338) SQ ContrastBolusIngredientCodeSequence 1 DICOM_2009 (0018,9340) SQ ContrastAdministrationProfileSequence 1 DICOM_2009 (0018,9341) SQ ContrastBolusUsageSequence 1 DICOM_2009 (0018,9342) CS ContrastBolusAgentAdministered 1 DICOM_2009 (0018,9343) CS ContrastBolusAgentDetected 1 DICOM_2009 (0018,9344) CS ContrastBolusAgentPhase 1 DICOM_2009 (0018,9345) FD CTDIvol 1 DICOM_2009 (0018,9346) SQ CTDIPhantomTypeCodeSequence 1 DICOM_2009 (0018,9351) FL CalciumScoringMassFactorPatient 1 DICOM_2009 (0018,9352) FL CalciumScoringMassFactorDevice 3 DICOM_2009 (0018,9353) FL EnergyWeightingFactor 1 DICOM_2009 (0018,9360) SQ CTAdditionalXRaySourceSequence 1 DICOM_2009 (0018,9401) SQ ProjectionPixelCalibrationSequence 1 DICOM_2009 (0018,9402) FL DistanceSourceToIsocenter 1 DICOM_2009 (0018,9403) FL DistanceObjectToTableTop 1 DICOM_2009 (0018,9404) FL ObjectPixelSpacingInCenterOfBeam 2 DICOM_2009 (0018,9405) SQ PositionerPositionSequence 1 DICOM_2009 (0018,9406) SQ TablePositionSequence 1 DICOM_2009 (0018,9407) SQ CollimatorShapeSequence 1 DICOM_2009 (0018,9412) SQ XAXRFFrameCharacteristicsSequence 1 DICOM_2009 (0018,9417) SQ FrameAcquisitionSequence 1 DICOM_2009 (0018,9420) CS XRayReceptorType 1 DICOM_2009 (0018,9423) LO AcquisitionProtocolName 1 DICOM_2009 (0018,9424) LT AcquisitionProtocolDescription 1 DICOM_2009 (0018,9425) CS ContrastBolusIngredientOpaque 1 DICOM_2009 (0018,9426) FL DistanceReceptorPlaneToDetectorHousing 1 DICOM_2009 (0018,9427) CS IntensifierActiveShape 1 DICOM_2009 (0018,9428) FL IntensifierActiveDimensions 1-2 DICOM_2009 (0018,9429) FL PhysicalDetectorSize 2 DICOM_2009 (0018,9430) US PositionOfIsocenterProjection 2 DICOM_2009 (0018,9432) SQ FieldOfViewSequence 1 DICOM_2009 (0018,9433) LO FieldOfViewDescription 1 DICOM_2009 (0018,9434) SQ ExposureControlSensingRegionsSequence 1 DICOM_2009 (0018,9435) CS ExposureControlSensingRegionShape 1 DICOM_2009 (0018,9436) SS ExposureControlSensingRegionLeftVerticalEdge 1 DICOM_2009 (0018,9437) SS ExposureControlSensingRegionRightVerticalEdge 1 DICOM_2009 (0018,9438) SS ExposureControlSensingRegionUpperHorizontalEdge 1 DICOM_2009 (0018,9439) SS ExposureControlSensingRegionLowerHorizontalEdge 1 DICOM_2009 (0018,9440) SS CenterOfCircularExposureControlSensingRegion 2 DICOM_2009 (0018,9441) US RadiusOfCircularExposureControlSensingRegion 1 DICOM_2009 (0018,9442) SS VerticesOfThePolygonalExposureControlSensingRegion 2-n DICOM_2009 (0018,9447) FL ColumnAngulationPatient 1 DICOM_2009 (0018,9449) FL BeamAngle 1 DICOM_2009 (0018,9451) SQ FrameDetectorParametersSequence 1 DICOM_2009 (0018,9452) FL CalculatedAnatomyThickness 1 DICOM_2009 (0018,9455) SQ CalibrationSequence 1 DICOM_2009 (0018,9456) SQ ObjectThicknessSequence 1 DICOM_2009 (0018,9457) CS PlaneIdentification 1 DICOM_2009 (0018,9461) FL FieldOfViewDimensionsInFloat 1-2 DICOM_2009 (0018,9462) SQ IsocenterReferenceSystemSequence 1 DICOM_2009 (0018,9463) FL PositionerIsocenterPrimaryAngle 1 DICOM_2009 (0018,9464) FL PositionerIsocenterSecondaryAngle 1 DICOM_2009 (0018,9465) FL PositionerIsocenterDetectorRotationAngle 1 DICOM_2009 (0018,9466) FL TableXPositionToIsocenter 1 DICOM_2009 (0018,9467) FL TableYPositionToIsocenter 1 DICOM_2009 (0018,9468) FL TableZPositionToIsocenter 1 DICOM_2009 (0018,9469) FL TableHorizontalRotationAngle 1 DICOM_2009 (0018,9470) FL TableHeadTiltAngle 1 DICOM_2009 (0018,9471) FL TableCradleTiltAngle 1 DICOM_2009 (0018,9472) SQ FrameDisplayShutterSequence 1 DICOM_2009 (0018,9473) FL AcquiredImageAreaDoseProduct 1 DICOM_2009 (0018,9474) CS CArmPositionerTabletopRelationship 1 DICOM_2009 (0018,9476) SQ XRayGeometrySequence 1 DICOM_2009 (0018,9477) SQ IrradiationEventIdentificationSequence 1 DICOM_2009 (0018,9504) SQ XRay3DFrameTypeSequence 1 DICOM_2009 (0018,9506) SQ ContributingSourcesSequence 1 DICOM_2009 (0018,9507) SQ XRay3DAcquisitionSequence 1 DICOM_2009 (0018,9508) FL PrimaryPositionerScanArc 1 DICOM_2009 (0018,9509) FL SecondaryPositionerScanArc 1 DICOM_2009 (0018,9510) FL PrimaryPositionerScanStartAngle 1 DICOM_2009 (0018,9511) FL SecondaryPositionerScanStartAngle 1 DICOM_2009 (0018,9514) FL PrimaryPositionerIncrement 1 DICOM_2009 (0018,9515) FL SecondaryPositionerIncrement 1 DICOM_2009 (0018,9516) DT StartAcquisitionDateTime 1 DICOM_2009 (0018,9517) DT EndAcquisitionDateTime 1 DICOM_2009 (0018,9524) LO ApplicationName 1 DICOM_2009 (0018,9525) LO ApplicationVersion 1 DICOM_2009 (0018,9526) LO ApplicationManufacturer 1 DICOM_2009 (0018,9527) CS AlgorithmType 1 DICOM_2009 (0018,9528) LO AlgorithmDescription 1 DICOM_2009 (0018,9530) SQ XRay3DReconstructionSequence 1 DICOM_2009 (0018,9531) LO ReconstructionDescription 1 DICOM_2009 (0018,9538) SQ PerProjectionAcquisitionSequence 1 DICOM_2009 (0018,9601) SQ DiffusionBMatrixSequence 1 DICOM_2009 (0018,9602) FD DiffusionBValueXX 1 DICOM_2009 (0018,9603) FD DiffusionBValueXY 1 DICOM_2009 (0018,9604) FD DiffusionBValueXZ 1 DICOM_2009 (0018,9605) FD DiffusionBValueYY 1 DICOM_2009 (0018,9606) FD DiffusionBValueYZ 1 DICOM_2009 (0018,9607) FD DiffusionBValueZZ 1 DICOM_2009 (0018,9701) DT DecayCorrectionDateTime 1 DICOM_2009 (0018,9715) FD StartDensityThreshold 1 DICOM_2009 (0018,9716) FD StartRelativeDensityDifferenceThreshold 1 DICOM_2009 (0018,9717) FD StartCardiacTriggerCountThreshold 1 DICOM_2009 (0018,9718) FD StartRespiratoryTriggerCountThreshold 1 DICOM_2009 (0018,9719) FD TerminationCountsThreshold 1 DICOM_2009 (0018,9720) FD TerminationDensityThreshold 1 DICOM_2009 (0018,9721) FD TerminationRelativeDensityThreshold 1 DICOM_2009 (0018,9722) FD TerminationTimeThreshold 1 DICOM_2009 (0018,9723) FD TerminationCardiacTriggerCountThreshold 1 DICOM_2009 (0018,9724) FD TerminationRespiratoryTriggerCountThreshold 1 DICOM_2009 (0018,9725) CS DetectorGeometry 1 DICOM_2009 (0018,9726) FD TransverseDetectorSeparation 1 DICOM_2009 (0018,9727) FD AxialDetectorDimension 1 DICOM_2009 (0018,9729) US RadiopharmaceuticalAgentNumber 1 DICOM_2009 (0018,9732) SQ PETFrameAcquisitionSequence 1 DICOM_2009 (0018,9733) SQ PETDetectorMotionDetailsSequence 1 DICOM_2009 (0018,9734) SQ PETTableDynamicsSequence 1 DICOM_2009 (0018,9735) SQ PETPositionSequence 1 DICOM_2009 (0018,9736) SQ PETFrameCorrectionFactorsSequence 1 DICOM_2009 (0018,9737) SQ RadiopharmaceuticalUsageSequence 1 DICOM_2009 (0018,9738) CS AttenuationCorrectionSource 1 DICOM_2009 (0018,9739) US NumberOfIterations 1 DICOM_2009 (0018,9740) US NumberOfSubsets 1 DICOM_2009 (0018,9749) SQ PETReconstructionSequence 1 DICOM_2009 (0018,9751) SQ PETFrameTypeSequence 1 DICOM_2009 (0018,9755) CS TimeOfFlightInformationUsed 1 DICOM_2009 (0018,9756) CS ReconstructionType 1 DICOM_2009 (0018,9758) CS DecayCorrected 1 DICOM_2009 (0018,9759) CS AttenuationCorrected 1 DICOM_2009 (0018,9760) CS ScatterCorrected 1 DICOM_2009 (0018,9761) CS DeadTimeCorrected 1 DICOM_2009 (0018,9762) CS GantryMotionCorrected 1 DICOM_2009 (0018,9763) CS PatientMotionCorrected 1 DICOM_2009 (0018,9764) CS CountLossNormalizationCorrected 1 DICOM_2009 (0018,9765) CS RandomsCorrected 1 DICOM_2009 (0018,9766) CS NonUniformRadialSamplingCorrected 1 DICOM_2009 (0018,9767) CS SensitivityCalibrated 1 DICOM_2009 (0018,9768) CS DetectorNormalizationCorrection 1 DICOM_2009 (0018,9769) CS IterativeReconstructionMethod 1 DICOM_2009 (0018,9770) CS AttenuationCorrectionTemporalRelationship 1 DICOM_2009 (0018,9771) SQ PatientPhysiologicalStateSequence 1 DICOM_2009 (0018,9772) SQ PatientPhysiologicalStateCodeSequence 1 DICOM_2009 (0018,9801) FD DepthsOfFocus 1-n DICOM_2009 (0018,9803) SQ ExcludedIntervalsSequence 1 DICOM_2009 (0018,9804) DT ExclusionStartDatetime 1 DICOM_2009 (0018,9805) FD ExclusionDuration 1 DICOM_2009 (0018,9806) SQ USImageDescriptionSequence 1 DICOM_2009 (0018,9807) SQ ImageDataTypeSequence 1 DICOM_2009 (0018,9808) CS DataType 1 DICOM_2009 (0018,9809) SQ TransducerScanPatternCodeSequence 1 DICOM_2009 (0018,980B) CS AliasedDataType 1 DICOM_2009 (0018,980C) CS PositionMeasuringDeviceUsed 1 DICOM_2009 (0018,980D) SQ TransducerGeometryCodeSequence 1 DICOM_2009 (0018,980E) SQ TransducerBeamSteeringCodeSequence 1 DICOM_2009 (0018,980F) SQ TransducerApplicationCodeSequence 1 DICOM_2009 (0018,A001) SQ ContributingEquipmentSequence 1 DICOM_2009 (0018,A002) DT ContributionDateTime 1 DICOM_2009 (0018,A003) ST ContributionDescription 1 DICOM_2009 (0020,000D) UI StudyInstanceUID 1 DICOM_2009 (0020,000E) UI SeriesInstanceUID 1 DICOM_2009 (0020,0010) SH StudyID 1 DICOM_2009 (0020,0011) IS SeriesNumber 1 DICOM_2009 (0020,0012) IS AcquisitionNumber 1 DICOM_2009 (0020,0013) IS InstanceNumber 1 DICOM_2009 (0020,0019) IS ItemNumber 1 DICOM_2009 (0020,0020) CS PatientOrientation 2 DICOM_2009 (0020,0032) DS ImagePositionPatient 3 DICOM_2009 (0020,0037) DS ImageOrientationPatient 6 DICOM_2009 (0020,0052) UI FrameOfReferenceUID 1 DICOM_2009 (0020,0060) CS Laterality 1 DICOM_2009 (0020,0062) CS ImageLaterality 1 DICOM_2009 (0020,0100) IS TemporalPositionIdentifier 1 DICOM_2009 (0020,0105) IS NumberOfTemporalPositions 1 DICOM_2009 (0020,0110) DS TemporalResolution 1 DICOM_2009 (0020,0200) UI SynchronizationFrameOfReferenceUID 1 DICOM_2009 (0020,0242) UI SOPInstanceUIDOfConcatenationSource 1 DICOM_2009 (0020,1002) IS ImagesInAcquisition 1 DICOM_2009 (0020,1040) LO PositionReferenceIndicator 1 DICOM_2009 (0020,1041) DS SliceLocation 1 DICOM_2009 (0020,1200) IS NumberOfPatientRelatedStudies 1 DICOM_2009 (0020,1202) IS NumberOfPatientRelatedSeries 1 DICOM_2009 (0020,1204) IS NumberOfPatientRelatedInstances 1 DICOM_2009 (0020,1206) IS NumberOfStudyRelatedSeries 1 DICOM_2009 (0020,1208) IS NumberOfStudyRelatedInstances 1 DICOM_2009 (0020,1209) IS NumberOfSeriesRelatedInstances 1 DICOM_2009 (0020,4000) LT ImageComments 1 DICOM_2009 (0020,9056) SH StackID 1 DICOM_2009 (0020,9057) UL InStackPositionNumber 1 DICOM_2009 (0020,9071) SQ FrameAnatomySequence 1 DICOM_2009 (0020,9072) CS FrameLaterality 1 DICOM_2009 (0020,9111) SQ FrameContentSequence 1 DICOM_2009 (0020,9113) SQ PlanePositionSequence 1 DICOM_2009 (0020,9116) SQ PlaneOrientationSequence 1 DICOM_2009 (0020,9128) UL TemporalPositionIndex 1 DICOM_2009 (0020,9153) FD NominalCardiacTriggerDelayTime 1 DICOM_2009 (0020,9156) US FrameAcquisitionNumber 1 DICOM_2009 (0020,9157) UL DimensionIndexValues 1-n DICOM_2009 (0020,9158) LT FrameComments 1 DICOM_2009 (0020,9161) UI ConcatenationUID 1 DICOM_2009 (0020,9162) US InConcatenationNumber 1 DICOM_2009 (0020,9163) US InConcatenationTotalNumber 1 DICOM_2009 (0020,9164) UI DimensionOrganizationUID 1 DICOM_2009 (0020,9165) AT DimensionIndexPointer 1 DICOM_2009 (0020,9167) AT FunctionalGroupPointer 1 DICOM_2009 (0020,9213) LO DimensionIndexPrivateCreator 1 DICOM_2009 (0020,9221) SQ DimensionOrganizationSequence 1 DICOM_2009 (0020,9222) SQ DimensionIndexSequence 1 DICOM_2009 (0020,9228) UL ConcatenationFrameOffsetNumber 1 DICOM_2009 (0020,9238) LO FunctionalGroupPrivateCreator 1 DICOM_2009 (0020,9241) FL NominalPercentageOfCardiacPhase 1 DICOM_2009 (0020,9245) FL NominalPercentageOfRespiratoryPhase 1 DICOM_2009 (0020,9246) FL StartingRespiratoryAmplitude 1 DICOM_2009 (0020,9247) CS StartingRespiratoryPhase 1 DICOM_2009 (0020,9248) FL EndingRespiratoryAmplitude 1 DICOM_2009 (0020,9249) CS EndingRespiratoryPhase 1 DICOM_2009 (0020,9250) CS RespiratoryTriggerType 1 DICOM_2009 (0020,9251) FD RRIntervalTimeNominal 1 DICOM_2009 (0020,9252) FD ActualCardiacTriggerDelayTime 1 DICOM_2009 (0020,9253) SQ RespiratorySynchronizationSequence 1 DICOM_2009 (0020,9254) FD RespiratoryIntervalTime 1 DICOM_2009 (0020,9255) FD NominalRespiratoryTriggerDelayTime 1 DICOM_2009 (0020,9256) FD RespiratoryTriggerDelayThreshold 1 DICOM_2009 (0020,9257) FD ActualRespiratoryTriggerDelayTime 1 DICOM_2009 (0020,9301) FD ImagePositionVolume 3 DICOM_2009 (0020,9302) FD ImageOrientationVolume 6 DICOM_2009 (0020,9307) CS UltrasoundAcquisitionGeometry 1 DICOM_2009 (0020,9308) FD ApexPosition 3 DICOM_2009 (0020,9309) FD VolumeToTransducerMappingMatrix 16 DICOM_2009 (0020,930A) FD VolumeToTableMappingMatrix 16 DICOM_2009 (0020,930C) CS PatientFrameOfReferenceSource 1 DICOM_2009 (0020,930D) FD TemporalPositionTimeOffset 1 DICOM_2009 (0020,930E) SQ PlanePositionVolumeSequence 1 DICOM_2009 (0020,930F) SQ PlaneOrientationVolumeSequence 1 DICOM_2009 (0020,9310) SQ TemporalPositionSequence 1 DICOM_2009 (0020,9311) CS DimensionOrganizationType 1 DICOM_2009 (0020,9312) UI VolumeFrameOfReferenceUID 1 DICOM_2009 (0020,9313) UI TableFrameOfReferenceUID 1 DICOM_2009 (0020,9421) LO DimensionDescriptionLabel 1 DICOM_2009 (0020,9450) SQ PatientOrientationInFrameSequence 1 DICOM_2009 (0020,9453) LO FrameLabel 1 DICOM_2009 (0020,9518) US AcquisitionIndex 1-n DICOM_2009 (0020,9529) SQ ContributingSOPInstancesReferenceSequence 1 DICOM_2009 (0020,9536) US ReconstructionIndex 1 DICOM_2009 (0022,0001) US LightPathFilterPassThroughWavelength 1 DICOM_2009 (0022,0002) US LightPathFilterPassBand 2 DICOM_2009 (0022,0003) US ImagePathFilterPassThroughWavelength 1 DICOM_2009 (0022,0004) US ImagePathFilterPassBand 2 DICOM_2009 (0022,0005) CS PatientEyeMovementCommanded 1 DICOM_2009 (0022,0006) SQ PatientEyeMovementCommandCodeSequence 1 DICOM_2009 (0022,0007) FL SphericalLensPower 1 DICOM_2009 (0022,0008) FL CylinderLensPower 1 DICOM_2009 (0022,0009) FL CylinderAxis 1 DICOM_2009 (0022,000A) FL EmmetropicMagnification 1 DICOM_2009 (0022,000B) FL IntraOcularPressure 1 DICOM_2009 (0022,000C) FL HorizontalFieldOfView 1 DICOM_2009 (0022,000D) CS PupilDilated 1 DICOM_2009 (0022,000E) FL DegreeOfDilation 1 DICOM_2009 (0022,0010) FL StereoBaselineAngle 1 DICOM_2009 (0022,0011) FL StereoBaselineDisplacement 1 DICOM_2009 (0022,0012) FL StereoHorizontalPixelOffset 1 DICOM_2009 (0022,0013) FL StereoVerticalPixelOffset 1 DICOM_2009 (0022,0014) FL StereoRotation 1 DICOM_2009 (0022,0015) SQ AcquisitionDeviceTypeCodeSequence 1 DICOM_2009 (0022,0016) SQ IlluminationTypeCodeSequence 1 DICOM_2009 (0022,0017) SQ LightPathFilterTypeStackCodeSequence 1 DICOM_2009 (0022,0018) SQ ImagePathFilterTypeStackCodeSequence 1 DICOM_2009 (0022,0019) SQ LensesCodeSequence 1 DICOM_2009 (0022,001A) SQ ChannelDescriptionCodeSequence 1 DICOM_2009 (0022,001B) SQ RefractiveStateSequence 1 DICOM_2009 (0022,001C) SQ MydriaticAgentCodeSequence 1 DICOM_2009 (0022,001D) SQ RelativeImagePositionCodeSequence 1 DICOM_2009 (0022,0020) SQ StereoPairsSequence 1 DICOM_2009 (0022,0021) SQ LeftImageSequence 1 DICOM_2009 (0022,0022) SQ RightImageSequence 1 DICOM_2009 (0022,0030) FL AxialLengthOfTheEye 1 DICOM_2009 (0022,0031) SQ OphthalmicFrameLocationSequence 1 DICOM_2009 (0022,0032) FL ReferenceCoordinates 2-2n DICOM_2009 (0022,0035) FL DepthSpatialResolution 1 DICOM_2009 (0022,0036) FL MaximumDepthDistortion 1 DICOM_2009 (0022,0037) FL AlongScanSpatialResolution 1 DICOM_2009 (0022,0038) FL MaximumAlongScanDistortion 1 DICOM_2009 (0022,0039) CS OphthalmicImageOrientation 1 DICOM_2009 (0022,0041) FL DepthOfTransverseImage 1 DICOM_2009 (0022,0042) SQ MydriaticAgentConcentrationUnitsSequence 1 DICOM_2009 (0022,0048) FL AcrossScanSpatialResolution 1 DICOM_2009 (0022,0049) FL MaximumAcrossScanDistortion 1 DICOM_2009 (0022,004E) DS MydriaticAgentConcentration 1 DICOM_2009 (0022,0055) FL IlluminationWaveLength 1 DICOM_2009 (0022,0056) FL IlluminationPower 1 DICOM_2009 (0022,0057) FL IlluminationBandwidth 1 DICOM_2009 (0022,0058) SQ MydriaticAgentSequence 1 DICOM_2009 (0028,0002) US SamplesPerPixel 1 DICOM_2009 (0028,0003) US SamplesPerPixelUsed 1 DICOM_2009 (0028,0004) CS PhotometricInterpretation 1 DICOM_2009 (0028,0006) US PlanarConfiguration 1 DICOM_2009 (0028,0008) IS NumberOfFrames 1 DICOM_2009 (0028,0009) AT FrameIncrementPointer 1-n DICOM_2009 (0028,000A) AT FrameDimensionPointer 1-n DICOM_2009 (0028,0010) US Rows 1 DICOM_2009 (0028,0011) US Columns 1 DICOM_2009 (0028,0014) US UltrasoundColorDataPresent 1 DICOM_2009 (0028,0030) DS PixelSpacing 2 DICOM_2009 (0028,0031) DS ZoomFactor 2 DICOM_2009 (0028,0032) DS ZoomCenter 2 DICOM_2009 (0028,0034) IS PixelAspectRatio 2 DICOM_2009 (0028,0051) CS CorrectedImage 1-n DICOM_2009 (0028,0100) US BitsAllocated 1 DICOM_2009 (0028,0101) US BitsStored 1 DICOM_2009 (0028,0102) US HighBit 1 DICOM_2009 (0028,0103) US PixelRepresentation 1 DICOM_2009 (0028,0106) xs SmallestImagePixelValue 1 DICOM_2009 (0028,0107) xs LargestImagePixelValue 1 DICOM_2009 (0028,0108) xs SmallestPixelValueInSeries 1 DICOM_2009 (0028,0109) xs LargestPixelValueInSeries 1 DICOM_2009 (0028,0120) xs PixelPaddingValue 1 DICOM_2009 (0028,0121) xs PixelPaddingRangeLimit 1 DICOM_2009 (0028,0300) CS QualityControlImage 1 DICOM_2009 (0028,0301) CS BurnedInAnnotation 1 DICOM_2009 (0028,0A02) CS PixelSpacingCalibrationType 1 DICOM_2009 (0028,0A04) LO PixelSpacingCalibrationDescription 1 DICOM_2009 (0028,1040) CS PixelIntensityRelationship 1 DICOM_2009 (0028,1041) SS PixelIntensityRelationshipSign 1 DICOM_2009 (0028,1050) DS WindowCenter 1-n DICOM_2009 (0028,1051) DS WindowWidth 1-n DICOM_2009 (0028,1052) DS RescaleIntercept 1 DICOM_2009 (0028,1053) DS RescaleSlope 1 DICOM_2009 (0028,1054) LO RescaleType 1 DICOM_2009 (0028,1055) LO WindowCenterWidthExplanation 1-n DICOM_2009 (0028,1056) CS VOILUTFunction 1 DICOM_2009 (0028,1090) CS RecommendedViewingMode 1 DICOM_2009 (0028,1101) xs RedPaletteColorLookupTableDescriptor 3 DICOM_2009 (0028,1102) xs GreenPaletteColorLookupTableDescriptor 3 DICOM_2009 (0028,1103) xs BluePaletteColorLookupTableDescriptor 3 DICOM_2009 (0028,1104) US AlphaPaletteColorLookupTableDescriptor 3 DICOM_2009 (0028,1199) UI PaletteColorLookupTableUID 1 DICOM_2009 (0028,1201) OW RedPaletteColorLookupTableData 1 DICOM_2009 (0028,1202) OW GreenPaletteColorLookupTableData 1 DICOM_2009 (0028,1203) OW BluePaletteColorLookupTableData 1 DICOM_2009 (0028,1204) OW AlphaPaletteColorLookupTableData 1 DICOM_2009 (0028,1221) OW SegmentedRedPaletteColorLookupTableData 1 DICOM_2009 (0028,1222) OW SegmentedGreenPaletteColorLookupTableData 1 DICOM_2009 (0028,1223) OW SegmentedBluePaletteColorLookupTableData 1 DICOM_2009 (0028,1300) CS BreastImplantPresent 1 DICOM_2009 (0028,1350) CS PartialView 1 DICOM_2009 (0028,1351) ST PartialViewDescription 1 DICOM_2009 (0028,1352) SQ PartialViewCodeSequence 1 DICOM_2009 (0028,135A) CS SpatialLocationsPreserved 1 DICOM_2009 (0028,1401) SQ DataFrameAssignmentSequence 1 DICOM_2009 (0028,1402) CS DataPathAssignment 1 DICOM_2009 (0028,1403) US BitsMappedToColorLookupTable 1 DICOM_2009 (0028,1404) SQ BlendingLUT1Sequence 1 DICOM_2009 (0028,1405) CS BlendingLUT1TransferFunction 1 DICOM_2009 (0028,1406) FD BlendingWeightConstant 1 DICOM_2009 (0028,1407) US BlendingLookupTableDescriptor 3 DICOM_2009 (0028,1408) OW BlendingLookupTableData 1 DICOM_2009 (0028,140B) SQ EnhancedPaletteColorLookupTableSequence 1 DICOM_2009 (0028,140C) SQ BlendingLUT2Sequence 1 DICOM_2009 (0028,140D) CS BlendingLUT2TransferFunction 1 DICOM_2009 (0028,140E) CS DataPathID 1 DICOM_2009 (0028,140F) CS RGBLUTTransferFunction 1 DICOM_2009 (0028,1410) CS AlphaLUTTransferFunction 1 DICOM_2009 (0028,2000) OB ICCProfile 1 DICOM_2009 (0028,2110) CS LossyImageCompression 1 DICOM_2009 (0028,2112) DS LossyImageCompressionRatio 1-n DICOM_2009 (0028,2114) CS LossyImageCompressionMethod 1-n DICOM_2009 (0028,3000) SQ ModalityLUTSequence 1 DICOM_2009 (0028,3002) xs LUTDescriptor 3 DICOM_2009 (0028,3003) LO LUTExplanation 1 DICOM_2009 (0028,3004) LO ModalityLUTType 1 DICOM_2009 (0028,3006) lt LUTData 1-n DICOM_2009 (0028,3010) SQ VOILUTSequence 1 DICOM_2009 (0028,3110) SQ SoftcopyVOILUTSequence 1 DICOM_2009 (0028,6010) US RepresentativeFrameNumber 1 DICOM_2009 (0028,6020) US FrameNumbersOfInterest 1-n DICOM_2009 (0028,6022) LO FrameOfInterestDescription 1-n DICOM_2009 (0028,6023) CS FrameOfInterestType 1-n DICOM_2009 (0028,6040) US RWavePointer 1-n DICOM_2009 (0028,6100) SQ MaskSubtractionSequence 1 DICOM_2009 (0028,6101) CS MaskOperation 1 DICOM_2009 (0028,6102) US ApplicableFrameRange 2-2n DICOM_2009 (0028,6110) US MaskFrameNumbers 1-n DICOM_2009 (0028,6112) US ContrastFrameAveraging 1 DICOM_2009 (0028,6114) FL MaskSubPixelShift 2 DICOM_2009 (0028,6120) SS TIDOffset 1 DICOM_2009 (0028,6190) ST MaskOperationExplanation 1 DICOM_2009 (0028,7FE0) UT PixelDataProviderURL 1 DICOM_2009 (0028,9001) UL DataPointRows 1 DICOM_2009 (0028,9002) UL DataPointColumns 1 DICOM_2009 (0028,9003) CS SignalDomainColumns 1 DICOM_2009 (0028,9108) CS DataRepresentation 1 DICOM_2009 (0028,9110) SQ PixelMeasuresSequence 1 DICOM_2009 (0028,9132) SQ FrameVOILUTSequence 1 DICOM_2009 (0028,9145) SQ PixelValueTransformationSequence 1 DICOM_2009 (0028,9235) CS SignalDomainRows 1 DICOM_2009 (0028,9411) FL DisplayFilterPercentage 1 DICOM_2009 (0028,9415) SQ FramePixelShiftSequence 1 DICOM_2009 (0028,9416) US SubtractionItemID 1 DICOM_2009 (0028,9422) SQ PixelIntensityRelationshipLUTSequence 1 DICOM_2009 (0028,9443) SQ FramePixelDataPropertiesSequence 1 DICOM_2009 (0028,9444) CS GeometricalProperties 1 DICOM_2009 (0028,9445) FL GeometricMaximumDistortion 1 DICOM_2009 (0028,9446) CS ImageProcessingApplied 1-n DICOM_2009 (0028,9454) CS MaskSelectionMode 1 DICOM_2009 (0028,9474) CS LUTFunction 1 DICOM_2009 (0028,9478) FL MaskVisibilityPercentage 1 DICOM_2009 (0028,9501) SQ PixelShiftSequence 1 DICOM_2009 (0028,9502) SQ RegionPixelShiftSequence 1 DICOM_2009 (0028,9503) SS VerticesOfTheRegion 2-2n DICOM_2009 (0028,9505) SQ MultiFramePresentationSequence 1 DICOM_2009 (0028,9506) US PixelShiftFrameRange 2-2n DICOM_2009 (0028,9507) US LUTFrameRange 2-2n DICOM_2009 (0028,9520) DS ImageToEquipmentMappingMatrix 16 DICOM_2009 (0028,9537) CS EquipmentCoordinateSystemIdentification 1 DICOM_2009 (0032,1031) SQ RequestingPhysicianIdentificationSequence 1 DICOM_2009 (0032,1032) PN RequestingPhysician 1 DICOM_2009 (0032,1033) LO RequestingService 1 DICOM_2009 (0032,1034) SQ RequestingServiceCodeSequence 1 DICOM_2009 (0032,1060) LO RequestedProcedureDescription 1 DICOM_2009 (0032,1064) SQ RequestedProcedureCodeSequence 1 DICOM_2009 (0032,1070) LO RequestedContrastAgent 1 DICOM_2009 (0038,0004) SQ ReferencedPatientAliasSequence 1 DICOM_2009 (0038,0008) CS VisitStatusID 1 DICOM_2009 (0038,0010) LO AdmissionID 1 DICOM_2009 (0038,0014) SQ IssuerOfAdmissionIDSequence 1 DICOM_2009 (0038,0016) LO RouteOfAdmissions 1 DICOM_2009 (0038,0020) DA AdmittingDate 1 DICOM_2009 (0038,0021) TM AdmittingTime 1 DICOM_2009 (0038,0050) LO SpecialNeeds 1 DICOM_2009 (0038,0060) LO ServiceEpisodeID 1 DICOM_2009 (0038,0062) LO ServiceEpisodeDescription 1 DICOM_2009 (0038,0064) SQ IssuerOfServiceEpisodeIDSequence 1 DICOM_2009 (0038,0100) SQ PertinentDocumentsSequence 1 DICOM_2009 (0038,0300) LO CurrentPatientLocation 1 DICOM_2009 (0038,0400) LO PatientInstitutionResidence 1 DICOM_2009 (0038,0500) LO PatientState 1 DICOM_2009 (0038,0502) SQ PatientClinicalTrialParticipationSequence 1 DICOM_2009 (0038,4000) LT VisitComments 1 DICOM_2009 (003A,0004) CS WaveformOriginality 1 DICOM_2009 (003A,0005) US NumberOfWaveformChannels 1 DICOM_2009 (003A,0010) UL NumberOfWaveformSamples 1 DICOM_2009 (003A,001A) DS SamplingFrequency 1 DICOM_2009 (003A,0020) SH MultiplexGroupLabel 1 DICOM_2009 (003A,0200) SQ ChannelDefinitionSequence 1 DICOM_2009 (003A,0202) IS WaveformChannelNumber 1 DICOM_2009 (003A,0203) SH ChannelLabel 1 DICOM_2009 (003A,0205) CS ChannelStatus 1-n DICOM_2009 (003A,0208) SQ ChannelSourceSequence 1 DICOM_2009 (003A,0209) SQ ChannelSourceModifiersSequence 1 DICOM_2009 (003A,020A) SQ SourceWaveformSequence 1 DICOM_2009 (003A,020C) LO ChannelDerivationDescription 1 DICOM_2009 (003A,0210) DS ChannelSensitivity 1 DICOM_2009 (003A,0211) SQ ChannelSensitivityUnitsSequence 1 DICOM_2009 (003A,0212) DS ChannelSensitivityCorrectionFactor 1 DICOM_2009 (003A,0213) DS ChannelBaseline 1 DICOM_2009 (003A,0214) DS ChannelTimeSkew 1 DICOM_2009 (003A,0215) DS ChannelSampleSkew 1 DICOM_2009 (003A,0218) DS ChannelOffset 1 DICOM_2009 (003A,021A) US WaveformBitsStored 1 DICOM_2009 (003A,0220) DS FilterLowFrequency 1 DICOM_2009 (003A,0221) DS FilterHighFrequency 1 DICOM_2009 (003A,0222) DS NotchFilterFrequency 1 DICOM_2009 (003A,0223) DS NotchFilterBandwidth 1 DICOM_2009 (003A,0230) FL WaveformDataDisplayScale 1 DICOM_2009 (003A,0231) US WaveformDisplayBackgroundCIELabValue 3 DICOM_2009 (003A,0240) SQ WaveformPresentationGroupSequence 1 DICOM_2009 (003A,0241) US PresentationGroupNumber 1 DICOM_2009 (003A,0242) SQ ChannelDisplaySequence 1 DICOM_2009 (003A,0244) US ChannelRecommendedDisplayCIELabValue 3 DICOM_2009 (003A,0245) FL ChannelPosition 1 DICOM_2009 (003A,0246) CS DisplayShadingFlag 1 DICOM_2009 (003A,0247) FL FractionalChannelDisplayScale 1 DICOM_2009 (003A,0248) FL AbsoluteChannelDisplayScale 1 DICOM_2009 (003A,0300) SQ MultiplexedAudioChannelsDescriptionCodeSequence 1 DICOM_2009 (003A,0301) IS ChannelIdentificationCode 1 DICOM_2009 (003A,0302) CS ChannelMode 1 DICOM_2009 (0040,0001) AE ScheduledStationAETitle 1-n DICOM_2009 (0040,0002) DA ScheduledProcedureStepStartDate 1 DICOM_2009 (0040,0003) TM ScheduledProcedureStepStartTime 1 DICOM_2009 (0040,0004) DA ScheduledProcedureStepEndDate 1 DICOM_2009 (0040,0005) TM ScheduledProcedureStepEndTime 1 DICOM_2009 (0040,0006) PN ScheduledPerformingPhysicianName 1 DICOM_2009 (0040,0007) LO ScheduledProcedureStepDescription 1 DICOM_2009 (0040,0008) SQ ScheduledProtocolCodeSequence 1 DICOM_2009 (0040,0009) SH ScheduledProcedureStepID 1 DICOM_2009 (0040,000A) SQ StageCodeSequence 1 DICOM_2009 (0040,000B) SQ ScheduledPerformingPhysicianIdentificationSequence 1 DICOM_2009 (0040,0010) SH ScheduledStationName 1-n DICOM_2009 (0040,0011) SH ScheduledProcedureStepLocation 1 DICOM_2009 (0040,0012) LO PreMedication 1 DICOM_2009 (0040,0020) CS ScheduledProcedureStepStatus 1 DICOM_2009 (0040,0026) SQ OrderPlacerIdentifierSequence 1 DICOM_2009 (0040,0027) SQ OrderFillerIdentifierSequence 1 DICOM_2009 (0040,0031) UT LocalNamespaceEntityID 1 DICOM_2009 (0040,0032) UT UniversalEntityID 1 DICOM_2009 (0040,0033) CS UniversalEntityIDType 1 DICOM_2009 (0040,0035) CS IdentifierTypeCode 1 DICOM_2009 (0040,0036) SQ AssigningFacilitySequence 1 DICOM_2009 (0040,0039) SQ AssigningJurisdictionCodeSequence 1 DICOM_2009 (0040,003A) SQ AssigningAgencyOrDepartmentCodeSequence 1 DICOM_2009 (0040,0100) SQ ScheduledProcedureStepSequence 1 DICOM_2009 (0040,0220) SQ ReferencedNonImageCompositeSOPInstanceSequence 1 DICOM_2009 (0040,0241) AE PerformedStationAETitle 1 DICOM_2009 (0040,0242) SH PerformedStationName 1 DICOM_2009 (0040,0243) SH PerformedLocation 1 DICOM_2009 (0040,0244) DA PerformedProcedureStepStartDate 1 DICOM_2009 (0040,0245) TM PerformedProcedureStepStartTime 1 DICOM_2009 (0040,0250) DA PerformedProcedureStepEndDate 1 DICOM_2009 (0040,0251) TM PerformedProcedureStepEndTime 1 DICOM_2009 (0040,0252) CS PerformedProcedureStepStatus 1 DICOM_2009 (0040,0253) SH PerformedProcedureStepID 1 DICOM_2009 (0040,0254) LO PerformedProcedureStepDescription 1 DICOM_2009 (0040,0255) LO PerformedProcedureTypeDescription 1 DICOM_2009 (0040,0260) SQ PerformedProtocolCodeSequence 1 DICOM_2009 (0040,0261) CS PerformedProtocolType 1 DICOM_2009 (0040,0270) SQ ScheduledStepAttributesSequence 1 DICOM_2009 (0040,0275) SQ RequestAttributesSequence 1 DICOM_2009 (0040,0280) ST CommentsOnThePerformedProcedureStep 1 DICOM_2009 (0040,0281) SQ PerformedProcedureStepDiscontinuationReasonCodeSequence 1 DICOM_2009 (0040,0293) SQ QuantitySequence 1 DICOM_2009 (0040,0294) DS Quantity 1 DICOM_2009 (0040,0295) SQ MeasuringUnitsSequence 1 DICOM_2009 (0040,0296) SQ BillingItemSequence 1 DICOM_2009 (0040,0300) US TotalTimeOfFluoroscopy 1 DICOM_2009 (0040,0301) US TotalNumberOfExposures 1 DICOM_2009 (0040,0302) US EntranceDose 1 DICOM_2009 (0040,0303) US ExposedArea 1-2 DICOM_2009 (0040,0306) DS DistanceSourceToEntrance 1 DICOM_2009 (0040,030E) SQ ExposureDoseSequence 1 DICOM_2009 (0040,0310) ST CommentsOnRadiationDose 1 DICOM_2009 (0040,0312) DS XRayOutput 1 DICOM_2009 (0040,0314) DS HalfValueLayer 1 DICOM_2009 (0040,0316) DS OrganDose 1 DICOM_2009 (0040,0318) CS OrganExposed 1 DICOM_2009 (0040,0320) SQ BillingProcedureStepSequence 1 DICOM_2009 (0040,0321) SQ FilmConsumptionSequence 1 DICOM_2009 (0040,0324) SQ BillingSuppliesAndDevicesSequence 1 DICOM_2009 (0040,0340) SQ PerformedSeriesSequence 1 DICOM_2009 (0040,0400) LT CommentsOnTheScheduledProcedureStep 1 DICOM_2009 (0040,0440) SQ ProtocolContextSequence 1 DICOM_2009 (0040,0441) SQ ContentItemModifierSequence 1 DICOM_2009 (0040,0500) SQ ScheduledSpecimenSequence 1 DICOM_2009 (0040,0512) LO ContainerIdentifier 1 DICOM_2009 (0040,0513) SQ IssuerOfTheContainerIdentifierSequence 1 DICOM_2009 (0040,0515) SQ AlternateContainerIdentifierSequence 1 DICOM_2009 (0040,0518) SQ ContainerTypeCodeSequence 1 DICOM_2009 (0040,051A) LO ContainerDescription 1 DICOM_2009 (0040,0520) SQ ContainerComponentSequence 1 DICOM_2009 (0040,0551) LO SpecimenIdentifier 1 DICOM_2009 (0040,0554) UI SpecimenUID 1 DICOM_2009 (0040,0555) SQ AcquisitionContextSequence 1 DICOM_2009 (0040,0556) ST AcquisitionContextDescription 1 DICOM_2009 (0040,0560) SQ SpecimenDescriptionSequence 1 DICOM_2009 (0040,0562) SQ IssuerOfTheSpecimenIdentifierSequence 1 DICOM_2009 (0040,059A) SQ SpecimenTypeCodeSequence 1 DICOM_2009 (0040,0600) LO SpecimenShortDescription 1 DICOM_2009 (0040,0602) UT SpecimenDetailedDescription 1 DICOM_2009 (0040,0610) SQ SpecimenPreparationSequence 1 DICOM_2009 (0040,0612) SQ SpecimenPreparationStepContentItemSequence 1 DICOM_2009 (0040,0620) SQ SpecimenLocalizationContentItemSequence 1 DICOM_2009 (0040,071A) SQ ImageCenterPointCoordinatesSequence 1 DICOM_2009 (0040,072A) DS XOffsetInSlideCoordinateSystem 1 DICOM_2009 (0040,073A) DS YOffsetInSlideCoordinateSystem 1 DICOM_2009 (0040,074A) DS ZOffsetInSlideCoordinateSystem 1 DICOM_2009 (0040,08D8) SQ PixelSpacingSequence 1 DICOM_2009 (0040,08DA) SQ CoordinateSystemAxisCodeSequence 1 DICOM_2009 (0040,08EA) SQ MeasurementUnitsCodeSequence 1 DICOM_2009 (0040,1001) SH RequestedProcedureID 1 DICOM_2009 (0040,1002) LO ReasonForTheRequestedProcedure 1 DICOM_2009 (0040,1003) SH RequestedProcedurePriority 1 DICOM_2009 (0040,1004) LO PatientTransportArrangements 1 DICOM_2009 (0040,1005) LO RequestedProcedureLocation 1 DICOM_2009 (0040,1008) LO ConfidentialityCode 1 DICOM_2009 (0040,1009) SH ReportingPriority 1 DICOM_2009 (0040,100A) SQ ReasonForRequestedProcedureCodeSequence 1 DICOM_2009 (0040,1010) PN NamesOfIntendedRecipientsOfResults 1-n DICOM_2009 (0040,1011) SQ IntendedRecipientsOfResultsIdentificationSequence 1 DICOM_2009 (0040,1012) SQ ReasonForPerformedProcedureCodeSequence 1 DICOM_2009 (0040,1101) SQ PersonIdentificationCodeSequence 1 DICOM_2009 (0040,1102) ST PersonAddress 1 DICOM_2009 (0040,1103) LO PersonTelephoneNumbers 1-n DICOM_2009 (0040,1400) LT RequestedProcedureComments 1 DICOM_2009 (0040,2004) DA IssueDateOfImagingServiceRequest 1 DICOM_2009 (0040,2005) TM IssueTimeOfImagingServiceRequest 1 DICOM_2009 (0040,2008) PN OrderEnteredBy 1 DICOM_2009 (0040,2009) SH OrderEntererLocation 1 DICOM_2009 (0040,2010) SH OrderCallbackPhoneNumber 1 DICOM_2009 (0040,2016) LO PlacerOrderNumberImagingServiceRequest 1 DICOM_2009 (0040,2017) LO FillerOrderNumberImagingServiceRequest 1 DICOM_2009 (0040,2400) LT ImagingServiceRequestComments 1 DICOM_2009 (0040,3001) LO ConfidentialityConstraintOnPatientDataDescription 1 DICOM_2009 (0040,4001) CS GeneralPurposeScheduledProcedureStepStatus 1 DICOM_2009 (0040,4002) CS GeneralPurposePerformedProcedureStepStatus 1 DICOM_2009 (0040,4003) CS GeneralPurposeScheduledProcedureStepPriority 1 DICOM_2009 (0040,4004) SQ ScheduledProcessingApplicationsCodeSequence 1 DICOM_2009 (0040,4005) DT ScheduledProcedureStepStartDateTime 1 DICOM_2009 (0040,4006) CS MultipleCopiesFlag 1 DICOM_2009 (0040,4007) SQ PerformedProcessingApplicationsCodeSequence 1 DICOM_2009 (0040,4009) SQ HumanPerformerCodeSequence 1 DICOM_2009 (0040,4010) DT ScheduledProcedureStepModificationDateTime 1 DICOM_2009 (0040,4011) DT ExpectedCompletionDateTime 1 DICOM_2009 (0040,4015) SQ ResultingGeneralPurposePerformedProcedureStepsSequence 1 DICOM_2009 (0040,4016) SQ ReferencedGeneralPurposeScheduledProcedureStepSequence 1 DICOM_2009 (0040,4018) SQ ScheduledWorkitemCodeSequence 1 DICOM_2009 (0040,4019) SQ PerformedWorkitemCodeSequence 1 DICOM_2009 (0040,4020) CS InputAvailabilityFlag 1 DICOM_2009 (0040,4021) SQ InputInformationSequence 1 DICOM_2009 (0040,4022) SQ RelevantInformationSequence 1 DICOM_2009 (0040,4023) UI ReferencedGeneralPurposeScheduledProcedureStepTransactionUID 1 DICOM_2009 (0040,4025) SQ ScheduledStationNameCodeSequence 1 DICOM_2009 (0040,4026) SQ ScheduledStationClassCodeSequence 1 DICOM_2009 (0040,4027) SQ ScheduledStationGeographicLocationCodeSequence 1 DICOM_2009 (0040,4028) SQ PerformedStationNameCodeSequence 1 DICOM_2009 (0040,4029) SQ PerformedStationClassCodeSequence 1 DICOM_2009 (0040,4030) SQ PerformedStationGeographicLocationCodeSequence 1 DICOM_2009 (0040,4031) SQ RequestedSubsequentWorkitemCodeSequence 1 DICOM_2009 (0040,4032) SQ NonDICOMOutputCodeSequence 1 DICOM_2009 (0040,4033) SQ OutputInformationSequence 1 DICOM_2009 (0040,4034) SQ ScheduledHumanPerformersSequence 1 DICOM_2009 (0040,4035) SQ ActualHumanPerformersSequence 1 DICOM_2009 (0040,4036) LO HumanPerformerOrganization 1 DICOM_2009 (0040,4037) PN HumanPerformerName 1 DICOM_2009 (0040,4040) CS RawDataHandling 1 DICOM_2009 (0040,8302) DS EntranceDoseInmGy 1 DICOM_2009 (0040,9094) SQ ReferencedImageRealWorldValueMappingSequence 1 DICOM_2009 (0040,9096) SQ RealWorldValueMappingSequence 1 DICOM_2009 (0040,9098) SQ PixelValueMappingCodeSequence 1 DICOM_2009 (0040,9210) SH LUTLabel 1 DICOM_2009 (0040,9211) xs RealWorldValueLastValueMapped 1 DICOM_2009 (0040,9212) FD RealWorldValueLUTData 1-n DICOM_2009 (0040,9216) xs RealWorldValueFirstValueMapped 1 DICOM_2009 (0040,9224) FD RealWorldValueIntercept 1 DICOM_2009 (0040,9225) FD RealWorldValueSlope 1 DICOM_2009 (0040,A010) CS RelationshipType 1 DICOM_2009 (0040,A027) LO VerifyingOrganization 1 DICOM_2009 (0040,A030) DT VerificationDateTime 1 DICOM_2009 (0040,A032) DT ObservationDateTime 1 DICOM_2009 (0040,A040) CS ValueType 1 DICOM_2009 (0040,A043) SQ ConceptNameCodeSequence 1 DICOM_2009 (0040,A050) CS ContinuityOfContent 1 DICOM_2009 (0040,A073) SQ VerifyingObserverSequence 1 DICOM_2009 (0040,A075) PN VerifyingObserverName 1 DICOM_2009 (0040,A078) SQ AuthorObserverSequence 1 DICOM_2009 (0040,A07A) SQ ParticipantSequence 1 DICOM_2009 (0040,A07C) SQ CustodialOrganizationSequence 1 DICOM_2009 (0040,A080) CS ParticipationType 1 DICOM_2009 (0040,A082) DT ParticipationDateTime 1 DICOM_2009 (0040,A084) CS ObserverType 1 DICOM_2009 (0040,A088) SQ VerifyingObserverIdentificationCodeSequence 1 DICOM_2009 (0040,A0B0) US ReferencedWaveformChannels 2-2n DICOM_2009 (0040,A120) DT DateTime 1 DICOM_2009 (0040,A121) DA Date 1 DICOM_2009 (0040,A122) TM Time 1 DICOM_2009 (0040,A123) PN PersonName 1 DICOM_2009 (0040,A124) UI UID 1 DICOM_2009 (0040,A130) CS TemporalRangeType 1 DICOM_2009 (0040,A132) UL ReferencedSamplePositions 1-n DICOM_2009 (0040,A136) US ReferencedFrameNumbers 1-n DICOM_2009 (0040,A138) DS ReferencedTimeOffsets 1-n DICOM_2009 (0040,A13A) DT ReferencedDateTime 1-n DICOM_2009 (0040,A160) UT TextValue 1 DICOM_2009 (0040,A168) SQ ConceptCodeSequence 1 DICOM_2009 (0040,A170) SQ PurposeOfReferenceCodeSequence 1 DICOM_2009 (0040,A180) US AnnotationGroupNumber 1 DICOM_2009 (0040,A195) SQ ModifierCodeSequence 1 DICOM_2009 (0040,A300) SQ MeasuredValueSequence 1 DICOM_2009 (0040,A301) SQ NumericValueQualifierCodeSequence 1 DICOM_2009 (0040,A30A) DS NumericValue 1-n DICOM_2009 (0040,A360) SQ PredecessorDocumentsSequence 1 DICOM_2009 (0040,A370) SQ ReferencedRequestSequence 1 DICOM_2009 (0040,A372) SQ PerformedProcedureCodeSequence 1 DICOM_2009 (0040,A375) SQ CurrentRequestedProcedureEvidenceSequence 1 DICOM_2009 (0040,A385) SQ PertinentOtherEvidenceSequence 1 DICOM_2009 (0040,A390) SQ HL7StructuredDocumentReferenceSequence 1 DICOM_2009 (0040,A491) CS CompletionFlag 1 DICOM_2009 (0040,A492) LO CompletionFlagDescription 1 DICOM_2009 (0040,A493) CS VerificationFlag 1 DICOM_2009 (0040,A494) CS ArchiveRequested 1 DICOM_2009 (0040,A496) CS PreliminaryFlag 1 DICOM_2009 (0040,A504) SQ ContentTemplateSequence 1 DICOM_2009 (0040,A525) SQ IdenticalDocumentsSequence 1 DICOM_2009 (0040,A730) SQ ContentSequence 1 DICOM_2009 (0040,B020) SQ WaveformAnnotationSequence 1 DICOM_2009 (0040,DB00) CS TemplateIdentifier 1 DICOM_2009 (0040,DB73) UL ReferencedContentItemIdentifier 1-n DICOM_2009 (0040,E001) ST HL7InstanceIdentifier 1 DICOM_2009 (0040,E004) DT HL7DocumentEffectiveTime 1 DICOM_2009 (0040,E006) SQ HL7DocumentTypeCodeSequence 1 DICOM_2009 (0040,E010) UT RetrieveURI 1 DICOM_2009 (0040,E011) UI RetrieveLocationUID 1 DICOM_2009 (0042,0010) ST DocumentTitle 1 DICOM_2009 (0042,0011) OB EncapsulatedDocument 1 DICOM_2009 (0042,0012) LO MIMETypeOfEncapsulatedDocument 1 DICOM_2009 (0042,0013) SQ SourceInstanceSequence 1 DICOM_2009 (0042,0014) LO ListOfMIMETypes 1-n DICOM_2009 (0044,0001) ST ProductPackageIdentifier 1 DICOM_2009 (0044,0002) CS SubstanceAdministrationApproval 1 DICOM_2009 (0044,0003) LT ApprovalStatusFurtherDescription 1 DICOM_2009 (0044,0004) DT ApprovalStatusDateTime 1 DICOM_2009 (0044,0007) SQ ProductTypeCodeSequence 1 DICOM_2009 (0044,0008) LO ProductName 1-n DICOM_2009 (0044,0009) LT ProductDescription 1 DICOM_2009 (0044,000A) LO ProductLotIdentifier 1 DICOM_2009 (0044,000B) DT ProductExpirationDateTime 1 DICOM_2009 (0044,0010) DT SubstanceAdministrationDateTime 1 DICOM_2009 (0044,0011) LO SubstanceAdministrationNotes 1 DICOM_2009 (0044,0012) LO SubstanceAdministrationDeviceID 1 DICOM_2009 (0044,0013) SQ ProductParameterSequence 1 DICOM_2009 (0044,0019) SQ SubstanceAdministrationParameterSequence 1 DICOM_2009 (0046,0012) LO LensDescription 1 DICOM_2009 (0046,0014) SQ RightLensSequence 1 DICOM_2009 (0046,0015) SQ LeftLensSequence 1 DICOM_2009 (0046,0016) SQ UnspecifiedLateralityLensSequence 1 DICOM_2009 (0046,0018) SQ CylinderSequence 1 DICOM_2009 (0046,0028) SQ PrismSequence 1 DICOM_2009 (0046,0030) FD HorizontalPrismPower 1 DICOM_2009 (0046,0032) CS HorizontalPrismBase 1 DICOM_2009 (0046,0034) FD VerticalPrismPower 1 DICOM_2009 (0046,0036) CS VerticalPrismBase 1 DICOM_2009 (0046,0038) CS LensSegmentType 1 DICOM_2009 (0046,0040) FD OpticalTransmittance 1 DICOM_2009 (0046,0042) FD ChannelWidth 1 DICOM_2009 (0046,0044) FD PupilSize 1 DICOM_2009 (0046,0046) FD CornealSize 1 DICOM_2009 (0046,0050) SQ AutorefractionRightEyeSequence 1 DICOM_2009 (0046,0052) SQ AutorefractionLeftEyeSequence 1 DICOM_2009 (0046,0060) FD DistancePupillaryDistance 1 DICOM_2009 (0046,0062) FD NearPupillaryDistance 1 DICOM_2009 (0046,0063) FD IntermediatePupillaryDistance 1 DICOM_2009 (0046,0064) FD OtherPupillaryDistance 1 DICOM_2009 (0046,0070) SQ KeratometryRightEyeSequence 1 DICOM_2009 (0046,0071) SQ KeratometryLeftEyeSequence 1 DICOM_2009 (0046,0074) SQ SteepKeratometricAxisSequence 1 DICOM_2009 (0046,0075) FD RadiusOfCurvature 1 DICOM_2009 (0046,0076) FD KeratometricPower 1 DICOM_2009 (0046,0077) FD KeratometricAxis 1 DICOM_2009 (0046,0080) SQ FlatKeratometricAxisSequence 1 DICOM_2009 (0046,0092) CS BackgroundColor 1 DICOM_2009 (0046,0094) CS Optotype 1 DICOM_2009 (0046,0095) CS OptotypePresentation 1 DICOM_2009 (0046,0097) SQ SubjectiveRefractionRightEyeSequence 1 DICOM_2009 (0046,0098) SQ SubjectiveRefractionLeftEyeSequence 1 DICOM_2009 (0046,0100) SQ AddNearSequence 1 DICOM_2009 (0046,0101) SQ AddIntermediateSequence 1 DICOM_2009 (0046,0102) SQ AddOtherSequence 1 DICOM_2009 (0046,0104) FD AddPower 1 DICOM_2009 (0046,0106) FD ViewingDistance 1 DICOM_2009 (0046,0121) SQ VisualAcuityTypeCodeSequence 1 DICOM_2009 (0046,0122) SQ VisualAcuityRightEyeSequence 1 DICOM_2009 (0046,0123) SQ VisualAcuityLeftEyeSequence 1 DICOM_2009 (0046,0124) SQ VisualAcuityBothEyesOpenSequence 1 DICOM_2009 (0046,0125) CS ViewingDistanceType 1 DICOM_2009 (0046,0135) SS VisualAcuityModifiers 2 DICOM_2009 (0046,0137) FD DecimalVisualAcuity 1 DICOM_2009 (0046,0139) LO OptotypeDetailedDefinition 1 DICOM_2009 (0046,0145) SQ ReferencedRefractiveMeasurementsSequence 1 DICOM_2009 (0046,0146) FD SpherePower 1 DICOM_2009 (0046,0147) FD CylinderPower 1 DICOM_2009 (0050,0004) CS CalibrationImage 1 DICOM_2009 (0050,0010) SQ DeviceSequence 1 DICOM_2009 (0050,0012) SQ ContainerComponentTypeCodeSequence 1 DICOM_2009 (0050,0013) FD ContainerComponentThickness 1 DICOM_2009 (0050,0014) DS DeviceLength 1 DICOM_2009 (0050,0015) FD ContainerComponentWidth 1 DICOM_2009 (0050,0016) DS DeviceDiameter 1 DICOM_2009 (0050,0017) CS DeviceDiameterUnits 1 DICOM_2009 (0050,0018) DS DeviceVolume 1 DICOM_2009 (0050,0019) DS InterMarkerDistance 1 DICOM_2009 (0050,001A) CS ContainerComponentMaterial 1 DICOM_2009 (0050,001B) LO ContainerComponentID 1 DICOM_2009 (0050,001C) FD ContainerComponentLength 1 DICOM_2009 (0050,001D) FD ContainerComponentDiameter 1 DICOM_2009 (0050,001E) LO ContainerComponentDescription 1 DICOM_2009 (0050,0020) LO DeviceDescription 1 DICOM_2009 (0054,0010) US EnergyWindowVector 1-n DICOM_2009 (0054,0011) US NumberOfEnergyWindows 1 DICOM_2009 (0054,0012) SQ EnergyWindowInformationSequence 1 DICOM_2009 (0054,0013) SQ EnergyWindowRangeSequence 1 DICOM_2009 (0054,0014) DS EnergyWindowLowerLimit 1 DICOM_2009 (0054,0015) DS EnergyWindowUpperLimit 1 DICOM_2009 (0054,0016) SQ RadiopharmaceuticalInformationSequence 1 DICOM_2009 (0054,0017) IS ResidualSyringeCounts 1 DICOM_2009 (0054,0018) SH EnergyWindowName 1 DICOM_2009 (0054,0020) US DetectorVector 1-n DICOM_2009 (0054,0021) US NumberOfDetectors 1 DICOM_2009 (0054,0022) SQ DetectorInformationSequence 1 DICOM_2009 (0054,0030) US PhaseVector 1-n DICOM_2009 (0054,0031) US NumberOfPhases 1 DICOM_2009 (0054,0032) SQ PhaseInformationSequence 1 DICOM_2009 (0054,0033) US NumberOfFramesInPhase 1 DICOM_2009 (0054,0036) IS PhaseDelay 1 DICOM_2009 (0054,0038) IS PauseBetweenFrames 1 DICOM_2009 (0054,0039) CS PhaseDescription 1 DICOM_2009 (0054,0050) US RotationVector 1-n DICOM_2009 (0054,0051) US NumberOfRotations 1 DICOM_2009 (0054,0052) SQ RotationInformationSequence 1 DICOM_2009 (0054,0053) US NumberOfFramesInRotation 1 DICOM_2009 (0054,0060) US RRIntervalVector 1-n DICOM_2009 (0054,0061) US NumberOfRRIntervals 1 DICOM_2009 (0054,0062) SQ GatedInformationSequence 1 DICOM_2009 (0054,0063) SQ DataInformationSequence 1 DICOM_2009 (0054,0070) US TimeSlotVector 1-n DICOM_2009 (0054,0071) US NumberOfTimeSlots 1 DICOM_2009 (0054,0072) SQ TimeSlotInformationSequence 1 DICOM_2009 (0054,0073) DS TimeSlotTime 1 DICOM_2009 (0054,0080) US SliceVector 1-n DICOM_2009 (0054,0081) US NumberOfSlices 1 DICOM_2009 (0054,0090) US AngularViewVector 1-n DICOM_2009 (0054,0100) US TimeSliceVector 1-n DICOM_2009 (0054,0101) US NumberOfTimeSlices 1 DICOM_2009 (0054,0200) DS StartAngle 1 DICOM_2009 (0054,0202) CS TypeOfDetectorMotion 1 DICOM_2009 (0054,0210) IS TriggerVector 1-n DICOM_2009 (0054,0211) US NumberOfTriggersInPhase 1 DICOM_2009 (0054,0220) SQ ViewCodeSequence 1 DICOM_2009 (0054,0222) SQ ViewModifierCodeSequence 1 DICOM_2009 (0054,0300) SQ RadionuclideCodeSequence 1 DICOM_2009 (0054,0302) SQ AdministrationRouteCodeSequence 1 DICOM_2009 (0054,0304) SQ RadiopharmaceuticalCodeSequence 1 DICOM_2009 (0054,0306) SQ CalibrationDataSequence 1 DICOM_2009 (0054,0308) US EnergyWindowNumber 1 DICOM_2009 (0054,0400) SH ImageID 1 DICOM_2009 (0054,0410) SQ PatientOrientationCodeSequence 1 DICOM_2009 (0054,0412) SQ PatientOrientationModifierCodeSequence 1 DICOM_2009 (0054,0414) SQ PatientGantryRelationshipCodeSequence 1 DICOM_2009 (0054,0500) CS SliceProgressionDirection 1 DICOM_2009 (0054,1000) CS SeriesType 2 DICOM_2009 (0054,1001) CS Units 1 DICOM_2009 (0054,1002) CS CountsSource 1 DICOM_2009 (0054,1004) CS ReprojectionMethod 1 DICOM_2009 (0054,1100) CS RandomsCorrectionMethod 1 DICOM_2009 (0054,1101) LO AttenuationCorrectionMethod 1 DICOM_2009 (0054,1102) CS DecayCorrection 1 DICOM_2009 (0054,1103) LO ReconstructionMethod 1 DICOM_2009 (0054,1104) LO DetectorLinesOfResponseUsed 1 DICOM_2009 (0054,1105) LO ScatterCorrectionMethod 1 DICOM_2009 (0054,1200) DS AxialAcceptance 1 DICOM_2009 (0054,1201) IS AxialMash 2 DICOM_2009 (0054,1202) IS TransverseMash 1 DICOM_2009 (0054,1203) DS DetectorElementSize 2 DICOM_2009 (0054,1210) DS CoincidenceWindowWidth 1 DICOM_2009 (0054,1220) CS SecondaryCountsType 1-n DICOM_2009 (0054,1300) DS FrameReferenceTime 1 DICOM_2009 (0054,1310) IS PrimaryPromptsCountsAccumulated 1 DICOM_2009 (0054,1311) IS SecondaryCountsAccumulated 1-n DICOM_2009 (0054,1320) DS SliceSensitivityFactor 1 DICOM_2009 (0054,1321) DS DecayFactor 1 DICOM_2009 (0054,1322) DS DoseCalibrationFactor 1 DICOM_2009 (0054,1323) DS ScatterFractionFactor 1 DICOM_2009 (0054,1324) DS DeadTimeFactor 1 DICOM_2009 (0054,1330) US ImageIndex 1 DICOM_2009 (0060,3000) SQ HistogramSequence 1 DICOM_2009 (0060,3002) US HistogramNumberOfBins 1 DICOM_2009 (0060,3004) xs HistogramFirstBinValue 1 DICOM_2009 (0060,3006) xs HistogramLastBinValue 1 DICOM_2009 (0060,3008) US HistogramBinWidth 1 DICOM_2009 (0060,3010) LO HistogramExplanation 1 DICOM_2009 (0060,3020) UL HistogramData 1-n DICOM_2009 (0062,0001) CS SegmentationType 1 DICOM_2009 (0062,0002) SQ SegmentSequence 1 DICOM_2009 (0062,0003) SQ SegmentedPropertyCategoryCodeSequence 1 DICOM_2009 (0062,0004) US SegmentNumber 1 DICOM_2009 (0062,0005) LO SegmentLabel 1 DICOM_2009 (0062,0006) ST SegmentDescription 1 DICOM_2009 (0062,0008) CS SegmentAlgorithmType 1 DICOM_2009 (0062,0009) LO SegmentAlgorithmName 1 DICOM_2009 (0062,000A) SQ SegmentIdentificationSequence 1 DICOM_2009 (0062,000B) US ReferencedSegmentNumber 1-n DICOM_2009 (0062,000C) US RecommendedDisplayGrayscaleValue 1 DICOM_2009 (0062,000D) US RecommendedDisplayCIELabValue 3 DICOM_2009 (0062,000E) US MaximumFractionalValue 1 DICOM_2009 (0062,000F) SQ SegmentedPropertyTypeCodeSequence 1 DICOM_2009 (0062,0010) CS SegmentationFractionalType 1 DICOM_2009 (0064,0002) SQ DeformableRegistrationSequence 1 DICOM_2009 (0064,0003) UI SourceFrameOfReferenceUID 1 DICOM_2009 (0064,0005) SQ DeformableRegistrationGridSequence 1 DICOM_2009 (0064,0007) UL GridDimensions 3 DICOM_2009 (0064,0008) FD GridResolution 3 DICOM_2009 (0064,0009) OF VectorGridData 1 DICOM_2009 (0064,000F) SQ PreDeformationMatrixRegistrationSequence 1 DICOM_2009 (0064,0010) SQ PostDeformationMatrixRegistrationSequence 1 DICOM_2009 (0066,0001) UL NumberOfSurfaces 1 DICOM_2009 (0066,0002) SQ SurfaceSequence 1 DICOM_2009 (0066,0003) UL SurfaceNumber 1 DICOM_2009 (0066,0004) LT SurfaceComments 1 DICOM_2009 (0066,0009) CS SurfaceProcessing 1 DICOM_2009 (0066,000A) FL SurfaceProcessingRatio 1 DICOM_2009 (0066,000B) LO SurfaceProcessingDescription 1 DICOM_2009 (0066,000C) FL RecommendedPresentationOpacity 1 DICOM_2009 (0066,000D) CS RecommendedPresentationType 1 DICOM_2009 (0066,000E) CS FiniteVolume 1 DICOM_2009 (0066,0010) CS Manifold 1 DICOM_2009 (0066,0011) SQ SurfacePointsSequence 1 DICOM_2009 (0066,0012) SQ SurfacePointsNormalsSequence 1 DICOM_2009 (0066,0013) SQ SurfaceMeshPrimitivesSequence 1 DICOM_2009 (0066,0015) UL NumberOfSurfacePoints 1 DICOM_2009 (0066,0016) OF PointCoordinatesData 1 DICOM_2009 (0066,0017) FL PointPositionAccuracy 3 DICOM_2009 (0066,0018) FL MeanPointDistance 1 DICOM_2009 (0066,0019) FL MaximumPointDistance 1 DICOM_2009 (0066,001A) FL PointsBoundingBoxCoordinates 6 DICOM_2009 (0066,001B) FL AxisOfRotation 3 DICOM_2009 (0066,001C) FL CenterOfRotation 3 DICOM_2009 (0066,001E) UL NumberOfVectors 1 DICOM_2009 (0066,001F) US VectorDimensionality 1 DICOM_2009 (0066,0020) FL VectorAccuracy 1-n DICOM_2009 (0066,0021) OF VectorCoordinateData 1 DICOM_2009 (0066,0023) OW TrianglePointIndexList 1 DICOM_2009 (0066,0024) OW EdgePointIndexList 1 DICOM_2009 (0066,0025) OW VertexPointIndexList 1 DICOM_2009 (0066,0026) SQ TriangleStripSequence 1 DICOM_2009 (0066,0027) SQ TriangleFanSequence 1 DICOM_2009 (0066,0028) SQ LineSequence 1 DICOM_2009 (0066,0029) OW PrimitivePointIndexList 1 DICOM_2009 (0066,002A) UL SurfaceCount 1 DICOM_2009 (0066,002B) SQ ReferencedSurfaceSequence 1 DICOM_2009 (0066,002C) UL ReferencedSurfaceNumber 1 DICOM_2009 (0066,002D) SQ SegmentSurfaceGenerationAlgorithmIdentificationSequence 1 DICOM_2009 (0066,002E) SQ SegmentSurfaceSourceInstanceSequence 1 DICOM_2009 (0066,002F) SQ AlgorithmFamilyCodeSequence 1 DICOM_2009 (0066,0030) SQ AlgorithmNameCodeSequence 1 DICOM_2009 (0066,0031) LO AlgorithmVersion 1 DICOM_2009 (0066,0032) LT AlgorithmParameters 1 DICOM_2009 (0066,0034) SQ FacetSequence 1 DICOM_2009 (0066,0035) SQ SurfaceProcessingAlgorithmIdentificationSequence 1 DICOM_2009 (0066,0036) LO AlgorithmName 1 DICOM_2009 (0070,0001) SQ GraphicAnnotationSequence 1 DICOM_2009 (0070,0002) CS GraphicLayer 1 DICOM_2009 (0070,0003) CS BoundingBoxAnnotationUnits 1 DICOM_2009 (0070,0004) CS AnchorPointAnnotationUnits 1 DICOM_2009 (0070,0005) CS GraphicAnnotationUnits 1 DICOM_2009 (0070,0006) ST UnformattedTextValue 1 DICOM_2009 (0070,0008) SQ TextObjectSequence 1 DICOM_2009 (0070,0009) SQ GraphicObjectSequence 1 DICOM_2009 (0070,0010) FL BoundingBoxTopLeftHandCorner 2 DICOM_2009 (0070,0011) FL BoundingBoxBottomRightHandCorner 2 DICOM_2009 (0070,0012) CS BoundingBoxTextHorizontalJustification 1 DICOM_2009 (0070,0014) FL AnchorPoint 2 DICOM_2009 (0070,0015) CS AnchorPointVisibility 1 DICOM_2009 (0070,0020) US GraphicDimensions 1 DICOM_2009 (0070,0021) US NumberOfGraphicPoints 1 DICOM_2009 (0070,0022) FL GraphicData 2-n DICOM_2009 (0070,0023) CS GraphicType 1 DICOM_2009 (0070,0024) CS GraphicFilled 1 DICOM_2009 (0070,0041) CS ImageHorizontalFlip 1 DICOM_2009 (0070,0042) US ImageRotation 1 DICOM_2009 (0070,0052) SL DisplayedAreaTopLeftHandCorner 2 DICOM_2009 (0070,0053) SL DisplayedAreaBottomRightHandCorner 2 DICOM_2009 (0070,005A) SQ DisplayedAreaSelectionSequence 1 DICOM_2009 (0070,0060) SQ GraphicLayerSequence 1 DICOM_2009 (0070,0062) IS GraphicLayerOrder 1 DICOM_2009 (0070,0066) US GraphicLayerRecommendedDisplayGrayscaleValue 1 DICOM_2009 (0070,0068) LO GraphicLayerDescription 1 DICOM_2009 (0070,0080) CS ContentLabel 1 DICOM_2009 (0070,0081) LO ContentDescription 1 DICOM_2009 (0070,0082) DA PresentationCreationDate 1 DICOM_2009 (0070,0083) TM PresentationCreationTime 1 DICOM_2009 (0070,0084) PN ContentCreatorName 1 DICOM_2009 (0070,0086) SQ ContentCreatorIdentificationCodeSequence 1 DICOM_2009 (0070,0087) SQ AlternateContentDescriptionSequence 1 DICOM_2009 (0070,0100) CS PresentationSizeMode 1 DICOM_2009 (0070,0101) DS PresentationPixelSpacing 2 DICOM_2009 (0070,0102) IS PresentationPixelAspectRatio 2 DICOM_2009 (0070,0103) FL PresentationPixelMagnificationRatio 1 DICOM_2009 (0070,0306) CS ShapeType 1 DICOM_2009 (0070,0308) SQ RegistrationSequence 1 DICOM_2009 (0070,0309) SQ MatrixRegistrationSequence 1 DICOM_2009 (0070,030A) SQ MatrixSequence 1 DICOM_2009 (0070,030C) CS FrameOfReferenceTransformationMatrixType 1 DICOM_2009 (0070,030D) SQ RegistrationTypeCodeSequence 1 DICOM_2009 (0070,030F) ST FiducialDescription 1 DICOM_2009 (0070,0310) SH FiducialIdentifier 1 DICOM_2009 (0070,0311) SQ FiducialIdentifierCodeSequence 1 DICOM_2009 (0070,0312) FD ContourUncertaintyRadius 1 DICOM_2009 (0070,0314) SQ UsedFiducialsSequence 1 DICOM_2009 (0070,0318) SQ GraphicCoordinatesDataSequence 1 DICOM_2009 (0070,031A) UI FiducialUID 1 DICOM_2009 (0070,031C) SQ FiducialSetSequence 1 DICOM_2009 (0070,031E) SQ FiducialSequence 1 DICOM_2009 (0070,0401) US GraphicLayerRecommendedDisplayCIELabValue 3 DICOM_2009 (0070,0402) SQ BlendingSequence 1 DICOM_2009 (0070,0403) FL RelativeOpacity 1 DICOM_2009 (0070,0404) SQ ReferencedSpatialRegistrationSequence 1 DICOM_2009 (0070,0405) CS BlendingPosition 1 DICOM_2009 (0072,0002) SH HangingProtocolName 1 DICOM_2009 (0072,0004) LO HangingProtocolDescription 1 DICOM_2009 (0072,0006) CS HangingProtocolLevel 1 DICOM_2009 (0072,0008) LO HangingProtocolCreator 1 DICOM_2009 (0072,000A) DT HangingProtocolCreationDateTime 1 DICOM_2009 (0072,000C) SQ HangingProtocolDefinitionSequence 1 DICOM_2009 (0072,000E) SQ HangingProtocolUserIdentificationCodeSequence 1 DICOM_2009 (0072,0010) LO HangingProtocolUserGroupName 1 DICOM_2009 (0072,0012) SQ SourceHangingProtocolSequence 1 DICOM_2009 (0072,0014) US NumberOfPriorsReferenced 1 DICOM_2009 (0072,0020) SQ ImageSetsSequence 1 DICOM_2009 (0072,0022) SQ ImageSetSelectorSequence 1 DICOM_2009 (0072,0024) CS ImageSetSelectorUsageFlag 1 DICOM_2009 (0072,0026) AT SelectorAttribute 1 DICOM_2009 (0072,0028) US SelectorValueNumber 1 DICOM_2009 (0072,0030) SQ TimeBasedImageSetsSequence 1 DICOM_2009 (0072,0032) US ImageSetNumber 1 DICOM_2009 (0072,0034) CS ImageSetSelectorCategory 1 DICOM_2009 (0072,0038) US RelativeTime 2 DICOM_2009 (0072,003A) CS RelativeTimeUnits 1 DICOM_2009 (0072,003C) SS AbstractPriorValue 2 DICOM_2009 (0072,003E) SQ AbstractPriorCodeSequence 1 DICOM_2009 (0072,0040) LO ImageSetLabel 1 DICOM_2009 (0072,0050) CS SelectorAttributeVR 1 DICOM_2009 (0072,0052) AT SelectorSequencePointer 1 DICOM_2009 (0072,0054) LO SelectorSequencePointerPrivateCreator 1 DICOM_2009 (0072,0056) LO SelectorAttributePrivateCreator 1 DICOM_2009 (0072,0060) AT SelectorATValue 1-n DICOM_2009 (0072,0062) CS SelectorCSValue 1-n DICOM_2009 (0072,0064) IS SelectorISValue 1-n DICOM_2009 (0072,0066) LO SelectorLOValue 1-n DICOM_2009 (0072,0068) LT SelectorLTValue 1 DICOM_2009 (0072,006A) PN SelectorPNValue 1-n DICOM_2009 (0072,006C) SH SelectorSHValue 1-n DICOM_2009 (0072,006E) ST SelectorSTValue 1 DICOM_2009 (0072,0070) UT SelectorUTValue 1 DICOM_2009 (0072,0072) DS SelectorDSValue 1-n DICOM_2009 (0072,0074) FD SelectorFDValue 1-n DICOM_2009 (0072,0076) FL SelectorFLValue 1-n DICOM_2009 (0072,0078) UL SelectorULValue 1-n DICOM_2009 (0072,007A) US SelectorUSValue 1-n DICOM_2009 (0072,007C) SL SelectorSLValue 1-n DICOM_2009 (0072,007E) SS SelectorSSValue 1-n DICOM_2009 (0072,0080) SQ SelectorCodeSequenceValue 1 DICOM_2009 (0072,0100) US NumberOfScreens 1 DICOM_2009 (0072,0102) SQ NominalScreenDefinitionSequence 1 DICOM_2009 (0072,0104) US NumberOfVerticalPixels 1 DICOM_2009 (0072,0106) US NumberOfHorizontalPixels 1 DICOM_2009 (0072,0108) FD DisplayEnvironmentSpatialPosition 4 DICOM_2009 (0072,010A) US ScreenMinimumGrayscaleBitDepth 1 DICOM_2009 (0072,010C) US ScreenMinimumColorBitDepth 1 DICOM_2009 (0072,010E) US ApplicationMaximumRepaintTime 1 DICOM_2009 (0072,0200) SQ DisplaySetsSequence 1 DICOM_2009 (0072,0202) US DisplaySetNumber 1 DICOM_2009 (0072,0203) LO DisplaySetLabel 1 DICOM_2009 (0072,0204) US DisplaySetPresentationGroup 1 DICOM_2009 (0072,0206) LO DisplaySetPresentationGroupDescription 1 DICOM_2009 (0072,0208) CS PartialDataDisplayHandling 1 DICOM_2009 (0072,0210) SQ SynchronizedScrollingSequence 1 DICOM_2009 (0072,0212) US DisplaySetScrollingGroup 2-n DICOM_2009 (0072,0214) SQ NavigationIndicatorSequence 1 DICOM_2009 (0072,0216) US NavigationDisplaySet 1 DICOM_2009 (0072,0218) US ReferenceDisplaySets 1-n DICOM_2009 (0072,0300) SQ ImageBoxesSequence 1 DICOM_2009 (0072,0302) US ImageBoxNumber 1 DICOM_2009 (0072,0304) CS ImageBoxLayoutType 1 DICOM_2009 (0072,0306) US ImageBoxTileHorizontalDimension 1 DICOM_2009 (0072,0308) US ImageBoxTileVerticalDimension 1 DICOM_2009 (0072,0310) CS ImageBoxScrollDirection 1 DICOM_2009 (0072,0312) CS ImageBoxSmallScrollType 1 DICOM_2009 (0072,0314) US ImageBoxSmallScrollAmount 1 DICOM_2009 (0072,0316) CS ImageBoxLargeScrollType 1 DICOM_2009 (0072,0318) US ImageBoxLargeScrollAmount 1 DICOM_2009 (0072,0320) US ImageBoxOverlapPriority 1 DICOM_2009 (0072,0330) FD CineRelativeToRealTime 1 DICOM_2009 (0072,0400) SQ FilterOperationsSequence 1 DICOM_2009 (0072,0402) CS FilterByCategory 1 DICOM_2009 (0072,0404) CS FilterByAttributePresence 1 DICOM_2009 (0072,0406) CS FilterByOperator 1 DICOM_2009 (0072,0420) US StructuredDisplayBackgroundCIELabValue 3 DICOM_2009 (0072,0421) US EmptyImageBoxCIELabValue 3 DICOM_2009 (0072,0422) SQ StructuredDisplayImageBoxSequence 1 DICOM_2009 (0072,0424) SQ StructuredDisplayTextBoxSequence 1 DICOM_2009 (0072,0427) SQ ReferencedFirstFrameSequence 1 DICOM_2009 (0072,0430) SQ ImageBoxSynchronizationSequence 1 DICOM_2009 (0072,0432) US SynchronizedImageBoxList 2-n DICOM_2009 (0072,0434) CS TypeOfSynchronization 1 DICOM_2009 (0072,0500) CS BlendingOperationType 1 DICOM_2009 (0072,0510) CS ReformattingOperationType 1 DICOM_2009 (0072,0512) FD ReformattingThickness 1 DICOM_2009 (0072,0514) FD ReformattingInterval 1 DICOM_2009 (0072,0516) CS ReformattingOperationInitialViewDirection 1 DICOM_2009 (0072,0520) CS ThreeDRenderingType 1-n DICOM_2009 (0072,0600) SQ SortingOperationsSequence 1 DICOM_2009 (0072,0602) CS SortByCategory 1 DICOM_2009 (0072,0604) CS SortingDirection 1 DICOM_2009 (0072,0700) CS DisplaySetPatientOrientation 2 DICOM_2009 (0072,0702) CS VOIType 1 DICOM_2009 (0072,0704) CS PseudoColorType 1 DICOM_2009 (0072,0706) CS ShowGrayscaleInverted 1 DICOM_2009 (0072,0710) CS ShowImageTrueSizeFlag 1 DICOM_2009 (0072,0712) CS ShowGraphicAnnotationFlag 1 DICOM_2009 (0072,0714) CS ShowPatientDemographicsFlag 1 DICOM_2009 (0072,0716) CS ShowAcquisitionTechniquesFlag 1 DICOM_2009 (0072,0717) CS DisplaySetHorizontalJustification 1 DICOM_2009 (0072,0718) CS DisplaySetVerticalJustification 1 DICOM_2009 (0074,1000) CS UnifiedProcedureStepState 1 DICOM_2009 (0074,1002) SQ UnifiedProcedureStepProgressInformationSequence 1 DICOM_2009 (0074,1004) DS UnifiedProcedureStepProgress 1 DICOM_2009 (0074,1006) ST UnifiedProcedureStepProgressDescription 1 DICOM_2009 (0074,1008) SQ UnifiedProcedureStepCommunicationsURISequence 1 DICOM_2009 (0074,100A) ST ContactURI 1 DICOM_2009 (0074,100C) LO ContactDisplayName 1 DICOM_2009 (0074,100E) SQ UnifiedProcedureStepDiscontinuationReasonCodeSequence 1 DICOM_2009 (0074,1020) SQ BeamTaskSequence 1 DICOM_2009 (0074,1022) CS BeamTaskType 1 DICOM_2009 (0074,1024) IS BeamOrderIndex 1 DICOM_2009 (0074,1030) SQ DeliveryVerificationImageSequence 1 DICOM_2009 (0074,1032) CS VerificationImageTiming 1 DICOM_2009 (0074,1034) CS DoubleExposureFlag 1 DICOM_2009 (0074,1036) CS DoubleExposureOrdering 1 DICOM_2009 (0074,1038) DS DoubleExposureMeterset 1 DICOM_2009 (0074,103A) DS DoubleExposureFieldDelta 4 DICOM_2009 (0074,1040) SQ RelatedReferenceRTImageSequence 1 DICOM_2009 (0074,1042) SQ GeneralMachineVerificationSequence 1 DICOM_2009 (0074,1044) SQ ConventionalMachineVerificationSequence 1 DICOM_2009 (0074,1046) SQ IonMachineVerificationSequence 1 DICOM_2009 (0074,1048) SQ FailedAttributesSequence 1 DICOM_2009 (0074,104A) SQ OverriddenAttributesSequence 1 DICOM_2009 (0074,104C) SQ ConventionalControlPointVerificationSequence 1 DICOM_2009 (0074,104E) SQ IonControlPointVerificationSequence 1 DICOM_2009 (0074,1050) SQ AttributeOccurrenceSequence 1 DICOM_2009 (0074,1052) AT AttributeOccurrencePointer 1 DICOM_2009 (0074,1054) UL AttributeItemSelector 1 DICOM_2009 (0074,1056) LO AttributeOccurrencePrivateCreator 1 DICOM_2009 (0074,1200) CS ScheduledProcedureStepPriority 1 DICOM_2009 (0074,1202) LO WorklistLabel 1 DICOM_2009 (0074,1204) LO ProcedureStepLabel 1 DICOM_2009 (0074,1210) SQ ScheduledProcessingParametersSequence 1 DICOM_2009 (0074,1212) SQ PerformedProcessingParametersSequence 1 DICOM_2009 (0074,1216) SQ UnifiedProcedureStepPerformedProcedureSequence 1 DICOM_2009 (0074,1220) SQ RelatedProcedureStepSequence 1 DICOM_2009 (0074,1222) LO ProcedureStepRelationshipType 1 DICOM_2009 (0074,1230) LO DeletionLock 1 DICOM_2009 (0074,1234) AE ReceivingAE 1 DICOM_2009 (0074,1236) AE RequestingAE 1 DICOM_2009 (0074,1238) LT ReasonForCancellation 1 DICOM_2009 (0074,1242) CS SCPStatus 1 DICOM_2009 (0074,1244) CS SubscriptionListStatus 1 DICOM_2009 (0074,1246) CS UnifiedProcedureStepListStatus 1 DICOM_2009 (0088,0130) SH StorageMediaFileSetID 1 DICOM_2009 (0088,0140) UI StorageMediaFileSetUID 1 DICOM_2009 (0088,0200) SQ IconImageSequence 1 DICOM_2009 (0100,0410) CS SOPInstanceStatus 1 DICOM_2009 (0100,0420) DT SOPAuthorizationDateTime 1 DICOM_2009 (0100,0424) LT SOPAuthorizationComment 1 DICOM_2009 (0100,0426) LO AuthorizationEquipmentCertificationNumber 1 DICOM_2009 (0400,0005) US MACIDNumber 1 DICOM_2009 (0400,0010) UI MACCalculationTransferSyntaxUID 1 DICOM_2009 (0400,0015) CS MACAlgorithm 1 DICOM_2009 (0400,0020) AT DataElementsSigned 1-n DICOM_2009 (0400,0100) UI DigitalSignatureUID 1 DICOM_2009 (0400,0105) DT DigitalSignatureDateTime 1 DICOM_2009 (0400,0110) CS CertificateType 1 DICOM_2009 (0400,0115) OB CertificateOfSigner 1 DICOM_2009 (0400,0120) OB Signature 1 DICOM_2009 (0400,0305) CS CertifiedTimestampType 1 DICOM_2009 (0400,0310) OB CertifiedTimestamp 1 DICOM_2009 (0400,0401) SQ DigitalSignaturePurposeCodeSequence 1 DICOM_2009 (0400,0402) SQ ReferencedDigitalSignatureSequence 1 DICOM_2009 (0400,0403) SQ ReferencedSOPInstanceMACSequence 1 DICOM_2009 (0400,0404) OB MAC 1 DICOM_2009 (0400,0500) SQ EncryptedAttributesSequence 1 DICOM_2009 (0400,0510) UI EncryptedContentTransferSyntaxUID 1 DICOM_2009 (0400,0520) OB EncryptedContent 1 DICOM_2009 (0400,0550) SQ ModifiedAttributesSequence 1 DICOM_2009 (0400,0561) SQ OriginalAttributesSequence 1 DICOM_2009 (0400,0562) DT AttributeModificationDateTime 1 DICOM_2009 (0400,0563) LO ModifyingSystem 1 DICOM_2009 (0400,0564) LO SourceOfPreviousValues 1 DICOM_2009 (0400,0565) CS ReasonForTheAttributeModification 1 DICOM_2009 (2000,0010) IS NumberOfCopies 1 DICOM_2009 (2000,001E) SQ PrinterConfigurationSequence 1 DICOM_2009 (2000,0020) CS PrintPriority 1 DICOM_2009 (2000,0030) CS MediumType 1 DICOM_2009 (2000,0040) CS FilmDestination 1 DICOM_2009 (2000,0050) LO FilmSessionLabel 1 DICOM_2009 (2000,0060) IS MemoryAllocation 1 DICOM_2009 (2000,0061) IS MaximumMemoryAllocation 1 DICOM_2009 (2000,00A0) US MemoryBitDepth 1 DICOM_2009 (2000,00A1) US PrintingBitDepth 1 DICOM_2009 (2000,00A2) SQ MediaInstalledSequence 1 DICOM_2009 (2000,00A4) SQ OtherMediaAvailableSequence 1 DICOM_2009 (2000,00A8) SQ SupportedImageDisplayFormatsSequence 1 DICOM_2009 (2000,0500) SQ ReferencedFilmBoxSequence 1 DICOM_2009 (2010,0010) ST ImageDisplayFormat 1 DICOM_2009 (2010,0030) CS AnnotationDisplayFormatID 1 DICOM_2009 (2010,0040) CS FilmOrientation 1 DICOM_2009 (2010,0050) CS FilmSizeID 1 DICOM_2009 (2010,0052) CS PrinterResolutionID 1 DICOM_2009 (2010,0054) CS DefaultPrinterResolutionID 1 DICOM_2009 (2010,0060) CS MagnificationType 1 DICOM_2009 (2010,0080) CS SmoothingType 1 DICOM_2009 (2010,00A6) CS DefaultMagnificationType 1 DICOM_2009 (2010,00A7) CS OtherMagnificationTypesAvailable 1-n DICOM_2009 (2010,00A8) CS DefaultSmoothingType 1 DICOM_2009 (2010,00A9) CS OtherSmoothingTypesAvailable 1-n DICOM_2009 (2010,0100) CS BorderDensity 1 DICOM_2009 (2010,0110) CS EmptyImageDensity 1 DICOM_2009 (2010,0120) US MinDensity 1 DICOM_2009 (2010,0130) US MaxDensity 1 DICOM_2009 (2010,0140) CS Trim 1 DICOM_2009 (2010,0150) ST ConfigurationInformation 1 DICOM_2009 (2010,0152) LT ConfigurationInformationDescription 1 DICOM_2009 (2010,0154) IS MaximumCollatedFilms 1 DICOM_2009 (2010,015E) US Illumination 1 DICOM_2009 (2010,0160) US ReflectedAmbientLight 1 DICOM_2009 (2010,0376) DS PrinterPixelSpacing 2 DICOM_2009 (2010,0500) SQ ReferencedFilmSessionSequence 1 DICOM_2009 (2010,0510) SQ ReferencedImageBoxSequence 1 DICOM_2009 (2010,0520) SQ ReferencedBasicAnnotationBoxSequence 1 DICOM_2009 (2020,0010) US ImageBoxPosition 1 DICOM_2009 (2020,0020) CS Polarity 1 DICOM_2009 (2020,0030) DS RequestedImageSize 1 DICOM_2009 (2020,0040) CS RequestedDecimateCropBehavior 1 DICOM_2009 (2020,0050) CS RequestedResolutionID 1 DICOM_2009 (2020,00A0) CS RequestedImageSizeFlag 1 DICOM_2009 (2020,00A2) CS DecimateCropResult 1 DICOM_2009 (2020,0110) SQ BasicGrayscaleImageSequence 1 DICOM_2009 (2020,0111) SQ BasicColorImageSequence 1 DICOM_2009 (2030,0010) US AnnotationPosition 1 DICOM_2009 (2030,0020) LO TextString 1 DICOM_2009 (2050,0010) SQ PresentationLUTSequence 1 DICOM_2009 (2050,0020) CS PresentationLUTShape 1 DICOM_2009 (2050,0500) SQ ReferencedPresentationLUTSequence 1 DICOM_2009 (2100,0020) CS ExecutionStatus 1 DICOM_2009 (2100,0030) CS ExecutionStatusInfo 1 DICOM_2009 (2100,0040) DA CreationDate 1 DICOM_2009 (2100,0050) TM CreationTime 1 DICOM_2009 (2100,0070) AE Originator 1 DICOM_2009 (2100,0160) SH OwnerID 1 DICOM_2009 (2100,0170) IS NumberOfFilms 1 DICOM_2009 (2110,0010) CS PrinterStatus 1 DICOM_2009 (2110,0020) CS PrinterStatusInfo 1 DICOM_2009 (2110,0030) LO PrinterName 1 DICOM_2009 (2200,0001) CS LabelUsingInformationExtractedFromInstances 1 DICOM_2009 (2200,0002) UT LabelText 1 DICOM_2009 (2200,0003) CS LabelStyleSelection 1 DICOM_2009 (2200,0004) LT MediaDisposition 1 DICOM_2009 (2200,0005) LT BarcodeValue 1 DICOM_2009 (2200,0006) CS BarcodeSymbology 1 DICOM_2009 (2200,0007) CS AllowMediaSplitting 1 DICOM_2009 (2200,0008) CS IncludeNonDICOMObjects 1 DICOM_2009 (2200,0009) CS IncludeDisplayApplication 1 DICOM_2009 (2200,000A) CS PreserveCompositeInstancesAfterMediaCreation 1 DICOM_2009 (2200,000B) US TotalNumberOfPiecesOfMediaCreated 1 DICOM_2009 (2200,000C) LO RequestedMediaApplicationProfile 1 DICOM_2009 (2200,000D) SQ ReferencedStorageMediaSequence 1 DICOM_2009 (2200,000E) AT FailureAttributes 1-n DICOM_2009 (2200,000F) CS AllowLossyCompression 1 DICOM_2009 (2200,0020) CS RequestPriority 1 DICOM_2009 (3002,0002) SH RTImageLabel 1 DICOM_2009 (3002,0003) LO RTImageName 1 DICOM_2009 (3002,0004) ST RTImageDescription 1 DICOM_2009 (3002,000A) CS ReportedValuesOrigin 1 DICOM_2009 (3002,000C) CS RTImagePlane 1 DICOM_2009 (3002,000D) DS XRayImageReceptorTranslation 3 DICOM_2009 (3002,000E) DS XRayImageReceptorAngle 1 DICOM_2009 (3002,0010) DS RTImageOrientation 6 DICOM_2009 (3002,0011) DS ImagePlanePixelSpacing 2 DICOM_2009 (3002,0012) DS RTImagePosition 2 DICOM_2009 (3002,0020) SH RadiationMachineName 1 DICOM_2009 (3002,0022) DS RadiationMachineSAD 1 DICOM_2009 (3002,0024) DS RadiationMachineSSD 1 DICOM_2009 (3002,0026) DS RTImageSID 1 DICOM_2009 (3002,0028) DS SourceToReferenceObjectDistance 1 DICOM_2009 (3002,0029) IS FractionNumber 1 DICOM_2009 (3002,0030) SQ ExposureSequence 1 DICOM_2009 (3002,0032) DS MetersetExposure 1 DICOM_2009 (3002,0034) DS DiaphragmPosition 4 DICOM_2009 (3002,0040) SQ FluenceMapSequence 1 DICOM_2009 (3002,0041) CS FluenceDataSource 1 DICOM_2009 (3002,0042) DS FluenceDataScale 1 DICOM_2009 (3002,0050) SQ PrimaryFluenceModeSequence 1 DICOM_2009 (3002,0051) CS FluenceMode 1 DICOM_2009 (3002,0052) SH FluenceModeID 1 DICOM_2009 (3004,0001) CS DVHType 1 DICOM_2009 (3004,0002) CS DoseUnits 1 DICOM_2009 (3004,0004) CS DoseType 1 DICOM_2009 (3004,0006) LO DoseComment 1 DICOM_2009 (3004,0008) DS NormalizationPoint 3 DICOM_2009 (3004,000A) CS DoseSummationType 1 DICOM_2009 (3004,000C) DS GridFrameOffsetVector 2-n DICOM_2009 (3004,000E) DS DoseGridScaling 1 DICOM_2009 (3004,0010) SQ RTDoseROISequence 1 DICOM_2009 (3004,0012) DS DoseValue 1 DICOM_2009 (3004,0014) CS TissueHeterogeneityCorrection 1-3 DICOM_2009 (3004,0040) DS DVHNormalizationPoint 3 DICOM_2009 (3004,0042) DS DVHNormalizationDoseValue 1 DICOM_2009 (3004,0050) SQ DVHSequence 1 DICOM_2009 (3004,0052) DS DVHDoseScaling 1 DICOM_2009 (3004,0054) CS DVHVolumeUnits 1 DICOM_2009 (3004,0056) IS DVHNumberOfBins 1 DICOM_2009 (3004,0058) DS DVHData 2-2n DICOM_2009 (3004,0060) SQ DVHReferencedROISequence 1 DICOM_2009 (3004,0062) CS DVHROIContributionType 1 DICOM_2009 (3004,0070) DS DVHMinimumDose 1 DICOM_2009 (3004,0072) DS DVHMaximumDose 1 DICOM_2009 (3004,0074) DS DVHMeanDose 1 DICOM_2009 (3006,0002) SH StructureSetLabel 1 DICOM_2009 (3006,0004) LO StructureSetName 1 DICOM_2009 (3006,0006) ST StructureSetDescription 1 DICOM_2009 (3006,0008) DA StructureSetDate 1 DICOM_2009 (3006,0009) TM StructureSetTime 1 DICOM_2009 (3006,0010) SQ ReferencedFrameOfReferenceSequence 1 DICOM_2009 (3006,0012) SQ RTReferencedStudySequence 1 DICOM_2009 (3006,0014) SQ RTReferencedSeriesSequence 1 DICOM_2009 (3006,0016) SQ ContourImageSequence 1 DICOM_2009 (3006,0020) SQ StructureSetROISequence 1 DICOM_2009 (3006,0022) IS ROINumber 1 DICOM_2009 (3006,0024) UI ReferencedFrameOfReferenceUID 1 DICOM_2009 (3006,0026) LO ROIName 1 DICOM_2009 (3006,0028) ST ROIDescription 1 DICOM_2009 (3006,002A) IS ROIDisplayColor 3 DICOM_2009 (3006,002C) DS ROIVolume 1 DICOM_2009 (3006,0030) SQ RTRelatedROISequence 1 DICOM_2009 (3006,0033) CS RTROIRelationship 1 DICOM_2009 (3006,0036) CS ROIGenerationAlgorithm 1 DICOM_2009 (3006,0038) LO ROIGenerationDescription 1 DICOM_2009 (3006,0039) SQ ROIContourSequence 1 DICOM_2009 (3006,0040) SQ ContourSequence 1 DICOM_2009 (3006,0042) CS ContourGeometricType 1 DICOM_2009 (3006,0044) DS ContourSlabThickness 1 DICOM_2009 (3006,0045) DS ContourOffsetVector 3 DICOM_2009 (3006,0046) IS NumberOfContourPoints 1 DICOM_2009 (3006,0048) IS ContourNumber 1 DICOM_2009 (3006,0049) IS AttachedContours 1-n DICOM_2009 (3006,0050) DS ContourData 3-3n DICOM_2009 (3006,0080) SQ RTROIObservationsSequence 1 DICOM_2009 (3006,0082) IS ObservationNumber 1 DICOM_2009 (3006,0084) IS ReferencedROINumber 1 DICOM_2009 (3006,0085) SH ROIObservationLabel 1 DICOM_2009 (3006,0086) SQ RTROIIdentificationCodeSequence 1 DICOM_2009 (3006,0088) ST ROIObservationDescription 1 DICOM_2009 (3006,00A0) SQ RelatedRTROIObservationsSequence 1 DICOM_2009 (3006,00A4) CS RTROIInterpretedType 1 DICOM_2009 (3006,00A6) PN ROIInterpreter 1 DICOM_2009 (3006,00B0) SQ ROIPhysicalPropertiesSequence 1 DICOM_2009 (3006,00B2) CS ROIPhysicalProperty 1 DICOM_2009 (3006,00B4) DS ROIPhysicalPropertyValue 1 DICOM_2009 (3006,00B6) SQ ROIElementalCompositionSequence 1 DICOM_2009 (3006,00B7) US ROIElementalCompositionAtomicNumber 1 DICOM_2009 (3006,00B8) FL ROIElementalCompositionAtomicMassFraction 1 DICOM_2009 (3006,00C0) SQ FrameOfReferenceRelationshipSequence 1 DICOM_2009 (3006,00C2) UI RelatedFrameOfReferenceUID 1 DICOM_2009 (3006,00C4) CS FrameOfReferenceTransformationType 1 DICOM_2009 (3006,00C6) DS FrameOfReferenceTransformationMatrix 16 DICOM_2009 (3006,00C8) LO FrameOfReferenceTransformationComment 1 DICOM_2009 (3008,0010) SQ MeasuredDoseReferenceSequence 1 DICOM_2009 (3008,0012) ST MeasuredDoseDescription 1 DICOM_2009 (3008,0014) CS MeasuredDoseType 1 DICOM_2009 (3008,0016) DS MeasuredDoseValue 1 DICOM_2009 (3008,0020) SQ TreatmentSessionBeamSequence 1 DICOM_2009 (3008,0021) SQ TreatmentSessionIonBeamSequence 1 DICOM_2009 (3008,0022) IS CurrentFractionNumber 1 DICOM_2009 (3008,0024) DA TreatmentControlPointDate 1 DICOM_2009 (3008,0025) TM TreatmentControlPointTime 1 DICOM_2009 (3008,002A) CS TreatmentTerminationStatus 1 DICOM_2009 (3008,002B) SH TreatmentTerminationCode 1 DICOM_2009 (3008,002C) CS TreatmentVerificationStatus 1 DICOM_2009 (3008,0030) SQ ReferencedTreatmentRecordSequence 1 DICOM_2009 (3008,0032) DS SpecifiedPrimaryMeterset 1 DICOM_2009 (3008,0033) DS SpecifiedSecondaryMeterset 1 DICOM_2009 (3008,0036) DS DeliveredPrimaryMeterset 1 DICOM_2009 (3008,0037) DS DeliveredSecondaryMeterset 1 DICOM_2009 (3008,003A) DS SpecifiedTreatmentTime 1 DICOM_2009 (3008,003B) DS DeliveredTreatmentTime 1 DICOM_2009 (3008,0040) SQ ControlPointDeliverySequence 1 DICOM_2009 (3008,0041) SQ IonControlPointDeliverySequence 1 DICOM_2009 (3008,0042) DS SpecifiedMeterset 1 DICOM_2009 (3008,0044) DS DeliveredMeterset 1 DICOM_2009 (3008,0045) FL MetersetRateSet 1 DICOM_2009 (3008,0046) FL MetersetRateDelivered 1 DICOM_2009 (3008,0047) FL ScanSpotMetersetsDelivered 1-n DICOM_2009 (3008,0048) DS DoseRateDelivered 1 DICOM_2009 (3008,0050) SQ TreatmentSummaryCalculatedDoseReferenceSequence 1 DICOM_2009 (3008,0052) DS CumulativeDoseToDoseReference 1 DICOM_2009 (3008,0054) DA FirstTreatmentDate 1 DICOM_2009 (3008,0056) DA MostRecentTreatmentDate 1 DICOM_2009 (3008,005A) IS NumberOfFractionsDelivered 1 DICOM_2009 (3008,0060) SQ OverrideSequence 1 DICOM_2009 (3008,0061) AT ParameterSequencePointer 1 DICOM_2009 (3008,0062) AT OverrideParameterPointer 1 DICOM_2009 (3008,0063) IS ParameterItemIndex 1 DICOM_2009 (3008,0064) IS MeasuredDoseReferenceNumber 1 DICOM_2009 (3008,0065) AT ParameterPointer 1 DICOM_2009 (3008,0066) ST OverrideReason 1 DICOM_2009 (3008,0068) SQ CorrectedParameterSequence 1 DICOM_2009 (3008,006A) FL CorrectionValue 1 DICOM_2009 (3008,0070) SQ CalculatedDoseReferenceSequence 1 DICOM_2009 (3008,0072) IS CalculatedDoseReferenceNumber 1 DICOM_2009 (3008,0074) ST CalculatedDoseReferenceDescription 1 DICOM_2009 (3008,0076) DS CalculatedDoseReferenceDoseValue 1 DICOM_2009 (3008,0078) DS StartMeterset 1 DICOM_2009 (3008,007A) DS EndMeterset 1 DICOM_2009 (3008,0080) SQ ReferencedMeasuredDoseReferenceSequence 1 DICOM_2009 (3008,0082) IS ReferencedMeasuredDoseReferenceNumber 1 DICOM_2009 (3008,0090) SQ ReferencedCalculatedDoseReferenceSequence 1 DICOM_2009 (3008,0092) IS ReferencedCalculatedDoseReferenceNumber 1 DICOM_2009 (3008,00A0) SQ BeamLimitingDeviceLeafPairsSequence 1 DICOM_2009 (3008,00B0) SQ RecordedWedgeSequence 1 DICOM_2009 (3008,00C0) SQ RecordedCompensatorSequence 1 DICOM_2009 (3008,00D0) SQ RecordedBlockSequence 1 DICOM_2009 (3008,00E0) SQ TreatmentSummaryMeasuredDoseReferenceSequence 1 DICOM_2009 (3008,00F0) SQ RecordedSnoutSequence 1 DICOM_2009 (3008,00F2) SQ RecordedRangeShifterSequence 1 DICOM_2009 (3008,00F4) SQ RecordedLateralSpreadingDeviceSequence 1 DICOM_2009 (3008,00F6) SQ RecordedRangeModulatorSequence 1 DICOM_2009 (3008,0100) SQ RecordedSourceSequence 1 DICOM_2009 (3008,0105) LO SourceSerialNumber 1 DICOM_2009 (3008,0110) SQ TreatmentSessionApplicationSetupSequence 1 DICOM_2009 (3008,0116) CS ApplicationSetupCheck 1 DICOM_2009 (3008,0120) SQ RecordedBrachyAccessoryDeviceSequence 1 DICOM_2009 (3008,0122) IS ReferencedBrachyAccessoryDeviceNumber 1 DICOM_2009 (3008,0130) SQ RecordedChannelSequence 1 DICOM_2009 (3008,0132) DS SpecifiedChannelTotalTime 1 DICOM_2009 (3008,0134) DS DeliveredChannelTotalTime 1 DICOM_2009 (3008,0136) IS SpecifiedNumberOfPulses 1 DICOM_2009 (3008,0138) IS DeliveredNumberOfPulses 1 DICOM_2009 (3008,013A) DS SpecifiedPulseRepetitionInterval 1 DICOM_2009 (3008,013C) DS DeliveredPulseRepetitionInterval 1 DICOM_2009 (3008,0140) SQ RecordedSourceApplicatorSequence 1 DICOM_2009 (3008,0142) IS ReferencedSourceApplicatorNumber 1 DICOM_2009 (3008,0150) SQ RecordedChannelShieldSequence 1 DICOM_2009 (3008,0152) IS ReferencedChannelShieldNumber 1 DICOM_2009 (3008,0160) SQ BrachyControlPointDeliveredSequence 1 DICOM_2009 (3008,0162) DA SafePositionExitDate 1 DICOM_2009 (3008,0164) TM SafePositionExitTime 1 DICOM_2009 (3008,0166) DA SafePositionReturnDate 1 DICOM_2009 (3008,0168) TM SafePositionReturnTime 1 DICOM_2009 (3008,0200) CS CurrentTreatmentStatus 1 DICOM_2009 (3008,0202) ST TreatmentStatusComment 1 DICOM_2009 (3008,0220) SQ FractionGroupSummarySequence 1 DICOM_2009 (3008,0223) IS ReferencedFractionNumber 1 DICOM_2009 (3008,0224) CS FractionGroupType 1 DICOM_2009 (3008,0230) CS BeamStopperPosition 1 DICOM_2009 (3008,0240) SQ FractionStatusSummarySequence 1 DICOM_2009 (3008,0250) DA TreatmentDate 1 DICOM_2009 (3008,0251) TM TreatmentTime 1 DICOM_2009 (300A,0002) SH RTPlanLabel 1 DICOM_2009 (300A,0003) LO RTPlanName 1 DICOM_2009 (300A,0004) ST RTPlanDescription 1 DICOM_2009 (300A,0006) DA RTPlanDate 1 DICOM_2009 (300A,0007) TM RTPlanTime 1 DICOM_2009 (300A,0009) LO TreatmentProtocols 1-n DICOM_2009 (300A,000A) CS PlanIntent 1 DICOM_2009 (300A,000B) LO TreatmentSites 1-n DICOM_2009 (300A,000C) CS RTPlanGeometry 1 DICOM_2009 (300A,000E) ST PrescriptionDescription 1 DICOM_2009 (300A,0010) SQ DoseReferenceSequence 1 DICOM_2009 (300A,0012) IS DoseReferenceNumber 1 DICOM_2009 (300A,0013) UI DoseReferenceUID 1 DICOM_2009 (300A,0014) CS DoseReferenceStructureType 1 DICOM_2009 (300A,0015) CS NominalBeamEnergyUnit 1 DICOM_2009 (300A,0016) LO DoseReferenceDescription 1 DICOM_2009 (300A,0018) DS DoseReferencePointCoordinates 3 DICOM_2009 (300A,001A) DS NominalPriorDose 1 DICOM_2009 (300A,0020) CS DoseReferenceType 1 DICOM_2009 (300A,0021) DS ConstraintWeight 1 DICOM_2009 (300A,0022) DS DeliveryWarningDose 1 DICOM_2009 (300A,0023) DS DeliveryMaximumDose 1 DICOM_2009 (300A,0025) DS TargetMinimumDose 1 DICOM_2009 (300A,0026) DS TargetPrescriptionDose 1 DICOM_2009 (300A,0027) DS TargetMaximumDose 1 DICOM_2009 (300A,0028) DS TargetUnderdoseVolumeFraction 1 DICOM_2009 (300A,002A) DS OrganAtRiskFullVolumeDose 1 DICOM_2009 (300A,002B) DS OrganAtRiskLimitDose 1 DICOM_2009 (300A,002C) DS OrganAtRiskMaximumDose 1 DICOM_2009 (300A,002D) DS OrganAtRiskOverdoseVolumeFraction 1 DICOM_2009 (300A,0040) SQ ToleranceTableSequence 1 DICOM_2009 (300A,0042) IS ToleranceTableNumber 1 DICOM_2009 (300A,0043) SH ToleranceTableLabel 1 DICOM_2009 (300A,0044) DS GantryAngleTolerance 1 DICOM_2009 (300A,0046) DS BeamLimitingDeviceAngleTolerance 1 DICOM_2009 (300A,0048) SQ BeamLimitingDeviceToleranceSequence 1 DICOM_2009 (300A,004A) DS BeamLimitingDevicePositionTolerance 1 DICOM_2009 (300A,004B) FL SnoutPositionTolerance 1 DICOM_2009 (300A,004C) DS PatientSupportAngleTolerance 1 DICOM_2009 (300A,004E) DS TableTopEccentricAngleTolerance 1 DICOM_2009 (300A,004F) FL TableTopPitchAngleTolerance 1 DICOM_2009 (300A,0050) FL TableTopRollAngleTolerance 1 DICOM_2009 (300A,0051) DS TableTopVerticalPositionTolerance 1 DICOM_2009 (300A,0052) DS TableTopLongitudinalPositionTolerance 1 DICOM_2009 (300A,0053) DS TableTopLateralPositionTolerance 1 DICOM_2009 (300A,0055) CS RTPlanRelationship 1 DICOM_2009 (300A,0070) SQ FractionGroupSequence 1 DICOM_2009 (300A,0071) IS FractionGroupNumber 1 DICOM_2009 (300A,0072) LO FractionGroupDescription 1 DICOM_2009 (300A,0078) IS NumberOfFractionsPlanned 1 DICOM_2009 (300A,0079) IS NumberOfFractionPatternDigitsPerDay 1 DICOM_2009 (300A,007A) IS RepeatFractionCycleLength 1 DICOM_2009 (300A,007B) LT FractionPattern 1 DICOM_2009 (300A,0080) IS NumberOfBeams 1 DICOM_2009 (300A,0082) DS BeamDoseSpecificationPoint 3 DICOM_2009 (300A,0084) DS BeamDose 1 DICOM_2009 (300A,0086) DS BeamMeterset 1 DICOM_2009 (300A,0088) FL BeamDosePointDepth 1 DICOM_2009 (300A,0089) FL BeamDosePointEquivalentDepth 1 DICOM_2009 (300A,008A) FL BeamDosePointSSD 1 DICOM_2009 (300A,00A0) IS NumberOfBrachyApplicationSetups 1 DICOM_2009 (300A,00A2) DS BrachyApplicationSetupDoseSpecificationPoint 3 DICOM_2009 (300A,00A4) DS BrachyApplicationSetupDose 1 DICOM_2009 (300A,00B0) SQ BeamSequence 1 DICOM_2009 (300A,00B2) SH TreatmentMachineName 1 DICOM_2009 (300A,00B3) CS PrimaryDosimeterUnit 1 DICOM_2009 (300A,00B4) DS SourceAxisDistance 1 DICOM_2009 (300A,00B6) SQ BeamLimitingDeviceSequence 1 DICOM_2009 (300A,00B8) CS RTBeamLimitingDeviceType 1 DICOM_2009 (300A,00BA) DS SourceToBeamLimitingDeviceDistance 1 DICOM_2009 (300A,00BB) FL IsocenterToBeamLimitingDeviceDistance 1 DICOM_2009 (300A,00BC) IS NumberOfLeafJawPairs 1 DICOM_2009 (300A,00BE) DS LeafPositionBoundaries 3-n DICOM_2009 (300A,00C0) IS BeamNumber 1 DICOM_2009 (300A,00C2) LO BeamName 1 DICOM_2009 (300A,00C3) ST BeamDescription 1 DICOM_2009 (300A,00C4) CS BeamType 1 DICOM_2009 (300A,00C6) CS RadiationType 1 DICOM_2009 (300A,00C7) CS HighDoseTechniqueType 1 DICOM_2009 (300A,00C8) IS ReferenceImageNumber 1 DICOM_2009 (300A,00CA) SQ PlannedVerificationImageSequence 1 DICOM_2009 (300A,00CC) LO ImagingDeviceSpecificAcquisitionParameters 1-n DICOM_2009 (300A,00CE) CS TreatmentDeliveryType 1 DICOM_2009 (300A,00D0) IS NumberOfWedges 1 DICOM_2009 (300A,00D1) SQ WedgeSequence 1 DICOM_2009 (300A,00D2) IS WedgeNumber 1 DICOM_2009 (300A,00D3) CS WedgeType 1 DICOM_2009 (300A,00D4) SH WedgeID 1 DICOM_2009 (300A,00D5) IS WedgeAngle 1 DICOM_2009 (300A,00D6) DS WedgeFactor 1 DICOM_2009 (300A,00D7) FL TotalWedgeTrayWaterEquivalentThickness 1 DICOM_2009 (300A,00D8) DS WedgeOrientation 1 DICOM_2009 (300A,00D9) FL IsocenterToWedgeTrayDistance 1 DICOM_2009 (300A,00DA) DS SourceToWedgeTrayDistance 1 DICOM_2009 (300A,00DB) FL WedgeThinEdgePosition 1 DICOM_2009 (300A,00DC) SH BolusID 1 DICOM_2009 (300A,00DD) ST BolusDescription 1 DICOM_2009 (300A,00E0) IS NumberOfCompensators 1 DICOM_2009 (300A,00E1) SH MaterialID 1 DICOM_2009 (300A,00E2) DS TotalCompensatorTrayFactor 1 DICOM_2009 (300A,00E3) SQ CompensatorSequence 1 DICOM_2009 (300A,00E4) IS CompensatorNumber 1 DICOM_2009 (300A,00E5) SH CompensatorID 1 DICOM_2009 (300A,00E6) DS SourceToCompensatorTrayDistance 1 DICOM_2009 (300A,00E7) IS CompensatorRows 1 DICOM_2009 (300A,00E8) IS CompensatorColumns 1 DICOM_2009 (300A,00E9) DS CompensatorPixelSpacing 2 DICOM_2009 (300A,00EA) DS CompensatorPosition 2 DICOM_2009 (300A,00EB) DS CompensatorTransmissionData 1-n DICOM_2009 (300A,00EC) DS CompensatorThicknessData 1-n DICOM_2009 (300A,00ED) IS NumberOfBoli 1 DICOM_2009 (300A,00EE) CS CompensatorType 1 DICOM_2009 (300A,00F0) IS NumberOfBlocks 1 DICOM_2009 (300A,00F2) DS TotalBlockTrayFactor 1 DICOM_2009 (300A,00F3) FL TotalBlockTrayWaterEquivalentThickness 1 DICOM_2009 (300A,00F4) SQ BlockSequence 1 DICOM_2009 (300A,00F5) SH BlockTrayID 1 DICOM_2009 (300A,00F6) DS SourceToBlockTrayDistance 1 DICOM_2009 (300A,00F7) FL IsocenterToBlockTrayDistance 1 DICOM_2009 (300A,00F8) CS BlockType 1 DICOM_2009 (300A,00F9) LO AccessoryCode 1 DICOM_2009 (300A,00FA) CS BlockDivergence 1 DICOM_2009 (300A,00FB) CS BlockMountingPosition 1 DICOM_2009 (300A,00FC) IS BlockNumber 1 DICOM_2009 (300A,00FE) LO BlockName 1 DICOM_2009 (300A,0100) DS BlockThickness 1 DICOM_2009 (300A,0102) DS BlockTransmission 1 DICOM_2009 (300A,0104) IS BlockNumberOfPoints 1 DICOM_2009 (300A,0106) DS BlockData 2-2n DICOM_2009 (300A,0107) SQ ApplicatorSequence 1 DICOM_2009 (300A,0108) SH ApplicatorID 1 DICOM_2009 (300A,0109) CS ApplicatorType 1 DICOM_2009 (300A,010A) LO ApplicatorDescription 1 DICOM_2009 (300A,010C) DS CumulativeDoseReferenceCoefficient 1 DICOM_2009 (300A,010E) DS FinalCumulativeMetersetWeight 1 DICOM_2009 (300A,0110) IS NumberOfControlPoints 1 DICOM_2009 (300A,0111) SQ ControlPointSequence 1 DICOM_2009 (300A,0112) IS ControlPointIndex 1 DICOM_2009 (300A,0114) DS NominalBeamEnergy 1 DICOM_2009 (300A,0115) DS DoseRateSet 1 DICOM_2009 (300A,0116) SQ WedgePositionSequence 1 DICOM_2009 (300A,0118) CS WedgePosition 1 DICOM_2009 (300A,011A) SQ BeamLimitingDevicePositionSequence 1 DICOM_2009 (300A,011C) DS LeafJawPositions 2-2n DICOM_2009 (300A,011E) DS GantryAngle 1 DICOM_2009 (300A,011F) CS GantryRotationDirection 1 DICOM_2009 (300A,0120) DS BeamLimitingDeviceAngle 1 DICOM_2009 (300A,0121) CS BeamLimitingDeviceRotationDirection 1 DICOM_2009 (300A,0122) DS PatientSupportAngle 1 DICOM_2009 (300A,0123) CS PatientSupportRotationDirection 1 DICOM_2009 (300A,0124) DS TableTopEccentricAxisDistance 1 DICOM_2009 (300A,0125) DS TableTopEccentricAngle 1 DICOM_2009 (300A,0126) CS TableTopEccentricRotationDirection 1 DICOM_2009 (300A,0128) DS TableTopVerticalPosition 1 DICOM_2009 (300A,0129) DS TableTopLongitudinalPosition 1 DICOM_2009 (300A,012A) DS TableTopLateralPosition 1 DICOM_2009 (300A,012C) DS IsocenterPosition 3 DICOM_2009 (300A,012E) DS SurfaceEntryPoint 3 DICOM_2009 (300A,0130) DS SourceToSurfaceDistance 1 DICOM_2009 (300A,0134) DS CumulativeMetersetWeight 1 DICOM_2009 (300A,0140) FL TableTopPitchAngle 1 DICOM_2009 (300A,0142) CS TableTopPitchRotationDirection 1 DICOM_2009 (300A,0144) FL TableTopRollAngle 1 DICOM_2009 (300A,0146) CS TableTopRollRotationDirection 1 DICOM_2009 (300A,0148) FL HeadFixationAngle 1 DICOM_2009 (300A,014A) FL GantryPitchAngle 1 DICOM_2009 (300A,014C) CS GantryPitchRotationDirection 1 DICOM_2009 (300A,014E) FL GantryPitchAngleTolerance 1 DICOM_2009 (300A,0180) SQ PatientSetupSequence 1 DICOM_2009 (300A,0182) IS PatientSetupNumber 1 DICOM_2009 (300A,0183) LO PatientSetupLabel 1 DICOM_2009 (300A,0184) LO PatientAdditionalPosition 1 DICOM_2009 (300A,0190) SQ FixationDeviceSequence 1 DICOM_2009 (300A,0192) CS FixationDeviceType 1 DICOM_2009 (300A,0194) SH FixationDeviceLabel 1 DICOM_2009 (300A,0196) ST FixationDeviceDescription 1 DICOM_2009 (300A,0198) SH FixationDevicePosition 1 DICOM_2009 (300A,0199) FL FixationDevicePitchAngle 1 DICOM_2009 (300A,019A) FL FixationDeviceRollAngle 1 DICOM_2009 (300A,01A0) SQ ShieldingDeviceSequence 1 DICOM_2009 (300A,01A2) CS ShieldingDeviceType 1 DICOM_2009 (300A,01A4) SH ShieldingDeviceLabel 1 DICOM_2009 (300A,01A6) ST ShieldingDeviceDescription 1 DICOM_2009 (300A,01A8) SH ShieldingDevicePosition 1 DICOM_2009 (300A,01B0) CS SetupTechnique 1 DICOM_2009 (300A,01B2) ST SetupTechniqueDescription 1 DICOM_2009 (300A,01B4) SQ SetupDeviceSequence 1 DICOM_2009 (300A,01B6) CS SetupDeviceType 1 DICOM_2009 (300A,01B8) SH SetupDeviceLabel 1 DICOM_2009 (300A,01BA) ST SetupDeviceDescription 1 DICOM_2009 (300A,01BC) DS SetupDeviceParameter 1 DICOM_2009 (300A,01D0) ST SetupReferenceDescription 1 DICOM_2009 (300A,01D2) DS TableTopVerticalSetupDisplacement 1 DICOM_2009 (300A,01D4) DS TableTopLongitudinalSetupDisplacement 1 DICOM_2009 (300A,01D6) DS TableTopLateralSetupDisplacement 1 DICOM_2009 (300A,0200) CS BrachyTreatmentTechnique 1 DICOM_2009 (300A,0202) CS BrachyTreatmentType 1 DICOM_2009 (300A,0206) SQ TreatmentMachineSequence 1 DICOM_2009 (300A,0210) SQ SourceSequence 1 DICOM_2009 (300A,0212) IS SourceNumber 1 DICOM_2009 (300A,0214) CS SourceType 1 DICOM_2009 (300A,0216) LO SourceManufacturer 1 DICOM_2009 (300A,0218) DS ActiveSourceDiameter 1 DICOM_2009 (300A,021A) DS ActiveSourceLength 1 DICOM_2009 (300A,0222) DS SourceEncapsulationNominalThickness 1 DICOM_2009 (300A,0224) DS SourceEncapsulationNominalTransmission 1 DICOM_2009 (300A,0226) LO SourceIsotopeName 1 DICOM_2009 (300A,0228) DS SourceIsotopeHalfLife 1 DICOM_2009 (300A,0229) CS SourceStrengthUnits 1 DICOM_2009 (300A,022A) DS ReferenceAirKermaRate 1 DICOM_2009 (300A,022B) DS SourceStrength 1 DICOM_2009 (300A,022C) DA SourceStrengthReferenceDate 1 DICOM_2009 (300A,022E) TM SourceStrengthReferenceTime 1 DICOM_2009 (300A,0230) SQ ApplicationSetupSequence 1 DICOM_2009 (300A,0232) CS ApplicationSetupType 1 DICOM_2009 (300A,0234) IS ApplicationSetupNumber 1 DICOM_2009 (300A,0236) LO ApplicationSetupName 1 DICOM_2009 (300A,0238) LO ApplicationSetupManufacturer 1 DICOM_2009 (300A,0240) IS TemplateNumber 1 DICOM_2009 (300A,0242) SH TemplateType 1 DICOM_2009 (300A,0244) LO TemplateName 1 DICOM_2009 (300A,0250) DS TotalReferenceAirKerma 1 DICOM_2009 (300A,0260) SQ BrachyAccessoryDeviceSequence 1 DICOM_2009 (300A,0262) IS BrachyAccessoryDeviceNumber 1 DICOM_2009 (300A,0263) SH BrachyAccessoryDeviceID 1 DICOM_2009 (300A,0264) CS BrachyAccessoryDeviceType 1 DICOM_2009 (300A,0266) LO BrachyAccessoryDeviceName 1 DICOM_2009 (300A,026A) DS BrachyAccessoryDeviceNominalThickness 1 DICOM_2009 (300A,026C) DS BrachyAccessoryDeviceNominalTransmission 1 DICOM_2009 (300A,0280) SQ ChannelSequence 1 DICOM_2009 (300A,0282) IS ChannelNumber 1 DICOM_2009 (300A,0284) DS ChannelLength 1 DICOM_2009 (300A,0286) DS ChannelTotalTime 1 DICOM_2009 (300A,0288) CS SourceMovementType 1 DICOM_2009 (300A,028A) IS NumberOfPulses 1 DICOM_2009 (300A,028C) DS PulseRepetitionInterval 1 DICOM_2009 (300A,0290) IS SourceApplicatorNumber 1 DICOM_2009 (300A,0291) SH SourceApplicatorID 1 DICOM_2009 (300A,0292) CS SourceApplicatorType 1 DICOM_2009 (300A,0294) LO SourceApplicatorName 1 DICOM_2009 (300A,0296) DS SourceApplicatorLength 1 DICOM_2009 (300A,0298) LO SourceApplicatorManufacturer 1 DICOM_2009 (300A,029C) DS SourceApplicatorWallNominalThickness 1 DICOM_2009 (300A,029E) DS SourceApplicatorWallNominalTransmission 1 DICOM_2009 (300A,02A0) DS SourceApplicatorStepSize 1 DICOM_2009 (300A,02A2) IS TransferTubeNumber 1 DICOM_2009 (300A,02A4) DS TransferTubeLength 1 DICOM_2009 (300A,02B0) SQ ChannelShieldSequence 1 DICOM_2009 (300A,02B2) IS ChannelShieldNumber 1 DICOM_2009 (300A,02B3) SH ChannelShieldID 1 DICOM_2009 (300A,02B4) LO ChannelShieldName 1 DICOM_2009 (300A,02B8) DS ChannelShieldNominalThickness 1 DICOM_2009 (300A,02BA) DS ChannelShieldNominalTransmission 1 DICOM_2009 (300A,02C8) DS FinalCumulativeTimeWeight 1 DICOM_2009 (300A,02D0) SQ BrachyControlPointSequence 1 DICOM_2009 (300A,02D2) DS ControlPointRelativePosition 1 DICOM_2009 (300A,02D4) DS ControlPoint3DPosition 3 DICOM_2009 (300A,02D6) DS CumulativeTimeWeight 1 DICOM_2009 (300A,02E0) CS CompensatorDivergence 1 DICOM_2009 (300A,02E1) CS CompensatorMountingPosition 1 DICOM_2009 (300A,02E2) DS SourceToCompensatorDistance 1-n DICOM_2009 (300A,02E3) FL TotalCompensatorTrayWaterEquivalentThickness 1 DICOM_2009 (300A,02E4) FL IsocenterToCompensatorTrayDistance 1 DICOM_2009 (300A,02E5) FL CompensatorColumnOffset 1 DICOM_2009 (300A,02E6) FL IsocenterToCompensatorDistances 1-n DICOM_2009 (300A,02E7) FL CompensatorRelativeStoppingPowerRatio 1 DICOM_2009 (300A,02E8) FL CompensatorMillingToolDiameter 1 DICOM_2009 (300A,02EA) SQ IonRangeCompensatorSequence 1 DICOM_2009 (300A,02EB) LT CompensatorDescription 1 DICOM_2009 (300A,0302) IS RadiationMassNumber 1 DICOM_2009 (300A,0304) IS RadiationAtomicNumber 1 DICOM_2009 (300A,0306) SS RadiationChargeState 1 DICOM_2009 (300A,0308) CS ScanMode 1 DICOM_2009 (300A,030A) FL VirtualSourceAxisDistances 2 DICOM_2009 (300A,030C) SQ SnoutSequence 1 DICOM_2009 (300A,030D) FL SnoutPosition 1 DICOM_2009 (300A,030F) SH SnoutID 1 DICOM_2009 (300A,0312) IS NumberOfRangeShifters 1 DICOM_2009 (300A,0314) SQ RangeShifterSequence 1 DICOM_2009 (300A,0316) IS RangeShifterNumber 1 DICOM_2009 (300A,0318) SH RangeShifterID 1 DICOM_2009 (300A,0320) CS RangeShifterType 1 DICOM_2009 (300A,0322) LO RangeShifterDescription 1 DICOM_2009 (300A,0330) IS NumberOfLateralSpreadingDevices 1 DICOM_2009 (300A,0332) SQ LateralSpreadingDeviceSequence 1 DICOM_2009 (300A,0334) IS LateralSpreadingDeviceNumber 1 DICOM_2009 (300A,0336) SH LateralSpreadingDeviceID 1 DICOM_2009 (300A,0338) CS LateralSpreadingDeviceType 1 DICOM_2009 (300A,033A) LO LateralSpreadingDeviceDescription 1 DICOM_2009 (300A,033C) FL LateralSpreadingDeviceWaterEquivalentThickness 1 DICOM_2009 (300A,0340) IS NumberOfRangeModulators 1 DICOM_2009 (300A,0342) SQ RangeModulatorSequence 1 DICOM_2009 (300A,0344) IS RangeModulatorNumber 1 DICOM_2009 (300A,0346) SH RangeModulatorID 1 DICOM_2009 (300A,0348) CS RangeModulatorType 1 DICOM_2009 (300A,034A) LO RangeModulatorDescription 1 DICOM_2009 (300A,034C) SH BeamCurrentModulationID 1 DICOM_2009 (300A,0350) CS PatientSupportType 1 DICOM_2009 (300A,0352) SH PatientSupportID 1 DICOM_2009 (300A,0354) LO PatientSupportAccessoryCode 1 DICOM_2009 (300A,0356) FL FixationLightAzimuthalAngle 1 DICOM_2009 (300A,0358) FL FixationLightPolarAngle 1 DICOM_2009 (300A,035A) FL MetersetRate 1 DICOM_2009 (300A,0360) SQ RangeShifterSettingsSequence 1 DICOM_2009 (300A,0362) LO RangeShifterSetting 1 DICOM_2009 (300A,0364) FL IsocenterToRangeShifterDistance 1 DICOM_2009 (300A,0366) FL RangeShifterWaterEquivalentThickness 1 DICOM_2009 (300A,0370) SQ LateralSpreadingDeviceSettingsSequence 1 DICOM_2009 (300A,0372) LO LateralSpreadingDeviceSetting 1 DICOM_2009 (300A,0374) FL IsocenterToLateralSpreadingDeviceDistance 1 DICOM_2009 (300A,0380) SQ RangeModulatorSettingsSequence 1 DICOM_2009 (300A,0382) FL RangeModulatorGatingStartValue 1 DICOM_2009 (300A,0384) FL RangeModulatorGatingStopValue 1 DICOM_2009 (300A,0386) FL RangeModulatorGatingStartWaterEquivalentThickness 1 DICOM_2009 (300A,0388) FL RangeModulatorGatingStopWaterEquivalentThickness 1 DICOM_2009 (300A,038A) FL IsocenterToRangeModulatorDistance 1 DICOM_2009 (300A,0390) SH ScanSpotTuneID 1 DICOM_2009 (300A,0392) IS NumberOfScanSpotPositions 1 DICOM_2009 (300A,0394) FL ScanSpotPositionMap 1-n DICOM_2009 (300A,0396) FL ScanSpotMetersetWeights 1-n DICOM_2009 (300A,0398) FL ScanningSpotSize 2 DICOM_2009 (300A,039A) IS NumberOfPaintings 1 DICOM_2009 (300A,03A0) SQ IonToleranceTableSequence 1 DICOM_2009 (300A,03A2) SQ IonBeamSequence 1 DICOM_2009 (300A,03A4) SQ IonBeamLimitingDeviceSequence 1 DICOM_2009 (300A,03A6) SQ IonBlockSequence 1 DICOM_2009 (300A,03A8) SQ IonControlPointSequence 1 DICOM_2009 (300A,03AA) SQ IonWedgeSequence 1 DICOM_2009 (300A,03AC) SQ IonWedgePositionSequence 1 DICOM_2009 (300A,0401) SQ ReferencedSetupImageSequence 1 DICOM_2009 (300A,0402) ST SetupImageComment 1 DICOM_2009 (300A,0410) SQ MotionSynchronizationSequence 1 DICOM_2009 (300A,0412) FL ControlPointOrientation 3 DICOM_2009 (300A,0420) SQ GeneralAccessorySequence 1 DICOM_2009 (300A,0421) SH GeneralAccessoryID 1 DICOM_2009 (300A,0422) ST GeneralAccessoryDescription 1 DICOM_2009 (300A,0423) CS GeneralAccessoryType 1 DICOM_2009 (300A,0424) IS GeneralAccessoryNumber 1 DICOM_2009 (300C,0002) SQ ReferencedRTPlanSequence 1 DICOM_2009 (300C,0004) SQ ReferencedBeamSequence 1 DICOM_2009 (300C,0006) IS ReferencedBeamNumber 1 DICOM_2009 (300C,0007) IS ReferencedReferenceImageNumber 1 DICOM_2009 (300C,0008) DS StartCumulativeMetersetWeight 1 DICOM_2009 (300C,0009) DS EndCumulativeMetersetWeight 1 DICOM_2009 (300C,000A) SQ ReferencedBrachyApplicationSetupSequence 1 DICOM_2009 (300C,000C) IS ReferencedBrachyApplicationSetupNumber 1 DICOM_2009 (300C,000E) IS ReferencedSourceNumber 1 DICOM_2009 (300C,0020) SQ ReferencedFractionGroupSequence 1 DICOM_2009 (300C,0022) IS ReferencedFractionGroupNumber 1 DICOM_2009 (300C,0040) SQ ReferencedVerificationImageSequence 1 DICOM_2009 (300C,0042) SQ ReferencedReferenceImageSequence 1 DICOM_2009 (300C,0050) SQ ReferencedDoseReferenceSequence 1 DICOM_2009 (300C,0051) IS ReferencedDoseReferenceNumber 1 DICOM_2009 (300C,0055) SQ BrachyReferencedDoseReferenceSequence 1 DICOM_2009 (300C,0060) SQ ReferencedStructureSetSequence 1 DICOM_2009 (300C,006A) IS ReferencedPatientSetupNumber 1 DICOM_2009 (300C,0080) SQ ReferencedDoseSequence 1 DICOM_2009 (300C,00A0) IS ReferencedToleranceTableNumber 1 DICOM_2009 (300C,00B0) SQ ReferencedBolusSequence 1 DICOM_2009 (300C,00C0) IS ReferencedWedgeNumber 1 DICOM_2009 (300C,00D0) IS ReferencedCompensatorNumber 1 DICOM_2009 (300C,00E0) IS ReferencedBlockNumber 1 DICOM_2009 (300C,00F0) IS ReferencedControlPointIndex 1 DICOM_2009 (300C,00F2) SQ ReferencedControlPointSequence 1 DICOM_2009 (300C,00F4) IS ReferencedStartControlPointIndex 1 DICOM_2009 (300C,00F6) IS ReferencedStopControlPointIndex 1 DICOM_2009 (300C,0100) IS ReferencedRangeShifterNumber 1 DICOM_2009 (300C,0102) IS ReferencedLateralSpreadingDeviceNumber 1 DICOM_2009 (300C,0104) IS ReferencedRangeModulatorNumber 1 DICOM_2009 (300E,0002) CS ApprovalStatus 1 DICOM_2009 (300E,0004) DA ReviewDate 1 DICOM_2009 (300E,0005) TM ReviewTime 1 DICOM_2009 (300E,0008) PN ReviewerName 1 DICOM_2009 (4FFE,0001) SQ MACParametersSequence 1 DICOM_2009 (5200,9229) SQ SharedFunctionalGroupsSequence 1 DICOM_2009 (5200,9230) SQ PerFrameFunctionalGroupsSequence 1 DICOM_2009 (5400,0100) SQ WaveformSequence 1 DICOM_2009 (5400,0110) ox ChannelMinimumValue 1 DICOM_2009 (5400,0112) ox ChannelMaximumValue 1 DICOM_2009 (5400,1004) US WaveformBitsAllocated 1 DICOM_2009 (5400,1006) CS WaveformSampleInterpretation 1 DICOM_2009 (5400,100A) ox WaveformPaddingValue 1 DICOM_2009 (5400,1010) ox WaveformData 1 DICOM_2009 (5600,0010) OF FirstOrderPhaseCorrectionAngle 1 DICOM_2009 (5600,0020) OF SpectroscopyData 1 DICOM_2009 (6000-60FF,0010) US OverlayRows 1 DICOM_2009 (6000-60FF,0011) US OverlayColumns 1 DICOM_2009 (6000-60FF,0015) IS NumberOfFramesInOverlay 1 DICOM_2009 (6000-60FF,0022) LO OverlayDescription 1 DICOM_2009 (6000-60FF,0040) CS OverlayType 1 DICOM_2009 (6000-60FF,0045) LO OverlaySubtype 1 DICOM_2009 (6000-60FF,0050) SS OverlayOrigin 2 DICOM_2009 (6000-60FF,0051) US ImageFrameOrigin 1 DICOM_2009 (6000-60FF,0100) US OverlayBitsAllocated 1 DICOM_2009 (6000-60FF,0102) US OverlayBitPosition 1 DICOM_2009 (6000-60FF,1001) CS OverlayActivationLayer 1 DICOM_2009 (6000-60FF,1301) IS ROIArea 1 DICOM_2009 (6000-60FF,1302) DS ROIMean 1 DICOM_2009 (6000-60FF,1303) DS ROIStandardDeviation 1 DICOM_2009 (6000-60FF,1500) LO OverlayLabel 1 DICOM_2009 (6000-60FF,3000) ox OverlayData 1 DICOM_2009 (7FE0,0010) ox PixelData 1 DICOM_2009 (FFFA,FFFA) SQ DigitalSignaturesSequence 1 DICOM_2009 (FFFC,FFFC) OB DataSetTrailingPadding 1 DICOM_2009 (FFFE,E000) na Item 1 DICOM_2009 (FFFE,E00D) na ItemDelimitationItem 1 DICOM_2009 (FFFE,E0DD) na SequenceDelimitationItem 1 DICOM_2009 # #--------------------------------------------------------------------------- # # Supplement 120 (Extended Presentation States) # (0070,0207) LO GraphicGroupLabel 1 Supplement_120 (0070,0208) ST GraphicGroupDescription 1 Supplement_120 (0070,0209) SQ CompoundGraphicSequence 1 Supplement_120 (0070,0226) UL CompoundGraphicInstanceID 1 Supplement_120 (0070,0227) LO FontName 1 Supplement_120 (0070,0228) CS FontNameType 1 Supplement_120 (0070,0229) LO CSSFontName 1 Supplement_120 (0070,0230) FD RotationAngle 1 Supplement_120 (0070,0231) SQ TextStyleSequence 1 Supplement_120 (0070,0232) SQ LineStyleSequence 1 Supplement_120 (0070,0233) SQ FillStyleSequence 1 Supplement_120 (0070,0234) SQ GraphicGroupSequence 1 Supplement_120 (0070,0241) US TextColorCIELabValue 3 Supplement_120 (0070,0242) CS HorizontalAlignment 1 Supplement_120 (0070,0243) CS VerticalAlignment 1 Supplement_120 (0070,0244) CS ShadowStyle 1 Supplement_120 (0070,0245) FL ShadowOffsetX 1 Supplement_120 (0070,0246) FL ShadowOffsetY 1 Supplement_120 (0070,0247) US ShadowColorCIELabValue 3 Supplement_120 (0070,0248) CS Underlined 1 Supplement_120 (0070,0249) CS Bold 1 Supplement_120 (0070,0250) CS Italic 1 Supplement_120 (0070,0251) US PatternOnColorCIELabValue 3 Supplement_120 (0070,0252) US PatternOffColorCIELabValue 3 Supplement_120 (0070,0253) FL LineThickness 1 Supplement_120 (0070,0254) CS LineDashingStyle 1 Supplement_120 (0070,0255) UL LinePattern 1 Supplement_120 (0070,0256) OB FillPattern 1 Supplement_120 (0070,0257) CS FillMode 1 Supplement_120 (0070,0258) FL ShadowOpacity 1 Supplement_120 (0070,0261) FL GapLength 1 Supplement_120 (0070,0262) FL DiameterOfVisibility 1 Supplement_120 (0070,0273) FL RotationPoint 2 Supplement_120 (0070,0274) CS TickAlignment 1 Supplement_120 (0070,0278) CS ShowTickLabel 1 Supplement_120 (0070,0279) CS TickLabelAlignment 1 Supplement_120 (0070,0282) CS CompoundGraphicUnits 1 Supplement_120 (0070,0284) FL PatternOnOpacity 1 Supplement_120 (0070,0285) FL PatternOffOpacity 1 Supplement_120 (0070,0287) SQ MajorTicksSequence 1 Supplement_120 (0070,0288) FL TickPosition 1 Supplement_120 (0070,0289) SH TickLabel 1 Supplement_120 (0070,0294) CS CompoundGraphicType 1 Supplement_120 (0070,0295) UL GraphicGroupID 1 Supplement_120 # #--------------------------------------------------------------------------- # # Supplement 131 (Implant Templates) # (0068,6210) LO ImplantSize 1 Supplement_131 (0068,6221) LO ImplantTemplateVersion 1 Supplement_131 (0068,6222) SQ ReplacedImplantTemplateSequence 1 Supplement_131 (0068,6223) CS ImplantType 1 Supplement_131 (0068,6224) SQ DerivationImplantTemplateSequence 1 Supplement_131 (0068,6225) SQ OriginalImplantTemplateSequence 1 Supplement_131 (0068,6226) DT EffectiveDateTime 1 Supplement_131 (0068,6230) SQ ImplantTargetAnatomySequence 1 Supplement_131 (0068,6260) SQ InformationFromManufacturerSequence 1 Supplement_131 (0068,6265) SQ NotificationFromManufacturerSequence 1 Supplement_131 (0068,6270) DT InformationIssueDateTime 1 Supplement_131 (0068,6280) ST InformationSummary 1 Supplement_131 (0068,62A0) SQ ImplantRegulatoryDisapprovalCodeSequence 1 Supplement_131 (0068,62A5) FD OverallTemplateSpatialTolerance 1 Supplement_131 (0068,62C0) SQ HPGLDocumentSequence 1 Supplement_131 (0068,62D0) US HPGLDocumentID 1 Supplement_131 (0068,62D5) LO HPGLDocumentLabel 1 Supplement_131 (0068,62E0) SQ ViewOrientationCodeSequence 1 Supplement_131 (0068,62F0) FD ViewOrientationModifier 9 Supplement_131 (0068,62F2) FD HPGLDocumentScaling 1 Supplement_131 (0068,6300) OB HPGLDocument 1 Supplement_131 (0068,6310) US HPGLContourPenNumber 1 Supplement_131 (0068,6320) SQ HPGLPenSequence 1 Supplement_131 (0068,6330) US HPGLPenNumber 1 Supplement_131 (0068,6340) LO HPGLPenLabel 1 Supplement_131 (0068,6345) ST HPGLPenDescription 1 Supplement_131 (0068,6346) FD RecommendedRotationPoint 2 Supplement_131 (0068,6347) FD BoundingRectangle 4 Supplement_131 (0068,6350) US ImplantTemplate3DModelSurfaceNumber 1-n Supplement_131 (0068,6360) SQ SurfaceModelDescriptionSequence 1 Supplement_131 (0068,6380) LO SurfaceModelLabel 1 Supplement_131 (0068,6390) FD SurfaceModelScalingFactor 1 Supplement_131 (0068,63A0) SQ MaterialsCodeSequence 1 Supplement_131 (0068,63A4) SQ CoatingMaterialsCodeSequence 1 Supplement_131 (0068,63A8) SQ ImplantTypeCodeSequence 1 Supplement_131 (0068,63AC) SQ FixationMethodCodeSequence 1 Supplement_131 (0068,63B0) SQ MatingFeatureSetsSequence 1 Supplement_131 (0068,63C0) US MatingFeatureSetID 1 Supplement_131 (0068,63D0) LO MatingFeatureSetLabel 1 Supplement_131 (0068,63E0) SQ MatingFeatureSequence 1 Supplement_131 (0068,63F0) US MatingFeatureID 1 Supplement_131 (0068,6400) SQ MatingFeatureDegreeOfFreedomSequence 1 Supplement_131 (0068,6410) US DegreeOfFreedomID 1 Supplement_131 (0068,6420) CS DegreeOfFreedomType 1 Supplement_131 (0068,6430) SQ TwoDMatingFeatureCoordinatesSequence 1 Supplement_131 (0068,6440) US ReferencedHPGLDocumentID 1 Supplement_131 (0068,6450) FD TwoDMatingPoint 2 Supplement_131 (0068,6460) FD TwoDMatingAxes 4 Supplement_131 (0068,6470) SQ TwoDDegreeOfFreedomSequence 1 Supplement_131 (0068,6490) FD ThreeDDegreeOfFreedomAxis 3 Supplement_131 (0068,64A0) FD RangeOfFreedom 2 Supplement_131 (0068,64C0) FD ThreeDMatingPoint 3 Supplement_131 (0068,64D0) FD ThreeDMatingAxes 9 Supplement_131 (0068,64F0) FD TwoDDegreeOfFreedomAxis 3 Supplement_131 (0068,6500) SQ PlanningLandmarkPointSequence 1 Supplement_131 (0068,6510) SQ PlanningLandmarkLineSequence 1 Supplement_131 (0068,6520) SQ PlanningLandmarkPlaneSequence 1 Supplement_131 (0068,6530) US PlanningLandmarkID 1 Supplement_131 (0068,6540) LO PlanningLandmarkDescription 1 Supplement_131 (0068,6545) SQ PlanningLandmarkIdentificationCodeSequence 1 Supplement_131 (0068,6550) SQ TwoDPointCoordinatesSequence 1 Supplement_131 (0068,6560) FD TwoDPointCoordinates 2 Supplement_131 (0068,6590) FD ThreeDPointCoordinates 3 Supplement_131 (0068,65A0) SQ TwoDLineCoordinatesSequence 1 Supplement_131 (0068,65B0) FD TwoDLineCoordinates 4 Supplement_131 (0068,65D0) FD ThreeDLineCoordinates 6 Supplement_131 (0068,65E0) SQ TwoDPlaneCoordinatesSequence 1 Supplement_131 (0068,65F0) FD TwoDPlaneIntersection 4 Supplement_131 (0068,6610) FD ThreeDPlaneOrigin 3 Supplement_131 (0068,6620) FD ThreeDPlaneNormal 3 Supplement_131 (0076,0001) LO ImplantAssemblyTemplateName 1 Supplement_131 (0076,0003) LO ImplantAssemblyTemplateIssuer 1 Supplement_131 (0076,0006) LO ImplantAssemblyTemplateVersion 1 Supplement_131 (0076,0008) SQ ReplacedImplantAssemblyTemplateSequence 1 Supplement_131 (0076,000A) CS ImplantAssemblyTemplateType 1 Supplement_131 (0076,000C) SQ OriginalImplantAssemblyTemplateSequence 1 Supplement_131 (0076,000E) SQ DerivationImplantAssemblyTemplateSequence 1 Supplement_131 (0076,0010) SQ ImplantAssemblyTemplateTargetAnatomySequence 1 Supplement_131 (0076,0020) SQ ProcedureTypeCodeSequence 1 Supplement_131 (0076,0030) LO SurgicalTechnique 1 Supplement_131 (0076,0032) SQ ComponentTypesSequence 1 Supplement_131 (0076,0034) CS ComponentTypeCodeSequence 1 Supplement_131 (0076,0036) CS ExclusiveComponentType 1 Supplement_131 (0076,0038) CS MandatoryComponentType 1 Supplement_131 (0076,0040) SQ ComponentSequence 1 Supplement_131 (0076,0055) US ComponentID 1 Supplement_131 (0076,0060) SQ ComponentAssemblySequence 1 Supplement_131 (0076,0070) US Component1ReferencedID 1 Supplement_131 (0076,0080) US Component1ReferencedMatingFeatureSetID 1 Supplement_131 (0076,0090) US Component1ReferencedMatingFeatureID 1 Supplement_131 (0076,00A0) US Component2ReferencedID 1 Supplement_131 (0076,00B0) US Component2ReferencedMatingFeatureSetID 1 Supplement_131 (0076,00C0) US Component2ReferencedMatingFeatureID 1 Supplement_131 (0078,0000) LO ImplantTemplateGroupName 1 Supplement_131 (0078,0010) ST ImplantTemplateGroupDescription 1 Supplement_131 (0078,0020) LO ImplantTemplateGroupIssuer 1 Supplement_131 (0078,0024) LO ImplantTemplateGroupVersion 1 Supplement_131 (0078,0026) SQ ReplacedImplantTemplateGroupSequence 1 Supplement_131 (0078,0028) SQ ImplantTemplateGroupTargetAnatomySequence 1 Supplement_131 (0078,002A) SQ ImplantTemplateGroupMembersSequence 1 Supplement_131 (0078,002E) US ImplantTemplateGroupMemberID 1 Supplement_131 (0078,0050) FD ThreeDImplantTemplateGroupMemberMatchingPoint 3 Supplement_131 (0078,0060) FD ThreeDImplantTemplateGroupMemberMatchingAxes 9 Supplement_131 (0078,0070) SQ ImplantTemplateGroupMemberMatching2DCoordinatesSequence 1 Supplement_131 (0078,0090) FD TwoDImplantTemplateGroupMemberMatchingPoint 2 Supplement_131 (0078,00A0) FD TwoDImplantTemplateGroupMemberMatchingAxes 4 Supplement_131 (0078,00B0) SQ ImplantTemplateGroupVariationDimensionSequence 1 Supplement_131 (0078,00B2) LO ImplantTemplateGroupVariationDimensionName 1 Supplement_131 (0078,00B4) SQ ImplantTemplateGroupVariationDimensionRankSequence 1 Supplement_131 (0078,00B6) US ReferencedImplantTemplateGroupMemberID 1 Supplement_131 (0078,00B8) US ImplantTemplateGroupVariationDimensionRank 1 Supplement_131 # #--------------------------------------------------------------------------- # # Supplement 144 (Ophthalmic Axial Measurements Storage SOP Classes) # (0022,1007) SQ OphthalmicAxialMeasurementsRightEyeSequence 1 Supplement_144 (0022,1008) SQ OphthalmicAxialMeasurementsLeftEyeSequence 1 Supplement_144 (0022,1009) CS OphthalmicAxialMeasurementsDeviceType 1 Supplement_144 (0022,1010) CS OphthalmicAxialLengthMeasurementsType 1 Supplement_144 (0022,1012) SQ OphthalmicAxialLengthSequence 1 Supplement_144 (0022,1019) FL OphthalmicAxialLength 1 Supplement_144 (0022,1024) SQ LensStatusCodeSequence 1 Supplement_144 (0022,1025) SQ VitreousStatusCodeSequence 1 Supplement_144 (0022,1028) SQ IOLFormulaCodeSequence 1 Supplement_144 (0022,1029) LO IOLFormulaDetail 1 Supplement_144 (0022,1033) FL KeratometerIndex 1 Supplement_144 (0022,1035) SQ SourceofOphthalmicAxialLengthCodeSequence 1 Supplement_144 (0022,1037) FL TargetRefraction 1 Supplement_144 (0022,1039) CS RefractiveProcedureOccurred 1 Supplement_144 (0022,1040) SQ RefractiveSurgeryTypeCodeSequence 1 Supplement_144 (0022,1044) SQ OphthalmicUltrasoundMethodCodeSequence 1 Supplement_144 (0022,1050) SQ OphthalmicAxialLengthMeasurementsSequence 1 Supplement_144 (0022,1053) FL IOLPower 1 Supplement_144 (0022,1054) FL PredictedRefractiveError 1 Supplement_144 (0022,1059) FL OphthalmicAxialLengthVelocity 1 Supplement_144 (0022,1065) LO LensStatusDescription 1 Supplement_144 (0022,1066) LO VitreousStatusDescription 1 Supplement_144 (0022,1090) SQ IOLPowerSequence 1 Supplement_144 (0022,1092) SQ LensConstantSequence 1 Supplement_144 (0022,1093) LO IOLManufacturer 1 Supplement_144 (0022,1095) LO ImplantName 1 Supplement_144 (0022,1096) SQ KeratometryMeasurementTypeCodeSequence 1 Supplement_144 (0022,1097) LO ImplantPartNumber 1 Supplement_144 (0022,1100) SQ ReferencedOphthalmicAxialMeasurementsSequence 1 Supplement_144 (0022,1101) SQ OphthalmicAxialLengthMeasurementsSegmentNameCodeSequence 1 Supplement_144 (0022,1103) SQ RefractiveErrorBeforeRefractiveSurgeryCodeSequence 1 Supplement_144 (0022,1121) FL IOLPowerForExactEmmetropia 1 Supplement_144 (0022,1122) FL IOLPowerForExactTargetRefraction 1 Supplement_144 (0022,1125) SQ AnteriorChamberDepthDefinitionCodeSequence 1 Supplement_144 (0022,1127) SQ LensThicknessSequence 1 Supplement_144 (0022,1128) SQ AnteriorChamberDepthSequence 1 Supplement_144 (0022,1130) FL LensThickness 1 Supplement_144 (0022,1131) FL AnteriorChamberDepth 1 Supplement_144 (0022,1132) SQ SourceofLensThicknessDataCodeSequence 1 Supplement_144 (0022,1133) SQ SourceofAnteriorChamberDepthDataCodeSequence 1 Supplement_144 (0022,1134) SQ SourceofRefractiveMeasurementsSequence 1 Supplement_144 (0022,1135) SQ SourceofRefractiveMeasurementsCodeSequence 1 Supplement_144 (0022,1140) CS OphthalmicAxialLengthMeasurementModified 1 Supplement_144 (0022,1150) SQ OphthalmicAxialLengthDataSourceCodeSequence 1 Supplement_144 (0022,1155) FL SignaltoNoiseRatio 1 Supplement_144 (0022,1159) LO OphthalmicAxialLengthDataSourceDescription 1 Supplement_144 (0022,1210) SQ OphthalmicAxialLengthMeasurementsTotalLengthSequence 1 Supplement_144 (0022,1211) SQ OphthalmicAxialLengthMeasurementsSegmentalLengthSequence 1 Supplement_144 (0022,1212) SQ OphthalmicAxialLengthMeasurementsLengthSummationSequence 1 Supplement_144 (0022,1220) SQ UltrasoundOphthalmicAxialLengthMeasurementsSequence 1 Supplement_144 (0022,1225) SQ OpticalOphthalmicAxialLengthMeasurementsSequence 1 Supplement_144 (0022,1230) SQ UltrasoundSelectedOphthalmicAxialLengthSequence 1 Supplement_144 (0022,1250) SQ OphthalmicAxialLengthSelectionMethodCodeSequence 1 Supplement_144 (0022,1255) SQ OpticalSelectedOphthalmicAxialLengthSequence 1 Supplement_144 (0022,1257) SQ SelectedSegmentalOphthalmicAxialLengthSequence 1 Supplement_144 (0022,1260) SQ SelectedTotalOphthalmicAxialLengthSequence 1 Supplement_144 (0022,1262) SQ OphthalmicAxialLengthQualityMetricSequence 1 Supplement_144 (0022,1265) SQ OphthalmicAxialLengthQualityMetricTypeCodeSequence 1 Supplement_144 (0022,1300) SQ IntraocularLensCalculationsRightEyeSequence 1 Supplement_144 (0022,1310) SQ IntraocularLensCalculationsLeftEyeSequence 1 Supplement_144 (0022,1330) SQ ReferencedOphthalmicAxialLengthMeasurementQCImageSequence 1 Supplement_144 # #--------------------------------------------------------------------------- # # Supplement 145 (Whole Slide Microscopic Image IOD and SOP Classes) # (0040,08D8) SQ RETIRED_PixelSpacingSequence 1 Supplement_145/retired (0040,08DA) SQ RETIRED_CoordinateSystemAxisCodeSequence 1 Supplement_145/retired (0048,0001) FL ImagedVolumeWidth 1 Supplement_145 (0048,0002) FL ImagedVolumeHeight 1 Supplement_145 (0048,0003) FL ImagedVolumeDepth 1 Supplement_145 (0048,0006) UL TotalPixelMatrixColumns 1 Supplement_145 (0048,0007) UL TotalPixelMatrixRows 1 Supplement_145 (0048,0008) SQ TotalPixelMatrixOriginSequence 1 Supplement_145 (0048,0010) CS SpecimenLabelInImage 1 Supplement_145 (0048,0011) CS FocusMethod 1 Supplement_145 (0048,0012) CS ExtendedDepthOfField 1 Supplement_145 (0048,0013) US NumberOfFocalPlanes 1 Supplement_145 (0048,0014) FL DistanceBetweenFocalPlanes 1 Supplement_145 (0048,0015) US RecommendedAbsentPixelCIELabValue 3 Supplement_145 (0048,0100) SQ IlluminatorTypeCodeSequence 1 Supplement_145 (0048,0102) DS ImageOrientationSlide 6 Supplement_145 (0048,0105) SQ OpticalPathSequence 1 Supplement_145 (0048,0106) SH OpticalPathIdentifier 1 Supplement_145 (0048,0107) ST OpticalPathDescription 1 Supplement_145 (0048,0108) SQ IlluminationColorCodeSequence 1 Supplement_145 (0048,0110) SQ SpecimenReferenceSequence 1 Supplement_145 (0048,0111) DS CondenserLensPower 1 Supplement_145 (0048,0112) DS ObjectiveLensPower 1 Supplement_145 (0048,0113) DS ObjectiveLensNumericalAperture 1 Supplement_145 (0048,0120) SQ PaletteColorLookupTableSequence 1 Supplement_145 (0048,0200) SQ ReferencedImageNavigationSequence 1 Supplement_145 (0048,0201) US TopLeftHandCornerOfLocalizerArea 2 Supplement_145 (0048,0202) US BottomRightHandCornerOfLocalizerArea 2 Supplement_145 (0048,0207) SQ OpticalPathIdentificationSequence 1 Supplement_145 (0048,021A) SQ PlanePositionSlideSequence 1 Supplement_145 (0048,021E) SL ColumnPositionInTotalImagePixelMatrix 1 Supplement_145 (0048,021F) SL RowPositionInTotalImagePixelMatrix 1 Supplement_145 (0048,0301) CS PixelOriginInterpretation 1 Supplement_145 # #--------------------------------------------------------------------------- # # Supplement 146 (Ophthalmic Visual Field Static Perimetry Measurements Storage SOP Class) # (0024,0010) FL VisualFieldHorizontalExtent 1 Supplement_146 (0024,0011) FL VisualFieldVerticalExtent 1 Supplement_146 (0024,0012) CS VisualFieldShape 1 Supplement_146 (0024,0016) SQ ScreeningTestModeCodeSequence 1 Supplement_146 (0024,0018) FL MaximumStimulusLuminance 1 Supplement_146 (0024,0020) FL BackgroundLuminance 1 Supplement_146 (0024,0021) SQ StimulusColorCodeSequence 1 Supplement_146 (0024,0024) SQ BackgroundIlluminationColorCodeSequence 1 Supplement_146 (0024,0025) FL StimulusArea 1 Supplement_146 (0024,0028) FL StimulusPresentationTime 1 Supplement_146 (0024,0032) SQ FixationSequence 1 Supplement_146 (0024,0033) SQ FixationMonitoringCodeSequence 1 Supplement_146 (0024,0034) SQ VisualFieldCatchTrialSequence 1 Supplement_146 (0024,0035) US FixationCheckedQuantity 1 Supplement_146 (0024,0036) US PatientNotProperlyFixatedQuantity 1 Supplement_146 (0024,0037) CS PresentedVisualStimuliDataFlag 1 Supplement_146 (0024,0038) US NumberOfVisualStimuli 1 Supplement_146 (0024,0039) CS ExcessiveFixationLossesDataFlag 1 Supplement_146 (0024,0040) CS ExcessiveFixationLosses 1 Supplement_146 (0024,0042) US StimuliRetestingQuantity 1 Supplement_146 (0024,0044) LT CommentsOnPatientPerformanceOfVisualField 1 Supplement_146 (0024,0045) CS FalseNegativesEstimateFlag 1 Supplement_146 (0024,0046) FL FalseNegativesEstimate 1 Supplement_146 (0024,0048) US NegativeCatchTrialsQuantity 1 Supplement_146 (0024,0050) US FalseNegativesQuantity 1 Supplement_146 (0024,0051) CS ExcessiveFalseNegativesDataFlag 1 Supplement_146 (0024,0052) CS ExcessiveFalseNegatives 1 Supplement_146 (0024,0053) CS FalsePositivesEstimateFlag 1 Supplement_146 (0024,0054) FL FalsePositivesEstimate 1 Supplement_146 (0024,0055) CS CatchTrialsDataFlag 1 Supplement_146 (0024,0056) US PositiveCatchTrialsQuantity 1 Supplement_146 (0024,0057) CS TestPointNormalsDataFlag 1 Supplement_146 (0024,0058) SQ TestPointNormalsSequence 1 Supplement_146 (0024,0059) CS GlobalDeviationProbabilityNormalsFlag 1 Supplement_146 (0024,0060) US FalsePositivesQuantity 1 Supplement_146 (0024,0061) CS ExcessiveFalsePositivesDataFlag 1 Supplement_146 (0024,0062) CS ExcessiveFalsePositives 1 Supplement_146 (0024,0063) CS VisualFieldTestNormalsFlag 1 Supplement_146 (0024,0064) SQ ResultsNormalsSequence 1 Supplement_146 (0024,0065) SQ AgeCorrectedSensitivityDeviationAlgorithmSequence 1 Supplement_146 (0024,0066) FL GlobalDeviationFromNormal 1 Supplement_146 (0024,0067) SQ GeneralizedDefectSensitivityDeviationAlgorithmSequence 1 Supplement_146 (0024,0068) FL LocalizedDeviationfromNormal 1 Supplement_146 (0024,0069) LO PatientReliabilityIndicator 1 Supplement_146 (0024,0070) FL VisualFieldMeanSensitivity 1 Supplement_146 (0024,0071) FL GlobalDeviationProbability 1 Supplement_146 (0024,0072) CS LocalDeviationProbabilityNormalsFlag 1 Supplement_146 (0024,0073) FL LocalizedDeviationProbability 1 Supplement_146 (0024,0074) CS ShortTermFluctuationCalculated 1 Supplement_146 (0024,0075) FL ShortTermFluctuation 1 Supplement_146 (0024,0076) CS ShortTermFluctuationProbabilityCalculated 1 Supplement_146 (0024,0077) FL ShortTermFluctuationProbability 1 Supplement_146 (0024,0078) CS CorrectedLocalizedDeviationFromNormalCalculated 1 Supplement_146 (0024,0079) FL CorrectedLocalizedDeviationFromNormal 1 Supplement_146 (0024,0080) CS CorrectedLocalizedDeviationFromNormalProbabilityCalculated 1 Supplement_146 (0024,0081) FL CorrectedLocalizedDeviationFromNormalProbability 1 Supplement_146 (0024,0083) SQ GlobalDeviationProbabilitySequence 1 Supplement_146 (0024,0085) SQ LocalizedDeviationProbabilitySequence 1 Supplement_146 (0024,0086) CS FovealSensitivityMeasured 1 Supplement_146 (0024,0087) FL FovealSensitivity 1 Supplement_146 (0024,0088) FL VisualFieldTestDuration 1 Supplement_146 (0024,0089) SQ VisualFieldTestPointSequence 1 Supplement_146 (0024,0090) FL VisualFieldTestPointXCoordinate 1 Supplement_146 (0024,0091) FL VisualFieldTestPointYCoordinate 1 Supplement_146 (0024,0092) FL AgeCorrectedSensitivityDeviationValue 1 Supplement_146 (0024,0093) CS StimulusResults 1 Supplement_146 (0024,0094) FL SensitivityValue 1 Supplement_146 (0024,0095) CS RetestStimulusSeen 1 Supplement_146 (0024,0096) FL RetestSensitivityValue 1 Supplement_146 (0024,0097) SQ VisualFieldTestPointNormalsSequence 1 Supplement_146 (0024,0098) FL QuantifiedDefect 1 Supplement_146 (0024,0102) CS GeneralizedDefectCorrectedSensitivityDeviationFlag 1 Supplement_146 (0024,0103) FL GeneralizedDefectCorrectedSensitivityDeviationValue 1 Supplement_146 (0024,0104) FL GeneralizedDefectCorrectedSensitivityDeviationProbabilityValue 1 Supplement_146 (0024,0105) FL MinimumSensitivityValue 1 Supplement_146 (0024,0106) CS BlindSpotLocalized 1 Supplement_146 (0024,0107) FL BlindSpotXCoordinate 1 Supplement_146 (0024,0108) FL BlindSpotYCoordinate 1 Supplement_146 (0024,0110) SQ VisualAcuityMeasurementSequence 1 Supplement_146 (0024,0112) SQ RefractiveParametersUsedOnPatientSequence 1 Supplement_146 (0024,0113) CS MeasurementLaterality 1 Supplement_146 (0024,0114) SQ OphthalmicPatientClinicalInformationLeftEyeSequence 1 Supplement_146 (0024,0115) SQ OphthalmicPatientClinicalInformationRightEyeSequence 1 Supplement_146 (0024,0117) CS FovealPointNormativeDataFlag 1 Supplement_146 (0024,0118) FL FovealPointProbabilityValue 1 Supplement_146 (0024,0120) CS ScreeningBaselineMeasured 1 Supplement_146 (0024,0122) SQ ScreeningBaselineMeasuredSequence 1 Supplement_146 (0024,0124) CS ScreeningBaselineType 1 Supplement_146 (0024,0126) FL ScreeningBaselineValue 1 Supplement_146 (0024,0202) LO AlgorithmSource 1 Supplement_146 (0024,0306) LO DataSetName 1 Supplement_146 (0024,0307) LO DataSetVersion 1 Supplement_146 (0024,0308) LO DataSetSource 1 Supplement_146 (0024,0309) LO DataSetDescription 1 Supplement_146 (0024,0317) SQ VisualFieldTestReliabilityGlobalIndexSequence 1 Supplement_146 (0024,0320) SQ VisualFieldGlobalResultsIndexSequence 1 Supplement_146 (0024,0325) SQ DataObservationSequence 1 Supplement_146 (0024,0338) CS IndexNormalsFlag 1 Supplement_146 (0024,0341) FL IndexProbability 1 Supplement_146 (0024,0344) SQ IndexProbabilitySequence 1 Supplement_146 # #--------------------------------------------------------------------------- # # Correction Items 650, 988, 1010, 1024 # (0010,1021) SQ PatientSizeCodeSequence 1 CP_650 (0018,9092) SQ VelocityEncodingAcquisitionSequence 1 CP_988 (300A,0431) SQ ApplicatorGeometrySequence 1 CP_1010 (300A,0432) CS ApplicatorApertureShape 1 CP_1010 (300A,0433) FL ApplicatorOpening 1 CP_1010 (300A,0434) FL ApplicatorOpeningX 1 CP_1010 (300A,0435) FL ApplicatorOpeningY 1 CP_1010 (300A,0436) FL SourceToApplicatorMountingPositionDistance 1 CP_1010 (0018,1411) DS ExposureIndex 1 CP_1024 (0018,1412) DS TargetExposureIndex 1 CP_1024 (0018,1413) DS DeviationIndex 1 CP_1024 # #--------------------------------------------------------------------------- # # Private Creator Data Elements # (0009-o-ffff,0000) UL PrivateGroupLength 1 PRIVATE (0009-o-ffff,0010-u-00ff) LO PrivateCreator 1 PRIVATE (0001-o-0007,0000) UL IllegalGroupLength 1 ILLEGAL (0001-o-0007,0010-u-00ff) LO IllegalPrivateCreator 1 ILLEGAL # #--------------------------------------------------------------------------- # # A "catch all" for group length elements # (0000-u-ffff,0000) UL GenericGroupLength 1 GENERIC # #--------------------------------------------------------------------------- # # Retired data elements from previous editions of the DICOM standard # (0000,0001) UL RETIRED_CommandLengthToEnd 1 DICOM/retired (0000,0010) CS RETIRED_CommandRecognitionCode 1 DICOM/retired (0000,0200) AE RETIRED_Initiator 1 DICOM/retired (0000,0300) AE RETIRED_Receiver 1 DICOM/retired (0000,0400) AE RETIRED_FindLocation 1 DICOM/retired (0000,0850) US RETIRED_NumberOfMatches 1 DICOM/retired (0000,0860) US RETIRED_ResponseSequenceNumber 1 DICOM/retired (0000,4000) AT RETIRED_DialogReceiver 1 DICOM/retired (0000,4010) AT RETIRED_TerminalType 1 DICOM/retired (0000,5010) SH RETIRED_MessageSetID 1 DICOM/retired (0000,5020) SH RETIRED_EndMessageID 1 DICOM/retired (0000,5110) AT RETIRED_DisplayFormat 1 DICOM/retired (0000,5120) AT RETIRED_PagePositionID 1 DICOM/retired (0000,5130) CS RETIRED_TextFormatID 1 DICOM/retired (0000,5140) CS RETIRED_NormalReverse 1 DICOM/retired (0000,5150) CS RETIRED_AddGrayScale 1 DICOM/retired (0000,5160) CS RETIRED_Borders 1 DICOM/retired (0000,5170) IS RETIRED_Copies 1 DICOM/retired (0000,5180) CS RETIRED_CommandMagnificationType 1 DICOM/retired (0000,5190) CS RETIRED_Erase 1 DICOM/retired (0000,51A0) CS RETIRED_Print 1 DICOM/retired (0000,51B0) US RETIRED_Overlays 1-n DICOM/retired (0004,1504) up RETIRED_MRDRDirectoryRecordOffset 1 DICOM/retired (0004,1600) UL RETIRED_NumberOfReferences 1 DICOM/retired (0008,0001) UL RETIRED_LengthToEnd 1 DICOM/retired (0008,0010) CS RETIRED_RecognitionCode 1 DICOM/retired (0008,0024) DA RETIRED_OverlayDate 1 DICOM/retired (0008,0025) DA RETIRED_CurveDate 1 DICOM/retired (0008,0034) TM RETIRED_OverlayTime 1 DICOM/retired (0008,0035) TM RETIRED_CurveTime 1 DICOM/retired (0008,0040) US RETIRED_DataSetType 1 DICOM/retired (0008,0041) LO RETIRED_DataSetSubtype 1 DICOM/retired (0008,0042) CS RETIRED_NuclearMedicineSeriesType 1 DICOM/retired (0008,1000) AE RETIRED_NetworkID 1 DICOM/retired (0008,1100) SQ RETIRED_ReferencedResultsSequence 1 DICOM/retired (0008,1130) SQ RETIRED_ReferencedOverlaySequence 1 DICOM/retired (0008,1145) SQ RETIRED_ReferencedCurveSequence 1 DICOM/retired (0008,2110) CS RETIRED_LossyImageCompressionRetired 1 DICOM/retired (0008,2200) CS RETIRED_TransducerPosition 1 DICOM/retired (0008,2204) CS RETIRED_TransducerOrientation 1 DICOM/retired (0008,2208) CS RETIRED_AnatomicStructure 1 DICOM/retired (0008,2240) SQ RETIRED_TransducerPositionSequence 1 DICOM/retired (0008,2242) SQ RETIRED_TransducerPositionModifierSequence 1 DICOM/retired (0008,2244) SQ RETIRED_TransducerOrientationSequence 1 DICOM/retired (0008,2246) SQ RETIRED_TransducerOrientationModifierSequence 1 DICOM/retired (0008,2251) SQ RETIRED_AnatomicStructureSpaceOrRegionCodeSequenceTrial 1 DICOM/retired (0008,2253) SQ RETIRED_AnatomicPortalOfEntranceCodeSequenceTrial 1 DICOM/retired (0008,2255) SQ RETIRED_AnatomicApproachDirectionCodeSequenceTrial 1 DICOM/retired (0008,2256) ST RETIRED_AnatomicPerspectiveDescriptionTrial 1 DICOM/retired (0008,2257) SQ RETIRED_AnatomicPerspectiveCodeSequenceTrial 1 DICOM/retired (0008,2258) ST RETIRED_AnatomicLocationOfExaminingInstrumentDescriptionTrial 1 DICOM/retired (0008,2259) SQ RETIRED_AnatomicLocationOfExaminingInstrumentCodeSequenceTrial 1 DICOM/retired (0008,225A) SQ RETIRED_AnatomicStructureSpaceOrRegionModifierCodeSequenceTrial 1 DICOM/retired (0008,225C) SQ RETIRED_OnAxisBackgroundAnatomicStructureCodeSequenceTrial 1 DICOM/retired (0008,4000) LT RETIRED_IdentifyingComments 1 DICOM/retired (0010,1050) LO RETIRED_InsurancePlanIdentification 1-n DICOM/retired (0018,0030) LO RETIRED_Radionuclide 1-n DICOM/retired (0018,0032) DS RETIRED_EnergyWindowCenterline 1 DICOM/retired (0018,0033) DS RETIRED_EnergyWindowTotalWidth 1-n DICOM/retired (0018,0037) CS RETIRED_TherapyType 1 DICOM/retired (0018,0039) CS RETIRED_TherapyDescription 1 DICOM/retired (0018,1011) LO RETIRED_HardcopyCreationDeviceID 1 DICOM/retired (0018,1017) LO RETIRED_HardcopyDeviceManufacturer 1 DICOM/retired (0018,101A) LO RETIRED_HardcopyDeviceSoftwareVersion 1-n DICOM/retired (0018,101B) LO RETIRED_HardcopyDeviceManufacturerModelName 1 DICOM/retired (0018,1141) DS RETIRED_AngularPosition 1 DICOM/retired (0018,1146) DS RETIRED_RotationOffset 1-n DICOM/retired (0018,1240) IS RETIRED_UpperLowerPixelValues 1-n DICOM/retired (0018,4000) LT RETIRED_AcquisitionComments 1 DICOM/retired (0018,5021) LO RETIRED_PostprocessingFunction 1 DICOM/retired (0018,5030) DS RETIRED_DynamicRange 1 DICOM/retired (0018,5040) DS RETIRED_TotalGain 1 DICOM/retired (0018,5210) DS RETIRED_ImageTransformationMatrix 6 DICOM/retired (0018,5212) DS RETIRED_ImageTranslationVector 3 DICOM/retired (0018,6038) UL RETIRED_DopplerSampleVolumeXPositionRetired 1 DICOM/retired (0018,603A) UL RETIRED_DopplerSampleVolumeYPositionRetired 1 DICOM/retired (0018,603C) UL RETIRED_TMLinePositionX0Retired 1 DICOM/retired (0018,603E) UL RETIRED_TMLinePositionY0Retired 1 DICOM/retired (0018,6040) UL RETIRED_TMLinePositionX1Retired 1 DICOM/retired (0018,6042) UL RETIRED_TMLinePositionY1Retired 1 DICOM/retired (0018,9096) FD RETIRED_ParallelReductionFactorInPlaneRetired 1 DICOM/retired (0018,9166) CS RETIRED_BulkMotionStatus 1 DICOM/retired (0018,9195) FD RETIRED_ChemicalShiftMinimumIntegrationLimitInHz 1 DICOM/retired (0018,9196) FD RETIRED_ChemicalShiftMaximumIntegrationLimitInHz 1 DICOM/retired (0020,0014) IS RETIRED_IsotopeNumber 1 DICOM/retired (0020,0015) IS RETIRED_PhaseNumber 1 DICOM/retired (0020,0016) IS RETIRED_IntervalNumber 1 DICOM/retired (0020,0017) IS RETIRED_TimeSlotNumber 1 DICOM/retired (0020,0018) IS RETIRED_AngleNumber 1 DICOM/retired (0020,0022) IS RETIRED_OverlayNumber 1 DICOM/retired (0020,0024) IS RETIRED_CurveNumber 1 DICOM/retired (0020,0026) IS RETIRED_LUTNumber 1 DICOM/retired (0020,0030) DS RETIRED_ImagePosition 3 DICOM/retired (0020,0035) DS RETIRED_ImageOrientation 6 DICOM/retired (0020,0050) DS RETIRED_Location 1 DICOM/retired (0020,0070) LO RETIRED_ImageGeometryType 1 DICOM/retired (0020,0080) CS RETIRED_MaskingImage 1-n DICOM/retired (0020,1000) IS RETIRED_SeriesInStudy 1 DICOM/retired (0020,1001) IS RETIRED_AcquisitionsInSeries 1 DICOM/retired (0020,1003) IS RETIRED_ImagesInSeries 1 DICOM/retired (0020,1004) IS RETIRED_AcquisitionsInStudy 1 DICOM/retired (0020,1005) IS RETIRED_ImagesInStudy 1 DICOM/retired (0020,1020) CS RETIRED_Reference 1-n DICOM/retired (0020,1070) IS RETIRED_OtherStudyNumbers 1-n DICOM/retired (0020,3100-31FF) CS RETIRED_SourceImageIDs 1-n DICOM/retired (0020,3401) CS RETIRED_ModifyingDeviceID 1 DICOM/retired (0020,3402) CS RETIRED_ModifiedImageID 1 DICOM/retired (0020,3403) DA RETIRED_ModifiedImageDate 1 DICOM/retired (0020,3404) LO RETIRED_ModifyingDeviceManufacturer 1 DICOM/retired (0020,3405) TM RETIRED_ModifiedImageTime 1 DICOM/retired (0020,3406) LO RETIRED_ModifiedImageDescription 1 DICOM/retired (0020,5000) AT RETIRED_OriginalImageIdentification 1-n DICOM/retired (0020,5002) CS RETIRED_OriginalImageIdentificationNomenclature 1-n DICOM/retired (0028,0005) US RETIRED_ImageDimensions 1 DICOM/retired (0028,0012) US RETIRED_Planes 1 DICOM/retired (0028,0040) CS RETIRED_ImageFormat 1 DICOM/retired (0028,0050) LO RETIRED_ManipulatedImage 1-n DICOM/retired (0028,005F) LO RETIRED_CompressionRecognitionCode 1 DICOM/retired (0028,0060) CS RETIRED_CompressionCode 1 DICOM/retired (0028,0061) SH RETIRED_CompressionOriginator 1 DICOM/retired (0028,0062) LO RETIRED_CompressionLabel 1 DICOM/retired (0028,0063) SH RETIRED_CompressionDescription 1 DICOM/retired (0028,0065) CS RETIRED_CompressionSequence 1-n DICOM/retired (0028,0066) AT RETIRED_CompressionStepPointers 1-n DICOM/retired (0028,0068) US RETIRED_RepeatInterval 1 DICOM/retired (0028,0069) US RETIRED_BitsGrouped 1 DICOM/retired (0028,0070) US RETIRED_PerimeterTable 1-n DICOM/retired (0028,0071) xs RETIRED_PerimeterValue 1 DICOM/retired (0028,0080) US RETIRED_PredictorRows 1 DICOM/retired (0028,0081) US RETIRED_PredictorColumns 1 DICOM/retired (0028,0082) US RETIRED_PredictorConstants 1-n DICOM/retired (0028,0090) CS RETIRED_BlockedPixels 1 DICOM/retired (0028,0091) US RETIRED_BlockRows 1 DICOM/retired (0028,0092) US RETIRED_BlockColumns 1 DICOM/retired (0028,0093) US RETIRED_RowOverlap 1 DICOM/retired (0028,0094) US RETIRED_ColumnOverlap 1 DICOM/retired (0028,0104) xs RETIRED_SmallestValidPixelValue 1 DICOM/retired (0028,0105) xs RETIRED_LargestValidPixelValue 1 DICOM/retired (0028,0110) xs RETIRED_SmallestImagePixelValueInPlane 1 DICOM/retired (0028,0111) xs RETIRED_LargestImagePixelValueInPlane 1 DICOM/retired (0028,0200) US RETIRED_ImageLocation 1 DICOM/retired (0028,0400) LO RETIRED_TransformLabel 1 DICOM/retired (0028,0401) LO RETIRED_TransformVersionNumber 1 DICOM/retired (0028,0402) US RETIRED_NumberOfTransformSteps 1 DICOM/retired (0028,0403) LO RETIRED_SequenceOfCompressedData 1-n DICOM/retired (0028,0404) AT RETIRED_DetailsOfCoefficients 1-n DICOM/retired #(0028,04X0) US RETIRED_RowsForNthOrderCoefficients 1 DICOM/retired #(0028,04X1) US RETIRED_ColumnsForNthOrderCoefficients 1 DICOM/retired #(0028,04X2) LO RETIRED_CoefficientCoding 1-n DICOM/retired #(0028,04X3) AT RETIRED_CoefficientCodingPointers 1-n DICOM/retired (0028,0700) LO RETIRED_DCTLabel 1 DICOM/retired (0028,0701) CS RETIRED_DataBlockDescription 1-n DICOM/retired (0028,0702) AT RETIRED_DataBlock 1-n DICOM/retired (0028,0710) US RETIRED_NormalizationFactorFormat 1 DICOM/retired (0028,0720) US RETIRED_ZonalMapNumberFormat 1 DICOM/retired (0028,0721) AT RETIRED_ZonalMapLocation 1-n DICOM/retired (0028,0722) US RETIRED_ZonalMapFormat 1 DICOM/retired (0028,0730) US RETIRED_AdaptiveMapFormat 1 DICOM/retired (0028,0740) US RETIRED_CodeNumberFormat 1 DICOM/retired #(0028,08X0) CS RETIRED_CodeLabel 1-n DICOM/retired #(0028,08X2) US RETIRED_NumberOfTables 1 DICOM/retired #(0028,08X3) AT RETIRED_CodeTableLocation 1-n DICOM/retired #(0028,08X4) US RETIRED_BitsForCodeWord 1 DICOM/retired #(0028,08X8) AT RETIRED_ImageDataLocation 1-n DICOM/retired (0028,1080) CS RETIRED_GrayScale 1 DICOM/retired (0028,1100) xs RETIRED_GrayLookupTableDescriptor 3 DICOM/retired (0028,1111) xs RETIRED_LargeRedPaletteColorLookupTableDescriptor 4 DICOM/retired (0028,1112) xs RETIRED_LargeGreenPaletteColorLookupTableDescriptor 4 DICOM/retired (0028,1113) xs RETIRED_LargeBluePaletteColorLookupTableDescriptor 4 DICOM/retired (0028,1200) lt RETIRED_GrayLookupTableData 1-n DICOM/retired (0028,1211) OW RETIRED_LargeRedPaletteColorLookupTableData 1 DICOM/retired (0028,1212) OW RETIRED_LargeGreenPaletteColorLookupTableData 1 DICOM/retired (0028,1213) OW RETIRED_LargeBluePaletteColorLookupTableData 1 DICOM/retired (0028,1214) UI RETIRED_LargePaletteColorLookupTableUID 1 DICOM/retired (0028,4000) LT RETIRED_ImagePresentationComments 1 DICOM/retired (0028,5000) SQ RETIRED_BiPlaneAcquisitionSequence 1 DICOM/retired (0028,6030) US RETIRED_MaskPointers 1-n DICOM/retired (0028,9099) US RETIRED_LargestMonochromePixelValue 1 DICOM/retired (0032,000A) CS RETIRED_StudyStatusID 1 DICOM/retired (0032,000C) CS RETIRED_StudyPriorityID 1 DICOM/retired (0032,0012) LO RETIRED_StudyIDIssuer 1 DICOM/retired (0032,0032) DA RETIRED_StudyVerifiedDate 1 DICOM/retired (0032,0033) TM RETIRED_StudyVerifiedTime 1 DICOM/retired (0032,0034) DA RETIRED_StudyReadDate 1 DICOM/retired (0032,0035) TM RETIRED_StudyReadTime 1 DICOM/retired (0032,1000) DA RETIRED_ScheduledStudyStartDate 1 DICOM/retired (0032,1001) TM RETIRED_ScheduledStudyStartTime 1 DICOM/retired (0032,1010) DA RETIRED_ScheduledStudyStopDate 1 DICOM/retired (0032,1011) TM RETIRED_ScheduledStudyStopTime 1 DICOM/retired (0032,1020) LO RETIRED_ScheduledStudyLocation 1 DICOM/retired (0032,1021) AE RETIRED_ScheduledStudyLocationAETitle 1-n DICOM/retired (0032,1030) LO RETIRED_ReasonForStudy 1 DICOM/retired (0032,1040) DA RETIRED_StudyArrivalDate 1 DICOM/retired (0032,1041) TM RETIRED_StudyArrivalTime 1 DICOM/retired (0032,1050) DA RETIRED_StudyCompletionDate 1 DICOM/retired (0032,1051) TM RETIRED_StudyCompletionTime 1 DICOM/retired (0032,1055) CS RETIRED_StudyComponentStatusID 1 DICOM/retired (0032,4000) LT RETIRED_StudyComments 1 DICOM/retired (0038,0011) LO RETIRED_IssuerOfAdmissionID 1 DICOM/retired (0038,001A) DA RETIRED_ScheduledAdmissionDate 1 DICOM/retired (0038,001B) TM RETIRED_ScheduledAdmissionTime 1 DICOM/retired (0038,001C) DA RETIRED_ScheduledDischargeDate 1 DICOM/retired (0038,001D) TM RETIRED_ScheduledDischargeTime 1 DICOM/retired (0038,001E) LO RETIRED_ScheduledPatientInstitutionResidence 1 DICOM/retired (0038,0030) DA RETIRED_DischargeDate 1 DICOM/retired (0038,0032) TM RETIRED_DischargeTime 1 DICOM/retired (0038,0040) LO RETIRED_DischargeDiagnosisDescription 1 DICOM/retired (0038,0044) SQ RETIRED_DischargeDiagnosisCodeSequence 1 DICOM/retired (0038,0061) LO RETIRED_IssuerOfServiceEpisodeID 1 DICOM/retired (0040,0307) DS RETIRED_DistanceSourceToSupport 1 DICOM/retired (0040,0330) SQ RETIRED_ReferencedProcedureStepSequence 1 DICOM/retired (0040,050A) LO RETIRED_SpecimenAccessionNumber 1 DICOM/retired (0040,0550) SQ RETIRED_SpecimenSequence 1 DICOM/retired (0040,0552) SQ RETIRED_SpecimenDescriptionSequenceTrial 1 DICOM/retired (0040,0553) ST RETIRED_SpecimenDescriptionTrial 1 DICOM/retired (0040,06FA) LO RETIRED_SlideIdentifier 1 DICOM/retired (0040,09F8) SQ RETIRED_VitalStainCodeSequenceTrial 1 DICOM/retired (0040,1006) SH RETIRED_PlacerOrderNumberProcedure 1 DICOM/retired (0040,1007) SH RETIRED_FillerOrderNumberProcedure 1 DICOM/retired (0040,2001) LO RETIRED_ReasonForTheImagingServiceRequest 1 DICOM/retired (0040,2006) SH RETIRED_PlacerOrderNumberImagingServiceRequestRetired 1 DICOM/retired (0040,2007) SH RETIRED_FillerOrderNumberImagingServiceRequestRetired 1 DICOM/retired (0040,A090) SQ RETIRED_EquivalentCDADocumentSequence 1 DICOM/retired (0040,A353) ST RETIRED_AddressTrial 1 DICOM/retired (0040,A354) LO RETIRED_TelephoneNumberTrial 1 DICOM/retired (0040,DB06) DT RETIRED_TemplateVersion 1 DICOM/retired (0040,DB07) DT RETIRED_TemplateLocalVersion 1 DICOM/retired (0040,DB0B) CS RETIRED_TemplateExtensionFlag 1 DICOM/retired (0040,DB0C) UI RETIRED_TemplateExtensionOrganizationUID 1 DICOM/retired (0040,DB0D) UI RETIRED_TemplateExtensionCreatorUID 1 DICOM/retired (0054,1400) CS RETIRED_CountsIncluded 1-n DICOM/retired (0054,1401) CS RETIRED_DeadTimeCorrectionFlag 1 DICOM/retired (0070,0040) IS RETIRED_ImageRotationRetired 1 DICOM/retired (0070,0050) US RETIRED_DisplayedAreaTopLeftHandCornerTrial 2 DICOM/retired (0070,0051) US RETIRED_DisplayedAreaBottomRightHandCornerTrial 2 DICOM/retired (0070,0067) US RETIRED_GraphicLayerRecommendedDisplayRGBValue 3 DICOM/retired (0088,0904) LO RETIRED_TopicTitle 1 DICOM/retired (0088,0906) ST RETIRED_TopicSubject 1 DICOM/retired (0088,0910) LO RETIRED_TopicAuthor 1 DICOM/retired (0088,0912) LO RETIRED_TopicKeywords 1-32 DICOM/retired #(1000,XXX0) US RETIRED_EscapeTriplet 3 DICOM/retired #(1000,XXX0) US RETIRED_RunLengthTriplet 3 DICOM/retired #(1000,XXX0) US RETIRED_HuffmanTableSize 1 DICOM/retired #(1000,XXX0) US RETIRED_HuffmanTableTriplet 3 DICOM/retired #(1000,XXX0) US RETIRED_ShiftTableSize 1 DICOM/retired #(1000,XXX0) US RETIRED_ShiftTableTriplet 3 DICOM/retired #(1010,XXXX) US RETIRED_ZonalMap 1-n DICOM/retired (2000,0062) CS RETIRED_ColorImagePrintingFlag 1 DICOM/retired (2000,0063) CS RETIRED_CollationFlag 1 DICOM/retired (2000,0065) CS RETIRED_AnnotationFlag 1 DICOM/retired (2000,0067) CS RETIRED_ImageOverlayFlag 1 DICOM/retired (2000,0069) CS RETIRED_PresentationLUTFlag 1 DICOM/retired (2000,006A) CS RETIRED_ImageBoxPresentationLUTFlag 1 DICOM/retired (2000,0510) SQ RETIRED_ReferencedStoredPrintSequence 1 DICOM/retired (2020,0130) SQ RETIRED_ReferencedImageOverlayBoxSequence 1 DICOM/retired (2020,0140) SQ RETIRED_ReferencedVOILUTBoxSequence 1 DICOM/retired (2040,0010) SQ RETIRED_ReferencedOverlayPlaneSequence 1 DICOM/retired (2040,0011) US RETIRED_ReferencedOverlayPlaneGroups 1-99 DICOM/retired (2040,0020) SQ RETIRED_OverlayPixelDataSequence 1 DICOM/retired (2040,0060) CS RETIRED_OverlayMagnificationType 1 DICOM/retired (2040,0070) CS RETIRED_OverlaySmoothingType 1 DICOM/retired (2040,0072) CS RETIRED_OverlayOrImageMagnification 1 DICOM/retired (2040,0074) US RETIRED_MagnifyToNumberOfColumns 1 DICOM/retired (2040,0080) CS RETIRED_OverlayForegroundDensity 1 DICOM/retired (2040,0082) CS RETIRED_OverlayBackgroundDensity 1 DICOM/retired (2040,0090) CS RETIRED_OverlayMode 1 DICOM/retired (2040,0100) CS RETIRED_ThresholdDensity 1 DICOM/retired (2040,0500) SQ RETIRED_ReferencedImageBoxSequenceRetired 1 DICOM/retired (2100,0010) SH RETIRED_PrintJobID 1 DICOM/retired (2100,0140) AE RETIRED_DestinationAE 1 DICOM/retired (2100,0500) SQ RETIRED_ReferencedPrintJobSequencePullStoredPrint 1 DICOM/retired (2110,0099) SH RETIRED_PrintQueueID 1 DICOM/retired (2120,0010) CS RETIRED_QueueStatus 1 DICOM/retired (2120,0050) SQ RETIRED_PrintJobDescriptionSequence 1 DICOM/retired (2120,0070) SQ RETIRED_ReferencedPrintJobSequence 1 DICOM/retired (2130,0010) SQ RETIRED_PrintManagementCapabilitiesSequence 1 DICOM/retired (2130,0015) SQ RETIRED_PrinterCharacteristicsSequence 1 DICOM/retired (2130,0030) SQ RETIRED_FilmBoxContentSequence 1 DICOM/retired (2130,0040) SQ RETIRED_ImageBoxContentSequence 1 DICOM/retired (2130,0050) SQ RETIRED_AnnotationContentSequence 1 DICOM/retired (2130,0060) SQ RETIRED_ImageOverlayBoxContentSequence 1 DICOM/retired (2130,0080) SQ RETIRED_PresentationLUTContentSequence 1 DICOM/retired (2130,00A0) SQ RETIRED_ProposedStudySequence 1 DICOM/retired (2130,00C0) SQ RETIRED_OriginalImageSequence 1 DICOM/retired (4000,0010) LT RETIRED_Arbitrary 1 DICOM/retired (4000,4000) LT RETIRED_TextComments 1 DICOM/retired (4008,0040) SH RETIRED_ResultsID 1 DICOM/retired (4008,0042) LO RETIRED_ResultsIDIssuer 1 DICOM/retired (4008,0050) SQ RETIRED_ReferencedInterpretationSequence 1 DICOM/retired (4008,0100) DA RETIRED_InterpretationRecordedDate 1 DICOM/retired (4008,0101) TM RETIRED_InterpretationRecordedTime 1 DICOM/retired (4008,0102) PN RETIRED_InterpretationRecorder 1 DICOM/retired (4008,0103) LO RETIRED_ReferenceToRecordedSound 1 DICOM/retired (4008,0108) DA RETIRED_InterpretationTranscriptionDate 1 DICOM/retired (4008,0109) TM RETIRED_InterpretationTranscriptionTime 1 DICOM/retired (4008,010A) PN RETIRED_InterpretationTranscriber 1 DICOM/retired (4008,010B) ST RETIRED_InterpretationText 1 DICOM/retired (4008,010C) PN RETIRED_InterpretationAuthor 1 DICOM/retired (4008,0111) SQ RETIRED_InterpretationApproverSequence 1 DICOM/retired (4008,0112) DA RETIRED_InterpretationApprovalDate 1 DICOM/retired (4008,0113) TM RETIRED_InterpretationApprovalTime 1 DICOM/retired (4008,0114) PN RETIRED_PhysicianApprovingInterpretation 1 DICOM/retired (4008,0115) LT RETIRED_InterpretationDiagnosisDescription 1 DICOM/retired (4008,0117) SQ RETIRED_InterpretationDiagnosisCodeSequence 1 DICOM/retired (4008,0118) SQ RETIRED_ResultsDistributionListSequence 1 DICOM/retired (4008,0119) PN RETIRED_DistributionName 1 DICOM/retired (4008,011A) LO RETIRED_DistributionAddress 1 DICOM/retired (4008,0200) SH RETIRED_InterpretationID 1 DICOM/retired (4008,0202) LO RETIRED_InterpretationIDIssuer 1 DICOM/retired (4008,0210) CS RETIRED_InterpretationTypeID 1 DICOM/retired (4008,0212) CS RETIRED_InterpretationStatusID 1 DICOM/retired (4008,0300) ST RETIRED_Impressions 1 DICOM/retired (4008,4000) ST RETIRED_ResultsComments 1 DICOM/retired (5000-50FF,0005) US RETIRED_CurveDimensions 1 DICOM/retired (5000-50FF,0010) US RETIRED_NumberOfPoints 1 DICOM/retired (5000-50FF,0020) CS RETIRED_TypeOfData 1 DICOM/retired (5000-50FF,0022) LO RETIRED_CurveDescription 1 DICOM/retired (5000-50FF,0030) SH RETIRED_AxisUnits 1-n DICOM/retired (5000-50FF,0040) SH RETIRED_AxisLabels 1-n DICOM/retired (5000-50FF,0103) US RETIRED_DataValueRepresentation 1 DICOM/retired (5000-50FF,0104) US RETIRED_MinimumCoordinateValue 1-n DICOM/retired (5000-50FF,0105) US RETIRED_MaximumCoordinateValue 1-n DICOM/retired (5000-50FF,0106) SH RETIRED_CurveRange 1-n DICOM/retired (5000-50FF,0110) US RETIRED_CurveDataDescriptor 1-n DICOM/retired (5000-50FF,0112) US RETIRED_CoordinateStartValue 1-n DICOM/retired (5000-50FF,0114) US RETIRED_CoordinateStepValue 1-n DICOM/retired (5000-50FF,1001) CS RETIRED_CurveActivationLayer 1 DICOM/retired (5000-50FF,2000) US RETIRED_AudioType 1 DICOM/retired (5000-50FF,2002) US RETIRED_AudioSampleFormat 1 DICOM/retired (5000-50FF,2004) US RETIRED_NumberOfChannels 1 DICOM/retired (5000-50FF,2006) UL RETIRED_NumberOfSamples 1 DICOM/retired (5000-50FF,2008) UL RETIRED_SampleRate 1 DICOM/retired (5000-50FF,200A) UL RETIRED_TotalTime 1 DICOM/retired (5000-50FF,200C) ox RETIRED_AudioSampleData 1 DICOM/retired (5000-50FF,200E) LT RETIRED_AudioComments 1 DICOM/retired (5000-50FF,2500) LO RETIRED_CurveLabel 1 DICOM/retired (5000-50FF,2600) SQ RETIRED_CurveReferencedOverlaySequence 1 DICOM/retired (5000-50FF,2610) US RETIRED_CurveReferencedOverlayGroup 1 DICOM/retired (5000-50FF,3000) ox RETIRED_CurveData 1 DICOM/retired (6000-60FF,0012) US RETIRED_OverlayPlanes 1 DICOM/retired (6000-60FF,0052) US RETIRED_OverlayPlaneOrigin 1 DICOM/retired (6000-60FF,0060) CS RETIRED_OverlayCompressionCode 1 DICOM/retired (6000-60FF,0061) SH RETIRED_OverlayCompressionOriginator 1 DICOM/retired (6000-60FF,0062) SH RETIRED_OverlayCompressionLabel 1 DICOM/retired (6000-60FF,0063) CS RETIRED_OverlayCompressionDescription 1 DICOM/retired (6000-60FF,0066) AT RETIRED_OverlayCompressionStepPointers 1-n DICOM/retired (6000-60FF,0068) US RETIRED_OverlayRepeatInterval 1 DICOM/retired (6000-60FF,0069) US RETIRED_OverlayBitsGrouped 1 DICOM/retired (6000-60FF,0110) CS RETIRED_OverlayFormat 1 DICOM/retired (6000-60FF,0200) US RETIRED_OverlayLocation 1 DICOM/retired (6000-60FF,0800) CS RETIRED_OverlayCodeLabel 1-n DICOM/retired (6000-60FF,0802) US RETIRED_OverlayNumberOfTables 1 DICOM/retired (6000-60FF,0803) AT RETIRED_OverlayCodeTableLocation 1-n DICOM/retired (6000-60FF,0804) US RETIRED_OverlayBitsForCodeWord 1 DICOM/retired (6000-60FF,1100) US RETIRED_OverlayDescriptorGray 1 DICOM/retired (6000-60FF,1101) US RETIRED_OverlayDescriptorRed 1 DICOM/retired (6000-60FF,1102) US RETIRED_OverlayDescriptorGreen 1 DICOM/retired (6000-60FF,1103) US RETIRED_OverlayDescriptorBlue 1 DICOM/retired (6000-60FF,1200) US RETIRED_OverlaysGray 1-n DICOM/retired (6000-60FF,1201) US RETIRED_OverlaysRed 1-n DICOM/retired (6000-60FF,1202) US RETIRED_OverlaysGreen 1-n DICOM/retired (6000-60FF,1203) US RETIRED_OverlaysBlue 1-n DICOM/retired (6000-60FF,4000) LT RETIRED_OverlayComments 1 DICOM/retired (7FE0,0020) OW RETIRED_CoefficientsSDVN 1 DICOM/retired (7FE0,0030) OW RETIRED_CoefficientsSDHN 1 DICOM/retired (7FE0,0040) OW RETIRED_CoefficientsSDDN 1 DICOM/retired (7F00-7FFF,0010) ox RETIRED_VariablePixelData 1 DICOM/retired (7F00-7FFF,0011) US RETIRED_VariableNextDataGroup 1 DICOM/retired (7F00-7FFF,0020) OW RETIRED_VariableCoefficientsSDVN 1 DICOM/retired (7F00-7FFF,0030) OW RETIRED_VariableCoefficientsSDHN 1 DICOM/retired (7F00-7FFF,0040) OW RETIRED_VariableCoefficientsSDDN 1 DICOM/retired # #--------------------------------------------------------------------------- # # Retired data elements from ACR/NEMA 2 (1988) # (0000,0001) UL ACR_NEMA_CommandGroupLengthToEnd 1 ACR/NEMA2 (0000,0010) CS ACR_NEMA_CommandRecognitionCode 1 ACR/NEMA2 (0000,0200) LO ACR_NEMA_Initiator 1 ACR/NEMA2 (0000,0300) LO ACR_NEMA_Receiver 1 ACR/NEMA2 (0000,0400) LO ACR_NEMA_FindLocation 1 ACR/NEMA2 (0000,0850) US ACR_NEMA_NumberOfMatches 1 ACR/NEMA2 (0000,0860) US ACR_NEMA_ResponseSequenceNumber 1 ACR/NEMA2 (0000,4000) LO ACR_NEMA_DialogReceiver 1 ACR/NEMA2 (0000,4010) LO ACR_NEMA_TerminalType 1 ACR/NEMA2 (0000,5010) LO ACR_NEMA_MessageSetID 1 ACR/NEMA2 (0000,5020) LO ACR_NEMA_EndMessageSet 1 ACR/NEMA2 (0000,5110) LO ACR_NEMA_DisplayFormat 1 ACR/NEMA2 (0000,5120) LO ACR_NEMA_PagePositionID 1 ACR/NEMA2 (0000,5130) LO ACR_NEMA_TextFormatID 1 ACR/NEMA2 (0000,5140) CS ACR_NEMA_NormalReverse 1 ACR/NEMA2 (0000,5150) CS ACR_NEMA_AddGrayScale 1 ACR/NEMA2 (0000,5160) CS ACR_NEMA_Borders 1 ACR/NEMA2 (0000,5170) IS ACR_NEMA_Copies 1 ACR/NEMA2 (0000,5180) LO ACR_NEMA_MagnificationType 1 ACR/NEMA2 (0000,5190) LO ACR_NEMA_Erase 1-n ACR/NEMA2 (0000,51A0) CS ACR_NEMA_Print 1 ACR/NEMA2 (0000,51B0) US ACR_NEMA_Overlays 1-n ACR/NEMA2 (0008,0001) UL ACR_NEMA_IdentifyingGroupLengthToEnd 1 ACR/NEMA2 (0008,0010) LO ACR_NEMA_RecognitionCode 1 ACR/NEMA2 (0008,0040) US ACR_NEMA_OldDataSetType 1 ACR/NEMA2 (0008,0041) LO ACR_NEMA_DataSetSubtype 1 ACR/NEMA2 (0008,1000) LO ACR_NEMA_NetworkID 1 ACR/NEMA2 (0008,4000) LT ACR_NEMA_IdentifyingComments 1-n ACR/NEMA2 (0010,1050) LT ACR_NEMA_InsurancePlanIdentification 1-n ACR/NEMA2 (0018,1240) IS ACR_NEMA_UpperLowerPixelValues 1-n ACR/NEMA2 (0018,4000) LT ACR_NEMA_AcquisitionComments 1-n ACR/NEMA2 (0018,5030) DS ACR_NEMA_DynamicRange 1 ACR/NEMA2 (0018,5040) DS ACR_NEMA_TotalGain 1 ACR/NEMA2 (0020,0030) DS ACR_NEMA_ImagePosition 3 ACR/NEMA2 (0020,0035) DS ACR_NEMA_ImageOrientation 6 ACR/NEMA2 (0020,0050) DS ACR_NEMA_Location 1 ACR/NEMA2 (0020,0070) LO ACR_NEMA_ImageGeometryType 1 ACR/NEMA2 (0020,0080) LO ACR_NEMA_MaskingImage 1-n ACR/NEMA2 (0020,1001) IS ACR_NEMA_AcquisitionsInSeries 1 ACR/NEMA2 (0020,1003) IS ACR_NEMA_ImagesInSeries 1 ACR/NEMA2 (0020,1005) IS ACR_NEMA_ImagesInStudy 1 ACR/NEMA2 (0020,1020) LO ACR_NEMA_Reference 1-n ACR/NEMA2 (0020,3100-31FF) LO ACR_NEMA_SourceImageID 1-n ACR/NEMA2 (0020,3401) LO ACR_NEMA_ModifyingDeviceID 1 ACR/NEMA2 (0020,3402) LO ACR_NEMA_ModifiedImageID 1 ACR/NEMA2 (0020,3403) DA ACR_NEMA_ModifiedImageDate 1 ACR/NEMA2 (0020,3404) LO ACR_NEMA_ModifyingDeviceManufacturer 1 ACR/NEMA2 (0020,3405) TM ACR_NEMA_ModifiedImageTime 1 ACR/NEMA2 (0020,3406) LO ACR_NEMA_ModifiedImageDescription 1 ACR/NEMA2 (0020,5000) AT ACR_NEMA_OriginalImageIdentification 1-n ACR/NEMA2 (0020,5002) LO ACR_NEMA_OriginalImageIdentificationNomenclature 1-n ACR/NEMA2 (0028,0005) US ACR_NEMA_ImageDimensions 1 ACR/NEMA2 (0028,0040) CS ACR_NEMA_ImageFormat 1 ACR/NEMA2 (0028,0050) LO ACR_NEMA_ManipulatedImage 1-n ACR/NEMA2 (0028,0060) CS ACR_NEMA_CompressionCode 1 ACR/NEMA2 (0028,0104) xs ACR_NEMA_SmallestValidPixelValue 1 ACR/NEMA2 (0028,0105) xs ACR_NEMA_LargestValidPixelValue 1 ACR/NEMA2 (0028,0200) US ACR_NEMA_ImageLocation 1 ACR/NEMA2 (0028,1080) CS ACR_NEMA_GrayScale 1 ACR/NEMA2 (0028,1100) xs ACR_NEMA_GrayLookupTableDescriptor 3 ACR/NEMA2 (0028,1200) xs ACR_NEMA_GrayLookupTableData 1-n ACR/NEMA2 (0028,4000) LT ACR_NEMA_ImagePresentationComments 1-n ACR/NEMA2 (4000,0000) UL ACR_NEMA_TextGroupLength 1 ACR/NEMA2 (4000,0010) LT ACR_NEMA_TextArbitrary 1-n ACR/NEMA2 (4000,4000) LT ACR_NEMA_TextComments 1-n ACR/NEMA2 (6000-60ff,0110) CS ACR_NEMA_OverlayFormat 1 ACR/NEMA2 (6000-60ff,0200) US ACR_NEMA_OverlayLocation 1 ACR/NEMA2 (6000-60ff,4000) LT ACR_NEMA_OverlayComments 1-n ACR/NEMA2 # #--------------------------------------------------------------------------- # # Retired data elements from the ACR/NEMA 2 compression enhancements # (0028,005F) CS ACR_NEMA_2C_CompressionRecognitionCode 1 ACR/NEMA2C (0028,0061) SH ACR_NEMA_2C_CompressionOriginator 1 ACR/NEMA2C (0028,0062) SH ACR_NEMA_2C_CompressionLabel 1 ACR/NEMA2C (0028,0063) SH ACR_NEMA_2C_CompressionDescription 1 ACR/NEMA2C (0028,0065) CS ACR_NEMA_2C_CompressionSequence 1-n ACR/NEMA2C (0028,0066) AT ACR_NEMA_2C_CompressionStepPointers 1-n ACR/NEMA2C (0028,0068) US ACR_NEMA_2C_RepeatInterval 1 ACR/NEMA2C (0028,0069) US ACR_NEMA_2C_BitsGrouped 1 ACR/NEMA2C (0028,0070) US ACR_NEMA_2C_PerimeterTable 1-n ACR/NEMA2C (0028,0071) xs ACR_NEMA_2C_PerimeterValue 1 ACR/NEMA2C (0028,0080) US ACR_NEMA_2C_PredictorRows 1 ACR/NEMA2C (0028,0081) US ACR_NEMA_2C_PredictorColumns 1 ACR/NEMA2C (0028,0082) US ACR_NEMA_2C_PredictorConstants 1-n ACR/NEMA2C (0028,0090) CS ACR_NEMA_2C_BlockedPixels 1 ACR/NEMA2C (0028,0091) US ACR_NEMA_2C_BlockRows 1 ACR/NEMA2C (0028,0092) US ACR_NEMA_2C_BlockColumns 1 ACR/NEMA2C (0028,0093) US ACR_NEMA_2C_RowOverlap 1 ACR/NEMA2C (0028,0094) US ACR_NEMA_2C_ColumnOverlap 1 ACR/NEMA2C (0028,0400) CS ACR_NEMA_2C_TransformLabel 1 ACR/NEMA2C (0028,0401) CS ACR_NEMA_2C_TransformVersionNumber 1 ACR/NEMA2C (0028,0402) US ACR_NEMA_2C_NumberOfTransformSteps 1 ACR/NEMA2C (0028,0403) CS ACR_NEMA_2C_SequenceOfCompressedData 1-n ACR/NEMA2C (0028,0404) AT ACR_NEMA_2C_DetailsOfCoefficients 1-n ACR/NEMA2C (0028,0410) US ACR_NEMA_2C_RowsForNthOrderCoefficients 1 ACR/NEMA2C (0028,0411) US ACR_NEMA_2C_ColumnsForNthOrderCoefficients 1 ACR/NEMA2C (0028,0412) CS ACR_NEMA_2C_CoefficientCoding 1-n ACR/NEMA2C (0028,0413) AT ACR_NEMA_2C_CoefficientCodingPointers 1-n ACR/NEMA2C (0028,0700) CS ACR_NEMA_2C_DCTLabel 1 ACR/NEMA2C (0028,0701) CS ACR_NEMA_2C_DataBlockDescription 1-n ACR/NEMA2C (0028,0702) AT ACR_NEMA_2C_DataBlock 1-n ACR/NEMA2C (0028,0710) US ACR_NEMA_2C_NormalizationFactorFormat 1 ACR/NEMA2C (0028,0720) US ACR_NEMA_2C_ZonalMapNumberFormat 1 ACR/NEMA2C (0028,0721) AT ACR_NEMA_2C_ZonalMapLocation 1-n ACR/NEMA2C (0028,0722) US ACR_NEMA_2C_ZonalMapFormat 1 ACR/NEMA2C (0028,0730) US ACR_NEMA_2C_AdaptiveMapFormat 1 ACR/NEMA2C (0028,0740) US ACR_NEMA_2C_CodeNumberFormat 1 ACR/NEMA2C (0028,0800) CS ACR_NEMA_2C_CodeLabel 1-n ACR/NEMA2C (0028,0802) US ACR_NEMA_2C_NumberOfTables 1 ACR/NEMA2C (0028,0803) AT ACR_NEMA_2C_CodeTableLocation 1-n ACR/NEMA2C (0028,0804) US ACR_NEMA_2C_BitsForCodeWord 1 ACR/NEMA2C (0028,0808) AT ACR_NEMA_2C_ImageDataLocation 1-n ACR/NEMA2C (1000,0000) UL ACR_NEMA_2C_CodeTableGroupLength 1 ACR/NEMA2C (1000,0010) US ACR_NEMA_2C_EscapeTriplet 3 ACR/NEMA2C (1000,0011) US ACR_NEMA_2C_RunLengthTriplet 3 ACR/NEMA2C (1000,0012) US ACR_NEMA_2C_HuffmanTableSize 1 ACR/NEMA2C (1000,0013) US ACR_NEMA_2C_HuffmanTableTriplet 3 ACR/NEMA2C (1000,0014) US ACR_NEMA_2C_ShiftTableSize 1 ACR/NEMA2C (1000,0015) US ACR_NEMA_2C_ShiftTableTriplet 3 ACR/NEMA2C (1010,0000) UL ACR_NEMA_2C_ZonalMapGroupLength 1 ACR/NEMA2C (1010,0004) US ACR_NEMA_2C_ZonalMap 1-n ACR/NEMA2C (6000-60ff,0060) CS ACR_NEMA_2C_OverlayCompressionCode 1 ACR/NEMA2C (6000-60ff,0061) SH ACR_NEMA_2C_OverlayCompressionOriginator 1 ACR/NEMA2C (6000-60ff,0062) SH ACR_NEMA_2C_OverlayCompressionLabel 1 ACR/NEMA2C (6000-60ff,0063) SH ACR_NEMA_2C_OverlayCompressionDescription 1 ACR/NEMA2C (6000-60ff,0066) AT ACR_NEMA_2C_OverlayCompressionStepPointers 1-n ACR/NEMA2C (6000-60ff,0068) US ACR_NEMA_2C_OverlayRepeatInterval 1 ACR/NEMA2C (6000-60ff,0069) US ACR_NEMA_2C_OverlayBitsGrouped 1 ACR/NEMA2C (6000-60ff,0800) CS ACR_NEMA_2C_OverlayCodeLabel 1-n ACR/NEMA2C (6000-60ff,0802) US ACR_NEMA_2C_OverlayNumberOfTables 1 ACR/NEMA2C (6000-60ff,0803) AT ACR_NEMA_2C_OverlayCodeTableLocation 1-n ACR/NEMA2C (6000-60ff,0804) US ACR_NEMA_2C_OverlayBitsForCodeWord 1 ACR/NEMA2C (7F00-7fff,0000) UL ACR_NEMA_2C_VariablePixelDataGroupLength 1 ACR/NEMA2C (7F00-7fff,0010) ox ACR_NEMA_2C_VariablePixelData 1 ACR/NEMA2C (7F00-7fff,0011) AT ACR_NEMA_2C_VariableNextDataGroup 1 ACR/NEMA2C (7F00-7fff,0020) OW ACR_NEMA_2C_VariableCoefficientsSDVN 1-n ACR/NEMA2C (7F00-7fff,0030) OW ACR_NEMA_2C_VariableCoefficientsSDHN 1-n ACR/NEMA2C (7F00-7fff,0040) OW ACR_NEMA_2C_VariableCoefficientsSDDN 1-n ACR/NEMA2C (7FE0,0020) OW ACR_NEMA_2C_CoefficientsSDVN 1-n ACR/NEMA2C (7FE0,0030) OW ACR_NEMA_2C_CoefficientsSDHN 1-n ACR/NEMA2C (7FE0,0040) OW ACR_NEMA_2C_CoefficientsSDDN 1-n ACR/NEMA2C # # EOF # dcmtk-3.6.0/dcmdata/data/Makefile.in0000644000310500011400000000072711337264642016430 0ustar joergrdicom3# # Makefile for dcmdata/data # @SET_MAKE@ SHELL = /bin/sh srcdir = @srcdir@ top_srcdir = @top_srcdir@ configdir = @top_srcdir@/@configdir@ include $(configdir)/@common_makefile@ files = dicom.dic private.dic diconde.dic dcm2xml.dtd dumppat.txt SC.dump VLP.dump all: install: $(configdir)/mkinstalldirs $(DESTDIR)$(datadir) for file in $(files); do \ $(INSTALL_DATA) $$file $(DESTDIR)$(datadir) ;\ done clean: rm -f $(TRASH) distclean: rm -f $(DISTTRASH) dcmtk-3.6.0/dcmdata/data/diconde.dic0000644000310500011400000002404211455577660016455 0ustar joergrdicom3# # Copyright (C) 2010, 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: dcmdata # # Author: Joerg Riesmeier # # Purpose: DICONDE data dictionary for the dcmtk class library # # Last Update: $Author: joergr $ # Update Date: $Date: 2010-10-14 13:03:44 $ # CVS/RCS Revision: $Revision: 1.3 $ # Status: $State: Exp $ # # # Dictionary of Digital Imaging and Communication in Nondestructive # Evaluation (DICONDE) Tags # # Each line represents an entry in the data dictionary. Each line # has 5 fields (Tag, VR, Name, VM, Version). Entries need not be # in ascending tag order. # # Entries may override existing entries. # # Each field must be separated by a single tab. # The tag value may take one of three forms: # (gggg,eeee) # (gggg,"CREATOR",ee) # (gggg,"CREATOR",eeee) [eeee >= 1000] # The first form represents a standard tag with group and element number. # The second form describes a private tag that may be used with different # element numbers as reserved by the private creator element. The third # form describes a private tag that may only occur with a certain fixed # element number. In all cases, the tag values must be in hexadecimal. # # Comments have a '#' at the beginning of the line. # # Tag VR Name VM Version # (0008,0080) LO CompanyName 1 DICONDE10 (0008,0081) ST CompanyAddress 1 DICONDE10 (0008,0090) PN ComponentOwnerName 1 DICONDE10 (0008,1040) LO DepartmentName 1 DICONDE10 (0008,1048) PN InspectingCompanyName 1-n DICONDE10 (0008,1050) PN InspectorName 1-n DICONDE10 (0008,1060) PN CertifyingInspectorName 1-n DICONDE10 (0010,0010) PN ComponentName 1 DICONDE10 (0010,0020) LO ComponentIDNumber 1 DICONDE10 (0010,0030) DA ComponentManufacturingDate 1 DICONDE10 (0010,1000) LO OtherComponentIDs 1-n DICONDE10 (0010,1001) PN OtherComponentNames 1-n DICONDE10 (0010,2160) SH MaterialName 1 DICONDE10 (0010,4000) LT ComponentNotes 1 DICONDE10 (0018,1008) LO ScannerID 1 DICONDE10 (0032,4000) LT ExaminationNotes 1 DICONDE10 (0009,"astm.org/diconde/iod/ComponentStudy",20) DA ExpiryDate 1 DICONDE10 (0009,"astm.org/diconde/iod/ComponentSeries",10) ST ActualEnvironmentalConditions 1 DICONDE10 (0009,"astm.org/diconde/iod/ComponentSeries",40) ST EnvironmentalConditions 1 DICONDE10 (0011,"astm.org/diconde/iod/Component",23) ST CADFileFormat 1-n DICONDE10 (0011,"astm.org/diconde/iod/Component",24) ST ComponentRefSystem 1-n DICONDE10 (0011,"astm.org/diconde/iod/Component",25) ST ComponentManufacturingProcedure 1-n DICONDE10 (0011,"astm.org/diconde/iod/Component",28) ST ComponentManufacturer 1-n DICONDE10 (0011,"astm.org/diconde/iod/Component",30) DS Thickness 1-n DICONDE10 (0011,"astm.org/diconde/iod/Component",32) DS MaterialPipeDiameter 1-n DICONDE10 (0011,"astm.org/diconde/iod/Component",34) DS MaterialIsolationDiameter 1-n DICONDE10 (0011,"astm.org/diconde/iod/Component",42) ST MaterialGrade 1-n DICONDE10 (0011,"astm.org/diconde/iod/Component",44) ST MaterialPropertiesFileID 1-n DICONDE10 (0011,"astm.org/diconde/iod/Component",45) ST MaterialPropertiesFileFormat 1-n DICONDE10 (0011,"astm.org/diconde/iod/Component",46) LT MaterialNotes 1 DICONDE10 (0011,"astm.org/diconde/iod/Component",50) CS Shape 1 DICONDE10 (0011,"astm.org/diconde/iod/Component",52) CS CurvatureType 1 DICONDE10 (0011,"astm.org/diconde/iod/Component",54) DS OuterDiameter 1 DICONDE10 (0011,"astm.org/diconde/iod/Component",56) DS InnerDiameter 1 DICONDE10 (0021,"astm.org/diconde/iod/NdeIndication",02) SQ EvaluatorSequence 1 DICONDE10 (0021,"astm.org/diconde/iod/NdeIndication",04) IS EvaluatorNumber 1 DICONDE10 (0021,"astm.org/diconde/iod/NdeIndication",06) PN EvaluatorName 1 DICONDE10 (0021,"astm.org/diconde/iod/NdeIndication",08) IS EvaluationAttempt 1 DICONDE10 (0021,"astm.org/diconde/iod/NdeIndication",12) SQ IndicationSequence 1 DICONDE10 (0021,"astm.org/diconde/iod/NdeIndication",14) IS IndicationNumber 1 DICONDE10 (0021,"astm.org/diconde/iod/NdeIndication",16) SH IndicationLabel 1 DICONDE10 (0021,"astm.org/diconde/iod/NdeIndication",18) ST IndicationDesription 1 DICONDE10 (0021,"astm.org/diconde/iod/NdeIndication",1A) CS IndicationType 1-n DICONDE10 (0021,"astm.org/diconde/iod/NdeIndication",1C) CS IndicationDisposition 1 DICONDE10 (0021,"astm.org/diconde/iod/NdeIndication",1E) SQ IndicationROISequence 1 DICONDE10 (0021,"astm.org/diconde/iod/NdeIndication",20) CS IndicationROIGeometricType 1 DICONDE10 (0021,"astm.org/diconde/iod/NdeIndication",22) IS NumberOfROIContourPoints 1 DICONDE10 (0021,"astm.org/diconde/iod/NdeIndication",24) DS IndicationROIContourData 3-3n DICONDE10 (0021,"astm.org/diconde/iod/NdeIndication",26) CS IndicationROIContourPointUnits 3 DICONDE10 (0021,"astm.org/diconde/iod/NdeIndication",28) IS IndicationROIDimensionality 1 DICONDE10 (0021,"astm.org/diconde/iod/NdeIndication",30) SQ IndicationPhysicalPropertySequence 1 DICONDE10 (0021,"astm.org/diconde/iod/NdeIndication",32) SH PropertyLabel 1 DICONDE10 (0021,"astm.org/diconde/iod/NdeIndication",34) DS PropertyValue 1 DICONDE10 (0021,"astm.org/diconde/iod/NdeIndication",36) CS PropertyUnits 1 DICONDE10 (0021,"astm.org/diconde/iod/NDEGeometry",02) IS NumberOfAxes 1 DICONDE10 (0021,"astm.org/diconde/iod/NDEGeometry",04) SQ AxesSequence 1 DICONDE10 (0021,"astm.org/diconde/iod/NDEGeometry",06) ST AxisDescription 1 DICONDE10 (0021,"astm.org/diconde/iod/NDEGeometry",08) CS DataSetMapping 1 DICONDE10 (0021,"astm.org/diconde/iod/NDEGeometry",0A) IS AxisNumber 1 DICONDE10 (0021,"astm.org/diconde/iod/NDEGeometry",0C) CS AxisType 1 DICONDE10 (0021,"astm.org/diconde/iod/NDEGeometry",0E) CS AxisUnits 1 DICONDE10 (0021,"astm.org/diconde/iod/NDEGeometry",10) OB AxisValues 1 DICONDE10 (0021,"astm.org/diconde/iod/NDEGeometry",20) SQ TransformSequence 1 DICONDE10 (0021,"astm.org/diconde/iod/NDEGeometry",22) ST TransformDescription 1 DICONDE10 (0021,"astm.org/diconde/iod/NDEGeometry",24) IS NumberOfAxes 1 DICONDE10 (0021,"astm.org/diconde/iod/NDEGeometry",26) IS OrderOfAxes 1-n DICONDE10 (0021,"astm.org/diconde/iod/NDEGeometry",28) CS TransformedAxisUnits 1 DICONDE10 (0021,"astm.org/diconde/iod/NDEGeometry",2A) DS RotationAndScaleMatrix 1-n DICONDE10 (0021,"astm.org/diconde/iod/NDEGeometry",2C) DS TranslationMatrix 11 DICONDE10 # X-ray Computed Tomography (CT) (0009,"astm.org/diconde/iod/NdeCTImage",02) IS LINACEnergy 1 DICONDE10_CT (0009,"astm.org/diconde/iod/NdeCTImage",04) IS LINACOutput 1 DICONDE10_CT (0009,"astm.org/diconde/iod/NdeCtDetector",11) DS InternalDetectorFrameTime 1 DICONDE10_CT (0009,"astm.org/diconde/iod/NdeCtDetector",12) DS NumberOfFramesIntegrated 1 DICONDE10_CT (0009,"astm.org/diconde/iod/NdeCtDetector",20) SQ DetectorTemperatureSequence 1 DICONDE10_CT (0009,"astm.org/diconde/iod/NdeCtDetector",22) DS SensorName 1 DICONDE10_CT (0009,"astm.org/diconde/iod/NdeCtDetector",24) DS HorizontalOffset 1 DICONDE10_CT (0009,"astm.org/diconde/iod/NdeCtDetector",26) DS VerticalOffset 1 DICONDE10_CT (0009,"astm.org/diconde/iod/NdeCtDetector",28) DS Temperature 1 DICONDE10_CT (0009,"astm.org/diconde/iod/NdeCtCalibrationData",40) SQ DarkCurrentSequence 1 DICONDE10_CT (0009,"astm.org/diconde/iod/NdeCtCalibrationData",50) ox DarkCurrentCounts 1 DICONDE10_CT (0009,"astm.org/diconde/iod/NdeCtCalibrationData",60) SQ GainCorrectionReferenceSequence 1 DICONDE10_CT (0009,"astm.org/diconde/iod/NdeCtCalibrationData",70) ox AirCounts 1 DICONDE10_CT (0009,"astm.org/diconde/iod/NdeCtCalibrationData",71) DS KVUsedinGainCalibration 1 DICONDE10_CT (0009,"astm.org/diconde/iod/NdeCtCalibrationData",72) DS MAsUsedInGainCalibration 1 DICONDE10_CT (0009,"astm.org/diconde/iod/NdeCtCalibrationData",73) DS NumberOfFrames 1 DICONDE10_CT (0009,"astm.org/diconde/iod/NdeCtCalibrationData",74) LO FilterMaterialUsedInGainCalibration 1 DICONDE10_CT (0009,"astm.org/diconde/iod/NdeCtCalibrationData",75) DS FilterThicknessUsedInGainCalibration 1 DICONDE10_CT (0009,"astm.org/diconde/iod/NdeCtCalibrationData",76) DA DateOfGainCalibration 1-n DICONDE10_CT (0009,"astm.org/diconde/iod/NdeCtCalibrationData",77) TM TimeOfGainCalibration 1-n DICONDE10_CT (0009,"astm.org/diconde/iod/NdeCtCalibrationData",80) OB BadPixelImage 1 DICONDE10_CT (0009,"astm.org/diconde/iod/NdeCtCalibrationData",99) LT CalibrationNotes 1 DICONDE10_CT # Digital Radiographic (DR) (0009,"astm.org/diconde/iod/NdeDxDetector",11) DS InternalDetectorFrameTime 1 DICONDE10_DR (0009,"astm.org/diconde/iod/NdeDxDetector",12) DS NumberOfFramesIntegrated 1 DICONDE10_DR (0009,"astm.org/diconde/iod/NdeDxDetector",20) SQ DetectorTemperatureSequence 1 DICONDE10_DR (0009,"astm.org/diconde/iod/NdeDxDetector",22) DS SensorName 1 DICONDE10_DR (0009,"astm.org/diconde/iod/NdeDxDetector",24) DS HorizontalOffset 1 DICONDE10_DR (0009,"astm.org/diconde/iod/NdeDxDetector",26) DS VerticalOffset 1 DICONDE10_DR (0009,"astm.org/diconde/iod/NdeDxDetector",28) DS Temperature 1 DICONDE10_DR (0009,"astm.org/diconde/iod/NdeDxCalibrationData",40) SQ DarkCurrentSequence 1 DICONDE10_DR (0009,"astm.org/diconde/iod/NdeDxCalibrationData",50) ox DarkCurrentCounts 1 DICONDE10_DR (0009,"astm.org/diconde/iod/NdeDxCalibrationData",60) SQ GainCorrectionReferenceSequence 1 DICONDE10_DR (0009,"astm.org/diconde/iod/NdeDxCalibrationData",70) ox AirCounts 1 DICONDE10_DR (0009,"astm.org/diconde/iod/NdeDxCalibrationData",71) DS KVUsedinGainCalibration 1 DICONDE10_DR (0009,"astm.org/diconde/iod/NdeDxCalibrationData",72) DS MAsUsedInGainCalibration 1 DICONDE10_DR (0009,"astm.org/diconde/iod/NdeDxCalibrationData",73) DS NumberOfFrames 1 DICONDE10_DR (0009,"astm.org/diconde/iod/NdeDxCalibrationData",74) LO FilterMaterialUsedInGainCalibration 1 DICONDE10_DR (0009,"astm.org/diconde/iod/NdeDxCalibrationData",75) DS FilterThicknessUsedInGainCalibration 1 DICONDE10_DR (0009,"astm.org/diconde/iod/NdeDxCalibrationData",76) DA DateOfGainCalibration 1-n DICONDE10_DR (0009,"astm.org/diconde/iod/NdeDxCalibrationData",77) TM TimeOfGainCalibration 1-n DICONDE10_DR (0009,"astm.org/diconde/iod/NdeDxCalibrationData",80) OB BadPixelImage 1 DICONDE10_DR (0009,"astm.org/diconde/iod/NdeDxCalibrationData",99) LT CalibrationNotes 1 DICONDE10_DR # # end of diconde.dic # dcmtk-3.6.0/dcmdata/data/dumppat.txt0000644000310500011400000000012511427775736016601 0ustar joergrdicom3--search PatientName --search PatientID --search PatientBirthDate --search PatientSexdcmtk-3.6.0/dcmdata/data/CMakeLists.txt0000644000310500011400000000021711337264642017115 0ustar joergrdicom3# declare installation files INSTALL_FILES(${INSTALL_DATDIR} FILES dicom.dic private.dic diconde.dic dcm2xml.dtd dumppat.txt SC.dump VLP.dump) dcmtk-3.6.0/dcmdata/data/SC.dump0000644000310500011400000000714710721543626015560 0ustar joergrdicom3 ################################################################################ # IMG2DCM TEMPLATE FOR WRITING SECONDARY CAPTURE OBJECTS # # SOP Class: 1.2.840.10008.5.1.4.1.1.7 (SC) # ################################################################################ # Type 1: Value MUST be filled in # # Type 1C: Value MUST be filled in if known, if certain condition (see # # standard) is fullfilled, otherwise DO NOT insert # # Type 2: Value MUST be filled in if known, MUST be left empty otherwise # # Type 2C: Same as 2, if a certain condition (see standard) is met. If the # # condition is not met, DO NOT insert # # Type 3: User optional, CAN be written (if it should not, delete line). # # The value written can be choosen freely, but has to conform to # # element's VR (see standard) # ################################################################################ ########################### Patient Module ##################################### # Patient's Name, Type 2 (0010,0010) PN [] # Patient ID, Type 2 (0010,0020) LO [] # Patient's Birth Date, Type 2 (0010,0030) DA [] # Patient's Sex, Type 2 (0010,0040) CS [] # Responsible Organization, Type 2C (only included if patient is animal...) # (0010,2299) LO [] ########################### General Study Module ############################## # All attributes from the General Study Module are overwritten by the # # --study-from and series-from options # ############################################################################### # Study Date, Type 2 (0008,0020) DA [] # Study Time, Type 2 (0008,0030) TM [] # Accession Number, Type 2 (0008,0050) SH [] # Referring Physician's Name, Type 2 (0008,0090) PN [] # Study ID, Type 2 (0020,0010) SH [] # Study Instance UID, Type 1, usually provided automatically (newly created) #(0020,000d) UI [] ########################### General Series Module ############################## # All attributes from the General Series Module are overwritten by the # # --series-from option # ################################################################################ # Patient Position, Type 2C (0018,5100) CS (no value available) # Series Instance UID, Type 1, usually provided automatically (newly created) # (0020,000e) UI [] # Series Number, Type 2 (0020,0011) IS [] # Laterality, Type 2C # (0020,0060) CS (no value available) ###################### SC Equipment Module ##################################### # Conversion Type, Type 1, Defined Terms, see Standard (SI=Scanned Image) (0008,0064) CS [SI] ###################### General Image Module #################################### # Content Date, Type 2C #(0008,0023) DA [] # Instance Number, Type 2 (0020,0013) IS [] # Patient Orientation, Type 2C (0020,0020) CS (no value available) ###################### Image Pixel Module ###################################### # The Image Pixel Module is written by the img2dcm application # ################################################################################ ########################### SOP Common Module ################################## # Specific Character Set, Type 1C. # "ISO_IR 100" should be used if ISO Latin 1 characters could/are used in file # If only plain ASCII is used, this line could (but does not have to) be deleted (0008,0005) CS [ISO_IR 100]dcmtk-3.6.0/dcmdata/data/dcm2xml.dtd0000644000310500011400000000272211455576370016430 0ustar joergrdicom3 dcmtk-3.6.0/dcmdata/data/private.dic0000644000310500011400000042202711472444136016515 0ustar joergrdicom3# # Copyright (C) 1994-2010, 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: dcmdata # # Author: Andrew Hewett, Marco Eichelberg, Joerg Riesmeier # # Purpose: # This is the private tag DICOM data dictionary for the dcmtk class library. # # Last Update: $Author: joergr $ # Update Date: $Date: 2010-11-22 10:39:26 $ # CVS/RCS Revision: $Revision: 1.10 $ # Status: $State: Exp $ # # # Dictionary of Private Tags # # This dictionary contains the private tags defined in the following # reference documents (in alphabetical order): # - Circle Cardiovascular Imaging cmr42 3.0 conformance statement # - David Clunie's dicom3tools package, 2002-04-20 snapshot # - Fuji CR console, 3rd release # - Intelerad Medical Systems Inc., Image Server # - OCULUS Pentacam 1.17 conformance statement # - Philips Digital Diagnost 1.3 conformance statement # - Philips Integris H, catheterization laboratory, RIS-interface # - Philips Intera Achieva Conformance Statement # - Siemens Somatom syngo VA40B conformance statement # - Siemens AXIOM Artis VB30 conformance statement # - SonoWand Invite 2.1.1 conformance statement # - Swissvision TR4000 conformance statement # - private tags for DCMTK anonymizer tool # # Each line represents an entry in the data dictionary. Each line # has 5 fields (Tag, VR, Name, VM, Version). Entries need not be # in ascending tag order. # # Entries may override existing entries. # # Each field must be separated by a single tab. # The tag value may take one of two forms: # (gggg,"CREATOR",ee) # (gggg,"CREATOR",eeee) [eeee >= 1000] # The first form describes a private tag that may be used with different # element numbers as reserved by the private creator element. # The second form describes a private tag that may only occur with a # certain fixed element number. # In both cases, the tag values must be in hexadecimal. # Repeating groups are represented by indicating the range # (gggg-o-gggg,"CREATOR",ee) or (gggg-o-gggg,"CREATOR",eeee) # where "-o-" indicates that only odd group numbers match the definition. # The element part of the tag can also be a range. # # Comments have a '#' at the beginning of the line. # # Tag VR Name VM Version # (0019,"1.2.840.113681",10) ST CRImageParamsCommon 1 (0019,"1.2.840.113681",11) ST CRImageIPParamsSingle 1 (0019,"1.2.840.113681",12) ST CRImageIPParamsLeft 1 (0019,"1.2.840.113681",13) ST CRImageIPParamsRight 1 (0087,"1.2.840.113708.794.1.1.2.0",10) CS MediaType 1 (0087,"1.2.840.113708.794.1.1.2.0",20) CS MediaLocation 1 (0087,"1.2.840.113708.794.1.1.2.0",50) IS EstimatedRetrieveTime 1 (0009,"ACUSON",00) IS Unknown 1 (0009,"ACUSON",01) IS Unknown 1 (0009,"ACUSON",02) UN Unknown 1 (0009,"ACUSON",03) UN Unknown 1 (0009,"ACUSON",04) UN Unknown 1 (0009,"ACUSON",05) UN Unknown 1 (0009,"ACUSON",06) UN Unknown 1 (0009,"ACUSON",07) UN Unknown 1 (0009,"ACUSON",08) LT Unknown 1 (0009,"ACUSON",09) LT Unknown 1 (0009,"ACUSON",0a) IS Unknown 1 (0009,"ACUSON",0b) IS Unknown 1 (0009,"ACUSON",0c) IS Unknown 1 (0009,"ACUSON",0d) IS Unknown 1 (0009,"ACUSON",0e) IS Unknown 1 (0009,"ACUSON",0f) UN Unknown 1 (0009,"ACUSON",10) IS Unknown 1 (0009,"ACUSON",11) UN Unknown 1 (0009,"ACUSON",12) IS Unknown 1 (0009,"ACUSON",13) IS Unknown 1 (0009,"ACUSON",14) LT Unknown 1 (0009,"ACUSON",15) UN Unknown 1 (0003,"AEGIS_DICOM_2.00",00) US Unknown 1-n (0005,"AEGIS_DICOM_2.00",00) US Unknown 1-n (0009,"AEGIS_DICOM_2.00",00) US Unknown 1-n (0019,"AEGIS_DICOM_2.00",00) US Unknown 1-n (0029,"AEGIS_DICOM_2.00",00) US Unknown 1-n (1369,"AEGIS_DICOM_2.00",00) US Unknown 1-n (0009,"AGFA",10) LO Unknown 1 (0009,"AGFA",11) LO Unknown 1 (0009,"AGFA",13) LO Unknown 1 (0009,"AGFA",14) LO Unknown 1 (0009,"AGFA",15) LO Unknown 1 (0029,"CAMTRONICS IP",10) LT Unknown 1 (0029,"CAMTRONICS IP",20) UN Unknown 1 (0029,"CAMTRONICS IP",30) UN Unknown 1 (0029,"CAMTRONICS IP",40) UN Unknown 1 (0029,"CAMTRONICS",10) LT Commentline 1 (0029,"CAMTRONICS",20) DS EdgeEnhancementCoefficient 1 (0029,"CAMTRONICS",50) LT SceneText 1 (0029,"CAMTRONICS",60) LT ImageText 1 (0029,"CAMTRONICS",70) IS PixelShiftHorizontal 1 (0029,"CAMTRONICS",80) IS PixelShiftVertical 1 (0029,"CAMTRONICS",90) IS Unknown 1 (0009,"CARDIO-D.R. 1.0",00) UL FileLocation 1 (0009,"CARDIO-D.R. 1.0",01) UL FileSize 1 (0009,"CARDIO-D.R. 1.0",40) SQ AlternateImageSequence 1 (0019,"CARDIO-D.R. 1.0",00) CS ImageBlankingShape 1 (0019,"CARDIO-D.R. 1.0",02) IS ImageBlankingLeftVerticalEdge 1 (0019,"CARDIO-D.R. 1.0",04) IS ImageBlankingRightVerticalEdge 1 (0019,"CARDIO-D.R. 1.0",06) IS ImageBlankingUpperHorizontalEdge 1 (0019,"CARDIO-D.R. 1.0",08) IS ImageBlankingLowerHorizontalEdge 1 (0019,"CARDIO-D.R. 1.0",10) IS CenterOfCircularImageBlanking 1 (0019,"CARDIO-D.R. 1.0",12) IS RadiusOfCircularImageBlanking 1 (0019,"CARDIO-D.R. 1.0",30) UL MaximumImageFrameSize 1 (0021,"CARDIO-D.R. 1.0",13) IS ImageSequenceNumber 1 (0029,"CARDIO-D.R. 1.0",00) SQ EdgeEnhancementSequence 1 (0029,"CARDIO-D.R. 1.0",01) US ConvolutionKernelSize 2 (0029,"CARDIO-D.R. 1.0",02) DS ConvolutionKernelCoefficients 1-n (0029,"CARDIO-D.R. 1.0",03) DS EdgeEnhancementGain 1 (0025,"CMR42 CIRCLECVI",1010) LO WorkspaceID 1 (0025,"CMR42 CIRCLECVI",1020) LO WorkspaceTimeString 1 (0025,"CMR42 CIRCLECVI",1030) OB WorkspaceStream 1 (0009,"DCMTK_ANONYMIZER",00) SQ AnonymizerUIDMap 1 (0009,"DCMTK_ANONYMIZER",10) UI AnonymizerUIDKey 1 (0009,"DCMTK_ANONYMIZER",20) UI AnonymizerUIDValue 1 (0009,"DCMTK_ANONYMIZER",30) SQ AnonymizerPatientIDMap 1 (0009,"DCMTK_ANONYMIZER",40) LO AnonymizerPatientIDKey 1 (0009,"DCMTK_ANONYMIZER",50) LO AnonymizerPatientIDValue 1 (0019,"DIDI TO PCR 1.1",22) UN RouteAET 1 (0019,"DIDI TO PCR 1.1",23) DS PCRPrintScale 1 (0019,"DIDI TO PCR 1.1",24) UN PCRPrintJobEnd 1 (0019,"DIDI TO PCR 1.1",25) IS PCRNoFilmCopies 1 (0019,"DIDI TO PCR 1.1",26) IS PCRFilmLayoutPosition 1 (0019,"DIDI TO PCR 1.1",27) UN PCRPrintReportName 1 (0019,"DIDI TO PCR 1.1",70) UN RADProtocolPrinter 1 (0019,"DIDI TO PCR 1.1",71) UN RADProtocolMedium 1 (0019,"DIDI TO PCR 1.1",90) LO UnprocessedFlag 1 (0019,"DIDI TO PCR 1.1",91) UN KeyValues 1 (0019,"DIDI TO PCR 1.1",92) UN DestinationPostprocessingFunction 1 (0019,"DIDI TO PCR 1.1",A0) UN Version 1 (0019,"DIDI TO PCR 1.1",A1) UN RangingMode 1 (0019,"DIDI TO PCR 1.1",A2) UN AbdomenBrightness 1 (0019,"DIDI TO PCR 1.1",A3) UN FixedBrightness 1 (0019,"DIDI TO PCR 1.1",A4) UN DetailContrast 1 (0019,"DIDI TO PCR 1.1",A5) UN ContrastBalance 1 (0019,"DIDI TO PCR 1.1",A6) UN StructureBoost 1 (0019,"DIDI TO PCR 1.1",A7) UN StructurePreference 1 (0019,"DIDI TO PCR 1.1",A8) UN NoiseRobustness 1 (0019,"DIDI TO PCR 1.1",A9) UN NoiseDoseLimit 1 (0019,"DIDI TO PCR 1.1",AA) UN NoiseDoseStep 1 (0019,"DIDI TO PCR 1.1",AB) UN NoiseFrequencyLimit 1 (0019,"DIDI TO PCR 1.1",AC) UN WeakContrastLimit 1 (0019,"DIDI TO PCR 1.1",AD) UN StrongContrastLimit 1 (0019,"DIDI TO PCR 1.1",AE) UN StructureBoostOffset 1 (0019,"DIDI TO PCR 1.1",AF) UN SmoothGain 1 (0019,"DIDI TO PCR 1.1",B0) UN MeasureField1 1 (0019,"DIDI TO PCR 1.1",B1) UN MeasureField2 1 (0019,"DIDI TO PCR 1.1",B2) UN KeyPercentile1 1 (0019,"DIDI TO PCR 1.1",B3) UN KeyPercentile2 1 (0019,"DIDI TO PCR 1.1",B4) UN DensityLUT 1 (0019,"DIDI TO PCR 1.1",B5) UN Brightness 1 (0019,"DIDI TO PCR 1.1",B6) UN Gamma 1 (0089,"DIDI TO PCR 1.1",10) SQ Unknown 1 (0029,"DIGISCAN IMAGE",31) US Unknown 1-n (0029,"DIGISCAN IMAGE",32) US Unknown 1-n (0029,"DIGISCAN IMAGE",33) LT Unknown 1 (0029,"DIGISCAN IMAGE",34) LT Unknown 1 (7001-o-70ff,"DLX_ANNOT_01",04) ST TextAnnotation 1 (7001-o-70ff,"DLX_ANNOT_01",05) IS Box 2 (7001-o-70ff,"DLX_ANNOT_01",07) IS ArrowEnd 2 (0015,"DLX_EXAMS_01",01) DS StenosisCalibrationRatio 1 (0015,"DLX_EXAMS_01",02) DS StenosisMagnification 1 (0015,"DLX_EXAMS_01",03) DS CardiacCalibrationRatio 1 (6001-o-60ff,"DLX_LKUP_01",01) US GrayPaletteColorLookupTableDescriptor 3 (6001-o-60ff,"DLX_LKUP_01",02) US GrayPaletteColorLookupTableData 1 (0011,"DLX_PATNT_01",01) LT PatientDOB 1 (0019,"DLX_SERIE_01",01) DS AngleValueLArm 1 (0019,"DLX_SERIE_01",02) DS AngleValuePArm 1 (0019,"DLX_SERIE_01",03) DS AngleValueCArm 1 (0019,"DLX_SERIE_01",04) CS AngleLabelLArm 1 (0019,"DLX_SERIE_01",05) CS AngleLabelPArm 1 (0019,"DLX_SERIE_01",06) CS AngleLabelCArm 1 (0019,"DLX_SERIE_01",07) ST ProcedureName 1 (0019,"DLX_SERIE_01",08) ST ExamName 1 (0019,"DLX_SERIE_01",09) SH PatientSize 1 (0019,"DLX_SERIE_01",0a) IS RecordView 1 (0019,"DLX_SERIE_01",10) DS InjectorDelay 1 (0019,"DLX_SERIE_01",11) CS AutoInject 1 (0019,"DLX_SERIE_01",14) IS AcquisitionMode 1 (0019,"DLX_SERIE_01",15) CS CameraRotationEnabled 1 (0019,"DLX_SERIE_01",16) CS ReverseSweep 1 (0019,"DLX_SERIE_01",17) IS SpatialFilterStrength 1 (0019,"DLX_SERIE_01",18) IS ZoomFactor 1 (0019,"DLX_SERIE_01",19) IS XZoomCenter 1 (0019,"DLX_SERIE_01",1a) IS YZoomCenter 1 (0019,"DLX_SERIE_01",1b) DS Focus 1 (0019,"DLX_SERIE_01",1c) CS Dose 1 (0019,"DLX_SERIE_01",1d) IS SideMark 1 (0019,"DLX_SERIE_01",1e) IS PercentageLandscape 1 (0019,"DLX_SERIE_01",1f) DS ExposureDuration 1 (00E1,"ELSCINT1",01) US DataDictionaryVersion 1 (00E1,"ELSCINT1",14) LT Unknown 1 (00E1,"ELSCINT1",22) DS Unknown 2 (00E1,"ELSCINT1",23) DS Unknown 2 (00E1,"ELSCINT1",24) LT Unknown 1 (00E1,"ELSCINT1",25) LT Unknown 1 (00E1,"ELSCINT1",40) SH OffsetFromCTMRImages 1 (0601,"ELSCINT1",00) SH ImplementationVersion 1 (0601,"ELSCINT1",20) DS RelativeTablePosition 1 (0601,"ELSCINT1",21) DS RelativeTableHeight 1 (0601,"ELSCINT1",30) SH SurviewDirection 1 (0601,"ELSCINT1",31) DS SurviewLength 1 (0601,"ELSCINT1",50) SH ImageViewType 1 (0601,"ELSCINT1",70) DS BatchNumber 1 (0601,"ELSCINT1",71) DS BatchSize 1 (0601,"ELSCINT1",72) DS BatchSliceNumber 1 (0009,"FDMS 1.0",04) SH ImageControlUnit 1 (0009,"FDMS 1.0",05) OW ImageUID 1 (0009,"FDMS 1.0",06) OW RouteImage UID 1 (0009,"FDMS 1.0",08) UL ImageDisplayInformationVersionNo 1 (0009,"FDMS 1.0",09) UL PatientInformationVersionNo 1 (0009,"FDMS 1.0",0C) OW FilmUID 1 (0009,"FDMS 1.0",10) CS ExposureUnitTypeCode 1 (0009,"FDMS 1.0",80) LO KanjiHospitalName 1 (0009,"FDMS 1.0",90) ST DistributionCode 1 (0009,"FDMS 1.0",92) SH KanjiDepartmentName 1 (0009,"FDMS 1.0",F0) CS BlackeningProcessFlag 1 (0019,"FDMS 1.0",15) LO KanjiBodyPartForExposure 1 (0019,"FDMS 1.0",32) LO KanjiMenuName 1 (0019,"FDMS 1.0",40) CS ImageProcessingType 1 (0019,"FDMS 1.0",50) CS EDRMode 1 (0019,"FDMS 1.0",60) SH RadiographersCode 1 (0019,"FDMS 1.0",70) IS SplitExposureFormat 1 (0019,"FDMS 1.0",71) IS NoOfSplitExposureFrames 1 (0019,"FDMS 1.0",80) IS ReadingPositionSpecification 1 (0019,"FDMS 1.0",81) IS ReadingSensitivityCenter 1 (0019,"FDMS 1.0",90) SH FilmAnnotationCharacterString1 1 (0019,"FDMS 1.0",91) SH FilmAnnotationCharacterString2 1 (0021,"FDMS 1.0",10) CS FCRImageID 1 (0021,"FDMS 1.0",30) CS SetNo 1 (0021,"FDMS 1.0",40) IS ImageNoInTheSet 1 (0021,"FDMS 1.0",50) CS PairProcessingInformation 1 (0021,"FDMS 1.0",80) OB EquipmentTypeSpecificInformation 1 (0023,"FDMS 1.0",10) SQ Unknown 1 (0023,"FDMS 1.0",20) SQ Unknown 1 (0023,"FDMS 1.0",30) SQ Unknown 1 (0025,"FDMS 1.0",10) US RelativeLightEmissionAmountSk 1 (0025,"FDMS 1.0",11) US TermOfCorrectionForEachIPTypeSt 1 (0025,"FDMS 1.0",12) US ReadingGainGp 1 (0025,"FDMS 1.0",13) US Unknown 1 (0025,"FDMS 1.0",15) CS Unknown 1 (0025,"FDMS 1.0",20) US Unknown 2 (0025,"FDMS 1.0",21) US Unknown 1 (0025,"FDMS 1.0",30) US Unknown 1 (0025,"FDMS 1.0",31) SS Unknown 1 (0025,"FDMS 1.0",32) US Unknown 1 (0025,"FDMS 1.0",33) SS Unknown 1 (0025,"FDMS 1.0",34) SS Unknown 1 (0025,"FDMS 1.0",40) US Unknown 1 (0025,"FDMS 1.0",41) US Unknown 1 (0025,"FDMS 1.0",42) US Unknown 1 (0025,"FDMS 1.0",43) US Unknown 1 (0025,"FDMS 1.0",50) US Unknown 1 (0025,"FDMS 1.0",51) US Unknown 1 (0025,"FDMS 1.0",52) US Unknown 1 (0025,"FDMS 1.0",53) US Unknown 1 (0025,"FDMS 1.0",60) US Unknown 1 (0025,"FDMS 1.0",61) US Unknown 1 (0025,"FDMS 1.0",62) US Unknown 1 (0025,"FDMS 1.0",63) CS Unknown 1 (0025,"FDMS 1.0",70) US Unknown 1 (0025,"FDMS 1.0",71) US Unknown 1 (0025,"FDMS 1.0",72) US Unknown 1 (0025,"FDMS 1.0",73) US Unknown 1-n (0025,"FDMS 1.0",74) US Unknown 1-n (0025,"FDMS 1.0",80) US Unknown 1 (0025,"FDMS 1.0",81) US Unknown 1 (0025,"FDMS 1.0",82) US Unknown 1 (0025,"FDMS 1.0",83) US Unknown 1-n (0025,"FDMS 1.0",84) US Unknown 1-n (0025,"FDMS 1.0",90) US Unknown 1 (0025,"FDMS 1.0",91) US Unknown 1 (0025,"FDMS 1.0",92) US Unknown 1 (0025,"FDMS 1.0",93) US Unknown 1 (0025,"FDMS 1.0",94) US Unknown 1 (0025,"FDMS 1.0",95) US Unknown 1 (0025,"FDMS 1.0",96) CS Unknown 1 (0025,"FDMS 1.0",a0) US Unknown 1 (0025,"FDMS 1.0",a1) SS Unknown 1 (0025,"FDMS 1.0",a2) US Unknown 1 (0025,"FDMS 1.0",a3) SS Unknown 1 (0027,"FDMS 1.0",10) SQ Unknown 1 (0027,"FDMS 1.0",20) SQ Unknown 1 (0027,"FDMS 1.0",30) SQ Unknown 1 (0027,"FDMS 1.0",40) SQ Unknown 1 (0027,"FDMS 1.0",50) SQ Unknown 1 (0027,"FDMS 1.0",60) SQ Unknown 1 (0027,"FDMS 1.0",70) SQ Unknown 1 (0027,"FDMS 1.0",80) SQ Unknown 1 (0027,"FDMS 1.0",a0) IS Unknown 1 (0027,"FDMS 1.0",a1) CS Unknown 2 (0027,"FDMS 1.0",a2) CS Unknown 2 (0027,"FDMS 1.0",a3) SS Unknown 1-n (0029,"FDMS 1.0",20) CS ImageScanningDirection 1 (0029,"FDMS 1.0",30) CS ExtendedReadingSizeValue 1 (0029,"FDMS 1.0",34) US MagnificationReductionRatio 1 (0029,"FDMS 1.0",44) CS LineDensityCode 1 (0029,"FDMS 1.0",50) CS DataCompressionCode 1 (2011,"FDMS 1.0",11) CS ImagePosition SpecifyingFlag 1 (50F1,"FDMS 1.0",06) CS EnergySubtractionParam 1 (50F1,"FDMS 1.0",07) CS SubtractionRegistrationResult 1 (50F1,"FDMS 1.0",08) CS EnergySubtractionParam2 1 (50F1,"FDMS 1.0",09) SL AfinConversionCoefficient 1 (50F1,"FDMS 1.0",10) CS FilmOutputFormat 1 (50F1,"FDMS 1.0",20) CS ImageProcessingModificationFlag 1 (0009,"FFP DATA",01) UN CRHeaderInformation 1 (0019,"GE ??? From Adantage Review CS",30) LO CREDRMode 1 (0019,"GE ??? From Adantage Review CS",40) LO CRLatitude 1 (0019,"GE ??? From Adantage Review CS",50) LO CRGroupNumber 1 (0019,"GE ??? From Adantage Review CS",70) LO CRImageSerialNumber 1 (0019,"GE ??? From Adantage Review CS",80) LO CRBarCodeNumber 1 (0019,"GE ??? From Adantage Review CS",90) LO CRFilmOutputExposures 1 (0009,"GEMS_ACQU_01",24) DS Unknown 1 (0009,"GEMS_ACQU_01",25) US Unknown 1 (0009,"GEMS_ACQU_01",3e) US Unknown 1 (0009,"GEMS_ACQU_01",3f) US Unknown 1 (0009,"GEMS_ACQU_01",42) US Unknown 1 (0009,"GEMS_ACQU_01",43) US Unknown 1 (0009,"GEMS_ACQU_01",f8) US Unknown 1 (0009,"GEMS_ACQU_01",fb) IS Unknown 1 (0019,"GEMS_ACQU_01",01) LT Unknown 1 (0019,"GEMS_ACQU_01",02) SL NumberOfCellsInDetector 1 (0019,"GEMS_ACQU_01",03) DS CellNumberAtTheta 1 (0019,"GEMS_ACQU_01",04) DS CellSpacing 1 (0019,"GEMS_ACQU_01",05) LT Unknown 1 (0019,"GEMS_ACQU_01",06) UN Unknown 1 (0019,"GEMS_ACQU_01",0e) US Unknown 1 (0019,"GEMS_ACQU_01",0f) DS HorizontalFrameOfReference 1 (0019,"GEMS_ACQU_01",11) SS SeriesContrast 1 (0019,"GEMS_ACQU_01",12) SS LastPseq 1 (0019,"GEMS_ACQU_01",13) SS StartNumberForBaseline 1 (0019,"GEMS_ACQU_01",14) SS End NumberForBaseline 1 (0019,"GEMS_ACQU_01",15) SS StartNumberForEnhancedScans 1 (0019,"GEMS_ACQU_01",16) SS EndNumberForEnhancedScans 1 (0019,"GEMS_ACQU_01",17) SS SeriesPlane 1 (0019,"GEMS_ACQU_01",18) LO FirstScanRAS 1 (0019,"GEMS_ACQU_01",19) DS FirstScanLocation 1 (0019,"GEMS_ACQU_01",1a) LO LastScanRAS 1 (0019,"GEMS_ACQU_01",1b) DS LastScanLocation 1 (0019,"GEMS_ACQU_01",1e) DS DisplayFieldOfView 1 (0019,"GEMS_ACQU_01",20) DS Unknown 1 (0019,"GEMS_ACQU_01",22) DS Unknown 1 (0019,"GEMS_ACQU_01",23) DS TableSpeed 1 (0019,"GEMS_ACQU_01",24) DS MidScanTime 1 (0019,"GEMS_ACQU_01",25) SS MidScanFlag 1 (0019,"GEMS_ACQU_01",26) SL DegreesOfAzimuth 1 (0019,"GEMS_ACQU_01",27) DS GantryPeriod 1 (0019,"GEMS_ACQU_01",2a) DS XrayOnPosition 1 (0019,"GEMS_ACQU_01",2b) DS XrayOffPosition 1 (0019,"GEMS_ACQU_01",2c) SL NumberOfTriggers 1 (0019,"GEMS_ACQU_01",2d) US Unknown 1 (0019,"GEMS_ACQU_01",2e) DS AngleOfFirstView 1 (0019,"GEMS_ACQU_01",2f) DS TriggerFrequency 1 (0019,"GEMS_ACQU_01",39) SS ScanFOVType 1 (0019,"GEMS_ACQU_01",3a) IS Unknown 1 (0019,"GEMS_ACQU_01",3b) LT Unknown 1 (0019,"GEMS_ACQU_01",3c) UN Unknown 1 (0019,"GEMS_ACQU_01",3e) UN Unknown 1 (0019,"GEMS_ACQU_01",3f) UN Unknown 1 (0019,"GEMS_ACQU_01",40) SS StatReconFlag 1 (0019,"GEMS_ACQU_01",41) SS ComputeType 1 (0019,"GEMS_ACQU_01",42) SS SegmentNumber 1 (0019,"GEMS_ACQU_01",43) SS TotalSegmentsRequested 1 (0019,"GEMS_ACQU_01",44) DS InterscanDelay 1 (0019,"GEMS_ACQU_01",47) SS ViewCompressionFactor 1 (0019,"GEMS_ACQU_01",48) US Unknown 1 (0019,"GEMS_ACQU_01",49) US Unknown 1 (0019,"GEMS_ACQU_01",4a) SS TotalNumberOfRefChannels 1 (0019,"GEMS_ACQU_01",4b) SL DataSizeForScanData 1 (0019,"GEMS_ACQU_01",52) SS ReconPostProcessingFlag 1 (0019,"GEMS_ACQU_01",54) UN Unknown 1 (0019,"GEMS_ACQU_01",57) SS CTWaterNumber 1 (0019,"GEMS_ACQU_01",58) SS CTBoneNumber 1 (0019,"GEMS_ACQU_01",5a) FL AcquisitionDuration 1 (0019,"GEMS_ACQU_01",5d) US Unknown 1 (0019,"GEMS_ACQU_01",5e) SL NumberOfChannels1To512 1 (0019,"GEMS_ACQU_01",5f) SL IncrementBetweenChannels 1 (0019,"GEMS_ACQU_01",60) SL StartingView 1 (0019,"GEMS_ACQU_01",61) SL NumberOfViews 1 (0019,"GEMS_ACQU_01",62) SL IncrementBetweenViews 1 (0019,"GEMS_ACQU_01",6a) SS DependantOnNumberOfViewsProcessed 1 (0019,"GEMS_ACQU_01",6b) SS FieldOfViewInDetectorCells 1 (0019,"GEMS_ACQU_01",70) SS ValueOfBackProjectionButton 1 (0019,"GEMS_ACQU_01",71) SS SetIfFatqEstimatesWereUsed 1 (0019,"GEMS_ACQU_01",72) DS ZChannelAvgOverViews 1 (0019,"GEMS_ACQU_01",73) DS AvgOfLeftRefChannelsOverViews 1 (0019,"GEMS_ACQU_01",74) DS MaxLeftChannelOverViews 1 (0019,"GEMS_ACQU_01",75) DS AvgOfRightRefChannelsOverViews 1 (0019,"GEMS_ACQU_01",76) DS MaxRightChannelOverViews 1 (0019,"GEMS_ACQU_01",7d) DS SecondEcho 1 (0019,"GEMS_ACQU_01",7e) SS NumberOfEchos 1 (0019,"GEMS_ACQU_01",7f) DS TableDelta 1 (0019,"GEMS_ACQU_01",81) SS Contiguous 1 (0019,"GEMS_ACQU_01",82) US Unknown 1 (0019,"GEMS_ACQU_01",83) DS Unknown 1 (0019,"GEMS_ACQU_01",84) DS PeakSAR 1 (0019,"GEMS_ACQU_01",85) SS MonitorSAR 1 (0019,"GEMS_ACQU_01",86) US Unknown 1 (0019,"GEMS_ACQU_01",87) DS CardiacRepetition Time 1 (0019,"GEMS_ACQU_01",88) SS ImagesPerCardiacCycle 1 (0019,"GEMS_ACQU_01",8a) SS ActualReceiveGainAnalog 1 (0019,"GEMS_ACQU_01",8b) SS ActualReceiveGainDigital 1 (0019,"GEMS_ACQU_01",8d) DS DelayAfterTrigger 1 (0019,"GEMS_ACQU_01",8f) SS SwapPhaseFrequency 1 (0019,"GEMS_ACQU_01",90) SS PauseInterval 1 (0019,"GEMS_ACQU_01",91) DS PulseTime 1 (0019,"GEMS_ACQU_01",92) SL SliceOffsetOnFrequencyAxis 1 (0019,"GEMS_ACQU_01",93) DS CenterFrequency 1 (0019,"GEMS_ACQU_01",94) SS TransmitGain 1 (0019,"GEMS_ACQU_01",95) SS AnalogReceiverGain 1 (0019,"GEMS_ACQU_01",96) SS DigitalReceiverGain 1 (0019,"GEMS_ACQU_01",97) SL BitmapDefiningCVs 1 (0019,"GEMS_ACQU_01",98) SS CenterFrequencyMethod 1 (0019,"GEMS_ACQU_01",99) US Unknown 1 (0019,"GEMS_ACQU_01",9b) SS PulseSequenceMode 1 (0019,"GEMS_ACQU_01",9c) LO PulseSequenceName 1 (0019,"GEMS_ACQU_01",9d) DT PulseSequenceDate 1 (0019,"GEMS_ACQU_01",9e) LO InternalPulseSequenceName 1 (0019,"GEMS_ACQU_01",9f) SS TransmittingCoil 1 (0019,"GEMS_ACQU_01",a0) SS SurfaceCoilType 1 (0019,"GEMS_ACQU_01",a1) SS ExtremityCoilFlag 1 (0019,"GEMS_ACQU_01",a2) SL RawDataRunNumber 1 (0019,"GEMS_ACQU_01",a3) UL CalibratedFieldStrength 1 (0019,"GEMS_ACQU_01",a4) SS SATFatWaterBone 1 (0019,"GEMS_ACQU_01",a5) DS ReceiveBandwidth 1 (0019,"GEMS_ACQU_01",a7) DS UserData 1 (0019,"GEMS_ACQU_01",a8) DS UserData 1 (0019,"GEMS_ACQU_01",a9) DS UserData 1 (0019,"GEMS_ACQU_01",aa) DS UserData 1 (0019,"GEMS_ACQU_01",ab) DS UserData 1 (0019,"GEMS_ACQU_01",ac) DS UserData 1 (0019,"GEMS_ACQU_01",ad) DS UserData 1 (0019,"GEMS_ACQU_01",ae) DS UserData 1 (0019,"GEMS_ACQU_01",af) DS UserData 1 (0019,"GEMS_ACQU_01",b0) DS UserData 1 (0019,"GEMS_ACQU_01",b1) DS UserData 1 (0019,"GEMS_ACQU_01",b2) DS UserData 1 (0019,"GEMS_ACQU_01",b3) DS UserData 1 (0019,"GEMS_ACQU_01",b4) DS UserData 1 (0019,"GEMS_ACQU_01",b5) DS UserData 1 (0019,"GEMS_ACQU_01",b6) DS UserData 1 (0019,"GEMS_ACQU_01",b7) DS UserData 1 (0019,"GEMS_ACQU_01",b8) DS UserData 1 (0019,"GEMS_ACQU_01",b9) DS UserData 1 (0019,"GEMS_ACQU_01",ba) DS UserData 1 (0019,"GEMS_ACQU_01",bb) DS UserData 1 (0019,"GEMS_ACQU_01",bc) DS UserData 1 (0019,"GEMS_ACQU_01",bd) DS UserData 1 (0019,"GEMS_ACQU_01",be) DS ProjectionAngle 1 (0019,"GEMS_ACQU_01",c0) SS SaturationPlanes 1 (0019,"GEMS_ACQU_01",c1) SS SurfaceCoilIntensityCorrectionFlag 1 (0019,"GEMS_ACQU_01",c2) SS SATLocationR 1 (0019,"GEMS_ACQU_01",c3) SS SATLocationL 1 (0019,"GEMS_ACQU_01",c4) SS SATLocationA 1 (0019,"GEMS_ACQU_01",c5) SS SATLocationP 1 (0019,"GEMS_ACQU_01",c6) SS SATLocationH 1 (0019,"GEMS_ACQU_01",c7) SS SATLocationF 1 (0019,"GEMS_ACQU_01",c8) SS SATThicknessRL 1 (0019,"GEMS_ACQU_01",c9) SS SATThicknessAP 1 (0019,"GEMS_ACQU_01",ca) SS SATThicknessHF 1 (0019,"GEMS_ACQU_01",cb) SS PrescribedFlowAxis 1 (0019,"GEMS_ACQU_01",cc) SS VelocityEncoding 1 (0019,"GEMS_ACQU_01",cd) SS ThicknessDisclaimer 1 (0019,"GEMS_ACQU_01",ce) SS PrescanType 1 (0019,"GEMS_ACQU_01",cf) SS PrescanStatus 1 (0019,"GEMS_ACQU_01",d0) SH RawDataType 1 (0019,"GEMS_ACQU_01",d2) SS ProjectionAlgorithm 1 (0019,"GEMS_ACQU_01",d3) SH ProjectionAlgorithm 1 (0019,"GEMS_ACQU_01",d4) US Unknown 1 (0019,"GEMS_ACQU_01",d5) SS FractionalEcho 1 (0019,"GEMS_ACQU_01",d6) SS PrepPulse 1 (0019,"GEMS_ACQU_01",d7) SS CardiacPhases 1 (0019,"GEMS_ACQU_01",d8) SS VariableEchoFlag 1 (0019,"GEMS_ACQU_01",d9) DS ConcatenatedSAT 1 (0019,"GEMS_ACQU_01",da) SS ReferenceChannelUsed 1 (0019,"GEMS_ACQU_01",db) DS BackProjectorCoefficient 1 (0019,"GEMS_ACQU_01",dc) SS PrimarySpeedCorrectionUsed 1 (0019,"GEMS_ACQU_01",dd) SS OverrangeCorrectionUsed 1 (0019,"GEMS_ACQU_01",de) DS DynamicZAlphaValue 1 (0019,"GEMS_ACQU_01",df) DS UserData 1 (0019,"GEMS_ACQU_01",e0) DS UserData 1 (0019,"GEMS_ACQU_01",e1) DS Unknown 1 (0019,"GEMS_ACQU_01",e2) DS VelocityEncodeScale 1 (0019,"GEMS_ACQU_01",e3) LT Unknown 1 (0019,"GEMS_ACQU_01",e4) LT Unknown 1 (0019,"GEMS_ACQU_01",e5) IS Unknown 1 (0019,"GEMS_ACQU_01",e6) US Unknown 1 (0019,"GEMS_ACQU_01",e8) DS Unknown 1 (0019,"GEMS_ACQU_01",e9) DS Unknown 1 (0019,"GEMS_ACQU_01",eb) DS Unknown 1 (0019,"GEMS_ACQU_01",ec) US Unknown 1 (0019,"GEMS_ACQU_01",f0) UN Unknown 1 (0019,"GEMS_ACQU_01",f1) LT Unknown 1 (0019,"GEMS_ACQU_01",f2) SS FastPhases 1 (0019,"GEMS_ACQU_01",f3) LT Unknown 1 (0019,"GEMS_ACQU_01",f4) LT Unknown 1 (0019,"GEMS_ACQU_01",f9) DS TransmissionGain 1 (0023,"GEMS_ACRQA_1.0 BLOCK1",00) LO CRExposureMenuCode 1 (0023,"GEMS_ACRQA_1.0 BLOCK1",10) LO CRExposureMenuString 1 (0023,"GEMS_ACRQA_1.0 BLOCK1",20) LO CREDRMode 1 (0023,"GEMS_ACRQA_1.0 BLOCK1",30) LO CRLatitude 1 (0023,"GEMS_ACRQA_1.0 BLOCK1",40) LO CRGroupNumber 1 (0023,"GEMS_ACRQA_1.0 BLOCK1",50) US CRImageSerialNumber 1 (0023,"GEMS_ACRQA_1.0 BLOCK1",60) LO CRBarCodeNumber 1 (0023,"GEMS_ACRQA_1.0 BLOCK1",70) LO CRFilmOutputExposure 1 (0023,"GEMS_ACRQA_1.0 BLOCK1",80) LO CRFilmFormat 1 (0023,"GEMS_ACRQA_1.0 BLOCK1",90) LO CRSShiftString 1 (0023,"GEMS_ACRQA_1.0 BLOCK2",00) US CRSShift 1 (0023,"GEMS_ACRQA_1.0 BLOCK2",10) DS CRCShift 1 (0023,"GEMS_ACRQA_1.0 BLOCK2",20) DS CRGT 1 (0023,"GEMS_ACRQA_1.0 BLOCK2",30) DS CRGA 1 (0023,"GEMS_ACRQA_1.0 BLOCK2",40) DS CRGC 1 (0023,"GEMS_ACRQA_1.0 BLOCK2",50) DS CRGS 1 (0023,"GEMS_ACRQA_1.0 BLOCK2",60) DS CRRT 1 (0023,"GEMS_ACRQA_1.0 BLOCK2",70) DS CRRE 1 (0023,"GEMS_ACRQA_1.0 BLOCK2",80) US CRRN 1 (0023,"GEMS_ACRQA_1.0 BLOCK2",90) DS CRDRT 1 (0023,"GEMS_ACRQA_1.0 BLOCK3",00) DS CRDRE 1 (0023,"GEMS_ACRQA_1.0 BLOCK3",10) US CRDRN 1 (0023,"GEMS_ACRQA_1.0 BLOCK3",20) DS CRORE 1 (0023,"GEMS_ACRQA_1.0 BLOCK3",30) US CRORN 1 (0023,"GEMS_ACRQA_1.0 BLOCK3",40) US CRORD 1 (0023,"GEMS_ACRQA_1.0 BLOCK3",50) LO CRCassetteSize 1 (0023,"GEMS_ACRQA_1.0 BLOCK3",60) LO CRMachineID 1 (0023,"GEMS_ACRQA_1.0 BLOCK3",70) LO CRMachineType 1 (0023,"GEMS_ACRQA_1.0 BLOCK3",80) LO CRTechnicianCode 1 (0023,"GEMS_ACRQA_1.0 BLOCK3",90) LO CREnergySubtractionParameters 1 (0023,"GEMS_ACRQA_2.0 BLOCK1",00) LO CRExposureMenuCode 1 (0023,"GEMS_ACRQA_2.0 BLOCK1",10) LO CRExposureMenuString 1 (0023,"GEMS_ACRQA_2.0 BLOCK1",20) LO CREDRMode 1 (0023,"GEMS_ACRQA_2.0 BLOCK1",30) LO CRLatitude 1 (0023,"GEMS_ACRQA_2.0 BLOCK1",40) LO CRGroupNumber 1 (0023,"GEMS_ACRQA_2.0 BLOCK1",50) US CRImageSerialNumber 1 (0023,"GEMS_ACRQA_2.0 BLOCK1",60) LO CRBarCodeNumber 1 (0023,"GEMS_ACRQA_2.0 BLOCK1",70) LO CRFilmOutputExposure 1 (0023,"GEMS_ACRQA_2.0 BLOCK1",80) LO CRFilmFormat 1 (0023,"GEMS_ACRQA_2.0 BLOCK1",90) LO CRSShiftString 1 (0023,"GEMS_ACRQA_2.0 BLOCK2",00) US CRSShift 1 (0023,"GEMS_ACRQA_2.0 BLOCK2",10) LO CRCShift 1 (0023,"GEMS_ACRQA_2.0 BLOCK2",20) LO CRGT 1 (0023,"GEMS_ACRQA_2.0 BLOCK2",30) DS CRGA 1 (0023,"GEMS_ACRQA_2.0 BLOCK2",40) DS CRGC 1 (0023,"GEMS_ACRQA_2.0 BLOCK2",50) DS CRGS 1 (0023,"GEMS_ACRQA_2.0 BLOCK2",60) LO CRRT 1 (0023,"GEMS_ACRQA_2.0 BLOCK2",70) DS CRRE 1 (0023,"GEMS_ACRQA_2.0 BLOCK2",80) US CRRN 1 (0023,"GEMS_ACRQA_2.0 BLOCK2",90) DS CRDRT 1 (0023,"GEMS_ACRQA_2.0 BLOCK3",00) DS CRDRE 1 (0023,"GEMS_ACRQA_2.0 BLOCK3",10) US CRDRN 1 (0023,"GEMS_ACRQA_2.0 BLOCK3",20) DS CRORE 1 (0023,"GEMS_ACRQA_2.0 BLOCK3",30) US CRORN 1 (0023,"GEMS_ACRQA_2.0 BLOCK3",40) US CRORD 1 (0023,"GEMS_ACRQA_2.0 BLOCK3",50) LO CRCassetteSize 1 (0023,"GEMS_ACRQA_2.0 BLOCK3",60) LO CRMachineID 1 (0023,"GEMS_ACRQA_2.0 BLOCK3",70) LO CRMachineType 1 (0023,"GEMS_ACRQA_2.0 BLOCK3",80) LO CRTechnicianCode 1 (0023,"GEMS_ACRQA_2.0 BLOCK3",90) LO CREnergySubtractionParameters 1 (0023,"GEMS_ACRQA_2.0 BLOCK3",f0) LO CRDistributionCode 1 (0023,"GEMS_ACRQA_2.0 BLOCK3",ff) US CRShuttersApplied 1 (0047,"GEMS_ADWSoft_3D1",01) SQ Reconstruction Parameters Sequence 1 (0047,"GEMS_ADWSoft_3D1",50) UL VolumeVoxelCount 1 (0047,"GEMS_ADWSoft_3D1",51) UL VolumeSegmentCount 1 (0047,"GEMS_ADWSoft_3D1",53) US VolumeSliceSize 1 (0047,"GEMS_ADWSoft_3D1",54) US VolumeSliceCount 1 (0047,"GEMS_ADWSoft_3D1",55) SL VolumeThresholdValue 1 (0047,"GEMS_ADWSoft_3D1",57) DS VolumeVoxelRatio 1 (0047,"GEMS_ADWSoft_3D1",58) DS VolumeVoxelSize 1 (0047,"GEMS_ADWSoft_3D1",59) US VolumeZPositionSize 1 (0047,"GEMS_ADWSoft_3D1",60) DS VolumeBaseLine 9 (0047,"GEMS_ADWSoft_3D1",61) DS VolumeCenterPoint 3 (0047,"GEMS_ADWSoft_3D1",63) SL VolumeSkewBase 1 (0047,"GEMS_ADWSoft_3D1",64) DS VolumeRegistrationTransformRotationMatrix 9 (0047,"GEMS_ADWSoft_3D1",65) DS VolumeRegistrationTransformTranslationVector 3 (0047,"GEMS_ADWSoft_3D1",70) DS KVPList 1-n (0047,"GEMS_ADWSoft_3D1",71) IS XRayTubeCurrentList 1-n (0047,"GEMS_ADWSoft_3D1",72) IS ExposureList 1-n (0047,"GEMS_ADWSoft_3D1",80) LO AcquisitionDLXIdentifier 1 (0047,"GEMS_ADWSoft_3D1",85) SQ AcquisitionDLX2DSeriesSequence 1 (0047,"GEMS_ADWSoft_3D1",89) DS ContrastAgentVolumeList 1-n (0047,"GEMS_ADWSoft_3D1",8A) US NumberOfInjections 1 (0047,"GEMS_ADWSoft_3D1",8B) US FrameCount 1 (0047,"GEMS_ADWSoft_3D1",91) LO XA3DReconstructionAlgorithmName 1 (0047,"GEMS_ADWSoft_3D1",92) CS XA3DReconstructionAlgorithmVersion 1 (0047,"GEMS_ADWSoft_3D1",93) DA DLXCalibrationDate 1 (0047,"GEMS_ADWSoft_3D1",94) TM DLXCalibrationTime 1 (0047,"GEMS_ADWSoft_3D1",95) CS DLXCalibrationStatus 1 (0047,"GEMS_ADWSoft_3D1",96) IS UsedFrames 1-n (0047,"GEMS_ADWSoft_3D1",98) US TransformCount 1 (0047,"GEMS_ADWSoft_3D1",99) SQ TransformSequence 1 (0047,"GEMS_ADWSoft_3D1",9A) DS TransformRotationMatrix 9 (0047,"GEMS_ADWSoft_3D1",9B) DS TransformTranslationVector 3 (0047,"GEMS_ADWSoft_3D1",9C) LO TransformLabel 1 (0047,"GEMS_ADWSoft_3D1",B0) SQ WireframeList 1 (0047,"GEMS_ADWSoft_3D1",B1) US WireframeCount 1 (0047,"GEMS_ADWSoft_3D1",B2) US LocationSystem 1 (0047,"GEMS_ADWSoft_3D1",B5) LO WireframeName 1 (0047,"GEMS_ADWSoft_3D1",B6) LO WireframeGroupName 1 (0047,"GEMS_ADWSoft_3D1",B7) LO WireframeColor 1 (0047,"GEMS_ADWSoft_3D1",B8) SL WireframeAttributes 1 (0047,"GEMS_ADWSoft_3D1",B9) SL WireframePointCount 1 (0047,"GEMS_ADWSoft_3D1",BA) SL WireframeTimestamp 1 (0047,"GEMS_ADWSoft_3D1",BB) SQ WireframePointList 1 (0047,"GEMS_ADWSoft_3D1",BC) DS WireframePointsCoordinates 3 (0047,"GEMS_ADWSoft_3D1",C0) DS VolumeUpperLeftHighCornerRAS 3 (0047,"GEMS_ADWSoft_3D1",C1) DS VolumeSliceToRASRotationMatrix 9 (0047,"GEMS_ADWSoft_3D1",C2) DS VolumeUpperLeftHighCornerTLOC 1 (0047,"GEMS_ADWSoft_3D1",D1) OB VolumeSegmentList 1 (0047,"GEMS_ADWSoft_3D1",D2) OB VolumeGradientList 1 (0047,"GEMS_ADWSoft_3D1",D3) OB VolumeDensityList 1 (0047,"GEMS_ADWSoft_3D1",D4) OB VolumeZPositionList 1 (0047,"GEMS_ADWSoft_3D1",D5) OB VolumeOriginalIndexList 1 (0039,"GEMS_ADWSoft_DPO",80) IS PrivateEntityNumber 1 (0039,"GEMS_ADWSoft_DPO",85) DA PrivateEntityDate 1 (0039,"GEMS_ADWSoft_DPO",90) TM PrivateEntityTime 1 (0039,"GEMS_ADWSoft_DPO",95) LO PrivateEntityLaunchCommand 1 (0039,"GEMS_ADWSoft_DPO",AA) CS PrivateEntityType 1 (0033,"GEMS_CTHD_01",02) UN Unknown 1 (0037,"GEMS_DRS_1",10) LO ReferringDepartment 1 (0037,"GEMS_DRS_1",20) US ScreenNumber 1 (0037,"GEMS_DRS_1",40) SH LeftOrientation 1 (0037,"GEMS_DRS_1",42) SH RightOrientation 1 (0037,"GEMS_DRS_1",50) CS Inversion 1 (0037,"GEMS_DRS_1",60) US DSA 1 (0009,"GEMS_GENIE_1",10) LO Unknown 1 (0009,"GEMS_GENIE_1",11) SL StudyFlags 1 (0009,"GEMS_GENIE_1",12) SL StudyType 1 (0009,"GEMS_GENIE_1",1e) UI Unknown 1 (0009,"GEMS_GENIE_1",20) LO Unknown 1 (0009,"GEMS_GENIE_1",21) SL SeriesFlags 1 (0009,"GEMS_GENIE_1",22) SH UserOrientation 1 (0009,"GEMS_GENIE_1",23) SL InitiationType 1 (0009,"GEMS_GENIE_1",24) SL InitiationDelay 1 (0009,"GEMS_GENIE_1",25) SL InitiationCountRate 1 (0009,"GEMS_GENIE_1",26) SL NumberEnergySets 1 (0009,"GEMS_GENIE_1",27) SL NumberDetectors 1 (0009,"GEMS_GENIE_1",29) SL Unknown 1 (0009,"GEMS_GENIE_1",2a) SL Unknown 1 (0009,"GEMS_GENIE_1",2c) LO SeriesComments 1 (0009,"GEMS_GENIE_1",2d) SL TrackBeatAverage 1 (0009,"GEMS_GENIE_1",2e) FD DistancePrescribed 1 (0009,"GEMS_GENIE_1",30) LO Unknown 1 (0009,"GEMS_GENIE_1",35) SL GantryLocusType 1 (0009,"GEMS_GENIE_1",37) SL StartingHeartRate 1 (0009,"GEMS_GENIE_1",38) SL RRWindowWidth 1 (0009,"GEMS_GENIE_1",39) SL RRWindowOffset 1 (0009,"GEMS_GENIE_1",3a) SL PercentCycleImaged 1 (0009,"GEMS_GENIE_1",40) LO Unknown 1 (0009,"GEMS_GENIE_1",41) SL PatientFlags 1 (0009,"GEMS_GENIE_1",42) DA PatientCreationDate 1 (0009,"GEMS_GENIE_1",43) TM PatientCreationTime 1 (0011,"GEMS_GENIE_1",0a) SL SeriesType 1 (0011,"GEMS_GENIE_1",0b) SL EffectiveSeriesDuration 1 (0011,"GEMS_GENIE_1",0c) SL NumBeats 1 (0011,"GEMS_GENIE_1",0d) LO RadioNuclideName 1 (0011,"GEMS_GENIE_1",10) LO Unknown 1 (0011,"GEMS_GENIE_1",12) LO DatasetName 1 (0011,"GEMS_GENIE_1",13) SL DatasetType 1 (0011,"GEMS_GENIE_1",15) SL DetectorNumber 1 (0011,"GEMS_GENIE_1",16) SL EnergyNumber 1 (0011,"GEMS_GENIE_1",17) SL RRIntervalWindowNumber 1 (0011,"GEMS_GENIE_1",18) SL MGBinNumber 1 (0011,"GEMS_GENIE_1",19) FD RadiusOfRotation 1 (0011,"GEMS_GENIE_1",1a) SL DetectorCountZone 1 (0011,"GEMS_GENIE_1",1b) SL NumEnergyWindows 1 (0011,"GEMS_GENIE_1",1c) SL EnergyOffset 4 (0011,"GEMS_GENIE_1",1d) SL EnergyRange 1 (0011,"GEMS_GENIE_1",1f) SL ImageOrientation 1 (0011,"GEMS_GENIE_1",23) SL UseFOVMask 1 (0011,"GEMS_GENIE_1",24) SL FOVMaskYCutoffAngle 1 (0011,"GEMS_GENIE_1",25) SL FOVMaskCutoffAngle 1 (0011,"GEMS_GENIE_1",26) SL TableOrientation 1 (0011,"GEMS_GENIE_1",27) SL ROITopLeft 2 (0011,"GEMS_GENIE_1",28) SL ROIBottomRight 2 (0011,"GEMS_GENIE_1",30) LO Unknown 1 (0011,"GEMS_GENIE_1",33) LO EnergyCorrectName 1 (0011,"GEMS_GENIE_1",34) LO SpatialCorrectName 1 (0011,"GEMS_GENIE_1",35) LO TuningCalibName 1 (0011,"GEMS_GENIE_1",36) LO UniformityCorrectName 1 (0011,"GEMS_GENIE_1",37) LO AcquisitionSpecificCorrectName 1 (0011,"GEMS_GENIE_1",38) SL ByteOrder 1 (0011,"GEMS_GENIE_1",3a) SL PictureFormat 1 (0011,"GEMS_GENIE_1",3b) FD PixelScale 1 (0011,"GEMS_GENIE_1",3c) FD PixelOffset 1 (0011,"GEMS_GENIE_1",3e) SL FOVShape 1 (0011,"GEMS_GENIE_1",3f) SL DatasetFlags 1 (0011,"GEMS_GENIE_1",44) FD ThresholdCenter 1 (0011,"GEMS_GENIE_1",45) FD ThresholdWidth 1 (0011,"GEMS_GENIE_1",46) SL InterpolationType 1 (0011,"GEMS_GENIE_1",55) FD Period 1 (0011,"GEMS_GENIE_1",56) FD ElapsedTime 1 (0013,"GEMS_GENIE_1",10) FD DigitalFOV 2 (0013,"GEMS_GENIE_1",11) SL Unknown 1 (0013,"GEMS_GENIE_1",12) SL Unknown 1 (0013,"GEMS_GENIE_1",16) SL AutoTrackPeak 1 (0013,"GEMS_GENIE_1",17) SL AutoTrackWidth 1 (0013,"GEMS_GENIE_1",18) FD TransmissionScanTime 1 (0013,"GEMS_GENIE_1",19) FD TransmissionMaskWidth 1 (0013,"GEMS_GENIE_1",1a) FD CopperAttenuatorThickness 1 (0013,"GEMS_GENIE_1",1c) FD Unknown 1 (0013,"GEMS_GENIE_1",1d) FD Unknown 1 (0013,"GEMS_GENIE_1",1e) FD TomoViewOffset 1-n (0013,"GEMS_GENIE_1",26) LT StudyComments 1 (0033,"GEMS_GNHD_01",01) UN Unknown 1 (0033,"GEMS_GNHD_01",02) UN Unknown 1 (0009,"GEMS_IDEN_01",01) LO FullFidelity 1 (0009,"GEMS_IDEN_01",02) SH SuiteId 1 (0009,"GEMS_IDEN_01",04) SH ProductId 1 (0009,"GEMS_IDEN_01",17) LT Unknown 1 (0009,"GEMS_IDEN_01",1a) US Unknown 1 (0009,"GEMS_IDEN_01",20) US Unknown 1 (0009,"GEMS_IDEN_01",27) SL ImageActualDate 1 (0009,"GEMS_IDEN_01",2f) LT Unknown 1 (0009,"GEMS_IDEN_01",30) SH ServiceId 1 (0009,"GEMS_IDEN_01",31) SH MobileLocationNumber 1 (0009,"GEMS_IDEN_01",e2) LT Unknown 1 (0009,"GEMS_IDEN_01",e3) UI EquipmentUID 1 (0009,"GEMS_IDEN_01",e6) SH GenesisVersionNow 1 (0009,"GEMS_IDEN_01",e7) UL ExamRecordChecksum 1 (0009,"GEMS_IDEN_01",e8) UL Unknown 1 (0009,"GEMS_IDEN_01",e9) SL ActualSeriesDataTimeStamp 1 (0027,"GEMS_IMAG_01",06) SL ImageArchiveFlag 1 (0027,"GEMS_IMAG_01",10) SS ScoutType 1 (0027,"GEMS_IMAG_01",1c) SL VmaMamp 1 (0027,"GEMS_IMAG_01",1d) SS VmaPhase 1 (0027,"GEMS_IMAG_01",1e) SL VmaMod 1 (0027,"GEMS_IMAG_01",1f) SL VmaClip 1 (0027,"GEMS_IMAG_01",20) SS SmartScanOnOffFlag 1 (0027,"GEMS_IMAG_01",30) SH ForeignImageRevision 1 (0027,"GEMS_IMAG_01",31) SS ImagingMode 1 (0027,"GEMS_IMAG_01",32) SS PulseSequence 1 (0027,"GEMS_IMAG_01",33) SL ImagingOptions 1 (0027,"GEMS_IMAG_01",35) SS PlaneType 1 (0027,"GEMS_IMAG_01",36) SL ObliquePlane 1 (0027,"GEMS_IMAG_01",40) SH RASLetterOfImageLocation 1 (0027,"GEMS_IMAG_01",41) FL ImageLocation 1 (0027,"GEMS_IMAG_01",42) FL CenterRCoordOfPlaneImage 1 (0027,"GEMS_IMAG_01",43) FL CenterACoordOfPlaneImage 1 (0027,"GEMS_IMAG_01",44) FL CenterSCoordOfPlaneImage 1 (0027,"GEMS_IMAG_01",45) FL NormalRCoord 1 (0027,"GEMS_IMAG_01",46) FL NormalACoord 1 (0027,"GEMS_IMAG_01",47) FL NormalSCoord 1 (0027,"GEMS_IMAG_01",48) FL RCoordOfTopRightCorner 1 (0027,"GEMS_IMAG_01",49) FL ACoordOfTopRightCorner 1 (0027,"GEMS_IMAG_01",4a) FL SCoordOfTopRightCorner 1 (0027,"GEMS_IMAG_01",4b) FL RCoordOfBottomRightCorner 1 (0027,"GEMS_IMAG_01",4c) FL ACoordOfBottomRightCorner 1 (0027,"GEMS_IMAG_01",4d) FL SCoordOfBottomRightCorner 1 (0027,"GEMS_IMAG_01",50) FL TableStartLocation 1 (0027,"GEMS_IMAG_01",51) FL TableEndLocation 1 (0027,"GEMS_IMAG_01",52) SH RASLetterForSideOfImage 1 (0027,"GEMS_IMAG_01",53) SH RASLetterForAnteriorPosterior 1 (0027,"GEMS_IMAG_01",54) SH RASLetterForScoutStartLoc 1 (0027,"GEMS_IMAG_01",55) SH RASLetterForScoutEndLoc 1 (0027,"GEMS_IMAG_01",60) FL ImageDimensionX 1 (0027,"GEMS_IMAG_01",61) FL ImageDimensionY 1 (0027,"GEMS_IMAG_01",62) FL NumberOfExcitations 1 (0029,"GEMS_IMPS_01",04) SL LowerRangeOfPixels 1 (0029,"GEMS_IMPS_01",05) DS LowerRangeOfPixels 1 (0029,"GEMS_IMPS_01",06) DS LowerRangeOfPixels 1 (0029,"GEMS_IMPS_01",07) SL LowerRangeOfPixels 1 (0029,"GEMS_IMPS_01",08) SH LowerRangeOfPixels 1 (0029,"GEMS_IMPS_01",09) SH LowerRangeOfPixels 1 (0029,"GEMS_IMPS_01",0a) SS LowerRangeOfPixels 1 (0029,"GEMS_IMPS_01",15) SL LowerRangeOfPixels 1 (0029,"GEMS_IMPS_01",16) SL LowerRangeOfPixels 1 (0029,"GEMS_IMPS_01",17) SL LowerRangeOfPixels 1 (0029,"GEMS_IMPS_01",18) SL UpperRangeOfPixels 1 (0029,"GEMS_IMPS_01",1a) SL LengthOfTotalHeaderInBytes 1 (0029,"GEMS_IMPS_01",26) SS VersionOfHeaderStructure 1 (0029,"GEMS_IMPS_01",34) SL AdvantageCompOverflow 1 (0029,"GEMS_IMPS_01",35) SL AdvantageCompUnderflow 1 (0043,"GEMS_PARM_01",01) SS BitmapOfPrescanOptions 1 (0043,"GEMS_PARM_01",02) SS GradientOffsetInX 1 (0043,"GEMS_PARM_01",03) SS GradientOffsetInY 1 (0043,"GEMS_PARM_01",04) SS GradientOffsetInZ 1 (0043,"GEMS_PARM_01",05) SS ImageIsOriginalOrUnoriginal 1 (0043,"GEMS_PARM_01",06) SS NumberOfEPIShots 1 (0043,"GEMS_PARM_01",07) SS ViewsPerSegment 1 (0043,"GEMS_PARM_01",08) SS RespiratoryRateInBPM 1 (0043,"GEMS_PARM_01",09) SS RespiratoryTriggerPoint 1 (0043,"GEMS_PARM_01",0a) SS TypeOfReceiverUsed 1 (0043,"GEMS_PARM_01",0b) DS PeakRateOfChangeOfGradientField 1 (0043,"GEMS_PARM_01",0c) DS LimitsInUnitsOfPercent 1 (0043,"GEMS_PARM_01",0d) DS PSDEstimatedLimit 1 (0043,"GEMS_PARM_01",0e) DS PSDEstimatedLimitInTeslaPerSecond 1 (0043,"GEMS_PARM_01",0f) DS SARAvgHead 1 (0043,"GEMS_PARM_01",10) US WindowValue 1 (0043,"GEMS_PARM_01",11) US TotalInputViews 1 (0043,"GEMS_PARM_01",12) SS XrayChain 3 (0043,"GEMS_PARM_01",13) SS ReconKernelParameters 5 (0043,"GEMS_PARM_01",14) SS CalibrationParameters 3 (0043,"GEMS_PARM_01",15) SS TotalOutputViews 3 (0043,"GEMS_PARM_01",16) SS NumberOfOverranges 5 (0043,"GEMS_PARM_01",17) DS IBHImageScaleFactors 1 (0043,"GEMS_PARM_01",18) DS BBH Coefficients 3 (0043,"GEMS_PARM_01",19) SS NumberOfBBHChainsToBlend 1 (0043,"GEMS_PARM_01",1a) SL StartingChannelNumber 1 (0043,"GEMS_PARM_01",1b) SS PPScanParameters 1 (0043,"GEMS_PARM_01",1c) SS GEImageIntegrity 1 (0043,"GEMS_PARM_01",1d) SS LevelValue 1 (0043,"GEMS_PARM_01",1e) DS DeltaStartTime 1 (0043,"GEMS_PARM_01",1f) SL MaxOverrangesInAView 1 (0043,"GEMS_PARM_01",20) DS AvgOverrangesAllViews 1 (0043,"GEMS_PARM_01",21) SS CorrectedAfterglowTerms 1 (0043,"GEMS_PARM_01",25) SS ReferenceChannels 6 (0043,"GEMS_PARM_01",26) US NoViewsRefChannelsBlocked 6 (0043,"GEMS_PARM_01",27) SH ScanPitchRatio 1 (0043,"GEMS_PARM_01",28) OB UniqueImageIdentifier 1 (0043,"GEMS_PARM_01",29) OB HistogramTables 1 (0043,"GEMS_PARM_01",2a) OB UserDefinedData 1 (0043,"GEMS_PARM_01",2b) SS PrivateScanOptions 4 (0043,"GEMS_PARM_01",2c) SS EffectiveEchoSpacing 1 (0043,"GEMS_PARM_01",2d) SH StringSlopField1 1 (0043,"GEMS_PARM_01",2e) SH StringSlopField2 1 (0043,"GEMS_PARM_01",2f) SS RawDataType 1 (0043,"GEMS_PARM_01",30) SS RawDataType 1 (0043,"GEMS_PARM_01",31) DS RACoordOfTargetReconCentre 2 (0043,"GEMS_PARM_01",32) SS RawDataType 1 (0043,"GEMS_PARM_01",33) FL NegScanSpacing 1 (0043,"GEMS_PARM_01",34) IS OffsetFrequency 1 (0043,"GEMS_PARM_01",35) UL UserUsageTag 1 (0043,"GEMS_PARM_01",36) UL UserFillMapMSW 1 (0043,"GEMS_PARM_01",37) UL UserFillMapLSW 1 (0043,"GEMS_PARM_01",38) FL User25ToUser48 24 (0043,"GEMS_PARM_01",39) IS SlopInteger6ToSlopInteger9 4 (0043,"GEMS_PARM_01",40) FL TriggerOnPosition 4 (0043,"GEMS_PARM_01",41) FL DegreeOfRotation 4 (0043,"GEMS_PARM_01",42) SL DASTriggerSource 4 (0043,"GEMS_PARM_01",43) SL DASFpaGain 4 (0043,"GEMS_PARM_01",44) SL DASOutputSource 4 (0043,"GEMS_PARM_01",45) SL DASAdInput 4 (0043,"GEMS_PARM_01",46) SL DASCalMode 4 (0043,"GEMS_PARM_01",47) SL DASCalFrequency 4 (0043,"GEMS_PARM_01",48) SL DASRegXm 4 (0043,"GEMS_PARM_01",49) SL DASAutoZero 4 (0043,"GEMS_PARM_01",4a) SS StartingChannelOfView 4 (0043,"GEMS_PARM_01",4b) SL DASXmPattern 4 (0043,"GEMS_PARM_01",4c) SS TGGCTriggerMode 4 (0043,"GEMS_PARM_01",4d) FL StartScanToXrayOnDelay 4 (0043,"GEMS_PARM_01",4e) FL DurationOfXrayOn 4 (0043,"GEMS_PARM_01",60) IS Unknown 8 (0043,"GEMS_PARM_01",61) UI Unknown 1 (0043,"GEMS_PARM_01",62) SH Unknown 1 (0043,"GEMS_PARM_01",6f) DS Unknown 3 (0011,"GEMS_PATI_01",10) SS PatientStatus 1 (0021,"GEMS_RELA_01",03) SS SeriesFromWhichPrescribed 1 (0021,"GEMS_RELA_01",05) SH GenesisVersionNow 1 (0021,"GEMS_RELA_01",07) UL SeriesRecordChecksum 1 (0021,"GEMS_RELA_01",15) US Unknown 1 (0021,"GEMS_RELA_01",16) SS Unknown 1 (0021,"GEMS_RELA_01",18) SH GenesisVersionNow 1 (0021,"GEMS_RELA_01",19) UL AcqReconRecordChecksum 1 (0021,"GEMS_RELA_01",20) DS TableStartLocation 1 (0021,"GEMS_RELA_01",35) SS SeriesFromWhichPrescribed 1 (0021,"GEMS_RELA_01",36) SS ImageFromWhichPrescribed 1 (0021,"GEMS_RELA_01",37) SS ScreenFormat 1 (0021,"GEMS_RELA_01",4a) LO AnatomicalReferenceForScout 1 (0021,"GEMS_RELA_01",4e) US Unknown 1 (0021,"GEMS_RELA_01",4f) SS LocationsInAcquisition 1 (0021,"GEMS_RELA_01",50) SS GraphicallyPrescribed 1 (0021,"GEMS_RELA_01",51) DS RotationFromSourceXRot 1 (0021,"GEMS_RELA_01",52) DS RotationFromSourceYRot 1 (0021,"GEMS_RELA_01",53) DS RotationFromSourceZRot 1 (0021,"GEMS_RELA_01",54) SH ImagePosition 3 (0021,"GEMS_RELA_01",55) SH ImageOrientation 6 (0021,"GEMS_RELA_01",56) SL IntegerSlop 1 (0021,"GEMS_RELA_01",57) SL IntegerSlop 1 (0021,"GEMS_RELA_01",58) SL IntegerSlop 1 (0021,"GEMS_RELA_01",59) SL IntegerSlop 1 (0021,"GEMS_RELA_01",5a) SL IntegerSlop 1 (0021,"GEMS_RELA_01",5b) DS FloatSlop 1 (0021,"GEMS_RELA_01",5c) DS FloatSlop 1 (0021,"GEMS_RELA_01",5d) DS FloatSlop 1 (0021,"GEMS_RELA_01",5e) DS FloatSlop 1 (0021,"GEMS_RELA_01",5f) DS FloatSlop 1 (0021,"GEMS_RELA_01",70) LT Unknown 1 (0021,"GEMS_RELA_01",71) LT Unknown 1 (0021,"GEMS_RELA_01",81) DS AutoWindowLevelAlpha 1 (0021,"GEMS_RELA_01",82) DS AutoWindowLevelBeta 1 (0021,"GEMS_RELA_01",83) DS AutoWindowLevelWindow 1 (0021,"GEMS_RELA_01",84) DS AutoWindowLevelLevel 1 (0021,"GEMS_RELA_01",90) SS TubeFocalSpotPosition 1 (0021,"GEMS_RELA_01",91) SS BiopsyPosition 1 (0021,"GEMS_RELA_01",92) FL BiopsyTLocation 1 (0021,"GEMS_RELA_01",93) FL BiopsyRefLocation 1 (0045,"GEMS_SENO_02",04) CS AES 1 (0045,"GEMS_SENO_02",06) DS Angulation 1 (0045,"GEMS_SENO_02",09) DS RealMagnificationFactor 1 (0045,"GEMS_SENO_02",0b) CS SenographType 1 (0045,"GEMS_SENO_02",0c) DS IntegrationTime 1 (0045,"GEMS_SENO_02",0d) DS ROIOriginXY 1 (0045,"GEMS_SENO_02",11) DS ReceptorSizeCmXY 2 (0045,"GEMS_SENO_02",12) IS ReceptorSizePixelsXY 2 (0045,"GEMS_SENO_02",13) ST Screen 1 (0045,"GEMS_SENO_02",14) DS PixelPitchMicrons 1 (0045,"GEMS_SENO_02",15) IS PixelDepthBits 1 (0045,"GEMS_SENO_02",16) IS BinningFactorXY 2 (0045,"GEMS_SENO_02",1B) CS ClinicalView 1 (0045,"GEMS_SENO_02",1D) DS MeanOfRawGrayLevels 1 (0045,"GEMS_SENO_02",1E) DS MeanOfOffsetGrayLevels 1 (0045,"GEMS_SENO_02",1F) DS MeanOfCorrectedGrayLevels 1 (0045,"GEMS_SENO_02",20) DS MeanOfRegionGrayLevels 1 (0045,"GEMS_SENO_02",21) DS MeanOfLogRegionGrayLevels 1 (0045,"GEMS_SENO_02",22) DS StandardDeviationOfRawGrayLevels 1 (0045,"GEMS_SENO_02",23) DS StandardDeviationOfCorrectedGrayLevels 1 (0045,"GEMS_SENO_02",24) DS StandardDeviationOfRegionGrayLevels 1 (0045,"GEMS_SENO_02",25) DS StandardDeviationOfLogRegionGrayLevels 1 (0045,"GEMS_SENO_02",26) OB MAOBuffer 1 (0045,"GEMS_SENO_02",27) IS SetNumber 1 (0045,"GEMS_SENO_02",28) CS WindowingType 1 (0045,"GEMS_SENO_02",29) DS WindowingParameters 1-n (0045,"GEMS_SENO_02",2a) IS CrosshairCursorXCoordinates 1 (0045,"GEMS_SENO_02",2b) IS CrosshairCursorYCoordinates 1 (0045,"GEMS_SENO_02",39) US VignetteRows 1 (0045,"GEMS_SENO_02",3a) US VignetteColumns 1 (0045,"GEMS_SENO_02",3b) US VignetteBitsAllocated 1 (0045,"GEMS_SENO_02",3c) US VignetteBitsStored 1 (0045,"GEMS_SENO_02",3d) US VignetteHighBit 1 (0045,"GEMS_SENO_02",3e) US VignettePixelRepresentation 1 (0045,"GEMS_SENO_02",3f) OB VignettePixelData 1 (0025,"GEMS_SERS_01",06) SS LastPulseSequenceUsed 1 (0025,"GEMS_SERS_01",07) SL ImagesInSeries 1 (0025,"GEMS_SERS_01",10) SL LandmarkCounter 1 (0025,"GEMS_SERS_01",11) SS NumberOfAcquisitions 1 (0025,"GEMS_SERS_01",14) SL IndicatesNumberOfUpdatesToHeader 1 (0025,"GEMS_SERS_01",17) SL SeriesCompleteFlag 1 (0025,"GEMS_SERS_01",18) SL NumberOfImagesArchived 1 (0025,"GEMS_SERS_01",19) SL LastImageNumberUsed 1 (0025,"GEMS_SERS_01",1a) SH PrimaryReceiverSuiteAndHost 1 (0023,"GEMS_STDY_01",01) SL NumberOfSeriesInStudy 1 (0023,"GEMS_STDY_01",02) SL NumberOfUnarchivedSeries 1 (0023,"GEMS_STDY_01",10) SS ReferenceImageField 1 (0023,"GEMS_STDY_01",50) SS SummaryImage 1 (0023,"GEMS_STDY_01",70) FD StartTimeSecsInFirstAxial 1 (0023,"GEMS_STDY_01",74) SL NumberOfUpdatesToHeader 1 (0023,"GEMS_STDY_01",7d) SS IndicatesIfStudyHasCompleteInfo 1 (0033,"GEMS_YMHD_01",05) UN Unknown 1 (0033,"GEMS_YMHD_01",06) UN Unknown 1 (0019,"GE_GENESIS_REV3.0",39) SS AxialType 1 (0019,"GE_GENESIS_REV3.0",8f) SS SwapPhaseFrequency 1 (0019,"GE_GENESIS_REV3.0",9c) SS PulseSequenceName 1 (0019,"GE_GENESIS_REV3.0",9f) SS CoilType 1 (0019,"GE_GENESIS_REV3.0",a4) SS SATFatWaterBone 1 (0019,"GE_GENESIS_REV3.0",c0) SS BitmapOfSATSelections 1 (0019,"GE_GENESIS_REV3.0",c1) SS SurfaceCoilIntensityCorrectionFlag 1 (0019,"GE_GENESIS_REV3.0",cb) SS PhaseContrastFlowAxis 1 (0019,"GE_GENESIS_REV3.0",cc) SS PhaseContrastVelocityEncoding 1 (0019,"GE_GENESIS_REV3.0",d5) SS FractionalEcho 1 (0019,"GE_GENESIS_REV3.0",d8) SS VariableEchoFlag 1 (0019,"GE_GENESIS_REV3.0",d9) DS ConcatenatedSat 1 (0019,"GE_GENESIS_REV3.0",f2) SS NumberOfPhases 1 (0043,"GE_GENESIS_REV3.0",1e) DS DeltaStartTime 1 (0043,"GE_GENESIS_REV3.0",27) SH ScanPitchRatio 1 (0029,"INTELERAD MEDICAL SYSTEMS",01) FD ImageCompressionFraction 1 (0029,"INTELERAD MEDICAL SYSTEMS",02) FD ImageQuality 1 (0029,"INTELERAD MEDICAL SYSTEMS",03) FD ImageBytesTransferred 1 (0029,"INTELERAD MEDICAL SYSTEMS",10) SH J2cParameterType 1 (0029,"INTELERAD MEDICAL SYSTEMS",11) US J2cPixelRepresentation 1 (0029,"INTELERAD MEDICAL SYSTEMS",12) US J2cBitsAllocated 1 (0029,"INTELERAD MEDICAL SYSTEMS",13) US J2cPixelShiftValue 1 (0029,"INTELERAD MEDICAL SYSTEMS",14) US J2cPlanarConfiguration 1 (0029,"INTELERAD MEDICAL SYSTEMS",15) DS J2cRescaleIntercept 1 (0029,"INTELERAD MEDICAL SYSTEMS",20) LO PixelDataMD5SumPerFrame 1 (0029,"INTELERAD MEDICAL SYSTEMS",21) US HistogramPercentileLabels 1 (0029,"INTELERAD MEDICAL SYSTEMS",22) FD HistogramPercentileValues 1 (3f01,"INTELERAD MEDICAL SYSTEMS",01) LO InstitutionCode 1 (3f01,"INTELERAD MEDICAL SYSTEMS",02) LO RoutedTransferAE 1 (3f01,"INTELERAD MEDICAL SYSTEMS",03) LO SourceAE 1 (3f01,"INTELERAD MEDICAL SYSTEMS",04) SH DeferredValidation 1 (3f01,"INTELERAD MEDICAL SYSTEMS",05) LO SeriesOwner 1 (3f01,"INTELERAD MEDICAL SYSTEMS",06) LO OrderGroupNumber 1 (3f01,"INTELERAD MEDICAL SYSTEMS",07) SH StrippedPixelData 1 (3f01,"INTELERAD MEDICAL SYSTEMS",08) SH PendingMoveRequest 1 (0041,"INTEGRIS 1.0",20) FL AccumulatedFluoroscopyDose 1 (0041,"INTEGRIS 1.0",30) FL AccumulatedExposureDose 1 (0041,"INTEGRIS 1.0",40) FL TotalDose 1 (0041,"INTEGRIS 1.0",41) FL TotalNumberOfFrames 1 (0041,"INTEGRIS 1.0",50) SQ ExposureInformationSequence 1 (0009,"INTEGRIS 1.0",08) CS ExposureChannel 1-n (0009,"INTEGRIS 1.0",32) TM ExposureStartTime 1 (0019,"INTEGRIS 1.0",00) LO APRName 1 (0019,"INTEGRIS 1.0",40) DS FrameRate 1 (0021,"INTEGRIS 1.0",12) IS ExposureNumber 1 (0029,"INTEGRIS 1.0",08) IS NumberOfExposureResults 1 (0029,"ISG shadow",70) IS Unknown 1 (0029,"ISG shadow",80) IS Unknown 1 (0029,"ISG shadow",90) IS Unknown 1 (0009,"ISI",01) UN SIENETGeneralPurposeIMGEF 1 (0009,"MERGE TECHNOLOGIES, INC.",00) OB Unknown 1 (0029,"OCULUS Optikgeraete GmbH",1010) OB OriginalMeasuringData 1 (0029,"OCULUS Optikgeraete GmbH",1012) UL OriginalMeasuringDataLength 1 (0029,"OCULUS Optikgeraete GmbH",1020) OB OriginalMeasuringRawData 1 (0029,"OCULUS Optikgeraete GmbH",1022) UL OriginalMeasuringRawDataLength 1 (0041,"PAPYRUS 3.0",00) LT PapyrusComments 1 (0041,"PAPYRUS 3.0",10) SQ PointerSequence 1 (0041,"PAPYRUS 3.0",11) UL ImagePointer 1 (0041,"PAPYRUS 3.0",12) UL PixelOffset 1 (0041,"PAPYRUS 3.0",13) SQ ImageIdentifierSequence 1 (0041,"PAPYRUS 3.0",14) SQ ExternalFileReferenceSequence 1 (0041,"PAPYRUS 3.0",15) US NumberOfImages 1 (0041,"PAPYRUS 3.0",21) UI ReferencedSOPClassUID 1 (0041,"PAPYRUS 3.0",22) UI ReferencedSOPInstanceUID 1 (0041,"PAPYRUS 3.0",31) LT ReferencedFileName 1 (0041,"PAPYRUS 3.0",32) LT ReferencedFilePath 1-n (0041,"PAPYRUS 3.0",41) UI ReferencedImageSOPClassUID 1 (0041,"PAPYRUS 3.0",42) UI ReferencedImageSOPInstanceUID 1 (0041,"PAPYRUS 3.0",50) SQ ImageSequence 1 (6001-o-60ff,"PAPYRUS 3.0",00) IS OverlayID 1 (6001-o-60ff,"PAPYRUS 3.0",01) LT LinkedOverlays 1-n (6001-o-60ff,"PAPYRUS 3.0",10) US OverlayRows 1 (6001-o-60ff,"PAPYRUS 3.0",11) US OverlayColumns 1 (6001-o-60ff,"PAPYRUS 3.0",40) LO OverlayType 1 (6001-o-60ff,"PAPYRUS 3.0",50) US OverlayOrigin 1-n (6001-o-60ff,"PAPYRUS 3.0",60) LO Editable 1 (6001-o-60ff,"PAPYRUS 3.0",70) LO OverlayFont 1 (6001-o-60ff,"PAPYRUS 3.0",72) LO OverlayStyle 1 (6001-o-60ff,"PAPYRUS 3.0",74) US OverlayFontSize 1 (6001-o-60ff,"PAPYRUS 3.0",76) LO OverlayColor 1 (6001-o-60ff,"PAPYRUS 3.0",78) US ShadowSize 1 (6001-o-60ff,"PAPYRUS 3.0",80) LO FillPattern 1 (6001-o-60ff,"PAPYRUS 3.0",82) US OverlayPenSize 1 (6001-o-60ff,"PAPYRUS 3.0",a0) LO Label 1 (6001-o-60ff,"PAPYRUS 3.0",a2) LT PostItText 1 (6001-o-60ff,"PAPYRUS 3.0",a4) US AnchorPoint 2 (6001-o-60ff,"PAPYRUS 3.0",b0) LO ROIType 1 (6001-o-60ff,"PAPYRUS 3.0",b2) LT AttachedAnnotation 1 (6001-o-60ff,"PAPYRUS 3.0",ba) US ContourPoints 1-n (6001-o-60ff,"PAPYRUS 3.0",bc) US MaskData 1-n (6001-o-60ff,"PAPYRUS 3.0",c0) SQ UINOverlaySequence 1 (0009,"PAPYRUS",00) LT OriginalFileName 1 (0009,"PAPYRUS",10) LT OriginalFileLocation 1 (0009,"PAPYRUS",18) LT DataSetIdentifier 1 (0041,"PAPYRUS",00) LT PapyrusComments 1-n (0041,"PAPYRUS",10) US FolderType 1 (0041,"PAPYRUS",11) LT PatientFolderDataSetID 1 (0041,"PAPYRUS",20) LT FolderName 1 (0041,"PAPYRUS",30) DA CreationDate 1 (0041,"PAPYRUS",32) TM CreationTime 1 (0041,"PAPYRUS",34) DA ModifiedDate 1 (0041,"PAPYRUS",36) TM ModifiedTime 1 (0041,"PAPYRUS",40) LT OwnerName 1-n (0041,"PAPYRUS",50) LT FolderStatus 1 (0041,"PAPYRUS",60) UL NumberOfImages 1 (0041,"PAPYRUS",62) UL NumberOfOther 1 (0041,"PAPYRUS",a0) LT ExternalFolderElementDSID 1-n (0041,"PAPYRUS",a1) US ExternalFolderElementDataSetType 1-n (0041,"PAPYRUS",a2) LT ExternalFolderElementFileLocation 1-n (0041,"PAPYRUS",a3) UL ExternalFolderElementLength 1-n (0041,"PAPYRUS",b0) LT InternalFolderElementDSID 1-n (0041,"PAPYRUS",b1) US InternalFolderElementDataSetType 1-n (0041,"PAPYRUS",b2) UL InternalOffsetToDataSet 1-n (0041,"PAPYRUS",b3) UL InternalOffsetToImage 1-n # Note: Some Philips devices use these private tags with reservation value # "Philips Imaging DD 001", others use "PHILIPS IMAGING DD 001". All attributes # should thus be present twice in this dictionary, once for each spelling variant. # (2001,"Philips Imaging DD 001",01) FL ChemicalShift 1 (2001,"Philips Imaging DD 001",02) IS ChemicalShiftNumberMR 1 (2001,"Philips Imaging DD 001",03) FL DiffusionB-Factor 1 (2001,"Philips Imaging DD 001",04) CS DiffusionDirection 1 (2001,"Philips Imaging DD 001",06) CS ImageEnhanced 1 (2001,"Philips Imaging DD 001",07) CS ImageTypeEDES 1 (2001,"Philips Imaging DD 001",08) IS PhaseNumber 1 (2001,"Philips Imaging DD 001",0a) IS SliceNumberMR 1 (2001,"Philips Imaging DD 001",0b) CS SliceOrientation 1 (2001,"Philips Imaging DD 001",11) FL DiffusionEchoTime 1 (2001,"Philips Imaging DD 001",12) CS DynamicSeries 1 (2001,"Philips Imaging DD 001",13) SL EPIFactor 1 (2001,"Philips Imaging DD 001",14) SL NumberOfEchoes 1 (2001,"Philips Imaging DD 001",15) SS NumberOfLocations 1 (2001,"Philips Imaging DD 001",16) SS NumberOfPCDirections 1 (2001,"Philips Imaging DD 001",17) SL NumberOfPhasesMR 1 (2001,"Philips Imaging DD 001",18) SL NumberOfSlicesMR 1 (2001,"Philips Imaging DD 001",19) CS PartialMatrixScanned 1 (2001,"Philips Imaging DD 001",1a) FL PCVelocity 1-n (2001,"Philips Imaging DD 001",1b) FL PrepulseDelay 1 (2001,"Philips Imaging DD 001",1c) CS PrepulseType 1 (2001,"Philips Imaging DD 001",1d) IS ReconstructionNumberMR 1 (2001,"Philips Imaging DD 001",1f) CS RespirationSync 1 (2001,"Philips Imaging DD 001",21) CS SPIR 1 (2001,"Philips Imaging DD 001",22) FL WaterFatShift 1 (2001,"Philips Imaging DD 001",23) DS FlipAnglePhilips 1 (2001,"Philips Imaging DD 001",25) SH EchoTimeDisplayMR 1 (2001,"Philips Imaging DD 001",2d) SS StackNumberOfSlices 1 (2001,"Philips Imaging DD 001",32) FL StackRadialAngle 1 (2001,"Philips Imaging DD 001",33) CS StackRadialAxis 1 (2001,"Philips Imaging DD 001",35) SS StackSliceNumber 1 (2001,"Philips Imaging DD 001",36) CS StackType 1 (2001,"Philips Imaging DD 001",3f) CS ZoomMode 1 (2001,"Philips Imaging DD 001",5f) SQ StackSequence 1-n (2001,"Philips Imaging DD 001",60) SL NumberOfStacks 1 (2001,"Philips Imaging DD 001",61) CS SeriesTransmitted 1 (2001,"Philips Imaging DD 001",62) CS SeriesCommitted 1 (2001,"Philips Imaging DD 001",63) CS ExaminationSource 1 (2001,"Philips Imaging DD 001",7b) IS AcquisitionNumber 1 (2001,"Philips Imaging DD 001",81) IS NumberOfDynamicScans 1 # Note: Some Philips devices use these private tags with reservation value # "Philips Imaging DD 001", others use "PHILIPS IMAGING DD 001". All attributes # should thus be present twice in this dictionary, once for each spelling variant. # (2001,"PHILIPS IMAGING DD 001",01) FL ChemicalShift 1 (2001,"PHILIPS IMAGING DD 001",02) IS ChemicalShiftNumberMR 1 (2001,"PHILIPS IMAGING DD 001",03) FL DiffusionB-Factor 1 (2001,"PHILIPS IMAGING DD 001",04) CS DiffusionDirection 1 (2001,"PHILIPS IMAGING DD 001",06) CS ImageEnhanced 1 (2001,"PHILIPS IMAGING DD 001",07) CS ImageTypeEDES 1 (2001,"PHILIPS IMAGING DD 001",08) IS PhaseNumber 1 (2001,"PHILIPS IMAGING DD 001",0a) IS SliceNumberMR 1 (2001,"PHILIPS IMAGING DD 001",0b) CS SliceOrientation 1 (2001,"PHILIPS IMAGING DD 001",11) FL DiffusionEchoTime 1 (2001,"PHILIPS IMAGING DD 001",12) CS DynamicSeries 1 (2001,"PHILIPS IMAGING DD 001",13) SL EPIFactor 1 (2001,"PHILIPS IMAGING DD 001",14) SL NumberOfEchoes 1 (2001,"PHILIPS IMAGING DD 001",15) SS NumberOfLocations 1 (2001,"PHILIPS IMAGING DD 001",16) SS NumberOfPCDirections 1 (2001,"PHILIPS IMAGING DD 001",17) SL NumberOfPhasesMR 1 (2001,"PHILIPS IMAGING DD 001",18) SL NumberOfSlicesMR 1 (2001,"PHILIPS IMAGING DD 001",19) CS PartialMatrixScanned 1 (2001,"PHILIPS IMAGING DD 001",1a) FL PCVelocity 1-n (2001,"PHILIPS IMAGING DD 001",1b) FL PrepulseDelay 1 (2001,"PHILIPS IMAGING DD 001",1c) CS PrepulseType 1 (2001,"PHILIPS IMAGING DD 001",1d) IS ReconstructionNumberMR 1 (2001,"PHILIPS IMAGING DD 001",1f) CS RespirationSync 1 (2001,"PHILIPS IMAGING DD 001",21) CS SPIR 1 (2001,"PHILIPS IMAGING DD 001",22) FL WaterFatShift 1 (2001,"PHILIPS IMAGING DD 001",23) DS FlipAnglePhilips 1 (2001,"PHILIPS IMAGING DD 001",25) SH EchoTimeDisplayMR 1 (2001,"PHILIPS IMAGING DD 001",2d) SS StackNumberOfSlices 1 (2001,"PHILIPS IMAGING DD 001",32) FL StackRadialAngle 1 (2001,"PHILIPS IMAGING DD 001",33) CS StackRadialAxis 1 (2001,"PHILIPS IMAGING DD 001",35) SS StackSliceNumber 1 (2001,"PHILIPS IMAGING DD 001",36) CS StackType 1 (2001,"PHILIPS IMAGING DD 001",3f) CS ZoomMode 1 (2001,"PHILIPS IMAGING DD 001",5f) SQ StackSequence 1-n (2001,"PHILIPS IMAGING DD 001",60) SL NumberOfStacks 1 (2001,"PHILIPS IMAGING DD 001",61) CS SeriesTransmitted 1 (2001,"PHILIPS IMAGING DD 001",62) CS SeriesCommitted 1 (2001,"PHILIPS IMAGING DD 001",63) CS ExaminationSource 1 (2001,"PHILIPS IMAGING DD 001",7b) IS AcquisitionNumber 1 (2001,"PHILIPS IMAGING DD 001",81) IS NumberOfDynamicScans 1 # Note: Some Philips devices use these private tags with reservation value # "Philips MR Imaging DD 001", others use "PHILIPS MR IMAGING DD 001". All attributes # should thus be present twice in this dictionary, once for each spelling variant. # (2005,"Philips MR Imaging DD 001",05) CS SynergyReconstructionType 1 (2005,"Philips MR Imaging DD 001",1e) SH MIPProtocol 1 (2005,"Philips MR Imaging DD 001",1f) SH MPRProtocol 1 (2005,"Philips MR Imaging DD 001",20) SL NumberOfChemicalShifts 1 (2005,"Philips MR Imaging DD 001",2d) SS NumberOfStackSlices 1 (2005,"Philips MR Imaging DD 001",32) FL StackRadialAngle 1 (2005,"Philips MR Imaging DD 001",33) CS StackRadialAxis 1 (2005,"Philips MR Imaging DD 001",35) SS StackSliceNumber 1 (2005,"Philips MR Imaging DD 001",36) CS StackType 1 (2005,"Philips MR Imaging DD 001",a1) CS SyncraScanType 1 (2005,"Philips MR Imaging DD 001",5f) SQ StackSequence 1 (2005,"Philips MR Imaging DD 001",83) SQ Unknown 1 (2005,"Philips MR Imaging DD 005",02) SQ Unknown 1 # Note: Some Philips devices use these private tags with reservation value # "Philips MR Imaging DD 001", others use "PHILIPS MR IMAGING DD 001". All attributes # should thus be present twice in this dictionary, once for each spelling variant. # (2005,"PHILIPS MR IMAGING DD 001",05) CS SynergyReconstructionType 1 (2005,"PHILIPS MR IMAGING DD 001",1e) SH MIPProtocol 1 (2005,"PHILIPS MR IMAGING DD 001",1f) SH MPRProtocol 1 (2005,"PHILIPS MR IMAGING DD 001",20) SL NumberOfChemicalShifts 1 (2005,"PHILIPS MR IMAGING DD 001",2d) SS NumberOfStackSlices 1 (2005,"PHILIPS MR IMAGING DD 001",32) FL StackRadialAngle 1 (2005,"PHILIPS MR IMAGING DD 001",33) CS StackRadialAxis 1 (2005,"PHILIPS MR IMAGING DD 001",35) SS StackSliceNumber 1 (2005,"PHILIPS MR IMAGING DD 001",36) CS StackType 1 (2005,"PHILIPS MR IMAGING DD 001",a1) CS SyncraScanType 1 (2005,"PHILIPS MR IMAGING DD 001",5f) SQ StackSequence 1 (2005,"PHILIPS MR IMAGING DD 001",83) SQ Unknown 1 (0019,"PHILIPS MR R5.5/PART",1000) DS FieldOfView 1 (0019,"PHILIPS MR R5.6/PART",1000) DS FieldOfView 1 (0019,"PHILIPS MR SPECTRO;1",01) US Unknown 1 (0019,"PHILIPS MR SPECTRO;1",02) US Unknown 1 (0019,"PHILIPS MR SPECTRO;1",03) US Unknown 1 (0019,"PHILIPS MR SPECTRO;1",04) US Unknown 1 (0019,"PHILIPS MR SPECTRO;1",05) US Unknown 1 (0019,"PHILIPS MR SPECTRO;1",06) US Unknown 1 (0019,"PHILIPS MR SPECTRO;1",07) IS Unknown 1 (0019,"PHILIPS MR SPECTRO;1",08) IS Unknown 1 (0019,"PHILIPS MR SPECTRO;1",09) IS Unknown 1 (0019,"PHILIPS MR SPECTRO;1",10) IS Unknown 1 (0019,"PHILIPS MR SPECTRO;1",12) IS Unknown 1 (0019,"PHILIPS MR SPECTRO;1",13) IS Unknown 1 (0019,"PHILIPS MR SPECTRO;1",14) US Unknown 1 (0019,"PHILIPS MR SPECTRO;1",15) US Unknown 1-n (0019,"PHILIPS MR SPECTRO;1",16) IS Unknown 1 (0019,"PHILIPS MR SPECTRO;1",17) IS Unknown 1 (0019,"PHILIPS MR SPECTRO;1",18) UN Unknown 1 (0019,"PHILIPS MR SPECTRO;1",20) IS Unknown 1 (0019,"PHILIPS MR SPECTRO;1",21) IS Unknown 1 (0019,"PHILIPS MR SPECTRO;1",22) IS Unknown 1 (0019,"PHILIPS MR SPECTRO;1",23) IS Unknown 1 (0019,"PHILIPS MR SPECTRO;1",24) IS Unknown 1 (0019,"PHILIPS MR SPECTRO;1",25) IS Unknown 1 (0019,"PHILIPS MR SPECTRO;1",26) IS Unknown 1 (0019,"PHILIPS MR SPECTRO;1",27) IS Unknown 1 (0019,"PHILIPS MR SPECTRO;1",28) IS Unknown 1 (0019,"PHILIPS MR SPECTRO;1",29) IS Unknown 1-n (0019,"PHILIPS MR SPECTRO;1",31) US Unknown 1 (0019,"PHILIPS MR SPECTRO;1",32) US Unknown 1 (0019,"PHILIPS MR SPECTRO;1",41) LT Unknown 1 (0019,"PHILIPS MR SPECTRO;1",42) IS Unknown 2 (0019,"PHILIPS MR SPECTRO;1",43) IS Unknown 2 (0019,"PHILIPS MR SPECTRO;1",45) US Unknown 1 (0019,"PHILIPS MR SPECTRO;1",46) US Unknown 1 (0019,"PHILIPS MR SPECTRO;1",47) IS Unknown 1 (0019,"PHILIPS MR SPECTRO;1",48) IS Unknown 1 (0019,"PHILIPS MR SPECTRO;1",49) US Unknown 1 (0019,"PHILIPS MR SPECTRO;1",50) UN Unknown 1 (0019,"PHILIPS MR SPECTRO;1",60) US Unknown 1 (0019,"PHILIPS MR SPECTRO;1",61) US Unknown 1 (0019,"PHILIPS MR SPECTRO;1",70) UN Unknown 1 (0019,"PHILIPS MR SPECTRO;1",71) IS Unknown 1-n (0019,"PHILIPS MR SPECTRO;1",72) US Unknown 1 (0019,"PHILIPS MR SPECTRO;1",73) US Unknown 1 (0019,"PHILIPS MR SPECTRO;1",74) US Unknown 1 (0019,"PHILIPS MR SPECTRO;1",76) US Unknown 1 (0019,"PHILIPS MR SPECTRO;1",77) US Unknown 1 (0019,"PHILIPS MR SPECTRO;1",78) US Unknown 1 (0019,"PHILIPS MR SPECTRO;1",79) US Unknown 1 (0019,"PHILIPS MR SPECTRO;1",80) IS Unknown 1 (0009,"PHILIPS MR",10) LO SPIRelease 1 (0009,"PHILIPS MR",12) LO Unknown 1 (0019,"PHILIPS MR/LAST",09) DS MainMagneticField 1 (0019,"PHILIPS MR/LAST",0e) IS FlowCompensation 1 (0019,"PHILIPS MR/LAST",b1) IS MinimumRRInterval 1 (0019,"PHILIPS MR/LAST",b2) IS MaximumRRInterval 1 (0019,"PHILIPS MR/LAST",b3) IS NumberOfRejections 1 (0019,"PHILIPS MR/LAST",b4) IS NumberOfRRIntervals 1-n (0019,"PHILIPS MR/LAST",b5) IS ArrhythmiaRejection 1 (0019,"PHILIPS MR/LAST",c0) DS Unknown 1-n (0019,"PHILIPS MR/LAST",c6) IS CycledMultipleSlice 1 (0019,"PHILIPS MR/LAST",ce) IS REST 1 (0019,"PHILIPS MR/LAST",d5) DS Unknown 1 (0019,"PHILIPS MR/LAST",d6) IS FourierInterpolation 1 (0019,"PHILIPS MR/LAST",d9) IS Unknown 1-n (0019,"PHILIPS MR/LAST",e0) IS Prepulse 1 (0019,"PHILIPS MR/LAST",e1) DS PrepulseDelay 1 (0019,"PHILIPS MR/LAST",e2) IS Unknown 1 (0019,"PHILIPS MR/LAST",e3) DS Unknown 1 (0019,"PHILIPS MR/LAST",f0) LT WSProtocolString1 1 (0019,"PHILIPS MR/LAST",f1) LT WSProtocolString2 1 (0019,"PHILIPS MR/LAST",f2) LT WSProtocolString3 1 (0019,"PHILIPS MR/LAST",f3) LT WSProtocolString4 1 (0021,"PHILIPS MR/LAST",00) IS Unknown 1 (0021,"PHILIPS MR/LAST",10) IS Unknown 1 (0021,"PHILIPS MR/LAST",20) IS Unknown 1 (0021,"PHILIPS MR/LAST",21) DS SliceGap 1 (0021,"PHILIPS MR/LAST",22) DS StackRadialAngle 1 (0027,"PHILIPS MR/LAST",00) US Unknown 1 (0027,"PHILIPS MR/LAST",11) US Unknown 1-n (0027,"PHILIPS MR/LAST",12) DS Unknown 1-n (0027,"PHILIPS MR/LAST",13) DS Unknown 1-n (0027,"PHILIPS MR/LAST",14) DS Unknown 1-n (0027,"PHILIPS MR/LAST",15) DS Unknown 1-n (0027,"PHILIPS MR/LAST",16) LO Unknown 1 (0029,"PHILIPS MR/LAST",10) DS FPMin 1 (0029,"PHILIPS MR/LAST",20) DS FPMax 1 (0029,"PHILIPS MR/LAST",30) DS ScaledMinimum 1 (0029,"PHILIPS MR/LAST",40) DS ScaledMaximum 1 (0029,"PHILIPS MR/LAST",50) DS WindowMinimum 1 (0029,"PHILIPS MR/LAST",60) DS WindowMaximum 1 (0029,"PHILIPS MR/LAST",61) IS Unknown 1 (0029,"PHILIPS MR/LAST",70) DS Unknown 1 (0029,"PHILIPS MR/LAST",71) DS Unknown 1 (0029,"PHILIPS MR/LAST",72) IS Unknown 1 (0029,"PHILIPS MR/LAST",80) IS ViewCenter 1 (0029,"PHILIPS MR/LAST",81) IS ViewSize 1 (0029,"PHILIPS MR/LAST",82) IS ViewZoom 1 (0029,"PHILIPS MR/LAST",83) IS ViewTransform 1 (6001,"PHILIPS MR/LAST",00) LT Unknown 1 (0019,"PHILIPS MR/PART",1000) DS FieldOfView 1 (0019,"PHILIPS MR/PART",1005) DS CCAngulation 1 (0019,"PHILIPS MR/PART",1006) DS APAngulation 1 (0019,"PHILIPS MR/PART",1007) DS LRAngulation 1 (0019,"PHILIPS MR/PART",1008) IS PatientPosition 1 (0019,"PHILIPS MR/PART",1009) IS PatientOrientation 1 (0019,"PHILIPS MR/PART",100a) IS SliceOrientation 1 (0019,"PHILIPS MR/PART",100b) DS LROffcenter 1 (0019,"PHILIPS MR/PART",100c) DS CCOffcenter 1 (0019,"PHILIPS MR/PART",100d) DS APOffcenter 1 (0019,"PHILIPS MR/PART",100e) DS Unknown 1 (0019,"PHILIPS MR/PART",100f) IS NumberOfSlices 1 (0019,"PHILIPS MR/PART",1010) DS SliceFactor 1 (0019,"PHILIPS MR/PART",1011) DS EchoTimes 1-n (0019,"PHILIPS MR/PART",1015) IS DynamicStudy 1 (0019,"PHILIPS MR/PART",1018) DS HeartbeatInterval 1 (0019,"PHILIPS MR/PART",1019) DS RepetitionTimeFFE 1 (0019,"PHILIPS MR/PART",101a) DS FFEFlipAngle 1 (0019,"PHILIPS MR/PART",101b) IS NumberOfScans 1 (0019,"PHILIPS MR/PART",1021) DS Unknown 1-n (0019,"PHILIPS MR/PART",1022) DS DynamicScanTimeBegin 1 (0019,"PHILIPS MR/PART",1024) IS Unknown 1 (0019,"PHILIPS MR/PART",1064) DS RepetitionTimeSE 1 (0019,"PHILIPS MR/PART",1065) DS RepetitionTimeIR 1 (0019,"PHILIPS MR/PART",1069) IS NumberOfPhases 1 (0019,"PHILIPS MR/PART",106a) IS CardiacFrequency 1 (0019,"PHILIPS MR/PART",106b) DS InversionDelay 1 (0019,"PHILIPS MR/PART",106c) DS GateDelay 1 (0019,"PHILIPS MR/PART",106d) DS GateWidth 1 (0019,"PHILIPS MR/PART",106e) DS TriggerDelayTime 1 (0019,"PHILIPS MR/PART",1080) IS NumberOfChemicalShifts 1 (0019,"PHILIPS MR/PART",1081) DS ChemicalShift 1 (0019,"PHILIPS MR/PART",1084) IS NumberOfRows 1 (0019,"PHILIPS MR/PART",1085) IS NumberOfSamples 1 (0019,"PHILIPS MR/PART",1094) LO MagnetizationTransferContrast 1 (0019,"PHILIPS MR/PART",1095) LO SpectralPresaturationWithInversionRecovery 1 (0019,"PHILIPS MR/PART",1096) IS Unknown 1 (0019,"PHILIPS MR/PART",1097) LO Unknown 1 (0019,"PHILIPS MR/PART",10a0) IS Unknown 1 (0019,"PHILIPS MR/PART",10a1) DS Unknown 1 (0019,"PHILIPS MR/PART",10a3) DS Unknown 1 (0019,"PHILIPS MR/PART",10a4) CS Unknown 1 (0019,"PHILIPS MR/PART",10c8) IS Unknown 1 (0019,"PHILIPS MR/PART",10c9) IS FoldoverDirectionTransverse 1 (0019,"PHILIPS MR/PART",10ca) IS FoldoverDirectionSagittal 1 (0019,"PHILIPS MR/PART",10cb) IS FoldoverDirectionCoronal 1 (0019,"PHILIPS MR/PART",10cc) IS Unknown 1 (0019,"PHILIPS MR/PART",10cd) IS Unknown 1 (0019,"PHILIPS MR/PART",10ce) IS Unknown 1 (0019,"PHILIPS MR/PART",10cf) IS NumberOfEchoes 1 (0019,"PHILIPS MR/PART",10d0) IS ScanResolution 1 (0019,"PHILIPS MR/PART",10d2) LO WaterFatShift 2 (0019,"PHILIPS MR/PART",10d4) IS ArtifactReduction 1 (0019,"PHILIPS MR/PART",10d5) IS Unknown 1 (0019,"PHILIPS MR/PART",10d6) IS Unknown 1 (0019,"PHILIPS MR/PART",10d7) DS ScanPercentage 1 (0019,"PHILIPS MR/PART",10d8) IS Halfscan 1 (0019,"PHILIPS MR/PART",10d9) IS EPIFactor 1 (0019,"PHILIPS MR/PART",10da) IS TurboFactor 1 (0019,"PHILIPS MR/PART",10db) IS Unknown 1 (0019,"PHILIPS MR/PART",10e0) IS PercentageOfScanCompleted 1 (0019,"PHILIPS MR/PART",10e1) IS Unknown 1 (0019,"PHILIPS MR/PART",1100) IS NumberOfStacks 1 (0019,"PHILIPS MR/PART",1101) IS StackType 1-n (0019,"PHILIPS MR/PART",1102) IS Unknown 1-n (0019,"PHILIPS MR/PART",110b) DS LROffcenter 1 (0019,"PHILIPS MR/PART",110c) DS CCOffcenter 1 (0019,"PHILIPS MR/PART",110d) DS APOffcenter 1 (0019,"PHILIPS MR/PART",1145) IS ReconstructionResolution 1 (0019,"PHILIPS MR/PART",11fc) IS ResonanceFrequency 1 (0019,"PHILIPS MR/PART",12c0) DS TriggerDelayTimes 1 (0019,"PHILIPS MR/PART",12e0) IS PrepulseType 1 (0019,"PHILIPS MR/PART",12e1) DS PrepulseDelay 1 (0019,"PHILIPS MR/PART",12e3) DS PhaseContrastVelocity 1 (0021,"PHILIPS MR/PART",1000) IS ReconstructionNumber 1 (0021,"PHILIPS MR/PART",1010) IS ImageType 1 (0021,"PHILIPS MR/PART",1020) IS SliceNumber 1 (0021,"PHILIPS MR/PART",1030) IS EchoNumber 1 (0021,"PHILIPS MR/PART",1031) DS PatientReferenceID 1 (0021,"PHILIPS MR/PART",1035) IS ChemicalShiftNumber 1 (0021,"PHILIPS MR/PART",1040) IS PhaseNumber 1 (0021,"PHILIPS MR/PART",1050) IS DynamicScanNumber 1 (0021,"PHILIPS MR/PART",1060) IS NumberOfRowsInObject 1 (0021,"PHILIPS MR/PART",1061) IS RowNumber 1-n (0021,"PHILIPS MR/PART",1062) IS Unknown 1-n (0021,"PHILIPS MR/PART",1100) DA ScanDate 1 (0021,"PHILIPS MR/PART",1110) TM ScanTime 1 (0021,"PHILIPS MR/PART",1221) IS SliceGap 1 (0029,"PHILIPS MR/PART",00) DS Unknown 2 (0029,"PHILIPS MR/PART",04) US Unknown 1 (0029,"PHILIPS MR/PART",10) DS Unknown 1 (0029,"PHILIPS MR/PART",11) DS Unknown 1 (0029,"PHILIPS MR/PART",20) LO Unknown 1 (0029,"PHILIPS MR/PART",31) DS Unknown 2 (0029,"PHILIPS MR/PART",32) DS Unknown 2 (0029,"PHILIPS MR/PART",c3) IS ScanResolution 1 (0029,"PHILIPS MR/PART",c4) IS FieldOfView 1 (0029,"PHILIPS MR/PART",d5) LT SliceThickness 1 (0019,"PHILIPS-MR-1",11) IS ChemicalShiftNumber 1 (0019,"PHILIPS-MR-1",12) IS PhaseNumber 1 (0021,"PHILIPS-MR-1",01) IS ReconstructionNumber 1 (0021,"PHILIPS-MR-1",02) IS SliceNumber 1 (7001,"Picker NM Private Group",01) UI Unknown 1 (7001,"Picker NM Private Group",02) OB Unknown 1 (0019,"SIEMENS CM VA0 ACQU",10) LT ParameterFileName 1 (0019,"SIEMENS CM VA0 ACQU",11) LO SequenceFileName 1 (0019,"SIEMENS CM VA0 ACQU",12) LT SequenceFileOwner 1 (0019,"SIEMENS CM VA0 ACQU",13) LT SequenceDescription 1 (0019,"SIEMENS CM VA0 ACQU",14) LT EPIFileName 1 (0009,"SIEMENS CM VA0 CMS",00) DS NumberOfMeasurements 1 (0009,"SIEMENS CM VA0 CMS",10) LT StorageMode 1 (0009,"SIEMENS CM VA0 CMS",12) UL EvaluationMaskImage 1 (0009,"SIEMENS CM VA0 CMS",26) DA LastMoveDate 1 (0009,"SIEMENS CM VA0 CMS",27) TM LastMoveTime 1 (0011,"SIEMENS CM VA0 CMS",0a) LT Unknown 1 (0011,"SIEMENS CM VA0 CMS",10) DA RegistrationDate 1 (0011,"SIEMENS CM VA0 CMS",11) TM RegistrationTime 1 (0011,"SIEMENS CM VA0 CMS",22) LT Unknown 1 (0011,"SIEMENS CM VA0 CMS",23) DS UsedPatientWeight 1 (0011,"SIEMENS CM VA0 CMS",40) IS OrganCode 1 (0013,"SIEMENS CM VA0 CMS",00) LT ModifyingPhysician 1 (0013,"SIEMENS CM VA0 CMS",10) DA ModificationDate 1 (0013,"SIEMENS CM VA0 CMS",12) TM ModificationTime 1 (0013,"SIEMENS CM VA0 CMS",20) LO PatientName 1 (0013,"SIEMENS CM VA0 CMS",22) LO PatientId 1 (0013,"SIEMENS CM VA0 CMS",30) DA PatientBirthdate 1 (0013,"SIEMENS CM VA0 CMS",31) DS PatientWeight 1 (0013,"SIEMENS CM VA0 CMS",32) LT PatientsMaidenName 1 (0013,"SIEMENS CM VA0 CMS",33) LT ReferringPhysician 1 (0013,"SIEMENS CM VA0 CMS",34) LT AdmittingDiagnosis 1 (0013,"SIEMENS CM VA0 CMS",35) LO PatientSex 1 (0013,"SIEMENS CM VA0 CMS",40) LO ProcedureDescription 1 (0013,"SIEMENS CM VA0 CMS",42) LO RestDirection 1 (0013,"SIEMENS CM VA0 CMS",44) LO PatientPosition 1 (0013,"SIEMENS CM VA0 CMS",46) LT ViewDirection 1 (0013,"SIEMENS CM VA0 CMS",50) LT Unknown 1 (0013,"SIEMENS CM VA0 CMS",51) LT Unknown 1 (0013,"SIEMENS CM VA0 CMS",52) LT Unknown 1 (0013,"SIEMENS CM VA0 CMS",53) LT Unknown 1 (0013,"SIEMENS CM VA0 CMS",54) LT Unknown 1 (0013,"SIEMENS CM VA0 CMS",55) LT Unknown 1 (0013,"SIEMENS CM VA0 CMS",56) LT Unknown 1 (0019,"SIEMENS CM VA0 CMS",10) DS NetFrequency 1 (0019,"SIEMENS CM VA0 CMS",20) LT MeasurementMode 1 (0019,"SIEMENS CM VA0 CMS",30) LT CalculationMode 1 (0019,"SIEMENS CM VA0 CMS",50) IS NoiseLevel 1 (0019,"SIEMENS CM VA0 CMS",60) IS NumberOfDataBytes 1 (0021,"SIEMENS CM VA0 CMS",20) DS FoV 2 (0021,"SIEMENS CM VA0 CMS",22) DS ImageMagnificationFactor 1 (0021,"SIEMENS CM VA0 CMS",24) DS ImageScrollOffset 2 (0021,"SIEMENS CM VA0 CMS",26) IS ImagePixelOffset 1 (0021,"SIEMENS CM VA0 CMS",30) LT ViewDirection 1 (0021,"SIEMENS CM VA0 CMS",32) CS PatientRestDirection 1 (0021,"SIEMENS CM VA0 CMS",60) DS ImagePosition 3 (0021,"SIEMENS CM VA0 CMS",61) DS ImageNormal 3 (0021,"SIEMENS CM VA0 CMS",63) DS ImageDistance 1 (0021,"SIEMENS CM VA0 CMS",65) US ImagePositioningHistoryMask 1 (0021,"SIEMENS CM VA0 CMS",6a) DS ImageRow 3 (0021,"SIEMENS CM VA0 CMS",6b) DS ImageColumn 3 (0021,"SIEMENS CM VA0 CMS",70) LT PatientOrientationSet1 3 (0021,"SIEMENS CM VA0 CMS",71) LT PatientOrientationSet2 3 (0021,"SIEMENS CM VA0 CMS",80) LT StudyName 1 (0021,"SIEMENS CM VA0 CMS",82) LT StudyType 3 (0029,"SIEMENS CM VA0 CMS",10) LT WindowStyle 1 (0029,"SIEMENS CM VA0 CMS",11) LT Unknown 1 (0029,"SIEMENS CM VA0 CMS",13) LT Unknown 1 (0029,"SIEMENS CM VA0 CMS",20) LT PixelQualityCode 3 (0029,"SIEMENS CM VA0 CMS",22) IS PixelQualityValue 3 (0029,"SIEMENS CM VA0 CMS",50) LT ArchiveCode 1 (0029,"SIEMENS CM VA0 CMS",51) LT ExposureCode 1 (0029,"SIEMENS CM VA0 CMS",52) LT SortCode 1 (0029,"SIEMENS CM VA0 CMS",53) LT Unknown 1 (0029,"SIEMENS CM VA0 CMS",60) LT Splash 1 (0051,"SIEMENS CM VA0 CMS",10) LT ImageText 1-n (6021,"SIEMENS CM VA0 CMS",00) LT ImageGraphicsFormatCode 1 (6021,"SIEMENS CM VA0 CMS",10) LT ImageGraphics 1 (7fe1,"SIEMENS CM VA0 CMS",00) OB BinaryData 1-n (0009,"SIEMENS CM VA0 LAB",10) LT GeneratorIdentificationLabel 1 (0009,"SIEMENS CM VA0 LAB",11) LT GantryIdentificationLabel 1 (0009,"SIEMENS CM VA0 LAB",12) LT X-RayTubeIdentificationLabel 1 (0009,"SIEMENS CM VA0 LAB",13) LT DetectorIdentificationLabel 1 (0009,"SIEMENS CM VA0 LAB",14) LT DASIdentificationLabel 1 (0009,"SIEMENS CM VA0 LAB",15) LT SMIIdentificationLabel 1 (0009,"SIEMENS CM VA0 LAB",16) LT CPUIdentificationLabel 1 (0009,"SIEMENS CM VA0 LAB",20) LT HeaderVersion 1 (0029,"SIEMENS CSA HEADER",08) CS CSAImageHeaderType 1 (0029,"SIEMENS CSA HEADER",09) LO CSAImageHeaderVersion 1 (0029,"SIEMENS CSA HEADER",10) OB CSAImageHeaderInfo 1 (0029,"SIEMENS CSA HEADER",18) CS CSASeriesHeaderType 1 (0029,"SIEMENS CSA HEADER",19) LO CSASeriesHeaderVersion 1 (0029,"SIEMENS CSA HEADER",20) OB CSASeriesHeaderInfo 1 (0029,"SIEMENS CSA NON-IMAGE",08) CS CSADataType 1 (0029,"SIEMENS CSA NON-IMAGE",09) LO CSADataVersion 1 (0029,"SIEMENS CSA NON-IMAGE",10) OB CSADataInfo 1 (7FE1,"SIEMENS CSA NON-IMAGE",10) OB CSAData 1 (0019,"SIEMENS CT VA0 COAD",10) DS DistanceSourceToSourceSideCollimator 1 (0019,"SIEMENS CT VA0 COAD",11) DS DistanceSourceToDetectorSideCollimator 1 (0019,"SIEMENS CT VA0 COAD",20) IS NumberOfPossibleChannels 1 (0019,"SIEMENS CT VA0 COAD",21) IS MeanChannelNumber 1 (0019,"SIEMENS CT VA0 COAD",22) DS DetectorSpacing 1 (0019,"SIEMENS CT VA0 COAD",23) DS DetectorCenter 1 (0019,"SIEMENS CT VA0 COAD",24) DS ReadingIntegrationTime 1 (0019,"SIEMENS CT VA0 COAD",50) DS DetectorAlignment 1 (0019,"SIEMENS CT VA0 COAD",52) DS Unknown 1 (0019,"SIEMENS CT VA0 COAD",54) DS Unknown 1 (0019,"SIEMENS CT VA0 COAD",60) DS FocusAlignment 1 (0019,"SIEMENS CT VA0 COAD",65) UL FocalSpotDeflectionAmplitude 1 (0019,"SIEMENS CT VA0 COAD",66) UL FocalSpotDeflectionPhase 1 (0019,"SIEMENS CT VA0 COAD",67) UL FocalSpotDeflectionOffset 1 (0019,"SIEMENS CT VA0 COAD",70) DS WaterScalingFactor 1 (0019,"SIEMENS CT VA0 COAD",71) DS InterpolationFactor 1 (0019,"SIEMENS CT VA0 COAD",80) LT PatientRegion 1 (0019,"SIEMENS CT VA0 COAD",82) LT PatientPhaseOfLife 1 (0019,"SIEMENS CT VA0 COAD",90) DS OsteoOffset 1 (0019,"SIEMENS CT VA0 COAD",92) DS OsteoRegressionLineSlope 1 (0019,"SIEMENS CT VA0 COAD",93) DS OsteoRegressionLineIntercept 1 (0019,"SIEMENS CT VA0 COAD",94) DS OsteoStandardizationCode 1 (0019,"SIEMENS CT VA0 COAD",96) IS OsteoPhantomNumber 1 (0019,"SIEMENS CT VA0 COAD",A3) US Unknown 1-n (0019,"SIEMENS CT VA0 COAD",A4) DS Unknown 1 (0019,"SIEMENS CT VA0 COAD",A5) DS Unknown 1 (0019,"SIEMENS CT VA0 COAD",A6) US Unknown 1-n (0019,"SIEMENS CT VA0 COAD",A7) US Unknown 1-n (0019,"SIEMENS CT VA0 COAD",A8) US Unknown 1-n (0019,"SIEMENS CT VA0 COAD",A9) DS Unknown 1 (0019,"SIEMENS CT VA0 COAD",AA) LT Unknown 1 (0019,"SIEMENS CT VA0 COAD",AB) DS Unknown 1 (0019,"SIEMENS CT VA0 COAD",AC) DS Unknown 1 (0019,"SIEMENS CT VA0 COAD",AD) DS Unknown 1 (0019,"SIEMENS CT VA0 COAD",AE) DS Unknown 1 (0019,"SIEMENS CT VA0 COAD",AF) DS Unknown 1 (0019,"SIEMENS CT VA0 COAD",B0) DS FeedPerRotation 1 (0019,"SIEMENS CT VA0 COAD",BD) IS PulmoTriggerLevel 1 (0019,"SIEMENS CT VA0 COAD",BE) DS ExpiratoricReserveVolume 1 (0019,"SIEMENS CT VA0 COAD",BF) DS VitalCapacity 1 (0019,"SIEMENS CT VA0 COAD",C0) DS PulmoWater 1 (0019,"SIEMENS CT VA0 COAD",C1) DS PulmoAir 1 (0019,"SIEMENS CT VA0 COAD",C2) DA PulmoDate 1 (0019,"SIEMENS CT VA0 COAD",C3) TM PulmoTime 1 (0019,"SIEMENS CT VA0 GEN",10) DS SourceSideCollimatorAperture 1 (0019,"SIEMENS CT VA0 GEN",11) DS DetectorSideCollimatorAperture 1 (0019,"SIEMENS CT VA0 GEN",20) DS ExposureTime 1 (0019,"SIEMENS CT VA0 GEN",21) DS ExposureCurrent 1 (0019,"SIEMENS CT VA0 GEN",25) DS KVPGeneratorPowerCurrent 1 (0019,"SIEMENS CT VA0 GEN",26) DS GeneratorVoltage 1 (0019,"SIEMENS CT VA0 GEN",40) UL MasterControlMask 1 (0019,"SIEMENS CT VA0 GEN",42) US ProcessingMask 5 (0019,"SIEMENS CT VA0 GEN",44) US Unknown 1-n (0019,"SIEMENS CT VA0 GEN",45) US Unknown 1-n (0019,"SIEMENS CT VA0 GEN",62) IS NumberOfVirtuellChannels 1 (0019,"SIEMENS CT VA0 GEN",70) IS NumberOfReadings 1 (0019,"SIEMENS CT VA0 GEN",71) LT Unknown 1-n (0019,"SIEMENS CT VA0 GEN",74) IS NumberOfProjections 1 (0019,"SIEMENS CT VA0 GEN",75) IS NumberOfBytes 1 (0019,"SIEMENS CT VA0 GEN",80) LT ReconstructionAlgorithmSet 1 (0019,"SIEMENS CT VA0 GEN",81) LT ReconstructionAlgorithmIndex 1 (0019,"SIEMENS CT VA0 GEN",82) LT RegenerationSoftwareVersion 1 (0019,"SIEMENS CT VA0 GEN",88) DS Unknown 1 (0021,"SIEMENS CT VA0 GEN",10) IS RotationAngle 1 (0021,"SIEMENS CT VA0 GEN",11) IS StartAngle 1 (0021,"SIEMENS CT VA0 GEN",20) US Unknown 1-n (0021,"SIEMENS CT VA0 GEN",30) IS TopogramTubePosition 1 (0021,"SIEMENS CT VA0 GEN",32) DS LengthOfTopogram 1 (0021,"SIEMENS CT VA0 GEN",34) DS TopogramCorrectionFactor 1 (0021,"SIEMENS CT VA0 GEN",36) DS MaximumTablePosition 1 (0021,"SIEMENS CT VA0 GEN",40) IS TableMoveDirectionCode 1 (0021,"SIEMENS CT VA0 GEN",45) IS VOIStartRow 1 (0021,"SIEMENS CT VA0 GEN",46) IS VOIStopRow 1 (0021,"SIEMENS CT VA0 GEN",47) IS VOIStartColumn 1 (0021,"SIEMENS CT VA0 GEN",48) IS VOIStopColumn 1 (0021,"SIEMENS CT VA0 GEN",49) IS VOIStartSlice 1 (0021,"SIEMENS CT VA0 GEN",4a) IS VOIStopSlice 1 (0021,"SIEMENS CT VA0 GEN",50) IS VectorStartRow 1 (0021,"SIEMENS CT VA0 GEN",51) IS VectorRowStep 1 (0021,"SIEMENS CT VA0 GEN",52) IS VectorStartColumn 1 (0021,"SIEMENS CT VA0 GEN",53) IS VectorColumnStep 1 (0021,"SIEMENS CT VA0 GEN",60) IS RangeTypeCode 1 (0021,"SIEMENS CT VA0 GEN",62) IS ReferenceTypeCode 1 (0021,"SIEMENS CT VA0 GEN",70) DS ObjectOrientation 3 (0021,"SIEMENS CT VA0 GEN",72) DS LightOrientation 3 (0021,"SIEMENS CT VA0 GEN",75) DS LightBrightness 1 (0021,"SIEMENS CT VA0 GEN",76) DS LightContrast 1 (0021,"SIEMENS CT VA0 GEN",7a) IS OverlayThreshold 2 (0021,"SIEMENS CT VA0 GEN",7b) IS SurfaceThreshold 2 (0021,"SIEMENS CT VA0 GEN",7c) IS GreyScaleThreshold 2 (0021,"SIEMENS CT VA0 GEN",a0) DS Unknown 1 (0021,"SIEMENS CT VA0 GEN",a2) LT Unknown 1 (0021,"SIEMENS CT VA0 GEN",a7) LT Unknown 1 (0009,"SIEMENS CT VA0 IDE",10) LT Unknown 1 (0009,"SIEMENS CT VA0 IDE",30) LT Unknown 1 (0009,"SIEMENS CT VA0 IDE",31) LT Unknown 1 (0009,"SIEMENS CT VA0 IDE",32) LT Unknown 1 (0009,"SIEMENS CT VA0 IDE",34) LT Unknown 1 (0009,"SIEMENS CT VA0 IDE",40) LT Unknown 1 (0009,"SIEMENS CT VA0 IDE",42) LT Unknown 1 (0009,"SIEMENS CT VA0 IDE",50) LT Unknown 1 (0009,"SIEMENS CT VA0 IDE",51) LT Unknown 1 (0009,"SIEMENS CT VA0 ORI",20) LT Unknown 1 (0009,"SIEMENS CT VA0 ORI",30) LT Unknown 1 (6021,"SIEMENS CT VA0 OST",00) LT OsteoContourComment 1 (6021,"SIEMENS CT VA0 OST",10) US OsteoContourBuffer 256 (0021,"SIEMENS CT VA0 RAW",10) UL CreationMask 2 (0021,"SIEMENS CT VA0 RAW",20) UL EvaluationMask 2 (0021,"SIEMENS CT VA0 RAW",30) US ExtendedProcessingMask 7 (0021,"SIEMENS CT VA0 RAW",40) US Unknown 1-n (0021,"SIEMENS CT VA0 RAW",41) US Unknown 1-n (0021,"SIEMENS CT VA0 RAW",42) US Unknown 1-n (0021,"SIEMENS CT VA0 RAW",43) US Unknown 1-n (0021,"SIEMENS CT VA0 RAW",44) US Unknown 1-n (0021,"SIEMENS CT VA0 RAW",50) LT Unknown 1 (0009,"SIEMENS DICOM",10) UN Unknown 1 (0009,"SIEMENS DICOM",12) LT Unknown 1 (0019,"SIEMENS DLR.01",10) LT MeasurementMode 1 (0019,"SIEMENS DLR.01",11) LT ImageType 1 (0019,"SIEMENS DLR.01",15) LT SoftwareVersion 1 (0019,"SIEMENS DLR.01",20) LT MPMCode 1 (0019,"SIEMENS DLR.01",21) LT Latitude 1 (0019,"SIEMENS DLR.01",22) LT Sensitivity 1 (0019,"SIEMENS DLR.01",23) LT EDR 1 (0019,"SIEMENS DLR.01",24) LT LFix 1 (0019,"SIEMENS DLR.01",25) LT SFix 1 (0019,"SIEMENS DLR.01",26) LT PresetMode 1 (0019,"SIEMENS DLR.01",27) LT Region 1 (0019,"SIEMENS DLR.01",28) LT Subregion 1 (0019,"SIEMENS DLR.01",30) LT Orientation 1 (0019,"SIEMENS DLR.01",31) LT MarkOnFilm 1 (0019,"SIEMENS DLR.01",32) LT RotationOnDRC 1 (0019,"SIEMENS DLR.01",40) LT ReaderType 1 (0019,"SIEMENS DLR.01",41) LT SubModality 1 (0019,"SIEMENS DLR.01",42) LT ReaderSerialNumber 1 (0019,"SIEMENS DLR.01",50) LT CassetteScale 1 (0019,"SIEMENS DLR.01",51) LT CassetteMatrix 1 (0019,"SIEMENS DLR.01",52) LT CassetteSubmatrix 1 (0019,"SIEMENS DLR.01",53) LT Barcode 1 (0019,"SIEMENS DLR.01",60) LT ContrastType 1 (0019,"SIEMENS DLR.01",61) LT RotationAmount 1 (0019,"SIEMENS DLR.01",62) LT RotationCenter 1 (0019,"SIEMENS DLR.01",63) LT DensityShift 1 (0019,"SIEMENS DLR.01",64) US FrequencyRank 1 (0019,"SIEMENS DLR.01",65) LT FrequencyEnhancement 1 (0019,"SIEMENS DLR.01",66) LT FrequencyType 1 (0019,"SIEMENS DLR.01",67) LT KernelLength 1 (0019,"SIEMENS DLR.01",68) UL KernelMode 1 (0019,"SIEMENS DLR.01",69) UL ConvolutionMode 1 (0019,"SIEMENS DLR.01",70) LT PLASource 1 (0019,"SIEMENS DLR.01",71) LT PLADestination 1 (0019,"SIEMENS DLR.01",75) LT UIDOriginalImage 1 (0019,"SIEMENS DLR.01",76) LT Unknown 1 (0019,"SIEMENS DLR.01",80) LT ReaderHeader 1 (0019,"SIEMENS DLR.01",90) LT PLAOfSecondaryDestination 1 (0019,"SIEMENS DLR.01",a0) DS Unknown 1 (0019,"SIEMENS DLR.01",a1) DS Unknown 1 (0041,"SIEMENS DLR.01",10) US NumberOfHardcopies 1 (0041,"SIEMENS DLR.01",20) LT FilmFormat 1 (0041,"SIEMENS DLR.01",30) LT FilmSize 1 (0041,"SIEMENS DLR.01",31) LT FullFilmFormat 1 (0003,"SIEMENS ISI",08) US ISICommandField 1 (0003,"SIEMENS ISI",11) US AttachIDApplicationCode 1 (0003,"SIEMENS ISI",12) UL AttachIDMessageCount 1 (0003,"SIEMENS ISI",13) DA AttachIDDate 1 (0003,"SIEMENS ISI",14) TM AttachIDTime 1 (0003,"SIEMENS ISI",20) US MessageType 1 (0003,"SIEMENS ISI",30) DA MaxWaitingDate 1 (0003,"SIEMENS ISI",31) TM MaxWaitingTime 1 (0009,"SIEMENS ISI",01) UN RISPatientInfoIMGEF 1 (0011,"SIEMENS ISI",03) LT PatientUID 1 (0011,"SIEMENS ISI",04) LT PatientID 1 (0011,"SIEMENS ISI",0a) LT CaseID 1 (0011,"SIEMENS ISI",22) LT RequestID 1 (0011,"SIEMENS ISI",23) LT ExaminationUID 1 (0011,"SIEMENS ISI",a1) DA PatientRegistrationDate 1 (0011,"SIEMENS ISI",a2) TM PatientRegistrationTime 1 (0011,"SIEMENS ISI",b0) LT PatientLastName 1 (0011,"SIEMENS ISI",b2) LT PatientFirstName 1 (0011,"SIEMENS ISI",b4) LT PatientHospitalStatus 1 (0011,"SIEMENS ISI",bc) TM CurrentLocationTime 1 (0011,"SIEMENS ISI",c0) LT PatientInsuranceStatus 1 (0011,"SIEMENS ISI",d0) LT PatientBillingType 1 (0011,"SIEMENS ISI",d2) LT PatientBillingAddress 1 (0031,"SIEMENS ISI",12) LT ExaminationReason 1 (0031,"SIEMENS ISI",30) DA RequestedDate 1 (0031,"SIEMENS ISI",32) TM WorklistRequestStartTime 1 (0031,"SIEMENS ISI",33) TM WorklistRequestEndTime 1 (0031,"SIEMENS ISI",4a) TM RequestedTime 1 (0031,"SIEMENS ISI",80) LT RequestedLocation 1 (0055,"SIEMENS ISI",46) LT CurrentWard 1 (0193,"SIEMENS ISI",02) DS RISKey 1 (0307,"SIEMENS ISI",01) UN RISWorklistIMGEF 1 (0309,"SIEMENS ISI",01) UN RISReportIMGEF 1 (4009,"SIEMENS ISI",01) LT ReportID 1 (4009,"SIEMENS ISI",20) LT ReportStatus 1 (4009,"SIEMENS ISI",30) DA ReportCreationDate 1 (4009,"SIEMENS ISI",70) LT ReportApprovingPhysician 1 (4009,"SIEMENS ISI",e0) LT ReportText 1 (4009,"SIEMENS ISI",e1) LT ReportAuthor 1 (4009,"SIEMENS ISI",e3) LT ReportingRadiologist 1 (0029,"SIEMENS MED DISPLAY",04) LT PhotometricInterpretation 1 (0029,"SIEMENS MED DISPLAY",10) US RowsOfSubmatrix 1 (0029,"SIEMENS MED DISPLAY",11) US ColumnsOfSubmatrix 1 (0029,"SIEMENS MED DISPLAY",20) US Unknown 1 (0029,"SIEMENS MED DISPLAY",21) US Unknown 1 (0029,"SIEMENS MED DISPLAY",50) US OriginOfSubmatrix 1 (0029,"SIEMENS MED DISPLAY",99) LT ShutterType 1 (0029,"SIEMENS MED DISPLAY",a0) US RowsOfRectangularShutter 1 (0029,"SIEMENS MED DISPLAY",a1) US ColumnsOfRectangularShutter 1 (0029,"SIEMENS MED DISPLAY",a2) US OriginOfRectangularShutter 1 (0029,"SIEMENS MED DISPLAY",b0) US RadiusOfCircularShutter 1 (0029,"SIEMENS MED DISPLAY",b2) US OriginOfCircularShutter 1 (0029,"SIEMENS MED DISPLAY",c1) US ContourOfIrregularShutter 1 (0029,"SIEMENS MED HG",10) US ListOfGroupNumbers 1 (0029,"SIEMENS MED HG",15) LT ListOfShadowOwnerCodes 1 (0029,"SIEMENS MED HG",20) US ListOfElementNumbers 1 (0029,"SIEMENS MED HG",30) US ListOfTotalDisplayLength 1 (0029,"SIEMENS MED HG",40) LT ListOfDisplayPrefix 1 (0029,"SIEMENS MED HG",50) LT ListOfDisplayPostfix 1 (0029,"SIEMENS MED HG",60) US ListOfTextPosition 1 (0029,"SIEMENS MED HG",70) LT ListOfTextConcatenation 1 (0029,"SIEMENS MED MG",10) US ListOfGroupNumbers 1 (0029,"SIEMENS MED MG",15) LT ListOfShadowOwnerCodes 1 (0029,"SIEMENS MED MG",20) US ListOfElementNumbers 1 (0029,"SIEMENS MED MG",30) US ListOfTotalDisplayLength 1 (0029,"SIEMENS MED MG",40) LT ListOfDisplayPrefix 1 (0029,"SIEMENS MED MG",50) LT ListOfDisplayPostfix 1 (0029,"SIEMENS MED MG",60) US ListOfTextPosition 1 (0029,"SIEMENS MED MG",70) LT ListOfTextConcatenation 1 (0009,"SIEMENS MED",10) LO RecognitionCode 1 (0009,"SIEMENS MED",30) UL ByteOffsetOfOriginalHeader 1 (0009,"SIEMENS MED",31) UL LengthOfOriginalHeader 1 (0009,"SIEMENS MED",40) UL ByteOffsetOfPixelmatrix 1 (0009,"SIEMENS MED",41) UL LengthOfPixelmatrixInBytes 1 (0009,"SIEMENS MED",50) LT Unknown 1 (0009,"SIEMENS MED",51) LT Unknown 1 (0009,"SIEMENS MED",f5) LT PDMEFIDPlaceholder 1 (0009,"SIEMENS MED",f6) LT PDMDataObjectTypeExtension 1 (0021,"SIEMENS MED",10) DS Zoom 1 (0021,"SIEMENS MED",11) DS Target 2 (0021,"SIEMENS MED",12) IS TubeAngle 1 (0021,"SIEMENS MED",20) US ROIMask 1 (7001,"SIEMENS MED",10) LT Dummy 1 (7003,"SIEMENS MED",10) LT Header 1 (7005,"SIEMENS MED",10) LT Dummy 1 (0029,"SIEMENS MEDCOM HEADER",08) CS MedComHeaderType 1 (0029,"SIEMENS MEDCOM HEADER",09) LO MedComHeaderVersion 1 (0029,"SIEMENS MEDCOM HEADER",10) OB MedComHeaderInfo 1 (0029,"SIEMENS MEDCOM HEADER",20) OB MedComHistoryInformation 1 (0029,"SIEMENS MEDCOM HEADER",31) LO PMTFInformation1 1 (0029,"SIEMENS MEDCOM HEADER",32) UL PMTFInformation2 1 (0029,"SIEMENS MEDCOM HEADER",33) UL PMTFInformation3 1 (0029,"SIEMENS MEDCOM HEADER",34) CS PMTFInformation4 1 (0029,"SIEMENS MEDCOM HEADER",35) UL PMTFInformation5 1 (0029,"SIEMENS MEDCOM HEADER",40) SQ ApplicationHeaderSequence 1 (0029,"SIEMENS MEDCOM HEADER",41) CS ApplicationHeaderType 1 (0029,"SIEMENS MEDCOM HEADER",42) LO ApplicationHeaderID 1 (0029,"SIEMENS MEDCOM HEADER",43) LO ApplicationHeaderVersion 1 (0029,"SIEMENS MEDCOM HEADER",44) OB ApplicationHeaderInfo 1 (0029,"SIEMENS MEDCOM HEADER",50) LO WorkflowControlFlags 8 (0029,"SIEMENS MEDCOM HEADER",51) CS ArchiveManagementFlagKeepOnline 1 (0029,"SIEMENS MEDCOM HEADER",52) CS ArchiveManagementFlagDoNotArchive 1 (0029,"SIEMENS MEDCOM HEADER",53) CS ImageLocationStatus 1 (0029,"SIEMENS MEDCOM HEADER",54) DS EstimatedRetrieveTime 1 (0029,"SIEMENS MEDCOM HEADER",55) DS DataSizeOfRetrievedImages 1 (0029,"SIEMENS MEDCOM HEADER2",60) LO SeriesWorkflowStatus 1 (0029,"SIEMENS MEDCOM OOG",08) CS MEDCOMOOGType 1 (0029,"SIEMENS MEDCOM OOG",09) LO MEDCOMOOGVersion 1 (0029,"SIEMENS MEDCOM OOG",10) OB MEDCOMOOGInfo 1 (0019,"SIEMENS MR VA0 COAD",12) DS MagneticFieldStrength 1 (0019,"SIEMENS MR VA0 COAD",14) DS ADCVoltage 1 (0019,"SIEMENS MR VA0 COAD",16) DS ADCOffset 2 (0019,"SIEMENS MR VA0 COAD",20) DS TransmitterAmplitude 1 (0019,"SIEMENS MR VA0 COAD",21) IS NumberOfTransmitterAmplitudes 1 (0019,"SIEMENS MR VA0 COAD",22) DS TransmitterAttenuator 1 (0019,"SIEMENS MR VA0 COAD",24) DS TransmitterCalibration 1 (0019,"SIEMENS MR VA0 COAD",26) DS TransmitterReference 1 (0019,"SIEMENS MR VA0 COAD",50) DS ReceiverTotalGain 1 (0019,"SIEMENS MR VA0 COAD",51) DS ReceiverAmplifierGain 1 (0019,"SIEMENS MR VA0 COAD",52) DS ReceiverPreamplifierGain 1 (0019,"SIEMENS MR VA0 COAD",54) DS ReceiverCableAttenuation 1 (0019,"SIEMENS MR VA0 COAD",55) DS ReceiverReferenceGain 1 (0019,"SIEMENS MR VA0 COAD",56) DS ReceiverFilterFrequency 1 (0019,"SIEMENS MR VA0 COAD",60) DS ReconstructionScaleFactor 1 (0019,"SIEMENS MR VA0 COAD",62) DS ReferenceScaleFactor 1 (0019,"SIEMENS MR VA0 COAD",70) DS PhaseGradientAmplitude 1 (0019,"SIEMENS MR VA0 COAD",71) DS ReadoutGradientAmplitude 1 (0019,"SIEMENS MR VA0 COAD",72) DS SelectionGradientAmplitude 1 (0019,"SIEMENS MR VA0 COAD",80) DS GradientDelayTime 3 (0019,"SIEMENS MR VA0 COAD",82) DS TotalGradientDelayTime 1 (0019,"SIEMENS MR VA0 COAD",90) LT SensitivityCorrectionLabel 1 (0019,"SIEMENS MR VA0 COAD",91) DS SaturationPhaseEncodingVectorCoronalComponent 6 (0019,"SIEMENS MR VA0 COAD",92) DS SaturationReadoutVectorCoronalComponent 6 (0019,"SIEMENS MR VA0 COAD",a0) US RFWatchdogMask 3 (0019,"SIEMENS MR VA0 COAD",a1) DS EPIReconstructionSlope 1 (0019,"SIEMENS MR VA0 COAD",a2) DS RFPowerErrorIndicator 1 (0019,"SIEMENS MR VA0 COAD",a5) DS SpecificAbsorptionRateWholeBody 3 (0019,"SIEMENS MR VA0 COAD",a6) DS SpecificEnergyDose 3 (0019,"SIEMENS MR VA0 COAD",b0) UL AdjustmentStatusMask 1 (0019,"SIEMENS MR VA0 COAD",c1) DS EPICapacity 6 (0019,"SIEMENS MR VA0 COAD",c2) DS EPIInductance 3 (0019,"SIEMENS MR VA0 COAD",c3) IS EPISwitchConfigurationCode 1-n (0019,"SIEMENS MR VA0 COAD",c4) IS EPISwitchHardwareCode 1-n (0019,"SIEMENS MR VA0 COAD",c5) DS EPISwitchDelayTime 1-n (0019,"SIEMENS MR VA0 COAD",d1) DS FlowSensitivity 1 (0019,"SIEMENS MR VA0 COAD",d2) LT CalculationSubmode 1 (0019,"SIEMENS MR VA0 COAD",d3) DS FieldOfViewRatio 1 (0019,"SIEMENS MR VA0 COAD",d4) IS BaseRawMatrixSize 1 (0019,"SIEMENS MR VA0 COAD",d5) IS 2DOversamplingLines 1 (0019,"SIEMENS MR VA0 COAD",d6) IS 3DPhaseOversamplingPartitions 1 (0019,"SIEMENS MR VA0 COAD",d7) IS EchoLinePosition 1 (0019,"SIEMENS MR VA0 COAD",d8) IS EchoColumnPosition 1 (0019,"SIEMENS MR VA0 COAD",d9) IS LinesPerSegment 1 (0019,"SIEMENS MR VA0 COAD",da) LT PhaseCodingDirection 1 (0019,"SIEMENS MR VA0 GEN",10) DS TotalMeasurementTimeNominal 1 (0019,"SIEMENS MR VA0 GEN",11) DS TotalMeasurementTimeCurrent 1 (0019,"SIEMENS MR VA0 GEN",12) DS StartDelayTime 1 (0019,"SIEMENS MR VA0 GEN",13) DS DwellTime 1 (0019,"SIEMENS MR VA0 GEN",14) IS NumberOfPhases 1 (0019,"SIEMENS MR VA0 GEN",16) UL SequenceControlMask 2 (0019,"SIEMENS MR VA0 GEN",18) UL MeasurementStatusMask 1 (0019,"SIEMENS MR VA0 GEN",20) IS NumberOfFourierLinesNominal 1 (0019,"SIEMENS MR VA0 GEN",21) IS NumberOfFourierLinesCurrent 1 (0019,"SIEMENS MR VA0 GEN",26) IS NumberOfFourierLinesAfterZero 1 (0019,"SIEMENS MR VA0 GEN",28) IS FirstMeasuredFourierLine 1 (0019,"SIEMENS MR VA0 GEN",30) IS AcquisitionColumns 1 (0019,"SIEMENS MR VA0 GEN",31) IS ReconstructionColumns 1 (0019,"SIEMENS MR VA0 GEN",40) IS ArrayCoilElementNumber 1 (0019,"SIEMENS MR VA0 GEN",41) UL ArrayCoilElementSelectMask 1 (0019,"SIEMENS MR VA0 GEN",42) UL ArrayCoilElementDataMask 1 (0019,"SIEMENS MR VA0 GEN",43) IS ArrayCoilElementToADCConnect 1-n (0019,"SIEMENS MR VA0 GEN",44) DS ArrayCoilElementNoiseLevel 1-n (0019,"SIEMENS MR VA0 GEN",45) IS ArrayCoilADCPairNumber 1 (0019,"SIEMENS MR VA0 GEN",46) UL ArrayCoilCombinationMask 1 (0019,"SIEMENS MR VA0 GEN",50) IS NumberOfAverages 1 (0019,"SIEMENS MR VA0 GEN",60) DS FlipAngle 1 (0019,"SIEMENS MR VA0 GEN",70) IS NumberOfPrescans 1 (0019,"SIEMENS MR VA0 GEN",81) LT FilterTypeForRawData 1 (0019,"SIEMENS MR VA0 GEN",82) DS FilterParameterForRawData 1-n (0019,"SIEMENS MR VA0 GEN",83) LT FilterTypeForImageData 1 (0019,"SIEMENS MR VA0 GEN",84) DS FilterParameterForImageData 1-n (0019,"SIEMENS MR VA0 GEN",85) LT FilterTypeForPhaseCorrection 1 (0019,"SIEMENS MR VA0 GEN",86) DS FilterParameterForPhaseCorrection 1-n (0019,"SIEMENS MR VA0 GEN",87) LT NormalizationFilterTypeForImageData 1 (0019,"SIEMENS MR VA0 GEN",88) DS NormalizationFilterParameterForImageData 1-n (0019,"SIEMENS MR VA0 GEN",90) IS NumberOfSaturationRegions 1 (0019,"SIEMENS MR VA0 GEN",91) DS SaturationPhaseEncodingVectorSagittalComponent 6 (0019,"SIEMENS MR VA0 GEN",92) DS SaturationReadoutVectorSagittalComponent 6 (0019,"SIEMENS MR VA0 GEN",93) DS EPIStimulationMonitorMode 1 (0019,"SIEMENS MR VA0 GEN",94) DS ImageRotationAngle 1 (0019,"SIEMENS MR VA0 GEN",96) UL CoilIDMask 3 (0019,"SIEMENS MR VA0 GEN",97) UL CoilClassMask 2 (0019,"SIEMENS MR VA0 GEN",98) DS CoilPosition 3 (0019,"SIEMENS MR VA0 GEN",a0) DS EPIReconstructionPhase 1 (0019,"SIEMENS MR VA0 GEN",a1) DS EPIReconstructionSlope 1 (0021,"SIEMENS MR VA0 GEN",20) IS PhaseCorrectionRowsSequence 1 (0021,"SIEMENS MR VA0 GEN",21) IS PhaseCorrectionColumnsSequence 1 (0021,"SIEMENS MR VA0 GEN",22) IS PhaseCorrectionRowsReconstruction 1 (0021,"SIEMENS MR VA0 GEN",24) IS PhaseCorrectionColumnsReconstruction 1 (0021,"SIEMENS MR VA0 GEN",30) IS NumberOf3DRawPartitionsNominal 1 (0021,"SIEMENS MR VA0 GEN",31) IS NumberOf3DRawPartitionsCurrent 1 (0021,"SIEMENS MR VA0 GEN",34) IS NumberOf3DImagePartitions 1 (0021,"SIEMENS MR VA0 GEN",36) IS Actual3DImagePartitionNumber 1 (0021,"SIEMENS MR VA0 GEN",39) DS SlabThickness 1 (0021,"SIEMENS MR VA0 GEN",40) IS NumberOfSlicesNominal 1 (0021,"SIEMENS MR VA0 GEN",41) IS NumberOfSlicesCurrent 1 (0021,"SIEMENS MR VA0 GEN",42) IS CurrentSliceNumber 1 (0021,"SIEMENS MR VA0 GEN",43) IS CurrentGroupNumber 1 (0021,"SIEMENS MR VA0 GEN",44) DS CurrentSliceDistanceFactor 1 (0021,"SIEMENS MR VA0 GEN",45) IS MIPStartRow 1 (0021,"SIEMENS MR VA0 GEN",46) IS MIPStopRow 1 (0021,"SIEMENS MR VA0 GEN",47) IS MIPStartColumn 1 (0021,"SIEMENS MR VA0 GEN",48) IS MIPStartColumn 1 (0021,"SIEMENS MR VA0 GEN",49) IS MIPStartSlice Name= 1 (0021,"SIEMENS MR VA0 GEN",4a) IS MIPStartSlice 1 (0021,"SIEMENS MR VA0 GEN",4f) LT OrderofSlices 1 (0021,"SIEMENS MR VA0 GEN",50) US SignalMask 1 (0021,"SIEMENS MR VA0 GEN",52) DS DelayAfterTrigger 1 (0021,"SIEMENS MR VA0 GEN",53) IS RRInterval 1 (0021,"SIEMENS MR VA0 GEN",54) DS NumberOfTriggerPulses 1 (0021,"SIEMENS MR VA0 GEN",56) DS RepetitionTimeEffective 1 (0021,"SIEMENS MR VA0 GEN",57) LT GatePhase 1 (0021,"SIEMENS MR VA0 GEN",58) DS GateThreshold 1 (0021,"SIEMENS MR VA0 GEN",59) DS GatedRatio 1 (0021,"SIEMENS MR VA0 GEN",60) IS NumberOfInterpolatedImages 1 (0021,"SIEMENS MR VA0 GEN",70) IS NumberOfEchoes 1 (0021,"SIEMENS MR VA0 GEN",72) DS SecondEchoTime 1 (0021,"SIEMENS MR VA0 GEN",73) DS SecondRepetitionTime 1 (0021,"SIEMENS MR VA0 GEN",80) IS CardiacCode 1 (0021,"SIEMENS MR VA0 GEN",91) DS SaturationPhaseEncodingVectorTransverseComponent 6 (0021,"SIEMENS MR VA0 GEN",92) DS SaturationReadoutVectorTransverseComponent 6 (0021,"SIEMENS MR VA0 GEN",93) DS EPIChangeValueOfMagnitude 1 (0021,"SIEMENS MR VA0 GEN",94) DS EPIChangeValueOfXComponent 1 (0021,"SIEMENS MR VA0 GEN",95) DS EPIChangeValueOfYComponent 1 (0021,"SIEMENS MR VA0 GEN",96) DS EPIChangeValueOfZComponent 1 (0021,"SIEMENS MR VA0 RAW",00) LT SequenceType 1 (0021,"SIEMENS MR VA0 RAW",01) IS VectorSizeOriginal 1 (0021,"SIEMENS MR VA0 RAW",02) IS VectorSizeExtended 1 (0021,"SIEMENS MR VA0 RAW",03) DS AcquiredSpectralRange 1 (0021,"SIEMENS MR VA0 RAW",04) DS VOIPosition 3 (0021,"SIEMENS MR VA0 RAW",05) DS VOISize 3 (0021,"SIEMENS MR VA0 RAW",06) IS CSIMatrixSizeOriginal 3 (0021,"SIEMENS MR VA0 RAW",07) IS CSIMatrixSizeExtended 3 (0021,"SIEMENS MR VA0 RAW",08) DS SpatialGridShift 3 (0021,"SIEMENS MR VA0 RAW",09) DS SignalLimitsMinimum 1 (0021,"SIEMENS MR VA0 RAW",10) DS SignalLimitsMaximum 1 (0021,"SIEMENS MR VA0 RAW",11) DS SpecInfoMask 1 (0021,"SIEMENS MR VA0 RAW",12) DS EPITimeRateOfChangeOfMagnitude 1 (0021,"SIEMENS MR VA0 RAW",13) DS EPITimeRateOfChangeOfXComponent 1 (0021,"SIEMENS MR VA0 RAW",14) DS EPITimeRateOfChangeOfYComponent 1 (0021,"SIEMENS MR VA0 RAW",15) DS EPITimeRateOfChangeOfZComponent 1 (0021,"SIEMENS MR VA0 RAW",16) DS EPITimeRateOfChangeLegalLimit1 1 (0021,"SIEMENS MR VA0 RAW",17) DS EPIOperationModeFlag 1 (0021,"SIEMENS MR VA0 RAW",18) DS EPIFieldCalculationSafetyFactor 1 (0021,"SIEMENS MR VA0 RAW",19) DS EPILegalLimit1OfChangeValue 1 (0021,"SIEMENS MR VA0 RAW",20) DS EPILegalLimit2OfChangeValue 1 (0021,"SIEMENS MR VA0 RAW",21) DS EPIRiseTime 1 (0021,"SIEMENS MR VA0 RAW",30) DS ArrayCoilADCOffset 16 (0021,"SIEMENS MR VA0 RAW",31) DS ArrayCoilPreamplifierGain 16 (0021,"SIEMENS MR VA0 RAW",50) LT SaturationType 1 (0021,"SIEMENS MR VA0 RAW",51) DS SaturationNormalVector 3 (0021,"SIEMENS MR VA0 RAW",52) DS SaturationPositionVector 3 (0021,"SIEMENS MR VA0 RAW",53) DS SaturationThickness 6 (0021,"SIEMENS MR VA0 RAW",54) DS SaturationWidth 6 (0021,"SIEMENS MR VA0 RAW",55) DS SaturationDistance 6 (7fe3,"SIEMENS NUMARIS II",00) LT ImageGraphicsFormatCode 1 (7fe3,"SIEMENS NUMARIS II",10) OB ImageGraphics 1 (7fe3,"SIEMENS NUMARIS II",20) OB ImageGraphicsDummy 1 (0011,"SIEMENS RA GEN",20) SL FluoroTimer 1 (0011,"SIEMENS RA GEN",25) SL PtopDoseAreaProduct 1 (0011,"SIEMENS RA GEN",26) SL PtopTotalSkinDose 1 (0011,"SIEMENS RA GEN",30) LT Unknown 1 (0011,"SIEMENS RA GEN",35) LO PatientInitialPuckCounter 1 (0011,"SIEMENS RA GEN",40) SS SPIDataObjectType 1 (0019,"SIEMENS RA GEN",15) LO AcquiredPlane 1 (0019,"SIEMENS RA GEN",1f) SS DefaultTableIsoCenterHeight 1 (0019,"SIEMENS RA GEN",20) SL SceneFlag 1 (0019,"SIEMENS RA GEN",22) SL RefPhotofileFlag 1 (0019,"SIEMENS RA GEN",24) LO SceneName 1 (0019,"SIEMENS RA GEN",26) SS AcquisitionIndex 1 (0019,"SIEMENS RA GEN",28) SS MixedPulseMode 1 (0019,"SIEMENS RA GEN",2a) SS NoOfPositions 1 (0019,"SIEMENS RA GEN",2c) SS NoOfPhases 1 (0019,"SIEMENS RA GEN",2e) SS FrameRateForPositions 1-n (0019,"SIEMENS RA GEN",30) SS NoOfFramesForPositions 1-n (0019,"SIEMENS RA GEN",32) SS SteppingDirection 1 (0019,"SIEMENS RA GEN",34) US Unknown 1 (0019,"SIEMENS RA GEN",36) US Unknown 1 (0019,"SIEMENS RA GEN",38) US Unknown 1 (0019,"SIEMENS RA GEN",3a) US Unknown 1 (0019,"SIEMENS RA GEN",3c) US Unknown 1 (0019,"SIEMENS RA GEN",3e) US Unknown 1 (0019,"SIEMENS RA GEN",40) US Unknown 1 (0019,"SIEMENS RA GEN",42) US Unknown 1 (0019,"SIEMENS RA GEN",44) SS ImageTransferDelay 1 (0019,"SIEMENS RA GEN",46) SL InversFlag 1 (0019,"SIEMENS RA GEN",48) US Unknown 1 (0019,"SIEMENS RA GEN",4a) US Unknown 1 (0019,"SIEMENS RA GEN",4c) SS BlankingCircleDiameter 1 (0019,"SIEMENS RA GEN",50) SL StandDataValid 1 (0019,"SIEMENS RA GEN",52) SS TableTilt 1 (0019,"SIEMENS RA GEN",54) SS TableAxisRotation 1 (0019,"SIEMENS RA GEN",56) SS TableLongitudalPosition 1 (0019,"SIEMENS RA GEN",58) SS TableSideOffset 1 (0019,"SIEMENS RA GEN",5a) SS TableIsoCenterHeight 1 (0019,"SIEMENS RA GEN",5c) UN Unknown 1 (0019,"SIEMENS RA GEN",5e) SL CollimationDataValid 1 (0019,"SIEMENS RA GEN",60) SL PeriSequenceNo 1 (0019,"SIEMENS RA GEN",62) SL PeriTotalScenes 1 (0019,"SIEMENS RA GEN",64) SL PeriOverlapTop 1 (0019,"SIEMENS RA GEN",66) SL PeriOverlapBottom 1 (0019,"SIEMENS RA GEN",68) SL RawImageNumber 1 (0019,"SIEMENS RA GEN",6a) SL XRayDataValid 1 (0019,"SIEMENS RA GEN",70) US Unknown 1-n (0019,"SIEMENS RA GEN",72) US Unknown 1-n (0019,"SIEMENS RA GEN",74) US Unknown 1-n (0019,"SIEMENS RA GEN",76) SL FillingAverageFactor 1 (0019,"SIEMENS RA GEN",78) US Unknown 1-n (0019,"SIEMENS RA GEN",7a) US Unknown 1-n (0019,"SIEMENS RA GEN",7c) US Unknown 1-n (0019,"SIEMENS RA GEN",7e) US Unknown 1-n (0019,"SIEMENS RA GEN",80) US Unknown 1-n (0019,"SIEMENS RA GEN",82) US Unknown 1-n (0019,"SIEMENS RA GEN",84) US Unknown 1-n (0019,"SIEMENS RA GEN",86) US Unknown 1-n (0019,"SIEMENS RA GEN",88) US Unknown 1-n (0019,"SIEMENS RA GEN",8a) US Unknown 1-n (0019,"SIEMENS RA GEN",8c) US Unknown 1-n (0019,"SIEMENS RA GEN",8e) US Unknown 1-n (0019,"SIEMENS RA GEN",92) US Unknown 1-n (0019,"SIEMENS RA GEN",94) US Unknown 1-n (0019,"SIEMENS RA GEN",96) US Unknown 1-n (0019,"SIEMENS RA GEN",98) US Unknown 1-n (0019,"SIEMENS RA GEN",9a) US Unknown 1-n (0019,"SIEMENS RA GEN",9c) SL IntensifierLevelCalibrationFactor 1 (0019,"SIEMENS RA GEN",9e) SL NativeReviewFlag 1 (0019,"SIEMENS RA GEN",a2) SL SceneNumber 1 (0019,"SIEMENS RA GEN",a4) SS AcquisitionMode 1 (0019,"SIEMENS RA GEN",a5) SS AcquisitonFrameRate 1 (0019,"SIEMENS RA GEN",a6) SL ECGFlag 1 (0019,"SIEMENS RA GEN",a7) SL AdditionalSceneData 1 (0019,"SIEMENS RA GEN",a8) SL FileCopyFlag 1 (0019,"SIEMENS RA GEN",a9) SL PhlebovisionFlag 1 (0019,"SIEMENS RA GEN",aa) SL Co2Flag 1 (0019,"SIEMENS RA GEN",ab) SS MaxSpeed 1 (0019,"SIEMENS RA GEN",ac) SS StepWidth 1 (0019,"SIEMENS RA GEN",ad) SL DigitalAcquisitionZoom 1 (0019,"SIEMENS RA GEN",ff) SS Internal 1-n (0021,"SIEMENS RA GEN",15) SS ImagesInStudy 1 (0021,"SIEMENS RA GEN",20) SS ScenesInStudy 1 (0021,"SIEMENS RA GEN",25) SS ImagesInPhotofile 1 (0021,"SIEMENS RA GEN",27) SS PlaneBImagesExist 1 (0021,"SIEMENS RA GEN",28) SS NoOf2MBChunks 1 (0021,"SIEMENS RA GEN",30) SS ImagesInAllScenes 1 (0021,"SIEMENS RA GEN",40) SS ArchiveSWInternalVersion 1 (0011,"SIEMENS RA PLANE A",28) SL FluoroTimerA 1 (0011,"SIEMENS RA PLANE A",29) SL FluoroSkinDoseA 1 (0011,"SIEMENS RA PLANE A",2a) SL TotalSkinDoseA 1 (0011,"SIEMENS RA PLANE A",2b) SL FluoroDoseAreaProductA 1 (0011,"SIEMENS RA PLANE A",2c) SL TotalDoseAreaProductA 1 (0019,"SIEMENS RA PLANE A",15) LT OfflineUID 1 (0019,"SIEMENS RA PLANE A",18) SS Internal 1 (0019,"SIEMENS RA PLANE A",19) SS Internal 1 (0019,"SIEMENS RA PLANE A",1a) SS Internal 1 (0019,"SIEMENS RA PLANE A",1b) SS Internal 1 (0019,"SIEMENS RA PLANE A",1c) SS Internal 1 (0019,"SIEMENS RA PLANE A",1d) SS Internal 1 (0019,"SIEMENS RA PLANE A",1e) SS Internal 1 (0019,"SIEMENS RA PLANE A",1f) SS Internal 1-n (0019,"SIEMENS RA PLANE A",20) SS SystemCalibFactorPlaneA 1 (0019,"SIEMENS RA PLANE A",22) SS XRayParameterSetNo 1 (0019,"SIEMENS RA PLANE A",24) SS XRaySystem 1 (0019,"SIEMENS RA PLANE A",26) US Unknown 1 (0019,"SIEMENS RA PLANE A",28) SS AcquiredDisplayMode 1 (0019,"SIEMENS RA PLANE A",2a) SS AcquisitionDelay 1 (0019,"SIEMENS RA PLANE A",2c) US Unknown 1 (0019,"SIEMENS RA PLANE A",2e) SS MaxFramesLimit 1 (0019,"SIEMENS RA PLANE A",30) US MaximumFrameSizeNIU 1 (0019,"SIEMENS RA PLANE A",32) SS SubtractedFilterType 1 (0019,"SIEMENS RA PLANE A",34) SS FilterFactorNative 1 (0019,"SIEMENS RA PLANE A",36) SS AnatomicBackgroundFactor 1 (0019,"SIEMENS RA PLANE A",38) SS WindowUpperLimitNative 1 (0019,"SIEMENS RA PLANE A",3a) SS WindowLowerLimitNative 1 (0019,"SIEMENS RA PLANE A",3c) SS WindowBrightnessPhase1 1 (0019,"SIEMENS RA PLANE A",3e) SS WindowBrightnessPhase2 1 (0019,"SIEMENS RA PLANE A",40) SS WindowContrastPhase1 1 (0019,"SIEMENS RA PLANE A",42) SS WindowContrastPhase2 1 (0019,"SIEMENS RA PLANE A",44) SS FilterFactorSub 1 (0019,"SIEMENS RA PLANE A",46) SS PeakOpacified 1 (0019,"SIEMENS RA PLANE A",48) SL MaskFrame 1 (0019,"SIEMENS RA PLANE A",4a) SL BIHFrame 1 (0019,"SIEMENS RA PLANE A",4c) SS CentBeamAngulationCaudCran 1 (0019,"SIEMENS RA PLANE A",4e) SS CentBeamAngulationLRAnterior 1 (0019,"SIEMENS RA PLANE A",50) SS LongitudinalPosition 1 (0019,"SIEMENS RA PLANE A",52) SS SideOffset 1 (0019,"SIEMENS RA PLANE A",54) SS IsoCenterHeight 1 (0019,"SIEMENS RA PLANE A",56) SS ImageTwist 1 (0019,"SIEMENS RA PLANE A",58) SS SourceImageDistance 1 (0019,"SIEMENS RA PLANE A",5a) SS MechanicalMagnificationFactor 1 (0019,"SIEMENS RA PLANE A",5c) SL CalibrationFlag 1 (0019,"SIEMENS RA PLANE A",5e) SL CalibrationAngleCranCaud 1 (0019,"SIEMENS RA PLANE A",60) SL CalibrationAngleRAOLAO 1 (0019,"SIEMENS RA PLANE A",62) SL CalibrationTableToFloorDist 1 (0019,"SIEMENS RA PLANE A",64) SL CalibrationIsocenterToFloorDist 1 (0019,"SIEMENS RA PLANE A",66) SL CalibrationIsocenterToSourceDist 1 (0019,"SIEMENS RA PLANE A",68) SL CalibrationSourceToII 1 (0019,"SIEMENS RA PLANE A",6a) SL CalibrationIIZoom 1 (0019,"SIEMENS RA PLANE A",6c) SL CalibrationIIField 1 (0019,"SIEMENS RA PLANE A",6e) SL CalibrationFactor 1 (0019,"SIEMENS RA PLANE A",70) SL CalibrationObjectToImageDistance 1 (0019,"SIEMENS RA PLANE A",72) SL CalibrationSystemFactor 1-n (0019,"SIEMENS RA PLANE A",74) SL CalibrationSystemCorrection 1-n (0019,"SIEMENS RA PLANE A",76) SL CalibrationSystemIIFormats 1-n (0019,"SIEMENS RA PLANE A",78) SL CalibrationGantryDataValid 1 (0019,"SIEMENS RA PLANE A",7a) SS CollimatorSquareBreadth 1 (0019,"SIEMENS RA PLANE A",7c) SS CollimatorSquareHeight 1 (0019,"SIEMENS RA PLANE A",7e) SS CollimatorSquareDiameter 1 (0019,"SIEMENS RA PLANE A",80) SS CollimaterFingerTurnAngle 1 (0019,"SIEMENS RA PLANE A",82) SS CollimaterFingerPosition 1 (0019,"SIEMENS RA PLANE A",84) SS CollimaterDiaphragmTurnAngle 1 (0019,"SIEMENS RA PLANE A",86) SS CollimaterDiaphragmPosition1 1 (0019,"SIEMENS RA PLANE A",88) SS CollimaterDiaphragmPosition2 1 (0019,"SIEMENS RA PLANE A",8a) SS CollimaterDiaphragmMode 1 (0019,"SIEMENS RA PLANE A",8c) SS CollimaterBeamLimitBreadth 1 (0019,"SIEMENS RA PLANE A",8e) SS CollimaterBeamLimitHeight 1 (0019,"SIEMENS RA PLANE A",90) SS CollimaterBeamLimitDiameter 1 (0019,"SIEMENS RA PLANE A",92) SS X-RayControlMOde 1 (0019,"SIEMENS RA PLANE A",94) SS X-RaySystem 1 (0019,"SIEMENS RA PLANE A",96) SS FocalSpot 1 (0019,"SIEMENS RA PLANE A",98) SS ExposureControl 1 (0019,"SIEMENS RA PLANE A",9a) SL XRayVoltage 1 (0019,"SIEMENS RA PLANE A",9c) SL XRayCurrent 1 (0019,"SIEMENS RA PLANE A",9e) SL XRayCurrentTimeProduct 1 (0019,"SIEMENS RA PLANE A",a0) SL XRayPulseTime 1 (0019,"SIEMENS RA PLANE A",a2) SL XRaySceneTimeFluoroClock 1 (0019,"SIEMENS RA PLANE A",a4) SS MaximumPulseRate 1 (0019,"SIEMENS RA PLANE A",a6) SS PulsesPerScene 1 (0019,"SIEMENS RA PLANE A",a8) SL DoseAreaProductOfScene 1 (0019,"SIEMENS RA PLANE A",aa) SS Dose 1 (0019,"SIEMENS RA PLANE A",ac) SS DoseRate 1 (0019,"SIEMENS RA PLANE A",ae) SL IIToCoverDistance 1 (0019,"SIEMENS RA PLANE A",b0) SS LastFramePhase1 1 (0019,"SIEMENS RA PLANE A",b1) SS FrameRatePhase1 1 (0019,"SIEMENS RA PLANE A",b2) SS LastFramePhase2 1 (0019,"SIEMENS RA PLANE A",b3) SS FrameRatePhase2 1 (0019,"SIEMENS RA PLANE A",b4) SS LastFramePhase3 1 (0019,"SIEMENS RA PLANE A",b5) SS FrameRatePhase3 1 (0019,"SIEMENS RA PLANE A",b6) SS LastFramePhase4 1 (0019,"SIEMENS RA PLANE A",b7) SS FrameRatePhase4 1 (0019,"SIEMENS RA PLANE A",b8) SS GammaOfNativeImage 1 (0019,"SIEMENS RA PLANE A",b9) SS GammaOfTVSystem 1 (0019,"SIEMENS RA PLANE A",bb) SL PixelshiftX 1 (0019,"SIEMENS RA PLANE A",bc) SL PixelshiftY 1 (0019,"SIEMENS RA PLANE A",bd) SL MaskAverageFactor 1 (0019,"SIEMENS RA PLANE A",be) SL BlankingCircleFlag 1 (0019,"SIEMENS RA PLANE A",bf) SL CircleRowStart 1 (0019,"SIEMENS RA PLANE A",c0) SL CircleRowEnd 1 (0019,"SIEMENS RA PLANE A",c1) SL CircleColumnStart 1 (0019,"SIEMENS RA PLANE A",c2) SL CircleColumnEnd 1 (0019,"SIEMENS RA PLANE A",c3) SL CircleDiameter 1 (0019,"SIEMENS RA PLANE A",c4) SL RectangularCollimaterFlag 1 (0019,"SIEMENS RA PLANE A",c5) SL RectangleRowStart 1 (0019,"SIEMENS RA PLANE A",c6) SL RectangleRowEnd 1 (0019,"SIEMENS RA PLANE A",c7) SL RectangleColumnStart 1 (0019,"SIEMENS RA PLANE A",c8) SL RectangleColumnEnd 1 (0019,"SIEMENS RA PLANE A",c9) SL RectangleAngulation 1 (0019,"SIEMENS RA PLANE A",ca) SL IrisCollimatorFlag 1 (0019,"SIEMENS RA PLANE A",cb) SL IrisRowStart 1 (0019,"SIEMENS RA PLANE A",cc) SL IrisRowEnd 1 (0019,"SIEMENS RA PLANE A",cd) SL IrisColumnStart 1 (0019,"SIEMENS RA PLANE A",ce) SL IrisColumnEnd 1 (0019,"SIEMENS RA PLANE A",cf) SL IrisAngulation 1 (0019,"SIEMENS RA PLANE A",d1) SS NumberOfFramesPlane 1 (0019,"SIEMENS RA PLANE A",d2) SS Internal 1 (0019,"SIEMENS RA PLANE A",d3) SS Internal 1 (0019,"SIEMENS RA PLANE A",d4) SS Internal 1 (0019,"SIEMENS RA PLANE A",d5) SS Internal 1 (0019,"SIEMENS RA PLANE A",d6) SS Internal 1-n (0019,"SIEMENS RA PLANE A",d7) SS Internal 1-n (0019,"SIEMENS RA PLANE A",d8) SS Internal 1 (0019,"SIEMENS RA PLANE A",d9) SS Internal 1 (0019,"SIEMENS RA PLANE A",da) SS Internal 1 (0019,"SIEMENS RA PLANE A",db) SS Internal 1 (0019,"SIEMENS RA PLANE A",dc) SS Internal 1 (0019,"SIEMENS RA PLANE A",dd) SL AnatomicBackground 1 (0019,"SIEMENS RA PLANE A",de) SL AutoWindowBase 1-n (0019,"SIEMENS RA PLANE A",df) SS Internal 1 (0019,"SIEMENS RA PLANE A",e0) SL Internal 1 (0011,"SIEMENS RA PLANE B",28) SL FluoroTimerB 1 (0011,"SIEMENS RA PLANE B",29) SL FluoroSkinDoseB 1 (0011,"SIEMENS RA PLANE B",2a) SL TotalSkinDoseB 1 (0011,"SIEMENS RA PLANE B",2b) SL FluoroDoseAreaProductB 1 (0011,"SIEMENS RA PLANE B",2c) SL TotalDoseAreaProductB 1 (0019,"SIEMENS RA PLANE B",18) SS Internal 1 (0019,"SIEMENS RA PLANE B",19) SS Internal 1 (0019,"SIEMENS RA PLANE B",1a) SS Internal 1 (0019,"SIEMENS RA PLANE B",1b) SS Internal 1 (0019,"SIEMENS RA PLANE B",1c) SS Internal 1 (0019,"SIEMENS RA PLANE B",1d) SS Internal 1 (0019,"SIEMENS RA PLANE B",1e) SS Internal 1 (0019,"SIEMENS RA PLANE B",1f) SS Internal 1 (0019,"SIEMENS RA PLANE B",20) SL SystemCalibFactorPlaneB 1-n (0019,"SIEMENS RA PLANE B",22) US Unknown 1 (0019,"SIEMENS RA PLANE B",24) US Unknown 1 (0019,"SIEMENS RA PLANE B",26) US Unknown 1 (0019,"SIEMENS RA PLANE B",28) US Unknown 1 (0019,"SIEMENS RA PLANE B",2a) US Unknown 1 (0019,"SIEMENS RA PLANE B",2c) US Unknown 1 (0019,"SIEMENS RA PLANE B",2e) US Unknown 1 (0019,"SIEMENS RA PLANE B",30) US Unknown 1 (0019,"SIEMENS RA PLANE B",32) US Unknown 1 (0019,"SIEMENS RA PLANE B",34) US Unknown 1 (0019,"SIEMENS RA PLANE B",36) US Unknown 1 (0019,"SIEMENS RA PLANE B",38) US Unknown 1 (0019,"SIEMENS RA PLANE B",3a) US Unknown 1 (0019,"SIEMENS RA PLANE B",3c) US Unknown 1 (0019,"SIEMENS RA PLANE B",3e) US Unknown 1 (0019,"SIEMENS RA PLANE B",40) US Unknown 1 (0019,"SIEMENS RA PLANE B",42) US Unknown 1 (0019,"SIEMENS RA PLANE B",44) US Unknown 1 (0019,"SIEMENS RA PLANE B",46) US Unknown 1 (0019,"SIEMENS RA PLANE B",48) US Unknown 1 (0019,"SIEMENS RA PLANE B",4a) US Unknown 1-n (0019,"SIEMENS RA PLANE B",4c) US Unknown 1-n (0019,"SIEMENS RA PLANE B",4e) US Unknown 1-n (0019,"SIEMENS RA PLANE B",50) US Unknown 1 (0019,"SIEMENS RA PLANE B",52) US Unknown 1 (0019,"SIEMENS RA PLANE B",54) US Unknown 1 (0019,"SIEMENS RA PLANE B",56) US Unknown 1 (0019,"SIEMENS RA PLANE B",58) US Unknown 1 (0019,"SIEMENS RA PLANE B",5a) US Unknown 1 (0019,"SIEMENS RA PLANE B",5c) US Unknown 1-n (0019,"SIEMENS RA PLANE B",5e) US Unknown 1-n (0019,"SIEMENS RA PLANE B",60) US Unknown 1-n (0019,"SIEMENS RA PLANE B",62) US Unknown 1-n (0019,"SIEMENS RA PLANE B",64) US Unknown 1-n (0019,"SIEMENS RA PLANE B",66) US Unknown 1-n (0019,"SIEMENS RA PLANE B",68) US Unknown 1-n (0019,"SIEMENS RA PLANE B",6a) US Unknown 1-n (0019,"SIEMENS RA PLANE B",6c) US Unknown 1-n (0019,"SIEMENS RA PLANE B",6e) US Unknown 1-n (0019,"SIEMENS RA PLANE B",70) US Unknown 1-n (0019,"SIEMENS RA PLANE B",72) UN Unknown 1 (0019,"SIEMENS RA PLANE B",74) UN Unknown 1 (0019,"SIEMENS RA PLANE B",76) UN Unknown 1 (0019,"SIEMENS RA PLANE B",78) US Unknown 1-n (0019,"SIEMENS RA PLANE B",7a) US Unknown 1 (0019,"SIEMENS RA PLANE B",7c) US Unknown 1 (0019,"SIEMENS RA PLANE B",7e) US Unknown 1 (0019,"SIEMENS RA PLANE B",80) US Unknown 1 (0019,"SIEMENS RA PLANE B",82) US Unknown 1 (0019,"SIEMENS RA PLANE B",84) US Unknown 1 (0019,"SIEMENS RA PLANE B",86) US Unknown 1 (0019,"SIEMENS RA PLANE B",88) US Unknown 1 (0019,"SIEMENS RA PLANE B",8a) US Unknown 1 (0019,"SIEMENS RA PLANE B",8c) US Unknown 1 (0019,"SIEMENS RA PLANE B",8e) US Unknown 1 (0019,"SIEMENS RA PLANE B",90) US Unknown 1 (0019,"SIEMENS RA PLANE B",92) US Unknown 1 (0019,"SIEMENS RA PLANE B",94) US Unknown 1 (0019,"SIEMENS RA PLANE B",96) US Unknown 1 (0019,"SIEMENS RA PLANE B",98) US Unknown 1 (0019,"SIEMENS RA PLANE B",9a) US Unknown 1-n (0019,"SIEMENS RA PLANE B",9c) US Unknown 1-n (0019,"SIEMENS RA PLANE B",9e) US Unknown 1-n (0019,"SIEMENS RA PLANE B",a0) US Unknown 1-n (0019,"SIEMENS RA PLANE B",a2) US Unknown 1-n (0019,"SIEMENS RA PLANE B",a4) US Unknown 1 (0019,"SIEMENS RA PLANE B",a6) US Unknown 1 (0019,"SIEMENS RA PLANE B",a8) US Unknown 1-n (0019,"SIEMENS RA PLANE B",aa) US Unknown 1 (0019,"SIEMENS RA PLANE B",ac) US Unknown 1 (0011,"SIEMENS RIS",10) LT PatientUID 1 (0011,"SIEMENS RIS",11) LT PatientID 1 (0011,"SIEMENS RIS",20) DA PatientRegistrationDate 1 (0011,"SIEMENS RIS",21) TM PatientRegistrationTime 1 (0011,"SIEMENS RIS",30) LT PatientnameRIS 1 (0011,"SIEMENS RIS",31) LT PatientprenameRIS 1 (0011,"SIEMENS RIS",40) LT PatientHospitalStatus 1 (0011,"SIEMENS RIS",41) LT MedicalAlerts 1 (0011,"SIEMENS RIS",42) LT ContrastAllergies 1 (0031,"SIEMENS RIS",10) LT RequestUID 1 (0031,"SIEMENS RIS",45) LT RequestingPhysician 1 (0031,"SIEMENS RIS",50) LT RequestedPhysician 1 (0033,"SIEMENS RIS",10) LT PatientStudyUID 1 (0021,"SIEMENS SMS-AX ACQ 1.0",00) US AcquisitionType 1 (0021,"SIEMENS SMS-AX ACQ 1.0",01) US AcquisitionMode 1 (0021,"SIEMENS SMS-AX ACQ 1.0",02) US FootswitchIndex 1 (0021,"SIEMENS SMS-AX ACQ 1.0",03) US AcquisitionRoom 1 (0021,"SIEMENS SMS-AX ACQ 1.0",04) SL CurrentTimeProduct 1 (0021,"SIEMENS SMS-AX ACQ 1.0",05) SL Dose 1 (0021,"SIEMENS SMS-AX ACQ 1.0",06) SL SkinDosePercent 1 (0021,"SIEMENS SMS-AX ACQ 1.0",07) SL SkinDoseAccumulation 1 (0021,"SIEMENS SMS-AX ACQ 1.0",08) SL SkinDoseRate 1 (0021,"SIEMENS SMS-AX ACQ 1.0",0A) UL CopperFilter 1 (0021,"SIEMENS SMS-AX ACQ 1.0",0B) US MeasuringField 1 (0021,"SIEMENS SMS-AX ACQ 1.0",0C) SS PostBlankingCircle 3 (0021,"SIEMENS SMS-AX ACQ 1.0",0D) SS DynaAngles 2-2n (0021,"SIEMENS SMS-AX ACQ 1.0",0E) SS TotalSteps 1 (0021,"SIEMENS SMS-AX ACQ 1.0",0F) SL DynaXRayInfo 3-3n (0021,"SIEMENS SMS-AX ACQ 1.0",10) US ModalityLUTInputGamma 1 (0021,"SIEMENS SMS-AX ACQ 1.0",11) US ModalityLUTOutputGamma 1 (0021,"SIEMENS SMS-AX ACQ 1.0",12) OB SH_STPAR 1-n (0021,"SIEMENS SMS-AX ACQ 1.0",13) US AcquisitionZoom 1 (0021,"SIEMENS SMS-AX ACQ 1.0",14) SS DynaAngulationStepWidth 1 (0021,"SIEMENS SMS-AX ACQ 1.0",15) US Harmonization 1 (0021,"SIEMENS SMS-AX ACQ 1.0",16) US DRSingleFlag 1 (0021,"SIEMENS SMS-AX ACQ 1.0",17) SL SourceToIsocenter 1 (0021,"SIEMENS SMS-AX ACQ 1.0",18) US PressureData 1 (0021,"SIEMENS SMS-AX ACQ 1.0",19) SL ECGIndexArray 1 (0021,"SIEMENS SMS-AX ACQ 1.0",1A) US FDFlag 1 (0021,"SIEMENS SMS-AX ACQ 1.0",1B) OB SH_ZOOM 1 (0021,"SIEMENS SMS-AX ACQ 1.0",1C) OB SH_COLPAR 1 (0021,"SIEMENS SMS-AX ACQ 1.0",1D) US K_Factor 1 (0021,"SIEMENS SMS-AX ACQ 1.0",1E) US EVE 8 (0021,"SIEMENS SMS-AX ACQ 1.0",1F) SL TotalSceneTime 1 (0021,"SIEMENS SMS-AX ACQ 1.0",20) US RestoreFlag 1 (0021,"SIEMENS SMS-AX ACQ 1.0",21) US StandMovementFlag 1 (0021,"SIEMENS SMS-AX ACQ 1.0",22) US FDRows 1 (0021,"SIEMENS SMS-AX ACQ 1.0",23) US FDColumns 1 (0021,"SIEMENS SMS-AX ACQ 1.0",24) US TableMovementFlag 1 (0021,"SIEMENS SMS-AX ACQ 1.0",25) LO OriginalOrganProgramName 1 (0021,"SIEMENS SMS-AX ACQ 1.0",26) DS CrispyXPIFilter 1 (0025,"SIEMENS SMS-AX ORIGINAL IMAGE INFO 1.0",00) US ViewNative 1 (0025,"SIEMENS SMS-AX ORIGINAL IMAGE INFO 1.0",01) US OriginalSeriesNumber 1 (0025,"SIEMENS SMS-AX ORIGINAL IMAGE INFO 1.0",02) US OriginalImageNumber 1 (0025,"SIEMENS SMS-AX ORIGINAL IMAGE INFO 1.0",03) US WinCenter 1 (0025,"SIEMENS SMS-AX ORIGINAL IMAGE INFO 1.0",04) US WinWidth 1 (0025,"SIEMENS SMS-AX ORIGINAL IMAGE INFO 1.0",05) US WinBrightness 1 (0025,"SIEMENS SMS-AX ORIGINAL IMAGE INFO 1.0",06) US WinContrast 1 (0025,"SIEMENS SMS-AX ORIGINAL IMAGE INFO 1.0",07) US OriginalFrameNumber 1 (0025,"SIEMENS SMS-AX ORIGINAL IMAGE INFO 1.0",08) US OriginalMaskFrameNumber 1 (0025,"SIEMENS SMS-AX ORIGINAL IMAGE INFO 1.0",09) US Opac 1 (0025,"SIEMENS SMS-AX ORIGINAL IMAGE INFO 1.0",0A) US OriginalNumberOfFrames 1 (0025,"SIEMENS SMS-AX ORIGINAL IMAGE INFO 1.0",0B) DS OriginalSceneDuration 1 (0025,"SIEMENS SMS-AX ORIGINAL IMAGE INFO 1.0",0C) LO IdentifierLOID 1 (0025,"SIEMENS SMS-AX ORIGINAL IMAGE INFO 1.0",0D) SS OriginalSceneVFRInfo 1-n (0025,"SIEMENS SMS-AX ORIGINAL IMAGE INFO 1.0",0E) SS OriginalFrameECGPosition 1 (0025,"SIEMENS SMS-AX ORIGINAL IMAGE INFO 1.0",0F) SS OriginalECG1stFrameOffset_retired 1 (0025,"SIEMENS SMS-AX ORIGINAL IMAGE INFO 1.0",10) SS ZoomFlag 1 (0025,"SIEMENS SMS-AX ORIGINAL IMAGE INFO 1.0",11) US Flex 1 (0025,"SIEMENS SMS-AX ORIGINAL IMAGE INFO 1.0",12) US NumberOfMaskFrames 1 (0025,"SIEMENS SMS-AX ORIGINAL IMAGE INFO 1.0",13) US NumberOfFillFrames 1 (0025,"SIEMENS SMS-AX ORIGINAL IMAGE INFO 1.0",14) US SeriesNumber 1 (0025,"SIEMENS SMS-AX ORIGINAL IMAGE INFO 1.0",15) IS ImageNumber 1 (0023,"SIEMENS SMS-AX QUANT 1.0",00) DS HorizontalCalibrationPixelSize 2 (0023,"SIEMENS SMS-AX QUANT 1.0",01) DS VerticalCalibrationPixelSize 2 (0023,"SIEMENS SMS-AX QUANT 1.0",02) LO CalibrationObject 1 (0023,"SIEMENS SMS-AX QUANT 1.0",03) DS CalibrationObjectSize 1 (0023,"SIEMENS SMS-AX QUANT 1.0",04) LO CalibrationMethod 1 (0023,"SIEMENS SMS-AX QUANT 1.0",05) ST Filename 1 (0023,"SIEMENS SMS-AX QUANT 1.0",06) IS FrameNumber 1 (0023,"SIEMENS SMS-AX QUANT 1.0",07) IS CalibrationFactorMultiplicity 2 (0023,"SIEMENS SMS-AX QUANT 1.0",08) IS CalibrationTODValue 1 (0019,"SIEMENS SMS-AX VIEW 1.0",00) US ReviewMode 1 (0019,"SIEMENS SMS-AX VIEW 1.0",01) US AnatomicalBackgroundPercent 1 (0019,"SIEMENS SMS-AX VIEW 1.0",02) US NumberOfPhases 1 (0019,"SIEMENS SMS-AX VIEW 1.0",03) US ApplyAnatomicalBackground 1 (0019,"SIEMENS SMS-AX VIEW 1.0",04) SS PixelShiftArray 4-4n (0019,"SIEMENS SMS-AX VIEW 1.0",05) US Brightness 1 (0019,"SIEMENS SMS-AX VIEW 1.0",06) US Contrast 1 (0019,"SIEMENS SMS-AX VIEW 1.0",07) US Enabled 1 (0019,"SIEMENS SMS-AX VIEW 1.0",08) US NativeEdgeEnhancementPercentGain 1 (0019,"SIEMENS SMS-AX VIEW 1.0",09) SS NativeEdgeEnhancementLUTIndex 1 (0019,"SIEMENS SMS-AX VIEW 1.0",0A) SS NativeEdgeEnhancementKernelSize 1 (0019,"SIEMENS SMS-AX VIEW 1.0",0B) US SubtrEdgeEnhancementPercentGain 1 (0019,"SIEMENS SMS-AX VIEW 1.0",0C) SS SubtrEdgeEnhancementLUTIndex 1 (0019,"SIEMENS SMS-AX VIEW 1.0",0D) SS SubtrEdgeEnhancementKernelSize 1 (0019,"SIEMENS SMS-AX VIEW 1.0",0E) US FadePercent 1 (0019,"SIEMENS SMS-AX VIEW 1.0",0F) US FlippedBeforeLateralityApplied 1 (0019,"SIEMENS SMS-AX VIEW 1.0",10) US ApplyFade 1 (0019,"SIEMENS SMS-AX VIEW 1.0",12) US Zoom 1 (0019,"SIEMENS SMS-AX VIEW 1.0",13) SS PanX 1 (0019,"SIEMENS SMS-AX VIEW 1.0",14) SS PanY 1 (0019,"SIEMENS SMS-AX VIEW 1.0",15) SS NativeEdgeEnhancementAdvPercGain 1 (0019,"SIEMENS SMS-AX VIEW 1.0",16) SS SubtrEdgeEnhancementAdvPercGain 1 (0019,"SIEMENS SMS-AX VIEW 1.0",17) US InvertFlag 1 (0019,"SIEMENS SMS-AX VIEW 1.0",1A) OB Quant1KOverlay 1 (0019,"SIEMENS SMS-AX VIEW 1.0",1B) US OriginalResolution 1 (0019,"SIEMENS SMS-AX VIEW 1.0",1C) DS AutoWindowCenter 1 (0019,"SIEMENS SMS-AX VIEW 1.0",1D) DS AutoWindowWidth 1 (0009,"SIENET",01) US SIENETCommandField 1 (0009,"SIENET",14) LT ReceiverPLA 1 (0009,"SIENET",16) US TransferPriority 1 (0009,"SIENET",29) LT ActualUser 1 (0095,"SIENET",01) LT ExaminationFolderID 1 (0095,"SIENET",04) UL FolderReportedStatus 1 (0095,"SIENET",05) LT FolderReportingRadiologist 1 (0095,"SIENET",07) LT SIENETISAPLA 1 (0099,"SIENET",02) UL DataObjectAttributes 1 (0009,"SPI RELEASE 1",10) LT Comments 1 (0009,"SPI RELEASE 1",15) LO SPIImageUID 1 (0009,"SPI RELEASE 1",40) US DataObjectType 1 (0009,"SPI RELEASE 1",41) LO DataObjectSubtype 1 (0011,"SPI RELEASE 1",10) LO Organ 1 (0011,"SPI RELEASE 1",15) LO AllergyIndication 1 (0011,"SPI RELEASE 1",20) LO Pregnancy 1 (0029,"SPI RELEASE 1",60) LT CompressionAlgorithm 1 (0009,"SPI Release 1",10) LT Comments 1 (0009,"SPI Release 1",15) LO SPIImageUID 1 (0009,"SPI Release 1",40) US DataObjectType 1 (0009,"SPI Release 1",41) LO DataObjectSubtype 1 (0011,"SPI Release 1",10) LO Organ 1 (0011,"SPI Release 1",15) LO AllergyIndication 1 (0011,"SPI Release 1",20) LO Pregnancy 1 (0029,"SPI Release 1",60) LT CompressionAlgorithm 1 (0009,"SPI",10) LO Comments 1 (0009,"SPI",15) LO SPIImageUID 1 (0009,"SPI",40) US DataObjectType 1 (0009,"SPI",41) LT DataObjectSubtype 1 (0011,"SPI",10) LT Organ 1 (0011,"SPI",15) LT AllergyIndication 1 (0011,"SPI",20) LT Pregnancy 1 (0029,"SPI",60) LT CompressionAlgorithm 1 (0011,"SPI RELEASE 1",10) LO Organ 1 (0011,"SPI RELEASE 1",15) LO AllergyIndication 1 (0011,"SPI RELEASE 1",20) LO Pregnancy 1 (0009,"SPI-P Release 1",00) LT DataObjectRecognitionCode 1 (0009,"SPI-P Release 1",04) LO ImageDataConsistence 1 (0009,"SPI-P Release 1",08) US Unknown 1 (0009,"SPI-P Release 1",12) LO Unknown 1 (0009,"SPI-P Release 1",15) LO UniqueIdentifier 1 (0009,"SPI-P Release 1",16) LO Unknown 1 (0009,"SPI-P Release 1",18) LO Unknown 1 (0009,"SPI-P Release 1",21) LT Unknown 1 (0009,"SPI-P Release 1",31) LT PACSUniqueIdentifier 1 (0009,"SPI-P Release 1",34) LT ClusterUniqueIdentifier 1 (0009,"SPI-P Release 1",38) LT SystemUniqueIdentifier 1 (0009,"SPI-P Release 1",39) LT Unknown 1 (0009,"SPI-P Release 1",51) LT StudyUniqueIdentifier 1 (0009,"SPI-P Release 1",61) LT SeriesUniqueIdentifier 1 (0009,"SPI-P Release 1",91) LT Unknown 1 (0009,"SPI-P Release 1",f2) LT Unknown 1 (0009,"SPI-P Release 1",f3) UN Unknown 1 (0009,"SPI-P Release 1",f4) LT Unknown 1 (0009,"SPI-P Release 1",f5) UN Unknown 1 (0009,"SPI-P Release 1",f7) LT Unknown 1 (0011,"SPI-P Release 1",10) LT PatientEntryID 1 (0011,"SPI-P Release 1",21) UN Unknown 1 (0011,"SPI-P Release 1",22) UN Unknown 1 (0011,"SPI-P Release 1",31) UN Unknown 1 (0011,"SPI-P Release 1",32) UN Unknown 1 (0019,"SPI-P Release 1",00) UN Unknown 1 (0019,"SPI-P Release 1",01) UN Unknown 1 (0019,"SPI-P Release 1",02) UN Unknown 1 (0019,"SPI-P Release 1",10) US MainsFrequency 1 (0019,"SPI-P Release 1",25) LT OriginalPixelDataQuality 1-n (0019,"SPI-P Release 1",30) US ECGTriggering 1 (0019,"SPI-P Release 1",31) UN ECG1Offset 1 (0019,"SPI-P Release 1",32) UN ECG2Offset1 1 (0019,"SPI-P Release 1",33) UN ECG2Offset2 1 (0019,"SPI-P Release 1",50) US VideoScanMode 1 (0019,"SPI-P Release 1",51) US VideoLineRate 1 (0019,"SPI-P Release 1",60) US XrayTechnique 1 (0019,"SPI-P Release 1",61) DS ImageIdentifierFromat 1 (0019,"SPI-P Release 1",62) US IrisDiaphragm 1 (0019,"SPI-P Release 1",63) CS Filter 1 (0019,"SPI-P Release 1",64) CS CineParallel 1 (0019,"SPI-P Release 1",65) CS CineMaster 1 (0019,"SPI-P Release 1",70) US ExposureChannel 1 (0019,"SPI-P Release 1",71) UN ExposureChannelFirstImage 1 (0019,"SPI-P Release 1",72) US ProcessingChannel 1 (0019,"SPI-P Release 1",80) DS AcquisitionDelay 1 (0019,"SPI-P Release 1",81) UN RelativeImageTime 1 (0019,"SPI-P Release 1",90) CS VideoWhiteCompression 1 (0019,"SPI-P Release 1",a0) US Angulation 1 (0019,"SPI-P Release 1",a1) US Rotation 1 (0021,"SPI-P Release 1",12) LT SeriesUniqueIdentifier 1 (0021,"SPI-P Release 1",14) LT Unknown 1 (0029,"SPI-P Release 1",00) DS Unknown 4 (0029,"SPI-P Release 1",20) DS PixelAspectRatio 1 (0029,"SPI-P Release 1",25) LO ProcessedPixelDataQuality 1-n (0029,"SPI-P Release 1",30) LT Unknown 1 (0029,"SPI-P Release 1",38) US Unknown 1 (0029,"SPI-P Release 1",60) LT Unknown 1 (0029,"SPI-P Release 1",61) LT Unknown 1 (0029,"SPI-P Release 1",67) LT Unknown 1 (0029,"SPI-P Release 1",70) LT WindowID 1 (0029,"SPI-P Release 1",71) CS VideoInvertSubtracted 1 (0029,"SPI-P Release 1",72) CS VideoInvertNonsubtracted 1 (0029,"SPI-P Release 1",77) CS WindowSelectStatus 1 (0029,"SPI-P Release 1",78) LT ECGDisplayPrintingID 1 (0029,"SPI-P Release 1",79) CS ECGDisplayPrinting 1 (0029,"SPI-P Release 1",7e) CS ECGDisplayPrintingEnableStatus 1 (0029,"SPI-P Release 1",7f) CS ECGDisplayPrintingSelectStatus 1 (0029,"SPI-P Release 1",80) LT PhysiologicalDisplayID 1 (0029,"SPI-P Release 1",81) US PreferredPhysiologicalChannelDisplay 1 (0029,"SPI-P Release 1",8e) CS PhysiologicalDisplayEnableStatus 1 (0029,"SPI-P Release 1",8f) CS PhysiologicalDisplaySelectStatus 1 (0029,"SPI-P Release 1",c0) LT FunctionalShutterID 1 (0029,"SPI-P Release 1",c1) US FieldOfShutter 1 (0029,"SPI-P Release 1",c5) LT FieldOfShutterRectangle 1 (0029,"SPI-P Release 1",ce) CS ShutterEnableStatus 1 (0029,"SPI-P Release 1",cf) CS ShutterSelectStatus 1 (7FE1,"SPI-P Release 1",10) ox PixelData 1 (0009,"SPI-P Release 1;1",c0) LT Unknown 1 (0009,"SPI-P Release 1;1",c1) LT Unknown 1 (0019,"SPI-P Release 1;1",00) UN PhysiologicalDataType 1 (0019,"SPI-P Release 1;1",01) UN PhysiologicalDataChannelAndKind 1 (0019,"SPI-P Release 1;1",02) US SampleBitsAllocated 1 (0019,"SPI-P Release 1;1",03) US SampleBitsStored 1 (0019,"SPI-P Release 1;1",04) US SampleHighBit 1 (0019,"SPI-P Release 1;1",05) US SampleRepresentation 1 (0019,"SPI-P Release 1;1",06) UN SmallestSampleValue 1 (0019,"SPI-P Release 1;1",07) UN LargestSampleValue 1 (0019,"SPI-P Release 1;1",08) UN NumberOfSamples 1 (0019,"SPI-P Release 1;1",09) UN SampleData 1 (0019,"SPI-P Release 1;1",0a) UN SampleRate 1 (0019,"SPI-P Release 1;1",10) UN PhysiologicalDataType2 1 (0019,"SPI-P Release 1;1",11) UN PhysiologicalDataChannelAndKind2 1 (0019,"SPI-P Release 1;1",12) US SampleBitsAllocated2 1 (0019,"SPI-P Release 1;1",13) US SampleBitsStored2 1 (0019,"SPI-P Release 1;1",14) US SampleHighBit2 1 (0019,"SPI-P Release 1;1",15) US SampleRepresentation2 1 (0019,"SPI-P Release 1;1",16) UN SmallestSampleValue2 1 (0019,"SPI-P Release 1;1",17) UN LargestSampleValue2 1 (0019,"SPI-P Release 1;1",18) UN NumberOfSamples2 1 (0019,"SPI-P Release 1;1",19) UN SampleData2 1 (0019,"SPI-P Release 1;1",1a) UN SampleRate2 1 (0029,"SPI-P Release 1;1",00) LT ZoomID 1 (0029,"SPI-P Release 1;1",01) DS ZoomRectangle 1-n (0029,"SPI-P Release 1;1",03) DS ZoomFactor 1 (0029,"SPI-P Release 1;1",04) US ZoomFunction 1 (0029,"SPI-P Release 1;1",0e) CS ZoomEnableStatus 1 (0029,"SPI-P Release 1;1",0f) CS ZoomSelectStatus 1 (0029,"SPI-P Release 1;1",40) LT MagnifyingGlassID 1 (0029,"SPI-P Release 1;1",41) DS MagnifyingGlassRectangle 1-n (0029,"SPI-P Release 1;1",43) DS MagnifyingGlassFactor 1 (0029,"SPI-P Release 1;1",44) US MagnifyingGlassFunction 1 (0029,"SPI-P Release 1;1",4e) CS MagnifyingGlassEnableStatus 1 (0029,"SPI-P Release 1;1",4f) CS MagnifyingGlassSelectStatus 1 (0029,"SPI-P Release 1;2",00) LT SubtractionMaskID 1 (0029,"SPI-P Release 1;2",04) UN MaskingFunction 1 (0029,"SPI-P Release 1;2",0c) UN ProprietaryMaskingParameters 1 (0029,"SPI-P Release 1;2",1e) CS SubtractionMaskEnableStatus 1 (0029,"SPI-P Release 1;2",1f) CS SubtractionMaskSelectStatus 1 (0029,"SPI-P Release 1;3",00) LT ImageEnhancementID 1 (0029,"SPI-P Release 1;3",01) LT ImageEnhancement 1 (0029,"SPI-P Release 1;3",02) LT ConvolutionID 1 (0029,"SPI-P Release 1;3",03) LT ConvolutionType 1 (0029,"SPI-P Release 1;3",04) LT ConvolutionKernelSizeID 1 (0029,"SPI-P Release 1;3",05) US ConvolutionKernelSize 2 (0029,"SPI-P Release 1;3",06) US ConvolutionKernel 1-n (0029,"SPI-P Release 1;3",0c) DS EnhancementGain 1 (0029,"SPI-P Release 1;3",1e) CS ImageEnhancementEnableStatus 1 (0029,"SPI-P Release 1;3",1f) CS ImageEnhancementSelectStatus 1 (0011,"SPI-P Release 2;1",18) LT Unknown 1 (0023,"SPI-P Release 2;1",0d) UI Unknown 1 (0023,"SPI-P Release 2;1",0e) UI Unknown 1 (0009,"SPI-P-GV-CT Release 1",00) LO Unknown 1 (0009,"SPI-P-GV-CT Release 1",10) LO Unknown 1 (0009,"SPI-P-GV-CT Release 1",20) LO Unknown 1 (0009,"SPI-P-GV-CT Release 1",30) LO Unknown 1 (0009,"SPI-P-GV-CT Release 1",40) LO Unknown 1 (0009,"SPI-P-GV-CT Release 1",50) LO Unknown 1 (0009,"SPI-P-GV-CT Release 1",60) LO Unknown 1 (0009,"SPI-P-GV-CT Release 1",70) LO Unknown 1 (0009,"SPI-P-GV-CT Release 1",75) LO Unknown 1 (0009,"SPI-P-GV-CT Release 1",80) LO Unknown 1 (0009,"SPI-P-GV-CT Release 1",90) LO Unknown 1 (0019,"SPI-P-GV-CT Release 1",08) IS Unknown 1 (0019,"SPI-P-GV-CT Release 1",09) IS Unknown 1 (0019,"SPI-P-GV-CT Release 1",0a) IS Unknown 1 (0019,"SPI-P-GV-CT Release 1",10) LO Unknown 1 (0019,"SPI-P-GV-CT Release 1",20) TM Unknown 1 (0019,"SPI-P-GV-CT Release 1",50) LO Unknown 1 (0019,"SPI-P-GV-CT Release 1",60) DS Unknown 1 (0019,"SPI-P-GV-CT Release 1",61) US Unknown 1 (0019,"SPI-P-GV-CT Release 1",63) LO Unknown 1 (0019,"SPI-P-GV-CT Release 1",64) US Unknown 1 (0019,"SPI-P-GV-CT Release 1",65) IS Unknown 1 (0019,"SPI-P-GV-CT Release 1",70) LT Unknown 1 (0019,"SPI-P-GV-CT Release 1",80) LO Unknown 1 (0019,"SPI-P-GV-CT Release 1",81) LO Unknown 1 (0019,"SPI-P-GV-CT Release 1",90) LO Unknown 1 (0019,"SPI-P-GV-CT Release 1",a0) LO Unknown 1 (0019,"SPI-P-GV-CT Release 1",a1) US Unknown 1 (0019,"SPI-P-GV-CT Release 1",a2) US Unknown 1 (0019,"SPI-P-GV-CT Release 1",a3) US Unknown 1 (0019,"SPI-P-GV-CT Release 1",b0) LO Unknown 1 (0019,"SPI-P-GV-CT Release 1",b1) LO Unknown 1 (0021,"SPI-P-GV-CT Release 1",20) LO Unknown 1 (0021,"SPI-P-GV-CT Release 1",30) DS Unknown 1 (0021,"SPI-P-GV-CT Release 1",40) LO Unknown 1 (0021,"SPI-P-GV-CT Release 1",50) LO Unknown 1 (0021,"SPI-P-GV-CT Release 1",60) DS Unknown 1 (0021,"SPI-P-GV-CT Release 1",70) DS Unknown 1 (0021,"SPI-P-GV-CT Release 1",80) DS Unknown 1 (0021,"SPI-P-GV-CT Release 1",90) DS Unknown 1 (0021,"SPI-P-GV-CT Release 1",a0) US Unknown 1 (0021,"SPI-P-GV-CT Release 1",a1) DS Unknown 1 (0021,"SPI-P-GV-CT Release 1",a2) DS Unknown 1 (0021,"SPI-P-GV-CT Release 1",a3) LT Unknown 1 (0021,"SPI-P-GV-CT Release 1",a4) LT Unknown 1 (0021,"SPI-P-GV-CT Release 1",b0) LO Unknown 1 (0021,"SPI-P-GV-CT Release 1",c0) LO Unknown 1 (0029,"SPI-P-GV-CT Release 1",10) LO Unknown 1 (0029,"SPI-P-GV-CT Release 1",30) UL Unknown 1 (0029,"SPI-P-GV-CT Release 1",31) UL Unknown 1 (0029,"SPI-P-GV-CT Release 1",32) UL Unknown 1 (0029,"SPI-P-GV-CT Release 1",33) UL Unknown 1 (0029,"SPI-P-GV-CT Release 1",80) LO Unknown 1 (0029,"SPI-P-GV-CT Release 1",90) LO Unknown 1 (0029,"SPI-P-GV-CT Release 1",d0) IS Unknown 1 (0029,"SPI-P-GV-CT Release 1",d1) IS Unknown 1 (0019,"SPI-P-PCR Release 2",30) US Unknown 1 (0021,"SPI-P-Private-CWS Release 1",00) LT WindowOfImagesID 1 (0021,"SPI-P-Private-CWS Release 1",01) CS WindowOfImagesType 1 (0021,"SPI-P-Private-CWS Release 1",02) IS WindowOfImagesScope 1-n (0019,"SPI-P-Private-DCI Release 1",10) UN ECGTimeMapDataBitsAllocated 1 (0019,"SPI-P-Private-DCI Release 1",11) UN ECGTimeMapDataBitsStored 1 (0019,"SPI-P-Private-DCI Release 1",12) UN ECGTimeMapDataHighBit 1 (0019,"SPI-P-Private-DCI Release 1",13) UN ECGTimeMapDataRepresentation 1 (0019,"SPI-P-Private-DCI Release 1",14) UN ECGTimeMapDataSmallestDataValue 1 (0019,"SPI-P-Private-DCI Release 1",15) UN ECGTimeMapDataLargestDataValue 1 (0019,"SPI-P-Private-DCI Release 1",16) UN ECGTimeMapDataNumberOfDataValues 1 (0019,"SPI-P-Private-DCI Release 1",17) UN ECGTimeMapData 1 (0021,"SPI-P-Private_CDS Release 1",40) IS Unknown 1 (0029,"SPI-P-Private_CDS Release 1",00) UN Unknown 1 (0019,"SPI-P-Private_ICS Release 1",30) DS Unknown 1 (0019,"SPI-P-Private_ICS Release 1",31) LO Unknown 1 (0029,"SPI-P-Private_ICS Release 1",08) SQ Unknown 1 (0029,"SPI-P-Private_ICS Release 1",0f) SQ Unknown 1 (0029,"SPI-P-Private_ICS Release 1",10) SQ Unknown 1 (0029,"SPI-P-Private_ICS Release 1",1b) SQ Unknown 1 (0029,"SPI-P-Private_ICS Release 1",1c) SQ Unknown 1 (0029,"SPI-P-Private_ICS Release 1",21) SQ Unknown 1 (0029,"SPI-P-Private_ICS Release 1",43) SQ Unknown 1 (0029,"SPI-P-Private_ICS Release 1",44) SQ Unknown 1 (0029,"SPI-P-Private_ICS Release 1",4C) SQ Unknown 1 (0029,"SPI-P-Private_ICS Release 1",67) LO Unknown 1 (0029,"SPI-P-Private_ICS Release 1",68) US Unknown 1 (0029,"SPI-P-Private_ICS Release 1",6A) LO Unknown 1 (0029,"SPI-P-Private_ICS Release 1",6B) US Unknown 1 (0029,"SPI-P-Private_ICS Release 1;1",00) SL Unknown 1 (0029,"SPI-P-Private_ICS Release 1;1",05) FL Unknown 1 (0029,"SPI-P-Private_ICS Release 1;1",06) FL Unknown 1 (0029,"SPI-P-Private_ICS Release 1;1",20) FL Unknown 1 (0029,"SPI-P-Private_ICS Release 1;1",21) FL Unknown 1 (0029,"SPI-P-Private_ICS Release 1;1",CD) SQ Unknown 1 (0029,"SPI-P-Private_ICS Release 1;2",00) FD Unknown 1 (0029,"SPI-P-Private_ICS Release 1;2",01) FD Unknown 1 (0029,"SPI-P-Private_ICS Release 1;2",02) FD Unknown 1 (0029,"SPI-P-Private_ICS Release 1;2",03) SL Unknown 1 (0029,"SPI-P-Private_ICS Release 1;2",04) SL Unknown 1 (0029,"SPI-P-Private_ICS Release 1;2",05) SL Unknown 1 (0029,"SPI-P-Private_ICS Release 1;3",C0) SQ Unknown 1 (0029,"SPI-P-Private_ICS Release 1;3",C1) SQ Unknown 1 (0029,"SPI-P-Private_ICS Release 1;3",C2) SQ Unknown 1 (0029,"SPI-P-Private_ICS Release 1;3",C3) SQ Unknown 1 (0029,"SPI-P-Private_ICS Release 1;3",C4) SQ Unknown 1 (0029,"SPI-P-Private_ICS Release 1;3",C5) SQ Unknown 1 (0029,"SPI-P-Private_ICS Release 1;4",02) SQ Unknown 1 (0029,"SPI-P-Private_ICS Release 1;4",9A) SQ Unknown 1 (0029,"SPI-P-Private_ICS Release 1;4",E0) SQ Unknown 1 (0029,"SPI-P-Private_ICS Release 1;5",50) CS Unknown 1 (0029,"SPI-P-Private_ICS Release 1;5",55) CS Unknown 1 (0019,"SPI-P-XSB-DCI Release 1",10) LT VideoBeamBoost 1 (0019,"SPI-P-XSB-DCI Release 1",11) US ChannelGeneratingVideoSync 1 (0019,"SPI-P-XSB-DCI Release 1",12) US VideoGain 1 (0019,"SPI-P-XSB-DCI Release 1",13) US VideoOffset 1 (0019,"SPI-P-XSB-DCI Release 1",20) DS RTDDataCompressionFactor 1 (0029,"Silhouette Annot V1.0",11) IS AnnotationName 1 (0029,"Silhouette Annot V1.0",12) LT AnnotationFont 1 (0029,"Silhouette Annot V1.0",13) LT AnnotationTextForegroundColor 1 (0029,"Silhouette Annot V1.0",14) LT AnnotationTextBackgroundColor 1 (0029,"Silhouette Annot V1.0",15) UL AnnotationTextBackingMode 1 (0029,"Silhouette Annot V1.0",16) UL AnnotationTextJustification 1 (0029,"Silhouette Annot V1.0",17) UL AnnotationTextLocation 1 (0029,"Silhouette Annot V1.0",18) LT AnnotationTextString 1 (0029,"Silhouette Annot V1.0",19) UL AnnotationTextAttachMode 1 (0029,"Silhouette Annot V1.0",20) UL AnnotationTextCursorMode 1 (0029,"Silhouette Annot V1.0",21) UL AnnotationTextShadowOffsetX 1 (0029,"Silhouette Annot V1.0",22) UL AnnotationTextShadowOffsetY 1 (0029,"Silhouette Annot V1.0",23) LT AnnotationLineColor 1 (0029,"Silhouette Annot V1.0",24) UL AnnotationLineThickness 1 (0029,"Silhouette Annot V1.0",25) UL AnnotationLineType 1 (0029,"Silhouette Annot V1.0",26) UL AnnotationLineStyle 1 (0029,"Silhouette Annot V1.0",27) UL AnnotationLineDashLength 1 (0029,"Silhouette Annot V1.0",28) UL AnnotationLineAttachMode 1 (0029,"Silhouette Annot V1.0",29) UL AnnotationLinePointCount 1 (0029,"Silhouette Annot V1.0",30) FD AnnotationLinePoints 1 (0029,"Silhouette Annot V1.0",31) UL AnnotationLineControlSize 1 (0029,"Silhouette Annot V1.0",32) LT AnnotationMarkerColor 1 (0029,"Silhouette Annot V1.0",33) UL AnnotationMarkerType 1 (0029,"Silhouette Annot V1.0",34) UL AnnotationMarkerSize 1 (0029,"Silhouette Annot V1.0",35) FD AnnotationMarkerLocation 1 (0029,"Silhouette Annot V1.0",36) UL AnnotationMarkerAttachMode 1 (0029,"Silhouette Annot V1.0",37) LT AnnotationGeomColor 1 (0029,"Silhouette Annot V1.0",38) UL AnnotationGeomThickness 1 (0029,"Silhouette Annot V1.0",39) UL AnnotationGeomLineStyle 1 (0029,"Silhouette Annot V1.0",40) UL AnnotationGeomDashLength 1 (0029,"Silhouette Annot V1.0",41) UL AnnotationGeomFillPattern 1 (0029,"Silhouette Annot V1.0",42) UL AnnotationInteractivity 1 (0029,"Silhouette Annot V1.0",43) FD AnnotationArrowLength 1 (0029,"Silhouette Annot V1.0",44) FD AnnotationArrowAngle 1 (0029,"Silhouette Annot V1.0",45) UL AnnotationDontSave 1 (0029,"Silhouette Graphics Export V1.0",00) UI Unknown 1 (0029,"Silhouette Line V1.0",11) IS LineName 1 (0029,"Silhouette Line V1.0",12) LT LineNameFont 1 (0029,"Silhouette Line V1.0",13) UL LineNameDisplay 1 (0029,"Silhouette Line V1.0",14) LT LineNormalColor 1 (0029,"Silhouette Line V1.0",15) UL LineType 1 (0029,"Silhouette Line V1.0",16) UL LineThickness 1 (0029,"Silhouette Line V1.0",17) UL LineStyle 1 (0029,"Silhouette Line V1.0",18) UL LineDashLength 1 (0029,"Silhouette Line V1.0",19) UL LineInteractivity 1 (0029,"Silhouette Line V1.0",20) LT LineMeasurementColor 1 (0029,"Silhouette Line V1.0",21) LT LineMeasurementFont 1 (0029,"Silhouette Line V1.0",22) UL LineMeasurementDashLength 1 (0029,"Silhouette Line V1.0",23) UL LinePointSpace 1 (0029,"Silhouette Line V1.0",24) FD LinePoints 1 (0029,"Silhouette Line V1.0",25) UL LineControlPointSize 1 (0029,"Silhouette Line V1.0",26) UL LineControlPointSpace 1 (0029,"Silhouette Line V1.0",27) FD LineControlPoints 1 (0029,"Silhouette Line V1.0",28) LT LineLabel 1 (0029,"Silhouette Line V1.0",29) UL LineDontSave 1 (0029,"Silhouette ROI V1.0",11) IS ROIName 1 (0029,"Silhouette ROI V1.0",12) LT ROINameFont 1 (0029,"Silhouette ROI V1.0",13) LT ROINormalColor 1 (0029,"Silhouette ROI V1.0",14) UL ROIFillPattern 1 (0029,"Silhouette ROI V1.0",15) UL ROIBpSeg 1 (0029,"Silhouette ROI V1.0",16) UN ROIBpSegPairs 1 (0029,"Silhouette ROI V1.0",17) UL ROISeedSpace 1 (0029,"Silhouette ROI V1.0",18) UN ROISeeds 1 (0029,"Silhouette ROI V1.0",19) UL ROILineThickness 1 (0029,"Silhouette ROI V1.0",20) UL ROILineStyle 1 (0029,"Silhouette ROI V1.0",21) UL ROILineDashLength 1 (0029,"Silhouette ROI V1.0",22) UL ROIInteractivity 1 (0029,"Silhouette ROI V1.0",23) UL ROINamePosition 1 (0029,"Silhouette ROI V1.0",24) UL ROINameDisplay 1 (0029,"Silhouette ROI V1.0",25) LT ROILabel 1 (0029,"Silhouette ROI V1.0",26) UL ROIShape 1 (0029,"Silhouette ROI V1.0",27) FD ROIShapeTilt 1 (0029,"Silhouette ROI V1.0",28) UL ROIShapePointsCount 1 (0029,"Silhouette ROI V1.0",29) UL ROIShapePointsSpace 1 (0029,"Silhouette ROI V1.0",30) FD ROIShapePoints 1 (0029,"Silhouette ROI V1.0",31) UL ROIShapeControlPointsCount 1 (0029,"Silhouette ROI V1.0",32) UL ROIShapeControlPointsSpace 1 (0029,"Silhouette ROI V1.0",33) FD ROIShapeControlPoints 1 (0029,"Silhouette ROI V1.0",34) UL ROIDontSave 1 (0029,"Silhouette Sequence Ids V1.0",41) SQ Unknown 1 (0029,"Silhouette Sequence Ids V1.0",42) SQ Unknown 1 (0029,"Silhouette Sequence Ids V1.0",43) SQ Unknown 1 (0029,"Silhouette V1.0",13) UL Unknown 1 (0029,"Silhouette V1.0",14) UL Unknown 1 (0029,"Silhouette V1.0",17) UN Unknown 1 (0029,"Silhouette V1.0",18) UN Unknown 1 (0029,"Silhouette V1.0",19) UL Unknown 1 (0029,"Silhouette V1.0",1a) UN Unknown 1 (0029,"Silhouette V1.0",1b) UL Unknown 1 (0029,"Silhouette V1.0",1c) UL Unknown 1 (0029,"Silhouette V1.0",1d) UN Unknown 1 (0029,"Silhouette V1.0",1e) UN Unknown 1 (0029,"Silhouette V1.0",21) US Unknown 1 (0029,"Silhouette V1.0",22) US Unknown 1 (0029,"Silhouette V1.0",23) US Unknown 1 (0029,"Silhouette V1.0",24) US Unknown 1 (0029,"Silhouette V1.0",25) US Unknown 1 (0029,"Silhouette V1.0",27) UN Unknown 1 (0029,"Silhouette V1.0",28) UN Unknown 1 (0029,"Silhouette V1.0",29) UN Unknown 1 (0029,"Silhouette V1.0",30) UN Unknown 1 (0029,"Silhouette V1.0",52) US Unknown 1 (0029,"Silhouette V1.0",53) LT Unknown 1 (0029,"Silhouette V1.0",54) UN Unknown 1 (0029,"Silhouette V1.0",55) LT Unknown 1 (0029,"Silhouette V1.0",56) LT Unknown 1 (0029,"Silhouette V1.0",57) UN Unknown 1 (0135,"SONOWAND AS",10) LO UltrasoundScannerName 1 (0135,"SONOWAND AS",11) LO TransducerSerial 1 (0135,"SONOWAND AS",12) LO ProbeApplication 1 (0017,"SVISION",00) LO ExtendedBodyPart 1 (0017,"SVISION",10) LO ExtendedViewPosition 1 (0017,"SVISION",F0) IS ImagesSOPClass 1 (0019,"SVISION",00) IS AECField 1 (0019,"SVISION",01) IS AECFilmScreen 1 (0019,"SVISION",02) IS AECDensity 1 (0019,"SVISION",10) IS PatientThickness 1 (0019,"SVISION",18) IS BeamDistance 1 (0019,"SVISION",20) IS WorkstationNumber 1 (0019,"SVISION",28) IS TubeNumber 1 (0019,"SVISION",30) IS BuckyGrid 1 (0019,"SVISION",34) IS Focus 1 (0019,"SVISION",38) IS Child 1 (0019,"SVISION",40) IS CollimatorDistanceX 1 (0019,"SVISION",41) IS CollimatorDistanceY 1 (0019,"SVISION",50) IS CentralBeamHeight 1 (0019,"SVISION",60) IS BuckyAngle 1 (0019,"SVISION",68) IS CArmAngle 1 (0019,"SVISION",69) IS CollimatorAngle 1 (0019,"SVISION",70) IS FilterNumber 1 (0019,"SVISION",74) LO FilterMaterial1 1 (0019,"SVISION",75) LO FilterMaterial2 1 (0019,"SVISION",78) DS FilterThickness1 1 (0019,"SVISION",79) DS FilterThickness2 1 (0019,"SVISION",80) IS BuckyFormat 1 (0019,"SVISION",81) IS ObjectPosition 1 (0019,"SVISION",90) LO DeskCommand 1 (0019,"SVISION",A0) DS ExtendedExposureTime 1 (0019,"SVISION",A1) DS ActualExposureTime 1 (0019,"SVISION",A8) DS ExtendedXRayTubeCurrent 1 (0021,"SVISION",00) DS NoiseReduction 1 (0021,"SVISION",01) DS ContrastAmplification 1 (0021,"SVISION",02) DS EdgeContrastBoosting 1 (0021,"SVISION",03) DS LatitudeReduction 1 (0021,"SVISION",10) LO FindRangeAlgorithm 1 (0021,"SVISION",11) DS ThresholdCAlgorithm 1 (0021,"SVISION",20) LO SensometricCurve 1 (0021,"SVISION",30) DS LowerWindowOffset 1 (0021,"SVISION",31) DS UpperWindowOffset 1 (0021,"SVISION",40) DS MinPrintableDensity 1 (0021,"SVISION",41) DS MaxPrintableDensity 1 (0021,"SVISION",90) DS Brightness 1 (0021,"SVISION",91) DS Contrast 1 (0021,"SVISION",92) DS ShapeFactor 1 (0023,"SVISION",00) LO ImageLaterality 1 (0023,"SVISION",01) IS LetterPosition 1 (0023,"SVISION",02) IS BurnedInAnnotation 1 (0023,"SVISION",03) LO Unknown 1 (0023,"SVISION",F0) IS ImageSOPClass 1 (0025,"SVISION",00) IS OriginalImage 1 (0025,"SVISION",01) IS NotProcessedImage 1 (0025,"SVISION",02) IS CutOutImage 1 (0025,"SVISION",03) IS DuplicatedImage 1 (0025,"SVISION",04) IS StoredImage 1 (0025,"SVISION",05) IS RetrievedImage 1 (0025,"SVISION",06) IS RemoteImage 1 (0025,"SVISION",07) IS MediaStoredImage 1 (0025,"SVISION",08) IS ImageState 1 (0025,"SVISION",20) LO SourceImageFile 1 (0025,"SVISION",21) UI Unknown 1 (0027,"SVISION",00) IS NumberOfSeries 1 (0027,"SVISION",01) IS NumberOfStudies 1 (0027,"SVISION",10) DT OldestSeries 1 (0027,"SVISION",11) DT NewestSeries 1 (0027,"SVISION",12) DT OldestStudy 1 (0027,"SVISION",13) DT NewestStudy 1 (0009,"TOSHIBA_MEC_1.0",01) LT Unknown 1 (0009,"TOSHIBA_MEC_1.0",02) US Unknown 1-n (0009,"TOSHIBA_MEC_1.0",03) US Unknown 1-n (0009,"TOSHIBA_MEC_1.0",04) US Unknown 1-n (0011,"TOSHIBA_MEC_1.0",01) LT Unknown 1 (0011,"TOSHIBA_MEC_1.0",02) US Unknown 1-n (0019,"TOSHIBA_MEC_1.0",01) US Unknown 1-n (0019,"TOSHIBA_MEC_1.0",02) US Unknown 1-n (0021,"TOSHIBA_MEC_1.0",01) US Unknown 1-n (0021,"TOSHIBA_MEC_1.0",02) US Unknown 1-n (0021,"TOSHIBA_MEC_1.0",03) US Unknown 1-n (7ff1,"TOSHIBA_MEC_1.0",01) US Unknown 1-n (7ff1,"TOSHIBA_MEC_1.0",02) US Unknown 1-n (7ff1,"TOSHIBA_MEC_1.0",03) US Unknown 1-n (7ff1,"TOSHIBA_MEC_1.0",10) US Unknown 1-n (0019,"TOSHIBA_MEC_CT_1.0",01) IS Unknown 1 (0019,"TOSHIBA_MEC_CT_1.0",02) IS Unknown 1 (0019,"TOSHIBA_MEC_CT_1.0",03) US Unknown 1-n (0019,"TOSHIBA_MEC_CT_1.0",04) LT Unknown 1 (0019,"TOSHIBA_MEC_CT_1.0",05) LT Unknown 1 (0019,"TOSHIBA_MEC_CT_1.0",06) US Unknown 1-n (0019,"TOSHIBA_MEC_CT_1.0",07) US Unknown 1-n (0019,"TOSHIBA_MEC_CT_1.0",08) LT OrientationHeadFeet 1 (0019,"TOSHIBA_MEC_CT_1.0",09) LT ViewDirection 1 (0019,"TOSHIBA_MEC_CT_1.0",0a) LT OrientationSupineProne 1 (0019,"TOSHIBA_MEC_CT_1.0",0b) DS Unknown 1 (0019,"TOSHIBA_MEC_CT_1.0",0c) US Unknown 1-n (0019,"TOSHIBA_MEC_CT_1.0",0d) TM Time 1 (0019,"TOSHIBA_MEC_CT_1.0",0e) DS Unknown 1 (7ff1,"TOSHIBA_MEC_CT_1.0",01) US Unknown 1-n (7ff1,"TOSHIBA_MEC_CT_1.0",02) US Unknown 1-n (7ff1,"TOSHIBA_MEC_CT_1.0",03) IS Unknown 1 (7ff1,"TOSHIBA_MEC_CT_1.0",04) IS Unknown 1 (7ff1,"TOSHIBA_MEC_CT_1.0",05) US Unknown 1-n (7ff1,"TOSHIBA_MEC_CT_1.0",07) US Unknown 1-n (7ff1,"TOSHIBA_MEC_CT_1.0",08) US Unknown 1-n (7ff1,"TOSHIBA_MEC_CT_1.0",09) US Unknown 1-n (7ff1,"TOSHIBA_MEC_CT_1.0",0a) LT Unknown 1 (7ff1,"TOSHIBA_MEC_CT_1.0",0b) US Unknown 1-n (7ff1,"TOSHIBA_MEC_CT_1.0",0c) US Unknown 1-n (7ff1,"TOSHIBA_MEC_CT_1.0",0d) US Unknown 1-n # # end of private.dic # dcmtk-3.6.0/dcmdata/data/VLP.dump0000644000310500011400000000773510721543626015717 0ustar joergrdicom3 ################################################################################ # IMG2DCM TEMPLATE FOR WRITING VISIBLE LIGHT PHOTOGRAPHY OBJECTS # # SOP Class: 1.2.840.10008.5.1.4.1.1.77.1.4 (XC) # ################################################################################ # Type 1: Value MUST be filled in # # Type 1C: Value MUST be filled in if known, if certain condition (see # # standard) is fullfilled, otherwise LEAVE OUT line # # Type 2: Value MUST be filled in if known, MUST be left empty otherwise # # Type 2C: Same as 2, if a certain condition (see standard) is met. If the # # condition is not met, LEAVE OUT line # # Type 3: User optional, CAN be written (if it should not, delete line). # # The value written can be choosen freely, but has to conform to # # element's VR (see standard) # ################################################################################ ########################### Patient Module ##################################### # Patient's Name, Type 2 (0010,0010) PN [] # Patient ID, Type 2 (0010,0020) LO [] # Patient's Birth Date, Type 2 (0010,0030) DA [] # Patient's Sex, Type 2 (0010,0040) CS [] # Responsible Organization, Type 2C (only included if patient is animal...) # (0010,2299) LO [] ########################### General Study Module ############################## # All attributes from the General Study Module are overwritten by the # # --study-from and series-from options # ############################################################################### # Study Date, Type 2 (0008,0020) DA [] # Study Time, Type 2 (0008,0030) TM [] # Accession Number, Type 2 (0008,0050) SH [] # Referring Physician's Name, Type 2 (0008,0090) PN [] # Study ID, Type 2 (0020,0010) SH [] # Study Instance UID, Type 1, usually provided automatically (newly created) #(0020,000d) UI [] ########################### General Series Module ############################## # All attributes from the General Series Module are overwritten by the # # --study-from option # ################################################################################ # Patient Position, Type 2C (0018,5100) CS (no value available) # Series Instance UID, Type 1, usually provided automatically (newly created) # (0020,000e) UI [] # Series Number, Type 2 (0020,0011) IS [] # Laterality, Type 2C # (0020,0060) CS (no value available) ###################### General Equipment Module ############################### # Manufacturer, Type 2 (0008,0070) LO [] ###################### General Image Module ############################### # Content Date, Type 2C #(0008,0023) DA [] # Instance Number, Type 2 (0020,0013) IS [] # Patient Orientation, Type 2C (0020,0020) CS (no value available) ###################### Image Pixel Module ##################################### # The Image Pixel Module is written by the img2dcm application # ############################################################################### #################### Acquisition Context Module ################################ # Acquisition Context Sequence, Type 2 (0040,0555) SQ (Sequence with explicit length #=0) (fffe,e0dd) na (SequenceDelimitationItem for re-encod.) ########################### VL Image Module ################################### # Image Type, Type 1 (Defined Terms) (0008,0008) CS [DERIVED\SECONDARY] # Content Time, Type 1C #(0008,0033) TM [] # Lossy Image Compression, Type 2, Enumerated Values ("00" and "01") (0028,2110) CS [01] ########################### SOP Common Module ################################## # Specific Character Set, Type 1C. # "ISO_IR 100" should be used if ISO Latin 1 characters could/are used in file (0008,0005) CS [ISO_IR 100]dcmtk-3.6.0/dcmdata/etc/0000755000310500011400000000000011511320675014210 5ustar joergrdicom3dcmtk-3.6.0/dcmdata/etc/Makefile.in0000644000310500011400000000037610721543467016273 0ustar joergrdicom3# # Makefile for dcmdata/etc # @SET_MAKE@ SHELL = /bin/sh srcdir = @srcdir@ top_srcdir = @top_srcdir@ configdir = @top_srcdir@/@configdir@ include $(configdir)/@common_makefile@ all: install: clean: rm -f $(TRASH) distclean: rm -f $(DISTTRASH) dcmtk-3.6.0/dcmdata/CMakeLists.txt0000644000310500011400000000047711430037727016210 0ustar joergrdicom3# declare project PROJECT(dcmdata) # declare include directories which hold for all subdirectories INCLUDE_DIRECTORIES(${dcmdata_SOURCE_DIR}/include ${ofstd_SOURCE_DIR}/include ${oflog_SOURCE_DIR}/include ${ZLIB_INCDIR}) # recurse into subdirectories SUBDIRS(libsrc libi2d apps include/dcmtk/dcmdata docs data tests) dcmtk-3.6.0/dcmdata/libi2d/0000755000310500011400000000000011511320675014602 5ustar joergrdicom3dcmtk-3.6.0/dcmdata/libi2d/Makefile.in0000644000310500011400000000227511274250060016651 0ustar joergrdicom3# # Makefile for dcmdata/libi2d # @SET_MAKE@ SHELL = /bin/sh VPATH = @srcdir@:@top_srcdir@/include:@top_srcdir@/@configdir@/include srcdir = @srcdir@ top_srcdir = @top_srcdir@ configdir = @top_srcdir@/@configdir@ include $(configdir)/@common_makefile@ ofstddir = $(top_srcdir)/../ofstd oflogdir = $(top_srcdir)/../oflog dcmdatadir = $(top_srcdir)/../dcmdata LOCALINCLUDES = -I$(ofstddir)/include -I$(dcmdatadir)/include -I$(oflogdir)/include -I$(dcmdatadir)/include/libi2d LOCALDEFS = objs = i2d.o i2dplvlp.o i2djpgs.o i2dbmps.o i2dplsc.o i2dplnsc.o library = libi2d.$(LIBEXT) all: $(library) install: $(library) $(configdir)/mkinstalldirs $(DESTDIR)$(libdir) $(INSTALL_DATA) $(library) $(DESTDIR)$(libdir)/$(library) $(RANLIB) $(DESTDIR)$(libdir)/$(library) install-lib: $(library) $(configdir)/mkinstalldirs $(DESTDIR)$(libdir) $(INSTALL_DATA) $(library) $(DESTDIR)$(libdir)/$(library) $(RANLIB) $(DESTDIR)$(libdir)/$(library) $(library): $(objs) $(AR) $(ARFLAGS) $@ $(objs) $(RANLIB) $@ clean: rm -f $(objs) $(library) $(TRASH) distclean: rm -f $(objs) $(library) $(DISTTRASH) dependencies: $(CXX) -MM $(defines) $(includes) $(CPPFLAGS) $(CXXFLAGS) *.cc > $(DEP) include $(DEP) dcmtk-3.6.0/dcmdata/libi2d/Makefile.dep0000644000310500011400000006137011461766744017037 0ustar joergrdicom3i2dbmps.o: i2dbmps.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmdata/libi2d/i2dbmps.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/libi2d/i2dimgs.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../include/dcmtk/dcmdata/dcxfer.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcvr.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/libi2d/i2doutpl.h \ ../include/dcmtk/dcmdata/dcdatset.h ../include/dcmtk/dcmdata/dcitem.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../include/dcmtk/dcmdata/dcobject.h ../include/dcmtk/dcmdata/dcerror.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dctag.h \ ../include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmdata/dcstack.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../include/dcmtk/dcmdata/dcpcache.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../include/dcmtk/dcmdata/dcelem.h \ ../../oflog/include/dcmtk/oflog/oflog.h i2d.o: i2d.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmdata/libi2d/i2d.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/libi2d/i2doutpl.h \ ../include/dcmtk/dcmdata/dcdatset.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dcitem.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcobject.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dcvr.h \ ../include/dcmtk/dcmdata/dctag.h ../include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmdata/dcstack.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../include/dcmtk/dcmdata/dcpcache.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../include/dcmtk/dcmdata/dcelem.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../include/dcmtk/dcmdata/libi2d/i2dplvlp.h \ ../include/dcmtk/dcmdata/libi2d/i2dplsc.h \ ../include/dcmtk/dcmdata/libi2d/i2djpgs.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../include/dcmtk/dcmdata/libi2d/i2dimgs.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dcpixel.h \ ../include/dcmtk/dcmdata/dcvrpobw.h ../include/dcmtk/dcmdata/dcvrobow.h \ ../include/dcmtk/dcmdata/dcelem.h ../include/dcmtk/dcmdata/dcpxitem.h \ ../include/dcmtk/dcmdata/dcofsetl.h ../include/dcmtk/dcmdata/dcfilefo.h \ ../include/dcmtk/dcmdata/dcsequen.h ../include/dcmtk/dcmdata/dcdatset.h \ ../include/dcmtk/dcmdata/dcdeftag.h ../include/dcmtk/dcmdata/dcuid.h \ ../include/dcmtk/dcmdata/dcpixseq.h ../include/dcmtk/dcmdata/dcpath.h i2djpgs.o: i2djpgs.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmdata/libi2d/i2djpgs.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../include/dcmtk/dcmdata/libi2d/i2dimgs.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcxfer.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcvr.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../include/dcmtk/dcmdata/libi2d/i2doutpl.h \ ../include/dcmtk/dcmdata/dcdatset.h ../include/dcmtk/dcmdata/dcitem.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../include/dcmtk/dcmdata/dcobject.h ../include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dctag.h \ ../include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmdata/dcstack.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../include/dcmtk/dcmdata/dcpcache.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../include/dcmtk/dcmdata/dcelem.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../include/dcmtk/dcmdata/dcerror.h i2dplnsc.o: i2dplnsc.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmdata/libi2d/i2dplnsc.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/libi2d/i2doutpl.h \ ../include/dcmtk/dcmdata/dcdatset.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dcitem.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcobject.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dcvr.h \ ../include/dcmtk/dcmdata/dctag.h ../include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmdata/dcstack.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../include/dcmtk/dcmdata/dcpcache.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../include/dcmtk/dcmdata/dcelem.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../include/dcmtk/dcmdata/dcdeftag.h ../include/dcmtk/dcmdata/dcuid.h \ ../include/dcmtk/dcmdata/libi2d/i2doutpl.h i2dplsc.o: i2dplsc.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmdata/libi2d/i2dplsc.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/libi2d/i2doutpl.h \ ../include/dcmtk/dcmdata/dcdatset.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dcitem.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcobject.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dcvr.h \ ../include/dcmtk/dcmdata/dctag.h ../include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmdata/dcstack.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../include/dcmtk/dcmdata/dcpcache.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../include/dcmtk/dcmdata/dcelem.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../include/dcmtk/dcmdata/libi2d/i2doutpl.h \ ../include/dcmtk/dcmdata/dcdeftag.h ../include/dcmtk/dcmdata/dcuid.h i2dplvlp.o: i2dplvlp.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmdata/libi2d/i2dplvlp.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/libi2d/i2doutpl.h \ ../include/dcmtk/dcmdata/dcdatset.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dcitem.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcobject.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dcvr.h \ ../include/dcmtk/dcmdata/dctag.h ../include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmdata/dcstack.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../include/dcmtk/dcmdata/dcpcache.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../include/dcmtk/dcmdata/dcelem.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../include/dcmtk/dcmdata/dcdeftag.h ../include/dcmtk/dcmdata/dcuid.h dcmtk-3.6.0/dcmdata/libi2d/i2djpgs.cc0000644000310500011400000007513711474723050016472 0ustar joergrdicom3/* * * Copyright (C) 2007-2010, 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: dcmdata * * Author: Michael Onken * * Purpose: Class to extract pixel data and meta information from JPEG file * * Last Update: $Author: uli $ * Update Date: $Date: 2010-11-29 13:10:00 $ * CVS/RCS Revision: $Revision: 1.16 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" #include "dcmtk/dcmdata/libi2d/i2djpgs.h" #include "dcmtk/dcmdata/libi2d/i2doutpl.h" #include "dcmtk/dcmdata/dcerror.h" I2DJpegSource::I2DJpegSource() : m_jpegFileMap(), jpegFile(), m_disableProgrTs(OFFalse), m_disableExtSeqTs(OFFalse), m_insistOnJFIF(OFFalse), m_keepAPPn(OFFalse), m_lossyCompressed(OFTrue) { DCMDATA_LIBI2D_DEBUG("I2DJpegSource: Plugin instantiated"); } OFString I2DJpegSource::inputFormat() const { return "JPEG"; } OFCondition I2DJpegSource::openFile(const OFString &filename) { DCMDATA_LIBI2D_DEBUG("I2DJpegSource: Opening JPEG file: " << filename); OFCondition cond; if (filename.length() == 0) return makeOFCondition(OFM_dcmdata, 18, OF_error, "No JPEG filename specified"); // Try to open JPEG file if ((jpegFile.fopen(filename.c_str(), "rb")) == OFFalse) return makeOFCondition(OFM_dcmdata, 18, OF_error, "Unable to open JPEG file"); return cond; } void I2DJpegSource::setExtSeqSupport(const OFBool enabled) { m_disableExtSeqTs = !enabled; } void I2DJpegSource::setProgrSupport(const OFBool enabled) { m_disableProgrTs = !enabled; } void I2DJpegSource::setInsistOnJFIF(const OFBool enabled) { m_insistOnJFIF = enabled; } void I2DJpegSource::setKeepAPPn(const OFBool enabled) { m_keepAPPn = enabled; } OFCondition I2DJpegSource::readPixelData(Uint16& rows, Uint16& cols, Uint16& samplesPerPixel, OFString& photoMetrInt, Uint16& bitsAlloc, Uint16& bitsStored, Uint16& highBit, Uint16& pixelRepr, Uint16& planConf, Uint16& pixAspectH, Uint16& pixAspectV, char*& pixData, Uint32& length, E_TransferSyntax &ts) { DCMDATA_LIBI2D_DEBUG("I2DJpegSource: Importing JPEG pixel data"); OFCondition cond = openFile(m_imageFile); // return error if file is not open if (cond.bad()) { closeFile(); return cond; } // Create "map" with byte positions of all JPEG markers in JPEG file cond = createJPEGFileMap(); if (cond.bad()) { clearMap(); closeFile(); return cond; } // Check for image data in file (look for SOF marker) E_JPGMARKER jpegEncoding; OFListIterator(JPEGFileMapEntry*) entry = m_jpegFileMap.begin(); while (entry != m_jpegFileMap.end()) { if ( isSOFMarker((*entry)->marker) ) { jpegEncoding = OFstatic_cast(E_JPGMARKER, (*entry)->marker); break; } entry++; } if (entry == m_jpegFileMap.end()) { closeFile(); return makeOFCondition(OFM_dcmdata, 18, OF_error, "No image data found in JPEG file"); } // Reject arithmetic and hierarchical (differential) encodings (not supported) cond = isJPEGEncodingSupported(jpegEncoding); if (cond.bad()) { closeFile(); return cond; } // Get transfer syntax associated with the given JPEG encoding ts = associatedTS(jpegEncoding); // Extract width, height, samples per pixel, bits per sample Uint16 width, height, spp, bps; cond = getSOFImageParameters(**entry, width, height, spp, bps); if (cond.bad()) { closeFile(); return cond; } // Return error if invalid image attributes were found if (height == 0 || width == 0) { closeFile(); return makeOFCondition(OFM_dcmdata, 18, OF_error, "Invalid image size (width or height = 0)"); } // Examine JFIF information (version, horizontal and vertical aspect ratio, aspect ratio units. Uint16 jfifVersion, unit; Uint16 aspectH = 1; Uint16 aspectV = 1; entry = m_jpegFileMap.begin(); while (entry != m_jpegFileMap.end()) { if ( (*entry)->marker == E_JPGMARKER_APP0 ) break; entry++; } if ( entry == m_jpegFileMap.end()) { if (!m_insistOnJFIF) { DCMDATA_LIBI2D_DEBUG("I2DJpegSource: Ignoring missing JFIF header"); } else { closeFile(); return makeOFCondition(OFM_dcmdata, 18, OF_error, "No JFIF information found in JPEG file"); } } else cond = getJFIFImageParameters(**entry, jfifVersion, aspectH, aspectV, unit); if (cond.bad()) { if (!m_insistOnJFIF) { DCMDATA_LIBI2D_DEBUG("I2DJpegSource: Ignoring errors while evaluating JFIF data"); } else { closeFile(); return cond; } } pixAspectH = aspectH; pixAspectV = aspectV; // Collect information needed for image pixel module rows = height; cols = width; samplesPerPixel = spp; bitsAlloc = bps; bitsStored = bitsAlloc; highBit = bitsStored - 1; if (samplesPerPixel == 1) photoMetrInt = "MONOCHROME2"; else if (samplesPerPixel == 3) photoMetrInt = "YBR_FULL_422"; else return makeOFCondition(OFM_dcmdata, 18, OF_error, "For JPEG data, Samples per Pixel must be 1 or 3"); // Planar Configuration and Pixel Representation is always 0 for JPEG data planConf = 0; pixelRepr = 0; Uint32 tLength = 0; char* tPixelData = NULL; // Keep all APPx info (however, JFIF is always removed) if (m_keepAPPn) cond = copyJPEGStream(tPixelData, tLength); // Cut off all APPx information from JPEG and get raw JPEG bit stream into memory else cond = extractRawJPEGStream(tPixelData, tLength); if (cond.bad()) { closeFile(); return cond; } length = tLength; pixData = tPixelData; return cond; } OFCondition I2DJpegSource::getLossyComprInfo(OFBool& srcEncodingLossy, OFString& srcLossyComprMethod) const { if (m_lossyCompressed) { srcEncodingLossy = OFTrue; srcLossyComprMethod = "ISO_10918_1"; // Defined term for JPEG Lossy Compression } else { // (will never get here, no lossless input supported so far) srcEncodingLossy = OFFalse; } return EC_Normal; } OFCondition I2DJpegSource::getSOFImageParameters( const JPEGFileMapEntry& entry, Uint16& imageWidth, Uint16& imageHeight, Uint16& samplesPerPixel, Uint16& bitsPerSample) { DCMDATA_LIBI2D_DEBUG("I2DJpegSource: Checking for JPEG SOF image parameters"); if ( (entry.marker < E_JPGMARKER_SOF0) || (entry.marker > E_JPGMARKER_SOF15) ) return EC_IllegalCall; Uint16 length; Uint16 image_height, image_width; Uint8 data_precision, num_components; int result; // seek to the given SOFn marker jpegFile.fseek(entry.bytePos, SEEK_SET); result = read2Bytes(length); /* usual parameter length count */ if (result == EOF) return makeOFCondition(OFM_dcmdata, 18, OF_error, "Premature EOF in JPEG file"); // read values result = read1Byte(data_precision); if (result == EOF) return makeOFCondition(OFM_dcmdata, 18, OF_error, "Premature EOF in JPEG file"); result = read2Bytes(image_height); if (result == EOF) return makeOFCondition(OFM_dcmdata, 18, OF_error, "Premature EOF in JPEG file"); result = read2Bytes(image_width); if (result == EOF) return makeOFCondition(OFM_dcmdata, 18, OF_error, "Premature EOF in JPEG file"); result = read1Byte(num_components); if (result == EOF) return makeOFCondition(OFM_dcmdata, 18, OF_error, "Premature EOF in JPEG file"); imageWidth = image_width; imageHeight = image_height; samplesPerPixel = num_components; bitsPerSample = data_precision; DCMDATA_LIBI2D_DEBUG("I2DJpegSource: JPEG SOF image parameters:"); DCMDATA_LIBI2D_DEBUG("I2DJpegSource: Image Width: " << image_width); DCMDATA_LIBI2D_DEBUG("I2DJpegSource: Image Height: " << image_height); DCMDATA_LIBI2D_DEBUG("I2DJpegSource: Number of Components: " << num_components); DCMDATA_LIBI2D_DEBUG("I2DJpegSource: Data Precision: " << data_precision); if (length != OFstatic_cast(unsigned int, 8 + num_components * 3)) return makeOFCondition(OFM_dcmdata, 18, OF_error, "Bogus SOF marker length"); return EC_Normal; } // ignores thumbnail data OFCondition I2DJpegSource::getJFIFImageParameters( const JPEGFileMapEntry& entry, Uint16& jfifVersion, Uint16& pixelAspectH, Uint16& pixelAspectV, Uint16& unit) { DCMDATA_LIBI2D_DEBUG("I2DJpegSource: Examing JFIF information"); if (entry.marker != E_JPGMARKER_APP0) return EC_IllegalCall; Uint16 jv, pah, pav, unt; // go to specified byte position and read on to value field Uint16 length; jpegFile.fseek(entry.bytePos, SEEK_SET); int result = read2Bytes(length); /* usual parameter length count */ if (result == EOF) return makeOFCondition(OFM_dcmdata, 18, OF_error, "Premature EOF in JPEG file"); // read and check the 5 byte "JFIF" marker value (X'4A', X'46', X'49', X'46', X'00') Uint16 twoBytes; result = read2Bytes(twoBytes); if ( (result == EOF) || (twoBytes != 0x4a46) ) return makeOFCondition(OFM_dcmdata, 18, OF_error, "Invalid JFIF marker or JFIF marker not found"); result = read2Bytes(twoBytes); if ( (result == EOF) || (twoBytes != 0x4946) ) return makeOFCondition(OFM_dcmdata, 18, OF_error, "Invalid JFIF marker or JFIF marker not found"); Uint8 oneByte; result = read1Byte(oneByte); if ( (result == EOF)|| (oneByte != 0x00) ) return makeOFCondition(OFM_dcmdata, 18, OF_error, "Invalid JFIF marker or JFIF marker not found"); // read JFIF version result = read2Bytes(twoBytes); if (result == EOF) return makeOFCondition(OFM_dcmdata, 18, OF_error, "Premature EOF in JPEG file"); jv = twoBytes; // read pixel aspect ratio unit result = read1Byte(oneByte); if ( (result == EOF) || (oneByte > 2) ) return makeOFCondition(OFM_dcmdata, 18, OF_error, "Premature EOF in JPEG file"); unt = oneByte; // read horizontal aspect ratio (XDensity) result = read2Bytes(twoBytes); if (result == EOF) return makeOFCondition(OFM_dcmdata, 18, OF_error, "Premature EOF in JPEG file"); pah = twoBytes; // read vertical aspect ratio (YDensity) result = read2Bytes(twoBytes); if (result == EOF) return makeOFCondition(OFM_dcmdata, 18, OF_error, "Premature EOF in JPEG file"); pav = twoBytes; // prepare return values and return jfifVersion = jv; pixelAspectH = pah; pixelAspectV = pav; unit = unt; DCMDATA_LIBI2D_DEBUG("I2DJpegSource: JPEG JFIF image parameters:"); DCMDATA_LIBI2D_DEBUG("I2DJpegSource: JFIF version: " << jfifVersion); DCMDATA_LIBI2D_DEBUG("I2DJpegSource: Horizontal Pixel Aspect Ratio " << pixelAspectH); DCMDATA_LIBI2D_DEBUG("I2DJpegSource: Vertical Pixel Aspect Ratio: " << pixelAspectV); DCMDATA_LIBI2D_DEBUG("I2DJpegSource: Units: " << unit); return EC_Normal; } OFCondition I2DJpegSource::copyJPEGStream(char*& pixelData, Uint32& pixLength) { DCMDATA_LIBI2D_DEBUG("I2DJpegSource: Copying JPEG data from JPEG file"); /* Calculate length of total stream as found in the file * Therefore, look at byte positions from SOI and EOI marker */ offile_off_t bytePosJFIF = 0; offile_off_t bytePosAfterJFIF = 0; int marker = 0; // determine file size offile_off_t result = jpegFile.fseek(0, SEEK_END); if (result != 0) return EC_IllegalParameter; offile_off_t filesize = jpegFile.ftell(); // Only pixel data up to 2^32 bytes is supported (DICOM) and maximum size for "new" operator = size_t if ( ( OFstatic_cast(unsigned long, filesize) > OFstatic_cast(unsigned long, 4294967294UL) ) || ( OFstatic_cast(unsigned long, filesize) > OFstatic_cast(unsigned long, OFstatic_cast(size_t, -1) ) ) ) { DCMDATA_LIBI2D_ERROR("I2DJpegSource: JPEG file length longer than 2^32 bytes (or larger than size_t capacity), aborting"); return EC_MemoryExhausted; } // get position of JFIF section and SOI marker OFListIterator(JPEGFileMapEntry*) entry = m_jpegFileMap.begin(); while (entry != m_jpegFileMap.end()) { marker = (*entry)->marker; if ( (marker == E_JPGMARKER_APP0) ) { bytePosJFIF = (*entry)->bytePos - 1; // include first byte of marker (FF) entry++; bytePosAfterJFIF = (*entry)->bytePos - 1; // include first byte (FF) of marker after APPn break; } entry++; } // Go to starting position (SOI marker) of JPEG stream data jpegFile.fseek(0, SEEK_SET); // Allocate buffer for raw JPEG data pixLength = OFstatic_cast(Uint32, filesize - (bytePosAfterJFIF - bytePosJFIF)); pixelData = new char[pixLength]; char *currBufferPos = pixelData; // exclude JFIF if present if (bytePosJFIF != 0) { // read from SOI to JFIF result = jpegFile.fread (currBufferPos, 1, 2); if (result != 2) return EC_IllegalCall; currBufferPos += 2; // read from end of JFIF to end of file jpegFile.fseek(bytePosAfterJFIF - 1, SEEK_SET); // -1 because offsets start with 0 result = jpegFile.fread (currBufferPos, 1, OFstatic_cast(size_t, filesize - bytePosAfterJFIF + 1)); if (result != filesize - bytePosAfterJFIF + 1) return EC_IllegalCall; } else // otherwise copy everything starting with SOI marker { result = jpegFile.fread (currBufferPos, 1, OFstatic_cast(size_t, filesize)); if (result != filesize) return EC_IllegalCall; } return EC_Normal; } // expects valid JPEG stream (especially exactly one SOI and one EOI marker) OFCondition I2DJpegSource::extractRawJPEGStream(char*& pixelData, Uint32& pixLength) { DCMDATA_LIBI2D_DEBUG("I2DJpegSource: Extracting JPEG data from JPEG file"); OFCondition cond; int marker = 0; Uint16 length; /* Calculate length of total stream as found in the file * Therefore, look at byte positions from SOI and EOI marker and * and exclude all APPn markers in calculation */ offile_off_t bytePosSOI = 0; offile_off_t bytePosEOI = 0; offile_off_t totalAPPSize = 0; OFList appPosAndLengths; OFListIterator(JPEGFileMapEntry*) entry = m_jpegFileMap.begin(); while (entry != m_jpegFileMap.end()) { marker = (*entry)->marker; if (marker == E_JPGMARKER_SOI) { bytePosSOI = (*entry)->bytePos; // Subtract one byte for the preceding 0xFF of the SOI-Marker bytePosSOI -= 1; } else if (marker == E_JPGMARKER_EOI) { bytePosEOI = (*entry)->bytePos; // No need to subtract / add bytes break; } else if (marker >= E_JPGMARKER_APP0 && marker <= E_JPGMARKER_APP15) { jpegFile.fseek((*entry)->bytePos - jpegFile.ftell(), SEEK_CUR); int result = read2Bytes( length); if (result == EOF) { jpegFile.fclose(); return makeOFCondition(OFM_dcmdata, 18, OF_error, "Premature EOF in JPEG file"); } // remember pos and length of APP data so we don't need a second "scan" for that appPosAndLengths.push_back( (*entry)->bytePos - 1 ); // -1 for FF of marker appPosAndLengths.push_back( length ); // add length of marker value to total APP size totalAPPSize += length; // add the marker length itself to total APP size totalAPPSize += 2; } // Advance to next segment entry++; } if ( (entry == m_jpegFileMap.end()) || (bytePosSOI == 0) || (bytePosEOI == 0)) // at least endmarker was not found return EC_IllegalCall; offile_off_t rawStreamSize = bytePosEOI - bytePosSOI - totalAPPSize; // Start position n and endpos. m results in a total amount of m-n+1 bytes rawStreamSize++; // Allocate buffer for raw JPEG data // Only pixel data up to 2^32 bytes is supported (DICOM) if ( ( OFstatic_cast(unsigned long, rawStreamSize) > OFstatic_cast(unsigned long, 4294967294UL) ) || ( OFstatic_cast(unsigned long, rawStreamSize) > OFstatic_cast(unsigned long, OFstatic_cast(size_t, -1) ) ) ) { DCMDATA_LIBI2D_ERROR("I2DJpegSource: Raw JPEG stream length longer than 2^32 bytes (or larger than size_t capacity), aborting"); return EC_MemoryExhausted; } pixelData = new char[OFstatic_cast(size_t, rawStreamSize)]; // keep track of current write position in memory buffer char *currBufferPos = pixelData; // Go to starting position (SOI marker) of JPEG stream data jpegFile.fseek(bytePosSOI-1, SEEK_SET); /* Copy everything but leave out APP segments */ OFBool finished = OFFalse; offile_off_t endOfBlock = 0; offile_off_t startOfNextBlock = 0; while (!finished) { // determine position of the next block to be read if ( appPosAndLengths.size() != 0) { // we have some APP blocks left endOfBlock = appPosAndLengths.front() - 1; appPosAndLengths.pop_front(); startOfNextBlock = endOfBlock + appPosAndLengths.front() + 2; // +2 for marker appPosAndLengths.pop_front(); } else // we can read to the end { endOfBlock = bytePosEOI; finished = OFTrue; } // read block offile_off_t blockSize = endOfBlock - jpegFile.ftell(); int result = jpegFile.fread (currBufferPos, 1, OFstatic_cast(size_t, blockSize)); if (result != blockSize) return EC_IllegalCall; // prepare for reading next block if (!finished) { jpegFile.fseek(startOfNextBlock, SEEK_SET); currBufferPos += blockSize; } } // update result variable pixLength = OFstatic_cast(size_t, rawStreamSize); return cond; } OFCondition I2DJpegSource::createJPEGFileMap() { DCMDATA_LIBI2D_DEBUG("I2DJpegSource: Examing JPEG file and creating map of JPEG markers"); E_JPGMARKER marker; JPEGFileMapEntry *entry = NULL; OFBool lastWasSOSMarker = OFFalse; OFCondition cond; /* Expect SOI at start of file */ E_JPGMARKER first; cond = firstMarker(first); if (cond.bad()) return cond; entry = new JPEGFileMapEntry(); entry->bytePos = jpegFile.ftell(); entry->marker = first; m_jpegFileMap.push_back(entry); if (first != E_JPGMARKER_SOI) return makeOFCondition(OFM_dcmdata, 18, OF_error, "I2DJpegSource: SOI marker not found at beginning of JPEG stream"); /* Scan miscellaneous markers until we reach EOI */ while (cond.good()) { cond = nextMarker(lastWasSOSMarker, marker); if (cond.good()) { entry = new JPEGFileMapEntry(); entry->bytePos = jpegFile.ftell(); entry->marker = marker; m_jpegFileMap.push_back(entry); if (marker == E_JPGMARKER_SOS) { // FIXME: reset this to OFFalse after the next marker? lastWasSOSMarker = OFTrue; } else if (marker == E_JPGMARKER_EOI) { // End of file reached cond = EC_Normal; break; } else if ( isSOFMarker(marker) && m_keepAPPn ) { cond = EC_Normal; break; } if ( !isRSTMarker(marker) ) // RST marker does not have a length that could be used for skipping skipVariable(); } } /* end loop */ debugDumpJPEGFileMap(); return cond; } OFBool I2DJpegSource::isRSTMarker(const E_JPGMARKER& marker) { return ((marker >= E_JPGMARKER_RST0) && (marker <= E_JPGMARKER_RST7)); } OFBool I2DJpegSource::isSOFMarker(const E_JPGMARKER& marker) { return ( (marker >= E_JPGMARKER_SOF0) && (marker <= E_JPGMARKER_SOF15) && (marker != E_JPGMARKER_DHT) && (marker != E_JPGMARKER_DAC)); } OFString I2DJpegSource::jpegMarkerToString(const E_JPGMARKER& marker) { switch (marker) { case(E_JPGMARKER_SOF0) : return "SOF0: Baseline DCT"; break; case(E_JPGMARKER_SOF1) : return "SOF1: Extended sequential DCT"; break; case(E_JPGMARKER_SOF2) : return "SOF2: Progressive DCT"; break; case(E_JPGMARKER_SOF3) : return "SOF3: Lossless (sequential)"; break; case(E_JPGMARKER_SOF5) : return "SOF5: Differential sequential DCT"; break; case(E_JPGMARKER_SOF6) : return "SOF6: Differential progressive DCT"; break; case(E_JPGMARKER_SOF7) : return "SOF7: Differential lossless (sequential)"; break; case(E_JPGMARKER_JPG) : return "JPG: JPEG extension"; break; case(E_JPGMARKER_SOF9) : return "SOF9: Extended sequential DCT"; break; case(E_JPGMARKER_SOF10) : return "SOF10: Progressive DCT"; break; case(E_JPGMARKER_SOF11) : return "SOF11: Lossless (sequential)"; break; case(E_JPGMARKER_SOF13) : return "SOF13: Differential sequential DCT"; break; case(E_JPGMARKER_SOF14) : return "SOF14: Differential progressive DCT"; break; case(E_JPGMARKER_SOF15) : return "SOF15: Differential lossless (sequential)"; break; case(E_JPGMARKER_DHT) : return "DHT: Huffman table(s)"; break; case(E_JPGMARKER_DAC) : return "DAC: Arithmetic coding conditioning(s)"; break; case(E_JPGMARKER_SOI) : return "SOI: Start of image"; break; case(E_JPGMARKER_EOI) : return "EOI: End of image"; break; case(E_JPGMARKER_SOS) : return "SOS: Start of scan"; break; case(E_JPGMARKER_DQT) : return "DQT: Quantization table(s)"; break; case(E_JPGMARKER_DNL) : return "DNL: Number of lines"; break; case(E_JPGMARKER_DRI) : return "DRI: Define restart interval"; break; case(E_JPGMARKER_DHP) : return "DHP: Hierarchical progression"; break; case(E_JPGMARKER_EXP) : return "EXP: Expand reference component(s)"; break; case(E_JPGMARKER_COM) : return "COM: Comment"; break; case(E_JPGMARKER_TEM) : return "TEM: For temporary private use in arithmetic coding"; break; default: if ((marker >= E_JPGMARKER_RST0) && (marker <= E_JPGMARKER_RST7)) {return "RSTn: Restart interval termination"; break;} if ((marker >= E_JPGMARKER_APP0) && (marker <= E_JPGMARKER_APP15)) {return "APPn: Application segment"; break;} if ((marker >= E_JPGMARKER_JPGN0) && (marker <= E_JPGMARKER_JPGN13)) {return "JPGn: JPEG extension"; break;} if ((marker >= E_JPGMARKER_RES0) && (marker <= E_JPGMARKER_RESN)) {return "RESn"; break;} } OFString msg = "UNKNOWN MARKER :"; char hexNo[10]; sprintf(hexNo,"%x2", marker); msg += hexNo; return msg; } /* Read one byte, testing for EOF */ int I2DJpegSource::read1Byte(Uint8& result) { register int c; c = jpegFile.fgetc(); if (c == EOF) return EOF; result = OFstatic_cast(Uint8, c); return 0; } /* Read 2 bytes, convert to unsigned int */ /* All 2-byte quantities in JPEG markers are MSB first */ int I2DJpegSource::read2Bytes(Uint16& result) { int c1, c2; c1 = jpegFile.fgetc(); if (c1 == EOF) return EOF; c2 = jpegFile.fgetc(); if (c2 == EOF) return EOF; result = ((OFstatic_cast(Uint16, c1)) << 8) + OFstatic_cast(Uint16, c2); return 0; } /* * Find the next JPEG marker and return its marker code. * We expect at least one FF byte, possibly more if the compressor used FFs * to pad the file. * There could also be non-FF garbage between markers. The treatment of such * garbage is unspecified; we choose to skip over it but emit a warning msg. */ OFCondition I2DJpegSource::nextMarker(const OFBool& lastWasSOSMarker, E_JPGMARKER& result) { Uint8 c; int discarded_bytes = 0; int oneByte; do { /* Find 0xFF byte; count and skip any non-FFs. */ oneByte = read1Byte(c); if (oneByte == EOF) return makeOFCondition(OFM_dcmdata, 18, OF_error, "Premature EOF in JPEG file"); while (c != 0xFF) { if (!lastWasSOSMarker) discarded_bytes++; oneByte = read1Byte(c); if (oneByte == EOF) return makeOFCondition(OFM_dcmdata, 18, OF_error, "Premature EOF in JPEG file"); } /* Get marker code byte, swallowing any duplicate FF bytes. Extra FFs * are legal as pad bytes, so don't count them in discarded_bytes. */ do { oneByte = read1Byte(c); if (oneByte == EOF) return makeOFCondition(OFM_dcmdata, 18, OF_error, "Premature EOF in JPEG file"); } while (c == 0xFF); } while (lastWasSOSMarker && c == 0x00); if (discarded_bytes != 0) { DCMDATA_LIBI2D_WARN("garbage data found in JPEG file"); } result = OFstatic_cast(E_JPGMARKER, c); return EC_Normal; } /* * Read the initial marker, which should be SOI. * For a JFIF file, the first two bytes of the file should be literally * 0xFF M_SOI. */ OFCondition I2DJpegSource::firstMarker(E_JPGMARKER& result) { Uint8 c1, c2; c1 = OFstatic_cast(Uint8, jpegFile.fgetc()); c2 = OFstatic_cast(Uint8, jpegFile.fgetc()); if (c1 != 0xFF || c2 != E_JPGMARKER_SOI) { return makeOFCondition(OFM_dcmdata, 18, OF_error, "Not a JPEG file"); } result = OFstatic_cast(E_JPGMARKER, c2); return EC_Normal; } /* * Most types of marker are followed by a variable-length parameter segment. * This routine skips over the parameters for any marker we don't otherwise * want to process. * Note that we MUST skip the parameter segment explicitly in order not to * be fooled by 0xFF bytes that might appear within the parameter segment; * such bytes do NOT introduce new markers. */ OFCondition I2DJpegSource::skipVariable() /* Skip over an unknown or uninteresting variable-length marker */ { Uint16 length; /* Get the marker parameter length count */ int result = read2Bytes(length); if (result == EOF) return makeOFCondition(OFM_dcmdata, 18, OF_error, "Premature EOF in JPEG file"); /* Length includes itself, so must be at least 2 */ if (length < 2) return makeOFCondition(OFM_dcmdata, 18, OF_error, "Erroneous JPEG marker length"); length -= 2; /* Skip over the remaining bytes */ jpegFile.fseek(length, SEEK_CUR); return EC_Normal; } OFCondition I2DJpegSource::isJPEGEncodingSupported(const E_JPGMARKER& jpegEncoding) const { DCMDATA_LIBI2D_DEBUG("I2DJpegSource: Checking whether JPEG encoding is supported: " << jpegMarkerToString(jpegEncoding)); switch (jpegEncoding) { case E_JPGMARKER_SOF0: // Baseline return EC_Normal; case E_JPGMARKER_SOF1: // Extended sequential if (!m_disableExtSeqTs) return EC_Normal; else return makeOFCondition(OFM_dcmdata, 18, OF_error, "Unable to convert: Extended sequential JPEG coding found but support disabled"); case E_JPGMARKER_SOF2: // Progressive if (!m_disableProgrTs) return EC_Normal; else return makeOFCondition(OFM_dcmdata, 18, OF_error, "Unable to convert: Progressive JPEG coding found but disabled"); // SOF3: Lossless, SOF5-7: Hierarchical (differential), SOF9-15: Arithmetic coding, all other default: OFString errMsg("JPEG data with encoding: '"); errMsg += I2DJpegSource::jpegMarkerToString(jpegEncoding); errMsg += "' not supported"; return makeOFCondition(OFM_dcmdata, 18, OF_error, errMsg.c_str()); } return EC_Normal; } E_TransferSyntax I2DJpegSource::associatedTS(const E_JPGMARKER& jpegEncoding) { switch (jpegEncoding) { case E_JPGMARKER_SOF0: // Baseline return EXS_JPEGProcess1TransferSyntax; case E_JPGMARKER_SOF1: // Extended Sequential return EXS_JPEGProcess2_4TransferSyntax; case E_JPGMARKER_SOF2: // Progressive return EXS_JPEGProcess10_12TransferSyntax; default: return EXS_Unknown; } } void I2DJpegSource::debugDumpJPEGFileMap() const { if (!DCM_dcmdataLibi2dGetLogger().isEnabledFor(OFLogger::DEBUG_LOG_LEVEL)) return; DCMDATA_LIBI2D_DEBUG("I2DJpegSource: Dumping JPEG marker file map: "); if (m_keepAPPn) DCMDATA_LIBI2D_DEBUG("I2DJpegSource: Keep APPn option enabled, any markers after SOFn marker will not be dumped"); OFListConstIterator(JPEGFileMapEntry*) it= m_jpegFileMap.begin(); while (it != m_jpegFileMap.end()) { DCMDATA_LIBI2D_DEBUG("I2DJpegSource: Byte Position: 0x" << STD_NAMESPACE hex << STD_NAMESPACE setw(8) << STD_NAMESPACE setfill('0') /* need to cast bytePos to unsigned long to keep VC6 happy */ << OFstatic_cast(unsigned long, (*it)->bytePos) <<" | Marker: " << jpegMarkerToString( (*it)->marker)); it++; } } void I2DJpegSource::clearMap() { // free memory of each map entry and remove them all from list JPEGFileMapEntry *entry = NULL; while (m_jpegFileMap.size() != 0) { entry = m_jpegFileMap.front(); m_jpegFileMap.pop_front(); delete entry; entry = NULL; } } // closes underlying JPEG file void I2DJpegSource::closeFile() { jpegFile.fclose(); } // close file and free dynamically allocated memory I2DJpegSource::~I2DJpegSource() { DCMDATA_LIBI2D_DEBUG("I2DJpegSource: Closing JPEG file and cleaning up memory"); closeFile(); clearMap(); } /* * CVS/RCS Log: * $Log: i2djpgs.cc,v $ * Revision 1.16 2010-11-29 13:10:00 uli * Fixed stack overflow in libi2d with some JPEG data streams. * * Revision 1.15 2010-10-14 13:18:23 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.14 2010-08-05 08:38:10 uli * Fixed some warnings from -Wold-style-cast. * * Revision 1.13 2009-11-13 13:23:30 joergr * Fixed minor issues in log output. * * Revision 1.12 2009-11-04 09:58:08 uli * Switched to logging mechanism provided by the "new" oflog module * * Revision 1.11 2009-09-30 08:05:25 uli * Stop including dctk.h in libi2d's header files. * * Revision 1.10 2009-09-17 06:55:10 joergr * Used static cast operator where appropriate and changed suffix from "L" to * "UL" for large integer constants. * * Revision 1.9 2009-08-26 07:45:52 joergr * Added suffix "L" to large integer constants in order to avoid warnings * reported by gcc 4.3.2. * * Revision 1.8 2009-04-20 16:02:35 joergr * Fixed typo. * * Revision 1.7 2009-03-31 13:27:03 onken * Small fix regarding lossy compression parameters. * * Revision 1.4 2009-02-18 12:22:11 meichel * Minor changes needed for VC6 * * Revision 1.3 2008-03-10 13:10:01 onken * Changed OFListIterator to OFListConstIterator in order to complile when * HAVE_STL is defined. * * Revision 1.2 2008-01-16 16:32:31 onken * Fixed some empty or doubled log messages in libi2d files. * * Revision 1.1 2008-01-16 14:38:17 onken * Moved library "i2dlib" from /dcmdata/libsrc/i2dlib to /dcmdata/libi2d * * Revision 1.1 2007/11/08 15:55:17 onken * Initial checkin of img2dcm application and corresponding library i2dlib. * * */ dcmtk-3.6.0/dcmdata/libi2d/i2dplsc.cc0000644000310500011400000000516111455601440016453 0ustar joergrdicom3/* * * Copyright (C) 2001-2010, 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: dcmdata * * Author: Michael Onken * * Purpose: Implements conversion from image into DICOM SC IOD * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:18:24 $ * CVS/RCS Revision: $Revision: 1.5 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/libi2d/i2dplsc.h" #include "dcmtk/dcmdata/libi2d/i2doutpl.h" #include "dcmtk/dcmdata/dcdeftag.h" /* for DCM_ defines */ #include "dcmtk/dcmdata/dcuid.h" /* for UID_ defines */ I2DOutputPlugSC::I2DOutputPlugSC() { DCMDATA_LIBI2D_DEBUG("I2DOutputPlugSC: Output plugin for Secondary Capture initialized"); } OFString I2DOutputPlugSC::ident() { return "Secondary Capture Image SOP Class"; } void I2DOutputPlugSC::supportedSOPClassUIDs(OFList suppSOPs) { suppSOPs.push_back(UID_SecondaryCaptureImageStorage); } OFCondition I2DOutputPlugSC::convert(DcmDataset &dataset) const { DCMDATA_LIBI2D_DEBUG("I2DOutputPlugSC: Inserting SC specific attributes"); OFCondition cond; cond = dataset.putAndInsertOFStringArray(DCM_SOPClassUID, UID_SecondaryCaptureImageStorage); return EC_Normal; } OFString I2DOutputPlugSC::isValid(DcmDataset& dataset) const { OFString err; // Just return if checking was disabled if (!m_doAttribChecking) return err; DCMDATA_LIBI2D_DEBUG("I2DOutputPlugSC: Checking SC specific attributes"); err += checkAndInventType1Attrib(DCM_ConversionType, &dataset, "WSD"); // WSD="Workstation" return err; } I2DOutputPlugSC::~I2DOutputPlugSC() { } /* * CVS/RCS Log: * $Log: i2dplsc.cc,v $ * Revision 1.5 2010-10-14 13:18:24 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.4 2009-11-04 09:58:08 uli * Switched to logging mechanism provided by the "new" oflog module * * Revision 1.3 2009-09-30 08:05:26 uli * Stop including dctk.h in libi2d's header files. * * Revision 1.2 2008-01-16 16:32:31 onken * Fixed some empty or doubled log messages in libi2d files. * * Revision 1.1 2008-01-16 14:40:43 onken * Moved library "i2dlib" from /dcmdata/libsrc/i2dlib to /dcmdata/libi2d * * Revision 1.1 2007/11/08 15:55:17 onken * Initial checkin of img2dcm application and corresponding library i2dlib. * * */ dcmtk-3.6.0/dcmdata/libi2d/i2dbmps.cc0000644000310500011400000004453111477134722016467 0ustar joergrdicom3/* * * Copyright (C) 2009-2010, 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: dcmdata * * Author: Uli Schlachter * * * Purpose: Class to extract pixel data and meta information from BMP file * * Last Update: $Author: uli $ * Update Date: $Date: 2010-12-06 10:24:18 $ * CVS/RCS Revision: $Revision: 1.14 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" #include "dcmtk/dcmdata/libi2d/i2dbmps.h" #include "dcmtk/dcmdata/dcerror.h" #include "dcmtk/dcmdata/libi2d/i2doutpl.h" #ifndef UINT16_MAX /// Maximum value a Uint16 can hold #define UINT16_MAX 65535 #endif I2DBmpSource::I2DBmpSource() : bmpFile() { DCMDATA_LIBI2D_DEBUG("I2DBmpSource: Plugin instantiated"); } OFString I2DBmpSource::inputFormat() const { return "BMP"; } OFCondition I2DBmpSource::openFile(const OFString &filename) { DCMDATA_LIBI2D_DEBUG("I2DBmpSource: Opening BMP file: " << filename); OFCondition cond; if (filename.length() == 0) return makeOFCondition(OFM_dcmdata, 18, OF_error, "No BMP filename specified"); // Try to open BMP file if ((bmpFile.fopen(filename.c_str(), "rb")) == OFFalse) return makeOFCondition(OFM_dcmdata, 18, OF_error, "Unable to open BMP file"); return cond; } OFCondition I2DBmpSource::readPixelData(Uint16& rows, Uint16& cols, Uint16& samplesPerPixel, OFString& photoMetrInt, Uint16& bitsAlloc, Uint16& bitsStored, Uint16& highBit, Uint16& pixelRepr, Uint16& planConf, Uint16& pixAspectH, Uint16& pixAspectV, char*& pixData, Uint32& length, E_TransferSyntax &ts) { DCMDATA_LIBI2D_DEBUG("I2DBmpSource: Importing BMP pixel data"); OFCondition cond = openFile(m_imageFile); // return error if file is not open if (cond.bad()) { closeFile(); return cond; } /* Read both file headers */ Uint32 dataOffset; cond = readFileHeader(dataOffset); if (cond.bad()) { closeFile(); return cond; } Uint16 width, height; Uint16 bpp, colors; OFBool isTopDown = OFFalse; /* Most BMPs are stored bottom-up */ cond = readBitmapHeader(width, height, bpp, isTopDown, colors); if (cond.bad()) { closeFile(); return cond; } Uint32 *palette = NULL; cond = readColorPalette(colors, palette); if (cond.bad()) { closeFile(); return cond; } /* Now jump to the bitmap data... */ if (bmpFile.fseek(dataOffset, SEEK_SET) != 0) return EC_EndOfStream; /* ...and read the "real" image data */ char *data; Uint32 data_length; cond = readBitmapData(width, height, bpp, isTopDown, colors, palette, data, data_length); if (palette) delete[] palette; if (cond.bad()) { closeFile(); return cond; } /* Now we got all the info that we need, return it to caller */ rows = height; cols = width; samplesPerPixel = 3; /* 24 bpp */ bitsAlloc = 8; bitsStored = 8; highBit = 7; photoMetrInt = "RGB"; planConf = 0; /* For each pixel we save rgb in that order */ pixData = data; length = data_length; pixAspectH = pixAspectV = 1; pixelRepr = 0; ts = EXS_LittleEndianExplicit; return cond; } OFCondition I2DBmpSource::readFileHeader(Uint32 &offset) { Uint16 magic; if (readWord(magic) != 0) return EC_EndOfStream; /* ASCII "BM", decimal 19778 */ if (magic != 19778) return makeOFCondition(OFM_dcmdata, 18, OF_error, "Not a BMP file - invalid header"); /* Skip over two uninteresting entries */ if (bmpFile.fseek(8, SEEK_CUR) != 0) return makeOFCondition(OFM_dcmdata, 18, OF_error, "Not a BMP file - invalid header"); if (readDWord(offset) != 0) return EC_EndOfStream; DCMDATA_LIBI2D_DEBUG("I2DBmpSource: BMP data at file offset: " << offset); return EC_Normal; } OFCondition I2DBmpSource::readBitmapHeader(Uint16 &width, Uint16 &height, Uint16 &bpp, OFBool &isTopDown, Uint16 &colors) { Uint16 tmp_word; Uint32 tmp_dword; /* 40 is the size of the bitmap info header */ if (readDWord(tmp_dword) != 0 || tmp_dword != 40) return makeOFCondition(OFM_dcmdata, 18, OF_error, "Not a BMP file - invalid bitmap header"); Sint32 tmp_width, tmp_height; if (readLong(tmp_width) != 0) return EC_EndOfStream; if (readLong(tmp_height) != 0) return EC_EndOfStream; if (tmp_height < 0) /* Is this a top down bitmap? */ { isTopDown = OFTrue; tmp_height = -tmp_height; } else isTopDown = OFFalse; height = OFstatic_cast(Uint16, tmp_height); // Check if we got a valid value here which fits into a Uint16 // (height < 0 can happen because -(INT_MIN) == INT_MIN). if (tmp_height <= 0 || tmp_height > UINT16_MAX) return makeOFCondition(OFM_dcmdata, 18, OF_error, "Unsupported BMP file - height too large or zero"); if (tmp_width < 0) /* Width also can be signed, but no semantic */ { tmp_width = -tmp_width; } width = OFstatic_cast(Uint16, tmp_width); if (tmp_width <= 0 || tmp_width > UINT16_MAX) return makeOFCondition(OFM_dcmdata, 18, OF_error, "Unsupported BMP file - width too large or zero"); /* Some older standards used this, always 1 for BMP (number of planes) */ if (readWord(tmp_word) != 0 || tmp_word != 1) return makeOFCondition(OFM_dcmdata, 18, OF_error, "Not a BMP file - invalid number of planes"); /* Color depth in bpp */ if (readWord(tmp_word) != 0) return EC_EndOfStream; bpp = tmp_word; DCMDATA_LIBI2D_DEBUG("I2DBmpSource: BMP bpp: " << OFstatic_cast(int, bpp)); /* Compression info */ if (readDWord(tmp_dword) != 0) return EC_EndOfStream; /* We don't support compressed BMPs */ if (tmp_dword != 0) return makeOFCondition(OFM_dcmdata, 18, OF_error, "Unsupported BMP file - compressed"); /* We don't care about the next three fields of the bitmap info header: * DWord: Size of image data or 0 (yes, that's what the standard says!). * Long: Horizontal resolution in pixel per meter, mostly set to 0. * Long: Vertical resolution in pixel per meter, mostly set to 0: */ if (bmpFile.fseek(12, SEEK_CUR) != 0) return EC_EndOfStream; /* Number of entries in color table, 0 means "use default" */ if (readDWord(tmp_dword) != 0) return EC_EndOfStream; /* A BMP file can only have 256 color table entries */ if (tmp_dword > 256) return makeOFCondition(OFM_dcmdata, 18, OF_error, "invalid BMP file - color table too big"); colors = OFstatic_cast(Uint16, tmp_dword); if (colors == 0) { // In this case, 1, 4 and 8 bpp get 2**bpp colors in the color table, // others get no color table at all. switch (bpp) { case 1: colors = 2; break; case 4: colors = 16; break; case 8: colors = 256; break; default: colors = 0; break; } } /* Skip another uninteresting entry (number of important colors) */ if (bmpFile.fseek(4, SEEK_CUR) != 0) return EC_EndOfStream; DCMDATA_LIBI2D_DEBUG("I2DBmpSource: BMP width: " << width); DCMDATA_LIBI2D_DEBUG("I2DBmpSource: BMP height: " << height); DCMDATA_LIBI2D_DEBUG("I2DBmpSource: BMP stored as top down: " << (isTopDown ? "Yes" : "No")); DCMDATA_LIBI2D_DEBUG("I2DBmpSource: Colortable entries: " << colors); return EC_Normal; } OFCondition I2DBmpSource::readColorPalette(Uint16 colors, Uint32*& palette) { if (colors == 0) // Nothing to do; return EC_Normal; if (colors > 256) // BMPs can not have more than 256 color table entries return EC_IllegalCall; // Read the color palette palette = new Uint32[colors]; for (int i = 0; i < colors; i++) { Uint32 tmp; // Each item is 32-bit BGRx entry, this function reads that data if (readDWord(tmp) != 0) { delete[] palette; palette = NULL; return EC_EndOfStream; } // Converting this BGRx into RGB is done elsewhere palette[i] = tmp; } return EC_Normal; } OFCondition I2DBmpSource::readBitmapData(const Uint16 width, const Uint16 height, const Uint16 bpp, const OFBool isTopDown, const Uint16 colors, const Uint32* palette, char*& pixData, Uint32& length) { /* row_length = width * bits_per_pixel / 8 bits_per_byte. row_length must be rounded *up* to a 4-byte boundary: row_length = (row_length + 3) & ~3 */ const Uint32 row_length = ((width * bpp + 31) / 32) * 4; Uint8 *row_data; Uint32 y; Sint32 direction; Uint32 max; // "palette" may only be NULL if colors is 0 and vice versa if ((palette == NULL) != (colors == 0)) return EC_IllegalCall; // These bit depths always need a color palette if (colors == 0 && (bpp == 1 || bpp == 4 || bpp == 8)) return makeOFCondition(OFM_dcmdata, 18, OF_error, "invalid BMP file - missing color palette"); if (isTopDown) { /* This is a top-down BMP, we start at the first row and work our way down */ y = 1; direction = 1; max = height + 1; } else { /* Bottom-up BMP, we start with the last row and work our way up */ y = height; direction = -1; max = 0; } length = width * height * 3; DCMDATA_LIBI2D_DEBUG("I2DBmpSource: Starting to read bitmap data"); row_data = new Uint8[row_length]; pixData = new char[length]; if (!row_data || !pixData) { delete[] row_data; delete[] pixData; return EC_MemoryExhausted; } /* Go through each row of the image */ for (; y != max; y += direction) { /* Calculate posData for this line, it is the index of the first byte for * this line. ( -1 because we start at index 1, but C at index 0) */ Uint32 posData = (y - 1) * width * 3; if (bmpFile.fread(row_data, 1, row_length) < row_length) { delete[] row_data; delete[] pixData; return EC_EndOfStream; } OFCondition cond; switch (bpp) { case 1: case 4: case 8: cond = parseIndexedColorRow(row_data, width, bpp, colors, palette, &pixData[posData]); break; case 16: cond = parse16BppRow(row_data, width, &pixData[posData]); break; case 24: case 32: cond = parse24_32BppRow(row_data, width, bpp, &pixData[posData]); break; default: cond = makeOFCondition(OFM_dcmdata, 18, OF_error, "unsupported BMP file - invalid bpp"); break; } if (cond.bad()) { delete[] row_data; delete[] pixData; return cond; } } DCMDATA_LIBI2D_DEBUG("I2DBmpSource: Done reading bitmap data"); delete[] row_data; return EC_Normal; } OFCondition I2DBmpSource::parse24_32BppRow(const Uint8 *row, const Uint16 width, const int bpp, char *pixData) const { /* We now must convert this line of the bmp file into the kind of data that * our caller expects. Each pixel consists of three bytes: blue, green, red * (notice the order!) pixel value. We convert this into "standard" RGB. */ Uint32 x; Uint32 pos_a = 0; Uint32 pos_b = 0; /* 32bpp images really are 24bpp images with a null byte prepended in front of * each pixel. Some apps use that as an alpha channel, but that's not allowed. */ int offset = 0; if (bpp == 32) offset = 1; for (x = 0; x < width; x++) { Uint8 r = row[pos_a + 2]; Uint8 g = row[pos_a + 1]; Uint8 b = row[pos_a]; pixData[pos_b] = r; pixData[pos_b + 1] = g; pixData[pos_b + 2] = b; pos_a += 3 + offset; pos_b += 3; } return EC_Normal; } OFCondition I2DBmpSource::parse16BppRow(const Uint8 *row, const Uint16 width, char *pixData) const { /* We now must convert this line of the bmp file into the kind of data that * our caller expects. Each pixel consists of three bytes: blue, green, red * (notice the order!) pixel value. We convert this into "standard" RGB. */ Uint32 x; Uint32 pos = 0; for (x = 0; x < width; x++) { // Assemble one pixel value from the input data Uint16 pixel = 0; pixel |= OFstatic_cast(Uint16, row[2*x + 1]) << 8; pixel |= OFstatic_cast(Uint16, row[2*x + 0]); // Each colors has 5 bit, we convert that into 8 bit Uint8 r = (pixel >> 10) << 3; Uint8 g = (pixel >> 5) << 3; Uint8 b = (pixel >> 0) << 3; pixData[pos] = r; pixData[pos + 1] = g; pixData[pos + 2] = b; pos += 3; } return EC_Normal; } OFCondition I2DBmpSource::parseIndexedColorRow(const Uint8 *row, const Uint16 width, const int bpp, const Uint16 colors, const Uint32* palette, char *pixData /*out*/) const { // data that is still left from reading the last pixel Uint8 data = 0; // Number of valid bits in data Uint8 bitsLeft = 0; Uint32 pos = 0; Uint32 pos_input = 0; for (Uint32 x = 0; x < width; x++) { // Check if we need to go to the next byte of input data if (bitsLeft == 0) { bitsLeft = 8; data = row[pos_input++]; } // Get the left-most bpp bits from data Uint8 index = (data >> (bitsLeft - bpp)); // The right-most bpp bits in "index" now contain the data we want, // clear all the higher bits. // (1 << bpp) gives us in binary: 00001000 (with bpp zero bits) if we // substract 1, only the right-most bpp bits will be 1. index &= (1 << bpp) - 1; bitsLeft -= bpp; // Check if we are still in the color palette if (index >= colors) return makeOFCondition(OFM_dcmdata, 18, OF_error, "unsupported BMP file - access beyond end of color table"); // Get the colors Uint32 pixel = palette[index]; // And save it in the resulting image, this implicitly converts the BGR we // got from the color table into RGB. pixData[pos] = OFstatic_cast(Uint8, pixel >> 16); pixData[pos + 1] = OFstatic_cast(Uint8, pixel >> 8); pixData[pos + 2] = OFstatic_cast(Uint8, pixel >> 0); pos += 3; } return EC_Normal; } /* Read 2 bytes, convert to unsigned int */ /* All 2-byte quantities in BMP are little-endian */ int I2DBmpSource::readWord(Uint16& result) { int c1, c2; c1 = bmpFile.fgetc(); if (c1 == EOF) return EOF; c2 = bmpFile.fgetc(); if (c2 == EOF) return EOF; result = (OFstatic_cast(Uint16, c2) << 8) + OFstatic_cast(Uint16, c1); return 0; } /* Read 4 bytes, convert to unsigned int */ /* All 4-byte quantities in BMP are little-endian */ int I2DBmpSource::readDWord(Uint32& result) { int c1, c2, c3, c4; c1 = bmpFile.fgetc(); if (c1 == EOF) return EOF; c2 = bmpFile.fgetc(); if (c2 == EOF) return EOF; c3 = bmpFile.fgetc(); if (c3 == EOF) return EOF; c4 = bmpFile.fgetc(); if (c4 == EOF) return EOF; result = (OFstatic_cast(Uint32, c4) << 24) + (OFstatic_cast(Uint32, c3) << 16) + (OFstatic_cast(Uint32, c2) << 8) + OFstatic_cast(Uint32, c1); return 0; } int I2DBmpSource::readLong(Sint32& result) { Uint32 tmp; /* First read, it as a "normal" double word */ if (readDWord(tmp) != 0) return EOF; /* tmp is a two's complement (signed integer) and we have to convert it into that */ if (tmp & (1 << 31)) { /* If the highest bit is set, it is a negative number, convert it */ result = -(OFstatic_cast(Sint32, ~(tmp - 1))); } else { /* It is a positive number, no conversion necessary */ result = tmp; } return 0; } // closes underlying BMP file void I2DBmpSource::closeFile() { bmpFile.fclose(); } // close file and free dynamically allocated memory I2DBmpSource::~I2DBmpSource() { DCMDATA_LIBI2D_DEBUG("I2DBmpSource: Closing BMP file and cleaning up memory"); closeFile(); } /* * CVS/RCS Log: * $Log: i2dbmps.cc,v $ * Revision 1.14 2010-12-06 10:24:18 uli * Fixed a correct warning from Intel Compiler 11.1 for shifting a Uint8 by 8. * * Revision 1.13 2010-10-14 13:18:23 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.12 2010-08-05 08:38:10 uli * Fixed some warnings from -Wold-style-cast. * * Revision 1.11 2010-06-08 14:39:12 uli * Check for premature file ending while reading the pixel data. * * Revision 1.10 2010-06-08 14:34:45 uli * Correctly calculate the row length for images with bpp below 8. * * Revision 1.9 2010-06-04 12:06:25 uli * Fixed a warning with VisualStudio 2008 about an implicit cast. * * Revision 1.8 2010-06-01 12:59:48 uli * Generate a better error message if an image exceeds 65535 rows or columns. * * Revision 1.7 2010-06-01 10:33:53 uli * Added support for indexed-color BMP images (bit depths 1, 4 and 8). * * Revision 1.6 2010-05-25 12:40:06 uli * Added support for 16bpp BMP images to libi2d * * Revision 1.5 2010-05-21 14:43:07 uli * Added support for 32bpp BMP images to libi2d. * * Revision 1.4 2009-11-04 09:58:08 uli * Switched to logging mechanism provided by the "new" oflog module * * Revision 1.3 2009-09-30 08:05:25 uli * Stop including dctk.h in libi2d's header files. * * Revision 1.2 2009-08-13 09:00:20 onken * Fixed minor formatting issues and bug that caused some images being * converted upside down. * * Revision 1.1 2009-07-16 14:25:38 onken * Added img2dcm input plugin for the BMP graphics format (at the moment only * support for 24 Bit RGB). * */ dcmtk-3.6.0/dcmdata/libi2d/CMakeLists.txt0000644000310500011400000000025511227634142017345 0ustar joergrdicom3# create library from source files ADD_LIBRARY(libi2d i2d i2dplvlp i2djpgs i2dbmps i2dplsc i2dplnsc) # declare installation files INSTALL_TARGETS(${INSTALL_LIBDIR} libi2d) dcmtk-3.6.0/dcmdata/libi2d/i2d.cc0000644000310500011400000006522011463514644015603 0ustar joergrdicom3/* * * Copyright (C) 2007-2010, 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: dcmdata * * Author: Michael Onken * * Purpose: Implements utility for converting standard image formats to DICOM * * Last Update: $Author: uli $ * Update Date: $Date: 2010-11-01 10:42:44 $ * CVS/RCS Revision: $Revision: 1.15 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/libi2d/i2d.h" #include "dcmtk/dcmdata/dcpxitem.h" #include "dcmtk/dcmdata/dcfilefo.h" /* for DcmFileFormat */ #include "dcmtk/dcmdata/dcdeftag.h" /* for DCM_ defines */ #include "dcmtk/dcmdata/dcuid.h" /* for SITE_SERIES_UID_ROOT */ #include "dcmtk/dcmdata/dcpixseq.h" /* for DcmPixelSequence */ #include "dcmtk/dcmdata/dcpath.h" /* for override keys */ OFLogger DCM_dcmdataLibi2dGetLogger() { // We don't just use a global variable, because constructors of globals are // executed in random order. This guarantees that the OFLogger is constructed // before first use. static OFLogger DCM_dcmdata_libi2dLogger = OFLog::getLogger("dcmtk.dcmdata.libi2d"); return DCM_dcmdata_libi2dLogger; } Image2Dcm::Image2Dcm() : m_overrideKeys(), m_templateFile(""), m_readStudyLevel(OFFalse), m_readSeriesLevel(OFFalse), m_studySeriesFile(), m_incInstNoFromFile(OFFalse), m_disableAttribChecks(OFFalse), m_inventMissingType2Attribs(OFTrue), m_inventMissingType1Attribs(OFFalse), m_insertLatin1(OFTrue) { } OFCondition Image2Dcm::convert(I2DImgSource *inputPlug, I2DOutputPlug *outPlug, DcmDataset*& resultDset, E_TransferSyntax& proposedTS) { if (!inputPlug || !outPlug) return EC_IllegalParameter; OFCondition cond; DCMDATA_LIBI2D_DEBUG("Image2Dcm: Starting conversion of file: " << inputPlug->getImageFile()); // If specified, copy DICOM template file to export file if (m_templateFile.length() != 0) { DcmFileFormat dcmff; cond = dcmff.loadFile(m_templateFile.c_str()); if (cond.bad()) return cond; // remove problematic attributes from dataset cleanupTemplate(dcmff.getDataset()); // copy from input file resultDset = new DcmDataset(*(dcmff.getDataset())); } else // otherwise, start with an empty DICOM file resultDset = new DcmDataset(); if (!resultDset) return EC_MemoryExhausted; // Read patient and study or series information if desired and write to export file if (m_readStudyLevel || m_readSeriesLevel) { cond = applyStudyOrSeriesFromFile(resultDset); if (cond.bad()) { delete resultDset; resultDset = NULL; return cond; } } // Increment instance number if (m_incInstNoFromFile) { cond = incrementInstanceNumber(resultDset); if (cond.bad()) { delete resultDset; resultDset = NULL; return cond; } } // Insert Latin 1 as standard character set if desired if (m_insertLatin1) cond = insertLatin1(resultDset); if (cond.bad()) return cond; // Generate and insert UIDs as necessary generateUIDs(resultDset); // Read and insert pixel data cond = readAndInsertPixelData(inputPlug, resultDset, proposedTS); if (cond.bad()) { delete resultDset; resultDset = NULL; return cond; } // Insert Lossy Image Compression and Lossy Image Compression Method attributes if necessary OFBool srcIsLossy = OFFalse; OFString comprMethod; if (inputPlug->getLossyComprInfo(srcIsLossy, comprMethod).good()) //TODO) { if (srcIsLossy) { cond = resultDset->putAndInsertOFStringArray(DCM_LossyImageCompression, "01"); if (cond.good() && !comprMethod.empty()) cond = resultDset->putAndInsertOFStringArray(DCM_LossyImageCompressionMethod, comprMethod); if (cond.bad()) return makeOFCondition(OFM_dcmdata, 18, OF_error, "Unable to write attribute Lossy Image Compression and/or Lossy Image Compression Method to result dataset"); } } else DCMDATA_LIBI2D_DEBUG("Image2Dcm: No information regarding lossy compression available"); // Insert SOP Class specific attributes (and values) cond = outPlug->convert(*resultDset); if (cond.bad()) { delete resultDset; resultDset = NULL; return cond; } // At last, apply override keys on dataset applyOverrideKeys(resultDset); // Do some very basic attribute checking (e. g. existence (type 2) and values (type 1)) if (!m_disableAttribChecks) { OFString err; err = isValid(*resultDset); err += outPlug->isValid(*resultDset); if (!err.empty()) { delete resultDset; resultDset = NULL; return makeOFCondition(OFM_dcmdata, 18, OF_error, err.c_str()); } } return EC_Normal; } OFCondition Image2Dcm::insertLatin1(DcmDataset *outputDset) { if (outputDset == NULL) return EC_IllegalParameter; return outputDset->putAndInsertString(DCM_SpecificCharacterSet, "ISO_IR 100"); } void Image2Dcm::cleanupTemplate(DcmDataset *targetDset) { if (!targetDset) return; // Remove any existing image pixel module attribute targetDset->findAndDeleteElement(DCM_PixelDataProviderURL); targetDset->findAndDeleteElement(DCM_PhotometricInterpretation); targetDset->findAndDeleteElement(DCM_SamplesPerPixel); targetDset->findAndDeleteElement(DCM_Rows); targetDset->findAndDeleteElement(DCM_Columns); targetDset->findAndDeleteElement(DCM_BitsAllocated); targetDset->findAndDeleteElement(DCM_BitsStored); targetDset->findAndDeleteElement(DCM_HighBit); targetDset->findAndDeleteElement(DCM_PixelRepresentation); targetDset->findAndDeleteElement(DCM_PixelData); targetDset->findAndDeleteElement(DCM_PlanarConfiguration); targetDset->findAndDeleteElement(DCM_PixelAspectRatio); targetDset->findAndDeleteElement(DCM_SmallestImagePixelValue); targetDset->findAndDeleteElement(DCM_LargestImagePixelValue); targetDset->findAndDeleteElement(DCM_RedPaletteColorLookupTableDescriptor); targetDset->findAndDeleteElement(DCM_GreenPaletteColorLookupTableDescriptor); targetDset->findAndDeleteElement(DCM_BluePaletteColorLookupTableDescriptor); targetDset->findAndDeleteElement(DCM_RedPaletteColorLookupTableData); targetDset->findAndDeleteElement(DCM_GreenPaletteColorLookupTableData); targetDset->findAndDeleteElement(DCM_BluePaletteColorLookupTableData); targetDset->findAndDeleteElement(DCM_ICCProfile); // Remove SOP Class / Instance information targetDset->findAndDeleteElement(DCM_SOPClassUID); targetDset->findAndDeleteElement(DCM_SOPInstanceUID); } OFCondition Image2Dcm::applyStudyOrSeriesFromFile(DcmDataset *targetDset) { DCMDATA_LIBI2D_DEBUG("Image2Dcm: Applying study and/or series information from file"); if ( (!m_readSeriesLevel && !m_readStudyLevel) || (m_studySeriesFile.length() == 0) ) return EC_IllegalCall; DcmFileFormat dcmff; OFString errMsg; OFCondition cond; // Open DICOM file to read patient/study/series information from cond = dcmff.loadFile(m_studySeriesFile.c_str()); if (cond.bad()) { errMsg = "Error: Unable to open study / series file "; errMsg += m_studySeriesFile; return makeOFCondition(OFM_dcmdata, 18, OF_error, errMsg.c_str()); } DcmDataset *srcDset = NULL; srcDset = dcmff.getDataset(); if (srcDset == NULL) return EC_IllegalCall; // Patient level attributes (type 2 - if value cannot be read, insert empty value OFString value; srcDset->findAndGetOFString(DCM_PatientName, value); cond = targetDset->putAndInsertOFStringArray(DCM_PatientName, value); if (cond.bad()) return makeOFCondition(OFM_dcmdata, 18, OF_error, "Unable to write Patient's Name to file"); value.clear(); srcDset->findAndGetOFString(DCM_PatientID, value); cond = targetDset->putAndInsertOFStringArray(DCM_PatientID, value); if (cond.bad()) return makeOFCondition(OFM_dcmdata, 18, OF_error, "Unable to write Patient ID to file"); value.clear(); srcDset->findAndGetOFString(DCM_PatientSex, value); cond = targetDset->putAndInsertOFStringArray(DCM_PatientSex, value); if (cond.bad()) return makeOFCondition(OFM_dcmdata, 18, OF_error, "Unable to write Patient's Sex to file"); value.clear(); srcDset->findAndGetOFString(DCM_PatientBirthDate, value); cond = targetDset->putAndInsertOFStringArray(DCM_PatientBirthDate, value); if (cond.bad()) return makeOFCondition(OFM_dcmdata, 18, OF_error, "Unable to write Patient's Birth Date to file"); value.clear(); srcDset->findAndGetOFString(DCM_SpecificCharacterSet, value); cond = targetDset->putAndInsertOFStringArray(DCM_SpecificCharacterSet, value); if (cond.bad()) return makeOFCondition(OFM_dcmdata, 18, OF_error, "Unable to write Specific Character Set to file"); value.clear(); // Study level attributes (type 2 except Study Instance UID) cond = srcDset->findAndGetOFString(DCM_StudyInstanceUID, value); if (cond.bad()) return makeOFCondition(OFM_dcmdata, 18, OF_error, "Unable to read Study Instance UID (type 1) from file"); cond = targetDset->putAndInsertOFStringArray(DCM_StudyInstanceUID, value); if (cond.bad()) return makeOFCondition(OFM_dcmdata, 18, OF_error, "Unable to write Study Instance UID to file"); value.clear(); srcDset->findAndGetOFString(DCM_StudyDate, value); cond = targetDset->putAndInsertOFStringArray(DCM_StudyDate, value); if (cond.bad()) return makeOFCondition(OFM_dcmdata, 18, OF_error, "Unable to write Study Date to file"); value.clear(); srcDset->findAndGetOFString(DCM_StudyTime, value); cond = targetDset->putAndInsertOFStringArray(DCM_StudyTime, value); if (cond.bad()) return makeOFCondition(OFM_dcmdata, 18, OF_error, "Unable to write Study Time to file"); value.clear(); srcDset->findAndGetOFString(DCM_ReferringPhysicianName, value); cond = targetDset->putAndInsertOFStringArray(DCM_ReferringPhysicianName, value); if (cond.bad()) return makeOFCondition(OFM_dcmdata, 18, OF_error, "Unable to write Referring Physician's Name to file"); value.clear(); srcDset->findAndGetOFString(DCM_StudyID, value); cond = targetDset->putAndInsertOFStringArray(DCM_StudyID, value); if (cond.bad()) return makeOFCondition(OFM_dcmdata, 18, OF_error, "Unable to write Study ID to file"); value.clear(); srcDset->findAndGetOFString(DCM_AccessionNumber, value); cond = targetDset->putAndInsertOFStringArray(DCM_AccessionNumber, value); if (cond.bad()) return makeOFCondition(OFM_dcmdata, 18, OF_error, "Unable to trite Accession Number to file"); value.clear(); // Series Level attributes (type 2 except Series Instance UID which is type 1) if (m_readSeriesLevel) { // General Series Module attributes cond = srcDset->findAndGetOFString(DCM_SeriesInstanceUID, value); if (cond.bad()) return makeOFCondition(OFM_dcmdata, 18, OF_error, "Unable to read Series Instance UID (type 1) from file"); cond = targetDset->putAndInsertOFStringArray(DCM_SeriesInstanceUID, value); if (cond.bad()) return makeOFCondition(OFM_dcmdata, 18, OF_error, "Unable to write Series Instance UID to file"); value.clear(); srcDset->findAndGetOFString(DCM_SeriesNumber, value); cond = targetDset->putAndInsertOFStringArray(DCM_SeriesNumber, value); if (cond.bad()) return makeOFCondition(OFM_dcmdata, 18, OF_error, "Unable to write Series Number to file"); value.clear(); // General Equipment Module attributes srcDset->findAndGetOFString(DCM_Manufacturer, value); cond = targetDset->putAndInsertOFStringArray(DCM_Manufacturer, value); if (cond.bad()) return makeOFCondition(OFM_dcmdata, 18, OF_error, "Unable to write Manufacturer to file"); value.clear(); } return EC_Normal; } OFCondition Image2Dcm::incrementInstanceNumber(DcmDataset *targetDset) { // Read and increment Instance Number if desired if (m_incInstNoFromFile) { DCMDATA_LIBI2D_DEBUG("Image2Dcm: Trying to read and increment instance number"); Sint32 instanceNumber; if ( targetDset->findAndGetSint32(DCM_InstanceNumber, instanceNumber).good() ) { instanceNumber++; char buf[100]; sprintf(buf, "%ld", OFstatic_cast(long, instanceNumber)); OFCondition cond = targetDset->putAndInsertOFStringArray(DCM_InstanceNumber, buf); if (cond.bad()) return makeOFCondition(OFM_dcmdata, 18, OF_error, "Unable write Instance Number to dataset"); } else return makeOFCondition(OFM_dcmdata, 18, OF_error, "Unable to read Instance Number from dataset"); } return EC_Normal; } OFCondition Image2Dcm::generateUIDs(DcmDataset *dset) { OFString value; OFCondition cond; DCMDATA_LIBI2D_DEBUG("Image2Dcm: Generate and insert new UIDs if necessary"); // Generate and write Series Instance UID if not already present if (!m_readSeriesLevel) { cond = dset->findAndGetOFString(DCM_SeriesInstanceUID, value); if (cond.bad() || (value.length() == 0)) { char newUID[100]; dcmGenerateUniqueIdentifier(newUID, SITE_SERIES_UID_ROOT); cond = dset->putAndInsertOFStringArray(DCM_SeriesInstanceUID, newUID); if (cond.bad()) return makeOFCondition(OFM_dcmdata, 18, OF_error, "Unable to write Series Instance UID to file"); } value.clear(); } // Generate and write Study Instance UID if not already present if (!m_readStudyLevel) { cond = dset->findAndGetOFString(DCM_StudyInstanceUID, value); if (cond.bad() || (value.length() == 0)) { char newUID[100]; dcmGenerateUniqueIdentifier(newUID, SITE_STUDY_UID_ROOT); cond = dset->putAndInsertOFStringArray(DCM_StudyInstanceUID, newUID); if (cond.bad()) return makeOFCondition(OFM_dcmdata, 18, OF_error, "Unable to write Study Instance UID to file"); } value.clear(); } // Generate SOP Instance UID if not already present cond = dset->findAndGetOFString(DCM_SOPInstanceUID, value); if (cond.bad() || (value.length() == 0)) { char newUID[100]; dcmGenerateUniqueIdentifier(newUID, SITE_INSTANCE_UID_ROOT); cond = dset->putAndInsertOFStringArray(DCM_SOPInstanceUID, newUID); if (cond.bad()) return makeOFCondition(OFM_dcmdata, 18, OF_error, "Unable to write SOP Instance UID to file"); } return EC_Normal; } void Image2Dcm::setISOLatin1(OFBool insLatin1) { m_insertLatin1 = insLatin1; } OFCondition Image2Dcm::insertEncapsulatedPixelData(DcmDataset* dset, char *pixData, Uint32 length, const E_TransferSyntax& outputTS) const { OFCondition cond; DCMDATA_LIBI2D_DEBUG("Image2Dcm: Storing imported pixel data to DICOM file"); // create initial pixel sequence DcmPixelSequence* pixelSequence = new DcmPixelSequence(DcmTag(DCM_PixelData, EVR_OB)); if (pixelSequence == NULL) return EC_MemoryExhausted; // insert empty offset table into sequence DcmPixelItem *offsetTable = new DcmPixelItem(DcmTag(DCM_Item, EVR_OB)); if (offsetTable == NULL) { delete pixelSequence; pixelSequence = NULL; return EC_MemoryExhausted; } cond = pixelSequence->insert(offsetTable); if (cond.bad()) { delete offsetTable; offsetTable = NULL; delete pixelSequence; pixelSequence = NULL; return cond; } // store compressed frame into pixel seqeuence DcmOffsetList dummyList; cond = pixelSequence->storeCompressedFrame(dummyList, OFreinterpret_cast(Uint8*,pixData), length, 0); // storeCompressedFrame(..) does a deep copy, so the pixdata memory can be freed now delete[] pixData; if (cond.bad()) { delete pixelSequence; pixelSequence = NULL; return cond; } // insert pixel data attribute incorporating pixel sequence into dataset DcmPixelData *pixelData = new DcmPixelData(DCM_PixelData); if (pixelData == NULL) { delete pixelSequence; pixelSequence = NULL; return EC_MemoryExhausted; } /* tell pixel data element that this is the original presentation of the pixel data * pixel data and how it compressed */ pixelData->putOriginalRepresentation(outputTS, NULL, pixelSequence); cond = dset->insert(pixelData); if (cond.bad()) { delete pixelData; pixelData = NULL; // also deletes contained pixel sequence return cond; } return EC_Normal; } OFCondition Image2Dcm::readAndInsertPixelData(I2DImgSource* imgSource, DcmDataset* dset, E_TransferSyntax& outputTS) { Uint16 samplesPerPixel, rows, cols, bitsAlloc, bitsStored, highBit, pixelRepr, planConf; Uint16 pixAspectH =1; Uint16 pixAspectV = 1; OFString photoMetrInt; outputTS = EXS_Unknown; char* pixData = NULL; Uint32 length; OFCondition cond = imgSource->readPixelData(rows, cols, samplesPerPixel, photoMetrInt, bitsAlloc, bitsStored, highBit, pixelRepr, planConf, pixAspectH, pixAspectV, pixData, length, outputTS); if (cond.bad()) return cond; DcmXfer transport(outputTS); if (transport.isEncapsulated()) insertEncapsulatedPixelData(dset, pixData, length, outputTS); else { /* Not encapsulated */ dset->putAndInsertUint8Array(DCM_PixelData, OFreinterpret_cast(Uint8*, pixData), length); delete[] pixData; } DCMDATA_LIBI2D_DEBUG("Image2Dcm: Inserting Image Pixel module information"); cond = dset->putAndInsertUint16(DCM_SamplesPerPixel, samplesPerPixel); if (cond.bad()) return cond; cond = dset->putAndInsertOFStringArray(DCM_PhotometricInterpretation, photoMetrInt); if (cond.bad()) return cond; // Should only be written if Samples per Pixel > 1 if (samplesPerPixel > 1) { cond = dset->putAndInsertUint16(DCM_PlanarConfiguration, planConf); if (cond.bad()) return cond; } cond = dset->putAndInsertUint16(DCM_Rows, rows); if (cond.bad()) return cond; cond = dset->putAndInsertUint16(DCM_Columns, cols); if (cond.bad()) return cond; cond = dset->putAndInsertUint16(DCM_BitsAllocated, bitsAlloc); if (cond.bad()) return cond; cond = dset->putAndInsertUint16(DCM_BitsStored, bitsStored); if (cond.bad()) return cond; cond = dset->putAndInsertUint16(DCM_HighBit, highBit); if (cond.bad()) return cond; if ( pixAspectH != pixAspectV ) { char buf[200]; int err = sprintf(buf, "%u\\%u", pixAspectV, pixAspectH); if (err == -1) return EC_IllegalCall; cond = dset->putAndInsertOFStringArray(DCM_PixelAspectRatio, buf); if (cond.bad()) return cond; } return dset->putAndInsertUint16(DCM_PixelRepresentation, pixelRepr); } OFString Image2Dcm::isValid(DcmDataset& dset) const { DCMDATA_LIBI2D_DEBUG("Image2Dcm: Checking validity of DICOM output dataset"); OFString dummy, err; OFCondition cond; // General Patient module attributes err += checkAndInventType2Attrib(DCM_PatientName, &dset); err += checkAndInventType2Attrib(DCM_PatientSex, &dset); err += checkAndInventType2Attrib(DCM_PatientBirthDate, &dset); err += checkAndInventType2Attrib(DCM_PatientID, &dset); // General Study module attributes err += checkAndInventType1Attrib(DCM_StudyInstanceUID, &dset); err += checkAndInventType2Attrib(DCM_StudyDate, &dset); err += checkAndInventType2Attrib(DCM_StudyTime, &dset); err += checkAndInventType2Attrib(DCM_ReferringPhysicianName, &dset); err += checkAndInventType2Attrib(DCM_StudyID, &dset); err += checkAndInventType2Attrib(DCM_AccessionNumber, &dset); // General Series module attributes err += checkAndInventType1Attrib(DCM_SeriesInstanceUID, &dset); err += checkAndInventType2Attrib(DCM_SeriesNumber, &dset); err += checkAndInventType2Attrib(DCM_InstanceNumber, &dset); // General Image module attributes /* Patient Orientation is of type 2C and must be written if not Image Orientation (Patient) (0020,0037) and Image Position (Patient) are required for the IOD. The current output IODs (SC, new SC, VLP) therefore need Patient Orientation. Make sure any new output plugin takes care about this attribute */ err += checkAndInventType2Attrib(DCM_PatientOrientation, &dset); // Image Pixel Module err += checkAndInventType1Attrib(DCM_Rows, &dset); err += checkAndInventType1Attrib(DCM_Columns, &dset); err += checkAndInventType1Attrib(DCM_SamplesPerPixel, &dset); err += checkAndInventType1Attrib(DCM_PhotometricInterpretation, &dset); err += checkAndInventType1Attrib(DCM_BitsAllocated, &dset); err += checkAndInventType1Attrib(DCM_BitsStored, &dset); err += checkAndInventType1Attrib(DCM_HighBit, &dset); err += checkAndInventType1Attrib(DCM_PixelRepresentation, &dset); err += checkAndInventType1Attrib(DCM_SOPInstanceUID, &dset); return err; } void Image2Dcm::setSeriesFrom(const OFString& file) { m_readSeriesLevel = OFTrue; m_studySeriesFile = file; } void Image2Dcm::setStudyFrom(const OFString& file) { m_readStudyLevel = OFTrue; m_studySeriesFile = file; } void Image2Dcm::setValidityChecking(OFBool doChecks, OFBool insertMissingType2, OFBool inventMissingType1) { m_disableAttribChecks = !doChecks; m_inventMissingType2Attribs = insertMissingType2; m_inventMissingType1Attribs = inventMissingType1; } void Image2Dcm::setTemplateFile(const OFString& file) { m_templateFile = file; } void Image2Dcm::setIncrementInstanceNumber(OFBool incInstNo) { m_incInstNoFromFile = incInstNo; } void Image2Dcm::setOverrideKeys(const OFList& ovkeys) { OFListConstIterator(OFString) it = ovkeys.begin(); OFListConstIterator(OFString) end = ovkeys.end(); while (it != end) { m_overrideKeys.push_back(*it); it++; } } OFCondition Image2Dcm::applyOverrideKeys(DcmDataset *outputDset) { /* replace specific keys by those in overrideKeys, copied from findscu */ OFListConstIterator(OFString) path = m_overrideKeys.begin(); OFListConstIterator(OFString) endOfList = m_overrideKeys.end(); OFCondition cond; DcmPathProcessor proc; while (path != endOfList) { cond = proc.applyPathWithValue(outputDset, *path); if (cond.bad()) { OFString err; err += "Bad override key/path: "; err += *path; err += ": "; err += cond.text(); return makeOFCondition(OFM_dcmdata, 18, OF_error, err.c_str()); } path++; } return cond; } OFString Image2Dcm::checkAndInventType1Attrib(const DcmTagKey& key, DcmDataset* targetDset, const OFString& defaultValue) const { OFBool exists = targetDset->tagExists(key); if (!exists) { OFString err = "Image2Dcm: Missing type 1 attribute: "; err += DcmTag(key).getTagName(); err += "\n"; return err; } DcmElement *elem; OFCondition cond = targetDset->findAndGetElement(key, elem); if (cond.bad() || !elem || (elem->getLength() == 0)) { if (!m_inventMissingType1Attribs) { OFString err = "Image2Dcm: Empty value for type 1 attribute: "; err += DcmTag(key).getTagName(); err += "\n"; return err; } //holds element to insert in item elem = NULL; DcmTag tag(key); OFBool wasError = OFFalse; //if dicom element could be created, insert in to item and modify to value if ( newDicomElement(elem, tag).good()) { if (targetDset->insert(elem, OFTrue).good()) { if (elem->putString(defaultValue.c_str()).good()) { DCMDATA_LIBI2D_DEBUG("Image2Dcm: Inserting missing type 1 attribute " << tag.getTagName() << " with value " << defaultValue); } else wasError = OFTrue; } else wasError = OFTrue; } else wasError = OFTrue; if (wasError) { OFString err = "Unable to insert type 1 attribute "; err += tag.getTagName(); err += " with value "; err += defaultValue; err += "\n"; return err; } } return ""; } OFString Image2Dcm::checkAndInventType2Attrib(const DcmTagKey& key, DcmDataset* targetDset) const { OFString err; OFBool exists = targetDset->tagExists(key); if (!exists) { if (m_inventMissingType2Attribs) { DcmTag tag(key); DCMDATA_LIBI2D_DEBUG("Image2Dcm: Inserting missing type 2 attribute: " << tag.getTagName()); targetDset->insertEmptyElement(tag); } else { err = "Image2Dcm: Missing type 2 attribute: "; err += DcmTag(key).getTagName(); err += "\n"; return err; } } return err; } Image2Dcm::~Image2Dcm() { DCMDATA_LIBI2D_DEBUG("Freeing memory"); } /* * CVS/RCS Log: * $Log: i2d.cc,v $ * Revision 1.15 2010-11-01 10:42:44 uli * Fixed some compiler warnings reported by gcc with additional flags. * * Revision 1.14 2010-10-14 13:18:23 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.13 2010-08-09 13:06:03 joergr * Updated data dictionary to 2009 edition of the DICOM standard. From now on, * the official "keyword" is used for the attribute name which results in a * number of minor changes (e.g. "PatientsName" is now called "PatientName"). * * Revision 1.12 2010-03-25 09:26:58 onken * Pixel data is now already marked with the correct transfer syntax in * memory not only when writing to disk. This permits conversion in * memory, e. g. for sending the converted DICOM images directly over * the network. * * Revision 1.11 2009-11-04 09:58:08 uli * Switched to logging mechanism provided by the "new" oflog module * * Revision 1.10 2009-09-30 08:05:25 uli * Stop including dctk.h in libi2d's header files. * * Revision 1.9 2009-09-04 13:53:09 meichel * Minor const iterator related changes needed to compile with VC6 with HAVE_STL * * Revision 1.8 2009-08-05 08:51:02 joergr * Replaced numeric tag by pre-defined tag name (DCM_PixelDataProviderURL). * Fixed various inconsistencies in condition text values and log messages. * * Revision 1.7 2009-07-16 14:23:23 onken * Extended Image2Dcm engine to also work for uncompressed pixel data input. * * Revision 1.6 2009-07-10 13:16:07 onken * Added path functionality for --key option and lets the code make use * of the DcmPath classes. * * Revision 1.5 2009-03-31 13:05:27 onken * Changed implementation of lossy compression attribute detection and writing. * * Revision 1.3 2009-03-27 17:49:20 onken * Attribute "Pixel Aspect Ratio" (as found in JFIF header) is now written * to DICOM dataset if not equal to 1. * * Revision 1.2 2008-01-16 16:32:31 onken * Fixed some empty or doubled log messages in libi2d files. * * Revision 1.1 2008-01-16 14:36:02 onken * Moved library "i2dlib" from /dcmdata/libsrc/i2dlib to /dcmdata/libi2d * * Revision 1.1 2007/11/08 15:55:17 onken * Initial checkin of img2dcm application and corresponding library i2dlib. * * */ dcmtk-3.6.0/dcmdata/libi2d/i2dplvlp.cc0000644000310500011400000000627511455601440016656 0ustar joergrdicom3/* * * Copyright (C) 2001-2010, 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: dcmdata * * Author: Michael Onken * * Purpose: Implements conversion from image into DICOM Visible Light Photography IOD * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:18:24 $ * CVS/RCS Revision: $Revision: 1.5 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/libi2d/i2dplvlp.h" #include "dcmtk/dcmdata/dcdeftag.h" /* for DCM_ defines */ #include "dcmtk/dcmdata/dcuid.h" /* for UID_ defines */ I2DOutputPlugVLP::I2DOutputPlugVLP() { DCMDATA_LIBI2D_DEBUG("I2DOutputPlugVLP: Output plugin for VLP initialized"); } OFString I2DOutputPlugVLP::ident() { return "Visible Light Photographic Image SOP Class"; } void I2DOutputPlugVLP::supportedSOPClassUIDs(OFList suppSOPs) { suppSOPs.push_back(UID_VLPhotographicImageStorage); } OFCondition I2DOutputPlugVLP::convert(DcmDataset &dataset) const { DCMDATA_LIBI2D_DEBUG("I2DOutputPlugVLP: Inserting VLP specific attributes"); OFCondition cond; cond = dataset.putAndInsertOFStringArray(DCM_SOPClassUID, UID_VLPhotographicImageStorage); if (cond.bad()) return makeOFCondition(OFM_dcmdata, 18, OF_error, "Unable to insert SOP class into dataset"); cond = dataset.putAndInsertOFStringArray(DCM_Modality, "XC"); if (cond.bad()) return makeOFCondition(OFM_dcmdata, 18, OF_error, "Unable to insert Modality (XC) into dataset"); return EC_Normal; } OFString I2DOutputPlugVLP::isValid(DcmDataset& dataset) const { OFString err; // Just return if checking was disabled if (!m_doAttribChecking) return err; DCMDATA_LIBI2D_DEBUG("I2DOutputPlugVLP: Checking VLP specific attributes for validity"); // Acquisition Context Module err = checkAndInventType2Attrib(DCM_AcquisitionContextSequence, &dataset); // General Equipment Module err += checkAndInventType2Attrib(DCM_Manufacturer, &dataset); // VL Image Module err += checkAndInventType1Attrib(DCM_ImageType, &dataset, "DERIVED\\SECONDARY"); err += checkAndInventType2Attrib(DCM_LossyImageCompression, &dataset); return err; } I2DOutputPlugVLP::~I2DOutputPlugVLP() { } /* * CVS/RCS Log: * $Log: i2dplvlp.cc,v $ * Revision 1.5 2010-10-14 13:18:24 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.4 2009-11-04 09:58:08 uli * Switched to logging mechanism provided by the "new" oflog module * * Revision 1.3 2009-09-30 08:05:26 uli * Stop including dctk.h in libi2d's header files. * * Revision 1.2 2008-01-16 16:32:31 onken * Fixed some empty or doubled log messages in libi2d files. * * Revision 1.1 2008-01-16 14:42:00 onken * Moved library "i2dlib" from /dcmdata/libsrc/i2dlib to /dcmdata/libi2d * * Revision 1.1 2007/11/08 15:55:17 onken * Initial checkin of img2dcm application and corresponding library i2dlib. * * */ dcmtk-3.6.0/dcmdata/libi2d/i2dplnsc.cc0000644000310500011400000002620011455601437016634 0ustar joergrdicom3/* * * Copyright (C) 2001-2010, 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: dcmdata * * Author: Michael Onken * * Purpose: Implements conversion from image into new DICOM SC IODs * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:18:23 $ * CVS/RCS Revision: $Revision: 1.5 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/libi2d/i2dplnsc.h" #include "dcmtk/dcmdata/dcdeftag.h" /* for DCM_ defines */ #include "dcmtk/dcmdata/dcuid.h" /* for UID_ defines */ #include "dcmtk/dcmdata/libi2d/i2doutpl.h" I2DOutputPlugNewSC::I2DOutputPlugNewSC() { DCMDATA_LIBI2D_DEBUG("I2DOutputPlugNewSC: Output plugin for new Multiframe Secondary Capture SOPs initialized"); } OFString I2DOutputPlugNewSC::ident() { return "New Secondary Capture Image SOP Classes"; } void I2DOutputPlugNewSC::supportedSOPClassUIDs(OFList suppSOPs) { suppSOPs.push_back(UID_MultiframeSingleBitSecondaryCaptureImageStorage); suppSOPs.push_back(UID_MultiframeGrayscaleByteSecondaryCaptureImageStorage); suppSOPs.push_back(UID_MultiframeGrayscaleWordSecondaryCaptureImageStorage); suppSOPs.push_back(UID_MultiframeTrueColorSecondaryCaptureImageStorage); } OFCondition I2DOutputPlugNewSC::convert(DcmDataset &dataset) const { DCMDATA_LIBI2D_DEBUG("I2DOutputPlugNewSC: Inserting new Multiframe SC specific attributes"); // Find out which of the new SC SOP Class UIDs to use OFString sopUID, photInt; Uint16 bitsAllocated; OFCondition cond = dataset.findAndGetUint16(DCM_BitsAllocated, bitsAllocated); if (cond.bad()) return makeOFCondition(OFM_dcmdata, 18, OF_error, "I2DOutputPlugNewSC: Unable to determine correct SOP class due to missing Image Pixel module information"); cond = dataset.findAndGetOFStringArray(DCM_PhotometricInterpretation, photInt); if (bitsAllocated == 1) cond = handle1BitSC(&dataset); else if (bitsAllocated == 8) cond = handle8BitSC(&dataset); else if (bitsAllocated == 16) cond = handle16BitSC(&dataset); else cond = makeOFCondition(OFM_dcmdata, 18, OF_error, "I2DOutputPlugNewSC: Bits Allocated needs a value of 1, 8 or 16 for conversion"); cond = insertMultiFrameAttribs(&dataset); return cond; } OFString I2DOutputPlugNewSC::isValid(DcmDataset& dataset) const { OFString err; // Just return if checking was disabled if (!m_doAttribChecking) return err; DCMDATA_LIBI2D_DEBUG("I2DOutputPlugNewSC: Checking new Multiframe SC specific attributes"); // WSD="Workstation", found in most Secondary Capture files err += checkAndInventType1Attrib(DCM_ConversionType, &dataset, "WSD"); // As a default we do not expect the image to have burnt in annotations err += checkAndInventType1Attrib(DCM_BurnedInAnnotation, &dataset, "NO"); return err; } OFCondition I2DOutputPlugNewSC::insertMultiFrameAttribs(DcmDataset* targetDataset) const { if (!targetDataset) return EC_IllegalParameter; // We only support 1 image Multi-frames so far return targetDataset->putAndInsertOFStringArray(DCM_NumberOfFrames, "1"); // Frame Increment pointer is set later in the more specific SC Multi-frame Image context } OFCondition I2DOutputPlugNewSC::handle1BitSC(DcmDataset *dataset) const { if (!dataset) return EC_IllegalParameter; OFCondition cond; Uint16 u16 = 0; OFString str; cond = dataset->findAndGetOFStringArray(DCM_PhotometricInterpretation, str); if (cond.bad() || (str != "MONOCHROME2")) return makeOFCondition(OFM_dcmdata, 18, OF_error, "I2DOutputPlugNewSC: Photometric interpretation does not fit SOP class"); cond = dataset->findAndGetUint16(DCM_SamplesPerPixel, u16); if (cond.bad() || (u16 != 1)) return makeOFCondition(OFM_dcmdata, 18, OF_error, "I2DOutputPlugNewSC: Samples Per Pixel does not fit SOP class"); cond = dataset->findAndGetUint16(DCM_BitsStored, u16); if (cond.bad() || (u16 != 1)) return makeOFCondition(OFM_dcmdata, 18, OF_error, "I2DOutputPlugNewSC: Bits Stored does not fit SOP class"); cond = dataset->findAndGetUint16(DCM_HighBit, u16); if (cond.bad() || (u16 != 0)) return makeOFCondition(OFM_dcmdata, 18, OF_error, "I2DOutputPlugNewSC: High Bit does not fit SOP class"); cond = dataset->findAndGetUint16(DCM_PixelRepresentation, u16); if (cond.bad() || (u16 != 0)) return makeOFCondition(OFM_dcmdata, 18, OF_error, "I2DOutputPlugNewSC: Pixel Representation does not fit SOP class"); cond = dataset->putAndInsertOFStringArray(DCM_SOPClassUID, UID_MultiframeSingleBitSecondaryCaptureImageStorage); return cond; } OFCondition I2DOutputPlugNewSC::handle8BitSC(DcmDataset *dataset) const { if (!dataset) return EC_IllegalParameter; OFCondition cond; Uint16 u16 = 0; OFString str; cond = dataset->findAndGetOFStringArray(DCM_PhotometricInterpretation, str); if (cond.bad()) return makeOFCondition(OFM_dcmdata, 18, OF_error, "I2DOutputPlugNewSC: Photometric interpretation not set for Pixel Data"); if (str == "MONOCHROME2") // Mult-Frame Grayscale Byte SC Image { cond = dataset->findAndGetUint16(DCM_SamplesPerPixel, u16); if (cond.bad() || (u16 != 1)) return makeOFCondition(OFM_dcmdata, 18, OF_error, "I2DOutputPlugNewSC: Samples Per Pixel does not fit SOP class"); cond = dataset->findAndGetUint16(DCM_BitsStored, u16); if (cond.bad() || (u16 != 8)) return makeOFCondition(OFM_dcmdata, 18, OF_error, "I2DOutputPlugNewSC: Bits Stored does not fit SOP class"); cond = dataset->findAndGetUint16(DCM_HighBit, u16); if (cond.bad() || (u16 != 7)) return makeOFCondition(OFM_dcmdata, 18, OF_error, "I2DOutputPlugNewSC: High Bit does not fit SOP class"); cond = dataset->findAndGetUint16(DCM_PixelRepresentation, u16); if (cond.bad() || (u16 != 0)) return makeOFCondition(OFM_dcmdata, 18, OF_error, "I2DOutputPlugNewSC: Pixel Representation does not fit SOP class"); // For MONOCHROME2 and Bits Stored > 1, rescale slope/intercept/type have to be inserted cond = insertSCMultiFrameAttribs(dataset); // Insert SOP Class UID if (cond.good()) cond = dataset->putAndInsertOFStringArray(DCM_SOPClassUID, UID_MultiframeGrayscaleByteSecondaryCaptureImageStorage); } else if ((str == "YBR_FULL_422") || (str == "RGB")) // Mult-Frame True Color Byte SC Image { cond = dataset->findAndGetUint16(DCM_SamplesPerPixel, u16); if (cond.bad() || (u16 != 3)) return makeOFCondition(OFM_dcmdata, 18, OF_error, "I2DOutputPlugNewSC: Samples Per Pixel does not fit SOP class"); cond = dataset->findAndGetUint16(DCM_BitsStored, u16); if (cond.bad() || (u16 != 8)) return makeOFCondition(OFM_dcmdata, 18, OF_error, "I2DOutputPlugNewSC: Bits Stored does not fit SOP class"); cond = dataset->findAndGetUint16(DCM_HighBit, u16); if (cond.bad() || (u16 != 7)) return makeOFCondition(OFM_dcmdata, 18, OF_error, "I2DOutputPlugNewSC: High Bit does not fit SOP class"); cond = dataset->findAndGetUint16(DCM_PixelRepresentation, u16); if (cond.bad() || (u16 != 0)) return makeOFCondition(OFM_dcmdata, 18, OF_error, "I2DOutputPlugNewSC: Pixel Representation does not fit SOP class"); if (str == "RGB") // For RGB, Planar Configuration must be present and set to 0 { cond = dataset->findAndGetUint16(DCM_PlanarConfiguration, u16); if (cond.bad() || (u16 != 0)) return makeOFCondition(OFM_dcmdata, 18, OF_error, "I2DOutputPlugNewSC: Planar Configuration does not fit SOP class"); } // Insert SOP Class UID if (cond.good()) cond = dataset->putAndInsertOFStringArray(DCM_SOPClassUID, UID_MultiframeTrueColorSecondaryCaptureImageStorage); } else return makeOFCondition(OFM_dcmdata, 18, OF_error, "I2DOutputPlugNewSC: Photometric interpretation does not fit SOP class"); return cond; } OFCondition I2DOutputPlugNewSC::handle16BitSC(DcmDataset *dataset) const { if (!dataset) return EC_IllegalParameter; OFCondition cond; Uint16 u16 = 0; OFString str; cond = dataset->findAndGetOFStringArray(DCM_PhotometricInterpretation, str); if (cond.bad() || (str != "MONOCHROME2")) return makeOFCondition(OFM_dcmdata, 18, OF_error, "I2DOutputPlugNewSC: Photometric interpretation does not fit SOP class"); cond = dataset->findAndGetUint16(DCM_SamplesPerPixel, u16); if (cond.bad() || (u16 != 1)) return makeOFCondition(OFM_dcmdata, 18, OF_error, "I2DOutputPlugNewSC: Samples Per Pixel does not fit SOP class"); Uint16 bitsStored; cond = dataset->findAndGetUint16(DCM_BitsStored, bitsStored); if (cond.bad() || (bitsStored >= 16) || (bitsStored <9) ) return makeOFCondition(OFM_dcmdata, 18, OF_error, "I2DOutputPlugNewSC: Bits Stored does not fit SOP class"); cond = dataset->findAndGetUint16(DCM_HighBit, u16); if (cond.bad() || (u16 != bitsStored -1)) return makeOFCondition(OFM_dcmdata, 18, OF_error, "I2DOutputPlugNewSC: High Bit does not fit SOP class"); cond = dataset->findAndGetUint16(DCM_PixelRepresentation, u16); if (cond.bad() || (u16 != 0)) return makeOFCondition(OFM_dcmdata, 18, OF_error, "I2DOutputPlugNewSC: Pixel Representation does not fit SOP class"); // Insert SOP Class UID cond = dataset->putAndInsertOFStringArray(DCM_SOPClassUID, UID_MultiframeGrayscaleWordSecondaryCaptureImageStorage); // For MONOCHROME2 and Bits Stored > 1, rescale slope/intercept/type have to be inserted if (cond.good()) cond = insertSCMultiFrameAttribs(dataset); return cond; } OFCondition I2DOutputPlugNewSC::insertSCMultiFrameAttribs(DcmDataset *targetDataset) const { OFCondition cond; // Rescale Intercept, set to 0 (constant enumerated value) cond = targetDataset->putAndInsertOFStringArray(DCM_RescaleIntercept, "0"); // Rescale Slope, set to 1 (constant enumerated value) if (cond.good()) cond = targetDataset->putAndInsertOFStringArray(DCM_RescaleSlope, "1"); // Rescale type, set to unspecified "US" (constant enumerated value) if (cond.good()) cond = targetDataset->putAndInsertOFStringArray(DCM_RescaleType, "US"); // Rescale type, set to unspecified "IDENTITY" (constant enumerated value) if (cond.good()) cond = targetDataset->putAndInsertOFStringArray(DCM_PresentationLUTShape, "IDENTITY"); else return makeOFCondition(OFM_dcmdata, 18, OF_error, "I2DOutputPlugNewSC: Unable to insert attributes for Rescale Slope/Intercept/Type"); return EC_Normal; } I2DOutputPlugNewSC::~I2DOutputPlugNewSC() { } /* * CVS/RCS Log: * $Log: i2dplnsc.cc,v $ * Revision 1.5 2010-10-14 13:18:23 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.4 2009-11-04 09:58:08 uli * Switched to logging mechanism provided by the "new" oflog module * * Revision 1.3 2009-09-30 08:05:26 uli * Stop including dctk.h in libi2d's header files. * * Revision 1.2 2008-01-16 16:32:31 onken * Fixed some empty or doubled log messages in libi2d files. * * Revision 1.1 2008-01-16 14:40:02 onken * Moved library "i2dlib" from /dcmdata/libsrc/i2dlib to /dcmdata/libi2d * */ dcmtk-3.6.0/dcmdata/include/0000755000310500011400000000000011511320675015060 5ustar joergrdicom3dcmtk-3.6.0/dcmdata/include/Makefile.in0000644000310500011400000000117010743417553017134 0ustar joergrdicom3# # Makefile for dcmdata/include # @SET_MAKE@ SHELL = /bin/sh srcdir = @srcdir@ top_srcdir = @top_srcdir@ configdir = @top_srcdir@/@configdir@ include $(configdir)/@common_makefile@ all: install: $(configdir)/mkinstalldirs $(DESTDIR)$(includedir)/dcmtk/dcmdata for file in dcmtk/dcmdata/*.h ; do \ $(INSTALL_DATA) $$file $(DESTDIR)$(includedir)/dcmtk/dcmdata ;\ done $(configdir)/mkinstalldirs $(DESTDIR)$(includedir)/dcmtk/dcmdata/libi2d for file in dcmtk/dcmdata/libi2d/*.h ; do \ $(INSTALL_DATA) $$file $(DESTDIR)$(includedir)/dcmtk/dcmdata/libi2d ;\ done clean: rm -f $(TRASH) distclean: rm -f $(DISTTRASH) dcmtk-3.6.0/dcmdata/include/dcmtk/0000755000310500011400000000000011511320675016162 5ustar joergrdicom3dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/0000755000310500011400000000000011511320675017557 5ustar joergrdicom3dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/dcpxitem.h0000644000310500011400000002377111455601175021563 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Gerd Ehlers, Andreas Barth * * Purpose: Interface of class DcmPixelItem * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:15:41 $ * CVS/RCS Revision: $Revision: 1.30 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DCPXITEM_H #define DCPXITEM_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcvrobow.h" #include "dcmtk/dcmdata/dcofsetl.h" /* for class DcmOffsetList */ /** this class implements a container for a fragment of compressed pixel data. * Instances of this class use the same attribute tags as sequence items, * but are maintained within a pixel data element (class DcmPixelSequence) * with undefined length and contain no DICOM structure, but raw data. * Therefore, this class is derived from DcmOtherByteOtherWord, the class * that is used for OB raw data which is handled very similar. */ class DcmPixelItem : public DcmOtherByteOtherWord { public: /** constructor * @param tag attribute tag * @param len length of the attribute value */ DcmPixelItem(const DcmTag &tag, const Uint32 len = 0); /** copy constructor * @param old element to be copied */ DcmPixelItem(const DcmPixelItem &old); /// destructor virtual ~DcmPixelItem(); /** copy assignment operator * @param obj element to be copied */ DcmPixelItem &operator=(const DcmPixelItem &obj) { DcmOtherByteOtherWord::operator=(obj); return *this; } /** clone method * @return deep copy of this object */ virtual DcmObject *clone() const { return new DcmPixelItem(*this); } /** get type identifier * @return type identifier of this class (EVR_item) */ virtual DcmEVR ident(void) const { return EVR_pixelItem; } /** Virtual object copying. This method can be used for DcmObject * and derived classes to get a deep copy of an object. Internally * the assignment operator is called if the given DcmObject parameter * is of the same type as "this" object instance. If not, an error * is returned. This function permits copying an object by value * in a virtual way which therefore is different to just calling the * assignment operator of DcmElement which could result in slicing * the object. * @param rhs - [in] The instance to copy from. Has to be of the same * class type as "this" object * @return EC_Normal if copying was successful, error otherwise */ virtual OFCondition copyFrom(const DcmObject &rhs); /** print all elements of the item to a stream * @param out output stream * @param flags optional flag used to customize the output (see DCMTypes::PF_xxx) * @param level current level of nested items. Used for indentation. * @param pixelFileName optional filename used to write the raw pixel data file * @param pixelCounter optional counter used for automatic pixel data filename creation */ virtual void print(STD_NAMESPACE ostream &out, const size_t flags = 0, const int level = 0, const char *pixelFileName = NULL, size_t *pixelCounter = NULL); /** creates in this object an offset table for a compressed pixel sequence. * @param offsetList list of size entries for each individual encoded frame * provided by the compression codec. All entries are expected to have * an even value (i.e. the pixel items are padded). * @return EC_Normal if successful, an error code otherwise */ virtual OFCondition createOffsetTable(const DcmOffsetList &offsetList); /** write object in XML format * @param out output stream to which the XML document is written * @param flags optional flag used to customize the output (see DCMTypes::XF_xxx) * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition writeXML(STD_NAMESPACE ostream &out, const size_t flags = 0); /** special write method for creation of digital signatures * @param outStream DICOM output stream * @param oxfer output transfer syntax * @param enctype encoding types (undefined or explicit length) * @param wcache pointer to write cache object, may be NULL * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition writeSignatureFormat(DcmOutputStream &outStream, const E_TransferSyntax oxfer, const E_EncodingType enctype, DcmWriteCache *wcache); protected: /** write tag, VR and length field to the given output stream * @param outStream output stream * @param oxfer transfer syntax for writing * @param writtenBytes number of bytes written to stream returned in this parameter * @return EC_Normal if successful, an error code otherwise */ virtual OFCondition writeTagAndLength(DcmOutputStream &outStream, const E_TransferSyntax oxfer, Uint32 &writtenBytes) const; }; #endif // DCPXITEM_H /* ** CVS/RCS Log: ** $Log: dcpxitem.h,v $ ** Revision 1.30 2010-10-14 13:15:41 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.29 2010-03-01 09:08:44 uli ** Removed some unnecessary include directives in the headers. ** ** Revision 1.28 2010-02-22 11:39:54 uli ** Remove some unneeded includes. ** ** Revision 1.27 2009-02-04 17:54:31 joergr ** Fixed various layout and formatting issues. ** ** Revision 1.26 2009-02-04 10:18:19 joergr ** Fixed issue with compressed frames of odd length (possibly wrong values in ** basic offset table). ** ** Revision 1.25 2008-07-17 11:19:49 onken ** Updated copyFrom() documentation. ** ** Revision 1.24 2008-07-17 10:30:23 onken ** Implemented copyFrom() method for complete DcmObject class hierarchy, which ** permits setting an instance's value from an existing object. Implemented ** assignment operator where necessary. ** ** Revision 1.23 2007-11-29 14:30:19 meichel ** Write methods now handle large raw data elements (such as pixel data) ** without loading everything into memory. This allows very large images to ** be sent over a network connection, or to be copied without ever being ** fully in memory. ** ** Revision 1.22 2006/08/15 15:49:56 meichel ** Updated all code in module dcmdata to correctly compile when ** all standard C++ classes remain in namespace std. ** ** Revision 1.21 2005/12/08 16:28:32 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.20 2005/11/24 12:50:57 meichel ** Fixed bug in code that prepares a byte stream that is fed into the MAC ** algorithm when creating or verifying a digital signature. The previous ** implementation was non-conformant when signatures included compressed ** (encapsulated) pixel data because the item length was included in the byte ** stream, while it should not. The global variable dcmEnableOldSignatureFormat ** and a corresponding command line option in dcmsign allow to re-enable the old ** implementation. ** ** Revision 1.19 2004/07/01 12:28:25 meichel ** Introduced virtual clone method for DcmObject and derived classes. ** ** Revision 1.18 2002/12/06 12:49:12 joergr ** Enhanced "print()" function by re-working the implementation and replacing ** the boolean "showFullData" parameter by a more general integer flag. ** Added doc++ documentation. ** Made source code formatting more consistent with other modules/files. ** ** Revision 1.17 2002/08/27 16:55:38 meichel ** Initial release of new DICOM I/O stream classes that add support for stream ** compression (deflated little endian explicit VR transfer syntax) ** ** Revision 1.16 2002/05/24 14:51:42 meichel ** Moved helper methods that are useful for different compression techniques ** from module dcmjpeg to module dcmdata ** ** Revision 1.15 2002/04/25 09:41:46 joergr ** Added support for XML output of DICOM objects. ** ** Revision 1.14 2001/11/16 15:54:39 meichel ** Adapted digital signature code to final text of supplement 41. ** ** Revision 1.13 2001/09/25 17:19:28 meichel ** Adapted dcmdata to class OFCondition ** ** Revision 1.12 2001/06/01 15:48:43 meichel ** Updated copyright header ** ** Revision 1.11 2000/04/14 15:31:33 meichel ** Removed default value from output stream passed to print() method. ** Required for use in multi-thread environments. ** ** Revision 1.10 2000/03/08 16:26:17 meichel ** Updated copyright header. ** ** Revision 1.9 2000/03/03 14:05:25 meichel ** Implemented library support for redirecting error messages into memory ** instead of printing them to stdout/stderr for GUI applications. ** ** Revision 1.8 2000/02/10 10:50:53 joergr ** Added new feature to dcmdump (enhanced print method of dcmdata): write ** pixel data/item value fields to raw files. ** ** Revision 1.7 1999/03/31 09:24:45 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.6 1998/11/12 16:47:43 meichel ** Implemented operator= for all classes derived from DcmObject. ** ** Revision 1.5 1997/05/22 16:57:10 andreas ** - Corrected errors for writing of pixel sequences for encapsulated ** transfer syntaxes. ** ** Revision 1.4 1996/01/29 13:38:13 andreas ** - new put method for every VR to put value as a string ** - better and unique print methods ** ** Revision 1.3 1996/01/05 13:22:58 andreas ** - changed to support new streaming facilities ** - more cleanups ** - merged read / write methods for block and file transfer ** */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/dcvm.h0000644000310500011400000000466011455601176020674 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Andreas Barth * * Purpose: functions to derive VM from string * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:15:42 $ * CVS/RCS Revision: $Revision: 1.9 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DCVM_H #define DCVM_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ /** compute the number of values stored in one string * @param val string * @return number of values separated by backslash characters in this string */ unsigned long getVMFromString(const char * val); /** get the first value strored in the given string and update the parameter * to point to the next value in the string (values separated by backslash). * The result of this function is allocated with new[] and must be delete[]d by the caller. * The original string pointed to by s is not modified. * @param s points to start of string; updated to point to start of next value in string * @return first value in string, zero-terminated. char array allocated on heap, must be delete[]d by caller */ char * getFirstValueFromString(const char * & s); #endif /* ** CVS/RCS Log: ** $Log: dcvm.h,v $ ** Revision 1.9 2010-10-14 13:15:42 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.8 2009-11-04 09:58:07 uli ** Switched to logging mechanism provided by the "new" oflog module ** ** Revision 1.7 2007-11-29 14:30:35 meichel ** Updated doxygen API documentation ** ** Revision 1.6 2005/12/08 16:28:49 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.5 2001/06/01 15:48:47 meichel ** Updated copyright header ** ** Revision 1.4 2000/03/08 16:26:20 meichel ** Updated copyright header. ** ** Revision 1.3 1999/03/31 09:24:53 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.2 1996/03/26 09:59:20 meichel ** corrected bug (deletion of const char *) which prevented compilation on NeXT ** ** Revision 1.1 1996/01/29 13:38:15 andreas ** - new put method for every VR to put value as a string ** - better and unique print methods ** */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/dcmetinf.h0000644000310500011400000003634211455601175021535 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Gerd Ehlers, Andreas Barth * * Purpose: Interface of class DcmMetaInfo * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:15:41 $ * CVS/RCS Revision: $Revision: 1.33 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DCMETINF_H #define DCMETINF_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcitem.h" /// magic string identifying DICOM files #define DCM_Magic "DICM" /// length of magic string identifying DICOM files #define DCM_MagicLen 4 /// length of DICOM file preamble, in bytes #define DCM_PreambleLen 128 /// transfer syntax used for encoding DICOM meta-headers #define META_HEADER_DEFAULT_TRANSFERSYNTAX EXS_LittleEndianExplicit /** a class representing the DICOM file meta information header */ class DcmMetaInfo : public DcmItem { public: /** default constructor */ DcmMetaInfo(); /** copy constructor * @param old item to be copied */ DcmMetaInfo(const DcmMetaInfo &old); /** assignment operator. * @param the metainfo to be copied */ DcmMetaInfo &operator=(const DcmMetaInfo &obj); /** destructor */ virtual ~DcmMetaInfo(); /** clone method * @return deep copy of this object */ virtual DcmObject *clone() const { return new DcmMetaInfo(*this); } /** Virtual object copying. This method can be used for DcmObject * and derived classes to get a deep copy of an object. Internally * the assignment operator is called if the given DcmObject parameter * is of the same type as "this" object instance. If not, an error * is returned. This function permits copying an object by value * in a virtual way which therefore is different to just calling the * assignment operator of DcmElement which could result in slicing * the object. * @param rhs - [in] The instance to copy from. Has to be of the same * class type as "this" object * @return EC_Normal if copying was successful, error otherwise */ virtual OFCondition copyFrom(const DcmObject& rhs); /** get type identifier * @return type identifier of this class (EVR_item) */ virtual DcmEVR ident() const; /** remove all elements with an invalid group number, i.e. everything but 0x0002 */ virtual void removeInvalidGroups(); /** return the transfer syntax in which this dataset was originally read. * @return transfer syntax in which this dataset was originally read, EXS_Unknown if the dataset was created in memory */ E_TransferSyntax getOriginalXfer() const; /** print meta information header to a stream * @param out output stream * @param flags optional flag used to customize the output (see DCMTypes::PF_xxx) * @param level current level of nested items. Used for indentation. * @param pixelFileName not used * @param pixelCounter not used */ virtual void print(STD_NAMESPACE ostream&out, const size_t flags = 0, const int level = 0, const char *pixelFileName = NULL, size_t *pixelCounter = NULL); /** initialize the transfer state of this object. This method must be called * before this object is written to a stream or read (parsed) from a stream. */ virtual void transferInit(); /** finalize the transfer state of this object. This method must be called * when reading/writing this object from/to a stream has been completed. */ virtual void transferEnd(); /** calculate the length of this DICOM element when encoded with the * given transfer syntax and the given encoding type for sequences. * For elements, the length includes the length of the tag, length field, * VR field and the value itself, for items and sequences it returns * the length of the complete item or sequence including delimitation tags * if applicable. Never returns undefined length. * @param xfer transfer syntax for length calculation * @param enctype sequence encoding type for length calculation * @return length of DICOM element */ virtual Uint32 calcElementLength(const E_TransferSyntax xfer, const E_EncodingType enctype); /** read object from a stream. * @param inStream DICOM input stream * @param xfer transfer syntax to use when parsing * @param glenc handling of group length parameters * @param maxReadLength attribute values larger than this value are skipped * while parsing and read later upon first access if the stream type supports * this. * @return EC_Normal if successful, an error code otherwise */ virtual OFCondition read(DcmInputStream &inStream, const E_TransferSyntax xfer = EXS_Unknown, const E_GrpLenEncoding glenc = EGL_noChange, const Uint32 maxReadLength = DCM_MaxReadLength); /** write meta information header to a stream * @param outStream DICOM output stream * @param oxfer output transfer syntax * @param enctype encoding types (undefined or explicit length) * @param wcache pointer to write cache object, may be NULL * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition write(DcmOutputStream &outStream, const E_TransferSyntax oxfer, const E_EncodingType enctype, DcmWriteCache *wcache); /** write object in XML format * @param out output stream to which the XML document is written * @param flags optional flag used to customize the output (see DCMTypes::XF_xxx) * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition writeXML(STD_NAMESPACE ostream&out, const size_t flags = 0); /** load object from a DICOM file * @param fileName name of the file to load * @param readXfer transfer syntax used to read the data (auto detection if EXS_Unknown) * @param groupLength flag, specifying how to handle the group length tags * @param maxReadLength maximum number of bytes to be read for an element value. * Element values with a larger size are not loaded until their value is retrieved * (with getXXX()) or loadAllDataElements() is called. * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition loadFile(const char *fileName, const E_TransferSyntax readXfer = EXS_Unknown, const E_GrpLenEncoding groupLength = EGL_noChange, const Uint32 maxReadLength = DCM_MaxReadLength); private: /// initialize the preamble buffer with 128 zero bytes followed by "DICM" void setPreamble(); /** check if the next 132 bytes in the input stream are a preamble * followed by the DICOM "magic word" DICM. If so, try to determine * the transfer syntax of the meta-header and return in parameter * newxfer. If not, reset stream to start position. * @param inStream input stream, should be at start position * @param newxfer as input parameter contains the expected transfer syntax, * as output parameter returns the real transfer syntax of the * meta-header as determined heuristically * @return true if meta-header found and read, false otherwise */ OFBool checkAndReadPreamble(DcmInputStream &inStream, E_TransferSyntax &newxfer); // out /** peeks into the input stream and checks whether the next element * is group 0002, i.e. belongs to the meta-header * @return true if next element is part of meta-header, false otherwise */ OFBool nextTagIsMeta(DcmInputStream &inStream); /** read meta-header group length element which is important because * it tells us where to switch from meta-header transfer syntax to * dataset transfer syntax. Insert element into dataset * @param inStream input stream * @param xfer transfer syntax of meta-header * @param xtag attribute tag for group length * @param glenc handling of group length encoding element in dataset * @param headerLen output parameter; length of meta-header as encoded in group length element * @param bytesRead output parameter; number of bytes read when reading group length (for counting the remaining number of meta-header bytes) * @param maxReadLength max read length for elements * @return EC_Normal if successful, an error code otherwise */ OFCondition readGroupLength(DcmInputStream &inStream, // inout const E_TransferSyntax xfer, // in const DcmTagKey &xtag, // in const E_GrpLenEncoding glenc, // in Uint32 &headerLen, // out Uint32 &bytesRead, // out const Uint32 maxReadLength = DCM_MaxReadLength); // in /// buffer for 132 byte DICOM file preamble char filePreamble[DCM_PreambleLen + DCM_MagicLen]; /// true if the preamble was read from stream OFBool preambleUsed; /// transfer state of the preamble E_TransferState fPreambleTransferState; /// transfer syntax in which the meta-header was read E_TransferSyntax Xfer; }; #endif // DCMETINF_H /* ** CVS/RCS Log: ** $Log: dcmetinf.h,v $ ** Revision 1.33 2010-10-14 13:15:41 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.32 2010-06-07 13:54:13 joergr ** Added new method that allows for loading the meta-header only. ** ** Revision 1.31 2010-03-01 09:08:44 uli ** Removed some unnecessary include directives in the headers. ** ** Revision 1.30 2010-02-22 11:39:54 uli ** Remove some unneeded includes. ** ** Revision 1.29 2009-08-25 13:00:52 joergr ** Added new methods which remove all data elements with an invalid group number ** from the meta information header, dataset and/or fileformat. ** ** Revision 1.28 2008-07-17 11:19:48 onken ** Updated copyFrom() documentation. ** ** Revision 1.27 2008-07-17 10:30:23 onken ** Implemented copyFrom() method for complete DcmObject class hierarchy, which ** permits setting an instance's value from an existing object. Implemented ** assignment operator where necessary. ** ** Revision 1.26 2008-06-23 12:09:13 joergr ** Fixed inconsistencies in Doxygen API documentation. ** ** Revision 1.25 2007/11/29 14:30:19 meichel ** Write methods now handle large raw data elements (such as pixel data) ** without loading everything into memory. This allows very large images to ** be sent over a network connection, or to be copied without ever being ** fully in memory. ** ** Revision 1.24 2007/02/19 14:57:22 meichel ** Declaration of copy assignment operator now private, as it should be ** ** Revision 1.23 2006/08/15 15:49:56 meichel ** Updated all code in module dcmdata to correctly compile when ** all standard C++ classes remain in namespace std. ** ** Revision 1.22 2005/12/08 16:28:21 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.21 2005/11/07 16:59:24 meichel ** Cleaned up some copy constructors in the DcmObject hierarchy. ** ** Revision 1.20 2004/07/01 12:28:25 meichel ** Introduced virtual clone method for DcmObject and derived classes. ** ** Revision 1.19 2003/03/21 13:06:46 meichel ** Minor code purifications for warnings reported by MSVC in Level 4 ** ** Revision 1.18 2002/12/06 12:49:11 joergr ** Enhanced "print()" function by re-working the implementation and replacing ** the boolean "showFullData" parameter by a more general integer flag. ** Added doc++ documentation. ** Made source code formatting more consistent with other modules/files. ** ** Revision 1.17 2002/08/27 16:55:35 meichel ** Initial release of new DICOM I/O stream classes that add support for stream ** compression (deflated little endian explicit VR transfer syntax) ** ** Revision 1.16 2002/04/25 09:40:56 joergr ** Added support for XML output of DICOM objects. ** ** Revision 1.15 2001/09/25 17:19:27 meichel ** Adapted dcmdata to class OFCondition ** ** Revision 1.14 2001/06/01 15:48:41 meichel ** Updated copyright header ** ** Revision 1.13 2000/04/14 15:31:32 meichel ** Removed default value from output stream passed to print() method. ** Required for use in multi-thread environments. ** ** Revision 1.12 2000/03/08 16:26:16 meichel ** Updated copyright header. ** ** Revision 1.11 2000/03/03 14:05:24 meichel ** Implemented library support for redirecting error messages into memory ** instead of printing them to stdout/stderr for GUI applications. ** ** Revision 1.10 2000/02/10 10:50:51 joergr ** Added new feature to dcmdump (enhanced print method of dcmdata): write ** pixel data/item value fields to raw files. ** ** Revision 1.9 1999/03/31 09:24:41 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.8 1997/09/22 14:56:12 hewett ** Added a method to retreive the original transfer syntax of a read ** meta-header (getOriginalXfer). This functionality is needed by ** the DCMCHECK package. ** ** Revision 1.7 1997/07/21 08:25:09 andreas ** - Replace all boolean types (BOOLEAN, CTNBOOLEAN, DICOM_BOOL, BOOL) ** with one unique boolean type OFBool. ** ** Revision 1.6 1997/05/16 08:23:47 andreas ** - Revised handling of GroupLength elements and support of ** DataSetTrailingPadding elements. The enumeratio E_GrpLenEncoding ** got additional enumeration values (for a description see dctypes.h). ** addGroupLength and removeGroupLength methods are replaced by ** computeGroupLengthAndPadding. To support Padding, the parameters of ** element and sequence write functions changed. ** - Added a new method calcElementLength to calculate the length of an ** element, item or sequence. For elements it returns the length of ** tag, length field, vr field, and value length, for item and ** sequences it returns the length of the whole item. sequence including ** the Delimitation tag (if appropriate). It can never return ** UndefinedLength. ** ** Revision 1.5 1996/08/05 08:45:24 andreas ** new print routine with additional parameters: ** - print into files ** - fix output length for elements ** corrected error in search routine with parameter ESM_fromStackTop ** ** Revision 1.4 1996/01/09 11:06:16 andreas ** New Support for Visual C++ ** Correct problems with inconsistent const declarations ** ** Revision 1.3 1996/01/05 13:22:57 andreas ** - changed to support new streaming facilities ** - more cleanups ** - merged read / write methods for block and file transfer ** */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/dcrledec.h0000644000310500011400000001730511455601176021510 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Marco Eichelberg * * Purpose: RLE decompressor * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:15:42 $ * CVS/RCS Revision: $Revision: 1.6 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DCRLEDEC_H #define DCRLEDEC_H #include "dcmtk/config/osconfig.h" #include "dcmtk/dcmdata/dcerror.h" /** this class implements an RLE decompressor conforming to the DICOM standard. * The class is loosely based on an implementation by Phil Norman */ class DcmRLEDecoder { public: /** constructor * @param outputBufferSize size of the output buffer (in bytes) * to which the RLE codec will write decompressed output. */ DcmRLEDecoder(size_t outputBufferSize) : fail_(0) , outputBufferSize_(outputBufferSize) , outputBuffer_(NULL) , offset_(0) , suspendInfo_(128) { if (outputBufferSize_ == 0) fail_ = 1; else { outputBuffer_ = new unsigned char[outputBufferSize_]; if (outputBuffer_ == NULL) fail_ = 1; } } /// destructor ~DcmRLEDecoder() { delete[] outputBuffer_; } /** resets the decoder object to newly constructed state. * The size and location of the output buffer is not changed. */ inline void clear() { offset_ = 0; suspendInfo_ = 128; if (outputBuffer_) fail_ = 0; } inline OFCondition decompress(void *compressedData, size_t compressedSize) { // we allow a call for zero bytes if (compressedSize == 0) return EC_Normal; OFCondition result = EC_IllegalCall; // check parameters passed by caller if (compressedData == NULL) fail_ = 1; if (! fail_) // if fail_ is true, just ignore input { result = EC_Normal; unsigned char ch; unsigned char nbytes; unsigned char *cp = OFstatic_cast(unsigned char *, compressedData); // check if we suspended last time, clean up if (suspendInfo_ > 128) { // DICOM packbit scheme uses 257 - nbytes to represent replicate runs nbytes = OFstatic_cast(unsigned char, 257 - suspendInfo_); // suspended replicate run. compressedSize cannot be zero now. suspendInfo_ = 128; ch = *cp++; --compressedSize; replicate(ch, nbytes); } else if (suspendInfo_ < 128) { // suspended literal run nbytes = OFstatic_cast(unsigned char, (suspendInfo_ & 0x7f) + 1); suspendInfo_ = 128; if (compressedSize < nbytes) { // we're going to suspend again (oops?), prepare everything suspendInfo_ = OFstatic_cast(unsigned char, nbytes - compressedSize - 1); nbytes = OFstatic_cast(unsigned char, compressedSize); result = EC_StreamNotifyClient; } literal(cp, nbytes); compressedSize -= nbytes; cp += nbytes; } // continue with ordinary RLE decompression while (compressedSize && (! fail_)) { ch = *cp++; --compressedSize; if (ch & 0x80) { // replicate run if (compressedSize) { // DICOM packbit scheme uses 257 - nbytes to represent replicate runs nbytes = OFstatic_cast(unsigned char, 257 - ch); ch = *cp++; --compressedSize; replicate(ch, nbytes); } else { // suspension: replicate run but second byte is in next block suspendInfo_ = ch; result = EC_StreamNotifyClient; } } else { // literal run nbytes = OFstatic_cast(unsigned char, (ch & 0x7f) + 1); if (compressedSize < nbytes) { // we're going to suspend, prepare everything suspendInfo_ = OFstatic_cast(unsigned char, nbytes - compressedSize - 1); nbytes = OFstatic_cast(unsigned char, compressedSize); result = EC_StreamNotifyClient; } literal(cp, nbytes); compressedSize -= nbytes; cp += nbytes; } } // failure status at this point means output buffer overflow if (fail_) result = EC_CorruptedData; } return result; } /** returns the number of bytes written to the output buffer * @return size of decompressed stream, in bytes */ inline size_t size() const { return offset_; } /** returns pointer to the output buffer */ inline void *getOutputBuffer() const { return outputBuffer_; } /** returns true if the RLE compressor has failed (out of memory or output buffer too small). */ inline OFBool fail() const { if (fail_) return OFTrue; else return OFFalse; } private: /// private undefined copy constructor DcmRLEDecoder(const DcmRLEDecoder&); /// private undefined copy assignment operator DcmRLEDecoder& operator=(const DcmRLEDecoder&); /** this method expands a replicate run * @param ch value to replicate * @param nbytes number of repetitions */ inline void replicate(unsigned char ch, unsigned char nbytes) { if (offset_ + nbytes > outputBufferSize_) { // output buffer overflow fail_ = 1; nbytes = OFstatic_cast(unsigned char, outputBufferSize_ - offset_); } while (nbytes--) outputBuffer_[offset_++] = ch; } /** this method expands a literal run * @param cp pointer to buffer * @param nbytes number of bytes in buffer */ inline void literal(unsigned char *cp, unsigned char nbytes) { if (offset_ + nbytes > outputBufferSize_) { // output buffer overflow fail_ = 1; nbytes = OFstatic_cast(unsigned char, outputBufferSize_ - offset_); } while (nbytes--) outputBuffer_[offset_++] = *cp++; } /* member variables */ /** this flag indicates a failure of the RLE codec. Once a failure is * flagged, the codec will consume all input and not produce any more * output. */ int fail_; /** size of output buffer, in bytes */ size_t outputBufferSize_; /** this member points to a block of size outputBufferSize_ * (unless fail_ is true). This is the block of data to * which the decompressed stream is written */ unsigned char *outputBuffer_; /** contains the number of bytes already written to outputBuffer_. * Value is always less or equal to outputBufferSize_. */ size_t offset_; /** contains suspension information. * If not suspended, contains 128. * If suspended during a replicate run, contains control byte of repeat run (> 128). * If suspended during a literal run, contains number of remaining bytes in literal run minus 1 (< 128). */ unsigned char suspendInfo_; }; #endif /* * CVS/RCS Log * $Log: dcrledec.h,v $ * Revision 1.6 2010-10-14 13:15:42 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.5 2009-11-04 09:58:07 uli * Switched to logging mechanism provided by the "new" oflog module * * Revision 1.4 2005-12-08 16:28:36 meichel * Changed include path schema for all DCMTK header files * * Revision 1.3 2003/08/14 09:00:56 meichel * Adapted type casts to new-style typecast operators defined in ofcast.h * * Revision 1.2 2003/03/21 13:06:46 meichel * Minor code purifications for warnings reported by MSVC in Level 4 * * Revision 1.1 2002/06/06 14:52:36 meichel * Initial release of the new RLE codec classes * and the dcmcrle/dcmdrle tools in module dcmdata * * */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/dcvrtm.h0000644000310500011400000004463011464747623021253 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Gerd Ehlers, Joerg Riesmeier * * Purpose: Interface of class DcmTime * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-11-05 09:34:11 $ * CVS/RCS Revision: $Revision: 1.26 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DCVRTM_H #define DCVRTM_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dctypes.h" #include "dcmtk/dcmdata/dcbytstr.h" #include "dcmtk/ofstd/oftime.h" /** a class representing the DICOM value representation 'Time' (TM) */ class DcmTime : public DcmByteString { public: /** constructor. * Create new element from given tag and length. * @param tag DICOM tag for the new element * @param len value length for the new element */ DcmTime(const DcmTag &tag, const Uint32 len = 0); /** copy constructor * @param old element to be copied */ DcmTime(const DcmTime &old); /** destructor */ virtual ~DcmTime(); /** assignment operator * @param obj element to be assigned/copied * @return reference to this object */ DcmTime &operator=(const DcmTime &obj); /** clone method * @return deep copy of this object */ virtual DcmObject *clone() const { return new DcmTime(*this); } /** Virtual object copying. This method can be used for DcmObject * and derived classes to get a deep copy of an object. Internally * the assignment operator is called if the given DcmObject parameter * is of the same type as "this" object instance. If not, an error * is returned. This function permits copying an object by value * in a virtual way which therefore is different to just calling the * assignment operator of DcmElement which could result in slicing * the object. * @param rhs - [in] The instance to copy from. Has to be of the same * class type as "this" object * @return EC_Normal if copying was successful, error otherwise */ virtual OFCondition copyFrom(const DcmObject& rhs); /** get element type identifier * @return type identifier of this class (EVR_TM) */ virtual DcmEVR ident() const; /** check whether stored value conforms to the VR and to the specified VM * @param vm value multiplicity (according to the data dictionary) to be checked for. * (valid values: "1", "1-2", "1-3", "1-8", "1-99", "1-n", "2", "2-n", "2-2n", * "3", "3-n", "3-3n", "4", "6", "9", "16", "32") * @param oldFormat support old ACR/NEMA format if OFTrue (':' as a separator) * @return status of the check, EC_Normal if value is correct, an error code otherwise */ virtual OFCondition checkValue(const OFString &vm = "1-n", const OFBool oldFormat = OFFalse); /** get a copy of a particular string component * @param stringValue variable in which the result value is stored * @param pos index of the value in case of multi-valued elements (0..vm-1) * @param normalize delete trailing spaces if OFTrue * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition getOFString(OFString &stringValue, const unsigned long pos, OFBool normalize = OFTrue); /** set the element value to the current system time. * The DICOM TM format supported by this function is "HHMM[SS[.FFFFFF]]" where * the brackets enclose optional parts. If the current system time or parts of it * are unavailable the corresponding values are set to "0" and an error code is * returned. * @param seconds add optional seconds ("SS") if OFTrue * @param fraction add optional fractional part of a second (".FFFFFF") if OFTrue * (requires parameter 'seconds' to be also OFTrue) * @return EC_Normal upon success, an error code otherwise */ OFCondition setCurrentTime(const OFBool seconds = OFTrue, const OFBool fraction = OFFalse); /** set the element value to the given time * @param timeValue time to be set (should be a valid time) * @return EC_Normal upon success, an error code otherwise */ OFCondition setOFTime(const OFTime &timeValue); /** get the current element value in OFTime format. * Please note that the element value is expected to be in valid DICOM TM format * ("[HH[MM[SS[.FFFFFF]]]]", "[HH[:MM[:SS[.FFFFFF]]]]" is also supported for reasons * of backward compatibility). Since there is no time zone for the DICOM TM format * local time is assumed (the time zone of 'timeValue' is set automatically). * If this function fails the result variable 'timeValue' is cleared automatically. * @param timeValue reference to OFTime variable where the result is stored * @param pos index of the element component in case of value multiplicity (0..vm-1) * @param supportOldFormat if OFTrue support old (prior V3.0) time format (see above) * @return EC_Normal upon success, an error code otherwise */ OFCondition getOFTime(OFTime &timeValue, const unsigned long pos = 0, const OFBool supportOldFormat = OFTrue); /** get the current element value in ISO time format. * The ISO time format supported by this function is "HH:MM[:SS[.FFFFFF]]" * where the brackets enclose optional parts. Please note that the element value * is expected to be in valid DICOM TM format ("[HH[MM[SS[.FFFFFF]]]]", * "[HH[:MM[:SS[.FFFFFF]]]]" is also supported for reasons of backward compatibility). * If this function fails the result variable 'formattedTime' is cleared automatically. * Please note that if the "Timezone Offset From UTC" attribute (0008,0201) is present, * it applies to all TM attributes in the object. However, the time zone is not taken * into account for the creation of the ISO formatted time. * See also "getTimeZoneFromString()" below. * @param formattedTime reference to string variable where the result is stored * @param pos index of the element component in case of value multiplicity (0..vm-1) * @param seconds add optional seconds (":SS") if OFTrue * @param fraction add optional fractional part of a second (".FFFFFF") if OFTrue * (requires parameter 'seconds' to be also OFTrue) * @param createMissingPart if OFTrue create optional parts (seconds and/or fractional * part of a seconds) if absent in the element value * @param supportOldFormat if OFTrue support old (prior V3.0) time format (see above) * @return EC_Normal upon success, an error code otherwise */ OFCondition getISOFormattedTime(OFString &formattedTime, const unsigned long pos = 0, const OFBool seconds = OFTrue, const OFBool fraction = OFFalse, const OFBool createMissingPart = OFFalse, const OFBool supportOldFormat = OFTrue); /* --- static helper functions --- */ /** get the current system time. * The DICOM TM format supported by this function is "HHMM[SS[.FFFFFF]]" where * the brackets enclose optional parts. If the current system time or parts of it * are unavailable the corresponding values are set to "0" and an error code is * returned. * @param dicomTime reference to string variable where the result is stored * @param seconds add optional seconds ("SS") if OFTrue * @param fraction add optional fractional part of a second (".FFFFFF") if OFTrue * (requires parameter 'seconds' to be also OFTrue) * @return EC_Normal upon success, an error code otherwise */ static OFCondition getCurrentTime(OFString &dicomTime, const OFBool seconds = OFTrue, const OFBool fraction = OFFalse); /** get the specified OFTime value in DICOM format. * The DICOM TM format supported by this function is "HHMM[SS[.FFFFFF]]" where * the brackets enclose optional parts. If the current system time or parts of it * are unavailable the corresponding values are set to "0" and an error code is * returned. * @param timeValue time to be converted to DICOM format * @param dicomTime reference to string variable where the result is stored * @param seconds add optional seconds ("SS") if OFTrue * @param fraction add optional fractional part of a second (".FFFFFF") if OFTrue * (requires parameter 'seconds' to be also OFTrue) * @return EC_Normal upon success, an error code otherwise */ static OFCondition getDicomTimeFromOFTime(const OFTime &timeValue, OFString &dicomTime, const OFBool seconds = OFTrue, const OFBool fraction = OFFalse); /** get the specified DICOM time value in OFTime format. * Please note that the element value is expected to be in valid DICOM TM format * ("[HH[MM[SS[.FFFFFF]]]]", "[HH[:MM[:SS[.FFFFFF]]]]" is also supported for reasons * of backward compatibility). Since there is no time zone for the DICOM TM format * local time is assumed (the time zone of 'timeValue' is set automatically). * If this function fails the result variable 'timeValue' is cleared automatically. * @param dicomTime string value in DICOM TM format to be converted to ISO format * @param timeValue reference to OFTime variable where the result is stored * @param supportOldFormat if OFTrue support old (prior V3.0) time format (see above) * @return EC_Normal upon success, an error code otherwise */ static OFCondition getOFTimeFromString(const OFString &dicomTime, OFTime &timeValue, const OFBool supportOldFormat = OFTrue); /** get the specified DICOM time value in ISO format. * The ISO time format supported by this function is "HH:MM[:SS[.FFFFFF]]" * where the brackets enclose optional parts. Please note that the specified value * is expected to be in valid DICOM TM format ("[HH[MM[SS[.FFFFFF]]]]", * "[HH[:MM[:SS[.FFFFFF]]]]" is also supported for reasons of backward compatibility). * If this function fails the result variable 'formattedTime' is cleared automatically. * @param dicomTime string value in DICOM TM format to be converted to ISO format * @param formattedTime reference to string variable where the result is stored * @param seconds add optional seconds (":SS") if OFTrue * @param fraction add optional fractional part of a second (".FFFFFF") if OFTrue * (requires parameter 'seconds' to be also OFTrue) * @param createMissingPart if OFTrue create optional parts (seconds and/or fractional * part of a seconds) if absent in the DICOM TM value * @param supportOldFormat if OFTrue support old (prior V3.0) time format (see above) * @return EC_Normal upon success, an error code otherwise */ static OFCondition getISOFormattedTimeFromString(const OFString &dicomTime, OFString &formattedTime, const OFBool seconds = OFTrue, const OFBool fraction = OFFalse, const OFBool createMissingPart = OFFalse, const OFBool supportOldFormat = OFTrue); /** get the specified DICOM time zone in number of hours format * DICOM standard states that if the "Timezone Offset From UTC" attribute (0008,0201) is * present it applies to all TM attributes in the object. This functions allows to convert * the DICOM format ("&ZZZZ" where "&" is "+" or "-" and "ZZZZ" hours and minutes) to a * floating point value, e.g. "+1.0" means plus one hour and "-2.5" minus two and a half * hour, i.e. 2 hours and 30 minutes. * The resulting 'timeZone' value can be used in conjuction with a OFTime object to convert * the time to different time zones (e.g. to local time or UTC). * @param dicomTimeZone string value in DICOM format ("&ZZZZ") to be converted * @param timeZone reference to floating point variable where the resulting UTC offset is stored * @return EC_Normal upon success, an error code otherwise */ static OFCondition getTimeZoneFromString(const OFString &dicomTimeZone, double &timeZone); /** check whether given string value conforms to the VR "TM" (Time) * and to the specified VM. * @param value string value to be checked (possibly multi-valued) * @param vm value multiplicity (according to the data dictionary) to be checked for. * (valid values: "1", "1-2", "1-3", "1-8", "1-99", "1-n", "2", "2-n", "2-2n", * "3", "3-n", "3-3n", "4", "6", "9", "16", "32") * @param oldFormat support old ACR/NEMA time format if OFTrue (i.e. with ":" and "." delimiters) * @return status of the check, EC_Normal if value is correct, an error code otherwise */ static OFCondition checkStringValue(const OFString &value, const OFString &vm = "1-n", const OFBool oldFormat = OFFalse); }; #endif // DCVRTM_H /* ** CVS/RCS Log: ** $Log: dcvrtm.h,v $ ** Revision 1.26 2010-11-05 09:34:11 joergr ** Added support for checking the value multiplicity "9" (see Supplement 131). ** ** Revision 1.25 2010-10-14 13:15:43 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.24 2010-04-23 15:26:13 joergr ** Specify an appropriate default value for the "vm" parameter of checkValue(). ** ** Revision 1.23 2010-04-23 14:25:27 joergr ** Added new method to all VR classes which checks whether the stored value ** conforms to the VR definition and to the specified VM. ** ** Revision 1.22 2010-04-22 09:31:30 joergr ** Revised misleading parameter documentation for the checkValue() method. ** ** Revision 1.21 2010-04-22 08:59:10 joergr ** Added support for further VM values ("1-8", "1-99", "16", "32") to be checked. ** ** Revision 1.20 2009-08-03 09:05:30 joergr ** Added methods that check whether a given string value conforms to the VR and ** VM definitions of the DICOM standards. ** ** Revision 1.19 2008-07-17 11:19:49 onken ** Updated copyFrom() documentation. ** ** Revision 1.18 2008-07-17 10:30:23 onken ** Implemented copyFrom() method for complete DcmObject class hierarchy, which ** permits setting an instance's value from an existing object. Implemented ** assignment operator where necessary. ** ** Revision 1.17 2005-12-08 16:29:11 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.16 2004/07/01 12:28:25 meichel ** Introduced virtual clone method for DcmObject and derived classes. ** ** Revision 1.15 2002/12/06 12:49:19 joergr ** Enhanced "print()" function by re-working the implementation and replacing ** the boolean "showFullData" parameter by a more general integer flag. ** Added doc++ documentation. ** Made source code formatting more consistent with other modules/files. ** ** Revision 1.14 2002/04/25 09:58:07 joergr ** Removed getOFStringArray() implementation. ** ** Revision 1.13 2002/04/11 12:25:10 joergr ** Enhanced DICOM date, time and date/time classes. Added support for new ** standard date and time functions. ** ** Revision 1.12 2001/10/10 15:18:17 joergr ** Added new flag to date/time routines allowing to choose whether the old ** prior V3.0 format for the corresponding DICOM VRs is supported or not. ** ** Revision 1.11 2001/10/01 15:01:40 joergr ** Introduced new general purpose functions to get/set person names, date, time ** and date/time. ** ** Revision 1.10 2001/09/25 17:19:34 meichel ** Adapted dcmdata to class OFCondition ** ** Revision 1.9 2001/06/01 15:48:53 meichel ** Updated copyright header ** ** Revision 1.8 2000/03/08 16:26:26 meichel ** Updated copyright header. ** ** Revision 1.7 1999/03/31 09:25:08 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.6 1998/11/12 16:47:56 meichel ** Implemented operator= for all classes derived from DcmObject. ** ** Revision 1.5 1997/09/11 15:13:17 hewett ** Modified getOFString method arguments by removing a default value ** for the pos argument. By requiring the pos argument to be provided ** ensures that callers realise getOFString only gets one component of ** a multi-valued string. ** ** Revision 1.4 1997/08/29 08:32:45 andreas ** - Added methods getOFString and getOFStringArray for all ** string VRs. These methods are able to normalise the value, i. e. ** to remove leading and trailing spaces. This will be done only if ** it is described in the standard that these spaces are not relevant. ** These methods do not test the strings for conformance, this means ** especially that they do not delete spaces where they are not allowed! ** getOFStringArray returns the string with all its parts separated by \ ** and getOFString returns only one value of the string. ** CAUTION: Currently getString returns a string with trailing ** spaces removed (if dcmEnableAutomaticInputDataCorrection == OFTrue) and ** truncates the original string (since it is not copied!). If you rely on this ** behaviour please change your application now. ** Future changes will ensure that getString returns the original ** string from the DICOM object (NULL terminated) inclusive padding. ** Currently, if you call getOF... before calling getString without ** normalisation, you can get the original string read from the DICOM object. ** ** Revision 1.3 1996/01/05 13:23:10 andreas ** - changed to support new streaming facilities ** - more cleanups ** - merged read / write methods for block and file transfer ** */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/dcdict.h0000644000310500011400000003310111455601174021163 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Andrew Hewett * * Purpose: Interface for loadable DICOM data dictionary * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:15:40 $ * CVS/RCS Revision: $Revision: 1.24 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DCMDICT_H #define DCMDICT_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/ofstd/ofthread.h" #include "dcmtk/dcmdata/dchashdi.h" /// maximum length of a line in the loadable DICOM dictionary #define DCM_MAXDICTLINESIZE 2048 /// maximum number of fields per entry in the loadable DICOM dictionary #define DCM_MAXDICTFIELDS 6 /// environment variable pointing to the data dictionary file #define DCM_DICT_ENVIRONMENT_VARIABLE "DCMDICTPATH" #ifndef DCM_DICT_DEFAULT_PATH /* ** The default dictionary path is system dependent. It should ** be defined in a configuration file included from "osconfig.h" */ #error "DCM_DICT_DEFAULT_PATH is not defined via osconfig.h" #endif /* !DCM_DICT_DEFAULT_PATH */ #ifndef ENVIRONMENT_PATH_SEPARATOR #define ENVIRONMENT_PATH_SEPARATOR '\n' /* at least define something unlikely */ #endif /** this class implements a loadable DICOM Data Dictionary */ class DcmDataDictionary { public: /** constructor * @param loadBuiltin flag indicating if a built-in data dictionary * (if any) should be loaded. * @param loadExternal flag indicating if an external data dictionary * should be read from file. */ DcmDataDictionary(OFBool loadBuiltin, OFBool loadExternal); /// destructor ~DcmDataDictionary(); /** checks if a data dictionary is loaded (excluding the skeleton dictionary) * @return true if loaded, false if no dictionary is present */ OFBool isDictionaryLoaded() const { return dictionaryLoaded; } /// returns the number of normal (non-repeating) tag entries int numberOfNormalTagEntries() const { return hashDict.size(); } /// returns the number of repeating tag entries int numberOfRepeatingTagEntries() const { return OFstatic_cast(int, repDict.size()); } /** returns the number of dictionary entries that were loaded * either from file or from a built-in dictionary or both. */ int numberOfEntries() const { return numberOfNormalTagEntries() + numberOfRepeatingTagEntries() - skeletonCount; } /** returns the number of skeleton entries. The skeleton is a collection * of dictionary entries which are always present, even if neither internal * nor external dictionary have been loaded. It contains very basic * things like item delimitation and sequence delimitation. */ int numberOfSkeletonEntries() const { return skeletonCount; } /** reload data dictionaries. First, all dictionary entries are deleted. * @param loadBuiltin flag indicating if a built-in data dictionary * (if any) should be loaded. * @param loadExternal flag indicating if an external data dictionary * should be read from file. * @return true if reload was successful, false if an error occurred */ OFBool reloadDictionaries(OFBool loadBuiltin, OFBool loadExternal); /** load a particular dictionary from file. * @param fileName filename * @param errorIfAbsent causes the method to return false * if the file cannot be opened * @return false if the file contains a parse error or if the file could * not be opened and errorIfAbsent was set, true otherwise. */ OFBool loadDictionary(const char* fileName, OFBool errorIfAbsent = OFTrue); /** dictionary lookup for the given tag key and private creator name. * First the normal tag dictionary is searched. If not found * then the repeating tag dictionary is searched. * @param key tag key * @param privCreator private creator name, may be NULL */ const DcmDictEntry* findEntry(const DcmTagKey& key, const char *privCreator) const; /** dictionary lookup for the given attribute name. * First the normal tag dictionary is searched. If not found * then the repeating tag dictionary is searched. * Only considers standard attributes (i. e. without private creator) * @param name attribute name */ const DcmDictEntry* findEntry(const char *name) const; /// deletes all dictionary entries void clear(); /** adds an entry to the dictionary. Must be allocated via new. * The entry becomes the property of the dictionary and will be * deallocated (via delete) upon clear() or dictionary destruction. * If an equivalent entry already exists it will be replaced by * the new entry and the old entry deallocated (via delete). * @param entry pointer to new entry */ void addEntry(DcmDictEntry* entry); /* Iterators to access the normal and the repeating entries */ /// returns an iterator to the start of the normal (non-repeating) dictionary DcmHashDictIterator normalBegin() { return hashDict.begin(); } /// returns an iterator to the end of the normal (non-repeating) dictionary DcmHashDictIterator normalEnd() { return hashDict.end(); } /// returns an iterator to the start of the repeating tag dictionary DcmDictEntryListIterator repeatingBegin() { return repDict.begin(); } /// returns an iterator to the end of the repeating tag dictionary DcmDictEntryListIterator repeatingEnd() { return repDict.end(); } private: /** private undefined assignment operator */ DcmDataDictionary &operator=(const DcmDataDictionary &); /** private undefined copy constructor */ DcmDataDictionary(const DcmDataDictionary &); /** loads external dictionaries defined via environment variables * @return true if successful */ OFBool loadExternalDictionaries(); /** loads a builtin (compiled) data dictionary. * Depending on which code is in use, this function may not * do anything. */ void loadBuiltinDictionary(); /** loads the skeleton dictionary (the bare minimum needed to run) * @return true if successful */ OFBool loadSkeletonDictionary(); /** looks up the given directory entry in the two dictionaries. * @return pointer to entry if found, NULL otherwise */ const DcmDictEntry* findEntry(const DcmDictEntry& entry) const; /** deletes the given entry from either dictionary */ void deleteEntry(const DcmDictEntry& entry); /** dictionary of normal tags */ DcmHashDict hashDict; /** dictionary of repeating tags */ DcmDictEntryList repDict; /** the number of skeleton entries */ int skeletonCount; /** is a dictionary loaded (more than skeleton) */ OFBool dictionaryLoaded; }; /** encapsulates a data dictionary with access methods which allow safe * read and write access from multiple threads in parallel. * A read/write lock is used to protect threads from each other. * This allows parallel read-only access by multiple threads, which is * the most common case. */ class GlobalDcmDataDictionary { public: /** constructor. * @param loadBuiltin if true, the dictionary constructor calls loadBuiltinDictionary(). * @param loadExternal if true, the dictionary constructor calls loadExternalDictionaries(). */ GlobalDcmDataDictionary(OFBool loadBuiltin, OFBool loadExternal); /** destructor */ ~GlobalDcmDataDictionary(); /** acquires a read lock and returns a const reference to * the dictionary. * @return const reference to dictionary */ const DcmDataDictionary& rdlock(); /** acquires a write lock and returns a non-const reference * to the dictionary. * @return non-const reference to dictionary. */ DcmDataDictionary& wrlock(); /** unlocks the read or write lock which must have been acquired previously. */ void unlock(); /** checks if a data dictionary has been loaded. This method acquires and * releases a read lock. It must not be called with another lock on the * dictionary being held by the calling thread. * @return OFTrue if dictionary has been loaded, OFFalse otherwise. */ OFBool isDictionaryLoaded(); /** erases the contents of the dictionary. This method acquires and * releases a write lock. It must not be called with another lock on the * dictionary being held by the calling thread. This method is intended * as a help for debugging memory leaks. */ void clear(); private: /** private undefined assignment operator */ GlobalDcmDataDictionary &operator=(const GlobalDcmDataDictionary &); /** private undefined copy constructor */ GlobalDcmDataDictionary(const GlobalDcmDataDictionary &); /** the data dictionary managed by this class */ DcmDataDictionary dataDict; #ifdef WITH_THREADS /** the read/write lock used to protect access from multiple threads */ OFReadWriteLock dataDictLock; #endif }; /** The Global DICOM Data Dictionary. * Will be created before main() starts. * Tries to load a builtin data dictionary (if compiled in). * Tries to load data dictionaries from files specified by * the DCMDICTPATH environment variable. If this environment * variable does not exist then a default file is loaded (if * it exists). * It is possible that no data dictionary gets loaded. This * is likely to cause unexpected behaviour in the dcmdata * toolkit classes. */ extern GlobalDcmDataDictionary dcmDataDict; #endif /* ** CVS/RCS Log: ** $Log: dcdict.h,v $ ** Revision 1.24 2010-10-14 13:15:40 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.23 2010-10-04 14:44:39 joergr ** Replaced "#ifdef _REENTRANT" by "#ifdef WITH_THREADS" where appropriate (i.e. ** in all cases where OFMutex, OFReadWriteLock, etc. are used). ** ** Revision 1.22 2009-02-05 13:13:51 joergr ** Added reload method to data dictionary class. ** ** Revision 1.21 2008-08-15 09:27:14 meichel ** Added type cast to fix a warning ** ** Revision 1.20 2005/12/08 16:28:09 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.19 2004/01/16 14:07:27 joergr ** Removed acknowledgements with e-mail addresses from CVS log. ** ** Revision 1.18 2002/07/23 14:21:25 meichel ** Added support for private tag data dictionaries to dcmdata ** ** Revision 1.17 2002/02/27 14:21:20 meichel ** Declare dcmdata read/write locks only when compiled in multi-thread mode ** ** Revision 1.16 2001/06/01 15:48:38 meichel ** Updated copyright header ** ** Revision 1.15 2000/05/03 14:19:08 meichel ** Added new class GlobalDcmDataDictionary which implements read/write lock ** semantics for safe access to the DICOM dictionary from multiple threads ** in parallel. The global dcmDataDict now uses this class. ** ** Revision 1.14 2000/03/08 16:26:13 meichel ** Updated copyright header. ** ** Revision 1.13 1999/03/31 09:24:35 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.12 1998/07/15 15:48:45 joergr ** Removed several compiler warnings reported by gcc 2.8.1 with ** additional options, e.g. missing copy constructors and assignment ** operators, initialization of member variables in the body of a ** constructor instead of the member initialization list, hiding of ** methods by use of identical names, uninitialized member variables, ** missing const declaration of char pointers. Replaced tabs by spaces. ** ** Revision 1.11 1997/08/26 14:02:56 hewett ** New data structures for data-dictionary. The main part of the ** data-dictionary is now stored in an hash table using an optimized ** hash function. This new data structure reduces data-dictionary ** load times by a factor of 4! he data-dictionary specific linked-list ** has been replaced by a linked list derived from OFList class ** (see ofstd/include/oflist.h). ** The only interface modifications are related to iterating over the entire ** data dictionary which should not be needed by "normal" applications. ** ** Revision 1.10 1997/07/21 08:25:07 andreas ** - Replace all boolean types (BOOLEAN, CTNBOOLEAN, DICOM_BOOL, BOOL) ** with one unique boolean type OFBool. ** ** Revision 1.9 1997/05/22 13:15:54 hewett ** Added method DcmDataDictionary::isDictionaryLoaded() to ask if a full ** data dictionary has been loaded. This method should be used in tests ** rather that querying the number of entries (a sekelton dictionary is ** now always present). ** ** Revision 1.8 1997/05/13 13:58:41 hewett ** Added member function (loadSkeletomDictionary) to preload of a few ** essential attribute descriptions into the data dictionary (e.g. Item ** and ItemDelimitation tags). ** ** Revision 1.7 1996/09/18 16:37:10 hewett ** Added capability to search data dictionary by tag name. ** ** Revision 1.6 1996/03/22 13:09:12 hewett ** Moved the definition of DCM_DICT_DEFAULT_PATH to the system ** dependent configuration files included via "osconfig.h". ** ** Revision 1.5 1996/03/21 09:50:38 hewett ** Added a method numberOfEntries() to return the total number of ** dictionary entries. ** ** Revision 1.4 1996/03/20 16:43:49 hewett ** Updated for revised data dictionary. Repeating tags are now handled better. ** A linear list of repeating tags has been introduced with a subset ordering ** mechanism to ensure that dictionary searches locate the most precise ** dictionary entry. ** */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/dcrledrg.h0000644000310500011400000000602511455601176021526 0ustar joergrdicom3/* * * Copyright (C) 2002-2010, 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: dcmdata * * Author: Marco Eichelberg * * Purpose: singleton class that registers RLE decoder. * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:15:42 $ * CVS/RCS Revision: $Revision: 1.8 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DCRLEDRG_H #define DCRLEDRG_H #include "dcmtk/config/osconfig.h" #include "dcmtk/ofstd/oftypes.h" /* for OFBool */ class DcmRLECodecParameter; class DcmRLECodecDecoder; /** singleton class that registers an RLE decoder. */ class DcmRLEDecoderRegistration { public: /** registers RLE decoder. * If already registered, call is ignored unless cleanup() has * been performed before. * @param pCreateSOPInstanceUID flag indicating whether or not * a new SOP Instance UID should be assigned upon decompression. * @param pReverseDecompressionByteOrder flag indicating whether the byte order should * be reversed upon decompression. Needed to correctly decode some incorrectly encoded * images with more than one byte per sample. */ static void registerCodecs( OFBool pCreateSOPInstanceUID = OFFalse, OFBool pReverseDecompressionByteOrder = OFFalse); /** deregisters decoder. * Attention: Must not be called while other threads might still use * the registered codecs, e.g. because they are currently decoding * DICOM data sets through dcmdata. */ static void cleanup(); private: /// private undefined copy constructor DcmRLEDecoderRegistration(const DcmRLEDecoderRegistration&); /// private undefined copy assignment operator DcmRLEDecoderRegistration& operator=(const DcmRLEDecoderRegistration&); /// flag indicating whether the decoder is already registered. static OFBool registered; /// pointer to codec parameter static DcmRLECodecParameter *cp; /// pointer to RLE decoder static DcmRLECodecDecoder *codec; // dummy friend declaration to prevent gcc from complaining // that this class only defines private constructors and has no friends. friend class DcmRLEDecoderRegistrationDummyFriend; }; #endif /* * CVS/RCS Log * $Log: dcrledrg.h,v $ * Revision 1.8 2010-10-14 13:15:42 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.7 2009-11-04 09:58:07 uli * Switched to logging mechanism provided by the "new" oflog module * * Revision 1.6 2005-12-08 16:28:37 meichel * Changed include path schema for all DCMTK header files * * Revision 1.5 2005/07/26 17:08:33 meichel * Added option to RLE decoder that allows to correctly decode images with * incorrect byte order of byte segments (LSB instead of MSB). * * Revision 1.4 2004/02/04 16:00:22 joergr * Added CVS log entry at the end of the file. * * */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/dcfcache.h0000644000310500011400000000620611455601175021460 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Marco Eichelberg * * Purpose: file cache facility for DcmElement::getPartialValue * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:15:41 $ * CVS/RCS Revision: $Revision: 1.3 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DCFCACHE_H #define DCFCACHE_H #include "dcmtk/config/osconfig.h" #include "dcmtk/ofstd/offile.h" /* for offile_off_t */ #include "dcmtk/dcmdata/dcistrma.h" /* for class DcmInputStream */ /** This class implements a simple container that stores an input stream, * the position of that input stream corresponding to the start of a DICOM * element value field contained in the stream and the current "owner" object. * It is used to keep a single file handle open during multiple calls to * DcmElement::getPartialValue(), thus speeding up the reading. */ class DcmFileCache { public: /// default constructor DcmFileCache() : stream_(NULL) , offset_(0) , user_(NULL) { } /// destructor ~DcmFileCache() { delete stream_; } /** checks if the given object is the current user of this cache * returns true if so, false otherwise * @param object pointer to "user object" */ OFBool isUser(void *object) const { return object == user_; } /// returns object to default constructed state void clear() { delete stream_; stream_ = NULL; offset_ = 0; user_ = NULL; } /** initializes the file cache with the given stream object * and user. * @param stream stream object * @param user user object */ void init(DcmInputStream *stream, void *user) { clear(); stream_ = stream; user_ = user; if (stream_) offset_ = stream_->tell(); } /// return input stream DcmInputStream *getStream() { return stream_; } /// return initial stream offset offile_off_t getOffset() const { return offset_; } private: /// private undefined copy constructor DcmFileCache(const DcmFileCache& arg); /// private undefined copy assignment operator DcmFileCache& operator=(const DcmFileCache& arg); /// input stream, may be NULL DcmInputStream *stream_; /// offset within stream for initial position offile_off_t offset_; /// object that currently uses the file cache, i.e. has created the stream const void *user_; }; #endif /* * CVS/RCS Log: * $Log: dcfcache.h,v $ * Revision 1.3 2010-10-14 13:15:41 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.2 2009-11-04 09:58:07 uli * Switched to logging mechanism provided by the "new" oflog module * * Revision 1.1 2007-07-11 08:50:23 meichel * Initial release of new method DcmElement::getPartialValue which gives access * to partial attribute values without loading the complete attribute value * into memory, if kept in file. * * */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/dcvrlt.h0000644000310500011400000002012611455601177021235 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Gerd Ehlers, Andreas Barth * * Purpose: Interface of class DcmLongText * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:15:43 $ * CVS/RCS Revision: $Revision: 1.20 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DCVRLT_H #define DCVRLT_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcchrstr.h" /** a class representing the DICOM value representation 'Long Text' (LT) */ class DcmLongText : public DcmCharString { public: /** constructor. * Create new element from given tag and length. * @param tag DICOM tag for the new element * @param len value length for the new element */ DcmLongText(const DcmTag &tag, const Uint32 len = 0); /** copy constructor * @param old element to be copied */ DcmLongText(const DcmLongText &old); /** destructor */ virtual ~DcmLongText(); /** assignment operator * @param obj element to be assigned/copied * @return reference to this object */ DcmLongText &operator=(const DcmLongText &obj); /** clone method * @return deep copy of this object */ virtual DcmObject *clone() const { return new DcmLongText(*this); } /** Virtual object copying. This method can be used for DcmObject * and derived classes to get a deep copy of an object. Internally * the assignment operator is called if the given DcmObject parameter * is of the same type as "this" object instance. If not, an error * is returned. This function permits copying an object by value * in a virtual way which therefore is different to just calling the * assignment operator of DcmElement which could result in slicing * the object. * @param rhs - [in] The instance to copy from. Has to be of the same * class type as "this" object * @return EC_Normal if copying was successful, error otherwise */ virtual OFCondition copyFrom(const DcmObject& rhs); /** get element type identifier * @return type identifier of this class (EVR_LT) */ virtual DcmEVR ident() const; /** check whether stored value conforms to the VR and to the specified VM * @param vm parameter not used for this VR * @param oldFormat parameter not used for this VR (only for DA, TM, PN) * @return status of the check, EC_Normal if value is correct, an error code otherwise */ virtual OFCondition checkValue(const OFString &vm = "", const OFBool oldFormat = OFFalse); /** get the value multiplicity. * Since the backslash "\" is not regarded as a separator the value * multiplicity is always 1. * @return value multiplicity of the currently stored value */ virtual unsigned long getVM(); /** get a copy of a particular string component * @param stringVal variable in which the result value is stored * @param pos index of the value in case of multi-valued elements (0..vm-1) * @param normalize delete leading and trailing spaces if OFTrue * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition getOFString(OFString &stringVal, const unsigned long pos, OFBool normalize = OFTrue); /** get the string value (all compenents) * @param stringVal string variable in which the result value is stored * @param normalize remove trailing spaces if OFTrue * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition getOFStringArray(OFString &stringVal, OFBool normalize = OFTrue); /* --- static helper functions --- */ /** check whether given string value conforms to the VR "LT" (Long Text) * @param value string value to be checked (possibly multi-valued) * @return status of the check, EC_Normal if value is correct, an error code otherwise */ static OFCondition checkStringValue(const OFString &value); }; #endif // DCVRLT_H /* ** CVS/RCS Log: ** $Log: dcvrlt.h,v $ ** Revision 1.20 2010-10-14 13:15:43 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.19 2010-04-23 15:26:13 joergr ** Specify an appropriate default value for the "vm" parameter of checkValue(). ** ** Revision 1.18 2010-04-23 14:25:27 joergr ** Added new method to all VR classes which checks whether the stored value ** conforms to the VR definition and to the specified VM. ** ** Revision 1.17 2010-03-01 09:08:45 uli ** Removed some unnecessary include directives in the headers. ** ** Revision 1.16 2009-08-03 09:05:30 joergr ** Added methods that check whether a given string value conforms to the VR and ** VM definitions of the DICOM standards. ** ** Revision 1.15 2008-07-17 11:19:49 onken ** Updated copyFrom() documentation. ** ** Revision 1.14 2008-07-17 10:30:23 onken ** Implemented copyFrom() method for complete DcmObject class hierarchy, which ** permits setting an instance's value from an existing object. Implemented ** assignment operator where necessary. ** ** Revision 1.13 2005-12-08 16:29:02 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.12 2004/07/01 12:28:25 meichel ** Introduced virtual clone method for DcmObject and derived classes. ** ** Revision 1.11 2002/12/06 12:49:17 joergr ** Enhanced "print()" function by re-working the implementation and replacing ** the boolean "showFullData" parameter by a more general integer flag. ** Added doc++ documentation. ** Made source code formatting more consistent with other modules/files. ** ** Revision 1.10 2001/09/25 17:19:32 meichel ** Adapted dcmdata to class OFCondition ** ** Revision 1.9 2001/06/01 15:48:51 meichel ** Updated copyright header ** ** Revision 1.8 2000/03/08 16:26:24 meichel ** Updated copyright header. ** ** Revision 1.7 1999/03/31 09:25:03 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.6 1998/11/12 16:47:51 meichel ** Implemented operator= for all classes derived from DcmObject. ** ** Revision 1.5 1997/09/11 15:13:15 hewett ** Modified getOFString method arguments by removing a default value ** for the pos argument. By requiring the pos argument to be provided ** ensures that callers realise getOFString only gets one component of ** a multi-valued string. ** ** Revision 1.4 1997/08/29 08:32:43 andreas ** - Added methods getOFString and getOFStringArray for all ** string VRs. These methods are able to normalise the value, i. e. ** to remove leading and trailing spaces. This will be done only if ** it is described in the standard that these spaces are not relevant. ** These methods do not test the strings for conformance, this means ** especially that they do not delete spaces where they are not allowed! ** getOFStringArray returns the string with all its parts separated by \ ** and getOFString returns only one value of the string. ** CAUTION: Currently getString returns a string with trailing ** spaces removed (if dcmEnableAutomaticInputDataCorrection == OFTrue) and ** truncates the original string (since it is not copied!). If you rely on this ** behaviour please change your application now. ** Future changes will ensure that getString returns the original ** string from the DICOM object (NULL terminated) inclusive padding. ** Currently, if you call getOF... before calling getString without ** normalisation, you can get the original string read from the DICOM object. ** ** Revision 1.3 1996/01/05 13:23:07 andreas ** - changed to support new streaming facilities ** - more cleanups ** - merged read / write methods for block and file transfer ** */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/dcrleenc.h0000644000310500011400000003413411455601176021521 0ustar joergrdicom3/* * * Copyright (C) 2002-2010, 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: dcmdata * * Author: Marco Eichelberg * * Purpose: RLE compressor * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:15:42 $ * CVS/RCS Revision: $Revision: 1.13 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DCRLEENC_H #define DCRLEENC_H #include "dcmtk/config/osconfig.h" #include "dcmtk/ofstd/oflist.h" /* for class OFList<> */ #define INCLUDE_CSTRING #include "dcmtk/ofstd/ofstdinc.h" #define DcmRLEEncoder_BLOCKSIZE 16384 /** abstract class that defines an interface through which * encoder classes (such as DcmRLEEncoder) may export their * encoded data */ class DcmEncoderOutputStream { public: /** write the given buffer into the output stream * @param buf pointer to buffer * @param bufsize number of bytes in buffer */ virtual void write(const unsigned char *buf, size_t bufsize) =0; /** Virtual Desctructor */ virtual ~DcmEncoderOutputStream() {} }; /** this class implements an RLE compressor conforming to the DICOM standard. * The class is loosely based on an implementation by Phil Norman. */ class DcmRLEEncoder { public: /** default constructor * @param doPad if true, RLE codec will pad output data to even number of bytes */ DcmRLEEncoder(int doPad) : fail_(0) , pad_(doPad) , currentBlock_(new unsigned char[DcmRLEEncoder_BLOCKSIZE]) , offset_(0) , blockList_() , RLE_buff_(new unsigned char[132]) , RLE_prev_(-1) , RLE_pcount_(0) , RLE_bindex_(1) { if ((! RLE_buff_)||(! currentBlock_)) fail_ = 1; else RLE_buff_[0] = 0; } /// destructor ~DcmRLEEncoder() { delete[] currentBlock_; delete[] RLE_buff_; OFListIterator(unsigned char *) first = blockList_.begin(); OFListIterator(unsigned char *) last = blockList_.end(); while (first != last) { delete[] *first; first = blockList_.erase(first); } } /** this method adds one byte to the byte stream to be compressed * with the RLE compressor. * @param ch byte to be added */ inline void add(unsigned char ch) { if (! fail_) // if fail_ is true, just ignore input { // if the current byte equals the last byte read // (which is initialized with the "impossible" value -1), // just increase the repeat counter if (OFstatic_cast(int, ch) == RLE_prev_) RLE_pcount_++; else { // byte is different from last byte read. // flush replicate run if necessary switch (RLE_pcount_) { case 0: // happens only after construction or flush() break; case 2: // two bytes in repeat buffer. Convert to literal run RLE_buff_[RLE_bindex_++] = OFstatic_cast(unsigned char, RLE_prev_); // no break. Fall-through into next case statement is intended. case 1: // one (or two) bytes in repeat buffer. Convert to literal run RLE_buff_[RLE_bindex_++] = OFstatic_cast(unsigned char, RLE_prev_); break; default: // more than two bytes in repeat buffer. Convert to replicate run if (RLE_bindex_ > 1) { // there is a literal run in the buffer that must be flushed // before the replicate run. Flush literal run now. RLE_buff_[0] = OFstatic_cast(unsigned char, RLE_bindex_-2); move(RLE_bindex_); } // this is the byte value for the repeat run RLE_buff_[1] = OFstatic_cast(unsigned char, RLE_prev_); // write as many repeat runs as necessary for (; RLE_pcount_>0; RLE_pcount_-=128) { // different PackBit schemes exist. The original from which // this code is derived used 0x80 | (RLE_pcount_ - 1) // to represent replicate runs. // DICOM instead uses 257 - RLE_pcount_ if (RLE_pcount_ > 128) RLE_buff_[0] = 0x81; else RLE_buff_[0] = OFstatic_cast(unsigned char, 257 - RLE_pcount_); move(2); } // now the buffer is guaranteed to be empty RLE_buff_[0] = 0; RLE_bindex_ = 1; break; } // if we have 128 or more bytes in the literal run, flush buffer if (RLE_bindex_ > 129) { RLE_buff_[0] = 127; move(129); RLE_bindex_ -= 128; if (RLE_bindex_ > 1) RLE_buff_[1] = RLE_buff_[129]; if (RLE_bindex_ > 2) RLE_buff_[2] = RLE_buff_[130]; } // current byte is stored in RLE_prev_, RLE_pcount_ is 1. RLE_prev_ = ch; RLE_pcount_ = 1; } } } /** this method adds a block of bytes to the byte stream to be * compressed with the RLE compressor. * @param buf buffer to be added * @param bufcount number of bytes in buffer */ inline void add(const unsigned char *buf, size_t bufcount) { if (buf) { while (bufcount--) add(*buf++); } } /** this method finalizes the compressed RLE stream, i.e. flushes all * pending literal or repeat runs. This method can be called at any * time; however, it must be called before size() or write() * can be used. Intermediate calls should be avoided since they * possibly decrease the compression ratio. */ inline void flush() { if (! fail_) // if fail_ is true, do nothing { // if there are max 1 bytes in the repeat counter, convert to literal run if (RLE_pcount_ < 2) { for (; RLE_pcount_>0; --RLE_pcount_) RLE_buff_[RLE_bindex_++] = OFstatic_cast(unsigned char, RLE_prev_); } // if we have 128 or more bytes in the literal run, flush buffer if (RLE_bindex_ > 129) { RLE_buff_[0] = 127; move(129); RLE_bindex_ -= 128; if (RLE_bindex_ > 1) RLE_buff_[1] = RLE_buff_[129]; if (RLE_bindex_ > 2) RLE_buff_[2] = RLE_buff_[130]; } // if there is still a literal run in the buffer, flush literal run if (RLE_bindex_ > 1) { RLE_buff_[0] = OFstatic_cast(unsigned char, RLE_bindex_-2); move(RLE_bindex_); } // if there is a remaining repeat run, flush this one as well if (RLE_pcount_ >= 2) { RLE_buff_[1] = OFstatic_cast(unsigned char, RLE_prev_); // write as many repeat runs as necessary for (; RLE_pcount_>0; RLE_pcount_-=128) { // different PackBit schemes exist. The original from which // this code is derived used 0x80 | (RLE_pcount_ - 1) // to represent replicate runs. // DICOM instead uses 257 - RLE_pcount_ if (RLE_pcount_ > 128) RLE_buff_[0] = 0x81; else RLE_buff_[0] = OFstatic_cast(unsigned char, 257 - RLE_pcount_); move(2); } } // now the buffer is guaranteed to be empty, re-initialize RLE_buff_[0] = 0; RLE_prev_ = -1; RLE_pcount_ = 0; RLE_bindex_ = 1; } } /** returns the size of compressed RLE stream in bytes. * The size is guaranteed to be an even number of bytes (padded * with a trailing zero byte as required by DICOM if necessary). * This method may only be called after flush() has been executed * to finalize the compressed stream. * @return size of compressed stream, in bytes */ inline size_t size() const { size_t result = blockList_.size() * DcmRLEEncoder_BLOCKSIZE + offset_; if (pad_ && (result & 1)) result++; // enforce even number of bytes return result; } /** returns true if the RLE compressor has run out of memory. In this case, * no output has been created. */ inline OFBool fail() const { if (fail_) return OFTrue; else return OFFalse; } /** copies the compressed RLE byte stream into a target array of at least * size() bytes. * @param target pointer to array of at least size() bytes, must not be NULL. */ inline void write(void *target) const { if ((!fail_) && target) { unsigned char *current = NULL; unsigned char *target8 = OFstatic_cast(unsigned char *, target); OFListConstIterator(unsigned char *) first = blockList_.begin(); OFListConstIterator(unsigned char *) last = blockList_.end(); while (first != last) { current = *first; memcpy(target8, current, DcmRLEEncoder_BLOCKSIZE); target8 += DcmRLEEncoder_BLOCKSIZE; ++first; } if (offset_ > 0) { memcpy(target8, currentBlock_, offset_); } // pad to even number of bytes if necessary if (pad_ && ((blockList_.size() * DcmRLEEncoder_BLOCKSIZE + offset_) & 1)) { target8 += offset_; *target8 = 0; } } } /** copies the compressed RLE byte stream into an * output stream * @param os output stream */ inline void write(DcmEncoderOutputStream& os) const { if (!fail_) { OFListConstIterator(unsigned char *) first = blockList_.begin(); OFListConstIterator(unsigned char *) last = blockList_.end(); while (first != last) { os.write(*first, DcmRLEEncoder_BLOCKSIZE); ++first; } if (offset_ > 0) { os.write(currentBlock_, offset_); } // pad to even number of bytes if necessary if (pad_ && ((blockList_.size() * DcmRLEEncoder_BLOCKSIZE + offset_) & 1)) { unsigned char c = 0; os.write(&c, 1); } } } private: /// private undefined copy constructor DcmRLEEncoder(const DcmRLEEncoder&); /// private undefined copy assignment operator DcmRLEEncoder& operator=(const DcmRLEEncoder&); /** this method moves the given number of bytes from buff_ * to currentBlock_ and "flushes" currentBlock_ to * blockList_ if necessary. * @param numberOfBytes number of bytes to copy */ inline void move(size_t numberOfBytes) { size_t i=0; while (i < numberOfBytes) { if (offset_ == DcmRLEEncoder_BLOCKSIZE) { blockList_.push_back(currentBlock_); currentBlock_ = new unsigned char[DcmRLEEncoder_BLOCKSIZE]; offset_ = 0; if (! currentBlock_) // out of memory { fail_ = 1; break; // exit while loop } } currentBlock_[offset_++] = RLE_buff_[i++]; } } /* member variables */ /** this flag indicates a failure of the RLE codec. Once a failure is * flagged, the codec will consume all input and not produce any more * output. A failure status can only be caused by an out-of-memory * condition. */ int fail_; /** this flag indicates whether the RLE codec must pad encoded * data to an even number of bytes (as required by DICOM). * True if padding is required, false otherwise */ int pad_; /** this member points to a block of size DcmRLEEncoder_BLOCKSIZE * (unless fail_ is true). This is the current block of data to * which the RLE stream is written */ unsigned char *currentBlock_; /** contains the number of bytes already written the the memory * block pointed to by currentBlock_. Value is always less than * DcmRLEEncoder_BLOCKSIZE. */ size_t offset_; /** this member contains a list of memory blocks of size DcmRLEEncoder_BLOCKSIZE * which already have been filled with encoded RLE data. * The current block (pointed to by currentBlock_) is not contained in this list. */ OFList blockList_; /** this member points to a buffer of 132 bytes that is used by the RLE * encoding algorithm. */ unsigned char *RLE_buff_; /** value of the last byte fed to the RLE compressor. This byte is not yet * stored in the RLE_buff_ buffer. * Type is int because this allows an "impossible" -1 as default value */ int RLE_prev_; /** repeat counter, for RLE compressor * may temporarily become negative, guaranteed to be >= 0 between method calls. */ int RLE_pcount_; /** index of next unused byte in RLE_buff_. */ unsigned int RLE_bindex_; }; #endif /* * CVS/RCS Log * $Log: dcrleenc.h,v $ * Revision 1.13 2010-10-14 13:15:42 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.12 2005/12/16 09:04:47 onken * - Added virtual (dummy) destructor to avoid compiler warnings * * Revision 1.11 2005/12/08 16:28:38 meichel * Changed include path schema for all DCMTK header files * * Revision 1.10 2004/01/16 14:06:20 joergr * Removed acknowledgements with e-mail addresses from CVS log. * * Revision 1.9 2003/08/14 09:00:56 meichel * Adapted type casts to new-style typecast operators defined in ofcast.h * * Revision 1.8 2003/06/12 18:21:24 joergr * Modified code to use const_iterators where appropriate (required for STL). * * Revision 1.7 2003/06/12 13:32:59 joergr * Fixed inconsistent API documentation reported by Doxygen. * * Revision 1.6 2003/03/21 13:06:46 meichel * Minor code purifications for warnings reported by MSVC in Level 4 * * Revision 1.5 2002/11/27 12:07:22 meichel * Adapted module dcmdata to use of new header file ofstdinc.h * * Revision 1.4 2002/07/18 12:16:52 joergr * Replaced return statement by break in a while loop of an inline function (not * supported by Sun CC 2.0.1). * * Revision 1.3 2002/07/08 07:02:50 meichel * RLE codec now includes , needed for memcpy on Win32 * * Revision 1.2 2002/06/27 15:15:42 meichel * Modified RLE encoder to make it usable for other purposes than * DICOM encoding as well (e.g. PostScript, TIFF) * * Revision 1.1 2002/06/06 14:52:37 meichel * Initial release of the new RLE codec classes * and the dcmcrle/dcmdrle tools in module dcmdata * * */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/dcostrmb.h0000644000310500011400000001335611455601175021561 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Marco Eichelberg * * Purpose: DcmOutputBufferStream and related classes, * implements output to blocks of memory as needed in the dcmnet module. * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:15:41 $ * CVS/RCS Revision: $Revision: 1.5 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DCOSTRMB_H #define DCOSTRMB_H #include "dcmtk/config/osconfig.h" #include "dcmtk/dcmdata/dcostrma.h" /** consumer class that stores data in a buffer provided by the caller. * Used for DICOM network communication. */ class DcmBufferConsumer: public DcmConsumer { public: /** constructor * @param buf buffer in which data is stored. Must be allocated * by caller and remain valid during the lifetime of this object. * @param bufLen buffer length, must be even number > 0. */ DcmBufferConsumer(void *buf, offile_off_t bufLen); /// destructor virtual ~DcmBufferConsumer(); /** returns the status of the consumer. Unless the status is good, * the consumer will not permit any operation. * @return status, true if good */ virtual OFBool good() const; /** returns the status of the consumer as an OFCondition object. * Unless the status is good, the consumer will not permit any operation. * @return status, EC_Normal if good */ virtual OFCondition status() const; /** returns true if the consumer is flushed, i.e. has no more data * pending in it's internal state that needs to be flushed before * the stream is closed. * @return true if consumer is flushed, false otherwise */ virtual OFBool isFlushed() const; /** returns the minimum number of bytes that can be written with the * next call to write(). The DcmObject write methods rely on avail * to return a value > 0 if there is no I/O suspension since certain * data such as tag and length are only written "en bloc", i.e. all * or nothing. * @return minimum of space available in consumer */ virtual offile_off_t avail() const; /** processes as many bytes as possible from the given input block. * @param buf pointer to memory block, must not be NULL * @param buflen length of memory block * @return number of bytes actually processed. */ virtual offile_off_t write(const void *buf, offile_off_t buflen); /** instructs the consumer to flush its internal content until * either the consumer becomes "flushed" or I/O suspension occurs. * After a call to flush(), a call to write() will produce undefined * behaviour. */ virtual void flush(); /** retrieves and flushes the underlying buffer. * After return of this method, the buffer is considered to have * been flushed (copied, stored) by the caller and is reused * by the next write operation. * @param buffer pointer to user provided buffer returned in this parameter * @param length number of bytes in buffer returned in this parameter */ virtual void flushBuffer(void *& buffer, offile_off_t& length); private: /// private unimplemented copy constructor DcmBufferConsumer(const DcmBufferConsumer&); /// private unimplemented copy assignment operator DcmBufferConsumer& operator=(const DcmBufferConsumer&); /// the buffer we're actually writing to unsigned char *buffer_; /// size of the buffer, in bytes offile_off_t bufSize_; /// number of bytes filled in buffer offile_off_t filled_; /// status OFCondition status_; }; /** output stream that writes into a buffer of fixed length * which must be provided by the caller. */ class DcmOutputBufferStream: public DcmOutputStream { public: /** constructor * @param buf buffer in which data is stored. Must be allocated * by caller and remain valid during the lifetime of this object. * @param bufLen buffer length, must be even number > 0. */ DcmOutputBufferStream(void *buf, offile_off_t bufLen); /// destructor virtual ~DcmOutputBufferStream(); /** retrieves and flushes the underlying buffer. * After return of this method, the buffer is considered to have * been flushed (copied, stored) by the caller and is reused * by the next write operation. * @param buffer pointer to user provided buffer returned in this parameter * @param length number of bytes in buffer returned in this parameter */ virtual void flushBuffer(void *& buffer, offile_off_t& length); private: /// private unimplemented copy constructor DcmOutputBufferStream(const DcmOutputBufferStream&); /// private unimplemented copy assignment operator DcmOutputBufferStream& operator=(const DcmOutputBufferStream&); /// the final consumer of the filter chain DcmBufferConsumer consumer_; }; #endif /* * CVS/RCS Log: * $Log: dcostrmb.h,v $ * Revision 1.5 2010-10-14 13:15:41 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.4 2009-11-04 09:58:07 uli * Switched to logging mechanism provided by the "new" oflog module * * Revision 1.3 2007-02-19 16:06:09 meichel * Class DcmOutputStream and related classes are now safe for use with * large files (2 GBytes or more) if supported by compiler and operating system. * * Revision 1.2 2005/12/08 16:28:25 meichel * Changed include path schema for all DCMTK header files * * Revision 1.1 2002/08/27 16:55:36 meichel * Initial release of new DICOM I/O stream classes that add support for stream * compression (deflated little endian explicit VR transfer syntax) * * */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/dcostrmz.h0000644000310500011400000001454411455601175021611 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Marco Eichelberg * * Purpose: zlib compression filter for output streams * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:15:41 $ * CVS/RCS Revision: $Revision: 1.5 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DCOSTRMZ_H #define DCOSTRMZ_H #include "dcmtk/config/osconfig.h" #ifdef WITH_ZLIB #include "dcmtk/dcmdata/dcostrma.h" /* for DcmOutputFilter */ BEGIN_EXTERN_C #include END_EXTERN_C /** global flag defining the compression level for zlib (deflate) compression. * Legal values are 0..9. Default is Z_DEFAULT_COMPRESSION which is defined * to be 6 for the current zlib implementation. */ extern OFGlobal dcmZlibCompressionLevel; /** zlib compression filter for output streams */ class DcmZLibOutputFilter: public DcmOutputFilter { public: /// default constructor DcmZLibOutputFilter(); /// destructor virtual ~DcmZLibOutputFilter(); /** returns the status of the consumer. Unless the status is good, * the consumer will not permit any operation. * @return status, true if good */ virtual OFBool good() const; /** returns the status of the consumer as an OFCondition object. * Unless the status is good, the consumer will not permit any operation. * @return status, EC_Normal if good */ virtual OFCondition status() const; /** returns true if the consumer is flushed, i.e. has no more data * pending in it's internal state that needs to be flushed before * the stream is closed. * @return true if consumer is flushed, false otherwise */ virtual OFBool isFlushed() const; /** returns the minimum number of bytes that can be written with the * next call to write(). The DcmObject write methods rely on avail * to return a value > 0 if there is no I/O suspension since certain * data such as tag and length are only written "en bloc", i.e. all * or nothing. * @return minimum of space available in consumer */ virtual offile_off_t avail() const; /** processes as many bytes as possible from the given input block. * @param buf pointer to memory block, must not be NULL * @param buflen length of memory block * @return number of bytes actually processed. */ virtual offile_off_t write(const void *buf, offile_off_t buflen); /** instructs the consumer to flush its internal content until * either the consumer becomes "flushed" or I/O suspension occurs. * After a call to flush(), a call to write() will produce undefined * behaviour. */ virtual void flush(); /** determines the consumer to which the filter is supposed * to write it's output. Once a consumer for the output filter has * been defined, it cannot be changed anymore during the lifetime * of the object. * @param consumer reference to consumer, must not be circular chain */ virtual void append(DcmConsumer& consumer); private: /// private unimplemented copy constructor DcmZLibOutputFilter(const DcmZLibOutputFilter&); /// private unimplemented copy assignment operator DcmZLibOutputFilter& operator=(const DcmZLibOutputFilter&); /** writes the content of the output ring buffer * to the next filter stage until the output ring buffer * becomes empty or the next filter stage becomes full */ void flushOutputBuffer(); /** feed data from the given block of data to the compression * codec until complete or the output ring buffer becomes full. * Does not flush the output ring buffer. * @param buf pointer to input data * @param buflen number of bytes in buf * @param finalize true if the current block of data constitutes * the end of the input stream, i.e. the compression codec * should be forced to flush its internal state. * @return number of bytes processed */ offile_off_t compress(const void *buf, offile_off_t buflen, OFBool finalize); /** copies as much of the given block of data as possible * in the input ring buffer * @param buf pointer to input data * @param buflen number of bytes in buf * @return number of bytes copied to input ring buffer */ offile_off_t fillInputBuffer(const void *buf, offile_off_t buflen); /** feed data from the input ring buffer to the compression * codec until complete or the output ring buffer becomes full. * Does not flush the output ring buffer. * @param finalize true if the content of the input ring buffer * constitutes the end of the input stream, i.e. the compression codec * should be forced to flush its internal state. */ void compressInputBuffer(OFBool finalize); /// pointer to consumer to which compressed output is written DcmConsumer *current_; /// pointer to struct z_stream object containing the zlib status z_streamp zstream_; /// status OFCondition status_; /// true if the zlib object has reported Z_STREAM_END OFBool flushed_; /// input ring buffer unsigned char *inputBuf_; /// offset of first byte in input ring buffer offile_off_t inputBufStart_; /// number of bytes in input ring buffer offile_off_t inputBufCount_; /// output ring buffer unsigned char *outputBuf_; /// offset of first byte in output ring buffer offile_off_t outputBufStart_; /// number of bytes in output ring buffer offile_off_t outputBufCount_; }; #endif #endif /* * CVS/RCS Log: * $Log: dcostrmz.h,v $ * Revision 1.5 2010-10-14 13:15:41 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.4 2008-06-23 12:09:13 joergr * Fixed inconsistencies in Doxygen API documentation. * * Revision 1.3 2007/02/19 16:06:09 meichel * Class DcmOutputStream and related classes are now safe for use with * large files (2 GBytes or more) if supported by compiler and operating system. * * Revision 1.2 2005/12/08 16:28:27 meichel * Changed include path schema for all DCMTK header files * * Revision 1.1 2002/08/27 16:55:37 meichel * Initial release of new DICOM I/O stream classes that add support for stream * compression (deflated little endian explicit VR transfer syntax) * * */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/dcrlerp.h0000644000310500011400000000454311455601176021376 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Marco Eichelberg * * Purpose: representation parameter for RLE * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:15:42 $ * CVS/RCS Revision: $Revision: 1.4 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DCRLERP_H #define DCRLERP_H #include "dcmtk/config/osconfig.h" #include "dcmtk/dcmdata/dcpixel.h" /* for class DcmRepresentationParameter */ /** representation parameter for RLE. * This is actually a dummy class since there are no compression * options in the RLE algorithm. */ class DcmRLERepresentationParameter: public DcmRepresentationParameter { public: /// constructor DcmRLERepresentationParameter(); /// copy constructor DcmRLERepresentationParameter(const DcmRLERepresentationParameter& arg); /// destructor virtual ~DcmRLERepresentationParameter(); /** this methods creates a copy of type DcmRepresentationParameter * * it must be overweritten in every subclass. * @return copy of this object */ virtual DcmRepresentationParameter *clone() const; /** returns the class name as string. * can be used in operator== as poor man's RTTI replacement. */ virtual const char *className() const; /** compares an object to another DcmRepresentationParameter. * Implementation must make sure that classes are comparable. * @param arg representation parameter to compare with * @return true if equal, false otherwise. */ virtual OFBool operator==(const DcmRepresentationParameter &arg) const; }; #endif /* * CVS/RCS Log * $Log: dcrlerp.h,v $ * Revision 1.4 2010-10-14 13:15:42 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.3 2009-11-04 09:58:07 uli * Switched to logging mechanism provided by the "new" oflog module * * Revision 1.2 2005-12-08 16:28:40 meichel * Changed include path schema for all DCMTK header files * * Revision 1.1 2002/06/06 14:52:38 meichel * Initial release of the new RLE codec classes * and the dcmcrle/dcmdrle tools in module dcmdata * * */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/dcdeftag.h0000644000310500011400000076122011464745075021515 0ustar joergrdicom3/* ** DO NOT EDIT THIS FILE !!! ** It was generated automatically by: ** ** User: joergr ** Host: caesar ** Date: 2010-11-05 10:08:45 ** Prog: /home/joergr/source/dcmtk/dcmdata/libsrc/mkdeftag ** ** From: ../data/dicom.dic ** ../data/private.dic ** */ #ifndef DCDEFTAG_H #define DCDEFTAG_H #include "dcmtk/dcmdata/dctagkey.h" #define DCM_DICT_DEFTAG_BUILD_DATE "2010-11-05 10:08:45" /* ** Fixed Tags in ascending (gggg,eeee) order. ** Number of entries: 3250 ** Tags with a repeating component (repeating tags) are listed later. */ #define DCM_CommandGroupLength DcmTagKey(0x0000, 0x0000) #define DCM_ACR_NEMA_CommandGroupLengthToEnd DcmTagKey(0x0000, 0x0001) #define DCM_AffectedSOPClassUID DcmTagKey(0x0000, 0x0002) #define DCM_RequestedSOPClassUID DcmTagKey(0x0000, 0x0003) #define DCM_ACR_NEMA_CommandRecognitionCode DcmTagKey(0x0000, 0x0010) #define DCM_CommandField DcmTagKey(0x0000, 0x0100) #define DCM_MessageID DcmTagKey(0x0000, 0x0110) #define DCM_MessageIDBeingRespondedTo DcmTagKey(0x0000, 0x0120) #define DCM_ACR_NEMA_Initiator DcmTagKey(0x0000, 0x0200) #define DCM_ACR_NEMA_Receiver DcmTagKey(0x0000, 0x0300) #define DCM_ACR_NEMA_FindLocation DcmTagKey(0x0000, 0x0400) #define DCM_MoveDestination DcmTagKey(0x0000, 0x0600) #define DCM_Priority DcmTagKey(0x0000, 0x0700) #define DCM_DataSetType DcmTagKey(0x0000, 0x0800) #define DCM_ACR_NEMA_NumberOfMatches DcmTagKey(0x0000, 0x0850) #define DCM_ACR_NEMA_ResponseSequenceNumber DcmTagKey(0x0000, 0x0860) #define DCM_Status DcmTagKey(0x0000, 0x0900) #define DCM_OffendingElement DcmTagKey(0x0000, 0x0901) #define DCM_ErrorComment DcmTagKey(0x0000, 0x0902) #define DCM_ErrorID DcmTagKey(0x0000, 0x0903) #define DCM_AffectedSOPInstanceUID DcmTagKey(0x0000, 0x1000) #define DCM_RequestedSOPInstanceUID DcmTagKey(0x0000, 0x1001) #define DCM_EventTypeID DcmTagKey(0x0000, 0x1002) #define DCM_AttributeIdentifierList DcmTagKey(0x0000, 0x1005) #define DCM_ActionTypeID DcmTagKey(0x0000, 0x1008) #define DCM_NumberOfRemainingSubOperations DcmTagKey(0x0000, 0x1020) #define DCM_NumberOfCompletedSubOperations DcmTagKey(0x0000, 0x1021) #define DCM_NumberOfFailedSubOperations DcmTagKey(0x0000, 0x1022) #define DCM_NumberOfWarningSubOperations DcmTagKey(0x0000, 0x1023) #define DCM_MoveOriginatorApplicationEntityTitle DcmTagKey(0x0000, 0x1030) #define DCM_MoveOriginatorMessageID DcmTagKey(0x0000, 0x1031) #define DCM_ACR_NEMA_DialogReceiver DcmTagKey(0x0000, 0x4000) #define DCM_ACR_NEMA_TerminalType DcmTagKey(0x0000, 0x4010) #define DCM_ACR_NEMA_MessageSetID DcmTagKey(0x0000, 0x5010) #define DCM_ACR_NEMA_EndMessageSet DcmTagKey(0x0000, 0x5020) #define DCM_ACR_NEMA_DisplayFormat DcmTagKey(0x0000, 0x5110) #define DCM_ACR_NEMA_PagePositionID DcmTagKey(0x0000, 0x5120) #define DCM_ACR_NEMA_TextFormatID DcmTagKey(0x0000, 0x5130) #define DCM_ACR_NEMA_NormalReverse DcmTagKey(0x0000, 0x5140) #define DCM_ACR_NEMA_AddGrayScale DcmTagKey(0x0000, 0x5150) #define DCM_ACR_NEMA_Borders DcmTagKey(0x0000, 0x5160) #define DCM_ACR_NEMA_Copies DcmTagKey(0x0000, 0x5170) #define DCM_ACR_NEMA_MagnificationType DcmTagKey(0x0000, 0x5180) #define DCM_ACR_NEMA_Erase DcmTagKey(0x0000, 0x5190) #define DCM_ACR_NEMA_Print DcmTagKey(0x0000, 0x51a0) #define DCM_ACR_NEMA_Overlays DcmTagKey(0x0000, 0x51b0) #define DCM_FileMetaInformationGroupLength DcmTagKey(0x0002, 0x0000) #define DCM_FileMetaInformationVersion DcmTagKey(0x0002, 0x0001) #define DCM_MediaStorageSOPClassUID DcmTagKey(0x0002, 0x0002) #define DCM_MediaStorageSOPInstanceUID DcmTagKey(0x0002, 0x0003) #define DCM_TransferSyntaxUID DcmTagKey(0x0002, 0x0010) #define DCM_ImplementationClassUID DcmTagKey(0x0002, 0x0012) #define DCM_ImplementationVersionName DcmTagKey(0x0002, 0x0013) #define DCM_SourceApplicationEntityTitle DcmTagKey(0x0002, 0x0016) #define DCM_PrivateInformationCreatorUID DcmTagKey(0x0002, 0x0100) #define DCM_PrivateInformation DcmTagKey(0x0002, 0x0102) #define DCM_FileSetID DcmTagKey(0x0004, 0x1130) #define DCM_FileSetDescriptorFileID DcmTagKey(0x0004, 0x1141) #define DCM_SpecificCharacterSetOfFileSetDescriptorFile DcmTagKey(0x0004, 0x1142) #define DCM_OffsetOfTheFirstDirectoryRecordOfTheRootDirectoryEntity DcmTagKey(0x0004, 0x1200) #define DCM_OffsetOfTheLastDirectoryRecordOfTheRootDirectoryEntity DcmTagKey(0x0004, 0x1202) #define DCM_FileSetConsistencyFlag DcmTagKey(0x0004, 0x1212) #define DCM_DirectoryRecordSequence DcmTagKey(0x0004, 0x1220) #define DCM_OffsetOfTheNextDirectoryRecord DcmTagKey(0x0004, 0x1400) #define DCM_RecordInUseFlag DcmTagKey(0x0004, 0x1410) #define DCM_OffsetOfReferencedLowerLevelDirectoryEntity DcmTagKey(0x0004, 0x1420) #define DCM_DirectoryRecordType DcmTagKey(0x0004, 0x1430) #define DCM_PrivateRecordUID DcmTagKey(0x0004, 0x1432) #define DCM_ReferencedFileID DcmTagKey(0x0004, 0x1500) #define DCM_RETIRED_MRDRDirectoryRecordOffset DcmTagKey(0x0004, 0x1504) #define DCM_ReferencedSOPClassUIDInFile DcmTagKey(0x0004, 0x1510) #define DCM_ReferencedSOPInstanceUIDInFile DcmTagKey(0x0004, 0x1511) #define DCM_ReferencedTransferSyntaxUIDInFile DcmTagKey(0x0004, 0x1512) #define DCM_ReferencedRelatedGeneralSOPClassUIDInFile DcmTagKey(0x0004, 0x151a) #define DCM_RETIRED_NumberOfReferences DcmTagKey(0x0004, 0x1600) #define DCM_ACR_NEMA_IdentifyingGroupLengthToEnd DcmTagKey(0x0008, 0x0001) #define DCM_SpecificCharacterSet DcmTagKey(0x0008, 0x0005) #define DCM_LanguageCodeSequence DcmTagKey(0x0008, 0x0006) #define DCM_ImageType DcmTagKey(0x0008, 0x0008) #define DCM_ACR_NEMA_RecognitionCode DcmTagKey(0x0008, 0x0010) #define DCM_InstanceCreationDate DcmTagKey(0x0008, 0x0012) #define DCM_InstanceCreationTime DcmTagKey(0x0008, 0x0013) #define DCM_InstanceCreatorUID DcmTagKey(0x0008, 0x0014) #define DCM_SOPClassUID DcmTagKey(0x0008, 0x0016) #define DCM_SOPInstanceUID DcmTagKey(0x0008, 0x0018) #define DCM_RelatedGeneralSOPClassUID DcmTagKey(0x0008, 0x001a) #define DCM_OriginalSpecializedSOPClassUID DcmTagKey(0x0008, 0x001b) #define DCM_StudyDate DcmTagKey(0x0008, 0x0020) #define DCM_SeriesDate DcmTagKey(0x0008, 0x0021) #define DCM_AcquisitionDate DcmTagKey(0x0008, 0x0022) #define DCM_ContentDate DcmTagKey(0x0008, 0x0023) #define DCM_RETIRED_OverlayDate DcmTagKey(0x0008, 0x0024) #define DCM_RETIRED_CurveDate DcmTagKey(0x0008, 0x0025) #define DCM_AcquisitionDateTime DcmTagKey(0x0008, 0x002a) #define DCM_StudyTime DcmTagKey(0x0008, 0x0030) #define DCM_SeriesTime DcmTagKey(0x0008, 0x0031) #define DCM_AcquisitionTime DcmTagKey(0x0008, 0x0032) #define DCM_ContentTime DcmTagKey(0x0008, 0x0033) #define DCM_RETIRED_OverlayTime DcmTagKey(0x0008, 0x0034) #define DCM_RETIRED_CurveTime DcmTagKey(0x0008, 0x0035) #define DCM_ACR_NEMA_OldDataSetType DcmTagKey(0x0008, 0x0040) #define DCM_ACR_NEMA_DataSetSubtype DcmTagKey(0x0008, 0x0041) #define DCM_RETIRED_NuclearMedicineSeriesType DcmTagKey(0x0008, 0x0042) #define DCM_AccessionNumber DcmTagKey(0x0008, 0x0050) #define DCM_IssuerOfAccessionNumberSequence DcmTagKey(0x0008, 0x0051) #define DCM_QueryRetrieveLevel DcmTagKey(0x0008, 0x0052) #define DCM_RetrieveAETitle DcmTagKey(0x0008, 0x0054) #define DCM_InstanceAvailability DcmTagKey(0x0008, 0x0056) #define DCM_FailedSOPInstanceUIDList DcmTagKey(0x0008, 0x0058) #define DCM_Modality DcmTagKey(0x0008, 0x0060) #define DCM_ModalitiesInStudy DcmTagKey(0x0008, 0x0061) #define DCM_SOPClassesInStudy DcmTagKey(0x0008, 0x0062) #define DCM_ConversionType DcmTagKey(0x0008, 0x0064) #define DCM_PresentationIntentType DcmTagKey(0x0008, 0x0068) #define DCM_Manufacturer DcmTagKey(0x0008, 0x0070) #define DCM_InstitutionName DcmTagKey(0x0008, 0x0080) #define DCM_InstitutionAddress DcmTagKey(0x0008, 0x0081) #define DCM_InstitutionCodeSequence DcmTagKey(0x0008, 0x0082) #define DCM_ReferringPhysicianName DcmTagKey(0x0008, 0x0090) #define DCM_ReferringPhysicianAddress DcmTagKey(0x0008, 0x0092) #define DCM_ReferringPhysicianTelephoneNumbers DcmTagKey(0x0008, 0x0094) #define DCM_ReferringPhysicianIdentificationSequence DcmTagKey(0x0008, 0x0096) #define DCM_CodeValue DcmTagKey(0x0008, 0x0100) #define DCM_CodingSchemeDesignator DcmTagKey(0x0008, 0x0102) #define DCM_CodingSchemeVersion DcmTagKey(0x0008, 0x0103) #define DCM_CodeMeaning DcmTagKey(0x0008, 0x0104) #define DCM_MappingResource DcmTagKey(0x0008, 0x0105) #define DCM_ContextGroupVersion DcmTagKey(0x0008, 0x0106) #define DCM_ContextGroupLocalVersion DcmTagKey(0x0008, 0x0107) #define DCM_ContextGroupExtensionFlag DcmTagKey(0x0008, 0x010b) #define DCM_CodingSchemeUID DcmTagKey(0x0008, 0x010c) #define DCM_ContextGroupExtensionCreatorUID DcmTagKey(0x0008, 0x010d) #define DCM_ContextIdentifier DcmTagKey(0x0008, 0x010f) #define DCM_CodingSchemeIdentificationSequence DcmTagKey(0x0008, 0x0110) #define DCM_CodingSchemeRegistry DcmTagKey(0x0008, 0x0112) #define DCM_CodingSchemeExternalID DcmTagKey(0x0008, 0x0114) #define DCM_CodingSchemeName DcmTagKey(0x0008, 0x0115) #define DCM_CodingSchemeResponsibleOrganization DcmTagKey(0x0008, 0x0116) #define DCM_ContextUID DcmTagKey(0x0008, 0x0117) #define DCM_TimezoneOffsetFromUTC DcmTagKey(0x0008, 0x0201) #define DCM_ACR_NEMA_NetworkID DcmTagKey(0x0008, 0x1000) #define DCM_StationName DcmTagKey(0x0008, 0x1010) #define DCM_StudyDescription DcmTagKey(0x0008, 0x1030) #define DCM_ProcedureCodeSequence DcmTagKey(0x0008, 0x1032) #define DCM_SeriesDescription DcmTagKey(0x0008, 0x103e) #define DCM_SeriesDescriptionCodeSequence DcmTagKey(0x0008, 0x103f) #define DCM_InstitutionalDepartmentName DcmTagKey(0x0008, 0x1040) #define DCM_PhysiciansOfRecord DcmTagKey(0x0008, 0x1048) #define DCM_PhysiciansOfRecordIdentificationSequence DcmTagKey(0x0008, 0x1049) #define DCM_PerformingPhysicianName DcmTagKey(0x0008, 0x1050) #define DCM_PerformingPhysicianIdentificationSequence DcmTagKey(0x0008, 0x1052) #define DCM_NameOfPhysiciansReadingStudy DcmTagKey(0x0008, 0x1060) #define DCM_PhysiciansReadingStudyIdentificationSequence DcmTagKey(0x0008, 0x1062) #define DCM_OperatorsName DcmTagKey(0x0008, 0x1070) #define DCM_OperatorIdentificationSequence DcmTagKey(0x0008, 0x1072) #define DCM_AdmittingDiagnosesDescription DcmTagKey(0x0008, 0x1080) #define DCM_AdmittingDiagnosesCodeSequence DcmTagKey(0x0008, 0x1084) #define DCM_ManufacturerModelName DcmTagKey(0x0008, 0x1090) #define DCM_RETIRED_ReferencedResultsSequence DcmTagKey(0x0008, 0x1100) #define DCM_ReferencedStudySequence DcmTagKey(0x0008, 0x1110) #define DCM_ReferencedPerformedProcedureStepSequence DcmTagKey(0x0008, 0x1111) #define DCM_ReferencedSeriesSequence DcmTagKey(0x0008, 0x1115) #define DCM_ReferencedPatientSequence DcmTagKey(0x0008, 0x1120) #define DCM_ReferencedVisitSequence DcmTagKey(0x0008, 0x1125) #define DCM_RETIRED_ReferencedOverlaySequence DcmTagKey(0x0008, 0x1130) #define DCM_ReferencedStereometricInstanceSequence DcmTagKey(0x0008, 0x1134) #define DCM_ReferencedWaveformSequence DcmTagKey(0x0008, 0x113a) #define DCM_ReferencedImageSequence DcmTagKey(0x0008, 0x1140) #define DCM_RETIRED_ReferencedCurveSequence DcmTagKey(0x0008, 0x1145) #define DCM_ReferencedInstanceSequence DcmTagKey(0x0008, 0x114a) #define DCM_ReferencedRealWorldValueMappingInstanceSequence DcmTagKey(0x0008, 0x114b) #define DCM_ReferencedSOPClassUID DcmTagKey(0x0008, 0x1150) #define DCM_ReferencedSOPInstanceUID DcmTagKey(0x0008, 0x1155) #define DCM_SOPClassesSupported DcmTagKey(0x0008, 0x115a) #define DCM_ReferencedFrameNumber DcmTagKey(0x0008, 0x1160) #define DCM_SimpleFrameList DcmTagKey(0x0008, 0x1161) #define DCM_CalculatedFrameList DcmTagKey(0x0008, 0x1162) #define DCM_TimeRange DcmTagKey(0x0008, 0x1163) #define DCM_FrameExtractionSequence DcmTagKey(0x0008, 0x1164) #define DCM_MultiFrameSourceSOPInstanceUID DcmTagKey(0x0008, 0x1167) #define DCM_TransactionUID DcmTagKey(0x0008, 0x1195) #define DCM_FailureReason DcmTagKey(0x0008, 0x1197) #define DCM_FailedSOPSequence DcmTagKey(0x0008, 0x1198) #define DCM_ReferencedSOPSequence DcmTagKey(0x0008, 0x1199) #define DCM_StudiesContainingOtherReferencedInstancesSequence DcmTagKey(0x0008, 0x1200) #define DCM_RelatedSeriesSequence DcmTagKey(0x0008, 0x1250) #define DCM_RETIRED_LossyImageCompressionRetired DcmTagKey(0x0008, 0x2110) #define DCM_DerivationDescription DcmTagKey(0x0008, 0x2111) #define DCM_SourceImageSequence DcmTagKey(0x0008, 0x2112) #define DCM_StageName DcmTagKey(0x0008, 0x2120) #define DCM_StageNumber DcmTagKey(0x0008, 0x2122) #define DCM_NumberOfStages DcmTagKey(0x0008, 0x2124) #define DCM_ViewName DcmTagKey(0x0008, 0x2127) #define DCM_ViewNumber DcmTagKey(0x0008, 0x2128) #define DCM_NumberOfEventTimers DcmTagKey(0x0008, 0x2129) #define DCM_NumberOfViewsInStage DcmTagKey(0x0008, 0x212a) #define DCM_EventElapsedTimes DcmTagKey(0x0008, 0x2130) #define DCM_EventTimerNames DcmTagKey(0x0008, 0x2132) #define DCM_EventTimerSequence DcmTagKey(0x0008, 0x2133) #define DCM_EventTimeOffset DcmTagKey(0x0008, 0x2134) #define DCM_EventCodeSequence DcmTagKey(0x0008, 0x2135) #define DCM_StartTrim DcmTagKey(0x0008, 0x2142) #define DCM_StopTrim DcmTagKey(0x0008, 0x2143) #define DCM_RecommendedDisplayFrameRate DcmTagKey(0x0008, 0x2144) #define DCM_RETIRED_TransducerPosition DcmTagKey(0x0008, 0x2200) #define DCM_RETIRED_TransducerOrientation DcmTagKey(0x0008, 0x2204) #define DCM_RETIRED_AnatomicStructure DcmTagKey(0x0008, 0x2208) #define DCM_AnatomicRegionSequence DcmTagKey(0x0008, 0x2218) #define DCM_AnatomicRegionModifierSequence DcmTagKey(0x0008, 0x2220) #define DCM_PrimaryAnatomicStructureSequence DcmTagKey(0x0008, 0x2228) #define DCM_AnatomicStructureSpaceOrRegionSequence DcmTagKey(0x0008, 0x2229) #define DCM_PrimaryAnatomicStructureModifierSequence DcmTagKey(0x0008, 0x2230) #define DCM_RETIRED_TransducerPositionSequence DcmTagKey(0x0008, 0x2240) #define DCM_RETIRED_TransducerPositionModifierSequence DcmTagKey(0x0008, 0x2242) #define DCM_RETIRED_TransducerOrientationSequence DcmTagKey(0x0008, 0x2244) #define DCM_RETIRED_TransducerOrientationModifierSequence DcmTagKey(0x0008, 0x2246) #define DCM_RETIRED_AnatomicStructureSpaceOrRegionCodeSequenceTrial DcmTagKey(0x0008, 0x2251) #define DCM_RETIRED_AnatomicPortalOfEntranceCodeSequenceTrial DcmTagKey(0x0008, 0x2253) #define DCM_RETIRED_AnatomicApproachDirectionCodeSequenceTrial DcmTagKey(0x0008, 0x2255) #define DCM_RETIRED_AnatomicPerspectiveDescriptionTrial DcmTagKey(0x0008, 0x2256) #define DCM_RETIRED_AnatomicPerspectiveCodeSequenceTrial DcmTagKey(0x0008, 0x2257) #define DCM_RETIRED_AnatomicLocationOfExaminingInstrumentDescriptionTrial DcmTagKey(0x0008, 0x2258) #define DCM_RETIRED_AnatomicLocationOfExaminingInstrumentCodeSequenceTrial DcmTagKey(0x0008, 0x2259) #define DCM_RETIRED_AnatomicStructureSpaceOrRegionModifierCodeSequenceTrial DcmTagKey(0x0008, 0x225a) #define DCM_RETIRED_OnAxisBackgroundAnatomicStructureCodeSequenceTrial DcmTagKey(0x0008, 0x225c) #define DCM_AlternateRepresentationSequence DcmTagKey(0x0008, 0x3001) #define DCM_IrradiationEventUID DcmTagKey(0x0008, 0x3010) #define DCM_ACR_NEMA_IdentifyingComments DcmTagKey(0x0008, 0x4000) #define DCM_FrameType DcmTagKey(0x0008, 0x9007) #define DCM_ReferencedImageEvidenceSequence DcmTagKey(0x0008, 0x9092) #define DCM_ReferencedRawDataSequence DcmTagKey(0x0008, 0x9121) #define DCM_CreatorVersionUID DcmTagKey(0x0008, 0x9123) #define DCM_DerivationImageSequence DcmTagKey(0x0008, 0x9124) #define DCM_SourceImageEvidenceSequence DcmTagKey(0x0008, 0x9154) #define DCM_PixelPresentation DcmTagKey(0x0008, 0x9205) #define DCM_VolumetricProperties DcmTagKey(0x0008, 0x9206) #define DCM_VolumeBasedCalculationTechnique DcmTagKey(0x0008, 0x9207) #define DCM_ComplexImageComponent DcmTagKey(0x0008, 0x9208) #define DCM_AcquisitionContrast DcmTagKey(0x0008, 0x9209) #define DCM_DerivationCodeSequence DcmTagKey(0x0008, 0x9215) #define DCM_ReferencedPresentationStateSequence DcmTagKey(0x0008, 0x9237) #define DCM_ReferencedOtherPlaneSequence DcmTagKey(0x0008, 0x9410) #define DCM_FrameDisplaySequence DcmTagKey(0x0008, 0x9458) #define DCM_RecommendedDisplayFrameRateInFloat DcmTagKey(0x0008, 0x9459) #define DCM_SkipFrameRangeFlag DcmTagKey(0x0008, 0x9460) #define DCM_PatientName DcmTagKey(0x0010, 0x0010) #define DCM_PatientID DcmTagKey(0x0010, 0x0020) #define DCM_IssuerOfPatientID DcmTagKey(0x0010, 0x0021) #define DCM_TypeOfPatientID DcmTagKey(0x0010, 0x0022) #define DCM_IssuerOfPatientIDQualifiersSequence DcmTagKey(0x0010, 0x0024) #define DCM_PatientBirthDate DcmTagKey(0x0010, 0x0030) #define DCM_PatientBirthTime DcmTagKey(0x0010, 0x0032) #define DCM_PatientSex DcmTagKey(0x0010, 0x0040) #define DCM_PatientInsurancePlanCodeSequence DcmTagKey(0x0010, 0x0050) #define DCM_PatientPrimaryLanguageCodeSequence DcmTagKey(0x0010, 0x0101) #define DCM_PatientPrimaryLanguageModifierCodeSequence DcmTagKey(0x0010, 0x0102) #define DCM_OtherPatientIDs DcmTagKey(0x0010, 0x1000) #define DCM_OtherPatientNames DcmTagKey(0x0010, 0x1001) #define DCM_OtherPatientIDsSequence DcmTagKey(0x0010, 0x1002) #define DCM_PatientBirthName DcmTagKey(0x0010, 0x1005) #define DCM_PatientAge DcmTagKey(0x0010, 0x1010) #define DCM_PatientSize DcmTagKey(0x0010, 0x1020) #define DCM_PatientSizeCodeSequence DcmTagKey(0x0010, 0x1021) #define DCM_PatientWeight DcmTagKey(0x0010, 0x1030) #define DCM_PatientAddress DcmTagKey(0x0010, 0x1040) #define DCM_ACR_NEMA_InsurancePlanIdentification DcmTagKey(0x0010, 0x1050) #define DCM_PatientMotherBirthName DcmTagKey(0x0010, 0x1060) #define DCM_MilitaryRank DcmTagKey(0x0010, 0x1080) #define DCM_BranchOfService DcmTagKey(0x0010, 0x1081) #define DCM_MedicalRecordLocator DcmTagKey(0x0010, 0x1090) #define DCM_MedicalAlerts DcmTagKey(0x0010, 0x2000) #define DCM_Allergies DcmTagKey(0x0010, 0x2110) #define DCM_CountryOfResidence DcmTagKey(0x0010, 0x2150) #define DCM_RegionOfResidence DcmTagKey(0x0010, 0x2152) #define DCM_PatientTelephoneNumbers DcmTagKey(0x0010, 0x2154) #define DCM_EthnicGroup DcmTagKey(0x0010, 0x2160) #define DCM_Occupation DcmTagKey(0x0010, 0x2180) #define DCM_SmokingStatus DcmTagKey(0x0010, 0x21a0) #define DCM_AdditionalPatientHistory DcmTagKey(0x0010, 0x21b0) #define DCM_PregnancyStatus DcmTagKey(0x0010, 0x21c0) #define DCM_LastMenstrualDate DcmTagKey(0x0010, 0x21d0) #define DCM_PatientReligiousPreference DcmTagKey(0x0010, 0x21f0) #define DCM_PatientSpeciesDescription DcmTagKey(0x0010, 0x2201) #define DCM_PatientSpeciesCodeSequence DcmTagKey(0x0010, 0x2202) #define DCM_PatientSexNeutered DcmTagKey(0x0010, 0x2203) #define DCM_AnatomicalOrientationType DcmTagKey(0x0010, 0x2210) #define DCM_PatientBreedDescription DcmTagKey(0x0010, 0x2292) #define DCM_PatientBreedCodeSequence DcmTagKey(0x0010, 0x2293) #define DCM_BreedRegistrationSequence DcmTagKey(0x0010, 0x2294) #define DCM_BreedRegistrationNumber DcmTagKey(0x0010, 0x2295) #define DCM_BreedRegistryCodeSequence DcmTagKey(0x0010, 0x2296) #define DCM_ResponsiblePerson DcmTagKey(0x0010, 0x2297) #define DCM_ResponsiblePersonRole DcmTagKey(0x0010, 0x2298) #define DCM_ResponsibleOrganization DcmTagKey(0x0010, 0x2299) #define DCM_PatientComments DcmTagKey(0x0010, 0x4000) #define DCM_ExaminedBodyThickness DcmTagKey(0x0010, 0x9431) #define DCM_ClinicalTrialSponsorName DcmTagKey(0x0012, 0x0010) #define DCM_ClinicalTrialProtocolID DcmTagKey(0x0012, 0x0020) #define DCM_ClinicalTrialProtocolName DcmTagKey(0x0012, 0x0021) #define DCM_ClinicalTrialSiteID DcmTagKey(0x0012, 0x0030) #define DCM_ClinicalTrialSiteName DcmTagKey(0x0012, 0x0031) #define DCM_ClinicalTrialSubjectID DcmTagKey(0x0012, 0x0040) #define DCM_ClinicalTrialSubjectReadingID DcmTagKey(0x0012, 0x0042) #define DCM_ClinicalTrialTimePointID DcmTagKey(0x0012, 0x0050) #define DCM_ClinicalTrialTimePointDescription DcmTagKey(0x0012, 0x0051) #define DCM_ClinicalTrialCoordinatingCenterName DcmTagKey(0x0012, 0x0060) #define DCM_PatientIdentityRemoved DcmTagKey(0x0012, 0x0062) #define DCM_DeidentificationMethod DcmTagKey(0x0012, 0x0063) #define DCM_DeidentificationMethodCodeSequence DcmTagKey(0x0012, 0x0064) #define DCM_ClinicalTrialSeriesID DcmTagKey(0x0012, 0x0071) #define DCM_ClinicalTrialSeriesDescription DcmTagKey(0x0012, 0x0072) #define DCM_ClinicalTrialProtocolEthicsCommitteeName DcmTagKey(0x0012, 0x0081) #define DCM_ClinicalTrialProtocolEthicsCommitteeApprovalNumber DcmTagKey(0x0012, 0x0082) #define DCM_ConsentForClinicalTrialUseSequence DcmTagKey(0x0012, 0x0083) #define DCM_DistributionType DcmTagKey(0x0012, 0x0084) #define DCM_ConsentForDistributionFlag DcmTagKey(0x0012, 0x0085) #define DCM_ContrastBolusAgent DcmTagKey(0x0018, 0x0010) #define DCM_ContrastBolusAgentSequence DcmTagKey(0x0018, 0x0012) #define DCM_ContrastBolusAdministrationRouteSequence DcmTagKey(0x0018, 0x0014) #define DCM_BodyPartExamined DcmTagKey(0x0018, 0x0015) #define DCM_ScanningSequence DcmTagKey(0x0018, 0x0020) #define DCM_SequenceVariant DcmTagKey(0x0018, 0x0021) #define DCM_ScanOptions DcmTagKey(0x0018, 0x0022) #define DCM_MRAcquisitionType DcmTagKey(0x0018, 0x0023) #define DCM_SequenceName DcmTagKey(0x0018, 0x0024) #define DCM_AngioFlag DcmTagKey(0x0018, 0x0025) #define DCM_InterventionDrugInformationSequence DcmTagKey(0x0018, 0x0026) #define DCM_InterventionDrugStopTime DcmTagKey(0x0018, 0x0027) #define DCM_InterventionDrugDose DcmTagKey(0x0018, 0x0028) #define DCM_InterventionDrugCodeSequence DcmTagKey(0x0018, 0x0029) #define DCM_AdditionalDrugSequence DcmTagKey(0x0018, 0x002a) #define DCM_RETIRED_Radionuclide DcmTagKey(0x0018, 0x0030) #define DCM_Radiopharmaceutical DcmTagKey(0x0018, 0x0031) #define DCM_RETIRED_EnergyWindowCenterline DcmTagKey(0x0018, 0x0032) #define DCM_RETIRED_EnergyWindowTotalWidth DcmTagKey(0x0018, 0x0033) #define DCM_InterventionDrugName DcmTagKey(0x0018, 0x0034) #define DCM_InterventionDrugStartTime DcmTagKey(0x0018, 0x0035) #define DCM_InterventionSequence DcmTagKey(0x0018, 0x0036) #define DCM_RETIRED_TherapyType DcmTagKey(0x0018, 0x0037) #define DCM_InterventionStatus DcmTagKey(0x0018, 0x0038) #define DCM_RETIRED_TherapyDescription DcmTagKey(0x0018, 0x0039) #define DCM_InterventionDescription DcmTagKey(0x0018, 0x003a) #define DCM_CineRate DcmTagKey(0x0018, 0x0040) #define DCM_InitialCineRunState DcmTagKey(0x0018, 0x0042) #define DCM_SliceThickness DcmTagKey(0x0018, 0x0050) #define DCM_KVP DcmTagKey(0x0018, 0x0060) #define DCM_CountsAccumulated DcmTagKey(0x0018, 0x0070) #define DCM_AcquisitionTerminationCondition DcmTagKey(0x0018, 0x0071) #define DCM_EffectiveDuration DcmTagKey(0x0018, 0x0072) #define DCM_AcquisitionStartCondition DcmTagKey(0x0018, 0x0073) #define DCM_AcquisitionStartConditionData DcmTagKey(0x0018, 0x0074) #define DCM_AcquisitionTerminationConditionData DcmTagKey(0x0018, 0x0075) #define DCM_RepetitionTime DcmTagKey(0x0018, 0x0080) #define DCM_EchoTime DcmTagKey(0x0018, 0x0081) #define DCM_InversionTime DcmTagKey(0x0018, 0x0082) #define DCM_NumberOfAverages DcmTagKey(0x0018, 0x0083) #define DCM_ImagingFrequency DcmTagKey(0x0018, 0x0084) #define DCM_ImagedNucleus DcmTagKey(0x0018, 0x0085) #define DCM_EchoNumbers DcmTagKey(0x0018, 0x0086) #define DCM_MagneticFieldStrength DcmTagKey(0x0018, 0x0087) #define DCM_SpacingBetweenSlices DcmTagKey(0x0018, 0x0088) #define DCM_NumberOfPhaseEncodingSteps DcmTagKey(0x0018, 0x0089) #define DCM_DataCollectionDiameter DcmTagKey(0x0018, 0x0090) #define DCM_EchoTrainLength DcmTagKey(0x0018, 0x0091) #define DCM_PercentSampling DcmTagKey(0x0018, 0x0093) #define DCM_PercentPhaseFieldOfView DcmTagKey(0x0018, 0x0094) #define DCM_PixelBandwidth DcmTagKey(0x0018, 0x0095) #define DCM_DeviceSerialNumber DcmTagKey(0x0018, 0x1000) #define DCM_DeviceUID DcmTagKey(0x0018, 0x1002) #define DCM_DeviceID DcmTagKey(0x0018, 0x1003) #define DCM_PlateID DcmTagKey(0x0018, 0x1004) #define DCM_GeneratorID DcmTagKey(0x0018, 0x1005) #define DCM_GridID DcmTagKey(0x0018, 0x1006) #define DCM_CassetteID DcmTagKey(0x0018, 0x1007) #define DCM_GantryID DcmTagKey(0x0018, 0x1008) #define DCM_SecondaryCaptureDeviceID DcmTagKey(0x0018, 0x1010) #define DCM_RETIRED_HardcopyCreationDeviceID DcmTagKey(0x0018, 0x1011) #define DCM_DateOfSecondaryCapture DcmTagKey(0x0018, 0x1012) #define DCM_TimeOfSecondaryCapture DcmTagKey(0x0018, 0x1014) #define DCM_SecondaryCaptureDeviceManufacturer DcmTagKey(0x0018, 0x1016) #define DCM_RETIRED_HardcopyDeviceManufacturer DcmTagKey(0x0018, 0x1017) #define DCM_SecondaryCaptureDeviceManufacturerModelName DcmTagKey(0x0018, 0x1018) #define DCM_SecondaryCaptureDeviceSoftwareVersions DcmTagKey(0x0018, 0x1019) #define DCM_RETIRED_HardcopyDeviceSoftwareVersion DcmTagKey(0x0018, 0x101a) #define DCM_RETIRED_HardcopyDeviceManufacturerModelName DcmTagKey(0x0018, 0x101b) #define DCM_SoftwareVersions DcmTagKey(0x0018, 0x1020) #define DCM_VideoImageFormatAcquired DcmTagKey(0x0018, 0x1022) #define DCM_DigitalImageFormatAcquired DcmTagKey(0x0018, 0x1023) #define DCM_ProtocolName DcmTagKey(0x0018, 0x1030) #define DCM_ContrastBolusRoute DcmTagKey(0x0018, 0x1040) #define DCM_ContrastBolusVolume DcmTagKey(0x0018, 0x1041) #define DCM_ContrastBolusStartTime DcmTagKey(0x0018, 0x1042) #define DCM_ContrastBolusStopTime DcmTagKey(0x0018, 0x1043) #define DCM_ContrastBolusTotalDose DcmTagKey(0x0018, 0x1044) #define DCM_SyringeCounts DcmTagKey(0x0018, 0x1045) #define DCM_ContrastFlowRate DcmTagKey(0x0018, 0x1046) #define DCM_ContrastFlowDuration DcmTagKey(0x0018, 0x1047) #define DCM_ContrastBolusIngredient DcmTagKey(0x0018, 0x1048) #define DCM_ContrastBolusIngredientConcentration DcmTagKey(0x0018, 0x1049) #define DCM_SpatialResolution DcmTagKey(0x0018, 0x1050) #define DCM_TriggerTime DcmTagKey(0x0018, 0x1060) #define DCM_TriggerSourceOrType DcmTagKey(0x0018, 0x1061) #define DCM_NominalInterval DcmTagKey(0x0018, 0x1062) #define DCM_FrameTime DcmTagKey(0x0018, 0x1063) #define DCM_CardiacFramingType DcmTagKey(0x0018, 0x1064) #define DCM_FrameTimeVector DcmTagKey(0x0018, 0x1065) #define DCM_FrameDelay DcmTagKey(0x0018, 0x1066) #define DCM_ImageTriggerDelay DcmTagKey(0x0018, 0x1067) #define DCM_MultiplexGroupTimeOffset DcmTagKey(0x0018, 0x1068) #define DCM_TriggerTimeOffset DcmTagKey(0x0018, 0x1069) #define DCM_SynchronizationTrigger DcmTagKey(0x0018, 0x106a) #define DCM_SynchronizationChannel DcmTagKey(0x0018, 0x106c) #define DCM_TriggerSamplePosition DcmTagKey(0x0018, 0x106e) #define DCM_RadiopharmaceuticalRoute DcmTagKey(0x0018, 0x1070) #define DCM_RadiopharmaceuticalVolume DcmTagKey(0x0018, 0x1071) #define DCM_RadiopharmaceuticalStartTime DcmTagKey(0x0018, 0x1072) #define DCM_RadiopharmaceuticalStopTime DcmTagKey(0x0018, 0x1073) #define DCM_RadionuclideTotalDose DcmTagKey(0x0018, 0x1074) #define DCM_RadionuclideHalfLife DcmTagKey(0x0018, 0x1075) #define DCM_RadionuclidePositronFraction DcmTagKey(0x0018, 0x1076) #define DCM_RadiopharmaceuticalSpecificActivity DcmTagKey(0x0018, 0x1077) #define DCM_RadiopharmaceuticalStartDateTime DcmTagKey(0x0018, 0x1078) #define DCM_RadiopharmaceuticalStopDateTime DcmTagKey(0x0018, 0x1079) #define DCM_BeatRejectionFlag DcmTagKey(0x0018, 0x1080) #define DCM_LowRRValue DcmTagKey(0x0018, 0x1081) #define DCM_HighRRValue DcmTagKey(0x0018, 0x1082) #define DCM_IntervalsAcquired DcmTagKey(0x0018, 0x1083) #define DCM_IntervalsRejected DcmTagKey(0x0018, 0x1084) #define DCM_PVCRejection DcmTagKey(0x0018, 0x1085) #define DCM_SkipBeats DcmTagKey(0x0018, 0x1086) #define DCM_HeartRate DcmTagKey(0x0018, 0x1088) #define DCM_CardiacNumberOfImages DcmTagKey(0x0018, 0x1090) #define DCM_TriggerWindow DcmTagKey(0x0018, 0x1094) #define DCM_ReconstructionDiameter DcmTagKey(0x0018, 0x1100) #define DCM_DistanceSourceToDetector DcmTagKey(0x0018, 0x1110) #define DCM_DistanceSourceToPatient DcmTagKey(0x0018, 0x1111) #define DCM_EstimatedRadiographicMagnificationFactor DcmTagKey(0x0018, 0x1114) #define DCM_GantryDetectorTilt DcmTagKey(0x0018, 0x1120) #define DCM_GantryDetectorSlew DcmTagKey(0x0018, 0x1121) #define DCM_TableHeight DcmTagKey(0x0018, 0x1130) #define DCM_TableTraverse DcmTagKey(0x0018, 0x1131) #define DCM_TableMotion DcmTagKey(0x0018, 0x1134) #define DCM_TableVerticalIncrement DcmTagKey(0x0018, 0x1135) #define DCM_TableLateralIncrement DcmTagKey(0x0018, 0x1136) #define DCM_TableLongitudinalIncrement DcmTagKey(0x0018, 0x1137) #define DCM_TableAngle DcmTagKey(0x0018, 0x1138) #define DCM_TableType DcmTagKey(0x0018, 0x113a) #define DCM_RotationDirection DcmTagKey(0x0018, 0x1140) #define DCM_RETIRED_AngularPosition DcmTagKey(0x0018, 0x1141) #define DCM_RadialPosition DcmTagKey(0x0018, 0x1142) #define DCM_ScanArc DcmTagKey(0x0018, 0x1143) #define DCM_AngularStep DcmTagKey(0x0018, 0x1144) #define DCM_CenterOfRotationOffset DcmTagKey(0x0018, 0x1145) #define DCM_RETIRED_RotationOffset DcmTagKey(0x0018, 0x1146) #define DCM_FieldOfViewShape DcmTagKey(0x0018, 0x1147) #define DCM_FieldOfViewDimensions DcmTagKey(0x0018, 0x1149) #define DCM_ExposureTime DcmTagKey(0x0018, 0x1150) #define DCM_XRayTubeCurrent DcmTagKey(0x0018, 0x1151) #define DCM_Exposure DcmTagKey(0x0018, 0x1152) #define DCM_ExposureInuAs DcmTagKey(0x0018, 0x1153) #define DCM_AveragePulseWidth DcmTagKey(0x0018, 0x1154) #define DCM_RadiationSetting DcmTagKey(0x0018, 0x1155) #define DCM_RectificationType DcmTagKey(0x0018, 0x1156) #define DCM_RadiationMode DcmTagKey(0x0018, 0x115a) #define DCM_ImageAndFluoroscopyAreaDoseProduct DcmTagKey(0x0018, 0x115e) #define DCM_FilterType DcmTagKey(0x0018, 0x1160) #define DCM_TypeOfFilters DcmTagKey(0x0018, 0x1161) #define DCM_IntensifierSize DcmTagKey(0x0018, 0x1162) #define DCM_ImagerPixelSpacing DcmTagKey(0x0018, 0x1164) #define DCM_Grid DcmTagKey(0x0018, 0x1166) #define DCM_GeneratorPower DcmTagKey(0x0018, 0x1170) #define DCM_CollimatorGridName DcmTagKey(0x0018, 0x1180) #define DCM_CollimatorType DcmTagKey(0x0018, 0x1181) #define DCM_FocalDistance DcmTagKey(0x0018, 0x1182) #define DCM_XFocusCenter DcmTagKey(0x0018, 0x1183) #define DCM_YFocusCenter DcmTagKey(0x0018, 0x1184) #define DCM_FocalSpots DcmTagKey(0x0018, 0x1190) #define DCM_AnodeTargetMaterial DcmTagKey(0x0018, 0x1191) #define DCM_BodyPartThickness DcmTagKey(0x0018, 0x11a0) #define DCM_CompressionForce DcmTagKey(0x0018, 0x11a2) #define DCM_DateOfLastCalibration DcmTagKey(0x0018, 0x1200) #define DCM_TimeOfLastCalibration DcmTagKey(0x0018, 0x1201) #define DCM_ConvolutionKernel DcmTagKey(0x0018, 0x1210) #define DCM_ACR_NEMA_UpperLowerPixelValues DcmTagKey(0x0018, 0x1240) #define DCM_ActualFrameDuration DcmTagKey(0x0018, 0x1242) #define DCM_CountRate DcmTagKey(0x0018, 0x1243) #define DCM_PreferredPlaybackSequencing DcmTagKey(0x0018, 0x1244) #define DCM_ReceiveCoilName DcmTagKey(0x0018, 0x1250) #define DCM_TransmitCoilName DcmTagKey(0x0018, 0x1251) #define DCM_PlateType DcmTagKey(0x0018, 0x1260) #define DCM_PhosphorType DcmTagKey(0x0018, 0x1261) #define DCM_ScanVelocity DcmTagKey(0x0018, 0x1300) #define DCM_WholeBodyTechnique DcmTagKey(0x0018, 0x1301) #define DCM_ScanLength DcmTagKey(0x0018, 0x1302) #define DCM_AcquisitionMatrix DcmTagKey(0x0018, 0x1310) #define DCM_InPlanePhaseEncodingDirection DcmTagKey(0x0018, 0x1312) #define DCM_FlipAngle DcmTagKey(0x0018, 0x1314) #define DCM_VariableFlipAngleFlag DcmTagKey(0x0018, 0x1315) #define DCM_SAR DcmTagKey(0x0018, 0x1316) #define DCM_dBdt DcmTagKey(0x0018, 0x1318) #define DCM_AcquisitionDeviceProcessingDescription DcmTagKey(0x0018, 0x1400) #define DCM_AcquisitionDeviceProcessingCode DcmTagKey(0x0018, 0x1401) #define DCM_CassetteOrientation DcmTagKey(0x0018, 0x1402) #define DCM_CassetteSize DcmTagKey(0x0018, 0x1403) #define DCM_ExposuresOnPlate DcmTagKey(0x0018, 0x1404) #define DCM_RelativeXRayExposure DcmTagKey(0x0018, 0x1405) #define DCM_ExposureIndex DcmTagKey(0x0018, 0x1411) #define DCM_TargetExposureIndex DcmTagKey(0x0018, 0x1412) #define DCM_DeviationIndex DcmTagKey(0x0018, 0x1413) #define DCM_ColumnAngulation DcmTagKey(0x0018, 0x1450) #define DCM_TomoLayerHeight DcmTagKey(0x0018, 0x1460) #define DCM_TomoAngle DcmTagKey(0x0018, 0x1470) #define DCM_TomoTime DcmTagKey(0x0018, 0x1480) #define DCM_TomoType DcmTagKey(0x0018, 0x1490) #define DCM_TomoClass DcmTagKey(0x0018, 0x1491) #define DCM_NumberOfTomosynthesisSourceImages DcmTagKey(0x0018, 0x1495) #define DCM_PositionerMotion DcmTagKey(0x0018, 0x1500) #define DCM_PositionerType DcmTagKey(0x0018, 0x1508) #define DCM_PositionerPrimaryAngle DcmTagKey(0x0018, 0x1510) #define DCM_PositionerSecondaryAngle DcmTagKey(0x0018, 0x1511) #define DCM_PositionerPrimaryAngleIncrement DcmTagKey(0x0018, 0x1520) #define DCM_PositionerSecondaryAngleIncrement DcmTagKey(0x0018, 0x1521) #define DCM_DetectorPrimaryAngle DcmTagKey(0x0018, 0x1530) #define DCM_DetectorSecondaryAngle DcmTagKey(0x0018, 0x1531) #define DCM_ShutterShape DcmTagKey(0x0018, 0x1600) #define DCM_ShutterLeftVerticalEdge DcmTagKey(0x0018, 0x1602) #define DCM_ShutterRightVerticalEdge DcmTagKey(0x0018, 0x1604) #define DCM_ShutterUpperHorizontalEdge DcmTagKey(0x0018, 0x1606) #define DCM_ShutterLowerHorizontalEdge DcmTagKey(0x0018, 0x1608) #define DCM_CenterOfCircularShutter DcmTagKey(0x0018, 0x1610) #define DCM_RadiusOfCircularShutter DcmTagKey(0x0018, 0x1612) #define DCM_VerticesOfThePolygonalShutter DcmTagKey(0x0018, 0x1620) #define DCM_ShutterPresentationValue DcmTagKey(0x0018, 0x1622) #define DCM_ShutterOverlayGroup DcmTagKey(0x0018, 0x1623) #define DCM_ShutterPresentationColorCIELabValue DcmTagKey(0x0018, 0x1624) #define DCM_CollimatorShape DcmTagKey(0x0018, 0x1700) #define DCM_CollimatorLeftVerticalEdge DcmTagKey(0x0018, 0x1702) #define DCM_CollimatorRightVerticalEdge DcmTagKey(0x0018, 0x1704) #define DCM_CollimatorUpperHorizontalEdge DcmTagKey(0x0018, 0x1706) #define DCM_CollimatorLowerHorizontalEdge DcmTagKey(0x0018, 0x1708) #define DCM_CenterOfCircularCollimator DcmTagKey(0x0018, 0x1710) #define DCM_RadiusOfCircularCollimator DcmTagKey(0x0018, 0x1712) #define DCM_VerticesOfThePolygonalCollimator DcmTagKey(0x0018, 0x1720) #define DCM_AcquisitionTimeSynchronized DcmTagKey(0x0018, 0x1800) #define DCM_TimeSource DcmTagKey(0x0018, 0x1801) #define DCM_TimeDistributionProtocol DcmTagKey(0x0018, 0x1802) #define DCM_NTPSourceAddress DcmTagKey(0x0018, 0x1803) #define DCM_PageNumberVector DcmTagKey(0x0018, 0x2001) #define DCM_FrameLabelVector DcmTagKey(0x0018, 0x2002) #define DCM_FramePrimaryAngleVector DcmTagKey(0x0018, 0x2003) #define DCM_FrameSecondaryAngleVector DcmTagKey(0x0018, 0x2004) #define DCM_SliceLocationVector DcmTagKey(0x0018, 0x2005) #define DCM_DisplayWindowLabelVector DcmTagKey(0x0018, 0x2006) #define DCM_NominalScannedPixelSpacing DcmTagKey(0x0018, 0x2010) #define DCM_DigitizingDeviceTransportDirection DcmTagKey(0x0018, 0x2020) #define DCM_RotationOfScannedFilm DcmTagKey(0x0018, 0x2030) #define DCM_IVUSAcquisition DcmTagKey(0x0018, 0x3100) #define DCM_IVUSPullbackRate DcmTagKey(0x0018, 0x3101) #define DCM_IVUSGatedRate DcmTagKey(0x0018, 0x3102) #define DCM_IVUSPullbackStartFrameNumber DcmTagKey(0x0018, 0x3103) #define DCM_IVUSPullbackStopFrameNumber DcmTagKey(0x0018, 0x3104) #define DCM_LesionNumber DcmTagKey(0x0018, 0x3105) #define DCM_ACR_NEMA_AcquisitionComments DcmTagKey(0x0018, 0x4000) #define DCM_OutputPower DcmTagKey(0x0018, 0x5000) #define DCM_TransducerData DcmTagKey(0x0018, 0x5010) #define DCM_FocusDepth DcmTagKey(0x0018, 0x5012) #define DCM_ProcessingFunction DcmTagKey(0x0018, 0x5020) #define DCM_RETIRED_PostprocessingFunction DcmTagKey(0x0018, 0x5021) #define DCM_MechanicalIndex DcmTagKey(0x0018, 0x5022) #define DCM_BoneThermalIndex DcmTagKey(0x0018, 0x5024) #define DCM_CranialThermalIndex DcmTagKey(0x0018, 0x5026) #define DCM_SoftTissueThermalIndex DcmTagKey(0x0018, 0x5027) #define DCM_SoftTissueFocusThermalIndex DcmTagKey(0x0018, 0x5028) #define DCM_SoftTissueSurfaceThermalIndex DcmTagKey(0x0018, 0x5029) #define DCM_ACR_NEMA_DynamicRange DcmTagKey(0x0018, 0x5030) #define DCM_ACR_NEMA_TotalGain DcmTagKey(0x0018, 0x5040) #define DCM_DepthOfScanField DcmTagKey(0x0018, 0x5050) #define DCM_PatientPosition DcmTagKey(0x0018, 0x5100) #define DCM_ViewPosition DcmTagKey(0x0018, 0x5101) #define DCM_ProjectionEponymousNameCodeSequence DcmTagKey(0x0018, 0x5104) #define DCM_RETIRED_ImageTransformationMatrix DcmTagKey(0x0018, 0x5210) #define DCM_RETIRED_ImageTranslationVector DcmTagKey(0x0018, 0x5212) #define DCM_Sensitivity DcmTagKey(0x0018, 0x6000) #define DCM_SequenceOfUltrasoundRegions DcmTagKey(0x0018, 0x6011) #define DCM_RegionSpatialFormat DcmTagKey(0x0018, 0x6012) #define DCM_RegionDataType DcmTagKey(0x0018, 0x6014) #define DCM_RegionFlags DcmTagKey(0x0018, 0x6016) #define DCM_RegionLocationMinX0 DcmTagKey(0x0018, 0x6018) #define DCM_RegionLocationMinY0 DcmTagKey(0x0018, 0x601a) #define DCM_RegionLocationMaxX1 DcmTagKey(0x0018, 0x601c) #define DCM_RegionLocationMaxY1 DcmTagKey(0x0018, 0x601e) #define DCM_ReferencePixelX0 DcmTagKey(0x0018, 0x6020) #define DCM_ReferencePixelY0 DcmTagKey(0x0018, 0x6022) #define DCM_PhysicalUnitsXDirection DcmTagKey(0x0018, 0x6024) #define DCM_PhysicalUnitsYDirection DcmTagKey(0x0018, 0x6026) #define DCM_ReferencePixelPhysicalValueX DcmTagKey(0x0018, 0x6028) #define DCM_ReferencePixelPhysicalValueY DcmTagKey(0x0018, 0x602a) #define DCM_PhysicalDeltaX DcmTagKey(0x0018, 0x602c) #define DCM_PhysicalDeltaY DcmTagKey(0x0018, 0x602e) #define DCM_TransducerFrequency DcmTagKey(0x0018, 0x6030) #define DCM_TransducerType DcmTagKey(0x0018, 0x6031) #define DCM_PulseRepetitionFrequency DcmTagKey(0x0018, 0x6032) #define DCM_DopplerCorrectionAngle DcmTagKey(0x0018, 0x6034) #define DCM_SteeringAngle DcmTagKey(0x0018, 0x6036) #define DCM_RETIRED_DopplerSampleVolumeXPositionRetired DcmTagKey(0x0018, 0x6038) #define DCM_DopplerSampleVolumeXPosition DcmTagKey(0x0018, 0x6039) #define DCM_RETIRED_DopplerSampleVolumeYPositionRetired DcmTagKey(0x0018, 0x603a) #define DCM_DopplerSampleVolumeYPosition DcmTagKey(0x0018, 0x603b) #define DCM_RETIRED_TMLinePositionX0Retired DcmTagKey(0x0018, 0x603c) #define DCM_TMLinePositionX0 DcmTagKey(0x0018, 0x603d) #define DCM_RETIRED_TMLinePositionY0Retired DcmTagKey(0x0018, 0x603e) #define DCM_TMLinePositionY0 DcmTagKey(0x0018, 0x603f) #define DCM_RETIRED_TMLinePositionX1Retired DcmTagKey(0x0018, 0x6040) #define DCM_TMLinePositionX1 DcmTagKey(0x0018, 0x6041) #define DCM_RETIRED_TMLinePositionY1Retired DcmTagKey(0x0018, 0x6042) #define DCM_TMLinePositionY1 DcmTagKey(0x0018, 0x6043) #define DCM_PixelComponentOrganization DcmTagKey(0x0018, 0x6044) #define DCM_PixelComponentMask DcmTagKey(0x0018, 0x6046) #define DCM_PixelComponentRangeStart DcmTagKey(0x0018, 0x6048) #define DCM_PixelComponentRangeStop DcmTagKey(0x0018, 0x604a) #define DCM_PixelComponentPhysicalUnits DcmTagKey(0x0018, 0x604c) #define DCM_PixelComponentDataType DcmTagKey(0x0018, 0x604e) #define DCM_NumberOfTableBreakPoints DcmTagKey(0x0018, 0x6050) #define DCM_TableOfXBreakPoints DcmTagKey(0x0018, 0x6052) #define DCM_TableOfYBreakPoints DcmTagKey(0x0018, 0x6054) #define DCM_NumberOfTableEntries DcmTagKey(0x0018, 0x6056) #define DCM_TableOfPixelValues DcmTagKey(0x0018, 0x6058) #define DCM_TableOfParameterValues DcmTagKey(0x0018, 0x605a) #define DCM_RWaveTimeVector DcmTagKey(0x0018, 0x6060) #define DCM_DetectorConditionsNominalFlag DcmTagKey(0x0018, 0x7000) #define DCM_DetectorTemperature DcmTagKey(0x0018, 0x7001) #define DCM_DetectorType DcmTagKey(0x0018, 0x7004) #define DCM_DetectorConfiguration DcmTagKey(0x0018, 0x7005) #define DCM_DetectorDescription DcmTagKey(0x0018, 0x7006) #define DCM_DetectorMode DcmTagKey(0x0018, 0x7008) #define DCM_DetectorID DcmTagKey(0x0018, 0x700a) #define DCM_DateOfLastDetectorCalibration DcmTagKey(0x0018, 0x700c) #define DCM_TimeOfLastDetectorCalibration DcmTagKey(0x0018, 0x700e) #define DCM_ExposuresOnDetectorSinceLastCalibration DcmTagKey(0x0018, 0x7010) #define DCM_ExposuresOnDetectorSinceManufactured DcmTagKey(0x0018, 0x7011) #define DCM_DetectorTimeSinceLastExposure DcmTagKey(0x0018, 0x7012) #define DCM_DetectorActiveTime DcmTagKey(0x0018, 0x7014) #define DCM_DetectorActivationOffsetFromExposure DcmTagKey(0x0018, 0x7016) #define DCM_DetectorBinning DcmTagKey(0x0018, 0x701a) #define DCM_DetectorElementPhysicalSize DcmTagKey(0x0018, 0x7020) #define DCM_DetectorElementSpacing DcmTagKey(0x0018, 0x7022) #define DCM_DetectorActiveShape DcmTagKey(0x0018, 0x7024) #define DCM_DetectorActiveDimensions DcmTagKey(0x0018, 0x7026) #define DCM_DetectorActiveOrigin DcmTagKey(0x0018, 0x7028) #define DCM_DetectorManufacturerName DcmTagKey(0x0018, 0x702a) #define DCM_DetectorManufacturerModelName DcmTagKey(0x0018, 0x702b) #define DCM_FieldOfViewOrigin DcmTagKey(0x0018, 0x7030) #define DCM_FieldOfViewRotation DcmTagKey(0x0018, 0x7032) #define DCM_FieldOfViewHorizontalFlip DcmTagKey(0x0018, 0x7034) #define DCM_GridAbsorbingMaterial DcmTagKey(0x0018, 0x7040) #define DCM_GridSpacingMaterial DcmTagKey(0x0018, 0x7041) #define DCM_GridThickness DcmTagKey(0x0018, 0x7042) #define DCM_GridPitch DcmTagKey(0x0018, 0x7044) #define DCM_GridAspectRatio DcmTagKey(0x0018, 0x7046) #define DCM_GridPeriod DcmTagKey(0x0018, 0x7048) #define DCM_GridFocalDistance DcmTagKey(0x0018, 0x704c) #define DCM_FilterMaterial DcmTagKey(0x0018, 0x7050) #define DCM_FilterThicknessMinimum DcmTagKey(0x0018, 0x7052) #define DCM_FilterThicknessMaximum DcmTagKey(0x0018, 0x7054) #define DCM_FilterBeamPathLengthMinimum DcmTagKey(0x0018, 0x7056) #define DCM_FilterBeamPathLengthMaximum DcmTagKey(0x0018, 0x7058) #define DCM_ExposureControlMode DcmTagKey(0x0018, 0x7060) #define DCM_ExposureControlModeDescription DcmTagKey(0x0018, 0x7062) #define DCM_ExposureStatus DcmTagKey(0x0018, 0x7064) #define DCM_PhototimerSetting DcmTagKey(0x0018, 0x7065) #define DCM_ExposureTimeInuS DcmTagKey(0x0018, 0x8150) #define DCM_XRayTubeCurrentInuA DcmTagKey(0x0018, 0x8151) #define DCM_ContentQualification DcmTagKey(0x0018, 0x9004) #define DCM_PulseSequenceName DcmTagKey(0x0018, 0x9005) #define DCM_MRImagingModifierSequence DcmTagKey(0x0018, 0x9006) #define DCM_EchoPulseSequence DcmTagKey(0x0018, 0x9008) #define DCM_InversionRecovery DcmTagKey(0x0018, 0x9009) #define DCM_FlowCompensation DcmTagKey(0x0018, 0x9010) #define DCM_MultipleSpinEcho DcmTagKey(0x0018, 0x9011) #define DCM_MultiPlanarExcitation DcmTagKey(0x0018, 0x9012) #define DCM_PhaseContrast DcmTagKey(0x0018, 0x9014) #define DCM_TimeOfFlightContrast DcmTagKey(0x0018, 0x9015) #define DCM_Spoiling DcmTagKey(0x0018, 0x9016) #define DCM_SteadyStatePulseSequence DcmTagKey(0x0018, 0x9017) #define DCM_EchoPlanarPulseSequence DcmTagKey(0x0018, 0x9018) #define DCM_TagAngleFirstAxis DcmTagKey(0x0018, 0x9019) #define DCM_MagnetizationTransfer DcmTagKey(0x0018, 0x9020) #define DCM_T2Preparation DcmTagKey(0x0018, 0x9021) #define DCM_BloodSignalNulling DcmTagKey(0x0018, 0x9022) #define DCM_SaturationRecovery DcmTagKey(0x0018, 0x9024) #define DCM_SpectrallySelectedSuppression DcmTagKey(0x0018, 0x9025) #define DCM_SpectrallySelectedExcitation DcmTagKey(0x0018, 0x9026) #define DCM_SpatialPresaturation DcmTagKey(0x0018, 0x9027) #define DCM_Tagging DcmTagKey(0x0018, 0x9028) #define DCM_OversamplingPhase DcmTagKey(0x0018, 0x9029) #define DCM_TagSpacingFirstDimension DcmTagKey(0x0018, 0x9030) #define DCM_GeometryOfKSpaceTraversal DcmTagKey(0x0018, 0x9032) #define DCM_SegmentedKSpaceTraversal DcmTagKey(0x0018, 0x9033) #define DCM_RectilinearPhaseEncodeReordering DcmTagKey(0x0018, 0x9034) #define DCM_TagThickness DcmTagKey(0x0018, 0x9035) #define DCM_PartialFourierDirection DcmTagKey(0x0018, 0x9036) #define DCM_CardiacSynchronizationTechnique DcmTagKey(0x0018, 0x9037) #define DCM_ReceiveCoilManufacturerName DcmTagKey(0x0018, 0x9041) #define DCM_MRReceiveCoilSequence DcmTagKey(0x0018, 0x9042) #define DCM_ReceiveCoilType DcmTagKey(0x0018, 0x9043) #define DCM_QuadratureReceiveCoil DcmTagKey(0x0018, 0x9044) #define DCM_MultiCoilDefinitionSequence DcmTagKey(0x0018, 0x9045) #define DCM_MultiCoilConfiguration DcmTagKey(0x0018, 0x9046) #define DCM_MultiCoilElementName DcmTagKey(0x0018, 0x9047) #define DCM_MultiCoilElementUsed DcmTagKey(0x0018, 0x9048) #define DCM_MRTransmitCoilSequence DcmTagKey(0x0018, 0x9049) #define DCM_TransmitCoilManufacturerName DcmTagKey(0x0018, 0x9050) #define DCM_TransmitCoilType DcmTagKey(0x0018, 0x9051) #define DCM_SpectralWidth DcmTagKey(0x0018, 0x9052) #define DCM_ChemicalShiftReference DcmTagKey(0x0018, 0x9053) #define DCM_VolumeLocalizationTechnique DcmTagKey(0x0018, 0x9054) #define DCM_MRAcquisitionFrequencyEncodingSteps DcmTagKey(0x0018, 0x9058) #define DCM_Decoupling DcmTagKey(0x0018, 0x9059) #define DCM_DecoupledNucleus DcmTagKey(0x0018, 0x9060) #define DCM_DecouplingFrequency DcmTagKey(0x0018, 0x9061) #define DCM_DecouplingMethod DcmTagKey(0x0018, 0x9062) #define DCM_DecouplingChemicalShiftReference DcmTagKey(0x0018, 0x9063) #define DCM_KSpaceFiltering DcmTagKey(0x0018, 0x9064) #define DCM_TimeDomainFiltering DcmTagKey(0x0018, 0x9065) #define DCM_NumberOfZeroFills DcmTagKey(0x0018, 0x9066) #define DCM_BaselineCorrection DcmTagKey(0x0018, 0x9067) #define DCM_ParallelReductionFactorInPlane DcmTagKey(0x0018, 0x9069) #define DCM_CardiacRRIntervalSpecified DcmTagKey(0x0018, 0x9070) #define DCM_AcquisitionDuration DcmTagKey(0x0018, 0x9073) #define DCM_FrameAcquisitionDateTime DcmTagKey(0x0018, 0x9074) #define DCM_DiffusionDirectionality DcmTagKey(0x0018, 0x9075) #define DCM_DiffusionGradientDirectionSequence DcmTagKey(0x0018, 0x9076) #define DCM_ParallelAcquisition DcmTagKey(0x0018, 0x9077) #define DCM_ParallelAcquisitionTechnique DcmTagKey(0x0018, 0x9078) #define DCM_InversionTimes DcmTagKey(0x0018, 0x9079) #define DCM_MetaboliteMapDescription DcmTagKey(0x0018, 0x9080) #define DCM_PartialFourier DcmTagKey(0x0018, 0x9081) #define DCM_EffectiveEchoTime DcmTagKey(0x0018, 0x9082) #define DCM_MetaboliteMapCodeSequence DcmTagKey(0x0018, 0x9083) #define DCM_ChemicalShiftSequence DcmTagKey(0x0018, 0x9084) #define DCM_CardiacSignalSource DcmTagKey(0x0018, 0x9085) #define DCM_DiffusionBValue DcmTagKey(0x0018, 0x9087) #define DCM_DiffusionGradientOrientation DcmTagKey(0x0018, 0x9089) #define DCM_VelocityEncodingDirection DcmTagKey(0x0018, 0x9090) #define DCM_VelocityEncodingMinimumValue DcmTagKey(0x0018, 0x9091) #define DCM_VelocityEncodingAcquisitionSequence DcmTagKey(0x0018, 0x9092) #define DCM_NumberOfKSpaceTrajectories DcmTagKey(0x0018, 0x9093) #define DCM_CoverageOfKSpace DcmTagKey(0x0018, 0x9094) #define DCM_SpectroscopyAcquisitionPhaseRows DcmTagKey(0x0018, 0x9095) #define DCM_RETIRED_ParallelReductionFactorInPlaneRetired DcmTagKey(0x0018, 0x9096) #define DCM_TransmitterFrequency DcmTagKey(0x0018, 0x9098) #define DCM_ResonantNucleus DcmTagKey(0x0018, 0x9100) #define DCM_FrequencyCorrection DcmTagKey(0x0018, 0x9101) #define DCM_MRSpectroscopyFOVGeometrySequence DcmTagKey(0x0018, 0x9103) #define DCM_SlabThickness DcmTagKey(0x0018, 0x9104) #define DCM_SlabOrientation DcmTagKey(0x0018, 0x9105) #define DCM_MidSlabPosition DcmTagKey(0x0018, 0x9106) #define DCM_MRSpatialSaturationSequence DcmTagKey(0x0018, 0x9107) #define DCM_MRTimingAndRelatedParametersSequence DcmTagKey(0x0018, 0x9112) #define DCM_MREchoSequence DcmTagKey(0x0018, 0x9114) #define DCM_MRModifierSequence DcmTagKey(0x0018, 0x9115) #define DCM_MRDiffusionSequence DcmTagKey(0x0018, 0x9117) #define DCM_CardiacSynchronizationSequence DcmTagKey(0x0018, 0x9118) #define DCM_MRAveragesSequence DcmTagKey(0x0018, 0x9119) #define DCM_MRFOVGeometrySequence DcmTagKey(0x0018, 0x9125) #define DCM_VolumeLocalizationSequence DcmTagKey(0x0018, 0x9126) #define DCM_SpectroscopyAcquisitionDataColumns DcmTagKey(0x0018, 0x9127) #define DCM_DiffusionAnisotropyType DcmTagKey(0x0018, 0x9147) #define DCM_FrameReferenceDateTime DcmTagKey(0x0018, 0x9151) #define DCM_MRMetaboliteMapSequence DcmTagKey(0x0018, 0x9152) #define DCM_ParallelReductionFactorOutOfPlane DcmTagKey(0x0018, 0x9155) #define DCM_SpectroscopyAcquisitionOutOfPlanePhaseSteps DcmTagKey(0x0018, 0x9159) #define DCM_RETIRED_BulkMotionStatus DcmTagKey(0x0018, 0x9166) #define DCM_ParallelReductionFactorSecondInPlane DcmTagKey(0x0018, 0x9168) #define DCM_CardiacBeatRejectionTechnique DcmTagKey(0x0018, 0x9169) #define DCM_RespiratoryMotionCompensationTechnique DcmTagKey(0x0018, 0x9170) #define DCM_RespiratorySignalSource DcmTagKey(0x0018, 0x9171) #define DCM_BulkMotionCompensationTechnique DcmTagKey(0x0018, 0x9172) #define DCM_BulkMotionSignalSource DcmTagKey(0x0018, 0x9173) #define DCM_ApplicableSafetyStandardAgency DcmTagKey(0x0018, 0x9174) #define DCM_ApplicableSafetyStandardDescription DcmTagKey(0x0018, 0x9175) #define DCM_OperatingModeSequence DcmTagKey(0x0018, 0x9176) #define DCM_OperatingModeType DcmTagKey(0x0018, 0x9177) #define DCM_OperatingMode DcmTagKey(0x0018, 0x9178) #define DCM_SpecificAbsorptionRateDefinition DcmTagKey(0x0018, 0x9179) #define DCM_GradientOutputType DcmTagKey(0x0018, 0x9180) #define DCM_SpecificAbsorptionRateValue DcmTagKey(0x0018, 0x9181) #define DCM_GradientOutput DcmTagKey(0x0018, 0x9182) #define DCM_FlowCompensationDirection DcmTagKey(0x0018, 0x9183) #define DCM_TaggingDelay DcmTagKey(0x0018, 0x9184) #define DCM_RespiratoryMotionCompensationTechniqueDescription DcmTagKey(0x0018, 0x9185) #define DCM_RespiratorySignalSourceID DcmTagKey(0x0018, 0x9186) #define DCM_RETIRED_ChemicalShiftMinimumIntegrationLimitInHz DcmTagKey(0x0018, 0x9195) #define DCM_RETIRED_ChemicalShiftMaximumIntegrationLimitInHz DcmTagKey(0x0018, 0x9196) #define DCM_MRVelocityEncodingSequence DcmTagKey(0x0018, 0x9197) #define DCM_FirstOrderPhaseCorrection DcmTagKey(0x0018, 0x9198) #define DCM_WaterReferencedPhaseCorrection DcmTagKey(0x0018, 0x9199) #define DCM_MRSpectroscopyAcquisitionType DcmTagKey(0x0018, 0x9200) #define DCM_RespiratoryCyclePosition DcmTagKey(0x0018, 0x9214) #define DCM_VelocityEncodingMaximumValue DcmTagKey(0x0018, 0x9217) #define DCM_TagSpacingSecondDimension DcmTagKey(0x0018, 0x9218) #define DCM_TagAngleSecondAxis DcmTagKey(0x0018, 0x9219) #define DCM_FrameAcquisitionDuration DcmTagKey(0x0018, 0x9220) #define DCM_MRImageFrameTypeSequence DcmTagKey(0x0018, 0x9226) #define DCM_MRSpectroscopyFrameTypeSequence DcmTagKey(0x0018, 0x9227) #define DCM_MRAcquisitionPhaseEncodingStepsInPlane DcmTagKey(0x0018, 0x9231) #define DCM_MRAcquisitionPhaseEncodingStepsOutOfPlane DcmTagKey(0x0018, 0x9232) #define DCM_SpectroscopyAcquisitionPhaseColumns DcmTagKey(0x0018, 0x9234) #define DCM_CardiacCyclePosition DcmTagKey(0x0018, 0x9236) #define DCM_SpecificAbsorptionRateSequence DcmTagKey(0x0018, 0x9239) #define DCM_RFEchoTrainLength DcmTagKey(0x0018, 0x9240) #define DCM_GradientEchoTrainLength DcmTagKey(0x0018, 0x9241) #define DCM_ChemicalShiftMinimumIntegrationLimitInppm DcmTagKey(0x0018, 0x9295) #define DCM_ChemicalShiftMaximumIntegrationLimitInppm DcmTagKey(0x0018, 0x9296) #define DCM_CTAcquisitionTypeSequence DcmTagKey(0x0018, 0x9301) #define DCM_AcquisitionType DcmTagKey(0x0018, 0x9302) #define DCM_TubeAngle DcmTagKey(0x0018, 0x9303) #define DCM_CTAcquisitionDetailsSequence DcmTagKey(0x0018, 0x9304) #define DCM_RevolutionTime DcmTagKey(0x0018, 0x9305) #define DCM_SingleCollimationWidth DcmTagKey(0x0018, 0x9306) #define DCM_TotalCollimationWidth DcmTagKey(0x0018, 0x9307) #define DCM_CTTableDynamicsSequence DcmTagKey(0x0018, 0x9308) #define DCM_TableSpeed DcmTagKey(0x0018, 0x9309) #define DCM_TableFeedPerRotation DcmTagKey(0x0018, 0x9310) #define DCM_SpiralPitchFactor DcmTagKey(0x0018, 0x9311) #define DCM_CTGeometrySequence DcmTagKey(0x0018, 0x9312) #define DCM_DataCollectionCenterPatient DcmTagKey(0x0018, 0x9313) #define DCM_CTReconstructionSequence DcmTagKey(0x0018, 0x9314) #define DCM_ReconstructionAlgorithm DcmTagKey(0x0018, 0x9315) #define DCM_ConvolutionKernelGroup DcmTagKey(0x0018, 0x9316) #define DCM_ReconstructionFieldOfView DcmTagKey(0x0018, 0x9317) #define DCM_ReconstructionTargetCenterPatient DcmTagKey(0x0018, 0x9318) #define DCM_ReconstructionAngle DcmTagKey(0x0018, 0x9319) #define DCM_ImageFilter DcmTagKey(0x0018, 0x9320) #define DCM_CTExposureSequence DcmTagKey(0x0018, 0x9321) #define DCM_ReconstructionPixelSpacing DcmTagKey(0x0018, 0x9322) #define DCM_ExposureModulationType DcmTagKey(0x0018, 0x9323) #define DCM_EstimatedDoseSaving DcmTagKey(0x0018, 0x9324) #define DCM_CTXRayDetailsSequence DcmTagKey(0x0018, 0x9325) #define DCM_CTPositionSequence DcmTagKey(0x0018, 0x9326) #define DCM_TablePosition DcmTagKey(0x0018, 0x9327) #define DCM_ExposureTimeInms DcmTagKey(0x0018, 0x9328) #define DCM_CTImageFrameTypeSequence DcmTagKey(0x0018, 0x9329) #define DCM_XRayTubeCurrentInmA DcmTagKey(0x0018, 0x9330) #define DCM_ExposureInmAs DcmTagKey(0x0018, 0x9332) #define DCM_ConstantVolumeFlag DcmTagKey(0x0018, 0x9333) #define DCM_FluoroscopyFlag DcmTagKey(0x0018, 0x9334) #define DCM_DistanceSourceToDataCollectionCenter DcmTagKey(0x0018, 0x9335) #define DCM_ContrastBolusAgentNumber DcmTagKey(0x0018, 0x9337) #define DCM_ContrastBolusIngredientCodeSequence DcmTagKey(0x0018, 0x9338) #define DCM_ContrastAdministrationProfileSequence DcmTagKey(0x0018, 0x9340) #define DCM_ContrastBolusUsageSequence DcmTagKey(0x0018, 0x9341) #define DCM_ContrastBolusAgentAdministered DcmTagKey(0x0018, 0x9342) #define DCM_ContrastBolusAgentDetected DcmTagKey(0x0018, 0x9343) #define DCM_ContrastBolusAgentPhase DcmTagKey(0x0018, 0x9344) #define DCM_CTDIvol DcmTagKey(0x0018, 0x9345) #define DCM_CTDIPhantomTypeCodeSequence DcmTagKey(0x0018, 0x9346) #define DCM_CalciumScoringMassFactorPatient DcmTagKey(0x0018, 0x9351) #define DCM_CalciumScoringMassFactorDevice DcmTagKey(0x0018, 0x9352) #define DCM_EnergyWeightingFactor DcmTagKey(0x0018, 0x9353) #define DCM_CTAdditionalXRaySourceSequence DcmTagKey(0x0018, 0x9360) #define DCM_ProjectionPixelCalibrationSequence DcmTagKey(0x0018, 0x9401) #define DCM_DistanceSourceToIsocenter DcmTagKey(0x0018, 0x9402) #define DCM_DistanceObjectToTableTop DcmTagKey(0x0018, 0x9403) #define DCM_ObjectPixelSpacingInCenterOfBeam DcmTagKey(0x0018, 0x9404) #define DCM_PositionerPositionSequence DcmTagKey(0x0018, 0x9405) #define DCM_TablePositionSequence DcmTagKey(0x0018, 0x9406) #define DCM_CollimatorShapeSequence DcmTagKey(0x0018, 0x9407) #define DCM_XAXRFFrameCharacteristicsSequence DcmTagKey(0x0018, 0x9412) #define DCM_FrameAcquisitionSequence DcmTagKey(0x0018, 0x9417) #define DCM_XRayReceptorType DcmTagKey(0x0018, 0x9420) #define DCM_AcquisitionProtocolName DcmTagKey(0x0018, 0x9423) #define DCM_AcquisitionProtocolDescription DcmTagKey(0x0018, 0x9424) #define DCM_ContrastBolusIngredientOpaque DcmTagKey(0x0018, 0x9425) #define DCM_DistanceReceptorPlaneToDetectorHousing DcmTagKey(0x0018, 0x9426) #define DCM_IntensifierActiveShape DcmTagKey(0x0018, 0x9427) #define DCM_IntensifierActiveDimensions DcmTagKey(0x0018, 0x9428) #define DCM_PhysicalDetectorSize DcmTagKey(0x0018, 0x9429) #define DCM_PositionOfIsocenterProjection DcmTagKey(0x0018, 0x9430) #define DCM_FieldOfViewSequence DcmTagKey(0x0018, 0x9432) #define DCM_FieldOfViewDescription DcmTagKey(0x0018, 0x9433) #define DCM_ExposureControlSensingRegionsSequence DcmTagKey(0x0018, 0x9434) #define DCM_ExposureControlSensingRegionShape DcmTagKey(0x0018, 0x9435) #define DCM_ExposureControlSensingRegionLeftVerticalEdge DcmTagKey(0x0018, 0x9436) #define DCM_ExposureControlSensingRegionRightVerticalEdge DcmTagKey(0x0018, 0x9437) #define DCM_ExposureControlSensingRegionUpperHorizontalEdge DcmTagKey(0x0018, 0x9438) #define DCM_ExposureControlSensingRegionLowerHorizontalEdge DcmTagKey(0x0018, 0x9439) #define DCM_CenterOfCircularExposureControlSensingRegion DcmTagKey(0x0018, 0x9440) #define DCM_RadiusOfCircularExposureControlSensingRegion DcmTagKey(0x0018, 0x9441) #define DCM_VerticesOfThePolygonalExposureControlSensingRegion DcmTagKey(0x0018, 0x9442) #define DCM_ColumnAngulationPatient DcmTagKey(0x0018, 0x9447) #define DCM_BeamAngle DcmTagKey(0x0018, 0x9449) #define DCM_FrameDetectorParametersSequence DcmTagKey(0x0018, 0x9451) #define DCM_CalculatedAnatomyThickness DcmTagKey(0x0018, 0x9452) #define DCM_CalibrationSequence DcmTagKey(0x0018, 0x9455) #define DCM_ObjectThicknessSequence DcmTagKey(0x0018, 0x9456) #define DCM_PlaneIdentification DcmTagKey(0x0018, 0x9457) #define DCM_FieldOfViewDimensionsInFloat DcmTagKey(0x0018, 0x9461) #define DCM_IsocenterReferenceSystemSequence DcmTagKey(0x0018, 0x9462) #define DCM_PositionerIsocenterPrimaryAngle DcmTagKey(0x0018, 0x9463) #define DCM_PositionerIsocenterSecondaryAngle DcmTagKey(0x0018, 0x9464) #define DCM_PositionerIsocenterDetectorRotationAngle DcmTagKey(0x0018, 0x9465) #define DCM_TableXPositionToIsocenter DcmTagKey(0x0018, 0x9466) #define DCM_TableYPositionToIsocenter DcmTagKey(0x0018, 0x9467) #define DCM_TableZPositionToIsocenter DcmTagKey(0x0018, 0x9468) #define DCM_TableHorizontalRotationAngle DcmTagKey(0x0018, 0x9469) #define DCM_TableHeadTiltAngle DcmTagKey(0x0018, 0x9470) #define DCM_TableCradleTiltAngle DcmTagKey(0x0018, 0x9471) #define DCM_FrameDisplayShutterSequence DcmTagKey(0x0018, 0x9472) #define DCM_AcquiredImageAreaDoseProduct DcmTagKey(0x0018, 0x9473) #define DCM_CArmPositionerTabletopRelationship DcmTagKey(0x0018, 0x9474) #define DCM_XRayGeometrySequence DcmTagKey(0x0018, 0x9476) #define DCM_IrradiationEventIdentificationSequence DcmTagKey(0x0018, 0x9477) #define DCM_XRay3DFrameTypeSequence DcmTagKey(0x0018, 0x9504) #define DCM_ContributingSourcesSequence DcmTagKey(0x0018, 0x9506) #define DCM_XRay3DAcquisitionSequence DcmTagKey(0x0018, 0x9507) #define DCM_PrimaryPositionerScanArc DcmTagKey(0x0018, 0x9508) #define DCM_SecondaryPositionerScanArc DcmTagKey(0x0018, 0x9509) #define DCM_PrimaryPositionerScanStartAngle DcmTagKey(0x0018, 0x9510) #define DCM_SecondaryPositionerScanStartAngle DcmTagKey(0x0018, 0x9511) #define DCM_PrimaryPositionerIncrement DcmTagKey(0x0018, 0x9514) #define DCM_SecondaryPositionerIncrement DcmTagKey(0x0018, 0x9515) #define DCM_StartAcquisitionDateTime DcmTagKey(0x0018, 0x9516) #define DCM_EndAcquisitionDateTime DcmTagKey(0x0018, 0x9517) #define DCM_ApplicationName DcmTagKey(0x0018, 0x9524) #define DCM_ApplicationVersion DcmTagKey(0x0018, 0x9525) #define DCM_ApplicationManufacturer DcmTagKey(0x0018, 0x9526) #define DCM_AlgorithmType DcmTagKey(0x0018, 0x9527) #define DCM_AlgorithmDescription DcmTagKey(0x0018, 0x9528) #define DCM_XRay3DReconstructionSequence DcmTagKey(0x0018, 0x9530) #define DCM_ReconstructionDescription DcmTagKey(0x0018, 0x9531) #define DCM_PerProjectionAcquisitionSequence DcmTagKey(0x0018, 0x9538) #define DCM_DiffusionBMatrixSequence DcmTagKey(0x0018, 0x9601) #define DCM_DiffusionBValueXX DcmTagKey(0x0018, 0x9602) #define DCM_DiffusionBValueXY DcmTagKey(0x0018, 0x9603) #define DCM_DiffusionBValueXZ DcmTagKey(0x0018, 0x9604) #define DCM_DiffusionBValueYY DcmTagKey(0x0018, 0x9605) #define DCM_DiffusionBValueYZ DcmTagKey(0x0018, 0x9606) #define DCM_DiffusionBValueZZ DcmTagKey(0x0018, 0x9607) #define DCM_DecayCorrectionDateTime DcmTagKey(0x0018, 0x9701) #define DCM_StartDensityThreshold DcmTagKey(0x0018, 0x9715) #define DCM_StartRelativeDensityDifferenceThreshold DcmTagKey(0x0018, 0x9716) #define DCM_StartCardiacTriggerCountThreshold DcmTagKey(0x0018, 0x9717) #define DCM_StartRespiratoryTriggerCountThreshold DcmTagKey(0x0018, 0x9718) #define DCM_TerminationCountsThreshold DcmTagKey(0x0018, 0x9719) #define DCM_TerminationDensityThreshold DcmTagKey(0x0018, 0x9720) #define DCM_TerminationRelativeDensityThreshold DcmTagKey(0x0018, 0x9721) #define DCM_TerminationTimeThreshold DcmTagKey(0x0018, 0x9722) #define DCM_TerminationCardiacTriggerCountThreshold DcmTagKey(0x0018, 0x9723) #define DCM_TerminationRespiratoryTriggerCountThreshold DcmTagKey(0x0018, 0x9724) #define DCM_DetectorGeometry DcmTagKey(0x0018, 0x9725) #define DCM_TransverseDetectorSeparation DcmTagKey(0x0018, 0x9726) #define DCM_AxialDetectorDimension DcmTagKey(0x0018, 0x9727) #define DCM_RadiopharmaceuticalAgentNumber DcmTagKey(0x0018, 0x9729) #define DCM_PETFrameAcquisitionSequence DcmTagKey(0x0018, 0x9732) #define DCM_PETDetectorMotionDetailsSequence DcmTagKey(0x0018, 0x9733) #define DCM_PETTableDynamicsSequence DcmTagKey(0x0018, 0x9734) #define DCM_PETPositionSequence DcmTagKey(0x0018, 0x9735) #define DCM_PETFrameCorrectionFactorsSequence DcmTagKey(0x0018, 0x9736) #define DCM_RadiopharmaceuticalUsageSequence DcmTagKey(0x0018, 0x9737) #define DCM_AttenuationCorrectionSource DcmTagKey(0x0018, 0x9738) #define DCM_NumberOfIterations DcmTagKey(0x0018, 0x9739) #define DCM_NumberOfSubsets DcmTagKey(0x0018, 0x9740) #define DCM_PETReconstructionSequence DcmTagKey(0x0018, 0x9749) #define DCM_PETFrameTypeSequence DcmTagKey(0x0018, 0x9751) #define DCM_TimeOfFlightInformationUsed DcmTagKey(0x0018, 0x9755) #define DCM_ReconstructionType DcmTagKey(0x0018, 0x9756) #define DCM_DecayCorrected DcmTagKey(0x0018, 0x9758) #define DCM_AttenuationCorrected DcmTagKey(0x0018, 0x9759) #define DCM_ScatterCorrected DcmTagKey(0x0018, 0x9760) #define DCM_DeadTimeCorrected DcmTagKey(0x0018, 0x9761) #define DCM_GantryMotionCorrected DcmTagKey(0x0018, 0x9762) #define DCM_PatientMotionCorrected DcmTagKey(0x0018, 0x9763) #define DCM_CountLossNormalizationCorrected DcmTagKey(0x0018, 0x9764) #define DCM_RandomsCorrected DcmTagKey(0x0018, 0x9765) #define DCM_NonUniformRadialSamplingCorrected DcmTagKey(0x0018, 0x9766) #define DCM_SensitivityCalibrated DcmTagKey(0x0018, 0x9767) #define DCM_DetectorNormalizationCorrection DcmTagKey(0x0018, 0x9768) #define DCM_IterativeReconstructionMethod DcmTagKey(0x0018, 0x9769) #define DCM_AttenuationCorrectionTemporalRelationship DcmTagKey(0x0018, 0x9770) #define DCM_PatientPhysiologicalStateSequence DcmTagKey(0x0018, 0x9771) #define DCM_PatientPhysiologicalStateCodeSequence DcmTagKey(0x0018, 0x9772) #define DCM_DepthsOfFocus DcmTagKey(0x0018, 0x9801) #define DCM_ExcludedIntervalsSequence DcmTagKey(0x0018, 0x9803) #define DCM_ExclusionStartDatetime DcmTagKey(0x0018, 0x9804) #define DCM_ExclusionDuration DcmTagKey(0x0018, 0x9805) #define DCM_USImageDescriptionSequence DcmTagKey(0x0018, 0x9806) #define DCM_ImageDataTypeSequence DcmTagKey(0x0018, 0x9807) #define DCM_DataType DcmTagKey(0x0018, 0x9808) #define DCM_TransducerScanPatternCodeSequence DcmTagKey(0x0018, 0x9809) #define DCM_AliasedDataType DcmTagKey(0x0018, 0x980b) #define DCM_PositionMeasuringDeviceUsed DcmTagKey(0x0018, 0x980c) #define DCM_TransducerGeometryCodeSequence DcmTagKey(0x0018, 0x980d) #define DCM_TransducerBeamSteeringCodeSequence DcmTagKey(0x0018, 0x980e) #define DCM_TransducerApplicationCodeSequence DcmTagKey(0x0018, 0x980f) #define DCM_ContributingEquipmentSequence DcmTagKey(0x0018, 0xa001) #define DCM_ContributionDateTime DcmTagKey(0x0018, 0xa002) #define DCM_ContributionDescription DcmTagKey(0x0018, 0xa003) #define DCM_StudyInstanceUID DcmTagKey(0x0020, 0x000d) #define DCM_SeriesInstanceUID DcmTagKey(0x0020, 0x000e) #define DCM_StudyID DcmTagKey(0x0020, 0x0010) #define DCM_SeriesNumber DcmTagKey(0x0020, 0x0011) #define DCM_AcquisitionNumber DcmTagKey(0x0020, 0x0012) #define DCM_InstanceNumber DcmTagKey(0x0020, 0x0013) #define DCM_RETIRED_IsotopeNumber DcmTagKey(0x0020, 0x0014) #define DCM_RETIRED_PhaseNumber DcmTagKey(0x0020, 0x0015) #define DCM_RETIRED_IntervalNumber DcmTagKey(0x0020, 0x0016) #define DCM_RETIRED_TimeSlotNumber DcmTagKey(0x0020, 0x0017) #define DCM_RETIRED_AngleNumber DcmTagKey(0x0020, 0x0018) #define DCM_ItemNumber DcmTagKey(0x0020, 0x0019) #define DCM_PatientOrientation DcmTagKey(0x0020, 0x0020) #define DCM_RETIRED_OverlayNumber DcmTagKey(0x0020, 0x0022) #define DCM_RETIRED_CurveNumber DcmTagKey(0x0020, 0x0024) #define DCM_RETIRED_LUTNumber DcmTagKey(0x0020, 0x0026) #define DCM_ACR_NEMA_ImagePosition DcmTagKey(0x0020, 0x0030) #define DCM_ImagePositionPatient DcmTagKey(0x0020, 0x0032) #define DCM_ACR_NEMA_ImageOrientation DcmTagKey(0x0020, 0x0035) #define DCM_ImageOrientationPatient DcmTagKey(0x0020, 0x0037) #define DCM_ACR_NEMA_Location DcmTagKey(0x0020, 0x0050) #define DCM_FrameOfReferenceUID DcmTagKey(0x0020, 0x0052) #define DCM_Laterality DcmTagKey(0x0020, 0x0060) #define DCM_ImageLaterality DcmTagKey(0x0020, 0x0062) #define DCM_ACR_NEMA_ImageGeometryType DcmTagKey(0x0020, 0x0070) #define DCM_ACR_NEMA_MaskingImage DcmTagKey(0x0020, 0x0080) #define DCM_TemporalPositionIdentifier DcmTagKey(0x0020, 0x0100) #define DCM_NumberOfTemporalPositions DcmTagKey(0x0020, 0x0105) #define DCM_TemporalResolution DcmTagKey(0x0020, 0x0110) #define DCM_SynchronizationFrameOfReferenceUID DcmTagKey(0x0020, 0x0200) #define DCM_SOPInstanceUIDOfConcatenationSource DcmTagKey(0x0020, 0x0242) #define DCM_RETIRED_SeriesInStudy DcmTagKey(0x0020, 0x1000) #define DCM_ACR_NEMA_AcquisitionsInSeries DcmTagKey(0x0020, 0x1001) #define DCM_ImagesInAcquisition DcmTagKey(0x0020, 0x1002) #define DCM_ACR_NEMA_ImagesInSeries DcmTagKey(0x0020, 0x1003) #define DCM_RETIRED_AcquisitionsInStudy DcmTagKey(0x0020, 0x1004) #define DCM_ACR_NEMA_ImagesInStudy DcmTagKey(0x0020, 0x1005) #define DCM_ACR_NEMA_Reference DcmTagKey(0x0020, 0x1020) #define DCM_PositionReferenceIndicator DcmTagKey(0x0020, 0x1040) #define DCM_SliceLocation DcmTagKey(0x0020, 0x1041) #define DCM_RETIRED_OtherStudyNumbers DcmTagKey(0x0020, 0x1070) #define DCM_NumberOfPatientRelatedStudies DcmTagKey(0x0020, 0x1200) #define DCM_NumberOfPatientRelatedSeries DcmTagKey(0x0020, 0x1202) #define DCM_NumberOfPatientRelatedInstances DcmTagKey(0x0020, 0x1204) #define DCM_NumberOfStudyRelatedSeries DcmTagKey(0x0020, 0x1206) #define DCM_NumberOfStudyRelatedInstances DcmTagKey(0x0020, 0x1208) #define DCM_NumberOfSeriesRelatedInstances DcmTagKey(0x0020, 0x1209) #define DCM_ACR_NEMA_ModifyingDeviceID DcmTagKey(0x0020, 0x3401) #define DCM_ACR_NEMA_ModifiedImageID DcmTagKey(0x0020, 0x3402) #define DCM_ACR_NEMA_ModifiedImageDate DcmTagKey(0x0020, 0x3403) #define DCM_ACR_NEMA_ModifyingDeviceManufacturer DcmTagKey(0x0020, 0x3404) #define DCM_ACR_NEMA_ModifiedImageTime DcmTagKey(0x0020, 0x3405) #define DCM_ACR_NEMA_ModifiedImageDescription DcmTagKey(0x0020, 0x3406) #define DCM_ImageComments DcmTagKey(0x0020, 0x4000) #define DCM_ACR_NEMA_OriginalImageIdentification DcmTagKey(0x0020, 0x5000) #define DCM_ACR_NEMA_OriginalImageIdentificationNomenclature DcmTagKey(0x0020, 0x5002) #define DCM_StackID DcmTagKey(0x0020, 0x9056) #define DCM_InStackPositionNumber DcmTagKey(0x0020, 0x9057) #define DCM_FrameAnatomySequence DcmTagKey(0x0020, 0x9071) #define DCM_FrameLaterality DcmTagKey(0x0020, 0x9072) #define DCM_FrameContentSequence DcmTagKey(0x0020, 0x9111) #define DCM_PlanePositionSequence DcmTagKey(0x0020, 0x9113) #define DCM_PlaneOrientationSequence DcmTagKey(0x0020, 0x9116) #define DCM_TemporalPositionIndex DcmTagKey(0x0020, 0x9128) #define DCM_NominalCardiacTriggerDelayTime DcmTagKey(0x0020, 0x9153) #define DCM_FrameAcquisitionNumber DcmTagKey(0x0020, 0x9156) #define DCM_DimensionIndexValues DcmTagKey(0x0020, 0x9157) #define DCM_FrameComments DcmTagKey(0x0020, 0x9158) #define DCM_ConcatenationUID DcmTagKey(0x0020, 0x9161) #define DCM_InConcatenationNumber DcmTagKey(0x0020, 0x9162) #define DCM_InConcatenationTotalNumber DcmTagKey(0x0020, 0x9163) #define DCM_DimensionOrganizationUID DcmTagKey(0x0020, 0x9164) #define DCM_DimensionIndexPointer DcmTagKey(0x0020, 0x9165) #define DCM_FunctionalGroupPointer DcmTagKey(0x0020, 0x9167) #define DCM_DimensionIndexPrivateCreator DcmTagKey(0x0020, 0x9213) #define DCM_DimensionOrganizationSequence DcmTagKey(0x0020, 0x9221) #define DCM_DimensionIndexSequence DcmTagKey(0x0020, 0x9222) #define DCM_ConcatenationFrameOffsetNumber DcmTagKey(0x0020, 0x9228) #define DCM_FunctionalGroupPrivateCreator DcmTagKey(0x0020, 0x9238) #define DCM_NominalPercentageOfCardiacPhase DcmTagKey(0x0020, 0x9241) #define DCM_NominalPercentageOfRespiratoryPhase DcmTagKey(0x0020, 0x9245) #define DCM_StartingRespiratoryAmplitude DcmTagKey(0x0020, 0x9246) #define DCM_StartingRespiratoryPhase DcmTagKey(0x0020, 0x9247) #define DCM_EndingRespiratoryAmplitude DcmTagKey(0x0020, 0x9248) #define DCM_EndingRespiratoryPhase DcmTagKey(0x0020, 0x9249) #define DCM_RespiratoryTriggerType DcmTagKey(0x0020, 0x9250) #define DCM_RRIntervalTimeNominal DcmTagKey(0x0020, 0x9251) #define DCM_ActualCardiacTriggerDelayTime DcmTagKey(0x0020, 0x9252) #define DCM_RespiratorySynchronizationSequence DcmTagKey(0x0020, 0x9253) #define DCM_RespiratoryIntervalTime DcmTagKey(0x0020, 0x9254) #define DCM_NominalRespiratoryTriggerDelayTime DcmTagKey(0x0020, 0x9255) #define DCM_RespiratoryTriggerDelayThreshold DcmTagKey(0x0020, 0x9256) #define DCM_ActualRespiratoryTriggerDelayTime DcmTagKey(0x0020, 0x9257) #define DCM_ImagePositionVolume DcmTagKey(0x0020, 0x9301) #define DCM_ImageOrientationVolume DcmTagKey(0x0020, 0x9302) #define DCM_UltrasoundAcquisitionGeometry DcmTagKey(0x0020, 0x9307) #define DCM_ApexPosition DcmTagKey(0x0020, 0x9308) #define DCM_VolumeToTransducerMappingMatrix DcmTagKey(0x0020, 0x9309) #define DCM_VolumeToTableMappingMatrix DcmTagKey(0x0020, 0x930a) #define DCM_PatientFrameOfReferenceSource DcmTagKey(0x0020, 0x930c) #define DCM_TemporalPositionTimeOffset DcmTagKey(0x0020, 0x930d) #define DCM_PlanePositionVolumeSequence DcmTagKey(0x0020, 0x930e) #define DCM_PlaneOrientationVolumeSequence DcmTagKey(0x0020, 0x930f) #define DCM_TemporalPositionSequence DcmTagKey(0x0020, 0x9310) #define DCM_DimensionOrganizationType DcmTagKey(0x0020, 0x9311) #define DCM_VolumeFrameOfReferenceUID DcmTagKey(0x0020, 0x9312) #define DCM_TableFrameOfReferenceUID DcmTagKey(0x0020, 0x9313) #define DCM_DimensionDescriptionLabel DcmTagKey(0x0020, 0x9421) #define DCM_PatientOrientationInFrameSequence DcmTagKey(0x0020, 0x9450) #define DCM_FrameLabel DcmTagKey(0x0020, 0x9453) #define DCM_AcquisitionIndex DcmTagKey(0x0020, 0x9518) #define DCM_ContributingSOPInstancesReferenceSequence DcmTagKey(0x0020, 0x9529) #define DCM_ReconstructionIndex DcmTagKey(0x0020, 0x9536) #define DCM_LightPathFilterPassThroughWavelength DcmTagKey(0x0022, 0x0001) #define DCM_LightPathFilterPassBand DcmTagKey(0x0022, 0x0002) #define DCM_ImagePathFilterPassThroughWavelength DcmTagKey(0x0022, 0x0003) #define DCM_ImagePathFilterPassBand DcmTagKey(0x0022, 0x0004) #define DCM_PatientEyeMovementCommanded DcmTagKey(0x0022, 0x0005) #define DCM_PatientEyeMovementCommandCodeSequence DcmTagKey(0x0022, 0x0006) #define DCM_SphericalLensPower DcmTagKey(0x0022, 0x0007) #define DCM_CylinderLensPower DcmTagKey(0x0022, 0x0008) #define DCM_CylinderAxis DcmTagKey(0x0022, 0x0009) #define DCM_EmmetropicMagnification DcmTagKey(0x0022, 0x000a) #define DCM_IntraOcularPressure DcmTagKey(0x0022, 0x000b) #define DCM_HorizontalFieldOfView DcmTagKey(0x0022, 0x000c) #define DCM_PupilDilated DcmTagKey(0x0022, 0x000d) #define DCM_DegreeOfDilation DcmTagKey(0x0022, 0x000e) #define DCM_StereoBaselineAngle DcmTagKey(0x0022, 0x0010) #define DCM_StereoBaselineDisplacement DcmTagKey(0x0022, 0x0011) #define DCM_StereoHorizontalPixelOffset DcmTagKey(0x0022, 0x0012) #define DCM_StereoVerticalPixelOffset DcmTagKey(0x0022, 0x0013) #define DCM_StereoRotation DcmTagKey(0x0022, 0x0014) #define DCM_AcquisitionDeviceTypeCodeSequence DcmTagKey(0x0022, 0x0015) #define DCM_IlluminationTypeCodeSequence DcmTagKey(0x0022, 0x0016) #define DCM_LightPathFilterTypeStackCodeSequence DcmTagKey(0x0022, 0x0017) #define DCM_ImagePathFilterTypeStackCodeSequence DcmTagKey(0x0022, 0x0018) #define DCM_LensesCodeSequence DcmTagKey(0x0022, 0x0019) #define DCM_ChannelDescriptionCodeSequence DcmTagKey(0x0022, 0x001a) #define DCM_RefractiveStateSequence DcmTagKey(0x0022, 0x001b) #define DCM_MydriaticAgentCodeSequence DcmTagKey(0x0022, 0x001c) #define DCM_RelativeImagePositionCodeSequence DcmTagKey(0x0022, 0x001d) #define DCM_StereoPairsSequence DcmTagKey(0x0022, 0x0020) #define DCM_LeftImageSequence DcmTagKey(0x0022, 0x0021) #define DCM_RightImageSequence DcmTagKey(0x0022, 0x0022) #define DCM_AxialLengthOfTheEye DcmTagKey(0x0022, 0x0030) #define DCM_OphthalmicFrameLocationSequence DcmTagKey(0x0022, 0x0031) #define DCM_ReferenceCoordinates DcmTagKey(0x0022, 0x0032) #define DCM_DepthSpatialResolution DcmTagKey(0x0022, 0x0035) #define DCM_MaximumDepthDistortion DcmTagKey(0x0022, 0x0036) #define DCM_AlongScanSpatialResolution DcmTagKey(0x0022, 0x0037) #define DCM_MaximumAlongScanDistortion DcmTagKey(0x0022, 0x0038) #define DCM_OphthalmicImageOrientation DcmTagKey(0x0022, 0x0039) #define DCM_DepthOfTransverseImage DcmTagKey(0x0022, 0x0041) #define DCM_MydriaticAgentConcentrationUnitsSequence DcmTagKey(0x0022, 0x0042) #define DCM_AcrossScanSpatialResolution DcmTagKey(0x0022, 0x0048) #define DCM_MaximumAcrossScanDistortion DcmTagKey(0x0022, 0x0049) #define DCM_MydriaticAgentConcentration DcmTagKey(0x0022, 0x004e) #define DCM_IlluminationWaveLength DcmTagKey(0x0022, 0x0055) #define DCM_IlluminationPower DcmTagKey(0x0022, 0x0056) #define DCM_IlluminationBandwidth DcmTagKey(0x0022, 0x0057) #define DCM_MydriaticAgentSequence DcmTagKey(0x0022, 0x0058) #define DCM_OphthalmicAxialMeasurementsRightEyeSequence DcmTagKey(0x0022, 0x1007) #define DCM_OphthalmicAxialMeasurementsLeftEyeSequence DcmTagKey(0x0022, 0x1008) #define DCM_OphthalmicAxialMeasurementsDeviceType DcmTagKey(0x0022, 0x1009) #define DCM_OphthalmicAxialLengthMeasurementsType DcmTagKey(0x0022, 0x1010) #define DCM_OphthalmicAxialLengthSequence DcmTagKey(0x0022, 0x1012) #define DCM_OphthalmicAxialLength DcmTagKey(0x0022, 0x1019) #define DCM_LensStatusCodeSequence DcmTagKey(0x0022, 0x1024) #define DCM_VitreousStatusCodeSequence DcmTagKey(0x0022, 0x1025) #define DCM_IOLFormulaCodeSequence DcmTagKey(0x0022, 0x1028) #define DCM_IOLFormulaDetail DcmTagKey(0x0022, 0x1029) #define DCM_KeratometerIndex DcmTagKey(0x0022, 0x1033) #define DCM_SourceofOphthalmicAxialLengthCodeSequence DcmTagKey(0x0022, 0x1035) #define DCM_TargetRefraction DcmTagKey(0x0022, 0x1037) #define DCM_RefractiveProcedureOccurred DcmTagKey(0x0022, 0x1039) #define DCM_RefractiveSurgeryTypeCodeSequence DcmTagKey(0x0022, 0x1040) #define DCM_OphthalmicUltrasoundMethodCodeSequence DcmTagKey(0x0022, 0x1044) #define DCM_OphthalmicAxialLengthMeasurementsSequence DcmTagKey(0x0022, 0x1050) #define DCM_IOLPower DcmTagKey(0x0022, 0x1053) #define DCM_PredictedRefractiveError DcmTagKey(0x0022, 0x1054) #define DCM_OphthalmicAxialLengthVelocity DcmTagKey(0x0022, 0x1059) #define DCM_LensStatusDescription DcmTagKey(0x0022, 0x1065) #define DCM_VitreousStatusDescription DcmTagKey(0x0022, 0x1066) #define DCM_IOLPowerSequence DcmTagKey(0x0022, 0x1090) #define DCM_LensConstantSequence DcmTagKey(0x0022, 0x1092) #define DCM_IOLManufacturer DcmTagKey(0x0022, 0x1093) #define DCM_ImplantName DcmTagKey(0x0022, 0x1095) #define DCM_KeratometryMeasurementTypeCodeSequence DcmTagKey(0x0022, 0x1096) #define DCM_ImplantPartNumber DcmTagKey(0x0022, 0x1097) #define DCM_ReferencedOphthalmicAxialMeasurementsSequence DcmTagKey(0x0022, 0x1100) #define DCM_OphthalmicAxialLengthMeasurementsSegmentNameCodeSequence DcmTagKey(0x0022, 0x1101) #define DCM_RefractiveErrorBeforeRefractiveSurgeryCodeSequence DcmTagKey(0x0022, 0x1103) #define DCM_IOLPowerForExactEmmetropia DcmTagKey(0x0022, 0x1121) #define DCM_IOLPowerForExactTargetRefraction DcmTagKey(0x0022, 0x1122) #define DCM_AnteriorChamberDepthDefinitionCodeSequence DcmTagKey(0x0022, 0x1125) #define DCM_LensThicknessSequence DcmTagKey(0x0022, 0x1127) #define DCM_AnteriorChamberDepthSequence DcmTagKey(0x0022, 0x1128) #define DCM_LensThickness DcmTagKey(0x0022, 0x1130) #define DCM_AnteriorChamberDepth DcmTagKey(0x0022, 0x1131) #define DCM_SourceofLensThicknessDataCodeSequence DcmTagKey(0x0022, 0x1132) #define DCM_SourceofAnteriorChamberDepthDataCodeSequence DcmTagKey(0x0022, 0x1133) #define DCM_SourceofRefractiveMeasurementsSequence DcmTagKey(0x0022, 0x1134) #define DCM_SourceofRefractiveMeasurementsCodeSequence DcmTagKey(0x0022, 0x1135) #define DCM_OphthalmicAxialLengthMeasurementModified DcmTagKey(0x0022, 0x1140) #define DCM_OphthalmicAxialLengthDataSourceCodeSequence DcmTagKey(0x0022, 0x1150) #define DCM_SignaltoNoiseRatio DcmTagKey(0x0022, 0x1155) #define DCM_OphthalmicAxialLengthDataSourceDescription DcmTagKey(0x0022, 0x1159) #define DCM_OphthalmicAxialLengthMeasurementsTotalLengthSequence DcmTagKey(0x0022, 0x1210) #define DCM_OphthalmicAxialLengthMeasurementsSegmentalLengthSequence DcmTagKey(0x0022, 0x1211) #define DCM_OphthalmicAxialLengthMeasurementsLengthSummationSequence DcmTagKey(0x0022, 0x1212) #define DCM_UltrasoundOphthalmicAxialLengthMeasurementsSequence DcmTagKey(0x0022, 0x1220) #define DCM_OpticalOphthalmicAxialLengthMeasurementsSequence DcmTagKey(0x0022, 0x1225) #define DCM_UltrasoundSelectedOphthalmicAxialLengthSequence DcmTagKey(0x0022, 0x1230) #define DCM_OphthalmicAxialLengthSelectionMethodCodeSequence DcmTagKey(0x0022, 0x1250) #define DCM_OpticalSelectedOphthalmicAxialLengthSequence DcmTagKey(0x0022, 0x1255) #define DCM_SelectedSegmentalOphthalmicAxialLengthSequence DcmTagKey(0x0022, 0x1257) #define DCM_SelectedTotalOphthalmicAxialLengthSequence DcmTagKey(0x0022, 0x1260) #define DCM_OphthalmicAxialLengthQualityMetricSequence DcmTagKey(0x0022, 0x1262) #define DCM_OphthalmicAxialLengthQualityMetricTypeCodeSequence DcmTagKey(0x0022, 0x1265) #define DCM_IntraocularLensCalculationsRightEyeSequence DcmTagKey(0x0022, 0x1300) #define DCM_IntraocularLensCalculationsLeftEyeSequence DcmTagKey(0x0022, 0x1310) #define DCM_ReferencedOphthalmicAxialLengthMeasurementQCImageSequence DcmTagKey(0x0022, 0x1330) #define DCM_VisualFieldHorizontalExtent DcmTagKey(0x0024, 0x0010) #define DCM_VisualFieldVerticalExtent DcmTagKey(0x0024, 0x0011) #define DCM_VisualFieldShape DcmTagKey(0x0024, 0x0012) #define DCM_ScreeningTestModeCodeSequence DcmTagKey(0x0024, 0x0016) #define DCM_MaximumStimulusLuminance DcmTagKey(0x0024, 0x0018) #define DCM_BackgroundLuminance DcmTagKey(0x0024, 0x0020) #define DCM_StimulusColorCodeSequence DcmTagKey(0x0024, 0x0021) #define DCM_BackgroundIlluminationColorCodeSequence DcmTagKey(0x0024, 0x0024) #define DCM_StimulusArea DcmTagKey(0x0024, 0x0025) #define DCM_StimulusPresentationTime DcmTagKey(0x0024, 0x0028) #define DCM_FixationSequence DcmTagKey(0x0024, 0x0032) #define DCM_FixationMonitoringCodeSequence DcmTagKey(0x0024, 0x0033) #define DCM_VisualFieldCatchTrialSequence DcmTagKey(0x0024, 0x0034) #define DCM_FixationCheckedQuantity DcmTagKey(0x0024, 0x0035) #define DCM_PatientNotProperlyFixatedQuantity DcmTagKey(0x0024, 0x0036) #define DCM_PresentedVisualStimuliDataFlag DcmTagKey(0x0024, 0x0037) #define DCM_NumberOfVisualStimuli DcmTagKey(0x0024, 0x0038) #define DCM_ExcessiveFixationLossesDataFlag DcmTagKey(0x0024, 0x0039) #define DCM_ExcessiveFixationLosses DcmTagKey(0x0024, 0x0040) #define DCM_StimuliRetestingQuantity DcmTagKey(0x0024, 0x0042) #define DCM_CommentsOnPatientPerformanceOfVisualField DcmTagKey(0x0024, 0x0044) #define DCM_FalseNegativesEstimateFlag DcmTagKey(0x0024, 0x0045) #define DCM_FalseNegativesEstimate DcmTagKey(0x0024, 0x0046) #define DCM_NegativeCatchTrialsQuantity DcmTagKey(0x0024, 0x0048) #define DCM_FalseNegativesQuantity DcmTagKey(0x0024, 0x0050) #define DCM_ExcessiveFalseNegativesDataFlag DcmTagKey(0x0024, 0x0051) #define DCM_ExcessiveFalseNegatives DcmTagKey(0x0024, 0x0052) #define DCM_FalsePositivesEstimateFlag DcmTagKey(0x0024, 0x0053) #define DCM_FalsePositivesEstimate DcmTagKey(0x0024, 0x0054) #define DCM_CatchTrialsDataFlag DcmTagKey(0x0024, 0x0055) #define DCM_PositiveCatchTrialsQuantity DcmTagKey(0x0024, 0x0056) #define DCM_TestPointNormalsDataFlag DcmTagKey(0x0024, 0x0057) #define DCM_TestPointNormalsSequence DcmTagKey(0x0024, 0x0058) #define DCM_GlobalDeviationProbabilityNormalsFlag DcmTagKey(0x0024, 0x0059) #define DCM_FalsePositivesQuantity DcmTagKey(0x0024, 0x0060) #define DCM_ExcessiveFalsePositivesDataFlag DcmTagKey(0x0024, 0x0061) #define DCM_ExcessiveFalsePositives DcmTagKey(0x0024, 0x0062) #define DCM_VisualFieldTestNormalsFlag DcmTagKey(0x0024, 0x0063) #define DCM_ResultsNormalsSequence DcmTagKey(0x0024, 0x0064) #define DCM_AgeCorrectedSensitivityDeviationAlgorithmSequence DcmTagKey(0x0024, 0x0065) #define DCM_GlobalDeviationFromNormal DcmTagKey(0x0024, 0x0066) #define DCM_GeneralizedDefectSensitivityDeviationAlgorithmSequence DcmTagKey(0x0024, 0x0067) #define DCM_LocalizedDeviationfromNormal DcmTagKey(0x0024, 0x0068) #define DCM_PatientReliabilityIndicator DcmTagKey(0x0024, 0x0069) #define DCM_VisualFieldMeanSensitivity DcmTagKey(0x0024, 0x0070) #define DCM_GlobalDeviationProbability DcmTagKey(0x0024, 0x0071) #define DCM_LocalDeviationProbabilityNormalsFlag DcmTagKey(0x0024, 0x0072) #define DCM_LocalizedDeviationProbability DcmTagKey(0x0024, 0x0073) #define DCM_ShortTermFluctuationCalculated DcmTagKey(0x0024, 0x0074) #define DCM_ShortTermFluctuation DcmTagKey(0x0024, 0x0075) #define DCM_ShortTermFluctuationProbabilityCalculated DcmTagKey(0x0024, 0x0076) #define DCM_ShortTermFluctuationProbability DcmTagKey(0x0024, 0x0077) #define DCM_CorrectedLocalizedDeviationFromNormalCalculated DcmTagKey(0x0024, 0x0078) #define DCM_CorrectedLocalizedDeviationFromNormal DcmTagKey(0x0024, 0x0079) #define DCM_CorrectedLocalizedDeviationFromNormalProbabilityCalculated DcmTagKey(0x0024, 0x0080) #define DCM_CorrectedLocalizedDeviationFromNormalProbability DcmTagKey(0x0024, 0x0081) #define DCM_GlobalDeviationProbabilitySequence DcmTagKey(0x0024, 0x0083) #define DCM_LocalizedDeviationProbabilitySequence DcmTagKey(0x0024, 0x0085) #define DCM_FovealSensitivityMeasured DcmTagKey(0x0024, 0x0086) #define DCM_FovealSensitivity DcmTagKey(0x0024, 0x0087) #define DCM_VisualFieldTestDuration DcmTagKey(0x0024, 0x0088) #define DCM_VisualFieldTestPointSequence DcmTagKey(0x0024, 0x0089) #define DCM_VisualFieldTestPointXCoordinate DcmTagKey(0x0024, 0x0090) #define DCM_VisualFieldTestPointYCoordinate DcmTagKey(0x0024, 0x0091) #define DCM_AgeCorrectedSensitivityDeviationValue DcmTagKey(0x0024, 0x0092) #define DCM_StimulusResults DcmTagKey(0x0024, 0x0093) #define DCM_SensitivityValue DcmTagKey(0x0024, 0x0094) #define DCM_RetestStimulusSeen DcmTagKey(0x0024, 0x0095) #define DCM_RetestSensitivityValue DcmTagKey(0x0024, 0x0096) #define DCM_VisualFieldTestPointNormalsSequence DcmTagKey(0x0024, 0x0097) #define DCM_QuantifiedDefect DcmTagKey(0x0024, 0x0098) #define DCM_GeneralizedDefectCorrectedSensitivityDeviationFlag DcmTagKey(0x0024, 0x0102) #define DCM_GeneralizedDefectCorrectedSensitivityDeviationValue DcmTagKey(0x0024, 0x0103) #define DCM_GeneralizedDefectCorrectedSensitivityDeviationProbabilityValue DcmTagKey(0x0024, 0x0104) #define DCM_MinimumSensitivityValue DcmTagKey(0x0024, 0x0105) #define DCM_BlindSpotLocalized DcmTagKey(0x0024, 0x0106) #define DCM_BlindSpotXCoordinate DcmTagKey(0x0024, 0x0107) #define DCM_BlindSpotYCoordinate DcmTagKey(0x0024, 0x0108) #define DCM_VisualAcuityMeasurementSequence DcmTagKey(0x0024, 0x0110) #define DCM_RefractiveParametersUsedOnPatientSequence DcmTagKey(0x0024, 0x0112) #define DCM_MeasurementLaterality DcmTagKey(0x0024, 0x0113) #define DCM_OphthalmicPatientClinicalInformationLeftEyeSequence DcmTagKey(0x0024, 0x0114) #define DCM_OphthalmicPatientClinicalInformationRightEyeSequence DcmTagKey(0x0024, 0x0115) #define DCM_FovealPointNormativeDataFlag DcmTagKey(0x0024, 0x0117) #define DCM_FovealPointProbabilityValue DcmTagKey(0x0024, 0x0118) #define DCM_ScreeningBaselineMeasured DcmTagKey(0x0024, 0x0120) #define DCM_ScreeningBaselineMeasuredSequence DcmTagKey(0x0024, 0x0122) #define DCM_ScreeningBaselineType DcmTagKey(0x0024, 0x0124) #define DCM_ScreeningBaselineValue DcmTagKey(0x0024, 0x0126) #define DCM_AlgorithmSource DcmTagKey(0x0024, 0x0202) #define DCM_DataSetName DcmTagKey(0x0024, 0x0306) #define DCM_DataSetVersion DcmTagKey(0x0024, 0x0307) #define DCM_DataSetSource DcmTagKey(0x0024, 0x0308) #define DCM_DataSetDescription DcmTagKey(0x0024, 0x0309) #define DCM_VisualFieldTestReliabilityGlobalIndexSequence DcmTagKey(0x0024, 0x0317) #define DCM_VisualFieldGlobalResultsIndexSequence DcmTagKey(0x0024, 0x0320) #define DCM_DataObservationSequence DcmTagKey(0x0024, 0x0325) #define DCM_IndexNormalsFlag DcmTagKey(0x0024, 0x0338) #define DCM_IndexProbability DcmTagKey(0x0024, 0x0341) #define DCM_IndexProbabilitySequence DcmTagKey(0x0024, 0x0344) #define DCM_SamplesPerPixel DcmTagKey(0x0028, 0x0002) #define DCM_SamplesPerPixelUsed DcmTagKey(0x0028, 0x0003) #define DCM_PhotometricInterpretation DcmTagKey(0x0028, 0x0004) #define DCM_ACR_NEMA_ImageDimensions DcmTagKey(0x0028, 0x0005) #define DCM_PlanarConfiguration DcmTagKey(0x0028, 0x0006) #define DCM_NumberOfFrames DcmTagKey(0x0028, 0x0008) #define DCM_FrameIncrementPointer DcmTagKey(0x0028, 0x0009) #define DCM_FrameDimensionPointer DcmTagKey(0x0028, 0x000a) #define DCM_Rows DcmTagKey(0x0028, 0x0010) #define DCM_Columns DcmTagKey(0x0028, 0x0011) #define DCM_RETIRED_Planes DcmTagKey(0x0028, 0x0012) #define DCM_UltrasoundColorDataPresent DcmTagKey(0x0028, 0x0014) #define DCM_PixelSpacing DcmTagKey(0x0028, 0x0030) #define DCM_ZoomFactor DcmTagKey(0x0028, 0x0031) #define DCM_ZoomCenter DcmTagKey(0x0028, 0x0032) #define DCM_PixelAspectRatio DcmTagKey(0x0028, 0x0034) #define DCM_ACR_NEMA_ImageFormat DcmTagKey(0x0028, 0x0040) #define DCM_ACR_NEMA_ManipulatedImage DcmTagKey(0x0028, 0x0050) #define DCM_CorrectedImage DcmTagKey(0x0028, 0x0051) #define DCM_ACR_NEMA_2C_CompressionRecognitionCode DcmTagKey(0x0028, 0x005f) #define DCM_ACR_NEMA_CompressionCode DcmTagKey(0x0028, 0x0060) #define DCM_ACR_NEMA_2C_CompressionOriginator DcmTagKey(0x0028, 0x0061) #define DCM_ACR_NEMA_2C_CompressionLabel DcmTagKey(0x0028, 0x0062) #define DCM_ACR_NEMA_2C_CompressionDescription DcmTagKey(0x0028, 0x0063) #define DCM_ACR_NEMA_2C_CompressionSequence DcmTagKey(0x0028, 0x0065) #define DCM_ACR_NEMA_2C_CompressionStepPointers DcmTagKey(0x0028, 0x0066) #define DCM_ACR_NEMA_2C_RepeatInterval DcmTagKey(0x0028, 0x0068) #define DCM_ACR_NEMA_2C_BitsGrouped DcmTagKey(0x0028, 0x0069) #define DCM_ACR_NEMA_2C_PerimeterTable DcmTagKey(0x0028, 0x0070) #define DCM_ACR_NEMA_2C_PerimeterValue DcmTagKey(0x0028, 0x0071) #define DCM_ACR_NEMA_2C_PredictorRows DcmTagKey(0x0028, 0x0080) #define DCM_ACR_NEMA_2C_PredictorColumns DcmTagKey(0x0028, 0x0081) #define DCM_ACR_NEMA_2C_PredictorConstants DcmTagKey(0x0028, 0x0082) #define DCM_ACR_NEMA_2C_BlockedPixels DcmTagKey(0x0028, 0x0090) #define DCM_ACR_NEMA_2C_BlockRows DcmTagKey(0x0028, 0x0091) #define DCM_ACR_NEMA_2C_BlockColumns DcmTagKey(0x0028, 0x0092) #define DCM_ACR_NEMA_2C_RowOverlap DcmTagKey(0x0028, 0x0093) #define DCM_ACR_NEMA_2C_ColumnOverlap DcmTagKey(0x0028, 0x0094) #define DCM_BitsAllocated DcmTagKey(0x0028, 0x0100) #define DCM_BitsStored DcmTagKey(0x0028, 0x0101) #define DCM_HighBit DcmTagKey(0x0028, 0x0102) #define DCM_PixelRepresentation DcmTagKey(0x0028, 0x0103) #define DCM_ACR_NEMA_SmallestValidPixelValue DcmTagKey(0x0028, 0x0104) #define DCM_ACR_NEMA_LargestValidPixelValue DcmTagKey(0x0028, 0x0105) #define DCM_SmallestImagePixelValue DcmTagKey(0x0028, 0x0106) #define DCM_LargestImagePixelValue DcmTagKey(0x0028, 0x0107) #define DCM_SmallestPixelValueInSeries DcmTagKey(0x0028, 0x0108) #define DCM_LargestPixelValueInSeries DcmTagKey(0x0028, 0x0109) #define DCM_RETIRED_SmallestImagePixelValueInPlane DcmTagKey(0x0028, 0x0110) #define DCM_RETIRED_LargestImagePixelValueInPlane DcmTagKey(0x0028, 0x0111) #define DCM_PixelPaddingValue DcmTagKey(0x0028, 0x0120) #define DCM_PixelPaddingRangeLimit DcmTagKey(0x0028, 0x0121) #define DCM_ACR_NEMA_ImageLocation DcmTagKey(0x0028, 0x0200) #define DCM_QualityControlImage DcmTagKey(0x0028, 0x0300) #define DCM_BurnedInAnnotation DcmTagKey(0x0028, 0x0301) #define DCM_ACR_NEMA_2C_TransformLabel DcmTagKey(0x0028, 0x0400) #define DCM_ACR_NEMA_2C_TransformVersionNumber DcmTagKey(0x0028, 0x0401) #define DCM_ACR_NEMA_2C_NumberOfTransformSteps DcmTagKey(0x0028, 0x0402) #define DCM_ACR_NEMA_2C_SequenceOfCompressedData DcmTagKey(0x0028, 0x0403) #define DCM_ACR_NEMA_2C_DetailsOfCoefficients DcmTagKey(0x0028, 0x0404) #define DCM_ACR_NEMA_2C_RowsForNthOrderCoefficients DcmTagKey(0x0028, 0x0410) #define DCM_ACR_NEMA_2C_ColumnsForNthOrderCoefficients DcmTagKey(0x0028, 0x0411) #define DCM_ACR_NEMA_2C_CoefficientCoding DcmTagKey(0x0028, 0x0412) #define DCM_ACR_NEMA_2C_CoefficientCodingPointers DcmTagKey(0x0028, 0x0413) #define DCM_ACR_NEMA_2C_DCTLabel DcmTagKey(0x0028, 0x0700) #define DCM_ACR_NEMA_2C_DataBlockDescription DcmTagKey(0x0028, 0x0701) #define DCM_ACR_NEMA_2C_DataBlock DcmTagKey(0x0028, 0x0702) #define DCM_ACR_NEMA_2C_NormalizationFactorFormat DcmTagKey(0x0028, 0x0710) #define DCM_ACR_NEMA_2C_ZonalMapNumberFormat DcmTagKey(0x0028, 0x0720) #define DCM_ACR_NEMA_2C_ZonalMapLocation DcmTagKey(0x0028, 0x0721) #define DCM_ACR_NEMA_2C_ZonalMapFormat DcmTagKey(0x0028, 0x0722) #define DCM_ACR_NEMA_2C_AdaptiveMapFormat DcmTagKey(0x0028, 0x0730) #define DCM_ACR_NEMA_2C_CodeNumberFormat DcmTagKey(0x0028, 0x0740) #define DCM_ACR_NEMA_2C_CodeLabel DcmTagKey(0x0028, 0x0800) #define DCM_ACR_NEMA_2C_NumberOfTables DcmTagKey(0x0028, 0x0802) #define DCM_ACR_NEMA_2C_CodeTableLocation DcmTagKey(0x0028, 0x0803) #define DCM_ACR_NEMA_2C_BitsForCodeWord DcmTagKey(0x0028, 0x0804) #define DCM_ACR_NEMA_2C_ImageDataLocation DcmTagKey(0x0028, 0x0808) #define DCM_PixelSpacingCalibrationType DcmTagKey(0x0028, 0x0a02) #define DCM_PixelSpacingCalibrationDescription DcmTagKey(0x0028, 0x0a04) #define DCM_PixelIntensityRelationship DcmTagKey(0x0028, 0x1040) #define DCM_PixelIntensityRelationshipSign DcmTagKey(0x0028, 0x1041) #define DCM_WindowCenter DcmTagKey(0x0028, 0x1050) #define DCM_WindowWidth DcmTagKey(0x0028, 0x1051) #define DCM_RescaleIntercept DcmTagKey(0x0028, 0x1052) #define DCM_RescaleSlope DcmTagKey(0x0028, 0x1053) #define DCM_RescaleType DcmTagKey(0x0028, 0x1054) #define DCM_WindowCenterWidthExplanation DcmTagKey(0x0028, 0x1055) #define DCM_VOILUTFunction DcmTagKey(0x0028, 0x1056) #define DCM_ACR_NEMA_GrayScale DcmTagKey(0x0028, 0x1080) #define DCM_RecommendedViewingMode DcmTagKey(0x0028, 0x1090) #define DCM_ACR_NEMA_GrayLookupTableDescriptor DcmTagKey(0x0028, 0x1100) #define DCM_RedPaletteColorLookupTableDescriptor DcmTagKey(0x0028, 0x1101) #define DCM_GreenPaletteColorLookupTableDescriptor DcmTagKey(0x0028, 0x1102) #define DCM_BluePaletteColorLookupTableDescriptor DcmTagKey(0x0028, 0x1103) #define DCM_AlphaPaletteColorLookupTableDescriptor DcmTagKey(0x0028, 0x1104) #define DCM_RETIRED_LargeRedPaletteColorLookupTableDescriptor DcmTagKey(0x0028, 0x1111) #define DCM_RETIRED_LargeGreenPaletteColorLookupTableDescriptor DcmTagKey(0x0028, 0x1112) #define DCM_RETIRED_LargeBluePaletteColorLookupTableDescriptor DcmTagKey(0x0028, 0x1113) #define DCM_PaletteColorLookupTableUID DcmTagKey(0x0028, 0x1199) #define DCM_ACR_NEMA_GrayLookupTableData DcmTagKey(0x0028, 0x1200) #define DCM_RedPaletteColorLookupTableData DcmTagKey(0x0028, 0x1201) #define DCM_GreenPaletteColorLookupTableData DcmTagKey(0x0028, 0x1202) #define DCM_BluePaletteColorLookupTableData DcmTagKey(0x0028, 0x1203) #define DCM_AlphaPaletteColorLookupTableData DcmTagKey(0x0028, 0x1204) #define DCM_RETIRED_LargeRedPaletteColorLookupTableData DcmTagKey(0x0028, 0x1211) #define DCM_RETIRED_LargeGreenPaletteColorLookupTableData DcmTagKey(0x0028, 0x1212) #define DCM_RETIRED_LargeBluePaletteColorLookupTableData DcmTagKey(0x0028, 0x1213) #define DCM_RETIRED_LargePaletteColorLookupTableUID DcmTagKey(0x0028, 0x1214) #define DCM_SegmentedRedPaletteColorLookupTableData DcmTagKey(0x0028, 0x1221) #define DCM_SegmentedGreenPaletteColorLookupTableData DcmTagKey(0x0028, 0x1222) #define DCM_SegmentedBluePaletteColorLookupTableData DcmTagKey(0x0028, 0x1223) #define DCM_BreastImplantPresent DcmTagKey(0x0028, 0x1300) #define DCM_PartialView DcmTagKey(0x0028, 0x1350) #define DCM_PartialViewDescription DcmTagKey(0x0028, 0x1351) #define DCM_PartialViewCodeSequence DcmTagKey(0x0028, 0x1352) #define DCM_SpatialLocationsPreserved DcmTagKey(0x0028, 0x135a) #define DCM_DataFrameAssignmentSequence DcmTagKey(0x0028, 0x1401) #define DCM_DataPathAssignment DcmTagKey(0x0028, 0x1402) #define DCM_BitsMappedToColorLookupTable DcmTagKey(0x0028, 0x1403) #define DCM_BlendingLUT1Sequence DcmTagKey(0x0028, 0x1404) #define DCM_BlendingLUT1TransferFunction DcmTagKey(0x0028, 0x1405) #define DCM_BlendingWeightConstant DcmTagKey(0x0028, 0x1406) #define DCM_BlendingLookupTableDescriptor DcmTagKey(0x0028, 0x1407) #define DCM_BlendingLookupTableData DcmTagKey(0x0028, 0x1408) #define DCM_EnhancedPaletteColorLookupTableSequence DcmTagKey(0x0028, 0x140b) #define DCM_BlendingLUT2Sequence DcmTagKey(0x0028, 0x140c) #define DCM_BlendingLUT2TransferFunction DcmTagKey(0x0028, 0x140d) #define DCM_DataPathID DcmTagKey(0x0028, 0x140e) #define DCM_RGBLUTTransferFunction DcmTagKey(0x0028, 0x140f) #define DCM_AlphaLUTTransferFunction DcmTagKey(0x0028, 0x1410) #define DCM_ICCProfile DcmTagKey(0x0028, 0x2000) #define DCM_LossyImageCompression DcmTagKey(0x0028, 0x2110) #define DCM_LossyImageCompressionRatio DcmTagKey(0x0028, 0x2112) #define DCM_LossyImageCompressionMethod DcmTagKey(0x0028, 0x2114) #define DCM_ModalityLUTSequence DcmTagKey(0x0028, 0x3000) #define DCM_LUTDescriptor DcmTagKey(0x0028, 0x3002) #define DCM_LUTExplanation DcmTagKey(0x0028, 0x3003) #define DCM_ModalityLUTType DcmTagKey(0x0028, 0x3004) #define DCM_LUTData DcmTagKey(0x0028, 0x3006) #define DCM_VOILUTSequence DcmTagKey(0x0028, 0x3010) #define DCM_SoftcopyVOILUTSequence DcmTagKey(0x0028, 0x3110) #define DCM_ACR_NEMA_ImagePresentationComments DcmTagKey(0x0028, 0x4000) #define DCM_RETIRED_BiPlaneAcquisitionSequence DcmTagKey(0x0028, 0x5000) #define DCM_RepresentativeFrameNumber DcmTagKey(0x0028, 0x6010) #define DCM_FrameNumbersOfInterest DcmTagKey(0x0028, 0x6020) #define DCM_FrameOfInterestDescription DcmTagKey(0x0028, 0x6022) #define DCM_FrameOfInterestType DcmTagKey(0x0028, 0x6023) #define DCM_RETIRED_MaskPointers DcmTagKey(0x0028, 0x6030) #define DCM_RWavePointer DcmTagKey(0x0028, 0x6040) #define DCM_MaskSubtractionSequence DcmTagKey(0x0028, 0x6100) #define DCM_MaskOperation DcmTagKey(0x0028, 0x6101) #define DCM_ApplicableFrameRange DcmTagKey(0x0028, 0x6102) #define DCM_MaskFrameNumbers DcmTagKey(0x0028, 0x6110) #define DCM_ContrastFrameAveraging DcmTagKey(0x0028, 0x6112) #define DCM_MaskSubPixelShift DcmTagKey(0x0028, 0x6114) #define DCM_TIDOffset DcmTagKey(0x0028, 0x6120) #define DCM_MaskOperationExplanation DcmTagKey(0x0028, 0x6190) #define DCM_PixelDataProviderURL DcmTagKey(0x0028, 0x7fe0) #define DCM_DataPointRows DcmTagKey(0x0028, 0x9001) #define DCM_DataPointColumns DcmTagKey(0x0028, 0x9002) #define DCM_SignalDomainColumns DcmTagKey(0x0028, 0x9003) #define DCM_RETIRED_LargestMonochromePixelValue DcmTagKey(0x0028, 0x9099) #define DCM_DataRepresentation DcmTagKey(0x0028, 0x9108) #define DCM_PixelMeasuresSequence DcmTagKey(0x0028, 0x9110) #define DCM_FrameVOILUTSequence DcmTagKey(0x0028, 0x9132) #define DCM_PixelValueTransformationSequence DcmTagKey(0x0028, 0x9145) #define DCM_SignalDomainRows DcmTagKey(0x0028, 0x9235) #define DCM_DisplayFilterPercentage DcmTagKey(0x0028, 0x9411) #define DCM_FramePixelShiftSequence DcmTagKey(0x0028, 0x9415) #define DCM_SubtractionItemID DcmTagKey(0x0028, 0x9416) #define DCM_PixelIntensityRelationshipLUTSequence DcmTagKey(0x0028, 0x9422) #define DCM_FramePixelDataPropertiesSequence DcmTagKey(0x0028, 0x9443) #define DCM_GeometricalProperties DcmTagKey(0x0028, 0x9444) #define DCM_GeometricMaximumDistortion DcmTagKey(0x0028, 0x9445) #define DCM_ImageProcessingApplied DcmTagKey(0x0028, 0x9446) #define DCM_MaskSelectionMode DcmTagKey(0x0028, 0x9454) #define DCM_LUTFunction DcmTagKey(0x0028, 0x9474) #define DCM_MaskVisibilityPercentage DcmTagKey(0x0028, 0x9478) #define DCM_PixelShiftSequence DcmTagKey(0x0028, 0x9501) #define DCM_RegionPixelShiftSequence DcmTagKey(0x0028, 0x9502) #define DCM_VerticesOfTheRegion DcmTagKey(0x0028, 0x9503) #define DCM_MultiFramePresentationSequence DcmTagKey(0x0028, 0x9505) #define DCM_PixelShiftFrameRange DcmTagKey(0x0028, 0x9506) #define DCM_LUTFrameRange DcmTagKey(0x0028, 0x9507) #define DCM_ImageToEquipmentMappingMatrix DcmTagKey(0x0028, 0x9520) #define DCM_EquipmentCoordinateSystemIdentification DcmTagKey(0x0028, 0x9537) #define DCM_RETIRED_StudyStatusID DcmTagKey(0x0032, 0x000a) #define DCM_RETIRED_StudyPriorityID DcmTagKey(0x0032, 0x000c) #define DCM_RETIRED_StudyIDIssuer DcmTagKey(0x0032, 0x0012) #define DCM_RETIRED_StudyVerifiedDate DcmTagKey(0x0032, 0x0032) #define DCM_RETIRED_StudyVerifiedTime DcmTagKey(0x0032, 0x0033) #define DCM_RETIRED_StudyReadDate DcmTagKey(0x0032, 0x0034) #define DCM_RETIRED_StudyReadTime DcmTagKey(0x0032, 0x0035) #define DCM_RETIRED_ScheduledStudyStartDate DcmTagKey(0x0032, 0x1000) #define DCM_RETIRED_ScheduledStudyStartTime DcmTagKey(0x0032, 0x1001) #define DCM_RETIRED_ScheduledStudyStopDate DcmTagKey(0x0032, 0x1010) #define DCM_RETIRED_ScheduledStudyStopTime DcmTagKey(0x0032, 0x1011) #define DCM_RETIRED_ScheduledStudyLocation DcmTagKey(0x0032, 0x1020) #define DCM_RETIRED_ScheduledStudyLocationAETitle DcmTagKey(0x0032, 0x1021) #define DCM_RETIRED_ReasonForStudy DcmTagKey(0x0032, 0x1030) #define DCM_RequestingPhysicianIdentificationSequence DcmTagKey(0x0032, 0x1031) #define DCM_RequestingPhysician DcmTagKey(0x0032, 0x1032) #define DCM_RequestingService DcmTagKey(0x0032, 0x1033) #define DCM_RequestingServiceCodeSequence DcmTagKey(0x0032, 0x1034) #define DCM_RETIRED_StudyArrivalDate DcmTagKey(0x0032, 0x1040) #define DCM_RETIRED_StudyArrivalTime DcmTagKey(0x0032, 0x1041) #define DCM_RETIRED_StudyCompletionDate DcmTagKey(0x0032, 0x1050) #define DCM_RETIRED_StudyCompletionTime DcmTagKey(0x0032, 0x1051) #define DCM_RETIRED_StudyComponentStatusID DcmTagKey(0x0032, 0x1055) #define DCM_RequestedProcedureDescription DcmTagKey(0x0032, 0x1060) #define DCM_RequestedProcedureCodeSequence DcmTagKey(0x0032, 0x1064) #define DCM_RequestedContrastAgent DcmTagKey(0x0032, 0x1070) #define DCM_RETIRED_StudyComments DcmTagKey(0x0032, 0x4000) #define DCM_ReferencedPatientAliasSequence DcmTagKey(0x0038, 0x0004) #define DCM_VisitStatusID DcmTagKey(0x0038, 0x0008) #define DCM_AdmissionID DcmTagKey(0x0038, 0x0010) #define DCM_RETIRED_IssuerOfAdmissionID DcmTagKey(0x0038, 0x0011) #define DCM_IssuerOfAdmissionIDSequence DcmTagKey(0x0038, 0x0014) #define DCM_RouteOfAdmissions DcmTagKey(0x0038, 0x0016) #define DCM_RETIRED_ScheduledAdmissionDate DcmTagKey(0x0038, 0x001a) #define DCM_RETIRED_ScheduledAdmissionTime DcmTagKey(0x0038, 0x001b) #define DCM_RETIRED_ScheduledDischargeDate DcmTagKey(0x0038, 0x001c) #define DCM_RETIRED_ScheduledDischargeTime DcmTagKey(0x0038, 0x001d) #define DCM_RETIRED_ScheduledPatientInstitutionResidence DcmTagKey(0x0038, 0x001e) #define DCM_AdmittingDate DcmTagKey(0x0038, 0x0020) #define DCM_AdmittingTime DcmTagKey(0x0038, 0x0021) #define DCM_RETIRED_DischargeDate DcmTagKey(0x0038, 0x0030) #define DCM_RETIRED_DischargeTime DcmTagKey(0x0038, 0x0032) #define DCM_RETIRED_DischargeDiagnosisDescription DcmTagKey(0x0038, 0x0040) #define DCM_RETIRED_DischargeDiagnosisCodeSequence DcmTagKey(0x0038, 0x0044) #define DCM_SpecialNeeds DcmTagKey(0x0038, 0x0050) #define DCM_ServiceEpisodeID DcmTagKey(0x0038, 0x0060) #define DCM_RETIRED_IssuerOfServiceEpisodeID DcmTagKey(0x0038, 0x0061) #define DCM_ServiceEpisodeDescription DcmTagKey(0x0038, 0x0062) #define DCM_IssuerOfServiceEpisodeIDSequence DcmTagKey(0x0038, 0x0064) #define DCM_PertinentDocumentsSequence DcmTagKey(0x0038, 0x0100) #define DCM_CurrentPatientLocation DcmTagKey(0x0038, 0x0300) #define DCM_PatientInstitutionResidence DcmTagKey(0x0038, 0x0400) #define DCM_PatientState DcmTagKey(0x0038, 0x0500) #define DCM_PatientClinicalTrialParticipationSequence DcmTagKey(0x0038, 0x0502) #define DCM_VisitComments DcmTagKey(0x0038, 0x4000) #define DCM_WaveformOriginality DcmTagKey(0x003a, 0x0004) #define DCM_NumberOfWaveformChannels DcmTagKey(0x003a, 0x0005) #define DCM_NumberOfWaveformSamples DcmTagKey(0x003a, 0x0010) #define DCM_SamplingFrequency DcmTagKey(0x003a, 0x001a) #define DCM_MultiplexGroupLabel DcmTagKey(0x003a, 0x0020) #define DCM_ChannelDefinitionSequence DcmTagKey(0x003a, 0x0200) #define DCM_WaveformChannelNumber DcmTagKey(0x003a, 0x0202) #define DCM_ChannelLabel DcmTagKey(0x003a, 0x0203) #define DCM_ChannelStatus DcmTagKey(0x003a, 0x0205) #define DCM_ChannelSourceSequence DcmTagKey(0x003a, 0x0208) #define DCM_ChannelSourceModifiersSequence DcmTagKey(0x003a, 0x0209) #define DCM_SourceWaveformSequence DcmTagKey(0x003a, 0x020a) #define DCM_ChannelDerivationDescription DcmTagKey(0x003a, 0x020c) #define DCM_ChannelSensitivity DcmTagKey(0x003a, 0x0210) #define DCM_ChannelSensitivityUnitsSequence DcmTagKey(0x003a, 0x0211) #define DCM_ChannelSensitivityCorrectionFactor DcmTagKey(0x003a, 0x0212) #define DCM_ChannelBaseline DcmTagKey(0x003a, 0x0213) #define DCM_ChannelTimeSkew DcmTagKey(0x003a, 0x0214) #define DCM_ChannelSampleSkew DcmTagKey(0x003a, 0x0215) #define DCM_ChannelOffset DcmTagKey(0x003a, 0x0218) #define DCM_WaveformBitsStored DcmTagKey(0x003a, 0x021a) #define DCM_FilterLowFrequency DcmTagKey(0x003a, 0x0220) #define DCM_FilterHighFrequency DcmTagKey(0x003a, 0x0221) #define DCM_NotchFilterFrequency DcmTagKey(0x003a, 0x0222) #define DCM_NotchFilterBandwidth DcmTagKey(0x003a, 0x0223) #define DCM_WaveformDataDisplayScale DcmTagKey(0x003a, 0x0230) #define DCM_WaveformDisplayBackgroundCIELabValue DcmTagKey(0x003a, 0x0231) #define DCM_WaveformPresentationGroupSequence DcmTagKey(0x003a, 0x0240) #define DCM_PresentationGroupNumber DcmTagKey(0x003a, 0x0241) #define DCM_ChannelDisplaySequence DcmTagKey(0x003a, 0x0242) #define DCM_ChannelRecommendedDisplayCIELabValue DcmTagKey(0x003a, 0x0244) #define DCM_ChannelPosition DcmTagKey(0x003a, 0x0245) #define DCM_DisplayShadingFlag DcmTagKey(0x003a, 0x0246) #define DCM_FractionalChannelDisplayScale DcmTagKey(0x003a, 0x0247) #define DCM_AbsoluteChannelDisplayScale DcmTagKey(0x003a, 0x0248) #define DCM_MultiplexedAudioChannelsDescriptionCodeSequence DcmTagKey(0x003a, 0x0300) #define DCM_ChannelIdentificationCode DcmTagKey(0x003a, 0x0301) #define DCM_ChannelMode DcmTagKey(0x003a, 0x0302) #define DCM_ScheduledStationAETitle DcmTagKey(0x0040, 0x0001) #define DCM_ScheduledProcedureStepStartDate DcmTagKey(0x0040, 0x0002) #define DCM_ScheduledProcedureStepStartTime DcmTagKey(0x0040, 0x0003) #define DCM_ScheduledProcedureStepEndDate DcmTagKey(0x0040, 0x0004) #define DCM_ScheduledProcedureStepEndTime DcmTagKey(0x0040, 0x0005) #define DCM_ScheduledPerformingPhysicianName DcmTagKey(0x0040, 0x0006) #define DCM_ScheduledProcedureStepDescription DcmTagKey(0x0040, 0x0007) #define DCM_ScheduledProtocolCodeSequence DcmTagKey(0x0040, 0x0008) #define DCM_ScheduledProcedureStepID DcmTagKey(0x0040, 0x0009) #define DCM_StageCodeSequence DcmTagKey(0x0040, 0x000a) #define DCM_ScheduledPerformingPhysicianIdentificationSequence DcmTagKey(0x0040, 0x000b) #define DCM_ScheduledStationName DcmTagKey(0x0040, 0x0010) #define DCM_ScheduledProcedureStepLocation DcmTagKey(0x0040, 0x0011) #define DCM_PreMedication DcmTagKey(0x0040, 0x0012) #define DCM_ScheduledProcedureStepStatus DcmTagKey(0x0040, 0x0020) #define DCM_OrderPlacerIdentifierSequence DcmTagKey(0x0040, 0x0026) #define DCM_OrderFillerIdentifierSequence DcmTagKey(0x0040, 0x0027) #define DCM_LocalNamespaceEntityID DcmTagKey(0x0040, 0x0031) #define DCM_UniversalEntityID DcmTagKey(0x0040, 0x0032) #define DCM_UniversalEntityIDType DcmTagKey(0x0040, 0x0033) #define DCM_IdentifierTypeCode DcmTagKey(0x0040, 0x0035) #define DCM_AssigningFacilitySequence DcmTagKey(0x0040, 0x0036) #define DCM_AssigningJurisdictionCodeSequence DcmTagKey(0x0040, 0x0039) #define DCM_AssigningAgencyOrDepartmentCodeSequence DcmTagKey(0x0040, 0x003a) #define DCM_ScheduledProcedureStepSequence DcmTagKey(0x0040, 0x0100) #define DCM_ReferencedNonImageCompositeSOPInstanceSequence DcmTagKey(0x0040, 0x0220) #define DCM_PerformedStationAETitle DcmTagKey(0x0040, 0x0241) #define DCM_PerformedStationName DcmTagKey(0x0040, 0x0242) #define DCM_PerformedLocation DcmTagKey(0x0040, 0x0243) #define DCM_PerformedProcedureStepStartDate DcmTagKey(0x0040, 0x0244) #define DCM_PerformedProcedureStepStartTime DcmTagKey(0x0040, 0x0245) #define DCM_PerformedProcedureStepEndDate DcmTagKey(0x0040, 0x0250) #define DCM_PerformedProcedureStepEndTime DcmTagKey(0x0040, 0x0251) #define DCM_PerformedProcedureStepStatus DcmTagKey(0x0040, 0x0252) #define DCM_PerformedProcedureStepID DcmTagKey(0x0040, 0x0253) #define DCM_PerformedProcedureStepDescription DcmTagKey(0x0040, 0x0254) #define DCM_PerformedProcedureTypeDescription DcmTagKey(0x0040, 0x0255) #define DCM_PerformedProtocolCodeSequence DcmTagKey(0x0040, 0x0260) #define DCM_PerformedProtocolType DcmTagKey(0x0040, 0x0261) #define DCM_ScheduledStepAttributesSequence DcmTagKey(0x0040, 0x0270) #define DCM_RequestAttributesSequence DcmTagKey(0x0040, 0x0275) #define DCM_CommentsOnThePerformedProcedureStep DcmTagKey(0x0040, 0x0280) #define DCM_PerformedProcedureStepDiscontinuationReasonCodeSequence DcmTagKey(0x0040, 0x0281) #define DCM_QuantitySequence DcmTagKey(0x0040, 0x0293) #define DCM_Quantity DcmTagKey(0x0040, 0x0294) #define DCM_MeasuringUnitsSequence DcmTagKey(0x0040, 0x0295) #define DCM_BillingItemSequence DcmTagKey(0x0040, 0x0296) #define DCM_TotalTimeOfFluoroscopy DcmTagKey(0x0040, 0x0300) #define DCM_TotalNumberOfExposures DcmTagKey(0x0040, 0x0301) #define DCM_EntranceDose DcmTagKey(0x0040, 0x0302) #define DCM_ExposedArea DcmTagKey(0x0040, 0x0303) #define DCM_DistanceSourceToEntrance DcmTagKey(0x0040, 0x0306) #define DCM_RETIRED_DistanceSourceToSupport DcmTagKey(0x0040, 0x0307) #define DCM_ExposureDoseSequence DcmTagKey(0x0040, 0x030e) #define DCM_CommentsOnRadiationDose DcmTagKey(0x0040, 0x0310) #define DCM_XRayOutput DcmTagKey(0x0040, 0x0312) #define DCM_HalfValueLayer DcmTagKey(0x0040, 0x0314) #define DCM_OrganDose DcmTagKey(0x0040, 0x0316) #define DCM_OrganExposed DcmTagKey(0x0040, 0x0318) #define DCM_BillingProcedureStepSequence DcmTagKey(0x0040, 0x0320) #define DCM_FilmConsumptionSequence DcmTagKey(0x0040, 0x0321) #define DCM_BillingSuppliesAndDevicesSequence DcmTagKey(0x0040, 0x0324) #define DCM_RETIRED_ReferencedProcedureStepSequence DcmTagKey(0x0040, 0x0330) #define DCM_PerformedSeriesSequence DcmTagKey(0x0040, 0x0340) #define DCM_CommentsOnTheScheduledProcedureStep DcmTagKey(0x0040, 0x0400) #define DCM_ProtocolContextSequence DcmTagKey(0x0040, 0x0440) #define DCM_ContentItemModifierSequence DcmTagKey(0x0040, 0x0441) #define DCM_ScheduledSpecimenSequence DcmTagKey(0x0040, 0x0500) #define DCM_RETIRED_SpecimenAccessionNumber DcmTagKey(0x0040, 0x050a) #define DCM_ContainerIdentifier DcmTagKey(0x0040, 0x0512) #define DCM_IssuerOfTheContainerIdentifierSequence DcmTagKey(0x0040, 0x0513) #define DCM_AlternateContainerIdentifierSequence DcmTagKey(0x0040, 0x0515) #define DCM_ContainerTypeCodeSequence DcmTagKey(0x0040, 0x0518) #define DCM_ContainerDescription DcmTagKey(0x0040, 0x051a) #define DCM_ContainerComponentSequence DcmTagKey(0x0040, 0x0520) #define DCM_RETIRED_SpecimenSequence DcmTagKey(0x0040, 0x0550) #define DCM_SpecimenIdentifier DcmTagKey(0x0040, 0x0551) #define DCM_RETIRED_SpecimenDescriptionSequenceTrial DcmTagKey(0x0040, 0x0552) #define DCM_RETIRED_SpecimenDescriptionTrial DcmTagKey(0x0040, 0x0553) #define DCM_SpecimenUID DcmTagKey(0x0040, 0x0554) #define DCM_AcquisitionContextSequence DcmTagKey(0x0040, 0x0555) #define DCM_AcquisitionContextDescription DcmTagKey(0x0040, 0x0556) #define DCM_SpecimenDescriptionSequence DcmTagKey(0x0040, 0x0560) #define DCM_IssuerOfTheSpecimenIdentifierSequence DcmTagKey(0x0040, 0x0562) #define DCM_SpecimenTypeCodeSequence DcmTagKey(0x0040, 0x059a) #define DCM_SpecimenShortDescription DcmTagKey(0x0040, 0x0600) #define DCM_SpecimenDetailedDescription DcmTagKey(0x0040, 0x0602) #define DCM_SpecimenPreparationSequence DcmTagKey(0x0040, 0x0610) #define DCM_SpecimenPreparationStepContentItemSequence DcmTagKey(0x0040, 0x0612) #define DCM_SpecimenLocalizationContentItemSequence DcmTagKey(0x0040, 0x0620) #define DCM_RETIRED_SlideIdentifier DcmTagKey(0x0040, 0x06fa) #define DCM_ImageCenterPointCoordinatesSequence DcmTagKey(0x0040, 0x071a) #define DCM_XOffsetInSlideCoordinateSystem DcmTagKey(0x0040, 0x072a) #define DCM_YOffsetInSlideCoordinateSystem DcmTagKey(0x0040, 0x073a) #define DCM_ZOffsetInSlideCoordinateSystem DcmTagKey(0x0040, 0x074a) #define DCM_RETIRED_PixelSpacingSequence DcmTagKey(0x0040, 0x08d8) #define DCM_RETIRED_CoordinateSystemAxisCodeSequence DcmTagKey(0x0040, 0x08da) #define DCM_MeasurementUnitsCodeSequence DcmTagKey(0x0040, 0x08ea) #define DCM_RETIRED_VitalStainCodeSequenceTrial DcmTagKey(0x0040, 0x09f8) #define DCM_RequestedProcedureID DcmTagKey(0x0040, 0x1001) #define DCM_ReasonForTheRequestedProcedure DcmTagKey(0x0040, 0x1002) #define DCM_RequestedProcedurePriority DcmTagKey(0x0040, 0x1003) #define DCM_PatientTransportArrangements DcmTagKey(0x0040, 0x1004) #define DCM_RequestedProcedureLocation DcmTagKey(0x0040, 0x1005) #define DCM_RETIRED_PlacerOrderNumberProcedure DcmTagKey(0x0040, 0x1006) #define DCM_RETIRED_FillerOrderNumberProcedure DcmTagKey(0x0040, 0x1007) #define DCM_ConfidentialityCode DcmTagKey(0x0040, 0x1008) #define DCM_ReportingPriority DcmTagKey(0x0040, 0x1009) #define DCM_ReasonForRequestedProcedureCodeSequence DcmTagKey(0x0040, 0x100a) #define DCM_NamesOfIntendedRecipientsOfResults DcmTagKey(0x0040, 0x1010) #define DCM_IntendedRecipientsOfResultsIdentificationSequence DcmTagKey(0x0040, 0x1011) #define DCM_ReasonForPerformedProcedureCodeSequence DcmTagKey(0x0040, 0x1012) #define DCM_PersonIdentificationCodeSequence DcmTagKey(0x0040, 0x1101) #define DCM_PersonAddress DcmTagKey(0x0040, 0x1102) #define DCM_PersonTelephoneNumbers DcmTagKey(0x0040, 0x1103) #define DCM_RequestedProcedureComments DcmTagKey(0x0040, 0x1400) #define DCM_RETIRED_ReasonForTheImagingServiceRequest DcmTagKey(0x0040, 0x2001) #define DCM_IssueDateOfImagingServiceRequest DcmTagKey(0x0040, 0x2004) #define DCM_IssueTimeOfImagingServiceRequest DcmTagKey(0x0040, 0x2005) #define DCM_RETIRED_PlacerOrderNumberImagingServiceRequestRetired DcmTagKey(0x0040, 0x2006) #define DCM_RETIRED_FillerOrderNumberImagingServiceRequestRetired DcmTagKey(0x0040, 0x2007) #define DCM_OrderEnteredBy DcmTagKey(0x0040, 0x2008) #define DCM_OrderEntererLocation DcmTagKey(0x0040, 0x2009) #define DCM_OrderCallbackPhoneNumber DcmTagKey(0x0040, 0x2010) #define DCM_PlacerOrderNumberImagingServiceRequest DcmTagKey(0x0040, 0x2016) #define DCM_FillerOrderNumberImagingServiceRequest DcmTagKey(0x0040, 0x2017) #define DCM_ImagingServiceRequestComments DcmTagKey(0x0040, 0x2400) #define DCM_ConfidentialityConstraintOnPatientDataDescription DcmTagKey(0x0040, 0x3001) #define DCM_GeneralPurposeScheduledProcedureStepStatus DcmTagKey(0x0040, 0x4001) #define DCM_GeneralPurposePerformedProcedureStepStatus DcmTagKey(0x0040, 0x4002) #define DCM_GeneralPurposeScheduledProcedureStepPriority DcmTagKey(0x0040, 0x4003) #define DCM_ScheduledProcessingApplicationsCodeSequence DcmTagKey(0x0040, 0x4004) #define DCM_ScheduledProcedureStepStartDateTime DcmTagKey(0x0040, 0x4005) #define DCM_MultipleCopiesFlag DcmTagKey(0x0040, 0x4006) #define DCM_PerformedProcessingApplicationsCodeSequence DcmTagKey(0x0040, 0x4007) #define DCM_HumanPerformerCodeSequence DcmTagKey(0x0040, 0x4009) #define DCM_ScheduledProcedureStepModificationDateTime DcmTagKey(0x0040, 0x4010) #define DCM_ExpectedCompletionDateTime DcmTagKey(0x0040, 0x4011) #define DCM_ResultingGeneralPurposePerformedProcedureStepsSequence DcmTagKey(0x0040, 0x4015) #define DCM_ReferencedGeneralPurposeScheduledProcedureStepSequence DcmTagKey(0x0040, 0x4016) #define DCM_ScheduledWorkitemCodeSequence DcmTagKey(0x0040, 0x4018) #define DCM_PerformedWorkitemCodeSequence DcmTagKey(0x0040, 0x4019) #define DCM_InputAvailabilityFlag DcmTagKey(0x0040, 0x4020) #define DCM_InputInformationSequence DcmTagKey(0x0040, 0x4021) #define DCM_RelevantInformationSequence DcmTagKey(0x0040, 0x4022) #define DCM_ReferencedGeneralPurposeScheduledProcedureStepTransactionUID DcmTagKey(0x0040, 0x4023) #define DCM_ScheduledStationNameCodeSequence DcmTagKey(0x0040, 0x4025) #define DCM_ScheduledStationClassCodeSequence DcmTagKey(0x0040, 0x4026) #define DCM_ScheduledStationGeographicLocationCodeSequence DcmTagKey(0x0040, 0x4027) #define DCM_PerformedStationNameCodeSequence DcmTagKey(0x0040, 0x4028) #define DCM_PerformedStationClassCodeSequence DcmTagKey(0x0040, 0x4029) #define DCM_PerformedStationGeographicLocationCodeSequence DcmTagKey(0x0040, 0x4030) #define DCM_RequestedSubsequentWorkitemCodeSequence DcmTagKey(0x0040, 0x4031) #define DCM_NonDICOMOutputCodeSequence DcmTagKey(0x0040, 0x4032) #define DCM_OutputInformationSequence DcmTagKey(0x0040, 0x4033) #define DCM_ScheduledHumanPerformersSequence DcmTagKey(0x0040, 0x4034) #define DCM_ActualHumanPerformersSequence DcmTagKey(0x0040, 0x4035) #define DCM_HumanPerformerOrganization DcmTagKey(0x0040, 0x4036) #define DCM_HumanPerformerName DcmTagKey(0x0040, 0x4037) #define DCM_RawDataHandling DcmTagKey(0x0040, 0x4040) #define DCM_EntranceDoseInmGy DcmTagKey(0x0040, 0x8302) #define DCM_ReferencedImageRealWorldValueMappingSequence DcmTagKey(0x0040, 0x9094) #define DCM_RealWorldValueMappingSequence DcmTagKey(0x0040, 0x9096) #define DCM_PixelValueMappingCodeSequence DcmTagKey(0x0040, 0x9098) #define DCM_LUTLabel DcmTagKey(0x0040, 0x9210) #define DCM_RealWorldValueLastValueMapped DcmTagKey(0x0040, 0x9211) #define DCM_RealWorldValueLUTData DcmTagKey(0x0040, 0x9212) #define DCM_RealWorldValueFirstValueMapped DcmTagKey(0x0040, 0x9216) #define DCM_RealWorldValueIntercept DcmTagKey(0x0040, 0x9224) #define DCM_RealWorldValueSlope DcmTagKey(0x0040, 0x9225) #define DCM_RelationshipType DcmTagKey(0x0040, 0xa010) #define DCM_VerifyingOrganization DcmTagKey(0x0040, 0xa027) #define DCM_VerificationDateTime DcmTagKey(0x0040, 0xa030) #define DCM_ObservationDateTime DcmTagKey(0x0040, 0xa032) #define DCM_ValueType DcmTagKey(0x0040, 0xa040) #define DCM_ConceptNameCodeSequence DcmTagKey(0x0040, 0xa043) #define DCM_ContinuityOfContent DcmTagKey(0x0040, 0xa050) #define DCM_VerifyingObserverSequence DcmTagKey(0x0040, 0xa073) #define DCM_VerifyingObserverName DcmTagKey(0x0040, 0xa075) #define DCM_AuthorObserverSequence DcmTagKey(0x0040, 0xa078) #define DCM_ParticipantSequence DcmTagKey(0x0040, 0xa07a) #define DCM_CustodialOrganizationSequence DcmTagKey(0x0040, 0xa07c) #define DCM_ParticipationType DcmTagKey(0x0040, 0xa080) #define DCM_ParticipationDateTime DcmTagKey(0x0040, 0xa082) #define DCM_ObserverType DcmTagKey(0x0040, 0xa084) #define DCM_VerifyingObserverIdentificationCodeSequence DcmTagKey(0x0040, 0xa088) #define DCM_RETIRED_EquivalentCDADocumentSequence DcmTagKey(0x0040, 0xa090) #define DCM_ReferencedWaveformChannels DcmTagKey(0x0040, 0xa0b0) #define DCM_DateTime DcmTagKey(0x0040, 0xa120) #define DCM_Date DcmTagKey(0x0040, 0xa121) #define DCM_Time DcmTagKey(0x0040, 0xa122) #define DCM_PersonName DcmTagKey(0x0040, 0xa123) #define DCM_UID DcmTagKey(0x0040, 0xa124) #define DCM_TemporalRangeType DcmTagKey(0x0040, 0xa130) #define DCM_ReferencedSamplePositions DcmTagKey(0x0040, 0xa132) #define DCM_ReferencedFrameNumbers DcmTagKey(0x0040, 0xa136) #define DCM_ReferencedTimeOffsets DcmTagKey(0x0040, 0xa138) #define DCM_ReferencedDateTime DcmTagKey(0x0040, 0xa13a) #define DCM_TextValue DcmTagKey(0x0040, 0xa160) #define DCM_ConceptCodeSequence DcmTagKey(0x0040, 0xa168) #define DCM_PurposeOfReferenceCodeSequence DcmTagKey(0x0040, 0xa170) #define DCM_AnnotationGroupNumber DcmTagKey(0x0040, 0xa180) #define DCM_ModifierCodeSequence DcmTagKey(0x0040, 0xa195) #define DCM_MeasuredValueSequence DcmTagKey(0x0040, 0xa300) #define DCM_NumericValueQualifierCodeSequence DcmTagKey(0x0040, 0xa301) #define DCM_NumericValue DcmTagKey(0x0040, 0xa30a) #define DCM_RETIRED_AddressTrial DcmTagKey(0x0040, 0xa353) #define DCM_RETIRED_TelephoneNumberTrial DcmTagKey(0x0040, 0xa354) #define DCM_PredecessorDocumentsSequence DcmTagKey(0x0040, 0xa360) #define DCM_ReferencedRequestSequence DcmTagKey(0x0040, 0xa370) #define DCM_PerformedProcedureCodeSequence DcmTagKey(0x0040, 0xa372) #define DCM_CurrentRequestedProcedureEvidenceSequence DcmTagKey(0x0040, 0xa375) #define DCM_PertinentOtherEvidenceSequence DcmTagKey(0x0040, 0xa385) #define DCM_HL7StructuredDocumentReferenceSequence DcmTagKey(0x0040, 0xa390) #define DCM_CompletionFlag DcmTagKey(0x0040, 0xa491) #define DCM_CompletionFlagDescription DcmTagKey(0x0040, 0xa492) #define DCM_VerificationFlag DcmTagKey(0x0040, 0xa493) #define DCM_ArchiveRequested DcmTagKey(0x0040, 0xa494) #define DCM_PreliminaryFlag DcmTagKey(0x0040, 0xa496) #define DCM_ContentTemplateSequence DcmTagKey(0x0040, 0xa504) #define DCM_IdenticalDocumentsSequence DcmTagKey(0x0040, 0xa525) #define DCM_ContentSequence DcmTagKey(0x0040, 0xa730) #define DCM_WaveformAnnotationSequence DcmTagKey(0x0040, 0xb020) #define DCM_TemplateIdentifier DcmTagKey(0x0040, 0xdb00) #define DCM_RETIRED_TemplateVersion DcmTagKey(0x0040, 0xdb06) #define DCM_RETIRED_TemplateLocalVersion DcmTagKey(0x0040, 0xdb07) #define DCM_RETIRED_TemplateExtensionFlag DcmTagKey(0x0040, 0xdb0b) #define DCM_RETIRED_TemplateExtensionOrganizationUID DcmTagKey(0x0040, 0xdb0c) #define DCM_RETIRED_TemplateExtensionCreatorUID DcmTagKey(0x0040, 0xdb0d) #define DCM_ReferencedContentItemIdentifier DcmTagKey(0x0040, 0xdb73) #define DCM_HL7InstanceIdentifier DcmTagKey(0x0040, 0xe001) #define DCM_HL7DocumentEffectiveTime DcmTagKey(0x0040, 0xe004) #define DCM_HL7DocumentTypeCodeSequence DcmTagKey(0x0040, 0xe006) #define DCM_RetrieveURI DcmTagKey(0x0040, 0xe010) #define DCM_RetrieveLocationUID DcmTagKey(0x0040, 0xe011) #define DCM_DocumentTitle DcmTagKey(0x0042, 0x0010) #define DCM_EncapsulatedDocument DcmTagKey(0x0042, 0x0011) #define DCM_MIMETypeOfEncapsulatedDocument DcmTagKey(0x0042, 0x0012) #define DCM_SourceInstanceSequence DcmTagKey(0x0042, 0x0013) #define DCM_ListOfMIMETypes DcmTagKey(0x0042, 0x0014) #define DCM_ProductPackageIdentifier DcmTagKey(0x0044, 0x0001) #define DCM_SubstanceAdministrationApproval DcmTagKey(0x0044, 0x0002) #define DCM_ApprovalStatusFurtherDescription DcmTagKey(0x0044, 0x0003) #define DCM_ApprovalStatusDateTime DcmTagKey(0x0044, 0x0004) #define DCM_ProductTypeCodeSequence DcmTagKey(0x0044, 0x0007) #define DCM_ProductName DcmTagKey(0x0044, 0x0008) #define DCM_ProductDescription DcmTagKey(0x0044, 0x0009) #define DCM_ProductLotIdentifier DcmTagKey(0x0044, 0x000a) #define DCM_ProductExpirationDateTime DcmTagKey(0x0044, 0x000b) #define DCM_SubstanceAdministrationDateTime DcmTagKey(0x0044, 0x0010) #define DCM_SubstanceAdministrationNotes DcmTagKey(0x0044, 0x0011) #define DCM_SubstanceAdministrationDeviceID DcmTagKey(0x0044, 0x0012) #define DCM_ProductParameterSequence DcmTagKey(0x0044, 0x0013) #define DCM_SubstanceAdministrationParameterSequence DcmTagKey(0x0044, 0x0019) #define DCM_LensDescription DcmTagKey(0x0046, 0x0012) #define DCM_RightLensSequence DcmTagKey(0x0046, 0x0014) #define DCM_LeftLensSequence DcmTagKey(0x0046, 0x0015) #define DCM_UnspecifiedLateralityLensSequence DcmTagKey(0x0046, 0x0016) #define DCM_CylinderSequence DcmTagKey(0x0046, 0x0018) #define DCM_PrismSequence DcmTagKey(0x0046, 0x0028) #define DCM_HorizontalPrismPower DcmTagKey(0x0046, 0x0030) #define DCM_HorizontalPrismBase DcmTagKey(0x0046, 0x0032) #define DCM_VerticalPrismPower DcmTagKey(0x0046, 0x0034) #define DCM_VerticalPrismBase DcmTagKey(0x0046, 0x0036) #define DCM_LensSegmentType DcmTagKey(0x0046, 0x0038) #define DCM_OpticalTransmittance DcmTagKey(0x0046, 0x0040) #define DCM_ChannelWidth DcmTagKey(0x0046, 0x0042) #define DCM_PupilSize DcmTagKey(0x0046, 0x0044) #define DCM_CornealSize DcmTagKey(0x0046, 0x0046) #define DCM_AutorefractionRightEyeSequence DcmTagKey(0x0046, 0x0050) #define DCM_AutorefractionLeftEyeSequence DcmTagKey(0x0046, 0x0052) #define DCM_DistancePupillaryDistance DcmTagKey(0x0046, 0x0060) #define DCM_NearPupillaryDistance DcmTagKey(0x0046, 0x0062) #define DCM_IntermediatePupillaryDistance DcmTagKey(0x0046, 0x0063) #define DCM_OtherPupillaryDistance DcmTagKey(0x0046, 0x0064) #define DCM_KeratometryRightEyeSequence DcmTagKey(0x0046, 0x0070) #define DCM_KeratometryLeftEyeSequence DcmTagKey(0x0046, 0x0071) #define DCM_SteepKeratometricAxisSequence DcmTagKey(0x0046, 0x0074) #define DCM_RadiusOfCurvature DcmTagKey(0x0046, 0x0075) #define DCM_KeratometricPower DcmTagKey(0x0046, 0x0076) #define DCM_KeratometricAxis DcmTagKey(0x0046, 0x0077) #define DCM_FlatKeratometricAxisSequence DcmTagKey(0x0046, 0x0080) #define DCM_BackgroundColor DcmTagKey(0x0046, 0x0092) #define DCM_Optotype DcmTagKey(0x0046, 0x0094) #define DCM_OptotypePresentation DcmTagKey(0x0046, 0x0095) #define DCM_SubjectiveRefractionRightEyeSequence DcmTagKey(0x0046, 0x0097) #define DCM_SubjectiveRefractionLeftEyeSequence DcmTagKey(0x0046, 0x0098) #define DCM_AddNearSequence DcmTagKey(0x0046, 0x0100) #define DCM_AddIntermediateSequence DcmTagKey(0x0046, 0x0101) #define DCM_AddOtherSequence DcmTagKey(0x0046, 0x0102) #define DCM_AddPower DcmTagKey(0x0046, 0x0104) #define DCM_ViewingDistance DcmTagKey(0x0046, 0x0106) #define DCM_VisualAcuityTypeCodeSequence DcmTagKey(0x0046, 0x0121) #define DCM_VisualAcuityRightEyeSequence DcmTagKey(0x0046, 0x0122) #define DCM_VisualAcuityLeftEyeSequence DcmTagKey(0x0046, 0x0123) #define DCM_VisualAcuityBothEyesOpenSequence DcmTagKey(0x0046, 0x0124) #define DCM_ViewingDistanceType DcmTagKey(0x0046, 0x0125) #define DCM_VisualAcuityModifiers DcmTagKey(0x0046, 0x0135) #define DCM_DecimalVisualAcuity DcmTagKey(0x0046, 0x0137) #define DCM_OptotypeDetailedDefinition DcmTagKey(0x0046, 0x0139) #define DCM_ReferencedRefractiveMeasurementsSequence DcmTagKey(0x0046, 0x0145) #define DCM_SpherePower DcmTagKey(0x0046, 0x0146) #define DCM_CylinderPower DcmTagKey(0x0046, 0x0147) #define DCM_ImagedVolumeWidth DcmTagKey(0x0048, 0x0001) #define DCM_ImagedVolumeHeight DcmTagKey(0x0048, 0x0002) #define DCM_ImagedVolumeDepth DcmTagKey(0x0048, 0x0003) #define DCM_TotalPixelMatrixColumns DcmTagKey(0x0048, 0x0006) #define DCM_TotalPixelMatrixRows DcmTagKey(0x0048, 0x0007) #define DCM_TotalPixelMatrixOriginSequence DcmTagKey(0x0048, 0x0008) #define DCM_SpecimenLabelInImage DcmTagKey(0x0048, 0x0010) #define DCM_FocusMethod DcmTagKey(0x0048, 0x0011) #define DCM_ExtendedDepthOfField DcmTagKey(0x0048, 0x0012) #define DCM_NumberOfFocalPlanes DcmTagKey(0x0048, 0x0013) #define DCM_DistanceBetweenFocalPlanes DcmTagKey(0x0048, 0x0014) #define DCM_RecommendedAbsentPixelCIELabValue DcmTagKey(0x0048, 0x0015) #define DCM_IlluminatorTypeCodeSequence DcmTagKey(0x0048, 0x0100) #define DCM_ImageOrientationSlide DcmTagKey(0x0048, 0x0102) #define DCM_OpticalPathSequence DcmTagKey(0x0048, 0x0105) #define DCM_OpticalPathIdentifier DcmTagKey(0x0048, 0x0106) #define DCM_OpticalPathDescription DcmTagKey(0x0048, 0x0107) #define DCM_IlluminationColorCodeSequence DcmTagKey(0x0048, 0x0108) #define DCM_SpecimenReferenceSequence DcmTagKey(0x0048, 0x0110) #define DCM_CondenserLensPower DcmTagKey(0x0048, 0x0111) #define DCM_ObjectiveLensPower DcmTagKey(0x0048, 0x0112) #define DCM_ObjectiveLensNumericalAperture DcmTagKey(0x0048, 0x0113) #define DCM_PaletteColorLookupTableSequence DcmTagKey(0x0048, 0x0120) #define DCM_ReferencedImageNavigationSequence DcmTagKey(0x0048, 0x0200) #define DCM_TopLeftHandCornerOfLocalizerArea DcmTagKey(0x0048, 0x0201) #define DCM_BottomRightHandCornerOfLocalizerArea DcmTagKey(0x0048, 0x0202) #define DCM_OpticalPathIdentificationSequence DcmTagKey(0x0048, 0x0207) #define DCM_PlanePositionSlideSequence DcmTagKey(0x0048, 0x021a) #define DCM_ColumnPositionInTotalImagePixelMatrix DcmTagKey(0x0048, 0x021e) #define DCM_RowPositionInTotalImagePixelMatrix DcmTagKey(0x0048, 0x021f) #define DCM_PixelOriginInterpretation DcmTagKey(0x0048, 0x0301) #define DCM_CalibrationImage DcmTagKey(0x0050, 0x0004) #define DCM_DeviceSequence DcmTagKey(0x0050, 0x0010) #define DCM_ContainerComponentTypeCodeSequence DcmTagKey(0x0050, 0x0012) #define DCM_ContainerComponentThickness DcmTagKey(0x0050, 0x0013) #define DCM_DeviceLength DcmTagKey(0x0050, 0x0014) #define DCM_ContainerComponentWidth DcmTagKey(0x0050, 0x0015) #define DCM_DeviceDiameter DcmTagKey(0x0050, 0x0016) #define DCM_DeviceDiameterUnits DcmTagKey(0x0050, 0x0017) #define DCM_DeviceVolume DcmTagKey(0x0050, 0x0018) #define DCM_InterMarkerDistance DcmTagKey(0x0050, 0x0019) #define DCM_ContainerComponentMaterial DcmTagKey(0x0050, 0x001a) #define DCM_ContainerComponentID DcmTagKey(0x0050, 0x001b) #define DCM_ContainerComponentLength DcmTagKey(0x0050, 0x001c) #define DCM_ContainerComponentDiameter DcmTagKey(0x0050, 0x001d) #define DCM_ContainerComponentDescription DcmTagKey(0x0050, 0x001e) #define DCM_DeviceDescription DcmTagKey(0x0050, 0x0020) #define DCM_EnergyWindowVector DcmTagKey(0x0054, 0x0010) #define DCM_NumberOfEnergyWindows DcmTagKey(0x0054, 0x0011) #define DCM_EnergyWindowInformationSequence DcmTagKey(0x0054, 0x0012) #define DCM_EnergyWindowRangeSequence DcmTagKey(0x0054, 0x0013) #define DCM_EnergyWindowLowerLimit DcmTagKey(0x0054, 0x0014) #define DCM_EnergyWindowUpperLimit DcmTagKey(0x0054, 0x0015) #define DCM_RadiopharmaceuticalInformationSequence DcmTagKey(0x0054, 0x0016) #define DCM_ResidualSyringeCounts DcmTagKey(0x0054, 0x0017) #define DCM_EnergyWindowName DcmTagKey(0x0054, 0x0018) #define DCM_DetectorVector DcmTagKey(0x0054, 0x0020) #define DCM_NumberOfDetectors DcmTagKey(0x0054, 0x0021) #define DCM_DetectorInformationSequence DcmTagKey(0x0054, 0x0022) #define DCM_PhaseVector DcmTagKey(0x0054, 0x0030) #define DCM_NumberOfPhases DcmTagKey(0x0054, 0x0031) #define DCM_PhaseInformationSequence DcmTagKey(0x0054, 0x0032) #define DCM_NumberOfFramesInPhase DcmTagKey(0x0054, 0x0033) #define DCM_PhaseDelay DcmTagKey(0x0054, 0x0036) #define DCM_PauseBetweenFrames DcmTagKey(0x0054, 0x0038) #define DCM_PhaseDescription DcmTagKey(0x0054, 0x0039) #define DCM_RotationVector DcmTagKey(0x0054, 0x0050) #define DCM_NumberOfRotations DcmTagKey(0x0054, 0x0051) #define DCM_RotationInformationSequence DcmTagKey(0x0054, 0x0052) #define DCM_NumberOfFramesInRotation DcmTagKey(0x0054, 0x0053) #define DCM_RRIntervalVector DcmTagKey(0x0054, 0x0060) #define DCM_NumberOfRRIntervals DcmTagKey(0x0054, 0x0061) #define DCM_GatedInformationSequence DcmTagKey(0x0054, 0x0062) #define DCM_DataInformationSequence DcmTagKey(0x0054, 0x0063) #define DCM_TimeSlotVector DcmTagKey(0x0054, 0x0070) #define DCM_NumberOfTimeSlots DcmTagKey(0x0054, 0x0071) #define DCM_TimeSlotInformationSequence DcmTagKey(0x0054, 0x0072) #define DCM_TimeSlotTime DcmTagKey(0x0054, 0x0073) #define DCM_SliceVector DcmTagKey(0x0054, 0x0080) #define DCM_NumberOfSlices DcmTagKey(0x0054, 0x0081) #define DCM_AngularViewVector DcmTagKey(0x0054, 0x0090) #define DCM_TimeSliceVector DcmTagKey(0x0054, 0x0100) #define DCM_NumberOfTimeSlices DcmTagKey(0x0054, 0x0101) #define DCM_StartAngle DcmTagKey(0x0054, 0x0200) #define DCM_TypeOfDetectorMotion DcmTagKey(0x0054, 0x0202) #define DCM_TriggerVector DcmTagKey(0x0054, 0x0210) #define DCM_NumberOfTriggersInPhase DcmTagKey(0x0054, 0x0211) #define DCM_ViewCodeSequence DcmTagKey(0x0054, 0x0220) #define DCM_ViewModifierCodeSequence DcmTagKey(0x0054, 0x0222) #define DCM_RadionuclideCodeSequence DcmTagKey(0x0054, 0x0300) #define DCM_AdministrationRouteCodeSequence DcmTagKey(0x0054, 0x0302) #define DCM_RadiopharmaceuticalCodeSequence DcmTagKey(0x0054, 0x0304) #define DCM_CalibrationDataSequence DcmTagKey(0x0054, 0x0306) #define DCM_EnergyWindowNumber DcmTagKey(0x0054, 0x0308) #define DCM_ImageID DcmTagKey(0x0054, 0x0400) #define DCM_PatientOrientationCodeSequence DcmTagKey(0x0054, 0x0410) #define DCM_PatientOrientationModifierCodeSequence DcmTagKey(0x0054, 0x0412) #define DCM_PatientGantryRelationshipCodeSequence DcmTagKey(0x0054, 0x0414) #define DCM_SliceProgressionDirection DcmTagKey(0x0054, 0x0500) #define DCM_SeriesType DcmTagKey(0x0054, 0x1000) #define DCM_Units DcmTagKey(0x0054, 0x1001) #define DCM_CountsSource DcmTagKey(0x0054, 0x1002) #define DCM_ReprojectionMethod DcmTagKey(0x0054, 0x1004) #define DCM_RandomsCorrectionMethod DcmTagKey(0x0054, 0x1100) #define DCM_AttenuationCorrectionMethod DcmTagKey(0x0054, 0x1101) #define DCM_DecayCorrection DcmTagKey(0x0054, 0x1102) #define DCM_ReconstructionMethod DcmTagKey(0x0054, 0x1103) #define DCM_DetectorLinesOfResponseUsed DcmTagKey(0x0054, 0x1104) #define DCM_ScatterCorrectionMethod DcmTagKey(0x0054, 0x1105) #define DCM_AxialAcceptance DcmTagKey(0x0054, 0x1200) #define DCM_AxialMash DcmTagKey(0x0054, 0x1201) #define DCM_TransverseMash DcmTagKey(0x0054, 0x1202) #define DCM_DetectorElementSize DcmTagKey(0x0054, 0x1203) #define DCM_CoincidenceWindowWidth DcmTagKey(0x0054, 0x1210) #define DCM_SecondaryCountsType DcmTagKey(0x0054, 0x1220) #define DCM_FrameReferenceTime DcmTagKey(0x0054, 0x1300) #define DCM_PrimaryPromptsCountsAccumulated DcmTagKey(0x0054, 0x1310) #define DCM_SecondaryCountsAccumulated DcmTagKey(0x0054, 0x1311) #define DCM_SliceSensitivityFactor DcmTagKey(0x0054, 0x1320) #define DCM_DecayFactor DcmTagKey(0x0054, 0x1321) #define DCM_DoseCalibrationFactor DcmTagKey(0x0054, 0x1322) #define DCM_ScatterFractionFactor DcmTagKey(0x0054, 0x1323) #define DCM_DeadTimeFactor DcmTagKey(0x0054, 0x1324) #define DCM_ImageIndex DcmTagKey(0x0054, 0x1330) #define DCM_RETIRED_CountsIncluded DcmTagKey(0x0054, 0x1400) #define DCM_RETIRED_DeadTimeCorrectionFlag DcmTagKey(0x0054, 0x1401) #define DCM_HistogramSequence DcmTagKey(0x0060, 0x3000) #define DCM_HistogramNumberOfBins DcmTagKey(0x0060, 0x3002) #define DCM_HistogramFirstBinValue DcmTagKey(0x0060, 0x3004) #define DCM_HistogramLastBinValue DcmTagKey(0x0060, 0x3006) #define DCM_HistogramBinWidth DcmTagKey(0x0060, 0x3008) #define DCM_HistogramExplanation DcmTagKey(0x0060, 0x3010) #define DCM_HistogramData DcmTagKey(0x0060, 0x3020) #define DCM_SegmentationType DcmTagKey(0x0062, 0x0001) #define DCM_SegmentSequence DcmTagKey(0x0062, 0x0002) #define DCM_SegmentedPropertyCategoryCodeSequence DcmTagKey(0x0062, 0x0003) #define DCM_SegmentNumber DcmTagKey(0x0062, 0x0004) #define DCM_SegmentLabel DcmTagKey(0x0062, 0x0005) #define DCM_SegmentDescription DcmTagKey(0x0062, 0x0006) #define DCM_SegmentAlgorithmType DcmTagKey(0x0062, 0x0008) #define DCM_SegmentAlgorithmName DcmTagKey(0x0062, 0x0009) #define DCM_SegmentIdentificationSequence DcmTagKey(0x0062, 0x000a) #define DCM_ReferencedSegmentNumber DcmTagKey(0x0062, 0x000b) #define DCM_RecommendedDisplayGrayscaleValue DcmTagKey(0x0062, 0x000c) #define DCM_RecommendedDisplayCIELabValue DcmTagKey(0x0062, 0x000d) #define DCM_MaximumFractionalValue DcmTagKey(0x0062, 0x000e) #define DCM_SegmentedPropertyTypeCodeSequence DcmTagKey(0x0062, 0x000f) #define DCM_SegmentationFractionalType DcmTagKey(0x0062, 0x0010) #define DCM_DeformableRegistrationSequence DcmTagKey(0x0064, 0x0002) #define DCM_SourceFrameOfReferenceUID DcmTagKey(0x0064, 0x0003) #define DCM_DeformableRegistrationGridSequence DcmTagKey(0x0064, 0x0005) #define DCM_GridDimensions DcmTagKey(0x0064, 0x0007) #define DCM_GridResolution DcmTagKey(0x0064, 0x0008) #define DCM_VectorGridData DcmTagKey(0x0064, 0x0009) #define DCM_PreDeformationMatrixRegistrationSequence DcmTagKey(0x0064, 0x000f) #define DCM_PostDeformationMatrixRegistrationSequence DcmTagKey(0x0064, 0x0010) #define DCM_NumberOfSurfaces DcmTagKey(0x0066, 0x0001) #define DCM_SurfaceSequence DcmTagKey(0x0066, 0x0002) #define DCM_SurfaceNumber DcmTagKey(0x0066, 0x0003) #define DCM_SurfaceComments DcmTagKey(0x0066, 0x0004) #define DCM_SurfaceProcessing DcmTagKey(0x0066, 0x0009) #define DCM_SurfaceProcessingRatio DcmTagKey(0x0066, 0x000a) #define DCM_SurfaceProcessingDescription DcmTagKey(0x0066, 0x000b) #define DCM_RecommendedPresentationOpacity DcmTagKey(0x0066, 0x000c) #define DCM_RecommendedPresentationType DcmTagKey(0x0066, 0x000d) #define DCM_FiniteVolume DcmTagKey(0x0066, 0x000e) #define DCM_Manifold DcmTagKey(0x0066, 0x0010) #define DCM_SurfacePointsSequence DcmTagKey(0x0066, 0x0011) #define DCM_SurfacePointsNormalsSequence DcmTagKey(0x0066, 0x0012) #define DCM_SurfaceMeshPrimitivesSequence DcmTagKey(0x0066, 0x0013) #define DCM_NumberOfSurfacePoints DcmTagKey(0x0066, 0x0015) #define DCM_PointCoordinatesData DcmTagKey(0x0066, 0x0016) #define DCM_PointPositionAccuracy DcmTagKey(0x0066, 0x0017) #define DCM_MeanPointDistance DcmTagKey(0x0066, 0x0018) #define DCM_MaximumPointDistance DcmTagKey(0x0066, 0x0019) #define DCM_PointsBoundingBoxCoordinates DcmTagKey(0x0066, 0x001a) #define DCM_AxisOfRotation DcmTagKey(0x0066, 0x001b) #define DCM_CenterOfRotation DcmTagKey(0x0066, 0x001c) #define DCM_NumberOfVectors DcmTagKey(0x0066, 0x001e) #define DCM_VectorDimensionality DcmTagKey(0x0066, 0x001f) #define DCM_VectorAccuracy DcmTagKey(0x0066, 0x0020) #define DCM_VectorCoordinateData DcmTagKey(0x0066, 0x0021) #define DCM_TrianglePointIndexList DcmTagKey(0x0066, 0x0023) #define DCM_EdgePointIndexList DcmTagKey(0x0066, 0x0024) #define DCM_VertexPointIndexList DcmTagKey(0x0066, 0x0025) #define DCM_TriangleStripSequence DcmTagKey(0x0066, 0x0026) #define DCM_TriangleFanSequence DcmTagKey(0x0066, 0x0027) #define DCM_LineSequence DcmTagKey(0x0066, 0x0028) #define DCM_PrimitivePointIndexList DcmTagKey(0x0066, 0x0029) #define DCM_SurfaceCount DcmTagKey(0x0066, 0x002a) #define DCM_ReferencedSurfaceSequence DcmTagKey(0x0066, 0x002b) #define DCM_ReferencedSurfaceNumber DcmTagKey(0x0066, 0x002c) #define DCM_SegmentSurfaceGenerationAlgorithmIdentificationSequence DcmTagKey(0x0066, 0x002d) #define DCM_SegmentSurfaceSourceInstanceSequence DcmTagKey(0x0066, 0x002e) #define DCM_AlgorithmFamilyCodeSequence DcmTagKey(0x0066, 0x002f) #define DCM_AlgorithmNameCodeSequence DcmTagKey(0x0066, 0x0030) #define DCM_AlgorithmVersion DcmTagKey(0x0066, 0x0031) #define DCM_AlgorithmParameters DcmTagKey(0x0066, 0x0032) #define DCM_FacetSequence DcmTagKey(0x0066, 0x0034) #define DCM_SurfaceProcessingAlgorithmIdentificationSequence DcmTagKey(0x0066, 0x0035) #define DCM_AlgorithmName DcmTagKey(0x0066, 0x0036) #define DCM_ImplantSize DcmTagKey(0x0068, 0x6210) #define DCM_ImplantTemplateVersion DcmTagKey(0x0068, 0x6221) #define DCM_ReplacedImplantTemplateSequence DcmTagKey(0x0068, 0x6222) #define DCM_ImplantType DcmTagKey(0x0068, 0x6223) #define DCM_DerivationImplantTemplateSequence DcmTagKey(0x0068, 0x6224) #define DCM_OriginalImplantTemplateSequence DcmTagKey(0x0068, 0x6225) #define DCM_EffectiveDateTime DcmTagKey(0x0068, 0x6226) #define DCM_ImplantTargetAnatomySequence DcmTagKey(0x0068, 0x6230) #define DCM_InformationFromManufacturerSequence DcmTagKey(0x0068, 0x6260) #define DCM_NotificationFromManufacturerSequence DcmTagKey(0x0068, 0x6265) #define DCM_InformationIssueDateTime DcmTagKey(0x0068, 0x6270) #define DCM_InformationSummary DcmTagKey(0x0068, 0x6280) #define DCM_ImplantRegulatoryDisapprovalCodeSequence DcmTagKey(0x0068, 0x62a0) #define DCM_OverallTemplateSpatialTolerance DcmTagKey(0x0068, 0x62a5) #define DCM_HPGLDocumentSequence DcmTagKey(0x0068, 0x62c0) #define DCM_HPGLDocumentID DcmTagKey(0x0068, 0x62d0) #define DCM_HPGLDocumentLabel DcmTagKey(0x0068, 0x62d5) #define DCM_ViewOrientationCodeSequence DcmTagKey(0x0068, 0x62e0) #define DCM_ViewOrientationModifier DcmTagKey(0x0068, 0x62f0) #define DCM_HPGLDocumentScaling DcmTagKey(0x0068, 0x62f2) #define DCM_HPGLDocument DcmTagKey(0x0068, 0x6300) #define DCM_HPGLContourPenNumber DcmTagKey(0x0068, 0x6310) #define DCM_HPGLPenSequence DcmTagKey(0x0068, 0x6320) #define DCM_HPGLPenNumber DcmTagKey(0x0068, 0x6330) #define DCM_HPGLPenLabel DcmTagKey(0x0068, 0x6340) #define DCM_HPGLPenDescription DcmTagKey(0x0068, 0x6345) #define DCM_RecommendedRotationPoint DcmTagKey(0x0068, 0x6346) #define DCM_BoundingRectangle DcmTagKey(0x0068, 0x6347) #define DCM_ImplantTemplate3DModelSurfaceNumber DcmTagKey(0x0068, 0x6350) #define DCM_SurfaceModelDescriptionSequence DcmTagKey(0x0068, 0x6360) #define DCM_SurfaceModelLabel DcmTagKey(0x0068, 0x6380) #define DCM_SurfaceModelScalingFactor DcmTagKey(0x0068, 0x6390) #define DCM_MaterialsCodeSequence DcmTagKey(0x0068, 0x63a0) #define DCM_CoatingMaterialsCodeSequence DcmTagKey(0x0068, 0x63a4) #define DCM_ImplantTypeCodeSequence DcmTagKey(0x0068, 0x63a8) #define DCM_FixationMethodCodeSequence DcmTagKey(0x0068, 0x63ac) #define DCM_MatingFeatureSetsSequence DcmTagKey(0x0068, 0x63b0) #define DCM_MatingFeatureSetID DcmTagKey(0x0068, 0x63c0) #define DCM_MatingFeatureSetLabel DcmTagKey(0x0068, 0x63d0) #define DCM_MatingFeatureSequence DcmTagKey(0x0068, 0x63e0) #define DCM_MatingFeatureID DcmTagKey(0x0068, 0x63f0) #define DCM_MatingFeatureDegreeOfFreedomSequence DcmTagKey(0x0068, 0x6400) #define DCM_DegreeOfFreedomID DcmTagKey(0x0068, 0x6410) #define DCM_DegreeOfFreedomType DcmTagKey(0x0068, 0x6420) #define DCM_TwoDMatingFeatureCoordinatesSequence DcmTagKey(0x0068, 0x6430) #define DCM_ReferencedHPGLDocumentID DcmTagKey(0x0068, 0x6440) #define DCM_TwoDMatingPoint DcmTagKey(0x0068, 0x6450) #define DCM_TwoDMatingAxes DcmTagKey(0x0068, 0x6460) #define DCM_TwoDDegreeOfFreedomSequence DcmTagKey(0x0068, 0x6470) #define DCM_ThreeDDegreeOfFreedomAxis DcmTagKey(0x0068, 0x6490) #define DCM_RangeOfFreedom DcmTagKey(0x0068, 0x64a0) #define DCM_ThreeDMatingPoint DcmTagKey(0x0068, 0x64c0) #define DCM_ThreeDMatingAxes DcmTagKey(0x0068, 0x64d0) #define DCM_TwoDDegreeOfFreedomAxis DcmTagKey(0x0068, 0x64f0) #define DCM_PlanningLandmarkPointSequence DcmTagKey(0x0068, 0x6500) #define DCM_PlanningLandmarkLineSequence DcmTagKey(0x0068, 0x6510) #define DCM_PlanningLandmarkPlaneSequence DcmTagKey(0x0068, 0x6520) #define DCM_PlanningLandmarkID DcmTagKey(0x0068, 0x6530) #define DCM_PlanningLandmarkDescription DcmTagKey(0x0068, 0x6540) #define DCM_PlanningLandmarkIdentificationCodeSequence DcmTagKey(0x0068, 0x6545) #define DCM_TwoDPointCoordinatesSequence DcmTagKey(0x0068, 0x6550) #define DCM_TwoDPointCoordinates DcmTagKey(0x0068, 0x6560) #define DCM_ThreeDPointCoordinates DcmTagKey(0x0068, 0x6590) #define DCM_TwoDLineCoordinatesSequence DcmTagKey(0x0068, 0x65a0) #define DCM_TwoDLineCoordinates DcmTagKey(0x0068, 0x65b0) #define DCM_ThreeDLineCoordinates DcmTagKey(0x0068, 0x65d0) #define DCM_TwoDPlaneCoordinatesSequence DcmTagKey(0x0068, 0x65e0) #define DCM_TwoDPlaneIntersection DcmTagKey(0x0068, 0x65f0) #define DCM_ThreeDPlaneOrigin DcmTagKey(0x0068, 0x6610) #define DCM_ThreeDPlaneNormal DcmTagKey(0x0068, 0x6620) #define DCM_GraphicAnnotationSequence DcmTagKey(0x0070, 0x0001) #define DCM_GraphicLayer DcmTagKey(0x0070, 0x0002) #define DCM_BoundingBoxAnnotationUnits DcmTagKey(0x0070, 0x0003) #define DCM_AnchorPointAnnotationUnits DcmTagKey(0x0070, 0x0004) #define DCM_GraphicAnnotationUnits DcmTagKey(0x0070, 0x0005) #define DCM_UnformattedTextValue DcmTagKey(0x0070, 0x0006) #define DCM_TextObjectSequence DcmTagKey(0x0070, 0x0008) #define DCM_GraphicObjectSequence DcmTagKey(0x0070, 0x0009) #define DCM_BoundingBoxTopLeftHandCorner DcmTagKey(0x0070, 0x0010) #define DCM_BoundingBoxBottomRightHandCorner DcmTagKey(0x0070, 0x0011) #define DCM_BoundingBoxTextHorizontalJustification DcmTagKey(0x0070, 0x0012) #define DCM_AnchorPoint DcmTagKey(0x0070, 0x0014) #define DCM_AnchorPointVisibility DcmTagKey(0x0070, 0x0015) #define DCM_GraphicDimensions DcmTagKey(0x0070, 0x0020) #define DCM_NumberOfGraphicPoints DcmTagKey(0x0070, 0x0021) #define DCM_GraphicData DcmTagKey(0x0070, 0x0022) #define DCM_GraphicType DcmTagKey(0x0070, 0x0023) #define DCM_GraphicFilled DcmTagKey(0x0070, 0x0024) #define DCM_RETIRED_ImageRotationRetired DcmTagKey(0x0070, 0x0040) #define DCM_ImageHorizontalFlip DcmTagKey(0x0070, 0x0041) #define DCM_ImageRotation DcmTagKey(0x0070, 0x0042) #define DCM_RETIRED_DisplayedAreaTopLeftHandCornerTrial DcmTagKey(0x0070, 0x0050) #define DCM_RETIRED_DisplayedAreaBottomRightHandCornerTrial DcmTagKey(0x0070, 0x0051) #define DCM_DisplayedAreaTopLeftHandCorner DcmTagKey(0x0070, 0x0052) #define DCM_DisplayedAreaBottomRightHandCorner DcmTagKey(0x0070, 0x0053) #define DCM_DisplayedAreaSelectionSequence DcmTagKey(0x0070, 0x005a) #define DCM_GraphicLayerSequence DcmTagKey(0x0070, 0x0060) #define DCM_GraphicLayerOrder DcmTagKey(0x0070, 0x0062) #define DCM_GraphicLayerRecommendedDisplayGrayscaleValue DcmTagKey(0x0070, 0x0066) #define DCM_RETIRED_GraphicLayerRecommendedDisplayRGBValue DcmTagKey(0x0070, 0x0067) #define DCM_GraphicLayerDescription DcmTagKey(0x0070, 0x0068) #define DCM_ContentLabel DcmTagKey(0x0070, 0x0080) #define DCM_ContentDescription DcmTagKey(0x0070, 0x0081) #define DCM_PresentationCreationDate DcmTagKey(0x0070, 0x0082) #define DCM_PresentationCreationTime DcmTagKey(0x0070, 0x0083) #define DCM_ContentCreatorName DcmTagKey(0x0070, 0x0084) #define DCM_ContentCreatorIdentificationCodeSequence DcmTagKey(0x0070, 0x0086) #define DCM_AlternateContentDescriptionSequence DcmTagKey(0x0070, 0x0087) #define DCM_PresentationSizeMode DcmTagKey(0x0070, 0x0100) #define DCM_PresentationPixelSpacing DcmTagKey(0x0070, 0x0101) #define DCM_PresentationPixelAspectRatio DcmTagKey(0x0070, 0x0102) #define DCM_PresentationPixelMagnificationRatio DcmTagKey(0x0070, 0x0103) #define DCM_GraphicGroupLabel DcmTagKey(0x0070, 0x0207) #define DCM_GraphicGroupDescription DcmTagKey(0x0070, 0x0208) #define DCM_CompoundGraphicSequence DcmTagKey(0x0070, 0x0209) #define DCM_CompoundGraphicInstanceID DcmTagKey(0x0070, 0x0226) #define DCM_FontName DcmTagKey(0x0070, 0x0227) #define DCM_FontNameType DcmTagKey(0x0070, 0x0228) #define DCM_CSSFontName DcmTagKey(0x0070, 0x0229) #define DCM_RotationAngle DcmTagKey(0x0070, 0x0230) #define DCM_TextStyleSequence DcmTagKey(0x0070, 0x0231) #define DCM_LineStyleSequence DcmTagKey(0x0070, 0x0232) #define DCM_FillStyleSequence DcmTagKey(0x0070, 0x0233) #define DCM_GraphicGroupSequence DcmTagKey(0x0070, 0x0234) #define DCM_TextColorCIELabValue DcmTagKey(0x0070, 0x0241) #define DCM_HorizontalAlignment DcmTagKey(0x0070, 0x0242) #define DCM_VerticalAlignment DcmTagKey(0x0070, 0x0243) #define DCM_ShadowStyle DcmTagKey(0x0070, 0x0244) #define DCM_ShadowOffsetX DcmTagKey(0x0070, 0x0245) #define DCM_ShadowOffsetY DcmTagKey(0x0070, 0x0246) #define DCM_ShadowColorCIELabValue DcmTagKey(0x0070, 0x0247) #define DCM_Underlined DcmTagKey(0x0070, 0x0248) #define DCM_Bold DcmTagKey(0x0070, 0x0249) #define DCM_Italic DcmTagKey(0x0070, 0x0250) #define DCM_PatternOnColorCIELabValue DcmTagKey(0x0070, 0x0251) #define DCM_PatternOffColorCIELabValue DcmTagKey(0x0070, 0x0252) #define DCM_LineThickness DcmTagKey(0x0070, 0x0253) #define DCM_LineDashingStyle DcmTagKey(0x0070, 0x0254) #define DCM_LinePattern DcmTagKey(0x0070, 0x0255) #define DCM_FillPattern DcmTagKey(0x0070, 0x0256) #define DCM_FillMode DcmTagKey(0x0070, 0x0257) #define DCM_ShadowOpacity DcmTagKey(0x0070, 0x0258) #define DCM_GapLength DcmTagKey(0x0070, 0x0261) #define DCM_DiameterOfVisibility DcmTagKey(0x0070, 0x0262) #define DCM_RotationPoint DcmTagKey(0x0070, 0x0273) #define DCM_TickAlignment DcmTagKey(0x0070, 0x0274) #define DCM_ShowTickLabel DcmTagKey(0x0070, 0x0278) #define DCM_TickLabelAlignment DcmTagKey(0x0070, 0x0279) #define DCM_CompoundGraphicUnits DcmTagKey(0x0070, 0x0282) #define DCM_PatternOnOpacity DcmTagKey(0x0070, 0x0284) #define DCM_PatternOffOpacity DcmTagKey(0x0070, 0x0285) #define DCM_MajorTicksSequence DcmTagKey(0x0070, 0x0287) #define DCM_TickPosition DcmTagKey(0x0070, 0x0288) #define DCM_TickLabel DcmTagKey(0x0070, 0x0289) #define DCM_CompoundGraphicType DcmTagKey(0x0070, 0x0294) #define DCM_GraphicGroupID DcmTagKey(0x0070, 0x0295) #define DCM_ShapeType DcmTagKey(0x0070, 0x0306) #define DCM_RegistrationSequence DcmTagKey(0x0070, 0x0308) #define DCM_MatrixRegistrationSequence DcmTagKey(0x0070, 0x0309) #define DCM_MatrixSequence DcmTagKey(0x0070, 0x030a) #define DCM_FrameOfReferenceTransformationMatrixType DcmTagKey(0x0070, 0x030c) #define DCM_RegistrationTypeCodeSequence DcmTagKey(0x0070, 0x030d) #define DCM_FiducialDescription DcmTagKey(0x0070, 0x030f) #define DCM_FiducialIdentifier DcmTagKey(0x0070, 0x0310) #define DCM_FiducialIdentifierCodeSequence DcmTagKey(0x0070, 0x0311) #define DCM_ContourUncertaintyRadius DcmTagKey(0x0070, 0x0312) #define DCM_UsedFiducialsSequence DcmTagKey(0x0070, 0x0314) #define DCM_GraphicCoordinatesDataSequence DcmTagKey(0x0070, 0x0318) #define DCM_FiducialUID DcmTagKey(0x0070, 0x031a) #define DCM_FiducialSetSequence DcmTagKey(0x0070, 0x031c) #define DCM_FiducialSequence DcmTagKey(0x0070, 0x031e) #define DCM_GraphicLayerRecommendedDisplayCIELabValue DcmTagKey(0x0070, 0x0401) #define DCM_BlendingSequence DcmTagKey(0x0070, 0x0402) #define DCM_RelativeOpacity DcmTagKey(0x0070, 0x0403) #define DCM_ReferencedSpatialRegistrationSequence DcmTagKey(0x0070, 0x0404) #define DCM_BlendingPosition DcmTagKey(0x0070, 0x0405) #define DCM_HangingProtocolName DcmTagKey(0x0072, 0x0002) #define DCM_HangingProtocolDescription DcmTagKey(0x0072, 0x0004) #define DCM_HangingProtocolLevel DcmTagKey(0x0072, 0x0006) #define DCM_HangingProtocolCreator DcmTagKey(0x0072, 0x0008) #define DCM_HangingProtocolCreationDateTime DcmTagKey(0x0072, 0x000a) #define DCM_HangingProtocolDefinitionSequence DcmTagKey(0x0072, 0x000c) #define DCM_HangingProtocolUserIdentificationCodeSequence DcmTagKey(0x0072, 0x000e) #define DCM_HangingProtocolUserGroupName DcmTagKey(0x0072, 0x0010) #define DCM_SourceHangingProtocolSequence DcmTagKey(0x0072, 0x0012) #define DCM_NumberOfPriorsReferenced DcmTagKey(0x0072, 0x0014) #define DCM_ImageSetsSequence DcmTagKey(0x0072, 0x0020) #define DCM_ImageSetSelectorSequence DcmTagKey(0x0072, 0x0022) #define DCM_ImageSetSelectorUsageFlag DcmTagKey(0x0072, 0x0024) #define DCM_SelectorAttribute DcmTagKey(0x0072, 0x0026) #define DCM_SelectorValueNumber DcmTagKey(0x0072, 0x0028) #define DCM_TimeBasedImageSetsSequence DcmTagKey(0x0072, 0x0030) #define DCM_ImageSetNumber DcmTagKey(0x0072, 0x0032) #define DCM_ImageSetSelectorCategory DcmTagKey(0x0072, 0x0034) #define DCM_RelativeTime DcmTagKey(0x0072, 0x0038) #define DCM_RelativeTimeUnits DcmTagKey(0x0072, 0x003a) #define DCM_AbstractPriorValue DcmTagKey(0x0072, 0x003c) #define DCM_AbstractPriorCodeSequence DcmTagKey(0x0072, 0x003e) #define DCM_ImageSetLabel DcmTagKey(0x0072, 0x0040) #define DCM_SelectorAttributeVR DcmTagKey(0x0072, 0x0050) #define DCM_SelectorSequencePointer DcmTagKey(0x0072, 0x0052) #define DCM_SelectorSequencePointerPrivateCreator DcmTagKey(0x0072, 0x0054) #define DCM_SelectorAttributePrivateCreator DcmTagKey(0x0072, 0x0056) #define DCM_SelectorATValue DcmTagKey(0x0072, 0x0060) #define DCM_SelectorCSValue DcmTagKey(0x0072, 0x0062) #define DCM_SelectorISValue DcmTagKey(0x0072, 0x0064) #define DCM_SelectorLOValue DcmTagKey(0x0072, 0x0066) #define DCM_SelectorLTValue DcmTagKey(0x0072, 0x0068) #define DCM_SelectorPNValue DcmTagKey(0x0072, 0x006a) #define DCM_SelectorSHValue DcmTagKey(0x0072, 0x006c) #define DCM_SelectorSTValue DcmTagKey(0x0072, 0x006e) #define DCM_SelectorUTValue DcmTagKey(0x0072, 0x0070) #define DCM_SelectorDSValue DcmTagKey(0x0072, 0x0072) #define DCM_SelectorFDValue DcmTagKey(0x0072, 0x0074) #define DCM_SelectorFLValue DcmTagKey(0x0072, 0x0076) #define DCM_SelectorULValue DcmTagKey(0x0072, 0x0078) #define DCM_SelectorUSValue DcmTagKey(0x0072, 0x007a) #define DCM_SelectorSLValue DcmTagKey(0x0072, 0x007c) #define DCM_SelectorSSValue DcmTagKey(0x0072, 0x007e) #define DCM_SelectorCodeSequenceValue DcmTagKey(0x0072, 0x0080) #define DCM_NumberOfScreens DcmTagKey(0x0072, 0x0100) #define DCM_NominalScreenDefinitionSequence DcmTagKey(0x0072, 0x0102) #define DCM_NumberOfVerticalPixels DcmTagKey(0x0072, 0x0104) #define DCM_NumberOfHorizontalPixels DcmTagKey(0x0072, 0x0106) #define DCM_DisplayEnvironmentSpatialPosition DcmTagKey(0x0072, 0x0108) #define DCM_ScreenMinimumGrayscaleBitDepth DcmTagKey(0x0072, 0x010a) #define DCM_ScreenMinimumColorBitDepth DcmTagKey(0x0072, 0x010c) #define DCM_ApplicationMaximumRepaintTime DcmTagKey(0x0072, 0x010e) #define DCM_DisplaySetsSequence DcmTagKey(0x0072, 0x0200) #define DCM_DisplaySetNumber DcmTagKey(0x0072, 0x0202) #define DCM_DisplaySetLabel DcmTagKey(0x0072, 0x0203) #define DCM_DisplaySetPresentationGroup DcmTagKey(0x0072, 0x0204) #define DCM_DisplaySetPresentationGroupDescription DcmTagKey(0x0072, 0x0206) #define DCM_PartialDataDisplayHandling DcmTagKey(0x0072, 0x0208) #define DCM_SynchronizedScrollingSequence DcmTagKey(0x0072, 0x0210) #define DCM_DisplaySetScrollingGroup DcmTagKey(0x0072, 0x0212) #define DCM_NavigationIndicatorSequence DcmTagKey(0x0072, 0x0214) #define DCM_NavigationDisplaySet DcmTagKey(0x0072, 0x0216) #define DCM_ReferenceDisplaySets DcmTagKey(0x0072, 0x0218) #define DCM_ImageBoxesSequence DcmTagKey(0x0072, 0x0300) #define DCM_ImageBoxNumber DcmTagKey(0x0072, 0x0302) #define DCM_ImageBoxLayoutType DcmTagKey(0x0072, 0x0304) #define DCM_ImageBoxTileHorizontalDimension DcmTagKey(0x0072, 0x0306) #define DCM_ImageBoxTileVerticalDimension DcmTagKey(0x0072, 0x0308) #define DCM_ImageBoxScrollDirection DcmTagKey(0x0072, 0x0310) #define DCM_ImageBoxSmallScrollType DcmTagKey(0x0072, 0x0312) #define DCM_ImageBoxSmallScrollAmount DcmTagKey(0x0072, 0x0314) #define DCM_ImageBoxLargeScrollType DcmTagKey(0x0072, 0x0316) #define DCM_ImageBoxLargeScrollAmount DcmTagKey(0x0072, 0x0318) #define DCM_ImageBoxOverlapPriority DcmTagKey(0x0072, 0x0320) #define DCM_CineRelativeToRealTime DcmTagKey(0x0072, 0x0330) #define DCM_FilterOperationsSequence DcmTagKey(0x0072, 0x0400) #define DCM_FilterByCategory DcmTagKey(0x0072, 0x0402) #define DCM_FilterByAttributePresence DcmTagKey(0x0072, 0x0404) #define DCM_FilterByOperator DcmTagKey(0x0072, 0x0406) #define DCM_StructuredDisplayBackgroundCIELabValue DcmTagKey(0x0072, 0x0420) #define DCM_EmptyImageBoxCIELabValue DcmTagKey(0x0072, 0x0421) #define DCM_StructuredDisplayImageBoxSequence DcmTagKey(0x0072, 0x0422) #define DCM_StructuredDisplayTextBoxSequence DcmTagKey(0x0072, 0x0424) #define DCM_ReferencedFirstFrameSequence DcmTagKey(0x0072, 0x0427) #define DCM_ImageBoxSynchronizationSequence DcmTagKey(0x0072, 0x0430) #define DCM_SynchronizedImageBoxList DcmTagKey(0x0072, 0x0432) #define DCM_TypeOfSynchronization DcmTagKey(0x0072, 0x0434) #define DCM_BlendingOperationType DcmTagKey(0x0072, 0x0500) #define DCM_ReformattingOperationType DcmTagKey(0x0072, 0x0510) #define DCM_ReformattingThickness DcmTagKey(0x0072, 0x0512) #define DCM_ReformattingInterval DcmTagKey(0x0072, 0x0514) #define DCM_ReformattingOperationInitialViewDirection DcmTagKey(0x0072, 0x0516) #define DCM_ThreeDRenderingType DcmTagKey(0x0072, 0x0520) #define DCM_SortingOperationsSequence DcmTagKey(0x0072, 0x0600) #define DCM_SortByCategory DcmTagKey(0x0072, 0x0602) #define DCM_SortingDirection DcmTagKey(0x0072, 0x0604) #define DCM_DisplaySetPatientOrientation DcmTagKey(0x0072, 0x0700) #define DCM_VOIType DcmTagKey(0x0072, 0x0702) #define DCM_PseudoColorType DcmTagKey(0x0072, 0x0704) #define DCM_ShowGrayscaleInverted DcmTagKey(0x0072, 0x0706) #define DCM_ShowImageTrueSizeFlag DcmTagKey(0x0072, 0x0710) #define DCM_ShowGraphicAnnotationFlag DcmTagKey(0x0072, 0x0712) #define DCM_ShowPatientDemographicsFlag DcmTagKey(0x0072, 0x0714) #define DCM_ShowAcquisitionTechniquesFlag DcmTagKey(0x0072, 0x0716) #define DCM_DisplaySetHorizontalJustification DcmTagKey(0x0072, 0x0717) #define DCM_DisplaySetVerticalJustification DcmTagKey(0x0072, 0x0718) #define DCM_UnifiedProcedureStepState DcmTagKey(0x0074, 0x1000) #define DCM_UnifiedProcedureStepProgressInformationSequence DcmTagKey(0x0074, 0x1002) #define DCM_UnifiedProcedureStepProgress DcmTagKey(0x0074, 0x1004) #define DCM_UnifiedProcedureStepProgressDescription DcmTagKey(0x0074, 0x1006) #define DCM_UnifiedProcedureStepCommunicationsURISequence DcmTagKey(0x0074, 0x1008) #define DCM_ContactURI DcmTagKey(0x0074, 0x100a) #define DCM_ContactDisplayName DcmTagKey(0x0074, 0x100c) #define DCM_UnifiedProcedureStepDiscontinuationReasonCodeSequence DcmTagKey(0x0074, 0x100e) #define DCM_BeamTaskSequence DcmTagKey(0x0074, 0x1020) #define DCM_BeamTaskType DcmTagKey(0x0074, 0x1022) #define DCM_BeamOrderIndex DcmTagKey(0x0074, 0x1024) #define DCM_DeliveryVerificationImageSequence DcmTagKey(0x0074, 0x1030) #define DCM_VerificationImageTiming DcmTagKey(0x0074, 0x1032) #define DCM_DoubleExposureFlag DcmTagKey(0x0074, 0x1034) #define DCM_DoubleExposureOrdering DcmTagKey(0x0074, 0x1036) #define DCM_DoubleExposureMeterset DcmTagKey(0x0074, 0x1038) #define DCM_DoubleExposureFieldDelta DcmTagKey(0x0074, 0x103a) #define DCM_RelatedReferenceRTImageSequence DcmTagKey(0x0074, 0x1040) #define DCM_GeneralMachineVerificationSequence DcmTagKey(0x0074, 0x1042) #define DCM_ConventionalMachineVerificationSequence DcmTagKey(0x0074, 0x1044) #define DCM_IonMachineVerificationSequence DcmTagKey(0x0074, 0x1046) #define DCM_FailedAttributesSequence DcmTagKey(0x0074, 0x1048) #define DCM_OverriddenAttributesSequence DcmTagKey(0x0074, 0x104a) #define DCM_ConventionalControlPointVerificationSequence DcmTagKey(0x0074, 0x104c) #define DCM_IonControlPointVerificationSequence DcmTagKey(0x0074, 0x104e) #define DCM_AttributeOccurrenceSequence DcmTagKey(0x0074, 0x1050) #define DCM_AttributeOccurrencePointer DcmTagKey(0x0074, 0x1052) #define DCM_AttributeItemSelector DcmTagKey(0x0074, 0x1054) #define DCM_AttributeOccurrencePrivateCreator DcmTagKey(0x0074, 0x1056) #define DCM_ScheduledProcedureStepPriority DcmTagKey(0x0074, 0x1200) #define DCM_WorklistLabel DcmTagKey(0x0074, 0x1202) #define DCM_ProcedureStepLabel DcmTagKey(0x0074, 0x1204) #define DCM_ScheduledProcessingParametersSequence DcmTagKey(0x0074, 0x1210) #define DCM_PerformedProcessingParametersSequence DcmTagKey(0x0074, 0x1212) #define DCM_UnifiedProcedureStepPerformedProcedureSequence DcmTagKey(0x0074, 0x1216) #define DCM_RelatedProcedureStepSequence DcmTagKey(0x0074, 0x1220) #define DCM_ProcedureStepRelationshipType DcmTagKey(0x0074, 0x1222) #define DCM_DeletionLock DcmTagKey(0x0074, 0x1230) #define DCM_ReceivingAE DcmTagKey(0x0074, 0x1234) #define DCM_RequestingAE DcmTagKey(0x0074, 0x1236) #define DCM_ReasonForCancellation DcmTagKey(0x0074, 0x1238) #define DCM_SCPStatus DcmTagKey(0x0074, 0x1242) #define DCM_SubscriptionListStatus DcmTagKey(0x0074, 0x1244) #define DCM_UnifiedProcedureStepListStatus DcmTagKey(0x0074, 0x1246) #define DCM_ImplantAssemblyTemplateName DcmTagKey(0x0076, 0x0001) #define DCM_ImplantAssemblyTemplateIssuer DcmTagKey(0x0076, 0x0003) #define DCM_ImplantAssemblyTemplateVersion DcmTagKey(0x0076, 0x0006) #define DCM_ReplacedImplantAssemblyTemplateSequence DcmTagKey(0x0076, 0x0008) #define DCM_ImplantAssemblyTemplateType DcmTagKey(0x0076, 0x000a) #define DCM_OriginalImplantAssemblyTemplateSequence DcmTagKey(0x0076, 0x000c) #define DCM_DerivationImplantAssemblyTemplateSequence DcmTagKey(0x0076, 0x000e) #define DCM_ImplantAssemblyTemplateTargetAnatomySequence DcmTagKey(0x0076, 0x0010) #define DCM_ProcedureTypeCodeSequence DcmTagKey(0x0076, 0x0020) #define DCM_SurgicalTechnique DcmTagKey(0x0076, 0x0030) #define DCM_ComponentTypesSequence DcmTagKey(0x0076, 0x0032) #define DCM_ComponentTypeCodeSequence DcmTagKey(0x0076, 0x0034) #define DCM_ExclusiveComponentType DcmTagKey(0x0076, 0x0036) #define DCM_MandatoryComponentType DcmTagKey(0x0076, 0x0038) #define DCM_ComponentSequence DcmTagKey(0x0076, 0x0040) #define DCM_ComponentID DcmTagKey(0x0076, 0x0055) #define DCM_ComponentAssemblySequence DcmTagKey(0x0076, 0x0060) #define DCM_Component1ReferencedID DcmTagKey(0x0076, 0x0070) #define DCM_Component1ReferencedMatingFeatureSetID DcmTagKey(0x0076, 0x0080) #define DCM_Component1ReferencedMatingFeatureID DcmTagKey(0x0076, 0x0090) #define DCM_Component2ReferencedID DcmTagKey(0x0076, 0x00a0) #define DCM_Component2ReferencedMatingFeatureSetID DcmTagKey(0x0076, 0x00b0) #define DCM_Component2ReferencedMatingFeatureID DcmTagKey(0x0076, 0x00c0) #define DCM_ImplantTemplateGroupName DcmTagKey(0x0078, 0x0000) #define DCM_ImplantTemplateGroupDescription DcmTagKey(0x0078, 0x0010) #define DCM_ImplantTemplateGroupIssuer DcmTagKey(0x0078, 0x0020) #define DCM_ImplantTemplateGroupVersion DcmTagKey(0x0078, 0x0024) #define DCM_ReplacedImplantTemplateGroupSequence DcmTagKey(0x0078, 0x0026) #define DCM_ImplantTemplateGroupTargetAnatomySequence DcmTagKey(0x0078, 0x0028) #define DCM_ImplantTemplateGroupMembersSequence DcmTagKey(0x0078, 0x002a) #define DCM_ImplantTemplateGroupMemberID DcmTagKey(0x0078, 0x002e) #define DCM_ThreeDImplantTemplateGroupMemberMatchingPoint DcmTagKey(0x0078, 0x0050) #define DCM_ThreeDImplantTemplateGroupMemberMatchingAxes DcmTagKey(0x0078, 0x0060) #define DCM_ImplantTemplateGroupMemberMatching2DCoordinatesSequence DcmTagKey(0x0078, 0x0070) #define DCM_TwoDImplantTemplateGroupMemberMatchingPoint DcmTagKey(0x0078, 0x0090) #define DCM_TwoDImplantTemplateGroupMemberMatchingAxes DcmTagKey(0x0078, 0x00a0) #define DCM_ImplantTemplateGroupVariationDimensionSequence DcmTagKey(0x0078, 0x00b0) #define DCM_ImplantTemplateGroupVariationDimensionName DcmTagKey(0x0078, 0x00b2) #define DCM_ImplantTemplateGroupVariationDimensionRankSequence DcmTagKey(0x0078, 0x00b4) #define DCM_ReferencedImplantTemplateGroupMemberID DcmTagKey(0x0078, 0x00b6) #define DCM_ImplantTemplateGroupVariationDimensionRank DcmTagKey(0x0078, 0x00b8) #define DCM_StorageMediaFileSetID DcmTagKey(0x0088, 0x0130) #define DCM_StorageMediaFileSetUID DcmTagKey(0x0088, 0x0140) #define DCM_IconImageSequence DcmTagKey(0x0088, 0x0200) #define DCM_RETIRED_TopicTitle DcmTagKey(0x0088, 0x0904) #define DCM_RETIRED_TopicSubject DcmTagKey(0x0088, 0x0906) #define DCM_RETIRED_TopicAuthor DcmTagKey(0x0088, 0x0910) #define DCM_RETIRED_TopicKeywords DcmTagKey(0x0088, 0x0912) #define DCM_SOPInstanceStatus DcmTagKey(0x0100, 0x0410) #define DCM_SOPAuthorizationDateTime DcmTagKey(0x0100, 0x0420) #define DCM_SOPAuthorizationComment DcmTagKey(0x0100, 0x0424) #define DCM_AuthorizationEquipmentCertificationNumber DcmTagKey(0x0100, 0x0426) #define DCM_MACIDNumber DcmTagKey(0x0400, 0x0005) #define DCM_MACCalculationTransferSyntaxUID DcmTagKey(0x0400, 0x0010) #define DCM_MACAlgorithm DcmTagKey(0x0400, 0x0015) #define DCM_DataElementsSigned DcmTagKey(0x0400, 0x0020) #define DCM_DigitalSignatureUID DcmTagKey(0x0400, 0x0100) #define DCM_DigitalSignatureDateTime DcmTagKey(0x0400, 0x0105) #define DCM_CertificateType DcmTagKey(0x0400, 0x0110) #define DCM_CertificateOfSigner DcmTagKey(0x0400, 0x0115) #define DCM_Signature DcmTagKey(0x0400, 0x0120) #define DCM_CertifiedTimestampType DcmTagKey(0x0400, 0x0305) #define DCM_CertifiedTimestamp DcmTagKey(0x0400, 0x0310) #define DCM_DigitalSignaturePurposeCodeSequence DcmTagKey(0x0400, 0x0401) #define DCM_ReferencedDigitalSignatureSequence DcmTagKey(0x0400, 0x0402) #define DCM_ReferencedSOPInstanceMACSequence DcmTagKey(0x0400, 0x0403) #define DCM_MAC DcmTagKey(0x0400, 0x0404) #define DCM_EncryptedAttributesSequence DcmTagKey(0x0400, 0x0500) #define DCM_EncryptedContentTransferSyntaxUID DcmTagKey(0x0400, 0x0510) #define DCM_EncryptedContent DcmTagKey(0x0400, 0x0520) #define DCM_ModifiedAttributesSequence DcmTagKey(0x0400, 0x0550) #define DCM_OriginalAttributesSequence DcmTagKey(0x0400, 0x0561) #define DCM_AttributeModificationDateTime DcmTagKey(0x0400, 0x0562) #define DCM_ModifyingSystem DcmTagKey(0x0400, 0x0563) #define DCM_SourceOfPreviousValues DcmTagKey(0x0400, 0x0564) #define DCM_ReasonForTheAttributeModification DcmTagKey(0x0400, 0x0565) #define DCM_ACR_NEMA_2C_CodeTableGroupLength DcmTagKey(0x1000, 0x0000) #define DCM_ACR_NEMA_2C_EscapeTriplet DcmTagKey(0x1000, 0x0010) #define DCM_ACR_NEMA_2C_RunLengthTriplet DcmTagKey(0x1000, 0x0011) #define DCM_ACR_NEMA_2C_HuffmanTableSize DcmTagKey(0x1000, 0x0012) #define DCM_ACR_NEMA_2C_HuffmanTableTriplet DcmTagKey(0x1000, 0x0013) #define DCM_ACR_NEMA_2C_ShiftTableSize DcmTagKey(0x1000, 0x0014) #define DCM_ACR_NEMA_2C_ShiftTableTriplet DcmTagKey(0x1000, 0x0015) #define DCM_ACR_NEMA_2C_ZonalMapGroupLength DcmTagKey(0x1010, 0x0000) #define DCM_ACR_NEMA_2C_ZonalMap DcmTagKey(0x1010, 0x0004) #define DCM_NumberOfCopies DcmTagKey(0x2000, 0x0010) #define DCM_PrinterConfigurationSequence DcmTagKey(0x2000, 0x001e) #define DCM_PrintPriority DcmTagKey(0x2000, 0x0020) #define DCM_MediumType DcmTagKey(0x2000, 0x0030) #define DCM_FilmDestination DcmTagKey(0x2000, 0x0040) #define DCM_FilmSessionLabel DcmTagKey(0x2000, 0x0050) #define DCM_MemoryAllocation DcmTagKey(0x2000, 0x0060) #define DCM_MaximumMemoryAllocation DcmTagKey(0x2000, 0x0061) #define DCM_RETIRED_ColorImagePrintingFlag DcmTagKey(0x2000, 0x0062) #define DCM_RETIRED_CollationFlag DcmTagKey(0x2000, 0x0063) #define DCM_RETIRED_AnnotationFlag DcmTagKey(0x2000, 0x0065) #define DCM_RETIRED_ImageOverlayFlag DcmTagKey(0x2000, 0x0067) #define DCM_RETIRED_PresentationLUTFlag DcmTagKey(0x2000, 0x0069) #define DCM_RETIRED_ImageBoxPresentationLUTFlag DcmTagKey(0x2000, 0x006a) #define DCM_MemoryBitDepth DcmTagKey(0x2000, 0x00a0) #define DCM_PrintingBitDepth DcmTagKey(0x2000, 0x00a1) #define DCM_MediaInstalledSequence DcmTagKey(0x2000, 0x00a2) #define DCM_OtherMediaAvailableSequence DcmTagKey(0x2000, 0x00a4) #define DCM_SupportedImageDisplayFormatsSequence DcmTagKey(0x2000, 0x00a8) #define DCM_ReferencedFilmBoxSequence DcmTagKey(0x2000, 0x0500) #define DCM_RETIRED_ReferencedStoredPrintSequence DcmTagKey(0x2000, 0x0510) #define DCM_ImageDisplayFormat DcmTagKey(0x2010, 0x0010) #define DCM_AnnotationDisplayFormatID DcmTagKey(0x2010, 0x0030) #define DCM_FilmOrientation DcmTagKey(0x2010, 0x0040) #define DCM_FilmSizeID DcmTagKey(0x2010, 0x0050) #define DCM_PrinterResolutionID DcmTagKey(0x2010, 0x0052) #define DCM_DefaultPrinterResolutionID DcmTagKey(0x2010, 0x0054) #define DCM_MagnificationType DcmTagKey(0x2010, 0x0060) #define DCM_SmoothingType DcmTagKey(0x2010, 0x0080) #define DCM_DefaultMagnificationType DcmTagKey(0x2010, 0x00a6) #define DCM_OtherMagnificationTypesAvailable DcmTagKey(0x2010, 0x00a7) #define DCM_DefaultSmoothingType DcmTagKey(0x2010, 0x00a8) #define DCM_OtherSmoothingTypesAvailable DcmTagKey(0x2010, 0x00a9) #define DCM_BorderDensity DcmTagKey(0x2010, 0x0100) #define DCM_EmptyImageDensity DcmTagKey(0x2010, 0x0110) #define DCM_MinDensity DcmTagKey(0x2010, 0x0120) #define DCM_MaxDensity DcmTagKey(0x2010, 0x0130) #define DCM_Trim DcmTagKey(0x2010, 0x0140) #define DCM_ConfigurationInformation DcmTagKey(0x2010, 0x0150) #define DCM_ConfigurationInformationDescription DcmTagKey(0x2010, 0x0152) #define DCM_MaximumCollatedFilms DcmTagKey(0x2010, 0x0154) #define DCM_Illumination DcmTagKey(0x2010, 0x015e) #define DCM_ReflectedAmbientLight DcmTagKey(0x2010, 0x0160) #define DCM_PrinterPixelSpacing DcmTagKey(0x2010, 0x0376) #define DCM_ReferencedFilmSessionSequence DcmTagKey(0x2010, 0x0500) #define DCM_ReferencedImageBoxSequence DcmTagKey(0x2010, 0x0510) #define DCM_ReferencedBasicAnnotationBoxSequence DcmTagKey(0x2010, 0x0520) #define DCM_ImageBoxPosition DcmTagKey(0x2020, 0x0010) #define DCM_Polarity DcmTagKey(0x2020, 0x0020) #define DCM_RequestedImageSize DcmTagKey(0x2020, 0x0030) #define DCM_RequestedDecimateCropBehavior DcmTagKey(0x2020, 0x0040) #define DCM_RequestedResolutionID DcmTagKey(0x2020, 0x0050) #define DCM_RequestedImageSizeFlag DcmTagKey(0x2020, 0x00a0) #define DCM_DecimateCropResult DcmTagKey(0x2020, 0x00a2) #define DCM_BasicGrayscaleImageSequence DcmTagKey(0x2020, 0x0110) #define DCM_BasicColorImageSequence DcmTagKey(0x2020, 0x0111) #define DCM_RETIRED_ReferencedImageOverlayBoxSequence DcmTagKey(0x2020, 0x0130) #define DCM_RETIRED_ReferencedVOILUTBoxSequence DcmTagKey(0x2020, 0x0140) #define DCM_AnnotationPosition DcmTagKey(0x2030, 0x0010) #define DCM_TextString DcmTagKey(0x2030, 0x0020) #define DCM_RETIRED_ReferencedOverlayPlaneSequence DcmTagKey(0x2040, 0x0010) #define DCM_RETIRED_ReferencedOverlayPlaneGroups DcmTagKey(0x2040, 0x0011) #define DCM_RETIRED_OverlayPixelDataSequence DcmTagKey(0x2040, 0x0020) #define DCM_RETIRED_OverlayMagnificationType DcmTagKey(0x2040, 0x0060) #define DCM_RETIRED_OverlaySmoothingType DcmTagKey(0x2040, 0x0070) #define DCM_RETIRED_OverlayOrImageMagnification DcmTagKey(0x2040, 0x0072) #define DCM_RETIRED_MagnifyToNumberOfColumns DcmTagKey(0x2040, 0x0074) #define DCM_RETIRED_OverlayForegroundDensity DcmTagKey(0x2040, 0x0080) #define DCM_RETIRED_OverlayBackgroundDensity DcmTagKey(0x2040, 0x0082) #define DCM_RETIRED_OverlayMode DcmTagKey(0x2040, 0x0090) #define DCM_RETIRED_ThresholdDensity DcmTagKey(0x2040, 0x0100) #define DCM_RETIRED_ReferencedImageBoxSequenceRetired DcmTagKey(0x2040, 0x0500) #define DCM_PresentationLUTSequence DcmTagKey(0x2050, 0x0010) #define DCM_PresentationLUTShape DcmTagKey(0x2050, 0x0020) #define DCM_ReferencedPresentationLUTSequence DcmTagKey(0x2050, 0x0500) #define DCM_RETIRED_PrintJobID DcmTagKey(0x2100, 0x0010) #define DCM_ExecutionStatus DcmTagKey(0x2100, 0x0020) #define DCM_ExecutionStatusInfo DcmTagKey(0x2100, 0x0030) #define DCM_CreationDate DcmTagKey(0x2100, 0x0040) #define DCM_CreationTime DcmTagKey(0x2100, 0x0050) #define DCM_Originator DcmTagKey(0x2100, 0x0070) #define DCM_RETIRED_DestinationAE DcmTagKey(0x2100, 0x0140) #define DCM_OwnerID DcmTagKey(0x2100, 0x0160) #define DCM_NumberOfFilms DcmTagKey(0x2100, 0x0170) #define DCM_RETIRED_ReferencedPrintJobSequencePullStoredPrint DcmTagKey(0x2100, 0x0500) #define DCM_PrinterStatus DcmTagKey(0x2110, 0x0010) #define DCM_PrinterStatusInfo DcmTagKey(0x2110, 0x0020) #define DCM_PrinterName DcmTagKey(0x2110, 0x0030) #define DCM_RETIRED_PrintQueueID DcmTagKey(0x2110, 0x0099) #define DCM_RETIRED_QueueStatus DcmTagKey(0x2120, 0x0010) #define DCM_RETIRED_PrintJobDescriptionSequence DcmTagKey(0x2120, 0x0050) #define DCM_RETIRED_ReferencedPrintJobSequence DcmTagKey(0x2120, 0x0070) #define DCM_RETIRED_PrintManagementCapabilitiesSequence DcmTagKey(0x2130, 0x0010) #define DCM_RETIRED_PrinterCharacteristicsSequence DcmTagKey(0x2130, 0x0015) #define DCM_RETIRED_FilmBoxContentSequence DcmTagKey(0x2130, 0x0030) #define DCM_RETIRED_ImageBoxContentSequence DcmTagKey(0x2130, 0x0040) #define DCM_RETIRED_AnnotationContentSequence DcmTagKey(0x2130, 0x0050) #define DCM_RETIRED_ImageOverlayBoxContentSequence DcmTagKey(0x2130, 0x0060) #define DCM_RETIRED_PresentationLUTContentSequence DcmTagKey(0x2130, 0x0080) #define DCM_RETIRED_ProposedStudySequence DcmTagKey(0x2130, 0x00a0) #define DCM_RETIRED_OriginalImageSequence DcmTagKey(0x2130, 0x00c0) #define DCM_LabelUsingInformationExtractedFromInstances DcmTagKey(0x2200, 0x0001) #define DCM_LabelText DcmTagKey(0x2200, 0x0002) #define DCM_LabelStyleSelection DcmTagKey(0x2200, 0x0003) #define DCM_MediaDisposition DcmTagKey(0x2200, 0x0004) #define DCM_BarcodeValue DcmTagKey(0x2200, 0x0005) #define DCM_BarcodeSymbology DcmTagKey(0x2200, 0x0006) #define DCM_AllowMediaSplitting DcmTagKey(0x2200, 0x0007) #define DCM_IncludeNonDICOMObjects DcmTagKey(0x2200, 0x0008) #define DCM_IncludeDisplayApplication DcmTagKey(0x2200, 0x0009) #define DCM_PreserveCompositeInstancesAfterMediaCreation DcmTagKey(0x2200, 0x000a) #define DCM_TotalNumberOfPiecesOfMediaCreated DcmTagKey(0x2200, 0x000b) #define DCM_RequestedMediaApplicationProfile DcmTagKey(0x2200, 0x000c) #define DCM_ReferencedStorageMediaSequence DcmTagKey(0x2200, 0x000d) #define DCM_FailureAttributes DcmTagKey(0x2200, 0x000e) #define DCM_AllowLossyCompression DcmTagKey(0x2200, 0x000f) #define DCM_RequestPriority DcmTagKey(0x2200, 0x0020) #define DCM_RTImageLabel DcmTagKey(0x3002, 0x0002) #define DCM_RTImageName DcmTagKey(0x3002, 0x0003) #define DCM_RTImageDescription DcmTagKey(0x3002, 0x0004) #define DCM_ReportedValuesOrigin DcmTagKey(0x3002, 0x000a) #define DCM_RTImagePlane DcmTagKey(0x3002, 0x000c) #define DCM_XRayImageReceptorTranslation DcmTagKey(0x3002, 0x000d) #define DCM_XRayImageReceptorAngle DcmTagKey(0x3002, 0x000e) #define DCM_RTImageOrientation DcmTagKey(0x3002, 0x0010) #define DCM_ImagePlanePixelSpacing DcmTagKey(0x3002, 0x0011) #define DCM_RTImagePosition DcmTagKey(0x3002, 0x0012) #define DCM_RadiationMachineName DcmTagKey(0x3002, 0x0020) #define DCM_RadiationMachineSAD DcmTagKey(0x3002, 0x0022) #define DCM_RadiationMachineSSD DcmTagKey(0x3002, 0x0024) #define DCM_RTImageSID DcmTagKey(0x3002, 0x0026) #define DCM_SourceToReferenceObjectDistance DcmTagKey(0x3002, 0x0028) #define DCM_FractionNumber DcmTagKey(0x3002, 0x0029) #define DCM_ExposureSequence DcmTagKey(0x3002, 0x0030) #define DCM_MetersetExposure DcmTagKey(0x3002, 0x0032) #define DCM_DiaphragmPosition DcmTagKey(0x3002, 0x0034) #define DCM_FluenceMapSequence DcmTagKey(0x3002, 0x0040) #define DCM_FluenceDataSource DcmTagKey(0x3002, 0x0041) #define DCM_FluenceDataScale DcmTagKey(0x3002, 0x0042) #define DCM_PrimaryFluenceModeSequence DcmTagKey(0x3002, 0x0050) #define DCM_FluenceMode DcmTagKey(0x3002, 0x0051) #define DCM_FluenceModeID DcmTagKey(0x3002, 0x0052) #define DCM_DVHType DcmTagKey(0x3004, 0x0001) #define DCM_DoseUnits DcmTagKey(0x3004, 0x0002) #define DCM_DoseType DcmTagKey(0x3004, 0x0004) #define DCM_DoseComment DcmTagKey(0x3004, 0x0006) #define DCM_NormalizationPoint DcmTagKey(0x3004, 0x0008) #define DCM_DoseSummationType DcmTagKey(0x3004, 0x000a) #define DCM_GridFrameOffsetVector DcmTagKey(0x3004, 0x000c) #define DCM_DoseGridScaling DcmTagKey(0x3004, 0x000e) #define DCM_RTDoseROISequence DcmTagKey(0x3004, 0x0010) #define DCM_DoseValue DcmTagKey(0x3004, 0x0012) #define DCM_TissueHeterogeneityCorrection DcmTagKey(0x3004, 0x0014) #define DCM_DVHNormalizationPoint DcmTagKey(0x3004, 0x0040) #define DCM_DVHNormalizationDoseValue DcmTagKey(0x3004, 0x0042) #define DCM_DVHSequence DcmTagKey(0x3004, 0x0050) #define DCM_DVHDoseScaling DcmTagKey(0x3004, 0x0052) #define DCM_DVHVolumeUnits DcmTagKey(0x3004, 0x0054) #define DCM_DVHNumberOfBins DcmTagKey(0x3004, 0x0056) #define DCM_DVHData DcmTagKey(0x3004, 0x0058) #define DCM_DVHReferencedROISequence DcmTagKey(0x3004, 0x0060) #define DCM_DVHROIContributionType DcmTagKey(0x3004, 0x0062) #define DCM_DVHMinimumDose DcmTagKey(0x3004, 0x0070) #define DCM_DVHMaximumDose DcmTagKey(0x3004, 0x0072) #define DCM_DVHMeanDose DcmTagKey(0x3004, 0x0074) #define DCM_StructureSetLabel DcmTagKey(0x3006, 0x0002) #define DCM_StructureSetName DcmTagKey(0x3006, 0x0004) #define DCM_StructureSetDescription DcmTagKey(0x3006, 0x0006) #define DCM_StructureSetDate DcmTagKey(0x3006, 0x0008) #define DCM_StructureSetTime DcmTagKey(0x3006, 0x0009) #define DCM_ReferencedFrameOfReferenceSequence DcmTagKey(0x3006, 0x0010) #define DCM_RTReferencedStudySequence DcmTagKey(0x3006, 0x0012) #define DCM_RTReferencedSeriesSequence DcmTagKey(0x3006, 0x0014) #define DCM_ContourImageSequence DcmTagKey(0x3006, 0x0016) #define DCM_StructureSetROISequence DcmTagKey(0x3006, 0x0020) #define DCM_ROINumber DcmTagKey(0x3006, 0x0022) #define DCM_ReferencedFrameOfReferenceUID DcmTagKey(0x3006, 0x0024) #define DCM_ROIName DcmTagKey(0x3006, 0x0026) #define DCM_ROIDescription DcmTagKey(0x3006, 0x0028) #define DCM_ROIDisplayColor DcmTagKey(0x3006, 0x002a) #define DCM_ROIVolume DcmTagKey(0x3006, 0x002c) #define DCM_RTRelatedROISequence DcmTagKey(0x3006, 0x0030) #define DCM_RTROIRelationship DcmTagKey(0x3006, 0x0033) #define DCM_ROIGenerationAlgorithm DcmTagKey(0x3006, 0x0036) #define DCM_ROIGenerationDescription DcmTagKey(0x3006, 0x0038) #define DCM_ROIContourSequence DcmTagKey(0x3006, 0x0039) #define DCM_ContourSequence DcmTagKey(0x3006, 0x0040) #define DCM_ContourGeometricType DcmTagKey(0x3006, 0x0042) #define DCM_ContourSlabThickness DcmTagKey(0x3006, 0x0044) #define DCM_ContourOffsetVector DcmTagKey(0x3006, 0x0045) #define DCM_NumberOfContourPoints DcmTagKey(0x3006, 0x0046) #define DCM_ContourNumber DcmTagKey(0x3006, 0x0048) #define DCM_AttachedContours DcmTagKey(0x3006, 0x0049) #define DCM_ContourData DcmTagKey(0x3006, 0x0050) #define DCM_RTROIObservationsSequence DcmTagKey(0x3006, 0x0080) #define DCM_ObservationNumber DcmTagKey(0x3006, 0x0082) #define DCM_ReferencedROINumber DcmTagKey(0x3006, 0x0084) #define DCM_ROIObservationLabel DcmTagKey(0x3006, 0x0085) #define DCM_RTROIIdentificationCodeSequence DcmTagKey(0x3006, 0x0086) #define DCM_ROIObservationDescription DcmTagKey(0x3006, 0x0088) #define DCM_RelatedRTROIObservationsSequence DcmTagKey(0x3006, 0x00a0) #define DCM_RTROIInterpretedType DcmTagKey(0x3006, 0x00a4) #define DCM_ROIInterpreter DcmTagKey(0x3006, 0x00a6) #define DCM_ROIPhysicalPropertiesSequence DcmTagKey(0x3006, 0x00b0) #define DCM_ROIPhysicalProperty DcmTagKey(0x3006, 0x00b2) #define DCM_ROIPhysicalPropertyValue DcmTagKey(0x3006, 0x00b4) #define DCM_ROIElementalCompositionSequence DcmTagKey(0x3006, 0x00b6) #define DCM_ROIElementalCompositionAtomicNumber DcmTagKey(0x3006, 0x00b7) #define DCM_ROIElementalCompositionAtomicMassFraction DcmTagKey(0x3006, 0x00b8) #define DCM_FrameOfReferenceRelationshipSequence DcmTagKey(0x3006, 0x00c0) #define DCM_RelatedFrameOfReferenceUID DcmTagKey(0x3006, 0x00c2) #define DCM_FrameOfReferenceTransformationType DcmTagKey(0x3006, 0x00c4) #define DCM_FrameOfReferenceTransformationMatrix DcmTagKey(0x3006, 0x00c6) #define DCM_FrameOfReferenceTransformationComment DcmTagKey(0x3006, 0x00c8) #define DCM_MeasuredDoseReferenceSequence DcmTagKey(0x3008, 0x0010) #define DCM_MeasuredDoseDescription DcmTagKey(0x3008, 0x0012) #define DCM_MeasuredDoseType DcmTagKey(0x3008, 0x0014) #define DCM_MeasuredDoseValue DcmTagKey(0x3008, 0x0016) #define DCM_TreatmentSessionBeamSequence DcmTagKey(0x3008, 0x0020) #define DCM_TreatmentSessionIonBeamSequence DcmTagKey(0x3008, 0x0021) #define DCM_CurrentFractionNumber DcmTagKey(0x3008, 0x0022) #define DCM_TreatmentControlPointDate DcmTagKey(0x3008, 0x0024) #define DCM_TreatmentControlPointTime DcmTagKey(0x3008, 0x0025) #define DCM_TreatmentTerminationStatus DcmTagKey(0x3008, 0x002a) #define DCM_TreatmentTerminationCode DcmTagKey(0x3008, 0x002b) #define DCM_TreatmentVerificationStatus DcmTagKey(0x3008, 0x002c) #define DCM_ReferencedTreatmentRecordSequence DcmTagKey(0x3008, 0x0030) #define DCM_SpecifiedPrimaryMeterset DcmTagKey(0x3008, 0x0032) #define DCM_SpecifiedSecondaryMeterset DcmTagKey(0x3008, 0x0033) #define DCM_DeliveredPrimaryMeterset DcmTagKey(0x3008, 0x0036) #define DCM_DeliveredSecondaryMeterset DcmTagKey(0x3008, 0x0037) #define DCM_SpecifiedTreatmentTime DcmTagKey(0x3008, 0x003a) #define DCM_DeliveredTreatmentTime DcmTagKey(0x3008, 0x003b) #define DCM_ControlPointDeliverySequence DcmTagKey(0x3008, 0x0040) #define DCM_IonControlPointDeliverySequence DcmTagKey(0x3008, 0x0041) #define DCM_SpecifiedMeterset DcmTagKey(0x3008, 0x0042) #define DCM_DeliveredMeterset DcmTagKey(0x3008, 0x0044) #define DCM_MetersetRateSet DcmTagKey(0x3008, 0x0045) #define DCM_MetersetRateDelivered DcmTagKey(0x3008, 0x0046) #define DCM_ScanSpotMetersetsDelivered DcmTagKey(0x3008, 0x0047) #define DCM_DoseRateDelivered DcmTagKey(0x3008, 0x0048) #define DCM_TreatmentSummaryCalculatedDoseReferenceSequence DcmTagKey(0x3008, 0x0050) #define DCM_CumulativeDoseToDoseReference DcmTagKey(0x3008, 0x0052) #define DCM_FirstTreatmentDate DcmTagKey(0x3008, 0x0054) #define DCM_MostRecentTreatmentDate DcmTagKey(0x3008, 0x0056) #define DCM_NumberOfFractionsDelivered DcmTagKey(0x3008, 0x005a) #define DCM_OverrideSequence DcmTagKey(0x3008, 0x0060) #define DCM_ParameterSequencePointer DcmTagKey(0x3008, 0x0061) #define DCM_OverrideParameterPointer DcmTagKey(0x3008, 0x0062) #define DCM_ParameterItemIndex DcmTagKey(0x3008, 0x0063) #define DCM_MeasuredDoseReferenceNumber DcmTagKey(0x3008, 0x0064) #define DCM_ParameterPointer DcmTagKey(0x3008, 0x0065) #define DCM_OverrideReason DcmTagKey(0x3008, 0x0066) #define DCM_CorrectedParameterSequence DcmTagKey(0x3008, 0x0068) #define DCM_CorrectionValue DcmTagKey(0x3008, 0x006a) #define DCM_CalculatedDoseReferenceSequence DcmTagKey(0x3008, 0x0070) #define DCM_CalculatedDoseReferenceNumber DcmTagKey(0x3008, 0x0072) #define DCM_CalculatedDoseReferenceDescription DcmTagKey(0x3008, 0x0074) #define DCM_CalculatedDoseReferenceDoseValue DcmTagKey(0x3008, 0x0076) #define DCM_StartMeterset DcmTagKey(0x3008, 0x0078) #define DCM_EndMeterset DcmTagKey(0x3008, 0x007a) #define DCM_ReferencedMeasuredDoseReferenceSequence DcmTagKey(0x3008, 0x0080) #define DCM_ReferencedMeasuredDoseReferenceNumber DcmTagKey(0x3008, 0x0082) #define DCM_ReferencedCalculatedDoseReferenceSequence DcmTagKey(0x3008, 0x0090) #define DCM_ReferencedCalculatedDoseReferenceNumber DcmTagKey(0x3008, 0x0092) #define DCM_BeamLimitingDeviceLeafPairsSequence DcmTagKey(0x3008, 0x00a0) #define DCM_RecordedWedgeSequence DcmTagKey(0x3008, 0x00b0) #define DCM_RecordedCompensatorSequence DcmTagKey(0x3008, 0x00c0) #define DCM_RecordedBlockSequence DcmTagKey(0x3008, 0x00d0) #define DCM_TreatmentSummaryMeasuredDoseReferenceSequence DcmTagKey(0x3008, 0x00e0) #define DCM_RecordedSnoutSequence DcmTagKey(0x3008, 0x00f0) #define DCM_RecordedRangeShifterSequence DcmTagKey(0x3008, 0x00f2) #define DCM_RecordedLateralSpreadingDeviceSequence DcmTagKey(0x3008, 0x00f4) #define DCM_RecordedRangeModulatorSequence DcmTagKey(0x3008, 0x00f6) #define DCM_RecordedSourceSequence DcmTagKey(0x3008, 0x0100) #define DCM_SourceSerialNumber DcmTagKey(0x3008, 0x0105) #define DCM_TreatmentSessionApplicationSetupSequence DcmTagKey(0x3008, 0x0110) #define DCM_ApplicationSetupCheck DcmTagKey(0x3008, 0x0116) #define DCM_RecordedBrachyAccessoryDeviceSequence DcmTagKey(0x3008, 0x0120) #define DCM_ReferencedBrachyAccessoryDeviceNumber DcmTagKey(0x3008, 0x0122) #define DCM_RecordedChannelSequence DcmTagKey(0x3008, 0x0130) #define DCM_SpecifiedChannelTotalTime DcmTagKey(0x3008, 0x0132) #define DCM_DeliveredChannelTotalTime DcmTagKey(0x3008, 0x0134) #define DCM_SpecifiedNumberOfPulses DcmTagKey(0x3008, 0x0136) #define DCM_DeliveredNumberOfPulses DcmTagKey(0x3008, 0x0138) #define DCM_SpecifiedPulseRepetitionInterval DcmTagKey(0x3008, 0x013a) #define DCM_DeliveredPulseRepetitionInterval DcmTagKey(0x3008, 0x013c) #define DCM_RecordedSourceApplicatorSequence DcmTagKey(0x3008, 0x0140) #define DCM_ReferencedSourceApplicatorNumber DcmTagKey(0x3008, 0x0142) #define DCM_RecordedChannelShieldSequence DcmTagKey(0x3008, 0x0150) #define DCM_ReferencedChannelShieldNumber DcmTagKey(0x3008, 0x0152) #define DCM_BrachyControlPointDeliveredSequence DcmTagKey(0x3008, 0x0160) #define DCM_SafePositionExitDate DcmTagKey(0x3008, 0x0162) #define DCM_SafePositionExitTime DcmTagKey(0x3008, 0x0164) #define DCM_SafePositionReturnDate DcmTagKey(0x3008, 0x0166) #define DCM_SafePositionReturnTime DcmTagKey(0x3008, 0x0168) #define DCM_CurrentTreatmentStatus DcmTagKey(0x3008, 0x0200) #define DCM_TreatmentStatusComment DcmTagKey(0x3008, 0x0202) #define DCM_FractionGroupSummarySequence DcmTagKey(0x3008, 0x0220) #define DCM_ReferencedFractionNumber DcmTagKey(0x3008, 0x0223) #define DCM_FractionGroupType DcmTagKey(0x3008, 0x0224) #define DCM_BeamStopperPosition DcmTagKey(0x3008, 0x0230) #define DCM_FractionStatusSummarySequence DcmTagKey(0x3008, 0x0240) #define DCM_TreatmentDate DcmTagKey(0x3008, 0x0250) #define DCM_TreatmentTime DcmTagKey(0x3008, 0x0251) #define DCM_RTPlanLabel DcmTagKey(0x300a, 0x0002) #define DCM_RTPlanName DcmTagKey(0x300a, 0x0003) #define DCM_RTPlanDescription DcmTagKey(0x300a, 0x0004) #define DCM_RTPlanDate DcmTagKey(0x300a, 0x0006) #define DCM_RTPlanTime DcmTagKey(0x300a, 0x0007) #define DCM_TreatmentProtocols DcmTagKey(0x300a, 0x0009) #define DCM_PlanIntent DcmTagKey(0x300a, 0x000a) #define DCM_TreatmentSites DcmTagKey(0x300a, 0x000b) #define DCM_RTPlanGeometry DcmTagKey(0x300a, 0x000c) #define DCM_PrescriptionDescription DcmTagKey(0x300a, 0x000e) #define DCM_DoseReferenceSequence DcmTagKey(0x300a, 0x0010) #define DCM_DoseReferenceNumber DcmTagKey(0x300a, 0x0012) #define DCM_DoseReferenceUID DcmTagKey(0x300a, 0x0013) #define DCM_DoseReferenceStructureType DcmTagKey(0x300a, 0x0014) #define DCM_NominalBeamEnergyUnit DcmTagKey(0x300a, 0x0015) #define DCM_DoseReferenceDescription DcmTagKey(0x300a, 0x0016) #define DCM_DoseReferencePointCoordinates DcmTagKey(0x300a, 0x0018) #define DCM_NominalPriorDose DcmTagKey(0x300a, 0x001a) #define DCM_DoseReferenceType DcmTagKey(0x300a, 0x0020) #define DCM_ConstraintWeight DcmTagKey(0x300a, 0x0021) #define DCM_DeliveryWarningDose DcmTagKey(0x300a, 0x0022) #define DCM_DeliveryMaximumDose DcmTagKey(0x300a, 0x0023) #define DCM_TargetMinimumDose DcmTagKey(0x300a, 0x0025) #define DCM_TargetPrescriptionDose DcmTagKey(0x300a, 0x0026) #define DCM_TargetMaximumDose DcmTagKey(0x300a, 0x0027) #define DCM_TargetUnderdoseVolumeFraction DcmTagKey(0x300a, 0x0028) #define DCM_OrganAtRiskFullVolumeDose DcmTagKey(0x300a, 0x002a) #define DCM_OrganAtRiskLimitDose DcmTagKey(0x300a, 0x002b) #define DCM_OrganAtRiskMaximumDose DcmTagKey(0x300a, 0x002c) #define DCM_OrganAtRiskOverdoseVolumeFraction DcmTagKey(0x300a, 0x002d) #define DCM_ToleranceTableSequence DcmTagKey(0x300a, 0x0040) #define DCM_ToleranceTableNumber DcmTagKey(0x300a, 0x0042) #define DCM_ToleranceTableLabel DcmTagKey(0x300a, 0x0043) #define DCM_GantryAngleTolerance DcmTagKey(0x300a, 0x0044) #define DCM_BeamLimitingDeviceAngleTolerance DcmTagKey(0x300a, 0x0046) #define DCM_BeamLimitingDeviceToleranceSequence DcmTagKey(0x300a, 0x0048) #define DCM_BeamLimitingDevicePositionTolerance DcmTagKey(0x300a, 0x004a) #define DCM_SnoutPositionTolerance DcmTagKey(0x300a, 0x004b) #define DCM_PatientSupportAngleTolerance DcmTagKey(0x300a, 0x004c) #define DCM_TableTopEccentricAngleTolerance DcmTagKey(0x300a, 0x004e) #define DCM_TableTopPitchAngleTolerance DcmTagKey(0x300a, 0x004f) #define DCM_TableTopRollAngleTolerance DcmTagKey(0x300a, 0x0050) #define DCM_TableTopVerticalPositionTolerance DcmTagKey(0x300a, 0x0051) #define DCM_TableTopLongitudinalPositionTolerance DcmTagKey(0x300a, 0x0052) #define DCM_TableTopLateralPositionTolerance DcmTagKey(0x300a, 0x0053) #define DCM_RTPlanRelationship DcmTagKey(0x300a, 0x0055) #define DCM_FractionGroupSequence DcmTagKey(0x300a, 0x0070) #define DCM_FractionGroupNumber DcmTagKey(0x300a, 0x0071) #define DCM_FractionGroupDescription DcmTagKey(0x300a, 0x0072) #define DCM_NumberOfFractionsPlanned DcmTagKey(0x300a, 0x0078) #define DCM_NumberOfFractionPatternDigitsPerDay DcmTagKey(0x300a, 0x0079) #define DCM_RepeatFractionCycleLength DcmTagKey(0x300a, 0x007a) #define DCM_FractionPattern DcmTagKey(0x300a, 0x007b) #define DCM_NumberOfBeams DcmTagKey(0x300a, 0x0080) #define DCM_BeamDoseSpecificationPoint DcmTagKey(0x300a, 0x0082) #define DCM_BeamDose DcmTagKey(0x300a, 0x0084) #define DCM_BeamMeterset DcmTagKey(0x300a, 0x0086) #define DCM_BeamDosePointDepth DcmTagKey(0x300a, 0x0088) #define DCM_BeamDosePointEquivalentDepth DcmTagKey(0x300a, 0x0089) #define DCM_BeamDosePointSSD DcmTagKey(0x300a, 0x008a) #define DCM_NumberOfBrachyApplicationSetups DcmTagKey(0x300a, 0x00a0) #define DCM_BrachyApplicationSetupDoseSpecificationPoint DcmTagKey(0x300a, 0x00a2) #define DCM_BrachyApplicationSetupDose DcmTagKey(0x300a, 0x00a4) #define DCM_BeamSequence DcmTagKey(0x300a, 0x00b0) #define DCM_TreatmentMachineName DcmTagKey(0x300a, 0x00b2) #define DCM_PrimaryDosimeterUnit DcmTagKey(0x300a, 0x00b3) #define DCM_SourceAxisDistance DcmTagKey(0x300a, 0x00b4) #define DCM_BeamLimitingDeviceSequence DcmTagKey(0x300a, 0x00b6) #define DCM_RTBeamLimitingDeviceType DcmTagKey(0x300a, 0x00b8) #define DCM_SourceToBeamLimitingDeviceDistance DcmTagKey(0x300a, 0x00ba) #define DCM_IsocenterToBeamLimitingDeviceDistance DcmTagKey(0x300a, 0x00bb) #define DCM_NumberOfLeafJawPairs DcmTagKey(0x300a, 0x00bc) #define DCM_LeafPositionBoundaries DcmTagKey(0x300a, 0x00be) #define DCM_BeamNumber DcmTagKey(0x300a, 0x00c0) #define DCM_BeamName DcmTagKey(0x300a, 0x00c2) #define DCM_BeamDescription DcmTagKey(0x300a, 0x00c3) #define DCM_BeamType DcmTagKey(0x300a, 0x00c4) #define DCM_RadiationType DcmTagKey(0x300a, 0x00c6) #define DCM_HighDoseTechniqueType DcmTagKey(0x300a, 0x00c7) #define DCM_ReferenceImageNumber DcmTagKey(0x300a, 0x00c8) #define DCM_PlannedVerificationImageSequence DcmTagKey(0x300a, 0x00ca) #define DCM_ImagingDeviceSpecificAcquisitionParameters DcmTagKey(0x300a, 0x00cc) #define DCM_TreatmentDeliveryType DcmTagKey(0x300a, 0x00ce) #define DCM_NumberOfWedges DcmTagKey(0x300a, 0x00d0) #define DCM_WedgeSequence DcmTagKey(0x300a, 0x00d1) #define DCM_WedgeNumber DcmTagKey(0x300a, 0x00d2) #define DCM_WedgeType DcmTagKey(0x300a, 0x00d3) #define DCM_WedgeID DcmTagKey(0x300a, 0x00d4) #define DCM_WedgeAngle DcmTagKey(0x300a, 0x00d5) #define DCM_WedgeFactor DcmTagKey(0x300a, 0x00d6) #define DCM_TotalWedgeTrayWaterEquivalentThickness DcmTagKey(0x300a, 0x00d7) #define DCM_WedgeOrientation DcmTagKey(0x300a, 0x00d8) #define DCM_IsocenterToWedgeTrayDistance DcmTagKey(0x300a, 0x00d9) #define DCM_SourceToWedgeTrayDistance DcmTagKey(0x300a, 0x00da) #define DCM_WedgeThinEdgePosition DcmTagKey(0x300a, 0x00db) #define DCM_BolusID DcmTagKey(0x300a, 0x00dc) #define DCM_BolusDescription DcmTagKey(0x300a, 0x00dd) #define DCM_NumberOfCompensators DcmTagKey(0x300a, 0x00e0) #define DCM_MaterialID DcmTagKey(0x300a, 0x00e1) #define DCM_TotalCompensatorTrayFactor DcmTagKey(0x300a, 0x00e2) #define DCM_CompensatorSequence DcmTagKey(0x300a, 0x00e3) #define DCM_CompensatorNumber DcmTagKey(0x300a, 0x00e4) #define DCM_CompensatorID DcmTagKey(0x300a, 0x00e5) #define DCM_SourceToCompensatorTrayDistance DcmTagKey(0x300a, 0x00e6) #define DCM_CompensatorRows DcmTagKey(0x300a, 0x00e7) #define DCM_CompensatorColumns DcmTagKey(0x300a, 0x00e8) #define DCM_CompensatorPixelSpacing DcmTagKey(0x300a, 0x00e9) #define DCM_CompensatorPosition DcmTagKey(0x300a, 0x00ea) #define DCM_CompensatorTransmissionData DcmTagKey(0x300a, 0x00eb) #define DCM_CompensatorThicknessData DcmTagKey(0x300a, 0x00ec) #define DCM_NumberOfBoli DcmTagKey(0x300a, 0x00ed) #define DCM_CompensatorType DcmTagKey(0x300a, 0x00ee) #define DCM_NumberOfBlocks DcmTagKey(0x300a, 0x00f0) #define DCM_TotalBlockTrayFactor DcmTagKey(0x300a, 0x00f2) #define DCM_TotalBlockTrayWaterEquivalentThickness DcmTagKey(0x300a, 0x00f3) #define DCM_BlockSequence DcmTagKey(0x300a, 0x00f4) #define DCM_BlockTrayID DcmTagKey(0x300a, 0x00f5) #define DCM_SourceToBlockTrayDistance DcmTagKey(0x300a, 0x00f6) #define DCM_IsocenterToBlockTrayDistance DcmTagKey(0x300a, 0x00f7) #define DCM_BlockType DcmTagKey(0x300a, 0x00f8) #define DCM_AccessoryCode DcmTagKey(0x300a, 0x00f9) #define DCM_BlockDivergence DcmTagKey(0x300a, 0x00fa) #define DCM_BlockMountingPosition DcmTagKey(0x300a, 0x00fb) #define DCM_BlockNumber DcmTagKey(0x300a, 0x00fc) #define DCM_BlockName DcmTagKey(0x300a, 0x00fe) #define DCM_BlockThickness DcmTagKey(0x300a, 0x0100) #define DCM_BlockTransmission DcmTagKey(0x300a, 0x0102) #define DCM_BlockNumberOfPoints DcmTagKey(0x300a, 0x0104) #define DCM_BlockData DcmTagKey(0x300a, 0x0106) #define DCM_ApplicatorSequence DcmTagKey(0x300a, 0x0107) #define DCM_ApplicatorID DcmTagKey(0x300a, 0x0108) #define DCM_ApplicatorType DcmTagKey(0x300a, 0x0109) #define DCM_ApplicatorDescription DcmTagKey(0x300a, 0x010a) #define DCM_CumulativeDoseReferenceCoefficient DcmTagKey(0x300a, 0x010c) #define DCM_FinalCumulativeMetersetWeight DcmTagKey(0x300a, 0x010e) #define DCM_NumberOfControlPoints DcmTagKey(0x300a, 0x0110) #define DCM_ControlPointSequence DcmTagKey(0x300a, 0x0111) #define DCM_ControlPointIndex DcmTagKey(0x300a, 0x0112) #define DCM_NominalBeamEnergy DcmTagKey(0x300a, 0x0114) #define DCM_DoseRateSet DcmTagKey(0x300a, 0x0115) #define DCM_WedgePositionSequence DcmTagKey(0x300a, 0x0116) #define DCM_WedgePosition DcmTagKey(0x300a, 0x0118) #define DCM_BeamLimitingDevicePositionSequence DcmTagKey(0x300a, 0x011a) #define DCM_LeafJawPositions DcmTagKey(0x300a, 0x011c) #define DCM_GantryAngle DcmTagKey(0x300a, 0x011e) #define DCM_GantryRotationDirection DcmTagKey(0x300a, 0x011f) #define DCM_BeamLimitingDeviceAngle DcmTagKey(0x300a, 0x0120) #define DCM_BeamLimitingDeviceRotationDirection DcmTagKey(0x300a, 0x0121) #define DCM_PatientSupportAngle DcmTagKey(0x300a, 0x0122) #define DCM_PatientSupportRotationDirection DcmTagKey(0x300a, 0x0123) #define DCM_TableTopEccentricAxisDistance DcmTagKey(0x300a, 0x0124) #define DCM_TableTopEccentricAngle DcmTagKey(0x300a, 0x0125) #define DCM_TableTopEccentricRotationDirection DcmTagKey(0x300a, 0x0126) #define DCM_TableTopVerticalPosition DcmTagKey(0x300a, 0x0128) #define DCM_TableTopLongitudinalPosition DcmTagKey(0x300a, 0x0129) #define DCM_TableTopLateralPosition DcmTagKey(0x300a, 0x012a) #define DCM_IsocenterPosition DcmTagKey(0x300a, 0x012c) #define DCM_SurfaceEntryPoint DcmTagKey(0x300a, 0x012e) #define DCM_SourceToSurfaceDistance DcmTagKey(0x300a, 0x0130) #define DCM_CumulativeMetersetWeight DcmTagKey(0x300a, 0x0134) #define DCM_TableTopPitchAngle DcmTagKey(0x300a, 0x0140) #define DCM_TableTopPitchRotationDirection DcmTagKey(0x300a, 0x0142) #define DCM_TableTopRollAngle DcmTagKey(0x300a, 0x0144) #define DCM_TableTopRollRotationDirection DcmTagKey(0x300a, 0x0146) #define DCM_HeadFixationAngle DcmTagKey(0x300a, 0x0148) #define DCM_GantryPitchAngle DcmTagKey(0x300a, 0x014a) #define DCM_GantryPitchRotationDirection DcmTagKey(0x300a, 0x014c) #define DCM_GantryPitchAngleTolerance DcmTagKey(0x300a, 0x014e) #define DCM_PatientSetupSequence DcmTagKey(0x300a, 0x0180) #define DCM_PatientSetupNumber DcmTagKey(0x300a, 0x0182) #define DCM_PatientSetupLabel DcmTagKey(0x300a, 0x0183) #define DCM_PatientAdditionalPosition DcmTagKey(0x300a, 0x0184) #define DCM_FixationDeviceSequence DcmTagKey(0x300a, 0x0190) #define DCM_FixationDeviceType DcmTagKey(0x300a, 0x0192) #define DCM_FixationDeviceLabel DcmTagKey(0x300a, 0x0194) #define DCM_FixationDeviceDescription DcmTagKey(0x300a, 0x0196) #define DCM_FixationDevicePosition DcmTagKey(0x300a, 0x0198) #define DCM_FixationDevicePitchAngle DcmTagKey(0x300a, 0x0199) #define DCM_FixationDeviceRollAngle DcmTagKey(0x300a, 0x019a) #define DCM_ShieldingDeviceSequence DcmTagKey(0x300a, 0x01a0) #define DCM_ShieldingDeviceType DcmTagKey(0x300a, 0x01a2) #define DCM_ShieldingDeviceLabel DcmTagKey(0x300a, 0x01a4) #define DCM_ShieldingDeviceDescription DcmTagKey(0x300a, 0x01a6) #define DCM_ShieldingDevicePosition DcmTagKey(0x300a, 0x01a8) #define DCM_SetupTechnique DcmTagKey(0x300a, 0x01b0) #define DCM_SetupTechniqueDescription DcmTagKey(0x300a, 0x01b2) #define DCM_SetupDeviceSequence DcmTagKey(0x300a, 0x01b4) #define DCM_SetupDeviceType DcmTagKey(0x300a, 0x01b6) #define DCM_SetupDeviceLabel DcmTagKey(0x300a, 0x01b8) #define DCM_SetupDeviceDescription DcmTagKey(0x300a, 0x01ba) #define DCM_SetupDeviceParameter DcmTagKey(0x300a, 0x01bc) #define DCM_SetupReferenceDescription DcmTagKey(0x300a, 0x01d0) #define DCM_TableTopVerticalSetupDisplacement DcmTagKey(0x300a, 0x01d2) #define DCM_TableTopLongitudinalSetupDisplacement DcmTagKey(0x300a, 0x01d4) #define DCM_TableTopLateralSetupDisplacement DcmTagKey(0x300a, 0x01d6) #define DCM_BrachyTreatmentTechnique DcmTagKey(0x300a, 0x0200) #define DCM_BrachyTreatmentType DcmTagKey(0x300a, 0x0202) #define DCM_TreatmentMachineSequence DcmTagKey(0x300a, 0x0206) #define DCM_SourceSequence DcmTagKey(0x300a, 0x0210) #define DCM_SourceNumber DcmTagKey(0x300a, 0x0212) #define DCM_SourceType DcmTagKey(0x300a, 0x0214) #define DCM_SourceManufacturer DcmTagKey(0x300a, 0x0216) #define DCM_ActiveSourceDiameter DcmTagKey(0x300a, 0x0218) #define DCM_ActiveSourceLength DcmTagKey(0x300a, 0x021a) #define DCM_SourceEncapsulationNominalThickness DcmTagKey(0x300a, 0x0222) #define DCM_SourceEncapsulationNominalTransmission DcmTagKey(0x300a, 0x0224) #define DCM_SourceIsotopeName DcmTagKey(0x300a, 0x0226) #define DCM_SourceIsotopeHalfLife DcmTagKey(0x300a, 0x0228) #define DCM_SourceStrengthUnits DcmTagKey(0x300a, 0x0229) #define DCM_ReferenceAirKermaRate DcmTagKey(0x300a, 0x022a) #define DCM_SourceStrength DcmTagKey(0x300a, 0x022b) #define DCM_SourceStrengthReferenceDate DcmTagKey(0x300a, 0x022c) #define DCM_SourceStrengthReferenceTime DcmTagKey(0x300a, 0x022e) #define DCM_ApplicationSetupSequence DcmTagKey(0x300a, 0x0230) #define DCM_ApplicationSetupType DcmTagKey(0x300a, 0x0232) #define DCM_ApplicationSetupNumber DcmTagKey(0x300a, 0x0234) #define DCM_ApplicationSetupName DcmTagKey(0x300a, 0x0236) #define DCM_ApplicationSetupManufacturer DcmTagKey(0x300a, 0x0238) #define DCM_TemplateNumber DcmTagKey(0x300a, 0x0240) #define DCM_TemplateType DcmTagKey(0x300a, 0x0242) #define DCM_TemplateName DcmTagKey(0x300a, 0x0244) #define DCM_TotalReferenceAirKerma DcmTagKey(0x300a, 0x0250) #define DCM_BrachyAccessoryDeviceSequence DcmTagKey(0x300a, 0x0260) #define DCM_BrachyAccessoryDeviceNumber DcmTagKey(0x300a, 0x0262) #define DCM_BrachyAccessoryDeviceID DcmTagKey(0x300a, 0x0263) #define DCM_BrachyAccessoryDeviceType DcmTagKey(0x300a, 0x0264) #define DCM_BrachyAccessoryDeviceName DcmTagKey(0x300a, 0x0266) #define DCM_BrachyAccessoryDeviceNominalThickness DcmTagKey(0x300a, 0x026a) #define DCM_BrachyAccessoryDeviceNominalTransmission DcmTagKey(0x300a, 0x026c) #define DCM_ChannelSequence DcmTagKey(0x300a, 0x0280) #define DCM_ChannelNumber DcmTagKey(0x300a, 0x0282) #define DCM_ChannelLength DcmTagKey(0x300a, 0x0284) #define DCM_ChannelTotalTime DcmTagKey(0x300a, 0x0286) #define DCM_SourceMovementType DcmTagKey(0x300a, 0x0288) #define DCM_NumberOfPulses DcmTagKey(0x300a, 0x028a) #define DCM_PulseRepetitionInterval DcmTagKey(0x300a, 0x028c) #define DCM_SourceApplicatorNumber DcmTagKey(0x300a, 0x0290) #define DCM_SourceApplicatorID DcmTagKey(0x300a, 0x0291) #define DCM_SourceApplicatorType DcmTagKey(0x300a, 0x0292) #define DCM_SourceApplicatorName DcmTagKey(0x300a, 0x0294) #define DCM_SourceApplicatorLength DcmTagKey(0x300a, 0x0296) #define DCM_SourceApplicatorManufacturer DcmTagKey(0x300a, 0x0298) #define DCM_SourceApplicatorWallNominalThickness DcmTagKey(0x300a, 0x029c) #define DCM_SourceApplicatorWallNominalTransmission DcmTagKey(0x300a, 0x029e) #define DCM_SourceApplicatorStepSize DcmTagKey(0x300a, 0x02a0) #define DCM_TransferTubeNumber DcmTagKey(0x300a, 0x02a2) #define DCM_TransferTubeLength DcmTagKey(0x300a, 0x02a4) #define DCM_ChannelShieldSequence DcmTagKey(0x300a, 0x02b0) #define DCM_ChannelShieldNumber DcmTagKey(0x300a, 0x02b2) #define DCM_ChannelShieldID DcmTagKey(0x300a, 0x02b3) #define DCM_ChannelShieldName DcmTagKey(0x300a, 0x02b4) #define DCM_ChannelShieldNominalThickness DcmTagKey(0x300a, 0x02b8) #define DCM_ChannelShieldNominalTransmission DcmTagKey(0x300a, 0x02ba) #define DCM_FinalCumulativeTimeWeight DcmTagKey(0x300a, 0x02c8) #define DCM_BrachyControlPointSequence DcmTagKey(0x300a, 0x02d0) #define DCM_ControlPointRelativePosition DcmTagKey(0x300a, 0x02d2) #define DCM_ControlPoint3DPosition DcmTagKey(0x300a, 0x02d4) #define DCM_CumulativeTimeWeight DcmTagKey(0x300a, 0x02d6) #define DCM_CompensatorDivergence DcmTagKey(0x300a, 0x02e0) #define DCM_CompensatorMountingPosition DcmTagKey(0x300a, 0x02e1) #define DCM_SourceToCompensatorDistance DcmTagKey(0x300a, 0x02e2) #define DCM_TotalCompensatorTrayWaterEquivalentThickness DcmTagKey(0x300a, 0x02e3) #define DCM_IsocenterToCompensatorTrayDistance DcmTagKey(0x300a, 0x02e4) #define DCM_CompensatorColumnOffset DcmTagKey(0x300a, 0x02e5) #define DCM_IsocenterToCompensatorDistances DcmTagKey(0x300a, 0x02e6) #define DCM_CompensatorRelativeStoppingPowerRatio DcmTagKey(0x300a, 0x02e7) #define DCM_CompensatorMillingToolDiameter DcmTagKey(0x300a, 0x02e8) #define DCM_IonRangeCompensatorSequence DcmTagKey(0x300a, 0x02ea) #define DCM_CompensatorDescription DcmTagKey(0x300a, 0x02eb) #define DCM_RadiationMassNumber DcmTagKey(0x300a, 0x0302) #define DCM_RadiationAtomicNumber DcmTagKey(0x300a, 0x0304) #define DCM_RadiationChargeState DcmTagKey(0x300a, 0x0306) #define DCM_ScanMode DcmTagKey(0x300a, 0x0308) #define DCM_VirtualSourceAxisDistances DcmTagKey(0x300a, 0x030a) #define DCM_SnoutSequence DcmTagKey(0x300a, 0x030c) #define DCM_SnoutPosition DcmTagKey(0x300a, 0x030d) #define DCM_SnoutID DcmTagKey(0x300a, 0x030f) #define DCM_NumberOfRangeShifters DcmTagKey(0x300a, 0x0312) #define DCM_RangeShifterSequence DcmTagKey(0x300a, 0x0314) #define DCM_RangeShifterNumber DcmTagKey(0x300a, 0x0316) #define DCM_RangeShifterID DcmTagKey(0x300a, 0x0318) #define DCM_RangeShifterType DcmTagKey(0x300a, 0x0320) #define DCM_RangeShifterDescription DcmTagKey(0x300a, 0x0322) #define DCM_NumberOfLateralSpreadingDevices DcmTagKey(0x300a, 0x0330) #define DCM_LateralSpreadingDeviceSequence DcmTagKey(0x300a, 0x0332) #define DCM_LateralSpreadingDeviceNumber DcmTagKey(0x300a, 0x0334) #define DCM_LateralSpreadingDeviceID DcmTagKey(0x300a, 0x0336) #define DCM_LateralSpreadingDeviceType DcmTagKey(0x300a, 0x0338) #define DCM_LateralSpreadingDeviceDescription DcmTagKey(0x300a, 0x033a) #define DCM_LateralSpreadingDeviceWaterEquivalentThickness DcmTagKey(0x300a, 0x033c) #define DCM_NumberOfRangeModulators DcmTagKey(0x300a, 0x0340) #define DCM_RangeModulatorSequence DcmTagKey(0x300a, 0x0342) #define DCM_RangeModulatorNumber DcmTagKey(0x300a, 0x0344) #define DCM_RangeModulatorID DcmTagKey(0x300a, 0x0346) #define DCM_RangeModulatorType DcmTagKey(0x300a, 0x0348) #define DCM_RangeModulatorDescription DcmTagKey(0x300a, 0x034a) #define DCM_BeamCurrentModulationID DcmTagKey(0x300a, 0x034c) #define DCM_PatientSupportType DcmTagKey(0x300a, 0x0350) #define DCM_PatientSupportID DcmTagKey(0x300a, 0x0352) #define DCM_PatientSupportAccessoryCode DcmTagKey(0x300a, 0x0354) #define DCM_FixationLightAzimuthalAngle DcmTagKey(0x300a, 0x0356) #define DCM_FixationLightPolarAngle DcmTagKey(0x300a, 0x0358) #define DCM_MetersetRate DcmTagKey(0x300a, 0x035a) #define DCM_RangeShifterSettingsSequence DcmTagKey(0x300a, 0x0360) #define DCM_RangeShifterSetting DcmTagKey(0x300a, 0x0362) #define DCM_IsocenterToRangeShifterDistance DcmTagKey(0x300a, 0x0364) #define DCM_RangeShifterWaterEquivalentThickness DcmTagKey(0x300a, 0x0366) #define DCM_LateralSpreadingDeviceSettingsSequence DcmTagKey(0x300a, 0x0370) #define DCM_LateralSpreadingDeviceSetting DcmTagKey(0x300a, 0x0372) #define DCM_IsocenterToLateralSpreadingDeviceDistance DcmTagKey(0x300a, 0x0374) #define DCM_RangeModulatorSettingsSequence DcmTagKey(0x300a, 0x0380) #define DCM_RangeModulatorGatingStartValue DcmTagKey(0x300a, 0x0382) #define DCM_RangeModulatorGatingStopValue DcmTagKey(0x300a, 0x0384) #define DCM_RangeModulatorGatingStartWaterEquivalentThickness DcmTagKey(0x300a, 0x0386) #define DCM_RangeModulatorGatingStopWaterEquivalentThickness DcmTagKey(0x300a, 0x0388) #define DCM_IsocenterToRangeModulatorDistance DcmTagKey(0x300a, 0x038a) #define DCM_ScanSpotTuneID DcmTagKey(0x300a, 0x0390) #define DCM_NumberOfScanSpotPositions DcmTagKey(0x300a, 0x0392) #define DCM_ScanSpotPositionMap DcmTagKey(0x300a, 0x0394) #define DCM_ScanSpotMetersetWeights DcmTagKey(0x300a, 0x0396) #define DCM_ScanningSpotSize DcmTagKey(0x300a, 0x0398) #define DCM_NumberOfPaintings DcmTagKey(0x300a, 0x039a) #define DCM_IonToleranceTableSequence DcmTagKey(0x300a, 0x03a0) #define DCM_IonBeamSequence DcmTagKey(0x300a, 0x03a2) #define DCM_IonBeamLimitingDeviceSequence DcmTagKey(0x300a, 0x03a4) #define DCM_IonBlockSequence DcmTagKey(0x300a, 0x03a6) #define DCM_IonControlPointSequence DcmTagKey(0x300a, 0x03a8) #define DCM_IonWedgeSequence DcmTagKey(0x300a, 0x03aa) #define DCM_IonWedgePositionSequence DcmTagKey(0x300a, 0x03ac) #define DCM_ReferencedSetupImageSequence DcmTagKey(0x300a, 0x0401) #define DCM_SetupImageComment DcmTagKey(0x300a, 0x0402) #define DCM_MotionSynchronizationSequence DcmTagKey(0x300a, 0x0410) #define DCM_ControlPointOrientation DcmTagKey(0x300a, 0x0412) #define DCM_GeneralAccessorySequence DcmTagKey(0x300a, 0x0420) #define DCM_GeneralAccessoryID DcmTagKey(0x300a, 0x0421) #define DCM_GeneralAccessoryDescription DcmTagKey(0x300a, 0x0422) #define DCM_GeneralAccessoryType DcmTagKey(0x300a, 0x0423) #define DCM_GeneralAccessoryNumber DcmTagKey(0x300a, 0x0424) #define DCM_ApplicatorGeometrySequence DcmTagKey(0x300a, 0x0431) #define DCM_ApplicatorApertureShape DcmTagKey(0x300a, 0x0432) #define DCM_ApplicatorOpening DcmTagKey(0x300a, 0x0433) #define DCM_ApplicatorOpeningX DcmTagKey(0x300a, 0x0434) #define DCM_ApplicatorOpeningY DcmTagKey(0x300a, 0x0435) #define DCM_SourceToApplicatorMountingPositionDistance DcmTagKey(0x300a, 0x0436) #define DCM_ReferencedRTPlanSequence DcmTagKey(0x300c, 0x0002) #define DCM_ReferencedBeamSequence DcmTagKey(0x300c, 0x0004) #define DCM_ReferencedBeamNumber DcmTagKey(0x300c, 0x0006) #define DCM_ReferencedReferenceImageNumber DcmTagKey(0x300c, 0x0007) #define DCM_StartCumulativeMetersetWeight DcmTagKey(0x300c, 0x0008) #define DCM_EndCumulativeMetersetWeight DcmTagKey(0x300c, 0x0009) #define DCM_ReferencedBrachyApplicationSetupSequence DcmTagKey(0x300c, 0x000a) #define DCM_ReferencedBrachyApplicationSetupNumber DcmTagKey(0x300c, 0x000c) #define DCM_ReferencedSourceNumber DcmTagKey(0x300c, 0x000e) #define DCM_ReferencedFractionGroupSequence DcmTagKey(0x300c, 0x0020) #define DCM_ReferencedFractionGroupNumber DcmTagKey(0x300c, 0x0022) #define DCM_ReferencedVerificationImageSequence DcmTagKey(0x300c, 0x0040) #define DCM_ReferencedReferenceImageSequence DcmTagKey(0x300c, 0x0042) #define DCM_ReferencedDoseReferenceSequence DcmTagKey(0x300c, 0x0050) #define DCM_ReferencedDoseReferenceNumber DcmTagKey(0x300c, 0x0051) #define DCM_BrachyReferencedDoseReferenceSequence DcmTagKey(0x300c, 0x0055) #define DCM_ReferencedStructureSetSequence DcmTagKey(0x300c, 0x0060) #define DCM_ReferencedPatientSetupNumber DcmTagKey(0x300c, 0x006a) #define DCM_ReferencedDoseSequence DcmTagKey(0x300c, 0x0080) #define DCM_ReferencedToleranceTableNumber DcmTagKey(0x300c, 0x00a0) #define DCM_ReferencedBolusSequence DcmTagKey(0x300c, 0x00b0) #define DCM_ReferencedWedgeNumber DcmTagKey(0x300c, 0x00c0) #define DCM_ReferencedCompensatorNumber DcmTagKey(0x300c, 0x00d0) #define DCM_ReferencedBlockNumber DcmTagKey(0x300c, 0x00e0) #define DCM_ReferencedControlPointIndex DcmTagKey(0x300c, 0x00f0) #define DCM_ReferencedControlPointSequence DcmTagKey(0x300c, 0x00f2) #define DCM_ReferencedStartControlPointIndex DcmTagKey(0x300c, 0x00f4) #define DCM_ReferencedStopControlPointIndex DcmTagKey(0x300c, 0x00f6) #define DCM_ReferencedRangeShifterNumber DcmTagKey(0x300c, 0x0100) #define DCM_ReferencedLateralSpreadingDeviceNumber DcmTagKey(0x300c, 0x0102) #define DCM_ReferencedRangeModulatorNumber DcmTagKey(0x300c, 0x0104) #define DCM_ApprovalStatus DcmTagKey(0x300e, 0x0002) #define DCM_ReviewDate DcmTagKey(0x300e, 0x0004) #define DCM_ReviewTime DcmTagKey(0x300e, 0x0005) #define DCM_ReviewerName DcmTagKey(0x300e, 0x0008) #define DCM_ACR_NEMA_TextGroupLength DcmTagKey(0x4000, 0x0000) #define DCM_ACR_NEMA_TextArbitrary DcmTagKey(0x4000, 0x0010) #define DCM_ACR_NEMA_TextComments DcmTagKey(0x4000, 0x4000) #define DCM_RETIRED_ResultsID DcmTagKey(0x4008, 0x0040) #define DCM_RETIRED_ResultsIDIssuer DcmTagKey(0x4008, 0x0042) #define DCM_RETIRED_ReferencedInterpretationSequence DcmTagKey(0x4008, 0x0050) #define DCM_RETIRED_InterpretationRecordedDate DcmTagKey(0x4008, 0x0100) #define DCM_RETIRED_InterpretationRecordedTime DcmTagKey(0x4008, 0x0101) #define DCM_RETIRED_InterpretationRecorder DcmTagKey(0x4008, 0x0102) #define DCM_RETIRED_ReferenceToRecordedSound DcmTagKey(0x4008, 0x0103) #define DCM_RETIRED_InterpretationTranscriptionDate DcmTagKey(0x4008, 0x0108) #define DCM_RETIRED_InterpretationTranscriptionTime DcmTagKey(0x4008, 0x0109) #define DCM_RETIRED_InterpretationTranscriber DcmTagKey(0x4008, 0x010a) #define DCM_RETIRED_InterpretationText DcmTagKey(0x4008, 0x010b) #define DCM_RETIRED_InterpretationAuthor DcmTagKey(0x4008, 0x010c) #define DCM_RETIRED_InterpretationApproverSequence DcmTagKey(0x4008, 0x0111) #define DCM_RETIRED_InterpretationApprovalDate DcmTagKey(0x4008, 0x0112) #define DCM_RETIRED_InterpretationApprovalTime DcmTagKey(0x4008, 0x0113) #define DCM_RETIRED_PhysicianApprovingInterpretation DcmTagKey(0x4008, 0x0114) #define DCM_RETIRED_InterpretationDiagnosisDescription DcmTagKey(0x4008, 0x0115) #define DCM_RETIRED_InterpretationDiagnosisCodeSequence DcmTagKey(0x4008, 0x0117) #define DCM_RETIRED_ResultsDistributionListSequence DcmTagKey(0x4008, 0x0118) #define DCM_RETIRED_DistributionName DcmTagKey(0x4008, 0x0119) #define DCM_RETIRED_DistributionAddress DcmTagKey(0x4008, 0x011a) #define DCM_RETIRED_InterpretationID DcmTagKey(0x4008, 0x0200) #define DCM_RETIRED_InterpretationIDIssuer DcmTagKey(0x4008, 0x0202) #define DCM_RETIRED_InterpretationTypeID DcmTagKey(0x4008, 0x0210) #define DCM_RETIRED_InterpretationStatusID DcmTagKey(0x4008, 0x0212) #define DCM_RETIRED_Impressions DcmTagKey(0x4008, 0x0300) #define DCM_RETIRED_ResultsComments DcmTagKey(0x4008, 0x4000) #define DCM_MACParametersSequence DcmTagKey(0x4ffe, 0x0001) #define DCM_SharedFunctionalGroupsSequence DcmTagKey(0x5200, 0x9229) #define DCM_PerFrameFunctionalGroupsSequence DcmTagKey(0x5200, 0x9230) #define DCM_WaveformSequence DcmTagKey(0x5400, 0x0100) #define DCM_ChannelMinimumValue DcmTagKey(0x5400, 0x0110) #define DCM_ChannelMaximumValue DcmTagKey(0x5400, 0x0112) #define DCM_WaveformBitsAllocated DcmTagKey(0x5400, 0x1004) #define DCM_WaveformSampleInterpretation DcmTagKey(0x5400, 0x1006) #define DCM_WaveformPaddingValue DcmTagKey(0x5400, 0x100a) #define DCM_WaveformData DcmTagKey(0x5400, 0x1010) #define DCM_FirstOrderPhaseCorrectionAngle DcmTagKey(0x5600, 0x0010) #define DCM_SpectroscopyData DcmTagKey(0x5600, 0x0020) #define DCM_PixelData DcmTagKey(0x7fe0, 0x0010) #define DCM_ACR_NEMA_2C_CoefficientsSDVN DcmTagKey(0x7fe0, 0x0020) #define DCM_ACR_NEMA_2C_CoefficientsSDHN DcmTagKey(0x7fe0, 0x0030) #define DCM_ACR_NEMA_2C_CoefficientsSDDN DcmTagKey(0x7fe0, 0x0040) #define DCM_DigitalSignaturesSequence DcmTagKey(0xfffa, 0xfffa) #define DCM_DataSetTrailingPadding DcmTagKey(0xfffc, 0xfffc) #define DCM_Item DcmTagKey(0xfffe, 0xe000) #define DCM_ItemDelimitationItem DcmTagKey(0xfffe, 0xe00d) #define DCM_SequenceDelimitationItem DcmTagKey(0xfffe, 0xe0dd) /* ** Tags where the group/element can vary (repeating tags). ** Number of entries: 78 */ #define DCM_OverlayRows DcmTagKey(0x6000, 0x0010) /* (0x6000-0x60ff,0x0010) */ #define DCM_OverlayColumns DcmTagKey(0x6000, 0x0011) /* (0x6000-0x60ff,0x0011) */ #define DCM_NumberOfFramesInOverlay DcmTagKey(0x6000, 0x0015) /* (0x6000-0x60ff,0x0015) */ #define DCM_OverlayDescription DcmTagKey(0x6000, 0x0022) /* (0x6000-0x60ff,0x0022) */ #define DCM_OverlayType DcmTagKey(0x6000, 0x0040) /* (0x6000-0x60ff,0x0040) */ #define DCM_OverlaySubtype DcmTagKey(0x6000, 0x0045) /* (0x6000-0x60ff,0x0045) */ #define DCM_OverlayOrigin DcmTagKey(0x6000, 0x0050) /* (0x6000-0x60ff,0x0050) */ #define DCM_ImageFrameOrigin DcmTagKey(0x6000, 0x0051) /* (0x6000-0x60ff,0x0051) */ #define DCM_OverlayBitsAllocated DcmTagKey(0x6000, 0x0100) /* (0x6000-0x60ff,0x0100) */ #define DCM_OverlayBitPosition DcmTagKey(0x6000, 0x0102) /* (0x6000-0x60ff,0x0102) */ #define DCM_OverlayActivationLayer DcmTagKey(0x6000, 0x1001) /* (0x6000-0x60ff,0x1001) */ #define DCM_ROIArea DcmTagKey(0x6000, 0x1301) /* (0x6000-0x60ff,0x1301) */ #define DCM_ROIMean DcmTagKey(0x6000, 0x1302) /* (0x6000-0x60ff,0x1302) */ #define DCM_ROIStandardDeviation DcmTagKey(0x6000, 0x1303) /* (0x6000-0x60ff,0x1303) */ #define DCM_OverlayLabel DcmTagKey(0x6000, 0x1500) /* (0x6000-0x60ff,0x1500) */ #define DCM_OverlayData DcmTagKey(0x6000, 0x3000) /* (0x6000-0x60ff,0x3000) */ #define DCM_ACR_NEMA_2C_VariablePixelDataGroupLength DcmTagKey(0x7f00, 0x0000) /* (0x7f00-0x7fff,0x0000) */ #define DCM_PrivateGroupLength DcmTagKey(0x0009, 0x0000) /* (0x0009-o-0xffff,0x0000) */ #define DCM_RETIRED_NumberOfPoints DcmTagKey(0x5000, 0x0010) /* (0x5000-0x50ff,0x0010) */ #define DCM_RETIRED_TypeOfData DcmTagKey(0x5000, 0x0020) /* (0x5000-0x50ff,0x0020) */ #define DCM_RETIRED_CurveDescription DcmTagKey(0x5000, 0x0022) /* (0x5000-0x50ff,0x0022) */ #define DCM_RETIRED_AxisUnits DcmTagKey(0x5000, 0x0030) /* (0x5000-0x50ff,0x0030) */ #define DCM_RETIRED_AxisLabels DcmTagKey(0x5000, 0x0040) /* (0x5000-0x50ff,0x0040) */ #define DCM_RETIRED_OverlayPlanes DcmTagKey(0x6000, 0x0012) /* (0x6000-0x60ff,0x0012) */ #define DCM_RETIRED_OverlayPlaneOrigin DcmTagKey(0x6000, 0x0052) /* (0x6000-0x60ff,0x0052) */ #define DCM_ACR_NEMA_2C_OverlayCompressionCode DcmTagKey(0x6000, 0x0060) /* (0x6000-0x60ff,0x0060) */ #define DCM_ACR_NEMA_2C_OverlayCompressionOriginator DcmTagKey(0x6000, 0x0061) /* (0x6000-0x60ff,0x0061) */ #define DCM_ACR_NEMA_2C_OverlayCompressionLabel DcmTagKey(0x6000, 0x0062) /* (0x6000-0x60ff,0x0062) */ #define DCM_ACR_NEMA_2C_OverlayCompressionDescription DcmTagKey(0x6000, 0x0063) /* (0x6000-0x60ff,0x0063) */ #define DCM_ACR_NEMA_2C_OverlayCompressionStepPointers DcmTagKey(0x6000, 0x0066) /* (0x6000-0x60ff,0x0066) */ #define DCM_ACR_NEMA_2C_OverlayRepeatInterval DcmTagKey(0x6000, 0x0068) /* (0x6000-0x60ff,0x0068) */ #define DCM_ACR_NEMA_2C_OverlayBitsGrouped DcmTagKey(0x6000, 0x0069) /* (0x6000-0x60ff,0x0069) */ #define DCM_ACR_NEMA_2C_VariablePixelData DcmTagKey(0x7f00, 0x0010) /* (0x7f00-0x7fff,0x0010) */ #define DCM_ACR_NEMA_2C_VariableNextDataGroup DcmTagKey(0x7f00, 0x0011) /* (0x7f00-0x7fff,0x0011) */ #define DCM_ACR_NEMA_2C_VariableCoefficientsSDVN DcmTagKey(0x7f00, 0x0020) /* (0x7f00-0x7fff,0x0020) */ #define DCM_ACR_NEMA_2C_VariableCoefficientsSDHN DcmTagKey(0x7f00, 0x0030) /* (0x7f00-0x7fff,0x0030) */ #define DCM_ACR_NEMA_2C_VariableCoefficientsSDDN DcmTagKey(0x7f00, 0x0040) /* (0x7f00-0x7fff,0x0040) */ #define DCM_PrivateCreator DcmTagKey(0x0009, 0x0010) /* (0x0009-o-0xffff,0x0010-u-0x00ff) */ #define DCM_IllegalGroupLength DcmTagKey(0x0001, 0x0000) /* (0x0001-o-0x0007,0x0000) */ #define DCM_IllegalPrivateCreator DcmTagKey(0x0001, 0x0010) /* (0x0001-o-0x0007,0x0010-u-0x00ff) */ #define DCM_GenericGroupLength DcmTagKey(0x0000, 0x0000) /* (0x0000-u-0xffff,0x0000) */ #define DCM_ACR_NEMA_SourceImageID DcmTagKey(0x0020, 0x3100) /* (0x0020,0x3100-0x31ff) */ #define DCM_RETIRED_CurveDimensions DcmTagKey(0x5000, 0x0005) /* (0x5000-0x50ff,0x0005) */ #define DCM_RETIRED_DataValueRepresentation DcmTagKey(0x5000, 0x0103) /* (0x5000-0x50ff,0x0103) */ #define DCM_RETIRED_MinimumCoordinateValue DcmTagKey(0x5000, 0x0104) /* (0x5000-0x50ff,0x0104) */ #define DCM_RETIRED_MaximumCoordinateValue DcmTagKey(0x5000, 0x0105) /* (0x5000-0x50ff,0x0105) */ #define DCM_RETIRED_CurveRange DcmTagKey(0x5000, 0x0106) /* (0x5000-0x50ff,0x0106) */ #define DCM_RETIRED_CurveDataDescriptor DcmTagKey(0x5000, 0x0110) /* (0x5000-0x50ff,0x0110) */ #define DCM_RETIRED_CoordinateStartValue DcmTagKey(0x5000, 0x0112) /* (0x5000-0x50ff,0x0112) */ #define DCM_RETIRED_CoordinateStepValue DcmTagKey(0x5000, 0x0114) /* (0x5000-0x50ff,0x0114) */ #define DCM_RETIRED_CurveActivationLayer DcmTagKey(0x5000, 0x1001) /* (0x5000-0x50ff,0x1001) */ #define DCM_RETIRED_AudioType DcmTagKey(0x5000, 0x2000) /* (0x5000-0x50ff,0x2000) */ #define DCM_RETIRED_AudioSampleFormat DcmTagKey(0x5000, 0x2002) /* (0x5000-0x50ff,0x2002) */ #define DCM_RETIRED_NumberOfChannels DcmTagKey(0x5000, 0x2004) /* (0x5000-0x50ff,0x2004) */ #define DCM_RETIRED_NumberOfSamples DcmTagKey(0x5000, 0x2006) /* (0x5000-0x50ff,0x2006) */ #define DCM_RETIRED_SampleRate DcmTagKey(0x5000, 0x2008) /* (0x5000-0x50ff,0x2008) */ #define DCM_RETIRED_TotalTime DcmTagKey(0x5000, 0x200a) /* (0x5000-0x50ff,0x200a) */ #define DCM_RETIRED_AudioSampleData DcmTagKey(0x5000, 0x200c) /* (0x5000-0x50ff,0x200c) */ #define DCM_RETIRED_AudioComments DcmTagKey(0x5000, 0x200e) /* (0x5000-0x50ff,0x200e) */ #define DCM_RETIRED_CurveLabel DcmTagKey(0x5000, 0x2500) /* (0x5000-0x50ff,0x2500) */ #define DCM_RETIRED_CurveReferencedOverlaySequence DcmTagKey(0x5000, 0x2600) /* (0x5000-0x50ff,0x2600) */ #define DCM_RETIRED_CurveReferencedOverlayGroup DcmTagKey(0x5000, 0x2610) /* (0x5000-0x50ff,0x2610) */ #define DCM_RETIRED_CurveData DcmTagKey(0x5000, 0x3000) /* (0x5000-0x50ff,0x3000) */ #define DCM_ACR_NEMA_OverlayFormat DcmTagKey(0x6000, 0x0110) /* (0x6000-0x60ff,0x0110) */ #define DCM_ACR_NEMA_OverlayLocation DcmTagKey(0x6000, 0x0200) /* (0x6000-0x60ff,0x0200) */ #define DCM_ACR_NEMA_2C_OverlayCodeLabel DcmTagKey(0x6000, 0x0800) /* (0x6000-0x60ff,0x0800) */ #define DCM_ACR_NEMA_2C_OverlayNumberOfTables DcmTagKey(0x6000, 0x0802) /* (0x6000-0x60ff,0x0802) */ #define DCM_ACR_NEMA_2C_OverlayCodeTableLocation DcmTagKey(0x6000, 0x0803) /* (0x6000-0x60ff,0x0803) */ #define DCM_ACR_NEMA_2C_OverlayBitsForCodeWord DcmTagKey(0x6000, 0x0804) /* (0x6000-0x60ff,0x0804) */ #define DCM_RETIRED_OverlayDescriptorGray DcmTagKey(0x6000, 0x1100) /* (0x6000-0x60ff,0x1100) */ #define DCM_RETIRED_OverlayDescriptorRed DcmTagKey(0x6000, 0x1101) /* (0x6000-0x60ff,0x1101) */ #define DCM_RETIRED_OverlayDescriptorGreen DcmTagKey(0x6000, 0x1102) /* (0x6000-0x60ff,0x1102) */ #define DCM_RETIRED_OverlayDescriptorBlue DcmTagKey(0x6000, 0x1103) /* (0x6000-0x60ff,0x1103) */ #define DCM_RETIRED_OverlaysGray DcmTagKey(0x6000, 0x1200) /* (0x6000-0x60ff,0x1200) */ #define DCM_RETIRED_OverlaysRed DcmTagKey(0x6000, 0x1201) /* (0x6000-0x60ff,0x1201) */ #define DCM_RETIRED_OverlaysGreen DcmTagKey(0x6000, 0x1202) /* (0x6000-0x60ff,0x1202) */ #define DCM_RETIRED_OverlaysBlue DcmTagKey(0x6000, 0x1203) /* (0x6000-0x60ff,0x1203) */ #define DCM_ACR_NEMA_OverlayComments DcmTagKey(0x6000, 0x4000) /* (0x6000-0x60ff,0x4000) */ #endif /* !DCDEFTAG_H */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/dcdicent.h0000644000310500011400000003654711470771037021532 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Andrew Hewett * * Purpose: Interface for a dictionary entry in the loadable DICOM data dictionary * * Last Update: $Author: meichel $ * Update Date: $Date: 2010-11-17 15:17:51 $ * CVS/RCS Revision: $Revision: 1.26 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DCDICENT_H #define DCDICENT_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dctagkey.h" #include "dcmtk/dcmdata/dcvr.h" #define INCLUDE_CSTRING /* for strcmp() */ #include "dcmtk/ofstd/ofstdinc.h" /// constant describing an unlimited VM #define DcmVariableVM -1 #define DCM_INRANGE(x,a,b) (((x) >= (a)) && ((x) <= (b))) #define DCM_IS_ODD(x) (((x) % 2) == 1) #define DCM_IS_EVEN(x) (((x) % 2) == 0) /** attribute tag group/element range restrictions */ enum DcmDictRangeRestriction { /// integer range DcmDictRange_Unspecified, /// odd range DcmDictRange_Odd, /// even range DcmDictRange_Even }; /** each object of this class manages one entry of the * global DICOM data dictionary. */ class DcmDictEntry: public DcmTagKey { public: /** constructor * @param g attribute tag group * @param e attribute tag element * @param vr value representation * @param nam attribute name * @param vmMin lower limit for value multiplicity * @param vmMax upper limit for value multiplicity, DcmVariableVM for unlimited * @param vers standard version name, may be NULL * @param doCopyStrings true if strings should be copied, false if only referenced * @param pcreator private creator name, may be NULL (for standard tags) */ DcmDictEntry(Uint16 g, Uint16 e, DcmVR vr, const char* nam, int vmMin, int vmMax, const char* vers, OFBool doCopyStrings, const char* pcreator); /** constructor for repeating tags * @param g attribute tag group lower limit * @param e attribute tag element lower limit * @param ug attribute tag group upper limit * @param ue attribute tag element upper limit * @param vr value representation * @param nam attribute name * @param vmMin lower limit for value multiplicity * @param vmMax upper limit for value multiplicity, DcmVariableVM for unlimited * @param vers standard version name, may be NULL * @param doCopyStrings true if strings should be copied, false if only referenced * @param pcreator private creator name, may be NULL (for standard tags) */ DcmDictEntry(Uint16 g, Uint16 e, Uint16 ug, Uint16 ue, DcmVR vr, const char* nam, int vmMin, int vmMax, const char* vers, OFBool doCopyStrings, const char* pcreator); /// copy constructor DcmDictEntry(const DcmDictEntry& e); /// destructor ~DcmDictEntry(); /* access methods */ /// returns VR object by value DcmVR getVR() const { return valueRepresentation; } /// returns VR code DcmEVR getEVR() const { return valueRepresentation.getEVR(); } /// returns standard version string, may be NULL const char* getStandardVersion() const { return standardVersion; } /// returns tag name const char* getTagName() const { return tagName; } /// returns private creator code, may be NULL const char* getPrivateCreator() const { return privateCreator; } /** checks if the private creator code equals the given string * @param c string to compare with, may be NULL * @return true if equal, false otherwise */ int privateCreatorMatch(const char *c) const { return ( ((privateCreator == NULL) && (c == NULL)) || (privateCreator && c && (0 == strcmp(privateCreator, c))) ); } /** checks if the private creator code of this object matches * the one of the given object. * @param arg dictionary entry to compare with * @return true if private creators are equal, false otherwise */ int privateCreatorMatch(const DcmDictEntry& arg) const { return privateCreatorMatch(arg.privateCreator); } /// returns lower limit for VM (value multiplicity) int getVMMin() const { return valueMultiplicityMin; } /// returns upper limit for VM (value multiplicity), DcmVariableVM for unlimited int getVMMax() const { return valueMultiplicityMax; } /// returns true if element has a single valid VM value OFBool isFixedSingleVM() const { return ((valueMultiplicityMin != DcmVariableVM) && (valueMultiplicityMin == valueMultiplicityMax)); } /// returns true if element has a fixed VM range OFBool isFixedRangeVM() const { return ((valueMultiplicityMin != DcmVariableVM) && (valueMultiplicityMax != DcmVariableVM)); } /// returns true if element has a variable VM range (no upper limit) OFBool isVariableRangeVM() const { return ((valueMultiplicityMin != DcmVariableVM) && (valueMultiplicityMax == DcmVariableVM)); } /** converts entry into repeating tag entry by defining an upper limit * for group and element, taken from the given tag key. * @param key tag key containing upper limit for group and element */ void setUpper(const DcmTagKey& key) { upperKey = key; } /** converts entry into repeating tag entry by defining an upper limit * for tag group * @param ug upper limit for tag group */ void setUpperGroup(Uint16 ug) { upperKey.setGroup(ug); } /** converts entry into repeating tag entry by defining an upper limit * for tag element * @param ue upper limit for tag element */ void setUpperElement(Uint16 ue) { upperKey.setElement(ue); } /// returns upper limit for tag group Uint16 getUpperGroup() const { return upperKey.getGroup(); } /// returns upper limit for tag element Uint16 getUpperElement() const { return upperKey.getElement(); } /// returns attribute tag as DcmTagKey object by value DcmTagKey getKey() const { return * OFstatic_cast(const DcmTagKey *, this); } /// returns upper limits for attribute tag as DcmTagKey object by value DcmTagKey getUpperKey() const { return upperKey; } /// returns true if entry is has a repeating group int isRepeatingGroup() const { return (getGroup() != getUpperGroup()); } /// returns true if entry is has a repeating element int isRepeatingElement() const { return (getElement() != getUpperElement()); } /// returns true if entry is repeating (group or element) int isRepeating() const { return (isRepeatingGroup() || isRepeatingElement()); } /// returns group range restriction DcmDictRangeRestriction getGroupRangeRestriction() const { return groupRangeRestriction; } /// sets group range restriction void setGroupRangeRestriction(DcmDictRangeRestriction rr) { groupRangeRestriction = rr; } /// returns element range restriction DcmDictRangeRestriction getElementRangeRestriction() const { return elementRangeRestriction; } /// sets element range restriction void setElementRangeRestriction(DcmDictRangeRestriction rr) { elementRangeRestriction = rr; } /* containment */ /** checks if the given tag key and private creator code are covered * by this object. * @param key tag key * @param privCreator private creator, may be NULL * @return true if this entry contains the given tag for the given private creator */ int contains(const DcmTagKey& key, const char *privCreator) const /* this contains key */ { if ((getGroupRangeRestriction() == DcmDictRange_Even) && DCM_IS_ODD(key.getGroup())) return OFFalse; else if ((getGroupRangeRestriction() == DcmDictRange_Odd) && DCM_IS_EVEN(key.getGroup())) return OFFalse; else if ((getElementRangeRestriction() == DcmDictRange_Even) && DCM_IS_ODD(key.getElement())) return OFFalse; else if ((getElementRangeRestriction() == DcmDictRange_Odd) && DCM_IS_EVEN(key.getElement())) return OFFalse; else if (! privateCreatorMatch(privCreator)) return OFFalse; else { const OFBool groupMatches=DCM_INRANGE(key.getGroup(), getGroup(), getUpperGroup()); OFBool found=groupMatches && DCM_INRANGE(key.getElement(), getElement(), getUpperElement()); if (!found && groupMatches && privCreator) found=DCM_INRANGE(key.getElement() & 0xFF, getElement(), getUpperElement()); return found; } } /** checks if this entry contains the given name * @param name attribute name, must not be NULL * @return true if tagName matches the given string */ int contains(const char *name) const /* this contains named key */ { return !strcmp( tagName, name ); } /* set relations */ /** checks if this entry describes a true subset of tag range * described by the given entry. * @param e entry to compare with * @return true if this object is subset of e */ int subset(const DcmDictEntry& e) const /* this is a subset of key */ { return ( (getGroup() >= e.getGroup()) && (getUpperGroup() <= e.getUpperGroup()) && (getElement() >= e.getElement()) && (getUpperElement() <= e.getUpperElement()) && privateCreatorMatch(e.privateCreator) ); } /** checks if this entry describes the same tag range as the given entry. * @param e entry to compare with * @return true if objects describe the same tag range */ int setEQ(const DcmDictEntry& e) const /* this is set equal to key */ { return ( (getGroup() == e.getGroup()) && (getUpperGroup() == e.getUpperGroup()) && (getElement() == e.getElement()) && (getUpperElement() == e.getUpperElement()) && (getGroupRangeRestriction() == e.getGroupRangeRestriction()) && (getElementRangeRestriction() == e.getElementRangeRestriction()) && privateCreatorMatch(e.privateCreator) ); } /// friend operator<< friend STD_NAMESPACE ostream& operator<<(STD_NAMESPACE ostream& s, const DcmDictEntry& e); private: /// private undefined copy assignment operator DcmDictEntry &operator=(const DcmDictEntry &); /** upper limit of repeating group and element (lower limit is inherited * from DcmTagKey) */ DcmTagKey upperKey; /// value representation DcmVR valueRepresentation; /// attribute name const char *tagName; /// lower limit for VM int valueMultiplicityMin; /// upper limit for VM int valueMultiplicityMax; /// standard version name, may be NULL const char *standardVersion; /// true if strings are copies (i.e. should be deleted upon destruction) OFBool stringsAreCopies; /// restriction (even, odd, unrestricted) for group range DcmDictRangeRestriction groupRangeRestriction; /// restriction (even, odd, unrestricted) for element range DcmDictRangeRestriction elementRangeRestriction; /// private creator name, may be NULL const char *privateCreator; }; #endif /* !DCDICENT_H */ /* ** CVS/RCS Log: ** $Log: dcdicent.h,v $ ** Revision 1.26 2010-11-17 15:17:51 meichel ** Fixed issue with data dictionary causing private tags with group number ** range and flexible element number not to be found in the dictionary. ** ** Revision 1.25 2010-10-14 13:15:40 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.24 2010-06-25 09:15:19 uli ** Fixed issues with compiling with HAVE_STD_STRING. ** ** Revision 1.23 2010-03-01 09:08:44 uli ** Removed some unnecessary include directives in the headers. ** ** Revision 1.22 2009-11-04 09:58:07 uli ** Switched to logging mechanism provided by the "new" oflog module ** ** Revision 1.21 2006-08-15 15:49:56 meichel ** Updated all code in module dcmdata to correctly compile when ** all standard C++ classes remain in namespace std. ** ** Revision 1.20 2005/12/08 16:28:08 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.19 2004/01/16 14:07:03 joergr ** Removed acknowledgements with e-mail addresses from CVS log. ** ** Revision 1.18 2003/08/14 09:00:56 meichel ** Adapted type casts to new-style typecast operators defined in ofcast.h ** ** Revision 1.17 2002/11/27 12:07:21 meichel ** Adapted module dcmdata to use of new header file ofstdinc.h ** ** Revision 1.16 2002/07/23 14:21:25 meichel ** Added support for private tag data dictionaries to dcmdata ** ** Revision 1.15 2002/04/16 13:41:44 joergr ** Added configurable support for C++ ANSI standard includes (e.g. streams). ** ** Revision 1.14 2001/06/01 15:48:36 meichel ** Updated copyright header ** ** Revision 1.13 2000/03/08 16:26:13 meichel ** Updated copyright header. ** ** Revision 1.12 1999/03/31 09:24:35 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.11 1998/07/15 15:48:45 joergr ** Removed several compiler warnings reported by gcc 2.8.1 with ** additional options, e.g. missing copy constructors and assignment ** operators, initialization of member variables in the body of a ** constructor instead of the member initialization list, hiding of ** methods by use of identical names, uninitialized member variables, ** missing const declaration of char pointers. Replaced tabs by spaces. ** ** Revision 1.10 1997/08/26 13:44:59 hewett ** Modified constructors to take const parameters. ** ** Revision 1.9 1997/07/31 14:40:35 meichel ** Created copy constructor for class DcmDictEntry, required by dcmcheck. ** ** Revision 1.8 1997/07/21 08:25:07 andreas ** - Replace all boolean types (BOOLEAN, CTNBOOLEAN, DICOM_BOOL, BOOL) ** with one unique boolean type OFBool. ** ** Revision 1.7 1997/04/18 08:04:39 andreas ** - Minor corrections: correct some warnings of the SUN-C++ Compiler ** concerning the assignments of wrong types and inline compiler ** errors ** ** Revision 1.6 1997/04/15 16:25:05 hewett ** Corrected data dictionary bug whereby the even/odd range restrictions ** were not being taken into consideration when searching the dictionary. ** ** Revision 1.5 1996/09/24 16:24:58 hewett ** Added preliminary support for the Macintosh environment (GUSI library). ** ** Revision 1.4 1996/09/18 16:37:09 hewett ** Added capability to search data dictionary by tag name. ** ** Revision 1.3 1996/03/20 16:43:49 hewett ** Updated for revised data dictionary. Repeating tags are now handled better. ** A linear list of repeating tags has been introduced with a subset ordering ** mechanism to ensure that dictionary searches locate the most precise ** dictionary entry. ** */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/vrscan.h0000644000310500011400000000265311455601177021240 0ustar joergrdicom3/* * * Copyright (C) 2010, 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: dcmdata * * Author: Uli Schlachter * * Purpose: Interface to the VR scanner. * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:15:43 $ * CVS/RCS Revision: $Revision: 1.5 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef VRSCAN_H #define VRSCAN_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/ofstd/ofstring.h" class vrscan { public: static int scan(const OFString& vr, const OFString& value); private: static char* makeBuffer(const OFString& vr, const OFString& value, size_t& size); }; #endif // VRSCAN_H /* ** CVS/RCS Log: ** $Log: vrscan.h,v $ ** Revision 1.5 2010-10-14 13:15:43 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.4 2010-09-02 10:16:02 uli ** The VR scanner now only copies the input data once, not twice. ** ** Revision 1.3 2010-09-02 09:49:38 uli ** Add the VR prefix into the scanner instead of adding it in the caller. ** ** Revision 1.2 2010-08-26 12:29:47 uli ** Ported vrscan from ancient flex++ to current flex version. ** ** */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/dcdirrec.h0000644000310500011400000006150011470236223021510 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Gerd Ehlers, Andreas Barth * * Purpose: Interface of class DcmDirectoryRecord * * Last Update: $Author: uli $ * Update Date: $Date: 2010-11-15 13:58:43 $ * CVS/RCS Revision: $Revision: 1.47 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DCDIRREC_H #define DCDIRREC_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcitem.h" #include "dcmtk/dcmdata/dcsequen.h" #include "dcmtk/dcmdata/dcfilefo.h" /// types of directory records in a DICOMDIR typedef enum { /// root ERT_root = 0, /// curve (retired) ERT_Curve = 1, /// film box (retired) ERT_FilmBox = 2, /// film session (retired) ERT_FilmSession = 3, /// image ERT_Image = 4, /// image box (retired) ERT_ImageBox = 5, /// interpretation (retired) ERT_Interpretation = 6, /// modality LUT (retired) ERT_ModalityLut = 7, /// MRDR (retired) ERT_Mrdr = 8, /// overlay (retired) ERT_Overlay = 9, /// patient ERT_Patient = 10, /// print queue (retired) ERT_PrintQueue = 11, /// private ERT_Private = 12, /// results ERT_Results = 13, /// series ERT_Series = 14, /// study ERT_Study = 15, /// study component (retired) ERT_StudyComponent = 16, /// topic (retired) ERT_Topic = 17, /// visit (retired) ERT_Visit = 18, /// VOI LUT (retired) ERT_VoiLut = 19, /// SR document ERT_SRDocument = 20, /// presentation state ERT_Presentation = 21, /// waveform ERT_Waveform = 22, /// RT dose ERT_RTDose = 23, /// RT structure set ERT_RTStructureSet = 24, /// RT plan ERT_RTPlan = 25, /// RT treatment record ERT_RTTreatRecord = 26, /// stored print (retired) ERT_StoredPrint = 27, /// key object selection document ERT_KeyObjectDoc = 28, /// registration ERT_Registration = 29, /// fiducial ERT_Fiducial = 30, /// raw data ERT_RawData = 31, /// spectroscopy ERT_Spectroscopy = 32, /// encapsulated document ERT_EncapDoc = 33, /// value map ERT_ValueMap = 34, /// hanging protocol ERT_HangingProtocol = 35, /// stereometric relationships ERT_Stereometric = 36, /// HL7 structured document ERT_HL7StrucDoc = 37, /// palette ERT_Palette = 38, /// surface ERT_Surface = 39, /// measurement ERT_Measurement = 40, /// implant ERT_Implant = 41, /// implant group ERT_ImplantGroup = 42, /// implant assembly ERT_ImplantAssy = 43 } E_DirRecType; class DcmDicomDir; /** a class representing a directory record dataset in a DICOMDIR. */ class DcmDirectoryRecord : public DcmItem { friend class DcmDicomDir; public: /// default constructor DcmDirectoryRecord(); /** constructor * @param tag attribute tag * @param len length of the attribute value */ DcmDirectoryRecord(const DcmTag &tag, const Uint32 len); /** constructor * @param recordType record type * @param referencedFileID referenced file ID in DICOM format * @param sourceFileName path to referenced file in operating system specific format */ DcmDirectoryRecord(const E_DirRecType recordType, const char *referencedFileID, // DICOM format with '\\' const char *sourceFileName); // OS Format /** constructor * @param recordTypeName record type as string * @param referencedFileID referenced file ID in DICOM format * @param sourceFileName path to referenced file in operating system specific format */ DcmDirectoryRecord(const char *recordTypeName, const char *referencedFileID, // DICOM Format with '\\' const char *sourceFileName); // OS Format /** copy constructor * @param oldDirRec element to be copied */ DcmDirectoryRecord(const DcmDirectoryRecord &oldDirRec); /** assignment operator * @param obj the directory record to be copied */ DcmDirectoryRecord &operator=(const DcmDirectoryRecord &obj); /// destructor virtual ~DcmDirectoryRecord(); /** clone method * @return deep copy of this object */ virtual DcmObject *clone() const { return new DcmDirectoryRecord(*this); } /** Virtual object copying. This method can be used for DcmObject * and derived classes to get a deep copy of an object. Internally * the assignment operator is called if the given DcmObject parameter * is of the same type as "this" object instance. If not, an error * is returned. This function permits copying an object by value * in a virtual way which therefore is different to just calling the * assignment operator of DcmElement which could result in slicing * the object. * @param rhs - [in] The instance to copy from. Has to be of the same * class type as "this" object * @return EC_Normal if copying was successful, error otherwise */ virtual OFCondition copyFrom(const DcmObject& rhs); /** return identifier for this class. Every class derived from this class * returns a unique value of type enum DcmEVR for this call. This is used * as a "poor man's RTTI" to correctly identify instances derived from * this class even on compilers not supporting RTTI. * @return type identifier of this class */ virtual DcmEVR ident() const; /// returns current status flag inline OFCondition error() const { return errorFlag; } /** print all elements of the item to a stream * @param out output stream * @param flags optional flag used to customize the output (see DCMTypes::PF_xxx) * @param level current level of nested items. Used for indentation. * @param pixelFileName not used * @param pixelCounter not used */ virtual void print(STD_NAMESPACE ostream&out, const size_t flags = 0, const int level = 0, const char *pixelFileName = NULL, size_t *pixelCounter = NULL); /** This function reads the information of all attributes which * are captured in the input stream and captures this information * in elementList. Each attribute is represented as an element * in this list. If not all information for an attribute could be * read from the stream, the function returns EC_StreamNotifyClient. * @param inStream The stream which contains the information. * @param xfer The transfer syntax which was used to encode * the information in inStream. * @param glenc Encoding type for group length; specifies * what will be done with group length tags. * @param maxReadLength Maximum read length for reading an attribute value. * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition read(DcmInputStream & inStream, const E_TransferSyntax xfer, const E_GrpLenEncoding glenc = EGL_noChange, const Uint32 maxReadLength = DCM_MaxReadLength); /** write object in XML format * @param out output stream to which the XML document is written * @param flags optional flag used to customize the output (see DCMTypes::XF_xxx) * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition writeXML(STD_NAMESPACE ostream&out, const size_t flags = 0); /** check the currently stored element value * @param autocorrect correct value length if OFTrue * @return status, EC_Normal if value length is correct, an error code otherwise */ virtual OFCondition verify(const OFBool autocorrect = OFFalse); /** a complex, stack-based, hierarchical search method. It allows for a search * for a DICOM object with a given attribute within a given container, * hierarchically, from a starting position identified through a cursor stack. * @param xtag the DICOM attribute tag we are searching for * @param resultStack Depending on the search mode (see below), this parameter * either serves as an input and output parameter, or as an output parameter * only (the latter being the default). When used as an input parameter, * the cursor stack defines the start position for the search within a * hierarchical DICOM dataset. Upon successful return, the stack contains * the position of the element found, in the form of a pointer to each dataset, * sequence, item and element from the main dataset down to the found element. * @param mode search mode, controls how the search stack is handled. * In the default mode, ESM_fromHere, the stack is ignored on input, and * the search starts in the object for which this method is called. * In the other modes, the stack is used both as an input and an output * parameter and defines the starting point for the search. * @param searchIntoSub if true, the search will be performed hierarchically descending * into the sequences and items of the dataset. If false, only the current container * (sequence or item) will be traversed. * @return EC_Normal if found, EC_TagNotFound if not found, an error code is something went wrong. */ virtual OFCondition search(const DcmTagKey &xtag, // in DcmStack &resultStack, // inout E_SearchMode mode = ESM_fromHere, // in OFBool searchIntoSub = OFTrue); // in /// get record type of this directory record virtual E_DirRecType getRecordType(); /** if this directory record references an MRDR (multi-reference directory record), * return pointer to the MRDR referenced by this object. * @return pointer to MRDR referenced by this object or NULL of no MRDR referenced */ virtual DcmDirectoryRecord* getReferencedMRDR(); /** create a reference from this record to an MRDR * @param mrdr pointer to MRDR * @return EC_Normal upon success, an error code otherwise */ virtual OFCondition assignToMRDR(DcmDirectoryRecord *mrdr ); // in /** open a DICOM file and make this directory record into adirectory * record for that DICOM file. The most relevant record keys * (SOP Class UID, SOP instance UID, Transfer Syntax UID) are inserted * into the directory record. * @param referencedFileID referenced file ID in DICOM format * @param sourceFileName path to file in operating system specific format * @return EC_Normal upon success, an error code otherwise */ virtual OFCondition assignToSOPFile(const char *referencedFileID, const char *sourceFileName); /// return number of directory records that are child record of this one virtual unsigned long cardSub(); /** insert a child directory record * @param dirRec directory record to be inserted. Must be allocated on heap, ownership is transferred to this object * @param where index where to insert object * @param before flag indicating whether to insert the record before or after the element identified by where * @return EC_Normal upon success, an error code otherwise */ virtual OFCondition insertSub(DcmDirectoryRecord* dirRec, unsigned long where = DCM_EndOfListIndex, OFBool before = OFFalse); /** insert new directory child record at the current position. * The current position is stored internally in the 'lowerLevelList' member variable. * @param dirRec new child record to be inserted * @param before flag indicating whether to insert the record before (OFFalse) or * after (OFTrue) the current position * @return status, EC_Normal upon success, an error code otherwise */ virtual OFCondition insertSubAtCurrentPos(DcmDirectoryRecord *dirRec, OFBool before = OFFalse); /** access child directory record. Returns a pointer to the object maintained * as a child, not a copy. * @param num index, must be < cardSub() * @return pointer to child directory record or NULL if not found */ virtual DcmDirectoryRecord* getSub(const unsigned long num); /** get next directory child record starting at a given record * @param dirRec record to start from (goto first record if NULL) * @return pointer to next record if successful, NULL otherwise */ virtual DcmDirectoryRecord* nextSub(const DcmDirectoryRecord *dirRec); /** remove child directory record. If found, the record is not deleted but * returned to the caller who is responsible for further management of the * DcmDirectoryRecord object. * @param num index number of element, must be < cardSub() * @return pointer to DcmDirectoryRecord if found, NULL otherwise */ virtual DcmDirectoryRecord* removeSub(const unsigned long num); /** remove child directory record. If found, the record is not deleted but * returned to the caller who is responsible for further management of the * DcmDirectoryRecord object. * @param dirRec pointer to element to be removed from list * @return pointer to element if found, NULL otherwise */ virtual DcmDirectoryRecord* removeSub(DcmDirectoryRecord *dirRec); /** remove child directory record and delete file referenced by that record, if any * @param num index number of element, must be < cardSub() * @return status, EC_Normal upon success, an error code otherwise */ virtual OFCondition deleteSubAndPurgeFile(const unsigned long num); /** remove child directory record and delete file referenced by that record, if any * @param dirRec pointer to element to be removed from list * @return status, EC_Normal upon success, an error code otherwise */ virtual OFCondition deleteSubAndPurgeFile(DcmDirectoryRecord *dirRec); /// revert the list of child directory records to default constructed (empty) state virtual OFCondition clearSub(); /** store the filename from which this directory record was read from * @param fname filename, must not be NULL */ virtual void setRecordsOriginFile(const char *fname); /// get the filename from which this directory record was read from, NULL íf not set virtual const char* getRecordsOriginFile(); /// get the offset in file of this directory record Uint32 getFileOffset() const; protected: // side-effect-free conversion routines: E_DirRecType recordNameToType(const char *recordTypeName); char* buildFileName(const char *origName, char *destName); OFCondition checkHierarchy(const E_DirRecType upperRecord, const E_DirRecType lowerRecord); // access to data elements within the Directory Records: OFCondition setRecordType(E_DirRecType newType); E_DirRecType lookForRecordType(); OFCondition setReferencedFileID( const char *referencedFileID); const char* lookForReferencedFileID(); DcmDirectoryRecord* lookForReferencedMRDR(); const char* getReferencedFileName(); // local or in MRDR OFCondition setRecordInUseFlag(const Uint16 newFlag); Uint16 lookForRecordInUseFlag(); Uint32 setFileOffset(Uint32 position); // access to MRDR data element: OFCondition setNumberOfReferences(Uint32 newRefNum); Uint32 lookForNumberOfReferences(); Uint32 increaseRefNum(); Uint32 decreaseRefNum(); // misc: OFCondition fillElementsAndReadSOP(const char *referencedFileID, const char *sourceFileName); OFCondition masterInsertSub(DcmDirectoryRecord *dirRec, const unsigned long where = DCM_EndOfListIndex); OFCondition purgeReferencedFile(); private: /// string in which the filename (path) of the file from which this directory record was read is kept char *recordsOriginFile; /// list of child directory records, kept in a sequence of items DcmSequenceOfItems *lowerLevelList; /// directory record type of this record E_DirRecType DirRecordType; /// pointer to multi-referenced directory record (MRDR) if this record refers to one, NULL otherwise DcmDirectoryRecord *referencedMRDR; /// number of other directory records referring to this one; used for MRDR records Uint32 numberOfReferences; /// byte offset at which the start of this directory record resides in the file from which it was read Uint32 offsetInFile; }; #endif // DCDIRREC_H /* ** CVS/RCS Log: ** $Log: dcdirrec.h,v $ ** Revision 1.47 2010-11-15 13:58:43 uli ** Fixed some errors in doxygen comments. ** ** Revision 1.46 2010-11-05 13:11:11 joergr ** Added support for new directory record types IMPLANT, IMPLANT GROUP and ** IMPLANT ASSY from Supplement 131 (Implant Templates). ** ** Revision 1.45 2010-10-14 13:15:40 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.44 2010-10-01 08:06:16 joergr ** Added new directory record type MEASUREMENT from Supplement 144. ** ** Revision 1.43 2010-09-30 16:43:18 joergr ** Added new directory record types HL7 STRUC DOC, PALETTE and SURFACE. ** ** Revision 1.42 2010-03-01 09:08:44 uli ** Removed some unnecessary include directives in the headers. ** ** Revision 1.41 2010-02-22 11:39:53 uli ** Remove some unneeded includes. ** ** Revision 1.40 2008-07-17 11:19:48 onken ** Updated copyFrom() documentation. ** ** Revision 1.39 2008-07-17 10:30:23 onken ** Implemented copyFrom() method for complete DcmObject class hierarchy, which ** permits setting an instance's value from an existing object. Implemented ** assignment operator where necessary. ** ** Revision 1.38 2008-06-03 13:41:40 meichel ** DcmDirectoryRecord::getFileOffset() is now const and public. ** ** Revision 1.37 2007/11/29 14:30:35 meichel ** Updated doxygen API documentation ** ** Revision 1.36 2007/06/29 14:17:49 meichel ** Code clean-up: Most member variables in module dcmdata are now private, ** not protected anymore. ** ** Revision 1.35 2007/02/19 15:04:34 meichel ** Removed searchErrors() methods that are not used anywhere and added ** error() methods only in the DcmObject subclasses where really used. ** ** Revision 1.34 2006/08/16 09:41:26 joergr ** Added missing CVS log entry. ** ** Revision 1.33 2006/08/15 15:49:56 meichel ** Updated all code in module dcmdata to correctly compile when ** all standard C++ classes remain in namespace std. ** ** Revision 1.32 2006/07/27 13:05:05 joergr ** Added support for DICOMDIR record type "STEREOMETRIC" (CP 628). ** Renamed ERT_StructReport to ERT_SRDocument. ** ** Revision 1.31 2006/05/11 17:48:53 joergr ** Fixed wrong CVS log entry. ** ** Revision 1.30 2006/05/11 08:53:36 joergr ** Added "offset" attribute to DICOMDIR record items. ** ** Revision 1.29 2005/12/08 16:28:10 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.28 2005/10/27 13:30:20 joergr ** Added support for Encapsulated Document, Real World Value Mapping and ** Hanging Protocol objects to DICOMDIR tools. ** ** Revision 1.27 2004/07/01 12:28:25 meichel ** Introduced virtual clone method for DcmObject and derived classes. ** ** Revision 1.26 2004/02/13 17:36:46 joergr ** Added support for new directory records RAW DATA and SPECTROSCOPY introduced ** with CP 343. ** ** Revision 1.25 2004/02/13 14:10:57 joergr ** Added support for new directory records REGISTRATION and FIDUCIAL introduced ** with supplement 73 (Spatial Registration Storage SOP Classes). ** ** Revision 1.24 2003/08/08 14:14:04 joergr ** Translated remaining German comments. ** ** Revision 1.23 2003/08/08 14:04:16 joergr ** Added two new methods insertSubAtCurrentPos() and nextSub() which allow for ** a much more efficient insertion (avoids re-searching for correct position). ** ** Revision 1.22 2002/12/06 12:49:09 joergr ** Enhanced "print()" function by re-working the implementation and replacing ** the boolean "showFullData" parameter by a more general integer flag. ** Added doc++ documentation. ** Made source code formatting more consistent with other modules/files. ** ** Revision 1.21 2002/08/27 16:55:31 meichel ** Initial release of new DICOM I/O stream classes that add support for stream ** compression (deflated little endian explicit VR transfer syntax) ** ** Revision 1.20 2001/09/25 17:19:25 meichel ** Adapted dcmdata to class OFCondition ** ** Revision 1.19 2001/06/20 14:59:15 joergr ** Added support for new SOP class Key Object Selection Document (suppl. 59). ** ** Revision 1.18 2001/06/01 15:48:39 meichel ** Updated copyright header ** ** Revision 1.17 2000/12/14 12:47:20 joergr ** Updated for 2000 edition of the DICOM standard (added: SR, PR, WV, SP, RT). ** ** Revision 1.16 2000/04/14 16:02:23 meichel ** Removed default value from output stream passed to print() method. ** Required for use in multi-thread environments. ** ** Revision 1.15 2000/03/08 16:26:14 meichel ** Updated copyright header. ** ** Revision 1.14 2000/03/03 14:05:23 meichel ** Implemented library support for redirecting error messages into memory ** instead of printing them to stdout/stderr for GUI applications. ** ** Revision 1.13 2000/02/10 10:50:50 joergr ** Added new feature to dcmdump (enhanced print method of dcmdata): write ** pixel data/item value fields to raw files. ** ** Revision 1.12 1999/03/31 09:24:36 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.11 1999/03/22 14:10:57 meichel ** Added support for Structured Reports to dcmgpdir. ** Added preliminary support for including sequences into a DICOMDIR. ** ** Revision 1.10 1998/07/15 15:48:46 joergr ** Removed several compiler warnings reported by gcc 2.8.1 with ** additional options, e.g. missing copy constructors and assignment ** operators, initialization of member variables in the body of a ** constructor instead of the member initialization list, hiding of ** methods by use of identical names, uninitialized member variables, ** missing const declaration of char pointers. Replaced tabs by spaces. ** ** Revision 1.9 1997/07/21 08:00:45 andreas ** - Corrected error in DcmDirectoryRecord::write since this routine can ** change the length of the record after this is calculated in the ** sequence. ** - DcmDirectoryRecord can be build with a referenced Name and a source ** filename. These name now can differ (lower case - upper case ** characters). ** - Replace all boolean types (BOOLEAN, CTNBOOLEAN, DICOM_BOOL, BOOL) ** with one unique boolean type OFBool. ** ** Revision 1.8 1997/07/07 07:42:04 andreas ** - Changed parameter type DcmTag & to DcmTagKey & in all search functions ** in DcmItem, DcmSequenceOfItems, DcmDirectoryRecord and DcmObject ** ** Revision 1.7 1997/05/16 08:31:21 andreas ** - Revised handling of GroupLength elements and support of ** DataSetTrailingPadding elements. The enumeratio E_GrpLenEncoding ** got additional enumeration values (for a description see dctypes.h). ** addGroupLength and removeGroupLength methods are replaced by ** computeGroupLengthAndPadding. To support Padding, the parameters of ** element and sequence write functions changed. ** ** Revision 1.6 1997/05/09 13:12:02 hewett ** Added a member variable and associated get/set methods to DcmDirectoryRecord ** to allow the origin of a directory record to be noted. ** ** Revision 1.5 1997/05/06 09:22:35 hewett ** Added a "before" flag to the insertion of items for compatibility with ** insertion in normal Sequences. ** ** Revision 1.4 1997/03/26 16:56:25 hewett ** Removed the DcmDirectoryRecord member function fillTypeElements since it ** did nothing useful. Smoothed out some poor indentation. ** ** Revision 1.3 1996/08/05 08:45:20 andreas ** new print routine with additional parameters: ** - print into files ** - fix output length for elements ** corrected error in search routine with parameter ESM_fromStackTop ** ** Revision 1.2 1996/01/05 13:22:54 andreas ** - changed to support new streaming facilities ** - more cleanups ** - merged read / write methods for block and file transfer ** */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/dcvrlo.h0000644000310500011400000002060411464747623021240 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Gerd Ehlers, Andreas Barth * * Purpose: Interface of class DcmLongString * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-11-05 09:34:11 $ * CVS/RCS Revision: $Revision: 1.23 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DCVRLO_H #define DCVRLO_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcchrstr.h" /** a class representing the DICOM value representation 'Long String' (LO) */ class DcmLongString : public DcmCharString { public: /** constructor. * Create new element from given tag and length. * @param tag DICOM tag for the new element * @param len value length for the new element */ DcmLongString(const DcmTag &tag, const Uint32 len = 0); /** copy constructor * @param old element to be copied */ DcmLongString(const DcmLongString &old); /** destructor */ virtual ~DcmLongString(); /** assignment operator * @param obj element to be assigned/copied * @return reference to this object */ DcmLongString &operator=(const DcmLongString &obj); /** clone method * @return deep copy of this object */ virtual DcmObject *clone() const { return new DcmLongString(*this); } /** Virtual object copying. This method can be used for DcmObject * and derived classes to get a deep copy of an object. Internally * the assignment operator is called if the given DcmObject parameter * is of the same type as "this" object instance. If not, an error * is returned. This function permits copying an object by value * in a virtual way which therefore is different to just calling the * assignment operator of DcmElement which could result in slicing * the object. * @param rhs - [in] The instance to copy from. Has to be of the same * class type as "this" object * @return EC_Normal if copying was successful, error otherwise */ virtual OFCondition copyFrom(const DcmObject& rhs); /** get element type identifier * @return type identifier of this class (EVR_LO) */ virtual DcmEVR ident() const; /** check whether stored value conforms to the VR and to the specified VM * @param vm value multiplicity (according to the data dictionary) to be checked for. * (valid values: "1", "1-2", "1-3", "1-8", "1-99", "1-n", "2", "2-n", "2-2n", * "3", "3-n", "3-3n", "4", "6", "9", "16", "32") * @param oldFormat parameter not used for this VR (only for DA, TM, PN) * @return status of the check, EC_Normal if value is correct, an error code otherwise */ virtual OFCondition checkValue(const OFString &vm = "1-n", const OFBool oldFormat = OFFalse); /** get a copy of a particular string component * @param stringVal variable in which the result value is stored * @param pos index of the value in case of multi-valued elements (0..vm-1) * @param normalize delete leading and trailing spaces if OFTrue * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition getOFString(OFString &stringVal, const unsigned long pos, OFBool normalize = OFTrue); /* --- static helper functions --- */ /** check whether given string value conforms to the VR "LO" (Long String) * and to the specified VM. * @param value string value to be checked (possibly multi-valued) * @param vm value multiplicity (according to the data dictionary) to be checked for. * (valid values: "1", "1-2", "1-3", "1-8", "1-99", "1-n", "2", "2-n", "2-2n", * "3", "3-n", "3-3n", "4", "6", "9", "16", "32") * @return status of the check, EC_Normal if value is correct, an error code otherwise */ static OFCondition checkStringValue(const OFString &value, const OFString &vm = "1-n"); }; #endif // DCVRLO_H /* ** CVS/RCS Log: ** $Log: dcvrlo.h,v $ ** Revision 1.23 2010-11-05 09:34:11 joergr ** Added support for checking the value multiplicity "9" (see Supplement 131). ** ** Revision 1.22 2010-10-14 13:15:43 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.21 2010-04-23 15:26:13 joergr ** Specify an appropriate default value for the "vm" parameter of checkValue(). ** ** Revision 1.20 2010-04-23 14:25:27 joergr ** Added new method to all VR classes which checks whether the stored value ** conforms to the VR definition and to the specified VM. ** ** Revision 1.19 2010-04-22 09:31:30 joergr ** Revised misleading parameter documentation for the checkValue() method. ** ** Revision 1.18 2010-04-22 08:59:10 joergr ** Added support for further VM values ("1-8", "1-99", "16", "32") to be checked. ** ** Revision 1.17 2009-08-03 09:05:30 joergr ** Added methods that check whether a given string value conforms to the VR and ** VM definitions of the DICOM standards. ** ** Revision 1.16 2008-07-17 11:19:49 onken ** Updated copyFrom() documentation. ** ** Revision 1.15 2008-07-17 10:30:23 onken ** Implemented copyFrom() method for complete DcmObject class hierarchy, which ** permits setting an instance's value from an existing object. Implemented ** assignment operator where necessary. ** ** Revision 1.14 2005-12-08 16:29:01 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.13 2004/07/01 12:28:25 meichel ** Introduced virtual clone method for DcmObject and derived classes. ** ** Revision 1.12 2002/12/06 12:49:16 joergr ** Enhanced "print()" function by re-working the implementation and replacing ** the boolean "showFullData" parameter by a more general integer flag. ** Added doc++ documentation. ** Made source code formatting more consistent with other modules/files. ** ** Revision 1.11 2002/04/25 09:54:53 joergr ** Removed getOFStringArray() implementation. ** ** Revision 1.10 2001/09/25 17:19:32 meichel ** Adapted dcmdata to class OFCondition ** ** Revision 1.9 2001/06/01 15:48:51 meichel ** Updated copyright header ** ** Revision 1.8 2000/03/08 16:26:24 meichel ** Updated copyright header. ** ** Revision 1.7 1999/03/31 09:25:02 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.6 1998/11/12 16:47:50 meichel ** Implemented operator= for all classes derived from DcmObject. ** ** Revision 1.5 1997/09/11 15:13:15 hewett ** Modified getOFString method arguments by removing a default value ** for the pos argument. By requiring the pos argument to be provided ** ensures that callers realise getOFString only gets one component of ** a multi-valued string. ** ** Revision 1.4 1997/08/29 08:32:42 andreas ** - Added methods getOFString and getOFStringArray for all ** string VRs. These methods are able to normalise the value, i. e. ** to remove leading and trailing spaces. This will be done only if ** it is described in the standard that these spaces are not relevant. ** These methods do not test the strings for conformance, this means ** especially that they do not delete spaces where they are not allowed! ** getOFStringArray returns the string with all its parts separated by \ ** and getOFString returns only one value of the string. ** CAUTION: Currently getString returns a string with trailing ** spaces removed (if dcmEnableAutomaticInputDataCorrection == OFTrue) and ** truncates the original string (since it is not copied!). If you rely on this ** behaviour please change your application now. ** Future changes will ensure that getString returns the original ** string from the DICOM object (NULL terminated) inclusive padding. ** Currently, if you call getOF... before calling getString without ** normalisation, you can get the original string read from the DICOM object. ** ** Revision 1.3 1996/01/05 13:23:06 andreas ** - changed to support new streaming facilities ** - more cleanups ** - merged read / write methods for block and file transfer ** */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/dcrleerg.h0000644000310500011400000000661311455601176021532 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Marco Eichelberg * * Purpose: singleton class that registers RLE encoder. * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:15:42 $ * CVS/RCS Revision: $Revision: 1.7 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DCRLEERG_H #define DCRLEERG_H #include "dcmtk/config/osconfig.h" #include "dcmtk/ofstd/oftypes.h" /* for OFBool */ #include "dcmtk/ofstd/oftypes.h" /* for Uint32 */ class DcmRLECodecParameter; class DcmRLECodecEncoder; /** singleton class that registers an RLE encoder. */ class DcmRLEEncoderRegistration { public: /** registers RLE encoder. * If already registered, call is ignored unless cleanup() has * been performed before. * @param pCreateSOPInstanceUID flag indicating whether or not * a new SOP Instance UID should be assigned upon compression. * @param pFragmentSize maximum fragment size (in kbytes) for compression, 0 for unlimited. * @param pCreateOffsetTable create offset table during image compression? * @param pConvertToSC flag indicating whether image should be converted to * Secondary Capture upon compression */ static void registerCodecs( OFBool pCreateSOPInstanceUID = OFFalse, Uint32 pFragmentSize = 0, OFBool pCreateOffsetTable = OFTrue, OFBool pConvertToSC = OFFalse); /** deregisters encoder. * Attention: Must not be called while other threads might still use * the registered codecs, e.g. because they are currently encoding * DICOM data sets through dcmdata. */ static void cleanup(); private: /// private undefined copy constructor DcmRLEEncoderRegistration(const DcmRLEEncoderRegistration&); /// private undefined copy assignment operator DcmRLEEncoderRegistration& operator=(const DcmRLEEncoderRegistration&); /// flag indicating whether the encoder is already registered. static OFBool registered; /// pointer to codec parameter static DcmRLECodecParameter *cp; /// pointer to RLE encoder static DcmRLECodecEncoder *codec; // dummy friend declaration to prevent gcc from complaining // that this class only defines private constructors and has no friends. friend class DcmRLEEncoderRegistrationDummyFriend; }; #endif /* * CVS/RCS Log * $Log: dcrleerg.h,v $ * Revision 1.7 2010-10-14 13:15:42 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.6 2010-03-01 09:08:44 uli * Removed some unnecessary include directives in the headers. * * Revision 1.5 2009-11-04 09:58:07 uli * Switched to logging mechanism provided by the "new" oflog module * * Revision 1.4 2005-12-08 16:28:39 meichel * Changed include path schema for all DCMTK header files * * Revision 1.3 2004/01/20 12:57:21 meichel * Added dummy friend class to avoid warning on certain gcc releases * * Revision 1.2 2003/03/21 13:06:46 meichel * Minor code purifications for warnings reported by MSVC in Level 4 * * Revision 1.1 2002/06/06 14:52:37 meichel * Initial release of the new RLE codec classes * and the dcmcrle/dcmdrle tools in module dcmdata * * */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/dcvrds.h0000644000310500011400000002457511464747623021247 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Gerd Ehlers, Andreas Barth * * Purpose: Interface of class DcmDecimalString * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-11-05 09:34:11 $ * CVS/RCS Revision: $Revision: 1.27 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DCVRDS_H #define DCVRDS_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/ofstd/ofvector.h" #include "dcmtk/dcmdata/dcbytstr.h" /** a class representing the DICOM value representation 'Decimal String' (DS) */ class DcmDecimalString : public DcmByteString { public: /** constructor. * Create new element from given tag and length. * @param tag DICOM tag for the new element * @param len value length for the new element */ DcmDecimalString(const DcmTag &tag, const Uint32 len = 0); /** copy constructor * @param old element to be copied */ DcmDecimalString(const DcmDecimalString &old); /** destructor */ virtual ~DcmDecimalString(); /** assignment operator * @param obj element to be assigned/copied * @return reference to this object */ DcmDecimalString &operator=(const DcmDecimalString &obj); /** clone method * @return deep copy of this object */ virtual DcmObject *clone() const { return new DcmDecimalString(*this); } /** Virtual object copying. This method can be used for DcmObject * and derived classes to get a deep copy of an object. Internally * the assignment operator is called if the given DcmObject parameter * is of the same type as "this" object instance. If not, an error * is returned. This function permits copying an object by value * in a virtual way which therefore is different to just calling the * assignment operator of DcmElement which could result in slicing * the object. * @param rhs - [in] The instance to copy from. Has to be of the same * class type as "this" object * @return EC_Normal if copying was successful, error otherwise */ virtual OFCondition copyFrom(const DcmObject& rhs); /** get element type identifier * @return type identifier of this class (EVR_DS) */ virtual DcmEVR ident() const; /** check whether stored value conforms to the VR and to the specified VM * @param vm value multiplicity (according to the data dictionary) to be checked for. * (valid values: "1", "1-2", "1-3", "1-8", "1-99", "1-n", "2", "2-n", "2-2n", * "3", "3-n", "3-3n", "4", "6", "9", "16", "32") * @param oldFormat parameter not used for this VR (only for DA, TM, PN) * @return status of the check, EC_Normal if value is correct, an error code otherwise */ virtual OFCondition checkValue(const OFString &vm = "1-n", const OFBool oldFormat = OFFalse); /** get particular float value * @param doubleVal reference to result variable * @param pos index of the value to be retrieved (0..vm-1) * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition getFloat64(Float64 &doubleVal, const unsigned long pos = 0); /** get stored float values as a vector. * Please note that only an element value consisting of zero or more spaces is considered * as being empty and, therefore, results in an empty vector with status ".good()"; use * isEmpty() before calling this method if you also want to check for other non-significant * characters (e.g. the backslash). * @param doubleVals reference to result variable * (cleared automatically before entries are added) * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition getFloat64Vector(OFVector &doubleVals); /** get a particular value as a character string * @param stringVal variable in which the result value is stored * @param pos index of the value in case of multi-valued elements (0..vm-1) * @param normalize delete leading and trailing spaces if OFTrue * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition getOFString(OFString &stringVal, const unsigned long pos, OFBool normalize = OFTrue); /** write object in XML format * @param out output stream to which the XML document is written * @param flags optional flag used to customize the output (see DCMTypes::XF_xxx) * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition writeXML(STD_NAMESPACE ostream &out, const size_t flags = 0); /* --- static helper functions --- */ /** check whether given string value conforms to the VR "DS" (Decimal String) * and to the specified VM. * @param value string value to be checked (possibly multi-valued) * @param vm value multiplicity (according to the data dictionary) to be checked for. * (valid values: "1", "1-2", "1-3", "1-8", "1-99", "1-n", "2", "2-n", "2-2n", * "3", "3-n", "3-3n", "4", "6", "9", "16", "32") * @return status of the check, EC_Normal if value is correct, an error code otherwise */ static OFCondition checkStringValue(const OFString &value, const OFString &vm = "1-n"); }; #endif // DCVRDS_H /* ** CVS/RCS Log: ** $Log: dcvrds.h,v $ ** Revision 1.27 2010-11-05 09:34:11 joergr ** Added support for checking the value multiplicity "9" (see Supplement 131). ** ** Revision 1.26 2010-10-27 09:18:27 joergr ** Added getFloat64Vector() method which allows for retrieving the stored ** floating point values more efficiently (especially when there are many ** values). ** ** Revision 1.25 2010-10-14 13:15:42 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.24 2010-04-23 15:26:13 joergr ** Specify an appropriate default value for the "vm" parameter of checkValue(). ** ** Revision 1.23 2010-04-23 14:25:27 joergr ** Added new method to all VR classes which checks whether the stored value ** conforms to the VR definition and to the specified VM. ** ** Revision 1.22 2010-04-22 09:31:30 joergr ** Revised misleading parameter documentation for the checkValue() method. ** ** Revision 1.21 2010-04-22 08:59:10 joergr ** Added support for further VM values ("1-8", "1-99", "16", "32") to be checked. ** ** Revision 1.20 2010-03-01 09:08:45 uli ** Removed some unnecessary include directives in the headers. ** ** Revision 1.19 2009-08-03 09:05:30 joergr ** Added methods that check whether a given string value conforms to the VR and ** VM definitions of the DICOM standards. ** ** Revision 1.18 2008-07-17 11:19:49 onken ** Updated copyFrom() documentation. ** ** Revision 1.17 2008-07-17 10:30:23 onken ** Implemented copyFrom() method for complete DcmObject class hierarchy, which ** permits setting an instance's value from an existing object. Implemented ** assignment operator where necessary. ** ** Revision 1.16 2006-10-13 10:12:28 joergr ** Enhanced performance of writeXML() for large multi-valued DS elements. ** ** Revision 1.15 2005/12/08 16:28:56 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.14 2004/07/01 12:28:25 meichel ** Introduced virtual clone method for DcmObject and derived classes. ** ** Revision 1.13 2002/12/06 12:49:15 joergr ** Enhanced "print()" function by re-working the implementation and replacing ** the boolean "showFullData" parameter by a more general integer flag. ** Added doc++ documentation. ** Made source code formatting more consistent with other modules/files. ** ** Revision 1.12 2002/04/25 09:51:08 joergr ** Removed getOFStringArray() implementation. ** ** Revision 1.11 2001/09/25 17:19:30 meichel ** Adapted dcmdata to class OFCondition ** ** Revision 1.10 2001/06/01 15:48:49 meichel ** Updated copyright header ** ** Revision 1.9 2000/03/08 16:26:22 meichel ** Updated copyright header. ** ** Revision 1.8 1999/03/31 09:24:58 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.7 1998/11/12 16:47:47 meichel ** Implemented operator= for all classes derived from DcmObject. ** ** Revision 1.6 1997/09/11 15:13:13 hewett ** Modified getOFString method arguments by removing a default value ** for the pos argument. By requiring the pos argument to be provided ** ensures that callers realise getOFString only gets one component of ** a multi-valued string. ** ** Revision 1.5 1997/08/29 08:32:41 andreas ** - Added methods getOFString and getOFStringArray for all ** string VRs. These methods are able to normalise the value, i. e. ** to remove leading and trailing spaces. This will be done only if ** it is described in the standard that these spaces are not relevant. ** These methods do not test the strings for conformance, this means ** especially that they do not delete spaces where they are not allowed! ** getOFStringArray returns the string with all its parts separated by \ ** and getOFString returns only one value of the string. ** CAUTION: Currently getString returns a string with trailing ** spaces removed (if dcmEnableAutomaticInputDataCorrection == OFTrue) and ** truncates the original string (since it is not copied!). If you rely on this ** behaviour please change your application now. ** Future changes will ensure that getString returns the original ** string from the DICOM object (NULL terminated) inclusive padding. ** Currently, if you call getOF... before calling getString without ** normalisation, you can get the original string read from the DICOM object. ** ** Revision 1.4 1997/05/12 07:37:44 andreas ** - new get-Methods for DcmDecimalString: getFloat64 and ** DcmIntegerString: getSint32 ** ** Revision 1.3 1996/01/05 13:23:04 andreas ** - changed to support new streaming facilities ** - more cleanups ** - merged read / write methods for block and file transfer ** */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/dcvrus.h0000644000310500011400000002523011464747623021255 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Gerd Ehlers, Andreas Barth * * Purpose: Interface of class DcmUnsignedShort * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-11-05 09:34:11 $ * CVS/RCS Revision: $Revision: 1.27 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DCVRUS_H #define DCVRUS_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcelem.h" /** a class representing the DICOM value representation 'Unsigned Short' (US) */ class DcmUnsignedShort : public DcmElement { public: /** constructor. * Create new element from given tag and length. * @param tag DICOM tag for the new element * @param len value length for the new element */ DcmUnsignedShort(const DcmTag &tag, const Uint32 len = 0); /** copy constructor * @param old element to be copied */ DcmUnsignedShort(const DcmUnsignedShort &old); /** destructor */ virtual ~DcmUnsignedShort(); /** assignment operator * @param obj element to be assigned/copied * @return reference to this object */ DcmUnsignedShort &operator=(const DcmUnsignedShort &obj); /** clone method * @return deep copy of this object */ virtual DcmObject *clone() const { return new DcmUnsignedShort(*this); } /** Virtual object copying. This method can be used for DcmObject * and derived classes to get a deep copy of an object. Internally * the assignment operator is called if the given DcmObject parameter * is of the same type as "this" object instance. If not, an error * is returned. This function permits copying an object by value * in a virtual way which therefore is different to just calling the * assignment operator of DcmElement which could result in slicing * the object. * @param rhs - [in] The instance to copy from. Has to be of the same * class type as "this" object * @return EC_Normal if copying was successful, error otherwise */ virtual OFCondition copyFrom(const DcmObject& rhs); /** get element type identifier * @return type identifier of this class (EVR_US) */ virtual DcmEVR ident() const; /** check whether stored value conforms to the VR and to the specified VM * @param vm value multiplicity (according to the data dictionary) to be checked for. * (valid values: "1", "1-2", "1-3", "1-8", "1-99", "1-n", "2", "2-n", "2-2n", * "3", "3-n", "3-3n", "4", "6", "9", "16", "32") * @param oldFormat parameter not used for this VR (only for DA, TM, PN) * @return status of the check, EC_Normal if value is correct, an error code otherwise */ virtual OFCondition checkValue(const OFString &vm = "1-n", const OFBool oldFormat = OFFalse); /** get value multiplicity * @return number of currently stored values */ virtual unsigned long getVM(); /** print element to a stream. * The output format of the value is a backslash separated sequence of numbers. * @param out output stream * @param flags optional flag used to customize the output (see DCMTypes::PF_xxx) * @param level current level of nested items. Used for indentation. * @param pixelFileName not used * @param pixelCounter not used */ virtual void print(STD_NAMESPACE ostream&out, const size_t flags = 0, const int level = 0, const char *pixelFileName = NULL, size_t *pixelCounter = NULL); /** get particular integer value * @param uintVal reference to result variable (cleared in case of error) * @param pos index of the value to be retrieved (0..vm-1) * @return status status, EC_Normal if successful, an error code otherwise */ virtual OFCondition getUint16(Uint16 &uintVal, const unsigned long pos = 0); /** get reference to stored integer data. * The number of entries can be determined by "getVM()". * @param uintVals reference to result variable * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition getUint16Array(Uint16 *&uintVals); /** get particular value as a character string * @param stringVal variable in which the result value is stored * @param pos index of the value in case of multi-valued elements (0..vm-1) * @param normalize not used * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition getOFString(OFString &stringVal, const unsigned long pos, OFBool normalize = OFTrue); /** set particular element value to given integer * @param uintVal unsigned integer value to be set * @param pos index of the value to be set (0 = first position) * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition putUint16(const Uint16 uintVal, const unsigned long pos = 0); /** set element value to given integer array data * @param uintVals unsigned integer data to be set * @param numUints number of integer values to be set * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition putUint16Array(const Uint16 *uintVals, const unsigned long numUints); /** set element value from the given character string. * The input string is expected to be a backslash separated sequence of * numeric characters, e.g. "1\22\333\4444\55555". * @param stringVal input character string * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition putString(const char *stringVal); /** check the currently stored element value * @param autocorrect correct value length if OFTrue * @return status, EC_Normal if value length is correct, an error code otherwise */ virtual OFCondition verify(const OFBool autocorrect = OFFalse); }; #endif // DCVRUS_H /* ** CVS/RCS Log: ** $Log: dcvrus.h,v $ ** Revision 1.27 2010-11-05 09:34:11 joergr ** Added support for checking the value multiplicity "9" (see Supplement 131). ** ** Revision 1.26 2010-10-14 13:15:43 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.25 2010-04-23 15:26:13 joergr ** Specify an appropriate default value for the "vm" parameter of checkValue(). ** ** Revision 1.24 2010-04-23 14:25:27 joergr ** Added new method to all VR classes which checks whether the stored value ** conforms to the VR definition and to the specified VM. ** ** Revision 1.23 2009-11-04 09:58:08 uli ** Switched to logging mechanism provided by the "new" oflog module ** ** Revision 1.22 2008-07-17 11:19:49 onken ** Updated copyFrom() documentation. ** ** Revision 1.21 2008-07-17 10:30:24 onken ** Implemented copyFrom() method for complete DcmObject class hierarchy, which ** permits setting an instance's value from an existing object. Implemented ** assignment operator where necessary. ** ** Revision 1.20 2006-08-15 15:49:56 meichel ** Updated all code in module dcmdata to correctly compile when ** all standard C++ classes remain in namespace std. ** ** Revision 1.19 2005/12/08 16:29:15 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.18 2004/07/01 12:28:25 meichel ** Introduced virtual clone method for DcmObject and derived classes. ** ** Revision 1.17 2002/12/06 12:49:20 joergr ** Enhanced "print()" function by re-working the implementation and replacing ** the boolean "showFullData" parameter by a more general integer flag. ** Added doc++ documentation. ** Made source code formatting more consistent with other modules/files. ** ** Revision 1.16 2002/04/25 10:02:20 joergr ** Added getOFString() implementation. ** ** Revision 1.15 2001/09/25 17:19:36 meichel ** Adapted dcmdata to class OFCondition ** ** Revision 1.14 2001/06/01 15:48:54 meichel ** Updated copyright header ** ** Revision 1.13 2000/04/14 15:31:36 meichel ** Removed default value from output stream passed to print() method. ** Required for use in multi-thread environments. ** ** Revision 1.12 2000/03/08 16:26:27 meichel ** Updated copyright header. ** ** Revision 1.11 2000/03/03 14:05:29 meichel ** Implemented library support for redirecting error messages into memory ** instead of printing them to stdout/stderr for GUI applications. ** ** Revision 1.10 2000/02/10 10:50:56 joergr ** Added new feature to dcmdump (enhanced print method of dcmdata): write ** pixel data/item value fields to raw files. ** ** Revision 1.9 1999/03/31 09:25:11 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.8 1998/11/12 16:47:58 meichel ** Implemented operator= for all classes derived from DcmObject. ** ** Revision 1.7 1997/07/21 08:25:18 andreas ** - Replace all boolean types (BOOLEAN, CTNBOOLEAN, DICOM_BOOL, BOOL) ** with one unique boolean type OFBool. ** ** Revision 1.6 1997/04/18 08:13:34 andreas ** - The put/get-methods for all VRs did not conform to the C++-Standard ** draft. Some Compilers (e.g. SUN-C++ Compiler, Metroworks ** CodeWarrier, etc.) create many warnings concerning the hiding of ** overloaded get methods in all derived classes of DcmElement. ** So the interface of all value representation classes in the ** library are changed rapidly, e.g. ** OFCondition get(Uint16 & value, const unsigned long pos); ** becomes ** OFCondition getUint16(Uint16 & value, const unsigned long pos); ** All (retired) "returntype get(...)" methods are deleted. ** For more information see dcmdata/include/dcelem.h ** ** Revision 1.5 1996/08/05 08:45:41 andreas ** new print routine with additional parameters: ** - print into files ** - fix output length for elements ** corrected error in search routine with parameter ESM_fromStackTop ** ** Revision 1.4 1996/01/29 13:38:19 andreas ** - new put method for every VR to put value as a string ** - better and unique print methods ** ** Revision 1.3 1996/01/05 13:23:12 andreas ** - changed to support new streaming facilities ** - more cleanups ** - merged read / write methods for block and file transfer ** */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/dclist.h0000644000310500011400000001505211455601175021221 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Gerd Ehlers * * Purpose: generic list class * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:15:41 $ * CVS/RCS Revision: $Revision: 1.22 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DCLIST_H #define DCLIST_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/ofstd/ofcast.h" #include "dcmtk/ofstd/oftypes.h" #define INCLUDE_CSTDDEF #define INCLUDE_CSTDLIB #include "dcmtk/ofstd/ofstdinc.h" #include "dcmtk/dcmdata/dcobject.h" /// index indicating "end of list" const unsigned long DCM_EndOfListIndex = OFstatic_cast(unsigned long, -1L); /** helper class maintaining an entry in a DcmList double-linked list */ class DcmListNode { public: /** constructor * @param obj object to be maintained by this list node */ DcmListNode( DcmObject *obj ); /// destructor ~DcmListNode(); /// return pointer to object maintained by this list node inline DcmObject *value() { return objNodeValue; } private: friend class DcmList; /// pointer to next node in double-linked list DcmListNode *nextNode; /// pointer to previous node in double-linked list DcmListNode *prevNode; /// pointer to DcmObject instance maintained by this list entry DcmObject *objNodeValue; /// private undefined copy constructor DcmListNode(const DcmListNode &); /// private undefined copy assignment operator DcmListNode &operator=(const DcmListNode &); }; /// list position indicator typedef enum { /// at current position in list ELP_atpos, /// at list start ELP_first, /// at list end ELP_last, /// before current list position ELP_prev, /// after current list position ELP_next } E_ListPos; /** double-linked list class that maintains pointers to DcmObject instances. * The remove operation does not delete the object pointed to, however, * the destructor will delete all elements pointed to */ class DcmList { public: /// constructor DcmList(); /// destructor ~DcmList(); /** insert object at end of list * @param obj pointer to object * @return pointer to object */ DcmObject *append( DcmObject *obj ); /** insert object at start of list * @param obj pointer to object * @return pointer to object */ DcmObject *prepend( DcmObject *obj ); /** insert object relative to current position and indicator * @param obj pointer to object * @param pos position indicator * @return pointer to object */ DcmObject *insert( DcmObject *obj, E_ListPos pos = ELP_next ); /** remove current entry from list, return element * @return pointer to removed element, which is not deleted */ DcmObject *remove(); /** get pointer to element in list at given position * @param pos position indicator * @return pointer to object */ DcmObject *get( E_ListPos pos = ELP_atpos ); /** seek within element in list to given position * (i.e. set current element to given position) * @param pos position indicator * @return pointer to new current object */ DcmObject *seek( E_ListPos pos = ELP_next ); /** seek within element in list to given element index * (i.e. set current element to given index) * @param absolute_position position index < card() * @return pointer to new current object */ DcmObject *seek_to(unsigned long absolute_position); /** Remove and delete all elements from list. Thus, the * elements' memory is also freed by this operation. The list * is empty after calling this function. */ void deleteAllElements(); /// return cardinality of list inline unsigned long card() const { return cardinality; } /// return true if list is empty, false otherwise inline OFBool empty(void) const { return firstNode == NULL; } /// return true if current node exists, false otherwise inline OFBool valid(void) const { return currentNode != NULL; } private: /// pointer to first node in list DcmListNode *firstNode; /// pointer to last node in list DcmListNode *lastNode; /// pointer to current node in list DcmListNode *currentNode; /// number of elements in list unsigned long cardinality; /// private undefined copy constructor DcmList &operator=(const DcmList &); /// private undefined copy assignment operator DcmList(const DcmList &newList); }; #endif // DCLIST_H /* * CVS/RCS Log: * $Log: dclist.h,v $ * Revision 1.22 2010-10-14 13:15:41 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.21 2010-03-24 11:52:55 onken * Introduced new function to delete all elements (including memory de-allocation) * from DcmList. * * Revision 1.20 2010-03-01 09:08:44 uli * Removed some unnecessary include directives in the headers. * * Revision 1.19 2010-02-22 11:39:53 uli * Remove some unneeded includes. * * Revision 1.18 2009-11-04 09:58:07 uli * Switched to logging mechanism provided by the "new" oflog module * * Revision 1.17 2007-11-29 14:30:35 meichel * Updated doxygen API documentation * * Revision 1.16 2005/12/08 16:28:20 meichel * Changed include path schema for all DCMTK header files * * Revision 1.15 2003/08/08 13:32:45 joergr * Adapted type casts to new-style typecast operators defined in ofcast.h. * * Revision 1.14 2003/08/08 12:30:38 joergr * Made DcmListNode::value() inline. * Renamed member variable "actualNode" to "currentNode". * * Revision 1.13 2002/11/27 12:07:22 meichel * Adapted module dcmdata to use of new header file ofstdinc.h * * Revision 1.12 2001/06/01 15:48:41 meichel * Updated copyright header * * Revision 1.11 2000/03/08 16:26:15 meichel * Updated copyright header. * * Revision 1.10 2000/02/23 15:11:38 meichel * Corrected macro for Borland C++ Builder 4 workaround. * * Revision 1.9 2000/02/01 10:12:02 meichel * Avoiding to include as extern "C" on Borland C++ Builder 4, * workaround for bug in compiler header files. * * Revision 1.8 1999/03/31 09:24:41 meichel * Updated copyright header in module dcmdata * * */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/dcvris.h0000644000310500011400000002200711464747623021240 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Gerd Ehlers, Andreas Barth * * Purpose: Interface of class DcmIntegerString * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-11-05 09:34:11 $ * CVS/RCS Revision: $Revision: 1.25 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DCVRIS_H #define DCVRIS_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcbytstr.h" /** a class representing the DICOM value representation 'Integer String' (IS) */ class DcmIntegerString : public DcmByteString { public: /** constructor. * Create new element from given tag and length. * @param tag DICOM tag for the new element * @param len value length for the new element */ DcmIntegerString(const DcmTag &tag, const Uint32 len = 0); /** copy constructor * @param old element to be copied */ DcmIntegerString(const DcmIntegerString &old); /** destructor */ virtual ~DcmIntegerString(); /** assignment operator * @param obj element to be assigned/copied * @return reference to this object */ DcmIntegerString &operator=(const DcmIntegerString &obj); /** clone method * @return deep copy of this object */ virtual DcmObject *clone() const { return new DcmIntegerString(*this); } /** Virtual object copying. This method can be used for DcmObject * and derived classes to get a deep copy of an object. Internally * the assignment operator is called if the given DcmObject parameter * is of the same type as "this" object instance. If not, an error * is returned. This function permits copying an object by value * in a virtual way which therefore is different to just calling the * assignment operator of DcmElement which could result in slicing * the object. * @param rhs - [in] The instance to copy from. Has to be of the same * class type as "this" object * @return EC_Normal if copying was successful, error otherwise */ virtual OFCondition copyFrom(const DcmObject& rhs); /** get element type identifier * @return type identifier of this class (EVR_IS) */ virtual DcmEVR ident() const; /** check whether stored value conforms to the VR and to the specified VM * @param vm value multiplicity (according to the data dictionary) to be checked for. * (valid values: "1", "1-2", "1-3", "1-8", "1-99", "1-n", "2", "2-n", "2-2n", * "3", "3-n", "3-3n", "4", "6", "9", "16", "32") * @param oldFormat parameter not used for this VR (only for DA, TM, PN) * @return status of the check, EC_Normal if value is correct, an error code otherwise */ virtual OFCondition checkValue(const OFString &vm = "1-n", const OFBool oldFormat = OFFalse); /** get particular integer value * @param sintVal reference to result variable * @param pos index of the value to be retrieved (0..vm-1) * @return status status, EC_Normal if successful, an error code otherwise */ virtual OFCondition getSint32(Sint32 &sintVal, const unsigned long pos = 0); /** get a particular value as a character string * @param stringVal variable in which the result value is stored * @param pos index of the value in case of multi-valued elements (0..vm-1) * @param normalize delete leading and trailing spaces if OFTrue * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition getOFString(OFString &stringVal, const unsigned long pos, OFBool normalize = OFTrue); /* --- static helper functions --- */ /** check whether given string value conforms to the VR "IS" (Integer String) * and to the specified VM. * @param value string value to be checked (possibly multi-valued) * @param vm value multiplicity (according to the data dictionary) to be checked for. * (valid values: "1", "1-2", "1-3", "1-8", "1-99", "1-n", "2", "2-n", "2-2n", * "3", "3-n", "3-3n", "4", "6", "9", "16", "32") * @return status of the check, EC_Normal if value is correct, an error code otherwise */ static OFCondition checkStringValue(const OFString &value, const OFString &vm = "1-n"); }; #endif // DCVRIS_H /* ** CVS/RCS Log: ** $Log: dcvris.h,v $ ** Revision 1.25 2010-11-05 09:34:11 joergr ** Added support for checking the value multiplicity "9" (see Supplement 131). ** ** Revision 1.24 2010-10-14 13:15:43 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.23 2010-04-23 15:26:13 joergr ** Specify an appropriate default value for the "vm" parameter of checkValue(). ** ** Revision 1.22 2010-04-23 14:25:27 joergr ** Added new method to all VR classes which checks whether the stored value ** conforms to the VR definition and to the specified VM. ** ** Revision 1.21 2010-04-22 09:31:30 joergr ** Revised misleading parameter documentation for the checkValue() method. ** ** Revision 1.20 2010-04-22 08:59:10 joergr ** Added support for further VM values ("1-8", "1-99", "16", "32") to be checked. ** ** Revision 1.19 2010-03-01 09:08:45 uli ** Removed some unnecessary include directives in the headers. ** ** Revision 1.18 2009-08-03 09:05:30 joergr ** Added methods that check whether a given string value conforms to the VR and ** VM definitions of the DICOM standards. ** ** Revision 1.17 2008-07-17 11:19:49 onken ** Updated copyFrom() documentation. ** ** Revision 1.16 2008-07-17 10:30:23 onken ** Implemented copyFrom() method for complete DcmObject class hierarchy, which ** permits setting an instance's value from an existing object. Implemented ** assignment operator where necessary. ** ** Revision 1.15 2005-12-08 16:29:00 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.14 2004/07/01 12:28:25 meichel ** Introduced virtual clone method for DcmObject and derived classes. ** ** Revision 1.13 2002/12/06 12:49:16 joergr ** Enhanced "print()" function by re-working the implementation and replacing ** the boolean "showFullData" parameter by a more general integer flag. ** Added doc++ documentation. ** Made source code formatting more consistent with other modules/files. ** ** Revision 1.12 2002/04/25 09:54:28 joergr ** Removed getOFStringArray() implementation. ** ** Revision 1.11 2001/09/25 17:19:32 meichel ** Adapted dcmdata to class OFCondition ** ** Revision 1.10 2001/06/01 15:48:50 meichel ** Updated copyright header ** ** Revision 1.9 2000/03/08 16:26:24 meichel ** Updated copyright header. ** ** Revision 1.8 1999/03/31 09:25:01 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.7 1998/11/12 16:47:50 meichel ** Implemented operator= for all classes derived from DcmObject. ** ** Revision 1.6 1997/09/11 15:13:14 hewett ** Modified getOFString method arguments by removing a default value ** for the pos argument. By requiring the pos argument to be provided ** ensures that callers realise getOFString only gets one component of ** a multi-valued string. ** ** Revision 1.5 1997/08/29 08:32:42 andreas ** - Added methods getOFString and getOFStringArray for all ** string VRs. These methods are able to normalise the value, i. e. ** to remove leading and trailing spaces. This will be done only if ** it is described in the standard that these spaces are not relevant. ** These methods do not test the strings for conformance, this means ** especially that they do not delete spaces where they are not allowed! ** getOFStringArray returns the string with all its parts separated by \ ** and getOFString returns only one value of the string. ** CAUTION: Currently getString returns a string with trailing ** spaces removed (if dcmEnableAutomaticInputDataCorrection == OFTrue) and ** truncates the original string (since it is not copied!). If you rely on this ** behaviour please change your application now. ** Future changes will ensure that getString returns the original ** string from the DICOM object (NULL terminated) inclusive padding. ** Currently, if you call getOF... before calling getString without ** normalisation, you can get the original string read from the DICOM object. ** ** Revision 1.4 1997/05/12 07:37:45 andreas ** - new get-Methods for DcmDecimalString: getFloat64 and ** DcmIntegerString: getSint32 ** ** Revision 1.3 1996/01/05 13:23:06 andreas ** - changed to support new streaming facilities ** - more cleanups ** - merged read / write methods for block and file transfer ** */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/dcrleccd.h0000644000310500011400000002131111455601175021475 0ustar joergrdicom3/* * * Copyright (C) 2002-2010, 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: dcmdata * * Author: Marco Eichelberg * * Purpose: decoder codec class for RLE * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:15:41 $ * CVS/RCS Revision: $Revision: 1.8 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DCRLECCD_H #define DCRLECCD_H #include "dcmtk/config/osconfig.h" #include "dcmtk/dcmdata/dccodec.h" /* for class DcmCodec */ /** decoder class for RLE. * This class only supports decompression, it neither implements * encoding nor transcoding. */ class DcmRLECodecDecoder: public DcmCodec { public: /// default constructor DcmRLECodecDecoder(); /// destructor virtual ~DcmRLECodecDecoder(); /** decompresses the given pixel sequence and * stores the result in the given uncompressedPixelData element. * @param fromRepParam current representation parameter of compressed data, may be NULL * @param pixSeq compressed pixel sequence * @param uncompressedPixelData uncompressed pixel data stored in this element * @param cp codec parameters for this codec * @param objStack stack pointing to the location of the pixel data * element in the current dataset. * @return EC_Normal if successful, an error code otherwise. */ virtual OFCondition decode( const DcmRepresentationParameter * fromRepParam, DcmPixelSequence * pixSeq, DcmPolymorphOBOW& uncompressedPixelData, const DcmCodecParameter * cp, const DcmStack& objStack) const; /** decompresses a single frame from the given pixel sequence and * stores the result in the given buffer. * @param fromParam representation parameter of current compressed * representation, may be NULL. * @param fromPixSeq compressed pixel sequence * @param cp codec parameters for this codec * @param dataset pointer to dataset in which pixel data element is contained * @param frameNo number of frame, starting with 0 for the first frame * @param startFragment index of the compressed fragment that contains * all or the first part of the compressed bitstream for the given frameNo. * Upon successful return this parameter is updated to contain the index * of the first compressed fragment of the next frame. * When unknown, zero should be passed. In this case the decompression * algorithm will try to determine the index by itself, which will always * work if frames are decompressed in increasing order from first to last, * but may fail if frames are decompressed in random order, multiple fragments * per frame and multiple frames are present in the dataset, and the offset * table is empty. * @param buffer pointer to buffer where frame is to be stored * @param bufSize size of buffer in bytes * @param decompressedColorModel upon successful return, the color model * of the decompressed image (which may be different from the one used * in the compressed images) is returned in this parameter. * @return EC_Normal if successful, an error code otherwise. */ virtual OFCondition decodeFrame( const DcmRepresentationParameter * fromParam, DcmPixelSequence * fromPixSeq, const DcmCodecParameter * cp, DcmItem *dataset, Uint32 frameNo, Uint32& startFragment, void *buffer, Uint32 bufSize, OFString& decompressedColorModel) const; /** compresses the given uncompressed DICOM image and stores * the result in the given pixSeq element. * @param pixelData pointer to the uncompressed image data in OW format * and local byte order * @param length of the pixel data field in bytes * @param toRepParam representation parameter describing the desired * compressed representation (e.g. JPEG quality) * @param pixSeq compressed pixel sequence (pointer to new DcmPixelSequence object * allocated on heap) returned in this parameter upon success. * @param cp codec parameters for this codec * @param objStack stack pointing to the location of the pixel data * element in the current dataset. * @return EC_Normal if successful, an error code otherwise. */ virtual OFCondition encode( const Uint16 * pixelData, const Uint32 length, const DcmRepresentationParameter * toRepParam, DcmPixelSequence * & pixSeq, const DcmCodecParameter *cp, DcmStack & objStack) const; /** transcodes (re-compresses) the given compressed DICOM image and stores * the result in the given toPixSeq element. * @param fromRepType current transfer syntax of the compressed image * @param fromRepParam current representation parameter of compressed data, may be NULL * @param fromPixSeq compressed pixel sequence * @param toRepParam representation parameter describing the desired * new compressed representation (e.g. JPEG quality) * @param toPixSeq compressed pixel sequence (pointer to new DcmPixelSequence object * allocated on heap) returned in this parameter upon success. * @param cp codec parameters for this codec * @param objStack stack pointing to the location of the pixel data * element in the current dataset. * @return EC_Normal if successful, an error code otherwise. */ virtual OFCondition encode( const E_TransferSyntax fromRepType, const DcmRepresentationParameter * fromRepParam, DcmPixelSequence * fromPixSeq, const DcmRepresentationParameter * toRepParam, DcmPixelSequence * & toPixSeq, const DcmCodecParameter * cp, DcmStack & objStack) const; /** checks if this codec is able to convert from the * given current transfer syntax to the given new * transfer syntax * @param oldRepType current transfer syntax * @param newRepType desired new transfer syntax * @return true if transformation is supported by this codec, false otherwise. */ virtual OFBool canChangeCoding( const E_TransferSyntax oldRepType, const E_TransferSyntax newRepType) const; /** determine color model of the decompressed image * @param fromParam representation parameter of current compressed * representation, may be NULL * @param fromPixSeq compressed pixel sequence * @param cp codec parameters for this codec * @param dataset pointer to dataset in which pixel data element is contained * @param dataset pointer to DICOM dataset in which this pixel data object * is located. Used to access photometric interpretation. * @param decompressedColorModel upon successful return, the color model * of the decompressed image (which may be different from the one used * in the compressed images) is returned in this parameter * @return EC_Normal if successful, an error code otherwise */ virtual OFCondition determineDecompressedColorModel( const DcmRepresentationParameter *fromParam, DcmPixelSequence *fromPixSeq, const DcmCodecParameter *cp, DcmItem *dataset, OFString &decompressedColorModel) const; private: /// private undefined copy constructor DcmRLECodecDecoder(const DcmRLECodecDecoder&); /// private undefined copy assignment operator DcmRLECodecDecoder& operator=(const DcmRLECodecDecoder&); }; #endif /* * CVS/RCS Log * $Log: dcrleccd.h,v $ * Revision 1.8 2010-10-14 13:15:41 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.7 2010-03-01 09:08:44 uli * Removed some unnecessary include directives in the headers. * * Revision 1.6 2009-11-17 16:36:51 joergr * Added new method that allows for determining the color model of the * decompressed image. * * Revision 1.5 2009-11-04 09:58:07 uli * Switched to logging mechanism provided by the "new" oflog module * * Revision 1.4 2008-05-29 10:46:13 meichel * Implemented new method DcmPixelData::getUncompressedFrame * that permits frame-wise access to compressed and uncompressed * objects without ever loading the complete object into main memory. * For this new method to work with compressed images, all classes derived from * DcmCodec need to implement a new method decodeFrame(). For now, only * dummy implementations returning an error code have been defined. * * Revision 1.3 2005/12/08 16:28:33 meichel * Changed include path schema for all DCMTK header files * * Revision 1.2 2003/03/21 13:06:46 meichel * Minor code purifications for warnings reported by MSVC in Level 4 * * Revision 1.1 2002/06/06 14:52:34 meichel * Initial release of the new RLE codec classes * and the dcmcrle/dcmdrle tools in module dcmdata * * */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/dcfilefo.h0000644000310500011400000005731311457615000021512 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Gerd Ehlers, Andreas Barth * * Purpose: Interface of class DcmFileFormat * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-20 16:34:08 $ * CVS/RCS Revision: $Revision: 1.38 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DCFILEFO_H #define DCFILEFO_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcsequen.h" #include "dcmtk/dcmdata/dcdatset.h" // forward declarations class DcmMetaInfo; class DcmInputStream; class DcmOutputStream; class DcmRepresentationParameter; /** a class handling the DICOM file format (with meta header) */ class DcmFileFormat : public DcmSequenceOfItems { public: /** default constructor */ DcmFileFormat(); /** constructor * @param dataset to be copied (!) into the new DcmFileFormat object */ DcmFileFormat(DcmDataset *dataset); /** copy constructor * @param old element to be copied */ DcmFileFormat(const DcmFileFormat &old); /** destructor */ virtual ~DcmFileFormat(); /** assignment operator * @param obj fileformat to be assigned/copied * @return reference to this object */ DcmFileFormat &operator=(const DcmFileFormat &obj); /** clone method * @return deep copy of this object */ virtual DcmObject *clone() const { return new DcmFileFormat(*this); } /** Virtual object copying. This method can be used for DcmObject * and derived classes to get a deep copy of an object. Internally * the assignment operator is called if the given DcmObject parameter * is of the same type as "this" object instance. If not, an error * is returned. This function permits copying an object by value * in a virtual way which therefore is different to just calling the * assignment operator of DcmElement which could result in slicing * the object. * @param rhs - [in] The instance to copy from. Has to be of the same * class type as "this" object * @return EC_Normal if copying was successful, error otherwise */ virtual OFCondition copyFrom(const DcmObject& rhs); /** get type identifier * @return type identifier of this class (EVR_fileFormat) */ virtual DcmEVR ident() const; /** clear file meta information header and dataset * @return EC_Normal if successful, an error code otherwise */ virtual OFCondition clear(); /** remove all elements with an invalid group number from the meta information header * and dataset */ virtual void removeInvalidGroups(); /** print meta header and dataset to a stream * @param out output stream * @param flags optional flag used to customize the output (see DCMTypes::PF_xxx) * @param level current level of nested items. Used for indentation. * @param pixelFileName optional filename used to write the raw pixel data file * @param pixelCounter optional counter used for automatic pixel data filename creation */ virtual void print(STD_NAMESPACE ostream&out, const size_t flags = 0, const int level = 0, const char *pixelFileName = NULL, size_t *pixelCounter = NULL); /** make sure that all data elements of the file meta information header are existent * in metainfo and contain correct values. * @param oxfer the transfer syntax which shall be used * @param writeMode flag indicating whether to update the file meta information or not */ virtual OFCondition validateMetaInfo(const E_TransferSyntax oxfer, const E_FileWriteMode writeMode = EWM_fileformat); /** get file meta information header part of the fileformat * @return reference to internally stored file meta information header */ DcmMetaInfo *getMetaInfo(); /** get dataset part of the fileformat * @return reference to internally stored dataset */ DcmDataset *getDataset(); /** get dataset part and remove it from the fileformat. * Please note that a new, initially empty dataset is also added to the fileformat. * @return reference to previously stored but now removed dataset */ DcmDataset *getAndRemoveDataset(); /** calculate the length of this DICOM element when encoded with the * given transfer syntax and the given encoding type for sequences. * For elements, the length includes the length of the tag, length field, * VR field and the value itself, for items and sequences it returns * the length of the complete item or sequence including delimitation tags * if applicable. Never returns undefined length. * @param xfer transfer syntax for length calculation * @param enctype sequence encoding type for length calculation * @return length of DICOM element */ virtual Uint32 calcElementLength(const E_TransferSyntax xfer, const E_EncodingType enctype); /** check if this DICOM object can be encoded in the given transfer syntax. * @param newXfer transfer syntax in which the DICOM object is to be encoded * @param oldXfer transfer syntax in which the DICOM object was read or created. * @return true if object can be encoded in desired transfer syntax, false otherwise. */ virtual OFBool canWriteXfer(const E_TransferSyntax newXfer, const E_TransferSyntax oldXfer = EXS_Unknown); /** read object from a stream. * @param inStream DICOM input stream * @param xfer transfer syntax to use when parsing * @param glenc handling of group length parameters * @param maxReadLength attribute values larger than this value are skipped * while parsing and read later upon first access if the stream type supports * this. * @return EC_Normal if successful, an error code otherwise */ virtual OFCondition read(DcmInputStream &inStream, const E_TransferSyntax xfer = EXS_Unknown, const E_GrpLenEncoding glenc = EGL_noChange, const Uint32 maxReadLength = DCM_MaxReadLength); /** write fileformat to a stream * @param outStream DICOM output stream * @param oxfer output transfer syntax * @param enctype encoding types (undefined or explicit length) * @param wcache pointer to write cache object, may be NULL * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition write(DcmOutputStream &outStream, const E_TransferSyntax oxfer, const E_EncodingType enctype, DcmWriteCache *wcache); /** write object to a stream (abstract) * @param outStream DICOM output stream * @param oxfer output transfer syntax * @param enctype encoding types (undefined or explicit length) * @param wcache pointer to write cache object, may be NULL * @param glenc group length encoding * @param padenc dataset trailing padding encoding * @param padlen padding structure size for complete file * @param subPadlen padding structure set for sequence items * @param instanceLength number of extra bytes added to the item/dataset * length used when computing the padding. This parameter is for instance * used to pass the length of the file meta information header from the * DcmFileFormat to the DcmDataset object. * @param writeMode write file with or without meta header. Also allows for * updating the information in the file meta information header. * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition write(DcmOutputStream &outStream, const E_TransferSyntax oxfer, const E_EncodingType enctype, DcmWriteCache *wcache, const E_GrpLenEncoding glenc, const E_PaddingEncoding padenc = EPD_noChange, const Uint32 padlen = 0, const Uint32 subPadlen = 0, Uint32 instanceLength = 0, const E_FileWriteMode writeMode = EWM_fileformat); /** write object in XML format. * The XML declaration (e.g. ) is not written by this function. * @param out output stream to which the XML document is written * @param flags optional flag used to customize the output (see DCMTypes::XF_xxx) * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition writeXML(STD_NAMESPACE ostream&out, const size_t flags = 0); /** load object from a DICOM file. * This method supports DICOM objects stored as a file (with meta header) or as a * dataset (without meta header). By default, the presence of a meta header is * detected automatically. * @param fileName name of the file to load * @param readXfer transfer syntax used to read the data (auto detection if EXS_Unknown) * @param groupLength flag, specifying how to handle the group length tags * @param maxReadLength maximum number of bytes to be read for an element value. * Element values with a larger size are not loaded until their value is retrieved * (with getXXX()) or loadAllDataElements() is called. * @param readMode read file with or without meta header, i.e. as a fileformat or a * dataset. Use ERM_fileOnly in order to force the presence of a meta header. * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition loadFile(const char *fileName, const E_TransferSyntax readXfer = EXS_Unknown, const E_GrpLenEncoding groupLength = EGL_noChange, const Uint32 maxReadLength = DCM_MaxReadLength, const E_FileReadMode readMode = ERM_autoDetect); /** save object to a DICOM file. * @param fileName name of the file to save * @param writeXfer transfer syntax used to write the data (EXS_Unknown means use current) * @param encodingType flag, specifying the encoding with undefined or explicit length * @param groupLength flag, specifying how to handle the group length tags * @param padEncoding flag, specifying how to handle the padding tags * @param padLength number of bytes used for the dataset padding (has to be an even number) * @param subPadLength number of bytes used for the item padding (has to be an even number) * @param writeMode write file with or without meta header. Also allows for updating the * information in the file meta information header. * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition saveFile(const char *fileName, const E_TransferSyntax writeXfer = EXS_Unknown, const E_EncodingType encodingType = EET_UndefinedLength, const E_GrpLenEncoding groupLength = EGL_recalcGL, const E_PaddingEncoding padEncoding = EPD_noChange, const Uint32 padLength = 0, const Uint32 subPadLength = 0, const E_FileWriteMode writeMode = EWM_fileformat); // methods for different pixel representations /** select a specific representation (compressed or uncompressed) of the dataset * and create the representation if needed. This may cause compression or decompression * to be applied to the pixel data in the dataset. * @param repType desired transfer syntax * @param repParam desired representation parameter (e.g. quality factor for lossy compression) * @return EC_Normal upon success, an error code otherwise. */ OFCondition chooseRepresentation(const E_TransferSyntax repType, const DcmRepresentationParameter *repParam) { return getDataset()->chooseRepresentation(repType, repParam); } /** check if all PixelData elements in this dataset have a representation conforming * to the given transfer syntax and representation parameters (see dcpixel.h for * definition of "conforming"). * @param repType desired transfer syntax * @param repParam desired representation parameter (e.g. quality factor for lossy compression) * @return true if all pixel elements have the desired representation, false otherwise */ OFBool hasRepresentation(const E_TransferSyntax repType, const DcmRepresentationParameter *repParam) { return getDataset()->hasRepresentation(repType, repParam); } /** removes all but the original representation in all pixel data elements */ void removeAllButOriginalRepresentations() { getDataset()->removeAllButOriginalRepresentations(); } /** removes all but the current representation in all pixel data elements. * Makes the current representation original. */ void removeAllButCurrentRepresentations() { getDataset()->removeAllButCurrentRepresentations(); } /** get current file read mode. This mode specifies whether a file is read as a * fileformat or dataset (without meta header). In addition, the reading can be * restricted to DICOM files only. * @return file read mode */ E_FileReadMode getReadMode() const { return FileReadMode; } /** set current file read mode. This mode specifies whether a file is read as a * fileformat or dataset (without meta header). In addition, the reading can be * restricted to DICOM files only. * @param readMode file read mode to be set */ void setReadMode(const E_FileReadMode readMode) { FileReadMode = readMode; } /** method inherited from base class that shall not be used for instances of this class. * Method immediately returns with error code. * @param item item * @param where where * @return always returns EC_IllegalCall. */ virtual OFCondition insertItem(DcmItem *item, const unsigned long where = DCM_EndOfListIndex); /** method inherited from base class that shall not be used for instances of this class. * Method immediately returns. * @param num num * @return always returns NULL. */ virtual DcmItem *remove(const unsigned long num); /** method inherited from base class that shall not be used for instances of this class. * Method immediately returns. * @param item item * @return always returns NULL. */ virtual DcmItem *remove(DcmItem *item); private: /** This function checks if a particular data element of the file meta information header is * existent. If the element is not existent, it will be inserted. Additionally, this function * makes sure that the corresponding data element will contain a correct value. * @param metainfo the meta header information * @param dataset the data set information * @param atagkey tag of the data element which shall be checked * @param obj data object from metainfo which represents the data element that shall be checked. * Equals NULL if this data element is not existent in the meta header information. * @param oxfer The transfer syntax which shall be used. * @param writeMode flag indicating whether to update the file meta information or not * @return EC_Normal if successful, an error code otherwise */ static OFCondition checkMetaHeaderValue(DcmMetaInfo *metainfo, DcmDataset *dataset, const DcmTagKey &atagkey, DcmObject *obj, const E_TransferSyntax oxfer, const E_FileWriteMode writeMode); /** read DCM_TransferSyntaxUID from meta header dataset and return as E_TransferSyntax value * @param metainfo meta-header dataset * @return E_TransferSyntax value for DCM_TransferSyntaxUID, EXS_Unknown if not found or unknown */ static E_TransferSyntax lookForXfer(DcmMetaInfo *metainfo); /// file read mode, specifies whether to read the meta header or not E_FileReadMode FileReadMode; }; #endif // DCFILEFO_H /* ** CVS/RCS Log: ** $Log: dcfilefo.h,v $ ** Revision 1.38 2010-10-20 16:34:08 joergr ** Renamed method to avoid warnings reported by gcc with additional flags. ** ** Revision 1.37 2010-10-20 16:31:25 joergr ** Added missing API documentation. ** ** Revision 1.36 2010-10-14 13:15:41 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.35 2010-10-08 08:37:01 joergr ** Enhanced documentation on pixel-related parameters. ** ** Revision 1.34 2010-03-01 09:08:44 uli ** Removed some unnecessary include directives in the headers. ** ** Revision 1.33 2010-02-22 11:39:53 uli ** Remove some unneeded includes. ** ** Revision 1.32 2009-08-25 13:00:23 joergr ** Added new methods which remove all data elements with an invalid group number ** from the meta information header, dataset and/or fileformat. ** Fixed wrong comment on clear() method. ** ** Revision 1.31 2009-08-21 09:18:07 joergr ** Added parameter 'writeMode' to save/write methods which allows for specifying ** whether to write a dataset or fileformat as well as whether to update the ** file meta information or to create a new file meta information header. ** ** Revision 1.30 2008-07-17 11:19:48 onken ** Updated copyFrom() documentation. ** ** Revision 1.29 2008-07-17 10:30:23 onken ** Implemented copyFrom() method for complete DcmObject class hierarchy, which ** permits setting an instance's value from an existing object. Implemented ** assignment operator where necessary. ** ** Revision 1.28 2008-06-23 12:09:13 joergr ** Fixed inconsistencies in Doxygen API documentation. ** ** Revision 1.27 2007/11/29 14:30:19 meichel ** Write methods now handle large raw data elements (such as pixel data) ** without loading everything into memory. This allows very large images to ** be sent over a network connection, or to be copied without ever being ** fully in memory. ** ** Revision 1.26 2006/08/15 15:49:56 meichel ** Updated all code in module dcmdata to correctly compile when ** all standard C++ classes remain in namespace std. ** ** Revision 1.25 2005/12/08 16:28:13 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.24 2005/12/02 08:48:17 joergr ** Added new file read mode that makes it possible to distinguish between DICOM ** files, datasets and other non-DICOM files. For this reason, the last ** parameter of method loadFile() changed from OFBool to E_FileReadMode. ** ** Revision 1.23 2004/07/01 12:28:25 meichel ** Introduced virtual clone method for DcmObject and derived classes. ** ** Revision 1.22 2002/12/06 12:49:10 joergr ** Enhanced "print()" function by re-working the implementation and replacing ** the boolean "showFullData" parameter by a more general integer flag. ** Added doc++ documentation. ** Made source code formatting more consistent with other modules/files. ** ** Revision 1.21 2002/08/27 16:55:32 meichel ** Initial release of new DICOM I/O stream classes that add support for stream ** compression (deflated little endian explicit VR transfer syntax) ** ** Revision 1.20 2002/08/20 12:18:35 meichel ** Changed parameter list of loadFile and saveFile methods in class ** DcmFileFormat. Removed loadFile and saveFile from class DcmObject. ** ** Revision 1.19 2002/04/25 09:39:47 joergr ** Added support for XML output of DICOM objects. ** ** Revision 1.18 2002/04/11 12:22:51 joergr ** Added new methods for loading and saving DICOM files. ** ** Revision 1.17 2001/09/25 17:19:26 meichel ** Adapted dcmdata to class OFCondition ** ** Revision 1.16 2001/06/01 15:48:40 meichel ** Updated copyright header ** ** Revision 1.15 2000/04/14 15:31:32 meichel ** Removed default value from output stream passed to print() method. ** Required for use in multi-thread environments. ** ** Revision 1.14 2000/03/08 16:26:14 meichel ** Updated copyright header. ** ** Revision 1.13 2000/03/03 14:05:23 meichel ** Implemented library support for redirecting error messages into memory ** instead of printing them to stdout/stderr for GUI applications. ** ** Revision 1.12 2000/02/10 10:50:51 joergr ** Added new feature to dcmdump (enhanced print method of dcmdata): write ** pixel data/item value fields to raw files. ** ** Revision 1.11 1999/03/31 09:24:38 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.10 1998/11/12 16:47:39 meichel ** Implemented operator= for all classes derived from DcmObject. ** ** Revision 1.9 1997/07/21 08:14:39 andreas ** - New environment for encapsulated pixel representations. DcmPixelData ** can contain different representations and uses codecs to convert ** between them. Codecs are derived from the DcmCodec class. New error ** codes are introduced for handling of representations. New internal ** value representation (only for ident()) for PixelData ** - Replace all boolean types (BOOLEAN, CTNBOOLEAN, DICOM_BOOL, BOOL) ** with one unique boolean type OFBool. ** ** Revision 1.8 1997/05/27 13:48:27 andreas ** - Add method canWriteXfer to class DcmObject and all derived classes. ** This method checks whether it is possible to convert the original ** transfer syntax to an new transfer syntax. The check is used in the ** dcmconv utility to prohibit the change of a compressed transfer ** syntax to a uncompressed. ** ** Revision 1.7 1997/05/16 08:23:47 andreas ** - Revised handling of GroupLength elements and support of ** DataSetTrailingPadding elements. The enumeratio E_GrpLenEncoding ** got additional enumeration values (for a description see dctypes.h). ** addGroupLength and removeGroupLength methods are replaced by ** computeGroupLengthAndPadding. To support Padding, the parameters of ** element and sequence write functions changed. ** - Added a new method calcElementLength to calculate the length of an ** element, item or sequence. For elements it returns the length of ** tag, length field, vr field, and value length, for item and ** sequences it returns the length of the whole item. sequence including ** the Delimitation tag (if appropriate). It can never return ** UndefinedLength. ** ** Revision 1.6 1996/08/05 08:45:21 andreas ** new print routine with additional parameters: ** - print into files ** - fix output length for elements ** corrected error in search routine with parameter ESM_fromStackTop ** ** Revision 1.5 1996/07/29 15:46:23 andreas ** Add method getAndRemoveDataset to remove connection of dataset from fileformat ** ** Revision 1.4 1996/01/09 11:06:15 andreas ** New Support for Visual C++ ** Correct problems with inconsistent const declarations ** ** Revision 1.3 1996/01/05 13:22:55 andreas ** - changed to support new streaming facilities ** - more cleanups ** - merged read / write methods for block and file transfer ** */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/dcerror.h0000644000310500011400000002306611455601175021403 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Andrew Hewett * * Purpose: Error handling, codes and strings * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:15:41 $ * CVS/RCS Revision: $Revision: 1.36 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DCERROR_H #define DCERROR_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/ofstd/ofcond.h" /* for OFCondition */ /* * DCMTK module numbers for modules which create their own error codes. * Module numbers > 1023 are reserved for user code. */ const unsigned short OFM_dcmdata = 1; const unsigned short OFM_ctndisp = 2; /* retired */ const unsigned short OFM_dcmimgle = 3; const unsigned short OFM_dcmimage = 4; const unsigned short OFM_dcmjpeg = 5; const unsigned short OFM_dcmnet = 6; const unsigned short OFM_dcmprint = 7; const unsigned short OFM_dcmpstat = 8; const unsigned short OFM_dcmsign = 9; const unsigned short OFM_dcmsr = 10; const unsigned short OFM_dcmtls = 11; const unsigned short OFM_imagectn = 12; const unsigned short OFM_wlistctn = 13; /* retired */ const unsigned short OFM_dcmwlm = 14; const unsigned short OFM_dcmpps = 15; const unsigned short OFM_dcmdbsup = 16; const unsigned short OFM_dcmppswm = 17; const unsigned short OFM_dcmjp2k = 18; const unsigned short OFM_dcmjpls = 19; const unsigned short OFM_dcmwave = 20; const unsigned short OFM_dcmrt = 21; const unsigned short OFM_dcmloco = 22; const unsigned short OFM_dcmstcom = 23; const unsigned short OFM_dcmppscu = 24; // condition constants /// invalid tag extern const OFCondition EC_InvalidTag; /// tag not found extern const OFCondition EC_TagNotFound; /// invalid VR extern const OFCondition EC_InvalidVR; /// invalid stream extern const OFCondition EC_InvalidStream; /// end of stream extern const OFCondition EC_EndOfStream; /// corrupted data extern const OFCondition EC_CorruptedData; /// illegal call, perhaps wrong parameters extern const OFCondition EC_IllegalCall; /// sequence end extern const OFCondition EC_SequEnd; /// doubled tag extern const OFCondition EC_DoubledTag; /// I/O suspension or premature end of stream extern const OFCondition EC_StreamNotifyClient; /// stream mode (R/W, random/sequence) is wrong extern const OFCondition EC_WrongStreamMode; /// item end extern const OFCondition EC_ItemEnd; /// compressed/uncompressed pixel representation not found extern const OFCondition EC_RepresentationNotFound; /// Pixel representation cannot be changed to requested transfer syntax extern const OFCondition EC_CannotChangeRepresentation; /// Unsupported compression or encryption extern const OFCondition EC_UnsupportedEncoding; /// Parser failure: Putback operation failed extern const OFCondition EC_PutbackFailed; /// Too many compression filters extern const OFCondition EC_DoubleCompressionFilters; /// Storage media application profile violated extern const OFCondition EC_ApplicationProfileViolated; /// Invalid offset extern const OFCondition EC_InvalidOffset; /// Too many bytes requested extern const OFCondition EC_TooManyBytesRequested; // Invalid basic offset table extern const OFCondition EC_InvalidBasicOffsetTable; /// Element length is larger than (explicit) length of surrounding item extern const OFCondition EC_ElemLengthLargerThanItem; /// File meta information header missing extern const OFCondition EC_FileMetaInfoHeaderMissing; /// Item or sequence content larger than explicit 32-bit length field permits extern const OFCondition EC_SeqOrItemContentOverflow; /// Value Representation (VR) violated extern const OFCondition EC_ValueRepresentationViolated; /// Value Multiplicity (VM) violated extern const OFCondition EC_ValueMultiplicityViolated; /// Maximum VR length violated extern const OFCondition EC_MaximumLengthViolated; /// Element length is larger than 16-bit length field permits extern const OFCondition EC_ElemLengthExceeds16BitField; #ifndef OFCONDITION_STRICT_MODE // for backward compatibility with existing software typedef OFCondition E_Condition; /** Return a pointer to a char array describing the error condition. * For backward compatibility with old software; deprecated. */ extern const char *dcmErrorConditionToString(OFCondition cond); #endif #endif /* !DCERROR_H */ /* ** CVS/RCS Log: ** $Log: dcerror.h,v $ ** Revision 1.36 2010-10-14 13:15:41 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.35 2010-07-30 16:52:51 onken ** Added error code for new (non-public) module dcmppscu. ** ** Revision 1.34 2010-06-09 15:53:34 joergr ** Added number for new module "dcmstcom", used for module-specific error codes. ** ** Revision 1.33 2010-02-25 13:50:50 joergr ** Fixed issue with element values which exceed the maximum of a 16-bit length ** field. ** ** Revision 1.32 2009-08-03 09:05:29 joergr ** Added methods that check whether a given string value conforms to the VR and ** VM definitions of the DICOM standards. ** ** Revision 1.31 2009-07-29 14:16:15 meichel ** Defined new constant OFM_dcmloco ** ** Revision 1.30 2009-03-19 11:46:20 joergr ** Fixed issue with Doxygen documentation. ** ** Revision 1.29 2009-03-05 13:35:47 onken ** Added checks for sequence and item lengths which prevents overflow in length ** field, if total length of contained items (or sequences) exceeds ** 32-bit length field. Also introduced new flag (default: enabled) ** for writing in explicit length mode, which allows for automatically ** switching encoding of only that very sequence/item to undefined ** length coding (thus permitting to actually write the file). ** ** Revision 1.28 2009-02-11 16:36:04 joergr ** Introduced new error code EC_FileMetaInfoHeaderMissing. ** ** Revision 1.27 2009-02-04 17:54:30 joergr ** Fixed various layout and formatting issues. ** ** Revision 1.26 2009-02-04 14:06:03 onken ** Changed parser to make use of the new error ignoring flag when parsing. ** Added check (makes use of new flag) that notes whether an element's value is ** specified larger than the surrounding item (applicable for explicit length ** coding). ** ** Revision 1.25 2009-02-04 10:17:23 joergr ** Introduced new error code EC_InvalidBasicOffsetTable. ** ** Revision 1.24 2008-12-08 14:34:54 joergr ** Added number for new module "dcmrt", used for module-specific error codes. ** ** Revision 1.23 2008-07-17 10:28:36 onken ** Added error constant for upcoming dcmwave module. ** ** Revision 1.22 2007-11-29 14:30:35 meichel ** Updated doxygen API documentation ** ** Revision 1.21 2007/06/13 14:45:47 meichel ** Added module code OFM_dcmjpls and some new error codes. ** ** Revision 1.20 2005/12/08 16:28:12 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.19 2004/08/24 14:53:15 meichel ** Added module number for future dcmjp2k module ** ** Revision 1.18 2002/12/06 12:18:27 joergr ** Added new error status "EC_ApplicationProfileViolated". ** ** Revision 1.17 2002/08/27 16:55:32 meichel ** Initial release of new DICOM I/O stream classes that add support for stream ** compression (deflated little endian explicit VR transfer syntax) ** ** Revision 1.16 2002/08/12 09:56:59 wilkens ** Added module number (for error codes) for new module dcmppswm. ** ** Revision 1.15 2002/05/28 08:44:21 wilkens ** Added module number for new module dcmdbsup. ** ** Revision 1.14 2002/04/18 14:47:22 wilkens ** Inserted a new dcmtk module number for module mpps. ** ** Revision 1.13 2002/01/08 17:53:30 joergr ** Added new module "dcmwlm". ** ** Revision 1.12 2001/11/19 12:44:50 joergr ** Added dcmimage to list of modules. ** ** Revision 1.11 2001/10/12 10:42:28 meichel ** Introduced conditional define OFCONDITION_STRICT_MODE in which the ** compatibility options related to the transition to OFCondition are disabled: ** No OFCondition default constructor, no typedefs for E_Condition, CONDITION, ** no macros for SUCCESS and condition aliases. ** ** Revision 1.10 2001/09/25 17:22:22 meichel ** Enabled E_Condition and dcmErrorConditionToString() for backward ** compatibility with existing code. ** ** Revision 1.9 2001/09/25 17:19:26 meichel ** Adapted dcmdata to class OFCondition ** ** Revision 1.8 2001/06/01 15:48:39 meichel ** Updated copyright header ** ** Revision 1.7 2000/03/08 16:26:14 meichel ** Updated copyright header. ** ** Revision 1.6 1999/03/31 09:24:38 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.5 1997/07/21 08:15:10 andreas ** - New environment for encapsulated pixel representations. DcmPixelData ** can contain different representations and uses codecs to convert ** between them. Codecs are derived from the DcmCodec class. New error ** codes are introduced for handling of representations. New internal ** value representation (only for ident()) for PixelData ** ** Revision 1.4 1997/05/22 16:55:02 andreas ** - Added new error code EC_NotImplemented ** ** Revision 1.3 1996/01/29 13:38:12 andreas ** - new put method for every VR to put value as a string ** - better and unique print methods ** ** Revision 1.2 1996/01/05 13:22:55 andreas ** - changed to support new streaming facilities ** - more cleanups ** - merged read / write methods for block and file transfer ** ** Revision 1.1 1995/11/23 16:37:54 hewett ** Updated for loadable data dictionary + some cleanup (more to do). ** */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/dcvrda.h0000644000310500011400000003122111464747623021207 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Gerd Ehlers, Andreas Barth, Joerg Riesmeier * * Purpose: Interface of class DcmDate * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-11-05 09:34:11 $ * CVS/RCS Revision: $Revision: 1.23 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DCVRDA_H #define DCVRDA_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcbytstr.h" #include "dcmtk/ofstd/ofdate.h" /** a class representing the DICOM value representation 'Date' (DA) */ class DcmDate : public DcmByteString { public: /** constructor. * Create new element from given tag and length. * @param tag DICOM tag for the new element * @param len value length for the new element */ DcmDate(const DcmTag &tag, const Uint32 len = 0); /** copy constructor * @param old element to be copied */ DcmDate(const DcmDate &old); /** destructor */ virtual ~DcmDate(); /** assignment operator * @param obj element to be assigned/copied * @return reference to this object */ DcmDate &operator=(const DcmDate &obj); /** clone method * @return deep copy of this object */ virtual DcmObject *clone() const { return new DcmDate(*this); } /** Virtual object copying. This method can be used for DcmObject * and derived classes to get a deep copy of an object. Internally * the assignment operator is called if the given DcmObject parameter * is of the same type as "this" object instance. If not, an error * is returned. This function permits copying an object by value * in a virtual way which therefore is different to just calling the * assignment operator of DcmElement which could result in slicing * the object. * @param rhs - [in] The instance to copy from. Has to be of the same * class type as "this" object * @return EC_Normal if copying was successful, error otherwise */ virtual OFCondition copyFrom(const DcmObject& rhs); /** get element type identifier * @return type identifier of this class (EVR_DA) */ virtual DcmEVR ident() const; /** check whether stored value conforms to the VR and to the specified VM * @param vm value multiplicity (according to the data dictionary) to be checked for. * (valid values: "1", "1-2", "1-3", "1-8", "1-99", "1-n", "2", "2-n", "2-2n", * "3", "3-n", "3-3n", "4", "6", "9", "16", "32") * @param oldFormat support old ACR/NEMA format if OFTrue ('.' as a separator) * @return status of the check, EC_Normal if value is correct, an error code otherwise */ virtual OFCondition checkValue(const OFString &vm = "1-n", const OFBool oldFormat = OFFalse); /** get a copy of a particular string component * @param stringVal variable in which the result value is stored * @param pos index of the value in case of multi-valued elements (0..vm-1) * @param normalize delete trailing spaces if OFTrue * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition getOFString(OFString &stringVal, const unsigned long pos, OFBool normalize = OFTrue); /** set the element value to the current system date. * The DICOM DA format supported by this function is "YYYYMMDD". If the current * system date is unavailable the date is set to "19000101" and an error code is * returned. * @return EC_Normal upon success, an error code otherwise */ OFCondition setCurrentDate(); /** set the element value to the given date * @param dateValue date to be set (should be a valid date) * @return EC_Normal upon success, an error code otherwise */ OFCondition setOFDate(const OFDate &dateValue); /** get the current element value in OFDate format. * Please note that the element value is expected to be in valid DICOM DA format * ("YYYYMMDD", "YYYY.MM.DD" is also supported for reasons of backward compatibility). * If this function fails the result variable 'dateValue' is cleared automatically. * @param dateValue reference to OFDate variable where the result is stored * @param pos index of the element component in case of value multiplicity (0..vm-1) * @param supportOldFormat if OFTrue support old (prior V3.0) date format (see above) * @return EC_Normal upon success, an error code otherwise */ OFCondition getOFDate(OFDate &dateValue, const unsigned long pos = 0, const OFBool supportOldFormat = OFTrue); /** get the current element value in ISO date format. * The ISO date format supported by this function is "YYYY-MM-DD". Please note * that the element value is expected to be in valid DICOM DA format ("YYYYMMDD", * "YYYY.MM.DD" is also supported for reasons of backward compatibility). * If this function fails the result variable 'formattedDate' is cleared automatically. * @param formattedDate reference to string variable where the result is stored * @param pos index of the element component in case of value multiplicity (0..vm-1) * @param supportOldFormat if OFTrue support old (prior V3.0) date format (see above) * @return EC_Normal upon success, an error code otherwise */ OFCondition getISOFormattedDate(OFString &formattedDate, const unsigned long pos = 0, const OFBool supportOldFormat = OFTrue); /* --- static helper functions --- */ /** get the current system date. * The DICOM DA format supported by this function is "YYYYMMDD". If the current * system date is unavailable the date is set to "19000101" and an error code is * returned. * @param dicomDate reference to string variable where the result is stored * @return EC_Normal upon success, an error code otherwise */ static OFCondition getCurrentDate(OFString &dicomDate); /** get the specified OFDate value in DICOM format. * The DICOM DA format supported by this function is "YYYYMMDD". If the specified * date is invalid the date is set to "19000101" and an error code is returned. * @param dateValue date to be converted to DICOM format * @param dicomDate reference to string variable where the result is stored * @return EC_Normal upon success, an error code otherwise */ static OFCondition getDicomDateFromOFDate(const OFDate &dateValue, OFString &dicomDate); /** get the specified DICOM date value in OFDate format. * Please note that the specified value is expected to be in valid DICOM DA format * ("YYYYMMDD", "YYYY.MM.DD" is also supported for reasons of backward compatibility). * If this function fails the result variable 'dateValue' is cleared automatically. * @param dicomDate string value in DICOM DA format to be converted to ISO format * @param dateValue reference to OFDate variable where the result is stored * @param supportOldFormat if OFTrue support old (prior V3.0) date format (see above) * @return EC_Normal upon success, an error code otherwise */ static OFCondition getOFDateFromString(const OFString &dicomDate, OFDate &dateValue, const OFBool supportOldFormat = OFTrue); /** get the specified DICOM date value in ISO format. * The ISO date format supported by this function is "YYYY-MM-DD". Please note * that the specified value is expected to be in valid DICOM DA format ("YYYYMMDD", * "YYYY.MM.DD" is also supported for reasons of backward compatibility). * If this function fails the result variable 'formattedDate' is cleared automatically. * @param dicomDate string value in DICOM DA format to be converted to ISO format * @param formattedDate reference to string variable where the result is stored * @param supportOldFormat if OFTrue support old (prior V3.0) date format (see above) * @return EC_Normal upon success, an error code otherwise */ static OFCondition getISOFormattedDateFromString(const OFString &dicomDate, OFString &formattedDate, const OFBool supportOldFormat = OFTrue); /** check whether given string value conforms to the VR "DA" (Date) * and to the specified VM. * @param value string value to be checked (possibly multi-valued) * @param vm value multiplicity (according to the data dictionary) to be checked for. * (valid values: "1", "1-2", "1-3", "1-8", "1-99", "1-n", "2", "2-n", "2-2n", * "3", "3-n", "3-3n", "4", "6", "9", "16", "32") * @param oldFormat support old ACR/NEMA date format if OFTrue (i.e. with "." delimiters) * @return status of the check, EC_Normal if value is correct, an error code otherwise */ static OFCondition checkStringValue(const OFString &value, const OFString &vm = "1-n", const OFBool oldFormat = OFFalse); }; #endif // DCVRDA_H /* ** CVS/RCS Log: ** $Log: dcvrda.h,v $ ** Revision 1.23 2010-11-05 09:34:11 joergr ** Added support for checking the value multiplicity "9" (see Supplement 131). ** ** Revision 1.22 2010-10-14 13:15:42 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.21 2010-04-23 15:26:13 joergr ** Specify an appropriate default value for the "vm" parameter of checkValue(). ** ** Revision 1.20 2010-04-23 14:25:27 joergr ** Added new method to all VR classes which checks whether the stored value ** conforms to the VR definition and to the specified VM. ** ** Revision 1.19 2010-04-22 09:31:30 joergr ** Revised misleading parameter documentation for the checkValue() method. ** ** Revision 1.18 2010-04-22 08:59:10 joergr ** Added support for further VM values ("1-8", "1-99", "16", "32") to be checked. ** ** Revision 1.17 2010-03-01 09:08:45 uli ** Removed some unnecessary include directives in the headers. ** ** Revision 1.16 2009-08-03 09:05:30 joergr ** Added methods that check whether a given string value conforms to the VR and ** VM definitions of the DICOM standards. ** ** Revision 1.15 2008-07-17 11:19:49 onken ** Updated copyFrom() documentation. ** ** Revision 1.14 2008-07-17 10:30:23 onken ** Implemented copyFrom() method for complete DcmObject class hierarchy, which ** permits setting an instance's value from an existing object. Implemented ** assignment operator where necessary. ** ** Revision 1.13 2005-12-08 16:28:55 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.12 2004/07/01 12:28:25 meichel ** Introduced virtual clone method for DcmObject and derived classes. ** ** Revision 1.11 2002/12/06 12:49:14 joergr ** Enhanced "print()" function by re-working the implementation and replacing ** the boolean "showFullData" parameter by a more general integer flag. ** Added doc++ documentation. ** Made source code formatting more consistent with other modules/files. ** ** Revision 1.10 2002/04/11 12:25:09 joergr ** Enhanced DICOM date, time and date/time classes. Added support for new ** standard date and time functions. ** ** Revision 1.9 2001/10/10 15:16:40 joergr ** Added new flag to date/time routines allowing to choose whether the old ** prior V3.0 format for the corresponding DICOM VRs is supported or not. ** ** Revision 1.8 2001/10/01 15:01:38 joergr ** Introduced new general purpose functions to get/set person names, date, time ** and date/time. ** ** Revision 1.7 2001/06/01 15:48:49 meichel ** Updated copyright header ** ** Revision 1.6 2000/03/08 16:26:22 meichel ** Updated copyright header. ** ** Revision 1.5 1999/03/31 09:24:58 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.4 1998/11/12 16:47:47 meichel ** Implemented operator= for all classes derived from DcmObject. ** ** Revision 1.3 1996/01/05 13:23:04 andreas ** - changed to support new streaming facilities ** - more cleanups ** - merged read / write methods for block and file transfer ** */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/dcchrstr.h0000644000310500011400000001234011455601174021547 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Andreas Barth * * Purpose: Interface of class DcmCharString * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:15:40 $ * CVS/RCS Revision: $Revision: 1.16 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DCCHRSTR_H #define DCCHRSTR_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ // // This implementation does not support 16 bit character sets. Since 8 bit // character sets are supported by the class DcmByteString the class // DcmCharString is derived from DcmByteString without any extensions. // // If the extension for 16 bit character sets will be implemented this class // must be derived directly from DcmElement. This class is designed to support // the value representations (LO, LT, PN, SH, ST, UT). They are a problem because // their value width (1, 2, .. Bytes) is specified by the element // SpecificCharacterSet (0008, 0005) and an implementation must support // different value widths that cannot be derived from the value representation. // #include "dcmtk/dcmdata/dcbytstr.h" /** base class for DICOM elements with value representation LO, LT, PN, SH, ST, UT */ class DcmCharString : public DcmByteString { public: /** constructor. * Create new element from given tag and length. * @param tag DICOM tag for the new element * @param len value length for the new element */ DcmCharString(const DcmTag &tag, const Uint32 len); /** copy constructor * @param old element to be copied */ DcmCharString(const DcmCharString &old); /** destructor */ virtual ~DcmCharString(); /** assignment operator * @param obj element to be assigned/copied * @return reference to this object */ DcmCharString &operator=(const DcmCharString &obj); /** clone method * @return deep copy of this object */ virtual DcmObject *clone() const { return new DcmCharString(*this); } /** Virtual object copying. This method can be used for DcmObject * and derived classes to get a deep copy of an object. Internally * the assignment operator is called if the given DcmObject parameter * is of the same type as "this" object instance. If not, an error * is returned. This function permits copying an object by value * in a virtual way which therefore is different to just calling the * assignment operator of DcmElement which could result in slicing * the object. * @param rhs - [in] The instance to copy from. Has to be of the same * class type as "this" object * @return EC_Normal if copying was successful, error otherwise */ virtual OFCondition copyFrom(const DcmObject& rhs); /** check if this element contains non-ASCII characters * @param checkAllStrings not used in this class * @return true if element contains non-ASCII characters, false otherwise */ virtual OFBool containsExtendedCharacters(const OFBool checkAllStrings = OFFalse); /** check if this element is affected by SpecificCharacterSet * @return always returns true */ virtual OFBool isAffectedBySpecificCharacterSet() const; }; #endif // DCCHRSTR_H /* * CVS/RCS Log: * $Log: dcchrstr.h,v $ * Revision 1.16 2010-10-14 13:15:40 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.15 2008-07-17 11:19:48 onken * Updated copyFrom() documentation. * * Revision 1.14 2008-07-17 10:30:22 onken * Implemented copyFrom() method for complete DcmObject class hierarchy, which * permits setting an instance's value from an existing object. Implemented * assignment operator where necessary. * * Revision 1.13 2006-12-15 14:18:07 joergr * Added new method that checks whether a DICOM object or element is affected * by SpecificCharacterSet (0008,0005). * * Revision 1.12 2006/12/13 13:58:15 joergr * Added new optional parameter "checkAllStrings" to method containsExtended * Characters(). * * Revision 1.11 2006/05/11 08:52:09 joergr * Moved checkForNonASCIICharacters() from application to library. * * Revision 1.10 2005/12/08 16:28:00 meichel * Changed include path schema for all DCMTK header files * * Revision 1.9 2004/07/01 12:28:25 meichel * Introduced virtual clone method for DcmObject and derived classes. * * Revision 1.8 2002/12/06 12:49:08 joergr * Enhanced "print()" function by re-working the implementation and replacing * the boolean "showFullData" parameter by a more general integer flag. * Added doc++ documentation. * Made source code formatting more consistent with other modules/files. * * Revision 1.7 2001/06/01 15:48:33 meichel * Updated copyright header * * Revision 1.6 2000/03/08 16:26:11 meichel * Updated copyright header. * * Revision 1.5 1999/03/31 09:24:30 meichel * Updated copyright header in module dcmdata * * */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/dcrlecce.h0000644000310500011400000002200611455601175021500 0ustar joergrdicom3/* * * Copyright (C) 2002-2010, 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: dcmdata * * Author: Marco Eichelberg * * Purpose: encoder codec class for RLE * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:15:41 $ * CVS/RCS Revision: $Revision: 1.7 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DCRLECCE_H #define DCRLECCE_H #include "dcmtk/config/osconfig.h" #include "dcmtk/dcmdata/dccodec.h" /* for class DcmCodec */ class DcmItem; /** encoder class for RLE. * This class only supports compression, it neither implements * decoding nor transcoding. */ class DcmRLECodecEncoder: public DcmCodec { public: /// default constructor DcmRLECodecEncoder(); /// destructor virtual ~DcmRLECodecEncoder(); /** decompresses the given pixel sequence and * stores the result in the given uncompressedPixelData element. * @param fromRepParam current representation parameter of compressed data, may be NULL * @param pixSeq compressed pixel sequence * @param uncompressedPixelData uncompressed pixel data stored in this element * @param cp codec parameters for this codec * @param objStack stack pointing to the location of the pixel data * element in the current dataset. * @return EC_Normal if successful, an error code otherwise. */ virtual OFCondition decode( const DcmRepresentationParameter * fromRepParam, DcmPixelSequence * pixSeq, DcmPolymorphOBOW& uncompressedPixelData, const DcmCodecParameter * cp, const DcmStack& objStack) const; /** decompresses a single frame from the given pixel sequence and * stores the result in the given buffer. * @param fromParam representation parameter of current compressed * representation, may be NULL. * @param fromPixSeq compressed pixel sequence * @param cp codec parameters for this codec * @param dataset pointer to dataset in which pixel data element is contained * @param frameNo number of frame, starting with 0 for the first frame * @param startFragment index of the compressed fragment that contains * all or the first part of the compressed bitstream for the given frameNo. * Upon successful return this parameter is updated to contain the index * of the first compressed fragment of the next frame. * When unknown, zero should be passed. In this case the decompression * algorithm will try to determine the index by itself, which will always * work if frames are decompressed in increasing order from first to last, * but may fail if frames are decompressed in random order, multiple fragments * per frame and multiple frames are present in the dataset, and the offset * table is empty. * @param buffer pointer to buffer where frame is to be stored * @param bufSize size of buffer in bytes * @param decompressedColorModel upon successful return, the color model * of the decompressed image (which may be different from the one used * in the compressed images) is returned in this parameter. * @return EC_Normal if successful, an error code otherwise. */ virtual OFCondition decodeFrame( const DcmRepresentationParameter * fromParam, DcmPixelSequence * fromPixSeq, const DcmCodecParameter * cp, DcmItem *dataset, Uint32 frameNo, Uint32& startFragment, void *buffer, Uint32 bufSize, OFString& decompressedColorModel) const; /** compresses the given uncompressed DICOM image and stores * the result in the given pixSeq element. * @param pixelData pointer to the uncompressed image data in OW format * and local byte order * @param length of the pixel data field in bytes * @param toRepParam representation parameter describing the desired * compressed representation (e.g. JPEG quality) * @param pixSeq compressed pixel sequence (pointer to new DcmPixelSequence object * allocated on heap) returned in this parameter upon success. * @param cp codec parameters for this codec * @param objStack stack pointing to the location of the pixel data * element in the current dataset. * @return EC_Normal if successful, an error code otherwise. */ virtual OFCondition encode( const Uint16 * pixelData, const Uint32 length, const DcmRepresentationParameter * toRepParam, DcmPixelSequence * & pixSeq, const DcmCodecParameter *cp, DcmStack & objStack) const; /** transcodes (re-compresses) the given compressed DICOM image and stores * the result in the given toPixSeq element. * @param fromRepType current transfer syntax of the compressed image * @param fromRepParam current representation parameter of compressed data, may be NULL * @param fromPixSeq compressed pixel sequence * @param toRepParam representation parameter describing the desired * new compressed representation (e.g. JPEG quality) * @param toPixSeq compressed pixel sequence (pointer to new DcmPixelSequence object * allocated on heap) returned in this parameter upon success. * @param cp codec parameters for this codec * @param objStack stack pointing to the location of the pixel data * element in the current dataset. * @return EC_Normal if successful, an error code otherwise. */ virtual OFCondition encode( const E_TransferSyntax fromRepType, const DcmRepresentationParameter * fromRepParam, DcmPixelSequence * fromPixSeq, const DcmRepresentationParameter * toRepParam, DcmPixelSequence * & toPixSeq, const DcmCodecParameter * cp, DcmStack & objStack) const; /** checks if this codec is able to convert from the * given current transfer syntax to the given new * transfer syntax * @param oldRepType current transfer syntax * @param newRepType desired new transfer syntax * @return true if transformation is supported by this codec, false otherwise. */ virtual OFBool canChangeCoding( const E_TransferSyntax oldRepType, const E_TransferSyntax newRepType) const; /** determine color model of the decompressed image * @param fromParam representation parameter of current compressed * representation, may be NULL * @param fromPixSeq compressed pixel sequence * @param cp codec parameters for this codec * @param dataset pointer to dataset in which pixel data element is contained * @param dataset pointer to DICOM dataset in which this pixel data object * is located. Used to access photometric interpretation. * @param decompressedColorModel upon successful return, the color model * of the decompressed image (which may be different from the one used * in the compressed images) is returned in this parameter * @return EC_Normal if successful, an error code otherwise */ virtual OFCondition determineDecompressedColorModel( const DcmRepresentationParameter *fromParam, DcmPixelSequence *fromPixSeq, const DcmCodecParameter *cp, DcmItem *dataset, OFString &decompressedColorModel) const; private: /// private undefined copy constructor DcmRLECodecEncoder(const DcmRLECodecEncoder&); /// private undefined copy assignment operator DcmRLECodecEncoder& operator=(const DcmRLECodecEncoder&); /** create Derivation Description. * @param dataset dataset to be modified * @param ratio image compression ratio. This is the real effective ratio * between compressed and uncompressed image, i. e. 2.5 means a 2.5:1 compression. * @return EC_Normal if successful, an error code otherwise */ static OFCondition updateDerivationDescription( DcmItem *dataset, double ratio); }; #endif /* * CVS/RCS Log * $Log: dcrlecce.h,v $ * Revision 1.7 2010-10-14 13:15:41 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.6 2009-11-17 16:36:51 joergr * Added new method that allows for determining the color model of the * decompressed image. * * Revision 1.5 2009-11-04 09:58:07 uli * Switched to logging mechanism provided by the "new" oflog module * * Revision 1.4 2008-05-29 10:46:13 meichel * Implemented new method DcmPixelData::getUncompressedFrame * that permits frame-wise access to compressed and uncompressed * objects without ever loading the complete object into main memory. * For this new method to work with compressed images, all classes derived from * DcmCodec need to implement a new method decodeFrame(). For now, only * dummy implementations returning an error code have been defined. * * Revision 1.3 2005/12/08 16:28:34 meichel * Changed include path schema for all DCMTK header files * * Revision 1.2 2003/03/21 13:06:46 meichel * Minor code purifications for warnings reported by MSVC in Level 4 * * Revision 1.1 2002/06/06 14:52:35 meichel * Initial release of the new RLE codec classes * and the dcmcrle/dcmdrle tools in module dcmdata * * */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/dcvrdt.h0000644000310500011400000005441511464747623021244 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Gerd Ehlers, Joerg Riesmeier * * Purpose: Interface of class DcmDateTime * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-11-05 09:34:11 $ * CVS/RCS Revision: $Revision: 1.29 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DCVRDT_H #define DCVRDT_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcbytstr.h" #include "dcmtk/ofstd/ofdatime.h" /** a class representing the DICOM value representation 'Date Time' (DT) */ class DcmDateTime : public DcmByteString { public: /** constructor. * Create new element from given tag and length. * @param tag DICOM tag for the new element * @param len value length for the new element */ DcmDateTime(const DcmTag &tag, const Uint32 len = 0); /** copy constructor * @param old element to be copied */ DcmDateTime(const DcmDateTime &old); /** destructor */ virtual ~DcmDateTime(); /** assignment operator * @param obj element to be assigned/copied * @return reference to this object */ DcmDateTime &operator=(const DcmDateTime &obj); /** clone method * @return deep copy of this object */ virtual DcmObject *clone() const { return new DcmDateTime(*this); } /** Virtual object copying. This method can be used for DcmObject * and derived classes to get a deep copy of an object. Internally * the assignment operator is called if the given DcmObject parameter * is of the same type as "this" object instance. If not, an error * is returned. This function permits copying an object by value * in a virtual way which therefore is different to just calling the * assignment operator of DcmElement which could result in slicing * the object. * @param rhs - [in] The instance to copy from. Has to be of the same * class type as "this" object * @return EC_Normal if copying was successful, error otherwise */ virtual OFCondition copyFrom(const DcmObject& rhs); /** get element type identifier * @return type identifier of this class (EVR_DT) */ virtual DcmEVR ident() const; /** check whether stored value conforms to the VR and to the specified VM * @param vm value multiplicity (according to the data dictionary) to be checked for. * (valid values: "1", "1-2", "1-3", "1-8", "1-99", "1-n", "2", "2-n", "2-2n", * "3", "3-n", "3-3n", "4", "6", "9", "16", "32") * @param oldFormat parameter not used for this VR (only for DA, TM, PN) * @return status of the check, EC_Normal if value is correct, an error code otherwise */ virtual OFCondition checkValue(const OFString &vm = "1-n", const OFBool oldFormat = OFFalse); /** get a copy of a particular string component * @param stringValue variable in which the result value is stored * @param pos index of the value in case of multi-valued elements (0..vm-1) * @param normalize delete trailing spaces if OFTrue * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition getOFString(OFString &stringValue, const unsigned long pos, OFBool normalize = OFTrue); /** set the element value to the current system date and time. * The DICOM DT format supported by this function is "YYYYMMDDHHMM[SS[.FFFFFF]][&ZZZZ]" * where the brackets enclose optional parts. If the current system date/time or parts * of it are unavailable the corresponding values are set to "0" and an error code is * returned - in fact, the date is set to "19000101" if unavailable. * @param seconds add optional seconds ("SS") if OFTrue * @param fraction add optional fractional part of a second (".FFFFFF") if OFTrue * (requires parameter 'seconds' to be also OFTrue) * @param timeZone add optional time zone ("&ZZZZ" where "&" is "+" or "-") if OFTrue. * The time zone is given as the offset (hours and minutes) from Coordinated Universal * Time (UTC). * @return EC_Normal upon success, an error code otherwise */ OFCondition setCurrentDateTime(const OFBool seconds = OFTrue, const OFBool fraction = OFFalse, const OFBool timeZone = OFFalse); /** set the element value to the given date and time * @param dateTimeValue date to be set (should be a valid date and time) * @return EC_Normal upon success, an error code otherwise */ OFCondition setOFDateTime(const OFDateTime &dateTimeValue); /** get the current element value in OFDateTime format. * Please note that the element value is expected to be in valid DICOM DT format * ("YYYYMMDD[HH[MM[SS[.FFFFFF]]]][&ZZZZ]"). If the optional time zone ("&ZZZZ") is * missing the local time zone is used. * If this function fails the result variable 'dateTimeValue' is cleared automatically. * @param dateTimeValue reference to OFDateTime variable where the result is stored * @param pos index of the element component in case of value multiplicity (0..vm-1) * @return EC_Normal upon success, an error code otherwise */ OFCondition getOFDateTime(OFDateTime &dateTimeValue, const unsigned long pos = 0); /** get the current element value in ISO date/time format. * The ISO date/time format supported by this function is "YYYY-MM-DD HH:MM[:SS[.FFFFFF]] * [&HH:MM]" where the brackets enclose optional parts. Please note that the element value * is expected to be in valid DICOM DT format ("YYYYMMDD[HH[MM[SS[.FFFFFF]]]][&ZZZZ]"). If * this function fails the result variable 'formattedDateTime' is cleared automatically. * @param formattedDateTime reference to string variable where the result is stored * @param pos index of the element component in case of value multiplicity (0..vm-1) * @param seconds add optional seconds (":SS") if OFTrue * @param fraction add optional fractional part of a second (".FFFFFF") if OFTrue * (requires parameter 'seconds' to be also OFTrue) * @param timeZone add optional time zone ("&HH:MM" where "&" is "+" or "-") if OFTrue. * The time zone is given as the offset (hours and minutes) from Coordinated Universal * Time (UTC). Please note that the formatted time output is not adapted to the local * time if the time zone is omitted. * @param createMissingPart if OFTrue create optional parts (seconds, fractional part of * a seconds and/or time zone) if absent in the element value * @return EC_Normal upon success, an error code otherwise */ OFCondition getISOFormattedDateTime(OFString &formattedDateTime, const unsigned long pos = 0, const OFBool seconds = OFTrue, const OFBool fraction = OFFalse, const OFBool timeZone = OFTrue, const OFBool createMissingPart = OFFalse); /** get the current element value in ISO date/time format. * Same as above but allows to specify the separator between date and time value. * Only required since Sun CC 2.0.1 compiler does not support default parameter values for * "complex types" like OFString. Reports the error message: "Sorry not implemented" :-/ * @param formattedDateTime reference to string variable where the result is stored * @param pos index of the element component in case of value multiplicity (0..vm-1) * @param seconds add optional seconds (":SS") if OFTrue * @param fraction add optional fractional part of a second (".FFFFFF") if OFTrue * (requires parameter 'seconds' to be also OFTrue) * @param timeZone add optional time zone ("&HH:MM" where "&" is "+" or "-") if OFTrue. * The time zone is given as the offset (hours and minutes) from Coordinated Universal * Time (UTC). Please note that the formatted time output is not adapted to the local * time if the time zone is omitted. * @param createMissingPart if OFTrue create optional parts (seconds, fractional part of * a seconds and/or time zone) if absent in the element value * @param dateTimeSeparator separator between ISO date and time value (default: " ") * @return EC_Normal upon success, an error code otherwise */ OFCondition getISOFormattedDateTime(OFString &formattedDateTime, const unsigned long pos /*= 0*/, const OFBool seconds /*= OFTrue*/, const OFBool fraction /*= OFFalse*/, const OFBool timeZone /*= OFTrue*/, const OFBool createMissingPart /*= OFFalse*/, const OFString &dateTimeSeparator /*= " "*/); /* --- static helper functions --- */ /** get the current system date and time. * The DICOM DT format supported by this function is "YYYYMMDDHHMM[SS[.FFFFFF]][&ZZZZ]" * where the brackets enclose optional parts. If the current system date/time or parts * of it are unavailable the corresponding values are set to "0" and an error code is * returned - in fact, the date is set to "19000101" if unavailable. * @param dicomDateTime reference to string variable where the result is stored * @param seconds add optional seconds ("SS") if OFTrue * @param fraction add optional fractional part of a second (".FFFFFF") if OFTrue * (requires parameter 'seconds' to be also OFTrue) * @param timeZone add optional time zone ("&ZZZZ" where "&" is "+" or "-") if OFTrue. * The time zone is given as the offset (hours and minutes) from Coordinated Universal * Time (UTC). * @return EC_Normal upon success, an error code otherwise */ static OFCondition getCurrentDateTime(OFString &dicomDateTime, const OFBool seconds = OFTrue, const OFBool fraction = OFFalse, const OFBool timeZone = OFFalse); /** get the specified OFDateTime value in DICOM format. * The DICOM DT format supported by this function is "YYYYMMDDHHMM[SS[.FFFFFF]][&ZZZZ]" * where the brackets enclose optional parts. If the current system date/time or parts * of it are unavailable the corresponding values are set to "0" and an error code is * returned - in fact, the date is set to "19000101" if unavailable. * @param dateTimeValue date and time to be converted to DICOM format * @param dicomDateTime reference to string variable where the result is stored * @param seconds add optional seconds ("SS") if OFTrue * @param fraction add optional fractional part of a second (".FFFFFF") if OFTrue * (requires parameter 'seconds' to be also OFTrue) * @param timeZone add optional time zone ("&ZZZZ" where "&" is "+" or "-") if OFTrue. * The time zone is given as the offset (hours and minutes) from Coordinated Universal * Time (UTC). * @return EC_Normal upon success, an error code otherwise */ static OFCondition getDicomDateTimeFromOFDateTime(const OFDateTime &dateTimeValue, OFString &dicomDateTime, const OFBool seconds = OFTrue, const OFBool fraction = OFFalse, const OFBool timeZone = OFFalse); /** get the specified DICOM date and time value in OFDateTime format. * Please note that the element value is expected to be in valid DICOM DT format * ("YYYYMMDD[HH[MM[SS[.FFFFFF]]]][&ZZZZ]"). If the optional time zone ("&ZZZZ") is * missing the local time zone is used. * If this function fails the result variable 'dateTimeValue' is cleared automatically. * @param dicomDateTime string value in DICOM DT format to be converted to ISO format * @param dateTimeValue reference to OFDateTime variable where the result is stored * @return EC_Normal upon success, an error code otherwise */ static OFCondition getOFDateTimeFromString(const OFString &dicomDateTime, OFDateTime &dateTimeValue); /** get the specified DICOM datetime value in ISO format. * The ISO date/time format supported by this function is "YYYY-MM-DD HH:MM[:SS[.FFFFFF]] * [&HH:MM]" where the brackets enclose optional parts. Please note that the specified * value is expected to be in valid DICOM DT format ("YYYYMMDD[HH[MM[SS[.FFFFFF]]]][&ZZZZ]"). * If this function fails the result variable 'formattedDateTime' is cleared automatically. * @param dicomDateTime string value in DICOM DT format to be converted to ISO format * @param formattedDateTime reference to string variable where the result is stored * @param seconds add optional seconds (":SS") if OFTrue * @param fraction add optional fractional part of a second (".FFFFFF") if OFTrue * (requires parameter 'seconds' to be also OFTrue) * @param timeZone add optional time zone ("&HH:MM" where "&" is "+" or "-") if OFTrue. * The time zone is given as the offset (hours and minutes) from the Coordinated Universal * Time (UTC). Please note that the formatted time output is not adapted to the local time * if the time zone is omitted. * @param createMissingPart if OFTrue create optional parts (seconds, fractional part of * a seconds and/or time zone) if absent in the element value * @return EC_Normal upon success, an error code otherwise */ static OFCondition getISOFormattedDateTimeFromString(const OFString &dicomDateTime, OFString &formattedDateTime, const OFBool seconds = OFTrue, const OFBool fraction = OFFalse, const OFBool timeZone = OFTrue, const OFBool createMissingPart = OFFalse); /** get the specified DICOM datetime value in ISO format. * Same as above but allows to specify the separator between date and time value. * Only required since Sun CC 2.0.1 compiler does not support default parameter values for * "complex types" like OFString. Reports the error message: "Sorry not implemented" :-/ * @param dicomDateTime string value in DICOM DT format to be converted to ISO format * @param formattedDateTime reference to string variable where the result is stored * @param seconds add optional seconds (":SS") if OFTrue * @param fraction add optional fractional part of a second (".FFFFFF") if OFTrue * (requires parameter 'seconds' to be also OFTrue) * @param timeZone add optional time zone ("&HH:MM" where "&" is "+" or "-") if OFTrue. * The time zone is given as the offset (hours and minutes) from the Coordinated Universal * Time (UTC). Please note that the formatted time output is not adapted to the local time * if the time zone is omitted. * @param createMissingPart if OFTrue create optional parts (seconds, fractional part of * a seconds and/or time zone) if absent in the element value * @param dateTimeSeparator separator between ISO date and time value (default: " ") * @return EC_Normal upon success, an error code otherwise */ static OFCondition getISOFormattedDateTimeFromString(const OFString &dicomDateTime, OFString &formattedDateTime, const OFBool seconds /*= OFTrue*/, const OFBool fraction /*= OFFalse*/, const OFBool timeZone /*= OFTrue*/, const OFBool createMissingPart /*= OFFalse*/, const OFString &dateTimeSeparator /*= " "*/); /** check whether given string value conforms to the VR "DT" (Date Time) * and to the specified VM. * @param value string value to be checked (possibly multi-valued) * @param vm value multiplicity (according to the data dictionary) to be checked for. * (valid values: "1", "1-2", "1-3", "1-8", "1-99", "1-n", "2", "2-n", "2-2n", * "3", "3-n", "3-3n", "4", "6", "9", "16", "32") * @return status of the check, EC_Normal if value is correct, an error code otherwise */ static OFCondition checkStringValue(const OFString &value, const OFString &vm = "1-n"); }; #endif // DCVRDT_H /* ** CVS/RCS Log: ** $Log: dcvrdt.h,v $ ** Revision 1.29 2010-11-05 09:34:11 joergr ** Added support for checking the value multiplicity "9" (see Supplement 131). ** ** Revision 1.28 2010-10-14 13:15:42 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.27 2010-04-23 15:26:13 joergr ** Specify an appropriate default value for the "vm" parameter of checkValue(). ** ** Revision 1.26 2010-04-23 14:25:27 joergr ** Added new method to all VR classes which checks whether the stored value ** conforms to the VR definition and to the specified VM. ** ** Revision 1.25 2010-04-22 09:31:30 joergr ** Revised misleading parameter documentation for the checkValue() method. ** ** Revision 1.24 2010-04-22 08:59:10 joergr ** Added support for further VM values ("1-8", "1-99", "16", "32") to be checked. ** ** Revision 1.23 2010-03-01 09:08:45 uli ** Removed some unnecessary include directives in the headers. ** ** Revision 1.22 2009-08-03 09:05:30 joergr ** Added methods that check whether a given string value conforms to the VR and ** VM definitions of the DICOM standards. ** ** Revision 1.21 2008-07-17 11:19:49 onken ** Updated copyFrom() documentation. ** ** Revision 1.20 2008-07-17 10:30:23 onken ** Implemented copyFrom() method for complete DcmObject class hierarchy, which ** permits setting an instance's value from an existing object. Implemented ** assignment operator where necessary. ** ** Revision 1.19 2005-12-08 16:28:57 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.18 2004/07/01 12:28:25 meichel ** Introduced virtual clone method for DcmObject and derived classes. ** ** Revision 1.17 2004/04/16 12:49:25 joergr ** Restructured code to avoid default parameter values for "complex types" like ** OFString. Required for Sun CC 2.0.1. ** ** Revision 1.16 2004/01/16 14:04:11 joergr ** Introduced new parameter "dateTimeSeparator" in getISOFormattedXXX() methods ** to support ISO 8601 format as required by XML Schema type "dateTime". ** ** Revision 1.15 2002/12/06 12:49:15 joergr ** Enhanced "print()" function by re-working the implementation and replacing ** the boolean "showFullData" parameter by a more general integer flag. ** Added doc++ documentation. ** Made source code formatting more consistent with other modules/files. ** ** Revision 1.14 2002/04/25 09:51:08 joergr ** Removed getOFStringArray() implementation. ** ** Revision 1.13 2002/04/11 12:25:09 joergr ** Enhanced DICOM date, time and date/time classes. Added support for new ** standard date and time functions. ** ** Revision 1.12 2001/10/10 15:17:37 joergr ** Updated comments. ** ** Revision 1.11 2001/10/01 15:01:39 joergr ** Introduced new general purpose functions to get/set person names, date, time ** and date/time. ** ** Revision 1.10 2001/09/25 17:19:31 meichel ** Adapted dcmdata to class OFCondition ** ** Revision 1.9 2001/06/01 15:48:49 meichel ** Updated copyright header ** ** Revision 1.8 2000/03/08 16:26:23 meichel ** Updated copyright header. ** ** Revision 1.7 1999/03/31 09:24:59 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.6 1998/11/12 16:47:48 meichel ** Implemented operator= for all classes derived from DcmObject. ** ** Revision 1.5 1997/09/11 15:13:14 hewett ** Modified getOFString method arguments by removing a default value ** for the pos argument. By requiring the pos argument to be provided ** ensures that callers realise getOFString only gets one component of ** a multi-valued string. ** ** Revision 1.4 1997/08/29 08:32:41 andreas ** - Added methods getOFString and getOFStringArray for all ** string VRs. These methods are able to normalise the value, i. e. ** to remove leading and trailing spaces. This will be done only if ** it is described in the standard that these spaces are not relevant. ** These methods do not test the strings for conformance, this means ** especially that they do not delete spaces where they are not allowed! ** getOFStringArray returns the string with all its parts separated by \ ** and getOFString returns only one value of the string. ** CAUTION: Currently getString returns a string with trailing ** spaces removed (if dcmEnableAutomaticInputDataCorrection == OFTrue) and ** truncates the original string (since it is not copied!). If you rely on this ** behaviour please change your application now. ** Future changes will ensure that getString returns the original ** string from the DICOM object (NULL terminated) inclusive padding. ** Currently, if you call getOF... before calling getString without ** normalisation, you can get the original string read from the DICOM object. ** ** Revision 1.3 1996/01/05 13:23:05 andreas ** - changed to support new streaming facilities ** - more cleanups ** - merged read / write methods for block and file transfer ** */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/dcitem.h0000644000310500011400000023300711464027272021206 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Gerd Ehlers * * Purpose: Interface of class DcmItem * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-11-02 15:31:06 $ * CVS/RCS Revision: $Revision: 1.83 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DCITEM_H #define DCITEM_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/ofstd/offile.h" /* for offile_off_t */ #include "dcmtk/dcmdata/dctypes.h" #include "dcmtk/dcmdata/dcobject.h" #include "dcmtk/dcmdata/dclist.h" #include "dcmtk/dcmdata/dcpcache.h" // forward declaration class DcmSequenceOfItems; class DcmElement; /** a class representing a list of DICOM elements in which each * element has a different tag and elements are maintained in * increasing order of tags. In particular, a sequence item. */ class DcmItem : public DcmObject { public: /** default constructor */ DcmItem(); /** constructor. * Create new item from given tag and length. * @param tag DICOM tag for the new element * @param len value length for the new element */ DcmItem(const DcmTag &tag, const Uint32 len = 0); /** copy constructor * @param old item to be copied */ DcmItem(const DcmItem &old); /** assignment operator. Private creator cache is not copied * as it is also the case for clone(). * @param the item to be copied */ DcmItem &operator=(const DcmItem &obj); /** destructor */ virtual ~DcmItem(); /** clone method * @return deep copy of this object */ virtual DcmObject *clone() const { return new DcmItem(*this); } /** Virtual object copying. This method can be used for DcmObject * and derived classes to get a deep copy of an object. Internally * the assignment operator is called if the given DcmObject parameter * is of the same type as "this" object instance. If not, an error * is returned. This function permits copying an object by value * in a virtual way which therefore is different to just calling the * assignment operator of DcmElement which could result in slicing * the object. * @param rhs - [in] The instance to copy from. Has to be of the same * class type as "this" object * @return EC_Normal if copying was successful, error otherwise */ virtual OFCondition copyFrom(const DcmObject& rhs); /** get type identifier * @return type identifier of this class (EVR_item) */ virtual DcmEVR ident() const; /** get value multiplicity * @return always returns 1 (according to the DICOM standard) */ virtual unsigned long getVM(); /** get cardinality of this item * @return number of elements in this item */ virtual unsigned long card() const; /** check if this element is a leaf node in a dataset tree. * All subclasses of DcmElement except for DcmSequenceOfItems * are leaf nodes, while DcmSequenceOfItems, DcmItem, DcmDataset etc. * are not. * @return true if leaf node, false otherwise. */ virtual OFBool isLeaf() const { return OFFalse; } /** print all elements of the item to a stream * @param out output stream * @param flags optional flag used to customize the output (see DCMTypes::PF_xxx) * @param level current level of nested items. Used for indentation. * @param pixelFileName not used * @param pixelCounter not used */ virtual void print(STD_NAMESPACE ostream&out, const size_t flags = 0, const int level = 0, const char *pixelFileName = NULL, size_t *pixelCounter = NULL); /** calculate the length of this DICOM element when encoded with the * given transfer syntax and the given encoding type for sequences. * For elements, the length includes the length of the tag, length field, * VR field and the value itself, for items and sequences it returns * the length of the complete item or sequence including delimitation tags * if applicable. * If length encodig is set to be explicit and the total item size is * larger than the available 32-bit length field, then undefined length * is returned. If "dcmWriteOversizedSeqsAndItemsImplicit" is disabled, * also the internal DcmObject errorFlag is set to EC_SeqOrItemContentOverflow * in case the item content (excluding tag header etc.) is already too * large. * @param xfer transfer syntax for length calculation * @param enctype sequence encoding type for length calculation * @return length of DICOM element */ virtual Uint32 calcElementLength(const E_TransferSyntax xfer, const E_EncodingType enctype); /** calculate the value length (without attribute tag, VR and length field) * of this DICOM element when encoded with the given transfer syntax and * the given encoding type for sequences. * If length encodig is set to be explicit and the item content is larger * than the available 32-bit length field, then undefined length is * returned. If "dcmWriteOversizedSeqsAndItemsUndefined" is disabled, * also the internal DcmObject errorFlag is set to * EC_SeqOrItemContentOverflow. * @param xfer transfer syntax for length calculation * @param enctype sequence encoding type for length calculation * @return value length of DICOM element */ virtual Uint32 getLength(const E_TransferSyntax xfer = EXS_LittleEndianImplicit, const E_EncodingType enctype = EET_UndefinedLength); /** initialize the transfer state of this object. This method must be called * before this object is written to a stream or read (parsed) from a stream. */ virtual void transferInit(); /** finalize the transfer state of this object. This method must be called * when reading/writing this object from/to a stream has been completed. */ virtual void transferEnd(); /** check if this DICOM object can be encoded in the given transfer syntax. * @param newXfer transfer syntax in which the DICOM object is to be encoded * @param oldXfer transfer syntax in which the DICOM object was read or created. * @return true if object can be encoded in desired transfer syntax, false otherwise. */ virtual OFBool canWriteXfer(const E_TransferSyntax newXfer, const E_TransferSyntax oldXfer); /** This function reads the information of all attributes which * are captured in the input stream and captures this information * in elementList. Each attribute is represented as an element * in this list. If not all information for an attribute could be * read from the stream, the function returns EC_StreamNotifyClient. * @param inStream The stream which contains the information. * @param ixfer The transfer syntax which was used to encode * the information in inStream. * @param glenc Encoding type for group length; specifies * what will be done with group length tags. * @param maxReadLength Maximum read length for reading an attribute value. * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition read(DcmInputStream &inStream, const E_TransferSyntax ixfer, const E_GrpLenEncoding glenc = EGL_noChange, const Uint32 maxReadLength = DCM_MaxReadLength); /** write object to a stream * @param outStream DICOM output stream * @param oxfer output transfer syntax * @param enctype encoding types (undefined or explicit length) * @param wcache pointer to write cache object, may be NULL * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition write( DcmOutputStream &outStream, const E_TransferSyntax oxfer, const E_EncodingType enctype, DcmWriteCache *wcache); /** write object in XML format * @param out output stream to which the XML document is written * @param flags optional flag used to customize the output (see DCMTypes::XF_xxx) * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition writeXML(STD_NAMESPACE ostream&out, const size_t flags = 0); /** special write method for creation of digital signatures * @param outStream DICOM output stream * @param oxfer output transfer syntax * @param enctype encoding types (undefined or explicit length) * @param wcache pointer to write cache object, may be NULL * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition writeSignatureFormat( DcmOutputStream &outStream, const E_TransferSyntax oxfer, const E_EncodingType enctype, DcmWriteCache *wcache); /** returns true if the object contains an element with Unknown VR at any nesting level * @return true if the object contains an element with Unknown VR, false otherwise */ virtual OFBool containsUnknownVR() const; /** check if this object contains non-ASCII characters at any nesting level * @param checkAllStrings if true, also check elements with string values not affected * by SpecificCharacterSet (0008,0005), default: only check PN, LO, LT, SH, ST, UT * @return true if object contains non-ASCII characters, false otherwise */ virtual OFBool containsExtendedCharacters(const OFBool checkAllStrings = OFFalse); /** check if this object is affected by SpecificCharacterSet at any nesting level. * In detail, it is checked whether this object contains any data elements that * according to their VR are affected by the SpecificCharacterSet (0008,0005) * element. This is true for the following VRs: PN, LO, LT, SH, ST and UT * @return true if object is affected by SpecificCharacterSet, false otherwise */ virtual OFBool isAffectedBySpecificCharacterSet() const; /** insert a new element into the list of elements maintained by this item. * The list of elements is always kept in ascending tag order. * @param elem element to be inserted, must not be contained in this or * any other item. Will be deleted upon destruction of this item object. * @param replaceOld if true, this element replaces any other element with * the same tag which may already be contained in the item. If false, * insert fails if another element with the same tag is already present. * @param checkInsertOrder if true, a warning message is sent to the console * if the element is not inserted at the end of the list. This is used * in the read() method to detect datasets with out-of-order elements. * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition insert(DcmElement *elem, OFBool replaceOld = OFFalse, OFBool checkInsertOrder = OFFalse); /** access an element from the item. This method returns a pointer to one * of the elements in the item, and not a copy. * @param num index number of element, must be < card() * @return pointer to element if found, NULL if num >= card() */ virtual DcmElement *getElement(const unsigned long num); /** this method enables a stack based, depth-first traversal of a complete * hierarchical DICOM dataset (that is, classes derived from DcmItem or * DcmSequenceOfItems). With each call of this method, the next object * in the tree is located and marked on the stack. * @param stack "cursor" for current position in the dataset. The stack * will contain a pointer to each dataset, sequence, item and element * from the main dataset down to the current element, and is updated * upon each call to this method. An empty stack is equivalent to a stack * containing a pointer to this object only. * @param intoSub if true, the nextObject method will perform a hierarchical * search through the dataset (depth-first), if false, only the current * container object will be traversed (e.g., all elements of an item * or all items of a sequence). * @return EC_Normal if value length is correct, an error code otherwise */ virtual OFCondition nextObject(DcmStack &stack, const OFBool intoSub); /** this method is only used in container classes, * that is, DcmItem and DcmSequenceOfItems. It returns a pointer to the * next object in the list AFTER the given object. If the caller passes NULL, * a pointer to the first object in the list is returned. If the given object * is not found, the given object is the last one in the list or the list is empty, * NULL is returned. * @param obj pointer to one object in the container; we are looking for the * next entry after this one. NULL if looking for the first entry. * @return pointer to next object in container or NULL if not found */ virtual DcmObject *nextInContainer(const DcmObject *obj); /** remove element from list. If found, the element is not deleted but * returned to the caller who is responsible for further management of the * DcmElement object. * @param num index number of element, must be < card() * @return pointer to DcmElement if found, NULL otherwise */ virtual DcmElement *remove(const unsigned long num); /** remove element from list. If found, the element is not deleted but * returned to the caller who is responsible for further management of the * DcmElement object. * @param elem pointer to element (as type DcmObject *) to be removed from list * @return pointer to element (as type DcmElement *) if found, NULL otherwise */ virtual DcmElement *remove(DcmObject *elem); /** remove element from list. If found, the element is not deleted but * returned to the caller who is responsible for further management of the * DcmElement object. * @param tag attribute tag of element to be removed * @return pointer to DcmElement if found, NULL otherwise */ virtual DcmElement *remove(const DcmTagKey &tag); /** check if this item is empty * @param normalize not used for this class * @return true if item is empty, i.e. has no elements, false otherwise */ virtual OFBool isEmpty(const OFBool normalize = OFTrue); /** clear (remove) attribute value * @return EC_Normal if successful, an error code otherwise */ virtual OFCondition clear(); /** check the currently stored element value * @param autocorrect correct value length if OFTrue * @return status, EC_Normal if value length is correct, an error code otherwise */ virtual OFCondition verify(const OFBool autocorrect = OFFalse ); /** a complex, stack-based, hierarchical search method. It allows for a search * for a DICOM object with a given attribute within a given container, * hierarchically, from a starting position identified through a cursor stack. * @param xtag the DICOM attribute tag we are searching for * @param resultStack Depending on the search mode (see below), this parameter * either serves as an input and output parameter, or as an output parameter * only (the latter being the default). When used as an input parameter, * the cursor stack defines the start position for the search within a * hierarchical DICOM dataset. Upon successful return, the stack contains * the position of the element found, in the form of a pointer to each dataset, * sequence, item and element from the main dataset down to the found element. * @param mode search mode, controls how the search stack is handled. * In the default mode, ESM_fromHere, the stack is ignored on input, and * the search starts in the object for which this method is called. * In the other modes, the stack is used both as an input and an output * parameter and defines the starting point for the search. * @param searchIntoSub if true, the search will be performed hierarchically descending * into the sequences and items of the dataset. If false, only the current container * (sequence or item) will be traversed. * @return EC_Normal if found, EC_TagNotFound if not found, an error code is something * went wrong. */ virtual OFCondition search(const DcmTagKey &xtag, // in DcmStack &resultStack, // inout E_SearchMode mode = ESM_fromHere, // in OFBool searchIntoSub = OFTrue ); // in /** this method loads all attribute values maintained by this object and * all sub-objects (in case of a container such as DcmDataset) into memory. * After a call to this method, the file from which a dataset was read may safely * be deleted or replaced. For large files, this method may obviously allocate large * amounts of memory. * @return EC_Normal if successful, an error code otherwise */ virtual OFCondition loadAllDataIntoMemory(); /** This function takes care of group length and padding elements * in the current element list according to what is specified in * glenc and padenc. If required, this function does the following * two things: * a) it calculates the group length of all groups which are * contained in this item and sets the calculated values * in the corresponding group length elements and * b) it inserts a corresponding padding element (or, in case * of sequences: padding elements) with a corresponding correct * size into the element list. * @param glenc Encoding type for group length; specifies what shall * be done with group length tags. * @param padenc Encoding type for padding; specifies what shall be * done with padding tags. * @param xfer The transfer syntax that shall be used. * @param enctype Encoding type for sequences; specifies how sequences * will be handled. * @param padlen The length up to which the dataset shall be padded, * if padding is desired. * @param subPadlen For sequences (ie sub elements), the length up to * which item shall be padded, if padding is desired. * @param instanceLength Number of extra bytes added to the item/dataset * length used when computing the padding; this * parameter is for instance used to pass the length * of the file meta header from the DcmFileFormat to * the DcmDataset object. * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition computeGroupLengthAndPadding(const E_GrpLenEncoding glenc, const E_PaddingEncoding padenc = EPD_noChange, const E_TransferSyntax xfer = EXS_Unknown, const E_EncodingType enctype = EET_ExplicitLength, const Uint32 padlen = 0, const Uint32 subPadlen = 0, Uint32 instanceLength = 0); /** check if an element with the given attribute tag exists in the dataset * @param key tag key to be searched * @param searchIntoSub if true, do hierarchical search within sequences, * if false only search through this dataset * @return true if tag found, false otherwise */ OFBool tagExists(const DcmTagKey &key, OFBool searchIntoSub = OFFalse); /** check if an element with the given attribute tag exists in the dataset * and has a non-empty value (i.e., length > 0) * @param key tag key to be searched * @param searchIntoSub if true, do hierarchical search within sequences, * if false only search through this dataset * @return true if tag found and element non-empty, false otherwise */ OFBool tagExistsWithValue(const DcmTagKey &key, OFBool searchIntoSub = OFFalse); /* --- findAndGet functions: find an element and get it or the value, respectively --- */ /** find element and get a pointer to it (or copy it). * Applicable to all DICOM value representations (VR). * The result variable 'element' is automatically set to NULL if an error occurs. * @param tagKey DICOM tag specifying the attribute to be searched for * @param element variable in which the reference to (or copy of) the element is stored * @param searchIntoSub flag indicating whether to search into sequences or not * @param createCopy create a copy of the element if true, return a reference otherwise * @return EC_Normal upon success, an error code otherwise. */ OFCondition findAndGetElement(const DcmTagKey &tagKey, DcmElement *&element, const OFBool searchIntoSub = OFFalse, const OFBool createCopy = OFFalse); /** find all elements matching a particular tag and return references to them on a stack. * This functions always performs a deep search (i.e. searches into sequence of items). * @param tagKey DICOM tag specifying the attribute to be searched for * @param resultStack stack where references to the elements are stored (added to). * If no element is found, the stack is not modified (e.g. cleared). * @return EC_Normal if at least one matching tag is found, an error code otherwise. */ OFCondition findAndGetElements(const DcmTagKey &tagKey, DcmStack &resultStack); /** find element and get value as a reference to a C string. * Applicable to the following VRs: AE, AS, CS, DA, DS, DT, IS, LO, LT, PN, SH, ST, TM, UI, UT * Since the getString() routine is called internally the resulting string reference represents * the (possibly multi-valued) value as stored in the dataset, i.e. no normalization is performed. * The result variable 'value' is automatically set to NULL if an error occurs. * @param tagKey DICOM tag specifying the attribute to be searched for * @param value variable in which the reference to the element value is stored (might be NULL) * @param searchIntoSub flag indicating whether to search into sequences or not * @return EC_Normal upon success, an error code otherwise. */ OFCondition findAndGetString(const DcmTagKey &tagKey, const char *&value, const OFBool searchIntoSub = OFFalse); /** find element and get value as a C++ string (only one component). * Applicable to the following VRs: AE, AS, AT, CS, DA, DS, DT, FL, FD, IS, LO, LT, OB, OF, OW, * PN, SH, SL, SS, ST, TM, UI, UL, US, UT * Since the getOFString() routine is called internally the resulting string is normalized, i.e. * leading and/or trailing spaces are removed according to the associated value representation, * or the element value is converted to a character string (for non-string VRs) - see documentation * in the corresponding header file. * In contrast to the above and below function only the specified component (see parameter 'pos') * is returned. The result variable 'value' is automatically set to an empty string if an error * occurs. * @param tagKey DICOM tag specifying the attribute to be searched for * @param value variable in which the element value is stored * @param pos index of the value in case of multi-valued elements (0..vm-1) * @param searchIntoSub flag indicating whether to search into sequences or not * @return EC_Normal upon success, an error code otherwise. */ OFCondition findAndGetOFString(const DcmTagKey &tagKey, OFString &value, const unsigned long pos = 0, const OFBool searchIntoSub = OFFalse); /** find element and get value as a C++ string (all components). * Applicable to the following VRs: AE, AS, AT, CS, DA, DS, DT, FL, FD, IS, LO, LT, OB, OF, OW, * PN, SH, SL, SS, ST, TM, UI, UL, US, UT * Since the getOFStringArray() routine is called internally the resulting string is normalized, * i.e. leading and/or trailing spaces are removed according to the associated value representation * or the element values are converted to character strings (for non-string VRs) - see documentation * in the corresponding header file. * The result variable 'value' is automatically set to an empty string if an error occurs. * @param tagKey DICOM tag specifying the attribute to be searched for * @param value variable in which the element value is stored * @param searchIntoSub flag indicating whether to search into sequences or not * @return EC_Normal upon success, an error code otherwise. */ OFCondition findAndGetOFStringArray(const DcmTagKey &tagKey, OFString &value, const OFBool searchIntoSub = OFFalse); /** find element and get value as an unsigned 8-bit integer. * Applicable to the following VRs: OB * The result variable 'value' is automatically set to zero if an error occurs. * @param tagKey DICOM tag specifying the attribute to be searched for * @param value variable in which the element value is stored * @param pos index of the value in case of multi-valued elements (0..vm-1) * @param searchIntoSub flag indicating whether to search into sequences or not * @return EC_Normal upon success, an error code otherwise. */ OFCondition findAndGetUint8(const DcmTagKey &tagKey, Uint8 &value, const unsigned long pos = 0, const OFBool searchIntoSub = OFFalse); /** find element and get value as an array of unsigned 8-bit integers. * Applicable to the following VRs: OB * The result variable 'value' is automatically set to NULL if an error occurs. * @param tagKey DICOM tag specifying the attribute to be searched for * @param value variable in which the reference to the element value is stored * @param count stores number of items in the result array (if not NULL) * @param searchIntoSub flag indicating whether to search into sequences or not * @return EC_Normal upon success, an error code otherwise. */ OFCondition findAndGetUint8Array(const DcmTagKey &tagKey, const Uint8 *&value, unsigned long *count = NULL, const OFBool searchIntoSub = OFFalse); /** find element and get value as an unsigned 16-bit integer. * Applicable to the following VRs: OW, US * The result variable 'value' is automatically set to zero if an error occurs. * @param tagKey DICOM tag specifying the attribute to be searched for * @param value variable in which the element value is stored * @param pos index of the value in case of multi-valued elements (0..vm-1) * @param searchIntoSub flag indicating whether to search into sequences or not * @return EC_Normal upon success, an error code otherwise. */ OFCondition findAndGetUint16(const DcmTagKey &tagKey, Uint16 &value, const unsigned long pos = 0, const OFBool searchIntoSub = OFFalse); /** find element and get value as an array of unsigned 16-bit integers. * Applicable to the following VRs: AT, OW, US * The result variable 'value' is automatically set to NULL if an error occurs. * @param tagKey DICOM tag specifying the attribute to be searched for * @param value variable in which the reference to the element value is stored * @param count stores number of items in the result array (if not NULL) * @param searchIntoSub flag indicating whether to search into sequences or not * @return EC_Normal upon success, an error code otherwise. */ OFCondition findAndGetUint16Array(const DcmTagKey &tagKey, const Uint16 *&value, unsigned long *count = NULL, const OFBool searchIntoSub = OFFalse); /** find element and get value as a signed 16-bit integer. * Applicable to the following VRs: SS * The result variable 'value' is automatically set to zero if an error occurs. * @param tagKey DICOM tag specifying the attribute to be searched for * @param value variable in which the element value is stored * @param pos index of the value in case of multi-valued elements (0..vm-1) * @param searchIntoSub flag indicating whether to search into sequences or not * @return EC_Normal upon success, an error code otherwise. */ OFCondition findAndGetSint16(const DcmTagKey &tagKey, Sint16 &value, const unsigned long pos = 0, const OFBool searchIntoSub = OFFalse); /** find element and get value as an array of signed 16-bit integers. * Applicable to the following VRs: SS * The result variable 'value' is automatically set to NULL if an error occurs. * @param tagKey DICOM tag specifying the attribute to be searched for * @param value variable in which the reference to the element value is stored * @param count stores number of items in the result array (if not NULL) * @param searchIntoSub flag indicating whether to search into sequences or not * @return EC_Normal upon success, an error code otherwise. */ OFCondition findAndGetSint16Array(const DcmTagKey &tagKey, const Sint16 *&value, unsigned long *count = NULL, const OFBool searchIntoSub = OFFalse); /** find element and get value as an unsigned 32-bit integer. * Applicable to the following VRs: UL * The result variable 'value' is automatically set to zero if an error occurs. * @param tagKey DICOM tag specifying the attribute to be searched for * @param value variable in which the element value is stored * @param pos index of the value in case of multi-valued elements (0..vm-1) * @param searchIntoSub flag indicating whether to search into sequences or not * @return EC_Normal upon success, an error code otherwise. */ OFCondition findAndGetUint32(const DcmTagKey &tagKey, Uint32 &value, const unsigned long pos = 0, const OFBool searchIntoSub = OFFalse); /** find element and get value as an array of unsigned 32-bit integers. * Applicable to the following VRs: UL * The result variable 'value' is automatically set to NULL if an error occurs. * @param tagKey DICOM tag specifying the attribute to be searched for * @param value variable in which the reference to the element value is stored * @param count stores number of items in the result array (if not NULL) * @param searchIntoSub flag indicating whether to search into sequences or not * @return EC_Normal upon success, an error code otherwise. */ OFCondition findAndGetUint32Array(const DcmTagKey &tagKey, const Uint32 *&value, unsigned long *count = NULL, const OFBool searchIntoSub = OFFalse); /** find element and get value as a signed 32-bit integer. * Applicable to the following VRs: IS, SL * The result variable 'value' is automatically set to zero if an error occurs. * @param tagKey DICOM tag specifying the attribute to be searched for * @param value variable in which the element value is stored * @param pos index of the value in case of multi-valued elements (0..vm-1) * @param searchIntoSub flag indicating whether to search into sequences or not * @return EC_Normal upon success, an error code otherwise. */ OFCondition findAndGetSint32(const DcmTagKey &tagKey, Sint32 &value, const unsigned long pos = 0, const OFBool searchIntoSub = OFFalse); /** find element and get value as an array of signed 32-bit integers. * Applicable to the following VRs: SL * The result variable 'value' is automatically set to NULL if an error occurs. * @param tagKey DICOM tag specifying the attribute to be searched for * @param value variable in which the reference to the element value is stored * @param count stores number of items in the result array (if not NULL) * @param searchIntoSub flag indicating whether to search into sequences or not * @return EC_Normal upon success, an error code otherwise. */ OFCondition findAndGetSint32Array(const DcmTagKey &tagKey, const Sint32 *&value, unsigned long *count = NULL, const OFBool searchIntoSub = OFFalse); /** find element and get value as a (signed) long integer. * Applicable to the following VRs: IS, SL, SS, UL, US * The result variable 'value' is automatically set to zero if an error occurs. * @param tagKey DICOM tag specifying the attribute to be searched for * @param value variable in which the element value is stored * @param pos index of the value in case of multi-valued elements (0..vm-1) * @param searchIntoSub flag indicating whether to search into sequences or not * @return EC_Normal upon success, an error code otherwise. */ OFCondition findAndGetLongInt(const DcmTagKey &tagKey, long int &value, const unsigned long pos = 0, const OFBool searchIntoSub = OFFalse); /** find element and get value as a 32-bit floating point. * Applicable to the following VRs: FL, OF * The result variable 'value' is automatically set to zero if an error occurs. * @param tagKey DICOM tag specifying the attribute to be searched for * @param value variable in which the element value is stored * @param pos index of the value in case of multi-valued elements (0..vm-1) * @param searchIntoSub flag indicating whether to search into sequences or not * @return EC_Normal upon success, an error code otherwise. */ OFCondition findAndGetFloat32(const DcmTagKey &tagKey, Float32 &value, const unsigned long pos = 0, const OFBool searchIntoSub = OFFalse); /** find element and get value as an array of 32-bit floating point values. * Applicable to the following VRs: FL, OF * The result variable 'value' is automatically set to NULL if an error occurs. * @param tagKey DICOM tag specifying the attribute to be searched for * @param value variable in which the reference to the element value is stored * @param count stores number of items in the result array (if not NULL) * @param searchIntoSub flag indicating whether to search into sequences or not * @return EC_Normal upon success, an error code otherwise. */ OFCondition findAndGetFloat32Array(const DcmTagKey &tagKey, const Float32 *&value, unsigned long *count = NULL, const OFBool searchIntoSub = OFFalse); /** find element and get value as a 64-bit floating point. * Applicable to the following VRs: DS, FD * The result variable 'value' is automatically set to zero if an error occurs. * @param tagKey DICOM tag specifying the attribute to be searched for * @param value variable in which the element value is stored * @param pos index of the value in case of multi-valued elements (0..vm-1) * @param searchIntoSub flag indicating whether to search into sequences or not * @return EC_Normal upon success, an error code otherwise. */ OFCondition findAndGetFloat64(const DcmTagKey &tagKey, Float64 &value, const unsigned long pos = 0, const OFBool searchIntoSub = OFFalse); /** find element and get value as an array of 64-bit floating point values. * Applicable to the following VRs: FD * The result variable 'value' is automatically set to NULL if an error occurs. * @param tagKey DICOM tag specifying the attribute to be searched for * @param value variable in which the reference to the element value is stored * @param count stores number of items in the result array (if not NULL) * @param searchIntoSub flag indicating whether to search into sequences or not * @return EC_Normal upon success, an error code otherwise. */ OFCondition findAndGetFloat64Array(const DcmTagKey &tagKey, const Float64 *&value, unsigned long *count = NULL, const OFBool searchIntoSub = OFFalse); /** looks up and returns a given sequence. * Applicable to the following VRs: SQ, (pixelSQ) * The result variable 'sequence' is automatically set to NULL if an error occurs * (e.g. if 'seqTagKey' does not refer to a sequence attribute). * @param seqTagKey DICOM tag specifying the sequence attribute to be searched for * @param sequence variable in which the reference to (or copy of) the sequence is stored * @param searchIntoSub flag indicating whether to search into sub-sequences or not * @param createCopy create a copy of the sequence if true, return a reference otherwise * @return EC_Normal upon success, an error otherwise. */ OFCondition findAndGetSequence(const DcmTagKey &seqTagKey, DcmSequenceOfItems *&sequence, const OFBool searchIntoSub = OFFalse, const OFBool createCopy = OFFalse); /** looks up and returns a given sequence item, if it exists. Otherwise sets 'item' * to NULL and returns EC_TagNotFound (specified sequence does not exist) or * EC_IllegalParameter (specified item does not exist). Only the top-most level of * the dataset/item is examined (i.e. no deep-search is performed). * Applicable to the following VRs: SQ, (pixelSQ) * @param seqTagKey DICOM tag specifying the sequence attribute to be searched for * @param item variable in which the reference to (or copy of) the item is stored * @param itemNum number of the item to be searched for (0..n-1, -1 for last) * @param createCopy create a copy of the item if true, return a reference otherwise * @return EC_Normal upon success, an error otherwise. */ OFCondition findAndGetSequenceItem(const DcmTagKey &seqTagKey, DcmItem *&item, const signed long itemNum = 0, const OFBool createCopy = OFFalse); /* --- findOrCreate functions: find an element or create a new one --- */ /** looks up the given sequence in the current dataset and returns the given item. * If either the sequence or the item do not exist, they are created. If necessary, * multiple empty items are inserted. Only the top-most level of the dataset/item * is examined (i.e. no deep-search is performed). * Applicable to the following VRs: SQ, (pixelSQ) * @param seqTag DICOM tag specifying the sequence attribute to be searched for * (or to be created) * @param item variable in which the reference to the sequence item is stored * @param itemNum number of the item to be searched for (0..n-1, -1 for last, * -2 for append new) * @return EC_Normal upon success, an error otherwise. */ OFCondition findOrCreateSequenceItem(const DcmTag &seqTag, DcmItem *&item, const signed long itemNum = 0); /* --- findAndXXX functions: find an element and do something with it --- */ /** find element, create a copy and insert it into the given destination dataset. * This functions never performs a deep search (i.e. does not search into sequence * of items). Empty elements are also copied. However, if the given tag is not * found in the current dataset, EC_TagNotFound is returned and the destination * dataset remains unchanged. * Applicable to all DICOM value representations (VR). * @param tagKey DICOM tag specifying the attribute to be searched for * @param destItem destination dataset to which the copied element is inserted * @param replaceOld flag indicating whether to replace an existing element or not * @return EC_Normal upon success, an error code otherwise */ OFCondition findAndInsertCopyOfElement(const DcmTagKey &tagKey, DcmItem *destItem, const OFBool replaceOld = OFTrue); /** find element, remove it from the dataset and free the associated memory. * Applicable to all DICOM value representations (VR). * @param tagKey DICOM tag specifying the attribute to be searched for * @param allOccurrences flag indicating whether to delete all occurrences of the * attribute tag or the first one only (implies 'searchIntoSub' to be true) * @param searchIntoSub flag indicating whether to search into sequences or not * @return EC_Normal upon success, an error code otherwise. */ OFCondition findAndDeleteElement(const DcmTagKey &tagKey, const OFBool allOccurrences = OFFalse, const OFBool searchIntoSub = OFFalse); /** looks up the given sequence in the current dataset and deletes the given item. * Applicable to the following VRs: SQ, (pixelSQ) * @param seqTagKey DICOM tag specifying the sequence attribute to be searched for * @param itemNum number of the item to be deleted (0..n-1, -1 for last) * @return EC_Normal upon success, an error otherwise. */ OFCondition findAndDeleteSequenceItem(const DcmTagKey &seqTagKey, const signed long itemNum); /* --- putAndInsert functions: put value and insert new element --- */ /** create a new element, put specified value to it and insert the element into the dataset/item. * Applicable to the following VRs: AE, AS, AT, CS, DA, DS, DT, FL, FD, IS, LO, LT, OB, OF, OW, * PN, SH, SL, SS, ST, TM, UI, UL, US, UT * @param tag DICOM tag specifying the attribute to be created * @param value value to be set for the new element (might be empty or NULL) * @param replaceOld flag indicating whether to replace an existing element or not * @return EC_Normal upon success, an error code otherwise. */ OFCondition putAndInsertString(const DcmTag &tag, const char *value, const OFBool replaceOld = OFTrue); /** create a new element, put specified value to it and insert the element into the dataset/item. * Applicable to the following VRs: AE, AS, CS, DA, DS, DT, IS, LO, LT, PN, SH, ST, TM, UI, UT * @param tag DICOM tag specifying the attribute to be created * @param value value to be set for the new element (might be empty) * @param replaceOld flag indicating whether to replace an existing element or not * @return EC_Normal upon success, an error code otherwise. */ OFCondition putAndInsertOFStringArray(const DcmTag &tag, const OFString &value, const OFBool replaceOld = OFTrue); /** create a new element, put specified value to it and insert the element into the dataset/item. * Applicable to the following VRs: OB, ox (polymorph OB/OW or pixel data) * @param tag DICOM tag specifying the attribute to be created * @param value value to be set for the new element (might be NULL) * @param count number of values (= bytes in this case) to be copied from 'value' * @param replaceOld flag indicating whether to replace an existing element or not * @return EC_Normal upon success, an error code otherwise. */ OFCondition putAndInsertUint8Array(const DcmTag &tag, const Uint8 *value, const unsigned long count, const OFBool replaceOld = OFTrue); /** create a new element, put specified value to it and insert the element into the dataset/item. * Applicable to the following VRs: US, xs (US or SS) * @param tag DICOM tag specifying the attribute to be created * @param value value to be set for the new element * @param pos index of the value to be set (0..vm). A value can be appended to * the end of or inserted within the existing value field. * @param replaceOld flag indicating whether to replace an existing element or not * @return EC_Normal upon success, an error code otherwise. */ OFCondition putAndInsertUint16(const DcmTag &tag, const Uint16 value, const unsigned long pos = 0, const OFBool replaceOld = OFTrue); /** create a new element, put specified value to it and insert the element into the dataset/item. * Applicable to the following VRs: AT, OW, US, ox (polymorph OB/OW or pixel data), xs (US or SS) * @param tag DICOM tag specifying the attribute to be created * @param value value to be set for the new element (might be NULL) * @param count number of values (not bytes!) to be copied from 'value' * @param replaceOld flag indicating whether to replace an existing element or not * @return EC_Normal upon success, an error code otherwise. */ OFCondition putAndInsertUint16Array(const DcmTag &tag, const Uint16 *value, const unsigned long count, const OFBool replaceOld = OFTrue); /** create a new element, put specified value to it and insert the element into the dataset/item. * Applicable to the following VRs: SS, xs (US or SS) * @param tag DICOM tag specifying the attribute to be created * @param value value to be set for the new element * @param pos index of the value to be set (0..vm). A value can be appended to * the end of or inserted within the existing value field. * @param replaceOld flag indicating whether to replace an existing element or not * @return EC_Normal upon success, an error code otherwise. */ OFCondition putAndInsertSint16(const DcmTag &tag, const Sint16 value, const unsigned long pos = 0, const OFBool replaceOld = OFTrue); /** create a new element, put specified value to it and insert the element into the dataset/item. * Applicable to the following VRs: SS, xs (US or SS) * @param tag DICOM tag specifying the attribute to be created * @param value value to be set for the new element * @param count number of values (not bytes!) to be copied from 'value' * @param replaceOld flag indicating whether to replace an existing element or not * @return EC_Normal upon success, an error code otherwise. */ OFCondition putAndInsertSint16Array(const DcmTag &tag, const Sint16 *value, const unsigned long count, const OFBool replaceOld = OFTrue); /** create a new element, put specified value to it and insert the element into the dataset/item. * Applicable to the following VRs: UL * @param tag DICOM tag specifying the attribute to be created * @param value value to be set for the new element * @param pos index of the value to be set (0..vm). A value can be appended to * the end of or inserted within the existing value field. * @param replaceOld flag indicating whether to replace an existing element or not * @return EC_Normal upon success, an error code otherwise. */ OFCondition putAndInsertUint32(const DcmTag &tag, const Uint32 value, const unsigned long pos = 0, const OFBool replaceOld = OFTrue); /** create a new element, put specified value to it and insert the element into the dataset/item. * Applicable to the following VRs: SL * @param tag DICOM tag specifying the attribute to be created * @param value value to be set for the new element * @param pos index of the value to be set (0..vm). A value can be appended to * the end of or inserted within the existing value field. * @param replaceOld flag indicating whether to replace an existing element or not * @return EC_Normal upon success, an error code otherwise. */ OFCondition putAndInsertSint32(const DcmTag &tag, const Sint32 value, const unsigned long pos = 0, const OFBool replaceOld = OFTrue); /** create a new element, put specified value to it and insert the element into the dataset/item. * Applicable to the following VRs: FL, OF * @param tag DICOM tag specifying the attribute to be created * @param value value to be set for the new element * @param pos index of the value to be set (0..vm). A value can be appended to * the end of or inserted within the existing value field. * @param replaceOld flag indicating whether to replace an existing element or not * @return EC_Normal upon success, an error code otherwise. */ OFCondition putAndInsertFloat32(const DcmTag &tag, const Float32 value, const unsigned long pos = 0, const OFBool replaceOld = OFTrue); /** create a new element, put specified value to it and insert the element into the dataset/item. * Applicable to the following VRs: FD * @param tag DICOM tag specifying the attribute to be created * @param value value to be set for the new element * @param pos index of the value to be set (0..vm). A value can be appended to * the end of or inserted within the existing value field. * @param replaceOld flag indicating whether to replace an existing element or not * @return EC_Normal upon success, an error code otherwise. */ OFCondition putAndInsertFloat64(const DcmTag &tag, const Float64 value, const unsigned long pos = 0, const OFBool replaceOld = OFTrue); /* --- insertXXX functions: insert new element --- */ /** create a new element (with no value) and insert it into the dataset/item. * Applicable to the following VRs: AE, AS, AT, CS, DA, DS, DT, FL, FD, IS, LO, LT, OB, OF, OW, * PN, SH, SL, SQ, SS, ST, TM, UI, UL, US, UT * @param tag DICOM tag specifying the attribute to be created * @param replaceOld flag indicating whether to replace an existing element or not * @return EC_Normal upon success, an error code otherwise. */ OFCondition insertEmptyElement(const DcmTag &tag, const OFBool replaceOld = OFTrue); /** looks up the given sequence in the current dataset and inserts the given item. * If the sequence does not exist, it is created. If necessary, multiple empty items * are inserted before the specified item position. Only the top-most level of the * dataset/item is examined (i.e. no deep-search is performed). * Applicable to the following VRs: SQ, (pixelSQ) * @param seqTag DICOM tag specifying the sequence attribute to be searched for * (or to be created) * @param item item to be inserted into the sequence, must not be contained in this * or any other sequence. Will be deleted upon destruction of the sequence object. * @param itemNum position of the item (0..n-1, -1 = before last, -2 = after last) * @return EC_Normal upon success, an error otherwise (delete 'item' manually!). */ OFCondition insertSequenceItem(const DcmTag &seqTag, DcmItem *item, const signed long itemNum = -2); protected: /// the list of elements maintained by this object DcmList *elementList; /** flag used during suspended I/O. Indicates whether the last element * was completely or only partially read/written during the last call * to read/write. */ OFBool lastElementComplete; /** used during reading. Contains the position in the stream where * the item started (needed for calculating the remaining number of * bytes available for a fixed-length item). */ offile_off_t fStartPosition; protected: /** This function reads tag and length information from inStream and * returns this information to the caller. When reading information, * the transfer syntax which was passed is accounted for. If the * transfer syntax shows an explicit value representation, the data * type of this object is also read from the stream. In general, this * function follows the rules which are specified in the DICOM standard * (see DICOM standard (year 2000) part 5, section 7) (or the corresponding * section in a later version of the standard) concerning the encoding * of a dataset. * @param inStream The stream which contains the information. * @param xfer The transfer syntax which was used to encode the * information in inStream. * @param tag Contains in the end the tag that was read. * @param length Contains in the end the length value that was read. * @param bytesRead Contains in the end the amount of bytes which were * read from inStream. * @return status, EC_Normal if successful, an error code otherwise */ OFCondition readTagAndLength(DcmInputStream &inStream, // inout const E_TransferSyntax xfer, // in DcmTag &tag, // out Uint32 &length, // out Uint32 &bytesRead); // out /** This function creates a new DcmElement object on the basis of the newTag * and newLength information which was passed, inserts this new element into * elementList, reads the actual data value which belongs to this element * (attribute) from the inStream and also assigns this information to the * object which was created at the beginning. * @param inStream The stream which contains the information. * @param newTag The tag of the element of which the information is * being read. * @param newLength The length of the information which is being read. * @param xfer The transfer syntax which was used to encode the * information in inStream. * @param glenc Encoding type for group length. Specifies what will * be done with group length tags. * @param maxReadLength Maximum read length for reading the attribute value. * @return status, EC_Normal if successful, an error code otherwise */ OFCondition readSubElement(DcmInputStream &inStream, // inout DcmTag &newTag, // inout const Uint32 newLength, // in const E_TransferSyntax xfer, // in const E_GrpLenEncoding glenc, // in const Uint32 maxReadLength = DCM_MaxReadLength); /** This function reads the first 6 bytes from the input stream and determines * the transfer syntax which was used to code the information in the stream. * The decision is based on two questions: a) Did we encounter a valid tag? * and b) Do the last 2 bytes which were read from the stream represent a valid * VR? In certain special cases, where the transfer syntax cannot be determined * without doubt, we want to guess the most likely transfer syntax (see code). * @param inStream The stream which contains the coded information. * @return The transfer syntax which was determined. */ E_TransferSyntax checkTransferSyntax(DcmInputStream &inStream); /** check whether the given tag requires some special handling regarding the VR * (i.e. in case it is undefined and multiple values are possible). If required, * the VR of the given element tag is then updated according to the DICOM * standard, e.g. the VR of PixelPaddingValue (if undefined) is set to 'SS' or * 'US' depending on the value of PixelRepresentation. * @param item dataset or item that can be used to lookup other element values * @param tag tag of the element to be checked and updated (if required) */ void checkAndUpdateVR(DcmItem &item, DcmTag &tag); private: /** helper function for search(). May only be called if elementList is non-empty. * Performs hierarchical search for given tag and pushes pointer of sub-element * on result stack if found * @param tag tag key to be searched * @param resultStack upon successful return, pointer to element pushed onto this stack * @param searchIntoSub flag indicating whether recursive search is desired * @return EC_Normal if tag found and stack modified, EC_TagNotFound if tag not found * and stack unmodified */ OFCondition searchSubFromHere(const DcmTagKey &tag, // in DcmStack &resultStack, // inout OFBool searchIntoSub ); // in /** helper function that interprets the given pointer as a pointer to an * array of two characters and checks whether these two characters form * a valid standard DICOM VR. * @param atposition pointer to array of (at least) two bytes interpreted as VR * @return true if standard VR, false otherwise */ static OFBool foundVR(const Uint8* atposition); /// cache for private creator tags and names DcmPrivateTagCache privateCreatorCache; }; // // SUPPORT FUNCTIONS // /** helper function for DICOM parser. Creates new DICOM element from given attribute tag * @param newElement pointer to newly created element returned in this parameter upon success, * NULL pointer otherwise * @param tag attribute tag of the element to be created * @param length attribute value length of the element to be created * @param privateCreatorCache cache object for private creator strings in the current dataset * @param readAsUN flag indicating whether parser is currently handling a UN element that * must be read in implicit VR little endian; updated upon return * @return EC_Normal upon success, an error code otherwise */ OFCondition newDicomElement(DcmElement *&newElement, DcmTag &tag, const Uint32 length, DcmPrivateTagCache *privateCreatorCache, OFBool& readAsUN); /** helper function for DICOM parser. Creates new DICOM element from given attribute tag * @param newElement pointer to newly created element returned in this parameter upon success, * NULL pointer otherwise * @param tag attribute tag of the element to be created * @param length attribute value length of the element to be created * @return EC_Normal upon success, an error code otherwise */ OFCondition newDicomElement(DcmElement *&newElement, const DcmTag &tag, const Uint32 length = 0); /** helper function for DICOM parser. Creates new DICOM element from given attribute tag * @param tag attribute tag of the element to be created * @param length attribute value length of the element to be created * @return pointer to newly created element returned in this parameter upon success, * NULL pointer otherwise */ DcmElement *newDicomElement(const DcmTag &tag, const Uint32 length = 0); /** helper function for DcmElement::nextObject. * hierarchically traverses all datasets/items after the position indicated by the call stack * @param st stack * @return EC_Normal upon success, an error code otherwise */ OFCondition nextUp(DcmStack &st); #endif // DCITEM_H /* ** CVS/RCS Log: ** $Log: dcitem.h,v $ ** Revision 1.83 2010-11-02 15:31:06 joergr ** Added special handling for data elements that are associated with different ** VRs (according to the data dictinary) when read with an implicit transfer ** syntax, e.g. PixelPaddingValue or WaveformData. ** ** Revision 1.82 2010-10-14 13:15:41 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.81 2010-10-01 13:55:01 joergr ** Added new helper function findAndInsertCopyOfElement(). ** ** Revision 1.80 2010-03-01 09:08:44 uli ** Removed some unnecessary include directives in the headers. ** ** Revision 1.79 2010-02-22 11:39:53 uli ** Remove some unneeded includes. ** ** Revision 1.78 2009-09-02 09:58:21 joergr ** Revised documentation of parameter "pos" for some putAndInsertXXX() functions ** in order to make clear what the possible range of values is. ** ** Revision 1.77 2009-08-07 14:40:38 joergr ** Enhanced isEmpty() method by checking whether the data element value consists ** of non-significant characters only. ** ** Revision 1.76 2009-03-25 10:22:09 joergr ** Added new method isEmpty() to DICOM object, item and sequence class. ** ** Revision 1.75 2009-03-05 14:07:56 onken ** Fixed typo. ** ** Revision 1.74 2009-03-05 13:35:47 onken ** Added checks for sequence and item lengths which prevents overflow in length ** field, if total length of contained items (or sequences) exceeds ** 32-bit length field. Also introduced new flag (default: enabled) ** for writing in explicit length mode, which allows for automatically ** switching encoding of only that very sequence/item to undefined ** length coding (thus permitting to actually write the file). ** ** Revision 1.73 2009-02-04 17:52:17 joergr ** Fixes various type mismatches reported by MSVC introduced with OFFile class. ** ** Revision 1.72 2008-12-12 11:44:40 onken ** Moved path access functions to separate classes ** ** Revision 1.71 2008-12-05 13:28:14 onken ** Splitted findOrCreatePath() function API for also offering a simple API ** for non-wildcard searches. ** ** Revision 1.70 2008-12-04 16:55:14 onken ** Changed findOrCreatePath() to also support wildcard as item numbers. ** ** Revision 1.69 2008-11-26 12:08:22 joergr ** Updated documentation of newDicomElement() in order to reflect the current ** implementation. ** ** Revision 1.68 2008-10-15 12:31:20 onken ** Added findOrCreatePath() functions which allow for finding or creating a ** hierarchy of sequences, items and attributes according to a given "path" ** string. ** ** Revision 1.67 2008-07-17 11:19:48 onken ** Updated copyFrom() documentation. ** ** Revision 1.66 2008-07-17 10:30:23 onken ** Implemented copyFrom() method for complete DcmObject class hierarchy, which ** permits setting an instance's value from an existing object. Implemented ** assignment operator where necessary. ** ** Revision 1.65 2008-06-23 12:09:13 joergr ** Fixed inconsistencies in Doxygen API documentation. ** ** Revision 1.64 2007/11/29 14:30:19 meichel ** Write methods now handle large raw data elements (such as pixel data) ** without loading everything into memory. This allows very large images to ** be sent over a network connection, or to be copied without ever being ** fully in memory. ** ** Revision 1.63 2007/09/21 10:40:15 onken ** Changed foundVR() API and implementation to use Uint8* instead of char* to ** avoid calls to isalpha() with negative arguments (undef. behaviour/assertion) ** ** Revision 1.62 2007/06/29 14:17:49 meichel ** Code clean-up: Most member variables in module dcmdata are now private, ** not protected anymore. ** ** Revision 1.61 2007/06/08 14:56:04 joergr ** Added new helper functions insertSequenceItem(), findAndDeleteSequenceItem(). ** Replaced helper function findAndCopyElement() by new optional parameter ** 'createCopy' in various findAndGetXXX() functions. ** ** Revision 1.60 2007/03/09 10:38:13 joergr ** Added support for missing VRs (SL, SS, UL, SS) to insertEmptyElement(). ** ** Revision 1.59 2007/02/19 15:04:34 meichel ** Removed searchErrors() methods that are not used anywhere and added ** error() methods only in the DcmObject subclasses where really used. ** ** Revision 1.58 2006/12/15 14:18:07 joergr ** Added new method that checks whether a DICOM object or element is affected ** by SpecificCharacterSet (0008,0005). ** ** Revision 1.57 2006/12/13 13:58:14 joergr ** Added new optional parameter "checkAllStrings" to method containsExtended ** Characters(). ** ** Revision 1.56 2006/08/15 15:49:56 meichel ** Updated all code in module dcmdata to correctly compile when ** all standard C++ classes remain in namespace std. ** ** Revision 1.55 2006/05/30 15:01:52 joergr ** Modified comment of method containsExtendedCharacters(). ** ** Revision 1.54 2006/05/11 08:54:00 joergr ** Moved checkForNonASCIICharacters() from application to library. ** ** Revision 1.53 2005/12/08 16:28:19 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.52 2005/11/15 18:28:02 meichel ** Added new global flag dcmEnableUnknownVRConversion that enables the automatic ** re-conversion of defined length UN elements read in an explicit VR transfer ** syntax, if the real VR is defined in the data dictionary. Default is OFFalse, ** i.e. to retain the previous behavior. ** ** Revision 1.51 2005/06/24 10:03:14 joergr ** Added support for internal VR "xs" to putAndInsertXXX() helper methods. ** ** Revision 1.50 2004/07/01 12:28:25 meichel ** Introduced virtual clone method for DcmObject and derived classes. ** ** Revision 1.49 2004/02/04 16:02:08 joergr ** Removed pointer declaration from parameter "resultStack" in method ** findAndGetElements(). ** ** Revision 1.48 2003/10/08 10:24:40 joergr ** Added support for AT, OB, OF, OW, SL, SS, UL, US to putAndInsertString(). ** ** Revision 1.47 2003/07/16 14:34:05 joergr ** Added new function findAndGetSequence(). ** ** Revision 1.46 2003/06/26 09:17:25 onken ** Added commandline-application dcmodify. ** ** Revision 1.45 2003/06/12 13:33:46 joergr ** Fixed inconsistent API documentation reported by Doxygen. ** ** Revision 1.44 2003/06/02 17:16:23 joergr ** Added new helper function DcmItem::findAndCopyElement(). ** ** Revision 1.43 2003/06/02 16:58:12 meichel ** Renamed local variables to avoid name clashes with STL ** ** Revision 1.42 2003/05/20 09:01:58 joergr ** Added new helper methods: findAndGetElement(), findAndGetUint32Array(), ** FindAndGetSint32Array(), findAndGetFloat64Array(), findAndDeleteElement(). ** Enhanced findAndGetSequenceItem() and findOrCreateSequenceItem() by checking ** the return value of ident() - avoids crashes when applied to non-sequence ** elements. ** ** Revision 1.41 2002/12/09 09:31:15 wilkens ** Modified/Added doc++ documentation. ** ** Revision 1.40 2002/12/06 12:49:10 joergr ** Enhanced "print()" function by re-working the implementation and replacing ** the boolean "showFullData" parameter by a more general integer flag. ** Added doc++ documentation. ** Made source code formatting more consistent with other modules/files. ** ** Revision 1.39 2002/08/27 16:55:34 meichel ** Initial release of new DICOM I/O stream classes that add support for stream ** compression (deflated little endian explicit VR transfer syntax) ** ** Revision 1.38 2002/08/02 08:42:44 joergr ** Added optional 'pos' parameter to the putAndInsertXXX() methods. ** ** Revision 1.37 2002/07/23 14:21:26 meichel ** Added support for private tag data dictionaries to dcmdata ** ** Revision 1.36 2002/06/26 15:47:40 joergr ** Added support for polymorp OB/OW value representation (e.g. pixel data) to ** putAndInsertUint8/16Array() methods. ** ** Revision 1.35 2002/05/17 09:58:14 meichel ** fixed bug in DcmItem which caused the parser to fail if the same attribute ** tag appeared twice within one dataset (which is illegal in DICOM anyway). ** Added console warning if the attributes read are not in ascending order. ** ** Revision 1.34 2002/04/25 10:06:46 joergr ** Added support for XML output of DICOM objects. ** ** Revision 1.33 2001/12/18 11:37:24 joergr ** Added helper method allowing to create and insert empty elements into an ** item/dataset. ** ** Revision 1.32 2001/11/16 15:54:38 meichel ** Adapted digital signature code to final text of supplement 41. ** ** Revision 1.31 2001/11/09 15:51:59 joergr ** Added new helper routines for managing sequences and items. ** ** Revision 1.30 2001/10/10 15:14:04 joergr ** Changed parameter DcmTagKey to DcmTag in DcmItem::putAndInsert... methods ** to support elements which are not in the data dictionary (e.g. private ** extensions). ** ** Revision 1.29 2001/10/02 11:46:45 joergr ** Added functions to get/put 8 bit values/arrays from/to an item/dataset. ** ** Revision 1.28 2001/10/01 15:01:14 joergr ** Introduced new general purpose functions to get/put DICOM element values ** from/to an item/dataset - removed some old and rarely used functions. ** ** Revision 1.27 2001/09/25 17:19:26 meichel ** Adapted dcmdata to class OFCondition ** ** Revision 1.26 2001/06/01 15:48:40 meichel ** Updated copyright header ** ** Revision 1.25 2000/11/07 16:56:06 meichel ** Initial release of dcmsign module for DICOM Digital Signatures ** ** Revision 1.24 2000/04/14 15:31:32 meichel ** Removed default value from output stream passed to print() method. ** Required for use in multi-thread environments. ** ** Revision 1.23 2000/03/08 16:26:15 meichel ** Updated copyright header. ** ** Revision 1.22 2000/03/03 14:05:24 meichel ** Implemented library support for redirecting error messages into memory ** instead of printing them to stdout/stderr for GUI applications. ** ** Revision 1.21 2000/02/10 10:50:51 joergr ** Added new feature to dcmdump (enhanced print method of dcmdata): write ** pixel data/item value fields to raw files. ** ** Revision 1.20 1999/03/31 09:24:40 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.19 1998/07/15 15:48:48 joergr ** Removed several compiler warnings reported by gcc 2.8.1 with ** additional options, e.g. missing copy constructors and assignment ** operators, initialization of member variables in the body of a ** constructor instead of the member initialization list, hiding of ** methods by use of identical names, uninitialized member variables, ** missing const declaration of char pointers. Replaced tabs by spaces. ** ** Revision 1.18 1997/09/22 14:50:43 hewett ** - Added 2 simple methods to test for the existance of an attribute ** to DcmItem class (tagExists and tagExistsWithValue). This code ** was part of dcmgpdir.cc but is more generally useful. ** - Added 2 methods to find an attribute and retrieve numeric values ** to DcmItem class (findIntegerNumber and findRealNumber). The old ** method findLong is now marked as obsolete and reimplemented using ** findIntegerNumber. ** ** Revision 1.17 1997/09/11 15:13:11 hewett ** Modified getOFString method arguments by removing a default value ** for the pos argument. By requiring the pos argument to be provided ** ensures that callers realise getOFString only gets one component of ** a multi-valued string. ** ** Revision 1.16 1997/08/29 08:32:39 andreas ** - Added methods getOFString and getOFStringArray for all ** string VRs. These methods are able to normalise the value, i. e. ** to remove leading and trailing spaces. This will be done only if ** it is described in the standard that these spaces are not relevant. ** These methods do not test the strings for conformance, this means ** especially that they do not delete spaces where they are not allowed! ** getOFStringArray returns the string with all its parts separated by \ ** and getOFString returns only one value of the string. ** CAUTION: Currently getString returns a string with trailing ** spaces removed (if dcmEnableAutomaticInputDataCorrection == OFTrue) and ** truncates the original string (since it is not copied!). If you rely on this ** behaviour please change your application now. ** Future changes will ensure that getString returns the original ** string from the DICOM object (NULL terminated) inclusive padding. ** Currently, if you call getOF... before calling getString without ** normalisation, you can get the original string read from the DICOM object. ** ** Revision 1.15 1997/07/21 08:25:08 andreas ** - Replace all boolean types (BOOLEAN, CTNBOOLEAN, DICOM_BOOL, BOOL) ** with one unique boolean type OFBool. ** ** Revision 1.14 1997/07/07 07:42:03 andreas ** - Changed parameter type DcmTag & to DcmTagKey & in all search functions ** in DcmItem, DcmSequenceOfItems, DcmDirectoryRecord and DcmObject ** ** Revision 1.13 1997/05/30 06:45:42 andreas ** - fixed problem of inconsistent interfaces and implementation that the ** syntax check of GNU C++ does not find. ** ** Revision 1.12 1997/05/27 13:48:28 andreas ** - Add method canWriteXfer to class DcmObject and all derived classes. ** This method checks whether it is possible to convert the original ** transfer syntax to an new transfer syntax. The check is used in the ** dcmconv utility to prohibit the change of a compressed transfer ** syntax to a uncompressed. ** ** Revision 1.11 1997/05/16 08:13:43 andreas ** - Revised handling of GroupLength elements and support of ** DataSetTrailingPadding elements. The enumeratio E_GrpLenEncoding ** got additional enumeration values (for a description see dctypes.h). ** addGroupLength and removeGroupLength methods are replaced by ** computeGroupLengthAndPadding. To support Padding, the parameters of ** element and sequence write functions changed. ** - Added a new method calcElementLength to calculate the length of an ** element, item or sequence. For elements it returns the length of ** tag, length field, vr field, and value length, for item and ** sequences it returns the length of the whole item. sequence including ** the Delimitation tag (if appropriate). It can never return ** UndefinedLength. ** - Deleted obsolete method DcmItem::calcHeaderLength because the ** samce functionality is performed by DcmXfer::sizeofTagHeader ** ** Revision 1.10 1996/08/05 08:45:23 andreas ** new print routine with additional parameters: ** - print into files ** - fix output length for elements ** corrected error in search routine with parameter ESM_fromStackTop ** ** Revision 1.9 1996/07/17 12:38:58 andreas ** new nextObject to iterate a DicomDataset, DicomFileFormat, Item, ... ** ** Revision 1.8 1996/04/29 15:08:53 hewett ** Replaced DcmItem::findInt(...) with the more general DcmItem::findLong(...). ** ** Revision 1.7 1996/04/16 16:00:05 andreas ** - added const for Tag in newDicomElement ** ** Revision 1.6 1996/03/28 18:52:30 hewett ** Added 2 simple find&get methods (findString & findInt). ** ** Revision 1.5 1996/01/29 13:38:12 andreas ** - new put method for every VR to put value as a string ** - better and unique print methods ** ** Revision 1.4 1996/01/09 11:06:15 andreas ** New Support for Visual C++ ** Correct problems with inconsistent const declarations ** ** Revision 1.3 1996/01/05 13:22:56 andreas ** - changed to support new streaming facilities ** - more cleanups ** - merged read / write methods for block and file transfer ** */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/dcvrsl.h0000644000310500011400000002534411464747623021252 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Gerd Ehlers, Andreas Barth * * Purpose: Interface of class DcmSignedLong * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-11-05 09:34:11 $ * CVS/RCS Revision: $Revision: 1.28 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DCVRSL_H #define DCVRSL_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcelem.h" /** a class representing the DICOM value representation 'Signed Long' (SL) */ class DcmSignedLong : public DcmElement { public: /** constructor. * Create new element from given tag and length. * @param tag DICOM tag for the new element * @param len value length for the new element */ DcmSignedLong(const DcmTag &tag, const Uint32 len = 0); /** copy constructor * @param old element to be copied */ DcmSignedLong(const DcmSignedLong &old); /** destructor */ virtual ~DcmSignedLong(); /** assignment operator * @param obj element to be assigned/copied * @return reference to this object */ DcmSignedLong &operator=(const DcmSignedLong &obj); /** clone method * @return deep copy of this object */ virtual DcmObject *clone() const { return new DcmSignedLong(*this); } /** Virtual object copying. This method can be used for DcmObject * and derived classes to get a deep copy of an object. Internally * the assignment operator is called if the given DcmObject parameter * is of the same type as "this" object instance. If not, an error * is returned. This function permits copying an object by value * in a virtual way which therefore is different to just calling the * assignment operator of DcmElement which could result in slicing * the object. * @param rhs - [in] The instance to copy from. Has to be of the same * class type as "this" object * @return EC_Normal if copying was successful, error otherwise */ virtual OFCondition copyFrom(const DcmObject& rhs); /** get element type identifier * @return type identifier of this class (EVR_SL) */ virtual DcmEVR ident() const; /** check whether stored value conforms to the VR and to the specified VM * @param vm value multiplicity (according to the data dictionary) to be checked for. * (valid values: "1", "1-2", "1-3", "1-8", "1-99", "1-n", "2", "2-n", "2-2n", * "3", "3-n", "3-3n", "4", "6", "9", "16", "32") * @param oldFormat parameter not used for this VR (only for DA, TM, PN) * @return status of the check, EC_Normal if value is correct, an error code otherwise */ virtual OFCondition checkValue(const OFString &vm = "1-n", const OFBool oldFormat = OFFalse); /** get value multiplicity * @return number of currently stored values */ virtual unsigned long getVM(); /** print element to a stream. * The output format of the value is a backslash separated sequence of numbers. * @param out output stream * @param flags optional flag used to customize the output (see DCMTypes::PF_xxx) * @param level current level of nested items. Used for indentation. * @param pixelFileName not used * @param pixelCounter not used */ virtual void print(STD_NAMESPACE ostream&out, const size_t flags = 0, const int level = 0, const char *pixelFileName = NULL, size_t *pixelCounter = NULL); /** get particular integer value * @param sintVal reference to result variable (cleared in case of error) * @param pos index of the value to be retrieved (0..vm-1) * @return status status, EC_Normal if successful, an error code otherwise */ virtual OFCondition getSint32(Sint32 &sintVal, const unsigned long pos = 0); /** get reference to stored integer data. * The number of entries can be determined by "getVM()". * @param sintVals reference to result variable * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition getSint32Array(Sint32 *&sintVals); /** get particular value as a character string * @param stringVal variable in which the result value is stored * @param pos index of the value in case of multi-valued elements (0..vm-1) * @param normalize not used * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition getOFString(OFString &stringVal, const unsigned long pos, OFBool normalize = OFTrue); /** set particular element value to given integer * @param sintVal signed integer value to be set * @param pos index of the value to be set (0 = first position) * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition putSint32(const Sint32 sintVal, const unsigned long pos = 0); /** set element value to given integer array data * @param sintVals signed integer data to be set * @param numSints number of integer values to be set * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition putSint32Array(const Sint32 *sintVals, const unsigned long numSints); /** set element value from the given character string. * The input string is expected to be a backslash separated sequence of * numeric characters, e.g. "-333\-22\-1\0\1\22\333". * @param stringVal input character string * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition putString(const char *stringVal); /** check the currently stored element value * @param autocorrect correct value length if OFTrue * @return status, EC_Normal if value length is correct, an error code otherwise */ virtual OFCondition verify(const OFBool autocorrect = OFFalse); }; #endif // DCVRSL_H /* ** CVS/RCS Log: ** $Log: dcvrsl.h,v $ ** Revision 1.28 2010-11-05 09:34:11 joergr ** Added support for checking the value multiplicity "9" (see Supplement 131). ** ** Revision 1.27 2010-10-14 13:15:43 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.26 2010-04-23 15:26:13 joergr ** Specify an appropriate default value for the "vm" parameter of checkValue(). ** ** Revision 1.25 2010-04-23 14:25:27 joergr ** Added new method to all VR classes which checks whether the stored value ** conforms to the VR definition and to the specified VM. ** ** Revision 1.24 2009-11-04 09:58:07 uli ** Switched to logging mechanism provided by the "new" oflog module ** ** Revision 1.23 2008-07-17 11:19:49 onken ** Updated copyFrom() documentation. ** ** Revision 1.22 2008-07-17 10:30:23 onken ** Implemented copyFrom() method for complete DcmObject class hierarchy, which ** permits setting an instance's value from an existing object. Implemented ** assignment operator where necessary. ** ** Revision 1.21 2006-08-15 15:49:56 meichel ** Updated all code in module dcmdata to correctly compile when ** all standard C++ classes remain in namespace std. ** ** Revision 1.20 2005/12/08 16:29:08 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.19 2004/07/01 12:28:25 meichel ** Introduced virtual clone method for DcmObject and derived classes. ** ** Revision 1.18 2003/06/12 13:29:06 joergr ** Fixed inconsistent API documentation reported by Doxygen. ** ** Revision 1.17 2002/12/06 12:49:18 joergr ** Enhanced "print()" function by re-working the implementation and replacing ** the boolean "showFullData" parameter by a more general integer flag. ** Added doc++ documentation. ** Made source code formatting more consistent with other modules/files. ** ** Revision 1.16 2002/04/25 09:57:08 joergr ** Added getOFString() implementation. ** ** Revision 1.15 2001/09/25 17:19:34 meichel ** Adapted dcmdata to class OFCondition ** ** Revision 1.14 2001/06/01 15:48:52 meichel ** Updated copyright header ** ** Revision 1.13 2000/04/14 15:31:35 meichel ** Removed default value from output stream passed to print() method. ** Required for use in multi-thread environments. ** ** Revision 1.12 2000/03/08 16:26:25 meichel ** Updated copyright header. ** ** Revision 1.11 2000/03/03 14:05:27 meichel ** Implemented library support for redirecting error messages into memory ** instead of printing them to stdout/stderr for GUI applications. ** ** Revision 1.10 2000/02/10 10:50:55 joergr ** Added new feature to dcmdump (enhanced print method of dcmdata): write ** pixel data/item value fields to raw files. ** ** Revision 1.9 1999/03/31 09:25:06 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.8 1998/11/12 16:47:54 meichel ** Implemented operator= for all classes derived from DcmObject. ** ** Revision 1.7 1997/07/21 08:25:15 andreas ** - Replace all boolean types (BOOLEAN, CTNBOOLEAN, DICOM_BOOL, BOOL) ** with one unique boolean type OFBool. ** ** Revision 1.6 1997/04/18 08:13:31 andreas ** - The put/get-methods for all VRs did not conform to the C++-Standard ** draft. Some Compilers (e.g. SUN-C++ Compiler, Metroworks ** CodeWarrier, etc.) create many warnings concerning the hiding of ** overloaded get methods in all derived classes of DcmElement. ** So the interface of all value representation classes in the ** library are changed rapidly, e.g. ** OFCondition get(Uint16 & value, const unsigned long pos); ** becomes ** OFCondition getUint16(Uint16 & value, const unsigned long pos); ** All (retired) "returntype get(...)" methods are deleted. ** For more information see dcmdata/include/dcelem.h ** ** Revision 1.5 1996/08/05 08:45:35 andreas ** new print routine with additional parameters: ** - print into files ** - fix output length for elements ** corrected error in search routine with parameter ESM_fromStackTop ** ** Revision 1.4 1996/01/29 13:38:17 andreas ** - new put method for every VR to put value as a string ** - better and unique print methods ** ** Revision 1.3 1996/01/05 13:23:09 andreas ** - changed to support new streaming facilities ** - more cleanups ** - merged read / write methods for block and file transfer ** */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/dcsequen.h0000644000310500011400000011531711464747623021564 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Gerd Ehlers, Andreas Barth * * Purpose: Interface of class DcmSequenceOfItems * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-11-05 09:34:11 $ * CVS/RCS Revision: $Revision: 1.58 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DCSEQUEN_H #define DCSEQUEN_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/ofstd/offile.h" /* for offile_off_t */ #include "dcmtk/dcmdata/dcelem.h" #include "dcmtk/dcmdata/dctag.h" #include "dcmtk/dcmdata/dclist.h" #include "dcmtk/dcmdata/dcstack.h" /** class representing a DICOM Sequence of Items (SQ). * This class is derived from class DcmElement (and not from DcmObject) despite the fact * that sequences have no value field as such, they maintain a list of items. However, * all APIs in class DcmItem and class DcmDataset accept DcmElements. * This is ugly and causes some DcmElement API methods to be useless with DcmSequence. */ class DcmSequenceOfItems : public DcmElement { public: /** constructor * @param tag attribute tag * @param len length of the attribute value * @param readAsUN flag indicating whether the sequence should be * read (interpreted) as a UN element with Implicit VR Little Endian encoding */ DcmSequenceOfItems(const DcmTag &tag, const Uint32 len = 0, OFBool readAsUN = OFFalse); /** copy constructor * @param oldSeq element to be copied */ DcmSequenceOfItems(const DcmSequenceOfItems& oldSeq); /// destructor virtual ~DcmSequenceOfItems(); /** copy assignment operator * @param obj element to be copied */ DcmSequenceOfItems &operator=(const DcmSequenceOfItems &obj); /// returns current status flag inline OFCondition error() const { return errorFlag; } /** clone method * @return deep copy of this object */ virtual DcmObject *clone() const { return new DcmSequenceOfItems(*this); } /** Virtual object copying. This method can be used for DcmObject * and derived classes to get a deep copy of an object. Internally * the assignment operator is called if the given DcmObject parameter * is of the same type as "this" object instance. If not, an error * is returned. This function permits copying an object by value * in a virtual way which therefore is different to just calling the * assignment operator of DcmElement which could result in slicing * the object. * @param rhs - [in] The instance to copy from. Has to be of the same * class type as "this" object * @return EC_Normal if copying was successful, error otherwise */ virtual OFCondition copyFrom(const DcmObject& rhs); /** return identifier for this class. Every class derived from this class * returns a unique value of type enum DcmEVR for this call. This is used * as a "poor man's RTTI" to correctly identify instances derived from * this class even on compilers not supporting RTTI. * @return type identifier of this class */ virtual DcmEVR ident() const { return EVR_SQ; } /** check if this element is a leaf node in a dataset tree. * All subclasses of DcmElement except for DcmSequenceOfItems * are leaf nodes, while DcmSequenceOfItems, DcmItem, DcmDataset etc. * are not. * @return true if leaf node, false otherwise. */ virtual OFBool isLeaf() const { return OFFalse; } /** print object to a stream * @param out output stream * @param flags optional flag used to customize the output (see DCMTypes::PF_xxx) * @param level current level of nested items. Used for indentation. * @param pixelFileName not used (used in certain sub-classes of this class) * @param pixelCounter not used (used in certain sub-classes of this class) */ virtual void print(STD_NAMESPACE ostream&out, const size_t flags = 0, const int level = 0, const char *pixelFileName = NULL, size_t *pixelCounter = NULL); /** check whether stored value conforms to the VR and to the specified VM * @param card cardinality (number of items) to be checked for. * (valid values: "1", "1-2", "1-3", "1-8", "1-99", "1-n", "2", "2-n", "2-2n", * "3", "3-n", "3-3n", "4", "6", "9", "16", "32"), * parameter used to specify the value multiplicity for non-sequence attributes * @param oldFormat parameter not used for this VR (only for DA, TM, PN) * @return status of the check, EC_Normal if value is correct, an error code otherwise */ virtual OFCondition checkValue(const OFString &card = "1-n", const OFBool oldFormat = OFFalse); /** get value multiplicity * @return always returns 1 (according to the DICOM standard) */ virtual unsigned long getVM() { return 1L; } /** This function takes care of group length and padding elements * in the current element list according to what is specified in * glenc and padenc. If required, this function does the following * two things: * a) it calculates the group length of all groups which are * contained in this item and sets the calculated values * in the corresponding group length elements and * b) it inserts a corresponding padding element (or, in case * of sequences: padding elements) with a corresponding correct * size into the element list. * @param glenc Encoding type for group length; specifies what shall * be done with group length tags. * @param padenc Encoding type for padding; specifies what shall be * done with padding tags. * @param xfer The transfer syntax that shall be used. * @param enctype Encoding type for sequences; specifies how sequences * will be handled. * @param padlen The length up to which the dataset shall be padded, * if padding is desired. * @param subPadlen For sequences (ie sub elements), the length up to * which item shall be padded, if padding is desired. * @param instanceLength Number of extra bytes added to the item/dataset * length used when computing the padding; this * parameter is for instance used to pass the length * of the file meta header from the DcmFileFormat to * the DcmDataset object. * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition computeGroupLengthAndPadding (const E_GrpLenEncoding glenc, const E_PaddingEncoding padenc = EPD_noChange, const E_TransferSyntax xfer = EXS_Unknown, const E_EncodingType enctype = EET_ExplicitLength, const Uint32 padlen = 0, const Uint32 subPadlen = 0, Uint32 instanceLength = 0); /** calculate the length of this DICOM element when encoded with the * given transfer syntax and the given encoding type for sequences. * For elements, the length includes the length of the tag, length field, * VR field and the value itself, for items and sequences it returns * the length of the complete item or sequence including delimitation tags * if applicable. * If length encodig is set to be explicit and the total sequence size is * larger than the available 32-bit length field, then undefined length * is returned. If "dcmWriteOversizedSeqsAndItemsUndefined" is disabled, * also the internal DcmObject errorFlag is set to EC_SeqOrItemContentOverflow * in case the sequence content (excluding tag header etc.) is already too * large. * @param xfer transfer syntax for length calculation * @param enctype sequence encoding type for length calculation * @return length of DICOM element */ virtual Uint32 calcElementLength(const E_TransferSyntax xfer, const E_EncodingType enctype); /** calculate the value length (without attribute tag, VR and length field) * of this DICOM element when encoded with the given transfer syntax and * the given encoding type for sequences. * If length encodig is set to be explicit and the total sequence size is * larger than the available 32-bit length field, then undefined length * is returned. If "dcmWriteOversizedSeqsAndItemsImplicit" is disabled, * also the internal DcmObject errorFlag is set to * EC_SeqOrItemContentOverflow. * @param xfer transfer syntax for length calculation * @param enctype sequence encoding type for length calculation * @return value length of DICOM element */ virtual Uint32 getLength(const E_TransferSyntax xfer = EXS_LittleEndianImplicit, const E_EncodingType enctype = EET_UndefinedLength); /** initialize the transfer state of this object. This method must be called * before this object is written to a stream or read (parsed) from a stream. */ virtual void transferInit(); /** finalize the transfer state of this object. This method must be called * when reading/writing this object from/to a stream has been completed. */ virtual void transferEnd(); /** check if this DICOM object can be encoded in the given transfer syntax. * @param newXfer transfer syntax in which the DICOM object is to be encoded * @param oldXfer transfer syntax in which the DICOM object was read or created. * @return true if object can be encoded in desired transfer syntax, false otherwise. */ virtual OFBool canWriteXfer(const E_TransferSyntax oldXfer, const E_TransferSyntax newXfer); /** This function reads the information of all attributes which * are captured in the input stream and captures this information * in elementList. Each attribute is represented as an element * in this list. If not all information for an attribute could be * read from the stream, the function returns EC_StreamNotifyClient. * @param inStream The stream which contains the information. * @param xfer The transfer syntax which was used to encode * the information in inStream. * @param glenc Encoding type for group length; specifies * what will be done with group length tags. * @param maxReadLength Maximum read length for reading an attribute value. * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition read(DcmInputStream &inStream, const E_TransferSyntax xfer, const E_GrpLenEncoding glenc = EGL_noChange, const Uint32 maxReadLength = DCM_MaxReadLength); /** write object to a stream * @param outStream DICOM output stream * @param oxfer output transfer syntax * @param enctype encoding types (undefined or explicit length) * @param wcache pointer to write cache object, may be NULL * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition write(DcmOutputStream &outStream, const E_TransferSyntax oxfer, const E_EncodingType enctype, DcmWriteCache *wcache); /** write object in XML format * @param out output stream to which the XML document is written * @param flags optional flag used to customize the output (see DCMTypes::XF_xxx) * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition writeXML(STD_NAMESPACE ostream&out, const size_t flags = 0); /** special write method for creation of digital signatures * @param outStream DICOM output stream * @param oxfer output transfer syntax * @param enctype encoding types (undefined or explicit length) * @param wcache pointer to write cache object, may be NULL * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition writeSignatureFormat(DcmOutputStream &outStream, const E_TransferSyntax oxfer, const E_EncodingType enctype, DcmWriteCache *wcache); /** returns true if the current object may be included in a digital signature * @return true if signable, false otherwise */ virtual OFBool isSignable() const; /** returns true if the object contains an element with Unknown VR at any nesting level * @return true if the object contains an element with Unknown VR, false otherwise */ virtual OFBool containsUnknownVR() const; /** check if this object contains non-ASCII characters at any nesting level * @param checkAllStrings if true, also check elements with string values not affected * by SpecificCharacterSet (0008,0005), default: only check PN, LO, LT, SH, ST, UT * @return true if object contains non-ASCII characters, false otherwise */ virtual OFBool containsExtendedCharacters(const OFBool checkAllStrings = OFFalse); /** check if this object is affected by SpecificCharacterSet at any nesting level. * In detail, it is checked whether this object contains any data elements that * according to their VR are affected by the SpecificCharacterSet (0008,0005) * element. This is true for the following VRs: PN, LO, LT, SH, ST and UT * @return true if object is affected by SpecificCharacterSet, false otherwise */ virtual OFBool isAffectedBySpecificCharacterSet() const; /** get cardinality of this sequence * @return number of items in this sequence */ virtual unsigned long card(); /** insert the given item at the start of the item list maintained by this sequence. * Ownership of the item, which must be allocated on the heap, is transferred to the sequence. * @param item pointer to DcmItem instance allocated on the heap, must not be NULL. * @return EC_Normal if successful, an error code otherwise */ virtual OFCondition prepend(DcmItem *item); /** insert the given item at the given position within the item list maintained by this sequence. * Ownership of the item, which must be allocated on the heap, is transferred to the sequence. * @param item pointer to DcmItem instance allocated on the heap, must not be NULL. * @param where index of the item after or before which the new item is to be inserted. * Value must be < card() or equal to DCM_EndOfListIndex. * @param before indicates whether the new item should be inserted before or after the item identified by "where" * @return EC_Normal if successful, an error code otherwise */ virtual OFCondition insert(DcmItem *item, unsigned long where = DCM_EndOfListIndex, OFBool before = OFFalse); /** insert the given item at the end of the item list maintained by this sequence. * Ownership of the item, which must be allocated on the heap, is transferred to the sequence. * @param item pointer to DcmItem instance allocated on the heap, must not be NULL. * @return EC_Normal if successful, an error code otherwise */ virtual OFCondition append(DcmItem *item); /** insert new item a current position. * The current position is stored internally in the 'itemList' member variable. * @param item new item to be inserted * @param before flag indicating whether to insert the item before (OFFalse) or * after (OFTrue) the current position * @return status, EC_Normal upon success, an error code otherwise */ virtual OFCondition insertAtCurrentPos(DcmItem *item, OFBool before = OFFalse); /** access an item from the sequence. This method returns a pointer to one * of the items in the list, and not a copy. * @param num index number of item, must be < card() * @return pointer to item if found, NULL if num >= card() */ virtual DcmItem *getItem(const unsigned long num); /** this method enables a stack based, depth-first traversal of a complete * hierarchical DICOM dataset (that is, classes derived from DcmItem or * DcmSequenceOfItems). With each call of this method, the next object * in the tree is located and marked on the stack. * @param stack "cursor" for current position in the dataset. The stack * will contain a pointer to each dataset, sequence, item and element * from the main dataset down to the current element, and is updated * upon each call to this method. An empty stack is equivalent to a stack * containing a pointer to this object only. * @param intoSub if true, the nextObject method will perform a hierarchical * search through the dataset (depth-first), if false, only the current * container object will be traversed (e.g., all elements of an item * or all items of a sequence). * @return EC_Normal if value length is correct, an error code otherwise */ virtual OFCondition nextObject(DcmStack &stack, const OFBool intoSub); /** this method is only used in container classes, * that is, DcmItem and DcmSequenceOfItems. It returns a pointer to the * next object in the list AFTER the given object. If the caller passes NULL, * a pointer to the first object in the list is returned. If the given object * is not found, the given object is the last one in the list or the list is empty, * NULL is returned. * @param obj pointer to one object in the container; we are looking for the * next entry after this one. NULL if looking for the first entry. * @return pointer to next object in container or NULL if not found */ virtual DcmObject *nextInContainer(const DcmObject *obj); /** remove item from list. If found, the item is not deleted but * returned to the caller who is responsible for further management of the * DcmItem object. * @param num index number of item, must be < card() * @return pointer to DcmItem if found, NULL otherwise */ virtual DcmItem *remove(const unsigned long num); /** remove item from list. If found, the item is not deleted but * returned to the caller who is responsible for further management of the * DcmItem object. * @param item pointer to item to be removed from list * @return pointer to item if found, NULL otherwise */ virtual DcmItem *remove(DcmItem *item); /** check if this sequence is empty * @param normalize not used for this class * @return true if sequence is empty, i.e. has no items, false otherwise */ virtual OFBool isEmpty(const OFBool normalize = OFTrue); /** clear (remove) attribute value * @return EC_Normal if successful, an error code otherwise */ virtual OFCondition clear(); /** check the currently stored element value * @param autocorrect correct value length if OFTrue * @return status, EC_Normal if value length is correct, an error code otherwise */ virtual OFCondition verify(const OFBool autocorrect = OFFalse); /** a complex, stack-based, hierarchical search method. It allows for a search * for a DICOM object with a given attribute within a given container, * hierarchically, from a starting position identified through a cursor stack. * @param xtag the DICOM attribute tag we are searching for * @param resultStack Depending on the search mode (see below), this parameter * either serves as an input and output parameter, or as an output parameter * only (the latter being the default). When used as an input parameter, * the cursor stack defines the start position for the search within a * hierarchical DICOM dataset. Upon successful return, the stack contains * the position of the element found, in the form of a pointer to each dataset, * sequence, item and element from the main dataset down to the found element. * @param mode search mode, controls how the search stack is handled. * In the default mode, ESM_fromHere, the stack is ignored on input, and * the search starts in the object for which this method is called. * In the other modes, the stack is used both as an input and an output * parameter and defines the starting point for the search. * @param searchIntoSub if true, the search will be performed hierarchically descending * into the sequences and items of the dataset. If false, only the current container * (sequence or item) will be traversed. * @return EC_Normal if found, EC_TagNotFound if not found, an error code is something went wrong. */ virtual OFCondition search(const DcmTagKey &xtag, // in DcmStack &resultStack, // inout E_SearchMode mode = ESM_fromHere, // in OFBool searchIntoSub = OFTrue); // in /** this method loads all attribute values maintained by this object and * all sub-objects (in case of a container such as DcmDataset) into memory. * After a call to this method, the file from which a dataset was read may safely * be deleted or replaced. For large files, this method may obviously allocate large * amounts of memory. * @return EC_Normal if successful, an error code otherwise */ virtual OFCondition loadAllDataIntoMemory(void); /** Copy numBytes bytes of data from the attribute value in byteOrder byte order * to targetBuffer, starting at byte offset offset of the attribute value. * This method does not cause the complete attribute value to be read into * main memory. Subsequent calls for the same partial value may cause repeated * access to file if the attribute value is kept in file. * @param targetBuffer pointer to target buffer, must not be NULL. * Buffer size must be at least numBytes bytes. * @param offset byte offset within the attribute value from where to start * copying * @param numBytes number of bytes to copy. * @param cache file cache object that may be passed to multiple subsequent calls * to this method for the same file; the file cache will then keep a file * handle open, thus improving performance. Optional, may be NULL * @param byteOrder byte order desired byte order of attribute value in memory buffer. * Default is the local byte order of the machine. * @return EC_Normal upon success, an error code otherwise */ virtual OFCondition getPartialValue(void *targetBuffer, const Uint32 offset, Uint32 numBytes, DcmFileCache *cache = NULL, E_ByteOrder byteOrder = gLocalByteOrder); protected: /** This function reads tag and length information from inStream and * returns this information to the caller. When reading information, * the transfer syntax which was passed is accounted for. If the * transfer syntax shows an explicit value representation, the data * type of this object is also read from the stream. In general, this * function follows the rules which are specified in the DICOM standard * (see DICOM standard (year 2000) part 5, section 7) (or the corresponding * section in a later version of the standard) concerning the encoding * of a dataset. * @param inStream The stream which contains the information. * @param xfer The transfer syntax which was used to encode the * information in inStream. * @param tag Contains in the end the tag that was read. * @param length Contains in the end the length value that was read. * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition readTagAndLength(DcmInputStream &inStream, // inout const E_TransferSyntax xfer, // in DcmTag &tag, // out Uint32 &length); // out /** helper function for read(). Create sub-object (item, item delimiter or sequence delimiter) of the * appropriate type depending on the tag. * @param subObject upon success, a pointer to the newly created object is returned in this parameter * @param newTag tag of the sub-object to be created * @param newLength length of the sub-object to be created * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition makeSubObject(DcmObject *&subObject, const DcmTag &newTag, const Uint32 newLength); /** helper function for read(). Create sub-object (item or pixel item) * and call read() for this sub-object. * @param inStream The stream which contains the information. * @param newTag attribute tag for sub-object * @param newLength length of the sub-object to be created * @param xfer The transfer syntax which was used to encode * the information in inStream. * @param glenc Encoding type for group length; specifies * what will be done with group length tags. * @param maxReadLength Maximum read length for reading an attribute value. * @return status, EC_Normal if successful, an error code otherwise */ OFCondition readSubItem(DcmInputStream &inStream, // inout const DcmTag &newTag, // in const Uint32 newLength, // in const E_TransferSyntax xfer, // in const E_GrpLenEncoding glenc, // in const Uint32 maxReadLength = DCM_MaxReadLength); // in /** helper function for search(). May only be called if item list is non-empty. * Performs hierarchical search for given tag and pushes pointer of sub-element * on result stack if found * @param tag tag key to be searched * @param resultStack upon successful return, pointer to element pushed onto this stack * @param searchIntoSub flag indicating whether recursive search is desired * @return EC_Normal if tag found and stack modified, EC_TagNotFound if tag not found and stack unmodified */ virtual OFCondition searchSubFromHere(const DcmTagKey &tag, // in DcmStack &resultStack, // inout const OFBool searchIntoSub); // in /// the list of items maintained by this sequence object DcmList *itemList; private: /** static helper method used in writeSignatureFormat(). * This function resembles DcmObject::writeTagAndLength() * but only writes the tag, VR and reserved field. * @param outStream stream to write to * @param tag attribute tag * @param vr attribute VR as reported by getVR * @param oxfer output transfer syntax * @return EC_Normal if successful, an error code otherwise */ static OFCondition writeTagAndVR(DcmOutputStream &outStream, const DcmTag &tag, DcmEVR vr, const E_TransferSyntax oxfer); /** flag used during suspended I/O. Indicates whether the last item * was completely or only partially read/written during the last call * to read/write. */ OFBool lastItemComplete; /** used during reading. Contains the position in the stream where * the sequence started (needed for calculating the remaining number of * bytes available for a fixed-length sequence). */ offile_off_t fStartPosition; /** true if this sequence has been instantiated while reading an UN element * with undefined length */ OFBool readAsUN_; }; #endif // DCSEQUEN_H /* ** CVS/RCS Log: ** $Log: dcsequen.h,v $ ** Revision 1.58 2010-11-05 09:34:11 joergr ** Added support for checking the value multiplicity "9" (see Supplement 131). ** ** Revision 1.57 2010-10-14 13:15:42 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.56 2010-04-23 15:28:02 joergr ** Specify an appropriate default value for the "vm" parameter of checkValue(). ** ** Revision 1.55 2010-04-23 14:27:30 joergr ** Added new method to all VR classes which checks whether the stored value ** conforms to the VR definition and to the specified VM. ** ** Revision 1.54 2010-03-01 09:08:44 uli ** Removed some unnecessary include directives in the headers. ** ** Revision 1.53 2010-02-22 11:39:54 uli ** Remove some unneeded includes. ** ** Revision 1.52 2009-08-07 14:40:39 joergr ** Enhanced isEmpty() method by checking whether the data element value consists ** of non-significant characters only. ** ** Revision 1.51 2009-03-25 10:22:09 joergr ** Added new method isEmpty() to DICOM object, item and sequence class. ** ** Revision 1.50 2009-03-05 14:07:56 onken ** Fixed typo. ** ** Revision 1.49 2009-03-05 13:35:48 onken ** Added checks for sequence and item lengths which prevents overflow in length ** field, if total length of contained items (or sequences) exceeds ** 32-bit length field. Also introduced new flag (default: enabled) ** for writing in explicit length mode, which allows for automatically ** switching encoding of only that very sequence/item to undefined ** length coding (thus permitting to actually write the file). ** ** Revision 1.48 2009-02-04 17:52:17 joergr ** Fixes various type mismatches reported by MSVC introduced with OFFile class. ** ** Revision 1.47 2008-12-12 11:44:40 onken ** Moved path access functions to separate classes ** ** Revision 1.46 2008-12-05 13:28:14 onken ** Splitted findOrCreatePath() function API for also offering a simple API ** for non-wildcard searches. ** ** Revision 1.45 2008-12-04 16:55:14 onken ** Changed findOrCreatePath() to also support wildcard as item numbers. ** ** Revision 1.44 2008-10-15 12:31:20 onken ** Added findOrCreatePath() functions which allow for finding or creating a ** hierarchy of sequences, items and attributes according to a given "path" ** string. ** ** Revision 1.43 2008-07-17 11:19:49 onken ** Updated copyFrom() documentation. ** ** Revision 1.42 2008-07-17 10:36:56 onken ** *** empty log message *** ** ** Revision 1.41 2008-07-17 10:30:23 onken ** Implemented copyFrom() method for complete DcmObject class hierarchy, which ** permits setting an instance's value from an existing object. Implemented ** assignment operator where necessary. ** ** Revision 1.40 2008-06-23 12:09:13 joergr ** Fixed inconsistencies in Doxygen API documentation. ** ** Revision 1.39 2007/11/29 14:30:19 meichel ** Write methods now handle large raw data elements (such as pixel data) ** without loading everything into memory. This allows very large images to ** be sent over a network connection, or to be copied without ever being ** fully in memory. ** ** Revision 1.38 2007/06/29 14:17:49 meichel ** Code clean-up: Most member variables in module dcmdata are now private, ** not protected anymore. ** ** Revision 1.37 2007/02/19 15:04:34 meichel ** Removed searchErrors() methods that are not used anywhere and added ** error() methods only in the DcmObject subclasses where really used. ** ** Revision 1.36 2006/12/15 14:18:07 joergr ** Added new method that checks whether a DICOM object or element is affected ** by SpecificCharacterSet (0008,0005). ** ** Revision 1.35 2006/12/13 13:58:15 joergr ** Added new optional parameter "checkAllStrings" to method containsExtended ** Characters(). ** ** Revision 1.34 2006/08/15 15:49:56 meichel ** Updated all code in module dcmdata to correctly compile when ** all standard C++ classes remain in namespace std. ** ** Revision 1.33 2006/05/30 15:00:57 joergr ** Added missing method containsExtendedCharacters(). ** ** Revision 1.32 2005/12/08 16:28:41 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.31 2005/05/10 15:27:14 meichel ** Added support for reading UN elements with undefined length according ** to CP 246. The global flag dcmEnableCP246Support allows to revert to the ** prior behaviour in which UN elements with undefined length were parsed ** like a normal explicit VR SQ element. ** ** Revision 1.30 2004/07/01 12:28:25 meichel ** Introduced virtual clone method for DcmObject and derived classes. ** ** Revision 1.29 2003/08/08 13:29:13 joergr ** Added new method insertAtCurrentPos() which allows for a much more efficient ** insertion (avoids re-searching for the correct position). ** ** Revision 1.28 2002/12/06 12:49:13 joergr ** Enhanced "print()" function by re-working the implementation and replacing ** the boolean "showFullData" parameter by a more general integer flag. ** Added doc++ documentation. ** Made source code formatting more consistent with other modules/files. ** ** Revision 1.27 2002/08/27 16:55:39 meichel ** Initial release of new DICOM I/O stream classes that add support for stream ** compression (deflated little endian explicit VR transfer syntax) ** ** Revision 1.26 2002/04/25 09:43:56 joergr ** Added support for XML output of DICOM objects. ** ** Revision 1.25 2001/11/19 15:23:10 meichel ** Cleaned up signature code to avoid some gcc warnings. ** ** Revision 1.24 2001/11/16 15:54:39 meichel ** Adapted digital signature code to final text of supplement 41. ** ** Revision 1.23 2001/09/25 17:19:28 meichel ** Adapted dcmdata to class OFCondition ** ** Revision 1.22 2001/06/01 15:48:43 meichel ** Updated copyright header ** ** Revision 1.21 2000/11/07 16:56:09 meichel ** Initial release of dcmsign module for DICOM Digital Signatures ** ** Revision 1.20 2000/04/14 15:31:33 meichel ** Removed default value from output stream passed to print() method. ** Required for use in multi-thread environments. ** ** Revision 1.19 2000/03/08 16:26:17 meichel ** Updated copyright header. ** ** Revision 1.18 2000/03/03 14:05:25 meichel ** Implemented library support for redirecting error messages into memory ** instead of printing them to stdout/stderr for GUI applications. ** ** Revision 1.17 2000/02/10 10:50:53 joergr ** Added new feature to dcmdump (enhanced print method of dcmdata): write ** pixel data/item value fields to raw files. ** ** Revision 1.16 1999/03/31 09:24:46 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.15 1998/11/12 16:47:44 meichel ** Implemented operator= for all classes derived from DcmObject. ** ** Revision 1.14 1998/07/15 15:48:52 joergr ** Removed several compiler warnings reported by gcc 2.8.1 with ** additional options, e.g. missing copy constructors and assignment ** operators, initialization of member variables in the body of a ** constructor instead of the member initialization list, hiding of ** methods by use of identical names, uninitialized member variables, ** missing const declaration of char pointers. Replaced tabs by spaces. ** ** Revision 1.13 1997/07/21 08:25:10 andreas ** - Replace all boolean types (BOOLEAN, CTNBOOLEAN, DICOM_BOOL, BOOL) ** with one unique boolean type OFBool. ** ** Revision 1.12 1997/07/07 07:42:05 andreas ** - Changed parameter type DcmTag & to DcmTagKey & in all search functions ** in DcmItem, DcmSequenceOfItems, DcmDirectoryRecord and DcmObject ** ** Revision 1.11 1997/05/27 13:48:29 andreas ** - Add method canWriteXfer to class DcmObject and all derived classes. ** This method checks whether it is possible to convert the original ** transfer syntax to an new transfer syntax. The check is used in the ** dcmconv utility to prohibit the change of a compressed transfer ** syntax to a uncompressed. ** ** Revision 1.10 1997/05/16 08:23:48 andreas ** - Revised handling of GroupLength elements and support of ** DataSetTrailingPadding elements. The enumeratio E_GrpLenEncoding ** got additional enumeration values (for a description see dctypes.h). ** addGroupLength and removeGroupLength methods are replaced by ** computeGroupLengthAndPadding. To support Padding, the parameters of ** element and sequence write functions changed. ** - Added a new method calcElementLength to calculate the length of an ** element, item or sequence. For elements it returns the length of ** tag, length field, vr field, and value length, for item and ** sequences it returns the length of the whole item. sequence including ** the Delimitation tag (if appropriate). It can never return ** UndefinedLength. ** ** Revision 1.9 1997/04/24 12:09:02 hewett ** Fixed DICOMDIR generation bug affecting ordering of ** patient/study/series/image records (item insertion into a sequence ** did produce the expected ordering). ** ** Revision 1.8 1996/08/05 08:45:28 andreas ** new print routine with additional parameters: ** - print into files ** - fix output length for elements ** corrected error in search routine with parameter ESM_fromStackTop ** ** Revision 1.7 1996/07/17 12:38:59 andreas ** new nextObject to iterate a DicomDataset, DicomFileFormat, Item, ... ** ** Revision 1.6 1996/01/29 13:38:14 andreas ** - new put method for every VR to put value as a string ** - better and unique print methods ** ** Revision 1.5 1996/01/24 09:34:56 andreas ** Support for 64 bit long ** ** Revision 1.4 1996/01/09 11:06:16 andreas ** New Support for Visual C++ ** Correct problems with inconsistent const declarations ** ** Revision 1.3 1996/01/05 13:22:59 andreas ** - changed to support new streaming facilities ** - more cleanups ** - merged read / write methods for block and file transfer ** */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/cmdlnarg.h0000644000310500011400000000534111455601174021525 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Andrew Hewett * * Purpose: Provide prototype of command line argument gathering routine * for OS environments which cannot pass arguments on the command line. * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:15:40 $ * CVS/RCS Revision: $Revision: 1.10 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef CMDLNARG_H #define CMDLNARG_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ /** this function is used on certain operating systems (in particular, classic MacOS) * and allows command line arguments to be input from stdin. * MT level: Thread unsafe! * @param argc the argc parameter of main() is passed in this parameter * @param argv the argv parameter of main() is passed in this parameter * @param progname program name */ void prepareCmdLineArgs(int& argc, char** argv, const char* progname = "aProgram"); #endif /* ** CVS/RCS Log: ** $Log: cmdlnarg.h,v $ ** Revision 1.10 2010-10-14 13:15:40 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.9 2009-11-04 09:58:07 uli ** Switched to logging mechanism provided by the "new" oflog module ** ** Revision 1.8 2007-11-29 14:30:35 meichel ** Updated doxygen API documentation ** ** Revision 1.7 2005/12/08 16:27:58 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.6 2001/06/01 15:48:31 meichel ** Updated copyright header ** ** Revision 1.5 2000/04/14 16:01:22 meichel ** Minor changes for thread safety. ** ** Revision 1.4 2000/03/08 16:26:10 meichel ** Updated copyright header. ** ** Revision 1.3 1999/03/31 09:24:28 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.2 1996/09/27 08:22:21 hewett ** Added defines to protect from multiple inclusion. ** ** Revision 1.1 1996/09/24 16:17:59 hewett ** Moved from dcmdata/apps and dcmnet/apps (now part of the dcmdata library). ** ** Revision 1.2 1996/09/03 11:39:01 hewett ** Added copyright information. ** ** Revision 1.1.1.1 1996/03/26 18:38:44 hewett ** Initial Release. ** ** Revision 1.1.1.1 1996/03/25 15:17:00 hewett ** dcmnet DICOM network libraries. Adapted from CEN network libraries ** for use with the DICOM C++ dcmdata toolkit. ** ** Revision 1.1 1996/03/12 15:08:05 hewett ** Main program argc, argv handling for environments which do not make ** argc,argv available in main(). ** ** */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/dcvras.h0000644000310500011400000001440111464747623021227 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Gerd Ehlers, Andreas Barth * * Purpose: Interface of class DcmAgeString * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-11-05 09:34:11 $ * CVS/RCS Revision: $Revision: 1.19 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DCVRAS_H #define DCVRAS_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcbytstr.h" /** a class representing the DICOM value representation 'Age String' (AS) */ class DcmAgeString : public DcmByteString { public: /** constructor. * Create new element from given tag and length. * @param tag DICOM tag for the new element * @param len value length for the new element */ DcmAgeString(const DcmTag &tag, const Uint32 len = 0); /** copy constructor * @param old element to be copied */ DcmAgeString(const DcmAgeString &old); /** destructor */ virtual ~DcmAgeString(void); /** assignment operator * @param obj element to be assigned/copied * @return reference to this object */ DcmAgeString &operator=(const DcmAgeString &obj); /** clone method * @return deep copy of this object */ virtual DcmObject *clone() const { return new DcmAgeString(*this); } /** Virtual object copying. This method can be used for DcmObject * and derived classes to get a deep copy of an object. Internally * the assignment operator is called if the given DcmObject parameter * is of the same type as "this" object instance. If not, an error * is returned. This function permits copying an object by value * in a virtual way which therefore is different to just calling the * assignment operator of DcmElement which could result in slicing * the object. * @param rhs - [in] The instance to copy from. Has to be of the same * class type as "this" object * @return EC_Normal if copying was successful, error otherwise */ virtual OFCondition copyFrom(const DcmObject& rhs); /** get element type identifier * @return type identifier of this class (EVR_AS) */ virtual DcmEVR ident(void) const; /** check whether stored value conforms to the VR and to the specified VM * @param vm value multiplicity (according to the data dictionary) to be checked for. * (valid values: "1", "1-2", "1-3", "1-8", "1-99", "1-n", "2", "2-n", "2-2n", * "3", "3-n", "3-3n", "4", "6", "9", "16", "32") * @param oldFormat parameter not used for this VR (only for DA, TM, PN) * @return status of the check, EC_Normal if value is correct, an error code otherwise */ virtual OFCondition checkValue(const OFString &vm = "1-n", const OFBool oldFormat = OFFalse); /* --- static helper functions --- */ /** check whether given string value conforms to the VR "AS" (Age String) * and to the specified VM. * @param value string value to be checked (possibly multi-valued) * @param vm value multiplicity (according to the data dictionary) to be checked for. * (valid values: "1", "1-2", "1-3", "1-8", "1-99", "1-n", "2", "2-n", "2-2n", * "3", "3-n", "3-3n", "4", "6", "9", "16", "32") * @return status of the check, EC_Normal if value is correct, an error code otherwise */ static OFCondition checkStringValue(const OFString &value, const OFString &vm = "1-n"); }; #endif // DCVRAS_H /* ** CVS/RCS Log: ** $Log: dcvras.h,v $ ** Revision 1.19 2010-11-05 09:34:11 joergr ** Added support for checking the value multiplicity "9" (see Supplement 131). ** ** Revision 1.18 2010-10-14 13:15:42 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.17 2010-04-23 15:26:12 joergr ** Specify an appropriate default value for the "vm" parameter of checkValue(). ** ** Revision 1.16 2010-04-23 14:25:27 joergr ** Added new method to all VR classes which checks whether the stored value ** conforms to the VR definition and to the specified VM. ** ** Revision 1.15 2010-04-22 09:31:30 joergr ** Revised misleading parameter documentation for the checkValue() method. ** ** Revision 1.14 2010-04-22 08:59:10 joergr ** Added support for further VM values ("1-8", "1-99", "16", "32") to be checked. ** ** Revision 1.13 2009-08-03 09:05:30 joergr ** Added methods that check whether a given string value conforms to the VR and ** VM definitions of the DICOM standards. ** ** Revision 1.12 2008-07-17 11:19:49 onken ** Updated copyFrom() documentation. ** ** Revision 1.11 2008-07-17 10:30:23 onken ** Implemented copyFrom() method for complete DcmObject class hierarchy, which ** permits setting an instance's value from an existing object. Implemented ** assignment operator where necessary. ** ** Revision 1.10 2005-12-08 16:28:52 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.9 2004/07/01 12:28:25 meichel ** Introduced virtual clone method for DcmObject and derived classes. ** ** Revision 1.8 2002/12/06 12:49:13 joergr ** Enhanced "print()" function by re-working the implementation and replacing ** the boolean "showFullData" parameter by a more general integer flag. ** Added doc++ documentation. ** Made source code formatting more consistent with other modules/files. ** ** Revision 1.7 2001/06/01 15:48:48 meichel ** Updated copyright header ** ** Revision 1.6 2000/03/08 16:26:21 meichel ** Updated copyright header. ** ** Revision 1.5 1999/03/31 09:24:55 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.4 1998/11/12 16:47:45 meichel ** Implemented operator= for all classes derived from DcmObject. ** ** Revision 1.3 1996/01/05 13:23:02 andreas ** - changed to support new streaming facilities ** - more cleanups ** - merged read / write methods for block and file transfer ** */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/dcswap.h0000644000310500011400000000773211455601176021227 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Andreas Barth * * Purpose: byte order functions * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:15:42 $ * CVS/RCS Revision: $Revision: 1.19 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DCSWAP_H #define DCSWAP_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcerror.h" #include "dcmtk/dcmdata/dcxfer.h" /* for E_ByteOrder */ /** swap block of data from big-endian to little-endian or back if neccessary * @param newByteOrder desired byte order of data block * @param oldByteOrder current byte order of data block * @param value pointer to block of data * @param byteLength size of data block in bytes * @param valWidth size of each value in the data block, in bytes * @return EC_Normal if successful, an error code otherwise */ OFCondition swapIfNecessary( const E_ByteOrder newByteOrder, const E_ByteOrder oldByteOrder, void * value, const Uint32 byteLength, const size_t valWidth); /** swap block of data from big-endian to little-endian or back * @param value pointer to block of data * @param byteLength size of data block in bytes * @param valWidth size of each value in the data block, in bytes */ void swapBytes( void * value, const Uint32 byteLength, const size_t valWidth); /** swap an Uint16 number from big-endian to little-endian or back * @param toSwap number to be swapped * @return swapped number */ Uint16 swapShort(const Uint16 toSwap); /** swap a sequence of two bytes from big-endian to little-endian or back * @param toSwap pointer to object to swap */ inline void swap2Bytes(Uint8 * toSwap) // swaps [byte0][byte1] to [byte1][byte0] { Uint8 tmp = toSwap[0]; toSwap[0] = toSwap[1]; toSwap[1] = tmp; } /** swap a sequence of four bytes from big-endian to little-endian or back * @param toSwap pointer to object to swap */ inline void swap4Bytes(Uint8 * toSwap) // swaps [byte0][byte1][byte2][byte3] to [byte3][byte2][byte1][byte0] { Uint8 tmp = toSwap[0]; toSwap[0] = toSwap[3]; toSwap[3] = tmp; tmp = toSwap[1]; toSwap[1] = toSwap[2]; toSwap[2] = tmp; } #endif // DCSWAP_H /* * CVS/RCS Log: * $Log: dcswap.h,v $ * Revision 1.19 2010-10-14 13:15:42 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.18 2010-03-01 09:08:44 uli * Removed some unnecessary include directives in the headers. * * Revision 1.17 2009-11-04 09:58:07 uli * Switched to logging mechanism provided by the "new" oflog module * * Revision 1.16 2007-11-29 14:30:35 meichel * Updated doxygen API documentation * * Revision 1.15 2005/12/08 16:28:43 meichel * Changed include path schema for all DCMTK header files * * Revision 1.14 2002/11/27 12:07:23 meichel * Adapted module dcmdata to use of new header file ofstdinc.h * * Revision 1.13 2001/11/01 14:41:43 wilkens * Added lots of comments. * * Revision 1.12 2001/09/25 17:19:29 meichel * Adapted dcmdata to class OFCondition * * Revision 1.11 2001/06/01 15:48:44 meichel * Updated copyright header * * Revision 1.10 2000/03/08 16:26:18 meichel * Updated copyright header. * * Revision 1.9 2000/02/23 15:11:39 meichel * Corrected macro for Borland C++ Builder 4 workaround. * * Revision 1.8 2000/02/01 10:12:02 meichel * Avoiding to include as extern "C" on Borland C++ Builder 4, * workaround for bug in compiler header files. * * Revision 1.7 1999/06/10 10:44:50 meichel * Replaced some #if statements by more robust #ifdef * * Revision 1.6 1999/03/31 09:24:48 meichel * Updated copyright header in module dcmdata * * */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/dctagkey.h0000644000310500011400000003055111457770510021535 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Andrew Hewett * * Purpose: Basis class for dicom tags. * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-21 07:52:40 $ * CVS/RCS Revision: $Revision: 1.23 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DCMTAGKEY_H #define DCMTAGKEY_H 1 #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/ofstd/ofstream.h" #include "dcmtk/ofstd/ofstring.h" /* ** Defines */ /// macro for an "undefined" attribute tag that is never used in DICOM #define DCM_UndefinedTagKey DcmTagKey(0xffff, 0xffff) /** class maintaining a attribute tag (group and element number) */ class DcmTagKey { public: /** default constructor */ DcmTagKey(); /** copy constructor * @param key [in] The tag key to initialize from */ DcmTagKey(const DcmTagKey& key); /** constructor * @param g group * @param e element */ DcmTagKey(Uint16 g, Uint16 e); /** destructor */ virtual ~DcmTagKey(); /** set value to given tag key * @param key attribute tag to copy */ void set(const DcmTagKey& key); /** set value to given group and element * @param g group * @param e element */ void set(Uint16 g, Uint16 e); /** set group to given number * @param g group */ void setGroup(Uint16 g); /** set element to given number * @param e element */ void setElement(Uint16 e); /** returns group number * @return returns the group number of the tag key */ Uint16 getGroup() const; /** returns element number * @return Returns the element number of the tag key */ Uint16 getElement() const; /** checks whether the tag key is a valid group length element. * Also calls hasValidGroup(). * @return returns OFTrue if tag key is a valid group length element */ OFBool isGroupLength() const; /** returns true if the tag key is private, ie. whether it has an odd group * number. Also hasValidGroup() is called. * @return returns OFTrue if group is private and valid. */ OFBool isPrivate() const; /** returns true, if tag is a private reservation tag * of the form (gggg,00xx) with gggg being odd and * xx in the range of 10 and FF. * @return returns OFTrue if tag key is a private reservation key */ OFBool isPrivateReservation() const; /** returns true, if group is valid (permitted in DICOM files). * Referring to the standard, groups 1, 3, 5, 7 and 0xFFFF are illegal. * @return returns OFTrue if tag key has a valid group number. */ OFBool hasValidGroup() const; /** generate a simple hash code for this attribute tag, * used for fast look-up in the DICOM dictionary * @return hash code for this tag */ Uint32 hash() const; // generate simple hash code /** assignment operator for initializing this tag * key from an existing one. * @param key [in] The key to copy from * @return "this" initialization */ DcmTagKey& operator = (const DcmTagKey& key); /** Comparison operator. Returns true if both group and * element number are the same. * @param key key to compare with * @return true if tag keys are the same */ int operator == (const DcmTagKey& key) const; /** negation operator. Returns true if either group or element number * are not the same. * @param key key to compare with * @return true if tag keys are not the same */ int operator != (const DcmTagKey& key) const; /** 'less than' operator. Returns true if the given tag key is greater * than "this". * @param key key to compare with * @return true if given key is greater than "this" */ int operator < (const DcmTagKey& key) const; /** 'greater than' operator. Returns true if the given tag key is smaller * than "this". * @param key key to compare with * @return true if "this" key is smaller than given one. */ int operator > (const DcmTagKey& key) const; /** 'less or equal' operator. Returns true if the given tag key is greater * or the same as "this". * @param key key to compare with * @return true if given key is greater or the same as "this" */ int operator <= (const DcmTagKey& key) const; /** 'greater or equal' operator. Returns true if the given tag key is * smaller or equal as "this". * @param key key to compare with * @return true if "this" key is smaller or equal to given one. */ int operator >= (const DcmTagKey& key) const; friend STD_NAMESPACE ostream& operator<<(STD_NAMESPACE ostream& s, const DcmTagKey& k); /** convert tag key to string having the form "(gggg,eeee)". * @return the string representation of this tag key */ OFString toString() const; /** returns true if a data element with the given tag key can * be digitally signed, false otherwise * @return true if signable, false otherwise */ OFBool isSignableTag() const; protected: /// less-than operation comparing only group numbers int groupLT(const DcmTagKey& key) const; /// greater-than operation comparing only group numbers int groupGT(const DcmTagKey& key) const; /// comparison operation comparing only group numbers int groupEQ(const DcmTagKey& key) const; /// less-than operation comparing only element numbers int elementLT(const DcmTagKey& key) const; /// greater-than operation comparing only element numbers int elementGT(const DcmTagKey& key) const; /// comparison operation comparing only element numbers int elementEQ(const DcmTagKey& key) const; private: /// tag group number Uint16 group; /// tag element number Uint16 element; }; /** stream output operator for tag keys * @param s output stream * @param k tag key * @return reference to output stream */ STD_NAMESPACE ostream& operator<<(STD_NAMESPACE ostream& s, const DcmTagKey& k); /* ** inline versions of functions */ /* constructors and destructor */ inline DcmTagKey::DcmTagKey() : group(0xffff), element(0xffff) { } inline DcmTagKey::DcmTagKey(const DcmTagKey& key) : group(key.group), element(key.element) { } inline DcmTagKey::DcmTagKey(Uint16 g, Uint16 e) : group(g), element(e) { } inline DcmTagKey::~DcmTagKey() { } /* access methods */ inline void DcmTagKey::set(const DcmTagKey& key) { group = key.group; element = key.element; } inline void DcmTagKey::set(Uint16 g, Uint16 e) { group = g; element = e; } inline void DcmTagKey::setGroup(Uint16 g) { group = g; } inline void DcmTagKey::setElement(Uint16 e) { element = e; } inline Uint16 DcmTagKey::getGroup() const { return group; } inline Uint16 DcmTagKey::getElement() const { return element; } inline OFBool DcmTagKey::isGroupLength() const { return (element == 0) && hasValidGroup(); } inline OFBool DcmTagKey::isPrivate() const { return ((group & 1) != 0 ) && hasValidGroup(); } inline OFBool DcmTagKey::isPrivateReservation() const { // private reservation has element number ranging from 0x0010 to 0x00FF return isPrivate() && (element >= 0x10) && (element <= 0xFF); } inline OFBool DcmTagKey::hasValidGroup() const { // group numbers 1, 3, 5, 7 and 0xFFFF are illegal in DICOM if (((group & 1) != 0) && ((group <= 7) || (group == 0xFFFF))) return OFFalse; else return OFTrue; } inline DcmTagKey& DcmTagKey::operator=(const DcmTagKey& key) { set(key); return *this; } /* Simple Hash Function */ inline Uint32 DcmTagKey::hash() const { // generate simple hash code return (((getGroup() << 16) & 0xffff0000) | (getElement() & 0xffff)); } /* Comparisons */ inline int DcmTagKey::groupLT(const DcmTagKey& key) const { return (getGroup() < key.getGroup()); } inline int DcmTagKey::groupGT(const DcmTagKey& key) const { return (getGroup() > key.getGroup()); } inline int DcmTagKey::groupEQ(const DcmTagKey& key) const { return getGroup() == key.getGroup(); } inline int DcmTagKey::elementLT(const DcmTagKey& key) const { return (getElement() < key.getElement()); } inline int DcmTagKey::elementGT(const DcmTagKey& key) const { return (getElement() > key.getElement()); } inline int DcmTagKey::elementEQ(const DcmTagKey& key) const { return getElement() == key.getElement(); } inline int DcmTagKey::operator == (const DcmTagKey& key) const { return ( groupEQ(key) && elementEQ(key) ); } inline int DcmTagKey::operator != (const DcmTagKey& key) const { return !(*this == key); } inline int DcmTagKey::operator < (const DcmTagKey& key) const { return (groupLT(key) || (groupEQ(key) && elementLT(key))); } inline int DcmTagKey::operator > (const DcmTagKey& key) const { return (groupGT(key) || (groupEQ(key) && elementGT(key))); } inline int DcmTagKey::operator <= (const DcmTagKey& key) const { return (*this < key) || (*this == key); } inline int DcmTagKey::operator >= (const DcmTagKey& key) const { return (*this > key) || (*this == key); } #endif /* ** CVS/RCS Log: ** $Log: dctagkey.h,v $ ** Revision 1.23 2010-10-21 07:52:40 joergr ** Added virtual destructor in order to avoid warnings reported by gcc with ** additional flags. ** ** Revision 1.22 2010-10-14 13:15:42 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.21 2010-03-01 09:08:44 uli ** Removed some unnecessary include directives in the headers. ** ** Revision 1.20 2009-04-20 16:00:08 joergr ** Added method that checks whether the tag key is a valid group length element. ** ** Revision 1.19 2009-01-15 16:06:27 onken ** Added convenience methods for private tag handling. Added doxygen ** documentation for not or badly documented member functions. ** ** Revision 1.18 2007-11-29 14:30:35 meichel ** Updated doxygen API documentation ** ** Revision 1.17 2006/08/15 15:49:56 meichel ** Updated all code in module dcmdata to correctly compile when ** all standard C++ classes remain in namespace std. ** ** Revision 1.16 2005/12/08 16:28:45 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.15 2004/01/16 14:08:00 joergr ** Removed acknowledgements with e-mail addresses from CVS log. ** ** Revision 1.14 2003/11/13 14:06:36 meichel ** Fixed definition of DCM_UndefinedTagKey ** ** Revision 1.13 2003/11/05 15:56:31 meichel ** Added declaration of operator<< for DcmTagKeys. ** Fixes compilation issue on Visual C++ 6.0 SP 0. ** ** Revision 1.12 2002/04/16 13:41:44 joergr ** Added configurable support for C++ ANSI standard includes (e.g. streams). ** ** Revision 1.11 2001/11/19 15:23:11 meichel ** Cleaned up signature code to avoid some gcc warnings. ** ** Revision 1.10 2001/11/16 15:54:40 meichel ** Adapted digital signature code to final text of supplement 41. ** ** Revision 1.9 2001/06/01 15:48:45 meichel ** Updated copyright header ** ** Revision 1.8 2000/11/07 16:56:10 meichel ** Initial release of dcmsign module for DICOM Digital Signatures ** ** Revision 1.7 2000/03/08 16:26:19 meichel ** Updated copyright header. ** ** Revision 1.6 2000/02/07 14:45:16 meichel ** Removed const qualifier from DcmTagKey::toString(), avoids warning on Irix. ** ** Revision 1.5 1999/03/31 09:24:49 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.4 1999/03/17 11:08:54 meichel ** added method DcmTagKey::toString() ** ** Revision 1.3 1998/07/15 15:48:54 joergr ** Removed several compiler warnings reported by gcc 2.8.1 with ** additional options, e.g. missing copy constructors and assignment ** operators, initialization of member variables in the body of a ** constructor instead of the member initialization list, hiding of ** methods by use of identical names, uninitialized member variables, ** missing const declaration of char pointers. Replaced tabs by spaces. ** ** Revision 1.2 1997/08/26 13:45:54 hewett ** Added simple hash function method. ** ** Revision 1.1 1995/11/23 16:38:04 hewett ** Updated for loadable data dictionary + some cleanup (more to do). ** */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/dctag.h0000644000310500011400000002372311455601176021026 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Gerd Ehlers, Andrew Hewett * * Purpose: Definition of the class DcmTag * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:15:42 $ * CVS/RCS Revision: $Revision: 1.24 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DCTAG_H #define DCTAG_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/ofstd/ofcond.h" #include "dcmtk/dcmdata/dctagkey.h" #include "dcmtk/dcmdata/dcvr.h" /// default attribute name for unknown attributes #define DcmTag_ERROR_TagName "Unknown Tag & Data" /** this class encapsulates an attribute tag (group, element) and a VR. * It maintains a private creator name for private tags and caches * the attribute name, once it is looked up in the data dictionary. * This class maintains the interface to the DICOM data dictionary, * i.e. performs look-ups of attribute VR and name in the background. * Therefore, creation of DcmTag element is significantly more expensive * than creation of simple DcmTagKey objects unless the VR is passed * in the constructor. */ class DcmTag: public DcmTagKey { public: /// default constructor DcmTag(); /** constructor. * Initializes group/element from given tag key and performs * a dictionary lookup for the VR. The lookup only considers * standard tags, tags with private creator are ignored. * @param akey tag key */ DcmTag(const DcmTagKey& akey); /** constructor. * Initializes group/element from given parameters and performs * a dictionary lookup for the VR. The lookup only considers * standard tags, tags with private creator are ignored. * @param g tag group * @param e tag element */ DcmTag(Uint16 g, Uint16 e); /** constructor. * Initializes group/element and VR from given parameters. * No dictionary lookup needed/performed. * @param akey tag key * @param avr VR */ DcmTag(const DcmTagKey& akey, const DcmVR& avr); /** constructor. * Initializes group/element and VR from given parameters. * No dictionary lookup needed/performed. * @param g tag group * @param e tag element * @param avr VR */ DcmTag(Uint16 g, Uint16 e, const DcmVR& avr); /// copy constructor DcmTag(const DcmTag& tag); /// destructor ~DcmTag(); /// copy assignment operator DcmTag& operator=(const DcmTag& tag); /// set specific VR DcmVR setVR(const DcmVR& avr); /// returns VR object by value DcmVR getVR() const { return vr; } /// returns VR code DcmEVR getEVR() const { return vr.getEVR(); } /// returns name of VR const char* getVRName() const { return vr.getVRName(); } /** returns tag group * @return tag group */ Uint16 getGTag() const { return getGroup(); } /** returns tag element * @return tag element */ Uint16 getETag() const { return getElement(); } /** returns a copy of the tag key by value * @return copy of tag key, by value */ DcmTagKey getXTag() const { return * OFstatic_cast(const DcmTagKey *, this); } /** returns name of attribute tag. * If name has not been accessed before, a dictionary lookup * under consideration of the current private creator code * is performed. If no attribute name is found, a default * name is used. Never returns NULL. * @return attribute tag name, never NULL. */ const char* getTagName(); /** returns the current private creator string for this object * if any, NULL otherwise. * @return creator code if present, NULL otherwise */ const char* getPrivateCreator() const; /** assigns a private creator code and deletes a possibly * cached attribute name since the attribute name could * change if a different private creator code is used. * @param privCreator private creator code, may be NULL */ void setPrivateCreator(const char *privCreator); /** performs a look-up of the VR for the current tag key in the dictionary, * under consideration of the private creator (if defined). * If a dictionary entry is found, the VR of this object is copied * from the dictionary entry, otherwise the VR remains unmodified. */ void lookupVRinDictionary(); /** returns true if a data element with the given tag and VR * can be digitally signed, false otherwise * @return true if signable, false otherwise */ OFBool isSignable() const; /** returns true if the VR used for writing is "UN" */ OFBool isUnknownVR() const; /// returns current status flag OFCondition error() const { return errorFlag; } // --- static helper functions --- /** convert the given string to a DICOM tag value * @param name name or tag of the attribute to be searched for. * If the name of the attribute is given the spelling has to be consistent * with the spelling used in the data dictionary (e.g. "PatientName"). * If the tag values are used the format is "gggg,eeee" (i.e. two hexa- * decimal numbers separated by a comma). * @param value variable in which the resulting tag value is stored. * If this functions fails to find the specified tag, this variable * remains unchanged. * @return status, EC_Normal upon success, an error code otherwise */ static OFCondition findTagFromName(const char *name, DcmTag &value); private: /** replace tagName with copy of given string * @param c new tag name */ void updateTagName(const char *c); /** replace privateCreator with copy of given string * @param c new private creator */ void updatePrivateCreator(const char *c); /// VR of this attribute tag DcmVR vr; /// name of this attribute tag, remains NULL unless getTagName() is called char *tagName; /// private creator code, remains NULL unless setPrivateCreator() is called char *privateCreator; /// current error code, EC_Normal if a valid VR for the tag is known OFCondition errorFlag; }; // *** global constants ******************************** #define ItemTag (DcmTag(DCM_Item)) #define InternalUseTag (DcmTag(DcmTagKey(0xfffe, 0xfffe))) #endif /* !DCTAG_H */ /* ** CVS/RCS Log: ** $Log: dctag.h,v $ ** Revision 1.24 2010-10-14 13:15:42 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.23 2010-08-09 13:02:57 joergr ** Updated data dictionary to 2009 edition of the DICOM standard. From now on, ** the official "keyword" is used for the attribute name which results in a ** number of minor changes (e.g. "PatientsName" is now called "PatientName"). ** ** Revision 1.22 2009-11-04 09:58:07 uli ** Switched to logging mechanism provided by the "new" oflog module ** ** Revision 1.21 2005-12-08 16:28:44 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.20 2003/08/14 09:00:56 meichel ** Adapted type casts to new-style typecast operators defined in ofcast.h ** ** Revision 1.19 2002/07/23 14:21:27 meichel ** Added support for private tag data dictionaries to dcmdata ** ** Revision 1.18 2002/05/24 09:49:13 joergr ** Renamed some parameters/variables to avoid ambiguities. ** ** Revision 1.17 2002/04/30 13:12:12 joergr ** Added static helper function to convert strings (tag names or group/element ** numbers) to DICOM tag objects. ** ** Revision 1.16 2001/11/19 15:23:10 meichel ** Cleaned up signature code to avoid some gcc warnings. ** ** Revision 1.15 2001/11/16 15:54:40 meichel ** Adapted digital signature code to final text of supplement 41. ** ** Revision 1.14 2001/09/25 17:19:29 meichel ** Adapted dcmdata to class OFCondition ** ** Revision 1.13 2001/06/01 15:48:45 meichel ** Updated copyright header ** ** Revision 1.12 2000/04/14 16:00:58 meichel ** Restructured class DcmTag. Instances don't keep a permanent pointer ** to a data dictionary entry anymore. Required for MT applications. ** ** Revision 1.11 2000/03/08 16:26:19 meichel ** Updated copyright header. ** ** Revision 1.10 1999/03/31 09:24:49 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.9 1998/07/15 15:48:54 joergr ** Removed several compiler warnings reported by gcc 2.8.1 with ** additional options, e.g. missing copy constructors and assignment ** operators, initialization of member variables in the body of a ** constructor instead of the member initialization list, hiding of ** methods by use of identical names, uninitialized member variables, ** missing const declaration of char pointers. Replaced tabs by spaces. ** ** Revision 1.8 1997/05/06 09:26:44 hewett ** The DcmTag::getVMMax() method now returns a maximum value if the attribute ** is unknown. This makes the default VM=1-n (before it was VM=1). ** ** Revision 1.7 1997/03/26 17:18:01 hewett ** Added member function to obtain a DcmTag's data dictionary reference. ** ** Revision 1.6 1996/04/19 08:37:21 andreas ** correct bug with DEBUG and not DEBUG parts. It was not possible to compile ** the dcmdata library with DEBUG and programs using dcmdata without DEBUG ** (and vice versa) ** ** Revision 1.5 1996/03/13 14:48:32 hewett ** Added useful VR access methods. ** ** Revision 1.4 1996/03/12 15:32:49 hewett ** Added constructor with parameter to explicity set the VR. ** ** Revision 1.3 1996/01/05 13:23:01 andreas ** - changed to support new streaming facilities ** - more cleanups ** - merged read / write methods for block and file transfer ** ** Revision 1.2 1995/11/23 16:38:03 hewett ** Updated for loadable data dictionary + some cleanup (more to do). ** */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/dchashdi.h0000644000310500011400000003006311466505066021511 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Andrew Hewett * * Purpose: Hash table interface for DICOM data dictionary * * Last Update: $Author: uli $ * Update Date: $Date: 2010-11-10 12:04:06 $ * CVS/RCS Revision: $Revision: 1.22 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DCHASHDI_H #define DCHASHDI_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/ofstd/oflist.h" #include "dcmtk/ofstd/ofstream.h" class DcmDictEntry; class DcmTagKey; class DcmHashDict; /** the default size for a data dictionary hash table */ const int DCMHASHDICT_DEFAULT_HASHSIZE = 2047; /// typedefs needed for MSVC5 typedef OFListIterator(DcmDictEntry *) OFListIteratorPDcmDictEntry; typedef OFListConstIterator(DcmDictEntry *) OFListConstIteratorPDcmDictEntry; /** iterator class for traversing a DcmDictEntryList */ class DcmDictEntryListIterator: public OFListIteratorPDcmDictEntry { public: /// default constructor DcmDictEntryListIterator() {} /** constructor * @param iter reference to an object of the base class */ DcmDictEntryListIterator(const OFListIterator(DcmDictEntry*)& iter) : OFListIterator(DcmDictEntry*)(iter) {} /// copy assignment operator DcmDictEntryListIterator& operator=(const DcmDictEntryListIterator& i) { OFListIteratorPDcmDictEntry::operator=(i); return *this; } }; /** const_iterator class for traversing a DcmDictEntryList */ class DcmDictEntryListConstIterator: public OFListConstIteratorPDcmDictEntry { public: /// default constructor DcmDictEntryListConstIterator() {} /** constructor * @param iter reference to an object of the base class */ DcmDictEntryListConstIterator(const OFListConstIterator(DcmDictEntry*)& iter) : OFListConstIterator(DcmDictEntry*)(iter) {} /// copy assignment operator DcmDictEntryListConstIterator& operator=(const DcmDictEntryListConstIterator& i) { OFListConstIteratorPDcmDictEntry::operator=(i); return *this; } }; /** an ordered list of pointers to DcmDictEntry objects */ class DcmDictEntryList : public OFList { public: /// constructor DcmDictEntryList() {} /// destructor ~DcmDictEntryList(); /// clears list and deletes all entries void clear(); /** inserts an entry into the list and returns any replaced entry * @param e new list entry * @return replaced list entry or NULL */ DcmDictEntry* insertAndReplace(DcmDictEntry* e); /* find an entry in the set */ DcmDictEntry *find(const DcmTagKey& k, const char *privCreator); private: /// private undefined copy constructor DcmDictEntryList(const DcmDictEntryList&); /// private undefined copy assignment operator DcmDictEntryList& operator=(const DcmDictEntryList&); }; /** iterator class for traversing a DcmHashDict */ class DcmHashDictIterator { public: /// default constructor DcmHashDictIterator() : dict(NULL), hindex(0), iterating(OFFalse), iter() { init(NULL); } /** constructor, creates iterator to existing hash dictionary * @param d pointer to dictionary * @param atEnd if true, iterator points after last element * of hash dictionary, otherwise iterator points to first element. */ DcmHashDictIterator(const DcmHashDict* d, OFBool atEnd = OFFalse) : dict(NULL), hindex(0), iterating(OFFalse), iter() { init(d, atEnd); } /// copy constructor DcmHashDictIterator(const DcmHashDictIterator& i) : dict(i.dict), hindex(i.hindex), iterating(i.iterating), iter(i.iter) { } /// copy assignment operator DcmHashDictIterator& operator=(const DcmHashDictIterator& i) { dict = i.dict; hindex = i.hindex; iterating = i.iterating; iter = i.iter; return *this; } /// comparison equality OFBool operator==(const DcmHashDictIterator& x) const { return (hindex == x.hindex) && (iter == x.iter); } /// comparison non-equality OFBool operator!=(const DcmHashDictIterator& x) const { return !(*this == x); } /// dereferencing of iterator const DcmDictEntry* operator*() const { return (*iter); } /// pre-increment operator DcmHashDictIterator& operator++() { stepUp(); return *this; } /// post-increment operator DcmHashDictIterator operator++(int) { DcmHashDictIterator tmp(*this); stepUp(); return tmp; } private: /** initializes the iterator * @param d pointer to hash dictionary, may be NULL * @param atEnd if true, iterator points after last element * of hash dictionary, otherwise iterator points to first element. */ void init(const DcmHashDict *d, OFBool atEnd = OFFalse); /** implements increment operator on hash dictionary */ void stepUp(); /// pointer to the hash dictionary this iterator traverses const DcmHashDict* dict; /// index of current bucket int hindex; /// flag indicating if iter is currently valid OFBool iterating; /// iterator for traversing a bucket in the hash table DcmDictEntryListIterator iter; }; /** a hash table of pointers to DcmDictEntry objects */ class DcmHashDict { public: /** constructor * @param hashTabLen number of buckets in hash table */ DcmHashDict(int hashTabLen = DCMHASHDICT_DEFAULT_HASHSIZE) : hashTab(NULL), hashTabLength(0), lowestBucket(0), highestBucket(0), entryCount(0) { _init(hashTabLen); } /// destructor ~DcmHashDict(); /// counts total number of entries int size() const { return entryCount; } /// clears the hash table of all entries void clear(); /** inserts an entry into hash table (deletes old entry if present) * @param e pointer to new entry */ void put(DcmDictEntry* e); /** hash table lookup for the given tag key and private creator name. * @param key tag key * @param privCreator private creator name, may be NULL */ const DcmDictEntry* get(const DcmTagKey& key, const char *privCreator) const; /** deletes the entry for the given tag and private creator * @param k tag key * @param privCreator private creator name, may be NULL */ void del(const DcmTagKey& k, const char *privCreator); // iterator over the contents of the hash table friend class DcmHashDictIterator; /// returns iterator to start of hash table DcmHashDictIterator begin() const { DcmHashDictIterator iter(this); return iter; } /// returns iterator to end of hash table DcmHashDictIterator end() const { DcmHashDictIterator iter(this, OFTrue); return iter; } /// prints some information about hash table bucket utilization STD_NAMESPACE ostream& loadSummary(STD_NAMESPACE ostream& out); private: /// private unimplemented copy constructor DcmHashDict(const DcmHashDict &); /// private unimplemented copy assignment operator DcmHashDict &operator=(const DcmHashDict &); /// performs initialization for given hash table size, called from constructor void _init(int hashSize); /** compute hash value for given tag key * @param k pointer to tag key * @return hash value */ int hash(const DcmTagKey* k) const; /** inserts new entry into given list * @param lst list to add to * @param e new element to add, will be deleted upon destruction of the hash table * @return pointer to replaced element, if any */ DcmDictEntry* insertInList(DcmDictEntryList& lst, DcmDictEntry* e); /** removes the entry for the given tag and private creator * @param lst list to remove from * @param k tag key * @param privCreator private creator name, may be NULL * @return pointer to removed element, if any */ DcmDictEntry* removeInList(DcmDictEntryList& lst, const DcmTagKey& k, const char *privCreator); /** searcjes entry for the given tag and private creator * @param lst list to search in * @param k tag key * @param privCreator private creator name, may be NULL * @return pointer to found element, NULL if not found */ DcmDictEntry* findInList(DcmDictEntryList& lst, const DcmTagKey& k, const char *privCreator) const; /** array of (hash table size) pointers to DcmDictEntryList elements * implementing the different buckets of the hash table */ DcmDictEntryList** hashTab; /// number of buckets in hash table int hashTabLength; /// index of lowest bucket for which the DcmDictEntryList has been initialized int lowestBucket; /// index of highest bucket for which the DcmDictEntryList has been initialized int highestBucket; /// number of entries in hash table int entryCount; }; #endif /* DCHASHDI_H */ /* ** CVS/RCS Log: ** $Log: dchashdi.h,v $ ** Revision 1.22 2010-11-10 12:04:06 uli ** Corrected DcmHashDictIterator::operator!=. Previously it ignored hindex. ** ** Revision 1.21 2010-10-14 13:15:41 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.20 2009-01-05 14:14:14 joergr ** Fixed bug in DcmHashDictIterator::operator!=() introduced with last commit. ** Reverted to old implementation. ** ** Revision 1.19 2008-12-19 14:57:59 joergr ** Fixed bug in DcmHashDictIterator::operator!=() - wrong comparison operand. ** ** Revision 1.18 2006/08/15 15:49:56 meichel ** Updated all code in module dcmdata to correctly compile when ** all standard C++ classes remain in namespace std. ** ** Revision 1.17 2005/12/08 16:28:14 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.16 2003/07/03 15:38:10 meichel ** Introduced DcmDictEntryListConstIterator, needed for compiling with HAVE_STL. ** ** Revision 1.15 2003/06/12 13:35:04 joergr ** Fixed inconsistent API documentation reported by Doxygen. ** ** Revision 1.14 2003/06/03 10:26:17 meichel ** Renamed local variables to avoid name clashes with STL ** ** Revision 1.13 2003/06/02 17:03:58 meichel ** Added typedef needed by MSVC5 when compiling with STL support ** ** Revision 1.12 2003/03/21 13:06:46 meichel ** Minor code purifications for warnings reported by MSVC in Level 4 ** ** Revision 1.11 2002/07/23 14:21:26 meichel ** Added support for private tag data dictionaries to dcmdata ** ** Revision 1.10 2001/06/01 15:48:40 meichel ** Updated copyright header ** ** Revision 1.9 2000/05/03 14:19:08 meichel ** Added new class GlobalDcmDataDictionary which implements read/write lock ** semantics for safe access to the DICOM dictionary from multiple threads ** in parallel. The global dcmDataDict now uses this class. ** ** Revision 1.8 2000/03/08 16:26:15 meichel ** Updated copyright header. ** ** Revision 1.7 1999/03/31 09:24:39 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.6 1998/07/15 15:48:48 joergr ** Removed several compiler warnings reported by gcc 2.8.1 with ** additional options, e.g. missing copy constructors and assignment ** operators, initialization of member variables in the body of a ** constructor instead of the member initialization list, hiding of ** methods by use of identical names, uninitialized member variables, ** missing const declaration of char pointers. Replaced tabs by spaces. ** ** Revision 1.5 1997/09/18 11:41:13 meichel ** Corrected forward and friend declarations (needed for DEC cxx). ** ** Revision 1.4 1997/09/18 07:24:07 meichel ** Missing operator= added to class DcmDictEntryListIterator ** ** Revision 1.3 1997/08/29 13:11:09 andreas ** Corrected copy constructor for DcmHashDictIterator ** ** Revision 1.2 1997/08/26 13:41:11 hewett ** Corrected a couple of minor spelling errors. ** ** Revision 1.1 1997/08/26 13:30:29 hewett ** Initial Version - Interface for hash table data structure for data dictionary. ** */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/dcvrof.h0000644000310500011400000001055211455601177021224 0ustar joergrdicom3/* * * Copyright (C) 2002-2010, 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: dcmdata * * Author: Joerg Riesmeier * * Purpose: Interface of class DcmOtherFloat * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:15:43 $ * CVS/RCS Revision: $Revision: 1.9 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DCVROF_H #define DCVROF_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcvrfl.h" /** a class representing the DICOM value representation 'Other Float String' (OF) */ class DcmOtherFloat : public DcmFloatingPointSingle { public: /** constructor. * Create new element from given tag and length. * @param tag DICOM tag for the new element * @param len value length for the new element */ DcmOtherFloat(const DcmTag &tag, const Uint32 len = 0); /** copy constructor * @param old element to be copied */ DcmOtherFloat(const DcmOtherFloat &old); /** destructor */ virtual ~DcmOtherFloat(); /** assignment operator * @param obj element to be assigned/copied * @return reference to this object */ DcmOtherFloat &operator=(const DcmOtherFloat &obj); /** clone method * @return deep copy of this object */ virtual DcmObject *clone() const { return new DcmOtherFloat(*this); } /** Virtual object copying. This method can be used for DcmObject * and derived classes to get a deep copy of an object. Internally * the assignment operator is called if the given DcmObject parameter * is of the same type as "this" object instance. If not, an error * is returned. This function permits copying an object by value * in a virtual way which therefore is different to just calling the * assignment operator of DcmElement which could result in slicing * the object. * @param rhs - [in] The instance to copy from. Has to be of the same * class type as "this" object * @return EC_Normal if copying was successful, error otherwise */ virtual OFCondition copyFrom(const DcmObject& rhs); /** get element type identifier * @return type identifier of this class (EVR_OF) */ virtual DcmEVR ident() const; /** check whether stored value conforms to the VR and to the specified VM * @param vm parameter not used for this VR * @param oldFormat parameter not used for this VR (only for DA, TM, PN) * @return always returns EC_Normal, i.e. currently no checks are performed */ virtual OFCondition checkValue(const OFString &vm = "", const OFBool oldFormat = OFFalse); /** get value multiplicity * @return always returns 1 (according to the DICOM standard) */ virtual unsigned long getVM(); }; #endif // DCVROF_H /* * CVS/RCS Log: * $Log: dcvrof.h,v $ * Revision 1.9 2010-10-14 13:15:43 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.8 2010-04-23 15:26:13 joergr * Specify an appropriate default value for the "vm" parameter of checkValue(). * * Revision 1.7 2010-04-23 14:25:27 joergr * Added new method to all VR classes which checks whether the stored value * conforms to the VR definition and to the specified VM. * * Revision 1.6 2009-11-04 09:58:07 uli * Switched to logging mechanism provided by the "new" oflog module * * Revision 1.5 2008-07-17 11:19:49 onken * Updated copyFrom() documentation. * * Revision 1.4 2008-07-17 10:30:23 onken * Implemented copyFrom() method for complete DcmObject class hierarchy, which * permits setting an instance's value from an existing object. Implemented * assignment operator where necessary. * * Revision 1.3 2005-12-08 16:29:04 meichel * Changed include path schema for all DCMTK header files * * Revision 1.2 2004/07/01 12:28:25 meichel * Introduced virtual clone method for DcmObject and derived classes. * * Revision 1.1 2002/12/06 12:06:39 joergr * Added support for new value representation Other Float String (OF). * * */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/dcddirif.h0000644000310500011400000023177111465001157021512 0ustar joergrdicom3/* * * Copyright (C) 2002-2010, 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: dcmdata * * Author: Joerg Riesmeier * * Purpose: Interface class for simplified creation of a DICOMDIR * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-11-05 13:11:11 $ * CVS/RCS Revision: $Revision: 1.23 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DCDDIRIF_H #define DCDDIRIF_H #include "dcmtk/config/osconfig.h" #include "dcmtk/dcmdata/dcdicdir.h" /*-----------------------------------* * contant declarations and macros * *-----------------------------------*/ // default fileset ID #define DEFAULT_FILESETID "DCMTK_MEDIA_DEMO" // default specific character set of fileset descriptor file #define DEFAULT_DESCRIPTOR_CHARSET "ISO_IR 100" /*----------------------* * class declarations * *----------------------*/ /** Abstract interface to plugable image support for the DICOMDIR class. * This is an abstract base class used as an interface to access DICOM * images from the DicomDirInterface. The implementation can be found * in dcmjpeg/libsrc/ddpiimpl.cc (incl. JPEG support). */ class DicomDirImagePlugin { public: /** destructor (virtual) */ virtual ~DicomDirImagePlugin() {} /** scale image (pixel data) to specified size * @param srcData pointer to 8 bit source pixel data (original image) * @param srcWidth width of the source image * @param srcHeight height of the source image * @param dstData pointer to 8 bit destination pixel data (scaled image). * This array needs to be allocated prior to calling this function. * @param dstWidth width of the destination image * @param dstHeight height of the destination image * @return OFTrue if successful, OFFalse otherwise */ virtual OFBool scaleData(const Uint8 *srcData, const unsigned int srcWidth, const unsigned int srcHeight, Uint8 *dstData, const unsigned int dstWidth, const unsigned int dstHeight) const = 0; /** scale image (from DICOM dataset) to specified size * @param dataset DICOM dataset where the pixel data is stored (original image) * @param pixel pointer to 8 bit destination pixel data (scaled image). * This array needs to be allocated prior to calling this function. * @param count number of bytes allocated for the 'pixel' array * @param frame index of the frame to be scaled (0..n-1) * @param width width of the destination image * @param height height of the destination image * @param decompressAll always decompress complete pixel data if true * @return OFTrue if successful, OFFalse otherwise */ virtual OFBool scaleImage(DcmItem *dataset, Uint8 *pixel, const unsigned long count, const unsigned long frame, const unsigned int width, const unsigned int height, const OFBool decompressAll = OFFalse) const = 0; protected: /** constructor (protected) */ DicomDirImagePlugin() {} }; /** An interface class for simplified creation of a DICOMDIR */ class DicomDirInterface { public: /** list of supported media storage application profiles */ enum E_ApplicationProfile { /// General Purpose Interchange on CD-R or DVD-RAM Media (STD-GEN-CD/DVD-RAM) AP_GeneralPurpose, /// default application profile: GeneralPurpose AP_Default = AP_GeneralPurpose, /// General Purpose DVD with Compression Interchange (STD-GEN-DVD) AP_GeneralPurposeDVD, /// General Purpose MIME Interchange Profile (STD-GEN-MIME) AP_GeneralPurposeMIME, /// General Purpose USB and Flash Memory with Compression Interchange (STD-GEN-USB/MMC/CF/SD-JPEG/J2K) AP_USBandFlash, /// DVD Interchange with MPEG2 MP\@ML (STD-DVD-MPEG2-MPML) AP_MPEG2MPatMLDVD, /// Basic Cardiac X-Ray Angiographic Studies on CD-R Media (STD-XABC-CD) AP_BasicCardiac, /// 1024 X-Ray Angiographic Studies on CD-R Media (STD-XA1K-CD) AP_XrayAngiographic, /// 1024 X-Ray Angiographic Studies on DVD Media (STD-XA1K-DVD) AP_XrayAngiographicDVD, /// Dental Radiograph Interchange (STD-DEN-CD) AP_DentalRadiograph, /// CT/MR Studies (STD-CTMR-xxxx) AP_CTandMR, /// Ultrasound Single Frame for Image Display (STD-US-ID-SF-xxxx) AP_UltrasoundIDSF, /// Ultrasound Single Frame with Spatial Calibration (STD-US-SC-SF-xxxx) AP_UltrasoundSCSF, /// Ultrasound Single Frame with Combined Calibration (STD-US-CC-SF-xxxx) AP_UltrasoundCCSF, /// Ultrasound Single & Multi-Frame for Image Display (STD-US-ID-MF-xxxx) AP_UltrasoundIDMF, /// Ultrasound Single & Multi-Frame with Spatial Calibration (STD-UD-SC-MF-xxxx) AP_UltrasoundSCMF, /// Ultrasound Single & Multi-Frame with Combined Calibration (STD-UD-CC-MF-xxxx) AP_UltrasoundCCMF, /// 12-lead ECG Interchange on Diskette (STD-WVFM-ECG-FD) AP_TwelveLeadECG, /// Hemodynamic Waveform Interchange on Diskette (STD-WVFM-HD-FD) AP_HemodynamicWaveform }; /** constructor (default). * No DICOMDIR object is created by default (see methods createNewDicomDir, * appendToDicomDir and updateDicomDir). */ DicomDirInterface(); /** destructor (virtual). * Free all memory allocated by this class. */ virtual ~DicomDirInterface(); /** reset the object to its initial state. * That means e.g. free memory. */ void cleanup(); /** check whether current DICOMDIR is valid. * That means e.g. that it can be written to a file. * @return OFTrue if DICOMDIR is valid, OFFalse otherwise */ OFBool isDicomDirValid() const; /** create a new DICOMDIR object. * This function replaces any previously existing DICOMDIR file with the specified * 'filename'. If the backup mode (see 'enableBackupMode') is enabled a backup * copy ('filename' + ".BAK") is created from the existing file and automatically * deleted after the new file has been written without any errors. * @param profile media storage application profile to be used for the DICOMDIR * @param filename name of the DICOMDIR file to be created (default: 'DICOMDIR'). * The filename may include a fully qualified pathname. * @param filesetID value of the attribute FileSetID (default: 'DCMTK_MEDIA_DEMO') * @return EC_Normal upon success, an error code otherwise */ OFCondition createNewDicomDir(const E_ApplicationProfile profile = AP_GeneralPurpose, const char *filename = DEFAULT_DICOMDIR_NAME, const char *filesetID = DEFAULT_FILESETID); /** create a DICOMDIR object based on an existing DICOMDIR file (append). * This function can be used to append new entries to an existing DICOMDIR file. * If the backup mode (see 'enableBackupMode') is enabled a backup copy ('filename' * + ".BAK") is created from the existing file and automatically deleted after the * new file has been written without any errors. * @param profile media storage application profile to be used for the DICOMDIR. * NB: The same profile should be used as for the creation of the DICOMDIR file. * @param filename name of the DICOMDIR file to be appended. The filename may * include a fully qualified pathname. * @return EC_Normal upon success, an error code otherwise */ OFCondition appendToDicomDir(const E_ApplicationProfile profile, const char *filename); /** create a DICOMDIR object based on an existing DICOMDIR file (update). * This function can be used to append new entries to and update existing entries * in an existing DICOMDIR file. * If the backup mode (see 'enableBackupMode') is enabled a backup copy ('filename' * + ".BAK") is created from the existing file and automatically deleted after the * new file has been written without any errors. * @param profile media storage application profile to be used for the DICOMDIR * @param filename name of the DICOMDIR file to be appended. The filename may * include a fully qualified pathname. * @return EC_Normal upon success, an error code otherwise */ OFCondition updateDicomDir(const E_ApplicationProfile profile, const char *filename); /** write the current DICOMDIR object to file. * NB: The filename has already been specified for the object creation (see above). * @param encodingType flag, specifying the encoding with undefined or explicit length * @param groupLength flag, specifying how to handle the group length tags * @return EC_Normal upon success, an error code otherwise */ OFCondition writeDicomDir(const E_EncodingType encodingType = EET_UndefinedLength, const E_GrpLenEncoding groupLength = EGL_withoutGL); /** check whether specified filename is valid. i.e. conforms to the DICOM standard * requirements (length, number of components and proper characters). This function * is called automatically for the following methods: checkDicomFile(), addDicomFile() * and setFilesetDescriptor(). So usually there's no need to call it manually * (especially not in addition to the above mentioned methods). * @param filename filename to be checked for standard conformance * @param allowEmpty empty filename (zero length) allowed if OFTrue * @return OFTrue if filename is valid, OFFalse otherwise */ OFBool isFilenameValid(const char *filename, const OFBool allowEmpty = OFFalse); /** check whether given charset identifier is valid. * Valid character sets are (see DICOM PS3.3 for details): ISO_IR 100, ISO_IR 101, * ISO_IR 109, ISO_IR 110, ISO_IR 144, ISO_IR 127, ISO_IR 126, ISO_IR 138, ISO_IR 148, * ISO_IR 166, ISO_IR 13, ISO_IR 192. * @param charset character set identifier to be checked * @return OFTrue if charset is valid, OFFalse otherwise */ OFBool isCharsetValid(const char *charset); /** check whether specified DICOM file is suitable to be included into the DICOMDIR. * This method loads the given file and checks whether it conforms to the current * application profile. Since this check is also performed by addDicomFile() there * is usually no need to call this method directly. * @param filename name of the DICOM file to be checked * @param directory directory where the DICOM file is stored (optional). * This parameter might be useful in cases where the DICOM file is not (yet) * stored in the final directory (i.e. "relative" to the DICOMDIR location). * @return EC_Normal upon success, an error code otherwise */ OFCondition checkDicomFile(const char *filename, const char *directory = NULL); /** add specified DICOM file to the current DICOMDIR. * This method loads the given file, checks whether it conforms to the current * application profile and finally adds it to the DICOMDIR (in case of conformance). * @param filename name of the DICOM file to be added * @param directory directory where the DICOM file is stored (optional). * This parameter might be useful in cases where the DICOM file is not (yet) * stored in the final directory (i.e. "relative" to the DICOMDIR location). * @return EC_Normal upon success, an error code otherwise */ OFCondition addDicomFile(const char *filename, const char *directory = NULL); /** set the fileset descriptor file ID and character set. * Prior to any internal modification both 'filename' and 'charset' are checked * using the above checking routines. Existence of 'filename' is not checked. * NB: Requires a DICOMDIR to exist (see createNewDicomDir and appendToDicomDir). * @param filename name of the fileset descriptor file to be set * @param charset character set of the fileset descriptor file to be set. * default: ISO Latin 1 ("ISO_IR 100"), use NULL or empty string to omit value. * @return EC_Normal upon success, an error code otherwise */ OFCondition setFilesetDescriptor(const char *filename, const char *charset = DEFAULT_DESCRIPTOR_CHARSET); /** set preferred size of the icon images. * NB: some application profiles require a particicular icon size. * In those cases this manual setting is implicitly ignored. * @param size size of the icon images in pixels (1..256, initial: 64) * @return EC_Normal upon success, an error code otherwise */ OFCondition setIconSize(const unsigned int size); /** set filename prefix for alternative icon images. * If non-empty the filename prefix is used to create the icon image from an * externally stored PGM (portable gray map, 8 bit binary) file instead of the * DICOM image file. The PGM filename is: 'prefix' + 'dicom_filename'. The * image does not need to have the correct size as it is scaled automatically. * @param prefix filename prefix (NULL to disable = default) * @return always returns EC_Normal */ OFCondition setIconPrefix(const char *prefix); /** set filename of default icon image. * For cases that the icon image cannot be created (neither from PGM nor from * DICOM file, respectively) a default icon (8 bit binary PGM) can be specified. * If this image also fails to load a black icon (filled with zeros) is used. * @param filename name of the default PGM file * @return always returns EC_Normal */ OFCondition setDefaultIcon(const char *filename); /** get current status of the "abort on first error" mode. * See enableAbortMode() for more details. * @return OFTrue if mode is enabled, OFFalse otherwise */ OFBool abortMode() const { return AbortMode; } /** get current status of the "map filenames" mode. * See enableMapFilenamesMode() for more details. * @return OFTrue if mode is enabled, OFFalse otherwise */ OFBool mapFilenamesMode() const { return MapFilenamesMode; } /** get current status of the "invent missing values" mode. * See enableInventMode() for more details. * @return OFTrue if mode is enabled, OFFalse otherwise */ OFBool inventMode() const { return InventMode; } /** get current status of the "invent missing patient ID" mode. * See enableInventPatientIDMode() for more details. * @return OFTrue if mode is enabled, OFFalse otherwise */ OFBool inventPatientIDMode() const { return InventPatientIDMode; } /** get current status of the "retired SOP class support" mode. * See enableRetiredSOPClassSupport() for more details. * @return OFTrue if support is enabled, OFFalse otherwise */ OFBool retiredSOPClassSupport() const { return RetiredSOPClassSupport; } /** get current status of the "create icon images" mode. * See enableIconImageMode() for more details. * @return OFTrue if mode is enabled, OFFalse otherwise */ OFBool iconImageMode() const { return IconImageMode; } /** get current status of the "create backup" mode. * See enableBackupMode() for more details. * @return OFTrue if mode is enabled, OFFalse otherwise */ OFBool backupMode() const { return BackupMode; } /** get current status of the "pixel encoding check" mode. * See disableEncodingCheck() for more details. * @return OFTrue if check is enabled, OFFalse otherwise */ OFBool encodingCheck() const { return EncodingCheck; } /** get current status of the "spatial resolution check" mode. * See disableResolutionCheck() for more details. * @return OFTrue if check is enabled, OFFalse otherwise */ OFBool resolutionCheck() const { return ResolutionCheck; } /** get current status of the "transfer syntax check" mode. * See disableTransferSyntaxCheck() for more details. * @return OFTrue if check is enabled, OFFalse otherwise */ OFBool transferSyntaxCheck() const { return TransferSyntaxCheck; } /** get current status of the "consistency check" mode. * See enableConsistencyCheck() for more details. * @return OFTrue if check is enabled, OFFalse otherwise */ OFBool consistencyCheck() const { return ConsistencyCheck; } /** enable/disable the "abort on first error" mode. * If the mode is enabled addDicomFile() reports an error message and * returns with an error status code if something went wrong. * Default: off, do not abort * @param newMode enable mode if OFTrue, disable if OFFalse * @return previously stored value */ OFBool enableAbortMode(const OFBool newMode = OFTrue); /** enable/disable the "map filenames" mode. * If the mode is enabled filenames are automatically mapped to DICOM format * (convert lower case to upper case characters and remove trailing period). * Default: off, do not map filenames * @param newMode enable mode if OFTrue, disable if OFFalse * @return previously stored value */ OFBool enableMapFilenamesMode(const OFBool newMode = OFTrue); /** enable/disable the "invent missing values" mode. * If the mode is enabled required DICOMDIR attributes (type 1) are * invented when missing in the DICOM file. * Default: off, do not invent attribute values * @param newMode enable mode if OFTrue, disable if OFFalse * @return previously stored value */ OFBool enableInventMode(const OFBool newMode = OFTrue); /** enable/disable the "invent new patient ID" mode. * If the mode is enabled a new PatientID is invented in case of * inconsistent PatientName attributes, i.e. when different patients * share the same ID. * Default: off, do not invent new patient ID * @param newMode enable mode if OFTrue, disable if OFFalse * @return previously stored value */ OFBool enableInventPatientIDMode(const OFBool newMode = OFTrue); /** enable/disable the "retired SOP class support" mode. * If the mode is enabled retired SOP classes defined in previous editions * of the DICOM standard are also accepted. * Default: off, do not accept retired SOP classes * @param newMode enable mode if OFTrue, disable if OFFalse * @return previously stored value */ OFBool enableRetiredSOPClassSupport(const OFBool newMode = OFTrue); /** enable/disable the "create icon images" mode. * If the mode is enabled icon images are created for each IMAGE record. * Please note that particular application profiles (e.g. Basic Cardiac) * require an icon images to be present. Therefore, this mode does not * affect the icon images creation of such profiles. * Default: off, do not create (optional) icon images * @param newMode enable mode if OFTrue, disable if OFFalse * @return previously stored value */ OFBool enableIconImageMode(const OFBool newMode = OFTrue); /** disable/enable the "create backup file" mode. * If this mode is disabled no backup file of an existing DICOMDIR is created. * However, when appending new files to an existing DICOMDIR a _temporary_ * backup file ".$$$" is always created. * Default: on, create a backup file ".BAK" * @param newMode disable mode if OFFalse, enable if OFTrue * @return previously stored value */ OFBool disableBackupMode(const OFBool newMode = OFFalse); /** disable/enable the "pixel encoding check". * If this mode is disabled the pixel encoding is not check for compliance * with the selected application profile. Please use this switch with care * since the resulting DICOMDIR will probably violate the rules for the * selected application profile. * Default: on, check pixel encoding (bits allocated/stored, high bit) * @param newMode disable check if OFFalse, enable if OFTrue * @return previously stored value */ OFBool disableEncodingCheck(const OFBool newMode = OFFalse); /** disable/enable the "spatial resolution check". * If this mode is disabled the spatial resolution is not check for compliance * with the selected application profile. Please use this switch with care * since the resulting DICOMDIR will probably violate the rules for the * selected application profile. * Default: on, check spatial resolution * @param newMode disable check if OFFalse, enable if OFTrue * @return previously stored value */ OFBool disableResolutionCheck(const OFBool newMode = OFFalse); /** disable/enable the "transfer syntax check". * If this mode is disabled the transfer syntax is not check for compliance * with the selected application profile. Please use this switch with care * since the resulting DICOMDIR will probably violate the rules for the * selected application profile. * Default: on, check transfer syntax * @param newMode disable check if OFFalse, enable if OFTrue * @return previously stored value */ OFBool disableTransferSyntaxCheck(const OFBool newMode = OFFalse); /** disable/enable the "consistency check". * If this mode is disabled the consistency of newly added records with * already existing ones is not checked (see 'warnAboutInconsistentAttributes' * for details). * Default: on, perform consistency check * @param newMode disable check if OFFalse, enable if OFTrue * @return previously stored value */ OFBool disableConsistencyCheck(const OFBool newMode = OFFalse); /** add pluggable image support. * NB: This plugin is required to create icon images from DICOM files! * @param plugin pointer to an instance of the plugin implementation. * See class DicomDirImageImplementation (dcmjpeg/include/ddpiimpl.h). * @return OFTrue if successful, OFFalse otherwise */ OFBool addImageSupport(DicomDirImagePlugin *plugin); /* -- static function -- */ /** get name/identifier associated with the given application profile * @param profile media storage application profile * @return name of the application profile (e.g. "STD-GEN-CD/DVD-RAM") */ static const char *getProfileName(const E_ApplicationProfile profile); protected: /** select given application profile * @param profile storage media application profile to be selected * @return EC_Normal upon success, an error code otherwise */ OFCondition selectApplicationProfile(const E_ApplicationProfile profile); /** load and check DICOM file regarding the current application profile * @param filename name of the DICOM file to be checked * @param directory directory where the DICOM file is stored (optional) * @param fileformat object in which the loaded data is stored * @return EC_Normal upon success, an error code otherwise */ OFCondition loadAndCheckDicomFile(const char *filename, const char *directory, DcmFileFormat &fileformat); /** check SOP class and transfer syntax for compliance with current profile * @param metainfo object where the DICOM file meta information is stored * @param dataset object where the DICOM dataset is stored * @param filename name of the DICOM file to be checked * @return EC_Normal upon success, an error code otherwise */ OFCondition checkSOPClassAndXfer(DcmMetaInfo *metainfo, DcmItem *dataset, const char *filename); /** check attributes for compliance with Basic Cardiac application profile * @param dataset object where the DICOM dataset is stored * @param filename name of the DICOM file to be checked * @return EC_Normal upon success, an error code otherwise */ OFCondition checkBasicCardiacAttributes(DcmItem *dataset, const char *filename); /** check attributes for compliance with X-ray Angiography application profile * @param dataset object where the DICOM dataset is stored * @param sopClass SOP class of the DICOM data to be checked * @param filename name of the DICOM file to be checked * @return EC_Normal upon success, an error code otherwise */ OFCondition checkXrayAngiographicAttributes(DcmItem *dataset, const OFString &sopClass, const char *filename); /** check attributes for compliance with dental radiograph application profile * @param dataset object where the DICOM dataset is stored * @param filename name of the DICOM file to be checked * @return EC_Normal upon success, an error code otherwise */ OFCondition checkDentalRadiographAttributes(DcmItem *dataset, const char *filename); /** check attributes for compliance with CT and MR application profile * @param dataset object where the DICOM dataset is stored * @param sopClass SOP class of the DICOM data to be checked * @param filename name of the DICOM file to be checked * @return EC_Normal upon success, an error code otherwise */ OFCondition checkCTandMRAttributes(DcmItem *dataset, const OFString &sopClass, const char *filename); /** check attributes for compliance with Ultrasound application profiles * @param dataset object where the DICOM dataset is stored * @param transferSyntax transfer syntax of the DICOM data to be checked * @param filename name of the DICOM file to be checked * @return EC_Normal upon success, an error code otherwise */ OFCondition checkUltrasoundAttributes(DcmItem *dataset, const OFString &transferSyntax, const char *filename); /** check attributes for comliance with current application profile * @param metainfo object where the DICOM file meta information is stored * @param dataset object where the DICOM dataset is stored * @param filename name of the DICOM file to be checked * @return EC_Normal upon success, an error code otherwise */ OFCondition checkMandatoryAttributes(DcmMetaInfo *metainfo, DcmItem *dataset, const char *filename); /** check whether given directory record matches dataset. * The check depends on the record type and is performed mainly based on * the unique key defined for the particular record type (e.g. SOPInstanceUID * for IMAGE records). For PATIENT records the PatientName may also be used * if the PatientID is absent. * @param record directory record to be checked * @param dataset DICOM dataset of the current file * @return OFTrue if record matches, OFFalse otherwise */ OFBool recordMatchesDataset(DcmDirectoryRecord *record, DcmItem *dataset); /** search for a given directory record * @param parent higher-level structure where the records are stored * @param recordType type of directory record to be searched for * @param dataset DICOM dataset of the current file * @return pointer to record if found, NULL otherwise */ DcmDirectoryRecord *findExistingRecord(DcmDirectoryRecord *parent, const E_DirRecType recordType, DcmItem* dataset); /** create or update patient record and copy required values from dataset * @param record record to be updated, use NULL to create a new one * @param dataset DICOM dataset of the current file * @param sourceFilename name of the source DICOM file * @return pointer to new or updated record, NULL if an error occurred */ DcmDirectoryRecord *buildPatientRecord(DcmDirectoryRecord *record, DcmItem *dataset, const OFString &sourceFilename); /** create or update study record and copy required values from dataset * @param record record to be updated, use NULL to create a new one * @param dataset DICOM dataset of the current file * @param sourceFilename name of the source DICOM file * @return pointer to new or updated record, NULL if an error occurred */ DcmDirectoryRecord *buildStudyRecord(DcmDirectoryRecord *record, DcmItem *dataset, const OFString &sourceFilename); /** create or update new series record and copy required values from dataset * @param record record to be updated, use NULL to create a new one * @param dataset DICOM dataset of the current file * @param sourceFilename name of the source DICOM file * @return pointer to new or updated record, NULL if an error occurred */ DcmDirectoryRecord *buildSeriesRecord(DcmDirectoryRecord *record, DcmItem *dataset, const OFString &sourceFilename); /** create or update overlay record and copy required values from dataset * @param record record to be updated, use NULL to create a new one * @param dataset DICOM dataset of the current file * @param referencedFileID value of the Referenced File ID attribute * @param sourceFilename name of the source DICOM file * @return pointer to new or updated record, NULL if an error occurred */ DcmDirectoryRecord *buildOverlayRecord(DcmDirectoryRecord *record, DcmItem *dataset, const OFString &referencedFileID, const OFString &sourceFilename); /** create or update modality LUT record and copy required values from dataset * @param record record to be updated, use NULL to create a new one * @param dataset DICOM dataset of the current file * @param referencedFileID value of the Referenced File ID attribute * @param sourceFilename name of the source DICOM file * @return pointer to new or updated record, NULL if an error occurred */ DcmDirectoryRecord *buildModalityLutRecord(DcmDirectoryRecord *record, DcmItem *dataset, const OFString &referencedFileID, const OFString &sourceFilename); /** create or update VOI LUT record and copy required values from dataset * @param record record to be updated, use NULL to create a new one * @param dataset DICOM dataset of the current file * @param referencedFileID value of the Referenced File ID attribute * @param sourceFilename name of the source DICOM file * @return pointer to new or updated record, NULL if an error occurred */ DcmDirectoryRecord *buildVoiLutRecord(DcmDirectoryRecord *record, DcmItem *dataset, const OFString &referencedFileID, const OFString &sourceFilename); /** create or update curve record and copy required values from dataset * @param record record to be updated, use NULL to create a new one * @param dataset DICOM dataset of the current file * @param referencedFileID value of the Referenced File ID attribute * @param sourceFilename name of the source DICOM file * @return pointer to new or updated record, NULL if an error occurred */ DcmDirectoryRecord *buildCurveRecord(DcmDirectoryRecord *record, DcmItem *dataset, const OFString &referencedFileID, const OFString &sourceFilename); /** create or update structure reporting record and copy required values from dataset * @param record record to be updated, use NULL to create a new one * @param dataset DICOM dataset of the current file * @param referencedFileID value of the Referenced File ID attribute * @param sourceFilename name of the source DICOM file * @return pointer to new or updated record, NULL if an error occurred */ DcmDirectoryRecord *buildStructReportRecord(DcmDirectoryRecord *record, DcmItem *dataset, const OFString &referencedFileID, const OFString &sourceFilename); /** create or update presentation state record and copy required values from dataset * @param record record to be updated, use NULL to create a new one * @param dataset DICOM dataset of the current file * @param referencedFileID value of the Referenced File ID attribute * @param sourceFilename name of the source DICOM file * @return pointer to new or updated record, NULL if an error occurred */ DcmDirectoryRecord *buildPresentationRecord(DcmDirectoryRecord *record, DcmItem *dataset, const OFString &referencedFileID, const OFString &sourceFilename); /** create or update waveform record and copy required values from dataset * @param record record to be updated, use NULL to create a new one * @param dataset DICOM dataset of the current file * @param referencedFileID value of the Referenced File ID attribute * @param sourceFilename name of the source DICOM file * @return pointer to new or updated record, NULL if an error occurred */ DcmDirectoryRecord *buildWaveformRecord(DcmDirectoryRecord *record, DcmItem *dataset, const OFString &referencedFileID, const OFString &sourceFilename); /** create or update RT dose record and copy required values from dataset * @param record record to be updated, use NULL to create a new one * @param dataset DICOM dataset of the current file * @param referencedFileID value of the Referenced File ID attribute * @param sourceFilename name of the source DICOM file * @return pointer to new or updated record, NULL if an error occurred */ DcmDirectoryRecord *buildRTDoseRecord(DcmDirectoryRecord *record, DcmItem *dataset, const OFString &referencedFileID, const OFString &sourceFilename); /** create or update RT structure set record and copy required values from dataset * @param record record to be updated, use NULL to create a new one * @param dataset DICOM dataset of the current file * @param referencedFileID value of the Referenced File ID attribute * @param sourceFilename name of the source DICOM file * @return pointer to new or updated record, NULL if an error occurred */ DcmDirectoryRecord *buildRTStructureSetRecord(DcmDirectoryRecord *record, DcmItem *dataset, const OFString &referencedFileID, const OFString &sourceFilename); /** create or update RT plan record and copy required values from dataset * @param record record to be updated, use NULL to create a new one * @param dataset DICOM dataset of the current file * @param referencedFileID value of the Referenced File ID attribute * @param sourceFilename name of the source DICOM file * @return pointer to new or updated record, NULL if an error occurred */ DcmDirectoryRecord *buildRTPlanRecord(DcmDirectoryRecord *record, DcmItem *dataset, const OFString &referencedFileID, const OFString &sourceFilename); /** create or update RT treatment record and copy required values from dataset * @param record record to be updated, use NULL to create a new one * @param dataset DICOM dataset of the current file * @param referencedFileID value of the Referenced File ID attribute * @param sourceFilename name of the source DICOM file * @return pointer to new or updated record, NULL if an error occurred */ DcmDirectoryRecord *buildRTTreatmentRecord(DcmDirectoryRecord *record, DcmItem *dataset, const OFString &referencedFileID, const OFString &sourceFilename); /** create or update stored print record and copy required values from dataset * @param record record to be updated, use NULL to create a new one * @param dataset DICOM dataset of the current file * @param referencedFileID value of the Referenced File ID attribute * @param sourceFilename name of the source DICOM file * @return pointer to new or updated record, NULL if an error occurred */ DcmDirectoryRecord *buildStoredPrintRecord(DcmDirectoryRecord *record, DcmItem *dataset, const OFString &referencedFileID, const OFString &sourceFilename); /** create or update key object doc record and copy required values from dataset * @param record record to be updated, use NULL to create a new one * @param dataset DICOM dataset of the current file * @param referencedFileID value of the Referenced File ID attribute * @param sourceFilename name of the source DICOM file * @return pointer to new or updated record, NULL if an error occurred */ DcmDirectoryRecord *buildKeyObjectDocRecord(DcmDirectoryRecord *record, DcmItem *dataset, const OFString &referencedFileID, const OFString &sourceFilename); /** create or update registration record and copy required values from dataset * @param record record to be updated, use NULL to create a new one * @param dataset DICOM dataset of the current file * @param referencedFileID value of the Referenced File ID attribute * @param sourceFilename name of the source DICOM file * @return pointer to new or updated record, NULL if an error occurred */ DcmDirectoryRecord *buildRegistrationRecord(DcmDirectoryRecord *record, DcmItem *dataset, const OFString &referencedFileID, const OFString &sourceFilename); /** create or update fiducial record and copy required values from dataset * @param record record to be updated, use NULL to create a new one * @param dataset DICOM dataset of the current file * @param referencedFileID value of the Referenced File ID attribute * @param sourceFilename name of the source DICOM file * @return pointer to new or updated record, NULL if an error occurred */ DcmDirectoryRecord *buildFiducialRecord(DcmDirectoryRecord *record, DcmItem *dataset, const OFString &referencedFileID, const OFString &sourceFilename); /** create or update raw data record and copy required values from dataset * @param record record to be updated, use NULL to create a new one * @param dataset DICOM dataset of the current file * @param referencedFileID value of the Referenced File ID attribute * @param sourceFilename name of the source DICOM file * @return pointer to new or updated record, NULL if an error occurred */ DcmDirectoryRecord *buildRawDataRecord(DcmDirectoryRecord *record, DcmItem *dataset, const OFString &referencedFileID, const OFString &sourceFilename); /** create or update spectroscopy record and copy required values from dataset * @param record record to be updated, use NULL to create a new one * @param dataset DICOM dataset of the current file * @param referencedFileID value of the Referenced File ID attribute * @param sourceFilename name of the source DICOM file * @return pointer to new or updated record, NULL if an error occurred */ DcmDirectoryRecord *buildSpectroscopyRecord(DcmDirectoryRecord *record, DcmItem *dataset, const OFString &referencedFileID, const OFString &sourceFilename); /** create or update encap doc record and copy required values from dataset * @param record record to be updated, use NULL to create a new one * @param dataset DICOM dataset of the current file * @param referencedFileID value of the Referenced File ID attribute * @param sourceFilename name of the source DICOM file * @return pointer to new or updated record, NULL if an error occurred */ DcmDirectoryRecord *buildEncapDocRecord(DcmDirectoryRecord *record, DcmItem *dataset, const OFString &referencedFileID, const OFString &sourceFilename); /** create or update value map record and copy required values from dataset * @param record record to be updated, use NULL to create a new one * @param dataset DICOM dataset of the current file * @param referencedFileID value of the Referenced File ID attribute * @param sourceFilename name of the source DICOM file * @return pointer to new or updated record, NULL if an error occurred */ DcmDirectoryRecord *buildValueMapRecord(DcmDirectoryRecord *record, DcmItem *dataset, const OFString &referencedFileID, const OFString &sourceFilename); /** create or update hanging protocol record and copy required values from dataset * @param record record to be updated, use NULL to create a new one * @param dataset DICOM dataset of the current file * @param referencedFileID value of the Referenced File ID attribute * @param sourceFilename name of the source DICOM file * @return pointer to new or updated record, NULL if an error occurred */ DcmDirectoryRecord *buildHangingProtocolRecord(DcmDirectoryRecord *record, DcmItem *dataset, const OFString &referencedFileID, const OFString &sourceFilename); /** create or update stereometric record and copy required values from dataset * @param record record to be updated, use NULL to create a new one * @param dataset DICOM dataset of the current file * @param referencedFileID value of the Referenced File ID attribute * @param sourceFilename name of the source DICOM file * @return pointer to new or updated record, NULL if an error occurred */ DcmDirectoryRecord *buildStereometricRecord(DcmDirectoryRecord *record, DcmItem *dataset, const OFString &referencedFileID, const OFString &sourceFilename); /** create or update palette record and copy required values from dataset * @param record record to be updated, use NULL to create a new one * @param dataset DICOM dataset of the current file * @param referencedFileID value of the Referenced File ID attribute * @param sourceFilename name of the source DICOM file * @return pointer to new or updated record, NULL if an error occurred */ DcmDirectoryRecord *buildPaletteRecord(DcmDirectoryRecord *record, DcmItem *dataset, const OFString &referencedFileID, const OFString &sourceFilename); /** create or update surface record and copy required values from dataset * @param record record to be updated, use NULL to create a new one * @param dataset DICOM dataset of the current file * @param referencedFileID value of the Referenced File ID attribute * @param sourceFilename name of the source DICOM file * @return pointer to new or updated record, NULL if an error occurred */ DcmDirectoryRecord *buildSurfaceRecord(DcmDirectoryRecord *record, DcmItem *dataset, const OFString &referencedFileID, const OFString &sourceFilename); /** create or update measurement record and copy required values from dataset * @param record record to be updated, use NULL to create a new one * @param dataset DICOM dataset of the current file * @param referencedFileID value of the Referenced File ID attribute * @param sourceFilename name of the source DICOM file * @return pointer to new or updated record, NULL if an error occurred */ DcmDirectoryRecord *buildMeasurementRecord(DcmDirectoryRecord *record, DcmItem *dataset, const OFString &referencedFileID, const OFString &sourceFilename); /** create or update implant record and copy required values from dataset * @param record record to be updated, use NULL to create a new one * @param dataset DICOM dataset of the current file * @param referencedFileID value of the Referenced File ID attribute * @param sourceFilename name of the source DICOM file * @return pointer to new or updated record, NULL if an error occurred */ DcmDirectoryRecord *buildImplantRecord(DcmDirectoryRecord *record, DcmItem *dataset, const OFString &referencedFileID, const OFString &sourceFilename); /** create or update implant group record and copy required values from dataset * @param record record to be updated, use NULL to create a new one * @param dataset DICOM dataset of the current file * @param referencedFileID value of the Referenced File ID attribute * @param sourceFilename name of the source DICOM file * @return pointer to new or updated record, NULL if an error occurred */ DcmDirectoryRecord *buildImplantGroupRecord(DcmDirectoryRecord *record, DcmItem *dataset, const OFString &referencedFileID, const OFString &sourceFilename); /** create or update implant assy record and copy required values from dataset * @param record record to be updated, use NULL to create a new one * @param dataset DICOM dataset of the current file * @param referencedFileID value of the Referenced File ID attribute * @param sourceFilename name of the source DICOM file * @return pointer to new or updated record, NULL if an error occurred */ DcmDirectoryRecord *buildImplantAssyRecord(DcmDirectoryRecord *record, DcmItem *dataset, const OFString &referencedFileID, const OFString &sourceFilename); /** create or update image record and copy required values from dataset * @param record record to be updated, use NULL to create a new one * @param dataset DICOM dataset of the current file * @param referencedFileID value of the Referenced File ID attribute * @param sourceFilename name of the source DICOM file * @return pointer to new or updated record, NULL if an error occurred */ DcmDirectoryRecord *buildImageRecord(DcmDirectoryRecord *record, DcmItem *dataset, const OFString &referencedFileID, const OFString &sourceFilename); /** create icon image from given PGM (portable gray map) file. * Please note that only grayscale images in binary format are currently * supported (magic word "P5"). Memory has to be allocated by the caller. * @param filename name of the PGM file to be loaded * @param pixel pointer to memory buffer where the pixel data are to be stored * @param count number of bytes allocated for the 'pixel' memory buffer * @param width width of the scaled icon image (in pixels ) * @param height height of the scaled icon image (in pixels) * @return OFTrue if successful, OFFalse otherwise */ OFBool getIconFromFile(const OFString &filename, Uint8 *pixel, const unsigned long count, const unsigned int width, const unsigned int height); /** create icon image from DICOM dataset. * Please note that the memory buffer has to be allocated by the caller. * @param dataset DICOM dataset from which the icon image is created * @param pixel pointer to memory buffer where the pixel data are to be stored * @param count number of bytes allocated for the 'pixel' memory buffer * @param width width of the scaled icon image (in pixels ) * @param height height of the scaled icon image (in pixels) * @return OFTrue if successful, OFFalse otherwise */ OFBool getIconFromDataset(DcmItem *dataset, Uint8 *pixel, const unsigned long count, const unsigned int width, const unsigned int height); /** add icon image sequence to directory record. * If the icon image cannot be created from the DICOM dataset and there is no * PGM file specified (neither for the particular image not a default one) a * black image is used instead. * @param record directory record where the icon image is stored * @param dataset DICOM dataset from which the icon image is possibly created * @param size resolution of the icon image to be created (width and height) * @param sourceFilename name of the source DICOM file * @return EC_Normal upon success, an error code otherwise */ OFCondition addIconImage(DcmDirectoryRecord *record, DcmItem *dataset, const unsigned int size, const OFString &sourceFilename); /** add child record to a given parent record. * A new record is only added if it does not already exist. * @param parent parent record (add new record as a child of this one) * @param recordType type of directory record to be created * @param dataset DICOM dataset containing data of the new record * @param referencedFileID value of the Referenced File ID attribute * @param sourceFilename name of the source DICOM file * @return pointer to new/existing record, NULL if an error occurred */ DcmDirectoryRecord *addRecord(DcmDirectoryRecord *parent, const E_DirRecType recordType, DcmItem *dataset, const OFString &referencedFileID, const OFString &sourceFilename); /** check referenced SOP instance for consistency with a new directory record * @param record directory record to be checked * @param dataset DICOM dataset containing data of the new record * @param referencedFileID value of the Referenced File ID attribute * @param sourceFilename name of the source DICOM file */ OFBool checkReferencedSOPInstance(DcmDirectoryRecord *record, DcmItem *dataset, const OFString &referencedFileID, const OFString &sourceFilename); /** invent missing type 1 attributes for all child records (from patient level) * @param parent invent missing attributes for all children of this record (root) * @param recurse invent missing attributes also for lower level records if OFTrue. * Only invent attributes for the top (patient) level if OFFalse. */ void inventMissingAttributes(DcmDirectoryRecord *parent, const OFBool recurse = OFTrue); /** invent missing type 1 attributes for all child records (from study level) * @param parent invent missing attributes for all children of this record */ void inventMissingStudyLevelAttributes(DcmDirectoryRecord *parent); /** invent missing type 1 attributes for all child records (from series level) * @param parent invent missing attributes for all children of this record */ void inventMissingSeriesLevelAttributes(DcmDirectoryRecord *parent); /** invent missing type 1 attributes for all child records (from instance level) * @param parent invent missing attributes for all children of this record */ void inventMissingInstanceLevelAttributes(DcmDirectoryRecord *parent); /** create backup of a given file * @param filename name of the file to be backuped */ void createDicomDirBackup(const char *filename); /** delete backup file if one has been created */ void deleteDicomDirBackup(); /** print a message that the value of a given tag is unexpected. * The output format is: "{Error|Warning}: attribute \ \ * has other value than expected[ in file: \]" * @param key affected tag * @param filename name of the file (optional, might be NULL) * @param errorMsg print error message if OFTrue, a warning message otherwise */ void printUnexpectedValueMessage(const DcmTagKey &key, const char *filename = NULL, const OFBool errorMsg = OFTrue); /** print an error message that a required attribute is missing/empty. * The output format is: "Error: : required attribute \ * \\ {empty|missing}[ in file: \]" * @param key affected tag * @param filename name of the file (optional, might be NULL) * @param emptyMsg print "empty" if OFTrue, "missing" otherwise */ void printRequiredAttributeMessage(const DcmTagKey &key, const char *filename = NULL, const OFBool emptyMsg = OFFalse); /** print an error message that something went wrong with an attribute. * The output format is: "Error: \: [cannot \ ]\ * \" * @param key affected tag * @param error status to be reported (only if ".bad()") * @param operation name of the operation that failed (optional, might be NULL) */ void printAttributeErrorMessage(const DcmTagKey &key, const OFCondition &error, const char *operation); /** print an error message that something went wrong with a given record. * The output format is: "Error: \: [cannot \ ]\ * directory record" * @param error status to be reported (only if ".bad()") * @param recordType type of directory record which caused the error * @param operation name of the operation that failed (optional, might be NULL) */ void printRecordErrorMessage(const OFCondition &error, const E_DirRecType recordType, const char *operation); /** copy contents of specified file * @param fromFilename name of the file to be copied * @param toFilename name of the new file (copy of 'fromFilename') * @return OFTrue if successful, OFFalse otherwise */ OFBool copyFile(const char *fromFilename, const char *toFilename); /** see if all the attributes in record match the values in dataset and warn if not * @param record directory record to be checked * @param dataset DICOM dataset to be compared with the directory record * @param sourceFilename name of the source DICOM file * @param abortCheck flag indicating whether to abort on the first inconsistent record * @return OFTrue in case of any inconsistency, OFFalse otherwise */ OFBool warnAboutInconsistentAttributes(DcmDirectoryRecord *record, DcmItem *dataset, const OFString &sourceFilename, const OFBool abortCheck = OFFalse); /** check whether given fileset ID is valid * @param filesetID fileset ID to be checked * @return OFTrue if ID is valid, OFFalse otherwise */ OFBool checkFilesetID(const OFString &filesetID); /** check whether given tag exists in the DICOM dataset * @param dataset DICOM dataset to be checked * @param key tag to be searched for * @param filename of the file (optional, report any error if specified) * @return OFTrue if tag exists, OFFalse otherwise */ OFBool checkExists(DcmItem *dataset, const DcmTagKey &key, const char *filename = NULL); /** check whether given tag exists with a value in the DICOM dataset * @param dataset DICOM dataset to be checked * @param key tag to be searched for * @param filename of the file (optional, report any error if specified) * @return OFTrue if tag exists with value, OFFalse otherwise */ OFBool checkExistsWithValue(DcmItem *dataset, const DcmTagKey &key, const char *filename = NULL); /** check whether given tag exists in the DICOM dataset and has the expected string value * @param dataset DICOM dataset to be checked * @param key tag to be searched for * @param value expected string value * @param filename of the file (optional, report any error if specified) * @return OFTrue if tag exists with given string value, OFFalse otherwise */ OFBool checkExistsWithStringValue(DcmItem *dataset, const DcmTagKey &key, const OFString &value, const char *filename = NULL); /** check whether given tag exists in the DICOM dataset and has the expected integer value * @param dataset DICOM dataset to be checked * @param key tag to be searched for * @param value expected integer value * @param filename of the file (optional, report any error if specified) * @param reject report an "Error" if OFTrue, a "Warning" if OFFalse * @return OFTrue if tag exists with given string value, OFFalse otherwise */ OFBool checkExistsWithIntegerValue(DcmItem *dataset, const DcmTagKey &key, const long value, const char *filename = NULL, const OFBool reject = OFTrue); /** check whether given tag exists in the DICOM dataset and has an integer value in the expected range * @param dataset DICOM dataset to be checked * @param key tag to be searched for * @param min minimum integer value of the expected range * @param max maximum integer value of the expected range * @param filename of the file (optional, report any error if specified) * @param reject report an "Error" if OFTrue, a "Warning" if OFFalse * @return OFTrue if tag exists with given string value, OFFalse otherwise */ OFBool checkExistsWithMinMaxValue(DcmItem *dataset, const DcmTagKey &key, const long min, const long max, const char *filename = NULL, const OFBool reject = OFTrue); /** get string value from dataset and report an error (if any) * @param dataset dataset from which the string value is to be retrieved * @param key tag of the attribute to be retrieved * @param result string variable in which the resulting value is stored * @param searchIntoSub flag indicating whether to do a deep search or not * @return reference to the resulting string value (parameter 'result') */ OFString &getStringFromDataset(DcmItem *dataset, const DcmTagKey &key, OFString &result, OFBool searchIntoSub = OFFalse); /** get string value component from dataset and report an error (if any) * @param dataset dataset from which the string value is to be retrieved * @param key tag of the attribute to be retrieved * @param result string variable in which the resulting value is stored * @param pos index of the component in case of multi-valued elements (0..vm-1) * @param searchIntoSub flag indicating whether to do a deep search or not * @return reference to the resulting string value (parameter 'result') */ OFString &getStringComponentFromDataset(DcmItem *dataset, const DcmTagKey &key, OFString &result, const unsigned long pos, OFBool searchIntoSub = OFFalse); /** get string value from file and report an error (if any) * @param filename name of the file from which the string value is to be retrieved * @param key tag of the attribute to be retrieved * @param result string variable in which the resulting value is stored * @param searchIntoSub flag indicating whether to do a deep search or not * @return reference to the resulting string value (parameter 'result') */ OFString &getStringFromFile(const char *filename, const DcmTagKey &key, OFString &result, OFBool searchIntoSub = OFFalse); /** copy element from dataset to directory record * @param dataset DICOM dataset containing the original data * @param key tag of the element to be copied * @param record directory record to which the element is to be copied * @param sourceFilename name of the source DICOM file * @param optional flag indicating whether the element is optional or required * @param copyEmpty flag indicating whether to copy an empty element (no value) */ void copyElement(DcmItem *dataset, const DcmTagKey &key, DcmDirectoryRecord *record, const OFString &sourceFilename, const OFBool optional = OFFalse, const OFBool copyEmpty = OFTrue); /** copy type 1 element from dataset to directory record * @param dataset DICOM dataset containing the original data * @param key tag of the element to be copied * @param record directory record to which the element is to be copied * @param sourceFilename name of the source DICOM file */ void copyElementType1(DcmItem *dataset, const DcmTagKey &key, DcmDirectoryRecord *record, const OFString &sourceFilename) { copyElement(dataset, key, record, sourceFilename, OFFalse /*optional*/, OFFalse /*copyEmpty*/); } /** copy type 1C element from dataset to directory record * @param dataset DICOM dataset containing the original data * @param key tag of the element to be copied * @param record directory record to which the element is to be copied * @param sourceFilename name of the source DICOM file */ void copyElementType1C(DcmItem *dataset, const DcmTagKey &key, DcmDirectoryRecord *record, const OFString &sourceFilename) { copyElement(dataset, key, record, sourceFilename, OFTrue /*optional*/, OFFalse /*copyEmpty*/); } /** copy type 2 element from dataset to directory record * @param dataset DICOM dataset containing the original data * @param key tag of the element to be copied * @param record directory record to which the element is to be copied * @param sourceFilename name of the source DICOM file */ void copyElementType2(DcmItem *dataset, const DcmTagKey &key, DcmDirectoryRecord *record, const OFString &sourceFilename) { copyElement(dataset, key, record, sourceFilename, OFFalse /*optional*/, OFTrue /*copyEmpty*/); } /** copy type 3 element from dataset to directory record * @param dataset DICOM dataset containing the original data * @param key tag of the element to be copied * @param record directory record to which the element is to be copied * @param sourceFilename name of the source DICOM file */ void copyElementType3(DcmItem *dataset, const DcmTagKey &key, DcmDirectoryRecord *record, const OFString &sourceFilename) { copyElement(dataset, key, record, sourceFilename, OFTrue /*optional*/, OFTrue /*copyEmpty*/); } /** copy optional string value from dataset to directory record * @param dataset DICOM dataset containing the original data * @param key tag of the element value to be copied * @param record directory record to which the element value is to be copied * @param sourceFilename name of the source DICOM file * @param defaultValue default string value used in case the element is missing * @param printWarning print warning message if element does not exist (with a value) * and no default value is given */ void copyStringWithDefault(DcmItem *dataset, const DcmTagKey &key, DcmDirectoryRecord *record, const OFString &sourceFilename, const char *defaultValue = "", const OFBool printWarning = OFFalse); /** compare string attribute from dataset and record and report any deviation * @param dataset DICOM dataset where the string value is stored * @param datKey tag of the string value to be compared (dataset) * @param record directory record where the string value is stored * @param recKey tag of the string value to be compared (record) * @param sourceFilename name of the source DICOM file * @param errorMsg report error if true, warning message otherwise (default) * @return OFTrue if string values are identical, OFFalse otherwise */ OFBool compareStringAttributes(DcmItem *dataset, const DcmTagKey &datKey, DcmDirectoryRecord *record, const DcmTagKey &recKey, const OFString &sourceFilename, const OFBool errorMsg = OFFalse); /** compare sequence attribute from dataset and record and report any deviation * @param dataset DICOM dataset where the sequence value is stored * @param key tag of the sequence to be compared * @param record directory record where the sequence value is stored * @param sourceFilename name of the source DICOM file * @return OFTrue if sequences are identical, OFFalse otherwise */ OFBool compareSequenceAttributes(DcmItem *dataset, DcmTagKey &key, DcmDirectoryRecord *record, const OFString &sourceFilename); /** set default value (number or prefix and number) to a given tag * @param record directory record where the elements are stored * @param key tag of the element to be modifed * @param number numeric value to be set as a the element value * @param prefix optional prefix to be added to the numeric value */ void setDefaultValue(DcmDirectoryRecord *record, const DcmTagKey &key, const unsigned long number, const char *prefix = NULL); private: /// pointer to the current DICOMDIR object DcmDicomDir *DicomDir; /// pointer to the optional image plugin (required for icon image support) DicomDirImagePlugin *ImagePlugin; /// currently selected application profile E_ApplicationProfile ApplicationProfile; /// create DICOMDIR backup OFBool BackupMode; /// abort on first inconsistent record OFBool AbortMode; /// automatically map filenames OFBool MapFilenamesMode; /// invent missing attributes mode OFBool InventMode; /// invent missing patient ID mode OFBool InventPatientIDMode; /// support retired SOP classes OFBool RetiredSOPClassSupport; /// check pixel encoding OFBool EncodingCheck; /// check image resolution OFBool ResolutionCheck; /// check transfer syntax OFBool TransferSyntaxCheck; /// check consistency of newly added record OFBool ConsistencyCheck; /// create icon images OFBool IconImageMode; /// update existing fileset OFBool FilesetUpdateMode; /// name of the DICOMDIR backup file OFString BackupFilename; /// flag indicating whether a backup has been created OFBool BackupCreated; /// size of the optional icon image in pixels unsigned int IconSize; /// filename prefix for the external icon images OFString IconPrefix; /// filename of the default icon (if any) OFString DefaultIcon; /// flag indicating whether RLE decompression is supported OFBool RLESupport; /// flag indicating whether JPEG decompression is supported OFBool JPEGSupport; /// flag indicating whether JPEG 2000 decompression is supported OFBool JP2KSupport; /// current patient number used to invent missing attribute values unsigned long AutoPatientNumber; /// current study number used to invent missing attribute values unsigned long AutoStudyNumber; /// current series number used to invent missing attribute values unsigned long AutoSeriesNumber; /// current instance number used to invent missing attribute values unsigned long AutoInstanceNumber; /// current overlay number used to invent missing attribute values unsigned long AutoOverlayNumber; /// current LUT number used to invent missing attribute values unsigned long AutoLutNumber; /// current curve number used to invent missing attribute values unsigned long AutoCurveNumber; /// private undefined copy constructor DicomDirInterface(const DicomDirInterface &obj); /// private undefined assignment operator DicomDirInterface &operator=(const DicomDirInterface &obj); }; #endif /* * * CVS/RCS Log: * $Log: dcddirif.h,v $ * Revision 1.23 2010-11-05 13:11:11 joergr * Added support for new directory record types IMPLANT, IMPLANT GROUP and * IMPLANT ASSY from Supplement 131 (Implant Templates). * * Revision 1.22 2010-10-14 13:15:40 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.21 2010-10-04 16:14:53 joergr * Fixed various Doxygen API documentation issues. * * Revision 1.20 2010-10-01 08:09:31 joergr * Added support for new non-image Storage SOP Classes that require the new * directory record type MEASUREMENT. Also fixed issues with other record types. * * Revision 1.19 2010-09-30 17:18:10 joergr * Added support for new non-image Storage SOP Classes that require the new * directory record types PALETTE and SURFACE. Also updated existing records. * * Revision 1.18 2010-08-10 11:02:58 uli * Removed undefined function printFileErrorMessage(). * * Revision 1.17 2010-08-09 13:02:56 joergr * Updated data dictionary to 2009 edition of the DICOM standard. From now on, * the official "keyword" is used for the attribute name which results in a * number of minor changes (e.g. "PatientsName" is now called "PatientName"). * * Revision 1.16 2009-11-25 13:31:05 joergr * Adapted code for new approach to access individual frames of a DICOM image. * * Revision 1.15 2009-11-04 09:58:07 uli * Switched to logging mechanism provided by the "new" oflog module * * Revision 1.14 2009-01-15 10:16:40 joergr * Added check whether (possibly required) JPEG 2000 decoder is registered. * * Revision 1.13 2008-06-23 12:05:37 joergr * Added check on value representation of data elements copied from the * referenced DICOM file to the DICOMDIR (compare VR with data dictionary). * * Revision 1.12 2007/02/02 16:01:51 joergr * Added error message when existing SOP instance is inconsistent with new * directory record in update mode (e.g. different SOP class UID). * Fixed incomplete warning message in update mode (filename was missing). * * Revision 1.11 2007/01/10 13:02:59 joergr * Added new option that enables support for retired SOP classes. * * Revision 1.10 2006/12/15 14:56:57 joergr * Added new option that allows to update existing entries in a DICOMDIR. This * also adds support for mixed media stored application profiles. * Changed name of enum value for the MPEG2-DVD application profile in order to * be more consistent with other names. * Slightly revised handling of type 1, 1C and 2 elements in Directory Records. * Fixed small bug in cardiac application profiles when checking the ImageType * (0008,0008). * * Revision 1.9 2006/07/27 13:05:05 joergr * Added support for DICOMDIR record type "STEREOMETRIC" (CP 628). * * Revision 1.8 2005/12/15 15:40:48 joergr * Removed unsused parameter. * * Revision 1.7 2005/12/08 16:28:03 meichel * Changed include path schema for all DCMTK header files * * Revision 1.6 2005/10/27 13:31:21 joergr * Added support for Encapsulated Document, Real World Value Mapping and * Hanging Protocol objects to DICOMDIR tools. * * Revision 1.5 2005/06/13 14:36:41 joergr * Added new options to disable check on pixel encoding and transfer syntax. * * Revision 1.4 2005/03/09 17:53:34 joergr * Added support for new Media Storage Application Profiles according to DICOM * PS 3.12-2004. Removed support for non-standard conformant "No profile". * Added support for UTF-8 for the contents of the fileset descriptor file. * * Revision 1.3 2004/02/13 17:36:46 joergr * Added support for new directory records RAW DATA and SPECTROSCOPY introduced * with CP 343. * * Revision 1.2 2004/02/13 14:11:15 joergr * Added support for new directory records REGISTRATION and FIDUCIAL introduced * with supplement 73 (Spatial Registration Storage SOP Classes). * * Revision 1.1 2003/08/12 14:35:00 joergr * Added new interface class for simplified creation of a DICOMDIR. * * */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/dcvrcs.h0000644000310500011400000002267111464747623021241 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Gerd Ehlers, Andreas Barth * * Purpose: Interface of class DcmCodeString * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-11-05 09:34:11 $ * CVS/RCS Revision: $Revision: 1.25 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DCVRCS_H #define DCVRCS_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcbytstr.h" /** a class representing the DICOM value representation 'Code String' (CS) */ class DcmCodeString : public DcmByteString { public: /** constructor. * Create new element from given tag and length. * @param tag DICOM tag for the new element * @param len value length for the new element */ DcmCodeString(const DcmTag &tag, const Uint32 len = 0); /** copy constructor * @param old element to be copied */ DcmCodeString(const DcmCodeString &old); /** destructor */ virtual ~DcmCodeString(); /** assignment operator * @param obj element to be assigned/copied * @return reference to this object */ DcmCodeString &operator=(const DcmCodeString &obj); /** clone method * @return deep copy of this object */ virtual DcmObject *clone() const { return new DcmCodeString(*this); } /** Virtual object copying. This method can be used for DcmObject * and derived classes to get a deep copy of an object. Internally * the assignment operator is called if the given DcmObject parameter * is of the same type as "this" object instance. If not, an error * is returned. This function permits copying an object by value * in a virtual way which therefore is different to just calling the * assignment operator of DcmElement which could result in slicing * the object. * @param rhs - [in] The instance to copy from. Has to be of the same * class type as "this" object * @return EC_Normal if copying was successful, error otherwise */ virtual OFCondition copyFrom(const DcmObject& rhs); /** get element type identifier * @return type identifier of this class (EVR_CS) */ virtual DcmEVR ident() const; /** check whether stored value conforms to the VR and to the specified VM * @param vm value multiplicity (according to the data dictionary) to be checked for. * (valid values: "1", "1-2", "1-3", "1-8", "1-99", "1-n", "2", "2-n", "2-2n", * "3", "3-n", "3-3n", "4", "6", "9", "16", "32") * @param oldFormat parameter not used for this VR (only for DA, TM, PN) * @return status of the check, EC_Normal if value is correct, an error code otherwise */ virtual OFCondition checkValue(const OFString &vm = "1-n", const OFBool oldFormat = OFFalse); /** get a copy of a particular string component * @param stringVal variable in which the result value is stored * @param pos index of the value in case of multi-valued elements (0..vm-1) * @param normalize delete leading and trailing spaces if OFTrue * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition getOFString(OFString &stringVal, const unsigned long pos, OFBool normalize = OFTrue); /* --- static helper functions --- */ /** check whether given value conforms to value representation CS (Code String). * Valid characters are: A-Z, 0-9, _ and ' ' (space). The maximum length is 16. * NB: This method is only used by the DicomDirInterface class and might be * replaced by the following method (checkStringValue) in the future. * @param value string value to be checked (single value only) * @param pos returns index of first invalid character (0..n-1) if not NULL. * Points to trailing zero byte (eos) if value is valid. * @param checkLength check maximum length if OFTrue, ignore length if OFFalse * @return OFTrue if value is valid, OFFalse otherwise */ static OFBool checkVR(const OFString &value, size_t *pos = NULL, const OFBool checkLength = OFTrue); /** check whether given string value conforms to the VR "CS" (Code String) * and to the specified VM. * @param value string value to be checked (possibly multi-valued) * @param vm value multiplicity (according to the data dictionary) to be checked for. * (valid values: "1", "1-2", "1-3", "1-8", "1-99", "1-n", "2", "2-n", "2-2n", * "3", "3-n", "3-3n", "4", "6", "9", "16", "32") * @return status of the check, EC_Normal if value is correct, an error code otherwise */ static OFCondition checkStringValue(const OFString &value, const OFString &vm = "1-n"); }; #endif // DCVRCS_H /* ** CVS/RCS Log: ** $Log: dcvrcs.h,v $ ** Revision 1.25 2010-11-05 09:34:11 joergr ** Added support for checking the value multiplicity "9" (see Supplement 131). ** ** Revision 1.24 2010-10-14 13:15:42 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.23 2010-04-23 15:26:12 joergr ** Specify an appropriate default value for the "vm" parameter of checkValue(). ** ** Revision 1.22 2010-04-23 14:25:27 joergr ** Added new method to all VR classes which checks whether the stored value ** conforms to the VR definition and to the specified VM. ** ** Revision 1.21 2010-04-22 09:31:30 joergr ** Revised misleading parameter documentation for the checkValue() method. ** ** Revision 1.20 2010-04-22 08:59:10 joergr ** Added support for further VM values ("1-8", "1-99", "16", "32") to be checked. ** ** Revision 1.19 2009-08-03 09:05:30 joergr ** Added methods that check whether a given string value conforms to the VR and ** VM definitions of the DICOM standards. ** ** Revision 1.18 2008-07-17 11:19:49 onken ** Updated copyFrom() documentation. ** ** Revision 1.17 2008-07-17 10:30:23 onken ** Implemented copyFrom() method for complete DcmObject class hierarchy, which ** permits setting an instance's value from an existing object. Implemented ** assignment operator where necessary. ** ** Revision 1.16 2005-12-08 16:28:54 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.15 2004/07/01 12:28:25 meichel ** Introduced virtual clone method for DcmObject and derived classes. ** ** Revision 1.14 2003/06/12 13:30:58 joergr ** Added static function checkVR(). ** ** Revision 1.13 2002/12/06 12:49:14 joergr ** Enhanced "print()" function by re-working the implementation and replacing ** the boolean "showFullData" parameter by a more general integer flag. ** Added doc++ documentation. ** Made source code formatting more consistent with other modules/files. ** ** Revision 1.12 2002/04/25 09:48:10 joergr ** Removed getOFStringArray() implementation. ** ** Revision 1.11 2001/09/25 17:19:30 meichel ** Adapted dcmdata to class OFCondition ** ** Revision 1.10 2001/06/01 15:48:48 meichel ** Updated copyright header ** ** Revision 1.9 2000/03/08 16:26:22 meichel ** Updated copyright header. ** ** Revision 1.8 1999/03/31 09:24:57 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.7 1998/11/12 16:47:46 meichel ** Implemented operator= for all classes derived from DcmObject. ** ** Revision 1.6 1997/09/11 15:13:12 hewett ** Modified getOFString method arguments by removing a default value ** for the pos argument. By requiring the pos argument to be provided ** ensures that callers realise getOFString only gets one component of ** a multi-valued string. ** ** Revision 1.5 1997/08/29 08:32:40 andreas ** - Added methods getOFString and getOFStringArray for all ** string VRs. These methods are able to normalise the value, i. e. ** to remove leading and trailing spaces. This will be done only if ** it is described in the standard that these spaces are not relevant. ** These methods do not test the strings for conformance, this means ** especially that they do not delete spaces where they are not allowed! ** getOFStringArray returns the string with all its parts separated by \ ** and getOFString returns only one value of the string. ** CAUTION: Currently getString returns a string with trailing ** spaces removed (if dcmEnableAutomaticInputDataCorrection == OFTrue) and ** truncates the original string (since it is not copied!). If you rely on this ** behaviour please change your application now. ** Future changes will ensure that getString returns the original ** string from the DICOM object (NULL terminated) inclusive padding. ** Currently, if you call getOF... before calling getString without ** normalisation, you can get the original string read from the DICOM object. ** ** Revision 1.4 1996/01/09 11:06:17 andreas ** New Support for Visual C++ ** Correct problems with inconsistent const declarations ** ** Revision 1.3 1996/01/05 13:23:03 andreas ** - changed to support new streaming facilities ** - more cleanups ** - merged read / write methods for block and file transfer ** */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/dcuid.h0000644000310500011400000015635611464755702021052 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Andrew Hewett * * Purpose: * Definitions of "well known" DICOM Unique Indentifiers, * routines for finding and creating UIDs. * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-11-05 10:26:10 $ * CVS/RCS Revision: $Revision: 1.89 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DCUID_H #define DCUID_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/ofstd/oftypes.h" #define INCLUDE_CSTDLIB #define INCLUDE_UNISTD #include "dcmtk/ofstd/ofstdinc.h" /** return the name of a UID. * Performs a table lookup and returns a pointer to a read-only string. * @param uid UID string for which the name is to be looked up * @param defaultValue default to return if UID not known * @return name string or defaultValue if UID is unknown */ const char* dcmFindNameOfUID(const char* uid, const char* defaultValue = NULL); /** return the UID of a name. * Performs a table lookup and returns a pointer to a read-only string. * @param name name string for which the corresponding UID is to be looked up * @return UID string or NULL if name is unknown */ const char* dcmFindUIDFromName(const char * name); /** an array of const strings containing all known Storage SOP Classes * that fit into the conventional PATIENT-STUDY-SERIES-INSTANCE information * model, i.e. everything a Storage SCP might want to store in a PACS. * Special cases such as hanging protocol storage or the Storage SOP Class * are not included in this list. * WARNING: This list contains more than 64 entries, i.e. it is not possible * to use this list to configure the association negotiation behaviour of * a Storage SCU that always proposes two presentation contexts for each * SOP class. */ extern const char* dcmAllStorageSOPClassUIDs[]; /// number of entries in dcmAllStorageSOPClassUIDs. extern const int numberOfAllDcmStorageSOPClassUIDs; /** an array of const strings containing all storage SOP classes that * are proposed by default by those Storage SCU components in DCMTK * that always propose one presentation context for each SOP class, * e.g. movescu or dcmqrdb. This list is guaranteed to have at most * 120 entries (to leave room for FIND/MOVE presentation contexts). */ extern const char* dcmLongSCUStorageSOPClassUIDs[]; /// number of entries in dcmLongSCUStorageSOPClassUIDs. extern const int numberOfDcmLongSCUStorageSOPClassUIDs; /** an array of const strings containing all storage SOP classes that * are proposed by default by those Storage SCU components in DCMTK * that always propose TWO presentation context for each SOP class, * e.g. storescu. This list is guaranteed to have at most * 64 entries. */ extern const char* dcmShortSCUStorageSOPClassUIDs[]; /// number of entries in dcmShortSCUStorageSOPClassUIDs. extern const int numberOfDcmShortSCUStorageSOPClassUIDs; /** returns true if the uid is one of the Storage SOP Classes. * Performs a table lookup in the dcmAllStorageSOPClassUIDs table. * @param uid UID string * @return true if UID is a known Storage SOP Class, false otherwise */ OFBool dcmIsaStorageSOPClassUID(const char* uid); /** a global constant array of * string pointers containing the UIDs of all known Image SOP * Classes. The global variable numberOfDcmImageSOPClassUIDs * defines the size of the array. * NOTE: this list represets a subset of the dcmStorageSOPClassUIDs list */ extern const char* dcmImageSOPClassUIDs[]; /// number of entries in dcmImageSOPClassUIDs extern const int numberOfDcmImageSOPClassUIDs; /** creates a Unique Identifer in uid and returns uid. * uid must be at least 65 bytes. Care is taken to make sure * that the generated UID is 64 characters or less. * If a prefix string is not passed as the second argument a * default of SITE_INSTANCE_UID_ROOT (see below) will be used. * Otherwise the supplied prefix string will appear at the beginning * of uid. * The UID is created by appending to the prefix the following: * the host id (if obtainable, zero otherwise), * the process id (if obtainable, zero otherwise), * the system calendar time, and * an accumulating counter for tis process. * @param uid pointer to buffer of 65 or more characters in which the UID is returned * @param prefix prefix for UID creation * @return pointer to UID, identical to uid parameter */ char *dcmGenerateUniqueIdentifier(char *uid, const char* prefix=NULL); /** performs a table lookup and returns a short modality identifier * that can be used for building file names etc. * Identifiers are defined for all storage SOP classes. * Returns 'defaultValue' if no modality identifier found or sopClassUID==NULL. * @param sopClassUID UID string * @param defaultValue default to return if UID not known * @return modality string for modality UID, or defaultValue if not found */ const char *dcmSOPClassUIDToModality(const char *sopClassUID, const char *defaultValue = NULL); /** performs a table lookup and returns a guessed average * file size for the given SOP class. * Average sizes are defined for all storage SOP classes, but may be very far off. * @param sopClassUID UID string * @return estimated everage size for objects of this SOP class */ unsigned long dcmGuessModalityBytes(const char *sopClassUID); /* ** String Constants */ /* ** OFFIS UID is: 1.2.276.0.7230010 ** UID root for OFFIS DCMTK project: 1.2.276.0.7230010.3 ** for OFFIS GO-Kard project: 1.2.276.0.7230010.8 */ #ifndef PACKAGE_DATE #error Required compiler definition PACKAGE_DATE undefined #endif #ifndef PACKAGE_VERSION #error Required compiler definition PACKAGE_VERSION undefined #endif #ifndef PACKAGE_VERSION_NUMBER #error Required compiler definition PACKAGE_VERSION_NUMBER undefined #endif /* NOTE: Implementation version name VR=SH may not be longer than 16 chars * The second name is used to identify files written without dcmdata * (i.e. using the --bit-preserving switch in various tools) */ /// implementation version name for this version of the toolkit #define OFFIS_DTK_IMPLEMENTATION_VERSION_NAME "OFFIS_DCMTK_" PACKAGE_VERSION_NUMBER /// implementation version name for this version of the toolkit, used for files received in "bit preserving" mode #define OFFIS_DTK_IMPLEMENTATION_VERSION_NAME2 "OFFIS_DCMBP_" PACKAGE_VERSION_NUMBER /// release date of current toolkit release #ifdef DCMTK_BUILD_DATE #define OFFIS_DCMTK_RELEASEDATE DCMTK_BUILD_DATE #else #define OFFIS_DCMTK_RELEASEDATE PACKAGE_DATE #endif /// UID root for DCMTK, registered for OFFIS with DIN in Germany #define OFFIS_UID_ROOT "1.2.276.0.7230010.3" /// DCMTK version number for this release #define OFFIS_DCMTK_VERSION_NUMBER PACKAGE_VERSION_NUMBER /// DCMTK version number (as string) for this release #define OFFIS_DCMTK_VERSION_STRING PACKAGE_VERSION /// DCMTK version number suffix string for this release #define OFFIS_DCMTK_VERSION_SUFFIX PACKAGE_VERSION_SUFFIX /// DCMTK version number string including suffix #define OFFIS_DCMTK_VERSION OFFIS_DCMTK_VERSION_STRING OFFIS_DCMTK_VERSION_SUFFIX /// Implementation class UID for this release of the toolkit #define OFFIS_IMPLEMENTATION_CLASS_UID OFFIS_UID_ROOT ".0." OFFIS_DCMTK_VERSION_STRING /// Instance creator UID for this release of the toolkit #define OFFIS_INSTANCE_CREATOR_UID OFFIS_IMPLEMENTATION_CLASS_UID /// private coding scheme UID root for coding schemes generated by OFFIS #define OFFIS_CODING_SCHEME_UID_ROOT OFFIS_UID_ROOT ".0.0" /// private coding scheme version for coding schemes generated by OFFIS #define OFFIS_CODING_SCHEME_VERSION "1" /// private coding scheme UID for coding schemes generated by OFFIS #define OFFIS_CODING_SCHEME_UID OFFIS_CODING_SCHEME_UID_ROOT "." OFFIS_CODING_SCHEME_VERSION /* ** Each site should define its own SITE_UID_ROOT */ #ifndef SITE_UID_ROOT /// UID root to be used when generating UIDs. By default uses the DCMTK root, but can be replaced at compile time. #define SITE_UID_ROOT OFFIS_UID_ROOT /* default */ #endif /* ** Useful UID prefixes. These can be whatever you want. ** ** These site UIDs are arbitary, non-standard, with no meaning ** and can be changed at any time. Do _not_ rely on these values. ** Do _not_ assume any semantics when using these suffixes. ** */ /// UID root for study instance UIDs #define SITE_STUDY_UID_ROOT SITE_UID_ROOT ".1.2" /// UID root for series instance UIDs #define SITE_SERIES_UID_ROOT SITE_UID_ROOT ".1.3" /// UID root for SOP instance UIDs #define SITE_INSTANCE_UID_ROOT SITE_UID_ROOT ".1.4" /** A private SOP Class UID which is used in a file meta-header when * no real SOP Class is stored in the file. -- NON-STANDARD */ #define UID_PrivateGenericFileSOPClass SITE_UID_ROOT ".1.0.1" /// DICOM Defined Standard Application Context UID #define UID_StandardApplicationContext "1.2.840.10008.3.1.1.1" /* ** Defined Transfer Syntax UIDs */ /// Implicit VR Little Endian: Default Transfer Syntax for DICOM #define UID_LittleEndianImplicitTransferSyntax "1.2.840.10008.1.2" /// Explicit VR Little Endian #define UID_LittleEndianExplicitTransferSyntax "1.2.840.10008.1.2.1" /// Explicit VR Big Endian #define UID_BigEndianExplicitTransferSyntax "1.2.840.10008.1.2.2" /// Deflated Explicit VR Little Endian #define UID_DeflatedExplicitVRLittleEndianTransferSyntax "1.2.840.10008.1.2.1.99" /** JPEG Baseline (Process 1): Default Transfer Syntax * for Lossy JPEG 8 Bit Image Compression */ #define UID_JPEGProcess1TransferSyntax "1.2.840.10008.1.2.4.50" /** JPEG Extended (Process 2 & 4): Default Transfer Syntax * for Lossy JPEG 12 Bit Image Compression (Process 4 only) */ #define UID_JPEGProcess2_4TransferSyntax "1.2.840.10008.1.2.4.51" /// JPEG Extended (Process 3 & 5) - RETIRED #define UID_JPEGProcess3_5TransferSyntax "1.2.840.10008.1.2.4.52" /// JPEG Spectral Selection, Non-Hierarchical (Process 6 & 8) - RETIRED #define UID_JPEGProcess6_8TransferSyntax "1.2.840.10008.1.2.4.53" /// JPEG Spectral Selection, Non-Hierarchical (Process 7 & 9) - RETIRED #define UID_JPEGProcess7_9TransferSyntax "1.2.840.10008.1.2.4.54" /// JPEG Full Progression, Non-Hierarchical (Process 10 & 12) - RETIRED #define UID_JPEGProcess10_12TransferSyntax "1.2.840.10008.1.2.4.55" /// JPEG Full Progression, Non-Hierarchical (Process 11 & 13) - RETIRED #define UID_JPEGProcess11_13TransferSyntax "1.2.840.10008.1.2.4.56" /// JPEG Lossless, Non-Hierarchical (Process 14) #define UID_JPEGProcess14TransferSyntax "1.2.840.10008.1.2.4.57" /// JPEG Lossless, Non-Hierarchical (Process 15) - RETIRED #define UID_JPEGProcess15TransferSyntax "1.2.840.10008.1.2.4.58" /// JPEG Extended, Hierarchical (Process 16 & 18) - RETIRED #define UID_JPEGProcess16_18TransferSyntax "1.2.840.10008.1.2.4.59" /// JPEG Extended, Hierarchical (Process 17 & 19) - RETIRED #define UID_JPEGProcess17_19TransferSyntax "1.2.840.10008.1.2.4.60" /// JPEG Spectral Selection, Hierarchical (Process 20 & 22) - RETIRED #define UID_JPEGProcess20_22TransferSyntax "1.2.840.10008.1.2.4.61" /// JPEG Spectral Selection, Hierarchical (Process 21 & 23) - RETIRED #define UID_JPEGProcess21_23TransferSyntax "1.2.840.10008.1.2.4.62" /// JPEG Full Progression, Hierarchical (Process 24 & 26) - RETIRED #define UID_JPEGProcess24_26TransferSyntax "1.2.840.10008.1.2.4.63" /// JPEG Full Progression, Hierarchical (Process 25 & 27) - RETIRED #define UID_JPEGProcess25_27TransferSyntax "1.2.840.10008.1.2.4.64" /// JPEG Lossless, Hierarchical (Process 28) - RETIRED #define UID_JPEGProcess28TransferSyntax "1.2.840.10008.1.2.4.65" /// JPEG Lossless, Hierarchical (Process 29) - RETIRED #define UID_JPEGProcess29TransferSyntax "1.2.840.10008.1.2.4.66" /** JPEG Lossless, Non-Hierarchical, First-Order Prediction (Process 14 * [Selection Value 1]): Default Transfer Syntax for Lossless JPEG Image Compression */ #define UID_JPEGProcess14SV1TransferSyntax "1.2.840.10008.1.2.4.70" /// JPEG-LS Lossless Image Compression #define UID_JPEGLSLosslessTransferSyntax "1.2.840.10008.1.2.4.80" /// JPEG-LS Lossy (Near-Lossless) Image Compression #define UID_JPEGLSLossyTransferSyntax "1.2.840.10008.1.2.4.81" /// JPEG 2000 Image Compression (Lossless Only) #define UID_JPEG2000LosslessOnlyTransferSyntax "1.2.840.10008.1.2.4.90" /// JPEG 2000 Image Compression (Lossless or Lossy) #define UID_JPEG2000TransferSyntax "1.2.840.10008.1.2.4.91" /// JPEG 2000 Part 2 Multi-component Image Compression (Lossless Only) #define UID_JPEG2000Part2MulticomponentImageCompressionLosslessOnlyTransferSyntax "1.2.840.10008.1.2.4.92" /// JPEG 2000 Part 2 Multi-component Image Compression (Lossless or Lossy) #define UID_JPEG2000Part2MulticomponentImageCompressionTransferSyntax "1.2.840.10008.1.2.4.93" /// JPIP Referenced #define UID_JPIPReferencedTransferSyntax "1.2.840.10008.1.2.4.94" /// JPIP Referenced Deflate #define UID_JPIPReferencedDeflateTransferSyntax "1.2.840.10008.1.2.4.95" /// MPEG2 Main Profile @ Main Level #define UID_MPEG2MainProfileAtMainLevelTransferSyntax "1.2.840.10008.1.2.4.100" /// MPEG2 Main Profile @ High Level #define UID_MPEG2MainProfileAtHighLevelTransferSyntax "1.2.840.10008.1.2.4.101" /// RLE Lossless #define UID_RLELosslessTransferSyntax "1.2.840.10008.1.2.5" /** MIME encapsulation (Supplement 101) is only a pseudo transfer syntax used to * refer to MIME encapsulated HL7 CDA documents from a DICOMDIR when stored * on a DICOM storage medium. It is never used for network communication * or encoding of DICOM objects. */ #define UID_RFC2557MIMEEncapsulationTransferSyntax "1.2.840.10008.1.2.6.1" /** XML encoding (Supplement 114) is only a pseudo transfer syntax used to refer to * encapsulated HL7 CDA documents from a DICOMDIR when stored on a DICOM storage * medium. It is never used for network communication or encoding of DICOM objects. */ #define UID_XMLEncodingTransferSyntax "1.2.840.10008.1.2.6.2" /* ** Defined SOP Class UIDs according to DICOM standard */ // Storage #define UID_RETIRED_StoredPrintStorage "1.2.840.10008.5.1.1.27" #define UID_RETIRED_HardcopyGrayscaleImageStorage "1.2.840.10008.5.1.1.29" #define UID_RETIRED_HardcopyColorImageStorage "1.2.840.10008.5.1.1.30" #define UID_ComputedRadiographyImageStorage "1.2.840.10008.5.1.4.1.1.1" #define UID_DigitalXRayImageStorageForPresentation "1.2.840.10008.5.1.4.1.1.1.1" #define UID_DigitalXRayImageStorageForProcessing "1.2.840.10008.5.1.4.1.1.1.1.1" #define UID_DigitalMammographyXRayImageStorageForPresentation "1.2.840.10008.5.1.4.1.1.1.2" #define UID_DigitalMammographyXRayImageStorageForProcessing "1.2.840.10008.5.1.4.1.1.1.2.1" #define UID_DigitalIntraOralXRayImageStorageForPresentation "1.2.840.10008.5.1.4.1.1.1.3" #define UID_DigitalIntraOralXRayImageStorageForProcessing "1.2.840.10008.5.1.4.1.1.1.3.1" #define UID_CTImageStorage "1.2.840.10008.5.1.4.1.1.2" #define UID_EnhancedCTImageStorage "1.2.840.10008.5.1.4.1.1.2.1" #define UID_RETIRED_UltrasoundMultiframeImageStorage "1.2.840.10008.5.1.4.1.1.3" #define UID_UltrasoundMultiframeImageStorage "1.2.840.10008.5.1.4.1.1.3.1" #define UID_MRImageStorage "1.2.840.10008.5.1.4.1.1.4" #define UID_EnhancedMRImageStorage "1.2.840.10008.5.1.4.1.1.4.1" #define UID_MRSpectroscopyStorage "1.2.840.10008.5.1.4.1.1.4.2" #define UID_EnhancedMRColorImageStorage "1.2.840.10008.5.1.4.1.1.4.3" #define UID_RETIRED_NuclearMedicineImageStorage "1.2.840.10008.5.1.4.1.1.5" #define UID_RETIRED_UltrasoundImageStorage "1.2.840.10008.5.1.4.1.1.6" #define UID_UltrasoundImageStorage "1.2.840.10008.5.1.4.1.1.6.1" #define UID_EnhancedUSVolumeStorage "1.2.840.10008.5.1.4.1.1.6.2" #define UID_SecondaryCaptureImageStorage "1.2.840.10008.5.1.4.1.1.7" #define UID_MultiframeSingleBitSecondaryCaptureImageStorage "1.2.840.10008.5.1.4.1.1.7.1" #define UID_MultiframeGrayscaleByteSecondaryCaptureImageStorage "1.2.840.10008.5.1.4.1.1.7.2" #define UID_MultiframeGrayscaleWordSecondaryCaptureImageStorage "1.2.840.10008.5.1.4.1.1.7.3" #define UID_MultiframeTrueColorSecondaryCaptureImageStorage "1.2.840.10008.5.1.4.1.1.7.4" #define UID_RETIRED_StandaloneOverlayStorage "1.2.840.10008.5.1.4.1.1.8" #define UID_RETIRED_StandaloneCurveStorage "1.2.840.10008.5.1.4.1.1.9" #define UID_TwelveLeadECGWaveformStorage "1.2.840.10008.5.1.4.1.1.9.1.1" #define UID_GeneralECGWaveformStorage "1.2.840.10008.5.1.4.1.1.9.1.2" #define UID_AmbulatoryECGWaveformStorage "1.2.840.10008.5.1.4.1.1.9.1.3" #define UID_HemodynamicWaveformStorage "1.2.840.10008.5.1.4.1.1.9.2.1" #define UID_CardiacElectrophysiologyWaveformStorage "1.2.840.10008.5.1.4.1.1.9.3.1" #define UID_BasicVoiceAudioWaveformStorage "1.2.840.10008.5.1.4.1.1.9.4.1" #define UID_GeneralAudioWaveformStorage "1.2.840.10008.5.1.4.1.1.9.4.2" #define UID_ArterialPulseWaveformStorage "1.2.840.10008.5.1.4.1.1.9.5.1" #define UID_RespiratoryWaveformStorage "1.2.840.10008.5.1.4.1.1.9.6.1" #define UID_RETIRED_StandaloneModalityLUTStorage "1.2.840.10008.5.1.4.1.1.10" #define UID_RETIRED_StandaloneVOILUTStorage "1.2.840.10008.5.1.4.1.1.11" #define UID_GrayscaleSoftcopyPresentationStateStorage "1.2.840.10008.5.1.4.1.1.11.1" #define UID_ColorSoftcopyPresentationStateStorage "1.2.840.10008.5.1.4.1.1.11.2" #define UID_PseudoColorSoftcopyPresentationStateStorage "1.2.840.10008.5.1.4.1.1.11.3" #define UID_BlendingSoftcopyPresentationStateStorage "1.2.840.10008.5.1.4.1.1.11.4" #define UID_XAXRFGrayscaleSoftcopyPresentationStateStorage "1.2.840.10008.5.1.4.1.1.11.5" #define UID_XRayAngiographicImageStorage "1.2.840.10008.5.1.4.1.1.12.1" #define UID_EnhancedXAImageStorage "1.2.840.10008.5.1.4.1.1.12.1.1" #define UID_XRayRadiofluoroscopicImageStorage "1.2.840.10008.5.1.4.1.1.12.2" #define UID_EnhancedXRFImageStorage "1.2.840.10008.5.1.4.1.1.12.2.1" #define UID_XRay3DAngiographicImageStorage "1.2.840.10008.5.1.4.1.1.13.1.1" #define UID_XRay3DCraniofacialImageStorage "1.2.840.10008.5.1.4.1.1.13.1.2" #define UID_BreastTomosynthesisImageStorage "1.2.840.10008.5.1.4.1.1.13.1.3" #define UID_RETIRED_XRayAngiographicBiPlaneImageStorage "1.2.840.10008.5.1.4.1.1.12.3" #define UID_NuclearMedicineImageStorage "1.2.840.10008.5.1.4.1.1.20" #define UID_RawDataStorage "1.2.840.10008.5.1.4.1.1.66" #define UID_SpatialRegistrationStorage "1.2.840.10008.5.1.4.1.1.66.1" #define UID_SpatialFiducialsStorage "1.2.840.10008.5.1.4.1.1.66.2" #define UID_DeformableSpatialRegistrationStorage "1.2.840.10008.5.1.4.1.1.66.3" #define UID_SegmentationStorage "1.2.840.10008.5.1.4.1.1.66.4" #define UID_SurfaceSegmentationStorage "1.2.840.10008.5.1.4.1.1.66.5" #define UID_RealWorldValueMappingStorage "1.2.840.10008.5.1.4.1.1.67" #define UID_RETIRED_VLImageStorage "1.2.840.10008.5.1.4.1.1.77.1" #define UID_VLEndoscopicImageStorage "1.2.840.10008.5.1.4.1.1.77.1.1" #define UID_VideoEndoscopicImageStorage "1.2.840.10008.5.1.4.1.1.77.1.1.1" #define UID_VLMicroscopicImageStorage "1.2.840.10008.5.1.4.1.1.77.1.2" #define UID_VideoMicroscopicImageStorage "1.2.840.10008.5.1.4.1.1.77.1.2.1" #define UID_VLSlideCoordinatesMicroscopicImageStorage "1.2.840.10008.5.1.4.1.1.77.1.3" #define UID_VLPhotographicImageStorage "1.2.840.10008.5.1.4.1.1.77.1.4" #define UID_VideoPhotographicImageStorage "1.2.840.10008.5.1.4.1.1.77.1.4.1" #define UID_OphthalmicPhotography8BitImageStorage "1.2.840.10008.5.1.4.1.1.77.1.5.1" #define UID_OphthalmicPhotography16BitImageStorage "1.2.840.10008.5.1.4.1.1.77.1.5.2" #define UID_StereometricRelationshipStorage "1.2.840.10008.5.1.4.1.1.77.1.5.3" #define UID_OphthalmicTomographyImageStorage "1.2.840.10008.5.1.4.1.1.77.1.5.4" #define UID_VLWholeSlideMicroscopyImageStorage "1.2.840.10008.5.1.4.1.1.77.1.6" #define UID_RETIRED_VLMultiFrameImageStorage "1.2.840.10008.5.1.4.1.1.77.2" #define UID_LensometryMeasurementsStorage "1.2.840.10008.5.1.4.1.1.78.1" #define UID_AutorefractionMeasurementsStorage "1.2.840.10008.5.1.4.1.1.78.2" #define UID_KeratometryMeasurementsStorage "1.2.840.10008.5.1.4.1.1.78.3" #define UID_SubjectiveRefractionMeasurementsStorage "1.2.840.10008.5.1.4.1.1.78.4" #define UID_VisualAcuityMeasurementsStorage "1.2.840.10008.5.1.4.1.1.78.5" #define UID_SpectaclePrescriptionReportStorage "1.2.840.10008.5.1.4.1.1.78.6" #define UID_OphthalmicAxialMeasurementsStorage "1.2.840.10008.5.1.4.1.1.78.7" #define UID_IntraocularLensCalculationsStorage "1.2.840.10008.5.1.4.1.1.78.8" #define UID_MacularGridThicknessAndVolumeReportStorage "1.2.840.10008.5.1.4.1.1.79.1" #define UID_OphthalmicVisualFieldStaticPerimetryMeasurementsStorage "1.2.840.10008.5.1.4.1.1.80.1" #define UID_BasicTextSRStorage "1.2.840.10008.5.1.4.1.1.88.11" #define UID_EnhancedSRStorage "1.2.840.10008.5.1.4.1.1.88.22" #define UID_ComprehensiveSRStorage "1.2.840.10008.5.1.4.1.1.88.33" #define UID_ProcedureLogStorage "1.2.840.10008.5.1.4.1.1.88.40" #define UID_MammographyCADSRStorage "1.2.840.10008.5.1.4.1.1.88.50" #define UID_KeyObjectSelectionDocumentStorage "1.2.840.10008.5.1.4.1.1.88.59" #define UID_ChestCADSRStorage "1.2.840.10008.5.1.4.1.1.88.65" #define UID_XRayRadiationDoseSRStorage "1.2.840.10008.5.1.4.1.1.88.67" #define UID_ColonCADSRStorage "1.2.840.10008.5.1.4.1.1.88.69" #define UID_ImplantationPlanSRDocumentStorage "1.2.840.10008.5.1.4.1.1.88.70" #define UID_EncapsulatedPDFStorage "1.2.840.10008.5.1.4.1.1.104.1" #define UID_EncapsulatedCDAStorage "1.2.840.10008.5.1.4.1.1.104.2" #define UID_PositronEmissionTomographyImageStorage "1.2.840.10008.5.1.4.1.1.128" #define UID_RETIRED_StandalonePETCurveStorage "1.2.840.10008.5.1.4.1.1.129" #define UID_EnhancedPETImageStorage "1.2.840.10008.5.1.4.1.1.130" #define UID_BasicStructuredDisplayStorage "1.2.840.10008.5.1.4.1.1.131" #define UID_RTImageStorage "1.2.840.10008.5.1.4.1.1.481.1" #define UID_RTDoseStorage "1.2.840.10008.5.1.4.1.1.481.2" #define UID_RTStructureSetStorage "1.2.840.10008.5.1.4.1.1.481.3" #define UID_RTBeamsTreatmentRecordStorage "1.2.840.10008.5.1.4.1.1.481.4" #define UID_RTPlanStorage "1.2.840.10008.5.1.4.1.1.481.5" #define UID_RTBrachyTreatmentRecordStorage "1.2.840.10008.5.1.4.1.1.481.6" #define UID_RTTreatmentSummaryRecordStorage "1.2.840.10008.5.1.4.1.1.481.7" #define UID_RTIonPlanStorage "1.2.840.10008.5.1.4.1.1.481.8" #define UID_RTIonBeamsTreatmentRecordStorage "1.2.840.10008.5.1.4.1.1.481.9" #define UID_GenericImplantTemplateStorage "1.2.840.10008.5.1.4.43.1" #define UID_ImplantAssemblyTemplateStorage "1.2.840.10008.5.1.4.44.1" #define UID_ImplantTemplateGroupStorage "1.2.840.10008.5.1.4.45.1" // DICOMDIR; was UID_BasicDirectoryStorageSOPClass in DCMTK versions prior to 3.5.3 #define UID_MediaStorageDirectoryStorage "1.2.840.10008.1.3.10" /* Hanging Protocols Storage is a special case because hanging protocols use a different information model, i.e. there is no patient, study or series in a hanging protocol IOD. */ #define UID_HangingProtocolStorage "1.2.840.10008.5.1.4.38.1" // Query/Retrieve #define UID_FINDPatientRootQueryRetrieveInformationModel "1.2.840.10008.5.1.4.1.2.1.1" #define UID_MOVEPatientRootQueryRetrieveInformationModel "1.2.840.10008.5.1.4.1.2.1.2" #define UID_GETPatientRootQueryRetrieveInformationModel "1.2.840.10008.5.1.4.1.2.1.3" #define UID_FINDStudyRootQueryRetrieveInformationModel "1.2.840.10008.5.1.4.1.2.2.1" #define UID_MOVEStudyRootQueryRetrieveInformationModel "1.2.840.10008.5.1.4.1.2.2.2" #define UID_GETStudyRootQueryRetrieveInformationModel "1.2.840.10008.5.1.4.1.2.2.3" #define UID_RETIRED_FINDPatientStudyOnlyQueryRetrieveInformationModel "1.2.840.10008.5.1.4.1.2.3.1" #define UID_RETIRED_MOVEPatientStudyOnlyQueryRetrieveInformationModel "1.2.840.10008.5.1.4.1.2.3.2" #define UID_RETIRED_GETPatientStudyOnlyQueryRetrieveInformationModel "1.2.840.10008.5.1.4.1.2.3.3" #define UID_RETIRED_MOVECompositeInstanceRootRetrieve "1.2.840.10008.5.1.4.1.2.4.2" #define UID_RETIRED_GETCompositeInstanceRootRetrieve "1.2.840.10008.5.1.4.1.2.4.3" #define UID_RETIRED_GETCompositeInstanceRetrieveWithoutBulkData "1.2.840.10008.5.1.4.1.2.5.3" // Worklist #define UID_FINDModalityWorklistInformationModel "1.2.840.10008.5.1.4.31" #define UID_FINDGeneralPurposeWorklistInformationModel "1.2.840.10008.5.1.4.32.1" // General Purpose Worklist #define UID_GeneralPurposeScheduledProcedureStepSOPClass "1.2.840.10008.5.1.4.32.2" #define UID_GeneralPurposePerformedProcedureStepSOPClass "1.2.840.10008.5.1.4.32.3" #define UID_GeneralPurposeWorklistManagementMetaSOPClass "1.2.840.10008.5.1.4.32" // MPPS #define UID_ModalityPerformedProcedureStepSOPClass "1.2.840.10008.3.1.2.3.3" #define UID_ModalityPerformedProcedureStepRetrieveSOPClass "1.2.840.10008.3.1.2.3.4" #define UID_ModalityPerformedProcedureStepNotificationSOPClass "1.2.840.10008.3.1.2.3.5" // Unified Worklist and Procedure Step #define UID_UnifiedWorklistAndProcedureStepServiceClass "1.2.840.10008.5.1.4.34.4" #define UID_UnifiedProcedureStepPushSOPClass "1.2.840.10008.5.1.4.34.4.1" #define UID_UnifiedProcedureStepWatchSOPClass "1.2.840.10008.5.1.4.34.4.2" #define UID_UnifiedProcedureStepPullSOPClass "1.2.840.10008.5.1.4.34.4.3" #define UID_UnifiedProcedureStepEventSOPClass "1.2.840.10008.5.1.4.34.4.4" #define UID_UnifiedWorklistAndProcedureStepSOPInstance "1.2.840.10008.5.1.4.34.5" // Storage Commitment #define UID_StorageCommitmentPushModelSOPClass "1.2.840.10008.1.20.1" #define UID_StorageCommitmentPushModelSOPInstance "1.2.840.10008.1.20.1.1" #define UID_RETIRED_StorageCommitmentPullModelSOPClass "1.2.840.10008.1.20.2" #define UID_RETIRED_StorageCommitmentPullModelSOPInstance "1.2.840.10008.1.20.2.1" // Hanging Protocols #define UID_FINDHangingProtocolInformationModel "1.2.840.10008.5.1.4.38.2" #define UID_MOVEHangingProtocolInformationModel "1.2.840.10008.5.1.4.38.3" // Relevant Patient Information Query #define UID_GeneralRelevantPatientInformationQuery "1.2.840.10008.5.1.4.37.1" #define UID_BreastImagingRelevantPatientInformationQuery "1.2.840.10008.5.1.4.37.2" #define UID_CardiacRelevantPatientInformationQuery "1.2.840.10008.5.1.4.37.3" // Color Palette Storage and Query/Retrieve #define UID_ColorPaletteStorage "1.2.840.10008.5.1.4.39.1" #define UID_FINDColorPaletteInformationModel "1.2.840.10008.5.1.4.39.2" #define UID_MOVEColorPaletteInformationModel "1.2.840.10008.5.1.4.39.3" #define UID_GETColorPaletteInformationModel "1.2.840.10008.5.1.4.39.4" // Implant Template Query/Retrieve #define UID_FINDGenericImplantTemplateInformationModel "1.2.840.10008.5.1.4.43.2" #define UID_MOVEGenericImplantTemplateInformationModel "1.2.840.10008.5.1.4.43.3" #define UID_GETGenericImplantTemplateInformationModel "1.2.840.10008.5.1.4.43.4" #define UID_FINDImplantAssemblyTemplateInformationModel "1.2.840.10008.5.1.4.44.2" #define UID_MOVEImplantAssemblyTemplateInformationModel "1.2.840.10008.5.1.4.44.3" #define UID_GETImplantAssemblyTemplateInformationModel "1.2.840.10008.5.1.4.44.4" #define UID_FINDImplantTemplateGroupInformationModel "1.2.840.10008.5.1.4.45.2" #define UID_MOVEImplantTemplateGroupInformationModel "1.2.840.10008.5.1.4.45.3" #define UID_GETImplantTemplateGroupInformationModel "1.2.840.10008.5.1.4.45.4" // Print #define UID_BasicFilmSessionSOPClass "1.2.840.10008.5.1.1.1" #define UID_BasicFilmBoxSOPClass "1.2.840.10008.5.1.1.2" #define UID_BasicGrayscaleImageBoxSOPClass "1.2.840.10008.5.1.1.4" #define UID_BasicColorImageBoxSOPClass "1.2.840.10008.5.1.1.4.1" #define UID_RETIRED_ReferencedImageBoxSOPClass "1.2.840.10008.5.1.1.4.2" #define UID_BasicGrayscalePrintManagementMetaSOPClass "1.2.840.10008.5.1.1.9" #define UID_RETIRED_ReferencedGrayscalePrintManagementMetaSOPClass "1.2.840.10008.5.1.1.9.1" #define UID_PrintJobSOPClass "1.2.840.10008.5.1.1.14" #define UID_BasicAnnotationBoxSOPClass "1.2.840.10008.5.1.1.15" #define UID_PrinterSOPClass "1.2.840.10008.5.1.1.16" #define UID_PrinterConfigurationRetrievalSOPClass "1.2.840.10008.5.1.1.16.376" #define UID_PrinterSOPInstance "1.2.840.10008.5.1.1.17" #define UID_PrinterConfigurationRetrievalSOPInstance "1.2.840.10008.5.1.1.17.376" #define UID_BasicColorPrintManagementMetaSOPClass "1.2.840.10008.5.1.1.18" #define UID_RETIRED_ReferencedColorPrintManagementMetaSOPClass "1.2.840.10008.5.1.1.18.1" #define UID_VOILUTBoxSOPClass "1.2.840.10008.5.1.1.22" #define UID_PresentationLUTSOPClass "1.2.840.10008.5.1.1.23" #define UID_RETIRED_ImageOverlayBoxSOPClass "1.2.840.10008.5.1.1.24" #define UID_RETIRED_BasicPrintImageOverlayBoxSOPClass "1.2.840.10008.5.1.1.24.1" #define UID_RETIRED_PrintQueueSOPInstance "1.2.840.10008.5.1.1.25" #define UID_RETIRED_PrintQueueManagementSOPClass "1.2.840.10008.5.1.1.26" #define UID_RETIRED_PullPrintRequestSOPClass "1.2.840.10008.5.1.1.31" #define UID_RETIRED_PullStoredPrintManagementMetaSOPClass "1.2.840.10008.5.1.1.32" // Detached Management #define UID_RETIRED_DetachedPatientManagementSOPClass "1.2.840.10008.3.1.2.1.1" #define UID_RETIRED_DetachedPatientManagementMetaSOPClass "1.2.840.10008.3.1.2.1.4" #define UID_RETIRED_DetachedVisitManagementSOPClass "1.2.840.10008.3.1.2.2.1" #define UID_RETIRED_DetachedStudyManagementSOPClass "1.2.840.10008.3.1.2.3.1" #define UID_RETIRED_DetachedResultsManagementSOPClass "1.2.840.10008.3.1.2.5.1" #define UID_RETIRED_DetachedResultsManagementMetaSOPClass "1.2.840.10008.3.1.2.5.4" #define UID_RETIRED_DetachedStudyManagementMetaSOPClass "1.2.840.10008.3.1.2.5.5" #define UID_RETIRED_DetachedInterpretationManagementSOPClass "1.2.840.10008.3.1.2.6.1" // Procedure Log #define UID_ProceduralEventLoggingSOPClass "1.2.840.10008.1.40" #define UID_ProceduralEventLoggingSOPInstance "1.2.840.10008.1.40.1" // Substance Administration #define UID_SubstanceAdministrationLoggingSOPClass "1.2.840.10008.1.42" #define UID_SubstanceAdministrationLoggingSOPInstance "1.2.840.10008.1.42.1" #define UID_ProductCharacteristicsQuerySOPClass "1.2.840.10008.5.1.4.41" #define UID_SubstanceApprovalQuerySOPClass "1.2.840.10008.5.1.4.42" // Media Creation #define UID_MediaCreationManagementSOPClass "1.2.840.10008.5.1.1.33" // SOP Class Relationship Negotiation #define UID_StorageServiceClass "1.2.840.10008.4.2" // Instance Availability Notification #define UID_InstanceAvailabilityNotificationSOPClass "1.2.840.10008.5.1.4.33" // Application Hosting #define UID_NativeDICOMModel "1.2.840.10008.7.1.1" #define UID_AbstractMultiDimensionalImageModel "1.2.840.10008.7.1.2" // Other #define UID_VerificationSOPClass "1.2.840.10008.1.1" #define UID_RETIRED_BasicStudyContentNotificationSOPClass "1.2.840.10008.1.9" #define UID_RETIRED_StudyComponentManagementSOPClass "1.2.840.10008.3.1.2.3.2" // Coding Schemes #define UID_DICOMControlledTerminologyCodingScheme "1.2.840.10008.2.16.4" #define UID_DICOMUIDRegistryCodingScheme "1.2.840.10008.2.6.1" // Configuration Management LDAP UIDs #define UID_LDAP_dicomDeviceName "1.2.840.10008.15.0.3.1" #define UID_LDAP_dicomDescription "1.2.840.10008.15.0.3.2" #define UID_LDAP_dicomManufacturer "1.2.840.10008.15.0.3.3" #define UID_LDAP_dicomManufacturerModelName "1.2.840.10008.15.0.3.4" #define UID_LDAP_dicomSoftwareVersion "1.2.840.10008.15.0.3.5" #define UID_LDAP_dicomVendorData "1.2.840.10008.15.0.3.6" #define UID_LDAP_dicomAETitle "1.2.840.10008.15.0.3.7" #define UID_LDAP_dicomNetworkConnectionReference "1.2.840.10008.15.0.3.8" #define UID_LDAP_dicomApplicationCluster "1.2.840.10008.15.0.3.9" #define UID_LDAP_dicomAssociationInitiator "1.2.840.10008.15.0.3.10" #define UID_LDAP_dicomAssociationAcceptor "1.2.840.10008.15.0.3.11" #define UID_LDAP_dicomHostname "1.2.840.10008.15.0.3.12" #define UID_LDAP_dicomPort "1.2.840.10008.15.0.3.13" #define UID_LDAP_dicomSOPClass "1.2.840.10008.15.0.3.14" #define UID_LDAP_dicomTransferRole "1.2.840.10008.15.0.3.15" #define UID_LDAP_dicomTransferSyntax "1.2.840.10008.15.0.3.16" #define UID_LDAP_dicomPrimaryDeviceType "1.2.840.10008.15.0.3.17" #define UID_LDAP_dicomRelatedDeviceReference "1.2.840.10008.15.0.3.18" #define UID_LDAP_dicomPreferredCalledAETitle "1.2.840.10008.15.0.3.19" #define UID_LDAP_dicomTLSCyphersuite "1.2.840.10008.15.0.3.20" #define UID_LDAP_dicomAuthorizedNodeCertificateReference "1.2.840.10008.15.0.3.21" #define UID_LDAP_dicomThisNodeCertificateReference "1.2.840.10008.15.0.3.22" #define UID_LDAP_dicomInstalled "1.2.840.10008.15.0.3.23" #define UID_LDAP_dicomStationName "1.2.840.10008.15.0.3.24" #define UID_LDAP_dicomDeviceSerialNumber "1.2.840.10008.15.0.3.25" #define UID_LDAP_dicomInstitutionName "1.2.840.10008.15.0.3.26" #define UID_LDAP_dicomInstitutionAddress "1.2.840.10008.15.0.3.27" #define UID_LDAP_dicomInstitutionDepartmentName "1.2.840.10008.15.0.3.28" #define UID_LDAP_dicomIssuerOfPatientID "1.2.840.10008.15.0.3.29" #define UID_LDAP_dicomPreferredCallingAETitle "1.2.840.10008.15.0.3.30" #define UID_LDAP_dicomSupportedCharacterSet "1.2.840.10008.15.0.3.31" #define UID_LDAP_dicomConfigurationRoot "1.2.840.10008.15.0.4.1" #define UID_LDAP_dicomDevicesRoot "1.2.840.10008.15.0.4.2" #define UID_LDAP_dicomUniqueAETitlesRegistryRoot "1.2.840.10008.15.0.4.3" #define UID_LDAP_dicomDevice "1.2.840.10008.15.0.4.4" #define UID_LDAP_dicomNetworkAE "1.2.840.10008.15.0.4.5" #define UID_LDAP_dicomNetworkConnection "1.2.840.10008.15.0.4.6" #define UID_LDAP_dicomUniqueAETitle "1.2.840.10008.15.0.4.7" #define UID_LDAP_dicomTransferCapability "1.2.840.10008.15.0.4.8" // UTC Synchronization Frame of Reference (CP 432) #define UID_UniversalCoordinatedTimeSynchronizationFrameOfReference "1.2.840.10008.15.1.1" // Well-known Frame of References #define UID_TalairachBrainAtlasFrameOfReference "1.2.840.10008.1.4.1.1" #define UID_SPM2T1FrameOfReference "1.2.840.10008.1.4.1.2" #define UID_SPM2T2FrameOfReference "1.2.840.10008.1.4.1.3" #define UID_SPM2PDFrameOfReference "1.2.840.10008.1.4.1.4" #define UID_SPM2EPIFrameOfReference "1.2.840.10008.1.4.1.5" #define UID_SPM2FILT1FrameOfReference "1.2.840.10008.1.4.1.6" #define UID_SPM2PETFrameOfReference "1.2.840.10008.1.4.1.7" #define UID_SPM2TRANSMFrameOfReference "1.2.840.10008.1.4.1.8" #define UID_SPM2SPECTFrameOfReference "1.2.840.10008.1.4.1.9" #define UID_SPM2GRAYFrameOfReference "1.2.840.10008.1.4.1.10" #define UID_SPM2WHITEFrameOfReference "1.2.840.10008.1.4.1.11" #define UID_SPM2CSFFrameOfReference "1.2.840.10008.1.4.1.12" #define UID_SPM2BRAINMASKFrameOfReference "1.2.840.10008.1.4.1.13" #define UID_SPM2AVG305T1FrameOfReference "1.2.840.10008.1.4.1.14" #define UID_SPM2AVG152T1FrameOfReference "1.2.840.10008.1.4.1.15" #define UID_SPM2AVG152T2FrameOfReference "1.2.840.10008.1.4.1.16" #define UID_SPM2AVG152PDFrameOfReference "1.2.840.10008.1.4.1.17" #define UID_SPM2SINGLESUBJT1FrameOfReference "1.2.840.10008.1.4.1.18" #define UID_ICBM452T1FrameOfReference "1.2.840.10008.1.4.2.1" #define UID_ICBMSingleSubjectMRIFrameOfReference "1.2.840.10008.1.4.2.2" // Well-known SOP Instances for Color Palettes #define UID_HotIronColorPaletteSOPInstance "1.2.840.10008.1.5.1" #define UID_PETColorPaletteSOPInstance "1.2.840.10008.1.5.2" #define UID_HotMetalBlueColorPaletteSOPInstance "1.2.840.10008.1.5.3" #define UID_PET20StepColorPaletteSOPInstance "1.2.840.10008.1.5.4" // Private DCMTK UIDs // Private SOP Class UID used to shutdown external network applications #define UID_PrivateShutdownSOPClass "1.2.276.0.7230010.3.4.1915765545.18030.917282194.0" /* DRAFT SUPPLEMENTS - EXPERIMENTAL USE ONLY */ /* * The following UIDs were defined in "frozen draft for trial implementation" versions * of various DICOM supplements and are or will be changed before final text. * Since it is likely that trial implementations exist, we leave the UIDs in the dictionary. */ /* Supplement 23 Frozen Draft (November 1997) */ #define UID_DRAFT_SRTextStorage "1.2.840.10008.5.1.4.1.1.88.1" #define UID_DRAFT_SRAudioStorage "1.2.840.10008.5.1.4.1.1.88.2" #define UID_DRAFT_SRDetailStorage "1.2.840.10008.5.1.4.1.1.88.3" #define UID_DRAFT_SRComprehensiveStorage "1.2.840.10008.5.1.4.1.1.88.4" /* Supplement 30 Draft 08 for Demonstration (October 1997) */ #define UID_DRAFT_WaveformStorage "1.2.840.10008.5.1.4.1.1.9.1" /* Supplement 74 Frozen Draft (October 2007) */ #define UID_DRAFT_RTBeamsDeliveryInstructionStorage "1.2.840.10008.5.1.4.34.1" #define UID_DRAFT_RTConventionalMachineVerification "1.2.840.10008.5.1.4.34.2" #define UID_DRAFT_RTIonMachineVerification "1.2.840.10008.5.1.4.34.3" #endif /* DCUID_H */ /* ** CVS/RCS Log: ** $Log: dcuid.h,v $ ** Revision 1.89 2010-11-05 10:26:10 joergr ** Added new SOP Class UIDs from Supplement 131 and 134 (Implant Templates). ** ** Revision 1.88 2010-10-14 13:15:42 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.87 2010-09-30 14:08:19 joergr ** Added two Model UIDs from Supplement 118 (Application Hosting). ** ** Revision 1.86 2010-09-30 07:53:17 joergr ** Fixed typo in the name of a Storage SOP Class (copied from DICOM part 6). ** ** Revision 1.85 2010-09-28 07:55:53 joergr ** Added VL Whole Slide Microscopy Image Storage SOP Class (Supplement 145). ** ** Revision 1.84 2010-09-27 14:04:42 joergr ** Updated list of SOP Class UIDs and well-known SOP Instance UIDs according to ** the current edition of the DICOM standard (including final text supplements). ** ** Revision 1.83 2010-09-27 08:24:03 joergr ** Added comment to retired transfer syntaxes and changed order of transfer ** syntax definitions according to their UID value. ** ** Revision 1.82 2010-09-24 13:24:16 joergr ** Compared names of SOP Class UIDs with 2009 edition of the DICOM standard. The ** resulting name changes are mainly caused by the fact that the corresponding ** SOP Class is now retired. ** ** Revision 1.81 2010-09-15 08:46:16 joergr ** Added definition of XML encoding transfer syntax (Supplement 114) and JPIP ** referenced transfer syntaxes (Supplement 106). ** ** Revision 1.80 2010-09-02 12:12:43 joergr ** Added support for "MPEG2 Main Profile @ High Level" transfer syntax. ** ** Revision 1.79 2010-08-10 11:59:31 uli ** Fixed some cases where dcmFindNameOfUID() returning NULL could cause crashes. ** ** Revision 1.78 2010-07-07 07:28:36 onken ** Added Ophthalmic Tomography Image Storage to list of supported SOP classes. ** ** Revision 1.77 2010-03-01 09:08:45 uli ** Removed some unnecessary include directives in the headers. ** ** Revision 1.76 2009-08-07 14:37:33 joergr ** Removed package version suffix "+" from development snapshots. ** ** Revision 1.75 2008-04-30 13:30:26 joergr ** Moved package information like version number and release date to a central ** configuration file (one for GNU autoconf and one for CMake systems). ** Added support for new compiler definition "DCMTK_BUILD_DATE" that can be used ** to distinguish binaries of the current development version from the official ** release. ** ** Revision 1.74 2007/11/29 14:30:35 meichel ** Updated doxygen API documentation ** ** Revision 1.73 2006/10/27 11:58:49 joergr ** Added new default parameter to dcmSOPClassUIDToModality() that allows for ** the specification of the return value in case the SOP Class is unknown. ** ** Revision 1.72 2005/12/20 16:24:59 meichel ** Updated version name and implementation name to reflect release 3.5.4. ** ** Revision 1.71 2005/12/08 16:28:48 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.70 2005/11/16 18:31:42 joergr ** Added support for X-Ray Radiation Dose SR SOP class. ** ** Revision 1.69 2005/10/25 08:55:32 meichel ** Updated list of UIDs and added support for new transfer syntaxes ** and storage SOP classes. ** ** Revision 1.68 2005/03/17 16:31:30 meichel ** Changed CR/LF to LF ** ** Revision 1.67 2005/02/17 13:09:55 joergr ** Renamed "MicroscopicImageStorage" to "VideoMicroscopicImageStorage". ** ** Revision 1.66 2004/11/10 12:37:55 meichel ** Updated directory of UIDs for 2004 DICOM edition. Removed all standalone and ** most retired storage SOP classes from list of storage SOP classes for ** storescu, storescp, imagectn etc. to keep list shorter than 64 entries. ** ** Revision 1.65 2004/08/03 11:41:07 meichel ** Headers libc.h and unistd.h are now included via ofstdinc.h ** ** Revision 1.64 2004/05/27 10:31:39 joergr ** Updated version name and implementation name to reflect release 3.5.3. ** ** Revision 1.63 2004/04/14 11:49:28 joergr ** Replaced non-Unix newline characters. ** ** Revision 1.62 2004/04/06 18:02:25 joergr ** Updated data dictionary, UIDs and transfer syntaxes for the latest Final Text ** Supplements (42 and 47) and Correction Proposals (CP 25). ** Added missing suffix "TransferSyntax" to some transfer syntax constants. ** ** Revision 1.61 2004/03/16 13:43:26 joergr ** Renamed UID_BasicDirectoryStorageSOPClass to UID_MediaStorageDirectoryStorage. ** ** Revision 1.60 2004/02/13 14:10:30 joergr ** Fixed wrong spelling of "SpatialFiducialsStorage". ** ** Revision 1.59 2004/02/13 11:42:43 joergr ** Corrected order of tags, modified comments and other minor corrections. ** ** Revision 1.58 2004/02/11 15:53:08 wilkens ** Updated attribute and UID specification (update before dcmtk 3.5.3 release). ** ** Revision 1.57 2003/11/07 13:57:19 meichel ** Updated version name to reflect interim release 3.5.2a ** ** Revision 1.56 2003/10/09 17:47:25 joergr ** Renamed OFFIS_PRIVATE_CODING_xxx macros to OFFIS_CODING_xxx. ** ** Revision 1.55 2003/10/09 12:49:38 joergr ** Added support for SOP Class "Procedure Log" (Supplement 66). ** ** Revision 1.54 2003/05/20 08:53:27 joergr ** Added support for SOP Class "Chest CAD SR" (Supplement 65). ** ** Revision 1.53 2002/12/23 10:58:21 meichel ** Updated version name and implementation name to reflect release 3.5.2 ** ** Revision 1.52 2002/12/09 13:03:19 meichel ** Updated list of UIDs ** ** Revision 1.51 2002/11/27 12:07:23 meichel ** Adapted module dcmdata to use of new header file ofstdinc.h ** ** Revision 1.50 2002/06/19 15:35:55 meichel ** Updated list of SOP Class UIDs for Supplement 49 ** ** Revision 1.49 2002/01/08 10:43:00 joergr ** Corrected spelling of function dcmGenerateUniqueIdentifier(). ** Added comment about another reserved UID root (for OFFIS GO-Kard project). ** ** Revision 1.48 2001/12/20 11:16:53 meichel ** Updated Version Number and Implementation Version Name to reflect the ** current public release (3.5.1) ** ** Revision 1.47 2001/11/08 16:17:29 meichel ** Updated data dictionary, UIDs and transfer syntaxes for DICOM 2001 edition. ** ** Revision 1.46 2001/11/02 15:44:02 meichel ** Introduced DCMTK version number macro OFFIS_DCMTK_VERSION_NUMBER in dcuid.h ** ** Revision 1.45 2001/06/14 14:04:06 meichel ** Updated Version Number and Implementation Version Name to reflect the ** current public release (3.5.0) ** ** Revision 1.44 2001/06/01 15:48:46 meichel ** Updated copyright header ** ** Revision 1.43 2001/05/25 09:50:17 meichel ** Updated data dictionary and UID list (again). ** ** Revision 1.42 2001/05/10 16:10:36 meichel ** Updated data dictionary and UID list ** ** Revision 1.41 2000/12/20 10:18:23 meichel ** Updated Version Number and Implementation Version Name to reflect the ** current public release (3.4.2) ** ** Revision 1.40 2000/12/14 12:47:41 joergr ** Updated SOP Class and Transfer Syntax UIDs for 2000 edition of the DICOM ** standard. ** ** Revision 1.39 2000/11/16 12:49:11 joergr ** Added definition of InstanceCreatorUID. ** ** Revision 1.38 2000/10/12 08:19:05 joergr ** Updated data dictionary to reflect the changes made in supplement 23 ** (Structured Reporting) final text. ** Added private coding scheme creator UID for SR codes. Restructured scheme ** for site UIDs. ** ** Revision 1.37 2000/05/30 13:02:24 joergr ** Added new private SOP class (UID definition) to allow external shutdown ** of console applications via negotiation of this special SOP class ** (currently used for imagectn and dcmpsrcv). ** ** Revision 1.36 2000/04/14 16:04:50 meichel ** Made function dcmGenerateUniqueIdentifer thread safe by protecting ** the counter with a Mutex and using gethostbyname_r instead of ** gethostbyname on Posix platforms. ** ** Revision 1.35 2000/03/08 16:26:20 meichel ** Updated copyright header. ** ** Revision 1.34 2000/02/23 15:11:40 meichel ** Corrected macro for Borland C++ Builder 4 workaround. ** ** Revision 1.33 2000/02/03 11:48:22 meichel ** Rebuilt data dictionary based on 1999 standard text, ** latest supplements and CP packet 6. ** ** Revision 1.32 2000/02/01 10:12:03 meichel ** Avoiding to include as extern "C" on Borland C++ Builder 4, ** workaround for bug in compiler header files. ** ** Revision 1.31 1999/07/14 12:02:33 meichel ** Updated data dictionary for supplement 29, 39, 33_lb, CP packet 4 and 5. ** Corrected dcmtk applications for changes in attribute name constants. ** ** Revision 1.30 1999/05/06 12:42:09 meichel ** Updated Version Number and Implementation Version Name to reflect the ** current public release (3.4.0) ** ** Revision 1.29 1999/03/31 09:24:52 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.28 1999/03/22 13:41:22 meichel ** Reworked UID list based on the 1998 DICOM edition and the latest ** supplement versions. ** ** Revision 1.27 1999/03/17 11:08:25 meichel ** added UIDs for Supplement 32 (DX) ** ** Revision 1.26 1998/10/26 13:02:49 meichel ** Updated data dictionary and UIDs for Grayscale Softcopy Presentation State ** (Supplement 33 frozen draft). ** ** Revision 1.25 1998/02/25 14:26:29 hewett ** Updated status of supplements 17 & 22 to reflect their Final Text status ** Updated data dictionary and UID information to reflect changes in ** Supplement 24 (Stored Print Related SOP Classes). Some data dictionary ** attibutes and UIDs have changed between the Letter Ballot version and ** the Final Text version. ** ** Revision 1.24 1998/02/17 12:33:58 meichel ** Updated Version Number and Implementation Version Name to reflect the ** current public release (3.3.1). Updated documentation to reflect changes in 3.3.1. ** ** Revision 1.23 1998/02/06 09:03:09 hewett ** Updated support for Supplements 15 (Visible Light), ** 16 (Postscript Print Management), 17 (Modality Performed Procedure Step), ** 22 (Presentation Look Up Table (LUT)), 23 (Structured Reporting), ** 24 (Stored Print), 30 (Waveform Interchange). ** ** Revision 1.22 1998/01/14 15:14:45 hewett ** Added basic support for the Structured Reporting (SR) SOP Classes. ** ** Revision 1.21 1997/10/07 07:44:20 meichel ** Updated Version Number and Implementation Version Name to reflect the ** current public release (3.3) ** ** Revision 1.20 1997/10/01 11:42:26 hewett ** Updated DCMTK version number and date for 3.3 release ** ** Revision 1.19 1997/09/22 14:56:46 hewett ** Added a global list of Image SOP Classes UIDs (dcmImageSOPClassUIDs) ** which is used by dcmgpdir to identify SOP Classes which can be ** referenced from a DICOMDIR IMAGE record. ** ** Revision 1.18 1997/06/09 13:28:15 hewett ** Updated Version Number and Implementation Version Name to reflect the ** current public release (3.2.1) ** ** Revision 1.17 1997/06/02 08:27:48 hewett ** Updated Version Number and Implementation Version Name to reflect the ** current public release (3.2). ** ** Revision 1.16 1997/05/29 15:52:54 meichel ** Added constant for dcmtk release date in dcuid.h. ** All dcmtk applications now contain a version string ** which is displayed with the command line options ("usage" message) ** and which can be queried in the binary with the "ident" command. ** ** Revision 1.15 1997/05/23 10:44:17 meichel ** Major rewrite of storescp application. See CHANGES for details. ** Changes to interfaces of some DIMSE functions. ** ** Revision 1.14 1997/05/13 13:57:42 hewett ** Added UIDs for the draft supplements 12 (PET), 13 (Queue Management), ** 15 (Visible Light), 17 (Modality Performed Procedure Step), 22 (User ** Preference LUT) and 24 (Print Storage). Updated UID tables so that ** recompiled Storage SCP/SCU's will handle the new SOPs. ** ** Revision 1.13 1997/05/09 13:07:27 hewett ** Updated version name. ** ** Revision 1.12 1997/03/27 16:10:43 hewett ** Updated Implementation Version Name and Implementation Class UID to ** reflect the new version 3.1.3 ** ** Revision 1.11 1997/03/26 17:21:02 hewett ** Changed DCMTK's implementation version name to be consitent with VR=CS. ** ** Revision 1.10 1997/02/06 11:25:26 hewett ** Updated Implementation Version Name and Implementation Class UID to ** reflect the new version 3.1.2 ** ** Revision 1.9 1996/11/27 16:12:17 hewett ** Added recommended uid roots for Patient/Study/Results Management objects. ** ** Revision 1.8 1996/09/24 16:01:28 hewett ** Added SOP Class UIDs for Radiotherapy Objects. ** Added a separate table of Storage SOP Class UIDs (usefull during ** association negotiation). ** Updated Implementation Version to 3.1.1 ** ** Revision 1.7 1996/09/03 13:01:09 hewett ** Updated version name to reflect release 3.1.0. ** ** Revision 1.6 1996/05/31 09:56:33 hewett ** Reduced length of ImplementationVersionName to be <= 16 bytes. ** ** Revision 1.5 1996/05/31 09:46:46 hewett ** Updated InplementationVerionName for release 3.0.1. ** ** Revision 1.4 1996/04/19 12:44:07 hewett ** Added Transfer Syntax UID for RLE Lossless (defined in new Ultrasound). ** ** Revision 1.3 1996/03/12 15:34:15 hewett ** Added new SOP Class UIDs. ** ** Revision 1.2 1996/01/29 13:38:14 andreas ** - new put method for every VR to put value as a string ** - better and unique print methods ** ** Revision 1.1 1995/11/23 16:38:05 hewett ** Updated for loadable data dictionary + some cleanup (more to do). ** */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/dcvrst.h0000644000310500011400000001774711455601177021263 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Gerd Ehlers * * Purpose: Interface of class DcmShortText * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:15:43 $ * CVS/RCS Revision: $Revision: 1.19 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DCVRST_H #define DCVRST_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcchrstr.h" /** a class representing the DICOM value representation 'Short Text' (ST) */ class DcmShortText : public DcmCharString { public: /** constructor. * Create new element from given tag and length. * @param tag DICOM tag for the new element * @param len value length for the new element */ DcmShortText(const DcmTag &tag, const Uint32 len = 0); /** copy constructor * @param old element to be copied */ DcmShortText(const DcmShortText &old ); /** destructor */ virtual ~DcmShortText(); /** assignment operator * @param obj element to be assigned/copied * @return reference to this object */ DcmShortText &operator=(const DcmShortText &obj); /** clone method * @return deep copy of this object */ virtual DcmObject *clone() const { return new DcmShortText(*this); } /** Virtual object copying. This method can be used for DcmObject * and derived classes to get a deep copy of an object. Internally * the assignment operator is called if the given DcmObject parameter * is of the same type as "this" object instance. If not, an error * is returned. This function permits copying an object by value * in a virtual way which therefore is different to just calling the * assignment operator of DcmElement which could result in slicing * the object. * @param rhs - [in] The instance to copy from. Has to be of the same * class type as "this" object * @return EC_Normal if copying was successful, error otherwise */ virtual OFCondition copyFrom(const DcmObject& rhs); /** get element type identifier * @return type identifier of this class (EVR_ST) */ virtual DcmEVR ident() const; /** check whether stored value conforms to the VR and to the specified VM * @param vm parameter not used for this VR * @param oldFormat parameter not used for this VR (only for DA, TM, PN) * @return status of the check, EC_Normal if value is correct, an error code otherwise */ virtual OFCondition checkValue(const OFString &vm = "", const OFBool oldFormat = OFFalse); /** get the value multiplicity. * Since the backslash "\" is not regarded as a separator the value * multiplicity is always 1. * @return value multiplicity of the currently stored value */ virtual unsigned long getVM(); /** get a copy of a particular string component * @param stringVal variable in which the result value is stored * @param pos index of the value in case of multi-valued elements (0..vm-1) * @param normalize delete leading and trailing spaces if OFTrue * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition getOFString(OFString &stringVal, const unsigned long pos, OFBool normalize = OFTrue); /** get the string value (all compenents) * @param stringVal string variable in which the result value is stored * @param normalize remove trailing spaces if OFTrue * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition getOFStringArray(OFString &stringVal, OFBool normalize = OFTrue); /* --- static helper functions --- */ /** check whether given string value conforms to the VR "ST" (Short Text) * @param value string value to be checked (possibly multi-valued) * @return status of the check, EC_Normal if value is correct, an error code otherwise */ static OFCondition checkStringValue(const OFString &value); }; #endif // DCVRST_H /* ** CVS/RCS Log: ** $Log: dcvrst.h,v $ ** Revision 1.19 2010-10-14 13:15:43 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.18 2010-04-23 15:26:13 joergr ** Specify an appropriate default value for the "vm" parameter of checkValue(). ** ** Revision 1.17 2010-04-23 14:25:27 joergr ** Added new method to all VR classes which checks whether the stored value ** conforms to the VR definition and to the specified VM. ** ** Revision 1.16 2009-08-03 09:05:30 joergr ** Added methods that check whether a given string value conforms to the VR and ** VM definitions of the DICOM standards. ** ** Revision 1.15 2008-07-17 11:19:49 onken ** Updated copyFrom() documentation. ** ** Revision 1.14 2008-07-17 10:30:23 onken ** Implemented copyFrom() method for complete DcmObject class hierarchy, which ** permits setting an instance's value from an existing object. Implemented ** assignment operator where necessary. ** ** Revision 1.13 2005-12-08 16:29:10 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.12 2004/07/01 12:28:25 meichel ** Introduced virtual clone method for DcmObject and derived classes. ** ** Revision 1.11 2002/12/06 12:49:19 joergr ** Enhanced "print()" function by re-working the implementation and replacing ** the boolean "showFullData" parameter by a more general integer flag. ** Added doc++ documentation. ** Made source code formatting more consistent with other modules/files. ** ** Revision 1.10 2001/09/25 17:19:34 meichel ** Adapted dcmdata to class OFCondition ** ** Revision 1.9 2001/06/01 15:48:53 meichel ** Updated copyright header ** ** Revision 1.8 2000/03/08 16:26:26 meichel ** Updated copyright header. ** ** Revision 1.7 1999/03/31 09:25:08 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.6 1998/11/12 16:47:55 meichel ** Implemented operator= for all classes derived from DcmObject. ** ** Revision 1.5 1997/09/11 15:13:17 hewett ** Modified getOFString method arguments by removing a default value ** for the pos argument. By requiring the pos argument to be provided ** ensures that callers realise getOFString only gets one component of ** a multi-valued string. ** ** Revision 1.4 1997/08/29 08:32:44 andreas ** - Added methods getOFString and getOFStringArray for all ** string VRs. These methods are able to normalise the value, i. e. ** to remove leading and trailing spaces. This will be done only if ** it is described in the standard that these spaces are not relevant. ** These methods do not test the strings for conformance, this means ** especially that they do not delete spaces where they are not allowed! ** getOFStringArray returns the string with all its parts separated by \ ** and getOFString returns only one value of the string. ** CAUTION: Currently getString returns a string with trailing ** spaces removed (if dcmEnableAutomaticInputDataCorrection == OFTrue) and ** truncates the original string (since it is not copied!). If you rely on this ** behaviour please change your application now. ** Future changes will ensure that getString returns the original ** string from the DICOM object (NULL terminated) inclusive padding. ** Currently, if you call getOF... before calling getString without ** normalisation, you can get the original string read from the DICOM object. ** ** Revision 1.3 1996/01/05 13:23:10 andreas ** - changed to support new streaming facilities ** - more cleanups ** - merged read / write methods for block and file transfer ** */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/dcofsetl.h0000644000310500011400000000272011455601175021540 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Marco Eichelberg * * Purpose: definition of class DcmOffsetList * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:15:41 $ * CVS/RCS Revision: $Revision: 1.4 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DCOFSETL_H #define DCOFSETL_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/ofstd/oflist.h" /* for class OFList */ /** list of Uint32 values which are interpreted as the offsets * in a Pixel Data offset table */ typedef OFList DcmOffsetList; #endif /* * CVS/RCS Log * $Log: dcofsetl.h,v $ * Revision 1.4 2010-10-14 13:15:41 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.3 2009-11-04 09:58:07 uli * Switched to logging mechanism provided by the "new" oflog module * * Revision 1.2 2005-12-08 16:28:23 meichel * Changed include path schema for all DCMTK header files * * Revision 1.1 2002/05/24 14:51:43 meichel * Moved helper methods that are useful for different compression techniques * from module dcmjpeg to module dcmdata * * */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/dcwcache.h0000644000310500011400000001117511455601177021504 0ustar joergrdicom3/* * * Copyright (C) 2007-2010, 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: dcmdata * * Author: Marco Eichelberg * * Purpose: file cache facility for DcmElement::getPartialValue * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:15:43 $ * CVS/RCS Revision: $Revision: 1.4 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DCWCACHE_H #define DCWCACHE_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/ofstd/oftypes.h" /* for Uint8 */ #include "dcmtk/dcmdata/dcfcache.h" /* for class DcmFileCache */ class DcmElement; class DcmOutputStream; #define DcmWriteCacheBufsize 65536 /* buffer size, in bytes */ /** This class implements a buffering mechanism that is used when writing large * elements that reside in file into an output stream. DcmElement::getPartialValue * is used to fill the buffer maintained by this class, and the buffer content * is then copied to the output stream. The intermediate buffer is necessary * because both DcmElement::getPartialValue and DcmOutputStream::write expect * a buffer to write to and read from, respectively. */ class DcmWriteCache { public: /// default constructor. Construction is cheap (no allocation of memory block). DcmWriteCache() : fcache_() , buf_(NULL) , owner_(NULL) , offset_(0) , numBytes_(0) , capacity_(0) , fieldLength_(0) , fieldOffset_(0) , byteOrder_(EBO_unknown) { } /// destructor ~DcmWriteCache() { delete[] buf_; } /** initialize the buffer maintained by this class. Can safely be called multiple times. * @param owner current "owner" (DcmElement instance using this buffer) * @param fieldLength number of bytes of user data in DICOM element * @param bytesTransferred number of bytes of user data in DICOM element that have already been transferred * @param byteOrder byteOrder desired byte order in buffer */ void init(void *owner, Uint32 fieldLength, Uint32 bytesTransferred, E_ByteOrder byteOrder); /** check whether the buffer is currently empty * @return true if buffer is empty, false otherwise */ OFBool bufferIsEmpty() const { return (numBytes_ == 0); } /** return the number of bytes of user data currently in buffer * @return number of bytes of user data currently in buffer */ Uint32 contentLength() const { return numBytes_; } /** fill buffer from given DICOM element if buffer is currently empty. * This method uses DcmElement::getPartialValue to fill the buffer from the given * DICOM element at the given offset (which is updated to reflect the number of bytes * read into the buffer). * @param elem DICOM element to read from * @return EC_Normal if successful, an error code otherwise */ OFCondition fillBuffer(DcmElement& elem); /** write buffer content to output stream * @param outStream output stream to write to * @return number of bytes written */ Uint32 writeBuffer(DcmOutputStream &outStream); private: /// private undefined copy constructor DcmWriteCache(const DcmWriteCache& arg); /// private undefined copy assignment operator DcmWriteCache& operator=(const DcmWriteCache& arg); /// file cache object DcmFileCache fcache_; /// write buffer Uint8 *buf_; /// current "owner" (DcmElement instance using this buffer) void *owner_; /// offset within buffer to first byte Uint32 offset_; /// number of user data bytes currently in buffer Uint32 numBytes_; /// buffer size in bytes Uint32 capacity_; /// length of the current DICOM element, in bytes Uint32 fieldLength_; /// offset within the current DICOM element, in bytes Uint32 fieldOffset_; /// current output byte order E_ByteOrder byteOrder_; }; #endif /* * CVS/RCS Log: * $Log: dcwcache.h,v $ * Revision 1.4 2010-10-14 13:15:43 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.3 2009-02-25 12:58:55 joergr * Removed wrong comment (apparently copied from other class). * * Revision 1.2 2009-02-04 17:54:31 joergr * Fixed various layout and formatting issues. * * Revision 1.1 2007-11-29 14:30:18 meichel * Write methods now handle large raw data elements (such as pixel data) * without loading everything into memory. This allows very large images to * be sent over a network connection, or to be copied without ever being * fully in memory. * * */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/dcvrss.h0000644000310500011400000002520211464747623021252 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Gerd Ehlers, Andreas Barth * * Purpose: Interface of class DcmSignedShort * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-11-05 09:34:11 $ * CVS/RCS Revision: $Revision: 1.27 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DCVRSS_H #define DCVRSS_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcelem.h" /** a class representing the DICOM value representation 'Signed Short' (SS) */ class DcmSignedShort : public DcmElement { public: /** constructor. * Create new element from given tag and length. * @param tag DICOM tag for the new element * @param len value length for the new element */ DcmSignedShort(const DcmTag &tag, const Uint32 len = 0); /** copy constructor * @param old element to be copied */ DcmSignedShort(const DcmSignedShort &old); /** destructor */ virtual ~DcmSignedShort(); /** assignment operator * @param obj element to be assigned/copied * @return reference to this object */ DcmSignedShort &operator=(const DcmSignedShort &obj); /** clone method * @return deep copy of this object */ virtual DcmObject *clone() const { return new DcmSignedShort(*this); } /** Virtual object copying. This method can be used for DcmObject * and derived classes to get a deep copy of an object. Internally * the assignment operator is called if the given DcmObject parameter * is of the same type as "this" object instance. If not, an error * is returned. This function permits copying an object by value * in a virtual way which therefore is different to just calling the * assignment operator of DcmElement which could result in slicing * the object. * @param rhs - [in] The instance to copy from. Has to be of the same * class type as "this" object * @return EC_Normal if copying was successful, error otherwise */ virtual OFCondition copyFrom(const DcmObject& rhs); /** get element type identifier * @return type identifier of this class (EVR_SS) */ virtual DcmEVR ident() const; /** check whether stored value conforms to the VR and to the specified VM * @param vm value multiplicity (according to the data dictionary) to be checked for. * (valid values: "1", "1-2", "1-3", "1-8", "1-99", "1-n", "2", "2-n", "2-2n", * "3", "3-n", "3-3n", "4", "6", "9", "16", "32") * @param oldFormat parameter not used for this VR (only for DA, TM, PN) * @return status of the check, EC_Normal if value is correct, an error code otherwise */ virtual OFCondition checkValue(const OFString &vm = "1-n", const OFBool oldFormat = OFFalse); /** get value multiplicity. * The number of entries can be determined by "getVM()". * @return number of currently stored values */ virtual unsigned long getVM(); /** print element to a stream. * The output format of the value is a backslash separated sequence of numbers. * @param out output stream * @param flags optional flag used to customize the output (see DCMTypes::PF_xxx) * @param level current level of nested items. Used for indentation. * @param pixelFileName not used * @param pixelCounter not used */ virtual void print(STD_NAMESPACE ostream&out, const size_t flags = 0, const int level = 0, const char *pixelFileName = NULL, size_t *pixelCounter = NULL); /** get particular integer value * @param sintVal reference to result variable (cleared in case of error) * @param pos index of the value to be retrieved (0..vm-1) * @return status status, EC_Normal if successful, an error code otherwise */ virtual OFCondition getSint16(Sint16 &sintVal, const unsigned long pos = 0); /** get reference to stored integer data * @param sintVals reference to result variable * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition getSint16Array(Sint16 *&sintVals); /** get particular value as a character string * @param stringVal variable in which the result value is stored * @param pos index of the value in case of multi-valued elements (0..vm-1) * @param normalize not used * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition getOFString(OFString &stringVal, const unsigned long pos, OFBool normalize = OFTrue); /** set particular element value to given integer * @param sintVal signed integer value to be set * @param pos index of the value to be set (0 = first position) * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition putSint16(const Sint16 sintVal, const unsigned long pos = 0); /** set element value to given integer array data * @param sintVals signed integer data to be set * @param numSints number of integer values to be set * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition putSint16Array(const Sint16 *sintVals, const unsigned long numSints); /** set element value from the given character string. * The input string is expected to be a backslash separated sequence of * numeric characters, e.g. "-333\-22\-1\0\1\22\333". * @param stringVal input character string * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition putString(const char *stringVal); /** check the currently stored element value * @param autocorrect correct value length if OFTrue * @return status, EC_Normal if value length is correct, an error code otherwise */ virtual OFCondition verify(const OFBool autocorrect = OFFalse); }; #endif // DCVRSS_H /* ** CVS/RCS Log: ** $Log: dcvrss.h,v $ ** Revision 1.27 2010-11-05 09:34:11 joergr ** Added support for checking the value multiplicity "9" (see Supplement 131). ** ** Revision 1.26 2010-10-14 13:15:43 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.25 2010-04-23 15:26:13 joergr ** Specify an appropriate default value for the "vm" parameter of checkValue(). ** ** Revision 1.24 2010-04-23 14:25:27 joergr ** Added new method to all VR classes which checks whether the stored value ** conforms to the VR definition and to the specified VM. ** ** Revision 1.23 2009-11-04 09:58:07 uli ** Switched to logging mechanism provided by the "new" oflog module ** ** Revision 1.22 2008-07-17 11:19:49 onken ** Updated copyFrom() documentation. ** ** Revision 1.21 2008-07-17 10:30:23 onken ** Implemented copyFrom() method for complete DcmObject class hierarchy, which ** permits setting an instance's value from an existing object. Implemented ** assignment operator where necessary. ** ** Revision 1.20 2006-08-15 15:49:56 meichel ** Updated all code in module dcmdata to correctly compile when ** all standard C++ classes remain in namespace std. ** ** Revision 1.19 2005/12/08 16:29:09 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.18 2004/07/01 12:28:25 meichel ** Introduced virtual clone method for DcmObject and derived classes. ** ** Revision 1.17 2002/12/06 12:49:18 joergr ** Enhanced "print()" function by re-working the implementation and replacing ** the boolean "showFullData" parameter by a more general integer flag. ** Added doc++ documentation. ** Made source code formatting more consistent with other modules/files. ** ** Revision 1.16 2002/04/25 09:57:46 joergr ** Added getOFString() implementation. ** ** Revision 1.15 2001/09/25 17:19:34 meichel ** Adapted dcmdata to class OFCondition ** ** Revision 1.14 2001/06/01 15:48:53 meichel ** Updated copyright header ** ** Revision 1.13 2000/04/14 15:31:35 meichel ** Removed default value from output stream passed to print() method. ** Required for use in multi-thread environments. ** ** Revision 1.12 2000/03/08 16:26:26 meichel ** Updated copyright header. ** ** Revision 1.11 2000/03/03 14:05:28 meichel ** Implemented library support for redirecting error messages into memory ** instead of printing them to stdout/stderr for GUI applications. ** ** Revision 1.10 2000/02/10 10:50:55 joergr ** Added new feature to dcmdump (enhanced print method of dcmdata): write ** pixel data/item value fields to raw files. ** ** Revision 1.9 1999/03/31 09:25:07 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.8 1998/11/12 16:47:55 meichel ** Implemented operator= for all classes derived from DcmObject. ** ** Revision 1.7 1997/07/21 08:25:16 andreas ** - Replace all boolean types (BOOLEAN, CTNBOOLEAN, DICOM_BOOL, BOOL) ** with one unique boolean type OFBool. ** ** Revision 1.6 1997/04/18 08:13:32 andreas ** - The put/get-methods for all VRs did not conform to the C++-Standard ** draft. Some Compilers (e.g. SUN-C++ Compiler, Metroworks ** CodeWarrier, etc.) create many warnings concerning the hiding of ** overloaded get methods in all derived classes of DcmElement. ** So the interface of all value representation classes in the ** library are changed rapidly, e.g. ** OFCondition get(Uint16 & value, const unsigned long pos); ** becomes ** OFCondition getUint16(Uint16 & value, const unsigned long pos); ** All (retired) "returntype get(...)" methods are deleted. ** For more information see dcmdata/include/dcelem.h ** ** Revision 1.5 1996/08/05 08:45:36 andreas ** new print routine with additional parameters: ** - print into files ** - fix output length for elements ** corrected error in search routine with parameter ESM_fromStackTop ** ** Revision 1.4 1996/01/29 13:38:18 andreas ** - new put method for every VR to put value as a string ** - better and unique print methods ** ** Revision 1.3 1996/01/05 13:23:09 andreas ** - changed to support new streaming facilities ** - more cleanups ** - merged read / write methods for block and file transfer ** */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/dcvrfd.h0000644000310500011400000002567111464747623021230 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Gerd Ehlers, Andreas Barth * * Purpose: Interface of class DcmFloatingPointDouble * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-11-05 09:34:11 $ * CVS/RCS Revision: $Revision: 1.27 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DCVRFD_H #define DCVRFD_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcelem.h" /** a class representing the DICOM value representation 'Floating Point Double' (FD) */ class DcmFloatingPointDouble : public DcmElement { public: /** constructor. * Create new element from given tag and length. * @param tag DICOM tag for the new element * @param len value length for the new element */ DcmFloatingPointDouble(const DcmTag &tag, const Uint32 len = 0); /** copy constructor * @param old element to be copied */ DcmFloatingPointDouble( const DcmFloatingPointDouble &old); /** destructor */ virtual ~DcmFloatingPointDouble(); /** assignment operator * @param obj element to be assigned/copied * @return reference to this object */ DcmFloatingPointDouble &operator=(const DcmFloatingPointDouble &obj); /** clone method * @return deep copy of this object */ virtual DcmObject *clone() const { return new DcmFloatingPointDouble(*this); } /** Virtual object copying. This method can be used for DcmObject * and derived classes to get a deep copy of an object. Internally * the assignment operator is called if the given DcmObject parameter * is of the same type as "this" object instance. If not, an error * is returned. This function permits copying an object by value * in a virtual way which therefore is different to just calling the * assignment operator of DcmElement which could result in slicing * the object. * @param rhs - [in] The instance to copy from. Has to be of the same * class type as "this" object * @return EC_Normal if copying was successful, error otherwise */ virtual OFCondition copyFrom(const DcmObject& rhs); /** get element type identifier * @return type identifier of this class (EVR_FD) */ virtual DcmEVR ident() const; /** check whether stored value conforms to the VR and to the specified VM * @param vm value multiplicity (according to the data dictionary) to be checked for. * (valid values: "1", "1-2", "1-3", "1-8", "1-99", "1-n", "2", "2-n", "2-2n", * "3", "3-n", "3-3n", "4", "6", "9", "16", "32") * @param oldFormat parameter not used for this VR (only for DA, TM, PN) * @return status of the check, EC_Normal if value is correct, an error code otherwise */ virtual OFCondition checkValue(const OFString &vm = "1-n", const OFBool oldFormat = OFFalse); /** get value multiplicity * @return number of currently stored values */ virtual unsigned long getVM(); /** print element to a stream. * The output format of the value is a backslash separated sequence of numbers. * This function uses a variable number of digits for the floating point values * as created by the OFStandard::ftoa() function by default. * @param out output stream * @param flags optional flag used to customize the output (see DCMTypes::PF_xxx) * @param level current level of nested items. Used for indentation. * @param pixelFileName not used * @param pixelCounter not used */ virtual void print(STD_NAMESPACE ostream&out, const size_t flags = 0, const int level = 0, const char *pixelFileName = NULL, size_t *pixelCounter = NULL); /** get particular double value * @param doubleVal reference to result variable (cleared in case of error) * @param pos index of the value to be retrieved (0..vm-1) * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition getFloat64(Float64 &doubleVal, const unsigned long pos = 0); /** get reference to stored double data * @param doubleVals reference to result variable * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition getFloat64Array(Float64 *&doubleVals); /** get a particular value as a character string. * The resulting string contains a variable number of digits as created by * the OFStandard::ftoa() function by default. * @param stringVal variable in which the result value is stored * @param pos index of the value in case of multi-valued elements (0..vm-1) * @param normalize not used * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition getOFString(OFString &stringVal, const unsigned long pos, OFBool normalize = OFTrue); /** set particular element value to given double * @param doubleval double precision floating point value to be set * @param pos index of the value to be set (0 = first position) * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition putFloat64(const Float64 doubleval, const unsigned long pos = 0); /** set element value to given double array data * @param doubleVals double precision floating point data to be set * @param numDoubles number of double values to be set * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition putFloat64Array(const Float64 *doubleVals, const unsigned long numDoubles); /** set element value from the given character string. * The input string is expected to be a backslash separated sequence of * numeric characters, e.g. "12.3456\1\-123.456\1234.0". * @param stringVal input character string * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition putString(const char *stringVal); /** check the currently stored element value * @param autocorrect correct value length if OFTrue * @return status, EC_Normal if value length is correct, an error code otherwise */ virtual OFCondition verify(const OFBool autocorrect = OFFalse); }; #endif // DCVRFD_H /* ** CVS/RCS Log: ** $Log: dcvrfd.h,v $ ** Revision 1.27 2010-11-05 09:34:11 joergr ** Added support for checking the value multiplicity "9" (see Supplement 131). ** ** Revision 1.26 2010-10-14 13:15:42 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.25 2010-04-23 15:26:13 joergr ** Specify an appropriate default value for the "vm" parameter of checkValue(). ** ** Revision 1.24 2010-04-23 14:25:27 joergr ** Added new method to all VR classes which checks whether the stored value ** conforms to the VR definition and to the specified VM. ** ** Revision 1.23 2009-11-04 09:58:07 uli ** Switched to logging mechanism provided by the "new" oflog module ** ** Revision 1.22 2008-07-17 11:19:49 onken ** Updated copyFrom() documentation. ** ** Revision 1.21 2008-07-17 10:30:23 onken ** Implemented copyFrom() method for complete DcmObject class hierarchy, which ** permits setting an instance's value from an existing object. Implemented ** assignment operator where necessary. ** ** Revision 1.20 2006-08-15 15:49:56 meichel ** Updated all code in module dcmdata to correctly compile when ** all standard C++ classes remain in namespace std. ** ** Revision 1.19 2005/12/08 16:28:58 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.18 2004/07/01 12:28:25 meichel ** Introduced virtual clone method for DcmObject and derived classes. ** ** Revision 1.17 2002/12/06 12:49:15 joergr ** Enhanced "print()" function by re-working the implementation and replacing ** the boolean "showFullData" parameter by a more general integer flag. ** Added doc++ documentation. ** Made source code formatting more consistent with other modules/files. ** ** Revision 1.16 2002/04/25 09:51:42 joergr ** Added getOFString() implementation. ** ** Revision 1.15 2001/09/25 17:19:31 meichel ** Adapted dcmdata to class OFCondition ** ** Revision 1.14 2001/06/01 15:48:49 meichel ** Updated copyright header ** ** Revision 1.13 2000/04/14 15:31:34 meichel ** Removed default value from output stream passed to print() method. ** Required for use in multi-thread environments. ** ** Revision 1.12 2000/03/08 16:26:23 meichel ** Updated copyright header. ** ** Revision 1.11 2000/03/03 14:05:26 meichel ** Implemented library support for redirecting error messages into memory ** instead of printing them to stdout/stderr for GUI applications. ** ** Revision 1.10 2000/02/10 10:50:54 joergr ** Added new feature to dcmdump (enhanced print method of dcmdata): write ** pixel data/item value fields to raw files. ** ** Revision 1.9 1999/03/31 09:25:00 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.8 1998/11/12 16:47:48 meichel ** Implemented operator= for all classes derived from DcmObject. ** ** Revision 1.7 1997/07/21 08:25:14 andreas ** - Replace all boolean types (BOOLEAN, CTNBOOLEAN, DICOM_BOOL, BOOL) ** with one unique boolean type OFBool. ** ** Revision 1.6 1997/04/18 08:13:29 andreas ** - The put/get-methods for all VRs did not conform to the C++-Standard ** draft. Some Compilers (e.g. SUN-C++ Compiler, Metroworks ** CodeWarrier, etc.) create many warnings concerning the hiding of ** overloaded get methods in all derived classes of DcmElement. ** So the interface of all value representation classes in the ** library are changed rapidly, e.g. ** OFCondition get(Uint16 & value, const unsigned long pos); ** becomes ** OFCondition getUint16(Uint16 & value, const unsigned long pos); ** All (retired) "returntype get(...)" methods are deleted. ** For more information see dcmdata/include/dcelem.h ** ** Revision 1.5 1996/08/05 08:45:31 andreas ** new print routine with additional parameters: ** - print into files ** - fix output length for elements ** corrected error in search routine with parameter ESM_fromStackTop ** ** Revision 1.4 1996/01/29 13:38:16 andreas ** - new put method for every VR to put value as a string ** - better and unique print methods ** ** Revision 1.3 1996/01/05 13:23:05 andreas ** - changed to support new streaming facilities ** - more cleanups ** - merged read / write methods for block and file transfer ** */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/dctypes.h0000644000310500011400000002433311462524215021411 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Gerd Ehlers, Andrew Hewett * * Purpose: global type and constant definitions * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-29 10:57:17 $ * CVS/RCS Revision: $Revision: 1.35 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DCTYPES_H #define DCTYPES_H 1 #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/oflog/oflog.h" #define INCLUDE_CSTDLIB #include "dcmtk/ofstd/ofstdinc.h" BEGIN_EXTERN_C #ifdef HAVE_SYS_TYPES_H /* needed e.g. on Solaris for definition of size_t */ #include #endif END_EXTERN_C /* ** Logging */ OFLogger DCM_dcmdataGetLogger(); #define DCMDATA_TRACE(msg) OFLOG_TRACE(DCM_dcmdataGetLogger(), msg) #define DCMDATA_DEBUG(msg) OFLOG_DEBUG(DCM_dcmdataGetLogger(), msg) #define DCMDATA_INFO(msg) OFLOG_INFO(DCM_dcmdataGetLogger(), msg) #define DCMDATA_WARN(msg) OFLOG_WARN(DCM_dcmdataGetLogger(), msg) #define DCMDATA_ERROR(msg) OFLOG_ERROR(DCM_dcmdataGetLogger(), msg) #define DCMDATA_FATAL(msg) OFLOG_FATAL(DCM_dcmdataGetLogger(), msg) /* ** Macro Definitions */ /// XML namespace URI for the dcmtk #define DCMTK_XML_NAMESPACE_URI "http://dicom.offis.de/dcmtk" // ANSI escape codes for color output of the print() method #define ANSI_ESCAPE_CODE_RESET "\033[0m" #define ANSI_ESCAPE_CODE_TAG "\033[22m\033[32m" #define ANSI_ESCAPE_CODE_VR "\033[22m\033[31m" #define ANSI_ESCAPE_CODE_VALUE "\033[1m\033[37m" #define ANSI_ESCAPE_CODE_INFO "\033[1m\033[30m" #define ANSI_ESCAPE_CODE_LENGTH "\033[22m\033[36m" #define ANSI_ESCAPE_CODE_VM "\033[22m\033[35m" #define ANSI_ESCAPE_CODE_NAME "\033[22m\033[33m" #define ANSI_ESCAPE_CODE_NAME_1 "\033[1m\033[33m" #define ANSI_ESCAPE_CODE_SEQUENCE "\033[22m\033[32m" #define ANSI_ESCAPE_CODE_SEQUENCE_1 "\033[1m\033[32m" #define ANSI_ESCAPE_CODE_ITEM "\033[1m\033[30m" #define ANSI_ESCAPE_CODE_LINE "\033[1m\033[30m" #define ANSI_ESCAPE_CODE_COMMENT "\033[1m\033[30m" /* ** Enumerated Types */ /// encoding type for sequences and sequence items typedef enum { /// defined length EET_ExplicitLength = 0, /// undefined length EET_UndefinedLength = 1 } E_EncodingType; /// handling of group length elements when reading/writing a dataset typedef enum { /// no change of group length values, WARNING: DO NOT USE THIS VALUE FOR WRITE OPERATIONS EGL_noChange = 0, /// remove group length tags EGL_withoutGL = 1, /// add group length tags for every group EGL_withGL = 2, /// recalculate values for existing group length tags EGL_recalcGL = 3 } E_GrpLenEncoding; /// handling of dataset trailing padding typedef enum { /// no change of padding tags EPD_noChange = 0, /// remove all padding tags EPD_withoutPadding = 1, /// add padding tags EPD_withPadding = 2 } E_PaddingEncoding; /// search mode for hierarchical search operations typedef enum { /// start search from current object ESM_fromHere = 0, /// start search from object pointed to by stack top ESM_fromStackTop = 1, /// start search from object following the object pointed to by stack top ESM_afterStackTop = 2 } E_SearchMode; /// object state during transfer (read/write) operations typedef enum { /// object prepared for transfer, no data transferred yet ERW_init = 0, /// object transfer completed ERW_ready = 1, /// object transfer in progress ERW_inWork = 2, /// object not prepared for transfer operation ERW_notInitialized = 3 } E_TransferState; /// mode for file reading typedef enum { /// auto detect: fileformat or dataset ERM_autoDetect = 0, /// read as dataset (assume no meta header present) ERM_dataset = 1, /// read file format only, refuse if no meta-header ERM_fileOnly = 2, /// read meta-header only, do not read the dataset ERM_metaOnly = 3 } E_FileReadMode; /// mode for file writing typedef enum { /// write as fileformat (update only missing information, this is the old behavior) EWM_fileformat = 0, /// write as dataset (without meta header) EWM_dataset = 1, /// write as fileformat and update required information (e.g. SOP Class/Instance UID) EWM_updateMeta = 2, /// write as fileformat and create new meta header (do not retain existing information) EWM_createNewMeta = 3, /// write as fileformat but don't update the meta header (please be careful!) EWM_dontUpdateMeta = 4 } E_FileWriteMode; /** General purpose class hiding constants from the global namespace. */ struct DCMTypes { public: /** @name print() flags. * These flags can be combined and passed to the print() methods. */ //@{ /// shorten long tag values (e.g. long texts, pixel data) static const size_t PF_shortenLongTagValues; /// show hierarchical tree structure of the dataset static const size_t PF_showTreeStructure; /// do not map well-known UID numbers to UID names (e.g. Transfer Syntax and SOP Class) static const size_t PF_doNotMapUIDsToNames; /// quote non-ASCII string content as XML markup static const size_t PF_convertToMarkup; /// use ANSI escape codes for output static const size_t PF_useANSIEscapeCodes; //@} /** @name writeXML() flags. * These flags can be combined and passed to the writeXML() methods. */ //@{ /// add document type definition (DTD) static const size_t XF_addDocumentType; /// write binary data to XML output file static const size_t XF_writeBinaryData; /// encode binary data as Base64 (MIME) static const size_t XF_encodeBase64; /// XML namespace URI for dcmsr module static const size_t XF_useDcmtkNamespace; /// embed content of document type definition static const size_t XF_embedDocumentType; /// don't write name of the DICOM data elements static const size_t XF_omitDataElementName; //@} }; // Undefined Length Identifier const Uint32 DCM_UndefinedLength = 0xffffffff; #endif /* !DCTYPES_H */ /* * CVS/RCS Log: * $Log: dctypes.h,v $ * Revision 1.35 2010-10-29 10:57:17 joergr * Added support for colored output to the print() method. * * Revision 1.34 2010-10-14 13:15:42 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.33 2010-06-07 13:57:57 joergr * Added new file read mode that allows for loading the meta-header only. * * Revision 1.32 2010-03-01 09:08:44 uli * Removed some unnecessary include directives in the headers. * * Revision 1.31 2009-11-04 09:58:07 uli * Switched to logging mechanism provided by the "new" oflog module * * Revision 1.30 2009-08-21 10:45:06 joergr * Added new 'writeMode' which does not update the the meta header. This could * be useful for tools like dump2dcm and xml2dcm. * * Revision 1.29 2009-08-21 09:17:16 joergr * Added parameter 'writeMode' to save/write methods which allows for specifying * whether to write a dataset or fileformat as well as whether to update the * file meta information or to create a new file meta information header. * * Revision 1.28 2009-08-19 11:55:44 meichel * Added additional includes needed for Sun Studio 11 on Solaris. * * Revision 1.27 2009-01-06 16:28:11 joergr * Reworked print() output format for option PF_showTreeStructure. * * Revision 1.26 2008-04-28 09:22:42 meichel * New flag DCMTypes::PF_convertToMarkup causes DcmObject::print to * quote non-ASCII string content as XML markup * * Revision 1.25 2008-02-26 16:56:15 joergr * Added new print flag that disables the mapping of well-known UID numbers to * their associated names (e.g. transfer syntax or SOP class). * * Revision 1.24 2007/11/29 14:30:35 meichel * Updated doxygen API documentation * * Revision 1.23 2006/05/11 08:55:22 joergr * Added new option that allows to omit the element name in the XML output. * * Revision 1.22 2006/02/08 15:21:15 joergr * Removed unused type definitions. * * Revision 1.21 2005/12/08 16:28:47 meichel * Changed include path schema for all DCMTK header files * * Revision 1.20 2005/12/02 08:50:30 joergr * Added new file read mode that makes it possible to distinguish between DICOM * files, datasets and other non-DICOM files. * * Revision 1.19 2003/04/22 08:19:09 joergr * Added new command line option which allows to embed the content of the DTD * instead of referencing the DTD file. * * Revision 1.18 2003/04/01 14:57:08 joergr * Added support for XML namespaces. * * Revision 1.17 2002/12/06 12:21:00 joergr * Enhanced "print()" function by re-working the implementation and replacing * the boolean "showFullData" parameter by a more general integer flag. * * Revision 1.16 2002/11/27 12:07:23 meichel * Adapted module dcmdata to use of new header file ofstdinc.h * * Revision 1.15 2002/07/10 11:45:40 meichel * Moved definitions for Uint8, Sint8 ... Float64 from dcmdata to ofstd * since these types are not DICOM specific * * Revision 1.14 2002/06/06 14:51:13 meichel * Corrected code for inclusion of stdlib.h * * Revision 1.13 2002/05/14 08:20:29 joergr * Added support for Base64 (MIME) encoded binary data. * * Revision 1.12 2002/04/25 10:07:13 joergr * Added support for XML output of DICOM objects. * * Revision 1.11 2001/06/01 15:48:45 meichel * Updated copyright header * * Revision 1.10 2000/03/08 16:26:19 meichel * Updated copyright header. * * Revision 1.9 2000/03/03 14:05:26 meichel * Implemented library support for redirecting error messages into memory * instead of printing them to stdout/stderr for GUI applications. * * Revision 1.8 2000/02/07 14:44:45 meichel * The typedef for Sint8 now defaults to char instead of signed char. * This avoids warnings on certain c-front related compilers. * The old behaviour can be restored by compiling with the symbol * CHAR_IS_UNSIGNED defined. * * Revision 1.7 1999/03/31 09:24:51 meichel * Updated copyright header in module dcmdata * * */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/dcobject.h0000644000310500011400000011744011462524215021515 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Gerd Ehlers * * Purpose: * This file contains the interface to routines which provide * DICOM object encoding/decoding, search and lookup facilities. * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-29 10:57:17 $ * CVS/RCS Revision: $Revision: 1.70 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DCOBJECT_H #define DCOBJECT_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/ofstd/ofglobal.h" #include "dcmtk/dcmdata/dcerror.h" #include "dcmtk/dcmdata/dcxfer.h" #include "dcmtk/dcmdata/dctag.h" #include "dcmtk/dcmdata/dcstack.h" // forward declarations class DcmOutputStream; class DcmInputStream; class DcmWriteCache; // Undefined Length Identifier now defined in dctypes.h // Maxinum number of read bytes for a Value Element const Uint32 DCM_MaxReadLength = 4096; // Maximum length of tag and length in a DICOM element const Uint32 DCM_TagInfoLength = 12; // Optimum line length if not all data printed const Uint32 DCM_OptPrintLineLength = 70; // Optimum value length if not all data printed const Uint32 DCM_OptPrintValueLength = 40; // Optimum attribute name length (for tree output) const Uint32 DCM_OptPrintAttributeNameLength = 35; /** This flags defines whether automatic correction should be applied to input * data (e.g. stripping of padding blanks, removal of blanks in UIDs, etc). * Default is enabled. */ extern OFGlobal dcmEnableAutomaticInputDataCorrection; /* default OFTrue */ /** This flag defines the handling of illegal odd-length attributes: If flag is * true, odd lengths are respected (i.e. an odd number of bytes is read from * the input stream.) After successful reading, padding to even number of bytes * is enforced by adding a zero pad byte if dcmEnableAutomaticInputDataCorrection * is true. Otherwise the odd number of bytes remains as read. * * If flag is false, old (pre DCMTK 3.5.2) behaviour applies: The length field * implicitly incremented and an even number of bytes is read from the stream. */ extern OFGlobal dcmAcceptOddAttributeLength; /* default OFTrue */ /** This flag defines how UN attributes with undefined length are treated * by the parser when reading. The default is to expect the content of the * UN element (up to and including the sequence delimitation item) * to be encoded in Implicit VR Little Endian, as described in CP 246. * DCMTK expects the attribute to be encoded like a DICOM sequence, i.e. * the content of each item is parsed as a DICOM dataset. * If the flag is disabled old (pre DCMTK 3.5.4) behaviour applies: The * attribute is treated as if it was an Explicit VR SQ element. * * Note that the flag only affects the read behaviour but not the write * behaviour - DCMTK will never write UN elements with undefined length. */ extern OFGlobal dcmEnableCP246Support; /* default OFTrue */ /** DCMTK releases up to 3.5.3 created a non-conforming byte stream * as input to the MAC algorithm when creating or verifying digital signatures * including compressed pixel data (i.e. signatures including attribute * (7FE0,0010) in an encapsulated transfer syntax). This has been fixed * in DCMTK 3.5.4, but this flag allows to revert to the old behavior * in order to create or verify signatures that are compatible with older * releases. Default is "off" (OFFalse). */ extern OFGlobal dcmEnableOldSignatureFormat; /* default OFFalse */ /** This flag defines whether the transfer syntax for uncompressed datasets * is detected automatically. The automatic detection has been introduced * since there are (incorrectly encoded) DICOM dataset stored with a * different transfer syntax than specified in the meta header. */ extern OFGlobal dcmAutoDetectDatasetXfer; /* default OFFalse */ /** This flag defines how non-standard VRs are treated by the parser when * reading. The default is to treat data element with non-standard VR as * unknown. If this flag is enabled, the parser will try to read the data * element with Implicit VR Little Endian transfer syntax. */ extern OFGlobal dcmAcceptUnexpectedImplicitEncoding; /* default OFFalse */ /** This flag indicates, whether private attributes with implicit transfer * syntax having a maximum length should be handled as sequences (ignoring * any dictionary entries for that tag). This can happen, if for example * a private creator element is illegally inserted with VR SQ * (undefined length and implicit coding). The parser usually would then * try to parse the element with VR=LO (private creator) with maximum * length, which would lead to an error. The default behaviour is to * rely on the dictionary. */ extern OFGlobal dcmReadImplPrivAttribMaxLengthAsSQ; /* default OFFalse */ /** This flag indicates, whether parsing errors during reading * should be ignored, ie whether the parser should try to recover and * parse the rest of the stream. * This flag does not work for all parsing errors (at this time) * making sense but was introduced afterwards. */ extern OFGlobal dcmIgnoreParsingErrors; /* default OFFalse */ /** This flag indicates, whether parsing should stop after a certain * element in the stream was parsed. This is especially useful for * datasets containing garbage at the end, usually after the Pixel * Data attribute. To prevent the parser for "stumbling" over that * garbage, it is possible to tell the parser to stop after a * specific element. The flag is only sensitive to elements on * dataset level, ie. inside sequence any occurence of the specified * tag is ignored. Caution: Note that if Pixel Data is chosen * as stop element, any attributes behind will not be parsed, e. g. * any digital signature attributes coming after. * Default is (0xffff,0xffff), which means that the feature is * disabled. */ extern OFGlobal dcmStopParsingAfterElement; /* default OFTrue */ /** This flag influences behaviour when writing a dataset with items * and sequences set to be encoded with explicit length. It is possible * that the content of a sequence (or item) has an encoded length greater * than the maximum 32-bit value that can be written to the sequence (item) * length field. If this flag is enabled (OFTrue) then the encoding of the * very sequence (item) is switched to undefined length encoding. Any * contained items (sequences) will be encoded explicitly if possible. * Default is OFTrue, i.e. encoding is switched to implicit if maximum * size of length field is exceeded. */ extern OFGlobal dcmWriteOversizedSeqsAndItemsUndefined; /* default OFTrue */ /** This flag allows for ignoring the value of (0002,0000) File Meta Information * Group Length which is useful in cases where this value is incorrect. If the * header length is ignored, the behavior is identical to the case when no value * is available (i.e. all elements are read as long as the group number is 0x0002). */ extern OFGlobal dcmIgnoreFileMetaInformationGroupLength; /* default OFFalse */ /** Abstract base class for most classes in module dcmdata. As a rule of thumb, * everything that is either a dataset or that can be identified with a DICOM * attribute tag is derived from class DcmObject. */ class DcmObject { public: /** constructor. * Create new object from given tag and length. * @param tag DICOM tag for the new element * @param len value length for the new element */ DcmObject(const DcmTag &tag, const Uint32 len = 0); /** copy constructor * @param obj item to be copied */ DcmObject(const DcmObject &obj); /// destructor virtual ~DcmObject(); /** clone method * @return deep copy of this object */ virtual DcmObject *clone() const = 0; /** copy assignment operator * @param obj object to be copied * @return reference to this object */ DcmObject &operator=(const DcmObject &obj); /** Virtual object copying. This method can be used for DcmObject * and derived classes to get a deep copy of an object. Internally * the assignment operator is called if the given DcmObject parameter * is of the same type as "this" object instance. If not, an error * is returned. This function permits copying an object by value * in a virtual way which therefore is different to just calling the * assignment operator of DcmElement which could result in slicing * the object. * @param rhs - [in] The instance to copy from. Has to be of the same * class type as "this" object * @return EC_Normal if copying was successful, error otherwise */ virtual OFCondition copyFrom(const DcmObject &rhs) = 0; /** return identifier for this class. Every class derived from this class * returns a unique value of type enum DcmEVR for this call. This is used * as a "poor man's RTTI" to correctly identify instances derived from * this class even on compilers not supporting RTTI. * @return type identifier of this class */ virtual DcmEVR ident() const = 0; /** return the value representation assigned to this object. * If object was read from a stream, this method returns the VR * that was defined in the stream for this object. It is, therefore, * possible that the VR does not match the one defined in the data * dictionary for the tag assigned to this object. * @return VR of this object */ inline DcmEVR getVR() const { return Tag.getEVR(); } /** check if this element is a string type, based on the VR. * Since the check is based on the VR and not on the class, * the result of this method is not a guarantee that the object * can be safely casted to one of the string-VR subclasses. * @return true if this object is a string VR, false otherwise */ inline OFBool isaString() const { return Tag.getVR().isaString(); } /** check if this element is a leaf node in a dataset tree. * All subclasses of DcmElement except for DcmSequenceOfItems * are leaf nodes, while DcmSequenceOfItems, DcmItem, DcmDataset etc. * are not. * @return true if leaf node, false otherwise. */ virtual OFBool isLeaf() const = 0; /** print object to a stream * @param out output stream * @param flags optional flag used to customize the output (see DCMTypes::PF_xxx) * @param level current level of nested items. Used for indentation. * @param pixelFileName not used (used in certain sub-classes of this class) * @param pixelCounter not used (used in certain sub-classes of this class) */ virtual void print(STD_NAMESPACE ostream &out, const size_t flags = 0, const int level = 0, const char *pixelFileName = NULL, size_t *pixelCounter = NULL) = 0; /** return the current transfer (read/write) state of this object. * @return transfer state of this object */ inline E_TransferState transferState() const { return fTransferState; } /** initialize the transfer state of this object. This method must be called * before this object is written to a stream or read (parsed) from a stream. */ virtual void transferInit(void); /** finalize the transfer state of this object. This method must be called * when reading/writing this object from/to a stream has been completed. */ virtual void transferEnd(void); /** return the group number of the attribute tag for this object * @return group number of the attribute tag for this object */ inline Uint16 getGTag() const { return Tag.getGTag(); } /** return the element number of the attribute tag for this object * @return element number of the attribute tag for this object */ inline Uint16 getETag() const { return Tag.getETag(); } /** return const reference to the attribute tag for this object * @return const reference to the attribute tag for this object */ inline const DcmTag &getTag() const { return Tag; } /** assign group tag (but not element tag) of the attribute tag for this object. * This is sometimes useful when creating repeating group elements. * @param gtag new attribute group tag */ inline void setGTag(Uint16 gtag) { Tag.setGroup(gtag); } /** assign a new Value Representation (VR) to this object. This operation * is only supported for very few subclasses derived from this class, * in particular for classes handling pixel data which may either be * of OB or OW value representation. * @param vr value representation * @return EC_Normal if successful, an error code otherwise */ virtual OFCondition setVR(DcmEVR /*vr*/) { return EC_IllegalCall; } /** return value multiplicity of the current object * @return value multiplicity of the current object */ virtual unsigned long getVM() = 0; /** calculate the length of this DICOM element when encoded with the * given transfer syntax and the given encoding type for sequences. * For elements, the length includes the length of the tag, length field, * VR field and the value itself, for items and sequences it returns * the length of the complete item or sequence including delimitation tags * if applicable. Never returns undefined length. * @param xfer transfer syntax for length calculation * @param enctype sequence encoding type for length calculation * @return length of DICOM element */ virtual Uint32 calcElementLength(const E_TransferSyntax xfer, const E_EncodingType enctype) = 0; /** calculate the value length (without attribute tag, VR and length field) * of this DICOM element when encoded with the given transfer syntax and * the given encoding type for sequences. Never returns undefined length. * @param xfer transfer syntax for length calculation * @param enctype sequence encoding type for length calculation * @return value length of DICOM element */ virtual Uint32 getLength(const E_TransferSyntax xfer = EXS_LittleEndianImplicit, const E_EncodingType enctype = EET_UndefinedLength) = 0; /** check if this DICOM object can be encoded in the given transfer syntax. * @param newXfer transfer syntax in which the DICOM object is to be encoded * @param oldXfer transfer syntax in which the DICOM object was read or created. * @return true if object can be encoded in desired transfer syntax, false otherwise. */ virtual OFBool canWriteXfer(const E_TransferSyntax newXfer, const E_TransferSyntax oldXfer) = 0; /** read object from a stream. * @param inStream DICOM input stream * @param ixfer transfer syntax to use when parsing * @param glenc handling of group length parameters * @param maxReadLength attribute values larger than this value are skipped * while parsing and read later upon first access if the stream type supports * this. * @return EC_Normal if successful, an error code otherwise */ virtual OFCondition read(DcmInputStream &inStream, const E_TransferSyntax ixfer, const E_GrpLenEncoding glenc = EGL_noChange, const Uint32 maxReadLength = DCM_MaxReadLength) = 0; /** write object to a stream (abstract) * @param outStream DICOM output stream * @param oxfer output transfer syntax * @param enctype encoding types (undefined or explicit length) * @param wcache pointer to write cache object, may be NULL * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition write(DcmOutputStream &outStream, const E_TransferSyntax oxfer, const E_EncodingType enctype, DcmWriteCache *wcache) = 0; /** write object in XML format to a stream * @param out output stream to which the XML document is written * @param flags optional flag used to customize the output (see DCMTypes::XF_xxx) * @return status, always returns EC_Illegal Call */ virtual OFCondition writeXML(STD_NAMESPACE ostream&out, const size_t flags = 0); /** special write method for creation of digital signatures (abstract) * @param outStream DICOM output stream * @param oxfer output transfer syntax * @param enctype encoding types (undefined or explicit length) * @param wcache pointer to write cache object, may be NULL * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition writeSignatureFormat(DcmOutputStream &outStream, const E_TransferSyntax oxfer, const E_EncodingType enctype, DcmWriteCache *wcache) = 0; /** returns true if the current object may be included in a digital signature * @return true if signable, false otherwise */ virtual OFBool isSignable() const; /** returns true if the object contains an element with Unknown VR at any nesting level * @return true if the object contains an element with Unknown VR, false otherwise */ virtual OFBool containsUnknownVR() const; /** check if this object contains non-ASCII characters * @param checkAllStrings not used in this class * @return always returns false, i.e. no extended characters used */ virtual OFBool containsExtendedCharacters(const OFBool checkAllStrings = OFFalse); /** check if this object is affected by SpecificCharacterSet * @return always returns false, i.e. not affected by SpecificCharacterSet */ virtual OFBool isAffectedBySpecificCharacterSet() const; /** check if this object is empty * @param normalize normalize value before checking (ignore non-significant characters) * @return true if object is empty, i.e. has no value, false otherwise */ virtual OFBool isEmpty(const OFBool normalize = OFTrue); /** clear (remove) attribute value * @return EC_Normal if successful, an error code otherwise */ virtual OFCondition clear() = 0; /** check the currently stored element value * @param autocorrect correct value length if OFTrue * @return status, EC_Normal if value length is correct, an error code otherwise */ virtual OFCondition verify(const OFBool autocorrect = OFFalse) = 0; /** this method is only used in container classes derived from this class, * that is, DcmItem and DcmSequenceOfItems. It returns a pointer to the * next object in the list AFTER the given object. If the caller passes NULL, * a pointer to the first object in the list is returned. If the given object * is not found, the given object is the last one in the list or the list is empty, * NULL is returned. * @param obj pointer to one object in the container; we are looking for the * next entry after this one. NULL if looking for the first entry. * @return pointer to next object in container or NULL if not found */ virtual DcmObject *nextInContainer(const DcmObject *obj); /** this method enables a stack based, depth-first traversal of a complete * hierarchical DICOM dataset (that is, classes derived from DcmItem or * DcmSequenceOfItems). With each call of this method, the next object * in the tree is located and marked on the stack. * @param stack "cursor" for current position in the dataset. The stack * will contain a pointer to each dataset, sequence, item and element * from the main dataset down to the current element, and is updated * upon each call to this method. An empty stack is equivalent to a stack * containing a pointer to this object only. * @param intoSub if true, the nextObject method will perform a hierarchical * search through the dataset (depth-first), if false, only the current * container object will be traversed (e.g., all elements of an item * or all items of a sequence). * @return EC_Normal if value length is correct, an error code otherwise */ virtual OFCondition nextObject(DcmStack &stack, const OFBool intoSub); /** a complex, stack-based, hierarchical search method. It allows for a search * for a DICOM object with a given attribute within a given container, * hierarchically, from a starting position identified through a cursor stack. * @param xtag the DICOM attribute tag we are searching for * @param resultStack Depending on the search mode (see below), this parameter * either serves as an input and output parameter, or as an output parameter * only (the latter being the default). When used as an input parameter, * the cursor stack defines the start position for the search within a * hierarchical DICOM dataset. Upon successful return, the stack contains * the position of the element found, in the form of a pointer to each dataset, * sequence, item and element from the main dataset down to the found element. * @param mode search mode, controls how the search stack is handled. * In the default mode, ESM_fromHere, the stack is ignored on input, and * the search starts in the object for which this method is called. * In the other modes, the stack is used both as an input and an output * parameter and defines the starting point for the search. * @param searchIntoSub if true, the search will be performed hierarchically descending * into the sequences and items of the dataset. If false, only the current container * (sequence or item) will be traversed. * @return EC_Normal if found, EC_TagNotFound if not found, an error code is something went wrong. */ virtual OFCondition search(const DcmTagKey &xtag, DcmStack &resultStack, E_SearchMode mode = ESM_fromHere, OFBool searchIntoSub = OFTrue); /** this method loads all attribute values maintained by this object and * all sub-objects (in case of a container such as DcmDataset) into memory. * After a call to this method, the file from which a dataset was read may safely * be deleted or replaced. For large files, this method may obviously allocate large * amounts of memory. * @return EC_Normal if successful, an error code otherwise */ virtual OFCondition loadAllDataIntoMemory() = 0; /** return the current value of the Length field (which is different from the functionality * of the public getLength method). Only needed for internal purposes and for checker tools * that verify values against the length field. * @return current value of length field */ Uint32 getLengthField() const { return Length; } protected: /** print line indentation, e.g. a couple of spaces for each nesting level. * Depending on the value of 'flags' other visualizations are also possible. * @param out output stream * @param flags used to customize the output (see DCMTypes::PF_xxx) * @param level current level of nested items. Used for indentation. */ void printNestingLevel(STD_NAMESPACE ostream &out, const size_t flags, const int level); /** print beginning of the info line. * The default output is tag and value representation, though other * visualizations are possible depending on the value of 'flags'. * @param out output stream * @param flags used to customize the output (see DCMTypes::PF_xxx) * @param level current level of nested items. Used for indentation. * @param tag optional tag used to print the data element information */ void printInfoLineStart(STD_NAMESPACE ostream &out, const size_t flags, const int level, DcmTag *tag = NULL); /** print end of the info line. * The default output is length, value multiplicity and tag name, though * other visualizations are possible depending on the value of 'flags'. * @param out output stream * @param flags used to customize the output (see DCMTypes::PF_xxx) * @param printedLength number of characters printed after line start. * Used for padding purposes. * @param tag optional tag used to print the data element information */ void printInfoLineEnd(STD_NAMESPACE ostream &out, const size_t flags, const unsigned long printedLength = 0xffffffff /*no padding*/, DcmTag *tag = NULL); /** print given text with element information. * Calls printInfoLineStart() and printInfoLineEnd() to frame the * 'info' text. * @param out output stream * @param flags used to customize the output (see DCMTypes::PF_xxx) * @param level current level of nested items. Used for indentation. * @param info text to be printed * @param tag optional tag used to print the data element information * @param isInfo optional flag indicating whether this text is really given for * informational purposes only. Used to choose the correct output color. */ virtual void printInfoLine(STD_NAMESPACE ostream &out, const size_t flags, const int level = 0, const char *info = NULL, DcmTag *tag = NULL, const OFBool isInfo = OFTrue); /** static helper function that writes a given attribute tag to a binary * output stream using the byte order indicated by the transfer syntax. * @param outStream output stream * @param tag tag to write to the stream * @param oxfer transfer syntax defining the byte order * @return EC_Normal if successful, an error code otherwise */ static OFCondition writeTag(DcmOutputStream &outStream, const DcmTag &tag, const E_TransferSyntax oxfer); /** write tag, VR and length field to the given output stream * @param outStream output stream * @param oxfer transfer syntax for writing * @param writtenBytes number of bytes written to stream returned in this parameter * @return EC_Normal if successful, an error code otherwise */ virtual OFCondition writeTagAndLength(DcmOutputStream &outStream, const E_TransferSyntax oxfer, // in Uint32 &writtenBytes) const; // out /** return the number of bytes needed to serialize the * tag, VR and length information of the current object using the given * transfer syntax. * @param oxfer The transfer syntax used for encoding * @return number of bytes, may be 8 or 12 depending on VR and transfer syntax. */ virtual Uint32 getTagAndLengthSize(const E_TransferSyntax oxfer) const; /** return the DICOM attribute tag name for this object. If not known yet, will * be looked up in the dictionary and cached. Therefore, method is not const. * @return tag name for this attribute */ const char *getTagName() { return Tag.getTagName(); } /** set the VR for this attribute * @param vr new VR for this attribute. */ void setTagVR(DcmEVR vr) { Tag.setVR(vr); } /** return the current transfer state of this object during serialization/deserialization * @return current transfer state of this object */ E_TransferState getTransferState() const { return fTransferState; } /** set the current transfer state of this object during serialization/deserialization * @param newState new transfer state of this object */ void setTransferState(E_TransferState newState) { fTransferState = newState; } /** return the number of transferred bytes for this object during serialization/deserialization * @return number of transferred bytes */ Uint32 getTransferredBytes() const { return fTransferredBytes; } /** set the number of transferred bytes for this object during serialization/deserialization * @param val number of transferred bytes */ void setTransferredBytes(Uint32 val) { fTransferredBytes = val; } /** add to the number of transferred bytes for this object during serialization/deserialization * @param val number of additional transferred bytes to add to existing value */ void incTransferredBytes(Uint32 val) { fTransferredBytes += val; } /** set the current value of the Length field * @param val new value of the Length field */ void setLengthField(Uint32 val) { Length = val; } public: /** helper class to print a DcmObject to an ostream using operator<< */ class PrintHelper { private: /** Undefined assignment operator. This is needed to work around a * compiler warning on VC2008 with the highest warning level. */ PrintHelper& operator=(PrintHelper &); public: /** construct a PrintHelper * @param dcmobj DcmObject you want to print * @param flags flags to use for DcmObject::print() * @param level level to use for DcmObject::print() */ explicit PrintHelper(DcmObject &dcmobj, size_t flags = 0, int level = 0) : dcmobj_(dcmobj), flags_(flags), level_(level) {} DcmObject &dcmobj_; const size_t flags_; const int level_; }; /* member variables */ protected: /// error flag for this object. OFCondition errorFlag; private: /// the DICOM attribute tag and VR for this object DcmTag Tag; /// the length of this attribute as read from stream, may be undefined length Uint32 Length; /// transfer state during read and write operations E_TransferState fTransferState; /// number of bytes already read/written during transfer Uint32 fTransferredBytes; }; // class DcmObject /** Print a DcmObject::PrintHelper to an ostream. * @param stream stream to print to * @param obj object which will be print()ed * @return the stream argument */ static inline STD_NAMESPACE ostream& operator<<(STD_NAMESPACE ostream &stream, DcmObject::PrintHelper obj) { obj.dcmobj_.print(stream, obj.flags_, obj.level_); return stream; } #endif // DCOBJECT_H /* * CVS/RCS Log: * $Log: dcobject.h,v $ * Revision 1.70 2010-10-29 10:57:17 joergr * Added support for colored output to the print() method. * * Revision 1.69 2010-10-14 13:15:41 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.68 2010-06-18 08:17:57 uli * Added undefined assignment operator to PrintHelper to work around * a warning with VC2008. * * Revision 1.67 2010-03-01 09:08:44 uli * Removed some unnecessary include directives in the headers. * * Revision 1.66 2010-02-22 11:39:54 uli * Remove some unneeded includes. * * Revision 1.65 2009-11-04 09:58:07 uli * Switched to logging mechanism provided by the "new" oflog module * * Revision 1.64 2009-10-13 14:26:09 uli * Added the DcmObject::PrintHelper helper class. This class can be used to * print DcmObject instances with oflog's logging macros. * * Revision 1.63 2009-08-07 14:40:38 joergr * Enhanced isEmpty() method by checking whether the data element value consists * of non-significant characters only. * * Revision 1.62 2009-06-04 16:52:14 joergr * Added new parsing flag that allows for ignoring the value of File Meta * Information Group Length (0002,0000). * * Revision 1.61 2009-03-25 10:22:09 joergr * Added new method isEmpty() to DICOM object, item and sequence class. * * Revision 1.60 2009-03-05 14:07:56 onken * Fixed typo. * * Revision 1.59 2009-03-05 13:35:47 onken * Added checks for sequence and item lengths which prevents overflow in length * field, if total length of contained items (or sequences) exceeds * 32-bit length field. Also introduced new flag (default: enabled) * for writing in explicit length mode, which allows for automatically * switching encoding of only that very sequence/item to undefined * length coding (thus permitting to actually write the file). * * Revision 1.58 2009-02-11 13:16:32 onken * Added global parser flag permitting to stop parsing after a specific * element was parsed on dataset level (useful for removing garbage at * end of file). * * Revision 1.57 2009-02-04 17:54:30 joergr * Fixed various layout and formatting issues. * * Revision 1.56 2009-02-04 14:05:01 onken * Introduced global flag that, if enabled, tells the parser to continue * parsing if possible. * * Revision 1.55 2009-01-29 15:36:16 onken * Added global parsing option that allows for reading private attributes in * implicit encoding having a maximum length to be read as sequences instead * of relying on the dictionary. * * Revision 1.54 2009-01-06 16:28:11 joergr * Reworked print() output format for option PF_showTreeStructure. * * Revision 1.53 2009-01-05 15:32:23 joergr * Added global flag that allows for reading incorrectly encoded DICOM datasets * where particular data elements are encoded with a differing transfer syntax * (Implicit VR Little endian instead of Explicit VR encoding as declared). * * Revision 1.52 2008-09-24 13:33:53 joergr * Fixed typo in comment. * * Revision 1.51 2008-07-17 11:19:49 onken * Updated copyFrom() documentation. * * Revision 1.50 2008-07-17 10:30:23 onken * Implemented copyFrom() method for complete DcmObject class hierarchy, which * permits setting an instance's value from an existing object. Implemented * assignment operator where necessary. * * Revision 1.49 2008-04-17 14:48:39 meichel * Method DcmObject::getLengthField now public, needed by dcmcheck * * Revision 1.48 2007/11/29 14:30:19 meichel * Write methods now handle large raw data elements (such as pixel data) * without loading everything into memory. This allows very large images to * be sent over a network connection, or to be copied without ever being * fully in memory. * * Revision 1.47 2007/06/29 14:17:49 meichel * Code clean-up: Most member variables in module dcmdata are now private, * not protected anymore. * * Revision 1.46 2007/02/19 15:04:34 meichel * Removed searchErrors() methods that are not used anywhere and added * error() methods only in the DcmObject subclasses where really used. * * Revision 1.45 2006/12/15 14:18:07 joergr * Added new method that checks whether a DICOM object or element is affected * by SpecificCharacterSet (0008,0005). * * Revision 1.44 2006/12/13 13:58:15 joergr * Added new optional parameter "checkAllStrings" to method containsExtended * Characters(). * * Revision 1.43 2006/08/15 15:49:56 meichel * Updated all code in module dcmdata to correctly compile when * all standard C++ classes remain in namespace std. * * Revision 1.42 2006/05/11 08:54:23 joergr * Moved checkForNonASCIICharacters() from application to library. * * Revision 1.41 2005/12/08 16:28:22 meichel * Changed include path schema for all DCMTK header files * * Revision 1.40 2005/12/02 08:49:17 joergr * Changed macro NO_XFER_DETECTION_FOR_DATASETS into a global option that can * be enabled and disabled at runtime. * * Revision 1.39 2005/11/24 12:50:57 meichel * Fixed bug in code that prepares a byte stream that is fed into the MAC * algorithm when creating or verifying a digital signature. The previous * implementation was non-conformant when signatures included compressed * (encapsulated) pixel data because the item length was included in the byte * stream, while it should not. The global variable dcmEnableOldSignatureFormat * and a corresponding command line option in dcmsign allow to re-enable the old * implementation. * * Revision 1.38 2005/05/10 15:27:14 meichel * Added support for reading UN elements with undefined length according * to CP 246. The global flag dcmEnableCP246Support allows to revert to the * prior behaviour in which UN elements with undefined length were parsed * like a normal explicit VR SQ element. * * Revision 1.37 2004/07/01 12:28:25 meichel * Introduced virtual clone method for DcmObject and derived classes. * * Revision 1.36 2004/04/27 09:21:01 wilkens * Fixed a bug in dcelem.cc which occurs when one is serializing a dataset * (that contains an attribute whose length value is coded with 2 bytes) into * a given buffer. Although the number of available bytes in the buffer was * sufficient, the dataset->write(...) method would always return * EC_StreamNotifyClient to indicate that there are not sufficient bytes * available in the buffer. This code modification fixes the problem. * * Revision 1.35 2003/06/12 13:33:21 joergr * Fixed inconsistent API documentation reported by Doxygen. * * Revision 1.34 2002/12/06 12:49:11 joergr * Enhanced "print()" function by re-working the implementation and replacing * the boolean "showFullData" parameter by a more general integer flag. * Added doc++ documentation. * Made source code formatting more consistent with other modules/files. * * Revision 1.33 2002/08/27 16:55:35 meichel * Initial release of new DICOM I/O stream classes that add support for stream * compression (deflated little endian explicit VR transfer syntax) * * Revision 1.32 2002/08/20 12:18:35 meichel * Changed parameter list of loadFile and saveFile methods in class * DcmFileFormat. Removed loadFile and saveFile from class DcmObject. * * Revision 1.31 2002/07/08 14:45:20 meichel * Improved dcmdata behaviour when reading odd tag length. Depending on the * global boolean flag dcmAcceptOddAttributeLength, the parser now either accepts * odd length attributes or implements the old behaviour, i.e. assumes a real * length larger by one. * * Revision 1.30 2002/04/25 09:38:47 joergr * Added support for XML output of DICOM objects. * * Revision 1.29 2002/04/11 12:23:46 joergr * Added new methods for loading and saving DICOM files. * * Revision 1.28 2001/11/16 15:54:39 meichel * Adapted digital signature code to final text of supplement 41. * * Revision 1.27 2001/09/25 17:19:27 meichel * Adapted dcmdata to class OFCondition * * Revision 1.26 2001/06/01 15:48:41 meichel * Updated copyright header * * Revision 1.25 2000/11/07 16:56:07 meichel * Initial release of dcmsign module for DICOM Digital Signatures * * Revision 1.24 2000/04/14 16:02:39 meichel * Global flag dcmEnableAutomaticInputDataCorrection now derived from OFGlobal * and, thus, safe for use in multi-thread applications. * * Revision 1.23 2000/03/08 16:26:16 meichel * Updated copyright header. * * Revision 1.22 2000/03/03 14:05:24 meichel * Implemented library support for redirecting error messages into memory * instead of printing them to stdout/stderr for GUI applications. * * Revision 1.21 2000/02/10 10:50:52 joergr * Added new feature to dcmdump (enhanced print method of dcmdata): write * pixel data/item value fields to raw files. * * Revision 1.20 2000/02/01 10:12:02 meichel * Avoiding to include as extern "C" on Borland C++ Builder 4, * workaround for bug in compiler header files. * * Revision 1.19 1999/03/31 09:24:42 meichel * Updated copyright header in module dcmdata * * */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/dcbytstr.h0000644000310500011400000005320611464747623021611 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Gerd Ehlers, Andreas Barth * * Purpose: Interface of class DcmByteString * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-11-05 09:34:11 $ * CVS/RCS Revision: $Revision: 1.46 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DCBYTSTR_H #define DCBYTSTR_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dctypes.h" #include "dcmtk/dcmdata/dcelem.h" #include "dcmtk/ofstd/ofstring.h" /** base class for all DICOM value representations storing a character string */ class DcmByteString: public DcmElement { /// internal type used to specify the current string representation enum E_StringMode { /// string has internal representation (no padding) DCM_MachineString, /// string has DICOM representation (even length) DCM_DicomString, /// string has unknown representation (maybe multiple padding chars?) DCM_UnknownString }; public: /** constructor. * Create new element from given tag and length. * @param tag DICOM tag for the new element * @param len value length for the new element */ DcmByteString(const DcmTag &tag, const Uint32 len = 0); /** copy constructor * @param old element to be copied */ DcmByteString(const DcmByteString &old); /** destructor */ virtual ~DcmByteString(); /** assignment operator * @param obj element to be assigned/copied * @return reference to this object */ DcmByteString& operator=(const DcmByteString& obj); /** clone method * @return deep copy of this object */ virtual DcmObject *clone() const { return new DcmByteString(*this); } /** Virtual object copying. This method can be used for DcmObject * and derived classes to get a deep copy of an object. Internally * the assignment operator is called if the given DcmObject parameter * is of the same type as "this" object instance. If not, an error * is returned. This function permits copying an object by value * in a virtual way which therefore is different to just calling the * assignment operator of DcmElement which could result in slicing * the object. * @param rhs - [in] The instance to copy from. Has to be of the same * class type as "this" object * @return EC_Normal if copying was successful, error otherwise */ virtual OFCondition copyFrom(const DcmObject& rhs); /** get element type identifier * @return type identifier of this class (EVR_UNKNOWN) */ virtual DcmEVR ident() const; /** clear the currently stored value * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition clear(); /** get value multiplicity * @return number of string components (separated by a backslash) */ virtual unsigned long getVM(); /** get length of the stored value. * Trailing spaces (padding characters) are ignored for the "real" length. * @return number of characters stored for the string value */ Uint32 getRealLength(); /** get DICOM length of the stored value. * The string value is padded if required. Therefore, the returned length * always has an even value. * @param xfer not used * @param enctype not used * @return number of characters stored in DICOM representation */ virtual Uint32 getLength(const E_TransferSyntax xfer = EXS_LittleEndianImplicit, const E_EncodingType enctype = EET_UndefinedLength); /** print element to a stream. * The output format of the value is a backslash separated sequence of string * components (if any). * @param out output stream * @param flags optional flag used to customize the output (see DCMTypes::PF_xxx) * @param level current level of nested items. Used for indentation. * @param pixelFileName not used * @param pixelCounter not used */ virtual void print(STD_NAMESPACE ostream&out, const size_t flags = 0, const int level = 0, const char *pixelFileName = NULL, size_t *pixelCounter = NULL); /** write data element to a stream * @param outStream output stream * @param oxfer transfer syntax used to write the data * @param enctype flag, specifying the encoding with undefined or explicit length * @param wcache pointer to write cache object, may be NULL */ virtual OFCondition write(DcmOutputStream &outStream, const E_TransferSyntax oxfer, const E_EncodingType enctype, DcmWriteCache *wcache); /** write data element to a stream as required for the creation of digital signatures * @param outStream output stream * @param oxfer transfer syntax used to write the data * @param enctype flag, specifying the encoding with undefined or explicit length * @param wcache pointer to write cache object, may be NULL */ virtual OFCondition writeSignatureFormat( DcmOutputStream &outStream, const E_TransferSyntax oxfer, const E_EncodingType enctype, DcmWriteCache *wcache); /** get a copy of a particular string component * @param stringVal variable in which the result value is stored * @param pos index of the value in case of multi-valued elements (0..vm-1) * @param normalize not used since string normalization depends on value representation * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition getOFString(OFString &stringVal, const unsigned long pos, OFBool normalize = OFTrue); /** get a pointer to the current string value. * This includes all string components and separators. NB: this method does * not copy the stored value. * @param stringVal reference to the pointer variable * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition getString(char *&stringVal); /** set element value from the given character string * @param stringVal input character string (possibly multi-valued) * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition putString(const char *stringVal); /** set element value from the given character string. * @param stringVal input character string (possibly multi-valued) * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition putOFStringArray(const OFString &stringVal); /** check the currently stored string value. * Checks every string component for the maximum length specified for the particular * value representation. * @param autocorrect correct value and value component length if OFTrue * @return status, EC_Normal if value length is correct, an error code otherwise */ virtual OFCondition verify(const OFBool autocorrect = OFFalse); /** check if this element contains non-ASCII characters * @param checkAllStrings if true, also check elements with string values not affected * by SpecificCharacterSet (0008,0005), default: only check PN, LO, LT, SH, ST, UT * @return true if element contains non-ASCII characters, false otherwise */ virtual OFBool containsExtendedCharacters(const OFBool checkAllStrings = OFFalse); /** check if this element is affected by SpecificCharacterSet * @return always returns false */ virtual OFBool isAffectedBySpecificCharacterSet() const; /** check if this object is empty * @param normalize normalize value before checking (ignore non-significant characters) * @return true if object is empty, i.e. has no value, false otherwise */ virtual OFBool isEmpty(const OFBool normalize = OFTrue); protected: /** create a new value field (string buffer) of the previously defined size * (member variable 'Length'). Also handles odd value length by allocating * extra space for the padding character. * This method is used by derived classes only. * @return pointer to the newly created value field */ virtual Uint8 *newValueField(); /** method is called after the element value has been loaded. * Can be used to correct the value before it is used for the first time. */ virtual void postLoadValue(); /** convert currently stored string value to internal representation. * It removes any trailing space character and recomputes the string length. * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition makeMachineByteString(); /** convert currently stored string value to DICOM representation. * It removes trailing spaces apart from a possibly required single padding * character (in case of odd string length). * @return status, EC_Normal if successful, an error code otherwise */ OFCondition makeDicomByteString(); /** get a copy of the current string value. * This includes all string components and separators. * @param stringVal variable in which the result is stored * @return status, EC_Normal if successful, an error code otherwise */ OFCondition getStringValue(OFString &stringVal); /** set the end-of-string padding character * @param c end-of-string padding character */ void setPaddingChar(char c) { paddingChar = c; } /** set the maximum number of characters for each string component * @param val maximum number of characters for each string component */ void setMaxLength(Uint32 val) { maxLength = val; } /** set non-significant characters used to determine whether the value is empty * @param characters non-significant characters used to determine whether the value is empty */ void setNonSignificantChars(const OFString &characters) { nonSignificantChars = characters; } /* --- static helper functions --- */ /** check whether given string value conforms to a certain VR and VM. * @param value string value to be checked (possibly multi-valued) * @param vm value multiplicity (according to the data dictionary) to be checked for. * (valid values: "1", "1-2", "1-3", "1-8", "1-99", "1-n", "2", "2-n", "2-2n", * "3", "3-n", "3-3n", "4", "6", "9", "16", "32" or "" for no check) * @param vr two-character identifier of the VR to be checked (lower case) * @param vrID expected numeric identifier of the VR * @param maxLen maximum number of characters allowed for a single value (0 = no check) * @return status of the check, EC_Normal if value is correct, an error code otherwise */ static OFCondition checkStringValue(const OFString &value, const OFString &vm, const OFString &vr, const int vrID, const size_t maxLen = 0); private: /// padding character used to adjust odd value length (space) char paddingChar; /// maximum number of characters for each string component Uint32 maxLength; /// number of characters of the internal string representation Uint32 realLength; /// current representation of the string value E_StringMode fStringMode; /// non significant characters used to determine whether the value is empty OFString nonSignificantChars; }; /** @name string normalization flags. * These flags can be used with normalizeString() to specify the extent of normalization. */ //@{ /// delete trailing spaces const OFBool DELETE_TRAILING = OFTrue; /// delete leading spaces const OFBool DELETE_LEADING = OFTrue; /// handle string as multi-valued (components separated by a backslash) const OFBool MULTIPART = OFTrue; //@} /* Function to get part out of a String for VM > 1 */ /** extract particular component from a string value. * String components are expected to be separated by a backslash character ('\'). * @param result reference to the result variable * @param orgStr input string value * @param pos index of the string component to be extracted (0..vm-1) * @return status, EC_Normal if successful, an error code otherwise */ OFCondition getStringPart(OFString &result, const char *orgStr, const unsigned long pos); /** normalize the given string value, i.e. remove leading and/or trailing spaces * @param string input and output string value to be normalized * @param multiPart handle string as multi-valued if OFTrue * @param leading delete leading spaces if OFTrue * @param trailing delete trailing spaces if OFTrue */ void normalizeString(OFString &string, const OFBool multiPart, const OFBool leading, const OFBool trailing); #endif // DCBYTSTR_H /* ** CVS/RCS Log: ** $Log: dcbytstr.h,v $ ** Revision 1.46 2010-11-05 09:34:11 joergr ** Added support for checking the value multiplicity "9" (see Supplement 131). ** ** Revision 1.45 2010-10-14 13:15:40 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.44 2010-04-23 14:29:28 joergr ** Renamed static helper function checkValue() to checkStringValue(). ** ** Revision 1.43 2010-04-22 09:01:18 joergr ** Added support for further VM values ("1-8", "1-99", "16", "32") to be checked. ** ** Revision 1.42 2010-02-22 11:39:53 uli ** Remove some unneeded includes. ** ** Revision 1.41 2009-08-07 14:40:38 joergr ** Enhanced isEmpty() method by checking whether the data element value consists ** of non-significant characters only. ** ** Revision 1.40 2009-08-03 09:05:29 joergr ** Added methods that check whether a given string value conforms to the VR and ** VM definitions of the DICOM standards. ** ** Revision 1.39 2008-07-17 11:19:48 onken ** Updated copyFrom() documentation. ** ** Revision 1.38 2008-07-17 10:30:22 onken ** Implemented copyFrom() method for complete DcmObject class hierarchy, which ** permits setting an instance's value from an existing object. Implemented ** assignment operator where necessary. ** ** Revision 1.37 2008-06-23 12:09:13 joergr ** Fixed inconsistencies in Doxygen API documentation. ** ** Revision 1.36 2007/11/29 14:30:19 meichel ** Write methods now handle large raw data elements (such as pixel data) ** without loading everything into memory. This allows very large images to ** be sent over a network connection, or to be copied without ever being ** fully in memory. ** ** Revision 1.35 2007/06/29 14:17:49 meichel ** Code clean-up: Most member variables in module dcmdata are now private, ** not protected anymore. ** ** Revision 1.34 2006/12/15 14:18:07 joergr ** Added new method that checks whether a DICOM object or element is affected ** by SpecificCharacterSet (0008,0005). ** ** Revision 1.33 2006/12/13 13:58:15 joergr ** Added new optional parameter "checkAllStrings" to method containsExtended ** Characters(). ** ** Revision 1.32 2006/11/08 17:00:06 meichel ** Added DcmByteString::containsExtendedCharacters ** ** Revision 1.31 2006/08/15 15:49:56 meichel ** Updated all code in module dcmdata to correctly compile when ** all standard C++ classes remain in namespace std. ** ** Revision 1.30 2005/12/08 16:27:59 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.29 2004/07/01 12:28:25 meichel ** Introduced virtual clone method for DcmObject and derived classes. ** ** Revision 1.28 2003/07/04 13:25:35 meichel ** Replaced forward declarations for OFString with explicit includes, ** needed when compiling with HAVE_STD_STRING ** ** Revision 1.27 2003/06/12 13:35:54 joergr ** Fixed inconsistent API documentation reported by Doxygen. ** ** Revision 1.26 2002/12/10 17:41:22 meichel ** Removed typedef to avoid warnings on various compilers ** ** Revision 1.25 2002/12/06 12:49:07 joergr ** Enhanced "print()" function by re-working the implementation and replacing ** the boolean "showFullData" parameter by a more general integer flag. ** Added doc++ documentation. ** Made source code formatting more consistent with other modules/files. ** ** Revision 1.24 2002/08/27 16:55:30 meichel ** Initial release of new DICOM I/O stream classes that add support for stream ** compression (deflated little endian explicit VR transfer syntax) ** ** Revision 1.23 2002/04/25 10:05:14 joergr ** Removed getOFStringArray() implementation. ** Made makeMachineByteString() virtual to avoid ambiguities. ** ** Revision 1.22 2001/09/25 17:19:24 meichel ** Adapted dcmdata to class OFCondition ** ** Revision 1.21 2001/06/01 15:48:33 meichel ** Updated copyright header ** ** Revision 1.20 2000/11/07 16:56:05 meichel ** Initial release of dcmsign module for DICOM Digital Signatures ** ** Revision 1.19 2000/04/14 15:31:31 meichel ** Removed default value from output stream passed to print() method. ** Required for use in multi-thread environments. ** ** Revision 1.18 2000/03/08 16:26:11 meichel ** Updated copyright header. ** ** Revision 1.17 2000/03/03 14:05:22 meichel ** Implemented library support for redirecting error messages into memory ** instead of printing them to stdout/stderr for GUI applications. ** ** Revision 1.16 2000/02/10 10:50:49 joergr ** Added new feature to dcmdump (enhanced print method of dcmdata): write ** pixel data/item value fields to raw files. ** ** Revision 1.15 1999/03/31 09:24:30 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.14 1998/11/12 16:47:36 meichel ** Implemented operator= for all classes derived from DcmObject. ** ** Revision 1.13 1997/09/11 15:13:09 hewett ** Modified getOFString method arguments by removing a default value ** for the pos argument. By requiring the pos argument to be provided ** ensures that callers realise getOFString only gets one component of ** a multi-valued string. ** ** Revision 1.12 1997/08/29 13:11:38 andreas ** Corrected Bug in getOFStringArray Implementation ** ** Revision 1.11 1997/08/29 08:32:37 andreas ** - Added methods getOFString and getOFStringArray for all ** string VRs. These methods are able to normalise the value, i. e. ** to remove leading and trailing spaces. This will be done only if ** it is described in the standard that these spaces are not relevant. ** These methods do not test the strings for conformance, this means ** especially that they do not delete spaces where they are not allowed! ** getOFStringArray returns the string with all its parts separated by \ ** and getOFString returns only one value of the string. ** CAUTION: Currently getString returns a string with trailing ** spaces removed (if dcmEnableAutomaticInputDataCorrection == OFTrue) and ** truncates the original string (since it is not copied!). If you rely on this ** behaviour please change your application now. ** Future changes will ensure that getString returns the original ** string from the DICOM object (NULL terminated) inclusive padding. ** Currently, if you call getOF... before calling getString without ** normalisation, you can get the original string read from the DICOM object. ** ** Revision 1.10 1997/07/21 08:25:05 andreas ** - Replace all boolean types (BOOLEAN, CTNBOOLEAN, DICOM_BOOL, BOOL) ** with one unique boolean type OFBool. ** ** Revision 1.9 1997/05/16 08:31:19 andreas ** - Revised handling of GroupLength elements and support of ** DataSetTrailingPadding elements. The enumeratio E_GrpLenEncoding ** got additional enumeration values (for a description see dctypes.h). ** addGroupLength and removeGroupLength methods are replaced by ** computeGroupLengthAndPadding. To support Padding, the parameters of ** element and sequence write functions changed. ** ** Revision 1.8 1997/04/18 08:13:28 andreas ** - The put/get-methods for all VRs did not conform to the C++-Standard ** draft. Some Compilers (e.g. SUN-C++ Compiler, Metroworks ** CodeWarrier, etc.) create many warnings concerning the hiding of ** overloaded get methods in all derived classes of DcmElement. ** So the interface of all value representation classes in the ** library are changed rapidly, e.g. ** OFCondition get(Uint16 & value, const unsigned long pos); ** becomes ** OFCondition getUint16(Uint16 & value, const unsigned long pos); ** All (retired) "returntype get(...)" methods are deleted. ** For more information see dcmdata/include/dcelem.h ** ** Revision 1.7 1996/08/05 08:45:15 andreas ** new print routine with additional parameters: ** - print into files ** - fix output length for elements ** corrected error in search routine with parameter ESM_fromStackTop ** ** Revision 1.6 1996/03/12 15:26:52 hewett ** Removed get method for unsigned char* ** ** Revision 1.5 1996/01/29 13:38:11 andreas ** - new put method for every VR to put value as a string ** - better and unique print methods ** ** Revision 1.4 1996/01/09 11:06:13 andreas ** New Support for Visual C++ ** Correct problems with inconsistent const declarations ** ** Revision 1.3 1996/01/05 13:22:52 andreas ** - changed to support new streaming facilities ** - more cleanups ** - merged read / write methods for block and file transfer ** */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/dcvrat.h0000644000310500011400000003065411464747623021240 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Gerd Ehlers, Andreas Barth * * Purpose: Interface of class DcmAttributeTag * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-11-05 09:34:11 $ * CVS/RCS Revision: $Revision: 1.30 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DCVRAT_H #define DCVRAT_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcelem.h" /** a class representing the DICOM value representation 'Attribute Tag' (AT) */ class DcmAttributeTag : public DcmElement { public: /** constructor. * Create new element from given tag and length. * @param tag DICOM tag for the new element * @param len value length for the new element */ DcmAttributeTag(const DcmTag &tag, const Uint32 len = 0); /** copy constructor * @param old element to be copied */ DcmAttributeTag(const DcmAttributeTag &old); /** destructor */ virtual ~DcmAttributeTag(); /** assignment operator * @param obj element to be assigned/copied * @return reference to this object */ DcmAttributeTag &operator=(const DcmAttributeTag &obj); /** clone method * @return deep copy of this object */ virtual DcmObject *clone() const { return new DcmAttributeTag(*this); } /** Virtual object copying. This method can be used for DcmObject * and derived classes to get a deep copy of an object. Internally * the assignment operator is called if the given DcmObject parameter * is of the same type as "this" object instance. If not, an error * is returned. This function permits copying an object by value * in a virtual way which therefore is different to just calling the * assignment operator of DcmElement which could result in slicing * the object. * @param rhs - [in] The instance to copy from. Has to be of the same * class type as "this" object * @return EC_Normal if copying was successful, error otherwise */ virtual OFCondition copyFrom(const DcmObject& rhs); /** get element type identifier * @return type identifier of this class (EVR_AT) */ virtual DcmEVR ident() const; /** check whether stored value conforms to the VR and to the specified VM * @param vm value multiplicity (according to the data dictionary) to be checked for. * (valid values: "1", "1-2", "1-3", "1-8", "1-99", "1-n", "2", "2-n", "2-2n", * "3", "3-n", "3-3n", "4", "9", "6", "16", "32") * @param oldFormat parameter not used for this VR (only for DA, TM, PN) * @return status of the check, EC_Normal if value is correct, an error code otherwise */ virtual OFCondition checkValue(const OFString &vm = "1-n", const OFBool oldFormat = OFFalse); /** get value multiplicity * @return number of tag value pairs (group,element) */ virtual unsigned long getVM(); /** print element to a stream. * The output format of the value is a backslash separated sequence of group and * element value pairs, e.g. "(0008,0020)\(0008,0030)" * @param out output stream * @param flags optional flag used to customize the output (see DCMTypes::PF_xxx) * @param level current level of nested items. Used for indentation. * @param pixelFileName not used * @param pixelCounter not used */ virtual void print(STD_NAMESPACE ostream&out, const size_t flags = 0, const int level = 0, const char *pixelFileName = NULL, size_t *pixelCounter = NULL); /** get particular tag value * @param tagVal reference to result variable (cleared in case of error) * @param pos index of the value to be retrieved (0..vm-1) * @return status status, EC_Normal if successful, an error code otherwise */ virtual OFCondition getTagVal(DcmTagKey &tagVal, const unsigned long pos = 0); /** get reference to stored integer data. * The array entries with an even-numbered index contain the group numbers * and the odd entries contain the element numbers (see "putUint16Array()"). * The number of entries is twice as large as the return value of "getVM()". * @param uintVals reference to result variable * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition getUint16Array(Uint16 *&uintVals); /** get specified value as a character string. * The output format is "(gggg,eeee)" where "gggg" is the hexa-decimal group * number and "eeee" the hexa-decimal element number of the attribute tag. * @param stringVal variable in which the result value is stored * @param pos index of the value in case of multi-valued elements (0..vm-1) * @param normalize not used * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition getOFString(OFString &stringVal, const unsigned long pos, OFBool normalize = OFTrue); /** set particular tag value * @param tagVal tag value to be set * @param pos index of the value to be set (0 = first position) * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition putTagVal(const DcmTagKey &tagVal, const unsigned long pos = 0); /** set element value to given integer array data. * The array entries with an even-numbered index are expected to contain the * group numbers and the odd entries to contain the element numbers, e.g. * {0x0008, 0x0020, 0x0008, 0x0030}. This function uses the same format as * "getUint16Array()". * @param uintVals unsigned integer data to be set * @param numUints number of integer values to be set (should be even) * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition putUint16Array(const Uint16 *uintVals, const unsigned long numUints); /** set element value from the given character string. * The input string is expected to be a backslash separated sequence of * attribute tags, e.g. "(0008,0020)\(0008,0030)". This is the same format * as used by "print()". * @param stringVal input character string * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition putString(const char *stringVal); /** check the currently stored element value * @param autocorrect correct value length if OFTrue * @return status, EC_Normal if value length is correct, an error code otherwise */ virtual OFCondition verify(const OFBool autocorrect = OFFalse); /* --- static helper functions --- */ /** check whether given string value conforms to the VR "AT" (Attribute Tag) * and to the specified VM. * @param value string value to be checked (possibly multi-valued) * @param vm value multiplicity (according to the data dictionary) to be checked for. * (valid values: "1", "1-2", "1-3", "1-8", "1-99", "1-n", "2", "2-n", "2-2n", * "3", "3-n", "3-3n", "4", "6", "9", "16", "32") * @return status of the check, EC_Normal if value is correct, an error code otherwise */ static OFCondition checkStringValue(const OFString &value, const OFString &vm = "1-n"); }; #endif // DCVRAT_H /* ** CVS/RCS Log: ** $Log: dcvrat.h,v $ ** Revision 1.30 2010-11-05 09:34:11 joergr ** Added support for checking the value multiplicity "9" (see Supplement 131). ** ** Revision 1.29 2010-10-14 13:15:42 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.28 2010-04-23 15:26:12 joergr ** Specify an appropriate default value for the "vm" parameter of checkValue(). ** ** Revision 1.27 2010-04-23 14:25:27 joergr ** Added new method to all VR classes which checks whether the stored value ** conforms to the VR definition and to the specified VM. ** ** Revision 1.26 2009-11-04 09:58:07 uli ** Switched to logging mechanism provided by the "new" oflog module ** ** Revision 1.25 2008-07-17 11:19:49 onken ** Updated copyFrom() documentation. ** ** Revision 1.24 2008-07-17 10:30:23 onken ** Implemented copyFrom() method for complete DcmObject class hierarchy, which ** permits setting an instance's value from an existing object. Implemented ** assignment operator where necessary. ** ** Revision 1.23 2006-08-15 15:49:56 meichel ** Updated all code in module dcmdata to correctly compile when ** all standard C++ classes remain in namespace std. ** ** Revision 1.22 2005/12/08 16:28:53 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.21 2004/07/01 12:28:25 meichel ** Introduced virtual clone method for DcmObject and derived classes. ** ** Revision 1.20 2003/06/12 13:31:46 joergr ** Fixed inconsistent API documentation reported by Doxygen. ** ** Revision 1.19 2002/12/06 12:49:14 joergr ** Enhanced "print()" function by re-working the implementation and replacing ** the boolean "showFullData" parameter by a more general integer flag. ** Added doc++ documentation. ** Made source code formatting more consistent with other modules/files. ** ** Revision 1.18 2002/04/25 09:50:38 joergr ** Added getOFString() implementation. ** ** Revision 1.17 2001/09/25 17:19:30 meichel ** Adapted dcmdata to class OFCondition ** ** Revision 1.16 2001/06/01 15:48:48 meichel ** Updated copyright header ** ** Revision 1.15 2000/04/14 15:31:34 meichel ** Removed default value from output stream passed to print() method. ** Required for use in multi-thread environments. ** ** Revision 1.14 2000/03/08 16:26:22 meichel ** Updated copyright header. ** ** Revision 1.13 2000/03/03 14:05:26 meichel ** Implemented library support for redirecting error messages into memory ** instead of printing them to stdout/stderr for GUI applications. ** ** Revision 1.12 2000/02/10 10:50:54 joergr ** Added new feature to dcmdump (enhanced print method of dcmdata): write ** pixel data/item value fields to raw files. ** ** Revision 1.11 1999/03/31 09:24:56 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.10 1998/11/12 16:47:45 meichel ** Implemented operator= for all classes derived from DcmObject. ** ** Revision 1.9 1997/07/21 08:25:13 andreas ** - Replace all boolean types (BOOLEAN, CTNBOOLEAN, DICOM_BOOL, BOOL) ** with one unique boolean type OFBool. ** ** Revision 1.8 1997/04/18 08:13:29 andreas ** - The put/get-methods for all VRs did not conform to the C++-Standard ** draft. Some Compilers (e.g. SUN-C++ Compiler, Metroworks ** CodeWarrier, etc.) create many warnings concerning the hiding of ** overloaded get methods in all derived classes of DcmElement. ** So the interface of all value representation classes in the ** library are changed rapidly, e.g. ** OFCondition get(Uint16 & value, const unsigned long pos); ** becomes ** OFCondition getUint16(Uint16 & value, const unsigned long pos); ** All (retired) "returntype get(...)" methods are deleted. ** For more information see dcmdata/include/dcelem.h ** ** Revision 1.7 1996/08/05 08:45:29 andreas ** new print routine with additional parameters: ** - print into files ** - fix output length for elements ** corrected error in search routine with parameter ESM_fromStackTop ** ** Revision 1.6 1996/04/16 16:01:37 andreas ** - put methods for AttributeTag with DcmTagKey Parameter ** - better support for NULL values ** ** Revision 1.5 1996/01/29 13:38:15 andreas ** - new put method for every VR to put value as a string ** - better and unique print methods ** ** Revision 1.4 1996/01/09 11:06:17 andreas ** New Support for Visual C++ ** Correct problems with inconsistent const declarations ** ** Revision 1.3 1996/01/05 13:23:03 andreas ** - changed to support new streaming facilities ** - more cleanups ** - merged read / write methods for block and file transfer ** */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/dcpcache.h0000644000310500011400000000736311455601175021477 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Marco Eichelberg * * Purpose: class DcmPrivateTagCache * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:15:41 $ * CVS/RCS Revision: $Revision: 1.5 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DCPCACHE_H #define DCPCACHE_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/ofstd/oftypes.h" /* for OFBool */ #include "dcmtk/ofstd/oflist.h" /* for OFList */ #include "dcmtk/ofstd/ofstring.h" /* for OFString */ #include "dcmtk/dcmdata/dctagkey.h" /* for DcmTagKey */ class DcmObject; /** class handling one entry of the Private Tag Cache List */ class DcmPrivateTagCacheEntry { public: /** constructor * @param tk tag key for private creator element * @param pc private creator name, must not be NULL or empty string */ DcmPrivateTagCacheEntry(const DcmTagKey& tk, const char *pc); /// destructor virtual ~DcmPrivateTagCacheEntry(); /** returns the private creator name */ const char *getPrivateCreator() const; /** checks if this element is the private creator for the element * with the given tag key * @param tk tag key to check * @return OFTrue if this element contains the matching private creator, * OFFalse otherwise. */ OFBool isPrivateCreatorFor(const DcmTagKey& tk) const; private: /// private undefined copy constructor DcmPrivateTagCacheEntry(const DcmPrivateTagCacheEntry&); /// private undefined copy assignment operator DcmPrivateTagCacheEntry& operator=(const DcmPrivateTagCacheEntry&); /// the tag key of the private creator element DcmTagKey tagKey; /// the private creator name OFString privateCreator; }; /** this class implements a cache of Private Creator elements * and corresponding reserved tag numbers. */ class DcmPrivateTagCache { public: /// default constructor DcmPrivateTagCache(); /// destructor virtual ~DcmPrivateTagCache(); /// resets the cache to default-constructed state void clear(); /** looks up the private creator name for the given private tag * @param tk private tag to check * @return private creator name if found, NULL otherwise. */ const char *findPrivateCreator(const DcmTagKey& tk) const; /** updates the private creator cache with the given object. * If the object points to a private creator element, * the tag key and creator code are added to the cache. * Otherwise, the cache remains unmodified. */ void updateCache(DcmObject *dobj); private: /// private undefined copy constructor DcmPrivateTagCache(const DcmPrivateTagCache&); /// private undefined copy assignment operator DcmPrivateTagCache& operator=(const DcmPrivateTagCache&); /// the list OFList list_; }; #endif /* * CVS/RCS Log: * $Log: dcpcache.h,v $ * Revision 1.5 2010-10-14 13:15:41 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.4 2009-11-04 09:58:07 uli * Switched to logging mechanism provided by the "new" oflog module * * Revision 1.3 2005-12-08 16:28:29 meichel * Changed include path schema for all DCMTK header files * * Revision 1.2 2004/10/20 15:56:13 meichel * Changed private inheritance from OFList to class member, * needed for compilation with HAVE_STL. * * Revision 1.1 2002/07/23 14:21:27 meichel * Added support for private tag data dictionaries to dcmdata * * */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/dcvrut.h0000644000310500011400000001545011455601177021252 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Andrew Hewett * * Purpose: Interface of class DcmUnlimitedText * Value Representation UT is defined in Correction Proposal 101 * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:15:43 $ * CVS/RCS Revision: $Revision: 1.16 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DCVRUT_H #define DCVRUT_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dctypes.h" #include "dcmtk/dcmdata/dcchrstr.h" /** a class representing the DICOM value representation 'Unlimited Text' (UT) */ class DcmUnlimitedText : public DcmCharString { public: /** constructor * @param tag attribute tag * @param len length of the attribute value */ DcmUnlimitedText(const DcmTag &tag, const Uint32 len = 0); /** copy constructor * @param old element to be copied */ DcmUnlimitedText(const DcmUnlimitedText &old); /// destructor virtual ~DcmUnlimitedText(); /** copy assignment operator * @param obj element to be copied */ DcmUnlimitedText &operator=(const DcmUnlimitedText &obj); /** clone method * @return deep copy of this object */ virtual DcmObject *clone() const { return new DcmUnlimitedText(*this); } /** Virtual object copying. This method can be used for DcmObject * and derived classes to get a deep copy of an object. Internally * the assignment operator is called if the given DcmObject parameter * is of the same type as "this" object instance. If not, an error * is returned. This function permits copying an object by value * in a virtual way which therefore is different to just calling the * assignment operator of DcmElement which could result in slicing * the object. * @param rhs - [in] The instance to copy from. Has to be of the same * class type as "this" object * @return EC_Normal if copying was successful, error otherwise */ virtual OFCondition copyFrom(const DcmObject& rhs); /** return identifier for this class. Every class derived from this class * returns a unique value of type enum DcmEVR for this call. This is used * as a "poor man's RTTI" to correctly identify instances derived from * this class even on compilers not supporting RTTI. * @return type identifier of this class */ virtual DcmEVR ident() const; /** check whether stored value conforms to the VR and to the specified VM * @param vm parameter not used for this VR * @param oldFormat parameter not used for this VR (only for DA, TM, PN) * @return status of the check, EC_Normal if value is correct, an error code otherwise */ virtual OFCondition checkValue(const OFString &vm = "", const OFBool oldFormat = OFFalse); /** get the value multiplicity. * Since the backslash "\" is not regarded as a separator the value * multiplicity is always 1. * @return value multiplicity of the currently stored value */ virtual unsigned long getVM(); /** get a particular components of the string value * @param stringVal string variable in which the result value is stored * @param pos not used since value multiplicity is always 1 * @param normalize remove trailing spaces if OFTrue * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition getOFString(OFString &stringVal, const unsigned long pos, OFBool normalize = OFTrue); /** get the string value (all compenents) * @param stringVal string variable in which the result value is stored * @param normalize remove trailing spaces if OFTrue * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition getOFStringArray(OFString &stringVal, OFBool normalize = OFTrue); /* --- static helper functions --- */ /** check whether given string value conforms to the VR "UT" (Unlimited Text) * @param value string value to be checked (possibly multi-valued) * @return status of the check, EC_Normal if value is correct, an error code otherwise */ static OFCondition checkStringValue(const OFString &value); }; #endif // DCVRUT_H /* ** CVS/RCS Log: ** $Log: dcvrut.h,v $ ** Revision 1.16 2010-10-14 13:15:43 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.15 2010-04-23 15:26:13 joergr ** Specify an appropriate default value for the "vm" parameter of checkValue(). ** ** Revision 1.14 2010-04-23 14:25:27 joergr ** Added new method to all VR classes which checks whether the stored value ** conforms to the VR definition and to the specified VM. ** ** Revision 1.13 2009-08-03 09:05:30 joergr ** Added methods that check whether a given string value conforms to the VR and ** VM definitions of the DICOM standards. ** ** Revision 1.12 2008-07-17 11:19:49 onken ** Updated copyFrom() documentation. ** ** Revision 1.11 2008-07-17 10:30:24 onken ** Implemented copyFrom() method for complete DcmObject class hierarchy, which ** permits setting an instance's value from an existing object. Implemented ** assignment operator where necessary. ** ** Revision 1.10 2007-11-29 14:30:35 meichel ** Updated doxygen API documentation ** ** Revision 1.9 2005/12/08 16:29:16 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.8 2004/07/01 12:28:25 meichel ** Introduced virtual clone method for DcmObject and derived classes. ** ** Revision 1.7 2002/12/06 12:49:21 joergr ** Enhanced "print()" function by re-working the implementation and replacing ** the boolean "showFullData" parameter by a more general integer flag. ** Added doc++ documentation. ** Made source code formatting more consistent with other modules/files. ** ** Revision 1.6 2001/09/25 17:19:36 meichel ** Adapted dcmdata to class OFCondition ** ** Revision 1.5 2001/06/01 15:48:55 meichel ** Updated copyright header ** ** Revision 1.4 2000/03/08 16:26:28 meichel ** Updated copyright header. ** ** Revision 1.3 1999/03/31 09:25:12 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.2 1998/11/12 16:47:58 meichel ** Implemented operator= for all classes derived from DcmObject. ** ** Revision 1.1 1998/01/19 13:19:40 hewett ** Initial version. ** */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/dcovlay.h0000644000310500011400000001134111457773771021413 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Andreas Barth * * Purpose: Interface of class DcmOverlayData * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-21 08:21:13 $ * CVS/RCS Revision: $Revision: 1.13 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DCOVLAY_H #define DCOVLAY_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcvrpobw.h" /** a class used to represent overlay data (60xx,3000) */ class DcmOverlayData : public DcmPolymorphOBOW { public: /** constructor * @param tag attribute tag * @param len length of the attribute value */ DcmOverlayData(const DcmTag &tag, const Uint32 len = 0) : DcmPolymorphOBOW(tag, len) { } /** copy constructor * @param oldObj element to be copied */ DcmOverlayData(const DcmOverlayData &oldObj) : DcmPolymorphOBOW(oldObj) { } /** destructor */ virtual ~DcmOverlayData() { } /** copy assignment operator * @param obj element to be copied */ DcmOverlayData &operator=(const DcmOverlayData &obj) { DcmPolymorphOBOW::operator=(obj); return *this; } /** clone method * @return deep copy of this object */ virtual DcmObject *clone() const { return new DcmOverlayData(*this); } /** Virtual object copying. This method can be used for DcmObject * and derived classes to get a deep copy of an object. Internally * the assignment operator is called if the given DcmObject parameter * is of the same type as "this" object instance. If not, an error * is returned. This function permits copying an object by value * in a virtual way which therefore is different to just calling the * assignment operator of DcmElement which could result in slicing * the object. * @param rhs - [in] The instance to copy from. Has to be of the same * class type as "this" object * @return EC_Normal if copying was successful, error otherwise */ virtual OFCondition copyFrom(const DcmObject &rhs) { if (this != &rhs) { if (rhs.ident() != ident()) return EC_IllegalCall; *this = OFstatic_cast(const DcmOverlayData &, rhs); } return EC_Normal; } /** return identifier for this class. Every class derived from this class * returns a unique value of type enum DcmEVR for this call. This is used * as a "poor man's RTTI" to correctly identify instances derived from * this class even on compilers not supporting RTTI. * @return type identifier of this class */ virtual DcmEVR ident() const { return EVR_OverlayData; } }; #endif /* ** CVS/RCS Log: ** $Log: dcovlay.h,v $ ** Revision 1.13 2010-10-21 08:21:13 joergr ** Use type cast macros (e.g. OFstatic_cast) where appropriate. ** Added missing API documentation and slightly reformatted source code. ** ** Revision 1.12 2010-10-14 13:15:41 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.11 2009-11-04 09:58:07 uli ** Switched to logging mechanism provided by the "new" oflog module ** ** Revision 1.10 2008-07-17 11:19:49 onken ** Updated copyFrom() documentation. ** ** Revision 1.9 2008-07-17 10:30:23 onken ** Implemented copyFrom() method for complete DcmObject class hierarchy, which ** permits setting an instance's value from an existing object. Implemented ** assignment operator where necessary. ** ** Revision 1.8 2007-11-29 14:30:35 meichel ** Updated doxygen API documentation ** ** Revision 1.7 2005/12/08 16:28:28 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.6 2004/07/01 12:28:25 meichel ** Introduced virtual clone method for DcmObject and derived classes. ** ** Revision 1.5 2001/06/01 15:48:42 meichel ** Updated copyright header ** ** Revision 1.4 2000/03/08 16:26:16 meichel ** Updated copyright header. ** ** Revision 1.3 1999/03/31 09:24:43 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.2 1998/11/12 16:47:41 meichel ** Implemented operator= for all classes derived from DcmObject. ** ** Revision 1.1 1997/07/21 07:54:00 andreas ** - Support for CP 14. PixelData and OverlayData can have VR OW or OB ** (depending on the transfer syntax). New internal value ** representation (only for ident()) for OverlayData. ** */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/dcvrobow.h0000644000310500011400000004605411455601177021574 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Gerd Ehlers * * Purpose: Interface of class DcmOtherByteOtherWord * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:15:43 $ * CVS/RCS Revision: $Revision: 1.35 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DCVROBOW_H #define DCVROBOW_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcelem.h" /** a class representing the DICOM value representations 'Other Byte String' (OB) * and 'Other Word String' (OW) */ class DcmOtherByteOtherWord : public DcmElement { public: /** constructor. * Create new element from given tag and length. * @param tag DICOM tag for the new element * @param len value length for the new element */ DcmOtherByteOtherWord(const DcmTag &tag, const Uint32 len = 0); /** copy constructor * @param old element to be copied */ DcmOtherByteOtherWord(const DcmOtherByteOtherWord &old); /** destructor */ virtual ~DcmOtherByteOtherWord(); /** assignment operator * @param obj element to be assigned/copied * @return reference to this object */ DcmOtherByteOtherWord &operator=(const DcmOtherByteOtherWord &obj); /** clone method * @return deep copy of this object */ virtual DcmObject *clone() const { return new DcmOtherByteOtherWord(*this); } /** Virtual object copying. This method can be used for DcmObject * and derived classes to get a deep copy of an object. Internally * the assignment operator is called if the given DcmObject parameter * is of the same type as "this" object instance. If not, an error * is returned. This function permits copying an object by value * in a virtual way which therefore is different to just calling the * assignment operator of DcmElement which could result in slicing * the object. * @param rhs - [in] The instance to copy from. Has to be of the same * class type as "this" object * @return EC_Normal if copying was successful, error otherwise */ virtual OFCondition copyFrom(const DcmObject& rhs); /** get element type identifier * @return type identifier of this class */ virtual DcmEVR ident() const; /** check whether stored value conforms to the VR and to the specified VM * @param vm parameter not used for this VR * @param oldFormat parameter not used for this VR (only for DA, TM, PN) * @return always returns EC_Normal, i.e. currently no checks are performed */ virtual OFCondition checkValue(const OFString &vm = "", const OFBool oldFormat = OFFalse); /** get value multiplicity * @return always returns 1 (according to the DICOM standard) */ virtual unsigned long getVM(); /** set/change the current value representation * @param vr new value representation to be set. All VRs except for OW (Other * Word String) are treated as 8 bit data (OB). This is particularily useful * for unknown (UN) or unsupported VRs. * @return status status, EC_Normal if successful, an error code otherwise */ virtual OFCondition setVR(DcmEVR vr); /** print the current value to a stream. * The output format of the binary value is a backslash separated sequence of * 2- or 4-digit hex numbers, e.g. "00\01\dd" or "0000\7777\aaaa\ffff". * @param out output stream * @param flags optional flag used to customize the output (see DCMTypes::PF_xxx) * @param level current level of nested items. Used for indentation. * @param pixelFileName not used * @param pixelCounter not used */ virtual void print(STD_NAMESPACE ostream&out, const size_t flags = 0, const int level = 0, const char *pixelFileName = NULL, size_t *pixelCounter = NULL); /** check whether the transfer syntax can be changed as specified * @param newXfer transfer syntax to be checked * @param oldXfer not used * @return OFTrue if transfer syntax can be changed to the new one, OFFalse otherwise */ virtual OFBool canWriteXfer(const E_TransferSyntax newXfer, const E_TransferSyntax oldXfer); /** write object to a stream * @param outStream DICOM output stream * @param oxfer output transfer syntax * @param enctype encoding types (undefined or explicit length) * @param wcache pointer to write cache object, may be NULL * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition write( DcmOutputStream &outStream, const E_TransferSyntax oxfer, const E_EncodingType enctype, DcmWriteCache *wcache); /** write object in XML format to a stream * @param out output stream to which the XML document is written * @param flags optional flag used to customize the output (see DCMTypes::XF_xxx) * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition writeXML(STD_NAMESPACE ostream&out, const size_t flags = 0); /** special write method for creation of digital signatures * @param outStream DICOM output stream * @param oxfer output transfer syntax * @param enctype encoding types (undefined or explicit length) * @param wcache pointer to write cache object, may be NULL * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition writeSignatureFormat( DcmOutputStream &outStream, const E_TransferSyntax oxfer, const E_EncodingType enctype, DcmWriteCache *wcache); /** get particular 8 bit value. * This method is only applicable to non-OW data, e.g. OB. * @param byteVal reference to result variable (cleared in case of error) * @param pos index of the value to be retrieved (0..vm-1) * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition getUint8(Uint8 &byteVal, const unsigned long pos = 0); /** get particular 16 bit value. * This method is only applicable to OW data. * @param wordVal reference to result variable (cleared in case of error) * @param pos index of the value to be retrieved (0..vm-1) * @return status status, EC_Normal if successful, an error code otherwise */ virtual OFCondition getUint16(Uint16 &wordVal, const unsigned long pos = 0); /** get reference to stored 8 bit data. * This method is only applicable to non-OW data, e.g. OB. * @param byteVals reference to result variable * @return status status, EC_Normal if successful, an error code otherwise */ virtual OFCondition getUint8Array(Uint8 *&byteVals); /** get reference to stored 16 bit data. * This method is only applicable to OW data. * @param wordVals reference to result variable * @return status status, EC_Normal if successful, an error code otherwise */ virtual OFCondition getUint16Array(Uint16 *&wordVals); /** get a particular value as a character string. * The numeric value is converted to hex mode, i.e. an 8 bit value is * represented by 2 characters (00..ff) and a 16 bit value by 4 characters * (0000..ffff). * @param stringVal variable in which the result value is stored * @param pos index of the value in case of multi-valued elements (0..vm-1) * @param normalize not used * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition getOFString(OFString &stringVal, const unsigned long pos, OFBool normalize = OFTrue); /** get element value as a character string. * The numeric values are converted to hex mode, i.e. an 8 bit value is * represented by 2 characters (00..ff) and a 16 bit value by 4 characters * (0000..ffff). * In case of VM > 1 the single values are separated by a backslash ('\'). * @param stringVal variable in which the result value is stored * @param normalize not used * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition getOFStringArray(OFString &stringVal, OFBool normalize = OFTrue); /** set element value to given 8 bit data. * This method is only applicable to non-OW data, e.g. OB. * @param byteValue 8 bit data to be set (copied) * @param numBytes number of bytes (8 bit) to be set * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition putUint8Array(const Uint8 *byteValue, const unsigned long numBytes); /** set element value to given 16 bit data. * This method is only applicable to OW data. * @param wordValue 16 bit data to be set (copied) * @param numWords number of words (16 bit) to be set. Local byte-ordering * expected. * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition putUint16Array(const Uint16 *wordValue, const unsigned long numWords); /** create an empty Uint8 array of given number of bytes and set it. * All array elements are initialized with a value of 0 (using 'memzero'). * This method is only applicable to non-OW data, e.g. OB. * @param numBytes number of bytes (8 bit) to be created * @param bytes stores the pointer to the resulting buffer * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition createUint8Array(const Uint32 numBytes, Uint8 *&bytes); /** create an empty Uint16 array of given number of words and set it. * All array elements are initialized with a value of 0 (using 'memzero'). * This method is only applicable to OW data. * @param numWords number of words (16 bit) to be created * @param words stores the pointer to the resulting buffer * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition createUint16Array(const Uint32 numWords, Uint16 *&words); /** set element value from the given character string. * The input string is expected to have the same format as described for * 'getOFStringArray()' above, i.e. a backslash separated sequence of * hexa-decimal numbers. * @param stringVal input character string * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition putString(const char *stringVal); /** check the currently stored element value * @param autocorrect correct value padding (even length) if OFTrue * @return status, EC_Normal if value length is correct, an error code otherwise */ virtual OFCondition verify(const OFBool autocorrect = OFFalse); protected: /** method is called after the element value has been loaded. * Can be used to correct the value before it is used for the first time. */ virtual void postLoadValue(); /** align the element value to an even length (padding) * @return status, EC_Normal if successful, an error code otherwise */ OFCondition alignValue(); /** print pixel data and optionally write it to a binary file. * Optional pixel data file is always written in little endian byte-ordering. * @param out output stream * @param flags optional flag used to customize the output (see DCMTypes::PF_xxx) * @param level current level of nested items. Used for indentation. * @param pixelFileName optional filename used to write the raw pixel data file * @param pixelCounter optional counter used for automatic pixel data filename creation */ void printPixel(STD_NAMESPACE ostream&out, const size_t flags, const int level, const char *pixelFileName, size_t *pixelCounter); private: /** this flag is used during write operations and indicates that compact() should be * called once the write operation finishes. */ OFBool compactAfterTransfer; }; #endif // DCVROBOW_H /* ** CVS/RCS Log: ** $Log: dcvrobow.h,v $ ** Revision 1.35 2010-10-14 13:15:43 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.34 2010-04-23 15:26:13 joergr ** Specify an appropriate default value for the "vm" parameter of checkValue(). ** ** Revision 1.33 2010-04-23 14:25:27 joergr ** Added new method to all VR classes which checks whether the stored value ** conforms to the VR definition and to the specified VM. ** ** Revision 1.32 2008-08-15 09:26:31 meichel ** Under certain conditions (odd length compressed pixel data fragments) ** class DcmOtherByteOtherWord needs to load the attribute value into main ** memory during a write() operation, in order to add a pad byte. A new flag ** compactAfterTransfer now makes sure that the memory is released once the ** write operation has finished, so that only a single fragment at a time ** needs to fully reside in memory. ** ** Revision 1.31 2008-07-17 11:19:49 onken ** Updated copyFrom() documentation. ** ** Revision 1.30 2008-07-17 10:30:23 onken ** Implemented copyFrom() method for complete DcmObject class hierarchy, which ** permits setting an instance's value from an existing object. Implemented ** assignment operator where necessary. ** ** Revision 1.29 2007-11-29 14:30:19 meichel ** Write methods now handle large raw data elements (such as pixel data) ** without loading everything into memory. This allows very large images to ** be sent over a network connection, or to be copied without ever being ** fully in memory. ** ** Revision 1.28 2007/06/07 09:01:15 joergr ** Added createUint8Array() and createUint16Array() methods. ** ** Revision 1.27 2006/08/15 15:49:56 meichel ** Updated all code in module dcmdata to correctly compile when ** all standard C++ classes remain in namespace std. ** ** Revision 1.26 2005/12/08 16:29:03 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.25 2004/07/01 12:28:25 meichel ** Introduced virtual clone method for DcmObject and derived classes. ** ** Revision 1.24 2003/07/09 12:13:13 meichel ** Included dcmodify in MSVC build system, updated headers ** ** Revision 1.23 2003/06/12 13:29:28 joergr ** Fixed inconsistent API documentation reported by Doxygen. ** ** Revision 1.22 2002/12/06 12:49:17 joergr ** Enhanced "print()" function by re-working the implementation and replacing ** the boolean "showFullData" parameter by a more general integer flag. ** Added doc++ documentation. ** Made source code formatting more consistent with other modules/files. ** ** Revision 1.21 2002/08/27 16:55:40 meichel ** Initial release of new DICOM I/O stream classes that add support for stream ** compression (deflated little endian explicit VR transfer syntax) ** ** Revision 1.20 2002/04/25 10:03:45 joergr ** Added getOFString() implementation. ** Added/modified getOFStringArray() implementation. ** Added support for XML output of DICOM objects. ** ** Revision 1.19 2001/10/02 11:47:34 joergr ** Added getUint8/16 routines to class DcmOtherByteOtherWord. ** ** Revision 1.18 2001/09/25 17:19:32 meichel ** Adapted dcmdata to class OFCondition ** ** Revision 1.17 2001/06/01 15:48:51 meichel ** Updated copyright header ** ** Revision 1.16 2000/11/07 16:56:10 meichel ** Initial release of dcmsign module for DICOM Digital Signatures ** ** Revision 1.15 2000/04/14 15:31:34 meichel ** Removed default value from output stream passed to print() method. ** Required for use in multi-thread environments. ** ** Revision 1.14 2000/03/08 16:26:24 meichel ** Updated copyright header. ** ** Revision 1.13 2000/03/03 14:05:27 meichel ** Implemented library support for redirecting error messages into memory ** instead of printing them to stdout/stderr for GUI applications. ** ** Revision 1.12 2000/02/10 10:50:55 joergr ** Added new feature to dcmdump (enhanced print method of dcmdata): write ** pixel data/item value fields to raw files. ** ** Revision 1.11 1999/03/31 09:25:03 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.10 1998/11/12 16:47:51 meichel ** Implemented operator= for all classes derived from DcmObject. ** ** Revision 1.9 1997/07/21 08:25:15 andreas ** - Replace all boolean types (BOOLEAN, CTNBOOLEAN, DICOM_BOOL, BOOL) ** with one unique boolean type OFBool. ** ** Revision 1.8 1997/05/27 13:48:30 andreas ** - Add method canWriteXfer to class DcmObject and all derived classes. ** This method checks whether it is possible to convert the original ** transfer syntax to an new transfer syntax. The check is used in the ** dcmconv utility to prohibit the change of a compressed transfer ** syntax to a uncompressed. ** ** Revision 1.7 1997/05/16 08:31:20 andreas ** - Revised handling of GroupLength elements and support of ** DataSetTrailingPadding elements. The enumeratio E_GrpLenEncoding ** got additional enumeration values (for a description see dctypes.h). ** addGroupLength and removeGroupLength methods are replaced by ** computeGroupLengthAndPadding. To support Padding, the parameters of ** element and sequence write functions changed. ** ** Revision 1.6 1997/04/18 08:13:31 andreas ** - The put/get-methods for all VRs did not conform to the C++-Standard ** draft. Some Compilers (e.g. SUN-C++ Compiler, Metroworks ** CodeWarrier, etc.) create many warnings concerning the hiding of ** overloaded get methods in all derived classes of DcmElement. ** So the interface of all value representation classes in the ** library are changed rapidly, e.g. ** OFCondition get(Uint16 & value, const unsigned long pos); ** becomes ** OFCondition getUint16(Uint16 & value, const unsigned long pos); ** All (retired) "returntype get(...)" methods are deleted. ** For more information see dcmdata/include/dcelem.h ** ** Revision 1.5 1996/08/05 08:45:33 andreas ** new print routine with additional parameters: ** - print into files ** - fix output length for elements ** corrected error in search routine with parameter ESM_fromStackTop ** ** Revision 1.4 1996/01/29 13:38:17 andreas ** - new put method for every VR to put value as a string ** - better and unique print methods ** ** Revision 1.3 1996/01/05 13:23:07 andreas ** - changed to support new streaming facilities ** - more cleanups ** - merged read / write methods for block and file transfer ** */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/CMakeLists.txt0000644000310500011400000000014011260356505022314 0ustar joergrdicom3# declare installation files INSTALL_FILES(${INSTALL_INCDIR}/dcmtk/dcmdata .h) SUBDIRS(libi2d) dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/dcxfer.h0000644000310500011400000002713111455601177021215 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Gerd Ehlers * * Purpose: Handling of transfer syntaxes * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:15:43 $ * CVS/RCS Revision: $Revision: 1.24 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DCXFER_H #define DCXFER_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dctypes.h" #include "dcmtk/dcmdata/dcvr.h" /** enumeration of all DICOM transfer syntaxes known to the toolkit */ typedef enum { /// unknown transfer syntax or dataset created in-memory EXS_Unknown = -1, /// Implicit VR Little Endian EXS_LittleEndianImplicit = 0, /// Implicit VR Big Endian (pseudo transfer syntax that does not really exist) EXS_BigEndianImplicit = 1, /// Explicit VR Little Endian EXS_LittleEndianExplicit = 2, /// Explicit VR Big Endian EXS_BigEndianExplicit = 3, /// JPEG Baseline (lossy) EXS_JPEGProcess1TransferSyntax = 4, /// JPEG Extended Sequential (lossy, 8/12 bit) EXS_JPEGProcess2_4TransferSyntax = 5, /// JPEG Extended Sequential (lossy, 8/12 bit), arithmetic coding EXS_JPEGProcess3_5TransferSyntax = 6, /// JPEG Spectral Selection, Non-Hierarchical (lossy, 8/12 bit) EXS_JPEGProcess6_8TransferSyntax = 7, /// JPEG Spectral Selection, Non-Hierarchical (lossy, 8/12 bit), arithmetic coding EXS_JPEGProcess7_9TransferSyntax = 8, /// JPEG Full Progression, Non-Hierarchical (lossy, 8/12 bit) EXS_JPEGProcess10_12TransferSyntax = 9, /// JPEG Full Progression, Non-Hierarchical (lossy, 8/12 bit), arithmetic coding EXS_JPEGProcess11_13TransferSyntax = 10, /// JPEG Lossless with any selection value EXS_JPEGProcess14TransferSyntax = 11, /// JPEG Lossless with any selection value, arithmetic coding EXS_JPEGProcess15TransferSyntax = 12, /// JPEG Extended Sequential, Hierarchical (lossy, 8/12 bit) EXS_JPEGProcess16_18TransferSyntax = 13, /// JPEG Extended Sequential, Hierarchical (lossy, 8/12 bit), arithmetic coding EXS_JPEGProcess17_19TransferSyntax = 14, /// JPEG Spectral Selection, Hierarchical (lossy, 8/12 bit) EXS_JPEGProcess20_22TransferSyntax = 15, /// JPEG Spectral Selection, Hierarchical (lossy, 8/12 bit), arithmetic coding EXS_JPEGProcess21_23TransferSyntax = 16, /// JPEG Full Progression, Hierarchical (lossy, 8/12 bit) EXS_JPEGProcess24_26TransferSyntax = 17, /// JPEG Full Progression, Hierarchical (lossy, 8/12 bit), arithmetic coding EXS_JPEGProcess25_27TransferSyntax = 18, /// JPEG Lossless, Hierarchical EXS_JPEGProcess28TransferSyntax = 19, /// JPEG Lossless, Hierarchical, arithmetic coding EXS_JPEGProcess29TransferSyntax = 20, /// JPEG Lossless, Selection Value 1 EXS_JPEGProcess14SV1TransferSyntax = 21, /// Run Length Encoding (lossless) EXS_RLELossless = 22, /// JPEG-LS (lossless) EXS_JPEGLSLossless = 23, /// JPEG-LS (lossless or near-lossless mode) EXS_JPEGLSLossy = 24, /// Deflated Explicit VR Little Endian EXS_DeflatedLittleEndianExplicit = 25, /// JPEG 2000 (lossless) EXS_JPEG2000LosslessOnly = 26, /// JPEG 2000 (lossless or lossy) EXS_JPEG2000 = 27, /// MPEG2 Main Profile at Main Level EXS_MPEG2MainProfileAtMainLevel = 28, /// MPEG2 Main Profile at High Level EXS_MPEG2MainProfileAtHighLevel = 29, /// JPEG 2000 part 2 multi-component extensions (lossless) EXS_JPEG2000MulticomponentLosslessOnly = 30, /// JPEG 2000 part 2 multi-component extensions (lossless or lossy) EXS_JPEG2000Multicomponent = 31, /// JPIP Referenced EXS_JPIPReferenced = 32, /// JPIP Referenced Deflate EXS_JPIPReferencedDeflate = 33 } E_TransferSyntax; /** enumeration of byte orders */ typedef enum { /// unknown EBO_unknown = 0, /// little endian EBO_LittleEndian = 1, /// big endian EBO_BigEndian = 2 } E_ByteOrder; /** enumeration of VR encoding options */ typedef enum { /// implicit VR encoding EVT_Implicit = 0, /// explicit VR encoding EVT_Explicit = 1 } E_VRType; /** enumeration of pixel data encapsulation options */ typedef enum { /// pixel data not encapsulated EJE_NotEncapsulated = 0, /// pixel data encapsulated EJE_Encapsulated = 1 } E_JPEGEncapsulated; /** enumeration of stream compression techniques */ typedef enum { /// no stream compression ESC_none = 0 /// unsupported stream compression , ESC_unsupported = 1 #ifdef WITH_ZLIB /// zlib stream compression , ESC_zlib = 2 #endif } E_StreamCompression; /** a class that allows for a lookup of Transfer Syntax properties and readable descriptions */ class DcmXfer { public: /** constructor * @param xfer transfer syntax enum */ DcmXfer( E_TransferSyntax xfer ); /** constructor * @param xferName_xferID transfer syntax name as string */ DcmXfer( const char *xferName_xferID ); /// copy constructor DcmXfer( const DcmXfer &newXfer ); /// destructor ~DcmXfer(); /// assignment operator for transfer syntax enum DcmXfer & operator = ( const E_TransferSyntax xfer ); /// copy assignment operator DcmXfer & operator = ( const DcmXfer &newtag ); /// return transfer syntax enum for this transfer syntax inline E_TransferSyntax getXfer() const { return xferSyn; } /// return byte order for this transfer syntax inline E_ByteOrder getByteOrder() const { return byteOrder; } /// return name string for this transfer syntax inline const char* getXferName() const { return xferName; } /// return UID string for this transfer syntax inline const char* getXferID() const { return xferID; } /// return true if transfer syntax is little endian, false otherwise inline OFBool isLittleEndian() const { return byteOrder == EBO_LittleEndian; } /// return true if transfer syntax is big endian, false otherwise inline OFBool isBigEndian() const { return byteOrder == EBO_BigEndian; } /// return true if transfer syntax is implicit VR, false otherwise inline OFBool isImplicitVR() const { return vrType == EVT_Implicit; } /// return true if transfer syntax is explicit VR, false otherwise inline OFBool isExplicitVR() const { return vrType == EVT_Explicit; } /// return true if transfer syntax is encapsulated, false otherwise inline OFBool isEncapsulated() const { return encapsulated == EJE_Encapsulated; } /// return true if transfer syntax is native (non-encapsulated), false otherwise inline OFBool isNotEncapsulated() const { return encapsulated == EJE_NotEncapsulated; } /** return 8-bit JPEG process ID for this transfer syntax. * Lossy JPEG transfer syntaxes support two alternative JPEG encoding processes - 8 and 12 bits. * When called for a non-JPEG transfer syntax, returns 0. * @return 8-bit JPEG process ID */ inline Uint32 getJPEGProcess8Bit() const { return JPEGProcess8; } /** return 12-bit JPEG process ID for this transfer syntax. * Lossy JPEG transfer syntaxes support two alternative JPEG encoding processes - 8 and 12 bits. * When called for a non-JPEG transfer syntax, returns 0. * @return 12-bit JPEG process ID */ inline Uint32 getJPEGProcess12Bit() const { return JPEGProcess12;} /// return true if transfer syntax is retired, false otherwise inline OFBool isRetired() const { return retired; } /// return stream compression type for this transfer syntax inline E_StreamCompression getStreamCompression() const { return streamCompression;} /** return the number of bytes needed to describe the tag, length, VR * and any reserved fields for this transfer syntax when encoding the * specified VR. * @param evr value representation to be encoded in this transfer syntax * @return number of bytes needed */ Uint32 sizeofTagHeader(DcmEVR evr) const; private: /// transfer syntax UID const char *xferID; /// transfer syntax name const char *xferName; /// transfer syntax enum E_TransferSyntax xferSyn; /// transfer syntax byte order E_ByteOrder byteOrder; /// transfer syntax VR encoding (implicit/explicit) E_VRType vrType; /// transfer syntax encapsulated or native E_JPEGEncapsulated encapsulated; /// 8-bit lossy JPEG process ID for this transfer syntax, 0 if not applicable Uint32 JPEGProcess8; /// 12-bit lossy JPEG process ID for this transfer syntax, 0 if not applicable Uint32 JPEGProcess12; /// flag indicating whether this transfer syntax has been retired from DICOM OFBool retired; /// transfer syntax stream compression type E_StreamCompression streamCompression; }; /** global constant describing the byte order on the machine the application * is currently executing on. This is runtime and not compile time information * because of "fat" binaries that can be executed on multiple CPU types (e.g. NeXTStep) */ extern const E_ByteOrder gLocalByteOrder; #endif // DCXFER_H /* * CVS/RCS Log: * $Log: dcxfer.h,v $ * Revision 1.24 2010-10-14 13:15:43 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.23 2010-09-15 08:46:16 joergr * Added definition of XML encoding transfer syntax (Supplement 114) and JPIP * referenced transfer syntaxes (Supplement 106). * * Revision 1.22 2010-09-02 12:12:43 joergr * Added support for "MPEG2 Main Profile @ High Level" transfer syntax. * * Revision 1.21 2008-06-23 12:09:13 joergr * Fixed inconsistencies in Doxygen API documentation. * * Revision 1.20 2008-04-23 06:39:37 meichel * Added new method DcmXfer::isRetired that returns true for * retired transfer syntaxes. * * Revision 1.19 2007/11/29 14:30:19 meichel * Write methods now handle large raw data elements (such as pixel data) * without loading everything into memory. This allows very large images to * be sent over a network connection, or to be copied without ever being * fully in memory. * * Revision 1.18 2005/12/08 16:29:17 meichel * Changed include path schema for all DCMTK header files * * Revision 1.17 2005/10/25 08:55:32 meichel * Updated list of UIDs and added support for new transfer syntaxes * and storage SOP classes. * * Revision 1.16 2004/04/06 18:01:50 joergr * Updated data dictionary, UIDs and transfer syntaxes for the latest Final Text * Supplements (42 and 47) and Correction Proposals (CP 25). * * Revision 1.15 2002/08/27 16:55:41 meichel * Initial release of new DICOM I/O stream classes that add support for stream * compression (deflated little endian explicit VR transfer syntax) * * Revision 1.14 2001/11/08 16:17:30 meichel * Updated data dictionary, UIDs and transfer syntaxes for DICOM 2001 edition. * * Revision 1.13 2001/06/01 15:48:55 meichel * Updated copyright header * * Revision 1.12 2001/01/17 10:20:36 meichel * Added toolkit support for JPEG-LS transfer syntaxes * * Revision 1.11 2000/04/14 16:01:23 meichel * Minor changes for thread safety. * * Revision 1.10 2000/03/08 16:26:28 meichel * Updated copyright header. * * Revision 1.9 1999/03/31 09:25:13 meichel * Updated copyright header in module dcmdata * * */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/libi2d/0000755000310500011400000000000011511320675020724 5ustar joergrdicom3dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/libi2d/i2dplvlp.h0000644000310500011400000000615411455601202022632 0ustar joergrdicom3/* * * Copyright (C) 2001-2010, 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: dcmdata * * Author: Michael Onken * * Purpose: Class for conversion of image file into DICOM SC Image Storage * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:15:46 $ * CVS/RCS Revision: $Revision: 1.5 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef I2DPLVLP_H #define I2DPLVLP_H #include "dcmtk/config/osconfig.h" #include "dcmtk/dcmdata/libi2d/i2doutpl.h" class I2DOutputPlugVLP : public I2DOutputPlug { public: /** Constructor, initializes member variables with standard values * @return none */ I2DOutputPlugVLP(); /** Virtual function that returns a short name of the plugin. * @return The name of the plugin */ virtual OFString ident(); /** Overwrites function from base class. Returns the Storage SOP class * written by this plugin * @param suppSOPs - [out] List of UIDs representing SOP classes supported by * this plugin * @return A string holding the Storage SOP class written by this plugin */ virtual void supportedSOPClassUIDs(OFList suppSOPs); /** Outputs SOP class specific information into dataset * @param dataset - [in/out] Dataset to write to * @return EC_Normal if successful, error otherwise */ virtual OFCondition convert(DcmDataset &dataset) const; /** Do some completeness / validity checks. Should be called when * dataset is completed and is about to be saved. * @param dataset - [in] The dataset to check * @return Error string if error occurs, empty string else */ virtual OFString isValid(DcmDataset& dataset) const; /** Virtual Destructor, clean up memory * @return none */ virtual ~I2DOutputPlugVLP(); }; #endif // I2DPLVLP_H /* * CVS/RCS Log: * $Log: i2dplvlp.h,v $ * Revision 1.5 2010-10-14 13:15:46 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.4 2009-11-04 09:58:08 uli * Switched to logging mechanism provided by the "new" oflog module * * Revision 1.3 2009-09-30 08:05:25 uli * Stop including dctk.h in libi2d's header files. * * Revision 1.2 2009-01-16 09:51:55 onken * Completed doxygen documentation for libi2d. * * Revision 1.1 2008-01-16 15:13:17 onken * Moved library "i2dlib" from /dcmdata/libsrc/i2dlib to /dcmdata/libi2d * * Revision 1.2 2008-01-11 14:17:53 onken * Added various options to i2dlib. Changed logging to use a configurable * logstream. Added output plugin for the new Multiframe Secondary Capture SOP * Classes. Added mode for JPEG plugin to copy exsiting APPn markers (except * JFIF). Changed img2dcm default behaviour to invent type1/type2 attributes (no * need for templates any more). Added some bug fixes. * * Revision 1.1 2007/11/08 15:58:56 onken * Initial checkin of img2dcm application and corresponding library i2dlib. * * */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/libi2d/i2doutpl.h0000644000310500011400000002310511463514644022647 0ustar joergrdicom3/* * * Copyright (C) 2001-2010, 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: dcmdata * * Author: Michael Onken * * Purpose: Base class for converter from image file to DICOM * * Last Update: $Author: uli $ * Update Date: $Date: 2010-11-01 10:42:44 $ * CVS/RCS Revision: $Revision: 1.11 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef I2DOUTPL_H #define I2DOUTPL_H #include "dcmtk/config/osconfig.h" #include "dcmtk/dcmdata/dcdatset.h" #include "dcmtk/dcmdata/dcelem.h" #include "dcmtk/oflog/oflog.h" OFLogger DCM_dcmdataLibi2dGetLogger(); #define DCMDATA_LIBI2D_TRACE(msg) OFLOG_TRACE(DCM_dcmdataLibi2dGetLogger(), msg) #define DCMDATA_LIBI2D_DEBUG(msg) OFLOG_DEBUG(DCM_dcmdataLibi2dGetLogger(), msg) #define DCMDATA_LIBI2D_INFO(msg) OFLOG_INFO(DCM_dcmdataLibi2dGetLogger(), msg) #define DCMDATA_LIBI2D_WARN(msg) OFLOG_WARN(DCM_dcmdataLibi2dGetLogger(), msg) #define DCMDATA_LIBI2D_ERROR(msg) OFLOG_ERROR(DCM_dcmdataLibi2dGetLogger(), msg) #define DCMDATA_LIBI2D_FATAL(msg) OFLOG_FATAL(DCM_dcmdataLibi2dGetLogger(), msg) class I2DOutputPlug { public: /** Constructor, initializes member variables * @return none */ I2DOutputPlug() : m_doAttribChecking(OFTrue), m_inventMissingType2Attribs(OFTrue), m_inventMissingType1Attribs(OFTrue) {}; /** Virtual function that returns a short name of the plugin. * @return The name of the plugin */ virtual OFString ident() =0; /** Virtual function that returns the Storage SOP class UID, the plugin writes. * @param suppSOPs - [out] List containing supported output SOP classes * @return String containing the Storage SOP class UID */ virtual void supportedSOPClassUIDs(OFList suppSOPs) =0; /** Outputs SOP class specific information into dataset * @param dataset - [in/out] Dataset to write to * @return EC_Normal if successful, error otherwise */ virtual OFCondition convert(DcmDataset &dataset) const =0; /** Do some completeness / validity checks. Should be called when * dataset is completed and is about to be saved. * @param dataset - [in] The dataset to check * @return Error string if error occurs, empty string otherwise */ virtual OFString isValid(DcmDataset& dataset) const = 0; /** Destructor * @return none */ virtual ~I2DOutputPlug() {}; /** Enable/Disable basic validity checks for output dataset * @param doChecks - [in] OFTrue enables checking, OFFalse turns it off. * @param insertMissingType2 - [in] If true (default), missing type 2 * attributes are inserted automatically * @param inventMissingType1 - [in] If true (default), missing type 1 * attributes are inserted automatically with a predefined * value (if possible). An existing empty type 1 attribute is * assigned a value, too. * @return none */ virtual void setValidityChecking(OFBool doChecks, OFBool insertMissingType2 = OFTrue, OFBool inventMissingType1 = OFTrue) { m_doAttribChecking = doChecks; m_inventMissingType2Attribs = insertMissingType2; m_inventMissingType1Attribs = inventMissingType1; }; protected: /** Checks whether a given tag exists in a dataset and provides a non-empty * value. If not, the tag is inserted (if enabled) and a default value is * inserted. * @param key - [in] The tag to be checked/inserted * @param targetDset - [in/out] The dataset to search (and insert) in * @param defaultValue - [in] The default value to set * @return Error string, which is empty if no error occurs. */ virtual OFString checkAndInventType1Attrib(const DcmTagKey& key, DcmDataset* targetDset, const OFString& defaultValue ="") const { OFBool exists = targetDset->tagExists(key); if (!exists && !m_inventMissingType1Attribs) { OFString err = "I2DOutputPlug: Missing type 1 attribute: "; err += DcmTag(key).getTagName(); err += "\n"; return err; } DcmElement *elem; OFCondition cond = targetDset->findAndGetElement(key, elem); if (cond.bad() || !elem || (elem->getLength() == 0)) { if (!m_inventMissingType1Attribs) { OFString err; err += "I2DOutputPlug: Empty value for type 1 attribute: "; err += DcmTag(key).getTagName(); err += "\n"; return err; } //holds element to insert in item elem = NULL; DcmTag tag(key); OFBool wasError = OFFalse; //if dicom element could be created, insert in to item and modify to value if ( newDicomElement(elem, tag).good()) { if (targetDset->insert(elem, OFTrue).good()) { if (elem->putString(defaultValue.c_str()).good()) { DCMDATA_LIBI2D_DEBUG("I2DOutputPlug: Inserting missing type 1 attribute: " << tag.getTagName() << " with value " << defaultValue); } else wasError = OFTrue; } else wasError = OFTrue; } else wasError = OFTrue; if (wasError) { OFString err = "Unable to insert type 1 attribute "; err += tag.getTagName(); err += " with value "; err += defaultValue; err += "\n"; return err; } } return ""; }; /** Checks whether a given tag exists in a dataset (can be empty) * If not, the tag is inserted (if enabled) with empty value. * @param key - [in] The tag to be checked/inserted * @param targetDset - [in/out] The dataset to search (and insert) in * @return Error string, which is empty if no error occurs. */ virtual OFString checkAndInventType2Attrib(const DcmTagKey& key, DcmDataset* targetDset, const OFString& defaultValue ="") const { OFString err; OFBool exists = targetDset->tagExists(key); if (!exists) { if (m_inventMissingType2Attribs) { //holds element to insert in item DcmElement *elem = NULL; DcmTag tag(key); OFBool wasError = OFFalse; //if dicom element could be created, insert in to item and modify to value if ( newDicomElement(elem, tag).good()) { if (targetDset->insert(elem, OFTrue).good()) { OFCondition result; if (!defaultValue.empty()) // only insert value if not empty(e. g. empty type 2 sequences) { result = elem->putString(defaultValue.c_str()); } if (result.good()) { DCMDATA_LIBI2D_DEBUG("I2DOutputPlug: Inserting missing type 2 attribute: " << tag.getTagName() << " with value " << (defaultValue.empty() ? "" : defaultValue)); } else wasError = OFTrue; } else wasError = OFTrue; } else wasError = OFTrue; if (wasError) { err += "Unable to insert type 2 attribute "; err += tag.getTagName(); err += " with value "; err += defaultValue; err += "\n"; } } else { err = "Image2Dcm: Missing type 2 attribute: "; err += DcmTag(key).getTagName(); err += "\n"; return err; } } return err; }; /// if enabled, some simple attribute checking is performed /// default: enabled (OFTrue) OFBool m_doAttribChecking; /// if enabled, missing type 2 attributes in the dataset are added automatically. /// default: enabled (OFTrue) OFBool m_inventMissingType2Attribs; /// if enbled, missing type 1 attributes are inserted and filled with a /// predefined value. Default: disabled (OFFalse) OFBool m_inventMissingType1Attribs; }; #endif // #ifndef I2DOUTPL_H /* * CVS/RCS Log: * $Log: i2doutpl.h,v $ * Revision 1.11 2010-11-01 10:42:44 uli * Fixed some compiler warnings reported by gcc with additional flags. * * Revision 1.10 2010-10-14 13:15:46 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.9 2010-03-01 09:08:45 uli * Removed some unnecessary include directives in the headers. * * Revision 1.8 2009-11-04 09:58:08 uli * Switched to logging mechanism provided by the "new" oflog module * * Revision 1.7 2009-09-30 08:05:25 uli * Stop including dctk.h in libi2d's header files. * * Revision 1.6 2009-03-31 11:31:05 onken * Corrected commit message. * * Revision 1.5 2009-03-31 11:29:54 onken * Added possibility to also insert type 2 elements with a default value * when automatically inserting missing values (feature currently not in use). * * Revision 1.4 2009-01-16 09:51:55 onken * Completed doxygen documentation for libi2d. * * Revision 1.3 2008-01-16 16:32:23 onken * Fixed some empty or doubled log messages in libi2d files. * * Revision 1.2 2008-01-16 15:10:20 onken * Moved library "i2dlib" from /dcmdata/libsrc/i2dlib to /dcmdata/libi2d * * Revision 1.2 2008-01-11 14:17:53 onken * Added various options to i2dlib. Changed logging to use a configurable * logstream. Added output plugin for the new Multiframe Secondary Capture SOP * Classes. Added mode for JPEG plugin to copy exsiting APPn markers (except * JFIF). Changed img2dcm default behaviour to invent type1/type2 attributes (no * need for templates any more). Added some bug fixes. * * Revision 1.1 2007/11/08 15:58:55 onken * Initial checkin of img2dcm application and corresponding library i2dlib. * * */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/libi2d/i2dimgs.h0000644000310500011400000001433211455601202022431 0ustar joergrdicom3/* * * Copyright (C) 2001-2010, 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: dcmdata * * Author: Michael Onken * * Purpose: Base Class for plugins extracting pixel data from standard * image files * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:15:46 $ * CVS/RCS Revision: $Revision: 1.9 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef I2DIMGS_H #define I2DIMGS_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/ofstd/ofcond.h" #include "dcmtk/dcmdata/dcxfer.h" class I2DImgSource { public: /** Constructor */ I2DImgSource() : m_imageFile() {} /** Returns identifier for the image input format the plugin imports. * @return A short identifier (e. g. "JPEG") */ virtual OFString inputFormat() const =0; /** Extracts the raw JPEG pixel data stream from a JPEG file and returns some * image information about this pixel data. * Raw means here that all APP markers (e.g. JFIF information) are removed from the JPEG stream. * The pixel data returned is a JPEG stream in JPEG interchange format. * This function allocates memory for the pixel data returned to the user. The caller of this * function is responsible for deleting the memory buffer * @param rows - [out] Rows of image * @param cols - [out] Columns of image * @param samplesPerPixel - [out] Number of components per pixel * @param photoMetrInt - [out] The DICOM color model used for the compressed data * @param bitsAlloc - [out] Bits Allocated for one sample * @param bitsStored - [out] Bits Stored, number of bits stored within Bits Allocated * @param highBit - [out] High Bit, hightest bit position set within Bits Allocated * @param pixelRepr - [out] Pixel Representation (0=unsigned, 1=signed) * @param planConf - [out] Planar Configuration * @param pixAspectH - [out] Horizontal value of pixel aspect ratio * @param pixAspectV - [out] Vertical value of pixel aspect ratio * @param pixData - [out] Pointer to the pixel data in JPEG Interchange Format (but without APPx markers). * @param length - [out] Length of pixel data * @param ts - [out] The transfer syntax imposed by the imported pixel pixel data. This is necessary for the JPEG importer that needs to report which TS must be used for the imported JPEG data (ie. baseline, progressive, ...). * @return EC_Normal, if successful, error otherwise */ virtual OFCondition readPixelData( Uint16& rows, Uint16& cols, Uint16& samplesPerPixel, OFString& photoMetrInt, Uint16& bitsAlloc, Uint16& bitsStored, Uint16& highBit, Uint16& pixelRepr, Uint16& planConf, Uint16& pixAspectH, Uint16& pixAspectV, char*& pixData, Uint32& length, E_TransferSyntax& ts) =0; /* After reading of pixel data, this function can be used for getting * information about lossy compression parameters. * @param srcEncodingLossy - [out] Denotes, whether the encoding of the pixel * data read was lossy (OFtrue) or lossless (OFFalse) * @param srcLossyComprMethod - [out] Denotes the lossy compression method used * in source if there is one (srcEncodingLossy = OFTrue). * Should use defined terms of attribute Lossy Compression Method. * @return EC_Normal if information is available, error otherwise */ virtual OFCondition getLossyComprInfo(OFBool& srcEncodingLossy, OFString& srcLossyComprMethod) const =0; /** Sets the input image file to read. * @param filename - [in] The filename of the image input file * @return none */ void setImageFile(const OFString& filename) { m_imageFile = filename; }; /** Returns the input image file that currently associated with plugin * @return The filename of the image input file */ OFString getImageFile() { return m_imageFile; }; /** Virtual Destructor */ virtual ~I2DImgSource() {} protected: /// The input file OFString m_imageFile; }; #endif // #ifndef I2DIMGS_H /* * CVS/RCS Log: * $Log: i2dimgs.h,v $ * Revision 1.9 2010-10-14 13:15:46 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.8 2010-02-22 11:39:54 uli * Remove some unneeded includes. * * Revision 1.7 2009-11-04 09:58:08 uli * Switched to logging mechanism provided by the "new" oflog module * * Revision 1.6 2009-09-30 08:05:25 uli * Stop including dctk.h in libi2d's header files. * * Revision 1.5 2009-07-16 14:22:19 onken * Changed comment (and thus semantic of parameter for output transfer syntax). * * Revision 1.4 2009-03-31 13:06:09 onken * Changed implementation of lossy compression attribute detection and writing. * * Revision 1.2 2009-01-16 09:51:55 onken * Completed doxygen documentation for libi2d. * * Revision 1.1 2008-01-16 15:08:38 onken * Moved library "i2dlib" from /dcmdata/libsrc/i2dlib to /dcmdata/libi2d * * Revision 1.2 2008-01-11 14:17:53 onken * Added various options to i2dlib. Changed logging to use a configurable * logstream. Added output plugin for the new Multiframe Secondary Capture SOP * Classes. Added mode for JPEG plugin to copy exsiting APPn markers (except * JFIF). Changed img2dcm default behaviour to invent type1/type2 attributes (no * need for templates any more). Added some bug fixes. * * Revision 1.1 2007/11/08 15:58:55 onken * Initial checkin of img2dcm application and corresponding library i2dlib. * * */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/libi2d/i2d.h0000644000310500011400000003116311455601202021552 0ustar joergrdicom3/* * * Copyright (C) 2001-2010, 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: dcmdata * * Author: Michael Onken * * Purpose: Class to control conversion of image format to DICOM * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:15:46 $ * CVS/RCS Revision: $Revision: 1.13 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef I2D_H #define I2D_H #include "dcmtk/config/osconfig.h" #include "dcmtk/dcmdata/libi2d/i2doutpl.h" #include "dcmtk/dcmdata/libi2d/i2dplvlp.h" #include "dcmtk/dcmdata/libi2d/i2dplsc.h" #include "dcmtk/dcmdata/libi2d/i2djpgs.h" #include "dcmtk/dcmdata/dcpixel.h" class Image2Dcm { public: /** Constructor, initializes command line options * @return none */ Image2Dcm(); /** Start the conversion. Needs a fully configured input plugin * and a fully configured output plugin to operate. Returns * a dataset with the resulting DICOM object. * @param inputPlug - [in] The input plugin to read pixel data * @param outPlug - [in] The output plugin for specific SOP class output * @param resultDset - [out] The DICOM object resulting from the conversion * @param proposedTS - [out] The proposed transfer syntax (needed e. g. * by JPEG input plugin) * @return EC_Normal, if successfull, error otherwise */ OFCondition convert(I2DImgSource *inputPlug, I2DOutputPlug *outPlug, DcmDataset*& resultDset, E_TransferSyntax& proposedTS); /** Sets a DICOM file that should serve as a template for the resulting * DICOM object. Only the dataset of the given file is imported. * @param file - [in] The filename of the template DICOM file * @return none */ void setTemplateFile(const OFString& file); /** Set file from which patient/study/series data should be imported from. * @param file - [in] The DICOM file to read from * @return none */ void setSeriesFrom(const OFString& file); /** Set file from which patient/study/series data should be imported from. * @param file - [in] The DICOM file to read from * @return none */ void setStudyFrom(const OFString& file); /** Enables/Disables incrementing instance number taken over from DICOM file. * This can either be a the study/series file or the template file * provided. * @param incInstNo - [in] If true, the instance number will be incremented * @return none */ void setIncrementInstanceNumber(OFBool incInstNo); /** Enables/disables autotmatic insertion of the value "ISO_IR100" as * a value for the Specific Character Set attribute. If disabled, * no value is inserted for Specifific Character Set but instead * must be provided by other means (see setTemplateFile(), setSeriesFrom(), * setStudyFrom(), setOverrideKeys()). The insertion is applied after * loading the (optional) template file; the value might be overwritten * by the value copied by setStudy/Series/OverrideKeys. * @param insertLatin1 - [in] Enable/disable insertion of Iso Latin 1 * @return none; */ void setISOLatin1(OFBool insertLatin1); /** Specifies some attributes that should be inserted after conversion. * They will override any identical attributes already existing in the * converted result DICOM object. The override keys are applied at the very * end of the conversion and do not undergoe any validity checking. * @param ovkeys [in] override keys that can be tags, dictionary names * and paths (see DcmPath for syntax). Also it is * permitted to set a value if appropriate, e. g. * "PatientName=Doe^John" would be a valid override * key. * @return none */ void setOverrideKeys(const OFList& ovkeys); /** Enable/Disable basic validity checks for output dataset * @param doChecks - [in] OFTrue enables checking, OFFalse turns it off. * @param insertMissingType2 - [in] If true (default), missing type 2 * attributes are inserted automatically * @param inventMissingType1 - [in] If true , missing type 1 * attributes are inserted automatically with a predefined * value (if possible). An existing empty type 1 attribute is * assigned a value, too. * @return none */ void setValidityChecking(OFBool doChecks, OFBool insertMissingType2 = OFTrue, OFBool inventMissingType1 = OFTrue); /** Destructor, frees plugin memory * @return none */ ~Image2Dcm(); protected: /** Cleans up template for future insertion of pixel data information, ie * generally removes attributes from image pixel module * @param targetDset - [out] The dataset that should be cleand up * @return none */ void cleanupTemplate(DcmDataset *targetDset); /** Parses patient/study/series level attributes from file as defined * on command line and fills internal attributes accordingly. * @param targetDset - [out] The dataset to write the attributes to * @return EC_Normal, if successful, error otherwise */ OFCondition applyStudyOrSeriesFromFile(DcmDataset *targetDset); /** Increments instance number in given dataset * @param targetDset - [in/out] Dataset to increment instance number in * @return EC_Normal, if successful, error otherwise */ OFCondition incrementInstanceNumber(DcmDataset *targetDset); /** Generates and inserts missing UIDs, ie UIDs not taken over * from --dataset-from --study from and --series-from options * @param dset - [in] The dataset to write the UIDs to * @return EC_Normal, if successful, error otherwise */ OFCondition generateUIDs(DcmDataset *dset); /** Reads pixel data and corresponding attributes like rows etc. from image * file and inserts them into dataset. * @param imageSource - [in] The input plugin that actually reads the pixel data * @param dset - [out] The dataset to export the pixel data attributes to * @param outputTS - [out] The proposed transfex syntax of the dataset * @return EC_Normal, if successful, error otherwise */ OFCondition readAndInsertPixelData( I2DImgSource* imageSource, DcmDataset* dset, E_TransferSyntax& outputTS); /** Do some completeness / validity checks. Should be called when * dataset is completed and is about to be saved. * @param dataset - [in] The dataset to check * @return Error string if error occurs, empty string otherwise */ OFString isValid(DcmDataset& dataset) const; /** Copy override keys over existing keys in given dataset. * @param outputDset - [out] dataset to which the override keys are copied * @return Error code if error occurs, EC_Normal otherwise */ OFCondition applyOverrideKeys(DcmDataset *outputDset); /** Inserts "ISO_IR100" in the attribute "Specific Character Set". * Overwrites any existing value. * @param outputDset - [out] The dataset to write to * @return EC_Normal if insertion is successfull, error code otherwise */ OFCondition insertLatin1(DcmDataset *outputDset); /** Check whether given type 1 attribute is present and has a length > 0. * @param key - [in] The attribute tag check * @param targetDset - [out] targetDset * @param defaultValue - [in] value to be inserted if attribute is missing * (needs invent option for type 1 attributes enabled) * @return A string with an error message if attribute is not present * or has length of 0 */ OFString checkAndInventType1Attrib(const DcmTagKey& key, DcmDataset* targetDset, const OFString& defaultValue = "") const; /** Inserts an empty element with the given tag into a dataset * @param key - [in] The attribute tag to check * @param targetDset - [out] targetDset * @return A string with an error message if attribute is not present * nor gets inserted automatically (see m_inventMissingType2Attribs) */ OFString checkAndInventType2Attrib(const DcmTagKey& key, DcmDataset* targetDset) const; private: /** Correctly inserts encapsulated pixel data. * @param dset [in] - The dataset to which we should add this. * @param pixData [in] - The data to add. * @param length [in] - The length of pixData. * @param outputTS [in] - The output transfer syntax to be used * @return EC_Normal, if successfull, error otherwise. */ OFCondition insertEncapsulatedPixelData(DcmDataset* dset, char *pixData, Uint32 length, const E_TransferSyntax& outputTS) const; /* Attributes for writing DICOM dataset */ /// These attributes are applied to the dataset after conversion /// (and are not checked by the isValid() function) OFList m_overrideKeys; /// If not empty, the DICOM file specified in this variable is used /// as a base for the DICOM image file to be created, ie. all attributes /// are taken over from this template file OFString m_templateFile; /// If true, patient and study data is read from file OFBool m_readStudyLevel; /// If true, patient, study and series data is read from file OFBool m_readSeriesLevel; /// File to read study and series from OFString m_studySeriesFile; /// If true, Instance Number ist read from file and incremented by 1 OFBool m_incInstNoFromFile; /// If true, some simple attribute checks (missing type 2 attributes or /// missing type 1 values) are omitted OFBool m_disableAttribChecks; /// If true, missing type 2 elements are inserted automatically (empty value). /// Enabled per default. OFBool m_inventMissingType2Attribs; /// If true, missing type 1 elements are inserted automatically with a /// predefined value, if possible. Disabled per default. OFBool m_inventMissingType1Attribs; /// If enabled, ISO_IR100 (ISO Latin 1) is inserted as a standard value /// for attribute "Specific Character Set". Insertion takes place after /// loading (optional) template file. OFBool m_insertLatin1; }; #endif // I2D_H /* * CVS/RCS Log: * $Log: i2d.h,v $ * Revision 1.13 2010-10-14 13:15:46 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.12 2010-08-09 13:03:07 joergr * Updated data dictionary to 2009 edition of the DICOM standard. From now on, * the official "keyword" is used for the attribute name which results in a * number of minor changes (e.g. "PatientsName" is now called "PatientName"). * * Revision 1.11 2010-03-25 09:44:07 onken * Pixel data is now already marked with the correct transfer syntax in memory * not only when writing to disk. This permits conversion in memory, e. g. for * sending the converted DICOM images directly over the network. * * Revision 1.10 2009-11-04 09:58:08 uli * Switched to logging mechanism provided by the "new" oflog module * * Revision 1.9 2009-09-30 08:05:25 uli * Stop including dctk.h in libi2d's header files. * * Revision 1.8 2009-07-16 14:23:37 onken * Extended Image2Dcm engine to also work for uncompressed pixel data input. * * Revision 1.7 2009-07-10 13:16:16 onken * Added path functionality for --key option and lets the code make use * of the DcmPath classes. * * Revision 1.6 2009-03-31 13:06:09 onken * Changed implementation of lossy compression attribute detection and writing. * * Revision 1.4 2009-01-16 09:51:55 onken * Completed doxygen documentation for libi2d. * * Revision 1.3 2008-01-16 16:32:23 onken * Fixed some empty or doubled log messages in libi2d files. * * Revision 1.2 2008-01-16 15:07:40 onken * Moved library "i2dlib" from /dcmdata/libsrc/i2dlib to /dcmdata/libi2d * * Revision 1.2 2008-01-11 14:17:53 onken * Added various options to i2dlib. Changed logging to use a configurable * logstream. Added output plugin for the new Multiframe Secondary Capture SOP * Classes. Added mode for JPEG plugin to copy exsiting APPn markers (except * JFIF). Changed img2dcm default behaviour to invent type1/type2 attributes (no * need for templates any more). Added some bug fixes. * * Revision 1.1 2007/11/08 15:58:55 onken * Initial checkin of img2dcm application and corresponding library i2dlib. * * */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/libi2d/i2dplnsc.h0000644000310500011400000001100711455601202022605 0ustar joergrdicom3/* * * Copyright (C) 2001-2010, 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: dcmdata * * Author: Michael Onken * * Purpose: Class for conversion of image file into new DICOM SC Image IODs * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:15:46 $ * CVS/RCS Revision: $Revision: 1.5 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef I2DPLNSC_H #define I2DPLNSC_H #include "dcmtk/config/osconfig.h" #include "dcmtk/dcmdata/libi2d/i2doutpl.h" class I2DOutputPlugNewSC : public I2DOutputPlug { public: /** Constructor, initializes member variables with standard values * @return none */ I2DOutputPlugNewSC(); /** Virtual function that returns a short name of the plugin. * @return The name of the plugin */ virtual OFString ident(); /** Overwrites function from base class. Returns the Storage SOP class * written by this plugin * @param suppSOPs - [out] List of UIDs representing the supported SOP * classes supported by this plugin. * @return none */ virtual void supportedSOPClassUIDs(OFList suppSOPs); /** Outputs SOP class specific information into dataset * @param dataset - [in/out] Dataset to write to * @return EC_Normal if successful, error otherwise */ virtual OFCondition convert(DcmDataset &dataset) const; /** Do some completeness / validity checks. Should be called when * dataset is completed and is about to be saved. * @param dataset - [in] The dataset to check * @return Error string if error occurs, empty string otherwise */ virtual OFString isValid(DcmDataset& dataset) const; /** Virtual Destructor, clean up memory * @return none */ virtual ~I2DOutputPlugNewSC(); protected: /** Inserts attributes for Multi-frame Module * @param targetDataset - [in/out] The dataset to write to * @return EC_Normal if insertion was successfull, error code otherwise */ virtual OFCondition insertMultiFrameAttribs(DcmDataset* targetDataset) const; /** Inserts attributes Rescale Slope/Intercept/Type, which have to be * written (1C) if color model is MONOCHROME2 and BitsStored > 1. * @param targetDataset - [out] The dataset to write to * @return EC_Normal if insertion was successfull, error code otherwise */ virtual OFCondition insertSCMultiFrameAttribs(DcmDataset *targetDataset) const; /** Checks whether Image Pixel module attributes conform to the * specification of a a 1 bit Secondary Capture object. * @param dataset - [in] The dataset to check * @return EC_Normal, if everything is fine, error code otherwise */ virtual OFCondition handle1BitSC(DcmDataset *dataset) const; /** Checks whether Image Pixel module attributes conform to the * specification of a a 8 bit Secondary Capture object. * @param dataset - [in] The dataset to check * @return EC_Normal, if everything is fine, error code otherwise */ virtual OFCondition handle8BitSC(DcmDataset *dataset) const; /** Checks whether Image Pixel module attributes conform to the * specification of a a 16 bit Secondary Capture object. * @param dataset - [in] The dataset to check * @return EC_Normal, if everything is fine, error code otherwise */ virtual OFCondition handle16BitSC(DcmDataset *dataset) const; }; #endif // I2DPLNSC_H /* * CVS/RCS Log: * $Log: i2dplnsc.h,v $ * Revision 1.5 2010-10-14 13:15:46 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.4 2009-11-04 09:58:08 uli * Switched to logging mechanism provided by the "new" oflog module * * Revision 1.3 2009-09-30 08:05:25 uli * Stop including dctk.h in libi2d's header files. * * Revision 1.2 2009-01-16 09:51:55 onken * Completed doxygen documentation for libi2d. * * Revision 1.1 2008-01-16 15:11:44 onken * Moved library "i2dlib" from /dcmdata/libsrc/i2dlib to /dcmdata/libi2d * * Revision 1.1 2008-01-11 14:17:53 onken * Added various options to i2dlib. Changed logging to use a configurable * logstream. Added output plugin for the new Multiframe Secondary Capture SOP * Classes. Added mode for JPEG plugin to copy exsiting APPn markers (except * JFIF). Changed img2dcm default behaviour to invent type1/type2 attributes (no * need for templates any more). Added some bug fixes. * */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/libi2d/i2dplsc.h0000644000310500011400000000606111455601202022433 0ustar joergrdicom3/* * * Copyright (C) 2001-2010, 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: dcmdata * * Author: Michael Onken * * Purpose: Class for conversion of image file into DICOM SC Image Storage * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:15:46 $ * CVS/RCS Revision: $Revision: 1.5 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef I2DPLSC_H #define I2DPLSC_H #include "dcmtk/config/osconfig.h" #include "dcmtk/dcmdata/libi2d/i2doutpl.h" class I2DOutputPlugSC : public I2DOutputPlug { public: /** Constructor, initializes member variables with standard values * @return none */ I2DOutputPlugSC(); /** Virtual function that returns a short name of the plugin. * @return The name of the plugin */ virtual OFString ident(); /** Overwrites function from base class. Returns the Storage SOP class * written by this plugin * @param suppSOPs - [out] List of UIDS representing SOP classes supported * by this plugin * @return none */ virtual void supportedSOPClassUIDs(OFList suppSOPs); /** Outputs SOP class specific information into dataset * @param dataset - [in/out] Dataset to write to * @return EC_Normal if successful, error otherwise */ virtual OFCondition convert(DcmDataset &dataset) const; /** Do some completeness / validity checks. Should be called when * dataset is completed and is about to be saved. * @param dataset - [in] The dataset to check * @return Error string if error occurs, empty string otherwise */ virtual OFString isValid(DcmDataset& dataset) const; /** Virtual Destructor, clean up memory * @return none */ virtual ~I2DOutputPlugSC(); }; #endif // I2DPLSC_H /* * CVS/RCS Log: * $Log: i2dplsc.h,v $ * Revision 1.5 2010-10-14 13:15:46 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.4 2009-11-04 09:58:08 uli * Switched to logging mechanism provided by the "new" oflog module * * Revision 1.3 2009-09-30 08:05:25 uli * Stop including dctk.h in libi2d's header files. * * Revision 1.2 2009-01-16 09:51:55 onken * Completed doxygen documentation for libi2d. * * Revision 1.1 2008-01-16 15:12:20 onken * Moved library "i2dlib" from /dcmdata/libsrc/i2dlib to /dcmdata/libi2d * * Revision 1.2 2008-01-11 14:17:53 onken * Added various options to i2dlib. Changed logging to use a configurable * logstream. Added output plugin for the new Multiframe Secondary Capture SOP * Classes. Added mode for JPEG plugin to copy exsiting APPn markers (except * JFIF). Changed img2dcm default behaviour to invent type1/type2 attributes (no * need for templates any more). Added some bug fixes. * * Revision 1.1 2007/11/08 15:58:56 onken * Initial checkin of img2dcm application and corresponding library i2dlib. * * */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/libi2d/i2djpgs.h0000644000310500011400000004016111455601202022434 0ustar joergrdicom3/* * * Copyright (C) 2001-2010, 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: dcmdata * * Author: Michael Onken * * Purpose: Class to extract pixel data and meta information from JPEG file * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:15:46 $ * CVS/RCS Revision: $Revision: 1.8 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef I2DJPGS_H #define I2DJPGS_H #include "dcmtk/config/osconfig.h" #include "dcmtk/ofstd/offile.h" #include "dcmtk/ofstd/oflist.h" #include "dcmtk/dcmdata/libi2d/i2dimgs.h" /** * JPEG markers consist of one or more 0xFF bytes, followed by a marker * code byte (which is not an FF). This enum lists the second byte * of all these markers. Note: RESn markers are not fully listed, but only * the first (RES0) and the last (RESN) */ enum E_JPGMARKER { E_JPGMARKER_SOF0 = 0xC0, E_JPGMARKER_SOF1 = 0xC1, E_JPGMARKER_SOF2 = 0xC2, E_JPGMARKER_SOF3 = 0xC3, /*C4 and CC are not SOF markers,*/ E_JPGMARKER_SOF5 = 0xC5, E_JPGMARKER_SOF6 = 0xC6, E_JPGMARKER_SOF7 = 0xC7, E_JPGMARKER_JPG = 0xC8, E_JPGMARKER_SOF9 = 0xC9, E_JPGMARKER_SOF10 = 0xCA, E_JPGMARKER_SOF11 = 0xCB, E_JPGMARKER_SOF13 = 0xCD, E_JPGMARKER_SOF14 = 0xCE, E_JPGMARKER_SOF15 = 0xCF, E_JPGMARKER_DHT = 0xC4, E_JPGMARKER_DAC = 0xCC, E_JPGMARKER_RST0 = 0xD0, E_JPGMARKER_RST1 = 0xD1, E_JPGMARKER_RST2 = 0xD2, E_JPGMARKER_RST3 = 0xD3, E_JPGMARKER_RST4 = 0xD4, E_JPGMARKER_RST5 = 0xD5, E_JPGMARKER_RST6 = 0xD6, E_JPGMARKER_RST7 = 0xD7, E_JPGMARKER_SOI = 0xD8, E_JPGMARKER_EOI = 0xD9, E_JPGMARKER_SOS = 0xDA, E_JPGMARKER_DQT = 0xDB, E_JPGMARKER_DNL = 0xDC, E_JPGMARKER_DRI = 0xDD, E_JPGMARKER_DHP = 0xDE, E_JPGMARKER_EXP = 0xDF, E_JPGMARKER_APP0 = 0xE0, E_JPGMARKER_APP1 = 0xE1, E_JPGMARKER_APP2 = 0xE2, E_JPGMARKER_APP3 = 0xE3, E_JPGMARKER_APP4 = 0xE4, E_JPGMARKER_APP5 = 0xE5, E_JPGMARKER_APP6 = 0xE6, E_JPGMARKER_APP7 = 0xE7, E_JPGMARKER_APP8 = 0xE8, E_JPGMARKER_APP9 = 0xE9, E_JPGMARKER_APP10 = 0xEA, E_JPGMARKER_APP11 = 0xEB, E_JPGMARKER_APP12 = 0xEC, E_JPGMARKER_APP13 = 0xED, E_JPGMARKER_APP14 = 0xEE, E_JPGMARKER_APP15 = 0xEF, E_JPGMARKER_JPGN0 = 0xF0, E_JPGMARKER_JPGN1 = 0xF1, E_JPGMARKER_JPGN2 = 0xF2, E_JPGMARKER_JPGN3 = 0xF3, E_JPGMARKER_JPGN4 = 0xF4, E_JPGMARKER_JPGN5 = 0xF5, E_JPGMARKER_JPGN6 = 0xF6, E_JPGMARKER_JPGN7 = 0xF7, E_JPGMARKER_JPGN8 = 0xF8, E_JPGMARKER_JPGN9 = 0xF9, E_JPGMARKER_JPGN10 = 0xFA, E_JPGMARKER_JPGN11 = 0xFB, E_JPGMARKER_JPGN12 = 0xFC, E_JPGMARKER_JPGN13 = 0xFD, E_JPGMARKER_COM = 0xFE, E_JPGMARKER_TEM = 0x01, E_JPGMARKER_RES0 = 0x02, E_JPGMARKER_RESN = 0xBF }; /** * Struct that represents a marker in a JPEG file, i.e. it consists * of the byte position of the marker and the marker code itself */ struct JPEGFileMapEntry { /// The byte position of the marker offile_off_t bytePos; /// The marker byte itself E_JPGMARKER marker; }; class I2DJpegSource : public I2DImgSource { public: /** Constructor, initializes member variables * @return none */ I2DJpegSource(); /** Returns format of input image. For this class "JPEG" is returned. * @return Returns format of input image, i. e. "JPEG". */ OFString inputFormat() const; /** Extracts the raw JPEG pixel data stream from a JPEG file and returns some * image information about this pixel data. * Raw means here that all APP markers (e.g. JFIF information) are removed from the JPEG stream. * The pixel data returned is a JPEG stream in JPEG interchange format. * This function allocates memory for the pixel data returned to the user. The caller of this * function is responsible for deleting the memory buffer * @param rows - [out] Rows of image * @param cols - [out] Columns of image * @param samplesPerPixel - [out] Number of components per pixel * @param photoMetrInt - [out] The DICOM color model used for the compressed data * @param bitsAlloc - [out] Bits Allocated for one sample * @param bitsStored - [out] Bits Stored, Number of bits actually stored within Bits Allocated * @param highBit - [out] High Bit, Highest stored in bit within Bits Allocated * @param pixelRepr - [out] Pixel Representation (0=unsigned, 1=signed) * @param planConf - [out] Planar Configuration * @param pixAspectH - [out] Horizontal value of pixel aspect ratio * @param pixAspectV - [out] Vertical value of pixel aspect ratio * @param pixData - [out] Pointer to the pixel data in JPEG Interchange Format (but without APPx markers). * @param length - [out] Length of pixel data * @param ts - [out] The transfer syntax imposed by the imported pixel pixel data. This is necessary for the JPEG importer that needs to report which TS must be used for the imported JPEG data (ie. baseline, progressive, ...). * @return EC_Normal, if successful, error otherwise */ OFCondition readPixelData( Uint16& rows, Uint16& cols, Uint16& samplesPerPixel, OFString& photoMetrInt, Uint16& bitsAlloc, Uint16& bitsStored, Uint16& highBit, Uint16& pixelRepr, Uint16& planConf, Uint16& pixAspectH, Uint16& pixAspectV, char*& pixData, Uint32& length, E_TransferSyntax& ts); /* After reading of pixel data, this function can be used for getting * information about lossy compression parameters. * @param srcEncodingLossy - [out] Denotes, whether the encoding of the pixel * data read was lossy (OFtrue) or lossless (OFFalse) * @param srcLossyComprMethod - [out] Denotes the lossy compression method used * in source if there is one (srcEncodingLossy = OFTrue). * Should use defined terms of attribute Lossy Compression Method. * @return EC_Normal if information is available, error otherwise */ OFCondition getLossyComprInfo(OFBool& srcEncodingLossy, OFString& srcLossyComprMethod) const; /** Enable/Disable support for Extended Sequential JPEG Coding * @param enabled - [in] OFTrue: support Extended Sequential, OFTrue: Do not support * @return none */ void setExtSeqSupport(const OFBool enabled); /** Enable/Disable support for Progressive JPEG Coding * @param enabled - [in] OFTrue: support Extended Sequential, OFTrue: Do not support * @return none */ void setProgrSupport(const OFBool enabled); /** If enabled, conversion will only take place if JFIF data could be found * and evaluated. Many digital cameras do not provide a JFIF header, so this * is disabled by default. */ void setInsistOnJFIF(const OFBool enabled); /** If enabled, APPn markers (except JFIF!) are also copied to the output file. * This can cause a huge speedup because instead of parsing the whole * JPEG file (for finding any APPn markers) the parsing stops after finding * the SOFn marker (which is relevant for extracting width/height and so on. * Default: false * @param enabled - [in] OFtrue: copy APPn, OFFalse: cut off APPn info * @return none */ void setKeepAPPn(const OFBool enabled); /** Returns a string representation of a JPEG marker code. * @param marker - [in] The marker to be converted * @return A string representation of the marker */ static OFString jpegMarkerToString(const E_JPGMARKER& marker); /** Destructor, frees some memory. * @return none */ ~I2DJpegSource(); protected: /** Opens the JPEG file specified by the given filename. * @param filename - [in] The file to be opened * @return EC_Normal, if successful, error otherwise */ OFCondition openFile(const OFString& filename); /** Closes JPEG file. * @return A string representation of the marker */ void closeFile(); /** Function that scans a JPEG file and creates a "file map" which * includes all JPEG markes and their byte positions in the file. * @return EC_Normal, if successful, error otherwise */ OFCondition createJPEGFileMap(); /** Dump the internal JPEG file map to a given stream. The file map * lists JPEG markers and their position in the bitstream found in the JPEG * file * @return none */ void debugDumpJPEGFileMap() const; /** Get image parameters as found at given SOF marker of the JPEG image. * @param entry - [in] This specifies the marker and the byte position of the SOF marker * @param imageWidth - [out] The width of the image * @param imageHeight - [out] The height of the image * @param samplesPerPixel - [out] Number of components per pixel * @param bitsPerSample - [out] Nunber of bits per pixel component * @return EC_Normal, if successful, error otherwise */ OFCondition getSOFImageParameters( const JPEGFileMapEntry& entry, Uint16& imageWidth, Uint16& imageHeight, Uint16& samplesPerPixel, Uint16& bitsPerSample); /** Get JPEG parameters as found at given JFIF marker of the JPEG image. * @param entry - [in] This specifies the marker and the byte position of the JFIF marker * @param jfifVersion - [out] The JFIF version of the JFIF data * @param pixelAspectH - [out] The horizontal pixel aspect ratio * @param pixelAspectV - [out] The vertical pixel aspect ratio * @param unit - [out] The contents of the pixel aspect ratio unit field * @return EC_Normal, if successful, error otherwise */ OFCondition getJFIFImageParameters( const JPEGFileMapEntry& entry, Uint16& jfifVersion, Uint16& pixelAspectH, Uint16& pixelAspectV, Uint16& unit); /** Check, whether a given JPEG image marker (SOFn) is supported by * this plugin * @param jpegEncoding - [in] Image marker that should be tested * @return EC_Normal, marker is supported, error otherwise */ OFCondition isJPEGEncodingSupported(const E_JPGMARKER& jpegEncoding) const; /** Returns if possible the DICOM transfer syntax matching the coding of the * JPEG data. * @param jpegEncoding - [in] Image marker that should be tested * @return EC_Normal, marker is supported, error otherwise */ static E_TransferSyntax associatedTS(const E_JPGMARKER& jpegEncoding); /** Returns true if marker is one of the RST0 to RST7 markers * @param jpegEncoding - [in] Image marker that should be tested * @return OFTrue, if marker is RST0 to RST7, OFFalse otherwise */ static OFBool isRSTMarker(const E_JPGMARKER& jpegEncoding); /** Returns true if marker is one of the SOF0 to SOF15 markers * @param jpegEncoding - [in] Image marker that should be tested * @return OFTrue, if marker is SOF0 to SOF15, OFFalse otherwise */ static OFBool isSOFMarker(const E_JPGMARKER& jpegEncoding); /** Extract raw JPEG stream (i.e. without APPn markers) from JPEG file. * @param pixelData - [out] The resulting JPEG stream * @param pixLength - [out] The length of the resulting stream * @return EC_Normal, if successful, error otherwise */ OFCondition extractRawJPEGStream(char*& pixelData, Uint32& pixLength); /** Copies JPEG stream (with APPn markers, excluding JFIF) from JPEG file. * @param pixelData - [out] The resulting JPEG stream * @param pixLength - [out] The length of the resulting stream * @return EC_Normal, if successful, error otherwise */ OFCondition copyJPEGStream(char*& pixelData, Uint32& pixLength); /** Skips one marker while scanning through the JPEG file stream. * @return EC_Normal, if successful, error otherwise */ OFCondition skipVariable(); /** Tries to read the SOI marker. * @param result - [out] The code of the SOI marker if successful (0xD8) * @return EC_Normal, if successful, error otherwise */ OFCondition firstMarker(E_JPGMARKER& result); /** Tries to find the next JPEG marker in underlying file stream. * @param lastWasSOSMarker - [in] Denotes, whether the last marker read * before was the SOS (start of scan) marker. This is needed to * ignore non-marker 0xFF ocurrences in the compressed data. * @param result - [out] The result marker * @return EC_Normal, if successful, error otherwise */ OFCondition nextMarker(const OFBool& lastWasSOSMarker, E_JPGMARKER& result); /** Read 2 bytes from the byte stream. * @param result - [out] The result * @return 0, if successful, EOF if rest of stream does not contain enough bytes */ inline int read2Bytes(Uint16& result); /** Read 1 byte from the byte stream. * @param result - [out] The result * @return 0, if successful, EOF if rest of stream does not contain enough bytes */ inline int read1Byte(Uint8& result); /** Deletes internal JPEG file map and frees memory. * @return none */ void clearMap(); /// JPEG file map. This map includes all JPEG markers and their byte positions in the JPEG file. OFList m_jpegFileMap; /// The JPEG file, if opened OFFile jpegFile; /// If true, JPEGs with progressive coding are not supported OFBool m_disableProgrTs; /// If true, JPEGs with extended sequential coding are not supported OFBool m_disableExtSeqTs; /// If true, conversion will only work if JFIF header can be found. /// Default: false OFBool m_insistOnJFIF; /// If true, APPn markers (except JFIF!) are also copied to the output file. /// This can cause a huge speedup because instead of parsing the whole /// JPEG file (for finding any APPn markers) the parsing stops after finding /// the SOFn marker (which is relevant for extracting width/height and so on. /// Default: false OFBool m_keepAPPn; /// After reading pixel data, this denotes whether the source /// data is already lossy compressed OFBool m_lossyCompressed; }; #endif // #ifndef I2DJPGS_H /* * CVS/RCS Log: * $Log: i2djpgs.h,v $ * Revision 1.8 2010-10-14 13:15:46 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.7 2009-11-04 09:58:08 uli * Switched to logging mechanism provided by the "new" oflog module * * Revision 1.6 2009-09-30 08:05:25 uli * Stop including dctk.h in libi2d's header files. * * Revision 1.5 2009-07-16 14:22:19 onken * Changed comment (and thus semantic of parameter for output transfer syntax). * * Revision 1.4 2009-03-31 13:06:09 onken * Changed implementation of lossy compression attribute detection and writing. * * Revision 1.2 2009-01-16 09:51:55 onken * Completed doxygen documentation for libi2d. * * Revision 1.1 2008-01-16 15:09:17 onken * Moved library "i2dlib" from /dcmdata/libsrc/i2dlib to /dcmdata/libi2d * * Revision 1.2 2008-01-11 14:17:53 onken * Added various options to i2dlib. Changed logging to use a configurable * logstream. Added output plugin for the new Multiframe Secondary Capture SOP * Classes. Added mode for JPEG plugin to copy exsiting APPn markers (except * JFIF). Changed img2dcm default behaviour to invent type1/type2 attributes (no * need for templates any more). Added some bug fixes. * * Revision 1.1 2007/11/08 15:58:55 onken * Initial checkin of img2dcm application and corresponding library i2dlib. * * */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/libi2d/i2dbmps.h0000644000310500011400000002475511470236223022451 0ustar joergrdicom3/* * * Copyright (C) 2009-2010, 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: dcmdata * * Author: Uli Schlachter * * Purpose: Class to extract pixel data and meta information from BMP file * * Last Update: $Author: uli $ * Update Date: $Date: 2010-11-15 13:58:43 $ * CVS/RCS Revision: $Revision: 1.9 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef I2DBMPS_H #define I2DBMPS_H #include "dcmtk/config/osconfig.h" #include "dcmtk/dcmdata/libi2d/i2dimgs.h" #include "dcmtk/ofstd/offile.h" /** This is a I2DImgSource implementation that can parse BMP files and convert * them into DICOM images. */ class I2DBmpSource : public I2DImgSource { public: /** Constructor, initializes member variables * @return none */ I2DBmpSource(); /** Returns format of input image. For this class "BMP" is returned. * @return Returns format of input image, i. e. "BMP". */ OFString inputFormat() const; /** Extracts the raw BMP pixel data stream from a BMP file and returns some * image information about this pixel data. * Raw means that any header information is removed from the BMP stream. * This function allocates memory for the pixel data returned to the user. The caller of this * function is responsible for deleting the memory buffer * @param rows - [out] Rows of image * @param cols - [out] Columns of image * @param samplesPerPixel - [out] Number of components per pixel * @param photoMetrInt - [out] The DICOM color model used for the compressed data * @param bitsAlloc - [out] Bits Allocated for one sample * @param bitsStored - [out] Bits Stored, Number of bits actually stored within Bits Allocated * @param highBit - [out] High Bit, Highest stored in bit within Bits Allocated * @param pixelRepr - [out] Pixel Representation (0=unsigned, 1=signed) * @param planConf - [out] Planar Configuration * @param pixAspectH - [out] Horizontal value of pixel aspect ratio * @param pixAspectV - [out] Vertical value of pixel aspect ratio * @param pixData - [out] Pointer to the pixel data in BMP Interchange Format (but without APPx markers). * @param length - [out] Length of pixel data * @param ts - [out] The transfer syntax imposed by the imported pixel pixel data. This is necessary for the BMP importer that needs to report which TS must be used for the imported BMP data (ie. baseline, progressive, ...). * @return EC_Normal, if successful, error otherwise */ OFCondition readPixelData( Uint16& rows, Uint16& cols, Uint16& samplesPerPixel, OFString& photoMetrInt, Uint16& bitsAlloc, Uint16& bitsStored, Uint16& highBit, Uint16& pixelRepr, Uint16& planConf, Uint16& pixAspectH, Uint16& pixAspectV, char*& pixData, Uint32& length, E_TransferSyntax& ts); /** After reading of pixel data, this function can be used for getting * information about lossy compression parameters. * @param srcEncodingLossy - [out] Denotes, whether the encoding of the pixel * data read was lossy (OFtrue) or lossless (OFFalse) * @param srcLossyComprMethod - [out] Denotes the lossy compression method used * in source if there is one (srcEncodingLossy = OFTrue). * Should use defined terms of attribute Lossy Compression Method. * @return EC_Normal if information is available, error otherwise */ virtual OFCondition getLossyComprInfo(OFBool& srcEncodingLossy, OFString& /* srcLossyComprMethod */) const { srcEncodingLossy = OFFalse; return EC_Normal; } /** Destructor, frees some memory. * @return none */ virtual ~I2DBmpSource(); protected: /** Opens the BMP file specified by the given filename. * @param filename - [in] The file to be opened * @return EC_Normal, if successful, error otherwise */ OFCondition openFile(const OFString& filename); /** Closes BMP file. * @return none */ void closeFile(); /** Reads and checks the BMP file header. * @param offset - [out] Offset to the BMP data from beginning of file * @return EC_Normal, if successful, error otherwise */ OFCondition readFileHeader(Uint32 &offset); /** Reads and checks the BMP bitmap header. * After this function, the current read position is just after the * header. That is, at the beginning of the color palette. * @param width - [out] width of the image in pixel * @param height - [out] height of the image in pixel * @param isTopDown - [out] OFTrue if this is a top down bitmap * (height was read as negative value).OFFalse otherwise. * @param bpp - [out] bits per pixel of the image. * @param colors - [out] number of entries in color table. * @return EC_Normal, if successful, error otherwise */ OFCondition readBitmapHeader(Uint16 &width /*out*/, Uint16 &height /*out*/, Uint16 &bpp /*out*/, OFBool &isTopDown /*out*/, Uint16 &colors /*out*/); /** Read the color palette from the file. * @param colors - [in] number of colors to read * @param palette - [out] the read color palette is stored here * @return EC_Normal, if successful, error otherwise */ OFCondition readColorPalette(Uint16 colors, Uint32*& palette); /** Read the bitmap data. * This assumes the current read position is at the start of the image data. * @param width - [in] width of the image in pixel * @param height - [in] height of the image in pixel * @param bpp - [in] Image's bits per pixel. * @param isTopDown - [in] If true, this is a top down bitmap * @param colors - [in] Number of color palette entries * @param palette - [in] Color palette * @param pixData - [out] Image data * @param length - [out] Length of data * @return EC_Normal, if successful, error otherwise */ OFCondition readBitmapData(const Uint16 width, const Uint16 height, const Uint16 bpp, const OFBool isTopDown, const Uint16 colors, const Uint32* palette, char*& pixData /*out*/, Uint32& length /*out*/); /** Parse a single 24bpp or 32bpp row of bmp data. * @param row - [in] The row of data to parse. * @param width - [in] The length in pixel of the row. * @param bpp - [in] The number of bits per pixel. * @param pixData - [out] The buffer to write the data to (in "RGB" format). * @return EC_Normal, if successful, error otherwise */ OFCondition parse24_32BppRow(const Uint8 *row, const Uint16 width, const int bpp, char *pixData /*out*/) const; /** Parse a single 16bpp row of bmp data. * @param row - [in] The row of data to parse. * @param width - [in] The length in pixel of the row. * @param pixData - [out] The buffer to write the data to (in "RGB" format). * @return EC_Normal, if successful, error otherwise */ OFCondition parse16BppRow(const Uint8 *row, const Uint16 width, char *pixData /*out*/) const; /** Parse a single 1, 4 or 8bpp row of bmp data. * @param row - [in] The row of data to parse. * @param width - [in] The length in pixel of the row. * @param bpp - [in] The number of bits per pixel. * @param colors - [in] The number of entries in the color palette. * @param palette - [in] The color palette to use. * @param pixData - [out] The buffer to write the data to (in "RGB" format). * @return EC_Normal, if successful, error otherwise */ OFCondition parseIndexedColorRow(const Uint8 *row, const Uint16 width, const int bpp, const Uint16 colors, const Uint32* palette, char *pixData /*out*/) const; /** Read 4 bytes from the byte stream and interpret it as a signed integer. * @param result - [out] The result * @return 0, if successful, EOF if rest of stream does not contain enough bytes */ int readLong(Sint32& result); /** Read 4 bytes from the byte stream. * @param result - [out] The result * @return 0, if successful, EOF if rest of stream does not contain enough bytes */ int readDWord(Uint32& result); /** Read 2 bytes from the byte stream. * @param result - [out] The result * @return 0, if successful, EOF if rest of stream does not contain enough bytes */ int readWord(Uint16& result); /// The BMP file, if opened OFFile bmpFile; }; #endif // #ifndef I2DBMPS_H /* * CVS/RCS Log: * $Log: i2dbmps.h,v $ * Revision 1.9 2010-11-15 13:58:43 uli * Fixed some errors in doxygen comments. * * Revision 1.8 2010-10-14 13:15:46 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.7 2010-10-01 10:21:05 uli * Fixed most compiler warnings from -Wall -Wextra -pedantic in dcmdata. * * Revision 1.6 2010-06-01 10:33:53 uli * Added support for indexed-color BMP images (bit depths 1, 4 and 8). * * Revision 1.5 2010-05-25 12:40:06 uli * Added support for 16bpp BMP images to libi2d * * Revision 1.4 2010-05-21 14:43:07 uli * Added support for 32bpp BMP images to libi2d. * * Revision 1.3 2009-11-04 09:58:08 uli * Switched to logging mechanism provided by the "new" oflog module * * Revision 1.2 2009-09-30 08:05:25 uli * Stop including dctk.h in libi2d's header files. * * Revision 1.1 2009-07-16 14:25:28 onken * Added img2dcm input plugin for the BMP graphics format (at the moment only * support for 24 Bit RGB). * * */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/libi2d/CMakeLists.txt0000644000310500011400000000012610743416533023470 0ustar joergrdicom3# declare installation files INSTALL_FILES(${INSTALL_INCDIR}/dcmtk/dcmdata/libi2d .h) dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/dcrlecp.h0000644000310500011400000001104611455601176021353 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Marco Eichelberg * * Purpose: codec parameter for RLE * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:15:42 $ * CVS/RCS Revision: $Revision: 1.6 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DCRLECP_H #define DCRLECP_H #include "dcmtk/config/osconfig.h" #include "dcmtk/dcmdata/dccodec.h" /* for DcmCodecParameter */ /** codec parameter for RLE codec */ class DcmRLECodecParameter: public DcmCodecParameter { public: /** constructor. * @param pCreateSOPInstanceUID true if a new SOP instance UID should be assigned * upon compression/decompression * @param pFragmentSize maximum fragment size (in kbytes) for compression, 0 for unlimited. * @param pCreateOffsetTable create offset table during image compression? * @param pConvertToSC flag indicating whether image should be converted to * Secondary Capture upon compression * @param pReverseDecompressionByteOrder flag indicating whether the byte order should * be reversed upon decompression. Needed to correctly decode some incorrectly encoded * images with more than one byte per sample. */ DcmRLECodecParameter( OFBool pCreateSOPInstanceUID = OFFalse, Uint32 pFragmentSize = 0, OFBool pCreateOffsetTable = OFTrue, OFBool pConvertToSC = OFFalse, OFBool pReverseDecompressionByteOrder = OFFalse); /// copy constructor DcmRLECodecParameter(const DcmRLECodecParameter& arg); /// destructor virtual ~DcmRLECodecParameter(); /** this methods creates a copy of type DcmCodecParameter * * it must be overweritten in every subclass. * @return copy of this object */ virtual DcmCodecParameter *clone() const; /** returns the class name as string. * can be used as poor man's RTTI replacement. */ virtual const char *className() const; /** returns maximum fragment size (in kbytes) for compression, 0 for unlimited. * @return maximum fragment size for compression */ Uint32 getFragmentSize() const { return fragmentSize; } /** returns offset table creation flag * @return offset table creation flag */ OFBool getCreateOffsetTable() const { return createOffsetTable; } /** returns secondary capture conversion flag * @return secondary capture conversion flag */ OFBool getConvertToSC() const { return convertToSC; } /** returns mode for SOP Instance UID creation * @return mode for SOP Instance UID creation */ OFBool getUIDCreation() const { return createInstanceUID; } /** returns reverse decompression byte order mode * @return reverse decompression byte order mode */ OFBool getReverseDecompressionByteOrder() const { return reverseDecompressionByteOrder; } private: /// private undefined copy assignment operator DcmRLECodecParameter& operator=(const DcmRLECodecParameter&); /// maximum fragment size (in kbytes) for compression, 0 for unlimited. Uint32 fragmentSize; /// create offset table during image compression OFBool createOffsetTable; /// flag indicating whether image should be converted to Secondary Capture upon compression OFBool convertToSC; /// create new Instance UID during compression/decompression? OFBool createInstanceUID; /** enable reverse byte order of RLE segments during decompression, needed to * decompress certain incorrectly encoded RLE images */ OFBool reverseDecompressionByteOrder; }; #endif /* * CVS/RCS Log * $Log: dcrlecp.h,v $ * Revision 1.6 2010-10-14 13:15:42 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.5 2009-11-04 09:58:07 uli * Switched to logging mechanism provided by the "new" oflog module * * Revision 1.4 2008-06-23 12:09:13 joergr * Fixed inconsistencies in Doxygen API documentation. * * Revision 1.3 2005/12/08 16:28:35 meichel * Changed include path schema for all DCMTK header files * * Revision 1.2 2005/07/26 17:08:33 meichel * Added option to RLE decoder that allows to correctly decode images with * incorrect byte order of byte segments (LSB instead of MSB). * * Revision 1.1 2002/06/06 14:52:35 meichel * Initial release of the new RLE codec classes * and the dcmcrle/dcmdrle tools in module dcmdata * * */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/dcvrui.h0000644000310500011400000002502011464747623021240 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Gerd Ehlers, Andreas Barth * * Purpose: Interface of class DcmUniqueIdentifier * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-11-05 09:34:11 $ * CVS/RCS Revision: $Revision: 1.30 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DCVRUI_H #define DCVRUI_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcbytstr.h" /** a class representing the DICOM value representation 'Unique Identifier' (UI) */ class DcmUniqueIdentifier : public DcmByteString { public: /** constructor. * Create new element from given tag and length. * @param tag DICOM tag for the new element * @param len value length for the new element */ DcmUniqueIdentifier(const DcmTag &tag, const Uint32 len = 0); /** copy constructor * @param old element to be copied */ DcmUniqueIdentifier(const DcmUniqueIdentifier &old); /** destructor */ virtual ~DcmUniqueIdentifier(); /** assignment operator * @param obj element to be assigned/copied * @return reference to this object */ DcmUniqueIdentifier &operator=(const DcmUniqueIdentifier &obj); /** clone method * @return deep copy of this object */ virtual DcmObject *clone() const { return new DcmUniqueIdentifier(*this); } /** Virtual object copying. This method can be used for DcmObject * and derived classes to get a deep copy of an object. Internally * the assignment operator is called if the given DcmObject parameter * is of the same type as "this" object instance. If not, an error * is returned. This function permits copying an object by value * in a virtual way which therefore is different to just calling the * assignment operator of DcmElement which could result in slicing * the object. * @param rhs - [in] The instance to copy from. Has to be of the same * class type as "this" object * @return EC_Normal if copying was successful, error otherwise */ virtual OFCondition copyFrom(const DcmObject& rhs); /** get element type identifier * @return type identifier of this class (EVR_UI) */ virtual DcmEVR ident() const; /** check whether stored value conforms to the VR and to the specified VM * @param vm value multiplicity (according to the data dictionary) to be checked for. * (valid values: "1", "1-2", "1-3", "1-8", "1-99", "1-n", "2", "2-n", "2-2n", * "3", "3-n", "3-3n", "4", "6", "9", "16", "32") * @param oldFormat parameter not used for this VR (only for DA, TM, PN) * @return status of the check, EC_Normal if value is correct, an error code otherwise */ virtual OFCondition checkValue(const OFString &vm = "1-n", const OFBool oldFormat = OFFalse); /** print element to a stream. * The output format of the value is a backslash separated sequence of string * components. In case of a single component the UID number is mapped to the * corresponding UID name (using "dcmFindNameOfUID()") if available. A "=" is * used as a prefix to distinguish the UID name from the UID number. * NB: this mapping of UID names only works for single-valued strings. * @param out output stream * @param flags optional flag used to customize the output (see DCMTypes::PF_xxx) * @param level current level of nested items. Used for indentation. * @param pixelFileName not used * @param pixelCounter not used */ virtual void print(STD_NAMESPACE ostream&out, const size_t flags = 0, const int level = 0, const char *pixelFileName = NULL, size_t *pixelCounter = NULL); /** set element value from the given character string. * If the string starts with a "=" the subsequent characters are interpreted as a * UID name and mapped to the corresponding UID number (using "dcmFindUIDFromName()") * if possible. Otherwise the leading "=" is removed. * NB: this mapping of UID names only works for single-valued input strings. * @param stringVal input character string (possibly multi-valued) * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition putString(const char *stringVal); /* --- static helper functions --- */ /** check whether given string value conforms to the VR "UI" (Unique Identifier) * and to the specified VM. * @param value string value to be checked (possibly multi-valued) * @param vm value multiplicity (according to the data dictionary) to be checked for. * (valid values: "1", "1-2", "1-3", "1-8", "1-99", "1-n", "2", "2-n", "2-2n", * "3", "3-n", "3-3n", "4", "6", "9", "16", "32") * @return status of the check, EC_Normal if value is correct, an error code otherwise */ static OFCondition checkStringValue(const OFString &value, const OFString &vm = "1-n"); protected: /** convert currently stored string value to internal representation. * It removes any leading, embedded and trailing space character and recomputes * the string length. This manipulation attempts to correct problems with * incorrectly encoded UIDs which have been observed in some images. * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition makeMachineByteString(); }; #endif // DCVRUI_H /* ** CVS/RCS Log: ** $Log: dcvrui.h,v $ ** Revision 1.30 2010-11-05 09:34:11 joergr ** Added support for checking the value multiplicity "9" (see Supplement 131). ** ** Revision 1.29 2010-10-14 13:15:43 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.28 2010-04-23 15:26:13 joergr ** Specify an appropriate default value for the "vm" parameter of checkValue(). ** ** Revision 1.27 2010-04-23 14:25:27 joergr ** Added new method to all VR classes which checks whether the stored value ** conforms to the VR definition and to the specified VM. ** ** Revision 1.26 2010-04-22 09:31:30 joergr ** Revised misleading parameter documentation for the checkValue() method. ** ** Revision 1.25 2010-04-22 08:59:11 joergr ** Added support for further VM values ("1-8", "1-99", "16", "32") to be checked. ** ** Revision 1.24 2009-08-03 09:05:30 joergr ** Added methods that check whether a given string value conforms to the VR and ** VM definitions of the DICOM standards. ** ** Revision 1.23 2008-07-17 11:19:49 onken ** Updated copyFrom() documentation. ** ** Revision 1.22 2008-07-17 10:30:23 onken ** Implemented copyFrom() method for complete DcmObject class hierarchy, which ** permits setting an instance's value from an existing object. Implemented ** assignment operator where necessary. ** ** Revision 1.21 2006-08-15 15:49:56 meichel ** Updated all code in module dcmdata to correctly compile when ** all standard C++ classes remain in namespace std. ** ** Revision 1.20 2005/12/08 16:29:12 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.19 2004/07/01 12:28:25 meichel ** Introduced virtual clone method for DcmObject and derived classes. ** ** Revision 1.18 2002/12/06 12:49:19 joergr ** Enhanced "print()" function by re-working the implementation and replacing ** the boolean "showFullData" parameter by a more general integer flag. ** Added doc++ documentation. ** Made source code formatting more consistent with other modules/files. ** ** Revision 1.17 2002/04/25 10:01:21 joergr ** Made makeMachineByteString() virtual to avoid ambiguities. ** ** Revision 1.16 2001/09/25 17:19:35 meichel ** Adapted dcmdata to class OFCondition ** ** Revision 1.15 2001/06/01 15:48:53 meichel ** Updated copyright header ** ** Revision 1.14 2000/04/14 15:31:35 meichel ** Removed default value from output stream passed to print() method. ** Required for use in multi-thread environments. ** ** Revision 1.13 2000/03/08 16:26:27 meichel ** Updated copyright header. ** ** Revision 1.12 2000/03/03 14:05:28 meichel ** Implemented library support for redirecting error messages into memory ** instead of printing them to stdout/stderr for GUI applications. ** ** Revision 1.11 2000/02/10 10:50:56 joergr ** Added new feature to dcmdump (enhanced print method of dcmdata): write ** pixel data/item value fields to raw files. ** ** Revision 1.10 1999/03/31 09:25:09 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.9 1998/11/12 16:47:56 meichel ** Implemented operator= for all classes derived from DcmObject. ** ** Revision 1.8 1997/07/21 08:25:16 andreas ** - Replace all boolean types (BOOLEAN, CTNBOOLEAN, DICOM_BOOL, BOOL) ** with one unique boolean type OFBool. ** ** Revision 1.7 1997/04/18 08:13:33 andreas ** - The put/get-methods for all VRs did not conform to the C++-Standard ** draft. Some Compilers (e.g. SUN-C++ Compiler, Metroworks ** CodeWarrier, etc.) create many warnings concerning the hiding of ** overloaded get methods in all derived classes of DcmElement. ** So the interface of all value representation classes in the ** library are changed rapidly, e.g. ** OFCondition get(Uint16 & value, const unsigned long pos); ** becomes ** OFCondition getUint16(Uint16 & value, const unsigned long pos); ** All (retired) "returntype get(...)" methods are deleted. ** For more information see dcmdata/include/dcelem.h ** ** Revision 1.6 1996/08/05 08:45:38 andreas ** new print routine with additional parameters: ** - print into files ** - fix output length for elements ** corrected error in search routine with parameter ESM_fromStackTop ** ** Revision 1.5 1996/05/30 17:19:22 hewett ** Added a makeMachineByteString() method to strip and trailing whitespace ** from a UID. ** ** Revision 1.4 1996/01/29 13:38:18 andreas ** - new put method for every VR to put value as a string ** - better and unique print methods ** ** Revision 1.3 1996/01/05 13:23:10 andreas ** - changed to support new streaming facilities ** - more cleanups ** - merged read / write methods for block and file transfer ** ** */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/dcvrpobw.h0000644000310500011400000003034711455601177021573 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Andreas Barth * * Purpose: * Interface of class DcmPolymorphOBOW for Tags that can change their VR * between OB and OW (e.g. Tag PixelData, OverlayData). This class shall * not be used directly in applications. No identification exists. * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:15:43 $ * CVS/RCS Revision: $Revision: 1.18 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DCVRPOBW_H #define DCVRPOBW_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcvrobow.h" /** a class representing DICOM elements (such as uncompressed pixel data) that can * be interpreted either as OB or as OW, i.e. are polymorph. */ class DcmPolymorphOBOW : public DcmOtherByteOtherWord { public: /** constructor * @param tag attribute tag * @param len length of the attribute value */ DcmPolymorphOBOW( const DcmTag & tag, const Uint32 len = 0); /// copy constructor DcmPolymorphOBOW( const DcmPolymorphOBOW & old); /// destructor virtual ~DcmPolymorphOBOW(); /** copy assignment operator * @param obj element to be copied */ DcmPolymorphOBOW &operator=( const DcmPolymorphOBOW &obj); /** clone method * @return deep copy of this object */ virtual DcmObject *clone() const { return new DcmPolymorphOBOW(*this); } /** Virtual object copying. This method can be used for DcmObject * and derived classes to get a deep copy of an object. Internally * the assignment operator is called if the given DcmObject parameter * is of the same type as "this" object instance. If not, an error * is returned. This function permits copying an object by value * in a virtual way which therefore is different to just calling the * assignment operator of DcmElement which could result in slicing * the object. * @param rhs - [in] The instance to copy from. Has to be of the same * class type as "this" object * @return EC_Normal if copying was successful, error otherwise */ virtual OFCondition copyFrom(const DcmObject& rhs); /** This function reads the data value of an attribute which is * captured in the input stream and captures this information * in this. If not all information for an attribute could be * read from the stream, the function returns EC_StreamNotifyClient. * Note that if certain conditions are met, this function does * not actually load the data value but creates and stores an object * that enables us to load this information later. * @param inStream The stream which contains the information. * @param ixfer The transfer syntax which was used to encode * the information in inStream. * @param glenc Encoding type for group length; specifies what * will be done with group length tags. * @param maxReadLength Maximum read length for reading an attribute value. * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition read( DcmInputStream & inStream, const E_TransferSyntax ixfer, const E_GrpLenEncoding glenc, const Uint32 maxReadLength); /** This function writes this element's value to the outstream which was * passed. When writing information, the byte ordering (little or big endian) * of the transfer syntax which was passed will be accounted for. In case the * outstream does not provide enough space for all bytes of the current * element's value, only a certain part of the value will be written to the * stream. This element's transfer state indicates if the all bytes of value * have already been written to the stream (ERW_ready), if the writing is * still in progress and more bytes need to be written to the stream * (ERW_inWork) or if the writing of the bytes of this element's value has not * even begun yet (ERW_init). The member variable fTransferredBytes indicates * how many bytes (starting from byte 0) of this element's value have already * been written to the stream. This function will return EC_Normal, if the * entire value of this element has been written to the stream, it will return * EC_StreamNotifyClient, if there is no more space in the buffer and _not_ all * bytes of this element's value have been written, and it will return some * other (error) value if there was an error. * @param outStream The stream the information will be written to. * @param oxfer The transfer syntax which shall be used. * @param enctype encoding types (undefined or explicit length) (actually unused) * @param wcache pointer to write cache object, may be NULL * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition write( DcmOutputStream &outStream, const E_TransferSyntax oxfer, const E_EncodingType enctype, DcmWriteCache *wcache); /** special write method for creation of digital signatures * @param outStream DICOM output stream * @param oxfer output transfer syntax * @param enctype encoding types (undefined or explicit length) * @param wcache pointer to write cache object, may be NULL * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition writeSignatureFormat( DcmOutputStream &outStream, const E_TransferSyntax oxfer, const E_EncodingType enctype, DcmWriteCache *wcache); /** initialize the transfer state of this object. This method must be called * before this object is written to a stream or read (parsed) from a stream. */ virtual void transferInit(); /** finalize the transfer state of this object. This method must be called * when reading/writing this object from/to a stream has been completed. */ virtual void transferEnd(); /** get a pointer to the element value of the current element as type string. * Requires element to be of corresponding VR, otherwise an error is returned. * This method does not copy, but returns a pointer to the element value, * which remains under control of this object and is valid only until the next * read, write or put operation. * @param val pointer to value returned in this parameter upon success * @return EC_Normal upon success, an error code otherwise */ virtual OFCondition getUint8Array(Uint8 *&val); // for bytes /** get a pointer to the element value of the current element as type Uint16. * Requires element to be of corresponding VR, otherwise an error is returned. * This method does not copy, but returns a pointer to the element value, * which remains under control of this object and is valid only until the next * read, write or put operation. * @param val pointer to value returned in this parameter upon success * @return EC_Normal upon success, an error code otherwise */ virtual OFCondition getUint16Array(Uint16 *&val); /** replace the element value by a copy of the given Uint8 array (which is possibly multi-valued). * Requires element to be of corresponding VR, otherwise an error is returned. * @param vals new attribute value * @param num number of values in array vals * @return EC_Normal upon success, an error code otherwise */ virtual OFCondition putUint8Array(const Uint8 *vals, const unsigned long num); /** replace the element value by a copy of the given Uint16 array (which is possibly multi-valued). * Requires element to be of corresponding VR, otherwise an error is returned. * @param vals new attribute value * @param num number of values in array vals * @return EC_Normal upon success, an error code otherwise */ virtual OFCondition putUint16Array(const Uint16 *vals, const unsigned long num); /** create an empty Uint8 array of given number of bytes and set it. * All array elements are initialized with a value of 0 (using 'memzero'). * This method is only applicable to certain VRs, e.g. OB. * @param numBytes number of bytes (8 bit) to be created * @param bytes stores the pointer to the resulting buffer * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition createUint8Array( const Uint32 numBytes, Uint8 * & bytes); /** create an empty Uint16 array of given number of words and set it. * All array elements are initialized with a value of 0 (using 'memzero'). * This method is only applicable to OW data. * @param numWords number of words (16 bit) to be created * @param words stores the pointer to the resulting buffer * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition createUint16Array( const Uint32 numWords, Uint16 * & words); private: /** this flag is used during write operations in Implicit VR Little Endian * and notes that the VR has temporarily been changed from OB to OW * at the beginning to the write operation and needs to be changed back once the * operation has finished. */ OFBool changeVR; /// the current VR of value field, which can change over time DcmEVR currentVR; }; #endif /* ** CVS/RCS Log: ** $Log: dcvrpobw.h,v $ ** Revision 1.18 2010-10-14 13:15:43 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.17 2008-07-17 11:19:49 onken ** Updated copyFrom() documentation. ** ** Revision 1.16 2008-07-17 10:30:23 onken ** Implemented copyFrom() method for complete DcmObject class hierarchy, which ** permits setting an instance's value from an existing object. Implemented ** assignment operator where necessary. ** ** Revision 1.15 2007-11-29 14:30:19 meichel ** Write methods now handle large raw data elements (such as pixel data) ** without loading everything into memory. This allows very large images to ** be sent over a network connection, or to be copied without ever being ** fully in memory. ** ** Revision 1.14 2007/06/07 09:00:59 joergr ** Fixed incorrect comment. ** ** Revision 1.13 2005/12/08 16:29:06 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.12 2004/07/01 12:28:25 meichel ** Introduced virtual clone method for DcmObject and derived classes. ** ** Revision 1.11 2002/09/12 14:07:16 joergr ** Added method "createUint8Array" which works similar to the 16 bit variant. ** ** Revision 1.10 2002/08/27 16:55:40 meichel ** Initial release of new DICOM I/O stream classes that add support for stream ** compression (deflated little endian explicit VR transfer syntax) ** ** Revision 1.9 2001/09/25 17:19:33 meichel ** Adapted dcmdata to class OFCondition ** ** Revision 1.8 2001/06/01 15:48:52 meichel ** Updated copyright header ** ** Revision 1.7 2001/05/10 12:52:56 meichel ** Added public createUint16Array() method in class DcmPolymorphOBOW. ** ** Revision 1.6 2000/11/07 16:56:11 meichel ** Initial release of dcmsign module for DICOM Digital Signatures ** ** Revision 1.5 2000/03/08 16:26:25 meichel ** Updated copyright header. ** ** Revision 1.4 1999/03/31 09:25:05 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.3 1998/11/12 16:47:53 meichel ** Implemented operator= for all classes derived from DcmObject. ** ** Revision 1.2 1997/07/31 06:59:00 andreas ** Error correction and additonal functionality for ** DcmPolymorphOBOW to support getting and putting of Uint8 and ** Uint16 data independent of the VR. ** ** Revision 1.1 1997/07/21 07:54:00 andreas ** - Support for CP 14. PixelData and OverlayData can have VR OW or OB ** (depending on the transfer syntax). New internal value ** representation (only for ident()) for OverlayData. ** */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/dcostrmf.h0000644000310500011400000001152011455601175021554 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Marco Eichelberg * * Purpose: DcmOutputFileStream and related classes, * implements streamed output to files. * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:15:41 $ * CVS/RCS Revision: $Revision: 1.7 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DCOSTRMF_H #define DCOSTRMF_H #include "dcmtk/config/osconfig.h" #include "dcmtk/dcmdata/dcostrma.h" #define INCLUDE_CSTDIO #include "dcmtk/ofstd/ofstdinc.h" /** consumer class that stores data in a plain file. */ class DcmFileConsumer: public DcmConsumer { public: /** constructor * @param filename name of file to be created, must not be NULL or empty */ DcmFileConsumer(const char *filename); /** constructor * @param file structure, file must already be open for writing */ DcmFileConsumer(FILE *file); /// destructor virtual ~DcmFileConsumer(); /** returns the status of the consumer. Unless the status is good, * the consumer will not permit any operation. * @return status, true if good */ virtual OFBool good() const; /** returns the status of the consumer as an OFCondition object. * Unless the status is good, the consumer will not permit any operation. * @return status, EC_Normal if good */ virtual OFCondition status() const; /** returns true if the consumer is flushed, i.e. has no more data * pending in it's internal state that needs to be flushed before * the stream is closed. * @return true if consumer is flushed, false otherwise */ virtual OFBool isFlushed() const; /** returns the minimum number of bytes that can be written with the * next call to write(). The DcmObject write methods rely on avail * to return a value > 0 if there is no I/O suspension since certain * data such as tag and length are only written "en bloc", i.e. all * or nothing. * @return minimum of space available in consumer */ virtual offile_off_t avail() const; /** processes as many bytes as possible from the given input block. * @param buf pointer to memory block, must not be NULL * @param buflen length of memory block * @return number of bytes actually processed. */ virtual offile_off_t write(const void *buf, offile_off_t buflen); /** instructs the consumer to flush its internal content until * either the consumer becomes "flushed" or I/O suspension occurs. * After a call to flush(), a call to write() will produce undefined * behaviour. */ virtual void flush(); private: /// private unimplemented copy constructor DcmFileConsumer(const DcmFileConsumer&); /// private unimplemented copy assignment operator DcmFileConsumer& operator=(const DcmFileConsumer&); /// the file we're actually writing to OFFile file_; /// status OFCondition status_; }; /** output stream that writes into a plain file */ class DcmOutputFileStream: public DcmOutputStream { public: /** constructor * @param filename name of file to be created, must not be NULL or empty */ DcmOutputFileStream(const char *filename); /** constructor * @param file structure, file must already be open for writing */ DcmOutputFileStream(FILE *file); /// destructor virtual ~DcmOutputFileStream(); private: /// private unimplemented copy constructor DcmOutputFileStream(const DcmOutputFileStream&); /// private unimplemented copy assignment operator DcmOutputFileStream& operator=(const DcmOutputFileStream&); /// the final consumer of the filter chain DcmFileConsumer consumer_; }; #endif /* * CVS/RCS Log: * $Log: dcostrmf.h,v $ * Revision 1.7 2010-10-14 13:15:41 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.6 2009-11-04 09:58:07 uli * Switched to logging mechanism provided by the "new" oflog module * * Revision 1.5 2007-02-19 16:06:09 meichel * Class DcmOutputStream and related classes are now safe for use with * large files (2 GBytes or more) if supported by compiler and operating system. * * Revision 1.4 2005/12/08 16:28:26 meichel * Changed include path schema for all DCMTK header files * * Revision 1.3 2003/11/07 13:49:08 meichel * Added constructor taking an open FILE* instead of a file name string * * Revision 1.2 2002/11/27 12:07:22 meichel * Adapted module dcmdata to use of new header file ofstdinc.h * * Revision 1.1 2002/08/27 16:55:37 meichel * Initial release of new DICOM I/O stream classes that add support for stream * compression (deflated little endian explicit VR transfer syntax) * * */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/dcdicdir.h0000644000310500011400000003362711470236223021507 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Gerd Ehlers, Andreas Barth * * Purpose: Interface of class DcmDicomDir * * Last Update: $Author: uli $ * Update Date: $Date: 2010-11-15 13:58:43 $ * CVS/RCS Revision: $Revision: 1.28 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DCDICDIR_H #define DCDICDIR_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcdirrec.h" #include "dcmtk/dcmdata/dcvrulup.h" #define DEFAULT_DICOMDIR_NAME "DICOMDIR" #define TEMPNAME_TEMPLATE "DDXXXXXX" #define DICOMDIR_BACKUP_SUFFIX ".$$$" #define DICOMDIR_DEFAULT_TRANSFERSYNTAX EXS_LittleEndianExplicit /** helper structure for item offsets */ typedef struct { /// DICOM item containing a directory record DcmItem *item; /// offset in file for this item Uint32 fileOffset; } ItemOffset; /** this class implements support for DICOMDIR files, which are special DICOM files * containing a list of directory records, with a logical tree structure being * implemented through references between records as byte offsets in file. */ class DcmDicomDir { public: /// default constructor DcmDicomDir(); /** constructor * @param fileName filename to read a DICOMDIR from. If NULL, an attempt is * made to read file DEFAULT_DICOMDIR_NAME ("DICOMDIR"). * @param fileSetID file set ID of this file set, used only for new DICOMDIRs */ DcmDicomDir( const char *fileName, const char *fileSetID = NULL ); // only used for new DICOMDIR /// destructor. If DICOMDIR was modified, writes new file. virtual ~DcmDicomDir(); /** print all elements of the item to a stream * @param out output stream * @param flags optional flag used to customize the output (see DCMTypes::PF_xxx) * @param level current level of nested items. Used for indentation. * @param pixelFileName not used * @param pixelCounter not used */ virtual void print(STD_NAMESPACE ostream&out, const size_t flags = 0, const int level = 0, const char *pixelFileName = NULL, size_t *pixelCounter = NULL); /// returns current status flag virtual OFCondition error(); /** returns reference to DICOM file from which DICOMDIR was read. * Note, this file may be obsolete if the DICOMDIR was modified * @return reference to DICOM file */ virtual DcmFileFormat& getDirFileFormat(); /** returns file name from which DICOMDIR was read. * @return filename of DICOMDIR */ virtual const char* getDirFileName(); /// returns root directory record virtual DcmDirectoryRecord& getRootRecord(); /// returns container in which all MRDR (multi-reference directory records) are stored virtual DcmSequenceOfItems& getMRDRSequence(); /** look up directory record for the given referenced file ID (not OS file path) * @return directory record if found, NULL otherwise */ virtual DcmDirectoryRecord* matchFilename( const char *filename ); /** look up MRDR for the given referenced file ID (not OS file path). * If there is none yet, create one. * @return MRDR for given referenced file ID */ virtual DcmDirectoryRecord* matchOrCreateMRDR( const char *filename ); /** writes DICOMDIR to file * @param oxfer must be DICOMDIR_DEFAULT_TRANSFERSYNTAX * @param enctype encoding type for sequences * @param glenc encoding type for group lengths * @return status, EC_Normal if value length is correct, an error code otherwise */ virtual OFCondition write( const E_TransferSyntax oxfer = DICOMDIR_DEFAULT_TRANSFERSYNTAX, const E_EncodingType enctype = EET_UndefinedLength, const E_GrpLenEncoding glenc = EGL_withoutGL ); /** check the currently stored element value * @param autocorrect correct value length if OFTrue * @return status, EC_Normal if value length is correct, an error code otherwise */ virtual OFCondition verify( OFBool autocorrect = OFFalse ); protected: // Manipulation of member variables OFCondition createNewElements(const char* fileSetID); // in DcmDataset& getDataset(void); // side-effect free methods for manipulation and conversion DcmSequenceOfItems& getDirRecSeq( DcmDataset &dset ); // inout DcmUnsignedLongOffset* lookForOffsetElem( DcmObject *obj, // in const DcmTagKey &offsetTag ); // in DcmDirectoryRecord* recurseMatchFile( DcmDirectoryRecord* startRec, // in const char *filename ); // in DcmDirectoryRecord* searchMatchFile( DcmSequenceOfItems& recSeq, // in const char *filename ); // in OFCondition resolveGivenOffsets( DcmObject *startPoint, // inout ItemOffset *itOffsets, // in const unsigned long numOffsets, // in const DcmTagKey &offsetTag ); // in OFCondition resolveAllOffsets( DcmDataset &dset ); // inout OFCondition linkMRDRtoRecord( DcmDirectoryRecord *dRec ); // inout OFCondition moveRecordToTree( DcmDirectoryRecord *startRec, // in DcmSequenceOfItems &fromDirSQ, // inout DcmDirectoryRecord *toRecord ); // inout OFCondition moveMRDRbetweenSQs( DcmSequenceOfItems &fromSQ, // in DcmSequenceOfItems &toDirSQ ); // inout Uint32 lengthUntilSQ( DcmDataset &dset, // in E_TransferSyntax oxfer, // in E_EncodingType enctype ); // in Uint32 lengthOfRecord( DcmItem *item, // in E_TransferSyntax oxfer, // in E_EncodingType enctype ); // in OFCondition convertGivenPointer( DcmObject *startPoint, // inout ItemOffset *itOffsets, // in const unsigned long numOffsets, // in const DcmTagKey &offsetTag ); // in OFCondition convertAllPointer( DcmDataset &dset, // inout Uint32 beginOfFileSet, // in E_TransferSyntax oxfer, // in E_EncodingType enctype ); // in OFCondition copyRecordPtrToSQ( DcmDirectoryRecord *record, // in DcmSequenceOfItems &toDirSQ, // inout DcmDirectoryRecord **firstRec, // out DcmDirectoryRecord **lastRec ); // out OFCondition insertMediaSOPUID( DcmMetaInfo &metaInfo ); // inout OFCondition countMRDRRefs( DcmDirectoryRecord *startRec, // in ItemOffset *refCounter, // inout const unsigned long numCounters ); // in OFCondition checkMRDRRefCounter( DcmDirectoryRecord *startRec, // in ItemOffset *refCounter, // inout const unsigned long numCounters ); // in // complete re-organization of the managed directory records (side effect) OFCondition convertLinearToTree(); OFCondition convertTreeToLinear( Uint32 beginOfFileSet, // in E_TransferSyntax oxfer, // in E_EncodingType enctype, // in E_GrpLenEncoding glenc, // in DcmSequenceOfItems &unresRecs);// inout private: /// private undefined copy assignment operator DcmDicomDir &operator=(const DcmDicomDir &); /// private undefined copy constructor DcmDicomDir( const DcmDicomDir &newDir ); /// condition flag OFCondition errorFlag; /// file name the DICOMDIR was read from, or DEFAULT_DICOMDIR_NAME char * dicomDirFileName; /** flag indicating whether or not this DICOMDIR has been modified after being read from file. * If true, the destructor of this class will write the modified DICOMDIR back to file */ OFBool modified; /// flag indicating whether the DICOM file in DirFile needs to be re-created upon writing OFBool mustCreateNewDir; /** DICOM file into which a DICOMDIR is read first before the logical tree * structure is created. */ DcmFileFormat * DirFile; /// root directory record of this DICOMDIR DcmDirectoryRecord * RootRec; /// container in which all MRDR (multi-reference directory records) for this DICOMDIR are kept DcmSequenceOfItems * MRDRSeq; }; #endif // DCDICDIR_H /* ** CVS/RCS Log: ** $Log: dcdicdir.h,v $ ** Revision 1.28 2010-11-15 13:58:43 uli ** Fixed some errors in doxygen comments. ** ** Revision 1.27 2010-10-14 13:15:40 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.26 2010-08-18 15:13:26 joergr ** Added const specifier to char pointers where appropriate. Thanks to forum ** user "takeos" for the report. ** ** Revision 1.25 2010-03-01 09:08:44 uli ** Removed some unnecessary include directives in the headers. ** ** Revision 1.24 2010-02-22 11:39:53 uli ** Remove some unneeded includes. ** ** Revision 1.23 2009-11-04 09:58:07 uli ** Switched to logging mechanism provided by the "new" oflog module ** ** Revision 1.22 2007-11-29 14:30:19 meichel ** Write methods now handle large raw data elements (such as pixel data) ** without loading everything into memory. This allows very large images to ** be sent over a network connection, or to be copied without ever being ** fully in memory. ** ** Revision 1.21 2007/06/29 14:17:49 meichel ** Code clean-up: Most member variables in module dcmdata are now private, ** not protected anymore. ** ** Revision 1.20 2006/08/15 15:49:56 meichel ** Updated all code in module dcmdata to correctly compile when ** all standard C++ classes remain in namespace std. ** ** Revision 1.19 2005/12/08 16:28:07 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.18 2005/11/07 16:59:24 meichel ** Cleaned up some copy constructors in the DcmObject hierarchy. ** ** Revision 1.17 2003/08/14 09:00:56 meichel ** Adapted type casts to new-style typecast operators defined in ofcast.h ** ** Revision 1.16 2002/12/06 12:49:09 joergr ** Enhanced "print()" function by re-working the implementation and replacing ** the boolean "showFullData" parameter by a more general integer flag. ** Added doc++ documentation. ** Made source code formatting more consistent with other modules/files. ** ** Revision 1.15 2001/09/25 17:19:25 meichel ** Adapted dcmdata to class OFCondition ** ** Revision 1.14 2001/06/01 15:48:36 meichel ** Updated copyright header ** ** Revision 1.13 2000/04/14 15:31:31 meichel ** Removed default value from output stream passed to print() method. ** Required for use in multi-thread environments. ** ** Revision 1.12 2000/03/08 16:26:12 meichel ** Updated copyright header. ** ** Revision 1.11 2000/03/03 14:05:23 meichel ** Implemented library support for redirecting error messages into memory ** instead of printing them to stdout/stderr for GUI applications. ** ** Revision 1.10 2000/02/10 10:50:50 joergr ** Added new feature to dcmdump (enhanced print method of dcmdata): write ** pixel data/item value fields to raw files. ** ** Revision 1.9 1999/03/31 09:24:34 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.8 1998/07/15 15:48:44 joergr ** Removed several compiler warnings reported by gcc 2.8.1 with ** additional options, e.g. missing copy constructors and assignment ** operators, initialization of member variables in the body of a ** constructor instead of the member initialization list, hiding of ** methods by use of identical names, uninitialized member variables, ** missing const declaration of char pointers. Replaced tabs by spaces. ** ** Revision 1.7 1997/09/11 15:02:16 hewett ** Changed DcmDicomDir constructor to take const char* arguments. ** ** Revision 1.6 1997/07/21 08:25:06 andreas ** - Replace all boolean types (BOOLEAN, CTNBOOLEAN, DICOM_BOOL, BOOL) ** with one unique boolean type OFBool. ** ** Revision 1.5 1997/05/16 08:31:19 andreas ** - Revised handling of GroupLength elements and support of ** DataSetTrailingPadding elements. The enumeratio E_GrpLenEncoding ** got additional enumeration values (for a description see dctypes.h). ** addGroupLength and removeGroupLength methods are replaced by ** computeGroupLengthAndPadding. To support Padding, the parameters of ** element and sequence write functions changed. ** ** Revision 1.4 1997/04/24 12:08:28 hewett ** Fixed DICOMDIR generation bug affecting inclusion of Group Length ** attributes (file offsets were not being computed correctly). ** ** Revision 1.3 1996/08/05 08:45:18 andreas ** new print routine with additional parameters: ** - print into files ** - fix output length for elements ** corrected error in search routine with parameter ESM_fromStackTop ** ** Revision 1.2 1996/01/05 13:22:54 andreas ** - changed to support new streaming facilities ** - more cleanups ** - merged read / write methods for block and file transfer ** */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/dcistrmz.h0000644000310500011400000001554211455601175021602 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Marco Eichelberg * * Purpose: zlib compression filter for input streams * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:15:41 $ * CVS/RCS Revision: $Revision: 1.5 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DCISTRMZ_H #define DCISTRMZ_H #include "dcmtk/config/osconfig.h" #ifdef WITH_ZLIB #include "dcmtk/dcmdata/dcistrma.h" /* for DcmInputFilter */ BEGIN_EXTERN_C #include END_EXTERN_C /** global flag defining the behaviour of the zlib decompressor. * When true, the input stream is expected to be in deflated ZLIB format * instead of deflated bitstream format (i.e. RFC 1950 instead of RFC 1951). * Default is false, i.e. DICOM compliant behavior. */ extern OFGlobal dcmZlibExpectRFC1950Encoding; /** zlib compression filter for input streams */ class DcmZLibInputFilter: public DcmInputFilter { public: /// default constructor DcmZLibInputFilter(); /// destructor virtual ~DcmZLibInputFilter(); /** returns the status of the producer. Unless the status is good, * the producer will not permit any operation. * @return status, true if good */ virtual OFBool good() const; /** returns the status of the producer as an OFCondition object. * Unless the status is good, the producer will not permit any operation. * @return status, EC_Normal if good */ virtual OFCondition status() const; /** returns true if the producer is at the end of stream. * @return true if end of stream, false otherwise */ virtual OFBool eos(); /** returns the minimum number of bytes that can be read with the * next call to read(). The DcmObject read methods rely on avail * to return a value > 0 if there is no I/O suspension since certain * data such as tag and length are only read "en bloc", i.e. all * or nothing. * @return minimum of data available in producer */ virtual offile_off_t avail(); /** reads as many bytes as possible into the given block. * @param buf pointer to memory block, must not be NULL * @param buflen length of memory block * @return number of bytes actually read. */ virtual offile_off_t read(void *buf, offile_off_t buflen); /** skips over the given number of bytes (or less) * @param skiplen number of bytes to skip * @return number of bytes actually skipped. */ virtual offile_off_t skip(offile_off_t skiplen); /** resets the stream to the position by the given number of bytes. * @param num number of bytes to putback. If the putback operation * fails, the producer status becomes bad. */ virtual void putback(offile_off_t num); /** determines the producer from which the filter is supposed * to read it's input. Once a producer for the input filter has * been defined, it cannot be changed anymore during the lifetime * of the object. * @param producer reference to producer, must not be circular chain */ virtual void append(DcmProducer& producer); private: /// private unimplemented copy constructor DcmZLibInputFilter(const DcmZLibInputFilter&); /// private unimplemented copy assignment operator DcmZLibInputFilter& operator=(const DcmZLibInputFilter&); /** reads data from the producer into the input ring buffer * until the input ring buffer becomes full or the * producer suspends * @return number of bytes added to input buffer */ offile_off_t fillInputBuffer(); /** decompress data into the given output block until * complete or no more input is available in the input ring buffer. * does not re-fill the input ring buffer from the producer. * @param buf pointer to input data * @param buflen number of bytes in buf * @return number of bytes processed */ offile_off_t decompress(const void *buf, offile_off_t buflen); /** reads and decompresses data from the producer * until the producer suspends or the output ring buffer becomes full. */ void fillOutputBuffer(); /** writes the content of the output ring buffer * to the next filter stage until the output ring buffer * becomes empty or the next filter stage becomes full */ void flushOutputBuffer(); /** copies as much of the given block of data as possible * in the input ring buffer * @param buf pointer to input data * @param buflen number of bytes in buf * @return number of bytes copied to input ring buffer */ offile_off_t fillInputBuffer(const void *buf, offile_off_t buflen); /** feed data from the input ring buffer to the compression * codec until complete or the output ring buffer becomes full. * Does not flush the output ring buffer. * @param finalize true if the content of the input ring buffer * constitutes the end of the input stream, i.e. the compression codec * should be forced to flush its internal state. */ void compressInputBuffer(OFBool finalize); /// pointer to producer from which compressed input is read DcmProducer *current_; /// pointer to struct z_stream object containing the zlib status z_streamp zstream_; /// status OFCondition status_; /// true if the zlib object has reported Z_STREAM_END OFBool eos_; /// input ring buffer unsigned char *inputBuf_; /// offset of first byte in input ring buffer offile_off_t inputBufStart_; /// number of bytes in input ring buffer offile_off_t inputBufCount_; /// output ring buffer unsigned char *outputBuf_; /// offset of first byte in output ring buffer offile_off_t outputBufStart_; /// number of bytes available for read in output ring buffer offile_off_t outputBufCount_; /// number of putback bytes in output ring buffer offile_off_t outputBufPutback_; /// flag indicating whether or not a pad byte has been appended to the input stream OFBool padded_; }; #endif #endif /* * CVS/RCS Log: * $Log: dcistrmz.h,v $ * Revision 1.5 2010-10-14 13:15:41 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.4 2008-06-23 12:09:13 joergr * Fixed inconsistencies in Doxygen API documentation. * * Revision 1.3 2007/02/19 15:45:41 meichel * Class DcmInputStream and related classes are now safe for use with * large files (2 GBytes or more) if supported by compiler and operating system. * * Revision 1.2 2005/12/08 16:28:18 meichel * Changed include path schema for all DCMTK header files * * Revision 1.1 2002/08/27 16:55:34 meichel * Initial release of new DICOM I/O stream classes that add support for stream * compression (deflated little endian explicit VR transfer syntax) * * */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/dcvr.h0000644000310500011400000002425411455601176020702 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Gerd Ehlers, Andreas Barth, Andrew Hewett * * Purpose: Definition of the DcmVR class for Value Representation * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:15:42 $ * CVS/RCS Revision: $Revision: 1.28 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DCMVR_H #define DCMVR_H 1 #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/ofstd/ofglobal.h" /** Global flag to enable/disable the generation of VR=UN */ extern OFGlobal dcmEnableUnknownVRGeneration; /* default OFTrue */ /** Global flag to enable/disable the generation of VR=UT */ extern OFGlobal dcmEnableUnlimitedTextVRGeneration; /* default OFTrue */ /** Global flag to enable/disable the automatic re-conversion of defined * length UN elements read in an explicit VR transfer syntax, if the real * VR is defined in the data dictionary. */ extern OFGlobal dcmEnableUnknownVRConversion; /* default OFFalse */ /* ** VR Enumerations. ** NB: The order of entries has to conform to the order in DcmVRDict (see dcmvr.cc)! ** If not an error message is reported and the program aborts (only in DEBUG mode). */ enum DcmEVR { /// application entity title EVR_AE, /// age string EVR_AS, /// attribute tag EVR_AT, /// code string EVR_CS, /// date string EVR_DA, /// decimal string EVR_DS, /// date time string EVR_DT, /// float single-precision EVR_FL, /// float double-precision EVR_FD, /// integer string EVR_IS, /// long string EVR_LO, /// long text EVR_LT, /// other byte EVR_OB, /// other float EVR_OF, /// other word EVR_OW, /// person name EVR_PN, /// short string EVR_SH, /// signed long EVR_SL, /// sequence of items EVR_SQ, /// signed short EVR_SS, /// short text EVR_ST, /// time string EVR_TM, /// unique identifier EVR_UI, /// unsigned long EVR_UL, /// unsigned short EVR_US, /// unlimited text EVR_UT, /// OB or OW depending on context EVR_ox, /// SS or US depending on context EVR_xs, /// US, SS or OW depending on context, used for LUT Data (thus the name) EVR_lt, /// na="not applicable", for data which has no VR EVR_na, /// up="unsigned pointer", used internally for DICOMDIR suppor EVR_up, /// used internally for items EVR_item, /// used internally for meta info datasets EVR_metainfo, /// used internally for datasets EVR_dataset, /// used internally for DICOM files EVR_fileFormat, /// used internally for DICOMDIR objects EVR_dicomDir, /// used internally for DICOMDIR records EVR_dirRecord, /// used internally for pixel sequences in a compressed image EVR_pixelSQ, /// used internally for pixel items in a compressed image EVR_pixelItem, /// used internally for elements with unknown VR (encoded with 4-byte length field in explicit VR) EVR_UNKNOWN, /// unknown value representation EVR_UN, /// used internally for uncompressed pixeld data EVR_PixelData, /// used internally for overlay data EVR_OverlayData, /// used internally for elements with unknown VR with 2-byte length field in explicit VR EVR_UNKNOWN2B }; /** a class representing a DICOM Value Representation */ class DcmVR { public: /// default constructor DcmVR() : vr(EVR_UNKNOWN) { } /** constructor * @param evr enumerated VR value */ DcmVR(DcmEVR evr) : vr(EVR_UNKNOWN) { // the set method is safeguarded against incorrect passing of integer values setVR(evr); } /** constructor * @param vrName symbolic name of value representation */ DcmVR(const char* vrName) : vr(EVR_UNKNOWN) { setVR(vrName); } /** copy constructor * @param avr VR value */ DcmVR(const DcmVR& avr) : vr(avr.vr) { } /** assign new VR value * @param evr enumerated VR value */ void setVR(DcmEVR evr); /** assign new VR value by name * @param vrName symbolic name of value representation */ void setVR(const char* vrName); /** assign new VR value * @param avr VR value */ void setVR(const DcmVR& avr) { vr = avr.vr; } /** copy assignment operator * @param arg vr to assign from */ DcmVR& operator=(const DcmVR& arg) { vr = arg.vr; return *this; } /** get enumerated VR managed by this object * @return enumerated VR */ DcmEVR getEVR() const { return vr; } /** get enumerated standard VR managed by this object. * If this object manages a non-standard, internal VR such as EVR_ox, * this method returns the enumerated VR to which the internal VR will * be mapped when writing the DICOM object. * @return enumerated VR */ DcmEVR getValidEVR() const; /** get symbolic VR name for this object * @return VR name string, never NULL */ const char* getVRName() const ; /** get symbolic standard VR name for this object * If this object manages a non-standard, internal VR such as EVR_ox, * this method returns the name of the VR to which the internal VR will * be mapped when writing the DICOM object. * @return VR name string, never NULL */ const char* getValidVRName() const; /** compute the size for non-empty values of this VR. * For fixed size VRs such as OW, US, SL, the method returns the size * of each value, in bytes. For variable length VRs (strings), it returns 1. * For internal VRs it returns 0. * @return size of values of this VR */ size_t getValueWidth() const; /** returns true if VR is a standard DICOM VR * @return true if VR is a standard DICOM VR */ OFBool isStandard() const; /** returns true if VR is for internal use only * @return true if VR is for internal use only */ OFBool isForInternalUseOnly() const; /** returns true if VR represents a string * @return true if VR represents a string */ OFBool isaString() const; /** returns true if VR uses an extended length encoding for explicit transfer syntaxes * @return true if VR uses an extended length encoding for explicit transfer syntaxes */ OFBool usesExtendedLengthEncoding() const; /** check if VRs are equivalent * VRs are considered equivalent if equal or if one of them is an internal VR * and the other one is a possible standard VR to which the internal one maps. * @param avr VR to compare with * @return true if VRs are equivalent, false otherwise */ OFBool isEquivalent(const DcmVR& avr) const; /* minimum and maximum length of a value with this VR ** (in bytes assuming single byte characters) */ /** return minimum length of a value with this VR (in bytes), assuming single byte characters * @return minimum length of a value */ Uint32 getMinValueLength() const; /** return maximum length of a value with this VR (in bytes), assuming single byte characters * @return maximum length of a value */ Uint32 getMaxValueLength() const; private: /// the enumerated VR value DcmEVR vr; }; #endif /* !DCMVR_H */ /* * CVS/RCS Log: * $Log: dcvr.h,v $ * Revision 1.28 2010-10-14 13:15:42 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.27 2010-03-01 09:08:45 uli * Removed some unnecessary include directives in the headers. * * Revision 1.26 2008-06-23 12:09:13 joergr * Fixed inconsistencies in Doxygen API documentation. * * Revision 1.25 2007/11/29 14:30:35 meichel * Updated doxygen API documentation * * Revision 1.24 2005/12/08 16:28:50 meichel * Changed include path schema for all DCMTK header files * * Revision 1.23 2005/11/15 18:28:02 meichel * Added new global flag dcmEnableUnknownVRConversion that enables the automatic * re-conversion of defined length UN elements read in an explicit VR transfer * syntax, if the real VR is defined in the data dictionary. Default is OFFalse, * i.e. to retain the previous behavior. * * Revision 1.22 2005/11/15 16:59:24 meichel * Added new pseudo VR type EVR_lt that is used for LUT Data when read in * implicit VR, which may be US, SS or OW. DCMTK always treats EVR_lt like OW. * * Revision 1.21 2003/06/12 13:31:46 joergr * Fixed inconsistent API documentation reported by Doxygen. * * Revision 1.20 2003/03/21 13:06:46 meichel * Minor code purifications for warnings reported by MSVC in Level 4 * * Revision 1.19 2002/12/06 12:20:19 joergr * Added support for new value representation Other Float String (OF). * * Revision 1.18 2002/11/27 12:07:24 meichel * Adapted module dcmdata to use of new header file ofstdinc.h * * Revision 1.17 2001/06/01 15:48:47 meichel * Updated copyright header * * Revision 1.16 2000/04/14 15:42:56 meichel * Global VR generation flags are now derived from OFGlobal and, thus, * safe for use in multi-thread applications. * * Revision 1.15 2000/03/08 16:26:21 meichel * Updated copyright header. * * Revision 1.14 2000/02/29 11:48:38 meichel * Removed support for VS value representation. This was proposed in CP 101 * but never became part of the standard. * * Revision 1.13 2000/02/23 15:11:42 meichel * Corrected macro for Borland C++ Builder 4 workaround. * * Revision 1.12 2000/02/01 10:12:03 meichel * Avoiding to include as extern "C" on Borland C++ Builder 4, * workaround for bug in compiler header files. * * Revision 1.11 1999/06/10 10:44:51 meichel * Replaced some #if statements by more robust #ifdef * * Revision 1.10 1999/03/31 09:24:54 meichel * Updated copyright header in module dcmdata * * */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/dcpixel.h0000644000310500011400000007533311455601175021377 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Andreas Barth * * Purpose: Interface of class DcmPixelData * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:15:41 $ * CVS/RCS Revision: $Revision: 1.40 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DCPIXEL_H #define DCPIXEL_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcvrpobw.h" #include "dcmtk/ofstd/oflist.h" class DcmCodec; class DcmCodecList; class DcmItem; class DcmPixelData; class DcmPixelSequence; class DcmRepresentationEntry; class DcmStack; /** abstract base class for codec representation parameter sets. * A codec parameter set subclass is implemented for each codec and passed to the codec * by the encode() and decode() routines. It is supposed to contain data that may vary * between compressed image representations using the same transfer syntax, * for example the quality factor or compression factor for lossy compression. */ class DcmRepresentationParameter { public: /// default constructor DcmRepresentationParameter() {} /// copy constructor DcmRepresentationParameter(const DcmRepresentationParameter&) {} /// destructor virtual ~DcmRepresentationParameter() {} /** this methods creates a copy of type DcmRepresentationParameter * * it must be overweritten in every subclass. * @return copy of this object */ virtual DcmRepresentationParameter *clone() const = 0; /** returns the class name as string. * can be used in operator== as poor man's RTTI replacement. */ virtual const char *className() const = 0; /** compares an object to another DcmRepresentationParameter. * Implementation must make sure that classes are comparable. * @param arg representation parameter to compare with * @return true if equal, false otherwise. */ virtual OFBool operator==(const DcmRepresentationParameter &arg) const = 0; }; /** an object of this class maintains one compression "version" * of a PixelData element within a DICOM dataset. There can be * multiple compressed versions in parallel, with different * transfer syntaxes (compression algorithms) or representation * parameters (e.g. compression factors). */ class DcmRepresentationEntry { /** constructor * @param rt transfer syntax * @param rp pointer to representation parameter on heap, * will be deleted when this object destructs. * @param pixSeq pointer to pixel sequence on heap, * will be deleted when this object destructs. */ DcmRepresentationEntry( const E_TransferSyntax rt, const DcmRepresentationParameter * rp, DcmPixelSequence * pixSeq); /// copy constructor DcmRepresentationEntry(const DcmRepresentationEntry &oldEntry); /// destructor ~DcmRepresentationEntry(); /// comparison operator OFBool operator==(const DcmRepresentationEntry& x) const; /// comparison operator OFBool operator!=(const DcmRepresentationEntry & x) const { return !(*this == x); } private: /// private undefined copy assignment operator DcmRepresentationEntry &operator=(const DcmRepresentationEntry &); /// transfer syntax E_TransferSyntax repType; /// representation parameter for this pixel sequence DcmRepresentationParameter * repParam; /// the compressed pixel sequence itself DcmPixelSequence * pixSeq; friend class DcmPixelData; }; /// list of DcmRepresentationEntry objects typedef OFList DcmRepresentationList; /// iterator for list of DcmRepresentationEntry objects typedef OFListIterator(DcmRepresentationEntry *) DcmRepresentationListIterator; /// const iterator for list of DcmRepresentationEntry objects typedef OFListConstIterator(DcmRepresentationEntry *) DcmRepresentationListConstIterator; /** The class DcmPixelData stores different pixel representations identified by * a type (the transfer syntax) and some representation parameters * The three unencapsulated transfer syntaxes belong to the same pixel * representation. * A type (or transfer syntax) conforms to a representation if * the type and the representation type are equal or both are unencapsulated. * If this is valid for the representation read or set by chooseRepresentation * then this representation is the conforming representation. * else a representation with the default parameter set defined in the * codec is the conforming representation. */ class DcmPixelData : public DcmPolymorphOBOW { private: friend class DcmRepresentationEntry; /// List of representations of pixel data DcmRepresentationList repList; /// Iterator to the last dummy element in representation lis DcmRepresentationListIterator repListEnd; /// Iterator to the original representation. if an uncompressed /// representation is used the iterator points to repList.end() DcmRepresentationListIterator original; /// current list element for some operations DcmRepresentationListIterator current; /// shows if an unecapsulated representation is stored OFBool existUnencapsulated; /** this flag indicates that this pixel data element will be written * in uncompressed (defined length) format even if the dataset * itself is written in a compressed syntax where pixel data is normally * written in encapsulated (undefined length) format. * By default this flag is false, unless the dataset was read in an * encapsulated transfer syntax and this pixel data element was already * present in uncompressed format. */ OFBool alwaysUnencapsulated; /// value representation of unencapsulated data DcmEVR unencapsulatedVR; /// in write function: pointer to current pixel sequence DcmPixelSequence * pixelSeqForWrite; /** This function removes all pixel representations from the list * of pixel representations except the one which was passed. Note * that if parameter leaveInList equals repListEnd, all representations * will be removed from the list. * @param leaveInList Iterator to a representation which shall not * be removed from the list of representations. */ void clearRepresentationList( DcmRepresentationListIterator leaveInList); /** find a conforming representation in the list of * encapsulated representations */ OFCondition findConformingEncapsulatedRepresentation( const DcmXfer & repType, const DcmRepresentationParameter * repParam, DcmRepresentationListIterator & result); /** find a representation entry and return an iterator to the found entry * or the next element in the list. The condition returned can be EC_Normal * if such an entry is found or EC_RepresentationNotFound. The pixSeq * attribute in findEntry can be NULL, it is not needed for the find * operation! */ OFCondition findRepresentationEntry( const DcmRepresentationEntry & findEntry, DcmRepresentationListIterator & result); /** insert or replace a representation entry in the list */ DcmRepresentationListIterator insertRepresentationEntry( DcmRepresentationEntry * repEntry); /** decode representation to unencapsulated format */ OFCondition decode( const DcmXfer & fromType, const DcmRepresentationParameter * fromParam, DcmPixelSequence * fromPixSeq, DcmStack & pixelStack); /** encode to encapsulated format */ OFCondition encode( const DcmXfer & fromType, const DcmRepresentationParameter * fromParam, DcmPixelSequence * fromPixSeq, const DcmXfer & toType, const DcmRepresentationParameter *toParam, DcmStack & pixelStack); /** set the current VR, which is always OB if the currently selected * pixel representation is compressed, and may be OB or OW for uncompressed. */ void recalcVR() { if (current == repList.end()) setTagVR(unencapsulatedVR); else setTagVR(EVR_OB); } public: /** constructor * @param tag attribute tag * @param len length of the attribute value */ DcmPixelData(const DcmTag & tag, const Uint32 len = 0); /** copy constructor * @param pixelData element to be copied */ DcmPixelData(const DcmPixelData & pixelData); /// destructor virtual ~DcmPixelData(); /** copy assignment operator * @param obj element to be copied */ DcmPixelData &operator=(const DcmPixelData &obj); /** clone method * @return deep copy of this object */ virtual DcmObject *clone() const { return new DcmPixelData(*this); } /** Virtual object copying. This method can be used for DcmObject * and derived classes to get a deep copy of an object. Internally * the assignment operator is called if the given DcmObject parameter * is of the same type as "this" object instance. If not, an error * is returned. This function permits copying an object by value * in a virtual way which therefore is different to just calling the * assignment operator of DcmElement which could result in slicing * the object. * @param rhs - [in] The instance to copy from. Has to be of the same * class type as "this" object * @return EC_Normal if copying was successful, error otherwise */ virtual OFCondition copyFrom(const DcmObject& rhs); /** set/change the current value representation of the uncompressed image representation, if any * @param vr new value representation to be set. All VRs except for OW (Other * Word String) are treated as 8 bit data (OB). This is particularily useful * for unknown (UN) or unsupported VRs. * @return status status, EC_Normal if successful, an error code otherwise */ virtual OFCondition setVR(DcmEVR vr); /** return identifier for this class. Every class derived from this class * returns a unique value of type enum DcmEVR for this call. This is used * as a "poor man's RTTI" to correctly identify instances derived from * this class even on compilers not supporting RTTI. * @return type identifier of this class */ virtual DcmEVR ident() const { return EVR_PixelData; } /** print all elements of the item to a stream * @param out output stream * @param flags optional flag used to customize the output (see DCMTypes::PF_xxx) * @param level current level of nested items. Used for indentation. * @param pixelFileName optional filename used to write the raw pixel data file * @param pixelCounter optional counter used for automatic pixel data filename creation */ virtual void print(STD_NAMESPACE ostream&out, const size_t flags = 0, const int level = 0, const char *pixelFileName = NULL, size_t *pixelCounter = NULL); /** tests if it is possible to write a specific representation * Only existing representations are considered, since this * method does not create a representation. */ virtual OFBool canWriteXfer(const E_TransferSyntax newXfer, const E_TransferSyntax oldXfer); /** returns length of representation conforming to the * transfer syntax with tag, vr, ... It does not create a * representation. If no conforming representation exists an * error code is set and 0 returned. */ virtual Uint32 calcElementLength(const E_TransferSyntax xfer, const E_EncodingType enctype); /** returns length of representation value field conforming to * given transfer syntax. It does not create a representation. * If no conforming representation exists, an error code is set * and 0 returned. */ virtual Uint32 getLength( const E_TransferSyntax xfer = EXS_LittleEndianImplicit, const E_EncodingType enctype = EET_UndefinedLength); /** initialize the transfer state of this object. This method must be called * before this object is written to a stream or read (parsed) from a stream. */ virtual void transferInit(); /** This function reads the data value of a pixel data attribute * which is captured in the input stream and captures this * information in this. This function takes into account, if the * pixel data is captured in native (uncompressed) or encapsulated * (compressed) format. * @param inStream The stream which contains the information. * @param ixfer The transfer syntax which was used to encode the * information in inStream. * @param glenc Encoding type for group length; specifies what * will be done with group length tags. * @param maxReadLength Maximum read length for reading an attribute value. * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition read(DcmInputStream & inStream, const E_TransferSyntax ixfer, const E_GrpLenEncoding glenc = EGL_noChange, const Uint32 maxReadLength = DCM_MaxReadLength); /** writes a representation conforming to the transfer syntax * It does not create a representation. If no conforming * representation exists, an error code is returned. * The written representation is the new current representation */ virtual OFCondition write( DcmOutputStream &outStream, const E_TransferSyntax oxfer, const E_EncodingType enctype, DcmWriteCache *wcache); /** write object in XML format * @param out output stream to which the XML document is written * @param flags optional flag used to customize the output (see DCMTypes::XF_xxx) * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition writeXML(STD_NAMESPACE ostream&out, const size_t flags = 0); /** special write method for creation of digital signatures * @param outStream DICOM output stream * @param oxfer output transfer syntax * @param enctype encoding types (undefined or explicit length) * @param wcache pointer to write cache object, may be NULL * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition writeSignatureFormat( DcmOutputStream &outStream, const E_TransferSyntax oxfer, const E_EncodingType enctype, DcmWriteCache *wcache); /** this method loads all attribute values maintained by this object and * all sub-objects (in case of a container such as DcmDataset) into memory. * After a call to this method, the file from which a dataset was read may safely * be deleted or replaced. For large files, this method may obviously allocate large * amounts of memory. * @return EC_Normal if successful, an error code otherwise */ virtual OFCondition loadAllDataIntoMemory(void); /** finalize the transfer state of this object. This method must be called * when reading/writing this object from/to a stream has been completed. */ virtual void transferEnd(); /** test if it is possible to choose the representation in the parameters */ OFBool canChooseRepresentation( const E_TransferSyntax repType, const DcmRepresentationParameter * repParam); /** choose a specific representation. if representation does not exist * it is created (if possible). * if repParam is zero, a representation is chosen or created that * is equal to the default representation parameters */ OFCondition chooseRepresentation( const E_TransferSyntax repType, const DcmRepresentationParameter * repParam, DcmStack & stack); /** Inserts an original encapsulated representation. current and original * representations are changed, all old representations are deleted */ void putOriginalRepresentation( const E_TransferSyntax repType, const DcmRepresentationParameter * repParam, DcmPixelSequence * pixSeq); /**insert an original unencapsulated * representation. current and original representations are changed, * all old representations are deleted. The array data is copied. */ virtual OFCondition putUint8Array( const Uint8 * byteValue, const unsigned long length); /** insert an original unencapsulated * representation. current and original representations are changed, * all old representations are deleted. The array data is copied. */ virtual OFCondition putUint16Array( const Uint16 * wordValue, const unsigned long length); /** create an empty Uint8 array of given number of words and set it */ virtual OFCondition createUint8Array( const Uint32 numBytes, Uint8 * & bytes); /** create an empty Uint16 array of given number of words and set it */ virtual OFCondition createUint16Array( const Uint32 numWords, Uint16 * & words); /** replace the attribute value with the content of the given temporary file. * The temporary file is not opened/loaded until the attribute value is accessed, * very much like large attributes that remain in file during a read operation. * @param factory a factory object that is able to create an input stream * to the temporary file at the right location. * @param length attribute value length, in bytes. Must be even length. * The length is not checked against the real length of the temporary file, * which might be written or completed after the call to this method. * @param byteOrder byte order in the temporary file * @return EC_Normal upon success, an error code otherwise. */ virtual OFCondition createValueFromTempFile( DcmInputStreamFactory *factory, const Uint32 length, const E_ByteOrder byteOrder); /** get a specific exisiting Representation, creates no representation * if repParam is NULL, then the representation conforming to the default * presentationParameters (defined with the codec) is returned. */ OFCondition getEncapsulatedRepresentation( const E_TransferSyntax repType, const DcmRepresentationParameter * repParam, DcmPixelSequence * & pixSeq); /** returns the representation identification (key) consisting of * representation type and parameter of the original representation */ void getOriginalRepresentationKey( E_TransferSyntax & repType, const DcmRepresentationParameter * & repParam); /** returns the representation identification (key) consisting of * representation type and parameter of the current representation */ void getCurrentRepresentationKey( E_TransferSyntax & repType, const DcmRepresentationParameter * & repParam); /** sets the representation identification parameter of the current * representation */ OFCondition setCurrentRepresentationParameter( const DcmRepresentationParameter * repParam); /** returns if a specific conforming representation exists. */ OFBool hasRepresentation( const E_TransferSyntax repType, const DcmRepresentationParameter * repParam = NULL); /** delete a representation. It is not possible to delete the * original representation with this method */ OFCondition removeRepresentation( const E_TransferSyntax repType, const DcmRepresentationParameter * repParam); /** removes all but the original representation */ void removeAllButOriginalRepresentations(); /** removes all but the current representation * Makes the current representation original */ void removeAllButCurrentRepresentations(); /** delete original representation and set new original representation. * If the new representation does not exist, the original one is not * deleted and an error code returns */ OFCondition removeOriginalRepresentation( const E_TransferSyntax repType, const DcmRepresentationParameter * repParam); /** set or clear the flag that indicates that this pixel data element will be * written in uncompressed (defined length) format even if the dataset * itself is written in a compressed syntax where pixel data is normally * written in encapsulated (undefined length) format. By default this flag * is false, unless the dataset was read in an encapsulated transfer syntax * and this pixel data element was already present in uncompressed format. * This flag should never be enabled for pixel data elements on the main dataset * level, only for pixel data elements within the icon image sequence or some * other "private" place. * @param flag new value of flag */ void setNonEncapsulationFlag(OFBool flag); /** access single frame without decompressing or loading a complete * multi-frame object. The frame is copied into the buffer passed by the caller * which must be large enough to contain a complete frame. * @param dataset pointer to DICOM dataset in which this pixel data object is * located. Used to access rows, columns, samples per pixel etc. * @param frameNo number of frame, starting with 0 for the first frame. * @param startFragment index of the compressed fragment that contains * all or the first part of the compressed bitstream for the given frameNo. * Upon successful return this parameter is updated to contain the index * of the first compressed fragment of the next frame. * When unknown, zero should be passed. In this case the decompression * algorithm will try to determine the index by itself, which will always * work if frames are decompressed in increasing order from first to last, * but may fail if frames are decompressed in random order, multiple fragments * per frame and multiple frames are present in the dataset, and the offset * table is empty. * @param buffer pointer to buffer allocated by the caller. The buffer * must be large enough for one frame of this image. * @param bufSize size of buffer, in bytes. This number must be even so * that the data can properly be converted to a different endianness. * @param decompressedColorModel upon successful return, the color model * of the decompressed image (which may be different from the one used * in the compressed images) is returned in this parameter. * @param cache file cache object that may be passed to multiple subsequent calls * to this method for the same file; the file cache will then keep a file * handle open, thus improving performance. Optional, may be NULL * @return EC_Normal if successful, an error code otherwise */ virtual OFCondition getUncompressedFrame( DcmItem *dataset, Uint32 frameNo, Uint32& startFragment, void *buffer, Uint32 bufSize, OFString& decompressedColorModel, DcmFileCache *cache=NULL); /** determine color model of the decompressed image * @param dataset pointer to DICOM dataset in which this pixel data object * is located. Used to access photometric interpretation. * @param decompressedColorModel upon successful return, the color model * of the decompressed image (which may be different from the one used * in the compressed images) is returned in this parameter * @return EC_Normal if successful, an error code otherwise */ virtual OFCondition getDecompressedColorModel( DcmItem *dataset, OFString &decompressedColorModel); }; #endif /* ** CVS/RCS Log: ** $Log: dcpixel.h,v $ ** Revision 1.40 2010-10-14 13:15:41 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.39 2010-07-02 12:34:42 uli ** Added comment explaining why an even buffer size is required. ** ** Revision 1.38 2010-02-22 11:39:54 uli ** Remove some unneeded includes. ** ** Revision 1.37 2009-11-17 16:36:51 joergr ** Added new method that allows for determining the color model of the ** decompressed image. ** ** Revision 1.36 2008-11-03 14:32:50 joergr ** Added method createValueFromTempFile() - overrides method in DcmElement. ** ** Revision 1.35 2008-07-17 11:19:49 onken ** Updated copyFrom() documentation. ** ** Revision 1.34 2008-07-17 10:30:23 onken ** Implemented copyFrom() method for complete DcmObject class hierarchy, which ** permits setting an instance's value from an existing object. Implemented ** assignment operator where necessary. ** ** Revision 1.33 2008-06-23 12:09:13 joergr ** Fixed inconsistencies in Doxygen API documentation. ** ** Revision 1.32 2008-05-29 10:46:13 meichel ** Implemented new method DcmPixelData::getUncompressedFrame ** that permits frame-wise access to compressed and uncompressed ** objects without ever loading the complete object into main memory. ** For this new method to work with compressed images, all classes derived from ** DcmCodec need to implement a new method decodeFrame(). For now, only ** dummy implementations returning an error code have been defined. ** ** Revision 1.31 2007/11/29 14:30:19 meichel ** Write methods now handle large raw data elements (such as pixel data) ** without loading everything into memory. This allows very large images to ** be sent over a network connection, or to be copied without ever being ** fully in memory. ** ** Revision 1.30 2007/06/29 14:17:49 meichel ** Code clean-up: Most member variables in module dcmdata are now private, ** not protected anymore. ** ** Revision 1.29 2006/08/15 15:49:56 meichel ** Updated all code in module dcmdata to correctly compile when ** all standard C++ classes remain in namespace std. ** ** Revision 1.28 2005/12/08 16:28:30 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.27 2005/05/26 09:06:53 meichel ** Renamed isIconImage flag to alwaysUnencapsulated to clarify meaning. ** Added public method DcmPixelData::setNonEncapsulationFlag() that allows ** DcmCodec instances to enable the flag. Improved documentation. ** ** Revision 1.26 2004/07/01 12:28:25 meichel ** Introduced virtual clone method for DcmObject and derived classes. ** ** Revision 1.25 2004/04/07 13:55:56 meichel ** Compressed image datasets containing uncompressed icon images ** are now correctly handled by the parser. ** ** Revision 1.24 2004/01/16 14:06:20 joergr ** Removed acknowledgements with e-mail addresses from CVS log. ** ** Revision 1.23 2003/06/12 18:21:24 joergr ** Modified code to use const_iterators where appropriate (required for STL). ** ** Revision 1.22 2003/06/12 14:03:24 joergr ** Fixed inconsistent API documentation reported by Doxygen. ** ** Revision 1.21 2003/06/02 16:55:34 meichel ** Cleaned up implementation of DcmRepresentationEntry, added doc++ comments ** ** Revision 1.20 2003/04/17 15:56:59 joergr ** Corrected API documentation of createUint8/16Array() methods. ** ** Revision 1.19 2003/04/01 12:35:12 joergr ** Added implementation of createUint8/16Array() methods to DcmPixelData. ** Required to work properly with chooseRepresentation() for pixel compression. ** ** Revision 1.18 2002/12/09 09:31:16 wilkens ** Modified/Added doc++ documentation. ** ** Revision 1.17 2002/12/06 12:49:12 joergr ** Enhanced "print()" function by re-working the implementation and replacing ** the boolean "showFullData" parameter by a more general integer flag. ** Added doc++ documentation. ** Made source code formatting more consistent with other modules/files. ** ** Revision 1.16 2002/08/27 16:55:37 meichel ** Initial release of new DICOM I/O stream classes that add support for stream ** compression (deflated little endian explicit VR transfer syntax) ** ** Revision 1.15 2002/04/25 09:38:48 joergr ** Added support for XML output of DICOM objects. ** ** Revision 1.14 2001/09/25 17:18:34 meichel ** Updated abstract class DcmRepresentationParameter for use with dcmjpeg ** ** Revision 1.13 2001/06/01 15:48:42 meichel ** Updated copyright header ** ** Revision 1.12 2000/11/07 16:56:08 meichel ** Initial release of dcmsign module for DICOM Digital Signatures ** ** Revision 1.11 2000/09/27 08:19:55 meichel ** Minor changes in DcmCodec interface, required for future dcmjpeg module. ** ** Revision 1.10 2000/04/14 15:31:33 meichel ** Removed default value from output stream passed to print() method. ** Required for use in multi-thread environments. ** ** Revision 1.9 2000/03/08 16:26:17 meichel ** Updated copyright header. ** ** Revision 1.8 2000/03/03 14:05:25 meichel ** Implemented library support for redirecting error messages into memory ** instead of printing them to stdout/stderr for GUI applications. ** ** Revision 1.7 2000/02/10 10:50:52 joergr ** Added new feature to dcmdump (enhanced print method of dcmdata): write ** pixel data/item value fields to raw files. ** ** Revision 1.6 2000/02/03 16:28:10 joergr ** Fixed bug: encapsulated data (pixel items) have never been loaded using ** method 'loadAllDataIntoMemory'. Therefore, encapsulated pixel data was ** never printed with 'dcmdump'. ** ** Revision 1.5 1999/03/31 09:24:44 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.4 1998/11/12 16:47:42 meichel ** Implemented operator= for all classes derived from DcmObject. ** ** Revision 1.3 1998/07/15 15:48:50 joergr ** Removed several compiler warnings reported by gcc 2.8.1 with ** additional options, e.g. missing copy constructors and assignment ** operators, initialization of member variables in the body of a ** constructor instead of the member initialization list, hiding of ** methods by use of identical names, uninitialized member variables, ** missing const declaration of char pointers. Replaced tabs by spaces. ** ** Revision 1.2 1997/07/24 13:08:24 andreas ** - Removed const for method DcmRepresentationParameter::copy ** ** Revision 1.1 1997/07/21 07:54:57 andreas ** - New environment for encapsulated pixel representations. DcmPixelData ** can contain different representations and uses codecs to convert ** between them. Codecs are derived from the DcmCodec class. New error ** codes are introduced for handling of representations. New internal ** value representation (only for ident()) for PixelData ** */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/dcdatset.h0000644000310500011400000005001711455601174021531 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Gerd Ehlers, Andreas Barth * * Purpose: Interface of the class DcmDataset * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:15:40 $ * CVS/RCS Revision: $Revision: 1.36 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DCDATSET_H #define DCDATSET_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcitem.h" // forward declarations class DcmInputStream; class DcmOutputStream; class DcmRepresentationParameter; /** a class handling the DICOM dataset format (files without meta header) */ class DcmDataset : public DcmItem { public: /** default constructor */ DcmDataset(); /** copy constructor * @param old dataset to be copied */ DcmDataset(const DcmDataset &old); /** destructor */ virtual ~DcmDataset(); /** assignment operator * @param obj the dataset to be copied */ DcmDataset& operator=(const DcmDataset& obj); /** clone method * @return deep copy of this object */ virtual DcmObject *clone() const { return new DcmDataset(*this); } /** Virtual object copying. This method can be used for DcmObject * and derived classes to get a deep copy of an object. Internally * the assignment operator is called if the given DcmObject parameter * is of the same type as "this" object instance. If not, an error * is returned. This function permits copying an object by value * in a virtual way which therefore is different to just calling the * assignment operator of DcmElement which could result in slicing * the object. * @param rhs - [in] The instance to copy from. Has to be of the same * class type as "this" object * @return EC_Normal if copying was successful, error otherwise */ virtual OFCondition copyFrom(const DcmObject& rhs); /** get type identifier * @return type identifier of this class (EVR_dataset) */ virtual DcmEVR ident() const; /** clear (remove) attribute value * @return EC_Normal if successful, an error code otherwise */ virtual OFCondition clear(); /** remove all elements with an invalid group number, i.e. 0x0000 to 0x0003, * 0x0005, 0x0007 and 0xFFFF */ virtual void removeInvalidGroups(); /** return the transfer syntax in which this dataset was originally read. * @return transfer syntax in which this dataset was originally read, EXS_Unknown if the dataset was created in memory */ E_TransferSyntax getOriginalXfer() const; /** print all elements of the dataset to a stream * @param out output stream * @param flags optional flag used to customize the output (see DCMTypes::PF_xxx) * @param level current level of nested items. Used for indentation. * @param pixelFileName optional filename used to write the raw pixel data file * @param pixelCounter optional counter used for automatic pixel data filename creation */ virtual void print(STD_NAMESPACE ostream&out, const size_t flags = 0, const int level = 0, const char *pixelFileName = NULL, size_t *pixelCounter = NULL); /** calculate the length of this DICOM element when encoded with the * given transfer syntax and the given encoding type for sequences. * For elements, the length includes the length of the tag, length field, * VR field and the value itself, for items and sequences it returns * the length of the complete item or sequence including delimitation tags * if applicable. Never returns undefined length. * @param xfer transfer syntax for length calculation * @param enctype sequence encoding type for length calculation * @return length of DICOM element */ Uint32 calcElementLength(const E_TransferSyntax xfer, const E_EncodingType enctype); /** check if this DICOM object can be encoded in the given transfer syntax. * @param newXfer transfer syntax in which the DICOM object is to be encoded * @param oldXfer transfer syntax in which the DICOM object was read or created. * @return true if object can be encoded in desired transfer syntax, false otherwise. */ virtual OFBool canWriteXfer(const E_TransferSyntax newXfer, const E_TransferSyntax oldXfer = EXS_Unknown); /** This function reads the information of all attributes which * are captured in the input stream and captures this information * in this->elementList. Each attribute is represented as an * element in this list. Having read all information for this * particular data set or command, this function will also take * care of group length (according to what is specified in glenc) * and padding elements (don't change anything). * @param inStream The stream which contains the information. * @param xfer The transfer syntax which was used to encode * the information in inStream. * @param glenc Encoding type for group length; specifies what * will be done with group length tags. * @param maxReadLength Maximum read length for reading an attribute value. * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition read(DcmInputStream &inStream, const E_TransferSyntax xfer = EXS_Unknown, const E_GrpLenEncoding glenc = EGL_noChange, const Uint32 maxReadLength = DCM_MaxReadLength); /** write dataset to a stream * @param outStream DICOM output stream * @param oxfer output transfer syntax * @param enctype encoding types (undefined or explicit length) * @param wcache pointer to write cache object, may be NULL * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition write(DcmOutputStream &outStream, const E_TransferSyntax oxfer, const E_EncodingType enctype, DcmWriteCache *wcache); /** This function writes data values which are contained in this * DcmDataset object to the stream which is passed as first argument. * With regard to the writing of information, the other parameters * which are passed are accounted for. The function will return * EC_Normal, if the information from all elements of this data * set has been written to the buffer, it will return EC_StreamNotifyClient, * if there is no more space in the buffer and _not_ all elements * have been written to it, and it will return some other (error) * value if there was an error. * @param outStream The stream that the information will be written to. * @param oxfer The transfer syntax which shall be used. * @param enctype Encoding type for sequences; specifies how sequences * will be handled. * @param wcache pointer to write cache object, may be NULL * @param glenc Encoding type for group length; specifies what will * be done with group length tags. * @param padenc Encoding type for padding. Specifies what will be done * with padding tags. * @param padlen The length up to which the dataset shall be padded, if * padding is desired. * @param subPadlen For sequences (ie sub elements), the length up to which * item shall be padded, if padding is desired. * @param instanceLength Number of extra bytes added to the item/dataset length * used when computing the padding; this parameter is for * instance used to pass the length of the file meta header * from the DcmFileFormat to the DcmDataset object. * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition write(DcmOutputStream &outStream, const E_TransferSyntax oxfer, const E_EncodingType enctype, DcmWriteCache *wcache, const E_GrpLenEncoding glenc, const E_PaddingEncoding padenc = EPD_noChange, const Uint32 padlen = 0, const Uint32 subPadlen = 0, Uint32 instanceLength = 0); /** special write method for creation of digital signatures * @param outStream DICOM output stream * @param oxfer output transfer syntax * @param enctype encoding types (undefined or explicit length) * @param wcache pointer to write cache object, may be NULL * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition writeSignatureFormat( DcmOutputStream &outStream, const E_TransferSyntax oxfer, const E_EncodingType enctype, DcmWriteCache *wcache); /** write object in XML format. * The XML declaration (e.g. ) is not written by this function. * @param out output stream to which the XML document is written * @param flags optional flag used to customize the output (see DCMTypes::XF_xxx) * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition writeXML(STD_NAMESPACE ostream&out, const size_t flags = 0); /** load object from a DICOM file. * This method only supports DICOM objects stored as a dataset, i.e. without meta header. * Use DcmFileFormat::loadFile() to load files with meta header. * @param fileName name of the file to load * @param readXfer transfer syntax used to read the data (auto detection if EXS_Unknown) * @param groupLength flag, specifying how to handle the group length tags * @param maxReadLength maximum number of bytes to be read for an element value. * Element values with a larger size are not loaded until their value is retrieved * (with getXXX()) or loadAllDataElements() is called. * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition loadFile(const char *fileName, const E_TransferSyntax readXfer = EXS_Unknown, const E_GrpLenEncoding groupLength = EGL_noChange, const Uint32 maxReadLength = DCM_MaxReadLength); /** save object to a DICOM file. * This method only supports DICOM objects stored as a dataset, i.e. without meta header. * Use DcmFileFormat::saveFile() to save files with meta header. * @param fileName name of the file to save * @param writeXfer transfer syntax used to write the data (EXS_Unknown means use current) * @param encodingType flag, specifying the encoding with undefined or explicit length * @param groupLength flag, specifying how to handle the group length tags * @param padEncoding flag, specifying how to handle the padding tags * @param padLength number of bytes used for the dataset padding (has to be an even number) * @param subPadLength number of bytes used for the item padding (has to be an even number) * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition saveFile(const char *fileName, const E_TransferSyntax writeXfer = EXS_Unknown, const E_EncodingType encodingType = EET_UndefinedLength, const E_GrpLenEncoding groupLength = EGL_recalcGL, const E_PaddingEncoding padEncoding = EPD_noChange, const Uint32 padLength = 0, const Uint32 subPadLength = 0); // methods for different pixel representations /** select a specific representation (compressed or uncompressed) of the dataset * and create the representation if needed. This may cause compression or decompression * to be applied to the pixel data in the dataset. * @param repType desired transfer syntax * @param repParam desired representation parameter (e.g. quality factor for lossy compression) * @return EC_Normal upon success, an error code otherwise. */ OFCondition chooseRepresentation(const E_TransferSyntax repType, const DcmRepresentationParameter *repParam); /** check if all PixelData elements in this dataset have a representation conforming * to the given transfer syntax and representation parameters (see dcpixel.h for * definition of "conforming"). * @param repType desired transfer syntax * @param repParam desired representation parameter (e.g. quality factor for lossy compression) * @return true if all pixel elements have the desired representation, false otherwise */ OFBool hasRepresentation(const E_TransferSyntax repType, const DcmRepresentationParameter *repParam); /** removes all but the original representation in all pixel data elements */ void removeAllButOriginalRepresentations(); /** removes all but the current representation and sets the original * representation to current */ void removeAllButCurrentRepresentations(); private: /// current transfer syntax of the dataset E_TransferSyntax Xfer; }; #endif // DCDATSET_H /* ** CVS/RCS Log: ** $Log: dcdatset.h,v $ ** Revision 1.36 2010-10-14 13:15:40 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.35 2010-10-08 08:37:00 joergr ** Enhanced documentation on pixel-related parameters. ** ** Revision 1.34 2010-10-05 16:20:47 joergr ** Fixed various Doxygen API documentation issues. ** ** Revision 1.33 2010-03-01 09:08:44 uli ** Removed some unnecessary include directives in the headers. ** ** Revision 1.32 2010-02-22 11:39:53 uli ** Remove some unneeded includes. ** ** Revision 1.31 2009-08-25 13:00:52 joergr ** Added new methods which remove all data elements with an invalid group number ** from the meta information header, dataset and/or fileformat. ** ** Revision 1.30 2008-07-17 11:19:48 onken ** Updated copyFrom() documentation. ** ** Revision 1.29 2008-07-17 10:30:22 onken ** Implemented copyFrom() method for complete DcmObject class hierarchy, which ** permits setting an instance's value from an existing object. Implemented ** assignment operator where necessary. ** ** Revision 1.28 2008-06-23 12:09:13 joergr ** Fixed inconsistencies in Doxygen API documentation. ** ** Revision 1.27 2007/11/29 14:30:19 meichel ** Write methods now handle large raw data elements (such as pixel data) ** without loading everything into memory. This allows very large images to ** be sent over a network connection, or to be copied without ever being ** fully in memory. ** ** Revision 1.26 2006/08/15 15:49:56 meichel ** Updated all code in module dcmdata to correctly compile when ** all standard C++ classes remain in namespace std. ** ** Revision 1.25 2005/12/08 16:28:02 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.24 2005/11/11 10:31:57 meichel ** Added explicit DcmDataset::clear() implementation. ** ** Revision 1.23 2004/07/01 12:28:25 meichel ** Introduced virtual clone method for DcmObject and derived classes. ** ** Revision 1.22 2003/03/21 13:06:46 meichel ** Minor code purifications for warnings reported by MSVC in Level 4 ** ** Revision 1.21 2002/12/09 09:31:13 wilkens ** Modified/Added doc++ documentation. ** ** Revision 1.20 2002/12/06 12:49:08 joergr ** Enhanced "print()" function by re-working the implementation and replacing ** the boolean "showFullData" parameter by a more general integer flag. ** Added doc++ documentation. ** Made source code formatting more consistent with other modules/files. ** ** Revision 1.19 2002/08/27 16:55:30 meichel ** Initial release of new DICOM I/O stream classes that add support for stream ** compression (deflated little endian explicit VR transfer syntax) ** ** Revision 1.18 2002/04/25 09:40:13 joergr ** Added support for XML output of DICOM objects. ** ** Revision 1.17 2002/04/11 12:22:52 joergr ** Added new methods for loading and saving DICOM files. ** ** Revision 1.16 2001/09/25 17:19:24 meichel ** Adapted dcmdata to class OFCondition ** ** Revision 1.15 2001/06/01 15:48:34 meichel ** Updated copyright header ** ** Revision 1.14 2000/11/07 16:56:05 meichel ** Initial release of dcmsign module for DICOM Digital Signatures ** ** Revision 1.13 2000/04/14 15:31:31 meichel ** Removed default value from output stream passed to print() method. ** Required for use in multi-thread environments. ** ** Revision 1.12 2000/03/08 16:26:12 meichel ** Updated copyright header. ** ** Revision 1.11 2000/03/03 14:05:22 meichel ** Implemented library support for redirecting error messages into memory ** instead of printing them to stdout/stderr for GUI applications. ** ** Revision 1.10 2000/02/10 10:50:50 joergr ** Added new feature to dcmdump (enhanced print method of dcmdata): write ** pixel data/item value fields to raw files. ** ** Revision 1.9 1999/03/31 09:24:32 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.8 1997/07/21 08:14:38 andreas ** - New environment for encapsulated pixel representations. DcmPixelData ** can contain different representations and uses codecs to convert ** between them. Codecs are derived from the DcmCodec class. New error ** codes are introduced for handling of representations. New internal ** value representation (only for ident()) for PixelData ** - Replace all boolean types (BOOLEAN, CTNBOOLEAN, DICOM_BOOL, BOOL) ** with one unique boolean type OFBool. ** ** Revision 1.7 1997/05/27 13:48:26 andreas ** - Add method canWriteXfer to class DcmObject and all derived classes. ** This method checks whether it is possible to convert the original ** transfer syntax to an new transfer syntax. The check is used in the ** dcmconv utility to prohibit the change of a compressed transfer ** syntax to a uncompressed. ** ** Revision 1.6 1997/05/16 08:23:45 andreas ** - Revised handling of GroupLength elements and support of ** DataSetTrailingPadding elements. The enumeratio E_GrpLenEncoding ** got additional enumeration values (for a description see dctypes.h). ** addGroupLength and removeGroupLength methods are replaced by ** computeGroupLengthAndPadding. To support Padding, the parameters of ** element and sequence write functions changed. ** - Added a new method calcElementLength to calculate the length of an ** element, item or sequence. For elements it returns the length of ** tag, length field, vr field, and value length, for item and ** sequences it returns the length of the whole item. sequence including ** the Delimitation tag (if appropriate). It can never return ** UndefinedLength. ** ** Revision 1.5 1996/08/05 08:45:17 andreas ** new print routine with additional parameters: ** - print into files ** - fix output length for elements ** corrected error in search routine with parameter ESM_fromStackTop ** ** Revision 1.4 1996/01/09 11:06:14 andreas ** New Support for Visual C++ ** Correct problems with inconsistent const declarations ** ** Revision 1.3 1996/01/05 13:22:52 andreas ** - changed to support new streaming facilities ** - more cleanups ** - merged read / write methods for block and file transfer ** */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/dcelem.h0000644000310500011400000014570511464747623021212 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Gerd Ehlers, Andreas Barth * * Purpose: Interface of class DcmElement * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-11-05 09:34:11 $ * CVS/RCS Revision: $Revision: 1.49 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DCELEM_H #define DCELEM_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcobject.h" #include "dcmtk/ofstd/ofstring.h" // forward declarations class DcmInputStreamFactory; class DcmFileCache; class DcmItem; /** abstract base class for all DICOM elements */ class DcmElement : public DcmObject { public: /** constructor. * Create new element from given tag and length. * @param tag DICOM tag for the new element * @param len value length for the new element */ DcmElement(const DcmTag &tag, const Uint32 len = 0); /** copy constructor * @param old element to be copied */ DcmElement(const DcmElement &old); /** destructor */ virtual ~DcmElement(); /** assignment operator * @param obj element to be assigned/copied * @return reference to this object */ DcmElement &operator=(const DcmElement &obj); /** Virtual object copying. This method can be used for DcmObject * and derived classes to get a deep copy of an object. Internally * the assignment operator is called if the given DcmObject parameter * is of the same type as "this" object instance. If not, an error * is returned. This function permits copying an object by value * in a virtual way which therefore is different to just calling the * assignment operator of DcmElement which could result in slicing * the object. * @param rhs - [in] The instance to copy from. Has to be of the same * class type as "this" object * @return EC_Normal if copying was successful, error otherwise */ virtual OFCondition copyFrom(const DcmObject& rhs); /** calculate the length of this DICOM element when encoded with the * given transfer syntax and the given encoding type for sequences. * For elements, the length includes the length of the tag, length field, * VR field and the value itself, for items and sequences it returns * the length of the complete item or sequence including delimitation tags * if applicable. Never returns undefined length. * @param xfer transfer syntax for length calculation * @param enctype sequence encoding type for length calculation * @return length of DICOM element */ virtual Uint32 calcElementLength(const E_TransferSyntax xfer, const E_EncodingType enctype); /** calculate the value length (without attribute tag, VR and length field) * of this DICOM element when encoded with the given transfer syntax and * the given encoding type for sequences. Never returns undefined length. * @param xfer transfer syntax for length calculation * @param enctype sequence encoding type for length calculation * @return value length of DICOM element */ virtual Uint32 getLength(const E_TransferSyntax /*xfer*/ = EXS_LittleEndianImplicit, const E_EncodingType /*enctype*/ = EET_UndefinedLength) { return getLengthField(); } /** check if this element is a leaf node in a dataset tree. * All subclasses of DcmElement except for DcmSequenceOfItems * are leaf nodes, while DcmSequenceOfItems, DcmItem, DcmDataset etc. * are not. * @return true if leaf node, false otherwise. */ virtual OFBool isLeaf() const { return OFTrue; } /** check if value of this element is loaded into main memory * @return true if value is present in memory, false if value still resides in file */ inline OFBool valueLoaded() const { return fValue != NULL || getLengthField() == 0; } /** initialize the transfer state of this object. This method must be called * before this object is written to a stream or read (parsed) from a stream. */ virtual void transferInit(); /** check if this DICOM object can be encoded in the given transfer syntax. * @param newXfer transfer syntax in which the DICOM object is to be encoded * @param oldXfer transfer syntax in which the DICOM object was read or created. * @return true if object can be encoded in desired transfer syntax, false otherwise. */ virtual OFBool canWriteXfer(const E_TransferSyntax newXfer, const E_TransferSyntax oldXfer); /** This function reads the data value of an attribute which is * captured in the input stream and captures this information * in this. If not all information for an attribute could be * read from the stream, the function returns EC_StreamNotifyClient. * Note that if certain conditions are met, this function does * not actually load the data value but creates and stores an object * that enables us to load this information later. * @param inStream The stream which contains the information. * @param ixfer The transfer syntax which was used to encode * the information in inStream. * @param glenc Encoding type for group length; specifies what * will be done with group length tags. * @param maxReadLength Maximum read length for reading an attribute value. * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition read(DcmInputStream &inStream, const E_TransferSyntax ixfer, const E_GrpLenEncoding glenc = EGL_noChange, const Uint32 maxReadLength = DCM_MaxReadLength); /** This function writes this element's value to the outstream which was * passed. When writing information, the byte ordering (little or big endian) * of the transfer syntax which was passed will be accounted for. In case the * outstream does not provide enough space for all bytes of the current * element's value, only a certain part of the value will be written to the * stream. This element's transfer state indicates if the all bytes of value * have already been written to the stream (ERW_ready), if the writing is * still in progress and more bytes need to be written to the stream * (ERW_inWork) or if the writing of the bytes of this element's value has not * even begun yet (ERW_init). The member variable fTransferredBytes indicates * how many bytes (starting from byte 0) of this element's value have already * been written to the stream. This function will return EC_Normal, if the * entire value of this element has been written to the stream, it will return * EC_StreamNotifyClient, if there is no more space in the buffer and _not_ all * bytes of this element's value have been written, and it will return some * other (error) value if there was an error. * @param outStream The stream the information will be written to. * @param oxfer The transfer syntax which shall be used. * @param enctype encoding types (undefined or explicit length) (actually unused) * @param wcache pointer to write cache object, may be NULL * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition write(DcmOutputStream &outStream, const E_TransferSyntax oxfer, const E_EncodingType enctype, DcmWriteCache *wcache); /** write object in XML format * @param out output stream to which the XML document is written * @param flags optional flag used to customize the output (see DCMTypes::XF_xxx) * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition writeXML(STD_NAMESPACE ostream &out, const size_t flags = 0); /** special write method for creation of digital signatures * @param outStream DICOM output stream * @param oxfer output transfer syntax * @param enctype encoding types (undefined or explicit length) * @param wcache pointer to write cache object, may be NULL * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition writeSignatureFormat(DcmOutputStream &outStream, const E_TransferSyntax oxfer, const E_EncodingType enctype, DcmWriteCache *wcache); /** clear (remove) attribute value * @return EC_Normal if successful, an error code otherwise */ virtual OFCondition clear(); /** check whether stored value conforms to the VR and to the specified VM * @param vm value multiplicity (according to the data dictionary) to be checked for. * (valid values: "1", "1-2", "1-3", "1-8", "1-99", "1-n", "2", "2-n", "2-2n", * "3", "3-n", "3-3n", "4", "6", "9", "16", "32"), * interpreted as cardinality (number of items) for sequence attributes * @param oldFormat support old ACR/NEMA format for certain VRs (DA, TM, PN) if OFTrue * @return status of the check, EC_Normal if value is correct, an error code otherwise */ virtual OFCondition checkValue(const OFString &vm = "1-n", const OFBool oldFormat = OFFalse); /** this method loads all attribute values maintained by this object and * all sub-objects (in case of a container such as DcmDataset) into memory. * After a call to this method, the file from which a dataset was read may safely * be deleted or replaced. For large files, this method may obviously allocate large * amounts of memory. * @return EC_Normal if successful, an error code otherwise */ virtual OFCondition loadAllDataIntoMemory(); // GET operations /** retrieve a single value of type Uint8. Requires element to be of corresponding VR, * otherwise an error is returned. * @param val value returned in this parameter upon success * @param pos position in multi-valued attribute, default 0 * @return EC_Normal upon success, an error code otherwise */ virtual OFCondition getUint8(Uint8 &val, const unsigned long pos = 0); /** retrieve a single value of type Sint16. Requires element to be of corresponding VR, * otherwise an error is returned. * @param val value returned in this parameter upon success * @param pos position in multi-valued attribute, default 0 * @return EC_Normal upon success, an error code otherwise */ virtual OFCondition getSint16(Sint16 &val, const unsigned long pos = 0); /** retrieve a single value of type Uint16. Requires element to be of corresponding VR, * otherwise an error is returned. * @param val value returned in this parameter upon success * @param pos position in multi-valued attribute, default 0 * @return EC_Normal upon success, an error code otherwise */ virtual OFCondition getUint16(Uint16 &val, const unsigned long pos = 0); /** retrieve a single value of type Sint32. Requires element to be of corresponding VR, * otherwise an error is returned. * @param val value returned in this parameter upon success * @param pos position in multi-valued attribute, default 0 * @return EC_Normal upon success, an error code otherwise */ virtual OFCondition getSint32(Sint32 &val, const unsigned long pos = 0); /** retrieve a single value of type Uint32. Requires element to be of corresponding VR, * otherwise an error is returned. * @param val value returned in this parameter upon success * @param pos position in multi-valued attribute, default 0 * @return EC_Normal upon success, an error code otherwise */ virtual OFCondition getUint32(Uint32 &val, const unsigned long pos = 0); /** retrieve a single value of type Float32. Requires element to be of corresponding VR, * otherwise an error is returned. * @param val value returned in this parameter upon success * @param pos position in multi-valued attribute, default 0 * @return EC_Normal upon success, an error code otherwise */ virtual OFCondition getFloat32(Float32 &val, const unsigned long pos = 0); /** retrieve a single value of type Float64. Requires element to be of corresponding VR, * otherwise an error is returned. * @param val value returned in this parameter upon success * @param pos position in multi-valued attribute, default 0 * @return EC_Normal upon success, an error code otherwise */ virtual OFCondition getFloat64(Float64 &val, const unsigned long pos = 0); /** retrieve a single value of type DcmTagKey. Requires element to be of corresponding VR, * otherwise an error is returned. * @param val value returned in this parameter upon success * @param pos position in multi-valued attribute, default 0 * @return EC_Normal upon success, an error code otherwise */ virtual OFCondition getTagVal(DcmTagKey &val, const unsigned long pos = 0); /** retrieve a single value of type string. Requires element to be of corresponding VR, * otherwise an error is returned. * @param str value returned in this parameter upon success * @param pos position in multi-valued attribute * @param normalize true if string is to be normalized (e.g. trailing space characters to be trimmed) * @return EC_Normal upon success, an error code otherwise */ virtual OFCondition getOFString(OFString &str, const unsigned long pos, OFBool normalize = OFTrue); /** get entire element value as a character string. * In case of VM > 1 the single values are separated by a backslash ('\'). * This method implements a general approach by concatenating the results of * getOFString() for each value component. Derived class may implement more * sophisticated methods. * @param value variable in which the result value is stored * @param normalize normalize each element value prior to concatenation * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition getOFStringArray(OFString &value, OFBool normalize = OFTrue); /** get a pointer to the element value of the current element as type string. * Requires element to be of corresponding VR, otherwise an error is returned. * This method does not copy, but returns a pointer to the element value, * which remains under control of this object and is valid only until the next * read, write or put operation. * @param val pointer to value returned in this parameter upon success * @return EC_Normal upon success, an error code otherwise */ virtual OFCondition getString(char *&val); // for strings /** get a pointer to the element value of the current element as type string. * Requires element to be of corresponding VR, otherwise an error is returned. * This method does not copy, but returns a pointer to the element value, * which remains under control of this object and is valid only until the next * read, write or put operation. * @param val pointer to value returned in this parameter upon success * @return EC_Normal upon success, an error code otherwise */ virtual OFCondition getUint8Array(Uint8 *&val); // for bytes /** get a pointer to the element value of the current element as type Sint16. * Requires element to be of corresponding VR, otherwise an error is returned. * This method does not copy, but returns a pointer to the element value, * which remains under control of this object and is valid only until the next * read, write or put operation. * @param val pointer to value returned in this parameter upon success * @return EC_Normal upon success, an error code otherwise */ virtual OFCondition getSint16Array(Sint16 *&val); /** get a pointer to the element value of the current element as type Uint16. * Requires element to be of corresponding VR, otherwise an error is returned. * This method does not copy, but returns a pointer to the element value, * which remains under control of this object and is valid only until the next * read, write or put operation. * @param val pointer to value returned in this parameter upon success * @return EC_Normal upon success, an error code otherwise */ virtual OFCondition getUint16Array(Uint16 *&val); /** get a pointer to the element value of the current element as type Sint32. * Requires element to be of corresponding VR, otherwise an error is returned. * This method does not copy, but returns a pointer to the element value, * which remains under control of this object and is valid only until the next * read, write or put operation. * @param val pointer to value returned in this parameter upon success * @return EC_Normal upon success, an error code otherwise */ virtual OFCondition getSint32Array(Sint32 *&val); /** get a pointer to the element value of the current element as type Uint32. * Requires element to be of corresponding VR, otherwise an error is returned. * This method does not copy, but returns a pointer to the element value, * which remains under control of this object and is valid only until the next * read, write or put operation. * @param val pointer to value returned in this parameter upon success * @return EC_Normal upon success, an error code otherwise */ virtual OFCondition getUint32Array(Uint32 *&val); /** get a pointer to the element value of the current element as type Float32. * Requires element to be of corresponding VR, otherwise an error is returned. * This method does not copy, but returns a pointer to the element value, * which remains under control of this object and is valid only until the next * read, write or put operation. * @param val pointer to value returned in this parameter upon success * @return EC_Normal upon success, an error code otherwise */ virtual OFCondition getFloat32Array(Float32 *&val); /** get a pointer to the element value of the current element as type Float64. * Requires element to be of corresponding VR, otherwise an error is returned. * This method does not copy, but returns a pointer to the element value, * which remains under control of this object and is valid only until the next * read, write or put operation. * @param val pointer to value returned in this parameter upon success * @return EC_Normal upon success, an error code otherwise */ virtual OFCondition getFloat64Array(Float64 *&val); /** detach the value field from the DICOM element (i.e., this object). * After detaching the calling part of the application has total control * over the element value, especially the value must be deleted from the * heap after use. The DICOM element remains a copy of the value if the * copy parameter is OFTrue; otherwise the value is erased in the DICOM element. * @param copy if true, copy value field before detaching; if false, do not retain a copy. * @return EC_Normal upon success, an error code otherwise */ OFCondition detachValueField(OFBool copy = OFFalse); // PUT operations /** replace the element value by a copy of the given string (which is possibly multi-valued). * Requires element to be of corresponding VR, otherwise an error is returned. * @param stringValue new attribute value * @return EC_Normal upon success, an error code otherwise */ virtual OFCondition putOFStringArray(const OFString &stringValue); /** replace the element value by a copy of the given string (which is possibly multi-valued). * Requires element to be of corresponding VR, otherwise an error is returned. * @param val new attribute value * @return EC_Normal upon success, an error code otherwise */ virtual OFCondition putString(const char *val); /** insert into the element value a copy of the given Sint16 value. If the * attribute is multi-valued, all other values remain untouched. * Requires element to be of corresponding VR, otherwise an error is returned. * @param val new value to be inserted * @param pos position for insert operation. Value: pos <= getVM(), i.e. * a value can be appended to the end of the current element or inserted within * the existing value field. * @return EC_Normal upon success, an error code otherwise */ virtual OFCondition putSint16(const Sint16 val, const unsigned long pos = 0); /** insert into the element value a copy of the given Uint16 value. If the * attribute is multi-valued, all other values remain untouched. * Requires element to be of corresponding VR, otherwise an error is returned. * @param val new value to be inserted * @param pos position for insert operation. Value: pos <= getVM(), i.e. * a value can be appended to the end of the current element or inserted within * the existing value field. * @return EC_Normal upon success, an error code otherwise */ virtual OFCondition putUint16(const Uint16 val, const unsigned long pos = 0); /** insert into the element value a copy of the given Sint32 value. If the * attribute is multi-valued, all other values remain untouched. * Requires element to be of corresponding VR, otherwise an error is returned. * @param val new value to be inserted * @param pos position for insert operation. Value: pos <= getVM(), i.e. * a value can be appended to the end of the current element or inserted within * the existing value field. * @return EC_Normal upon success, an error code otherwise */ virtual OFCondition putSint32(const Sint32 val, const unsigned long pos = 0); /** insert into the element value a copy of the given Uint32 value. If the * attribute is multi-valued, all other values remain untouched. * Requires element to be of corresponding VR, otherwise an error is returned. * @param val new value to be inserted * @param pos position for insert operation. Value: pos <= getVM(), i.e. * a value can be appended to the end of the current element or inserted within * the existing value field. * @return EC_Normal upon success, an error code otherwise */ virtual OFCondition putUint32(const Uint32 val, const unsigned long pos = 0); /** insert into the element value a copy of the given Float32 value. If the * attribute is multi-valued, all other values remain untouched. * Requires element to be of corresponding VR, otherwise an error is returned. * @param val new value to be inserted * @param pos position for insert operation. Value: pos <= getVM(), i.e. * a value can be appended to the end of the current element or inserted within * the existing value field. * @return EC_Normal upon success, an error code otherwise */ virtual OFCondition putFloat32(const Float32 val, const unsigned long pos = 0); /** insert into the element value a copy of the given Float64 value. If the * attribute is multi-valued, all other values remain untouched. * Requires element to be of corresponding VR, otherwise an error is returned. * @param val new value to be inserted * @param pos position for insert operation. Value: pos <= getVM(), i.e. * a value can be appended to the end of the current element or inserted within * the existing value field. * @return EC_Normal upon success, an error code otherwise */ virtual OFCondition putFloat64(const Float64 val, const unsigned long pos = 0); /** insert into the element value a copy of the given DcmTagKey value. If the * attribute is multi-valued, all other values remain untouched. * Requires element to be of corresponding VR, otherwise an error is returned. * @param attrTag new value to be inserted * @param pos position for insert operation. Value: pos <= getVM(), i.e. * a value can be appended to the end of the current element or inserted within * the existing value field. * @return EC_Normal upon success, an error code otherwise */ virtual OFCondition putTagVal(const DcmTagKey &attrTag, const unsigned long pos = 0); /** replace the element value by a copy of the given Uint8 array (which is possibly multi-valued). * Requires element to be of corresponding VR, otherwise an error is returned. * @param vals new attribute value * @param num number of values in array vals * @return EC_Normal upon success, an error code otherwise */ virtual OFCondition putUint8Array(const Uint8 *vals, const unsigned long num); /** replace the element value by a copy of the given Sint16 array (which is possibly multi-valued). * Requires element to be of corresponding VR, otherwise an error is returned. * @param vals new attribute value * @param num number of values in array vals * @return EC_Normal upon success, an error code otherwise */ virtual OFCondition putSint16Array(const Sint16 *vals, const unsigned long num); /** replace the element value by a copy of the given Uint16 array (which is possibly multi-valued). * Requires element to be of corresponding VR, otherwise an error is returned. * @param vals new attribute value * @param num number of values in array vals * @return EC_Normal upon success, an error code otherwise */ virtual OFCondition putUint16Array(const Uint16 *vals, const unsigned long num); /** replace the element value by a copy of the given Sint32 array (which is possibly multi-valued). * Requires element to be of corresponding VR, otherwise an error is returned. * @param vals new attribute value * @param num number of values in array vals * @return EC_Normal upon success, an error code otherwise */ virtual OFCondition putSint32Array(const Sint32 *vals, const unsigned long num); /** replace the element value by a copy of the given Uint32 array (which is possibly multi-valued). * Requires element to be of corresponding VR, otherwise an error is returned. * @param vals new attribute value * @param num number of values in array vals * @return EC_Normal upon success, an error code otherwise */ virtual OFCondition putUint32Array(const Uint32 *vals, const unsigned long num); /** replace the element value by a copy of the given Float32 array (which is possibly multi-valued). * Requires element to be of corresponding VR, otherwise an error is returned. * @param vals new attribute value * @param num number of values in array vals * @return EC_Normal upon success, an error code otherwise */ virtual OFCondition putFloat32Array(const Float32 *vals, const unsigned long num); /** replace the element value by a copy of the given Float64 array (which is possibly multi-valued). * Requires element to be of corresponding VR, otherwise an error is returned. * @param vals new attribute value * @param num number of values in array vals * @return EC_Normal upon success, an error code otherwise */ virtual OFCondition putFloat64Array(const Float64 *vals, const unsigned long num); /** Copy numBytes bytes of data from the attribute value in byteOrder byte order * to targetBuffer, starting at byte offset offset of the attribute value. * This method does not cause the complete attribute value to be read into * main memory. Subsequent calls for the same partial value may cause repeated * access to file if the attribute value is kept in file. * @param targetBuffer pointer to target buffer, must not be NULL. * Buffer size must be at least numBytes bytes. * @param offset byte offset within the attribute value from where to start * copying * @param numBytes number of bytes to copy. * @param cache file cache object that may be passed to multiple subsequent calls * to this method for the same file; the file cache will then keep a file * handle open, thus improving performance. Optional, may be NULL * @param byteOrder byte order desired byte order of attribute value in memory buffer. * Default is the local byte order of the machine. * @return EC_Normal upon success, an error code otherwise */ virtual OFCondition getPartialValue(void *targetBuffer, const Uint32 offset, Uint32 numBytes, DcmFileCache *cache = NULL, E_ByteOrder byteOrder = gLocalByteOrder); /** create an empty Uint8 array of given number of bytes and set it. * All array elements are initialized with a value of 0 (using 'memzero'). * This method is only applicable to certain VRs, e.g. OB. * @param numBytes number of bytes (8 bit) to be created * @param bytes stores the pointer to the resulting buffer * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition createUint8Array(const Uint32 numBytes, Uint8 *&bytes); /** create an empty Uint16 array of given number of words and set it. * All array elements are initialized with a value of 0 (using 'memzero'). * This method is only applicable to OW data. * @param numWords number of words (16 bit) to be created * @param words stores the pointer to the resulting buffer * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition createUint16Array(const Uint32 numWords, Uint16 *&words); /** replace the attribute value with the content of the given temporary file. * The temporary file is not opened/loaded until the attribute value is accessed, * very much like large attributes that remain in file during a read operation. * @param factory a factory object that is able to create an input stream * to the temporary file at the right location. * @param length attribute value length, in bytes. Must be even length. * The length is not checked against the real length of the temporary file, * which might be written or completed after the call to this method. * @param byteOrder byte order in the temporary file * @return EC_Normal upon success, an error code otherwise. */ virtual OFCondition createValueFromTempFile(DcmInputStreamFactory *factory, const Uint32 length, const E_ByteOrder byteOrder); /** remove the attribute value from memory if the attribute value can * be loaded from file when needed again. Otherwise do nothing. */ virtual void compact(); /** compute uncompressed frame size of a single frame of this image. * Note that the value returned by this method does not include the pad byte * to even size needed for a buffer into which a frame is to be loaded. * @param dataset dataset in which this pixel data element is contained * @param frameSize frame size in bytes (without padding) returned in this parameter upon success * @return EC_Normal if successful, an error code otherwise */ virtual OFCondition getUncompressedFrameSize(DcmItem *dataset, Uint32 &frameSize) const; /** access single frame without decompressing or loading a complete * multi-frame object. The frame is copied into the buffer passed by the caller * which must be large enough to contain a complete frame. * @param dataset pointer to DICOM dataset in which this pixel data object is * located. Used to access rows, columns, samples per pixel etc. * @param frameNo numer of frame, starting with 0 for the first frame. * @param startFragment index of the compressed fragment that contains * all or the first part of the compressed bitstream for the given frameNo. * Upon successful return this parameter is updated to contain the index * of the first compressed fragment of the next frame. * When unknown, zero should be passed. In this case the decompression * algorithm will try to determine the index by itself, which will always * work if frames are decompressed in increasing order from first to last, * but may fail if frames are decompressed in random order, multiple fragments * per frame and multiple frames are present in the dataset, and the offset * table is empty. * @param buffer pointer to buffer allocated by the caller. The buffer * must be large enough for one frame of this image. * @param bufSize size of buffer, in bytes * @param decompressedColorModel upon successful return, the color model * of the decompressed image (which may be different from the one used * in the compressed images) is returned in this parameter. * @param cache file cache object that may be passed to multiple subsequent calls * to this method for the same file; the file cache will then keep a file * handle open, thus improving performance. Optional, may be NULL * @return EC_Normal if successful, an error code otherwise */ virtual OFCondition getUncompressedFrame(DcmItem *dataset, Uint32 frameNo, Uint32 &startFragment, void *buffer, Uint32 bufSize, OFString &decompressedColorModel, DcmFileCache *cache = NULL); /** determine color model of the decompressed image * @param dataset pointer to DICOM dataset in which this pixel data object * is located. Used to access photometric interpretation. * @param decompressedColorModel upon successful return, the color model * of the decompressed image (which may be different from the one used * in the compressed images) is returned in this parameter * @return EC_Normal if successful, an error code otherwise */ virtual OFCondition getDecompressedColorModel(DcmItem *dataset, OFString &decompressedColorModel); /* --- static helper functions --- */ /** scan string value for conformance with given value representation (VR) * @param value string value to be scanned * @param vr two-character identifier of the VR to be checked (lower case) * @param pos position of the first character to be scanned in 'value' * @param num number of characters to be scanned in 'value' (default: all) * @return numeric identifier of the VR found, 16 in case of unknown VR */ static int scanValue(const OFString &value, const OFString &vr, const size_t pos = 0, const size_t num = OFString_npos); protected: /** This function returns this element's value. The returned value * corresponds to the byte ordering (little or big endian) that * was passed. * @param newByteOrder The byte ordering that shall be accounted * for (little or big endian). */ void *getValue(const E_ByteOrder newByteOrder = gLocalByteOrder); /** insert into the element value a copy of the given raw value. If the * attribute is multi-valued, all other values remain untouched. * Only works for fixed-size VRs, not for strings. * @param value new value to be inserted * @param position position for insert operation. Value: pos <= getVM(), i.e. * a value can be appended to the end of the current element or inserted within * the existing value field. * @param num number of bytes for each value in the value field. * @return EC_Normal upon success, an error code otherwise */ OFCondition changeValue(const void *value, // new Value const Uint32 position, // position in value array const Uint32 num); // number of new value bytes /** replace the element value by a copy of the given raw data block * @param value new attribute value * @param length length of new attribute value in bytes * @return EC_Normal upon success, an error code otherwise */ OFCondition putValue(const void *value, // new value const Uint32 length); // number of new value bytes /** create a new, empty value field of given size. * @param length size of new value field in bytes * @return EC_Normal if successful, an error code otherwise. */ OFCondition createEmptyValue(const Uint32 length); // number of new value bytes /** This function reads the data value of an attribute and stores the * information which was read in this. The information is either read * from the inStream or (if inStream is NULL) from a different stream * which was created earlier and which is accessible through the fLoadValue * member variable. Note that if not all information for an attribute * could be read from the stream, the function returns EC_StreamNotifyClient. * @param inStream The stream which contains the information. * @return status, EC_Normal if successful, an error code otherwise */ OFCondition loadValue(DcmInputStream *inStream = NULL); /** performs clean-up functions after loading an attribute value into main memory. * In particular, if dcmEnableAutomaticInputDataCorrection is enabled, silently * fixes odd length elements. */ virtual void postLoadValue(); /** This function creates a byte array of Length bytes and returns this * array. In case Length is odd, an array of Length+1 bytes will be * created and Length will be increased by 1. */ virtual Uint8 *newValueField(); /** swaps the content of the value field (if loaded) from big-endian to * little-endian or back * @param valueWidth width (in bytes) of each element value */ void swapValueField(size_t valueWidth); /** write element start tag in XML format * @param out output stream to which the XML start tag is written * @param flags flag used to customize the output (not yet used) * @param attrText extra attribute text to be added to the element tag */ virtual void writeXMLStartTag(STD_NAMESPACE ostream &out, const size_t flags, const char *attrText = NULL); /** write element end tag in XML format * @param out output stream to which the XML end tag is written * @param flags flag used to customize the output (not yet used) */ virtual void writeXMLEndTag(STD_NAMESPACE ostream &out, const size_t flags); /** return the current byte order of the value field * @return current byte order of the value field */ E_ByteOrder getByteOrder() const { return fByteOrder; } /** set the current byte order of the value field * @param val byte order of the value field */ void setByteOrder(E_ByteOrder val) { fByteOrder = val; } /* --- static helper functions --- */ /** check for correct value multiplicity (VM) * @param vmNum value multiplicity of the value to be checked. * For empty values (vmNum=0), the status of the check is always EC_Normal (i.e. no error). * @param vmStr value multiplicity (according to the data dictionary) to be checked for. * (valid values: "1", "1-2", "1-3", "1-8", "1-99", "1-n", "2", "2-n", "2-2n", * "3", "3-n", "3-3n", "4", "6", "9", "16", "32") * @return status of the check, EC_ValueMultiplicityViolated in case of error */ static OFCondition checkVM(const unsigned long vmNum, const OFString &vmStr); private: /// current byte order of attribute value in memory E_ByteOrder fByteOrder; /// required information to load value later DcmInputStreamFactory *fLoadValue; /// value of the element Uint8 *fValue; }; #endif // DCELEM_H /* ** CVS/RCS Log: ** $Log: dcelem.h,v $ ** Revision 1.49 2010-11-05 09:34:11 joergr ** Added support for checking the value multiplicity "9" (see Supplement 131). ** ** Revision 1.48 2010-10-14 13:15:40 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.47 2010-04-23 15:28:17 joergr ** Specify an appropriate default value for the "vm" parameter of checkValue(). ** ** Revision 1.46 2010-04-23 14:28:00 joergr ** Added new method to all VR classes which checks whether the stored value ** conforms to the VR definition and to the specified VM. ** ** Revision 1.45 2010-04-22 09:01:18 joergr ** Added support for further VM values ("1-8", "1-99", "16", "32") to be checked. ** ** Revision 1.44 2010-03-01 09:08:44 uli ** Removed some unnecessary include directives in the headers. ** ** Revision 1.43 2009-11-17 16:36:51 joergr ** Added new method that allows for determining the color model of the ** decompressed image. ** ** Revision 1.42 2009-08-03 09:05:29 joergr ** Added methods that check whether a given string value conforms to the VR and ** VM definitions of the DICOM standards. ** ** Revision 1.41 2009-05-11 16:05:45 meichel ** Minor fix in DcmElement::getUncompressedFrameSize for the rare case that ** BitsAllocated is not 8 or 16. Also the method now returns the true frame ** size without any pad byte. ** ** Revision 1.40 2009-02-04 17:52:17 joergr ** Fixes various type mismatches reported by MSVC introduced with OFFile class. ** ** Revision 1.39 2008-07-17 11:19:48 onken ** Updated copyFrom() documentation. ** ** Revision 1.38 2008-07-17 10:30:23 onken ** Implemented copyFrom() method for complete DcmObject class hierarchy, which ** permits setting an instance's value from an existing object. Implemented ** assignment operator where necessary. ** ** Revision 1.37 2008-06-23 12:09:13 joergr ** Fixed inconsistencies in Doxygen API documentation. ** ** Revision 1.36 2008-05-29 10:43:21 meichel ** Implemented new method createValueFromTempFile that allows the content of ** a temporary file to be set as the new value of a DICOM element. ** Also added a new method compact() that removes the value field if the ** value field can still be reconstructed from file. For large attribute ** value the file reference is now kept in memory even when the value has ** been loaded once. Finally, added new helper method getUncompressedFrameSize ** that computes the size of an uncompressed frame for a given dataset. ** ** Revision 1.35 2007/11/29 14:30:19 meichel ** Write methods now handle large raw data elements (such as pixel data) ** without loading everything into memory. This allows very large images to ** be sent over a network connection, or to be copied without ever being ** fully in memory. ** ** Revision 1.34 2007/07/11 08:50:23 meichel ** Initial release of new method DcmElement::getPartialValue which gives access ** to partial attribute values without loading the complete attribute value ** into memory, if kept in file. ** ** Revision 1.33 2007/06/29 14:17:49 meichel ** Code clean-up: Most member variables in module dcmdata are now private, ** not protected anymore. ** ** Revision 1.32 2007/06/07 09:01:15 joergr ** Added createUint8Array() and createUint16Array() methods. ** ** Revision 1.31 2006/10/13 10:12:02 joergr ** Fixed wrong formatting. ** ** Revision 1.30 2006/08/15 15:49:56 meichel ** Updated all code in module dcmdata to correctly compile when ** all standard C++ classes remain in namespace std. ** ** Revision 1.29 2005/12/08 16:28:11 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.28 2004/07/01 12:28:25 meichel ** Introduced virtual clone method for DcmObject and derived classes. ** ** Revision 1.27 2003/07/04 13:25:35 meichel ** Replaced forward declarations for OFString with explicit includes, ** needed when compiling with HAVE_STD_STRING ** ** Revision 1.26 2002/12/09 09:31:14 wilkens ** Modified/Added doc++ documentation. ** ** Revision 1.25 2002/12/06 12:49:09 joergr ** Enhanced "print()" function by re-working the implementation and replacing ** the boolean "showFullData" parameter by a more general integer flag. ** Added doc++ documentation. ** Made source code formatting more consistent with other modules/files. ** ** Revision 1.24 2002/08/27 16:55:31 meichel ** Initial release of new DICOM I/O stream classes that add support for stream ** compression (deflated little endian explicit VR transfer syntax) ** ** Revision 1.23 2002/04/25 10:06:09 joergr ** Added/modified getOFStringArray() implementation. ** Added support for XML output of DICOM objects. ** ** Revision 1.22 2001/09/25 17:19:25 meichel ** Adapted dcmdata to class OFCondition ** ** Revision 1.21 2001/06/01 15:48:39 meichel ** Updated copyright header ** ** Revision 1.20 2001/05/10 12:50:21 meichel ** Added protected createEmptyValue() method in class DcmElement. ** ** Revision 1.19 2000/11/07 16:56:06 meichel ** Initial release of dcmsign module for DICOM Digital Signatures ** ** Revision 1.18 2000/03/08 16:26:14 meichel ** Updated copyright header. ** ** Revision 1.17 2000/02/02 14:31:16 joergr ** Replaced 'delete' statements by 'delete[]' for objects created with 'new[]'. ** ** Revision 1.16 1999/03/31 09:24:37 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.15 1998/11/12 16:47:38 meichel ** Implemented operator= for all classes derived from DcmObject. ** ** Revision 1.14 1998/07/15 15:48:47 joergr ** Removed several compiler warnings reported by gcc 2.8.1 with ** additional options, e.g. missing copy constructors and assignment ** operators, initialization of member variables in the body of a ** constructor instead of the member initialization list, hiding of ** methods by use of identical names, uninitialized member variables, ** missing const declaration of char pointers. Replaced tabs by spaces. ** ** Revision 1.13 1997/09/11 15:13:10 hewett ** Modified getOFString method arguments by removing a default value ** for the pos argument. By requiring the pos argument to be provided ** ensures that callers realise getOFString only gets one component of ** a multi-valued string. ** ** Revision 1.12 1997/08/29 08:32:38 andreas ** - Added methods getOFString and getOFStringArray for all ** string VRs. These methods are able to normalise the value, i. e. ** to remove leading and trailing spaces. This will be done only if ** it is described in the standard that these spaces are not relevant. ** These methods do not test the strings for conformance, this means ** especially that they do not delete spaces where they are not allowed! ** getOFStringArray returns the string with all its parts separated by \ ** and getOFString returns only one value of the string. ** CAUTION: Currently getString returns a string with trailing ** spaces removed (if dcmEnableAutomaticInputDataCorrection == OFTrue) and ** truncates the original string (since it is not copied!). If you rely on this ** behaviour please change your application now. ** Future changes will ensure that getString returns the original ** string from the DICOM object (NULL terminated) inclusive padding. ** Currently, if you call getOF... before calling getString without ** normalisation, you can get the original string read from the DICOM object. ** ** Revision 1.11 1997/07/31 06:57:59 andreas ** new protected method swapValueField for DcmElement ** ** Revision 1.10 1997/07/21 07:57:53 andreas ** - New method DcmElement::detachValueField to give control over the ** value field to the calling part (see dcelem.h) ** - Replace all boolean types (BOOLEAN, CTNBOOLEAN, DICOM_BOOL, BOOL) ** with one unique boolean type OFBool. ** ** Revision 1.9 1997/05/27 13:48:26 andreas ** - Add method canWriteXfer to class DcmObject and all derived classes. ** This method checks whether it is possible to convert the original ** transfer syntax to an new transfer syntax. The check is used in the ** dcmconv utility to prohibit the change of a compressed transfer ** syntax to a uncompressed. ** ** Revision 1.8 1997/05/16 08:23:46 andreas ** - Revised handling of GroupLength elements and support of ** DataSetTrailingPadding elements. The enumeratio E_GrpLenEncoding ** got additional enumeration values (for a description see dctypes.h). ** addGroupLength and removeGroupLength methods are replaced by ** computeGroupLengthAndPadding. To support Padding, the parameters of ** element and sequence write functions changed. ** - Added a new method calcElementLength to calculate the length of an ** element, item or sequence. For elements it returns the length of ** tag, length field, vr field, and value length, for item and ** sequences it returns the length of the whole item. sequence including ** the Delimitation tag (if appropriate). It can never return ** UndefinedLength. ** ** Revision 1.7 1997/04/18 08:13:28 andreas ** - The put/get-methods for all VRs did not conform to the C++-Standard ** draft. Some Compilers (e.g. SUN-C++ Compiler, Metroworks ** CodeWarrier, etc.) create many warnings concerning the hiding of ** overloaded get methods in all derived classes of DcmElement. ** So the interface of all value representation classes in the ** library are changed rapidly, e.g. ** OFCondition get(Uint16 & value, const unsigned long pos); ** becomes ** OFCondition getUint16(Uint16 & value, const unsigned long pos); ** All (retired) "returntype get(...)" methods are deleted. ** For more information see dcmdata/include/dcelem.h ** ** Revision 1.6 1996/07/17 12:38:58 andreas ** new nextObject to iterate a DicomDataset, DicomFileFormat, Item, ... ** ** Revision 1.5 1996/04/16 16:01:36 andreas ** - put methods for AttributeTag with DcmTagKey Parameter ** - better support for NULL values ** ** Revision 1.4 1996/03/12 15:31:56 hewett ** The base virtual get & put functions now support char*. ** ** Revision 1.3 1996/01/05 13:22:55 andreas ** - changed to support new streaming facilities ** - more cleanups ** - merged read / write methods for block and file transfer ** */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/dcvrpn.h0000644000310500011400000004471211464747623021251 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Gerd Ehlers * * Purpose: Interface of class DcmPersonName * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-11-05 09:34:11 $ * CVS/RCS Revision: $Revision: 1.26 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DCVRPN_H #define DCVRPN_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcchrstr.h" /** a class representing the DICOM value representation 'Person Name' (PN) */ class DcmPersonName : public DcmCharString { public: /** constructor. * Create new element from given tag and length. * @param tag DICOM tag for the new element * @param len value length for the new element */ DcmPersonName(const DcmTag &tag, const Uint32 len = 0); /** copy constructor * @param old element to be copied */ DcmPersonName(const DcmPersonName &old); /** destructor */ virtual ~DcmPersonName(); /** assignment operator * @param obj element to be assigned/copied * @return reference to this object */ DcmPersonName &operator=(const DcmPersonName &obj); /** clone method * @return deep copy of this object */ virtual DcmObject *clone() const { return new DcmPersonName(*this); } /** Virtual object copying. This method can be used for DcmObject * and derived classes to get a deep copy of an object. Internally * the assignment operator is called if the given DcmObject parameter * is of the same type as "this" object instance. If not, an error * is returned. This function permits copying an object by value * in a virtual way which therefore is different to just calling the * assignment operator of DcmElement which could result in slicing * the object. * @param rhs - [in] The instance to copy from. Has to be of the same * class type as "this" object * @return EC_Normal if copying was successful, error otherwise */ virtual OFCondition copyFrom(const DcmObject& rhs); /** get element type identifier * @return type identifier of this class (EVR_PN) */ virtual DcmEVR ident() const; /** check whether stored value conforms to the VR and to the specified VM * @param vm value multiplicity (according to the data dictionary) to be checked for. * (valid values: "1", "1-2", "1-3", "1-8", "1-99", "1-n", "2", "2-n", "2-2n", * "3", "3-n", "3-3n", "4", "6", "9", "16", "32") * @param oldFormat support old ACR/NEMA format if OFTrue (no '^' separator) * @return status of the check, EC_Normal if value is correct, an error code otherwise */ virtual OFCondition checkValue(const OFString &vm = "1-n", const OFBool oldFormat = OFFalse); /** get a copy of a particular string component * @param stringVal variable in which the result value is stored * @param pos index of the value in case of multi-valued elements (0..vm-1) * @param normalize delete leading and trailing spaces if OFTrue * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition getOFString(OFString &stringVal, const unsigned long pos, OFBool normalize = OFTrue); /** get name components from the element value. * The DICOM PN consists of up to three component groups separated by a "=". The * supported format is "[CG0][=CG1][=CG2]" where the brackets enclose optional * parts and CG0 is a single-byte character representation, CG1 an ideographic * representation, and CG2 a phonetic representation of the name. * Each component group may consist of up to five components separated by a "^". * The format is "[lastName[^firstName[^middleName[^namePrefix[^nameSuffix]]]]"; * each component might be empty. * If this function fails the result variables are cleared automatically. If the * format is valid but does not comply with the above described scheme ("=" and "^") * the full person name is returned in the 'lastName' variable. * @param lastName reference to string variable where the "last name" is stored * @param firstName reference to string variable where the "first name" is stored * @param middleName reference to string variable where the "middle name" is stored * @param namePrefix reference to string variable where the "name prefix" is stored * @param nameSuffix reference to string variable where the "name suffix" is stored * @param pos index of the element component in case of value multiplicity (0..vm-1) * @param componentGroup index of the component group (0..2) to be used, see above * @return EC_Normal upon success, an error code otherwise */ OFCondition getNameComponents(OFString &lastName, OFString &firstName, OFString &middleName, OFString &namePrefix, OFString &nameSuffix, const unsigned long pos = 0, const unsigned int componentGroup = 0); /** get current element value as a formatted/readable name. * The current element value is expected to be in DICOM PN format as described above. * The output format is "[namePrefix][ firstName][ middleName][ lastName][, nameSuffix]"; * the delimiters (" " and ", ") are only inserted if required. * If this function fails the result variable 'formattedName' is cleared automatically. * @param formattedName reference to string variable where the result is stored * @param pos index of the element component in case of value multiplicity (0..vm-1) * @param componentGroup index of the component group (0..2) to be used, see above * @return EC_Normal upon success, an error code otherwise */ OFCondition getFormattedName(OFString &formattedName, const unsigned long pos = 0, const unsigned int componentGroup = 0); /** put element value from specified name components. * The stored format is "[lastName[^firstName[^middleName[^namePrefix[^nameSuffix]]]]]", * i.e. a DICOM Person Name (PN). Component groups are not (yet) supported. * If this function fails the currently stored value is not modified. * @param lastName reference to string variable where the "last name" is stored * @param firstName reference to string variable where the "first name" is stored * @param middleName reference to string variable where the "middle name" is stored * @param namePrefix reference to string variable where the "name prefix" is stored * @param nameSuffix reference to string variable where the "name suffix" is stored * @return EC_Normal upon success, an error code otherwise */ OFCondition putNameComponents(const OFString &lastName, const OFString &firstName, const OFString &middleName, const OFString &namePrefix, const OFString &nameSuffix); /* --- static helper functions --- */ /** get name components from specified DICOM person name. * The DICOM PN consists of up to three component groups separated by a "=". The * supported format is "[CG0][=CG1][=CG2]" where the brackets enclose optional * parts and CG0 is a single-byte character representation, CG1 an ideographic * representation, and CG2 a phonetic representation of the name. * Each component group may consist of up to five components separated by a "^". * The format is "[lastName[^firstName[^middleName[^namePrefix[^nameSuffix]]]]"; * each component might be empty. * If this function fails the result variables are cleared automatically. If the * format is valid but does not comply with the above described scheme ("=" and "^") * the full person name is returned in the 'lastName' variable. * @param dicomName string value in DICOM PN format to be split into components * @param lastName reference to string variable where the "last name" is stored * @param firstName reference to string variable where the "first name" is stored * @param middleName reference to string variable where the "middle name" is stored * @param namePrefix reference to string variable where the "name prefix" is stored * @param nameSuffix reference to string variable where the "name suffix" is stored * @param componentGroup index of the component group (0..2) to be used, see above * @return EC_Normal upon success, an error code otherwise */ static OFCondition getNameComponentsFromString(const OFString &dicomName, OFString &lastName, OFString &firstName, OFString &middleName, OFString &namePrefix, OFString &nameSuffix, const unsigned int componentGroup = 0); /** get specified DICOM person name as a formatted/readable name. * The specified 'dicomName' is expected to be in DICOM PN format as described above. * The output format is "[namePrefix][ firstName][ middleName][ lastName][, nameSuffix]"; * the delimiters (" " and ", ") are only inserted if required. * If this function fails the result variable 'formattedName' is cleared automatically. * @param dicomName string value in DICOM PN format to be converted to readable format * @param formattedName reference to string variable where the result is stored * @param componentGroup index of the component group (0..2) to be used, see above * @return EC_Normal upon success, an error code otherwise */ static OFCondition getFormattedNameFromString(const OFString &dicomName, OFString &formattedName, const unsigned int componentGroup = 0); /** get formatted/readable name from specified name components. * The output format is "[namePrefix][ firstName][ middleName][ lastName][, nameSuffix]"; * the delimiters (" " and ", ") are only inserted if required. * If this function fails the result variable 'formattedName' is cleared automatically. * @param lastName reference to string variable where the "last name" is stored * @param firstName reference to string variable where the "first name" is stored * @param middleName reference to string variable where the "middle name" is stored * @param namePrefix reference to string variable where the "name prefix" is stored * @param nameSuffix reference to string variable where the "name suffix" is stored * @param formattedName reference to string variable where the result is stored * @return always returns EC_Normal */ static OFCondition getFormattedNameFromComponents(const OFString &lastName, const OFString &firstName, const OFString &middleName, const OFString &namePrefix, const OFString &nameSuffix, OFString &formattedName); /** get DICOM Person Name (PN) from specified name components. * The output format is "[lastName[^firstName[^middleName[^namePrefix[^nameSuffix]]]]]". * Component groups are not (yet) supported. * If this function fails the result variable 'dicomName' is cleared automatically. * @param lastName reference to string variable where the "last name" is stored * @param firstName reference to string variable where the "first name" is stored * @param middleName reference to string variable where the "middle name" is stored * @param namePrefix reference to string variable where the "name prefix" is stored * @param nameSuffix reference to string variable where the "name suffix" is stored * @param dicomName reference to string variable where the result is stored * @return always returns EC_Normal */ static OFCondition getStringFromNameComponents(const OFString &lastName, const OFString &firstName, const OFString &middleName, const OFString &namePrefix, const OFString &nameSuffix, OFString &dicomName); /** check whether given string value conforms to the VR "PN" (Person Name) * and to the specified VM. * @param value string value to be checked (possibly multi-valued) * @param vm value multiplicity (according to the data dictionary) to be checked for. * (valid values: "1", "1-2", "1-3", "1-8", "1-99", "1-n", "2", "2-n", "2-2n", * "3", "3-n", "3-3n", "4", "6", "9", "16", "32") * @param oldFormat support old ACR/NEMA name format if OFTrue (i.e. without "^" delimiters) * @return status of the check, EC_Normal if value is correct, an error code otherwise */ static OFCondition checkStringValue(const OFString &value, const OFString &vm = "1-n", const OFBool oldFormat = OFTrue); }; #endif // DCVRPN_H /* ** CVS/RCS Log: ** $Log: dcvrpn.h,v $ ** Revision 1.26 2010-11-05 09:34:11 joergr ** Added support for checking the value multiplicity "9" (see Supplement 131). ** ** Revision 1.25 2010-10-14 13:15:43 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.24 2010-04-23 15:26:13 joergr ** Specify an appropriate default value for the "vm" parameter of checkValue(). ** ** Revision 1.23 2010-04-23 14:25:27 joergr ** Added new method to all VR classes which checks whether the stored value ** conforms to the VR definition and to the specified VM. ** ** Revision 1.22 2010-04-22 09:31:30 joergr ** Revised misleading parameter documentation for the checkValue() method. ** ** Revision 1.21 2010-04-22 08:59:10 joergr ** Added support for further VM values ("1-8", "1-99", "16", "32") to be checked. ** ** Revision 1.20 2009-08-03 09:05:30 joergr ** Added methods that check whether a given string value conforms to the VR and ** VM definitions of the DICOM standards. ** ** Revision 1.19 2008-07-17 11:19:49 onken ** Updated copyFrom() documentation. ** ** Revision 1.18 2008-07-17 10:30:23 onken ** Implemented copyFrom() method for complete DcmObject class hierarchy, which ** permits setting an instance's value from an existing object. Implemented ** assignment operator where necessary. ** ** Revision 1.17 2005-12-08 16:29:05 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.16 2004/07/01 12:28:25 meichel ** Introduced virtual clone method for DcmObject and derived classes. ** ** Revision 1.15 2003/05/20 08:56:20 joergr ** Added methods and static functions to compose a DICOM Person Name from five ** name components. ** ** Revision 1.14 2002/12/06 12:49:17 joergr ** Enhanced "print()" function by re-working the implementation and replacing ** the boolean "showFullData" parameter by a more general integer flag. ** Added doc++ documentation. ** Made source code formatting more consistent with other modules/files. ** ** Revision 1.13 2002/04/25 09:56:19 joergr ** Removed getOFStringArray() implementation. ** ** Revision 1.12 2001/10/10 15:17:38 joergr ** Updated comments. ** ** Revision 1.11 2001/10/01 15:01:39 joergr ** Introduced new general purpose functions to get/set person names, date, time ** and date/time. ** ** Revision 1.10 2001/09/25 17:19:33 meichel ** Adapted dcmdata to class OFCondition ** ** Revision 1.9 2001/06/01 15:48:51 meichel ** Updated copyright header ** ** Revision 1.8 2000/03/08 16:26:25 meichel ** Updated copyright header. ** ** Revision 1.7 1999/03/31 09:25:04 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.6 1998/11/12 16:47:52 meichel ** Implemented operator= for all classes derived from DcmObject. ** ** Revision 1.5 1997/09/11 15:13:16 hewett ** Modified getOFString method arguments by removing a default value ** for the pos argument. By requiring the pos argument to be provided ** ensures that callers realise getOFString only gets one component of ** a multi-valued string. ** ** Revision 1.4 1997/08/29 08:32:43 andreas ** - Added methods getOFString and getOFStringArray for all ** string VRs. These methods are able to normalise the value, i. e. ** to remove leading and trailing spaces. This will be done only if ** it is described in the standard that these spaces are not relevant. ** These methods do not test the strings for conformance, this means ** especially that they do not delete spaces where they are not allowed! ** getOFStringArray returns the string with all its parts separated by \ ** and getOFString returns only one value of the string. ** CAUTION: Currently getString returns a string with trailing ** spaces removed (if dcmEnableAutomaticInputDataCorrection == OFTrue) and ** truncates the original string (since it is not copied!). If you rely on this ** behaviour please change your application now. ** Future changes will ensure that getString returns the original ** string from the DICOM object (NULL terminated) inclusive padding. ** Currently, if you call getOF... before calling getString without ** normalisation, you can get the original string read from the DICOM object. ** ** Revision 1.3 1996/01/05 13:23:08 andreas ** - changed to support new streaming facilities ** - more cleanups ** - merged read / write methods for block and file transfer ** */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/dcpath.h0000644000310500011400000005644311455601175021213 0ustar joergrdicom3/* * * Copyright (C) 2008-2010, 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: dcmdata * * Author: Michael Onken * * Purpose: Class declarations for accessing DICOM dataset structures (items, * sequences and leaf elements via string-based path access. * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:15:41 $ * CVS/RCS Revision: $Revision: 1.10 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DCPATH_H #define DCPATH_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcdatset.h" /** Class representing a node in DcmPath. A node contains just * a pointer to a DcmObject (e. g. a sequence or an item). Additionally * an item number is stored which also makes sense in case that the * object pointed to is an item. The item number is necessary because * when having only a pointer to a DcmItem there is no way to find out * at which position the item actually has in the surrounding sequence. */ class DcmPathNode { public: /** Constructor. Creates empty path node. */ DcmPathNode() : m_obj(NULL), m_itemNo(0) {} /** Constructor. Creates search node from object pointer and item number. * @param obj [in] The object the search node points to. The memory of the * given DICOM object is not handled by the node itself but * must be handled (ie. freed) from outside. * @param itemNo [in] The item number that should be set. Only relevant * if obj parameter contains an item */ DcmPathNode(DcmObject* obj, Uint32 itemNo) : m_obj(obj), m_itemNo(itemNo) {} /** Destructor. Nothing to do, the DICOM object is not freed automatically! */ ~DcmPathNode() { } /// Pointer to object this search node points to DcmObject* m_obj; /// The item number of the item in m_obj; only useful if m_obj is an item Uint32 m_itemNo; private: /** Private undefined copy constructor */ DcmPathNode(const DcmPathNode& rhs); /** Private undefined assignment operator */ DcmPathNode& operator=(const DcmPathNode& arg); }; /** Class representing a path of DICOM objects. A path is a "way" through * a DICOM dataset, ie. it starts e. g. with an item, follwed by a sequence * originally contained in this item. The sequence then could be followed by * another item which is part of the sequence and so on. Thus the path * should be wellformed, but if it is created manually (e. g. using append()) * there is no corresponding checking. */ class DcmPath { public: /** Constructor, creates an empty search result */ DcmPath(); /** Constructor, creates a search result from a list of search nodes. * @param currentPath [in] The list of search nodes representing a * "path" through a DICOM dataset */ DcmPath(const OFList& currentPath); /** Appends a search node at the end of the search result path. It is not * checked whether the resulting path is still valid. * @param node [in] The node to append. * */ void append(DcmPathNode* node); /** Removes last path node from path. Also frees memory of path node * but does _not_ free memory of the underlying DICOM item or element. * @return none */ void deleteBackNode(); /** Returns iterator pointing to first path component. * @return Iterator to first path node. */ OFListIterator(DcmPathNode*) begin(); /** Returns last path component. * @return The last path component, NULL if none exists. */ DcmPathNode* back(); /** Returns iterator pointing to last path component. * @return Iterator to last path node. */ OFListIterator(DcmPathNode*) end(); /** Returns number of path components. * @return The number of path components */ Uint32 size() const; /** Returns whether path is empty, ie does not contain any path nodes * @return OFTrue, if path is empty, OFFalse otherwise */ OFBool empty() const; /** Returns a string representation of the path, * e. g. "SourceImageSequence[0].ReferencedSOPInstanceUID" * @return String representing path */ OFString toString() const; /** Returns whether the path contains tags of a given group. * Might be useful for looking after (unwanted) meta header tags etc. * @param groupNo [in] The group number to look for * @return OFTrue if group number is found in path, OFFalse otherwise */ OFBool containsGroup(const Uint16& groupNo) const; /** Returns a string representation of each path node separately. * Tags are represented as numbers surrounded by braces "(gggg,eeee)", * not dictionary names. Items are represented by a number or wildcard * in square brackets, eg. "[12]" or "[*]". * @param path The path to parse into different nodes * @param result [out] List containing the resulting strings * @return none */ static OFCondition separatePathNodes(const OFString& path, OFList& result); /** Helper function for findOrCreatePath(). Parses an item number from * the beginning of the path string. The item number must be positive, * starting with 0. * The path must start like "[itemnumber]...". * @param path - [in/out] The path starting with the item number * in square brackets, e. g. "[3]". The parsed item number * and a potentially following "." are removed from the path * @param itemNo - [out] The parsed item number. If a wildcard was parsed, * this output parameter is not set at all. * @param wasWildcard - [out] Is set to OFTrue, if wildcard was parsed * (instead of concrete item number). * @return EC_Normal, if concrete item number or wildcard was parsed */ static OFCondition parseItemNoFromPath(OFString& path, // inout Uint32& itemNo, // out OFBool& wasWildcard); // out /** Function that parses a tag from the beginning of a path string. * The tag has to be either in numeric format, e. g. "(0010,0010)" or * a dictionary name, e. g. "PatientName". If successful, the * parsed tag is removed from the path string. * @param path - [in/out] The path string, starting with the attribute * to parse * @param tag - [out] The tag parsed * @return EC_Normal if successful, error code otherwise */ static OFCondition parseTagFromPath(OFString& path, // inout DcmTag& tag); // out /** Desctructor, cleans up memory of path nodes. Does not delete * the DcmObjects the nodes point to (this is also not done * by the desctructor of the path nodes, so the caller is responsible * for freeing any related DICOM objects. */ ~DcmPath(); private: /// Internal list representing the nodes in the path. OFList m_path; /** Private undefined copy constructor */ DcmPath(const DcmPath& rhs); /** Private undefined assignment operator */ DcmPath& operator=(const DcmPath& arg); }; class DcmPathProcessor { public: /** Constructor, creates an empty search object. */ DcmPathProcessor(); /** Sets whether searching/creating paths will support wildcard for * items. If set to false, any path operation with item wildcard characters * will return an error. * @param supported [in] If true, wildcard are enabled (default) * If false, item wildcard support is disabled. */ void setItemWildcardSupport(const OFBool& supported); /** Enables (class default: enabled) or disables checking of private * reservations when inserting private tags. If enabled and a private * tag is created that has no private reservation, an error is returned. * If disabled, it is possible to insert private tags that do not have * a reservation in the corresponding item/dataset. * @param doChecking [in] OFTrue enables reservation checking, * OFFalse disables it. */ void checkPrivateReservations(const OFBool& doChecking); /** Function that allows for finding and/or inserting a hierarchy of items * and attributes as defined by a path string; also returns a list of * pointers for each sucessfully found or inserted paths. Every list * contains pointers pointing to all the objects along the path * starting from the object given as parameter. The pointer to the * starting object will not be part of the result. * * In principle, the path string must have the following format (in * arbitrary depth). Note that for searching a sequence, the example * below would start with [ITEMNO] instead: * SEQUENCE[ITEMNO].SEQUENCE[ITEMNO].ATTRIBUTE * . ITEMNO must be a positive integer starting with 0. * SEQUENCE and ATTRIBUTE must be a tag, written e. g. * "(0010,0010)" or as a dictionary name, e. g. "PatientName". If the * path cannot be fully created (see option createIfNecessary), any * possibly object changes are reverted. So a path is either fully created * or no path component is created at all. The result can be obtained * by calling the getResults() function. * * Example: The path * "ContentSequence[4].(0040,a043)[0].CodeValue" selects the Content * Sequence in the given object, therein the 5th item, therein the "Concept * Name Code Sequence" denoted by (0040,a043), therein the first item * and finally therein the tag "Code Value". * The resulting object list should (if success is returned) contain * 1 result, consisting of a list with 5 pointers to 5 objects in the order * in their logical order as they occur in the path string * (in total 2 sequences, 2 items, and one leaf attribute). * @param obj [in] The object to search (or create) a path in * @param path [in] The path either starting with an attribute (either a * sequence or a a leaf attribute as a dicitionary name or * tag) or starting with an item * @param createIfNecessary [in] If set, all missing objects found * in the path string are created. If not set, * only existing paths can be accessed and * no new attribute or item is created. * @return EC_Normal if successful, error code otherwise. */ OFCondition findOrCreatePath(DcmObject* obj, const OFString& path, OFBool createIfNecessary = OFFalse); /** Function that allows for deleting elements and items from * a DICOM object tree. * In principle, the path string must have the following format (in * arbitrary depth). Note that for searching in a sequence, the example * below would start with [ITEMNO] instead: * SEQUENCE[ITEMNO].SEQUENCE[ITEMNO].ATTRIBUTE * . ITEMNO must be a positive integer starting with 0. * SEQUENCE and ATTRIBUTE must be a tag, written e. g. * "(0010,0010)" or as a dictionary name, e. g. "PatientName". * * Example: The path * "ContentSequence[4].(0040,a043)[0].CodeValue" selects the Content * Sequence in the given object, therein the 5th item, therein the "Concept * Name Code Sequence" denoted by (0040,a043), therein the first item * and finally therein the tag "Code Value". Only "Code Value" will be * deleted by the function. * @param obj [in] The object to delete attribute or item from * @param path [in] The path either starting with an attribute (either a * sequence or a a leaf attribute as a dicitionary name or * tag) or starting with an item * @param numDeleted [out] Number of deleted attributes/items * @return EC_Normal if successful, error code otherwise. If the desired * attribute/item was not found, EC_TagNotFound is returned. */ OFCondition findOrDeletePath(DcmObject* obj, const OFString& path, Uint32& numDeleted); /** Returns the results from the search / creation call. * @param searchResults [out] The resulting paths that were created/searched * Note that the memory of the search results * is freed automatically by the destructor and must * not be freed by the caller. * @return Number of results returned */ Uint32 getResults(OFList& searchResults); /** Helper function that applies a specified "override key" in path syntax * to the given dataset. The name "override" indicates that these keys have * higher precedence than identical keys in a request dataset that might possibly read from * a DICOM query file. * @param dataset [in/out] the dataset (e.g. query keys) the override key is applied to. * Must be non-NULL. * @param pathParam [in] the override key in path syntax (see class DcmPath). Also the * path can end with a value assignment, e. g. "PatientName=Doe^John". * An empty (or missing value) will not be ignored but will be * written as empty to the attribute (if not a sequence or item) * @return EC_Normal if adding was successful, error code otherwise */ OFCondition applyPathWithValue(DcmDataset *dataset, const OFString& overrideKey); /** Deconstructor, cleans up memory that was allocated for any * search results. */ ~DcmPathProcessor(); protected: /** Function that allows for finding and/or inserting a hierarchy of items * and attributes as defined by a path string; also returns a list of * pointers for each sucessfully found or inserted paths. Every list * contains pointers pointing to all the objects along the path * starting from the object given as parameter. The pointer to the * starting object will not be part of the result. * * In principle, the path string must have the following format (in * arbitrary depth). * SEQUENCE[ITEMNO].SEQUENCE[ITEMNO].ATTRIBUTE * . ITEMNO must be a positive integer starting with 0. * SEQUENCE and ATTRIBUTE must be a tag, written e. g. * "(0010,0010)" or as a dictionary name, e. g. "PatientName". If the * path cannot be fully created (see option createIfNecessary), any * possibly object changes are reverted. So a path is either fully created * or no path component is created at all. The result can be obtained * by calling the getResults() function. * * Example: The path * "ContentSequence[4].(0040,a043)[0].CodeValue" selects the Content * Sequence in the given item, therein the 5th item, therein the "Concept * Name Code Sequence" denoted by (0040,a043), therein the first item * and finally therein the tag "Code Value". * The resulting object list should (if success is returned) contain * 1 result, consisting of a list with 5 pointers to 5 objects in the order * in their logical order as they occur in the path string * (in total 2 sequences, 2 items, and one leaf attribute). * @param item [in] The object to search (or create) a path in * @param path [in] The path starting with an attribute (either a * sequence or a a leaf attribute) as a dicitionary name or * tag. The parsed attribute is removed from the path string. * @return EC_Normal if successful, error code otherwise. */ OFCondition findOrCreateItemPath(DcmItem* item, OFString& path); /** Function that allows for finding and/or inserting a hierarchy of items * and attributes as defined by a path string; also returns a list of * pointers for each sucessfully found or inserted paths. Every list * contains pointers pointing to all the objects along the path * starting from the object given as parameter. The pointer to the * starting object will not be part of the result. * * In principle, the path string must have the following format (in * arbitrary depth). * [ITEMNO].SEQUENCE[ITEMNO].ATTRIBUTE * . ITEMNO must be a positive integer starting with 0. * SEQUENCE and ATTRIBUTE must be a tag, written e. g. * "(0010,0010)" or as a dictionary name, e. g. "PatientName". If the * path cannot be fully created (see option createIfNecessary), any * possibly object changes are reverted. So a path is either fully created * or no path component is created at all. The result can be obtained * by calling the getResults() function. * * Example: The path * "[4].(0040,a043)[0].CodeValue" selects the 5th item in the given * sequence, therein the "Concept Name Code Sequence" denoted by * (0040,a043), therein the first item and finally therein the * tag "Code Value". * The resulting object list should (if success is returned) contain * 1 result, consisting of a list with 4 pointers to 4 objects in the order * in their logical order as they occur in the path string * (in total 1 sequence, 2 items, and one leaf element). * @param seq [in] The object to search (or create) a path in * @param path [in] The path starting with an item. The parsed item number * (e. g. "[0]") is removed from the path string. * @return EC_Normal if successful, error code otherwise. */ OFCondition findOrCreateSequencePath(DcmSequenceOfItems* seq, OFString& path); /** Helper function that looks at the last node in a given path and deletes * the corresponding DICOM object. Does not delete the path node itself: * That is done by the calling function, findOrCreateItemPath(). * @param objSearchedIn [in/out] The object the given path starts in. * @param path [in/out] The complete path to the DICOM object to delete * @param toDelete [in/out] The path node to delete. This node must be * identical to the last node in the path parameter. Also * the node must represent a DICOM sequence or leaf element, * not an item. However, because it is isolated already by * the calling function, it is provided here for convenience. */ static OFCondition deleteLastElemFromPath(DcmObject* objSearchedIn, DcmPath *path, DcmPathNode* toDelete); /** Helper function that looks at the last node in a given path and deletes * the corresponding DICOM object. Does not delete the path node itself: * That is done by the calling function, findOrCreateItemPath(). * @param objSearchedIn [in/out] The object the given path starts in. * @param path [in/out] The complete path to the DICOM object to delete * @param toDelete [in/out] The path node to delete. This node must be * identical to the last node in the path parameter. Also * the node must represent a DICOM item, not a sequence * However, because it is isolated already by the calling * function, it is provided here for convenience. */ static OFCondition deleteLastItemFromPath(DcmObject* objSearchedIn, DcmPath *path, DcmPathNode* toDelete); /** Checks in item, whether a private reservation for a given * tag key exists (if not disabled). If so, a dictionary lookup is performed * and the VR and private creator of the tag is updated correspondingly. * @param item [in] The item to search in * @param tag [in/out] The tag to be checked. Will be updated with VR and * private creator. * @return Return EC_Normal if reservation checking and updating the * tag was successful. Otherwise an error code is returned. */ OFCondition checkPrivateTagReservation(DcmItem *item, DcmTag& tag); /** Returns the private reservation tag key for a given private tag * @param privateKey [in] The private key to calculate reservation tag for * @return The reservation key. If given key is not private or an error, * return DCM_UndefinedTagKey. If the given key is a reservation * itself, it is directly returned. */ static DcmTagKey calcPrivateReservationTag(const DcmTagKey &privateKey); /** Cleans up memory that was allocated for any search results. * Called when a new search is started or during object destruction. * The DICOM data all freed paths and path nodes point to, is not * touched, ie. all memory to the DICOM objects pointed to must be * freed from outside. Processing options like checking for private * reservations and so on are not reset to default values but * keep valid. */ void clear(); private: /// Internal list that is during search for keeping track of current path OFList m_currentPath; /// Internal list that represents the search results found OFList m_results; /// Denotes whether missing items/sequences/attributes should be /// automatically inserted when using findAndCreate routines OFBool m_createIfNecessary; /// If enabled (default), any insertions of private tags will fail, if no /// corresponding reservation exists in the underlying item OFBool m_checkPrivateReservations; /// Denotes, whether a path is accepted that contains wildcards. /// If false, then any search containing wildcards will return an error. OFBool m_itemWildcardsEnabled; /** Private undefined copy constructor */ DcmPathProcessor(const DcmPathProcessor& rhs); /** Private undefined assignment operator */ DcmPathProcessor& operator=(const DcmPathProcessor& arg); }; #endif // DCPATH_H /* ** CVS/RCS Log: ** $Log: dcpath.h,v $ ** Revision 1.10 2010-10-14 13:15:41 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.9 2010-08-09 13:02:56 joergr ** Updated data dictionary to 2009 edition of the DICOM standard. From now on, ** the official "keyword" is used for the attribute name which results in a ** number of minor changes (e.g. "PatientsName" is now called "PatientName"). ** ** Revision 1.8 2009-11-04 09:58:07 uli ** Switched to logging mechanism provided by the "new" oflog module ** ** Revision 1.7 2009-09-29 12:55:17 uli ** Include only the needed headers in dcpath.h and dcpath.cc ** ** Revision 1.6 2009-07-10 13:12:30 onken ** Added override key functionality used by tools like findscu to the more ** central DcmPathProcessor class. ** ** Revision 1.5 2009-07-08 16:09:30 onken ** Cleaned up code for private reservation checking and added option for ** disabling item wildcards for searching/creating tag paths. ** ** Revision 1.4 2009-01-15 16:04:06 onken ** Added options for handling of private tags and fixed bug for deleting ** tags on main level. ** ** Revision 1.3 2009-01-12 12:37:45 onken ** Fixed iterators to also compile with STL classes being enabled. ** ** Revision 1.2 2008-12-12 13:16:03 onken ** Fixed doxygen documentation. ** ** Revision 1.1 2008-12-12 11:44:40 onken ** Moved path access functions to separate classes ** */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/dccodec.h0000644000310500011400000006344411455601174021332 0ustar joergrdicom3/* * * Copyright (C) 1997-2010, 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: dcmdata * * Author: Andreas Barth * * Purpose: Interface of abstract class DcmCodec and the class DcmCodecStruct * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:15:40 $ * CVS/RCS Revision: $Revision: 1.24 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DCCODEC_H #define DCCODEC_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/ofstd/ofcond.h" #include "dcmtk/dcmdata/dctypes.h" #include "dcmtk/dcmdata/dcxfer.h" #include "dcmtk/ofstd/oflist.h" class DcmStack; class DcmRepresentationParameter; class DcmPixelSequence; class DcmPolymorphOBOW; class DcmItem; class DcmTagKey; /** abstract base class for a codec parameter object that * describes the settings (modes of operations) for one * particular codec (DcmCodec) object. */ class DcmCodecParameter { public: /// default constructor DcmCodecParameter() {} /// copy constructor DcmCodecParameter(const DcmCodecParameter&) {} /// destructor virtual ~DcmCodecParameter() {} /** this methods creates a copy of type DcmCodecParameter * * it must be overweritten in every subclass. * @return copy of this object */ virtual DcmCodecParameter *clone() const = 0; /** returns the class name as string. * can be used as poor man's RTTI replacement. */ virtual const char *className() const = 0; }; /** abstract base class for a codec object that can be registered * in dcmdata and performs transfer syntax transformation (i.e. * compressing, decompressing or transcoding between different * compressed transfer syntaxes). * When dcmdata is requested to write a transfer syntax that differs * from the current one (i.e. the one in which the object was read), * dcmdata dynamically searches for a DcmCodec object that is able * to create the desired transfer syntax. If no suitable codec * is found, the write operation fails. */ class DcmCodec { public: /// default constructor DcmCodec() {} /// destructor virtual ~DcmCodec() {} /** decompresses the given pixel sequence and * stores the result in the given uncompressedPixelData element. * @param fromRepParam current representation parameter of compressed data, may be NULL * @param pixSeq compressed pixel sequence * @param uncompressedPixelData uncompressed pixel data stored in this element * @param cp codec parameters for this codec * @param objStack stack pointing to the location of the pixel data * element in the current dataset. * @return EC_Normal if successful, an error code otherwise. */ virtual OFCondition decode( const DcmRepresentationParameter * fromRepParam, DcmPixelSequence * pixSeq, DcmPolymorphOBOW& uncompressedPixelData, const DcmCodecParameter * cp, const DcmStack& objStack) const = 0; /** decompresses a single frame from the given pixel sequence and * stores the result in the given buffer. * @param fromParam representation parameter of current compressed * representation, may be NULL. * @param fromPixSeq compressed pixel sequence * @param cp codec parameters for this codec * @param dataset pointer to dataset in which pixel data element is contained * @param frameNo number of frame, starting with 0 for the first frame * @param startFragment index of the compressed fragment that contains * all or the first part of the compressed bitstream for the given frameNo. * Upon successful return this parameter is updated to contain the index * of the first compressed fragment of the next frame. * When unknown, zero should be passed. In this case the decompression * algorithm will try to determine the index by itself, which will always * work if frames are decompressed in increasing order from first to last, * but may fail if frames are decompressed in random order, multiple fragments * per frame and multiple frames are present in the dataset, and the offset * table is empty. * @param buffer pointer to buffer where frame is to be stored * @param bufSize size of buffer in bytes * @param decompressedColorModel upon successful return, the color model * of the decompressed image (which may be different from the one used * in the compressed images) is returned in this parameter. * @return EC_Normal if successful, an error code otherwise. */ virtual OFCondition decodeFrame( const DcmRepresentationParameter * fromParam, DcmPixelSequence * fromPixSeq, const DcmCodecParameter * cp, DcmItem *dataset, Uint32 frameNo, Uint32& startFragment, void *buffer, Uint32 bufSize, OFString& decompressedColorModel) const = 0; /** compresses the given uncompressed DICOM image and stores * the result in the given pixSeq element. * @param pixelData pointer to the uncompressed image data in OW format * and local byte order * @param length of the pixel data field in bytes * @param toRepParam representation parameter describing the desired * compressed representation (e.g. JPEG quality) * @param pixSeq compressed pixel sequence (pointer to new DcmPixelSequence object * allocated on heap) returned in this parameter upon success. * @param cp codec parameters for this codec * @param objStack stack pointing to the location of the pixel data * element in the current dataset. * @return EC_Normal if successful, an error code otherwise. */ virtual OFCondition encode( const Uint16 * pixelData, const Uint32 length, const DcmRepresentationParameter * toRepParam, DcmPixelSequence * & pixSeq, const DcmCodecParameter *cp, DcmStack & objStack) const = 0; /** transcodes (re-compresses) the given compressed DICOM image and stores * the result in the given toPixSeq element. * @param fromRepType current transfer syntax of the compressed image * @param fromRepParam current representation parameter of compressed data, may be NULL * @param fromPixSeq compressed pixel sequence * @param toRepParam representation parameter describing the desired * new compressed representation (e.g. JPEG quality) * @param toPixSeq compressed pixel sequence (pointer to new DcmPixelSequence object * allocated on heap) returned in this parameter upon success. * @param cp codec parameters for this codec * @param objStack stack pointing to the location of the pixel data * element in the current dataset. * @return EC_Normal if successful, an error code otherwise. */ virtual OFCondition encode( const E_TransferSyntax fromRepType, const DcmRepresentationParameter * fromRepParam, DcmPixelSequence * fromPixSeq, const DcmRepresentationParameter * toRepParam, DcmPixelSequence * & toPixSeq, const DcmCodecParameter * cp, DcmStack & objStack) const = 0; /** checks if this codec is able to convert from the * given current transfer syntax to the given new * transfer syntax * @param oldRepType current transfer syntax * @param newRepType desired new transfer syntax * @return true if transformation is supported by this codec, false otherwise. */ virtual OFBool canChangeCoding( const E_TransferSyntax oldRepType, const E_TransferSyntax newRepType) const = 0; /** determine color model of the decompressed image * @param fromParam representation parameter of current compressed * representation, may be NULL * @param fromPixSeq compressed pixel sequence * @param cp codec parameters for this codec * @param dataset pointer to dataset in which pixel data element is contained * @param dataset pointer to DICOM dataset in which this pixel data object * is located. Used to access photometric interpretation. * @param decompressedColorModel upon successful return, the color model * of the decompressed image (which may be different from the one used * in the compressed images) is returned in this parameter * @return EC_Normal if successful, an error code otherwise */ virtual OFCondition determineDecompressedColorModel( const DcmRepresentationParameter *fromParam, DcmPixelSequence *fromPixSeq, const DcmCodecParameter *cp, DcmItem *dataset, OFString &decompressedColorModel) const = 0; // static helper methods that have proven useful in codec classes derived from DcmCodec /** helper function that inserts a string attribute with a given value into a dataset * if missing in the dataset. * @param dataset dataset to insert to, must not be NULL. * @param tag tag key of attribute to check/insert * @param val string value, may be NULL. * @return EC_Normal if successful, an error code otherwise */ static OFCondition insertStringIfMissing(DcmItem *dataset, const DcmTagKey& tag, const char *val); /** helper function that converts a dataset containing a DICOM image * into a valid (standard extended) Secondary Capture object * by inserting all attributes that are type 1/2 in Secondary Capture * and missing in the source dataset. Replaces SOP Class UID * by Secondary Capture. It does not, however, change an existing SOP Instance UID. * @param dataset dataset to insert to, must not be NULL. * @return EC_Normal if successful, an error code otherwise */ static OFCondition convertToSecondaryCapture(DcmItem *dataset); /** create new SOP instance UID and Source Image Sequence * referencing the old SOP instance (if present) * @param dataset dataset to be modified * @param purposeOfReferenceCodingScheme coding scheme designator for purpose of reference code sequence * @param purposeOfReferenceCodeValue code value for purpose of reference code sequence * @param purposeOfReferenceCodeMeaning code meaning for purpose of reference code sequence * @return EC_Normal if successful, an error code otherwise */ static OFCondition newInstance( DcmItem *dataset, const char *purposeOfReferenceCodingScheme = NULL, const char *purposeOfReferenceCodeValue = NULL, const char *purposeOfReferenceCodeMeaning = NULL); /** set first value of Image Type to DERIVED. * @param dataset dataset to be modified * @return EC_Normal if successful, an error code otherwise */ static OFCondition updateImageType(DcmItem *dataset); /** insert code sequence into the given dataset * @param dataset dataset to insert into * @param tagKey tag of the code sequence * @param codingSchemeDesignator coding scheme designator for the sequence item * @param codeValue code value for the sequence item * @param codeMeaning code meaning for the sequence item * @return EC_Normal if successul, an error code otherwise */ static OFCondition insertCodeSequence( DcmItem *dataset, const DcmTagKey &tagKey, const char *codingSchemeDesignator, const char *codeValue, const char *codeMeaning); /** determine the index number (starting with zero) of the compressed pixel data fragment * corresponding to the given frame (also starting with zero) * @param frameNo frame number * @param numberOfFrames number of frames of this image * @param fromPixSeq compressed pixel sequence * @param currentItem index of compressed pixel data fragment returned in this parameter on success * @return EC_Normal if successful, an error code otherwise */ static OFCondition determineStartFragment( Uint32 frameNo, Sint32 numberOfFrames, DcmPixelSequence * fromPixSeq, Uint32& currentItem); }; /** singleton that keeps list of registered codecs for dcmdata. * All operations on the list are protected by a read/write lock * and, therefore, are safe for multi-thread applications. */ class DcmCodecList { public: /// destructor virtual ~DcmCodecList(); /** registers a codec object in the global list of codecs consulted by dcmdata * whenever conversion to/from compressed transfer syntaxes is requested. * This function must not be called before main() is started, e.g. from * a constructor of a global object. * This call is safe in multi-thread operations. * @param aCodec pointer to codec object. * Must remain unmodified and valid until the codec has been deregistered. * @param aDefaultRepParam default representation parameter. * Must remain unmodified and valid until the codec has been deregistered. * @param aCodecParameter codec parameter. * Must remain unmodified and valid until the codec has been deregistered or the * parameter has been replaced by a call to updateCodecParameter() * @return EC_Normal if successful, an error code otherwise */ static OFCondition registerCodec( const DcmCodec *aCodec, const DcmRepresentationParameter *aDefaultRepParam, const DcmCodecParameter *aCodecParameter); /** deregisters a codec and it's parameter objects from the global list. * This call is safe in multi-thread operations. * @param aCodec pointer to registered codec * @return EC_Normal if successful, an error code otherwise */ static OFCondition deregisterCodec(const DcmCodec *aCodec); /** updates the codec parameters object for a codec that has been registered before. * This call is safe in multi-thread operations. * @param aCodec pointer to codec object that has been registered before * @param aCodecParameter codec parameter. * Must remain unmodified and valid until the codec has been deregistered or the * parameter has been replaced by another call to updateCodecParameter() * @return EC_Normal if successful, an error code otherwise */ static OFCondition updateCodecParameter( const DcmCodec *aCodec, const DcmCodecParameter *aCodecParameter); /** looks for a codec that is able to decode from the given transfer syntax * and calls the decode() method of the codec. A read lock on the list of * codecs is acquired until this method returns. * @param fromType transfer syntax to decode from * @param fromParam representation parameter of current compressed * representation, may be NULL. * @param fromPixSeq compressed pixel sequence * @param uncompressedPixelData uncompressed pixel data stored in this element * @param pixelStack stack pointing to the location of the pixel data * element in the current dataset. * @return EC_Normal if successful, an error code otherwise. */ static OFCondition decode( const DcmXfer & fromType, const DcmRepresentationParameter * fromParam, DcmPixelSequence * fromPixSeq, DcmPolymorphOBOW& uncompressedPixelData, DcmStack & pixelStack); /** looks for a codec that is able to decode from the given transfer syntax * and calls the decodeFrame() method of the codec. A read lock on the list of * codecs is acquired until this method returns. * @param fromType transfer syntax to decode from * @param fromParam representation parameter of current compressed * representation, may be NULL. * @param fromPixSeq compressed pixel sequence * @param dataset pointer to dataset in which pixel data element is contained * @param frameNo number of frame, starting with 0 for the first frame * @param startFragment index of the compressed fragment that contains * all or the first part of the compressed bitstream for the given frameNo. * Upon successful return this parameter is updated to contain the index * of the first compressed fragment of the next frame. * When unknown, zero should be passed. In this case the decompression * algorithm will try to determine the index by itself, which will always * work if frames are decompressed in increasing order from first to last, * but may fail if frames are decompressed in random order, multiple fragments * per frame and multiple frames are present in the dataset, and the offset * table is empty. * @param buffer pointer to buffer where frame is to be stored * @param bufSize size of buffer in bytes * @param decompressedColorModel upon successful return, the color model * of the decompressed image (which may be different from the one used * in the compressed images) is returned in this parameter. * @return EC_Normal if successful, an error code otherwise. */ static OFCondition decodeFrame( const DcmXfer & fromType, const DcmRepresentationParameter * fromParam, DcmPixelSequence * fromPixSeq, DcmItem *dataset, Uint32 frameNo, Uint32& startFragment, void *buffer, Uint32 bufSize, OFString& decompressedColorModel); /** looks for a codec that is able to encode from the given transfer syntax * and calls the encode() method of the codec. A read lock on the list of * codecs is acquired until this method returns. * @param fromRepType transfer syntax to encode from * @param pixelData pointer to the uncompressed image data in OW format * and local byte order * @param length of the pixel data field in bytes * @param toRepType transfer syntax to compress to * @param toRepParam representation parameter describing the desired * compressed representation (e.g. JPEG quality) * @param pixSeq compressed pixel sequence (pointer to new DcmPixelSequence object * allocated on heap) returned in this parameter upon success. * @param pixelStack stack pointing to the location of the pixel data * element in the current dataset. * @return EC_Normal if successful, an error code otherwise. */ static OFCondition encode( const E_TransferSyntax fromRepType, const Uint16 * pixelData, const Uint32 length, const E_TransferSyntax toRepType, const DcmRepresentationParameter * toRepParam, DcmPixelSequence * & pixSeq, DcmStack & pixelStack); /** looks for a codec that is able to transcode (re-compresses) * from the given transfer syntax to the given transfer syntax * and calls the encode() method of the codec. * A read lock on the list of * codecs is acquired until this method returns. * @param fromRepType current transfer syntax of the compressed image * @param fromParam current representation parameter of compressed data, may be NULL * @param fromPixSeq compressed pixel sequence * @param toRepType transfer syntax to compress to * @param toRepParam representation parameter describing the desired * new compressed representation (e.g. JPEG quality) * @param toPixSeq compressed pixel sequence (pointer to new DcmPixelSequence object * allocated on heap) returned in this parameter upon success. * @param pixelStack stack pointing to the location of the pixel data * element in the current dataset. * @return EC_Normal if successful, an error code otherwise. */ static OFCondition encode( const E_TransferSyntax fromRepType, const DcmRepresentationParameter * fromParam, DcmPixelSequence * fromPixSeq, const E_TransferSyntax toRepType, const DcmRepresentationParameter * toRepParam, DcmPixelSequence * & toPixSeq, DcmStack & pixelStack); /** looks for a codec that claims to be able to convert * between the given transfer syntaxes. * A read lock on the list of * codecs is acquired until this method returns. * @param fromRepType current transfer syntax * @param toRepType desired new transfer syntax * @return true if transformation is supported by a codec, false otherwise. */ static OFBool canChangeCoding( const E_TransferSyntax fromRepType, const E_TransferSyntax toRepType); /** determine color model of the decompressed image * @param fromType transfer syntax to decode from * @param fromParam representation parameter of current compressed * representation, may be NULL * @param fromPixSeq compressed pixel sequence * @param dataset pointer to dataset in which pixel data element is contained * @param decompressedColorModel upon successful return, the color model * of the decompressed image (which may be different from the one used * in the compressed images) is returned in this parameter * @return EC_Normal if successful, an error code otherwise */ static OFCondition determineDecompressedColorModel( const DcmXfer &fromType, const DcmRepresentationParameter *fromParam, DcmPixelSequence *fromPixSeq, DcmItem *dataset, OFString &decompressedColorModel); private: /** constructor * @param aCodec pointer to codec object. * @param aDefaultRepParam default representation parameter. * @param aCodecParameter codec parameter. */ DcmCodecList( const DcmCodec *aCodec, const DcmRepresentationParameter *aDefaultRepParam, const DcmCodecParameter *aCodecParameter); /// private undefined copy constructor DcmCodecList(const DcmCodecList &); /// private undefined copy assignment operator DcmCodecList &operator=(const DcmCodecList &); /// pointer to codec object const DcmCodec * codec; /// pointer to default representation parameter const DcmRepresentationParameter * defaultRepParam; /// pointer to codec parameter set const DcmCodecParameter * codecParameter; /// singleton list of registered codecs static OFList registeredCodecs; #ifdef WITH_THREADS /// read/write lock guarding access to singleton list static OFReadWriteLock codecLock; #endif // dummy friend declaration to prevent gcc from complaining // that this class only defines private constructors and has no friends. friend class DcmCodecListDummyFriend; }; #endif /* ** CVS/RCS Log: ** $Log: dccodec.h,v $ ** Revision 1.24 2010-10-14 13:15:40 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.23 2010-10-04 14:26:21 joergr ** Fixed issue with codec registry when compiled on Linux x86_64 with "configure ** --disable-threads" (replaced "#ifdef _REENTRANT" by "#ifdef WITH_THREADS"). ** ** Revision 1.22 2010-03-01 09:08:44 uli ** Removed some unnecessary include directives in the headers. ** ** Revision 1.21 2009-11-17 16:36:51 joergr ** Added new method that allows for determining the color model of the ** decompressed image. ** ** Revision 1.20 2009-11-04 09:58:07 uli ** Switched to logging mechanism provided by the "new" oflog module ** ** Revision 1.19 2008-05-29 10:46:13 meichel ** Implemented new method DcmPixelData::getUncompressedFrame ** that permits frame-wise access to compressed and uncompressed ** objects without ever loading the complete object into main memory. ** For this new method to work with compressed images, all classes derived from ** DcmCodec need to implement a new method decodeFrame(). For now, only ** dummy implementations returning an error code have been defined. ** ** Revision 1.18 2005/12/09 14:48:14 meichel ** Added missing virtual destructors ** ** Revision 1.17 2005/12/08 16:28:01 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.16 2004/08/24 14:54:18 meichel ** Updated compression helper methods. Image type is not set to SECONDARY ** any more, support for the purpose of reference code sequence added. ** ** Revision 1.15 2003/06/12 13:35:23 joergr ** Fixed inconsistent API documentation reported by Doxygen. ** ** Revision 1.14 2002/05/24 14:51:41 meichel ** Moved helper methods that are useful for different compression techniques ** from module dcmjpeg to module dcmdata ** ** Revision 1.13 2002/02/27 14:21:20 meichel ** Declare dcmdata read/write locks only when compiled in multi-thread mode ** ** Revision 1.12 2001/11/12 16:29:51 meichel ** Added dummy friend class declaration to singleton class DcmCodecList ** to keep gcc from squawking. ** ** Revision 1.11 2001/11/08 16:19:39 meichel ** Changed interface for codec registration. Now everything is thread-safe ** and multiple codecs can be registered for a single transfer syntax (e.g. ** one encoder and one decoder). ** ** Revision 1.10 2001/09/25 17:19:07 meichel ** Updated abstract class DcmCodecParameter for use with dcmjpeg. ** Added new function deregisterGlobalCodec(). ** ** Revision 1.9 2001/06/01 15:48:34 meichel ** Updated copyright header ** ** Revision 1.8 2001/05/25 09:53:51 meichel ** Modified DcmCodec::decode() interface, required for future dcmjpeg module. ** ** Revision 1.7 2000/09/27 08:19:54 meichel ** Minor changes in DcmCodec interface, required for future dcmjpeg module. ** ** Revision 1.6 2000/04/14 16:09:12 meichel ** Made function DcmCodec and related functions thread safe. ** registerGlobalCodec() should not be called anymore from the constructor ** of global objects. ** ** Revision 1.5 2000/03/08 16:26:11 meichel ** Updated copyright header. ** ** Revision 1.4 1999/03/31 09:24:31 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.3 1998/07/15 15:48:43 joergr ** Removed several compiler warnings reported by gcc 2.8.1 with ** additional options, e.g. missing copy constructors and assignment ** operators, initialization of member variables in the body of a ** constructor instead of the member initialization list, hiding of ** methods by use of identical names, uninitialized member variables, ** missing const declaration of char pointers. Replaced tabs by spaces. ** ** Revision 1.2 1997/07/24 13:07:45 andreas ** - Make DcmCodec:canChangeCoding abstract ** ** Revision 1.1 1997/07/21 07:54:57 andreas ** - New environment for encapsulated pixel representations. DcmPixelData ** can contain different representations and uses codecs to convert ** between them. Codecs are derived from the DcmCodec class. New error ** codes are introduced for handling of representations. New internal ** value representation (only for ident()) for PixelData ** */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/dcstack.h0000644000310500011400000001170711455601176021357 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Gerd Ehlers * * Purpose: stack class * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:15:42 $ * CVS/RCS Revision: $Revision: 1.14 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DCSTACK_H #define DCSTACK_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/ofstd/oftypes.h" class DcmObject; // forward declaration /** helper class used by DcmStack. Maintains a single stack entry. */ class DcmStackNode { public: /** constructor. * @param obj object pointer for this stack entry */ DcmStackNode(DcmObject *obj); /// destructor, non virtual. ~DcmStackNode(); /** return pointer maintained by this entry * @return object pointer */ DcmObject *value() const; private: /// private undefined copy constructor DcmStackNode(const DcmStackNode &); /// private undefined copy assignment operator DcmStackNode &operator=(const DcmStackNode &); /// pointer to next stack entry, NULL if last one DcmStackNode *link; /// pointer to object referenced by this stack entry DcmObject *objNodeValue; /// class DcmStack directly manipulates the pointer chain friend class DcmStack; }; /** this class manages a stack of pointers to DcmObject instances. * The objects pointed to are never touched, e.g. deleted. */ class DcmStack { public: /// default constructor, creates empty stack DcmStack(); /** copy constructor. Only pointers to objects are copied, * the DcmObject instances are not duplicated. * @param arg stack to copy from */ DcmStack(const DcmStack& arg); /// destructor, not virtual. Do not derive from this class. ~DcmStack(); /** copy assignment operator. Only pointers to objects are copied, * the DcmObject instances are not duplicated. * @param arg object to assign from * @return reference to this object */ DcmStack& operator=(const DcmStack &arg); /** comparison operator, needed for MSVC5. * @param arg stack to compare to * @return true if stacks are equal, false otherwise */ OFBool operator==(const DcmStack& arg) const; /** dummy comparison operator, needed for MSVC5. * @param arg stack to compare to * @return true if the cardinality of this stack is smaller than the * cardinality of arg, or if the cardinality is equal and pointer * comparison, from the top to the bottom of the stack results * in a smaller pointer for this stack. */ OFBool operator<(const DcmStack& arg) const; /** push new pointer do DcmObject instance on stack * @param obj object pointer to push on stack * @return pointer passed as obj */ DcmObject* push( DcmObject *obj ); /** removes uppermost entry from stack and returns it. * @return uppermost stack entry */ DcmObject* pop(); /** returns uppermost entry of stack without removing it. * @returns uppermost stack entry */ DcmObject* top() const; /** returns n-th element from stack without removing it. * @return n-th element from stack */ DcmObject* elem(const unsigned long number) const; /** checks if the stack is empty * @return true if stack is empty, false otherwise */ OFBool empty() const; /** returns cardinality (number of entries) of the stack * @return cardinality of stack */ unsigned long card() const; /** returns the stack to default-constructed state, i.e. empty state. */ void clear(); private: /// pointer to the upmost stack entry, NULL if empty DcmStackNode *topNode_; /// current cardinality of the stack unsigned long cardinality_; }; #endif // DCSTACK_H /* * CVS/RCS Log: * $Log: dcstack.h,v $ * Revision 1.14 2010-10-14 13:15:42 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.13 2010-03-01 09:08:44 uli * Removed some unnecessary include directives in the headers. * * Revision 1.12 2005-12-08 16:28:42 meichel * Changed include path schema for all DCMTK header files * * Revision 1.11 2004/04/14 11:50:21 joergr * Added const qualifier to parameter to keep Sun CC 2.0.1 quiet. * * Revision 1.10 2003/06/02 16:52:20 meichel * Cleaned up implementation of DcmStack, added doc++ comments * * Revision 1.9 2001/06/01 15:48:44 meichel * Updated copyright header * * Revision 1.8 2000/03/08 16:26:18 meichel * Updated copyright header. * * Revision 1.7 1999/03/31 09:24:47 meichel * Updated copyright header in module dcmdata * * */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/dcvrfl.h0000644000310500011400000002564111464747623021235 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Gerd Ehlers, Andreas Barth * * Purpose: Interface of class DcmFloatingPointSingle * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-11-05 09:34:11 $ * CVS/RCS Revision: $Revision: 1.27 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DCVRFL_H #define DCVRFL_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcelem.h" /** a class representing the DICOM value representation 'Floating Point Single' (FL) */ class DcmFloatingPointSingle : public DcmElement { public: /** constructor. * Create new element from given tag and length. * @param tag DICOM tag for the new element * @param len value length for the new element */ DcmFloatingPointSingle(const DcmTag &tag, const Uint32 len = 0); /** copy constructor * @param old element to be copied */ DcmFloatingPointSingle(const DcmFloatingPointSingle &old); /** destructor */ virtual ~DcmFloatingPointSingle(); /** assignment operator * @param obj element to be assigned/copied * @return reference to this object */ DcmFloatingPointSingle &operator=(const DcmFloatingPointSingle &obj); /** clone method * @return deep copy of this object */ virtual DcmObject *clone() const { return new DcmFloatingPointSingle(*this); } /** Virtual object copying. This method can be used for DcmObject * and derived classes to get a deep copy of an object. Internally * the assignment operator is called if the given DcmObject parameter * is of the same type as "this" object instance. If not, an error * is returned. This function permits copying an object by value * in a virtual way which therefore is different to just calling the * assignment operator of DcmElement which could result in slicing * the object. * @param rhs - [in] The instance to copy from. Has to be of the same * class type as "this" object * @return EC_Normal if copying was successful, error otherwise */ virtual OFCondition copyFrom(const DcmObject& rhs); /** get element type identifier * @return type identifier of this class (EVR_FL) */ virtual DcmEVR ident(void) const; /** check whether stored value conforms to the VR and to the specified VM * @param vm value multiplicity (according to the data dictionary) to be checked for. * (valid values: "1", "1-2", "1-3", "1-8", "1-99", "1-n", "2", "2-n", "2-2n", * "3", "3-n", "3-3n", "4", "6", "9", "16", "32") * @param oldFormat parameter not used for this VR (only for DA, TM, PN) * @return status of the check, EC_Normal if value is correct, an error code otherwise */ virtual OFCondition checkValue(const OFString &vm = "1-n", const OFBool oldFormat = OFFalse); /** get value multiplicity * @return number of currently stored values */ virtual unsigned long getVM(); /** print element to a stream. * The output format of the value is a backslash separated sequence of numbers. * This function uses a variable number of digits for the floating point values * as created by the OFStandard::ftoa() function by default. * @param out output stream * @param flags optional flag used to customize the output (see DCMTypes::PF_xxx) * @param level current level of nested items. Used for indentation. * @param pixelFileName not used * @param pixelCounter not used */ virtual void print(STD_NAMESPACE ostream&out, const size_t flags = 0, const int level = 0, const char *pixelFileName = NULL, size_t *pixelCounter = NULL); /** get particular float value * @param floatVal reference to result variable (cleared in case of error) * @param pos index of the value to be retrieved (0..vm-1) * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition getFloat32(Float32 &floatVal, const unsigned long pos = 0); /** get reference to stored float data * @param floatVals reference to result variable * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition getFloat32Array(Float32 *&floatVals); /** get a particular value as a character string. * The resulting string contains a variable number of digits as created by * the OFStandard::ftoa() function by default. * @param stringVal variable in which the result value is stored * @param pos index of the value in case of multi-valued elements (0..vm-1) * @param normalize not used * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition getOFString(OFString &stringVal, const unsigned long pos, OFBool normalize = OFTrue); /** set particular element value to given float * @param floatVal floating point value to be set * @param pos index of the value to be set (0 = first position) * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition putFloat32(const Float32 floatVal, const unsigned long pos = 0); /** set element value to given float array data * @param floatVals floating point data to be set * @param numFloats number of floating point values to be set * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition putFloat32Array(const Float32 *floatVals, const unsigned long numFloats); /** set element value from the given character string. * The input string is expected to be a backslash separated sequence of * numeric characters, e.g. "12.3456\1\-123.456\1234.0". * @param stringVal input character string * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition putString(const char *stringVal); /** check the currently stored element value * @param autocorrect correct value length if OFTrue * @return status, EC_Normal if value length is correct, an error code otherwise */ virtual OFCondition verify(const OFBool autocorrect = OFFalse); }; #endif // DCVRFL_H /* ** CVS/RCS Log: ** $Log: dcvrfl.h,v $ ** Revision 1.27 2010-11-05 09:34:11 joergr ** Added support for checking the value multiplicity "9" (see Supplement 131). ** ** Revision 1.26 2010-10-14 13:15:42 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.25 2010-04-23 15:26:13 joergr ** Specify an appropriate default value for the "vm" parameter of checkValue(). ** ** Revision 1.24 2010-04-23 14:25:27 joergr ** Added new method to all VR classes which checks whether the stored value ** conforms to the VR definition and to the specified VM. ** ** Revision 1.23 2009-11-04 09:58:07 uli ** Switched to logging mechanism provided by the "new" oflog module ** ** Revision 1.22 2008-07-17 11:19:49 onken ** Updated copyFrom() documentation. ** ** Revision 1.21 2008-07-17 10:30:23 onken ** Implemented copyFrom() method for complete DcmObject class hierarchy, which ** permits setting an instance's value from an existing object. Implemented ** assignment operator where necessary. ** ** Revision 1.20 2006-08-15 15:49:56 meichel ** Updated all code in module dcmdata to correctly compile when ** all standard C++ classes remain in namespace std. ** ** Revision 1.19 2005/12/08 16:28:59 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.18 2004/07/01 12:28:25 meichel ** Introduced virtual clone method for DcmObject and derived classes. ** ** Revision 1.17 2002/12/06 12:49:16 joergr ** Enhanced "print()" function by re-working the implementation and replacing ** the boolean "showFullData" parameter by a more general integer flag. ** Added doc++ documentation. ** Made source code formatting more consistent with other modules/files. ** ** Revision 1.16 2002/04/25 09:52:08 joergr ** Added getOFString() implementation. ** ** Revision 1.15 2001/09/25 17:19:31 meichel ** Adapted dcmdata to class OFCondition ** ** Revision 1.14 2001/06/01 15:48:50 meichel ** Updated copyright header ** ** Revision 1.13 2000/04/14 15:31:34 meichel ** Removed default value from output stream passed to print() method. ** Required for use in multi-thread environments. ** ** Revision 1.12 2000/03/08 16:26:23 meichel ** Updated copyright header. ** ** Revision 1.11 2000/03/03 14:05:27 meichel ** Implemented library support for redirecting error messages into memory ** instead of printing them to stdout/stderr for GUI applications. ** ** Revision 1.10 2000/02/10 10:50:54 joergr ** Added new feature to dcmdump (enhanced print method of dcmdata): write ** pixel data/item value fields to raw files. ** ** Revision 1.9 1999/03/31 09:25:00 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.8 1998/11/12 16:47:49 meichel ** Implemented operator= for all classes derived from DcmObject. ** ** Revision 1.7 1997/07/21 08:25:14 andreas ** - Replace all boolean types (BOOLEAN, CTNBOOLEAN, DICOM_BOOL, BOOL) ** with one unique boolean type OFBool. ** ** Revision 1.6 1997/04/18 08:13:30 andreas ** - The put/get-methods for all VRs did not conform to the C++-Standard ** draft. Some Compilers (e.g. SUN-C++ Compiler, Metroworks ** CodeWarrier, etc.) create many warnings concerning the hiding of ** overloaded get methods in all derived classes of DcmElement. ** So the interface of all value representation classes in the ** library are changed rapidly, e.g. ** OFCondition get(Uint16 & value, const unsigned long pos); ** becomes ** OFCondition getUint16(Uint16 & value, const unsigned long pos); ** All (retired) "returntype get(...)" methods are deleted. ** For more information see dcmdata/include/dcelem.h ** ** Revision 1.5 1996/08/05 08:45:32 andreas ** new print routine with additional parameters: ** - print into files ** - fix output length for elements ** corrected error in search routine with parameter ESM_fromStackTop ** ** Revision 1.4 1996/01/29 13:38:16 andreas ** - new put method for every VR to put value as a string ** - better and unique print methods ** ** Revision 1.3 1996/01/05 13:23:05 andreas ** - changed to support new streaming facilities ** - more cleanups ** - merged read / write methods for block and file transfer ** */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/dcvrulup.h0000644000310500011400000001522011455601177021602 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Gerd Ehlers, Andreas Barth * * Purpose: Interface of class DcmUnsignedLongOffset * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:15:43 $ * CVS/RCS Revision: $Revision: 1.21 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DCVRULUP_H #define DCVRULUP_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcvrul.h" /** a class used for DICOMDIR byte offsets */ class DcmUnsignedLongOffset : public DcmUnsignedLong { public: /** constructor. * Create new element from given tag and length. * @param tag DICOM tag for the new element * @param len value length for the new element */ DcmUnsignedLongOffset(const DcmTag &tag, const Uint32 len = 0); /** copy constructor * @param old element to be copied */ DcmUnsignedLongOffset(const DcmUnsignedLongOffset &old); /** destructor */ virtual ~DcmUnsignedLongOffset(); /** assignment operator. * @param the offset to be copied */ DcmUnsignedLongOffset &operator=(const DcmUnsignedLongOffset &); /** clone method * @return deep copy of this object */ virtual DcmObject *clone() const { return new DcmUnsignedLongOffset(*this); } /** Virtual object copying. This method can be used for DcmObject * and derived classes to get a deep copy of an object. Internally * the assignment operator is called if the given DcmObject parameter * is of the same type as "this" object instance. If not, an error * is returned. This function permits copying an object by value * in a virtual way which therefore is different to just calling the * assignment operator of DcmElement which could result in slicing * the object. * @param rhs - [in] The instance to copy from. Has to be of the same * class type as "this" object * @return EC_Normal if copying was successful, error otherwise */ virtual OFCondition copyFrom(const DcmObject& rhs); /** get element type identifier * @return type identifier of this class (internal type: EVR_up) */ virtual DcmEVR ident() const; /** clear the currently stored value * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition clear(); /** get stored object reference * @return pointer to the currently referenced object (might be NULL) */ virtual DcmObject *getNextRecord(); /** set stored object reference * @param record pointer to the object to be referenced * @return pointer to the newly referenced object (might be NULL) */ virtual DcmObject *setNextRecord(DcmObject *record); /** check the currently stored element value * @param autocorrect correct value length if OFTrue * @return status, EC_Normal if value length is correct, an error code otherwise */ virtual OFCondition verify(const OFBool autocorrect = OFFalse); private: /// pointer to the referenced object. NULL means that no object is referenced. DcmObject *nextRecord; }; #endif // DCVRUSUP_H /* ** CVS/RCS Log: ** $Log: dcvrulup.h,v $ ** Revision 1.21 2010-10-14 13:15:43 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.20 2009-11-04 09:58:08 uli ** Switched to logging mechanism provided by the "new" oflog module ** ** Revision 1.19 2008-07-17 11:19:49 onken ** Updated copyFrom() documentation. ** ** Revision 1.18 2008-07-17 10:30:23 onken ** Implemented copyFrom() method for complete DcmObject class hierarchy, which ** permits setting an instance's value from an existing object. Implemented ** assignment operator where necessary. ** ** Revision 1.17 2007-06-29 14:17:49 meichel ** Code clean-up: Most member variables in module dcmdata are now private, ** not protected anymore. ** ** Revision 1.16 2005/12/08 16:29:14 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.15 2004/07/01 12:28:25 meichel ** Introduced virtual clone method for DcmObject and derived classes. ** ** Revision 1.14 2002/12/06 12:49:20 joergr ** Enhanced "print()" function by re-working the implementation and replacing ** the boolean "showFullData" parameter by a more general integer flag. ** Added doc++ documentation. ** Made source code formatting more consistent with other modules/files. ** ** Revision 1.13 2001/09/25 17:19:35 meichel ** Adapted dcmdata to class OFCondition ** ** Revision 1.12 2001/06/01 15:48:54 meichel ** Updated copyright header ** ** Revision 1.11 2000/04/14 15:31:36 meichel ** Removed default value from output stream passed to print() method. ** Required for use in multi-thread environments. ** ** Revision 1.10 2000/03/08 16:26:27 meichel ** Updated copyright header. ** ** Revision 1.9 2000/03/03 14:05:28 meichel ** Implemented library support for redirecting error messages into memory ** instead of printing them to stdout/stderr for GUI applications. ** ** Revision 1.8 2000/02/10 10:50:56 joergr ** Added new feature to dcmdump (enhanced print method of dcmdata): write ** pixel data/item value fields to raw files. ** ** Revision 1.7 1999/03/31 09:25:10 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.6 1998/07/15 15:48:56 joergr ** Removed several compiler warnings reported by gcc 2.8.1 with ** additional options, e.g. missing copy constructors and assignment ** operators, initialization of member variables in the body of a ** constructor instead of the member initialization list, hiding of ** methods by use of identical names, uninitialized member variables, ** missing const declaration of char pointers. Replaced tabs by spaces. ** ** Revision 1.5 1997/07/21 08:25:17 andreas ** - Replace all boolean types (BOOLEAN, CTNBOOLEAN, DICOM_BOOL, BOOL) ** with one unique boolean type OFBool. ** ** Revision 1.4 1996/08/05 08:45:40 andreas ** new print routine with additional parameters: ** - print into files ** - fix output length for elements ** corrected error in search routine with parameter ESM_fromStackTop ** ** Revision 1.3 1996/01/05 13:23:11 andreas ** - changed to support new streaming facilities ** - more cleanups ** - merged read / write methods for block and file transfer ** */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/dcistrma.h0000644000310500011400000002141311455601175021543 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Marco Eichelberg * * Purpose: base classes for input streams * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:15:41 $ * CVS/RCS Revision: $Revision: 1.5 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DCISTRMA_H #define DCISTRMA_H #include "dcmtk/config/osconfig.h" #include "dcmtk/ofstd/oftypes.h" /* for OFBool */ #include "dcmtk/ofstd/ofcond.h" /* for OFCondition */ #include "dcmtk/ofstd/offile.h" /* for offile_off_t */ #include "dcmtk/dcmdata/dcxfer.h" /* for E_StreamCompression */ class DcmInputStream; /** pure virtual abstract base class for producers, i.e. the initial node * of a filter chain in an input stream. */ class DcmProducer { public: /// destructor virtual ~DcmProducer() { } /** returns the status of the producer. Unless the status is good, * the producer will not permit any operation. * @return status, true if good */ virtual OFBool good() const = 0; /** returns the status of the producer as an OFCondition object. * Unless the status is good, the producer will not permit any operation. * @return status, EC_Normal if good */ virtual OFCondition status() const = 0; /** returns true if the producer is at the end of stream. * @return true if end of stream, false otherwise */ virtual OFBool eos() = 0; /** returns the minimum number of bytes that can be read with the * next call to read(). The DcmObject read methods rely on avail * to return a value > 0 if there is no I/O suspension since certain * data such as tag and length are only read "en bloc", i.e. all * or nothing. * @return minimum of data available in producer */ virtual offile_off_t avail() = 0; /** reads as many bytes as possible into the given block. * @param buf pointer to memory block, must not be NULL * @param buflen length of memory block * @return number of bytes actually read. */ virtual offile_off_t read(void *buf, offile_off_t buflen) = 0; /** skips over the given number of bytes (or less) * @param skiplen number of bytes to skip * @return number of bytes actually skipped. */ virtual offile_off_t skip(offile_off_t skiplen) = 0; /** resets the stream to the position by the given number of bytes. * @param num number of bytes to putback. If the putback operation * fails, the producer status becomes bad. */ virtual void putback(offile_off_t num) = 0; }; /** pure virtual abstract base class for input filters, i.e. * intermediate nodes of a filter chain in an input stream. */ class DcmInputFilter: public DcmProducer { public: /// destructor virtual ~DcmInputFilter() { } /** determines the producer from which the filter is supposed * to read it's input. Once a producer for the input filter has * been defined, it cannot be changed anymore during the lifetime * of the object. * @param producer reference to producer, must not be circular chain */ virtual void append(DcmProducer& producer) = 0; }; /** pure virtual abstract base class for input stream factories, * i.e. objects that can create a new input stream */ class DcmInputStreamFactory { public: /// destructor virtual ~DcmInputStreamFactory() { } /** create a new input stream object * @return pointer to new input stream object */ virtual DcmInputStream *create() const = 0; /** returns a pointer to a copy of this object */ virtual DcmInputStreamFactory *clone() const = 0; }; /** abstract base class for input streams. */ class DcmInputStream { public: /// destructor virtual ~DcmInputStream(); /** returns the status of the stream. Unless the status is good, * the stream will not permit any operation. * @return status, true if good */ virtual OFBool good() const; /** returns the status of the stream as an OFCondition object. * Unless the status is good, the stream will not permit any operation. * @return status, EC_Normal if good */ virtual OFCondition status() const; /** returns true if the producer is at the end of stream. * @return true if end of stream, false otherwise */ virtual OFBool eos(); /** returns the minimum number of bytes that can be read with the * next call to read(). The DcmObject read methods rely on avail * to return a value > 0 if there is no I/O suspension since certain * data such as tag and length are only read "en bloc", i.e. all * or nothing. * @return minimum of data available in producer */ virtual offile_off_t avail(); /** reads as many bytes as possible into the given block. * @param buf pointer to memory block, must not be NULL * @param buflen length of memory block * @return number of bytes actually read. */ virtual offile_off_t read(void *buf, offile_off_t buflen); /** skips over the given number of bytes (or less) * @param skiplen number of bytes to skip * @return number of bytes actually skipped. */ virtual offile_off_t skip(offile_off_t skiplen); /** returns the total number of bytes read from the stream so far * @return total number of bytes read from the stream */ virtual offile_off_t tell() const; /** installs a compression filter for the given stream compression type, * which should be neither ESC_none nor ESC_unsupported. Once a compression * filter is active, it cannot be deactivated or replaced during the * lifetime of the stream. * @param filterType type of compression filter * @return EC_Normal if successful, an error code otherwise */ virtual OFCondition installCompressionFilter(E_StreamCompression filterType); /** creates a new factory object for the current stream * and stream position. When activated, the factory will be * able to create new DcmInputStream delivering the same * data as the current stream. Used to defer loading of * value fields until accessed. * If no factory object can be created (e.g. because the * stream is not seekable), returns NULL. * @return pointer to new factory object if successful, NULL otherwise. */ virtual DcmInputStreamFactory *newFactory() const = 0; /** marks the current stream position for a later putback operation, * overwriting a possibly existing prior putback mark. * The DcmObject read methods rely on the possibility to putback * up to 132 bytes for transfer syntax detection, parse error recovery etc. * Implementations of this class should guarantee a putback capability * of at least 1 kbyte. */ virtual void mark(); /** resets the stream to the position previously marked with * setPutbackMark(). If the putback operation fails (no putback mark * set or putback buffer exceeded), status of the producer switches to bad. */ virtual void putback(); protected: /** protected constructor, to be called from derived class constructor * @param initial initial pointer to first node in filter chain * The pointer is not dereferenced in the constructor, so the * object pointed to may be initialized later in the subclass * constructor. */ DcmInputStream(DcmProducer *initial); /** returns pointer to current producer object */ const DcmProducer *currentProducer() const; private: /// private unimplemented copy constructor DcmInputStream(const DcmInputStream&); /// private unimplemented copy assignment operator DcmInputStream& operator=(const DcmInputStream&); /// pointer to first node in filter chain DcmProducer *current_; /// pointer to compression filter, NULL if no compression DcmInputFilter *compressionFilter_; /// counter for number of bytes read so far offile_off_t tell_; /// putback marker offile_off_t mark_; }; #endif /* * CVS/RCS Log: * $Log: dcistrma.h,v $ * Revision 1.5 2010-10-14 13:15:41 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.4 2009-11-04 09:58:07 uli * Switched to logging mechanism provided by the "new" oflog module * * Revision 1.3 2007-02-19 15:45:41 meichel * Class DcmInputStream and related classes are now safe for use with * large files (2 GBytes or more) if supported by compiler and operating system. * * Revision 1.2 2005/12/08 16:28:15 meichel * Changed include path schema for all DCMTK header files * * Revision 1.1 2002/08/27 16:55:32 meichel * Initial release of new DICOM I/O stream classes that add support for stream * compression (deflated little endian explicit VR transfer syntax) * * */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/dcpixseq.h0000644000310500011400000004266011455601175021564 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Gerd Ehlers, Andreas Barth * * Purpose: Interface of class DcmPixelSequence * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:15:41 $ * CVS/RCS Revision: $Revision: 1.37 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DCPIXSEQ_H #define DCPIXSEQ_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcsequen.h" #include "dcmtk/dcmdata/dcofsetl.h" /* for class DcmOffsetList */ class DcmPixelItem; /** this class implements a sequence of pixel items, i.e. the data structure DICOM is using * to store compressed pixel data. The object behaves very much like a sequence, but uses * the pixel data tag (7FE0,0010) and OB value representation with undefined length, * and the "items" contained within the sequence are in fact pixel items (class DcmPixelItem) * that contain no list of DICOM elements but raw compressed pixel data. */ class DcmPixelSequence : public DcmSequenceOfItems { public: /** constructor * @param tag attribute tag * @param len length of the attribute value */ DcmPixelSequence(const DcmTag &tag, const Uint32 len = 0); /** copy constructor * @param old element to be copied */ DcmPixelSequence(const DcmPixelSequence &old); /// destructor virtual ~DcmPixelSequence(); /** copy assignment operator * @param obj element to be copied */ DcmPixelSequence &operator=(const DcmPixelSequence &obj); /** clone method * @return deep copy of this object */ virtual DcmObject *clone() const { return new DcmPixelSequence(*this); } /** Virtual object copying. This method can be used for DcmObject * and derived classes to get a deep copy of an object. Internally * the assignment operator is called if the given DcmObject parameter * is of the same type as "this" object instance. If not, an error * is returned. This function permits copying an object by value * in a virtual way which therefore is different to just calling the * assignment operator of DcmElement which could result in slicing * the object. * @param rhs - [in] The instance to copy from. Has to be of the same * class type as "this" object * @return EC_Normal if copying was successful, error otherwise */ virtual OFCondition copyFrom(const DcmObject& rhs); /** get type identifier * @return type identifier of this class (EVR_item) */ virtual DcmEVR ident(void) const { return EVR_pixelSQ; } /** print all elements of the item to a stream * @param out output stream * @param flags optional flag used to customize the output (see DCMTypes::PF_xxx) * @param level current level of nested items. Used for indentation. * @param pixelFileName optional filename used to write the raw pixel data file * @param pixelCounter optional counter used for automatic pixel data filename creation */ virtual void print(STD_NAMESPACE ostream &out, const size_t flags = 0, const int level = 0, const char *pixelFileName = NULL, size_t *pixelCounter = NULL); /** calculate the length of this DICOM element when encoded with the * given transfer syntax and the given encoding type for sequences. * For elements, the length includes the length of the tag, length field, * VR field and the value itself, for items and sequences it returns * the length of the complete item or sequence including delimitation tags * if applicable. Never returns undefined length. * @param xfer transfer syntax for length calculation * @param enctype sequence encoding type for length calculation * @return length of DICOM element */ virtual Uint32 calcElementLength(const E_TransferSyntax xfer, const E_EncodingType enctype); /** insert the given pixel item at the given position within the list maintained by this object. * Ownership of the pixel item, which must be allocated on the heap, is transferred to the pixel sequence. * @param item pointer to DcmPixelItem instance allocated on the heap, must not be NULL. * @param where position at which the new item is to be inserted. * @return EC_Normal if successful, an error code otherwise */ virtual OFCondition insert(DcmPixelItem *item, unsigned long where = DCM_EndOfListIndex); /** access a pixel item from the pixel sequence. This method returns a pointer to one * of the pixel items in the list, and not a copy. * @param item upon success, a pointer to the selected pixel item is returned in this parameter * @param num index number of pixel item, must be < card() * @return pointer to item if found, NULL if num >= card() */ virtual OFCondition getItem(DcmPixelItem * &item, const unsigned long num); /** remove pixel item from list. If found, the pixel item is not deleted but * returned to the caller who is responsible for further management of the * DcmPixelItem object. * @param item upon success, a pointer to the removed pixel item is returned in this parameter * @param num index number of item, must be < card() * @return EC_Normal if successful, an error code otherwise */ virtual OFCondition remove(DcmPixelItem * &item, const unsigned long num); /** remove pixel item from list. Tthe pixel item is not deleted; * the caller is responsible for further management of the DcmPixelItem object. * @param item pointer to element to be removed from list * @return EC_Normal if successful, an error code otherwise */ virtual OFCondition remove(DcmPixelItem* item); /** changes the transfer syntax of this object to the given one. * This only works if no transfer syntax was defined so far, or if the new and the old one * are identical. * @param newXfer * @return status, EC_Normal if successful, an error code otherwise */ OFCondition changeXfer(const E_TransferSyntax newXfer); /** check if this DICOM object can be encoded in the given transfer syntax. * @param newXfer transfer syntax in which the DICOM object is to be encoded * @param oldXfer transfer syntax in which the DICOM object was read or created. * @return true if object can be encoded in desired transfer syntax, false otherwise. */ virtual OFBool canWriteXfer(const E_TransferSyntax newXfer, const E_TransferSyntax oldXfer); /** This function reads the information of all attributes which * are captured in the input stream and captures this information * in elementList. Each attribute is represented as an element * in this list. If not all information for an attribute could be * read from the stream, the function returns EC_StreamNotifyClient. * @param inStream The stream which contains the information. * @param ixfer The transfer syntax which was used to encode * the information in inStream. * @param glenc Encoding type for group length; specifies * what will be done with group length tags. * @param maxReadLength Maximum read length for reading an attribute value. * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition read(DcmInputStream & inStream, const E_TransferSyntax ixfer, const E_GrpLenEncoding glenc = EGL_noChange, const Uint32 maxReadLength = DCM_MaxReadLength); /** write object to a stream * @param outStream DICOM output stream * @param oxfer output transfer syntax * @param enctype encoding types (undefined or explicit length) * @param wcache pointer to write cache object, may be NULL * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition write(DcmOutputStream &outStream, const E_TransferSyntax oxfer, const E_EncodingType enctype, DcmWriteCache *wcache); /** special write method for creation of digital signatures * @param outStream DICOM output stream * @param oxfer output transfer syntax * @param enctype encoding types (undefined or explicit length) * @param wcache pointer to write cache object, may be NULL * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition writeSignatureFormat(DcmOutputStream &outStream, const E_TransferSyntax oxfer, const E_EncodingType enctype, DcmWriteCache *wcache); /** appends a single compressed frame to this DICOM pixel sequence * @param offsetList list containing offset table entries. * Upon success, an entry is appended to the list. The offset values are always even, * so it is expected that odd length pixel items are padded later during writing. * @param compressedData pointer to compressed image data, must not be NULL * @param compressedLen number of bytes of compressed image data * @param fragmentSize maximum fragment size (in kbytes) for compression, 0 for unlimited. * @return EC_Normal if successful, an error code otherwise */ virtual OFCondition storeCompressedFrame(DcmOffsetList &offsetList, Uint8 *compressedData, Uint32 compressedLen, Uint32 fragmentSize); protected: /** helper function for read(). Create sub-object (pixel item) of the * appropriate type depending on the tag. * @param newObject upon success, a pointer to the newly created object is returned in this parameter * @param newTag tag of the sub-object to be created * @param newLength length of the sub-object to be created * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition makeSubObject(DcmObject * &newObject, // out const DcmTag &newTag, const Uint32 newLength); // in private: /** the transfer syntax in which the compressed pixel data maintained by this object * is encoded. This may very well differ from the transfer syntax of the main dataset * if this object was created by a compression codec in memory. */ E_TransferSyntax Xfer; /// method inherited from base class that is useless in this class virtual OFCondition insert(DcmItem* /*item*/, unsigned long /*where*/ = DCM_EndOfListIndex, OFBool /*before*/ = OFFalse) { return EC_IllegalCall; } /// method inherited from base class that is useless in this class virtual DcmItem* getItem(const unsigned long /*num*/) { return NULL; } /// method inherited from base class that is useless in this class virtual DcmItem* remove(const unsigned long /*num*/) { return NULL; } /// method inherited from base class that is useless in this class virtual DcmItem* remove(DcmItem* /*item*/) { return NULL; } }; #endif // DCPIXSEQ_H /* ** CVS/RCS Log: ** $Log: dcpixseq.h,v $ ** Revision 1.37 2010-10-14 13:15:41 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.36 2010-03-01 09:08:44 uli ** Removed some unnecessary include directives in the headers. ** ** Revision 1.35 2010-02-22 11:39:54 uli ** Remove some unneeded includes. ** ** Revision 1.34 2009-02-04 17:54:30 joergr ** Fixed various layout and formatting issues. ** ** Revision 1.33 2009-02-04 10:18:19 joergr ** Fixed issue with compressed frames of odd length (possibly wrong values in ** basic offset table). ** ** Revision 1.32 2008-07-17 11:19:49 onken ** Updated copyFrom() documentation. ** ** Revision 1.31 2008-07-17 10:30:23 onken ** Implemented copyFrom() method for complete DcmObject class hierarchy, which ** permits setting an instance's value from an existing object. Implemented ** assignment operator where necessary. ** ** Revision 1.30 2008-06-23 12:09:13 joergr ** Fixed inconsistencies in Doxygen API documentation. ** ** Revision 1.29 2007/11/29 14:30:19 meichel ** Write methods now handle large raw data elements (such as pixel data) ** without loading everything into memory. This allows very large images to ** be sent over a network connection, or to be copied without ever being ** fully in memory. ** ** Revision 1.28 2006/08/15 15:49:56 meichel ** Updated all code in module dcmdata to correctly compile when ** all standard C++ classes remain in namespace std. ** ** Revision 1.27 2005/12/08 16:28:31 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.26 2004/07/01 12:28:25 meichel ** Introduced virtual clone method for DcmObject and derived classes. ** ** Revision 1.25 2002/12/06 12:49:12 joergr ** Enhanced "print()" function by re-working the implementation and replacing ** the boolean "showFullData" parameter by a more general integer flag. ** Added doc++ documentation. ** Made source code formatting more consistent with other modules/files. ** ** Revision 1.24 2002/08/27 16:55:38 meichel ** Initial release of new DICOM I/O stream classes that add support for stream ** compression (deflated little endian explicit VR transfer syntax) ** ** Revision 1.23 2002/05/24 14:51:42 meichel ** Moved helper methods that are useful for different compression techniques ** from module dcmjpeg to module dcmdata ** ** Revision 1.22 2001/09/25 17:19:28 meichel ** Adapted dcmdata to class OFCondition ** ** Revision 1.21 2001/06/01 15:48:42 meichel ** Updated copyright header ** ** Revision 1.20 2000/11/07 16:56:08 meichel ** Initial release of dcmsign module for DICOM Digital Signatures ** ** Revision 1.19 2000/04/14 16:02:23 meichel ** Removed default value from output stream passed to print() method. ** Required for use in multi-thread environments. ** ** Revision 1.18 2000/03/08 16:26:17 meichel ** Updated copyright header. ** ** Revision 1.17 2000/03/06 18:11:30 joergr ** Local variable hided member variable (reported by Sun CC 4.2). ** ** Revision 1.16 2000/03/03 14:41:56 joergr ** Corrected bug related to padding of file and item size. ** ** Revision 1.15 2000/03/03 14:05:25 meichel ** Implemented library support for redirecting error messages into memory ** instead of printing them to stdout/stderr for GUI applications. ** ** Revision 1.14 2000/02/10 10:50:53 joergr ** Added new feature to dcmdump (enhanced print method of dcmdata): write ** pixel data/item value fields to raw files. ** ** Revision 1.13 1999/03/31 09:24:44 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.12 1998/11/12 16:47:42 meichel ** Implemented operator= for all classes derived from DcmObject. ** ** Revision 1.11 1998/07/15 15:48:51 joergr ** Removed several compiler warnings reported by gcc 2.8.1 with ** additional options, e.g. missing copy constructors and assignment ** operators, initialization of member variables in the body of a ** constructor instead of the member initialization list, hiding of ** methods by use of identical names, uninitialized member variables, ** missing const declaration of char pointers. Replaced tabs by spaces. ** ** Revision 1.10 1997/07/21 08:25:10 andreas ** - Replace all boolean types (BOOLEAN, CTNBOOLEAN, DICOM_BOOL, BOOL) ** with one unique boolean type OFBool. ** ** Revision 1.9 1997/05/27 13:48:29 andreas ** - Add method canWriteXfer to class DcmObject and all derived classes. ** This method checks whether it is possible to convert the original ** transfer syntax to an new transfer syntax. The check is used in the ** dcmconv utility to prohibit the change of a compressed transfer ** syntax to a uncompressed. ** ** Revision 1.8 1997/05/22 16:57:10 andreas ** - Corrected errors for writing of pixel sequences for encapsulated ** transfer syntaxes. ** ** Revision 1.7 1997/05/06 09:22:37 hewett ** Added a "before" flag to the insertion of items for compatibility with ** insertion in normal Sequences. ** ** Revision 1.6 1996/08/05 08:45:27 andreas ** new print routine with additional parameters: ** - print into files ** - fix output length for elements ** corrected error in search routine with parameter ESM_fromStackTop ** ** Revision 1.5 1996/01/29 13:38:13 andreas ** - new put method for every VR to put value as a string ** - better and unique print methods ** ** Revision 1.4 1996/01/24 09:34:55 andreas ** Support for 64 bit long ** ** Revision 1.3 1996/01/05 13:22:58 andreas ** - changed to support new streaming facilities ** - more cleanups ** - merged read / write methods for block and file transfer ** */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/dctk.h0000644000310500011400000001062311455601176020664 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Gerd Ehlers * * Purpose: include most dcmdata files that are usually required * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:15:42 $ * CVS/RCS Revision: $Revision: 1.18 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DCTK_H #define DCTK_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ // various headers #include "dcmtk/dcmdata/dctypes.h" #include "dcmtk/dcmdata/dcswap.h" #include "dcmtk/dcmdata/dcistrma.h" #include "dcmtk/dcmdata/dcostrma.h" #include "dcmtk/dcmdata/dcvr.h" #include "dcmtk/dcmdata/dcxfer.h" #include "dcmtk/dcmdata/dcuid.h" #include "dcmtk/dcmdata/dcvm.h" #include "dcmtk/ofstd/ofdefine.h" // tags and dictionary #include "dcmtk/dcmdata/dctagkey.h" #include "dcmtk/dcmdata/dctag.h" #include "dcmtk/dcmdata/dcdicent.h" #include "dcmtk/dcmdata/dchashdi.h" #include "dcmtk/dcmdata/dcdict.h" #include "dcmtk/dcmdata/dcdeftag.h" // basis classes #include "dcmtk/dcmdata/dcobject.h" #include "dcmtk/dcmdata/dcelem.h" // classes for management of sequences and other lists #include "dcmtk/dcmdata/dcitem.h" #include "dcmtk/dcmdata/dcmetinf.h" #include "dcmtk/dcmdata/dcdatset.h" #include "dcmtk/dcmdata/dcsequen.h" #include "dcmtk/dcmdata/dcfilefo.h" #include "dcmtk/dcmdata/dcdicdir.h" #include "dcmtk/dcmdata/dcpixseq.h" // element classes for string management (8-bit) #include "dcmtk/dcmdata/dcbytstr.h" #include "dcmtk/dcmdata/dcvrae.h" #include "dcmtk/dcmdata/dcvras.h" #include "dcmtk/dcmdata/dcvrcs.h" #include "dcmtk/dcmdata/dcvrda.h" #include "dcmtk/dcmdata/dcvrds.h" #include "dcmtk/dcmdata/dcvrdt.h" #include "dcmtk/dcmdata/dcvris.h" #include "dcmtk/dcmdata/dcvrtm.h" #include "dcmtk/dcmdata/dcvrui.h" // element classes for string management (8-bit and/or 16-bit in later extensions) #include "dcmtk/dcmdata/dcchrstr.h" #include "dcmtk/dcmdata/dcvrlo.h" #include "dcmtk/dcmdata/dcvrlt.h" #include "dcmtk/dcmdata/dcvrpn.h" #include "dcmtk/dcmdata/dcvrsh.h" #include "dcmtk/dcmdata/dcvrst.h" #include "dcmtk/dcmdata/dcvrut.h" // element class for byte and word value representations #include "dcmtk/dcmdata/dcvrobow.h" #include "dcmtk/dcmdata/dcpixel.h" #include "dcmtk/dcmdata/dcovlay.h" // element classes for binary value fields #include "dcmtk/dcmdata/dcvrat.h" #include "dcmtk/dcmdata/dcvrss.h" #include "dcmtk/dcmdata/dcvrus.h" #include "dcmtk/dcmdata/dcvrsl.h" #include "dcmtk/dcmdata/dcvrul.h" #include "dcmtk/dcmdata/dcvrulup.h" #include "dcmtk/dcmdata/dcvrfl.h" #include "dcmtk/dcmdata/dcvrfd.h" #include "dcmtk/dcmdata/dcvrof.h" // misc supporting tools #include "dcmtk/dcmdata/cmdlnarg.h" #endif /* DCTK_H */ /* * CVS/RCS Log: * $Log: dctk.h,v $ * Revision 1.18 2010-10-14 13:15:42 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.17 2009-11-04 09:58:07 uli * Switched to logging mechanism provided by the "new" oflog module * * Revision 1.16 2009-09-28 13:29:38 joergr * Moved general purpose definition file from module dcmdata to ofstd, and * added new defines in order to make the usage easier. * * Revision 1.15 2005/12/08 16:28:46 meichel * Changed include path schema for all DCMTK header files * * Revision 1.14 2005/11/28 15:28:56 meichel * File dcdebug.h is not included by any other header file in the toolkit * anymore, to minimize the risk of name clashes of macro debug(). * * Revision 1.13 2002/12/06 12:19:30 joergr * Added support for new value representation Other Float String (OF). * * Revision 1.12 2002/08/27 16:55:40 meichel * Initial release of new DICOM I/O stream classes that add support for stream * compression (deflated little endian explicit VR transfer syntax) * * Revision 1.11 2001/06/01 15:48:45 meichel * Updated copyright header * * Revision 1.10 2000/03/08 16:26:19 meichel * Updated copyright header. * * Revision 1.9 2000/02/29 11:48:38 meichel * Removed support for VS value representation. This was proposed in CP 101 * but never became part of the standard. * * Revision 1.8 1999/03/31 09:24:50 meichel * Updated copyright header in module dcmdata * * */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/dcostrma.h0000644000310500011400000001635511455601175021562 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Marco Eichelberg * * Purpose: base classes for output streams * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:15:41 $ * CVS/RCS Revision: $Revision: 1.5 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DCOSTRMA_H #define DCOSTRMA_H #include "dcmtk/config/osconfig.h" #include "dcmtk/ofstd/oftypes.h" /* for OFBool */ #include "dcmtk/ofstd/ofcond.h" /* for OFCondition */ #include "dcmtk/dcmdata/dcxfer.h" /* for E_StreamCompression */ #include "dcmtk/ofstd/offile.h" /* for offile_off_t */ /** pure virtual abstract base class for consumers, i.e. the final node * of a filter chain in an output stream. */ class DcmConsumer { public: /// destructor virtual ~DcmConsumer() { } /** returns the status of the consumer. Unless the status is good, * the consumer will not permit any operation. * @return status, true if good */ virtual OFBool good() const = 0; /** returns the status of the consumer as an OFCondition object. * Unless the status is good, the consumer will not permit any operation. * @return status, EC_Normal if good */ virtual OFCondition status() const = 0; /** returns true if the consumer is flushed, i.e. has no more data * pending in it's internal state that needs to be flushed before * the stream is closed. * @return true if consumer is flushed, false otherwise */ virtual OFBool isFlushed() const = 0; /** returns the minimum number of bytes that can be written with the * next call to write(). The DcmObject write methods rely on avail * to return a value > 0 if there is no I/O suspension since certain * data such as tag and length are only written "en bloc", i.e. all * or nothing. * @return minimum of space available in consumer */ virtual offile_off_t avail() const = 0; /** processes as many bytes as possible from the given input block. * @param buf pointer to memory block, must not be NULL * @param buflen length of memory block * @return number of bytes actually processed. */ virtual offile_off_t write(const void *buf, offile_off_t buflen) = 0; /** instructs the consumer to flush its internal content until * either the consumer becomes "flushed" or I/O suspension occurs. * After a call to flush(), a call to write() will produce undefined * behaviour. */ virtual void flush() = 0; }; /** pure virtual abstract base class for output filters, i.e. * intermediate nodes of a filter chain in an output stream. */ class DcmOutputFilter: public DcmConsumer { public: /// destructor virtual ~DcmOutputFilter() { } /** determines the consumer to which the filter is supposed * to write it's output. Once a consumer for the output filter has * been defined, it cannot be changed anymore during the lifetime * of the object. * @param consumer reference to consumer, must not be circular chain */ virtual void append(DcmConsumer& consumer) = 0; }; /** base class for output streams. * This class cannot be instantiated since the constructor is protected. */ class DcmOutputStream { public: /// destructor virtual ~DcmOutputStream(); /** returns the status of the stream. Unless the status is good, * the stream will not permit any operation. * @return status, true if good */ virtual OFBool good() const; /** returns the status of the consumer as an OFCondition object. * Unless the status is good, the consumer will not permit any operation. * @return status, EC_Normal if good */ virtual OFCondition status() const; /** returns true if the stream is flushed, i.e. has no more data * pending in it's internal state that needs to be flushed before * the stream is closed. * @return true if stream is flushed, false otherwise */ virtual OFBool isFlushed() const; /** returns the minimum number of bytes that can be written with the * next call to write(). The DcmObject write methods rely on avail * to return a value > 0 if there is no I/O suspension since certain * data such as tag and length are only written "en bloc", i.e. all * or nothing. * @return minimum of space available in stream */ virtual offile_off_t avail() const; /** processes as many bytes as possible from the given input block. * @param buf pointer to memory block, must not be NULL * @param buflen length of memory block * @return number of bytes actually processed. */ virtual offile_off_t write(const void *buf, offile_off_t buflen); /** instructs the stream to flush its internal content until * either the stream becomes "flushed" or I/O suspension occurs. * After a call to flush(), a call to write() will produce undefined * behaviour. */ virtual void flush(); /** returns the total number of bytes written to the stream so far * @return total number of bytes written to the stream */ virtual offile_off_t tell() const; /** installs a compression filter for the given stream compression type, * which should be neither ESC_none nor ESC_unsupported. Once a compression * filter is active, it cannot be deactivated or replaced during the * lifetime of the stream. * @param filterType type of compression filter * @return EC_Normal if successful, an error code otherwise */ virtual OFCondition installCompressionFilter(E_StreamCompression filterType); protected: /** protected constructor, to be called from derived class constructor * @param initial initial pointer to first node in filter chain * The pointer is not dereferenced in the constructor, so the * object pointed to may be initialized later in the subclass * constructor. */ DcmOutputStream(DcmConsumer *initial); private: /// private unimplemented copy constructor DcmOutputStream(const DcmOutputStream&); /// private unimplemented copy assignment operator DcmOutputStream& operator=(const DcmOutputStream&); /// pointer to first node in filter chain DcmConsumer *current_; /// pointer to compression filter, NULL if no compression DcmOutputFilter *compressionFilter_; /// counter for number of bytes written so far offile_off_t tell_; }; #endif /* * CVS/RCS Log: * $Log: dcostrma.h,v $ * Revision 1.5 2010-10-14 13:15:41 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.4 2009-11-04 09:58:07 uli * Switched to logging mechanism provided by the "new" oflog module * * Revision 1.3 2007-02-19 16:06:09 meichel * Class DcmOutputStream and related classes are now safe for use with * large files (2 GBytes or more) if supported by compiler and operating system. * * Revision 1.2 2005/12/08 16:28:24 meichel * Changed include path schema for all DCMTK header files * * Revision 1.1 2002/08/27 16:55:36 meichel * Initial release of new DICOM I/O stream classes that add support for stream * compression (deflated little endian explicit VR transfer syntax) * * */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/dcistrmb.h0000644000310500011400000001573111455601175021552 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Marco Eichelberg * * Purpose: DcmInputBufferStream and related classes, * implements input to blocks of memory as needed in the dcmnet module. * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:15:41 $ * CVS/RCS Revision: $Revision: 1.6 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DCISTRMB_H #define DCISTRMB_H #include "dcmtk/config/osconfig.h" #include "dcmtk/dcmdata/dcistrma.h" /** producer class that reads data from a buffer provided by the caller. * Used for DICOM network communication. */ class DcmBufferProducer: public DcmProducer { public: /** constructor */ DcmBufferProducer(); /// destructor virtual ~DcmBufferProducer(); /** returns the status of the producer. Unless the status is good, * the producer will not permit any operation. * @return status, true if good */ virtual OFBool good() const; /** returns the status of the producer as an OFCondition object. * Unless the status is good, the producer will not permit any operation. * @return status, EC_Normal if good */ virtual OFCondition status() const; /** returns true if the producer is at the end of stream. * @return true if end of stream, false otherwise */ virtual OFBool eos(); /** returns the minimum number of bytes that can be read with the * next call to read(). The DcmObject read methods rely on avail * to return a value > 0 if there is no I/O suspension since certain * data such as tag and length are only read "en bloc", i.e. all * or nothing. * @return minimum of data available in producer */ virtual offile_off_t avail(); /** reads as many bytes as possible into the given block. * @param buf pointer to memory block, must not be NULL * @param buflen length of memory block * @return number of bytes actually read. */ virtual offile_off_t read(void *buf, offile_off_t buflen); /** skips over the given number of bytes (or less) * @param skiplen number of bytes to skip * @return number of bytes actually skipped. */ virtual offile_off_t skip(offile_off_t skiplen); /** resets the stream to the position by the given number of bytes. * @param num number of bytes to putback. If the putback operation * fails, the producer status becomes bad. */ virtual void putback(offile_off_t num); /** adds the content of the given buffer to the input stream. * @param buf buffer from which data is read. Must be allocated * by caller and remain valid until releaseBuffer() is called * @param buflen buffer length, must be even number > 0. */ virtual void setBuffer(const void *buf, offile_off_t buflen); /** releases the current buffer. Should only be called when * the content of the buffer has been read as far as possible. * Pending input from the buffer is copied into an internal * backup buffer if necessary. If an overflow condition * occurs, the producer status becomes bad. */ virtual void releaseBuffer(); /** marks the end of stream, i.e. the data provided with the last call * to setBuffer is the last data available in the stream. */ virtual void setEos(); private: /// private unimplemented copy constructor DcmBufferProducer(const DcmBufferProducer&); /// private unimplemented copy assignment operator DcmBufferProducer& operator=(const DcmBufferProducer&); /// the user buffer we're actually reading from unsigned char *buffer_; /// the backup buffer unsigned char *backup_; /// size of the user buffer, in bytes offile_off_t bufSize_; /// number of bytes read from the user buffer offile_off_t bufIndex_; /// number of bytes read from the backup buffer offile_off_t backupIndex_; /// index of first valid byte in backup buffer, for putback offile_off_t backupStart_; /// status OFCondition status_; /// true if setEos has been called before OFBool eosflag_; }; /** input stream that reads from a buffer of fixed length * which must be provided by the caller. */ class DcmInputBufferStream: public DcmInputStream { public: /** constructor */ DcmInputBufferStream(); /// destructor virtual ~DcmInputBufferStream(); /** creates a new factory object for the current stream * and stream position. When activated, the factory will be * able to create new DcmInputStream delivering the same * data as the current stream. Used to defer loading of * value fields until accessed. * If no factory object can be created (e.g. because the * stream is not seekable), returns NULL. * @return pointer to new factory object if successful, NULL otherwise. */ virtual DcmInputStreamFactory *newFactory() const; /** adds the content of the given buffer to the input stream. * @param buf buffer from which data is read. Must be allocated * by caller and remain valid until releaseBuffer() is called * @param buflen buffer length, must be even number > 0. */ virtual void setBuffer(const void *buf, offile_off_t buflen); /** releases the current buffer. Should only be called when * the content of the buffer has been read as far as possible. * Pending input from the buffer is copied into an internal * backup buffer if necessary. If an overflow condition * occurs, the producer status becomes bad. */ virtual void releaseBuffer(); /** marks the end of stream, i.e. the data provided with the last call * to setBuffer is the last data available in the stream. */ virtual void setEos(); private: /// private unimplemented copy constructor DcmInputBufferStream(const DcmInputBufferStream&); /// private unimplemented copy assignment operator DcmInputBufferStream& operator=(const DcmInputBufferStream&); /// the final producer of the filter chain DcmBufferProducer producer_; }; #endif /* * CVS/RCS Log: * $Log: dcistrmb.h,v $ * Revision 1.6 2010-10-14 13:15:41 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.5 2008-06-23 12:09:13 joergr * Fixed inconsistencies in Doxygen API documentation. * * Revision 1.4 2007/02/19 15:45:41 meichel * Class DcmInputStream and related classes are now safe for use with * large files (2 GBytes or more) if supported by compiler and operating system. * * Revision 1.3 2005/12/08 16:28:16 meichel * Changed include path schema for all DCMTK header files * * Revision 1.2 2003/06/12 13:34:36 joergr * Fixed inconsistent API documentation reported by Doxygen. * * Revision 1.1 2002/08/27 16:55:33 meichel * Initial release of new DICOM I/O stream classes that add support for stream * compression (deflated little endian explicit VR transfer syntax) * * */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/dcvrul.h0000644000310500011400000002523611464747623021254 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Gerd Ehlers, Andreas Barth * * Purpose: Interface of class DcmUnsignedLong * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-11-05 09:34:11 $ * CVS/RCS Revision: $Revision: 1.27 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DCVRUL_H #define DCVRUL_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcelem.h" /** a class representing the DICOM value representation 'Unsigned Long' (UL) */ class DcmUnsignedLong : public DcmElement { public: /** constructor. * Create new element from given tag and length. * @param tag DICOM tag for the new element * @param len value length for the new element */ DcmUnsignedLong(const DcmTag &tag, const Uint32 len = 0); /** copy constructor * @param old element to be copied */ DcmUnsignedLong(const DcmUnsignedLong &old); /** destructor */ virtual ~DcmUnsignedLong(); /** assignment operator * @param obj element to be assigned/copied * @return reference to this object */ DcmUnsignedLong &operator=(const DcmUnsignedLong &obj); /** clone method * @return deep copy of this object */ virtual DcmObject *clone() const { return new DcmUnsignedLong(*this); } /** Virtual object copying. This method can be used for DcmObject * and derived classes to get a deep copy of an object. Internally * the assignment operator is called if the given DcmObject parameter * is of the same type as "this" object instance. If not, an error * is returned. This function permits copying an object by value * in a virtual way which therefore is different to just calling the * assignment operator of DcmElement which could result in slicing * the object. * @param rhs - [in] The instance to copy from. Has to be of the same * class type as "this" object * @return EC_Normal if copying was successful, error otherwise */ virtual OFCondition copyFrom(const DcmObject& rhs); /** get element type identifier * @return type identifier of this class (EVR_UL) */ virtual DcmEVR ident() const; /** check whether stored value conforms to the VR and to the specified VM * @param vm value multiplicity (according to the data dictionary) to be checked for. * (valid values: "1", "1-2", "1-3", "1-8", "1-99", "1-n", "2", "2-n", "2-2n", * "3", "3-n", "3-3n", "4", "6", "9", "16", "32") * @param oldFormat parameter not used for this VR (only for DA, TM, PN) * @return status of the check, EC_Normal if value is correct, an error code otherwise */ virtual OFCondition checkValue(const OFString &vm = "1-n", const OFBool oldFormat = OFFalse); /** get value multiplicity * @return number of currently stored values */ virtual unsigned long getVM(); /** print element to a stream. * The output format of the value is a backslash separated sequence of numbers. * @param out output stream * @param flags optional flag used to customize the output (see DCMTypes::PF_xxx) * @param level current level of nested items. Used for indentation. * @param pixelFileName not used * @param pixelCounter not used */ virtual void print(STD_NAMESPACE ostream&out, const size_t flags = 0, const int level = 0, const char *pixelFileName = NULL, size_t *pixelCounter = NULL); /** get particular integer value * @param uintVal reference to result variable (cleared in case of error) * @param pos index of the value to be retrieved (0..vm-1) * @return status status, EC_Normal if successful, an error code otherwise */ virtual OFCondition getUint32(Uint32 &uintVal, const unsigned long pos = 0); /** get reference to stored integer data. * The number of entries can be determined by "getVM()". * @param uintVals reference to result variable * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition getUint32Array(Uint32 *&uintVals); /** get particular value as a character string * @param stringVal variable in which the result value is stored * @param pos index of the value in case of multi-valued elements (0..vm-1) * @param normalize not used * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition getOFString(OFString &stringVal, const unsigned long pos, OFBool normalize = OFTrue); /** set particular element value to given integer * @param uintVal unsigned integer value to be set * @param pos index of the value to be set (0 = first position) * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition putUint32(const Uint32 uintVal, const unsigned long pos = 0); /** set element value to given integer array data * @param uintVals unsigned integer data to be set * @param numUints number of integer values to be set * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition putUint32Array(const Uint32 *uintVals, const unsigned long numUints); /** set element value from the given character string. * The input string is expected to be a backslash separated sequence of * numeric characters, e.g. "1\22\333\4444\55555\666666\7777777". * @param stringVal input character string * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition putString(const char *stringVal); /** check the currently stored element value * @param autocorrect correct value length if OFTrue * @return status, EC_Normal if value length is correct, an error code otherwise */ virtual OFCondition verify(const OFBool autocorrect = OFFalse); }; #endif // DCVRUL_H /* ** CVS/RCS Log: ** $Log: dcvrul.h,v $ ** Revision 1.27 2010-11-05 09:34:11 joergr ** Added support for checking the value multiplicity "9" (see Supplement 131). ** ** Revision 1.26 2010-10-14 13:15:43 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.25 2010-04-23 15:26:13 joergr ** Specify an appropriate default value for the "vm" parameter of checkValue(). ** ** Revision 1.24 2010-04-23 14:25:27 joergr ** Added new method to all VR classes which checks whether the stored value ** conforms to the VR definition and to the specified VM. ** ** Revision 1.23 2009-11-04 09:58:08 uli ** Switched to logging mechanism provided by the "new" oflog module ** ** Revision 1.22 2008-07-17 11:19:49 onken ** Updated copyFrom() documentation. ** ** Revision 1.21 2008-07-17 10:30:23 onken ** Implemented copyFrom() method for complete DcmObject class hierarchy, which ** permits setting an instance's value from an existing object. Implemented ** assignment operator where necessary. ** ** Revision 1.20 2006-08-15 15:49:56 meichel ** Updated all code in module dcmdata to correctly compile when ** all standard C++ classes remain in namespace std. ** ** Revision 1.19 2005/12/08 16:29:13 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.18 2004/07/01 12:28:25 meichel ** Introduced virtual clone method for DcmObject and derived classes. ** ** Revision 1.17 2002/12/06 12:49:20 joergr ** Enhanced "print()" function by re-working the implementation and replacing ** the boolean "showFullData" parameter by a more general integer flag. ** Added doc++ documentation. ** Made source code formatting more consistent with other modules/files. ** ** Revision 1.16 2002/04/25 10:01:55 joergr ** Added getOFString() implementation. ** ** Revision 1.15 2001/09/25 17:19:35 meichel ** Adapted dcmdata to class OFCondition ** ** Revision 1.14 2001/06/01 15:48:54 meichel ** Updated copyright header ** ** Revision 1.13 2000/04/14 15:31:36 meichel ** Removed default value from output stream passed to print() method. ** Required for use in multi-thread environments. ** ** Revision 1.12 2000/03/08 16:26:27 meichel ** Updated copyright header. ** ** Revision 1.11 2000/03/03 14:05:28 meichel ** Implemented library support for redirecting error messages into memory ** instead of printing them to stdout/stderr for GUI applications. ** ** Revision 1.10 2000/02/10 10:50:56 joergr ** Added new feature to dcmdump (enhanced print method of dcmdata): write ** pixel data/item value fields to raw files. ** ** Revision 1.9 1999/03/31 09:25:10 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.8 1998/11/12 16:47:57 meichel ** Implemented operator= for all classes derived from DcmObject. ** ** Revision 1.7 1997/07/21 08:25:17 andreas ** - Replace all boolean types (BOOLEAN, CTNBOOLEAN, DICOM_BOOL, BOOL) ** with one unique boolean type OFBool. ** ** Revision 1.6 1997/04/18 08:13:33 andreas ** - The put/get-methods for all VRs did not conform to the C++-Standard ** draft. Some Compilers (e.g. SUN-C++ Compiler, Metroworks ** CodeWarrier, etc.) create many warnings concerning the hiding of ** overloaded get methods in all derived classes of DcmElement. ** So the interface of all value representation classes in the ** library are changed rapidly, e.g. ** OFCondition get(Uint16 & value, const unsigned long pos); ** becomes ** OFCondition getUint16(Uint16 & value, const unsigned long pos); ** All (retired) "returntype get(...)" methods are deleted. ** For more information see dcmdata/include/dcelem.h ** ** Revision 1.5 1996/08/05 08:45:39 andreas ** new print routine with additional parameters: ** - print into files ** - fix output length for elements ** corrected error in search routine with parameter ESM_fromStackTop ** ** Revision 1.4 1996/01/29 13:38:18 andreas ** - new put method for every VR to put value as a string ** - better and unique print methods ** ** Revision 1.3 1996/01/05 13:23:11 andreas ** - changed to support new streaming facilities ** - more cleanups ** - merged read / write methods for block and file transfer ** */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/dcvrae.h0000644000310500011400000002072211464747623021214 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Gerd Ehlers, Andreas Barth * * Purpose: Interface of class DcmApplicationEntity * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-11-05 09:34:11 $ * CVS/RCS Revision: $Revision: 1.23 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DCVRAE_H #define DCVRAE_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcbytstr.h" /** a class representing the DICOM value representation 'Application Entity' (AE) */ class DcmApplicationEntity : public DcmByteString { public: /** constructor. * Create new element from given tag and length. * @param tag DICOM tag for the new element * @param len value length for the new element */ DcmApplicationEntity(const DcmTag &tag, const Uint32 len = 0); /** copy constructor * @param old element to be copied */ DcmApplicationEntity(const DcmApplicationEntity &old); /** destructor */ virtual ~DcmApplicationEntity(); /** assignment operator * @param obj element to be assigned/copied * @return reference to this object */ DcmApplicationEntity &operator=(const DcmApplicationEntity &obj); /** clone method * @return deep copy of this object */ virtual DcmObject *clone() const { return new DcmApplicationEntity(*this); } /** Virtual object copying. This method can be used for DcmObject * and derived classes to get a deep copy of an object. Internally * the assignment operator is called if the given DcmObject parameter * is of the same type as "this" object instance. If not, an error * is returned. This function permits copying an object by value * in a virtual way which therefore is different to just calling the * assignment operator of DcmElement which could result in slicing * the object. * @param rhs - [in] The instance to copy from. Has to be of the same * class type as "this" object * @return EC_Normal if copying was successful, error otherwise */ virtual OFCondition copyFrom(const DcmObject& rhs); /** get element type identifier * @return type identifier of this class (EVR_AE) */ virtual DcmEVR ident() const; /** check whether stored value conforms to the VR and to the specified VM * @param vm value multiplicity (according to the data dictionary) to be checked for. * (valid values: "1", "1-2", "1-3", "1-8", "1-99", "1-n", "2", "2-n", "2-2n", * "3", "3-n", "3-3n", "4", "6", "9", "16", "32") * @param oldFormat parameter not used for this VR (only for DA, TM, PN) * @return status of the check, EC_Normal if value is correct, an error code otherwise */ virtual OFCondition checkValue(const OFString &vm = "1-n", const OFBool oldFormat = OFFalse); /** get a copy of a particular string component * @param stringVal variable in which the result value is stored * @param pos index of the value in case of multi-valued elements (0..vm-1) * @param normalize delete leading and trailing spaces if OFTrue * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition getOFString(OFString &stringVal, const unsigned long pos, OFBool normalize = OFTrue); /* --- static helper functions --- */ /** check whether given string value conforms to the VR "AE" (Application Entity) * and to the specified VM. * @param value string value to be checked (possibly multi-valued) * @param vm value multiplicity (according to the data dictionary) to be checked for. * (valid values: "1", "1-2", "1-3", "1-8", "1-99", "1-n", "2", "2-n", "2-2n", * "3", "3-n", "3-3n", "4", "6", "9", "16", "32") * @return status of the check, EC_Normal if value is correct, an error code otherwise */ static OFCondition checkStringValue(const OFString &value, const OFString &vm = "1-n"); }; #endif // DCVRAE_H /* ** CVS/RCS Log: ** $Log: dcvrae.h,v $ ** Revision 1.23 2010-11-05 09:34:11 joergr ** Added support for checking the value multiplicity "9" (see Supplement 131). ** ** Revision 1.22 2010-10-14 13:15:42 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.21 2010-04-23 15:26:12 joergr ** Specify an appropriate default value for the "vm" parameter of checkValue(). ** ** Revision 1.20 2010-04-23 14:25:27 joergr ** Added new method to all VR classes which checks whether the stored value ** conforms to the VR definition and to the specified VM. ** ** Revision 1.19 2010-04-22 09:31:30 joergr ** Revised misleading parameter documentation for the checkValue() method. ** ** Revision 1.18 2010-04-22 08:59:10 joergr ** Added support for further VM values ("1-8", "1-99", "16", "32") to be checked. ** ** Revision 1.17 2009-08-03 09:05:29 joergr ** Added methods that check whether a given string value conforms to the VR and ** VM definitions of the DICOM standards. ** ** Revision 1.16 2008-07-17 11:19:49 onken ** Updated copyFrom() documentation. ** ** Revision 1.15 2008-07-17 10:30:23 onken ** Implemented copyFrom() method for complete DcmObject class hierarchy, which ** permits setting an instance's value from an existing object. Implemented ** assignment operator where necessary. ** ** Revision 1.14 2005-12-08 16:28:51 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.13 2004/07/01 12:28:25 meichel ** Introduced virtual clone method for DcmObject and derived classes. ** ** Revision 1.12 2002/12/06 12:49:13 joergr ** Enhanced "print()" function by re-working the implementation and replacing ** the boolean "showFullData" parameter by a more general integer flag. ** Added doc++ documentation. ** Made source code formatting more consistent with other modules/files. ** ** Revision 1.11 2002/04/25 09:50:04 joergr ** Removed getOFStringArray() implementation. ** ** Revision 1.10 2001/09/25 17:19:30 meichel ** Adapted dcmdata to class OFCondition ** ** Revision 1.9 2001/06/01 15:48:47 meichel ** Updated copyright header ** ** Revision 1.8 2000/03/08 16:26:21 meichel ** Updated copyright header. ** ** Revision 1.7 1999/03/31 09:24:55 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.6 1998/11/12 16:47:44 meichel ** Implemented operator= for all classes derived from DcmObject. ** ** Revision 1.5 1997/09/11 15:13:12 hewett ** Modified getOFString method arguments by removing a default value ** for the pos argument. By requiring the pos argument to be provided ** ensures that callers realise getOFString only gets one component of ** a multi-valued string. ** ** Revision 1.4 1997/08/29 08:32:40 andreas ** - Added methods getOFString and getOFStringArray for all ** string VRs. These methods are able to normalise the value, i. e. ** to remove leading and trailing spaces. This will be done only if ** it is described in the standard that these spaces are not relevant. ** These methods do not test the strings for conformance, this means ** especially that they do not delete spaces where they are not allowed! ** getOFStringArray returns the string with all its parts separated by \ ** and getOFString returns only one value of the string. ** CAUTION: Currently getString returns a string with trailing ** spaces removed (if dcmEnableAutomaticInputDataCorrection == OFTrue) and ** truncates the original string (since it is not copied!). If you rely on this ** behaviour please change your application now. ** Future changes will ensure that getString returns the original ** string from the DICOM object (NULL terminated) inclusive padding. ** Currently, if you call getOF... before calling getString without ** normalisation, you can get the original string read from the DICOM object. ** ** Revision 1.3 1996/01/05 13:23:02 andreas ** - changed to support new streaming facilities ** - more cleanups ** - merged read / write methods for block and file transfer ** */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/dcvrsh.h0000644000310500011400000002060111464747623021235 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Gerd Ehlers * * Purpose: Interface of class DcmShortString * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-11-05 09:34:11 $ * CVS/RCS Revision: $Revision: 1.23 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DCVRSH_H #define DCVRSH_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcchrstr.h" /** a class representing the DICOM value representation 'Short String' (SH) */ class DcmShortString : public DcmCharString { public: /** constructor. * Create new element from given tag and length. * @param tag DICOM tag for the new element * @param len value length for the new element */ DcmShortString(const DcmTag &tag, const Uint32 len = 0); /** copy constructor * @param old element to be copied */ DcmShortString(const DcmShortString &old); /** destructor */ virtual ~DcmShortString(); /** assignment operator * @param obj element to be assigned/copied * @return reference to this object */ DcmShortString &operator=(const DcmShortString &obj); /** clone method * @return deep copy of this object */ virtual DcmObject *clone() const { return new DcmShortString(*this); } /** Virtual object copying. This method can be used for DcmObject * and derived classes to get a deep copy of an object. Internally * the assignment operator is called if the given DcmObject parameter * is of the same type as "this" object instance. If not, an error * is returned. This function permits copying an object by value * in a virtual way which therefore is different to just calling the * assignment operator of DcmElement which could result in slicing * the object. * @param rhs - [in] The instance to copy from. Has to be of the same * class type as "this" object * @return EC_Normal if copying was successful, error otherwise */ virtual OFCondition copyFrom(const DcmObject& rhs); /** get element type identifier * @return type identifier of this class (EVR_SH) */ virtual DcmEVR ident() const; /** check whether stored value conforms to the VR and to the specified VM * @param vm value multiplicity (according to the data dictionary) to be checked for. * (valid values: "1", "1-2", "1-3", "1-8", "1-99", "1-n", "2", "2-n", "2-2n", * "3", "3-n", "3-3n", "4", "6", "9", "16", "32") * @param oldFormat parameter not used for this VR (only for DA, TM, PN) * @return status of the check, EC_Normal if value is correct, an error code otherwise */ virtual OFCondition checkValue(const OFString &vm = "1-n", const OFBool oldFormat = OFFalse); /** get a copy of a particular string component * @param stringVal variable in which the result value is stored * @param pos index of the value in case of multi-valued elements (0..vm-1) * @param normalize delete leading and trailing spaces if OFTrue * @return status, EC_Normal if successful, an error code otherwise */ virtual OFCondition getOFString(OFString &stringVal, const unsigned long pos, OFBool normalize = OFTrue); /* --- static helper functions --- */ /** check whether given string value conforms to the VR "SH" (Short String) * and to the specified VM. * @param value string value to be checked (possibly multi-valued) * @param vm value multiplicity (according to the data dictionary) to be checked for. * (valid values: "1", "1-2", "1-3", "1-8", "1-99", "1-n", "2", "2-n", "2-2n", * "3", "3-n", "3-3n", "4", "6", "9", "16", "32") * @return status of the check, EC_Normal if value is correct, an error code otherwise */ static OFCondition checkStringValue(const OFString &value, const OFString &vm = "1-n"); }; #endif // DCVRSH_H /* ** CVS/RCS Log: ** $Log: dcvrsh.h,v $ ** Revision 1.23 2010-11-05 09:34:11 joergr ** Added support for checking the value multiplicity "9" (see Supplement 131). ** ** Revision 1.22 2010-10-14 13:15:43 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.21 2010-04-23 15:26:13 joergr ** Specify an appropriate default value for the "vm" parameter of checkValue(). ** ** Revision 1.20 2010-04-23 14:25:27 joergr ** Added new method to all VR classes which checks whether the stored value ** conforms to the VR definition and to the specified VM. ** ** Revision 1.19 2010-04-22 09:31:30 joergr ** Revised misleading parameter documentation for the checkValue() method. ** ** Revision 1.18 2010-04-22 08:59:10 joergr ** Added support for further VM values ("1-8", "1-99", "16", "32") to be checked. ** ** Revision 1.17 2009-08-03 09:05:30 joergr ** Added methods that check whether a given string value conforms to the VR and ** VM definitions of the DICOM standards. ** ** Revision 1.16 2008-07-17 11:19:49 onken ** Updated copyFrom() documentation. ** ** Revision 1.15 2008-07-17 10:30:23 onken ** Implemented copyFrom() method for complete DcmObject class hierarchy, which ** permits setting an instance's value from an existing object. Implemented ** assignment operator where necessary. ** ** Revision 1.14 2005-12-08 16:29:07 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.13 2004/07/01 12:28:25 meichel ** Introduced virtual clone method for DcmObject and derived classes. ** ** Revision 1.12 2002/12/06 12:49:18 joergr ** Enhanced "print()" function by re-working the implementation and replacing ** the boolean "showFullData" parameter by a more general integer flag. ** Added doc++ documentation. ** Made source code formatting more consistent with other modules/files. ** ** Revision 1.11 2002/04/25 09:56:48 joergr ** Removed getOFStringArray() implementation. ** ** Revision 1.10 2001/09/25 17:19:33 meichel ** Adapted dcmdata to class OFCondition ** ** Revision 1.9 2001/06/01 15:48:52 meichel ** Updated copyright header ** ** Revision 1.8 2000/03/08 16:26:25 meichel ** Updated copyright header. ** ** Revision 1.7 1999/03/31 09:25:05 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.6 1998/11/12 16:47:53 meichel ** Implemented operator= for all classes derived from DcmObject. ** ** Revision 1.5 1997/09/11 15:13:16 hewett ** Modified getOFString method arguments by removing a default value ** for the pos argument. By requiring the pos argument to be provided ** ensures that callers realise getOFString only gets one component of ** a multi-valued string. ** ** Revision 1.4 1997/08/29 08:32:44 andreas ** - Added methods getOFString and getOFStringArray for all ** string VRs. These methods are able to normalise the value, i. e. ** to remove leading and trailing spaces. This will be done only if ** it is described in the standard that these spaces are not relevant. ** These methods do not test the strings for conformance, this means ** especially that they do not delete spaces where they are not allowed! ** getOFStringArray returns the string with all its parts separated by \ ** and getOFString returns only one value of the string. ** CAUTION: Currently getString returns a string with trailing ** spaces removed (if dcmEnableAutomaticInputDataCorrection == OFTrue) and ** truncates the original string (since it is not copied!). If you rely on this ** behaviour please change your application now. ** Future changes will ensure that getString returns the original ** string from the DICOM object (NULL terminated) inclusive padding. ** Currently, if you call getOF... before calling getString without ** normalisation, you can get the original string read from the DICOM object. ** ** Revision 1.3 1996/01/05 13:23:08 andreas ** - changed to support new streaming facilities ** - more cleanups ** - merged read / write methods for block and file transfer ** */ dcmtk-3.6.0/dcmdata/include/dcmtk/dcmdata/dcistrmf.h0000644000310500011400000002331011455601175021546 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Marco Eichelberg * * Purpose: DcmInputFileStream and related classes, * implements streamed input from files. * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:15:41 $ * CVS/RCS Revision: $Revision: 1.9 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DCISTRMF_H #define DCISTRMF_H #include "dcmtk/config/osconfig.h" #include "dcmtk/dcmdata/dcistrma.h" /** producer class that reads data from a plain file. */ class DcmFileProducer: public DcmProducer { public: /** constructor * @param filename name of file to be opened, must not be NULL or empty * @param offset byte offset to skip from the start of file */ DcmFileProducer(const char *filename, offile_off_t offset = 0); /// destructor virtual ~DcmFileProducer(); /** returns the status of the producer. Unless the status is good, * the producer will not permit any operation. * @return status, true if good */ virtual OFBool good() const; /** returns the status of the producer as an OFCondition object. * Unless the status is good, the producer will not permit any operation. * @return status, EC_Normal if good */ virtual OFCondition status() const; /** returns true if the producer is at the end of stream. * @return true if end of stream, false otherwise */ virtual OFBool eos(); /** returns the minimum number of bytes that can be read with the * next call to read(). The DcmObject read methods rely on avail * to return a value > 0 if there is no I/O suspension since certain * data such as tag and length are only read "en bloc", i.e. all * or nothing. * @return minimum of data available in producer */ virtual offile_off_t avail(); /** reads as many bytes as possible into the given block. * @param buf pointer to memory block, must not be NULL * @param buflen length of memory block * @return number of bytes actually read. */ virtual offile_off_t read(void *buf, offile_off_t buflen); /** skips over the given number of bytes (or less) * @param skiplen number of bytes to skip * @return number of bytes actually skipped. */ virtual offile_off_t skip(offile_off_t skiplen); /** resets the stream to the position by the given number of bytes. * @param num number of bytes to putback. If the putback operation * fails, the producer status becomes bad. */ virtual void putback(offile_off_t num); private: /// private unimplemented copy constructor DcmFileProducer(const DcmFileProducer&); /// private unimplemented copy assignment operator DcmFileProducer& operator=(const DcmFileProducer&); /// the file we're actually reading from OFFile file_; /// status OFCondition status_; /// number of bytes in file offile_off_t size_; }; /** input stream factory for plain files */ class DcmInputFileStreamFactory: public DcmInputStreamFactory { public: /** constructor * @param filename name of file to be opened, must not be NULL or empty * @param offset byte offset to skip from the start of file */ DcmInputFileStreamFactory(const char *filename, offile_off_t offset); /// copy constructor DcmInputFileStreamFactory(const DcmInputFileStreamFactory &arg); /// destructor virtual ~DcmInputFileStreamFactory(); /** create a new input stream object * @return pointer to new input stream object */ virtual DcmInputStream *create() const; /** returns a pointer to a copy of this object */ virtual DcmInputStreamFactory *clone() const { return new DcmInputFileStreamFactory(*this); } private: /// private unimplemented copy assignment operator DcmInputFileStreamFactory& operator=(const DcmInputFileStreamFactory&); /// filename OFString filename_; /// offset in file offile_off_t offset_; }; /** input stream that reads from a plain file */ class DcmInputFileStream: public DcmInputStream { public: /** constructor * @param filename name of file to be opened, must not be NULL or empty * @param offset byte offset to skip from the start of file */ DcmInputFileStream(const char *filename, offile_off_t offset = 0); /// destructor virtual ~DcmInputFileStream(); /** creates a new factory object for the current stream * and stream position. When activated, the factory will be * able to create new DcmInputStream delivering the same * data as the current stream. Used to defer loading of * value fields until accessed. * If no factory object can be created (e.g. because the * stream is not seekable), returns NULL. * @return pointer to new factory object if successful, NULL otherwise. */ virtual DcmInputStreamFactory *newFactory() const; private: /// private unimplemented copy constructor DcmInputFileStream(const DcmInputFileStream&); /// private unimplemented copy assignment operator DcmInputFileStream& operator=(const DcmInputFileStream&); /// the final producer of the filter chain DcmFileProducer producer_; /// filename OFString filename_; }; /** class that manages the life cycle of a temporary file. * It maintains a thread-safe reference counter, and when this counter * is decreased to zero, unlinks (deletes) the file and then the handler * object itself. */ class DcmTempFileHandler { public: /** static method that permits creation of instances of * this class (only) on the heap, never on the stack. * A newly created instance always has a reference counter of 1. * @param fname path to temporary file */ static DcmTempFileHandler *newInstance(const char *fname); /** create an input stream that permits reading from the temporary file * @return pointer to input stream. Note that there is no guarantee * that the input stream actually permits reading, i.e. the presence of the * temporary file is not checked. */ DcmInputStream *create() const; /// increase reference counter for this object void increaseRefCount(); /** decreases reference counter for this object and deletes * the temporary file and this object if the reference counter becomes zero. */ void decreaseRefCount(); private: /** private constructor. * Instances of this class are always created through newInstance(). * @param fname path to temporary file */ DcmTempFileHandler(const char *fname); /** private destructor. Instances of this class * are always deleted through the reference counting methods */ virtual ~DcmTempFileHandler(); /// private undefined copy constructor DcmTempFileHandler(const DcmTempFileHandler& arg); /// private undefined copy assignment operator DcmTempFileHandler& operator=(const DcmTempFileHandler& arg); /** number of references to temporary file. * Default initialized to 1 upon construction of this object */ size_t refCount_; #ifdef WITH_THREADS /// mutex for MT-safe reference counting OFMutex mutex_; #endif /// path to temporary file OFString filename_; }; /** input stream factory for temporary file handlers */ class DcmInputTempFileStreamFactory: public DcmInputStreamFactory { public: /** constructor * @param handler pointer to temporary file handler. * Reference counter of temporary file handler is increased by this operation. */ DcmInputTempFileStreamFactory(DcmTempFileHandler *handler); /// copy constructor DcmInputTempFileStreamFactory(const DcmInputTempFileStreamFactory &arg); /// destructor, decreases reference counter of temporary file handler virtual ~DcmInputTempFileStreamFactory(); /** create a new input stream object * @return pointer to new input stream object */ virtual DcmInputStream *create() const; /** returns a pointer to a copy of this object */ virtual DcmInputStreamFactory *clone() const; private: /// private unimplemented copy assignment operator DcmInputTempFileStreamFactory& operator=(const DcmInputTempFileStreamFactory&); /// handler for temporary file DcmTempFileHandler *fileHandler_; }; #endif /* * CVS/RCS Log: * $Log: dcistrmf.h,v $ * Revision 1.9 2010-10-14 13:15:41 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.8 2010-10-04 14:44:39 joergr * Replaced "#ifdef _REENTRANT" by "#ifdef WITH_THREADS" where appropriate (i.e. * in all cases where OFMutex, OFReadWriteLock, etc. are used). * * Revision 1.7 2010-03-01 09:08:44 uli * Removed some unnecessary include directives in the headers. * * Revision 1.6 2009-11-04 09:58:07 uli * Switched to logging mechanism provided by the "new" oflog module * * Revision 1.5 2008-05-29 10:39:43 meichel * Implemented new classes DcmTempFileHandler and DcmInputTempFileStreamFactory * that perform thread-safe reference counted life cycle management of a * temporary file and are needed for DcmElement temporary file extensions to come. * * Revision 1.4 2007/02/19 15:45:41 meichel * Class DcmInputStream and related classes are now safe for use with * large files (2 GBytes or more) if supported by compiler and operating system. * * Revision 1.3 2005/12/08 16:28:17 meichel * Changed include path schema for all DCMTK header files * * Revision 1.2 2002/11/27 12:07:21 meichel * Adapted module dcmdata to use of new header file ofstdinc.h * * Revision 1.1 2002/08/27 16:55:33 meichel * Initial release of new DICOM I/O stream classes that add support for stream * compression (deflated little endian explicit VR transfer syntax) * * */ dcmtk-3.6.0/dcmdata/libsrc/0000755000310500011400000000000011511320675014713 5ustar joergrdicom3dcmtk-3.6.0/dcmdata/libsrc/dcvrfl.cc0000644000310500011400000003450311457616141016514 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Gerd Ehlers, Andreas Barth * * Purpose: Implementation of class DcmFloatingPointSingle * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-20 16:44:17 $ * CVS/RCS Revision: $Revision: 1.36 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/ofstd/ofstream.h" #include "dcmtk/ofstd/ofstd.h" #include "dcmtk/dcmdata/dcvrfl.h" #include "dcmtk/dcmdata/dcvm.h" #define INCLUDE_CSTDIO #define INCLUDE_CSTRING #include "dcmtk/ofstd/ofstdinc.h" // ******************************** DcmFloatingPointSingle::DcmFloatingPointSingle(const DcmTag &tag, const Uint32 len) : DcmElement(tag, len) { } DcmFloatingPointSingle::DcmFloatingPointSingle(const DcmFloatingPointSingle &old) : DcmElement(old) { } DcmFloatingPointSingle::~DcmFloatingPointSingle() { } DcmFloatingPointSingle &DcmFloatingPointSingle::operator=(const DcmFloatingPointSingle &obj) { DcmElement::operator=(obj); return *this; } OFCondition DcmFloatingPointSingle::copyFrom(const DcmObject& rhs) { if (this != &rhs) { if (rhs.ident() != ident()) return EC_IllegalCall; *this = OFstatic_cast(const DcmFloatingPointSingle &, rhs); } return EC_Normal; } // ******************************** DcmEVR DcmFloatingPointSingle::ident() const { return EVR_FL; } OFCondition DcmFloatingPointSingle::checkValue(const OFString &vm, const OFBool /*oldFormat*/) { /* check VM only, further checks on the floating point values could be added later */ return DcmElement::checkVM(getVM(), vm); } unsigned long DcmFloatingPointSingle::getVM() { return getLengthField() / sizeof(Float32); } // ******************************** void DcmFloatingPointSingle::print(STD_NAMESPACE ostream&out, const size_t flags, const int level, const char * /*pixelFileName*/, size_t * /*pixelCounter*/) { if (valueLoaded()) { /* get float data */ Float32 *floatVals; errorFlag = getFloat32Array(floatVals); if (floatVals != NULL) { const unsigned long count = getLengthField() / sizeof(Float32) /* do not use getVM()! */; const unsigned long maxLength = (flags & DCMTypes::PF_shortenLongTagValues) ? DCM_OptPrintLineLength : OFstatic_cast(unsigned long, -1); unsigned long printedLength = 0; unsigned long newLength = 0; char buffer[64]; /* print line start with tag and VR */ printInfoLineStart(out, flags, level); /* print multiple values */ for (unsigned int i = 0; i < count; i++, floatVals++) { /* check whether first value is printed (omit delimiter) */ if (i == 0) OFStandard::ftoa(buffer, sizeof(buffer), *floatVals, 0, 0, 8 /* FLT_DIG + 2 for DICOM FL */); else { buffer[0] = '\\'; OFStandard::ftoa(buffer + 1, sizeof(buffer) - 1, *floatVals, 0, 0, 8 /* FLT_DIG + 2 for DICOM FL */); } /* check whether current value sticks to the length limit */ newLength = printedLength + strlen(buffer); if ((newLength <= maxLength) && ((i + 1 == count) || (newLength + 3 <= maxLength))) { out << buffer; printedLength = newLength; } else { /* check whether output has been truncated */ if (i + 1 < count) { out << "..."; printedLength += 3; } break; } } /* print line end with length, VM and tag name */ printInfoLineEnd(out, flags, printedLength); } else printInfoLine(out, flags, level, "(no value available)" ); } else printInfoLine(out, flags, level, "(not loaded)" ); } // ******************************** OFCondition DcmFloatingPointSingle::getFloat32(Float32 &floatVal, const unsigned long pos) { /* get float data */ Float32 *floatValues = NULL; errorFlag = getFloat32Array(floatValues); /* check data before returning */ if (errorFlag.good()) { if (floatValues == NULL) errorFlag = EC_IllegalCall; else if (pos >= getLengthField() / sizeof(Float32) /* do not use getVM()! */) errorFlag = EC_IllegalParameter; else floatVal = floatValues[pos]; } /* clear value in case of error */ if (errorFlag.bad()) floatVal = 0; return errorFlag; } OFCondition DcmFloatingPointSingle::getFloat32Array(Float32 *&floatVals) { floatVals = OFstatic_cast(Float32 *, getValue()); return errorFlag; } // ******************************** OFCondition DcmFloatingPointSingle::getOFString(OFString &value, const unsigned long pos, OFBool /*normalize*/) { Float32 floatVal; /* get the specified numeric value */ errorFlag = getFloat32(floatVal, pos); if (errorFlag.good()) { /* ... and convert it to a character string */ char buffer[64]; OFStandard::ftoa(buffer, sizeof(buffer), floatVal, 0, 0, 8 /* FLT_DIG + 2 for DICOM FL */); /* assign result */ value = buffer; } return errorFlag; } // ******************************** OFCondition DcmFloatingPointSingle::putFloat32(const Float32 floatVal, const unsigned long pos) { Float32 val = floatVal; errorFlag = changeValue(&val, sizeof(Float32) * pos, sizeof(Float32)); return errorFlag; } OFCondition DcmFloatingPointSingle::putFloat32Array(const Float32 *floatVals, const unsigned long numFloats) { errorFlag = EC_Normal; if (numFloats > 0) { /* check for valid float data */ if (floatVals != NULL) errorFlag = putValue(floatVals, sizeof(Float32) * OFstatic_cast(Uint32, numFloats)); else errorFlag = EC_CorruptedData; } else putValue(NULL, 0); return errorFlag; } // ******************************** OFCondition DcmFloatingPointSingle::putString(const char *stringVal) { errorFlag = EC_Normal; /* check input string */ if ((stringVal != NULL) && (strlen(stringVal) > 0)) { const unsigned long vm = getVMFromString(stringVal); if (vm > 0) { Float32 *field = new Float32[vm]; OFBool success = OFFalse; const char *s = stringVal; char *value; /* retrieve float data from character string */ for (unsigned long i = 0; (i < vm) && errorFlag.good(); i++) { /* get first value stored in 's', set 's' to beginning of the next value */ value = getFirstValueFromString(s); if (value != NULL) { field[i] = OFstatic_cast(Float32, OFStandard::atof(value, &success)); if (!success) errorFlag = EC_CorruptedData; delete[] value; } else errorFlag = EC_CorruptedData; } /* set binary data as the element value */ if (errorFlag.good()) errorFlag = putFloat32Array(field, vm); /* delete temporary buffer */ delete[] field; } else errorFlag = putValue(NULL, 0); } else errorFlag = putValue(NULL, 0); return errorFlag; } // ******************************** OFCondition DcmFloatingPointSingle::verify(const OFBool autocorrect) { /* check for valid value length */ if (getLengthField() % (sizeof(Float32)) != 0) { errorFlag = EC_CorruptedData; if (autocorrect) { /* strip to valid length */ setLengthField(getLengthField() - (getLengthField() % (sizeof(Float32)))); } } else errorFlag = EC_Normal; return errorFlag; } /* ** CVS/RCS Log: ** $Log: dcvrfl.cc,v $ ** Revision 1.36 2010-10-20 16:44:17 joergr ** Use type cast macros (e.g. OFstatic_cast) where appropriate. ** ** Revision 1.35 2010-10-14 13:14:10 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.34 2010-04-23 14:30:34 joergr ** Added new method to all VR classes which checks whether the stored value ** conforms to the VR definition and to the specified VM. ** ** Revision 1.33 2008-07-17 10:31:32 onken ** Implemented copyFrom() method for complete DcmObject class hierarchy, which ** permits setting an instance's value from an existing object. Implemented ** assignment operator where necessary. ** ** Revision 1.32 2008-05-30 12:50:05 meichel ** Increased output precision to 8 (FLT_DIG+2) when converting an FL element to string. ** ** Revision 1.31 2007/06/29 14:17:49 meichel ** Code clean-up: Most member variables in module dcmdata are now private, ** not protected anymore. ** ** Revision 1.30 2006/08/15 15:49:54 meichel ** Updated all code in module dcmdata to correctly compile when ** all standard C++ classes remain in namespace std. ** ** Revision 1.29 2005/12/08 15:41:53 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.28 2004/02/04 16:17:03 joergr ** Adapted type casts to new-style typecast operators defined in ofcast.h. ** Removed acknowledgements with e-mail addresses from CVS log. ** ** Revision 1.27 2002/12/06 13:12:39 joergr ** Enhanced "print()" function by re-working the implementation and replacing ** the boolean "showFullData" parameter by a more general integer flag. ** Made source code formatting more consistent with other modules/files. ** ** Revision 1.26 2002/12/04 10:41:02 meichel ** Changed toolkit to use OFStandard::ftoa instead of sprintf for all ** double to string conversions that are supposed to be locale independent ** ** Revision 1.25 2002/11/27 12:06:57 meichel ** Adapted module dcmdata to use of new header file ofstdinc.h ** ** Revision 1.24 2002/06/26 17:19:34 joergr ** Added type cast to keep MSVC6 quiet. ** ** Revision 1.23 2002/06/20 12:06:18 meichel ** Changed toolkit to use OFStandard::atof instead of atof, strtod or ** sscanf for all string to double conversions that are supposed to ** be locale independent ** ** Revision 1.22 2002/04/25 10:30:02 joergr ** Added getOFString() implementation. ** ** Revision 1.21 2002/04/16 13:43:24 joergr ** Added configurable support for C++ ANSI standard includes (e.g. streams). ** ** Revision 1.20 2001/09/25 17:19:57 meichel ** Adapted dcmdata to class OFCondition ** ** Revision 1.19 2001/06/01 15:49:17 meichel ** Updated copyright header ** ** Revision 1.18 2000/04/14 15:55:08 meichel ** Dcmdata library code now consistently uses ofConsole for error output. ** ** Revision 1.17 2000/03/08 16:26:47 meichel ** Updated copyright header. ** ** Revision 1.16 2000/03/03 14:05:39 meichel ** Implemented library support for redirecting error messages into memory ** instead of printing them to stdout/stderr for GUI applications. ** ** Revision 1.15 2000/02/10 10:52:24 joergr ** Added new feature to dcmdump (enhanced print method of dcmdata): write ** pixel data/item value fields to raw files. ** ** Revision 1.14 2000/02/02 14:32:57 joergr ** Replaced 'delete' statements by 'delete[]' for objects created with 'new[]'. ** ** Revision 1.13 1999/03/31 09:25:52 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.12 1997/07/21 08:25:33 andreas ** - Replace all boolean types (BOOLEAN, CTNBOOLEAN, DICOM_BOOL, BOOL) ** with one unique boolean type OFBool. ** ** Revision 1.11 1997/07/03 15:10:13 andreas ** - removed debugging functions Bdebug() and Edebug() since ** they write a static array and are not very useful at all. ** Cdebug and Vdebug are merged since they have the same semantics. ** The debugging functions in dcmdata changed their interfaces ** (see dcmdata/include/dcdebug.h) ** ** Revision 1.10 1997/04/18 08:10:52 andreas ** - Corrected debugging code ** - The put/get-methods for all VRs did not conform to the C++-Standard ** draft. Some Compilers (e.g. SUN-C++ Compiler, Metroworks ** CodeWarrier, etc.) create many warnings concerning the hiding of ** overloaded get methods in all derived classes of DcmElement. ** So the interface of all value representation classes in the ** library are changed rapidly, e.g. ** OFCondition get(Uint16 & value, const unsigned long pos); ** becomes ** OFCondition getUint16(Uint16 & value, const unsigned long pos); ** All (retired) "returntype get(...)" methods are deleted. ** For more information see dcmdata/include/dcelem.h ** ** Revision 1.9 1996/09/27 08:20:40 hewett ** Added explicit cast: (Float32)0.0 ** ** Revision 1.8 1996/08/05 08:46:20 andreas ** new print routine with additional parameters: ** - print into files ** - fix output length for elements ** corrected error in search routine with parameter ESM_fromStackTop ** ** Revision 1.7 1996/05/20 13:27:51 andreas ** correct minor bug in print routine ** ** Revision 1.6 1996/04/16 16:05:23 andreas ** - better support und bug fixes for NULL element value ** ** Revision 1.5 1996/03/26 09:59:36 meichel ** corrected bug (deletion of const char *) which prevented compilation on NeXT ** ** Revision 1.4 1996/01/29 13:38:32 andreas ** - new put method for every VR to put value as a string ** - better and unique print methods ** ** Revision 1.3 1996/01/05 13:27:49 andreas ** - changed to support new streaming facilities ** - unique read/write methods for file and block transfer ** - more cleanups ** */ dcmtk-3.6.0/dcmdata/libsrc/dcpixel.cc0000644000310500011400000012206611457616140016665 0ustar joergrdicom3/* * * Copyright (C) 1997-2010, 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: dcmdata * * Author: Andreas Barth * * Purpose: class DcmPixelData * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-20 16:44:16 $ * CVS/RCS Revision: $Revision: 1.51 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcpixel.h" #include "dcmtk/dcmdata/dccodec.h" #include "dcmtk/dcmdata/dcpixseq.h" #include "dcmtk/dcmdata/dcdeftag.h" #include "dcmtk/dcmdata/dcitem.h" // // class DcmRepresentationEntry // DcmRepresentationEntry::DcmRepresentationEntry( const E_TransferSyntax rt, const DcmRepresentationParameter *rp, DcmPixelSequence * ps) : repType(rt), repParam(NULL), pixSeq(ps) { if (rp) repParam = rp->clone(); } DcmRepresentationEntry::DcmRepresentationEntry( const DcmRepresentationEntry & oldEntry) : repType(oldEntry.repType), repParam(NULL), pixSeq(NULL) { if (oldEntry.repParam) repParam = oldEntry.repParam->clone(); pixSeq = new DcmPixelSequence(*(oldEntry.pixSeq)); } DcmRepresentationEntry::~DcmRepresentationEntry() { delete repParam; delete pixSeq; } OFBool DcmRepresentationEntry::operator==(const DcmRepresentationEntry & x) const { return (repType == x.repType) && ((x.repParam == NULL && repParam == NULL) || ((x.repParam != NULL) && (repParam != NULL) && (*(x.repParam) == *repParam))); } // // class DcmPixelData // // Constructors / Deconstructors DcmPixelData::DcmPixelData( const DcmTag & tag, const Uint32 len) : DcmPolymorphOBOW(tag, len), repList(), repListEnd(), original(), current(), existUnencapsulated(OFFalse), alwaysUnencapsulated(OFFalse), unencapsulatedVR(EVR_UNKNOWN), pixelSeqForWrite(NULL) { repListEnd = repList.end(); current = original = repListEnd; if (getTag().getEVR() == EVR_ox) setTagVR(EVR_OW); unencapsulatedVR = getTag().getEVR(); recalcVR(); } DcmPixelData::DcmPixelData( const DcmPixelData & oldPixelData) : DcmPolymorphOBOW(oldPixelData), repList(), repListEnd(), original(), current(), existUnencapsulated(oldPixelData.existUnencapsulated), alwaysUnencapsulated(oldPixelData.alwaysUnencapsulated), unencapsulatedVR(oldPixelData.unencapsulatedVR), pixelSeqForWrite(NULL) { repListEnd = repList.end(); original = repListEnd; current = original; recalcVR(); DcmRepresentationListConstIterator oldEnd(oldPixelData.repList.end()); for (DcmRepresentationListConstIterator it(oldPixelData.repList.begin()); it != oldEnd; ++it) { DcmRepresentationEntry * repEnt = new DcmRepresentationEntry(**it); repList.push_back(repEnt); if (it == oldPixelData.original) original = --repList.end(); if (it == oldPixelData.current) { current = --repList.end(); recalcVR(); } } } DcmPixelData::~DcmPixelData() { for (DcmRepresentationListIterator it(repList.begin()); it != repListEnd; ++it) { delete *it; *it = NULL; } } DcmPixelData &DcmPixelData::operator=(const DcmPixelData &obj) { if (this != &obj) { DcmPolymorphOBOW::operator=(obj); existUnencapsulated = obj.existUnencapsulated; alwaysUnencapsulated = obj.alwaysUnencapsulated; unencapsulatedVR = obj.unencapsulatedVR; pixelSeqForWrite = NULL; repList.clear(); repListEnd = repList.end(); original = repListEnd; current = original; recalcVR(); DcmRepresentationListConstIterator oldEnd(obj.repList.end()); DcmRepresentationListConstIterator it(obj.repList.begin()); while (it != oldEnd) { DcmRepresentationEntry *repEnt = new DcmRepresentationEntry(**it); repList.push_back(repEnt); if (it == obj.original) original = --repList.end(); if (it == current) { current = --repList.end(); recalcVR(); } ++it; } } return *this; } OFCondition DcmPixelData::copyFrom(const DcmObject& rhs) { if (this != &rhs) { if (rhs.ident() != ident()) return EC_IllegalCall; *this = OFstatic_cast(const DcmPixelData &, rhs); } return EC_Normal; } // methods in alphabetical order Uint32 DcmPixelData::calcElementLength( const E_TransferSyntax xfer, const E_EncodingType enctype) { DcmXfer xferSyn(xfer); errorFlag = EC_Normal; Uint32 elementLength = 0; if (xferSyn.isEncapsulated() && (! alwaysUnencapsulated)) { DcmRepresentationListIterator found; errorFlag = findConformingEncapsulatedRepresentation(xfer, NULL, found); if (errorFlag == EC_Normal) elementLength = (*found)->pixSeq->calcElementLength(xfer, enctype); } else if (existUnencapsulated) elementLength = DcmPolymorphOBOW::calcElementLength(xfer, enctype); else errorFlag = EC_RepresentationNotFound; return elementLength; } OFBool DcmPixelData::canChooseRepresentation( const E_TransferSyntax repType, const DcmRepresentationParameter * repParam) { OFBool result = OFFalse; DcmXfer toType(repType); const DcmRepresentationEntry findEntry(repType, repParam, NULL); DcmRepresentationListIterator resultIt(repListEnd); if ((!toType.isEncapsulated() && existUnencapsulated) || (toType.isEncapsulated() && alwaysUnencapsulated && existUnencapsulated) || (toType.isEncapsulated() && findRepresentationEntry(findEntry, resultIt) == EC_Normal)) { // representation found result = OFTrue; } else { // representation not found, check if we have a codec that can create the // desired representation. if (original == repListEnd) { result = DcmCodecList::canChangeCoding(EXS_LittleEndianExplicit, toType.getXfer()); } else if (toType.isEncapsulated()) { result = DcmCodecList::canChangeCoding(EXS_LittleEndianExplicit, toType.getXfer()); if (!result) { // direct transcoding is not possible. Check if we can decode and then encode. result = canChooseRepresentation(EXS_LittleEndianExplicit, NULL); if (result) result = DcmCodecList::canChangeCoding(EXS_LittleEndianExplicit, toType.getXfer()); } } else { result = DcmCodecList::canChangeCoding((*original)->repType, EXS_LittleEndianExplicit); } } return result; } OFBool DcmPixelData::canWriteXfer( const E_TransferSyntax newXfer, const E_TransferSyntax /*oldXfer*/) { DcmXfer newXferSyn(newXfer); DcmRepresentationListIterator found; OFBool result = existUnencapsulated && (!newXferSyn.isEncapsulated() || alwaysUnencapsulated); if (!result && newXferSyn.isEncapsulated()) result = (findConformingEncapsulatedRepresentation(newXferSyn, NULL, found) == EC_Normal); return result; } OFCondition DcmPixelData::chooseRepresentation( const E_TransferSyntax repType, const DcmRepresentationParameter * repParam, DcmStack & pixelStack) { OFCondition l_error = EC_CannotChangeRepresentation; DcmXfer toType(repType); const DcmRepresentationEntry findEntry(repType, repParam, NULL); DcmRepresentationListIterator result(repListEnd); if ((!toType.isEncapsulated() && existUnencapsulated) || (toType.isEncapsulated() && existUnencapsulated && alwaysUnencapsulated) || (toType.isEncapsulated() && findRepresentationEntry(findEntry, result) == EC_Normal)) { // representation found current = result; recalcVR(); l_error = EC_Normal; } else { if (original == repListEnd) l_error = encode(EXS_LittleEndianExplicit, NULL, NULL, toType, repParam, pixelStack); else if (toType.isEncapsulated()) l_error = encode((*original)->repType, (*original)->repParam, (*original)->pixSeq, toType, repParam, pixelStack); else l_error = decode((*original)->repType, (*original)->repParam, (*original)->pixSeq, pixelStack); } return l_error; } void DcmPixelData::clearRepresentationList( DcmRepresentationListIterator leaveInList) { /* define iterators to go through all representations in the list */ DcmRepresentationListIterator it(repList.begin()); DcmRepresentationListIterator del; /* as long as we have not encountered the end of the */ /* representation list, go through all representations */ while (it != repListEnd) { /* if this representation shall not be left in the list */ if (it != leaveInList) { /* delete representation and move it to the next representation */ delete *it; del = it++; repList.erase(del); } /* else leave this representation in the list and just go to the next */ else ++it; } } OFCondition DcmPixelData::decode( const DcmXfer & fromType, const DcmRepresentationParameter * fromParam, DcmPixelSequence * fromPixSeq, DcmStack & pixelStack) { if (existUnencapsulated) return EC_Normal; OFCondition l_error = DcmCodecList::decode(fromType, fromParam, fromPixSeq, *this, pixelStack); if (l_error.good()) { existUnencapsulated = OFTrue; current = repListEnd; setVR(EVR_OW); recalcVR(); } else { DcmPolymorphOBOW::putUint16Array(NULL,0); existUnencapsulated = OFFalse; } return l_error; } OFCondition DcmPixelData::encode( const DcmXfer & fromType, const DcmRepresentationParameter * fromParam, DcmPixelSequence * fromPixSeq, const DcmXfer & toType, const DcmRepresentationParameter *toParam, DcmStack & pixelStack) { OFCondition l_error = EC_CannotChangeRepresentation; if (toType.isEncapsulated()) { DcmPixelSequence * toPixSeq = NULL; if (fromType.isEncapsulated()) { l_error = DcmCodecList::encode(fromType.getXfer(), fromParam, fromPixSeq, toType.getXfer(), toParam, toPixSeq, pixelStack); } else { Uint16 * pixelData; l_error = DcmPolymorphOBOW::getUint16Array(pixelData); Uint32 length = DcmPolymorphOBOW::getLength(); if (l_error == EC_Normal) { l_error = DcmCodecList::encode(fromType.getXfer(), pixelData, length, toType.getXfer(), toParam, toPixSeq, pixelStack); } } if (l_error.good()) { current = insertRepresentationEntry( new DcmRepresentationEntry(toType.getXfer(), toParam, toPixSeq)); recalcVR(); } else delete toPixSeq; // if it was possible to convert one encapsulated syntax into // another directly try it using decoding and encoding! if (l_error.bad() && fromType.isEncapsulated()) { l_error = decode(fromType, fromParam, fromPixSeq, pixelStack); if (l_error.good()) l_error = encode(EXS_LittleEndianExplicit, NULL, NULL, toType, toParam, pixelStack); } } return l_error; } OFCondition DcmPixelData::findRepresentationEntry( const DcmRepresentationEntry & findEntry, DcmRepresentationListIterator & result) { result = repList.begin(); while(result != repListEnd && (*result)->repType < findEntry.repType) ++result; DcmRepresentationListIterator it(result); while(it != repListEnd && **it != findEntry) ++it; if (it == repListEnd || **it != findEntry) return EC_RepresentationNotFound; else { result = it; return EC_Normal; } } OFCondition DcmPixelData::findConformingEncapsulatedRepresentation( const DcmXfer & repTypeSyn, const DcmRepresentationParameter * repParam, DcmRepresentationListIterator & result) { E_TransferSyntax repType = repTypeSyn.getXfer(); result = repListEnd; OFCondition l_error = EC_RepresentationNotFound; // we are looking for an encapsulated representation // of this pixel data element which meets both // the transfer syntax and (if given) the representation // parameter (i.e. quality factor for lossy JPEG). if (repTypeSyn.isEncapsulated()) { // first we check the current (active) representation if any. if ((current != repListEnd) && ((*current)->repType == repType) && ((repParam==NULL) || (((*current)->repParam != NULL)&&(*(*current)->repParam == *repParam)))) { result = current; l_error = EC_Normal; } else { // now we check all representations DcmRepresentationListIterator it(repList.begin()); OFBool found = OFFalse; while (!found && (it != repListEnd)) { if ((*it)->repType == repType) { if ((repParam == NULL) || (((*it)->repParam != NULL)&&(*(*it)->repParam == *repParam))) { // repParam is NULL or matches the one we are comparing with found = OFTrue; result = it; l_error = EC_Normal; } else ++it; } else ++it; } } } return l_error; } OFCondition DcmPixelData::getEncapsulatedRepresentation( const E_TransferSyntax repType, const DcmRepresentationParameter * repParam, DcmPixelSequence * & pixSeq) { DcmRepresentationListIterator found; DcmRepresentationEntry findEntry(repType, repParam, NULL); if (findRepresentationEntry(findEntry, found) == EC_Normal) { pixSeq = (*found)->pixSeq; return EC_Normal; } return EC_RepresentationNotFound; } OFBool DcmPixelData::hasRepresentation( const E_TransferSyntax repType, const DcmRepresentationParameter * repParam) { DcmXfer repTypeSyn(repType); DcmRepresentationListIterator found; if (!repTypeSyn.isEncapsulated() && existUnencapsulated) return OFTrue; else if (repTypeSyn.isEncapsulated()) return findConformingEncapsulatedRepresentation(repTypeSyn, repParam, found).good(); return OFFalse; } Uint32 DcmPixelData::getLength(const E_TransferSyntax xfer, const E_EncodingType enctype) { DcmXfer xferSyn(xfer); errorFlag = EC_Normal; Uint32 valueLength = 0; if (xferSyn.isEncapsulated() && !alwaysUnencapsulated) { DcmRepresentationListIterator foundEntry; errorFlag = findConformingEncapsulatedRepresentation( xferSyn, NULL, foundEntry); if (errorFlag == EC_Normal) valueLength = (*foundEntry)->pixSeq->getLength(xfer, enctype); } else if (existUnencapsulated) valueLength = DcmPolymorphOBOW::getLength(xfer, enctype); else errorFlag = EC_RepresentationNotFound; return valueLength; } void DcmPixelData::getCurrentRepresentationKey( E_TransferSyntax & repType, const DcmRepresentationParameter * & repParam) { if (current != repListEnd) { repType = (*current)->repType; repParam = (*current)->repParam; } else { repType = EXS_LittleEndianExplicit; repParam = NULL; } } void DcmPixelData::getOriginalRepresentationKey( E_TransferSyntax & repType, const DcmRepresentationParameter * & repParam) { if (original != repListEnd) { repType = (*original)->repType; repParam = (*original)->repParam; } else { repType = EXS_LittleEndianExplicit; repParam = NULL; } } DcmRepresentationListIterator DcmPixelData::insertRepresentationEntry( DcmRepresentationEntry * repEntry) { DcmRepresentationListIterator insertedEntry; DcmRepresentationListIterator result; if (findRepresentationEntry(*repEntry, result).good()) { // this type of representation entry was already present in the list if (repEntry != *result) { insertedEntry = repList.insert(result, repEntry); // delete old entry from representation list delete *result; repList.erase(result); } } else insertedEntry = repList.insert(result,repEntry); return insertedEntry; } void DcmPixelData::print( STD_NAMESPACE ostream&out, const size_t flags, const int level, const char *pixelFileName, size_t *pixelCounter) { if (current == repListEnd) printPixel(out, flags, level, pixelFileName, pixelCounter); else (*current)->pixSeq->print(out, flags, level, pixelFileName, pixelCounter); } OFCondition DcmPixelData::putUint8Array( const Uint8 * byteValue, const unsigned long length) { // clear RepresentationList clearRepresentationList(repListEnd); OFCondition l_error = DcmPolymorphOBOW::putUint8Array(byteValue, length); original = current = repListEnd; recalcVR(); existUnencapsulated = OFTrue; return l_error; } OFCondition DcmPixelData::putUint16Array( const Uint16 * wordValue, const unsigned long length) { // clear RepresentationList clearRepresentationList(repListEnd); OFCondition l_error = DcmPolymorphOBOW::putUint16Array(wordValue, length); original = current = repListEnd; recalcVR(); existUnencapsulated = OFTrue; return l_error; } OFCondition DcmPixelData::createUint8Array( const Uint32 numBytes, Uint8 * & bytes) { OFCondition l_error = DcmPolymorphOBOW::createUint8Array(numBytes, bytes); existUnencapsulated = OFTrue; return l_error; } OFCondition DcmPixelData::createUint16Array( const Uint32 numWords, Uint16 * & words) { OFCondition l_error = DcmPolymorphOBOW::createUint16Array(numWords, words); existUnencapsulated = OFTrue; return l_error; } OFCondition DcmPixelData::createValueFromTempFile( DcmInputStreamFactory *factory, const Uint32 length, const E_ByteOrder byteOrder) { OFCondition l_error = DcmPolymorphOBOW::createValueFromTempFile(factory, length, byteOrder); existUnencapsulated = OFTrue; return l_error; } void DcmPixelData::putOriginalRepresentation( const E_TransferSyntax repType, const DcmRepresentationParameter * repParam, DcmPixelSequence * pixSeq) { // delete RepresentationList clearRepresentationList(repListEnd); // delete unencapsulated representation DcmPolymorphOBOW::putUint16Array(NULL,0); existUnencapsulated = OFFalse; // insert new Representation current = original = insertRepresentationEntry( new DcmRepresentationEntry(repType, repParam, pixSeq)); recalcVR(); } OFCondition DcmPixelData::read( DcmInputStream & inStream, const E_TransferSyntax ixfer, const E_GrpLenEncoding glenc, const Uint32 maxReadLength) { /* if this element's transfer state shows ERW_notInitialized, this is an illegal call */ if (getTransferState() == ERW_notInitialized) errorFlag = EC_IllegalCall; else { /* if this is not an illegal call, go ahead */ /* if the transfer state is ERW_init, we need to prepare the reading of the pixel */ /* data from the stream: remove all representations from the representation list. */ if (getTransferState() == ERW_init) clearRepresentationList(repListEnd); /* create a DcmXfer object based on the transfer syntax which was passed */ DcmXfer ixferSyn(ixfer); /* determine if the pixel data is captured in native (uncompressed) or encapsulated * (compressed) format. We only derive this information from the length field * which is set to undefined length for encapsulated data because even in * compressed transfer syntaxes the Icon Image Sequence may contain an * uncompressed image. */ if (getLengthField() == DCM_UndefinedLength) { /* the pixel data is captured in encapsulated (compressed) format */ /* if the transfer state is ERW_init, we need to prepare */ /* the reading of the pixel data from the stream. */ if (getTransferState() == ERW_init) { current = insertRepresentationEntry( new DcmRepresentationEntry( ixfer, NULL, new DcmPixelSequence(getTag(), getLengthField()))); recalcVR(); original = current; existUnencapsulated = OFFalse; setTransferState(ERW_inWork); if (! ixferSyn.isEncapsulated()) { /* Special case: we have encountered a compressed image * although we're decoding an uncompressed transfer syntax. * This could be a compressed image stored without meta-header. * For now, we just accept the data element; however, any attempt * to write the dataset will fail because no suitable decoder * is known. */ } } /* conduct the reading process */ errorFlag = (*current)->pixSeq->read(inStream, ixfer, glenc, maxReadLength); /* if the errorFlag equals EC_Normal, all pixel data has been */ /* read; hence, the transfer state has to be set to ERW_ready */ if (errorFlag == EC_Normal) setTransferState(ERW_ready); } else { /* the pixel data is captured in native (uncompressed) format */ /* if the transfer state is ERW_init, we need to prepare */ /* the reading of the pixel data from the stream. */ if (getTransferState() == ERW_init) { current = original = repListEnd; unencapsulatedVR = getTag().getEVR(); recalcVR(); existUnencapsulated = OFTrue; if (ixferSyn.isEncapsulated()) { /* Special case: we have encountered an uncompressed image * although we're decoding an encapsulated transfer syntax. * This is probably an icon image. */ alwaysUnencapsulated = OFTrue; } } /* conduct the reading process */ errorFlag = DcmPolymorphOBOW::read(inStream, ixfer, glenc, maxReadLength); } } /* return result value */ return errorFlag; } void DcmPixelData::removeAllButCurrentRepresentations() { clearRepresentationList(current); if (current != repListEnd && existUnencapsulated) { DcmPolymorphOBOW::putUint16Array(NULL,0); existUnencapsulated = OFFalse; } original = current; } void DcmPixelData::removeAllButOriginalRepresentations() { clearRepresentationList(original); if (original != repListEnd && existUnencapsulated) { DcmPolymorphOBOW::putUint16Array(NULL,0); existUnencapsulated = OFFalse; } current = original; recalcVR(); } OFCondition DcmPixelData::removeOriginalRepresentation( const E_TransferSyntax repType, const DcmRepresentationParameter * repParam) { OFCondition l_error = EC_Normal; DcmXfer repTypeSyn(repType); if (!repTypeSyn.isEncapsulated()) { if (original != repListEnd) { if (current == original) { current = repListEnd; recalcVR(); } repList.erase(original); original = repListEnd; } else l_error = EC_IllegalCall; } else { DcmRepresentationListIterator result; DcmRepresentationEntry findEntry(repType, repParam, NULL); if (findRepresentationEntry(findEntry, result) == EC_Normal) { if (result != original) { if (current == original) { current = result; recalcVR(); } if (original == repListEnd) { DcmPolymorphOBOW::putUint16Array(NULL, 0); existUnencapsulated = OFFalse; } else repList.erase(original); original = result; } else l_error = EC_IllegalCall; } else l_error = EC_RepresentationNotFound; } return l_error; } OFCondition DcmPixelData::removeRepresentation( const E_TransferSyntax repType, const DcmRepresentationParameter * repParam) { OFCondition l_error = EC_Normal; DcmXfer repTypeSyn(repType); if (!repTypeSyn.isEncapsulated()) { if (original != repListEnd && existUnencapsulated) { DcmPolymorphOBOW::putUint16Array(NULL, 0); existUnencapsulated = OFFalse; } else l_error = EC_CannotChangeRepresentation; } else { DcmRepresentationListIterator result; DcmRepresentationEntry findEntry(repType, repParam, NULL); if (findRepresentationEntry(findEntry, result) == EC_Normal) { if (original != result) repList.erase(result); else l_error = EC_CannotChangeRepresentation; } else l_error = EC_RepresentationNotFound; } return l_error; } OFCondition DcmPixelData::setCurrentRepresentationParameter( const DcmRepresentationParameter * repParam) { if (current != repListEnd) { if (repParam == NULL) (*current)->repParam = NULL; else (*current)->repParam = repParam->clone(); return EC_Normal; } return EC_RepresentationNotFound; } OFCondition DcmPixelData::setVR(DcmEVR vr) { unencapsulatedVR = vr; return DcmPolymorphOBOW::setVR(vr); } void DcmPixelData::transferEnd() { DcmPolymorphOBOW::transferEnd(); for (DcmRepresentationListIterator it(repList.begin()); it != repListEnd; ++it) (*it)->pixSeq->transferEnd(); } void DcmPixelData::transferInit() { DcmPolymorphOBOW::transferInit(); for (DcmRepresentationListIterator it(repList.begin()); it != repListEnd; ++it) (*it)->pixSeq->transferInit(); } OFCondition DcmPixelData::write( DcmOutputStream &outStream, const E_TransferSyntax oxfer, const E_EncodingType enctype, DcmWriteCache *wcache) { errorFlag = EC_Normal; if (getTransferState() == ERW_notInitialized) errorFlag = EC_IllegalCall; else { DcmXfer xferSyn(oxfer); if (xferSyn.isEncapsulated() && (! alwaysUnencapsulated)) { if (getTransferState() == ERW_init) { DcmRepresentationListIterator found; errorFlag = findConformingEncapsulatedRepresentation(xferSyn, NULL, found); if (errorFlag == EC_Normal) { current = found; recalcVR(); pixelSeqForWrite = (*found)->pixSeq; setTransferState(ERW_inWork); } } if (errorFlag == EC_Normal && pixelSeqForWrite) errorFlag = pixelSeqForWrite->write(outStream, oxfer, enctype, wcache); if (errorFlag == EC_Normal) setTransferState(ERW_ready); } else if (existUnencapsulated) { current = repListEnd; recalcVR(); errorFlag = DcmPolymorphOBOW::write(outStream, oxfer, enctype, wcache); } else if (getValue() == NULL) { errorFlag = DcmPolymorphOBOW::write(outStream, oxfer, enctype, wcache); } else errorFlag = EC_RepresentationNotFound; } return errorFlag; } OFCondition DcmPixelData::writeXML( STD_NAMESPACE ostream&out, const size_t flags) { if (current == repListEnd) { errorFlag = DcmPolymorphOBOW::writeXML(out, flags); } else { /* pixel sequence (encapsulated data) */ errorFlag = (*current)->pixSeq->writeXML(out, flags); } return errorFlag; } OFCondition DcmPixelData::writeSignatureFormat( DcmOutputStream &outStream, const E_TransferSyntax oxfer, const E_EncodingType enctype, DcmWriteCache *wcache) { errorFlag = EC_Normal; if (getTransferState() == ERW_notInitialized) errorFlag = EC_IllegalCall; else if (getTag().isSignable()) { DcmXfer xferSyn(oxfer); if (xferSyn.isEncapsulated() && (! alwaysUnencapsulated)) { if (getTransferState() == ERW_init) { DcmRepresentationListIterator found; errorFlag = findConformingEncapsulatedRepresentation(xferSyn, NULL, found); if (errorFlag == EC_Normal) { current = found; recalcVR(); pixelSeqForWrite = (*found)->pixSeq; setTransferState(ERW_inWork); } } if (errorFlag == EC_Normal && pixelSeqForWrite) errorFlag = pixelSeqForWrite->writeSignatureFormat(outStream, oxfer, enctype, wcache); if (errorFlag == EC_Normal) setTransferState(ERW_ready); } else if (existUnencapsulated) { current = repListEnd; recalcVR(); errorFlag = DcmPolymorphOBOW::writeSignatureFormat(outStream, oxfer, enctype, wcache); } else if (getValue() == NULL) { errorFlag = DcmPolymorphOBOW::writeSignatureFormat(outStream, oxfer, enctype, wcache); } else errorFlag = EC_RepresentationNotFound; } else errorFlag = EC_Normal; return errorFlag; } OFCondition DcmPixelData::loadAllDataIntoMemory(void) { if (current == repListEnd) return DcmElement::loadAllDataIntoMemory(); else return (*current)->pixSeq->loadAllDataIntoMemory(); } void DcmPixelData::setNonEncapsulationFlag(OFBool flag) { alwaysUnencapsulated = flag; } OFCondition DcmPixelData::getUncompressedFrame( DcmItem *dataset, Uint32 frameNo, Uint32& startFragment, void *buffer, Uint32 bufSize, OFString& decompressedColorModel, DcmFileCache *cache) { if ((dataset == NULL) || (buffer == NULL)) return EC_IllegalCall; Sint32 numberOfFrames = 1; dataset->findAndGetSint32(DCM_NumberOfFrames, numberOfFrames); // don't fail if absent if (numberOfFrames < 1) numberOfFrames = 1; Uint32 frameSize; OFCondition result = getUncompressedFrameSize(dataset, frameSize); if (result.bad()) return result; // determine the minimum buffer size, which may be frame size plus one pad byte if frame size is odd. // We need this extra byte, because the image might be in a different // endianness than our host cpu. In this case the decoder will swap // the data to the host byte order which could overflow the buffer. Uint32 minBufSize = frameSize; if (minBufSize & 1) ++minBufSize; if (bufSize < minBufSize) return EC_IllegalCall; // check frame number if (frameNo >= OFstatic_cast(Uint32, numberOfFrames)) return EC_IllegalCall; if (existUnencapsulated) { // we already have an uncompressed version of the pixel data // either in memory or in file. We can directly access this using // DcmElement::getPartialValue. result = getPartialValue(buffer, frameNo * frameSize, frameSize, cache); if (result.good()) result = dataset->findAndGetOFString(DCM_PhotometricInterpretation, decompressedColorModel); } else { // we only have a compressed version of the pixel data. // Identify a codec for decompressing the frame. result = DcmCodecList::decodeFrame( (*original)->repType, (*original)->repParam, (*original)->pixSeq, dataset, frameNo, startFragment, buffer, bufSize, decompressedColorModel); } return result; } OFCondition DcmPixelData::getDecompressedColorModel( DcmItem *dataset, OFString &decompressedColorModel) { OFCondition result = EC_IllegalCall; if (dataset != NULL) { if (existUnencapsulated) { // we already have an uncompressed version of the pixel data either in memory or in file, // so just retrieve the color model from the given dataset result = dataset->findAndGetOFString(DCM_PhotometricInterpretation, decompressedColorModel); } else { // we only have a compressed version of the pixel data. // Identify a codec for determining the color model. result = DcmCodecList::determineDecompressedColorModel( (*original)->repType, (*original)->repParam, (*original)->pixSeq, dataset, decompressedColorModel); } } return result; } /* ** CVS/RCS Log: ** $Log: dcpixel.cc,v $ ** Revision 1.51 2010-10-20 16:44:16 joergr ** Use type cast macros (e.g. OFstatic_cast) where appropriate. ** ** Revision 1.50 2010-10-14 13:14:08 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.49 2010-07-02 12:34:42 uli ** Added comment explaining why an even buffer size is required. ** ** Revision 1.48 2010-03-01 09:08:45 uli ** Removed some unnecessary include directives in the headers. ** ** Revision 1.47 2009-11-17 16:41:26 joergr ** Added new method that allows for determining the color model of the ** decompressed image. ** ** Revision 1.46 2009-05-11 16:10:14 meichel ** DcmPixelData::getUncompressedFrame() now returns color model also ** for uncompressed images. ** ** Revision 1.45 2009-05-11 16:06:51 meichel ** DcmPixelData::getUncompressedFrame() now works with uncompressed multi-frame ** images with odd frame size. ** ** Revision 1.44 2009-01-30 13:28:14 joergr ** Fixed bug in hasRepresentation() which returned the wrong status in case of ** compressed pixel data. ** ** Revision 1.43 2008-11-03 14:29:45 joergr ** Added method createValueFromTempFile() - overrides method in DcmElement. ** ** Revision 1.42 2008-07-17 10:31:31 onken ** Implemented copyFrom() method for complete DcmObject class hierarchy, which ** permits setting an instance's value from an existing object. Implemented ** assignment operator where necessary. ** ** Revision 1.41 2008-05-29 10:46:16 meichel ** Implemented new method DcmPixelData::getUncompressedFrame ** that permits frame-wise access to compressed and uncompressed ** objects without ever loading the complete object into main memory. ** For this new method to work with compressed images, all classes derived from ** DcmCodec need to implement a new method decodeFrame(). For now, only ** dummy implementations returning an error code have been defined. ** ** Revision 1.40 2007/11/29 14:30:21 meichel ** Write methods now handle large raw data elements (such as pixel data) ** without loading everything into memory. This allows very large images to ** be sent over a network connection, or to be copied without ever being ** fully in memory. ** ** Revision 1.39 2007/06/29 14:17:49 meichel ** Code clean-up: Most member variables in module dcmdata are now private, ** not protected anymore. ** ** Revision 1.38 2006/08/15 15:49:54 meichel ** Updated all code in module dcmdata to correctly compile when ** all standard C++ classes remain in namespace std. ** ** Revision 1.37 2005/12/08 15:41:25 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.36 2005/05/26 09:06:55 meichel ** Renamed isIconImage flag to alwaysUnencapsulated to clarify meaning. ** Added public method DcmPixelData::setNonEncapsulationFlag() that allows ** DcmCodec instances to enable the flag. Improved documentation. ** ** Revision 1.35 2004/07/01 12:28:12 meichel ** Fixed copy constructor for class DcmPixelData which did not work correctly ** under certain circumstances due to an uninitialized attribute. ** ** Revision 1.34 2004/04/07 13:56:08 meichel ** Compressed image datasets containing uncompressed icon images ** are now correctly handled by the parser. ** ** Revision 1.33 2004/01/16 13:49:53 joergr ** Removed acknowledgements with e-mail addresses from CVS log. ** ** Revision 1.32 2003/06/12 18:22:23 joergr ** Modified code to use const_iterators where appropriate (required for STL). ** ** Revision 1.31 2003/06/02 16:55:41 meichel ** Cleaned up implementation of DcmRepresentationEntry, added doc++ comments ** ** Revision 1.30 2003/04/03 14:30:37 joergr ** Fixed bug introduced in the context of the new createUint8/16Array() methods. ** ** Revision 1.29 2003/04/01 12:35:17 joergr ** Added implementation of createUint8/16Array() methods to DcmPixelData. ** Required to work properly with chooseRepresentation() for pixel compression. ** ** Revision 1.28 2003/03/21 13:08:04 meichel ** Minor code purifications for warnings reported by MSVC in Level 4 ** ** Revision 1.27 2002/12/09 09:30:54 wilkens ** Modified/Added doc++ documentation. ** ** Revision 1.26 2002/12/06 13:16:57 joergr ** Enhanced "print()" function by re-working the implementation and replacing ** the boolean "showFullData" parameter by a more general integer flag. ** Made source code formatting more consistent with other modules/files. ** ** Revision 1.25 2002/09/17 13:22:45 meichel ** Fixed two bugs in class DcmPixelData. ** ** Revision 1.24 2002/09/10 15:24:04 meichel ** Fixed two issues in parser. Dcmdata will now correctly parse compressed ** data sets containing uncompressed pixel data (e.g. icon images) and ** uncompressed data sets containing compressed pixel data (e.g. compressed ** file but meta-header missing). Note that write-back of such datasets will ** fail unless appropriate compression codecs are registered. ** ** Revision 1.23 2002/08/27 16:55:54 meichel ** Initial release of new DICOM I/O stream classes that add support for stream ** compression (deflated little endian explicit VR transfer syntax) ** ** Revision 1.22 2002/07/10 11:49:30 meichel ** Fixed memory leak that occured when compression of an image failed in ** a compression codec. ** ** Revision 1.21 2002/04/25 10:19:53 joergr ** Added support for XML output of DICOM objects. ** ** Revision 1.20 2001/11/08 16:19:42 meichel ** Changed interface for codec registration. Now everything is thread-safe ** and multiple codecs can be registered for a single transfer syntax (e.g. ** one encoder and one decoder). ** ** Revision 1.19 2001/11/01 14:55:42 wilkens ** Added lots of comments. ** ** Revision 1.18 2001/09/25 17:18:36 meichel ** Updated abstract class DcmRepresentationParameter for use with dcmjpeg ** ** Revision 1.17 2001/06/01 15:49:07 meichel ** Updated copyright header ** ** Revision 1.16 2001/05/25 09:53:54 meichel ** Modified DcmCodec::decode() interface, required for future dcmjpeg module. ** ** Revision 1.15 2000/11/07 16:56:21 meichel ** Initial release of dcmsign module for DICOM Digital Signatures ** ** Revision 1.14 2000/09/27 08:19:58 meichel ** Minor changes in DcmCodec interface, required for future dcmjpeg module. ** ** Revision 1.13 2000/04/14 16:09:16 meichel ** Made function DcmCodec and related functions thread safe. ** registerGlobalCodec() should not be called anymore from the constructor ** of global objects. ** ** Revision 1.12 2000/03/08 16:26:39 meichel ** Updated copyright header. ** ** Revision 1.11 2000/02/10 16:04:07 joergr ** Fixed bug producing an error message when trying to create an empty ** PixelData element. ** ** Revision 1.10 2000/02/10 10:52:21 joergr ** Added new feature to dcmdump (enhanced print method of dcmdata): write ** pixel data/item value fields to raw files. ** ** Revision 1.9 2000/02/03 16:30:19 joergr ** Fixed bug: encapsulated data (pixel items) have never been loaded using ** method 'loadAllDataIntoMemory'. Therefore, encapsulated pixel data was ** never printed with 'dcmdump'. ** ** Revision 1.8 1999/04/21 15:48:15 meichel ** Fixed bug in DcmPixelData::findConformingEncapsulatedRepresentation ** leading to an assertion failure when working with compressed data. ** ** Revision 1.7 1999/03/31 09:25:35 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.6 1998/11/12 16:48:17 meichel ** Implemented operator= for all classes derived from DcmObject. ** ** Revision 1.5 1998/07/15 15:52:04 joergr ** Removed several compiler warnings reported by gcc 2.8.1 with ** additional options, e.g. missing copy constructors and assignment ** operators, initialization of member variables in the body of a ** constructor instead of the member initialization list, hiding of ** methods by use of identical names, uninitialized member variables, ** missing const declaration of char pointers. Replaced tabs by spaces. ** ** Revision 1.4 1997/09/18 08:10:55 meichel ** Many minor type conflicts (e.g. long passed as int) solved. ** ** Revision 1.3 1997/07/31 06:59:35 andreas ** Added initialization of error code in ** DcmPixelData::removeOriginalRepresentation() ** ** Revision 1.2 1997/07/24 13:08:28 andreas ** - Removed const for method DcmRepresentationParameter::copy ** ** Revision 1.1 1997/07/21 07:55:05 andreas ** - New environment for encapsulated pixel representations. DcmPixelData ** can contain different representations and uses codecs to convert ** between them. Codecs are derived from the DcmCodec class. New error ** codes are introduced for handling of representations. New internal ** value representation (only for ident()) for PixelData ** */ dcmtk-3.6.0/dcmdata/libsrc/dcvrcs.cc0000644000310500011400000001712711457616141016523 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Gerd Ehlers, Andreas Barth * * Purpose: class DcmCodeString * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-20 16:44:17 $ * CVS/RCS Revision: $Revision: 1.24 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #define INCLUDE_CCTYPE #include "dcmtk/ofstd/ofstdinc.h" #include "dcmtk/dcmdata/dcvrcs.h" #define MAX_CS_LENGTH 16 // ******************************** DcmCodeString::DcmCodeString(const DcmTag &tag, const Uint32 len) : DcmByteString(tag, len) { setMaxLength(MAX_CS_LENGTH); setNonSignificantChars(" \\"); } DcmCodeString::DcmCodeString(const DcmCodeString &old) : DcmByteString(old) { } DcmCodeString::~DcmCodeString() { } DcmCodeString &DcmCodeString::operator=(const DcmCodeString &obj) { DcmByteString::operator=(obj); return *this; } OFCondition DcmCodeString::copyFrom(const DcmObject& rhs) { if (this != &rhs) { if (rhs.ident() != ident()) return EC_IllegalCall; *this = OFstatic_cast(const DcmCodeString &, rhs); } return EC_Normal; } // ******************************** DcmEVR DcmCodeString::ident() const { return EVR_CS; } OFCondition DcmCodeString::checkValue(const OFString &vm, const OFBool /*oldFormat*/) { OFString strVal; /* get "raw value" without any modifications (if possible) */ OFCondition l_error = getStringValue(strVal); if (l_error.good()) l_error = DcmCodeString::checkStringValue(strVal, vm); return l_error; } // ******************************** OFCondition DcmCodeString::getOFString(OFString &stringVal, const unsigned long pos, OFBool normalize) { OFCondition l_error = DcmByteString::getOFString(stringVal, pos, normalize); if (l_error.good() && normalize) normalizeString(stringVal, !MULTIPART, DELETE_LEADING, DELETE_TRAILING); return l_error; } // ******************************** OFBool DcmCodeString::checkVR(const OFString &value, size_t *pos, const OFBool checkLength) { unsigned char c; size_t i; const size_t length = value.length(); const size_t maxlen = (length < MAX_CS_LENGTH) || (!checkLength) ? length : MAX_CS_LENGTH; /* iterate over all characters (up to the maximum) */ for (i = 0; i < maxlen; i++) { c = value.at(i); /* check for valid CS character: A-Z, 0-9, _ and ' ' (space) */ if ((c != ' ') && (c != '_') && !isdigit(c) && !(isalpha(c) && isupper(c))) break; } /* return position of first invalid character (eos if all valid) */ if (pos != NULL) *pos = i; /* OFFalse in case of any invalid character */ return (i == length); } // ******************************** OFCondition DcmCodeString::checkStringValue(const OFString &value, const OFString &vm) { return DcmByteString::checkStringValue(value, vm, "cs", 10, MAX_CS_LENGTH); } /* ** CVS/RCS Log: ** $Log: dcvrcs.cc,v $ ** Revision 1.24 2010-10-20 16:44:17 joergr ** Use type cast macros (e.g. OFstatic_cast) where appropriate. ** ** Revision 1.23 2010-10-20 07:41:35 uli ** Made sure isalpha() & friends are only called with valid arguments. ** ** Revision 1.22 2010-10-14 13:14:10 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.21 2010-04-23 14:30:34 joergr ** Added new method to all VR classes which checks whether the stored value ** conforms to the VR definition and to the specified VM. ** ** Revision 1.20 2009-11-04 09:58:10 uli ** Switched to logging mechanism provided by the "new" oflog module ** ** Revision 1.19 2009-08-07 14:35:49 joergr ** Enhanced isEmpty() method by checking whether the data element value consists ** of non-significant characters only. ** ** Revision 1.18 2009-08-03 09:02:59 joergr ** Added methods that check whether a given string value conforms to the VR and ** VM definitions of the DICOM standards. ** ** Revision 1.17 2008-07-17 10:31:32 onken ** Implemented copyFrom() method for complete DcmObject class hierarchy, which ** permits setting an instance's value from an existing object. Implemented ** assignment operator where necessary. ** ** Revision 1.16 2007-06-29 14:17:49 meichel ** Code clean-up: Most member variables in module dcmdata are now private, ** not protected anymore. ** ** Revision 1.15 2005/12/08 15:41:48 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.14 2003/06/12 15:07:13 joergr ** Added static function checkVR(). ** ** Revision 1.13 2002/12/06 13:20:49 joergr ** Enhanced "print()" function by re-working the implementation and replacing ** the boolean "showFullData" parameter by a more general integer flag. ** Made source code formatting more consistent with other modules/files. ** ** Revision 1.12 2002/04/25 10:28:07 joergr ** Removed getOFStringArray() implementation. ** ** Revision 1.11 2001/09/25 17:19:55 meichel ** Adapted dcmdata to class OFCondition ** ** Revision 1.10 2001/06/01 15:49:15 meichel ** Updated copyright header ** ** Revision 1.9 2000/03/08 16:26:45 meichel ** Updated copyright header. ** ** Revision 1.8 1999/03/31 09:25:48 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.7 1998/11/12 16:48:22 meichel ** Implemented operator= for all classes derived from DcmObject. ** ** Revision 1.6 1997/08/29 13:11:44 andreas ** Corrected Bug in getOFStringArray Implementation ** ** Revision 1.5 1997/08/29 08:32:56 andreas ** - Added methods getOFString and getOFStringArray for all ** string VRs. These methods are able to normalise the value, i. e. ** to remove leading and trailing spaces. This will be done only if ** it is described in the standard that these spaces are not relevant. ** These methods do not test the strings for conformance, this means ** especially that they do not delete spaces where they are not allowed! ** getOFStringArray returns the string with all its parts separated by \ ** and getOFString returns only one value of the string. ** CAUTION: Currently getString returns a string with trailing ** spaces removed (if dcmEnableAutomaticInputDataCorrection == OFTrue) and ** truncates the original string (since it is not copied!). If you rely on this ** behaviour please change your application now. ** Future changes will ensure that getString returns the original ** string from the DICOM object (NULL terminated) inclusive padding. ** Currently, if you call getOF... before calling getString without ** normalisation, you can get the original string read from the DICOM object. ** ** Revision 1.4 1997/07/03 15:10:09 andreas ** - removed debugging functions Bdebug() and Edebug() since ** they write a static array and are not very useful at all. ** Cdebug and Vdebug are merged since they have the same semantics. ** The debugging functions in dcmdata changed their interfaces ** (see dcmdata/include/dcdebug.h) ** ** Revision 1.3 1996/01/05 13:27:46 andreas ** - changed to support new streaming facilities ** - unique read/write methods for file and block transfer ** - more cleanups ** */ dcmtk-3.6.0/dcmdata/libsrc/dcvrpobw.cc0000644000310500011400000002661311457616141017065 0ustar joergrdicom3/* * * Copyright (C) 1997-2010, 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: dcmdata * * Author: Andreas Barth * * Purpose: * class DcmPolymorphOBOW for Tags that can change their VR * between OB and OW (e.g. Tag PixelData, OverlayData). This class shall * not be used directly in applications. No identification exists. * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-20 16:44:17 $ * CVS/RCS Revision: $Revision: 1.23 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcvrpobw.h" DcmPolymorphOBOW::DcmPolymorphOBOW( const DcmTag & tag, const Uint32 len) : DcmOtherByteOtherWord(tag, len), changeVR(OFFalse), currentVR(EVR_OW) { if (getTag().getEVR() == EVR_ox || getTag().getEVR() == EVR_lt) setTagVR(EVR_OW); } DcmPolymorphOBOW::DcmPolymorphOBOW(const DcmPolymorphOBOW & oldObj) : DcmOtherByteOtherWord(oldObj) , changeVR(oldObj.changeVR) , currentVR(oldObj.currentVR) { } DcmPolymorphOBOW::~DcmPolymorphOBOW() { } DcmPolymorphOBOW &DcmPolymorphOBOW::operator=(const DcmPolymorphOBOW & obj) { if (this != &obj) { DcmOtherByteOtherWord::operator=(obj); changeVR = obj.changeVR; currentVR = obj.currentVR; } return *this; } OFCondition DcmPolymorphOBOW::copyFrom(const DcmObject& rhs) { if (this != &rhs) { if (rhs.ident() != ident()) return EC_IllegalCall; *this = OFstatic_cast(const DcmPolymorphOBOW &, rhs); } return EC_Normal; } OFCondition DcmPolymorphOBOW::getUint8Array( Uint8 * & bytes) { errorFlag = EC_Normal; OFBool bchangeVR = OFFalse; if (currentVR == EVR_OW) { if (getByteOrder() == EBO_BigEndian) { swapValueField(sizeof(Uint16)); setByteOrder(EBO_LittleEndian); } if (getTag().getEVR() == EVR_OW) { bchangeVR = OFTrue; setTagVR(EVR_OB); currentVR = EVR_OB; } } bytes = OFstatic_cast(Uint8 *, this -> getValue()); if (bchangeVR) setTagVR(EVR_OW); return errorFlag; } OFCondition DcmPolymorphOBOW::getUint16Array( Uint16 * & words) { errorFlag = EC_Normal; OFBool bchangeVR = OFFalse; if (currentVR == EVR_OB) { setByteOrder(EBO_LittleEndian); currentVR = EVR_OW; if (getTag().getEVR() == EVR_OB) { setTagVR(EVR_OW); bchangeVR = OFTrue; } } words = OFstatic_cast(Uint16 *, this -> getValue()); if (bchangeVR) setTagVR(EVR_OB); return errorFlag; } OFCondition DcmPolymorphOBOW::createUint8Array( const Uint32 numBytes, Uint8 * & bytes) { currentVR = EVR_OB; setTagVR(EVR_OB); errorFlag = createEmptyValue(sizeof(Uint8) * Uint32(numBytes)); setByteOrder(gLocalByteOrder); if (EC_Normal == errorFlag) bytes = OFstatic_cast(Uint8 *, this->getValue()); else bytes = NULL; return errorFlag; } OFCondition DcmPolymorphOBOW::createUint16Array( const Uint32 numWords, Uint16 * & words) { currentVR = EVR_OW; setTagVR(EVR_OW); errorFlag = createEmptyValue(sizeof(Uint16) * Uint32(numWords)); setByteOrder(gLocalByteOrder); if (EC_Normal == errorFlag) words = OFstatic_cast(Uint16 *, this->getValue()); else words = NULL; return errorFlag; } OFCondition DcmPolymorphOBOW::putUint8Array( const Uint8 * byteValue, const unsigned long numBytes) { errorFlag = EC_Normal; currentVR = getTag().getEVR(); if (numBytes) { if (byteValue) { errorFlag = putValue(byteValue, sizeof(Uint8)*Uint32(numBytes)); if (errorFlag == EC_Normal) { if (getTag().getEVR() == EVR_OW && getByteOrder() == EBO_BigEndian) setByteOrder(EBO_LittleEndian); this -> alignValue(); } } else errorFlag = EC_CorruptedData; } else this -> putValue(NULL, 0); return errorFlag; } OFCondition DcmPolymorphOBOW::putUint16Array( const Uint16 * wordValue, const unsigned long numWords) { errorFlag = EC_Normal; currentVR = getTag().getEVR(); if (numWords) { if (wordValue) { errorFlag = putValue(wordValue, sizeof(Uint16)*Uint32(numWords)); if (errorFlag == EC_Normal && getTag().getEVR() == EVR_OB && getByteOrder() == EBO_BigEndian) { swapValueField(sizeof(Uint16)); setByteOrder(EBO_LittleEndian); } } else errorFlag = EC_CorruptedData; } else errorFlag = this -> putValue(NULL, 0); return errorFlag; } OFCondition DcmPolymorphOBOW::read( DcmInputStream & inStream, const E_TransferSyntax ixfer, const E_GrpLenEncoding glenc, const Uint32 maxReadLength) { OFCondition l_error = DcmOtherByteOtherWord::read(inStream, ixfer, glenc, maxReadLength); if (getTransferState() == ERW_ready) currentVR = getTag().getEVR(); return l_error; } void DcmPolymorphOBOW::transferEnd() { changeVR = OFFalse; DcmOtherByteOtherWord::transferEnd(); } void DcmPolymorphOBOW::transferInit() { changeVR = OFFalse; DcmOtherByteOtherWord::transferInit(); } OFCondition DcmPolymorphOBOW::write( DcmOutputStream &outStream, const E_TransferSyntax oxfer, const E_EncodingType enctype, DcmWriteCache *wcache) { DcmXfer oXferSyn(oxfer); if (getTransferState() == ERW_init) { if (getTag().getEVR() == EVR_OB && oXferSyn.isImplicitVR() && getByteOrder() == EBO_BigEndian) { // VR is OB and it will be written as OW in LittleEndianImplicit. setTagVR(EVR_OW); if (currentVR == EVR_OB) setByteOrder(EBO_LittleEndian); currentVR = EVR_OB; changeVR = OFTrue; } else if (getTag().getEVR() == EVR_OW && currentVR == EVR_OB) { setByteOrder(EBO_LittleEndian); currentVR = EVR_OW; } } errorFlag = DcmOtherByteOtherWord::write(outStream, oxfer, enctype, wcache); if (getTransferState() == ERW_ready && changeVR) { // VR must be OB again. No Swapping is needed since the written // transfer syntax was LittleEndianImplicit and so no swapping // took place. setTagVR(EVR_OB); } return errorFlag; } OFCondition DcmPolymorphOBOW::writeSignatureFormat( DcmOutputStream &outStream, const E_TransferSyntax oxfer, const E_EncodingType enctype, DcmWriteCache *wcache) { DcmXfer oXferSyn(oxfer); if (getTransferState() == ERW_init) { if (getTag().getEVR() == EVR_OB && oXferSyn.isImplicitVR() && getByteOrder() == EBO_BigEndian) { // VR is OB and it will be written as OW in LittleEndianImplicit. setTagVR(EVR_OW); if (currentVR == EVR_OB) setByteOrder(EBO_LittleEndian); currentVR = EVR_OB; changeVR = OFTrue; } else if (getTag().getEVR() == EVR_OW && currentVR == EVR_OB) { setByteOrder(EBO_LittleEndian); currentVR = EVR_OW; } } errorFlag = DcmOtherByteOtherWord::writeSignatureFormat(outStream, oxfer, enctype, wcache); if (getTransferState() == ERW_ready && changeVR) { // VR must be OB again. No Swapping is needed since the written // transfer syntax was LittleEndianImplicit and so no swapping // took place. setTagVR(EVR_OB); } return errorFlag; } /* ** CVS/RCS Log: ** $Log: dcvrpobw.cc,v $ ** Revision 1.23 2010-10-20 16:44:17 joergr ** Use type cast macros (e.g. OFstatic_cast) where appropriate. ** ** Revision 1.22 2010-10-14 13:14:10 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.21 2008-07-17 10:31:32 onken ** Implemented copyFrom() method for complete DcmObject class hierarchy, which ** permits setting an instance's value from an existing object. Implemented ** assignment operator where necessary. ** ** Revision 1.20 2007-11-29 14:30:21 meichel ** Write methods now handle large raw data elements (such as pixel data) ** without loading everything into memory. This allows very large images to ** be sent over a network connection, or to be copied without ever being ** fully in memory. ** ** Revision 1.19 2007/11/23 15:42:36 meichel ** Copy assignment operators in dcmdata now safe for self assignment ** ** Revision 1.18 2007/06/29 14:17:49 meichel ** Code clean-up: Most member variables in module dcmdata are now private, ** not protected anymore. ** ** Revision 1.17 2005/12/08 15:42:00 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.16 2005/11/15 16:59:25 meichel ** Added new pseudo VR type EVR_lt that is used for LUT Data when read in ** implicit VR, which may be US, SS or OW. DCMTK always treats EVR_lt like OW. ** ** Revision 1.15 2004/02/04 16:08:14 joergr ** Adapted type casts to new-style typecast operators defined in ofcast.h. ** ** Revision 1.14 2002/09/12 14:08:28 joergr ** Added method "createUint8Array" which works similar to the 16 bit variant. ** ** Revision 1.13 2002/08/27 16:56:00 meichel ** Initial release of new DICOM I/O stream classes that add support for stream ** compression (deflated little endian explicit VR transfer syntax) ** ** Revision 1.12 2001/09/25 17:19:59 meichel ** Adapted dcmdata to class OFCondition ** ** Revision 1.11 2001/06/01 15:49:19 meichel ** Updated copyright header ** ** Revision 1.10 2001/05/10 12:52:58 meichel ** Added public createUint16Array() method in class DcmPolymorphOBOW. ** ** Revision 1.9 2000/11/07 16:56:25 meichel ** Initial release of dcmsign module for DICOM Digital Signatures ** ** Revision 1.8 2000/03/08 16:26:49 meichel ** Updated copyright header. ** ** Revision 1.7 1999/03/31 09:25:56 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.6 1998/11/12 17:12:35 meichel ** fixed incorrect return value in DcmPolymorphOBOW::operator=(). ** ** Revision 1.5 1998/11/12 16:48:28 meichel ** Implemented operator= for all classes derived from DcmObject. ** ** Revision 1.4 1998/07/15 15:52:11 joergr ** Removed several compiler warnings reported by gcc 2.8.1 with ** additional options, e.g. missing copy constructors and assignment ** operators, initialization of member variables in the body of a ** constructor instead of the member initialization list, hiding of ** methods by use of identical names, uninitialized member variables, ** missing const declaration of char pointers. Replaced tabs by spaces. ** ** Revision 1.3 1997/09/18 07:28:11 meichel ** Name clash for "changeVR" attribute/local variable removed. ** ** Revision 1.2 1997/07/31 06:59:03 andreas ** Error correction and additonal functionality for ** DcmPolymorphOBOW to support getting and putting of Uint8 and ** Uint16 data independent of the VR. ** ** Revision 1.1 1997/07/21 07:54:06 andreas ** - Support for CP 14. PixelData and OverlayData can have VR OW or OB ** (depending on the transfer syntax). New internal value ** representation (only for ident()) for OverlayData. ** */ dcmtk-3.6.0/dcmdata/libsrc/dcvrul.cc0000644000310500011400000003225311457616142016534 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Gerd Ehlers, Andreas Barth * * Purpose: Implementation of class DcmUnsignedLong * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-20 16:44:18 $ * CVS/RCS Revision: $Revision: 1.33 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" #include "dcmtk/ofstd/ofstream.h" #include "dcmtk/dcmdata/dcvrul.h" #include "dcmtk/dcmdata/dcvm.h" #define INCLUDE_CSTDIO #define INCLUDE_CSTRING #include "dcmtk/ofstd/ofstdinc.h" // ******************************** DcmUnsignedLong::DcmUnsignedLong(const DcmTag &tag, const Uint32 len) : DcmElement(tag, len) { } DcmUnsignedLong::DcmUnsignedLong(const DcmUnsignedLong &old) : DcmElement(old) { } DcmUnsignedLong::~DcmUnsignedLong() { } DcmUnsignedLong &DcmUnsignedLong::operator=(const DcmUnsignedLong &obj) { DcmElement::operator=(obj); return *this; } OFCondition DcmUnsignedLong::copyFrom(const DcmObject& rhs) { if (this != &rhs) { if (rhs.ident() != ident()) return EC_IllegalCall; *this = OFstatic_cast(const DcmUnsignedLong &, rhs); } return EC_Normal; } // ******************************** DcmEVR DcmUnsignedLong::ident() const { return EVR_UL; } OFCondition DcmUnsignedLong::checkValue(const OFString &vm, const OFBool /*oldFormat*/) { /* check VM only */ return DcmElement::checkVM(getVM(), vm); } unsigned long DcmUnsignedLong::getVM() { return getLengthField() / sizeof(Uint32); } // ******************************** void DcmUnsignedLong::print(STD_NAMESPACE ostream&out, const size_t flags, const int level, const char * /*pixelFileName*/, size_t * /*pixelCounter*/) { if (valueLoaded()) { /* get unsigned integer data */ Uint32 *uintVals; errorFlag = getUint32Array(uintVals); if (uintVals != NULL) { const unsigned long count = getVM(); const unsigned long maxLength = (flags & DCMTypes::PF_shortenLongTagValues) ? DCM_OptPrintLineLength : OFstatic_cast(unsigned long, -1) /*unlimited*/; unsigned long printedLength = 0; unsigned long newLength = 0; char buffer[32]; /* print line start with tag and VR */ printInfoLineStart(out, flags, level); /* print multiple values */ for (unsigned int i = 0; i < count; i++, uintVals++) { /* check whether first value is printed (omit delimiter) */ if (i == 0) #if SIZEOF_LONG == 8 sprintf(buffer, "%u", *uintVals); else sprintf(buffer, "\\%u", *uintVals); #else sprintf(buffer, "%lu", *uintVals); else sprintf(buffer, "\\%lu", *uintVals); #endif /* check whether current value sticks to the length limit */ newLength = printedLength + strlen(buffer); if ((newLength <= maxLength) && ((i + 1 == count) || (newLength + 3 <= maxLength))) { out << buffer; printedLength = newLength; } else { /* check whether output has been truncated */ if (i + 1 < count) { out << "..."; printedLength += 3; } break; } } /* print line end with length, VM and tag name */ printInfoLineEnd(out, flags, printedLength); } else printInfoLine(out, flags, level, "(no value available)"); } else printInfoLine(out, flags, level, "(not loaded)"); } // ******************************** OFCondition DcmUnsignedLong::getUint32(Uint32 &uintVal, const unsigned long pos) { /* get unsigned integer data */ Uint32 *uintValues = NULL; errorFlag = getUint32Array(uintValues); /* check data before returning */ if (errorFlag.good()) { if (uintValues == NULL) errorFlag = EC_IllegalCall; else if (pos >= getVM()) errorFlag = EC_IllegalParameter; else uintVal = uintValues[pos]; } /* clear value in case of error */ if (errorFlag.bad()) uintVal = 0; return errorFlag; } OFCondition DcmUnsignedLong::getUint32Array(Uint32 *&uintVals) { uintVals = OFstatic_cast(Uint32 *, getValue()); return errorFlag; } // ******************************** OFCondition DcmUnsignedLong::getOFString(OFString &stringVal, const unsigned long pos, OFBool /*normalize*/) { Uint32 uintVal; /* get the specified numeric value */ errorFlag = getUint32(uintVal, pos); if (errorFlag.good()) { /* ... and convert it to a character string */ char buffer[32]; sprintf(buffer, "%lu", OFstatic_cast(unsigned long, uintVal)); /* assign result */ stringVal = buffer; } return errorFlag; } // ******************************** OFCondition DcmUnsignedLong::putUint32(const Uint32 uintVal, const unsigned long pos) { Uint32 val = uintVal; errorFlag = changeValue(&val, sizeof(Uint32) * pos, sizeof(Uint32)); return errorFlag; } OFCondition DcmUnsignedLong::putUint32Array(const Uint32 *uintVals, const unsigned long numUints) { errorFlag = EC_Normal; if (numUints > 0) { /* check for valid data */ if (uintVals != NULL) errorFlag = putValue(uintVals, sizeof(Uint32) * OFstatic_cast(Uint32, numUints)); else errorFlag = EC_CorruptedData; } else errorFlag = putValue(NULL, 0); return errorFlag; } // ******************************** OFCondition DcmUnsignedLong::putString(const char *stringVal) { errorFlag = EC_Normal; /* check input string */ if ((stringVal != NULL) && (strlen(stringVal) > 0)) { const unsigned long vm = getVMFromString(stringVal); if (vm > 0) { Uint32 *field = new Uint32[vm]; const char *s = stringVal; char *value; /* retrieve unsigned integer data from character string */ for (unsigned long i = 0; (i < vm) && errorFlag.good(); i++) { /* get first value stored in 's', set 's' to beginning of the next value */ value = getFirstValueFromString(s); if ((value == NULL) || #if SIZEOF_LONG == 8 (sscanf(value, "%u", &field[i]) != 1) #else (sscanf(value, "%lu", &field[i]) != 1) #endif ) { errorFlag = EC_CorruptedData; } delete[] value; } /* set binary data as the element value */ if (errorFlag.good()) errorFlag = putUint32Array(field, vm); /* delete temporary buffer */ delete[] field; } else errorFlag = putValue(NULL, 0); } else errorFlag = putValue(NULL, 0); return errorFlag; } // ******************************** OFCondition DcmUnsignedLong::verify(const OFBool autocorrect) { /* check for valid value length */ if (getLengthField() % (sizeof(Uint32)) != 0) { errorFlag = EC_CorruptedData; if (autocorrect) { /* strip to valid length */ setLengthField(getLengthField() - (getLengthField() % (sizeof(Uint32)))); } } else errorFlag = EC_Normal; return errorFlag; } /* ** CVS/RCS Log: ** $Log: dcvrul.cc,v $ ** Revision 1.33 2010-10-20 16:44:18 joergr ** Use type cast macros (e.g. OFstatic_cast) where appropriate. ** ** Revision 1.32 2010-10-14 13:14:11 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.31 2010-04-23 14:30:35 joergr ** Added new method to all VR classes which checks whether the stored value ** conforms to the VR definition and to the specified VM. ** ** Revision 1.30 2008-07-17 10:31:32 onken ** Implemented copyFrom() method for complete DcmObject class hierarchy, which ** permits setting an instance's value from an existing object. Implemented ** assignment operator where necessary. ** ** Revision 1.29 2007-06-29 14:17:49 meichel ** Code clean-up: Most member variables in module dcmdata are now private, ** not protected anymore. ** ** Revision 1.28 2006/08/15 15:49:54 meichel ** Updated all code in module dcmdata to correctly compile when ** all standard C++ classes remain in namespace std. ** ** Revision 1.27 2005/12/08 15:42:07 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.26 2004/02/04 16:05:43 joergr ** Adapted type casts to new-style typecast operators defined in ofcast.h. ** Removed acknowledgements with e-mail addresses from CVS log. ** ** Revision 1.25 2002/12/11 16:55:04 meichel ** Added typecasts to avoid warnings on OSF/1 ** ** Revision 1.24 2002/12/10 20:02:09 joergr ** Fixed "cut and paste" error in assignment operator. ** ** Revision 1.23 2002/12/06 13:12:38 joergr ** Enhanced "print()" function by re-working the implementation and replacing ** the boolean "showFullData" parameter by a more general integer flag. ** Made source code formatting more consistent with other modules/files. ** ** Revision 1.22 2002/11/27 12:06:59 meichel ** Adapted module dcmdata to use of new header file ofstdinc.h ** ** Revision 1.21 2002/04/25 10:35:04 joergr ** Added getOFString() implementation. ** ** Revision 1.20 2002/04/16 13:43:26 joergr ** Added configurable support for C++ ANSI standard includes (e.g. streams). ** ** Revision 1.19 2001/09/25 17:20:01 meichel ** Adapted dcmdata to class OFCondition ** ** Revision 1.18 2001/06/01 15:49:21 meichel ** Updated copyright header ** ** Revision 1.17 2000/04/14 15:55:10 meichel ** Dcmdata library code now consistently uses ofConsole for error output. ** ** Revision 1.16 2000/03/08 16:26:52 meichel ** Updated copyright header. ** ** Revision 1.15 2000/03/03 14:05:40 meichel ** Implemented library support for redirecting error messages into memory ** instead of printing them to stdout/stderr for GUI applications. ** ** Revision 1.14 2000/02/10 10:52:26 joergr ** Added new feature to dcmdump (enhanced print method of dcmdata): write ** pixel data/item value fields to raw files. ** ** Revision 1.13 2000/02/02 14:33:01 joergr ** Replaced 'delete' statements by 'delete[]' for objects created with 'new[]'. ** ** Revision 1.12 1999/03/31 09:26:01 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.11 1997/07/21 08:25:36 andreas ** - Replace all boolean types (BOOLEAN, CTNBOOLEAN, DICOM_BOOL, BOOL) ** with one unique boolean type OFBool. ** ** Revision 1.10 1997/07/03 15:10:21 andreas ** - removed debugging functions Bdebug() and Edebug() since ** they write a static array and are not very useful at all. ** Cdebug and Vdebug are merged since they have the same semantics. ** The debugging functions in dcmdata changed their interfaces ** (see dcmdata/include/dcdebug.h) ** ** Revision 1.9 1997/04/18 08:17:21 andreas ** - The put/get-methods for all VRs did not conform to the C++-Standard ** draft. Some Compilers (e.g. SUN-C++ Compiler, Metroworks ** CodeWarrier, etc.) create many warnings concerning the hiding of ** overloaded get methods in all derived classes of DcmElement. ** So the interface of all value representation classes in the ** library are changed rapidly, e.g. ** OFCondition get(Uint16 & value, const unsigned long pos); ** becomes ** OFCondition getUint16(Uint16 & value, const unsigned long pos); ** All (retired) "returntype get(...)" methods are deleted. ** For more information see dcmdata/include/dcelem.h ** ** Revision 1.8 1996/08/05 08:46:24 andreas ** new print routine with additional parameters: ** - print into files ** - fix output length for elements ** corrected error in search routine with parameter ESM_fromStackTop ** ** Revision 1.7 1996/05/20 13:27:53 andreas ** correct minor bug in print routine ** ** Revision 1.6 1996/04/16 16:05:26 andreas ** - better support und bug fixes for NULL element value ** ** Revision 1.5 1996/03/26 09:59:38 meichel ** corrected bug (deletion of const char *) which prevented compilation on NeXT ** ** Revision 1.4 1996/01/29 13:38:35 andreas ** - new put method for every VR to put value as a string ** - better and unique print methods ** ** Revision 1.3 1996/01/05 13:27:55 andreas ** - changed to support new streaming facilities ** - unique read/write methods for file and block transfer ** - more cleanups ** ** */ dcmtk-3.6.0/dcmdata/libsrc/dcvrfd.cc0000644000310500011400000003406011457616141016502 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Gerd Ehlers, Andreas Barth * * Purpose: Implementation of class DcmFloatingPointDouble * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-20 16:44:17 $ * CVS/RCS Revision: $Revision: 1.34 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/ofstd/ofstream.h" #include "dcmtk/ofstd/ofstd.h" #include "dcmtk/dcmdata/dcvrfd.h" #include "dcmtk/dcmdata/dcvm.h" #define INCLUDE_CSTDIO #define INCLUDE_CSTRING #include "dcmtk/ofstd/ofstdinc.h" // ******************************** DcmFloatingPointDouble::DcmFloatingPointDouble(const DcmTag &tag, const Uint32 len) : DcmElement(tag, len) { } DcmFloatingPointDouble::DcmFloatingPointDouble(const DcmFloatingPointDouble &old) : DcmElement(old) { } DcmFloatingPointDouble::~DcmFloatingPointDouble() { } DcmFloatingPointDouble &DcmFloatingPointDouble::operator=(const DcmFloatingPointDouble &obj) { DcmElement::operator=(obj); return *this; } OFCondition DcmFloatingPointDouble::copyFrom(const DcmObject& rhs) { if (this != &rhs) { if (rhs.ident() != ident()) return EC_IllegalCall; *this = OFstatic_cast(const DcmFloatingPointDouble &, rhs); } return EC_Normal; } // ******************************** DcmEVR DcmFloatingPointDouble::ident() const { return EVR_FD; } OFCondition DcmFloatingPointDouble::checkValue(const OFString &vm, const OFBool /*oldFormat*/) { /* check VM only, further checks on the floating point values could be added later */ return DcmElement::checkVM(getVM(), vm); } unsigned long DcmFloatingPointDouble::getVM() { return getLengthField() / sizeof(Float64); } // ******************************** void DcmFloatingPointDouble::print(STD_NAMESPACE ostream&out, const size_t flags, const int level, const char * /*pixelFileName*/, size_t * /*pixelCounter*/) { if (valueLoaded()) { /* get double data */ Float64 *doubleVals; errorFlag = getFloat64Array(doubleVals); if (doubleVals != NULL) { const unsigned long count = getVM(); const unsigned long maxLength = (flags & DCMTypes::PF_shortenLongTagValues) ? DCM_OptPrintLineLength : OFstatic_cast(unsigned long, -1) /*unlimited*/; unsigned long printedLength = 0; unsigned long newLength = 0; char buffer[64]; /* print line start with tag and VR */ printInfoLineStart(out, flags, level); /* print multiple values */ for (unsigned int i = 0; i < count; i++, doubleVals++) { /* check whether first value is printed (omit delimiter) */ if (i == 0) OFStandard::ftoa(buffer, sizeof(buffer), *doubleVals, 0, 0, 17 /* DBL_DIG + 2 for DICOM FD */); else { buffer[0] = '\\'; OFStandard::ftoa(buffer + 1, sizeof(buffer) - 1, *doubleVals, 0, 0, 17 /* DBL_DIG + 2 for DICOM FD */); } /* check whether current value sticks to the length limit */ newLength = printedLength + strlen(buffer); if ((newLength <= maxLength) && ((i + 1 == count) || (newLength + 3 <= maxLength))) { out << buffer; printedLength = newLength; } else { /* check whether output has been truncated */ if (i + 1 < count) { out << "..."; printedLength += 3; } break; } } /* print line end with length, VM and tag name */ printInfoLineEnd(out, flags, printedLength); } else printInfoLine(out, flags, level, "(no value available)" ); } else printInfoLine(out, flags, level, "(not loaded)" ); } // ******************************** OFCondition DcmFloatingPointDouble::getFloat64(Float64 &doubleVal, const unsigned long pos) { /* get double data */ Float64 *doubleValues = NULL; errorFlag = getFloat64Array(doubleValues); /* check data before returning */ if (errorFlag.good()) { if (doubleValues == NULL) errorFlag = EC_IllegalCall; else if (pos >= getVM()) errorFlag = EC_IllegalParameter; else doubleVal = doubleValues[pos]; } /* clear value in case of error */ if (errorFlag.bad()) doubleVal = 0; return errorFlag; } OFCondition DcmFloatingPointDouble::getFloat64Array(Float64 *&doubleVals) { doubleVals = OFstatic_cast(Float64 *, getValue()); return errorFlag; } // ******************************** OFCondition DcmFloatingPointDouble::getOFString(OFString &stringVal, const unsigned long pos, OFBool /*normalize*/) { Float64 doubleVal; /* get the specified numeric value */ errorFlag = getFloat64(doubleVal, pos); if (errorFlag.good()) { /* ... and convert it to a character string */ char buffer[64]; OFStandard::ftoa(buffer, sizeof(buffer), doubleVal, 0, 0, 17 /* DBL_DIG + 2 for DICOM FD */); /* assign result */ stringVal = buffer; } return errorFlag; } // ******************************** OFCondition DcmFloatingPointDouble::putFloat64(const Float64 doubleVal, const unsigned long pos) { Float64 val = doubleVal; errorFlag = changeValue(&val, sizeof(Float64) * pos, sizeof(Float64)); return errorFlag; } OFCondition DcmFloatingPointDouble::putFloat64Array(const Float64 *doubleVals, const unsigned long numDoubles) { errorFlag = EC_Normal; if (numDoubles > 0) { /* check for valid data */ if (doubleVals != NULL) errorFlag = putValue(doubleVals, sizeof(Float64) * OFstatic_cast(Uint32, numDoubles)); else errorFlag = EC_CorruptedData; } else putValue(NULL, 0); return errorFlag; } // ******************************** OFCondition DcmFloatingPointDouble::putString(const char *stringVal) { errorFlag = EC_Normal; /* check input string */ if ((stringVal != NULL) && (strlen(stringVal) > 0)) { const unsigned long vm = getVMFromString(stringVal); if (vm > 0) { Float64 *field = new Float64[vm]; const char *s = stringVal; OFBool success = OFFalse; char *value; /* retrieve double data from character string */ for (unsigned long i = 0; (i < vm) && errorFlag.good(); i++) { /* get first value stored in 's', set 's' to beginning of the next value */ value = getFirstValueFromString(s); if (value != NULL) { field[i] = OFStandard::atof(value, &success); if (!success) errorFlag = EC_CorruptedData; delete[] value; } else errorFlag = EC_CorruptedData; } /* set binary data as the element value */ if (errorFlag == EC_Normal) errorFlag = putFloat64Array(field, vm); /* delete temporary buffer */ delete[] field; } else putValue(NULL, 0); } else putValue(NULL,0); return errorFlag; } // ******************************** OFCondition DcmFloatingPointDouble::verify(const OFBool autocorrect) { /* check for valid value length */ if (getLengthField() % (sizeof(Float64)) != 0) { errorFlag = EC_CorruptedData; if (autocorrect) { /* strip to valid length */ setLengthField(getLengthField() - (getLengthField() % (sizeof(Float64)))); } } else errorFlag = EC_Normal; return errorFlag; } /* ** CVS/RCS Log: ** $Log: dcvrfd.cc,v $ ** Revision 1.34 2010-10-20 16:44:17 joergr ** Use type cast macros (e.g. OFstatic_cast) where appropriate. ** ** Revision 1.33 2010-10-14 13:14:10 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.32 2010-04-23 14:30:34 joergr ** Added new method to all VR classes which checks whether the stored value ** conforms to the VR definition and to the specified VM. ** ** Revision 1.31 2008-07-17 10:31:32 onken ** Implemented copyFrom() method for complete DcmObject class hierarchy, which ** permits setting an instance's value from an existing object. Implemented ** assignment operator where necessary. ** ** Revision 1.30 2007-06-29 14:17:49 meichel ** Code clean-up: Most member variables in module dcmdata are now private, ** not protected anymore. ** ** Revision 1.29 2007/02/21 09:26:19 meichel ** Increased output precision to 17 (DBL_DIG+2) when converting an FD element to string. ** ** Revision 1.28 2006/08/15 15:49:54 meichel ** Updated all code in module dcmdata to correctly compile when ** all standard C++ classes remain in namespace std. ** ** Revision 1.27 2005/12/08 15:41:52 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.26 2004/02/04 16:17:03 joergr ** Adapted type casts to new-style typecast operators defined in ofcast.h. ** Removed acknowledgements with e-mail addresses from CVS log. ** ** Revision 1.25 2002/12/06 13:12:40 joergr ** Enhanced "print()" function by re-working the implementation and replacing ** the boolean "showFullData" parameter by a more general integer flag. ** Made source code formatting more consistent with other modules/files. ** ** Revision 1.24 2002/12/04 10:41:02 meichel ** Changed toolkit to use OFStandard::ftoa instead of sprintf for all ** double to string conversions that are supposed to be locale independent ** ** Revision 1.23 2002/11/27 12:06:56 meichel ** Adapted module dcmdata to use of new header file ofstdinc.h ** ** Revision 1.22 2002/06/20 12:06:17 meichel ** Changed toolkit to use OFStandard::atof instead of atof, strtod or ** sscanf for all string to double conversions that are supposed to ** be locale independent ** ** Revision 1.21 2002/04/25 10:29:40 joergr ** Added getOFString() implementation. ** ** Revision 1.20 2002/04/16 13:43:24 joergr ** Added configurable support for C++ ANSI standard includes (e.g. streams). ** ** Revision 1.19 2001/09/25 17:19:56 meichel ** Adapted dcmdata to class OFCondition ** ** Revision 1.18 2001/06/01 15:49:16 meichel ** Updated copyright header ** ** Revision 1.17 2000/04/14 16:11:03 meichel ** Dcmdata library code now consistently uses ofConsole for error output. ** ** Revision 1.16 2000/03/08 16:26:47 meichel ** Updated copyright header. ** ** Revision 1.15 2000/03/03 14:05:38 meichel ** Implemented library support for redirecting error messages into memory ** instead of printing them to stdout/stderr for GUI applications. ** ** Revision 1.14 2000/02/10 10:52:23 joergr ** Added new feature to dcmdump (enhanced print method of dcmdata): write ** pixel data/item value fields to raw files. ** ** Revision 1.13 2000/02/02 14:32:56 joergr ** Replaced 'delete' statements by 'delete[]' for objects created with 'new[]'. ** ** Revision 1.12 1999/03/31 09:25:51 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.11 1997/07/21 08:25:32 andreas ** - Replace all boolean types (BOOLEAN, CTNBOOLEAN, DICOM_BOOL, BOOL) ** with one unique boolean type OFBool. ** ** Revision 1.10 1997/07/03 15:10:12 andreas ** - removed debugging functions Bdebug() and Edebug() since ** they write a static array and are not very useful at all. ** Cdebug and Vdebug are merged since they have the same semantics. ** The debugging functions in dcmdata changed their interfaces ** (see dcmdata/include/dcdebug.h) ** ** Revision 1.9 1997/04/18 08:10:50 andreas ** - Corrected debugging code ** - The put/get-methods for all VRs did not conform to the C++-Standard ** draft. Some Compilers (e.g. SUN-C++ Compiler, Metroworks ** CodeWarrier, etc.) create many warnings concerning the hiding of ** overloaded get methods in all derived classes of DcmElement. ** So the interface of all value representation classes in the ** library are changed rapidly, e.g. ** OFCondition get(Uint16 & value, const unsigned long pos); ** becomes ** OFCondition getUint16(Uint16 & value, const unsigned long pos); ** All (retired) "returntype get(...)" methods are deleted. ** For more information see dcmdata/include/dcelem.h ** ** Revision 1.8 1996/08/05 08:46:19 andreas ** new print routine with additional parameters: ** - print into files ** - fix output length for elements ** corrected error in search routine with parameter ESM_fromStackTop ** ** Revision 1.7 1996/05/20 13:27:51 andreas ** correct minor bug in print routine ** ** Revision 1.6 1996/04/16 16:05:23 andreas ** - better support und bug fixes for NULL element value ** ** Revision 1.5 1996/03/26 09:59:35 meichel ** corrected bug (deletion of const char *) which prevented compilation on NeXT ** ** Revision 1.4 1996/01/29 13:38:32 andreas ** - new put method for every VR to put value as a string ** - better and unique print methods ** ** Revision 1.3 1996/01/05 13:27:48 andreas ** - changed to support new streaming facilities ** - unique read/write methods for file and block transfer ** - more cleanups ** */ dcmtk-3.6.0/dcmdata/libsrc/dcrledrg.cc0000644000310500011400000000502611455601041017007 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Marco Eichelberg * * Purpose: singleton class that registers RLE decoder. * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:14:09 $ * CVS/RCS Revision: $Revision: 1.5 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" #include "dcmtk/dcmdata/dcrledrg.h" #include "dcmtk/dcmdata/dccodec.h" /* for DcmCodecStruct */ #include "dcmtk/dcmdata/dcrleccd.h" /* for class DcmRLECodecDecoder */ #include "dcmtk/dcmdata/dcrlecp.h" /* for class DcmRLECodecParameter */ // initialization of static members OFBool DcmRLEDecoderRegistration::registered = OFFalse; DcmRLECodecParameter *DcmRLEDecoderRegistration::cp = NULL; DcmRLECodecDecoder *DcmRLEDecoderRegistration::codec = NULL; void DcmRLEDecoderRegistration::registerCodecs( OFBool pCreateSOPInstanceUID, OFBool pReverseDecompressionByteOrder) { if (! registered) { cp = new DcmRLECodecParameter( pCreateSOPInstanceUID, 0, OFTrue, OFFalse, pReverseDecompressionByteOrder); if (cp) { codec = new DcmRLECodecDecoder(); if (codec) DcmCodecList::registerCodec(codec, NULL, cp); registered = OFTrue; } } } void DcmRLEDecoderRegistration::cleanup() { if (registered) { DcmCodecList::deregisterCodec(codec); delete codec; delete cp; registered = OFFalse; #ifdef DEBUG // not needed but useful for debugging purposes codec = NULL; cp = NULL; #endif } } /* * CVS/RCS Log * $Log: dcrledrg.cc,v $ * Revision 1.5 2010-10-14 13:14:09 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.4 2009-11-04 09:58:10 uli * Switched to logging mechanism provided by the "new" oflog module * * Revision 1.3 2005-12-08 15:41:33 meichel * Changed include path schema for all DCMTK header files * * Revision 1.2 2005/07/26 17:08:35 meichel * Added option to RLE decoder that allows to correctly decode images with * incorrect byte order of byte segments (LSB instead of MSB). * * Revision 1.1 2002/06/06 14:52:42 meichel * Initial release of the new RLE codec classes * and the dcmcrle/dcmdrle tools in module dcmdata * * */ dcmtk-3.6.0/dcmdata/libsrc/dcvrlo.cc0000644000310500011400000001457511457616141016534 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Gerd Ehlers, Andreas Barth * * Purpose: Implementation class DcmLongString * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-20 16:44:17 $ * CVS/RCS Revision: $Revision: 1.21 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcvrlo.h" // ******************************** DcmLongString::DcmLongString(const DcmTag &tag, const Uint32 len) : DcmCharString(tag, len) { setMaxLength(64); setNonSignificantChars(" \\"); } DcmLongString::DcmLongString(const DcmLongString &old) : DcmCharString(old) { } DcmLongString::~DcmLongString() { } DcmLongString &DcmLongString::operator=(const DcmLongString &obj) { DcmCharString::operator=(obj); return *this; } OFCondition DcmLongString::copyFrom(const DcmObject& rhs) { if (this != &rhs) { if (rhs.ident() != ident()) return EC_IllegalCall; *this = OFstatic_cast(const DcmLongString &, rhs); } return EC_Normal; } // ******************************** DcmEVR DcmLongString::ident() const { return EVR_LO; } OFCondition DcmLongString::checkValue(const OFString &vm, const OFBool /*oldFormat*/) { OFString strVal; /* get "raw value" without any modifications (if possible) */ OFCondition l_error = getStringValue(strVal); if (l_error.good()) l_error = DcmLongString::checkStringValue(strVal, vm); return l_error; } // ******************************** OFCondition DcmLongString::getOFString(OFString &stringVal, const unsigned long pos, OFBool normalize) { OFCondition l_error = DcmCharString::getOFString(stringVal, pos, normalize); if (l_error.good() && normalize) normalizeString(stringVal, !MULTIPART, DELETE_LEADING, DELETE_TRAILING); return l_error; } // ******************************** OFCondition DcmLongString::checkStringValue(const OFString &value, const OFString &vm) { return DcmByteString::checkStringValue(value, vm, "lo", 12 /*, maxLen: 64 characters */); } /* ** CVS/RCS Log: ** $Log: dcvrlo.cc,v $ ** Revision 1.21 2010-10-20 16:44:17 joergr ** Use type cast macros (e.g. OFstatic_cast) where appropriate. ** ** Revision 1.20 2010-10-14 13:14:10 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.19 2010-04-23 14:30:34 joergr ** Added new method to all VR classes which checks whether the stored value ** conforms to the VR definition and to the specified VM. ** ** Revision 1.18 2009-08-07 14:35:49 joergr ** Enhanced isEmpty() method by checking whether the data element value consists ** of non-significant characters only. ** ** Revision 1.17 2009-08-03 09:03:00 joergr ** Added methods that check whether a given string value conforms to the VR and ** VM definitions of the DICOM standards. ** ** Revision 1.16 2008-07-17 10:31:32 onken ** Implemented copyFrom() method for complete DcmObject class hierarchy, which ** permits setting an instance's value from an existing object. Implemented ** assignment operator where necessary. ** ** Revision 1.15 2007-06-29 14:17:49 meichel ** Code clean-up: Most member variables in module dcmdata are now private, ** not protected anymore. ** ** Revision 1.14 2005/12/08 15:41:55 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.13 2002/12/06 13:20:51 joergr ** Enhanced "print()" function by re-working the implementation and replacing ** the boolean "showFullData" parameter by a more general integer flag. ** Made source code formatting more consistent with other modules/files. ** ** Revision 1.12 2002/04/25 10:30:35 joergr ** Removed getOFStringArray() implementation. ** ** Revision 1.11 2001/09/25 17:19:58 meichel ** Adapted dcmdata to class OFCondition ** ** Revision 1.10 2001/06/01 15:49:17 meichel ** Updated copyright header ** ** Revision 1.9 2000/03/08 16:26:48 meichel ** Updated copyright header. ** ** Revision 1.8 1999/03/31 09:25:53 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.7 1998/11/12 16:48:25 meichel ** Implemented operator= for all classes derived from DcmObject. ** ** Revision 1.6 1997/08/29 13:11:46 andreas ** Corrected Bug in getOFStringArray Implementation ** ** Revision 1.5 1997/08/29 08:32:58 andreas ** - Added methods getOFString and getOFStringArray for all ** string VRs. These methods are able to normalise the value, i. e. ** to remove leading and trailing spaces. This will be done only if ** it is described in the standard that these spaces are not relevant. ** These methods do not test the strings for conformance, this means ** especially that they do not delete spaces where they are not allowed! ** getOFStringArray returns the string with all its parts separated by \ ** and getOFString returns only one value of the string. ** CAUTION: Currently getString returns a string with trailing ** spaces removed (if dcmEnableAutomaticInputDataCorrection == OFTrue) and ** truncates the original string (since it is not copied!). If you rely on this ** behaviour please change your application now. ** Future changes will ensure that getString returns the original ** string from the DICOM object (NULL terminated) inclusive padding. ** Currently, if you call getOF... before calling getString without ** normalisation, you can get the original string read from the DICOM object. ** ** Revision 1.4 1997/07/03 15:10:14 andreas ** - removed debugging functions Bdebug() and Edebug() since ** they write a static array and are not very useful at all. ** Cdebug and Vdebug are merged since they have the same semantics. ** The debugging functions in dcmdata changed their interfaces ** (see dcmdata/include/dcdebug.h) ** ** Revision 1.3 1996/01/05 13:27:50 andreas ** - changed to support new streaming facilities ** - unique read/write methods for file and block transfer ** - more cleanups ** */ dcmtk-3.6.0/dcmdata/libsrc/dcvrsl.cc0000644000310500011400000003231211457616141016525 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Gerd Ehlers, Andreas Barth * * Purpose: Implementation of class DcmSignedLong * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-20 16:44:17 $ * CVS/RCS Revision: $Revision: 1.33 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/ofstd/ofstream.h" #include "dcmtk/dcmdata/dcvrsl.h" #include "dcmtk/dcmdata/dcvm.h" #define INCLUDE_CSTDIO #define INCLUDE_CSTRING #include "dcmtk/ofstd/ofstdinc.h" // ******************************** DcmSignedLong::DcmSignedLong(const DcmTag &tag, const Uint32 len) : DcmElement(tag, len) { } DcmSignedLong::DcmSignedLong(const DcmSignedLong &old) : DcmElement(old) { } DcmSignedLong::~DcmSignedLong() { } DcmSignedLong &DcmSignedLong::operator=(const DcmSignedLong &obj) { DcmElement::operator=(obj); return *this; } OFCondition DcmSignedLong::copyFrom(const DcmObject& rhs) { if (this != &rhs) { if (rhs.ident() != ident()) return EC_IllegalCall; *this = OFstatic_cast(const DcmSignedLong &, rhs); } return EC_Normal; } // ******************************** DcmEVR DcmSignedLong::ident() const { return EVR_SL; } OFCondition DcmSignedLong::checkValue(const OFString &vm, const OFBool /*oldFormat*/) { /* check VM only */ return DcmElement::checkVM(getVM(), vm); } unsigned long DcmSignedLong::getVM() { return getLengthField() / sizeof(Sint32); } // ******************************** void DcmSignedLong::print(STD_NAMESPACE ostream&out, const size_t flags, const int level, const char * /*pixelFileName*/, size_t * /*pixelCounter*/) { if (valueLoaded()) { /* get signed integer data */ Sint32 *sintVals; errorFlag = getSint32Array(sintVals); if (sintVals != NULL) { const unsigned long count = getVM(); const unsigned long maxLength = (flags & DCMTypes::PF_shortenLongTagValues) ? DCM_OptPrintLineLength : OFstatic_cast(unsigned long, -1) /*unlimited*/; unsigned long printedLength = 0; unsigned long newLength = 0; char buffer[32]; /* print line start with tag and VR */ printInfoLineStart(out, flags, level); /* print multiple values */ for (unsigned int i = 0; i < count; i++, sintVals++) { /* check whether first value is printed (omit delimiter) */ #if SIZEOF_LONG == 8 if (i == 0) sprintf(buffer, "%d", *sintVals); else sprintf(buffer, "\\%d", *sintVals); #else if (i == 0) sprintf(buffer, "%ld", *sintVals); else sprintf(buffer, "\\%ld", *sintVals); #endif /* check whether current value sticks to the length limit */ newLength = printedLength + strlen(buffer); if ((newLength <= maxLength) && ((i + 1 == count) || (newLength + 3 <= maxLength))) { out << buffer; printedLength = newLength; } else { /* check whether output has been truncated */ if (i + 1 < count) { out << "..."; printedLength += 3; } break; } } /* print line end with length, VM and tag name */ printInfoLineEnd(out, flags, printedLength); } else printInfoLine(out, flags, level, "(no value available)"); } else printInfoLine(out, flags, level, "(not loaded)"); } // ******************************** OFCondition DcmSignedLong::getSint32(Sint32 &sintVal, const unsigned long pos) { /* get signed integer data */ Sint32 *sintValues = NULL; errorFlag = getSint32Array(sintValues); /* check data before returning */ if (errorFlag.good()) { if (sintValues == NULL) errorFlag = EC_IllegalCall; else if (pos >= getVM()) errorFlag = EC_IllegalParameter; else sintVal = sintValues[pos]; } /* clear value in case of error */ if (errorFlag.bad()) sintVal = 0; return errorFlag; } OFCondition DcmSignedLong::getSint32Array(Sint32 *&sintVals) { sintVals = OFstatic_cast(Sint32 *, getValue()); return errorFlag; } // ******************************** OFCondition DcmSignedLong::getOFString(OFString &stringVal, const unsigned long pos, OFBool /*normalize*/) { Sint32 sintVal; /* get the specified numeric value */ errorFlag = getSint32(sintVal, pos); if (errorFlag.good()) { /* ... and convert it to a character string */ char buffer[32]; sprintf(buffer, "%li", OFstatic_cast(long, sintVal)); /* assign result */ stringVal = buffer; } return errorFlag; } // ******************************** OFCondition DcmSignedLong::putSint32(const Sint32 sintVal, const unsigned long pos) { Sint32 val = sintVal; errorFlag = changeValue(&val, sizeof(Sint32) * pos, sizeof(Sint32)); return errorFlag; } OFCondition DcmSignedLong::putSint32Array(const Sint32 *sintVals, const unsigned long numSints) { errorFlag = EC_Normal; if (numSints > 0) { /* check for valid data */ if (sintVals != NULL) errorFlag = putValue(sintVals, sizeof(Sint32) * OFstatic_cast(Uint32, numSints)); else errorFlag = EC_CorruptedData; } else errorFlag = putValue(NULL, 0); return errorFlag; } // ******************************** OFCondition DcmSignedLong::putString(const char *stringVal) { errorFlag = EC_Normal; /* check input string */ if ((stringVal != NULL) && (strlen(stringVal) > 0)) { const unsigned long vm = getVMFromString(stringVal); if (vm > 0) { Sint32 *field = new Sint32[vm]; const char *s = stringVal; char *value; /* retrieve signed integer data from character string */ for (unsigned long i = 0; (i < vm) && errorFlag.good(); i++) { /* get first value stored in 's', set 's' to beginning of the next value */ value = getFirstValueFromString(s); if ((value == NULL) || #if SIZEOF_LONG == 8 (sscanf(value, "%d", &field[i]) != 1) #else (sscanf(value, "%ld", &field[i]) != 1) #endif ) { errorFlag = EC_CorruptedData; } delete[] value; } /* set binary data as the element value */ if (errorFlag.good()) errorFlag = putSint32Array(field, vm); /* delete temporary buffer */ delete[] field; } else errorFlag = putValue(NULL, 0); } else errorFlag = putValue(NULL, 0); return errorFlag; } // ******************************** OFCondition DcmSignedLong::verify(const OFBool autocorrect) { /* check for valid value length */ if (getLengthField() % (sizeof(Sint32)) != 0) { errorFlag = EC_CorruptedData; if (autocorrect) { /* strip to valid length */ setLengthField(getLengthField() - (getLengthField() % (sizeof(Sint32)))); } } else errorFlag = EC_Normal; return errorFlag; } /* ** CVS/RCS Log: ** $Log: dcvrsl.cc,v $ ** Revision 1.33 2010-10-20 16:44:17 joergr ** Use type cast macros (e.g. OFstatic_cast) where appropriate. ** ** Revision 1.32 2010-10-14 13:14:10 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.31 2010-04-23 14:30:34 joergr ** Added new method to all VR classes which checks whether the stored value ** conforms to the VR definition and to the specified VM. ** ** Revision 1.30 2008-07-17 10:31:32 onken ** Implemented copyFrom() method for complete DcmObject class hierarchy, which ** permits setting an instance's value from an existing object. Implemented ** assignment operator where necessary. ** ** Revision 1.29 2007-06-29 14:17:49 meichel ** Code clean-up: Most member variables in module dcmdata are now private, ** not protected anymore. ** ** Revision 1.28 2006/08/15 15:49:54 meichel ** Updated all code in module dcmdata to correctly compile when ** all standard C++ classes remain in namespace std. ** ** Revision 1.27 2005/12/08 15:42:02 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.26 2004/02/04 16:07:15 joergr ** Adapted type casts to new-style typecast operators defined in ofcast.h. ** Removed acknowledgements with e-mail addresses from CVS log. ** ** Revision 1.25 2002/12/11 16:55:03 meichel ** Added typecasts to avoid warnings on OSF/1 ** ** Revision 1.24 2002/12/10 20:02:10 joergr ** Fixed "cut and paste" error in assignment operator. ** ** Revision 1.23 2002/12/06 13:12:39 joergr ** Enhanced "print()" function by re-working the implementation and replacing ** the boolean "showFullData" parameter by a more general integer flag. ** Made source code formatting more consistent with other modules/files. ** ** Revision 1.22 2002/11/27 12:06:58 meichel ** Adapted module dcmdata to use of new header file ofstdinc.h ** ** Revision 1.21 2002/04/25 10:33:20 joergr ** Added getOFString() implementation. ** ** Revision 1.20 2002/04/16 13:43:25 joergr ** Added configurable support for C++ ANSI standard includes (e.g. streams). ** ** Revision 1.19 2001/09/25 17:20:00 meichel ** Adapted dcmdata to class OFCondition ** ** Revision 1.18 2001/06/01 15:49:19 meichel ** Updated copyright header ** ** Revision 1.17 2000/04/14 15:55:09 meichel ** Dcmdata library code now consistently uses ofConsole for error output. ** ** Revision 1.16 2000/03/08 16:26:50 meichel ** Updated copyright header. ** ** Revision 1.15 2000/03/03 14:05:40 meichel ** Implemented library support for redirecting error messages into memory ** instead of printing them to stdout/stderr for GUI applications. ** ** Revision 1.14 2000/02/10 10:52:25 joergr ** Added new feature to dcmdump (enhanced print method of dcmdata): write ** pixel data/item value fields to raw files. ** ** Revision 1.13 2000/02/02 14:32:58 joergr ** Replaced 'delete' statements by 'delete[]' for objects created with 'new[]'. ** ** Revision 1.12 1999/03/31 09:25:58 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.11 1997/07/21 08:25:34 andreas ** - Replace all boolean types (BOOLEAN, CTNBOOLEAN, DICOM_BOOL, BOOL) ** with one unique boolean type OFBool. ** ** Revision 1.10 1997/07/03 15:10:17 andreas ** - removed debugging functions Bdebug() and Edebug() since ** they write a static array and are not very useful at all. ** Cdebug and Vdebug are merged since they have the same semantics. ** The debugging functions in dcmdata changed their interfaces ** (see dcmdata/include/dcdebug.h) ** ** Revision 1.9 1997/04/18 08:10:52 andreas ** - Corrected debugging code ** - The put/get-methods for all VRs did not conform to the C++-Standard ** draft. Some Compilers (e.g. SUN-C++ Compiler, Metroworks ** CodeWarrier, etc.) create many warnings concerning the hiding of ** overloaded get methods in all derived classes of DcmElement. ** So the interface of all value representation classes in the ** library are changed rapidly, e.g. ** OFCondition get(Uint16 & value, const unsigned long pos); ** becomes ** OFCondition getUint16(Uint16 & value, const unsigned long pos); ** All (retired) "returntype get(...)" methods are deleted. ** For more information see dcmdata/include/dcelem.h ** ** Revision 1.8 1996/08/05 08:46:21 andreas ** new print routine with additional parameters: ** - print into files ** - fix output length for elements ** corrected error in search routine with parameter ESM_fromStackTop ** ** Revision 1.7 1996/05/20 13:27:52 andreas ** correct minor bug in print routine ** ** Revision 1.6 1996/04/16 16:05:25 andreas ** - better support und bug fixes for NULL element value ** ** Revision 1.5 1996/03/26 09:59:37 meichel ** corrected bug (deletion of const char *) which prevented compilation on NeXT ** ** Revision 1.4 1996/01/29 13:38:33 andreas ** - new put method for every VR to put value as a string ** - better and unique print methods ** ** Revision 1.3 1996/01/05 13:27:53 andreas ** - changed to support new streaming facilities ** - unique read/write methods for file and block transfer ** - more cleanups ** */ dcmtk-3.6.0/dcmdata/libsrc/dcrleerg.cc0000644000310500011400000000457511455601041017020 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Marco Eichelberg * * Purpose: singleton class that registers RLE encoder. * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:14:09 $ * CVS/RCS Revision: $Revision: 1.4 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" #include "dcmtk/dcmdata/dcrleerg.h" #include "dcmtk/dcmdata/dccodec.h" /* for DcmCodecStruct */ #include "dcmtk/dcmdata/dcrlecce.h" /* for class DcmRLECodecEncoder */ #include "dcmtk/dcmdata/dcrlecp.h" /* for class DcmRLECodecParameter */ // initialization of static members OFBool DcmRLEEncoderRegistration::registered = OFFalse; DcmRLECodecParameter *DcmRLEEncoderRegistration::cp = NULL; DcmRLECodecEncoder *DcmRLEEncoderRegistration::codec = NULL; void DcmRLEEncoderRegistration::registerCodecs( OFBool pCreateSOPInstanceUID, Uint32 pFragmentSize, OFBool pCreateOffsetTable, OFBool pConvertToSC) { if (! registered) { cp = new DcmRLECodecParameter( pCreateSOPInstanceUID, pFragmentSize, pCreateOffsetTable, pConvertToSC); if (cp) { codec = new DcmRLECodecEncoder(); if (codec) DcmCodecList::registerCodec(codec, NULL, cp); registered = OFTrue; } } } void DcmRLEEncoderRegistration::cleanup() { if (registered) { DcmCodecList::deregisterCodec(codec); delete codec; delete cp; registered = OFFalse; #ifdef DEBUG // not needed but useful for debugging purposes codec = NULL; cp = NULL; #endif } } /* * CVS/RCS Log * $Log: dcrleerg.cc,v $ * Revision 1.4 2010-10-14 13:14:09 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.3 2009-11-04 09:58:10 uli * Switched to logging mechanism provided by the "new" oflog module * * Revision 1.2 2005-12-08 15:41:34 meichel * Changed include path schema for all DCMTK header files * * Revision 1.1 2002/06/06 14:52:42 meichel * Initial release of the new RLE codec classes * and the dcmcrle/dcmdrle tools in module dcmdata * * */ dcmtk-3.6.0/dcmdata/libsrc/dcsequen.cc0000644000310500011400000016272611463514644017056 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Gerd Ehlers, Andreas Barth * * Purpose: Implementation of class DcmSequenceOfItems * * Last Update: $Author: uli $ * Update Date: $Date: 2010-11-01 10:42:44 $ * CVS/RCS Revision: $Revision: 1.94 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #define INCLUDE_CSTDLIB #define INCLUDE_CSTDIO #include "dcmtk/ofstd/ofstdinc.h" #include "dcmtk/ofstd/ofstream.h" #include "dcmtk/ofstd/ofstd.h" #include "dcmtk/ofstd/ofcast.h" #include "dcmtk/dcmdata/dcsequen.h" #include "dcmtk/dcmdata/dcitem.h" #include "dcmtk/dcmdata/dcdirrec.h" #include "dcmtk/dcmdata/dcvr.h" #include "dcmtk/dcmdata/dcpxitem.h" #include "dcmtk/dcmdata/dcswap.h" #include "dcmtk/dcmdata/dcmetinf.h" #include "dcmtk/dcmdata/dcdeftag.h" #include "dcmtk/dcmdata/dcistrma.h" /* for class DcmInputStream */ #include "dcmtk/dcmdata/dcostrma.h" /* for class DcmOutputStream */ // ******************************** DcmSequenceOfItems::DcmSequenceOfItems( const DcmTag &tag, const Uint32 len, OFBool readAsUN) : DcmElement(tag, len), itemList(new DcmList), lastItemComplete(OFTrue), fStartPosition(0), readAsUN_(readAsUN) { } // ******************************** DcmSequenceOfItems::DcmSequenceOfItems(const DcmSequenceOfItems &old) : DcmElement(old), itemList(new DcmList), lastItemComplete(old.lastItemComplete), fStartPosition(old.fStartPosition), readAsUN_(old.readAsUN_) { if (!old.itemList->empty()) { itemList->seek(ELP_first); old.itemList->seek(ELP_first); do { itemList->insert(old.itemList->get()->clone(), ELP_next); } while (old.itemList->seek(ELP_next)); } } // ******************************** DcmSequenceOfItems::~DcmSequenceOfItems() { itemList->deleteAllElements(); delete itemList; } // ******************************** DcmSequenceOfItems &DcmSequenceOfItems::operator=(const DcmSequenceOfItems &obj) { if (this != &obj) { DcmElement::operator=(obj); lastItemComplete = obj.lastItemComplete; fStartPosition = obj.fStartPosition; readAsUN_ = obj.readAsUN_; // DcmList has no copy constructor. Need to copy ourselves. DcmList *newList = new DcmList; if (newList) { switch (obj.ident()) { case EVR_SQ: case EVR_pixelSQ: case EVR_fileFormat: if (!obj.itemList->empty()) { DcmObject *oldDO; DcmObject *newDO; newList->seek(ELP_first); obj.itemList->seek(ELP_first); do { oldDO = obj.itemList->get(); switch (oldDO->ident()) { case EVR_item: newDO = new DcmItem(*OFstatic_cast(DcmItem *, oldDO)); break; case EVR_pixelItem: newDO = new DcmPixelItem(*OFstatic_cast(DcmPixelItem *, oldDO)); break; case EVR_metainfo: newDO = new DcmMetaInfo(*OFstatic_cast(DcmMetaInfo *, oldDO)); break; case EVR_dataset: newDO = new DcmDataset(*OFstatic_cast(DcmDataset *, oldDO)); break; default: newDO = new DcmItem(oldDO->getTag()); DCMDATA_WARN("DcmSequenceOfItems: Non-item element " << oldDO->getTag() << " found"); break; } newList->insert(newDO, ELP_next); } while (obj.itemList->seek(ELP_next)); } break; default: // wrong use of assignment operator, should never happen break; } } // be sure to clear memory of former elements not in use any more... itemList->deleteAllElements(); // ...and delete the list itself delete itemList; itemList = newList; } return *this; } OFCondition DcmSequenceOfItems::copyFrom(const DcmObject& rhs) { if (this != &rhs) { if (rhs.ident() != ident()) return EC_IllegalCall; *this = OFstatic_cast(const DcmSequenceOfItems &, rhs); } return EC_Normal; } // ******************************** OFCondition DcmSequenceOfItems::checkValue(const OFString &cardinality, const OFBool /*oldFormat*/) { /* check cardinality (number of items) only */ return DcmElement::checkVM(this->card(), cardinality); } // ******************************** void DcmSequenceOfItems::print(STD_NAMESPACE ostream&out, const size_t flags, const int level, const char *pixelFileName, size_t *pixelCounter) { /* print sequence start line */ if (flags & DCMTypes::PF_showTreeStructure) { /* empty text */ printInfoLine(out, flags, level); /* print sequence content */ if (!itemList->empty()) { /* print all items contained in the sequence */ DcmObject *dO; itemList->seek(ELP_first); do { dO = itemList->get(); dO->print(out, flags, level + 1, pixelFileName, pixelCounter); } while (itemList->seek(ELP_next)); } } else { OFOStringStream oss; oss << "(Sequence with "; if (getLengthField() == DCM_UndefinedLength) oss << "undefined"; else oss << "explicit"; oss << " length #=" << card() << ")" << OFStringStream_ends; OFSTRINGSTREAM_GETSTR(oss, tmpString) printInfoLine(out, flags, level, tmpString); OFSTRINGSTREAM_FREESTR(tmpString) /* print sequence content */ if (!itemList->empty()) { DcmObject *dO; itemList->seek(ELP_first); do { dO = itemList->get(); dO->print(out, flags, level + 1, pixelFileName, pixelCounter); } while (itemList->seek(ELP_next)); } /* print sequence end line */ DcmTag delimItemTag(DCM_SequenceDelimitationItem); if (getLengthField() == DCM_UndefinedLength) printInfoLine(out, flags, level, "(SequenceDelimitationItem)", &delimItemTag); else printInfoLine(out, flags, level, "(SequenceDelimitationItem for re-encod.)", &delimItemTag); } } // ******************************** OFCondition DcmSequenceOfItems::writeXML(STD_NAMESPACE ostream&out, const size_t flags) { OFString xmlString; DcmVR vr(getTag().getVR()); /* XML start tag for "sequence" */ out << "" << OFendl; /* write sequence content */ if (!itemList->empty()) { /* write content of all children */ DcmObject *dO; itemList->seek(ELP_first); do { dO = itemList->get(); dO->writeXML(out, flags); } while (itemList->seek(ELP_next)); } /* XML end tag for "sequence" */ out << "" << OFendl; /* always report success */ return EC_Normal; } // ******************************** OFBool DcmSequenceOfItems::canWriteXfer(const E_TransferSyntax newXfer, const E_TransferSyntax oldXfer) { OFBool canWrite = OFTrue; if (newXfer == EXS_Unknown) canWrite = OFFalse; else if (!itemList->empty()) { DcmObject *dO; itemList->seek(ELP_first); do { dO = itemList->get(); canWrite = dO -> canWriteXfer(newXfer, oldXfer); } while (itemList->seek(ELP_next) && canWrite); } return canWrite; } // ******************************** Uint32 DcmSequenceOfItems::calcElementLength(const E_TransferSyntax xfer, const E_EncodingType enctype) { /* Get length of sequence header + sequence content (will call DcmSequenceOfItems::getLength()) */ Uint32 seqlen = DcmElement::calcElementLength(xfer, enctype); if (seqlen == DCM_UndefinedLength) return DCM_UndefinedLength; if (enctype == EET_UndefinedLength) { if (OFStandard::check32BitAddOverflow(seqlen, 8)) return DCM_UndefinedLength; else seqlen += 8; // for Sequence Delimitation Tag } return seqlen; } // ******************************** Uint32 DcmSequenceOfItems::getLength(const E_TransferSyntax xfer, const E_EncodingType enctype) { Uint32 seqlen = 0; Uint32 sublen = 0; if (!itemList->empty()) { DcmItem *dI; itemList->seek(ELP_first); do { dI = OFstatic_cast(DcmItem *, itemList->get()); sublen = dI->calcElementLength(xfer, enctype); /* explicit length: be sure that total size of contained elements fits into sequence's 32 Bit length field. If not, switch encoding automatically to undefined length for this sequence. Nevertheless, any contained items will be written with explicit length if possible. */ if ( (enctype == EET_ExplicitLength) && OFStandard::check32BitAddOverflow(seqlen, sublen) ) { if (dcmWriteOversizedSeqsAndItemsUndefined.get()) { DCMDATA_WARN("DcmSequenceOfItems: Explicit length of sequence " << getTagName() << " " << getTag() << " exceeds 32-bit length field, trying to treat it as undefined length instead"); } else { DCMDATA_WARN("DcmSequenceOfItems: Explicit length of sequence " << getTagName() << " " << getTag() << " exceeds 32-bit length field, writing with explicit length will not be possible"); errorFlag = EC_SeqOrItemContentOverflow; } return DCM_UndefinedLength; } seqlen += sublen; } while (itemList->seek(ELP_next)); } return seqlen; } // ******************************** OFCondition DcmSequenceOfItems::computeGroupLengthAndPadding(const E_GrpLenEncoding glenc, const E_PaddingEncoding padenc, const E_TransferSyntax xfer, const E_EncodingType enctype, const Uint32 padlen, const Uint32 subPadlen, Uint32 instanceLength) { OFCondition l_error = EC_Normal; if (!itemList->empty()) { itemList->seek(ELP_first); do { DcmItem *dO = OFstatic_cast(DcmItem *, itemList->get()); l_error = dO->computeGroupLengthAndPadding (glenc, padenc, xfer, enctype, padlen, subPadlen, instanceLength); } while (l_error.good() && itemList->seek(ELP_next)); } return l_error; } // ******************************** OFCondition DcmSequenceOfItems::makeSubObject(DcmObject *&subObject, const DcmTag &newTag, const Uint32 newLength) { OFCondition l_error = EC_Normal; DcmItem *subItem = NULL; switch (newTag.getEVR()) { case EVR_na: if (newTag.getXTag() == DCM_Item) { if (getTag().getXTag() == DCM_DirectoryRecordSequence) subItem = new DcmDirectoryRecord(newTag, newLength); else subItem = new DcmItem(newTag, newLength); } else if (newTag.getXTag() == DCM_SequenceDelimitationItem) l_error = EC_SequEnd; else if (newTag.getXTag() == DCM_ItemDelimitationItem) l_error = EC_ItemEnd; else l_error = EC_InvalidTag; break; default: subItem = new DcmItem(newTag, newLength); l_error = EC_CorruptedData; break; } subObject = subItem; return l_error; } // ******************************** OFCondition DcmSequenceOfItems::readTagAndLength(DcmInputStream &inStream, const E_TransferSyntax xfer, DcmTag &tag, Uint32 &length) { Uint16 groupTag = 0xffff; Uint16 elementTag = 0xffff; OFCondition l_error = EC_Normal; if (inStream.avail() < 8) l_error = EC_StreamNotifyClient; if (l_error.good()) { DcmXfer iXfer(xfer); const E_ByteOrder iByteOrder = iXfer.getByteOrder(); if (iByteOrder == EBO_unknown) return EC_IllegalCall; inStream.mark(); inStream.read(&groupTag, 2); inStream.read(&elementTag, 2); swapIfNecessary(gLocalByteOrder, iByteOrder, &groupTag, 2, 2); swapIfNecessary(gLocalByteOrder, iByteOrder, &elementTag, 2, 2); // tag has ben read DcmTag newTag(groupTag, elementTag); Uint32 valueLength = 0; inStream.read(&valueLength, 4); swapIfNecessary(gLocalByteOrder, iByteOrder, &valueLength, 4, 4); if ((valueLength & 1) && (valueLength != DCM_UndefinedLength)) { DCMDATA_WARN("DcmSequenceOfItems: Length of item in sequence " << getTagName() << " " << getTag() << " is odd"); } length = valueLength; tag = newTag; // return value: assignment-operator } if (l_error.bad()) DCMDATA_TRACE("DcmSequenceOfItems::readTagAndLength() returns error = " << l_error.text()); return l_error; } // ******************************** OFCondition DcmSequenceOfItems::readSubItem(DcmInputStream &inStream, const DcmTag &newTag, const Uint32 newLength, const E_TransferSyntax xfer, const E_GrpLenEncoding glenc, const Uint32 maxReadLength) { // For DcmSequenceOfItems, subObject is always inherited from DcmItem // For DcmPixelSequence, subObject is always inherited from DcmPixelItem DcmObject * subObject = NULL; OFCondition l_error = makeSubObject(subObject, newTag, newLength); if (l_error.good() && (subObject != NULL)) { // inStream.UnsetPutbackMark(); // not needed anymore with new stream architecture itemList->insert(subObject, ELP_next); l_error = subObject->read(inStream, xfer, glenc, maxReadLength); // read sub-item return l_error; // prevent subObject from getting deleted } else if (l_error == EC_InvalidTag) // try to recover parsing { inStream.putback(); DCMDATA_ERROR("DcmSequenceOfItems: Parse error in sequence, found " << newTag << " instead of item tag"); DCMDATA_DEBUG("DcmSequenceOfItems::readSubItem(): parse error occurred: " << newTag); } else if (l_error != EC_SequEnd) { DCMDATA_ERROR("DcmSequenceOfItems: Parse error in sequence, found " << newTag << " instead of a sequence delimiter"); DCMDATA_DEBUG("DcmSequenceOfItems::readSubItem(): cannot create Sub Item " << newTag); } else { // inStream.UnsetPutbackMark(); // not needed anymore with new stream architecture } if (subObject) delete subObject; // only executed if makeSubObject() has returned an error return l_error; } // ******************************** OFCondition DcmSequenceOfItems::read(DcmInputStream &inStream, const E_TransferSyntax xfer, const E_GrpLenEncoding glenc, const Uint32 maxReadLength) { if (getTransferState() == ERW_notInitialized) errorFlag = EC_IllegalCall; else { errorFlag = inStream.status(); if (errorFlag.good() && inStream.eos()) errorFlag = EC_EndOfStream; else if (errorFlag.good() && (getTransferState() != ERW_ready)) { if (getTransferState() == ERW_init) { fStartPosition = inStream.tell(); // Position Sequence-Value setTransferState(ERW_inWork); } E_TransferSyntax readxfer = readAsUN_ ? EXS_LittleEndianImplicit : xfer; itemList->seek(ELP_last); // append data at end while (inStream.good() && ((getTransferredBytes() < getLengthField()) || !lastItemComplete)) { DcmTag newTag; Uint32 newValueLength = 0; if (lastItemComplete) { errorFlag = readTagAndLength(inStream, readxfer, newTag, newValueLength); if (errorFlag.bad()) break; // finish while loop else incTransferredBytes(8); lastItemComplete = OFFalse; errorFlag = readSubItem(inStream, newTag, newValueLength, readxfer, glenc, maxReadLength); if (errorFlag.good()) lastItemComplete = OFTrue; } else { errorFlag = itemList->get()->read(inStream, readxfer, glenc, maxReadLength); if (errorFlag.good()) lastItemComplete = OFTrue; } setTransferredBytes(OFstatic_cast(Uint32, inStream.tell() - fStartPosition)); if (errorFlag.bad()) break; } //while if (((getTransferredBytes() < getLengthField()) || !lastItemComplete) && errorFlag.good()) errorFlag = EC_StreamNotifyClient; } // else errorFlag if (errorFlag == EC_SequEnd) errorFlag = EC_Normal; if (errorFlag.good()) setTransferState(ERW_ready); // sequence is complete } return errorFlag; } // ******************************** OFCondition DcmSequenceOfItems::write(DcmOutputStream &outStream, const E_TransferSyntax oxfer, const E_EncodingType enctype, DcmWriteCache *wcache) { if (getTransferState() == ERW_notInitialized) errorFlag = EC_IllegalCall; else { errorFlag = outStream.status(); if (errorFlag.good() && (getTransferState() != ERW_ready)) { if (getTransferState() == ERW_init) { /* first compare with DCM_TagInfoLength (12). If there is not enough space * in the buffer, check if the buffer is still sufficient for the requirements * of this element, which may need only 8 instead of 12 bytes. */ if ((outStream.avail() >= DCM_TagInfoLength) || (outStream.avail() >= getTagAndLengthSize(oxfer))) { if (enctype == EET_ExplicitLength) setLengthField(getLength(oxfer, enctype)); else setLengthField(DCM_UndefinedLength); if (errorFlag == EC_SeqOrItemContentOverflow) return EC_SeqOrItemContentOverflow; Uint32 written_bytes = 0; errorFlag = writeTagAndLength(outStream, oxfer, written_bytes); if (errorFlag.good()) { setTransferState(ERW_inWork); itemList->seek(ELP_first); } } else errorFlag = EC_StreamNotifyClient; } if (getTransferState() == ERW_inWork) { // itemList->get() can be NULL if buffer was full after // writing the last item but before writing the sequence delimitation. if (!itemList->empty() && (itemList->get() != NULL)) { DcmObject *dO; do { dO = itemList->get(); if (dO->transferState() != ERW_ready) errorFlag = dO->write(outStream, oxfer, enctype, wcache); } while (errorFlag.good() && itemList->seek(ELP_next)); } if (errorFlag.good()) { setTransferState(ERW_ready); if (getLengthField() == DCM_UndefinedLength) { if (outStream.avail() >= 8) { // write sequence delimitation item DcmTag delim(DCM_SequenceDelimitationItem); errorFlag = writeTag(outStream, delim, oxfer); Uint32 delimLen = 0L; outStream.write(&delimLen, 4); // 4 bytes length } else { // the complete sequence is written but it // is not possible to write the delimination item into the buffer. errorFlag = EC_StreamNotifyClient; setTransferState(ERW_inWork); } } } } } } return errorFlag; } // ******************************** OFCondition DcmSequenceOfItems::writeTagAndVR(DcmOutputStream &outStream, const DcmTag &tag, DcmEVR vr, const E_TransferSyntax oxfer) { OFCondition l_error = outStream.status(); if (l_error.good()) { /* write the tag information (a total of 4 bytes, group number and element */ /* number) to the stream. Mind the transfer syntax's byte ordering. */ l_error = writeTag(outStream, tag, oxfer); /* create an object which represents the transfer syntax */ DcmXfer oxferSyn(oxfer); /* if the transfer syntax is one with explicit value representation */ /* this value's data type also has to be written to the stream. Do so */ /* and also write the length information to the stream. */ if (oxferSyn.isExplicitVR()) { /* Create an object that represents this object's data type */ DcmVR myvr(vr); /* get name of data type */ const char *vrname = myvr.getValidVRName(); /* write data type name to the stream (a total of 2 bytes) */ outStream.write(vrname, 2); /* create another data type object on the basis of the above created object */ DcmVR outvr(myvr.getValidEVR()); /* in case we are dealing with a transfer syntax with explicit VR (see if above) */ /* and the actual VR uses extended length encoding (see DICOM standard (year 2000) */ /* part 5, section 7.1.2) (or the corresponding section in a later version of the */ /* standard) we have to add 2 reserved bytes (set to a value of 00H) to the data */ /* type field and the actual length field is 4 bytes wide. Write the corresponding */ /* information to the stream. */ if (outvr.usesExtendedLengthEncoding()) { Uint16 reserved = 0; outStream.write(&reserved, 2); // write 2 reserved bytes to stream } } } /* return result */ return l_error; } OFCondition DcmSequenceOfItems::writeSignatureFormat(DcmOutputStream &outStream, const E_TransferSyntax oxfer, const E_EncodingType enctype, DcmWriteCache *wcache) { if (getTransferState() == ERW_notInitialized) errorFlag = EC_IllegalCall; else { errorFlag = outStream.status(); if (errorFlag.good() && (getTransferState() != ERW_ready)) { if (getTransferState() == ERW_init) { /* first compare with DCM_TagInfoLength (12). If there is not enough space * in the buffer, check if the buffer is still sufficient for the requirements * of this element, which may need only 8 instead of 12 bytes. */ if ((outStream.avail() >= DCM_TagInfoLength) || (outStream.avail() >= getTagAndLengthSize(oxfer))) { if (enctype == EET_ExplicitLength) setLengthField(getLength(oxfer, enctype)); else setLengthField(DCM_UndefinedLength); errorFlag = writeTagAndVR(outStream, getTag(), getVR(), oxfer); /* we don't write the sequence length */ if (errorFlag.good()) { setTransferState(ERW_inWork); itemList->seek(ELP_first); } } else errorFlag = EC_StreamNotifyClient; } if (getTransferState() == ERW_inWork) { // itemList->get() can be NULL if buffer was full after // writing the last item but before writing the sequence delimitation. if (!itemList->empty() && (itemList->get() != NULL)) { DcmObject *dO; do { dO = itemList->get(); if (dO->transferState() != ERW_ready) errorFlag = dO->writeSignatureFormat(outStream, oxfer, enctype, wcache); } while (errorFlag.good() && itemList->seek(ELP_next)); } if (errorFlag.good()) { setTransferState(ERW_ready); /* we always write a sequence delimitation item tag, but no length */ if (outStream.avail() >= 4) { // write sequence delimitation item DcmTag delim(DCM_SequenceDelimitationItem); errorFlag = writeTag(outStream, delim, oxfer); } else { // Every subelement of the item was written but it // is not possible to write the delimination item // into the buffer. setTransferState(ERW_inWork); errorFlag = EC_StreamNotifyClient; } } } } } return errorFlag; } // ******************************** void DcmSequenceOfItems::transferInit() { DcmObject::transferInit(); fStartPosition = 0; lastItemComplete = OFTrue; if (!itemList->empty()) { itemList->seek(ELP_first); do { itemList->get()->transferInit(); } while (itemList->seek(ELP_next)); } } // ******************************** void DcmSequenceOfItems::transferEnd() { DcmObject::transferEnd(); if (!itemList->empty()) { itemList->seek(ELP_first); do { itemList->get()->transferEnd(); } while (itemList->seek(ELP_next)); } } // ******************************** unsigned long DcmSequenceOfItems::card() { return itemList->card(); } // ******************************** OFCondition DcmSequenceOfItems::prepend(DcmItem *item) { errorFlag = EC_Normal; if (item != NULL) itemList->prepend(item); else errorFlag = EC_IllegalCall; return errorFlag; } // ******************************** OFCondition DcmSequenceOfItems::insert(DcmItem *item, unsigned long where, OFBool before) { errorFlag = EC_Normal; if (item != NULL) { itemList->seek_to(where); // insert before or after "where" E_ListPos whichSide = (before) ? (ELP_prev) : (ELP_next); itemList->insert(item, whichSide); if (where == DCM_EndOfListIndex) { DCMDATA_TRACE("DcmSequenceOfItems::insert() Item inserted " << (before ? "before" : "after") << " last position"); } else { DCMDATA_TRACE("DcmSequenceOfItems::insert() Item inserted " << (before ? "before" : "after") << " position " << where); } } else errorFlag = EC_IllegalCall; return errorFlag; } // ******************************** OFCondition DcmSequenceOfItems::insertAtCurrentPos(DcmItem* item, OFBool before) { errorFlag = EC_Normal; if (item != NULL) { // insert before or after current position E_ListPos whichSide = (before) ? (ELP_prev) : (ELP_next); itemList->insert(item, whichSide); } else errorFlag = EC_IllegalCall; return errorFlag; } // ******************************** OFCondition DcmSequenceOfItems::append(DcmItem *item) { errorFlag = EC_Normal; if (item != NULL) itemList->append(item); else errorFlag = EC_IllegalCall; return errorFlag; } // ******************************** DcmItem* DcmSequenceOfItems::getItem(const unsigned long num) { errorFlag = EC_Normal; DcmItem *item; item = OFstatic_cast(DcmItem *, itemList->seek_to(num)); // read item from list if (item == NULL) errorFlag = EC_IllegalCall; return item; } // ******************************** DcmObject *DcmSequenceOfItems::nextInContainer(const DcmObject *obj) { if (!obj) return itemList->get(ELP_first); else { if (itemList->get() != obj) { for (DcmObject *search_obj = itemList -> seek(ELP_first); search_obj && (search_obj != obj); search_obj = itemList -> seek(ELP_next) ) { /* do nothing */ } } return itemList -> seek(ELP_next); } } // ******************************** OFCondition DcmSequenceOfItems::nextObject(DcmStack &stack, const OFBool intoSub) { OFCondition l_error = EC_Normal; DcmObject *container = NULL; DcmObject *obj = NULL; DcmObject *result = NULL; OFBool examSub = intoSub; if (stack.empty()) { stack.push(this); examSub = OFTrue; } obj = stack.top(); if (obj->isLeaf() || !intoSub) { stack.pop(); if (stack.card() > 0) { container = stack.top(); result = container -> nextInContainer(obj); } } else if (examSub) result = obj -> nextInContainer(NULL); if (result) stack.push(result); else if (intoSub) l_error = nextUp(stack); else l_error = EC_SequEnd; return l_error; } // ******************************** DcmItem *DcmSequenceOfItems::remove(const unsigned long num) { errorFlag = EC_Normal; DcmItem *item; item = OFstatic_cast(DcmItem *, itemList->seek_to(num)); // read item from list if (item != NULL) itemList->remove(); else errorFlag = EC_IllegalCall; return item; } // ******************************** DcmItem *DcmSequenceOfItems::remove(DcmItem *item) { DcmItem *retItem = NULL; errorFlag = EC_IllegalCall; if (!itemList->empty() && (item != NULL)) { DcmObject *dO; itemList->seek(ELP_first); do { dO = itemList->get(); if (dO == item) { itemList->remove(); // removes element from list but does not delete it errorFlag = EC_Normal; break; } } while (itemList->seek(ELP_next)); } if (errorFlag == EC_IllegalCall) retItem = NULL; else retItem = item; return retItem; } // ******************************** OFCondition DcmSequenceOfItems::clear() { errorFlag = EC_Normal; // remove all items from sequence and delete them from memory itemList->deleteAllElements(); setLengthField(0); return errorFlag; } OFBool DcmSequenceOfItems::isEmpty(const OFBool /*normalize*/) { return itemList->empty(); } // ******************************** OFCondition DcmSequenceOfItems::verify(const OFBool autocorrect) { errorFlag = EC_Normal; if (!itemList->empty()) { DcmObject *dO; itemList->seek(ELP_first); do { dO = itemList->get(); if (dO->verify(autocorrect).bad()) errorFlag = EC_CorruptedData; } while (itemList->seek(ELP_next)); } if (autocorrect == OFTrue) setLengthField(getLength()); return errorFlag; } /* * precondition: itemList not empty. * result: * - element pointer on resultStack if return value is EC_Normal * - unmodified resultStack if return value is EC_TagNotFound * continue search: push pointer to sub-element onto resultStack and start sub-search */ OFCondition DcmSequenceOfItems::searchSubFromHere(const DcmTagKey &tag, DcmStack &resultStack, const OFBool searchIntoSub) { DcmObject *dO; OFCondition l_error = EC_TagNotFound; if (!itemList->empty()) { itemList->seek(ELP_first); do { dO = itemList->get(); if (searchIntoSub) { resultStack.push(dO); if (tag == dO->getTag()) l_error = EC_Normal; else l_error = dO->search(tag, resultStack, ESM_fromStackTop, OFTrue); if (l_error.bad()) resultStack.pop(); } else { if (tag == dO->getTag()) { resultStack.push(dO); l_error = EC_Normal; } } } while (l_error.bad() && itemList->seek(ELP_next)); } return l_error; } // ******************************** OFCondition DcmSequenceOfItems::search(const DcmTagKey &tag, DcmStack &resultStack, E_SearchMode mode, OFBool searchIntoSub) { DcmObject *dO = NULL; OFCondition l_error = EC_TagNotFound; if ((mode == ESM_afterStackTop) && (resultStack.top() == this)) { l_error = searchSubFromHere(tag, resultStack, searchIntoSub); } else if (!itemList->empty()) { if ((mode == ESM_fromHere) || resultStack.empty()) { resultStack.clear(); l_error = searchSubFromHere(tag, resultStack, searchIntoSub); } else if (mode == ESM_fromStackTop) { dO = resultStack.top(); if (dO == this) l_error = searchSubFromHere(tag, resultStack, searchIntoSub); else { // continue directly in sub-tree l_error = dO->search(tag, resultStack, mode, searchIntoSub); // The next two lines destroy the stack, delete them // if (l_error.bad()) // resultStack.pop(); } } else if ((mode == ESM_afterStackTop) && searchIntoSub) { // resultStack contains additional information: // - restore state of the last search in each search routine // - find position of dO in tree structure // 1. search for own stack entry // - in case of failure terminate search // 2. take next upper entry dnO // 3. set own list to position of dnO // 4. restart search from dnO unsigned long i = resultStack.card(); while ((i > 0) && ((dO = resultStack.elem(i-1)) != this)) { i--; } if ((dO != this) && (resultStack.card() > 0)) { // highest level is never in resultStack i = resultStack.card()+1; // now points to highest level +1 dO = this; // match in highest level } if (dO == this) { if (i == 1) // resultStack.top() found l_error = EC_TagNotFound; // don't mark as match, see above else { E_SearchMode submode = mode; OFBool searchNode = OFTrue; DcmObject *dnO; dnO = resultStack.elem(i-2); // node of next level itemList->seek(ELP_first); do { dO = itemList->get(); searchNode = searchNode ? (dO != dnO) : OFFalse; if (!searchNode) { // continue search if (submode == ESM_fromStackTop) resultStack.push(dO); // update stack if ((submode == ESM_fromStackTop) && (tag == dO->getTag())) l_error = EC_Normal; else l_error = dO->search(tag, resultStack, submode, OFTrue); if (l_error.bad()) resultStack.pop(); else break; submode = ESM_fromStackTop; // normal search from here } } while (itemList->seek(ELP_next)); } } else // probably never reached l_error = EC_IllegalCall; } // (mode == ESM_afterStackTop else l_error = EC_IllegalCall; } return l_error; } // ******************************** OFCondition DcmSequenceOfItems::loadAllDataIntoMemory() { OFCondition l_error = EC_Normal; if (!itemList->empty()) { itemList->seek(ELP_first); do { OFCondition err = EC_Normal; DcmObject *dO = itemList->get(); if ((err = dO->loadAllDataIntoMemory()).bad()) l_error = err; } while (itemList->seek(ELP_next)); } return l_error; } // ******************************** OFBool DcmSequenceOfItems::isSignable() const { // a sequence is signable if the tag and VR doesn't prevent signing // and if none of the items contains a UN element return DcmElement::isSignable() && !containsUnknownVR(); } OFBool DcmSequenceOfItems::containsUnknownVR() const { if (!itemList->empty()) { itemList->seek(ELP_first); do { if (itemList->get()->containsUnknownVR()) return OFTrue; } while (itemList->seek(ELP_next)); } return OFFalse; } OFBool DcmSequenceOfItems::containsExtendedCharacters(const OFBool checkAllStrings) { if (!itemList->empty()) { itemList->seek(ELP_first); do { if (itemList->get()->containsExtendedCharacters(checkAllStrings)) return OFTrue; } while (itemList->seek(ELP_next)); } return OFFalse; } OFBool DcmSequenceOfItems::isAffectedBySpecificCharacterSet() const { if (!itemList->empty()) { itemList->seek(ELP_first); do { if (itemList->get()->isAffectedBySpecificCharacterSet()) return OFTrue; } while (itemList->seek(ELP_next)); } return OFFalse; } OFCondition DcmSequenceOfItems::getPartialValue(void * /* targetBuffer */, const Uint32 /* offset */, Uint32 /* numBytes */, DcmFileCache * /* cache */, E_ByteOrder /* byteOrder */) { // cannot use getPartialValue() with class DcmSequenceOfItems or derived classes return EC_IllegalCall; } /* ** CVS/RCS Log: ** $Log: dcsequen.cc,v $ ** Revision 1.94 2010-11-01 10:42:44 uli ** Fixed some compiler warnings reported by gcc with additional flags. ** ** Revision 1.93 2010-10-20 16:44:17 joergr ** Use type cast macros (e.g. OFstatic_cast) where appropriate. ** ** Revision 1.92 2010-10-14 13:14:09 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.91 2010-04-23 14:33:57 joergr ** Added new method to all VR classes which checks whether the stored value ** conforms to the VR definition and to the specified VM. ** ** Revision 1.90 2010-03-25 16:28:40 joergr ** Added check for errors during while loop in computeGroupLengthAndPadding(). ** ** Revision 1.89 2010-03-24 11:56:36 onken ** Fixed memory leak in assignment operators of DcmItem and DcmSequenceOfItems. ** Replaced all code occurences of cleaning all elements from internal lists to ** newly introduced function in DcmList. ** ** Revision 1.88 2010-03-03 14:30:28 joergr ** Output return value of readTagAndLength() to the log only in case of error. ** Use return value of getTag() for stream output where possible. ** ** Revision 1.87 2009-12-04 16:54:17 joergr ** Moved some log messages from debug to trace level. ** Sightly modified some log messages. ** ** Revision 1.86 2009-11-13 13:11:21 joergr ** Fixed minor issues in log output. ** ** Revision 1.85 2009-11-04 09:58:10 uli ** Switched to logging mechanism provided by the "new" oflog module ** ** Revision 1.84 2009-08-07 14:35:49 joergr ** Enhanced isEmpty() method by checking whether the data element value consists ** of non-significant characters only. ** ** Revision 1.83 2009-03-25 10:21:22 joergr ** Added new method isEmpty() to DICOM object, item and sequence class. ** ** Revision 1.82 2009-03-05 14:08:05 onken ** Fixed typo. ** ** Revision 1.81 2009-03-05 13:35:07 onken ** Added checks for sequence and item lengths which prevents overflow in length ** field, if total length of contained items (or sequences) exceeds 32-bit ** length field. Also introduced new flag (default: enabled) for writing ** in explicit length mode, which allows for automatically switching encoding ** of only that very sequence/item to undefined length coding (thus permitting ** to actually write the file). ** ** Revision 1.80 2009-02-04 17:57:19 joergr ** Fixes various type mismatches reported by MSVC introduced with OFFile class. ** ** Revision 1.79 2009-02-04 14:04:18 onken ** Removed German comment and removed "magic number". ** ** Revision 1.78 2009-01-06 16:27:03 joergr ** Reworked print() output format for option PF_showTreeStructure. ** ** Revision 1.77 2008-12-12 11:44:41 onken ** Moved path access functions to separate classes ** ** Revision 1.76 2008-12-05 13:51:13 onken ** Introduced new error code number for specific findOrCreatePath() errors. ** ** Revision 1.75 2008-12-05 13:28:01 onken ** Splitted findOrCreatePath() function API for also offering a simple API ** for non-wildcard searches. ** ** Revision 1.74 2008-12-04 16:54:54 onken ** Changed findOrCreatePath() to also support wildcard as item numbers. ** ** Revision 1.73 2008-10-15 12:31:24 onken ** Added findOrCreatePath() functions which allow for finding or creating a ** hierarchy of sequences, items and attributes according to a given "path" ** string. ** ** Revision 1.72 2008-07-17 10:36:38 onken ** *** empty log message *** ** ** Revision 1.71 2008-07-17 10:31:32 onken ** Implemented copyFrom() method for complete DcmObject class hierarchy, which ** permits setting an instance's value from an existing object. Implemented ** assignment operator where necessary. ** ** Revision 1.70 2007-11-29 14:30:21 meichel ** Write methods now handle large raw data elements (such as pixel data) ** without loading everything into memory. This allows very large images to ** be sent over a network connection, or to be copied without ever being ** fully in memory. ** ** Revision 1.69 2007/11/23 15:42:36 meichel ** Copy assignment operators in dcmdata now safe for self assignment ** ** Revision 1.68 2007/06/29 14:17:49 meichel ** Code clean-up: Most member variables in module dcmdata are now private, ** not protected anymore. ** ** Revision 1.67 2007/02/19 15:04:16 meichel ** Removed searchErrors() methods that are not used anywhere and added ** error() methods only in the DcmObject subclasses where really used. ** ** Revision 1.66 2006/12/15 14:14:44 joergr ** Added new method that checks whether a DICOM object or element is affected ** by SpecificCharacterSet (0008,0005). ** ** Revision 1.65 2006/12/13 13:59:49 joergr ** Added new optional parameter "checkAllStrings" to method containsExtended ** Characters(). ** ** Revision 1.64 2006/08/15 15:49:54 meichel ** Updated all code in module dcmdata to correctly compile when ** all standard C++ classes remain in namespace std. ** ** Revision 1.63 2006/05/30 15:00:19 joergr ** Added missing method containsExtendedCharacters(). ** ** Revision 1.62 2006/05/11 08:51:05 joergr ** Added new option that allows to omit the element name in the XML output. ** ** Revision 1.61 2005/12/08 15:41:36 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.60 2005/11/28 15:53:13 meichel ** Renamed macros in dcdebug.h ** ** Revision 1.59 2005/11/15 18:28:04 meichel ** Added new global flag dcmEnableUnknownVRConversion that enables the automatic ** re-conversion of defined length UN elements read in an explicit VR transfer ** syntax, if the real VR is defined in the data dictionary. Default is OFFalse, ** i.e. to retain the previous behavior. ** ** Revision 1.58 2005/11/07 16:59:26 meichel ** Cleaned up some copy constructors in the DcmObject hierarchy. ** ** Revision 1.57 2005/05/10 15:27:18 meichel ** Added support for reading UN elements with undefined length according ** to CP 246. The global flag dcmEnableCP246Support allows to revert to the ** prior behaviour in which UN elements with undefined length were parsed ** like a normal explicit VR SQ element. ** ** Revision 1.56 2004/04/27 09:21:27 wilkens ** Fixed a bug in dcelem.cc which occurs when one is serializing a dataset ** (that contains an attribute whose length value is coded with 2 bytes) into ** a given buffer. Although the number of available bytes in the buffer was ** sufficient, the dataset->write(...) method would always return ** EC_StreamNotifyClient to indicate that there are not sufficient bytes ** available in the buffer. This code modification fixes the problem. ** ** Revision 1.55 2004/01/16 13:49:31 joergr ** Removed acknowledgements with e-mail addresses from CVS log. ** ** Revision 1.54 2003/10/15 16:55:43 meichel ** Updated error messages for parse errors ** ** Revision 1.53 2003/08/08 13:32:18 joergr ** Added new method insertAtCurrentPos() which allows for a much more efficient ** insertion (avoids re-searching for the correct position). ** Adapted type casts to new-style typecast operators defined in ofcast.h. ** Translated remaining German comments. ** ** Revision 1.52 2003/01/06 09:29:48 joergr ** Performed minor text corrections to get a more consistent print() output. ** ** Revision 1.51 2002/12/10 20:03:01 joergr ** Added curly brackets around debug() call to avoid compiler errors with gcc ** 2.9.5 in debug mode. ** ** Revision 1.50 2002/12/06 13:16:59 joergr ** Enhanced "print()" function by re-working the implementation and replacing ** the boolean "showFullData" parameter by a more general integer flag. ** Made source code formatting more consistent with other modules/files. ** ** Revision 1.49 2002/11/27 12:06:51 meichel ** Adapted module dcmdata to use of new header file ofstdinc.h ** ** Revision 1.48 2002/08/27 16:55:56 meichel ** Initial release of new DICOM I/O stream classes that add support for stream ** compression (deflated little endian explicit VR transfer syntax) ** ** Revision 1.47 2002/07/08 14:44:41 meichel ** Improved dcmdata behaviour when reading odd tag length. Depending on the ** global boolean flag dcmAcceptOddAttributeLength, the parser now either accepts ** odd length attributes or implements the old behaviour, i.e. assumes a real ** length larger by one. ** ** Revision 1.46 2002/04/25 10:26:10 joergr ** Added support for XML output of DICOM objects. ** ** Revision 1.45 2002/04/16 13:43:20 joergr ** Added configurable support for C++ ANSI standard includes (e.g. streams). ** ** Revision 1.44 2002/03/15 13:58:39 meichel ** Fixed incorrect debug message. ** ** Revision 1.43 2001/11/16 15:55:04 meichel ** Adapted digital signature code to final text of supplement 41. ** ** Revision 1.42 2001/09/28 14:21:06 joergr ** Added "#include " to keep gcc 3.0 quiet. ** ** Revision 1.41 2001/09/26 15:49:30 meichel ** Modified debug messages, required by OFCondition ** ** Revision 1.40 2001/09/25 17:19:53 meichel ** Adapted dcmdata to class OFCondition ** ** Revision 1.39 2001/06/01 15:49:08 meichel ** Updated copyright header ** ** Revision 1.38 2001/05/10 12:46:28 meichel ** Fixed memory leak that occured when parsing of a sequence failed. ** ** Revision 1.37 2001/05/03 08:15:23 meichel ** Fixed bug in dcmdata sequence handling code that could lead to application ** failure in rare cases during parsing of a correct DICOM dataset. ** ** Revision 1.36 2000/11/07 16:56:22 meichel ** Initial release of dcmsign module for DICOM Digital Signatures ** ** Revision 1.35 2000/04/14 15:55:07 meichel ** Dcmdata library code now consistently uses ofConsole for error output. ** ** Revision 1.34 2000/03/08 16:26:40 meichel ** Updated copyright header. ** ** Revision 1.33 2000/03/03 15:02:11 joergr ** Corrected bug related to padding of file and item size. ** ** Revision 1.32 2000/03/03 14:05:36 meichel ** Implemented library support for redirecting error messages into memory ** instead of printing them to stdout/stderr for GUI applications. ** ** Revision 1.31 2000/02/23 15:12:01 meichel ** Corrected macro for Borland C++ Builder 4 workaround. ** ** Revision 1.30 2000/02/10 10:52:22 joergr ** Added new feature to dcmdump (enhanced print method of dcmdata): write ** pixel data/item value fields to raw files. ** ** Revision 1.29 2000/02/03 16:29:40 joergr ** Corrected bug that caused wrong calculation of group length for sequence ** of items (e.g. encapsulated pixel data). ** ** Revision 1.28 2000/02/01 10:12:10 meichel ** Avoiding to include as extern "C" on Borland C++ Builder 4, ** workaround for bug in compiler header files. ** ** Revision 1.27 1999/03/31 09:25:38 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.26 1998/11/12 16:48:20 meichel ** Implemented operator= for all classes derived from DcmObject. ** ** Revision 1.25 1998/07/15 15:52:06 joergr ** Removed several compiler warnings reported by gcc 2.8.1 with ** additional options, e.g. missing copy constructors and assignment ** operators, initialization of member variables in the body of a ** constructor instead of the member initialization list, hiding of ** methods by use of identical names, uninitialized member variables, ** missing const declaration of char pointers. Replaced tabs by spaces. ** ** Revision 1.24 1998/01/27 10:49:26 meichel ** Minor bug corrections (string too short, incorrect return value). ** ** Revision 1.23 1997/09/12 13:44:54 meichel ** The algorithm introduced on 97.08.28 to detect incorrect odd-length ** value fields falsely reported undefined length sequences and items ** to be wrong. Corrected. ** ** Revision 1.22 1997/08/29 07:53:24 andreas ** - New error messages if length of an element is odd. Previously, no ** error was reported. But the length is corrected by the method ** newValueField and so it was impossible for a checking utility to find ** such an error in DICOM objects. ** ** Revision 1.21 1997/07/21 08:25:29 andreas ** - Replace all boolean types (BOOLEAN, CTNBOOLEAN, DICOM_BOOL, BOOL) ** with one unique boolean type OFBool. ** ** Revision 1.20 1997/07/07 07:46:20 andreas ** - Changed parameter type DcmTag & to DcmTagKey & in all search functions ** in DcmItem, DcmSequenceOfItems, DcmDirectoryRecord and DcmObject ** - Enhanced (faster) byte swapping routine. swapIfNecessary moved from ** a method in DcmObject to a general function. ** ** Revision 1.19 1997/07/03 15:10:04 andreas ** - removed debugging functions Bdebug() and Edebug() since ** they write a static array and are not very useful at all. ** Cdebug and Vdebug are merged since they have the same semantics. ** The debugging functions in dcmdata changed their interfaces ** (see dcmdata/include/dcdebug.h) ** ** Revision 1.18 1997/06/06 09:55:31 andreas ** - corrected error: canWriteXfer returns false if the old transfer syntax ** was unknown, which causes several applications to prohibit the writing ** of dataset. ** ** Revision 1.17 1997/05/30 06:45:45 andreas ** - fixed problem of inconsistent interfaces and implementation that the ** syntax check of GNU C++ does not find. ** ** Revision 1.16 1997/05/27 13:49:02 andreas ** - Add method canWriteXfer to class DcmObject and all derived classes. ** This method checks whether it is possible to convert the original ** transfer syntax to an new transfer syntax. The check is used in the ** dcmconv utility to prohibit the change of a compressed transfer ** syntax to a uncompressed. ** ** Revision 1.15 1997/05/16 08:23:55 andreas ** - Revised handling of GroupLength elements and support of ** DataSetTrailingPadding elements. The enumeratio E_GrpLenEncoding ** got additional enumeration values (for a description see dctypes.h). ** addGroupLength and removeGroupLength methods are replaced by ** computeGroupLengthAndPadding. To support Padding, the parameters of ** element and sequence write functions changed. ** - Added a new method calcElementLength to calculate the length of an ** element, item or sequence. For elements it returns the length of ** tag, length field, vr field, and value length, for item and ** sequences it returns the length of the whole item. sequence including ** the Delimitation tag (if appropriate). It can never return ** UndefinedLength. ** ** Revision 1.14 1997/04/24 12:11:49 hewett ** Fixed DICOMDIR generation bug affecting ordering of ** patient/study/series/image records (item insertion into a sequence ** did produce the expected ordering). ** ** Revision 1.13 1997/04/18 08:08:54 andreas ** - Corrected debugging code ** ** Revision 1.12 1996/09/13 12:04:13 hewett ** Corrected missing () in function call (stack.card()) used in nextObject(...) ** ** Revision 1.11 1996/08/08 10:15:10 andreas ** Some more testing in nextObject ** ** Revision 1.10 1996/08/08 10:06:24 andreas ** Correct error for intoSub=OFFalse ** ** Revision 1.9 1996/08/05 08:46:17 andreas ** new print routine with additional parameters: ** - print into files ** - fix output length for elements ** corrected error in search routine with parameter ESM_fromStackTop ** ** Revision 1.8 1996/07/31 13:14:32 andreas ** - Minor corrections: error code for swapping to or from byteorder unknown ** correct read of dataset in fileformat ** ** Revision 1.7 1996/07/17 12:39:40 andreas ** new nextObject for DcmDataSet, DcmFileFormat, DcmItem, ... ** ** Revision 1.6 1996/06/19 13:54:10 andreas ** - correct error when reading big sequences with little buffers from net ** ** Revision 1.5 1996/01/29 13:38:29 andreas ** - new put method for every VR to put value as a string ** - better and unique print methods ** ** Revision 1.4 1996/01/09 11:06:48 andreas ** New Support for Visual C++ ** Correct problems with inconsistent const declarations ** Correct error in reading Item Delimitation Elements ** ** Revision 1.3 1996/01/05 13:27:41 andreas ** - changed to support new streaming facilities ** - unique read/write methods for file and block transfer ** - more cleanups ** */ dcmtk-3.6.0/dcmdata/libsrc/dctypes.cc0000644000310500011400000000651411462524221016701 0ustar joergrdicom3/* * * Copyright (C) 2002-2010, 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: dcmdata * * Author: Joerg Riesmeier * * Purpose: global type and constant definitions * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-29 10:57:21 $ * CVS/RCS Revision: $Revision: 1.13 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" #include "dcmtk/dcmdata/dctypes.h" OFLogger DCM_dcmdataGetLogger() { // We don't just use a global variable, because constructors of globals are // executed in random order. This guarantees that the OFLogger is constructed // before first use. static OFLogger DCM_dcmdataLogger = OFLog::getLogger("dcmtk.dcmdata"); return DCM_dcmdataLogger; } /* print flags */ const size_t DCMTypes::PF_shortenLongTagValues = 1 << 0; const size_t DCMTypes::PF_showTreeStructure = 1 << 1; const size_t DCMTypes::PF_doNotMapUIDsToNames = 1 << 2; const size_t DCMTypes::PF_convertToMarkup = 1 << 3; const size_t DCMTypes::PF_useANSIEscapeCodes = 1 << 4; /* writeXML flags */ const size_t DCMTypes::XF_addDocumentType = 1 << 0; const size_t DCMTypes::XF_writeBinaryData = 1 << 1; const size_t DCMTypes::XF_encodeBase64 = 1 << 2; const size_t DCMTypes::XF_useDcmtkNamespace = 1 << 3; const size_t DCMTypes::XF_embedDocumentType = 1 << 4; const size_t DCMTypes::XF_omitDataElementName = 1 << 5; /* * CVS/RCS Log: * $Log: dctypes.cc,v $ * Revision 1.13 2010-10-29 10:57:21 joergr * Added support for colored output to the print() method. * * Revision 1.12 2010-10-14 13:14:09 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.11 2009-11-04 09:58:10 uli * Switched to logging mechanism provided by the "new" oflog module * * Revision 1.10 2009-01-06 16:27:07 joergr * Reworked print() output format for option PF_showTreeStructure. * * Revision 1.9 2008-04-28 09:22:41 meichel * New flag DCMTypes::PF_convertToMarkup causes DcmObject::print to * quote non-ASCII string content as XML markup * * Revision 1.8 2008-02-26 16:57:25 joergr * Added new print flag that disables the mapping of well-known UID numbers to * their associated names (e.g. transfer syntax or SOP class). * * Revision 1.7 2006/05/11 08:45:45 joergr * Added new option that allows to omit the element name in the XML output. * * Revision 1.6 2005/12/08 15:41:41 meichel * Changed include path schema for all DCMTK header files * * Revision 1.5 2003/04/22 08:19:24 joergr * Added new command line option which allows to embed the content of the DTD * instead of referencing the DTD file. * * Revision 1.4 2003/04/01 14:57:20 joergr * Added support for XML namespaces. * * Revision 1.3 2002/12/06 12:21:35 joergr * Enhanced "print()" function by re-working the implementation and replacing * the boolean "showFullData" parameter by a more general integer flag. * * Revision 1.2 2002/05/14 08:22:04 joergr * Added support for Base64 (MIME) encoded binary data. * * Revision 1.1 2002/04/25 10:13:12 joergr * Added support for XML output of DICOM objects. * * */ dcmtk-3.6.0/dcmdata/libsrc/dcvrdt.cc0000644000310500011400000004576411457616141016535 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Gerd Ehlers, Andreas Barth, Joerg Riesmeier * * Purpose: Implementation of class DcmDateTime * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-20 16:44:17 $ * CVS/RCS Revision: $Revision: 1.33 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcvrdt.h" #include "dcmtk/dcmdata/dcvrda.h" #include "dcmtk/dcmdata/dcvrtm.h" #include "dcmtk/ofstd/ofstring.h" #include "dcmtk/ofstd/ofstd.h" #define INCLUDE_CSTDIO #include "dcmtk/ofstd/ofstdinc.h" #define MAX_DT_LENGTH 26 // ******************************** DcmDateTime::DcmDateTime(const DcmTag &tag, const Uint32 len) : DcmByteString(tag, len) { setMaxLength(MAX_DT_LENGTH); setNonSignificantChars(" \\"); } DcmDateTime::DcmDateTime(const DcmDateTime &old) : DcmByteString(old) { } DcmDateTime::~DcmDateTime() { } DcmDateTime &DcmDateTime::operator=(const DcmDateTime &obj) { DcmByteString::operator=(obj); return *this; } OFCondition DcmDateTime::copyFrom(const DcmObject& rhs) { if (this != &rhs) { if (rhs.ident() != ident()) return EC_IllegalCall; *this = OFstatic_cast(const DcmDateTime &, rhs); } return EC_Normal; } // ******************************** DcmEVR DcmDateTime::ident() const { return EVR_DT; } OFCondition DcmDateTime::checkValue(const OFString &vm, const OFBool /*oldFormat*/) { OFString strVal; /* get "raw value" without any modifications (if possible) */ OFCondition l_error = getStringValue(strVal); if (l_error.good()) l_error = DcmDateTime::checkStringValue(strVal, vm); return l_error; } // ******************************** OFCondition DcmDateTime::getOFString(OFString &stringVal, const unsigned long pos, OFBool normalize) { OFCondition l_error = DcmByteString::getOFString(stringVal, pos, normalize); if (l_error.good() && normalize) normalizeString(stringVal, !MULTIPART, !DELETE_LEADING, DELETE_TRAILING); return l_error; } // ******************************** OFCondition DcmDateTime::getOFDateTime(OFDateTime &dateTimeValue, const unsigned long pos) { OFString dicomDateTime; /* convert the current element value to OFDateTime format */ OFCondition l_error = getOFString(dicomDateTime, pos); if (l_error.good()) l_error = getOFDateTimeFromString(dicomDateTime, dateTimeValue); else dateTimeValue.clear(); return l_error; } OFCondition DcmDateTime::getISOFormattedDateTime(OFString &formattedDateTime, const unsigned long pos, const OFBool seconds, const OFBool fraction, const OFBool timeZone, const OFBool createMissingPart) { /* call the real function, required to make Sun CC 2.0.1 happy (see header file) */ return getISOFormattedDateTime(formattedDateTime, pos, seconds, fraction, timeZone, createMissingPart, " " /*dateTimeSeparator*/); } OFCondition DcmDateTime::getISOFormattedDateTime(OFString &formattedDateTime, const unsigned long pos, const OFBool seconds, const OFBool fraction, const OFBool timeZone, const OFBool createMissingPart, const OFString &dateTimeSeparator) { OFString dicomDateTime; OFCondition l_error = getOFString(dicomDateTime, pos); if (l_error.good()) { l_error = getISOFormattedDateTimeFromString(dicomDateTime, formattedDateTime, seconds, fraction, timeZone, createMissingPart, dateTimeSeparator); } else formattedDateTime.clear(); return l_error; } OFCondition DcmDateTime::setCurrentDateTime(const OFBool seconds, const OFBool fraction, const OFBool timeZone) { OFString dicomDateTime; OFCondition l_error = getCurrentDateTime(dicomDateTime, seconds, fraction, timeZone); if (l_error.good()) l_error = putString(dicomDateTime.c_str()); return l_error; } OFCondition DcmDateTime::setOFDateTime(const OFDateTime &dateTimeValue) { OFString dicomDateTime; /* convert OFDateTime value to DICOM DT format and set the element value */ OFCondition l_error = getDicomDateTimeFromOFDateTime(dateTimeValue, dicomDateTime); if (l_error.good()) l_error = putString(dicomDateTime.c_str()); return l_error; } // ******************************** OFCondition DcmDateTime::getCurrentDateTime(OFString &dicomDateTime, const OFBool seconds, const OFBool fraction, const OFBool timeZone) { OFCondition l_error = EC_IllegalCall; OFDateTime dateTimeValue; /* get the current system time */ if (dateTimeValue.setCurrentDateTime()) { /* format: YYYYMMDDHHMM[SS[.FFFFFF]] */ if (dateTimeValue.getISOFormattedDateTime(dicomDateTime, seconds, fraction, timeZone, OFFalse /*showDelimiter*/)) l_error = EC_Normal; } /* set default date/time if an error occurred */ if (l_error.bad()) { /* format: YYYYMMDDHHMM */ dicomDateTime = "190001010000"; if (seconds) { /* format: SS */ dicomDateTime += "00"; if (fraction) { /* format: .FFFFFF */ dicomDateTime += ".000000"; } } if (timeZone) { /* format: CHHMM */ dicomDateTime += "+0000"; } } return l_error; } OFCondition DcmDateTime::getDicomDateTimeFromOFDateTime(const OFDateTime &dateTimeValue, OFString &dicomDateTime, const OFBool seconds, const OFBool fraction, const OFBool timeZone) { OFCondition l_error = EC_IllegalParameter; /* convert OFDateTime value to DICOM DT format */ if (dateTimeValue.getISOFormattedDateTime(dicomDateTime, seconds, fraction, timeZone, OFFalse /*showDelimiter*/)) l_error = EC_Normal; return l_error; } OFCondition DcmDateTime::getOFDateTimeFromString(const OFString &dicomDateTime, OFDateTime &dateTimeValue) { OFCondition l_error = EC_IllegalParameter; /* clear result variable */ dateTimeValue.clear(); /* minimal check for valid format: YYYYMMDD */ if (dicomDateTime.length() >= 8) { OFString string; unsigned int year, month, day; unsigned int hour = 0; unsigned int minute = 0; double second = 0; double timeZone = 0; /* check whether optional time zone is present and extract the value if so */ if (DcmTime::getTimeZoneFromString(dicomDateTime.substr(dicomDateTime.length() - 5), timeZone).good()) string = dicomDateTime.substr(0, dicomDateTime.length() - 5); else { string = dicomDateTime; /* no time zone specified, therefore, use the local one */ timeZone = OFTime::getLocalTimeZone(); } /* extract remaining components from date/time string: YYYYMMDDHHMM[SS[.FFFFFF]] */ /* scan seconds using OFStandard::atof to avoid locale issues */ if (sscanf(string.c_str(), "%04u%02u%02u%02u%02u", &year, &month, &day, &hour, &minute) >= 3) { if (string.length() > 12) { string.erase(0, 12); second = OFStandard::atof(string.c_str()); } if (dateTimeValue.setDateTime(year, month, day, hour, minute, second, timeZone)) l_error = EC_Normal; } } return l_error; } OFCondition DcmDateTime::getISOFormattedDateTimeFromString(const OFString &dicomDateTime, OFString &formattedDateTime, const OFBool seconds, const OFBool fraction, const OFBool timeZone, const OFBool createMissingPart) { return getISOFormattedDateTimeFromString(dicomDateTime, formattedDateTime, seconds, fraction, timeZone, createMissingPart, " " /*dateTimeSeparator*/); } OFCondition DcmDateTime::getISOFormattedDateTimeFromString(const OFString &dicomDateTime, OFString &formattedDateTime, const OFBool seconds, const OFBool fraction, const OFBool timeZone, const OFBool createMissingPart, const OFString &dateTimeSeparator) { OFCondition l_error = EC_IllegalParameter; const size_t length = dicomDateTime.length(); /* minimum DT format: YYYYMMDD */ if (length >= 8) { OFString timeString; OFDate dateValue; /* get formatted date: YYYY-MM-DD */ l_error = DcmDate::getOFDateFromString(dicomDateTime.substr(0, 8), dateValue, OFFalse /*supportOldFormat*/); if (l_error.good()) { dateValue.getISOFormattedDate(formattedDateTime); /* get formatted time: [HH[:MM[:SS[.FFFFFF]]]] */ const size_t posSign = dicomDateTime.find_first_of("+-", 8); OFString dicomTime = (posSign != OFString_npos) ? dicomDateTime.substr(8, posSign - 8) : dicomDateTime.substr(8); l_error = DcmTime::getISOFormattedTimeFromString(dicomTime, timeString, seconds, fraction, createMissingPart, OFFalse /*supportOldFormat*/); if (l_error.good()) { /* add time string with separator */ formattedDateTime += dateTimeSeparator; formattedDateTime += timeString; /* add optional time zone: [+/-HH:MM] */ if (timeZone) { /* check whether optional time zone is present: &ZZZZ */ if ((posSign != OFString_npos) && (length >= posSign + 5)) { formattedDateTime += " "; formattedDateTime += dicomDateTime[posSign]; formattedDateTime += dicomDateTime.substr(posSign + 1, 2); formattedDateTime += ":"; formattedDateTime += dicomDateTime.substr(posSign + 3, 2); } else if (createMissingPart) formattedDateTime += " +00:00"; } } } } if (l_error.bad()) formattedDateTime.clear(); return l_error; } // ******************************** OFCondition DcmDateTime::checkStringValue(const OFString &value, const OFString &vm) { OFCondition result = EC_Normal; const size_t valLen = value.length(); if (valLen > 0) { size_t posStart = 0; unsigned long vmNum = 0; /* iterate over all value components */ while (posStart != OFString_npos) { ++vmNum; /* search for next component separator */ const size_t posEnd = value.find('\\', posStart); const size_t length = (posEnd == OFString_npos) ? valLen - posStart : posEnd - posStart; /* check length of current value component */ if (length > MAX_DT_LENGTH) { result = EC_MaximumLengthViolated; break; } else { /* check value representation */ const int vrID = DcmElement::scanValue(value, "dt", posStart, length); if ((vrID != 7) && (vrID != 18)) { result = EC_ValueRepresentationViolated; break; } } posStart = (posEnd == OFString_npos) ? posEnd : posEnd + 1; } if (result.good() && !vm.empty()) { /* check value multiplicity */ result = DcmElement::checkVM(vmNum, vm); } } return result; } /* ** CVS/RCS Log: ** $Log: dcvrdt.cc,v $ ** Revision 1.33 2010-10-20 16:44:17 joergr ** Use type cast macros (e.g. OFstatic_cast) where appropriate. ** ** Revision 1.32 2010-10-14 13:14:10 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.31 2010-04-23 14:30:34 joergr ** Added new method to all VR classes which checks whether the stored value ** conforms to the VR definition and to the specified VM. ** ** Revision 1.30 2009-08-07 14:35:49 joergr ** Enhanced isEmpty() method by checking whether the data element value consists ** of non-significant characters only. ** ** Revision 1.29 2009-08-03 09:03:00 joergr ** Added methods that check whether a given string value conforms to the VR and ** VM definitions of the DICOM standards. ** ** Revision 1.28 2008-07-17 10:31:32 onken ** Implemented copyFrom() method for complete DcmObject class hierarchy, which ** permits setting an instance's value from an existing object. Implemented ** assignment operator where necessary. ** ** Revision 1.27 2007-06-29 14:17:49 meichel ** Code clean-up: Most member variables in module dcmdata are now private, ** not protected anymore. ** ** Revision 1.26 2005/12/08 15:41:51 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.25 2004/04/16 12:50:45 joergr ** Restructured code to avoid default parameter values for "complex types" like ** OFString. Required for Sun CC 2.0.1. ** ** Revision 1.24 2004/01/16 13:55:40 joergr ** Introduced new parameter "dateTimeSeparator" in getISOFormattedXXX() methods ** to support ISO 8601 as format required by XML Schema type "dateTime". ** ** Revision 1.23 2002/12/06 13:20:50 joergr ** Enhanced "print()" function by re-working the implementation and replacing ** the boolean "showFullData" parameter by a more general integer flag. ** Made source code formatting more consistent with other modules/files. ** ** Revision 1.22 2002/11/27 12:06:56 meichel ** Adapted module dcmdata to use of new header file ofstdinc.h ** ** Revision 1.21 2002/08/27 16:55:59 meichel ** Initial release of new DICOM I/O stream classes that add support for stream ** compression (deflated little endian explicit VR transfer syntax) ** ** Revision 1.20 2002/06/20 12:06:17 meichel ** Changed toolkit to use OFStandard::atof instead of atof, strtod or ** sscanf for all string to double conversions that are supposed to ** be locale independent ** ** Revision 1.19 2002/04/25 10:29:13 joergr ** Removed getOFStringArray() implementation. ** ** Revision 1.18 2002/04/11 12:31:34 joergr ** Enhanced DICOM date, time and date/time classes. Added support for new ** standard date and time functions. ** ** Revision 1.17 2001/12/19 09:59:31 meichel ** Added prototype declaration for gettimeofday() for systems like Ultrix ** where the function is known but no prototype present in the system headers. ** ** Revision 1.16 2001/12/18 10:42:24 meichel ** Added typecasts to avoid warning on gcc 2.95.3 on OSF/1 (Alpha) ** ** Revision 1.15 2001/11/01 16:16:00 meichel ** Including if present, needed on Linux. ** ** Revision 1.14 2001/10/10 15:21:33 joergr ** Added new flag to date/time routines allowing to choose whether the old ** prior V3.0 format for the corresponding DICOM VRs is supported or not. ** ** Revision 1.13 2001/10/04 10:16:58 joergr ** Adapted new time/date routines to Windows systems. ** ** Revision 1.12 2001/10/01 15:04:44 joergr ** Introduced new general purpose functions to get/set person names, date, time ** and date/time. ** ** Revision 1.11 2001/09/25 17:19:56 meichel ** Adapted dcmdata to class OFCondition ** ** Revision 1.10 2001/06/01 15:49:16 meichel ** Updated copyright header ** ** Revision 1.9 2000/03/08 16:26:46 meichel ** Updated copyright header. ** ** Revision 1.8 1999/03/31 09:25:50 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.7 1998/11/12 16:48:24 meichel ** Implemented operator= for all classes derived from DcmObject. ** ** Revision 1.6 1997/08/29 13:11:45 andreas ** Corrected Bug in getOFStringArray Implementation ** ** Revision 1.5 1997/08/29 08:32:57 andreas ** - Added methods getOFString and getOFStringArray for all ** string VRs. These methods are able to normalise the value, i. e. ** to remove leading and trailing spaces. This will be done only if ** it is described in the standard that these spaces are not relevant. ** These methods do not test the strings for conformance, this means ** especially that they do not delete spaces where they are not allowed! ** getOFStringArray returns the string with all its parts separated by \ ** and getOFString returns only one value of the string. ** CAUTION: Currently getString returns a string with trailing ** spaces removed (if dcmEnableAutomaticInputDataCorrection == OFTrue) and ** truncates the original string (since it is not copied!). If you rely on this ** behaviour please change your application now. ** Future changes will ensure that getString returns the original ** string from the DICOM object (NULL terminated) inclusive padding. ** Currently, if you call getOF... before calling getString without ** normalisation, you can get the original string read from the DICOM object. ** ** Revision 1.4 1997/07/03 15:10:11 andreas ** - removed debugging functions Bdebug() and Edebug() since ** they write a static array and are not very useful at all. ** Cdebug and Vdebug are merged since they have the same semantics. ** The debugging functions in dcmdata changed their interfaces ** (see dcmdata/include/dcdebug.h) ** ** Revision 1.3 1996/01/05 13:27:48 andreas ** - changed to support new streaming facilities ** - unique read/write methods for file and block transfer ** - more cleanups ** */ dcmtk-3.6.0/dcmdata/libsrc/dcvrus.cc0000644000310500011400000003132211457616142016537 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Gerd Ehlers, Andreas Barth * * Purpose: Implementation of class DcmUnsignedShort * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-20 16:44:18 $ * CVS/RCS Revision: $Revision: 1.31 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/ofstd/ofstream.h" #include "dcmtk/dcmdata/dcvrus.h" #include "dcmtk/dcmdata/dcvm.h" #define INCLUDE_CSTDIO #define INCLUDE_CSTRING #include "dcmtk/ofstd/ofstdinc.h" // ******************************** DcmUnsignedShort::DcmUnsignedShort(const DcmTag &tag, const Uint32 len) : DcmElement(tag, len) { } DcmUnsignedShort::DcmUnsignedShort(const DcmUnsignedShort &old) : DcmElement(old) { } DcmUnsignedShort::~DcmUnsignedShort() { } DcmUnsignedShort &DcmUnsignedShort::operator=(const DcmUnsignedShort &obj) { DcmElement::operator=(obj); return *this; } OFCondition DcmUnsignedShort::copyFrom(const DcmObject& rhs) { if (this != &rhs) { if (rhs.ident() != ident()) return EC_IllegalCall; *this = OFstatic_cast(const DcmUnsignedShort &, rhs); } return EC_Normal; } // ******************************** DcmEVR DcmUnsignedShort::ident() const { return EVR_US; } OFCondition DcmUnsignedShort::checkValue(const OFString &vm, const OFBool /*oldFormat*/) { /* check VM only */ return DcmElement::checkVM(getVM(), vm); } unsigned long DcmUnsignedShort::getVM() { return getLengthField() / sizeof(Uint16); } // ******************************** void DcmUnsignedShort::print(STD_NAMESPACE ostream&out, const size_t flags, const int level, const char * /*pixelFileName*/, size_t * /*pixelCounter*/) { if (valueLoaded()) { /* get unsigned integer data */ Uint16 *uintVals; errorFlag = getUint16Array(uintVals); if (uintVals != NULL) { const unsigned long count = getVM(); const unsigned long maxLength = (flags & DCMTypes::PF_shortenLongTagValues) ? DCM_OptPrintLineLength : OFstatic_cast(unsigned long, -1) /*unlimited*/; unsigned long printedLength = 0; unsigned long newLength = 0; char buffer[32]; /* print line start with tag and VR */ printInfoLineStart(out, flags, level); /* print multiple values */ for (unsigned int i = 0; i < count; i++, uintVals++) { /* check whether first value is printed (omit delimiter) */ if (i == 0) sprintf(buffer, "%hu", *uintVals); else sprintf(buffer, "\\%hu", *uintVals); /* check whether current value sticks to the length limit */ newLength = printedLength + strlen(buffer); if ((newLength <= maxLength) && ((i + 1 == count) || (newLength + 3 <= maxLength))) { out << buffer; printedLength = newLength; } else { /* check whether output has been truncated */ if (i + 1 < count) { out << "..."; printedLength += 3; } break; } } /* print line end with length, VM and tag name */ printInfoLineEnd(out, flags, printedLength); } else printInfoLine(out, flags, level, "(no value available)"); } else printInfoLine(out, flags, level, "(not loaded)"); } // ******************************** OFCondition DcmUnsignedShort::getUint16(Uint16 &uintVal, const unsigned long pos) { /* get unsigned integer data */ Uint16 *uintValues = NULL; errorFlag = getUint16Array(uintValues); /* check data before returning */ if (errorFlag.good()) { if (uintValues == NULL) errorFlag = EC_IllegalCall; else if (pos >= getVM()) errorFlag = EC_IllegalParameter; else uintVal = uintValues[pos]; } /* clear value in case of error */ if (errorFlag.bad()) uintVal = 0; return errorFlag; } OFCondition DcmUnsignedShort::getUint16Array(Uint16 *&uintVals) { uintVals = OFstatic_cast(Uint16 *, getValue()); return errorFlag; } // ******************************** OFCondition DcmUnsignedShort::getOFString(OFString &stringVal, const unsigned long pos, OFBool /*normalize*/) { Uint16 uintVal; /* get the specified numeric value */ errorFlag = getUint16(uintVal, pos); if (errorFlag.good()) { /* ... and convert it to a character string */ char buffer[32]; sprintf(buffer, "%hu", uintVal); /* assign result */ stringVal = buffer; } return errorFlag; } // ******************************** OFCondition DcmUnsignedShort::putUint16(const Uint16 uintVal, const unsigned long pos) { Uint16 val = uintVal; errorFlag = changeValue(&val, sizeof(Uint16) * pos, sizeof(Uint16)); return errorFlag; } OFCondition DcmUnsignedShort::putUint16Array(const Uint16 *uintVals, const unsigned long numUints) { errorFlag = EC_Normal; if (numUints > 0) { /* check for valid data */ if (uintVals != NULL) errorFlag = putValue(uintVals, sizeof(Uint16) * OFstatic_cast(Uint32, numUints)); else errorFlag = EC_CorruptedData; } else errorFlag = putValue(NULL, 0); return errorFlag; } // ******************************** OFCondition DcmUnsignedShort::putString(const char *stringVal) { errorFlag = EC_Normal; /* check input string */ if ((stringVal != NULL) && (strlen(stringVal) > 0)) { const unsigned long vm = getVMFromString(stringVal); if (vm > 0) { Uint16 *field = new Uint16[vm]; const char *s = stringVal; char *value; /* retrieve unsigned integer data from character string */ for (unsigned long i = 0; (i < vm) && errorFlag.good(); i++) { /* get first value stored in 's', set 's' to beginning of the next value */ value = getFirstValueFromString(s); if ((value == NULL) || (sscanf(value, "%hu", &field[i]) != 1)) errorFlag = EC_CorruptedData; delete[] value; } /* set binary data as the element value */ if (errorFlag.good()) errorFlag = putUint16Array(field, vm); /* delete temporary buffer */ delete[] field; } else errorFlag = putValue(NULL, 0); } else errorFlag = putValue(NULL, 0); return errorFlag; } // ******************************** OFCondition DcmUnsignedShort::verify(const OFBool autocorrect) { /* check for valid value length */ if (getLengthField() % (sizeof(Uint16)) != 0) { errorFlag = EC_CorruptedData; if (autocorrect) { /* strip to valid length */ setLengthField(getLengthField() - (getLengthField() % (sizeof(Uint16)))); } } else errorFlag = EC_Normal; return errorFlag; } /* ** CVS/RCS Log: ** $Log: dcvrus.cc,v $ ** Revision 1.31 2010-10-20 16:44:18 joergr ** Use type cast macros (e.g. OFstatic_cast) where appropriate. ** ** Revision 1.30 2010-10-14 13:14:11 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.29 2010-04-23 14:30:35 joergr ** Added new method to all VR classes which checks whether the stored value ** conforms to the VR definition and to the specified VM. ** ** Revision 1.28 2008-07-17 10:31:32 onken ** Implemented copyFrom() method for complete DcmObject class hierarchy, which ** permits setting an instance's value from an existing object. Implemented ** assignment operator where necessary. ** ** Revision 1.27 2007-06-29 14:17:49 meichel ** Code clean-up: Most member variables in module dcmdata are now private, ** not protected anymore. ** ** Revision 1.26 2006/08/15 15:49:54 meichel ** Updated all code in module dcmdata to correctly compile when ** all standard C++ classes remain in namespace std. ** ** Revision 1.25 2005/12/08 15:42:09 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.24 2004/02/04 16:04:56 joergr ** Adapted type casts to new-style typecast operators defined in ofcast.h. ** Removed acknowledgements with e-mail addresses from CVS log. ** ** Revision 1.23 2002/12/06 13:12:37 joergr ** Enhanced "print()" function by re-working the implementation and replacing ** the boolean "showFullData" parameter by a more general integer flag. ** Made source code formatting more consistent with other modules/files. ** ** Revision 1.22 2002/11/27 12:07:00 meichel ** Adapted module dcmdata to use of new header file ofstdinc.h ** ** Revision 1.21 2002/04/25 10:35:04 joergr ** Added getOFString() implementation. ** ** Revision 1.20 2002/04/16 13:43:27 joergr ** Added configurable support for C++ ANSI standard includes (e.g. streams). ** ** Revision 1.19 2001/09/25 17:20:02 meichel ** Adapted dcmdata to class OFCondition ** ** Revision 1.18 2001/06/01 15:49:22 meichel ** Updated copyright header ** ** Revision 1.17 2000/04/14 15:55:10 meichel ** Dcmdata library code now consistently uses ofConsole for error output. ** ** Revision 1.16 2000/03/08 16:26:52 meichel ** Updated copyright header. ** ** Revision 1.15 2000/03/03 14:05:41 meichel ** Implemented library support for redirecting error messages into memory ** instead of printing them to stdout/stderr for GUI applications. ** ** Revision 1.14 2000/02/10 10:52:26 joergr ** Added new feature to dcmdump (enhanced print method of dcmdata): write ** pixel data/item value fields to raw files. ** ** Revision 1.13 2000/02/02 14:33:03 joergr ** Replaced 'delete' statements by 'delete[]' for objects created with 'new[]'. ** ** Revision 1.12 1999/03/31 09:26:03 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.11 1997/07/21 08:25:37 andreas ** - Replace all boolean types (BOOLEAN, CTNBOOLEAN, DICOM_BOOL, BOOL) ** with one unique boolean type OFBool. ** ** Revision 1.10 1997/07/03 15:10:22 andreas ** - removed debugging functions Bdebug() and Edebug() since ** they write a static array and are not very useful at all. ** Cdebug and Vdebug are merged since they have the same semantics. ** The debugging functions in dcmdata changed their interfaces ** (see dcmdata/include/dcdebug.h) ** ** Revision 1.9 1997/04/18 08:10:54 andreas ** - Corrected debugging code ** - The put/get-methods for all VRs did not conform to the C++-Standard ** draft. Some Compilers (e.g. SUN-C++ Compiler, Metroworks ** CodeWarrier, etc.) create many warnings concerning the hiding of ** overloaded get methods in all derived classes of DcmElement. ** So the interface of all value representation classes in the ** library are changed rapidly, e.g. ** OFCondition get(Uint16 & value, const unsigned long pos); ** becomes ** OFCondition getUint16(Uint16 & value, const unsigned long pos); ** All (retired) "returntype get(...)" methods are deleted. ** For more information see dcmdata/include/dcelem.h ** ** Revision 1.8 1996/08/05 08:46:25 andreas ** new print routine with additional parameters: ** - print into files ** - fix output length for elements ** corrected error in search routine with parameter ESM_fromStackTop ** ** Revision 1.7 1996/05/20 13:27:54 andreas ** correct minor bug in print routine ** ** Revision 1.6 1996/04/16 16:05:27 andreas ** - better support und bug fixes for NULL element value ** ** Revision 1.5 1996/03/26 09:59:39 meichel ** corrected bug (deletion of const char *) which prevented compilation on NeXT ** ** Revision 1.4 1996/01/29 13:38:35 andreas ** - new put method for every VR to put value as a string ** - better and unique print methods ** ** Revision 1.3 1996/01/05 13:27:56 andreas ** - changed to support new streaming facilities ** - unique read/write methods for file and block transfer ** - more cleanups ** */ dcmtk-3.6.0/dcmdata/libsrc/dctag.cc0000644000310500011400000002204511455601041016303 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Gerd Ehlers, Andrew Hewett * * Purpose: class DcmTag * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:14:09 $ * CVS/RCS Revision: $Revision: 1.24 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dctag.h" #include "dcmtk/dcmdata/dcerror.h" /* for dcmdata error constants */ #include "dcmtk/dcmdata/dcdict.h" #include "dcmtk/dcmdata/dcdicent.h" #define INCLUDE_CSTDIO #define INCLUDE_CSTRING #include "dcmtk/ofstd/ofstdinc.h" DcmTag::DcmTag() : vr(EVR_UNKNOWN), tagName(NULL), privateCreator(NULL), errorFlag(EC_InvalidTag) { } DcmTag::DcmTag(const DcmTagKey& akey) : DcmTagKey(akey), vr(EVR_UNKNOWN), tagName(NULL), privateCreator(NULL), errorFlag(EC_InvalidTag) { lookupVRinDictionary(); } DcmTag::DcmTag(Uint16 g, Uint16 e) : DcmTagKey(g, e), vr(EVR_UNKNOWN), tagName(NULL), privateCreator(NULL), errorFlag(EC_InvalidTag) { lookupVRinDictionary(); } DcmTag::DcmTag(Uint16 g, Uint16 e, const DcmVR& avr) : DcmTagKey(g, e), vr(avr), tagName(NULL), privateCreator(NULL), errorFlag(EC_Normal) { } DcmTag::DcmTag(const DcmTagKey& akey, const DcmVR& avr) : DcmTagKey(akey), vr(avr), tagName(NULL), privateCreator(NULL), errorFlag(EC_Normal) { } DcmTag::DcmTag(const DcmTag& tag) : DcmTagKey(tag), vr(tag.vr), tagName(NULL), privateCreator(NULL), errorFlag(tag.errorFlag) { updateTagName(tag.tagName); updatePrivateCreator(tag.privateCreator); } // ******************************** DcmTag::~DcmTag() { delete[] tagName; delete[] privateCreator; } // ******************************** DcmTag& DcmTag::operator= ( const DcmTag& tag ) { if (this != &tag) { updateTagName(tag.tagName); updatePrivateCreator(tag.privateCreator); DcmTagKey::set(tag); vr = tag.vr; errorFlag = tag.errorFlag; } return *this; } // ******************************** void DcmTag::lookupVRinDictionary() { const DcmDataDictionary& globalDataDict = dcmDataDict.rdlock(); const DcmDictEntry *dictRef = globalDataDict.findEntry(*this, privateCreator); if (dictRef) { vr = dictRef->getVR(); errorFlag = EC_Normal; } dcmDataDict.unlock(); } // ******************************** DcmVR DcmTag::setVR( const DcmVR& avr ) // resolve ambiguous VR { vr = avr; if ( vr.getEVR() == EVR_UNKNOWN ) { errorFlag = EC_InvalidVR; } else { errorFlag = EC_Normal; } return vr; } const char *DcmTag::getTagName() { if (tagName) return tagName; const char *newTagName = NULL; const DcmDataDictionary& globalDataDict = dcmDataDict.rdlock(); const DcmDictEntry *dictRef = globalDataDict.findEntry(*this, privateCreator); if (dictRef) newTagName=dictRef->getTagName(); if (newTagName == NULL) newTagName = DcmTag_ERROR_TagName; updateTagName(newTagName); dcmDataDict.unlock(); if (tagName) return tagName; return DcmTag_ERROR_TagName; } OFBool DcmTag::isSignable() const { OFBool result = isSignableTag(); if (result) result = (! isUnknownVR()); return result; } OFBool DcmTag::isUnknownVR() const { OFBool result = OFFalse; switch (vr.getValidEVR()) // this is the VR we're going to write in explicit VR { case EVR_UNKNOWN: case EVR_UNKNOWN2B: case EVR_UN: result = OFTrue; break; default: /* nothing */ break; } return result; } OFCondition DcmTag::findTagFromName(const char *name, DcmTag &value) { OFCondition result = EC_IllegalParameter; /* check parameters first */ if ((name != NULL) && (strlen(name) > 0)) { result = EC_Normal; unsigned int grp = 0xffff; unsigned int elm = 0xffff; /* check whether tag name has format 'gggg,eeee' */ if (sscanf(name, "%x,%x", &grp, &elm) == 2) { /* store resulting tag value */ value.set(OFstatic_cast(Uint16, grp), OFstatic_cast(Uint16, elm)); value.lookupVRinDictionary(); } else { /* it is a name: look up in the dictionary */ const DcmDataDictionary &globalDataDict = dcmDataDict.rdlock(); const DcmDictEntry *dicent = globalDataDict.findEntry(name); /* store resulting tag value */ if (dicent != NULL) { value.set(dicent->getKey()); value.setVR(dicent->getVR()); } else result = EC_TagNotFound; dcmDataDict.unlock(); } } return result; } const char* DcmTag::getPrivateCreator() const { return privateCreator; } void DcmTag::setPrivateCreator(const char *privCreator) { // a new private creator code probably changes the name // of the tag. Enforce new dictionary lookup the next time // getTagName() is called. updateTagName(NULL); updatePrivateCreator(privCreator); } void DcmTag::updateTagName(const char *c) { delete[] tagName; if (c) { tagName = new char[strlen(c) + 1]; if (tagName) strcpy(tagName,c); } else tagName = NULL; } void DcmTag::updatePrivateCreator(const char *c) { delete[] privateCreator; if (c) { privateCreator = new char[strlen(c) + 1]; if (privateCreator) strcpy(privateCreator,c); } else privateCreator = NULL; } /* ** CVS/RCS Log: ** $Log: dctag.cc,v $ ** Revision 1.24 2010-10-14 13:14:09 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.23 2009-06-04 17:10:19 joergr ** Fixed minor source code formatting issues. ** ** Revision 1.22 2008-02-04 11:51:56 onken ** Added missing VR lookup for function findTagFromName(). ** ** Revision 1.21 2005-12-08 15:41:39 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.20 2004/02/04 16:45:38 joergr ** Adapted type casts to new-style typecast operators defined in ofcast.h. ** Removed acknowledgements with e-mail addresses from CVS log. ** ** Revision 1.19 2003/03/21 13:08:04 meichel ** Minor code purifications for warnings reported by MSVC in Level 4 ** ** Revision 1.18 2002/11/27 12:06:52 meichel ** Adapted module dcmdata to use of new header file ofstdinc.h ** ** Revision 1.17 2002/07/23 14:21:34 meichel ** Added support for private tag data dictionaries to dcmdata ** ** Revision 1.16 2002/05/24 09:49:44 joergr ** Renamed some parameters/variables to avoid ambiguities. ** ** Revision 1.15 2002/04/30 13:12:58 joergr ** Added static helper function to convert strings (tag names or group/element ** numbers) to DICOM tag objects. ** ** Revision 1.14 2002/04/16 13:43:22 joergr ** Added configurable support for C++ ANSI standard includes (e.g. streams). ** ** Revision 1.13 2001/11/19 15:23:29 meichel ** Cleaned up signature code to avoid some gcc warnings. ** ** Revision 1.12 2001/11/16 15:55:05 meichel ** Adapted digital signature code to final text of supplement 41. ** ** Revision 1.11 2001/06/01 15:49:11 meichel ** Updated copyright header ** ** Revision 1.10 2000/05/03 14:19:10 meichel ** Added new class GlobalDcmDataDictionary which implements read/write lock ** semantics for safe access to the DICOM dictionary from multiple threads ** in parallel. The global dcmDataDict now uses this class. ** ** Revision 1.9 2000/04/14 16:01:00 meichel ** Restructured class DcmTag. Instances don't keep a permanent pointer ** to a data dictionary entry anymore. Required for MT applications. ** ** Revision 1.8 2000/03/08 16:26:42 meichel ** Updated copyright header. ** ** Revision 1.7 2000/03/03 14:05:37 meichel ** Implemented library support for redirecting error messages into memory ** instead of printing them to stdout/stderr for GUI applications. ** ** Revision 1.6 1999/03/31 09:25:41 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.5 1998/07/15 15:52:09 joergr ** Removed several compiler warnings reported by gcc 2.8.1 with ** additional options, e.g. missing copy constructors and assignment ** operators, initialization of member variables in the body of a ** constructor instead of the member initialization list, hiding of ** methods by use of identical names, uninitialized member variables, ** missing const declaration of char pointers. Replaced tabs by spaces. ** ** Revision 1.4 1996/03/12 15:24:21 hewett ** Added constructor to allow direct setting of the VR. ** ** Revision 1.3 1996/01/05 13:27:44 andreas ** - changed to support new streaming facilities ** - unique read/write methods for file and block transfer ** - more cleanups ** ** Revision 1.2 1995/11/23 17:02:54 hewett ** Updated for loadable data dictionary. Some cleanup (more to do). ** */ dcmtk-3.6.0/dcmdata/libsrc/dcvris.cc0000644000310500011400000001747311457616141016535 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Gerd Ehlers, Andreas Barth * * Purpose: Implementation of class DcmIntegerString * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-20 16:44:17 $ * CVS/RCS Revision: $Revision: 1.26 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcvris.h" #include "dcmtk/ofstd/ofstring.h" #define INCLUDE_CSTDIO #include "dcmtk/ofstd/ofstdinc.h" #define MAX_IS_LENGTH 12 // ******************************** DcmIntegerString::DcmIntegerString(const DcmTag &tag, const Uint32 len) : DcmByteString(tag, len) { setMaxLength(MAX_IS_LENGTH); setNonSignificantChars(" \\"); } DcmIntegerString::DcmIntegerString(const DcmIntegerString &old) : DcmByteString(old) { } DcmIntegerString::~DcmIntegerString() { } DcmIntegerString &DcmIntegerString::operator=(const DcmIntegerString &obj) { DcmByteString::operator=(obj); return *this; } OFCondition DcmIntegerString::copyFrom(const DcmObject& rhs) { if (this != &rhs) { if (rhs.ident() != ident()) return EC_IllegalCall; *this = OFstatic_cast(const DcmIntegerString &, rhs); } return EC_Normal; } // ******************************** DcmEVR DcmIntegerString::ident() const { return EVR_IS; } OFCondition DcmIntegerString::checkValue(const OFString &vm, const OFBool /*oldFormat*/) { OFString strVal; /* get "raw value" without any modifications (if possible) */ OFCondition l_error = getStringValue(strVal); if (l_error.good()) l_error = DcmIntegerString::checkStringValue(strVal, vm); return l_error; } // ******************************** OFCondition DcmIntegerString::getSint32(Sint32 &sintVal, const unsigned long pos) { /* get integer string value */ OFString str; OFCondition l_error = getOFString(str, pos, OFTrue); if (l_error.good()) { /* convert string to integer value */ #if SIZEOF_LONG == 8 if (sscanf(str.c_str(), "%d", &sintVal) != 1) #else if (sscanf(str.c_str(), "%ld", &sintVal) != 1) #endif l_error = EC_CorruptedData; } return l_error; } // ******************************** OFCondition DcmIntegerString::getOFString(OFString &stringVal, const unsigned long pos, OFBool normalize) { /* call inherited method */ OFCondition l_error = DcmByteString::getOFString(stringVal, pos, normalize); /* normalize string if required */ if (l_error.good() && normalize) normalizeString(stringVal, !MULTIPART, DELETE_LEADING, DELETE_TRAILING); return l_error; } // ******************************** OFCondition DcmIntegerString::checkStringValue(const OFString &value, const OFString &vm) { return DcmByteString::checkStringValue(value, vm, "is", 8, MAX_IS_LENGTH); } /* ** CVS/RCS Log: ** $Log: dcvris.cc,v $ ** Revision 1.26 2010-10-20 16:44:17 joergr ** Use type cast macros (e.g. OFstatic_cast) where appropriate. ** ** Revision 1.25 2010-10-14 13:14:10 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.24 2010-04-23 14:30:34 joergr ** Added new method to all VR classes which checks whether the stored value ** conforms to the VR definition and to the specified VM. ** ** Revision 1.23 2009-08-07 14:35:49 joergr ** Enhanced isEmpty() method by checking whether the data element value consists ** of non-significant characters only. ** ** Revision 1.22 2009-08-03 09:03:00 joergr ** Added methods that check whether a given string value conforms to the VR and ** VM definitions of the DICOM standards. ** ** Revision 1.21 2008-07-17 10:31:32 onken ** Implemented copyFrom() method for complete DcmObject class hierarchy, which ** permits setting an instance's value from an existing object. Implemented ** assignment operator where necessary. ** ** Revision 1.20 2007-06-29 14:17:49 meichel ** Code clean-up: Most member variables in module dcmdata are now private, ** not protected anymore. ** ** Revision 1.19 2005/12/08 15:41:54 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.18 2002/12/06 13:20:50 joergr ** Enhanced "print()" function by re-working the implementation and replacing ** the boolean "showFullData" parameter by a more general integer flag. ** Made source code formatting more consistent with other modules/files. ** ** Revision 1.17 2002/11/27 12:06:57 meichel ** Adapted module dcmdata to use of new header file ofstdinc.h ** ** Revision 1.16 2002/08/27 16:55:59 meichel ** Initial release of new DICOM I/O stream classes that add support for stream ** compression (deflated little endian explicit VR transfer syntax) ** ** Revision 1.15 2002/04/25 10:30:35 joergr ** Removed getOFStringArray() implementation. ** ** Revision 1.14 2001/09/25 17:19:57 meichel ** Adapted dcmdata to class OFCondition ** ** Revision 1.13 2001/06/01 15:49:17 meichel ** Updated copyright header ** ** Revision 1.12 2000/03/08 16:26:47 meichel ** Updated copyright header. ** ** Revision 1.11 1999/03/31 09:25:52 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.10 1998/11/12 16:48:25 meichel ** Implemented operator= for all classes derived from DcmObject. ** ** Revision 1.9 1997/08/29 13:11:46 andreas ** Corrected Bug in getOFStringArray Implementation ** ** Revision 1.8 1997/08/29 08:32:58 andreas ** - Added methods getOFString and getOFStringArray for all ** string VRs. These methods are able to normalise the value, i. e. ** to remove leading and trailing spaces. This will be done only if ** it is described in the standard that these spaces are not relevant. ** These methods do not test the strings for conformance, this means ** especially that they do not delete spaces where they are not allowed! ** getOFStringArray returns the string with all its parts separated by \ ** and getOFString returns only one value of the string. ** CAUTION: Currently getString returns a string with trailing ** spaces removed (if dcmEnableAutomaticInputDataCorrection == OFTrue) and ** truncates the original string (since it is not copied!). If you rely on this ** behaviour please change your application now. ** Future changes will ensure that getString returns the original ** string from the DICOM object (NULL terminated) inclusive padding. ** Currently, if you call getOF... before calling getString without ** normalisation, you can get the original string read from the DICOM object. ** ** Revision 1.7 1997/07/03 15:10:13 andreas ** - removed debugging functions Bdebug() and Edebug() since ** they write a static array and are not very useful at all. ** Cdebug and Vdebug are merged since they have the same semantics. ** The debugging functions in dcmdata changed their interfaces ** (see dcmdata/include/dcdebug.h) ** ** Revision 1.6 1997/05/30 06:45:00 andreas ** - fixed scanf format problem leading to warnings on 64 bit machines. ** ** Revision 1.5 1997/05/12 09:57:02 andreas ** - warnings deletetd ** ** Revision 1.4 1997/05/12 07:38:27 andreas ** - new get-Methods for DcmDecimalString: getFloat64 and ** DcmIntegerString: getSint32 ** ** Revision 1.3 1996/01/05 13:27:49 andreas ** - changed to support new streaming facilities ** - unique read/write methods for file and block transfer ** - more cleanups ** */ dcmtk-3.6.0/dcmdata/libsrc/dcostrmf.cc0000644000310500011400000001416011455601040017040 0ustar joergrdicom3/* * * Copyright (C) 2002-2010, 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: dcmdata * * Author: Marco Eichelberg * * Purpose: DcmOutputFileStream and related classes, * implements streamed output to files. * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:14:08 $ * CVS/RCS Revision: $Revision: 1.14 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" #include "dcmtk/dcmdata/dcostrmf.h" #include "dcmtk/dcmdata/dcerror.h" #define INCLUDE_CSTDIO #define INCLUDE_CERRNO #include "dcmtk/ofstd/ofstdinc.h" DcmFileConsumer::DcmFileConsumer(const char *filename) : DcmConsumer() , file_() , status_(EC_Normal) { if (!file_.fopen(filename, "wb")) { char buf[256]; const char *text = OFStandard::strerror(errno, buf, sizeof(buf)); if (text == NULL) text = "(unknown error code)"; status_ = makeOFCondition(OFM_dcmdata, 19, OF_error, text); } } DcmFileConsumer::DcmFileConsumer(FILE *file) : DcmConsumer() , file_(file) , status_(EC_Normal) { } DcmFileConsumer::~DcmFileConsumer() { file_.fclose(); } OFBool DcmFileConsumer::good() const { return status_.good(); } OFCondition DcmFileConsumer::status() const { return status_; } OFBool DcmFileConsumer::isFlushed() const { return OFTrue; } offile_off_t DcmFileConsumer::avail() const { // since we cannot report "unlimited", let's claim that we can still write 2GB. // Note that offile_off_t is a signed type. return 2147483647L; } offile_off_t DcmFileConsumer::write(const void *buf, offile_off_t buflen) { offile_off_t result = 0; if (status_.good() && file_.open() && buf && buflen) { #ifdef WRITE_VERY_LARGE_CHUNKS /* This is the old behaviour prior to DCMTK 3.5.5 */ result = OFstatic_cast(offile_off_t, file_.fwrite(buf, 1, OFstatic_cast(size_t, buflen))); #else /* On Windows (at least for some versions of MSVC), calls to fwrite() for more than * 67,076,095 bytes (a bit less than 64 MByte) fail if we're writing to a network * share. See MSDN KB899149. As a workaround, we always write in chunks of * 32M which should hardly negatively affect performance. */ #define DcmFileConsumer_MAX_CHUNK_SIZE 33554432 /* 32 MByte */ offile_off_t written; const char *buf2 = OFstatic_cast(const char *, buf); while (buflen > DcmFileConsumer_MAX_CHUNK_SIZE) { written = OFstatic_cast(offile_off_t, file_.fwrite(buf2, 1, DcmFileConsumer_MAX_CHUNK_SIZE)); result += written; buf2 += written; // if we have not written a complete chunk, there is problem; bail out if (written == DcmFileConsumer_MAX_CHUNK_SIZE) buflen -= DcmFileConsumer_MAX_CHUNK_SIZE; else buflen = 0; } // last call to fwrite if the file size is not a multiple of DcmFileConsumer_MAX_CHUNK_SIZE if (buflen) { written = OFstatic_cast(offile_off_t, file_.fwrite(buf2, 1, OFstatic_cast(size_t, buflen))); result += written; } #endif } return result; } void DcmFileConsumer::flush() { // nothing to flush } /* ======================================================================= */ DcmOutputFileStream::DcmOutputFileStream(const char *filename) : DcmOutputStream(&consumer_) // safe because DcmOutputStream only stores pointer , consumer_(filename) { } DcmOutputFileStream::DcmOutputFileStream(FILE *file) : DcmOutputStream(&consumer_) // safe because DcmOutputStream only stores pointer , consumer_(file) { } DcmOutputFileStream::~DcmOutputFileStream() { // last attempt to flush stream before file is closed flush(); #ifdef DEBUG if (! isFlushed()) { DCMDATA_WARN("closing unflushed DcmOutputFileStream, loss of data!"); } #endif } /* * CVS/RCS Log: * $Log: dcostrmf.cc,v $ * Revision 1.14 2010-10-14 13:14:08 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.13 2010-06-03 10:28:41 joergr * Replaced calls to strerror() by new helper function OFStandard::strerror() * which results in using the thread safe version of strerror() if available. * * Revision 1.12 2010-02-22 11:39:54 uli * Remove some unneeded includes. * * Revision 1.11 2009-11-04 09:58:10 uli * Switched to logging mechanism provided by the "new" oflog module * * Revision 1.10 2007-02-23 16:30:12 meichel * Fixed bug in DcmFileConsumer::avail introduced when converting * the return type to offile_off_t, which is signed. * * Revision 1.9 2007/02/19 16:06:10 meichel * Class DcmOutputStream and related classes are now safe for use with * large files (2 GBytes or more) if supported by compiler and operating system. * * Revision 1.8 2007/02/19 15:35:55 meichel * When writing DICOM data to file, we now by default split fwrite() calls for * very large attributes into multiple calls, none of which writes more than * 32 MBytes. This is a workaround to a bug in most MSVC environments (MSDN * KB899149) and is hardly relevant performance-wise. Previous behaviour can * be enforced by compiling with WRITE_VERY_LARGE_CHUNKS defined. * * Revision 1.7 2006/08/15 15:49:54 meichel * Updated all code in module dcmdata to correctly compile when * all standard C++ classes remain in namespace std. * * Revision 1.6 2005/12/08 15:41:22 meichel * Changed include path schema for all DCMTK header files * * Revision 1.5 2004/02/04 16:36:47 joergr * Adapted type casts to new-style typecast operators defined in ofcast.h. * * Revision 1.4 2003/11/07 13:49:09 meichel * Added constructor taking an open FILE* instead of a file name string * * Revision 1.3 2002/11/27 12:06:50 meichel * Adapted module dcmdata to use of new header file ofstdinc.h * * Revision 1.2 2002/09/19 08:32:28 joergr * Added explicit type casts to keep Sun CC 2.0.1 quiet. * * Revision 1.1 2002/08/27 16:55:53 meichel * Initial release of new DICOM I/O stream classes that add support for stream * compression (deflated little endian explicit VR transfer syntax) * * */ dcmtk-3.6.0/dcmdata/libsrc/vrscanl.l0000644000310500011400000002020711455577730016556 0ustar joergrdicom3/* * * Copyright (C) 1997-2010, 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: dcmdata * * Author: Hermann Grevemeyer et al. * * Purpose: * These are the regular expressions for the value representations * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:04:24 $ * CVS/RCS Revision: $Revision: 1.6 $ * Status: $State: Exp $ * * CVS/RCS Log: * $Log: vrscanl.l,v $ * Revision 1.6 2010-10-14 13:04:24 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.5 2010-09-03 07:26:19 uli * Make the VR scanner work on windows again. * * Revision 1.4 2010-09-02 12:02:06 uli * Use longjmp() for error handling in the VR scanner. * * Revision 1.3 2010-09-02 10:37:37 uli * Fix a compiler warning about an unused function. * * Revision 1.2 2010-09-02 09:23:15 uli * Made the VR scanner reentrant again. * * Revision 1.1 2010-08-26 12:29:48 uli * Ported vrscan from ancient flex++ to current flex version. * * Revision 1.15 2009-08-03 09:20:39 joergr * Fixed various bugs and inconsistencies in the grammar of the VR scanner. * * Revision 1.14 2009-05-11 14:43:55 joergr * Fixed wrong definition of value representation DS (Decimal String): According * to the referenced standard (ANSI X3.9 - 1978), the sign symbol after the "E" * or "e" is optional). * * Revision 1.13 2008-07-18 13:55:57 meichel * New test for dubious date field (with years before 1850 or after 2050) * generating new warning message W-33. * * Revision 1.12 2006-08-16 16:31:34 meichel * Updated all code in module dcmcheck to correctly compile when * all standard C++ classes remain in namespace std. * * Revision 1.11 2003/08/26 16:13:06 meichel * Extended VR scanner to explicitly test for IS value range. * Added warning for retired PN form (without caret). * * Revision 1.10 2003/08/26 15:10:37 meichel * Extended VR scanner to detect leading zeroes in UIDs and illegal values * in date and time expressions. * * Revision 1.9 2003/08/25 15:42:59 meichel * Changed VR scanner to allow empty values in multi-VM elements. * This is explicitly needed, for example, for ImageType in DX objects. * * Revision 1.8 2001/01/18 15:14:14 meichel * Updated copyright header. * * Revision 1.7 2000/03/08 16:11:49 meichel * Updated copyright header. * * Revision 1.6 2000/03/03 14:21:58 meichel * Implemented library support for redirecting error messages into memory * instead of printing them to stdout/stderr for GUI applications. * * Revision 1.5 1998/07/02 09:03:16 meichel * Some code purifications to avoid gcc 2.8.1 -Weffc++ warnings. * * Revision 1.4 1997/09/24 13:04:13 hewett * Corrected default and charset_without_control_chars regular expressions used for checking * the allowed character repertoirs for VRs. The '+' character was missing * as a valid character. * * Revision 1.3 1997/07/09 16:33:52 meichel * Adapted dcmcheck to use the new OFString and OFBool classes instead * of Gnu libg++. Removed references to Gnu-specific code (e.g. ). * #includes in header files now restricted to required minimum, * speeds up compilation and keeps the code lean. * reimplementation of some helper functions (hex.cc, tools.cc) * to improve efficiency. * Added copyright message to all source files. * * */ %option reentrant /* Avoid compiler warnings about unused functions */ %option noyywrap nounput noinput %{ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "vrscani.h" %} /* Make this work on windows (we don't need interactivity anyway) */ %option nointeractive /* This seems to be a bug: The .c file won't include it, but .h will still. * %option nounistd */ %{ static int isatty(int fd) { return 0; } %} default_charset_without_control_chars [\041-\133\135-\176][\040-\133\135-\176]* charset_without_control_chars [\040-\133\135-\176\240-\377\033]+ charset_with_control_chars [\040-\176\240-\377\012\014\015\033]+ spaces [ ]* dt_offset (\-1200)|(\+1400)|(((\-((0[1-9])|(1[0-1])))|(\+((0[1-9])|(1[0-3])))){tm_minute}) da_year (18[5-9][0-9])|(19[0-9]{2})|(20[0-4][0-9]) da_year_dub [0-9]{4} da_month (0[1-9])|(1[0-2]) da_day (0[1-9])|([1-2][0-9])|(3[0-1]) tm_hour ([0-1][0-9])|(2[0-3]) tm_minute [0-5][0-9] tm_second [0-5][0-9] is_positive \+?0*(([0-9]{1,9})|(1[0-9]{9})|(20[0-9]{8})|(21[0-3][0-9]{7})|(214[0-6][0-9]{6})|(2147[0-3][0-9]{5})|(21474[0-7][0-9]{4})|(214748[0-2][0-9]{3})|(2147483[0-5][0-9]{2})|(21474836[0-3][0-9])|(214748364[0-7])) is_negative \-0*(([0-9]{1,9})|(1[0-9]{9})|(20[0-9]{8})|(21[0-3][0-9]{7})|(214[0-6][0-9]{6})|(2147[0-3][0-9]{5})|(21474[0-7][0-9]{4})|(214748[0-2][0-9]{3})|(2147483[0-5][0-9]{2})|(21474836[0-3][0-9])|(214748364[0-8])) pn_chars {spaces}[\041-\074\076-\133\135\137-\176\240-\377\033][\040-\074\076-\133\135\137-\176\240-\377\033]* pn_component_group {pn_chars}?\^{pn_chars}?(\^{pn_chars}?(\^{pn_chars}?(\^{pn_chars}?)?)?)? normalized-as [0-9]{3}[DWMY] normalized-da {da_year}{da_month}{da_day} normalized-da-old {da_year_dub}\.{da_month}\.{da_day} normalized-da-dub {da_year_dub}{da_month}{da_day} normalized-tm {tm_hour}({tm_minute}({tm_second}(\.[0-9]{1,6})?)?)? normalized-tm-old {tm_hour}:{tm_minute}:{tm_second}\.[0-9]{6} normalized-ds ([\-\+]?[0-9]*[\.]?[0-9]+)|([\-\+]?[0-9]+[\.]?[0-9]*)|([\-\+]?[0-9]*[\.]?[0-9]+[Ee][\+\-]?[0-9]+)|([\-\+]?[0-9]+[\.]?[0-9]*[Ee][\+\-]?[0-9]+) normalized-dt {normalized-da}{normalized-tm}{dt_offset}? normalized-dt-dub {da_year_dub}{da_month}{da_day}{normalized-tm}{dt_offset}? normalized-is {is_positive}|{is_negative} normalized-ui (([0-9]\.)|([1-9][0-9]+\.))*(([0-9])|([1-9][0-9]+)) normalized-cs [0-9A-Z _]+ normalized-pn ({pn_component_group}(\={pn_component_group}?(\={pn_component_group}?)?)?)|(\={pn_component_group}?(\={pn_component_group}?)?) normalized-pn-old {pn_chars} normalized-lo-sh {charset_without_control_chars} normalized-ae {default_charset_without_control_chars} normalized-lt-st-ut {charset_with_control_chars} as {normalized-as} da {normalized-da} da-old {normalized-da-old} da-dub {normalized-da-dub} tm {normalized-tm}{spaces} tm-old {normalized-tm-old}{spaces} ds {spaces}{normalized-ds}{spaces} dt {normalized-dt}{spaces} dt-dub {normalized-dt-dub}{spaces} is {spaces}{normalized-is}{spaces} ui {normalized-ui} cs {spaces}{normalized-cs}{spaces} pn {normalized-pn}{spaces} pn-old {normalized-pn-old}{spaces} lo-sh {spaces}{normalized-lo-sh}{spaces} ae {spaces}{normalized-ae}{spaces} lt-st-ut {normalized-lt-st-ut}{spaces} %% as{as}?(\\{as}?)* {return 1; /* AS */} da{da}?(\\{da}?)* {return 2; /* DA */} da{da-old}?(\\{da-old}?)* {return 3; /* OLD_DA */} da{da-dub}?(\\{da-dub}?)* {return 17; /* dubious DA */} tm{tm}?(\\{tm}?)* {return 4; /* TM */} tm{tm-old}?(\\{tm-old}?)* {return 5; /* OLD_TM */} ds{ds}?(\\{ds}?)* {return 6; /* DS */} dt{dt}?(\\{dt}?)* {return 7; /* DT */} dt{dt-dub}?(\\{dt-dub}?)* {return 18; /* dubious DT */} is{is}?(\\{is}?)* {return 8; /* IS */} ui{ui}?(\\{ui}?)* {return 9; /* UI */} cs{cs}?(\\{cs}?)* {return 10; /* CS */} pn{pn}?(\\{pn}?)* {return 11; /* PN */} pn{pn-old}?(\\{pn-old}?)* {return 15; /* OLD_PN */} lo{lo-sh}?(\\{lo-sh}?)* {return 12; /* LO | SH */} ae{ae}?(\\{ae}?)* {return 13; /* AE */} lt{lt-st-ut} {return 14; /* LT | ST | UT */} . {return 16; /* UNKNOWN */;} %% dcmtk-3.6.0/dcmdata/libsrc/dcdicdir.cc0000644000310500011400000015655511455601037017011 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Gerd Ehlers, Andreas Barth * * Purpose: class DcmDicomDir * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:14:07 $ * CVS/RCS Revision: $Revision: 1.61 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #define INCLUDE_CSTDLIB #define INCLUDE_CSTDIO #define INCLUDE_CERRNO #define INCLUDE_LIBC #define INCLUDE_UNISTD #include "dcmtk/ofstd/ofstdinc.h" #if defined(HAVE_MKTEMP) && !defined(HAVE_PROTOTYPE_MKTEMP) extern "C" { char * mktemp(char *); } #endif // Solaris 2.5.1 has mkstemp() in libc.a but no prototype #if defined(HAVE_MKSTEMP) && !defined(HAVE_PROTOTYPE_MKSTEMP) extern "C" { int mkstemp(char *); } #endif #ifdef HAVE_UNIX_H #if defined(macintosh) && defined (HAVE_WINSOCK_H) /* unix.h defines timeval incompatible with winsock.h */ #define timeval _UNWANTED_timeval #endif #include /* for unlink() under Metrowerks C++ (Macintosh) */ #undef timeval #endif #include "dcmtk/ofstd/ofstream.h" #include "dcmtk/ofstd/ofdefine.h" #include "dcmtk/dcmdata/dcdicdir.h" #include "dcmtk/dcmdata/dcuid.h" #include "dcmtk/dcmdata/dcdirrec.h" #include "dcmtk/dcmdata/dcxfer.h" #include "dcmtk/dcmdata/dcdeftag.h" #include "dcmtk/dcmdata/dcostrma.h" /* for class DcmOutputStream */ #include "dcmtk/dcmdata/dcostrmf.h" /* for class DcmOutputFileStream */ #include "dcmtk/dcmdata/dcistrmf.h" /* for class DcmInputFileStream */ #include "dcmtk/dcmdata/dcvrcs.h" #include "dcmtk/dcmdata/dcvrus.h" #include "dcmtk/dcmdata/dcmetinf.h" #include "dcmtk/ofstd/ofstd.h" #include "dcmtk/dcmdata/dcwcache.h" /* for class DcmWriteCache */ #include "dcmtk/dcmdata/dcvrui.h" /* for class DcmUniqueIdentifier */ // ******************************** DcmDicomDir::DcmDicomDir() : errorFlag(EC_Normal), dicomDirFileName(NULL), modified(OFFalse), mustCreateNewDir(OFFalse), DirFile(new DcmFileFormat()), RootRec(NULL), MRDRSeq(NULL) { dicomDirFileName = new char[ strlen( DEFAULT_DICOMDIR_NAME ) + 1 ]; strcpy( dicomDirFileName, DEFAULT_DICOMDIR_NAME ); OFCondition cond = DirFile->loadFile(dicomDirFileName); if (cond.bad()) { delete DirFile; // clean up file format object DirFile = new DcmFileFormat(); mustCreateNewDir = OFTrue; } createNewElements( "" ); // create missing data elements RootRec = new DcmDirectoryRecord( ERT_root, NULL, NULL); DcmTag mrdrSeqTag( DCM_DirectoryRecordSequence ); MRDRSeq = new DcmSequenceOfItems( mrdrSeqTag ); errorFlag = convertLinearToTree(); } // ******************************** DcmDicomDir::DcmDicomDir(const char *fileName, const char *fileSetID) : errorFlag(EC_Normal), dicomDirFileName(NULL), modified(OFFalse), mustCreateNewDir(OFFalse), DirFile(new DcmFileFormat()), RootRec(NULL), MRDRSeq(NULL) { if ( fileName == NULL || *fileName == '\0' ) fileName = DEFAULT_DICOMDIR_NAME; dicomDirFileName = new char[ strlen( fileName ) + 1 ]; strcpy( dicomDirFileName, fileName ); OFCondition cond = DirFile->loadFile(dicomDirFileName); if (cond.bad()) { delete DirFile; // clean up file format object DirFile = new DcmFileFormat(); mustCreateNewDir = OFTrue; } createNewElements( fileSetID ); // create missing data elements RootRec = new DcmDirectoryRecord( ERT_root, NULL, NULL); DcmTag mrdrSeqTag( DCM_DirectoryRecordSequence ); MRDRSeq = new DcmSequenceOfItems( mrdrSeqTag ); errorFlag = convertLinearToTree(); } // ******************************** /* This copy constructor implementation is untested */ DcmDicomDir::DcmDicomDir( const DcmDicomDir & old ) : errorFlag(old.errorFlag), dicomDirFileName(NULL), modified(old.modified), mustCreateNewDir(old.mustCreateNewDir), DirFile(new DcmFileFormat(*old.DirFile)), RootRec(new DcmDirectoryRecord(*old.RootRec)), MRDRSeq(new DcmSequenceOfItems(*old.MRDRSeq)) { dicomDirFileName = new char[ strlen( old.dicomDirFileName ) + 1 ]; strcpy( dicomDirFileName, old.dicomDirFileName ); } // ******************************** DcmDicomDir::~DcmDicomDir() { if (modified) write(); delete DirFile; delete[] dicomDirFileName; delete RootRec; delete MRDRSeq; } // ******************************** /* creates required data elements. Only called by the constructors. */ OFCondition DcmDicomDir::createNewElements( const char* fileSetID ) { OFCondition l_error = EC_Normal; DcmUnsignedLongOffset *uloP; DcmUnsignedShort *usP; DcmCodeString *csP; DcmDataset &dset = getDataset(); // guaranteed to exist DcmTag fileIDTag( DCM_FileSetID ); csP = new DcmCodeString( fileIDTag ); // (0004,1130) if ( fileSetID != NULL && *fileSetID != '\0' ) csP->putString( fileSetID ); if ( dset.insert( csP, OFFalse ) != EC_Normal ) delete csP; // not created or inserted: // (0004,1141) // (0004,1142) DcmTag firstRecTag( DCM_OffsetOfTheFirstDirectoryRecordOfTheRootDirectoryEntity ); uloP = new DcmUnsignedLongOffset( firstRecTag ); // (0004,1200) uloP->putUint32(Uint32(0)); if ( dset.insert( uloP, OFFalse ) != EC_Normal ) delete uloP; DcmTag lastRecTag( DCM_OffsetOfTheLastDirectoryRecordOfTheRootDirectoryEntity ); uloP = new DcmUnsignedLongOffset( lastRecTag ); // (0004,1202) uloP->putUint32(Uint32(0)); if ( dset.insert( uloP, OFFalse ) != EC_Normal ) delete uloP; DcmTag fileConsTag( DCM_FileSetConsistencyFlag ); usP = new DcmUnsignedShort( fileConsTag ); // (0004,1212) usP->putUint16(Uint16(0x0000)); dset.insert( usP, OFTrue ); return l_error; } // ******************************** DcmDataset& DcmDicomDir::getDataset() { if ( DirFile == NULL ) DirFile = new DcmFileFormat(); DcmDataset *localDataset = DirFile->getDataset(); if ( localDataset == NULL ) { errorFlag = EC_CorruptedData; DCMDATA_ERROR("DcmDicomDir::getDataset() Missing Dataset in DICOMDIR File. Must create new DICOMDIR file."); if ( DirFile != NULL ) delete DirFile; DirFile = new DcmFileFormat(); localDataset = DirFile->getDataset(); } return *localDataset; // must exist, otherwise error in DcmFileFormat } // ******************************** DcmSequenceOfItems& DcmDicomDir::getDirRecSeq( DcmDataset &dset ) { DcmSequenceOfItems *localDirRecSeq = NULL; DcmStack stack; if ( dset.search( DCM_DirectoryRecordSequence, stack, ESM_fromHere, OFFalse ) == EC_Normal ) { if ( stack.top()->ident() == EVR_SQ ) localDirRecSeq = OFstatic_cast(DcmSequenceOfItems *, stack.top()); } if ( localDirRecSeq == NULL ) { errorFlag = EC_CorruptedData; if ( !mustCreateNewDir ) { DCMDATA_WARN("DcmDicomDir::getDirRecSeq() Missing Directory Record Sequence. Must create new one."); } DcmTag dirSeqTag( DCM_DirectoryRecordSequence ); // (0004,1220) localDirRecSeq = new DcmSequenceOfItems( dirSeqTag ); dset.insert( localDirRecSeq, OFTrue ); } return *localDirRecSeq; // must exist, otherwise memory exhausted } // ******************************** DcmUnsignedLongOffset* DcmDicomDir::lookForOffsetElem( DcmObject *obj, const DcmTagKey &offsetTag ) { DcmUnsignedLongOffset *offElem = NULL; if ( obj != NULL ) { DcmStack stack; if ( obj->search( offsetTag, stack, ESM_fromHere, OFFalse ) == EC_Normal ) { if ( stack.top()->ident() == EVR_up ) { offElem = OFstatic_cast(DcmUnsignedLongOffset *, stack.top()); #ifdef DEBUG Uint32 l_uint = 0; offElem->getUint32(l_uint); DCMDATA_TRACE("DcmDicomDir::lookForOffsetElem() Offset Element (" << STD_NAMESPACE hex << STD_NAMESPACE setfill('0') << STD_NAMESPACE setw(4) << offElem->getGTag() << "," << STD_NAMESPACE setw(4) << offElem->getETag() << ") offs=0x" << STD_NAMESPACE setw(8) << l_uint << " p=" << OFstatic_cast(void *, offElem) << " l=" << offElem->getNextRecord()); #endif } } } return offElem; } // ******************************** OFCondition DcmDicomDir::resolveGivenOffsets( DcmObject *startPoint, ItemOffset *itOffsets, const unsigned long numOffsets, const DcmTagKey &offsetTag ) { OFCondition l_error = EC_Normal; if ( startPoint != NULL ) { DcmStack stack; Uint32 offset; while ( startPoint->search( offsetTag, stack, ESM_afterStackTop, OFTrue ) == EC_Normal ) { if ( stack.top()->ident() != EVR_up ) continue; DcmUnsignedLongOffset *offElem = OFstatic_cast(DcmUnsignedLongOffset *, stack.top()); for (unsigned long i = 0; i < numOffsets; i++ ) { l_error = offElem->getUint32(offset); if (offset == itOffsets[ i ].fileOffset ) { DCMDATA_DEBUG("DcmDicomDir::resolveGivenOffset() Offset Element (" << STD_NAMESPACE hex << STD_NAMESPACE setfill('0') << STD_NAMESPACE setw(4) << offElem->getGTag() << "," << STD_NAMESPACE setw(4) << offElem->getETag() << ") with offset 0x" << STD_NAMESPACE setw(8) << offset << " found"); offElem->setNextRecord( itOffsets[ i ].item ); break; } } } } return l_error; } // ******************************** OFCondition DcmDicomDir::resolveAllOffsets( DcmDataset &dset ) // inout { OFCondition l_error = EC_Normal; DcmSequenceOfItems &localDirRecSeq = getDirRecSeq( dset ); unsigned long maxitems = localDirRecSeq.card(); ItemOffset *itOffsets = new ItemOffset[ maxitems + 1 ]; for (unsigned long i = 0; i < maxitems; i++ ) { DcmDirectoryRecord *rec; rec = OFstatic_cast(DcmDirectoryRecord *, localDirRecSeq.getItem( i )); long filePos = rec->getFileOffset(); itOffsets[ i ].item = rec; itOffsets[ i ].fileOffset = OFstatic_cast(Uint32, filePos); DCMDATA_DEBUG("DcmDicomDir::resolveAllOffsets() Item Offset [" << i << "] = 0x" << STD_NAMESPACE hex << STD_NAMESPACE setfill('0') << STD_NAMESPACE setw(8) << filePos); } resolveGivenOffsets( &dset, itOffsets, maxitems, DCM_OffsetOfTheFirstDirectoryRecordOfTheRootDirectoryEntity ); resolveGivenOffsets( &dset, itOffsets, maxitems, DCM_OffsetOfTheLastDirectoryRecordOfTheRootDirectoryEntity ); resolveGivenOffsets( &localDirRecSeq, itOffsets, maxitems, DCM_OffsetOfTheNextDirectoryRecord ); resolveGivenOffsets( &localDirRecSeq, itOffsets, maxitems, DCM_OffsetOfReferencedLowerLevelDirectoryEntity ); resolveGivenOffsets( &localDirRecSeq, itOffsets, maxitems, DCM_RETIRED_MRDRDirectoryRecordOffset ); delete[] itOffsets; return l_error; } // ******************************** OFCondition DcmDicomDir::linkMRDRtoRecord( DcmDirectoryRecord *dRec ) { OFCondition l_error = EC_Normal; if ( dRec != NULL ) { // enter referenced MRDR into protected attribute: // only works since DcmDicomDir is a friend class of DcmDirectoryRecord dRec->referencedMRDR = dRec->lookForReferencedMRDR(); } return l_error; } // ******************************** OFCondition DcmDicomDir::moveRecordToTree( DcmDirectoryRecord *startRec, DcmSequenceOfItems &fromDirSQ, DcmDirectoryRecord *toRecord ) { OFCondition l_error = EC_Normal; if (toRecord == NULL) l_error = EC_IllegalCall; else if ( startRec != NULL ) { DcmDirectoryRecord *lowerRec = NULL; DcmDirectoryRecord *nextRec = NULL; DcmUnsignedLongOffset *offElem; offElem = lookForOffsetElem( startRec, DCM_OffsetOfReferencedLowerLevelDirectoryEntity ); if ( offElem != NULL ) lowerRec = OFstatic_cast(DcmDirectoryRecord *, offElem->getNextRecord()); offElem = lookForOffsetElem( startRec, DCM_OffsetOfTheNextDirectoryRecord ); if ( offElem != NULL ) nextRec = OFstatic_cast(DcmDirectoryRecord *, offElem->getNextRecord()); DCMDATA_DEBUG("DcmDicomDir::moveRecordToTree() Record (" << STD_NAMESPACE hex << STD_NAMESPACE setfill('0') << STD_NAMESPACE setw(4) << startRec->getGTag() << "," << STD_NAMESPACE setw(4) << startRec->getGTag() << ") p=" << OFstatic_cast(void *, startRec) << " has lower=" << OFstatic_cast(void *, lowerRec) << " and next=" << OFstatic_cast(void *, nextRec) << " Record"); linkMRDRtoRecord( startRec ); // use protected method for insertion without type check: if ( toRecord->masterInsertSub( startRec ) == EC_Normal ) { // only works since friend class DcmItem *dit = fromDirSQ.remove( startRec ); if ( dit == NULL ) { DCMDATA_ERROR("DcmDicomDir::moveRecordToTree() DirRecord is part of unknown Sequence"); } } else { DCMDATA_ERROR("DcmDicomDir::moveRecordToTree() Cannot insert DirRecord (=NULL?)"); } moveRecordToTree( lowerRec, fromDirSQ, startRec ); moveRecordToTree( nextRec, fromDirSQ, toRecord ); } return l_error; } // ******************************** OFCondition DcmDicomDir::moveMRDRbetweenSQs( DcmSequenceOfItems &fromSQ, DcmSequenceOfItems &toSQ ) { OFCondition l_error = EC_Normal; unsigned long num = fromSQ.card(); for (unsigned long i = 0, j = 0; i < num; i++) { DcmDirectoryRecord *dRec; dRec = OFstatic_cast(DcmDirectoryRecord *, fromSQ.getItem( j )); if (dRec != NULL && dRec->getRecordType() == ERT_Mrdr) { toSQ.insert( dRec ); fromSQ.remove( j ); } else j++; } return l_error; } // ******************************** OFCondition DcmDicomDir::convertLinearToTree() { DcmDataset &dset = getDataset(); // guaranteed to exist DcmSequenceOfItems &localDirRecSeq = getDirRecSeq( dset ); OFCondition l_error = resolveAllOffsets( dset ); // search for first directory record: DcmDirectoryRecord *firstRootRecord = NULL; DcmUnsignedLongOffset *offElem = lookForOffsetElem( &dset, DCM_OffsetOfTheFirstDirectoryRecordOfTheRootDirectoryEntity ); if ( offElem != NULL ) firstRootRecord = OFstatic_cast(DcmDirectoryRecord *, offElem->getNextRecord()); // create tree structure from flat record list: moveRecordToTree( firstRootRecord, localDirRecSeq, &getRootRecord() ); // move MRDRs from localDirRecSeq to global MRDRSeq: moveMRDRbetweenSQs( localDirRecSeq, getMRDRSequence() ); // dissolve MRDR references for all remaining items for (unsigned long i = localDirRecSeq.card(); i > 0; i-- ) linkMRDRtoRecord( OFstatic_cast(DcmDirectoryRecord *, localDirRecSeq.getItem(i-1)) ); return l_error; } // ******************************** // ******************************** Uint32 DcmDicomDir::lengthUntilSQ(DcmDataset &dset, E_TransferSyntax oxfer, E_EncodingType enctype ) { Uint32 templen = 0L; unsigned long num = dset.card(); for (unsigned long i = 0; i < num; i++ ) { DcmObject *dO = dset.getElement( i ); DcmXfer xf(oxfer); templen += xf.sizeofTagHeader(dO->getVR()); if ( dO->getTag().getXTag() == DCM_DirectoryRecordSequence ) break; Uint32 sublength = dO->getLength( oxfer, enctype ); templen += sublength; if ( sublength==DCM_UndefinedLength ) { DcmVR subvr( dO->getVR() ); DCMDATA_WARN("DcmDicomDir::lengthUntilSQ() Sub element \"" << subvr.getVRName() << "\" has undefined Length"); } if ( dO->getVR() == EVR_SQ && enctype == EET_UndefinedLength ) templen += 8; // for ItemDelimitationItem } DCMDATA_TRACE("DcmDicomDir::lengthUntilSQ() Length of Dataset until SQ=" << templen); return templen; } // ******************************** Uint32 DcmDicomDir::lengthOfRecord( DcmItem *item, E_TransferSyntax oxfer, E_EncodingType enctype ) { Uint32 templen = 0; if ( item != NULL ) { templen = item->getLength( oxfer, enctype ); templen += 8; // for Tag and Length if ( enctype == EET_UndefinedLength ) templen += 8; // for ItemDelimitationItem } return templen; } // ******************************** OFCondition DcmDicomDir::convertGivenPointer( DcmObject *startPoint, ItemOffset *itOffsets, const unsigned long numOffsets, const DcmTagKey &offsetTag ) { OFCondition l_error = EC_Normal; if ( startPoint != NULL ) { DcmStack stack; while ( startPoint->search( offsetTag, stack, ESM_afterStackTop, OFTrue ) == EC_Normal ) { if ( stack.top()->ident() != EVR_up ) continue; DcmUnsignedLongOffset *offElem = OFstatic_cast(DcmUnsignedLongOffset *, stack.top()); for (unsigned long i = 0; i < numOffsets; i++ ) { if ( offElem->getNextRecord() == itOffsets[i].item ) { offElem->putUint32( itOffsets[i].fileOffset ); break; } } } } return l_error; } // ******************************** OFCondition DcmDicomDir::convertAllPointer( DcmDataset &dset, // inout Uint32 beginOfDataSet, // in E_TransferSyntax oxfer, // in E_EncodingType enctype ) // in { OFCondition l_error = EC_Normal; DcmSequenceOfItems &localDirRecSeq = getDirRecSeq( dset ); Uint32 offs_Item1 = beginOfDataSet + lengthUntilSQ( dset, oxfer, enctype ); unsigned long num = localDirRecSeq.card(); ItemOffset *itOffsets = new ItemOffset[ num ]; Uint32 item_pos = offs_Item1; for (unsigned long i = 0; i < num; i++ ) { DcmDirectoryRecord *rec; rec = OFstatic_cast(DcmDirectoryRecord *, localDirRecSeq.getItem( i )); rec->setFileOffset( item_pos ); itOffsets[ i ].item = rec; itOffsets[ i ].fileOffset = item_pos; item_pos = lengthOfRecord( rec, oxfer, enctype ) + item_pos; } OFCondition e1 = convertGivenPointer( &dset, itOffsets, num, DCM_OffsetOfTheFirstDirectoryRecordOfTheRootDirectoryEntity ); OFCondition e2 = convertGivenPointer( &dset, itOffsets, num, DCM_OffsetOfTheLastDirectoryRecordOfTheRootDirectoryEntity ); OFCondition e3 = convertGivenPointer( &localDirRecSeq, itOffsets, num, DCM_OffsetOfTheNextDirectoryRecord ); OFCondition e4 = convertGivenPointer( &localDirRecSeq, itOffsets, num, DCM_OffsetOfReferencedLowerLevelDirectoryEntity ); OFCondition e5 = convertGivenPointer( &localDirRecSeq, itOffsets, num, DCM_RETIRED_MRDRDirectoryRecordOffset ); if ( e1 == EC_InvalidVR || e2 == EC_InvalidVR || e3 == EC_InvalidVR || e4 == EC_InvalidVR || e5 == EC_InvalidVR ) l_error = EC_InvalidVR; delete[] itOffsets; return l_error; } // ******************************** OFCondition DcmDicomDir::copyRecordPtrToSQ( DcmDirectoryRecord *record, DcmSequenceOfItems &toDirSQ, DcmDirectoryRecord **firstRec, DcmDirectoryRecord **lastRec ) { DcmDirectoryRecord *nextRec = NULL; DcmDirectoryRecord *lastReturnItem = NULL; if ( record != NULL ) { unsigned long lastIndex = record->cardSub(); for (unsigned long i = lastIndex; i > 0; i-- ) { DCMDATA_DEBUG("DcmDicomDir::copyRecordPtrToSQ() Testing sub record no. " << i << " of " << lastIndex); DcmDirectoryRecord *subRecord = record->getSub( i-1 ); if ( subRecord != NULL ) { DcmUnsignedLongOffset *uloP; if ( i == lastIndex ) lastReturnItem = subRecord; // memorize last item // adjust nextPointer DcmTag nextRecTag( DCM_OffsetOfTheNextDirectoryRecord ); uloP = new DcmUnsignedLongOffset( nextRecTag ); uloP->putUint32(Uint32(0)); uloP->setNextRecord( nextRec ); subRecord->insert( uloP, OFTrue ); #ifdef DEBUG Uint32 l_uint = 0; uloP->getUint32(l_uint); DCMDATA_TRACE("DcmDicomDir::copyRecordPtrToSQ() Next Offset Element (" << STD_NAMESPACE hex << STD_NAMESPACE setfill('0') << STD_NAMESPACE setw(4) << uloP->getGTag() << "," << STD_NAMESPACE setw(4) << uloP->getETag() << ") offs=0x" << STD_NAMESPACE setw(8) << l_uint << " p=" << OFstatic_cast(void *, uloP) << " next=" << OFstatic_cast(void *, nextRec)); #endif copyRecordPtrToSQ( subRecord, toDirSQ, firstRec, lastRec ); // adjust lowerPointer DcmTag lowerRefTag( DCM_OffsetOfReferencedLowerLevelDirectoryEntity ); uloP = new DcmUnsignedLongOffset( lowerRefTag ); uloP->putUint32(Uint32(0)); uloP->setNextRecord( *firstRec ); subRecord->insert( uloP, OFTrue ); #ifdef DEBUG uloP->getUint32(l_uint); DCMDATA_TRACE("DcmDicomDir::copyRecordPtrToSQ() Lower Offset Element (" << STD_NAMESPACE hex << STD_NAMESPACE setfill('0') << STD_NAMESPACE setw(4) << uloP->getGTag() << "," << STD_NAMESPACE setw(4) << uloP->getETag() << ") offs=0x" << STD_NAMESPACE setw(8) << l_uint << " p=" << OFstatic_cast(void *, uloP) << " lower=" << OFstatic_cast(void *, *firstRec)); #endif /* insert at begining */ toDirSQ.prepend( subRecord ); nextRec = subRecord; } } // for ( i ... } if ( lastRec != NULL ) *lastRec = lastReturnItem; // points to first record of subordinate level if ( firstRec != NULL ) *firstRec = nextRec; return EC_Normal; } // ******************************** OFCondition DcmDicomDir::convertTreeToLinear(Uint32 beginOfDataSet, E_TransferSyntax oxfer, E_EncodingType enctype, E_GrpLenEncoding glenc, DcmSequenceOfItems &unresRecs ) { OFCondition l_error = EC_Normal; DcmDataset &dset = getDataset(); // guaranteed to exist DcmSequenceOfItems &localDirRecSeq = getDirRecSeq( dset ); // copy items to which no pointer exists to a temporary list unsigned long numUnresItems = localDirRecSeq.card(); for (unsigned long i = numUnresItems; i > 0; i-- ) { DCMDATA_DEBUG("DcmDicomDir::convertTreeToLinear() Copy pointer of unresolved Record no. " << i << " of " << numUnresItems << " to unresRecsSeq:"); unresRecs.insert( localDirRecSeq.getItem(i-1), 0 ); } // convert items back into the root directory entity: DcmDirectoryRecord *firstRootRecord[1], *lastRootRecord[1]; copyRecordPtrToSQ( &getRootRecord(), localDirRecSeq, firstRootRecord, lastRootRecord ); // set pointer to first directory record: DcmUnsignedLongOffset *offElem = lookForOffsetElem( &dset, DCM_OffsetOfTheFirstDirectoryRecordOfTheRootDirectoryEntity ); if ( offElem != NULL ) offElem->setNextRecord( *firstRootRecord ); // set pointer to last directory record: offElem = lookForOffsetElem( &dset, DCM_OffsetOfTheLastDirectoryRecordOfTheRootDirectoryEntity ); if ( offElem != NULL ) offElem->setNextRecord( *lastRootRecord ); // copy MRDRs in localDirRecSeq unsigned long numMRDRItems = getMRDRSequence().card(); for (unsigned long j = numMRDRItems; j > 0; j-- ) { DCMDATA_DEBUG("DcmDicomDir::convertTreeToLinear() Copy pointer of MRDR no. " << j << " of " << numUnresItems << " to localDirRecSeq:"); localDirRecSeq.insert( getMRDRSequence().getItem(j-1), 0 ); } // compute group lengths before computing byte offsets dset.computeGroupLengthAndPadding(glenc, EPD_noChange, oxfer, enctype); // convert maximum twice if ( convertAllPointer( dset, beginOfDataSet, oxfer, enctype ) == EC_InvalidVR ) if ( convertAllPointer( dset, beginOfDataSet, oxfer, enctype ) == EC_InvalidVR ) { DCMDATA_ERROR("DcmDicomDir: There are some incorrect Offsets in file " << dicomDirFileName); l_error = EC_CorruptedData; } return l_error; } // ******************************** OFCondition DcmDicomDir::insertMediaSOPUID( DcmMetaInfo &metaInfo ) // inout { OFCondition l_error = EC_Normal; DcmTag medSOPClassTag( DCM_MediaStorageSOPClassUID ); DcmUniqueIdentifier *mediaStorageSOPClassUID = new DcmUniqueIdentifier( medSOPClassTag ); const char* valueUID = UID_MediaStorageDirectoryStorage; mediaStorageSOPClassUID->putString( valueUID ); metaInfo.insert( mediaStorageSOPClassUID, OFTrue ); return l_error; } // ******************************** void DcmDicomDir::print(STD_NAMESPACE ostream&out, const size_t flags, const int level, const char *pixelFileName, size_t *pixelCounter) { int i; for ( i=0; iprint(out, flags, 1, pixelFileName, pixelCounter); // friend class out << OFendl; for ( i=0; icardSub(); for (unsigned long i = 0; i < lastIndex; i++ ) { DcmDirectoryRecord *subRecord = startRec->getSub( i ); const char* subName = subRecord->lookForReferencedFileID(); // friend if ( subName != NULL && !strcmp( filename, subName ) ) { DCMDATA_DEBUG("DcmDicomDir::recurseMatchFile() Record p=" << OFstatic_cast(void *, subRecord) << " with matching filename [" << subName << "] found"); retRec = subRecord; break; } else retRec = recurseMatchFile( subRecord, filename ); } } return retRec; } // ******************************** DcmDirectoryRecord* DcmDicomDir::searchMatchFile( DcmSequenceOfItems& recSeq, const char *filename ) { DcmDirectoryRecord* retRec = NULL; if ( filename != NULL && *filename != '\0' ) { unsigned long lastIndex = recSeq.card(); for (unsigned long i = 0; i < lastIndex; i++ ) { DcmDirectoryRecord *record; record = OFstatic_cast(DcmDirectoryRecord *, recSeq.getItem( i )); const char* subName = record->lookForReferencedFileID(); // friend if ( subName != NULL && !strcmp( filename, subName ) ) { DCMDATA_DEBUG("DcmDicomDir::searchMatchFile() Record p=" << OFstatic_cast(void *, record) << " with matching filename [" << subName << "] found"); retRec = record; break; } } } return retRec; } // ******************************** DcmDirectoryRecord* DcmDicomDir::matchFilename( const char *filename ) { DcmDirectoryRecord* retRec = NULL; if ( filename != NULL && *filename != '\0' ) { retRec = recurseMatchFile( &getRootRecord(), filename ); if ( retRec == NULL ) { retRec = searchMatchFile( getMRDRSequence(), filename ); if ( retRec == NULL ) { DcmDataset &dset = getDataset(); retRec = searchMatchFile( getDirRecSeq(dset), filename ); } } } if (retRec == NULL) { DCMDATA_DEBUG("DcmDicomDir::matchFilename() No Record with matching filename [" << filename << "] found"); } return retRec; } // ******************************** DcmDirectoryRecord* DcmDicomDir::matchOrCreateMRDR( const char *filename ) { DcmDirectoryRecord* newMRDR = NULL; DcmDirectoryRecord* matchRec = matchFilename( filename ); if ( matchRec != NULL ) { if ( matchRec->getRecordType() == ERT_Mrdr ) newMRDR = matchRec; else if ( matchRec->getRecordType() != ERT_root ) { newMRDR = new DcmDirectoryRecord( ERT_Mrdr, filename, NULL); if ( matchRec->assignToMRDR( newMRDR ) != EC_IllegalCall ) getMRDRSequence().insert( newMRDR ); else { delete newMRDR; newMRDR = NULL; DCMDATA_ERROR("DcmDicomDir: Internal ERROR: Can't Create MRDR"); } if (newMRDR != NULL) { DCMDATA_DEBUG("DcmDicomDir::matchOrCreateMRDR() New MRDR p=" << OFstatic_cast(void *, newMRDR) << " with matching filename [" << filename << "] created, original Record p=" << OFstatic_cast(void *, matchRec) << " with same filename modified"); } modified = OFTrue; } } if (newMRDR == NULL) DCMDATA_WARN("DcmDicomDir::matchOrCreateMRDR() No MRDR with matching filename [" << filename << "] found"); return newMRDR; } // ******************************** // ******************************** OFCondition DcmDicomDir::write(const E_TransferSyntax oxfer, const E_EncodingType enctype, const E_GrpLenEncoding glenc) { if ( oxfer != DICOMDIR_DEFAULT_TRANSFERSYNTAX ) { DCMDATA_ERROR("DcmDicomDir::write() Wrong TransferSyntax used, only LittleEndianExplicit allowed"); } errorFlag = EC_Normal; E_TransferSyntax outxfer = DICOMDIR_DEFAULT_TRANSFERSYNTAX; /* find the path of the dicomdir to be created */ OFString tempfilename = dicomDirFileName; size_t pathsepposition = tempfilename.rfind(PATH_SEPARATOR); if (pathsepposition == OFString_npos) tempfilename.erase(); else tempfilename.erase(pathsepposition +1); // create template for temporary file tempfilename += TEMPNAME_TEMPLATE; // copy template into non-const buffer char *tempfile = new char[tempfilename.size() + 1]; OFStandard::strlcpy(tempfile, tempfilename.c_str(), tempfilename.size() + 1); #ifdef HAVE_MKSTEMP int tempfilefd = mkstemp(tempfile); if (tempfilefd < 0) { char buf[256]; DCMDATA_ERROR("DcmDicomDir: Cannot create DICOMDIR temporary file: " << tempfile); delete[] tempfile; const char *text = OFStandard::strerror(errno, buf, sizeof(buf)); if (text == NULL) text = "(unknown error code)"; errorFlag = makeOFCondition(OFM_dcmdata, 19, OF_error, text); return errorFlag; } FILE *f = fdopen(tempfilefd, "wb"); if (f == NULL) { char buf[256]; DCMDATA_ERROR("DcmDicomDir: Cannot create DICOMDIR temporary file: " << tempfile); delete[] tempfile; const char *text = OFStandard::strerror(errno, buf, sizeof(buf)); if (text == NULL) text = "(unknown error code)"; errorFlag = makeOFCondition(OFM_dcmdata, 19, OF_error, text); return errorFlag; } DcmOutputFileStream *outStream = new DcmOutputFileStream(f); #else /* ! HAVE_MKSTEMP */ #ifdef HAVE_MKTEMP mktemp( tempfile ); #endif DcmOutputFileStream *outStream = new DcmOutputFileStream(tempfile); #endif /* HAVE_MKSTEMP */ if (! outStream->good()) { DCMDATA_ERROR("DcmDicomDir: Cannot create DICOMDIR temporary file: " << tempfile); errorFlag = outStream->status(); delete[] tempfile; delete outStream; return errorFlag; } DcmDataset &dset = getDataset(); // guaranteed to exist DcmMetaInfo &metainfo = *(getDirFileFormat().getMetaInfo()); DcmSequenceOfItems &localDirRecSeq = getDirRecSeq( dset ); DcmTag unresSeqTag( DCM_DirectoryRecordSequence ); DcmSequenceOfItems localUnresRecs( unresSeqTag ); // insert Media Stored SOP Class UID insertMediaSOPUID( metainfo ); getDirFileFormat().validateMetaInfo( outxfer ); { // it is important that the cache object is destroyed before the file is renamed! // Therefore, the variable declaration is "encapsulated" in curly brackets. DcmWriteCache wcache; metainfo.transferInit(); metainfo.write(*outStream, META_HEADER_DEFAULT_TRANSFERSYNTAX, enctype, &wcache); metainfo.transferEnd(); Uint32 beginOfDataset = OFstatic_cast(Uint32, outStream->tell()); // convert to writable format errorFlag = convertTreeToLinear(beginOfDataset, outxfer, enctype, glenc, localUnresRecs); dset.transferInit(); // do not calculate GroupLength and Padding twice! dset.write(*outStream, outxfer, enctype, &wcache, EGL_noChange); dset.transferEnd(); } // outStream is closed here delete outStream; char* backupname = NULL; if ( !mustCreateNewDir ) { #ifndef DICOMDIR_WITHOUT_BACKUP backupname = new char[ 1 + strlen( dicomDirFileName ) + strlen( DICOMDIR_BACKUP_SUFFIX ) ]; strcpy( backupname, dicomDirFileName ); #ifndef HAVE_LONG_FILE_NAMES char *suffix = strrchr( backupname, '.' ); if ( suffix ) *suffix = '\0'; #endif strcat( backupname, DICOMDIR_BACKUP_SUFFIX ); unlink( backupname ); if (errorFlag == EC_Normal) { if (rename(dicomDirFileName, backupname) != 0) { char buf[256]; const char *text = OFStandard::strerror(errno, buf, sizeof(buf)); if (text == NULL) text = "(unknown error code)"; errorFlag = makeOFCondition(OFM_dcmdata, 19, OF_error, text); } } #else if ( unlink( dicomDirFileName ) != 0 ) { char buf[256]; const char *text = OFStandard::strerror(errno, buf, sizeof(buf)); if (text == NULL) text = "(unknown error code)"; errorFlag = makeOFCondition(OFM_dcmdata, 19, OF_error, text); } #endif } if (errorFlag == EC_Normal && rename( tempfile, dicomDirFileName ) != 0) { char buf[256]; const char *text = OFStandard::strerror(errno, buf, sizeof(buf)); if (text == NULL) text = "(unknown error code)"; errorFlag = makeOFCondition(OFM_dcmdata, 19, OF_error, text); } delete[] tempfile; modified = OFFalse; if (errorFlag == EC_Normal && backupname != NULL) { /* remove backup */ unlink(backupname); delete[] backupname; } // remove all records from sequence localDirRecSeq while ( localDirRecSeq.card() > 0 ) localDirRecSeq.remove(OFstatic_cast(unsigned long, 0)); // move records to which no pointer exists back while ( localUnresRecs.card() > 0 ) { DcmItem *unresRecord = localUnresRecs.remove(OFstatic_cast(unsigned long, 0)); localDirRecSeq.insert( unresRecord ); } return errorFlag; } // ******************************** // ******************************** OFCondition DcmDicomDir::countMRDRRefs( DcmDirectoryRecord *startRec, ItemOffset *refCounter, const unsigned long numCounters ) { OFCondition l_error = EC_Normal; if ( refCounter == NULL ) l_error = EC_IllegalCall; else if ( startRec != NULL ) { unsigned long lastIndex = startRec->cardSub(); for (unsigned long i = 0; i < lastIndex; i++ ) { DcmDirectoryRecord *subRecord = startRec->getSub( i ); DcmDirectoryRecord *refMRDR = subRecord->lookForReferencedMRDR(); // friend class if ( refMRDR != NULL ) { unsigned long j; for ( j = 0; j < numCounters; j++ ) if ( refMRDR == refCounter[ j ].item ) { ++refCounter[ j ].fileOffset; // Reference counter break; } DCMDATA_DEBUG("DcmDicomDir::countMRDRRefs() MRDR p=" << OFstatic_cast(void *, refMRDR) << " found, which is " << refMRDR->numberOfReferences << " times referenced and " << j << " times counted"); } countMRDRRefs( subRecord, refCounter, numCounters ); } } return l_error; } // ******************************** OFCondition DcmDicomDir::checkMRDRRefCounter( DcmDirectoryRecord *startRec, ItemOffset *refCounter, const unsigned long numCounters ) { OFCondition l_error = EC_Normal; if ( refCounter == NULL ) l_error = EC_IllegalCall; else if ( startRec != NULL ) { unsigned long lastIndex = startRec->cardSub(); for (unsigned long i = 0; i < lastIndex; i++ ) { DcmDirectoryRecord *subRecord = startRec->getSub( i ); DcmDirectoryRecord *refMRDR = subRecord->lookForReferencedMRDR(); // friend class if ( refMRDR != NULL ) { unsigned long j; for ( j = 0; j < numCounters; j++ ) if ( refMRDR == refCounter[ j ].item ) { ++refCounter[ j ].fileOffset; // reference counter break; } DCMDATA_DEBUG("DcmDicomDir::checkMRDRRefCounter() MRDR p=" << OFstatic_cast(void *, refMRDR) << " found, which is " << refMRDR->numberOfReferences << " times referenced and " << j << " times counted"); } OFCondition err1 = checkMRDRRefCounter( subRecord, refCounter, numCounters ); if ( l_error == EC_Normal && err1 != EC_Normal ) l_error = err1; // the first error counts } } return l_error; } // ******************************** /* GERMAN COMMENT - PLEASE IGNORE Strategie fuer verify (mit autocorrect==OFTrue): - lege Tabelle an mit Zeigern auf MRDRs und Referenzzaehlern mit der Groesse getDirRecSeq( getDataset() ).card() + getMRDRSequence().card() - durchlaufe den Record-Baum und erhoehe bei jedem Auftreten eines MRDR-Verweises, den entsprechenden Zaehler in obiger Tabelle - setze in allen MRDRs, auf die laut Tabelle kein Verweis existiert, das activation flag auf INAKTIV PENDING: - ueberpruefe fuer alle inaktiven MRDRs, ob deren referenzierte Dateien von keinem anderen Record referenziert werden und loesche dann gegebenenfalls die Dateien - loesche alle inaktiven MRDRs aus der Sequenz getMRDRSequence() - uebertrage alle aktiven MRDRs aus der Sequenz getDirRecSeq( getDataset() ) in die Sequenz getMRDRSequence() - loesche die gesamte Sequenz getDirRecSeq( getDataset() ), unter Inkaufnahme eines Datenverlustes: es kann nicht automatisch entschieden werden, an welche Position innerhalb der Record-Hierearchie die zu loeschenden Records eingefuegt werden muessen */ OFCondition DcmDicomDir::verify( OFBool autocorrect ) { errorFlag = EC_Normal; DcmSequenceOfItems &localDirRecSeq = getDirRecSeq(getDataset()); unsigned long maxMRDRs = localDirRecSeq.card() + getMRDRSequence().card(); ItemOffset *refCounter = new ItemOffset[ maxMRDRs ]; // create MRDR table for MRDRs from MRDRSeq and from DirRecSeq: unsigned long i; for ( i = 0; i < getMRDRSequence().card(); i++ ) { DcmDirectoryRecord *rec; rec = OFstatic_cast(DcmDirectoryRecord *, getMRDRSequence().getItem( i )); refCounter[i].item = rec; refCounter[i].fileOffset = 0L; } for (unsigned long j = 0; j < localDirRecSeq.card() && i < maxMRDRs; j++ ) { DcmDirectoryRecord *rec; rec = OFstatic_cast(DcmDirectoryRecord *, localDirRecSeq.getItem( j )); if ( rec->getRecordType() == ERT_Mrdr ) { refCounter[i].item = rec; refCounter[i].fileOffset = 0L; i++; } } // maxMRDRs = i; // adjust table size to real value // count number of references for each MRDR countMRDRRefs( &getRootRecord(), refCounter, maxMRDRs ); // check stored reference counters for correctness OFCondition err3 = EC_Normal; for (unsigned long k = 0; k < maxMRDRs; k++ ) { DcmDirectoryRecord *refMRDR = OFstatic_cast(DcmDirectoryRecord *, refCounter[k].item); Uint32 refNum = refMRDR->lookForNumberOfReferences(); // friend if ( refCounter[k].fileOffset != refNum ) { DCMDATA_ERROR("DcmDicomDir::verify() Reference counter of MRDR p=" << OFstatic_cast(void *, refMRDR) << " has incorrect value=" << refNum << " (must be " << refCounter[k].fileOffset << ")"); if (refCounter[k].fileOffset==refMRDR->numberOfReferences) DCMDATA_ERROR("but internal record class value numberOfReferences is correct"); if ( autocorrect ) // correct reference counter, friend refMRDR->setNumberOfReferences( refCounter[k].fileOffset ); else err3 = EC_CorruptedData; } // set inactivation flag for MRDRs without reference if ( autocorrect && refCounter[k].fileOffset == 0L ) refMRDR->setRecordInUseFlag( 0xffff ); } delete[] refCounter; OFCondition err1 = getDirFileFormat().verify( autocorrect ); OFCondition err2 = getRootRecord().verify( OFFalse ); // no automatic correction if ( errorFlag == EC_Normal && ( err1 != EC_Normal || err2 != EC_Normal || err3 != EC_Normal ) ) errorFlag = EC_CorruptedData; return errorFlag; } // ******************************** /* ** CVS/RCS Log: ** $Log: dcdicdir.cc,v $ ** Revision 1.61 2010-10-14 13:14:07 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.60 2010-08-18 15:13:23 joergr ** Added const specifier to char pointers where appropriate. Thanks to forum ** user "takeos" for the report. ** ** Revision 1.59 2010-06-03 10:28:40 joergr ** Replaced calls to strerror() by new helper function OFStandard::strerror() ** which results in using the thread safe version of strerror() if available. ** ** Revision 1.58 2010-03-01 09:08:45 uli ** Removed some unnecessary include directives in the headers. ** ** Revision 1.57 2009-12-04 17:14:34 joergr ** Slightly modified some log messages. ** ** Revision 1.56 2009-11-13 13:11:20 joergr ** Fixed minor issues in log output. ** ** Revision 1.55 2009-11-04 09:58:09 uli ** Switched to logging mechanism provided by the "new" oflog module ** ** Revision 1.54 2009-09-28 13:30:59 joergr ** Moved general purpose definition file from module dcmdata to ofstd, and ** added new defines in order to make the usage easier. ** ** Revision 1.53 2009-02-25 13:10:56 joergr ** Fixed file locking issue that prevented DICOMDIR files with large element ** values (e.g. pixel data inside an IconImageSequence) from being renamed. ** ** Revision 1.52 2009-02-04 18:01:23 joergr ** Fixed various type mismatches reported by MSVC introduced with OFFile class. ** ** Revision 1.51 2008-04-30 12:38:42 meichel ** Fixed compile errors due to changes in attribute tag names ** ** Revision 1.50 2007/11/29 14:30:21 meichel ** Write methods now handle large raw data elements (such as pixel data) ** without loading everything into memory. This allows very large images to ** be sent over a network connection, or to be copied without ever being ** fully in memory. ** ** Revision 1.49 2006/08/15 15:49:54 meichel ** Updated all code in module dcmdata to correctly compile when ** all standard C++ classes remain in namespace std. ** ** Revision 1.48 2005/12/08 15:41:02 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.47 2005/11/28 15:53:13 meichel ** Renamed macros in dcdebug.h ** ** Revision 1.46 2005/11/07 16:59:26 meichel ** Cleaned up some copy constructors in the DcmObject hierarchy. ** ** Revision 1.45 2004/09/24 08:45:55 joergr ** Replaced "delete" statement by "delete[]" (object created with "new[]"). ** ** Revision 1.44 2004/08/03 11:41:09 meichel ** Headers libc.h and unistd.h are now included via ofstdinc.h ** ** Revision 1.43 2004/03/16 13:44:03 joergr ** Renamed UID_BasicDirectoryStorageSOPClass to UID_MediaStorageDirectoryStorage. ** ** Revision 1.42 2004/02/04 16:25:41 joergr ** Adapted type casts to new-style typecast operators defined in ofcast.h. ** Removed acknowledgements with e-mail addresses from CVS log. ** Translated remaining German comments. ** ** Revision 1.41 2004/01/21 10:39:10 meichel ** Added special handling for platforms where mkstemp() exists but no ** prototype is defined. ** ** Revision 1.40 2003/11/07 13:51:39 meichel ** Now using mkstemp instead of mktemp if available ** ** Revision 1.39 2002/12/06 13:10:46 joergr ** Enhanced "print()" function by re-working the implementation and replacing ** the boolean "showFullData" parameter by a more general integer flag. ** Made source code formatting more consistent with other modules/files. ** ** Revision 1.38 2002/11/27 12:06:43 meichel ** Adapted module dcmdata to use of new header file ofstdinc.h ** ** Revision 1.37 2002/08/27 16:55:44 meichel ** Initial release of new DICOM I/O stream classes that add support for stream ** compression (deflated little endian explicit VR transfer syntax) ** ** Revision 1.36 2002/08/21 10:14:20 meichel ** Adapted code to new loadFile and saveFile methods, thus removing direct ** use of the DICOM stream classes. ** ** Revision 1.35 2002/04/16 13:43:15 joergr ** Added configurable support for C++ ANSI standard includes (e.g. streams). ** ** Revision 1.34 2001/11/01 16:14:55 meichel ** Fixed bug in dcmdata affecting the creation of a temporary file for a ** DICOMDIR when an explicit path is given. ** ** Revision 1.33 2001/09/25 17:19:47 meichel ** Adapted dcmdata to class OFCondition ** ** Revision 1.32 2001/06/01 15:49:00 meichel ** Updated copyright header ** ** Revision 1.31 2000/04/14 15:55:03 meichel ** Dcmdata library code now consistently uses ofConsole for error output. ** ** Revision 1.30 2000/03/08 16:26:31 meichel ** Updated copyright header. ** ** Revision 1.29 2000/03/06 18:12:08 joergr ** Avoid empty statement in the body of if-statements (MSVC6 reports warnings). ** ** Revision 1.28 2000/03/03 14:05:31 meichel ** Implemented library support for redirecting error messages into memory ** instead of printing them to stdout/stderr for GUI applications. ** ** Revision 1.27 2000/02/23 15:11:48 meichel ** Corrected macro for Borland C++ Builder 4 workaround. ** ** Revision 1.26 2000/02/10 10:52:17 joergr ** Added new feature to dcmdump (enhanced print method of dcmdata): write ** pixel data/item value fields to raw files. ** ** Revision 1.25 2000/02/02 14:32:48 joergr ** Replaced 'delete' statements by 'delete[]' for objects created with 'new[]'. ** ** Revision 1.24 2000/02/01 10:12:04 meichel ** Avoiding to include as extern "C" on Borland C++ Builder 4, ** workaround for bug in compiler header files. ** ** Revision 1.23 1999/03/31 09:25:20 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.22 1999/03/22 09:58:55 meichel ** Reworked data dictionary based on the 1998 DICOM edition and the latest ** supplement versions. Corrected dcmtk applications for minor changes ** in attribute name constants. ** ** Revision 1.21 1998/07/15 15:51:49 joergr ** Removed several compiler warnings reported by gcc 2.8.1 with ** additional options, e.g. missing copy constructors and assignment ** operators, initialization of member variables in the body of a ** constructor instead of the member initialization list, hiding of ** methods by use of identical names, uninitialized member variables, ** missing const declaration of char pointers. Replaced tabs by spaces. ** ** Revision 1.20 1998/06/29 12:17:59 meichel ** Removed some name clashes (e.g. local variable with same ** name as class member) to improve maintainability. ** Applied some code purifications proposed by the gcc 2.8.1 -Weffc++ option. ** ** Revision 1.19 1998/01/27 10:51:38 meichel ** Removed some unused variables, meaningless const modifiers ** and unreached statements. ** ** Revision 1.18 1997/09/11 15:02:05 hewett ** Changed DcmDicomDir constructor to take const char* arguments. ** ** Revision 1.17 1997/07/21 08:03:27 andreas ** - DcmDirectoryRecord can be build with a referenced Name and a source ** filename. These name now can differ (lower case - upper case ** characters). ** - Replace all boolean types (BOOLEAN, CTNBOOLEAN, DICOM_BOOL, BOOL) ** with one unique boolean type OFBool. ** ** Revision 1.16 1997/07/03 15:09:55 andreas ** - removed debugging functions Bdebug() and Edebug() since ** they write a static array and are not very useful at all. ** Cdebug and Vdebug are merged since they have the same semantics. ** The debugging functions in dcmdata changed their interfaces ** (see dcmdata/include/dcdebug.h) ** ** Revision 1.15 1997/05/28 12:42:40 andreas ** - deleted unused variable lastDirIndex ** ** Revision 1.14 1997/05/16 08:31:27 andreas ** - Revised handling of GroupLength elements and support of ** DataSetTrailingPadding elements. The enumeratio E_GrpLenEncoding ** got additional enumeration values (for a description see dctypes.h). ** addGroupLength and removeGroupLength methods are replaced by ** computeGroupLengthAndPadding. To support Padding, the parameters of ** element and sequence write functions changed. ** ** Revision 1.13 1997/05/09 13:15:44 hewett ** Fixed bug related to renaming of temporary files accross file system ** boundaries (the rename() system call fails). The temporary file used ** diring creation of a DICOMDIR is now created in the same file system ** directory as the DICOMDIR. ** ** Revision 1.12 1997/05/06 09:32:10 hewett ** Temporary DICOMDIR files are now located in the tmp directory using ** the tmpnam() function (if available). Previously, temporary files ** were being created in the current working directory. ** ** Revision 1.11 1997/04/24 12:10:47 hewett ** Fixed DICOMDIR generation bug affecting inclusion of Group Length ** attributes (file offsets were not being computed correctly). ** Fixed DICOMDIR generation bug affecting ordering of ** patient/study/series/image records (item insertion into a sequence ** did produce the expected ordering). ** Fixed DICOMDIR generation bug affecting the use of Unknown VR ** attributes (the file offsets were not being computed correctly). ** ** Revision 1.10 1997/04/18 08:17:14 andreas ** - The put/get-methods for all VRs did not conform to the C++-Standard ** draft. Some Compilers (e.g. SUN-C++ Compiler, Metroworks ** CodeWarrier, etc.) create many warnings concerning the hiding of ** overloaded get methods in all derived classes of DcmElement. ** So the interface of all value representation classes in the ** library are changed rapidly, e.g. ** OFCondition get(Uint16 & value, const unsigned long pos); ** becomes ** OFCondition getUint16(Uint16 & value, const unsigned long pos); ** All (retired) "returntype get(...)" methods are deleted. ** For more information see dcmdata/include/dcelem.h ** ** Revision 1.9 1997/04/15 16:12:09 hewett ** Modified code which printed a message on stderr when creating a new DICOM ** to use the debug routines instead. ** ** Revision 1.8 1997/03/26 17:03:40 hewett ** Smoothed out some poor indentation. ** ** Revision 1.7 1997/02/06 12:11:20 hewett ** Updated for Macintosh CodeWarrior 11. Corrected for incompatibilities ** in the timeval structure between unix.h and winsock.h ** ** Revision 1.6 1996/09/27 08:23:07 hewett ** Preliminary support for IBM AIX systems using the IBM C Set++ compiler. ** Corrected mismatch between method definition in .h and .cc files. ** ** Revision 1.5 1996/08/05 08:46:09 andreas ** new print routine with additional parameters: ** - print into files ** - fix output length for elements ** corrected error in search routine with parameter ESM_fromStackTop ** ** Revision 1.4 1996/01/29 13:38:24 andreas ** - new put method for every VR to put value as a string ** - better and unique print methods ** ** Revision 1.3 1996/01/23 17:29:24 andreas ** Support for old fashioned make without @^ ** Support for machines that have mktemp but do not define it. ** ** Revision 1.2 1996/01/05 13:27:34 andreas ** - changed to support new streaming facilities ** - unique read/write methods for file and block transfer ** - more cleanups ** */ dcmtk-3.6.0/dcmdata/libsrc/vrscanl.c0000644000310500011400000126355011455600164016544 0ustar joergrdicom3#line 2 "vrscanl.c" #line 4 "vrscanl.c" #define YY_INT_ALIGNED short int /* A lexical scanner generated by flex */ #define FLEX_SCANNER #define YY_FLEX_MAJOR_VERSION 2 #define YY_FLEX_MINOR_VERSION 5 #define YY_FLEX_SUBMINOR_VERSION 33 #if YY_FLEX_SUBMINOR_VERSION > 0 #define FLEX_BETA #endif /* First, we deal with platform-specific or compiler-specific issues. */ /* begin standard C headers. */ #include #include #include #include /* end standard C headers. */ /* flex integer type definitions */ #ifndef FLEXINT_H #define FLEXINT_H /* C99 systems have . Non-C99 systems may or may not. */ #if __STDC_VERSION__ >= 199901L /* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, * if you want the limit (max/min) macros for int types. */ #ifndef __STDC_LIMIT_MACROS #define __STDC_LIMIT_MACROS 1 #endif #include typedef int8_t flex_int8_t; typedef uint8_t flex_uint8_t; typedef int16_t flex_int16_t; typedef uint16_t flex_uint16_t; typedef int32_t flex_int32_t; typedef uint32_t flex_uint32_t; #else typedef signed char flex_int8_t; typedef short int flex_int16_t; typedef int flex_int32_t; typedef unsigned char flex_uint8_t; typedef unsigned short int flex_uint16_t; typedef unsigned int flex_uint32_t; #endif /* ! C99 */ /* Limits of integral types. */ #ifndef INT8_MIN #define INT8_MIN (-128) #endif #ifndef INT16_MIN #define INT16_MIN (-32767-1) #endif #ifndef INT32_MIN #define INT32_MIN (-2147483647-1) #endif #ifndef INT8_MAX #define INT8_MAX (127) #endif #ifndef INT16_MAX #define INT16_MAX (32767) #endif #ifndef INT32_MAX #define INT32_MAX (2147483647) #endif #ifndef UINT8_MAX #define UINT8_MAX (255U) #endif #ifndef UINT16_MAX #define UINT16_MAX (65535U) #endif #ifndef UINT32_MAX #define UINT32_MAX (4294967295U) #endif #endif /* ! FLEXINT_H */ #ifdef __cplusplus /* The "const" storage-class-modifier is valid. */ #define YY_USE_CONST #else /* ! __cplusplus */ #if __STDC__ #define YY_USE_CONST #endif /* __STDC__ */ #endif /* ! __cplusplus */ #ifdef YY_USE_CONST #define yyconst const #else #define yyconst #endif /* Returned upon end-of-file. */ #define YY_NULL 0 /* Promotes a possibly negative, possibly signed char to an unsigned * integer for use as an array index. If the signed char is negative, * we want to instead treat it as an 8-bit unsigned char, hence the * double cast. */ #define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) /* An opaque pointer. */ #ifndef YY_TYPEDEF_YY_SCANNER_T #define YY_TYPEDEF_YY_SCANNER_T typedef void* yyscan_t; #endif /* For convenience, these vars (plus the bison vars far below) are macros in the reentrant scanner. */ #define yyin yyg->yyin_r #define yyout yyg->yyout_r #define yyextra yyg->yyextra_r #define yyleng yyg->yyleng_r #define yytext yyg->yytext_r #define yylineno (YY_CURRENT_BUFFER_LVALUE->yy_bs_lineno) #define yycolumn (YY_CURRENT_BUFFER_LVALUE->yy_bs_column) #define yy_flex_debug yyg->yy_flex_debug_r int yylex_init (yyscan_t* scanner); /* Enter a start condition. This macro really ought to take a parameter, * but we do it the disgusting crufty way forced on us by the ()-less * definition of BEGIN. */ #define BEGIN yyg->yy_start = 1 + 2 * /* Translate the current start state into a value that can be later handed * to BEGIN to return to the state. The YYSTATE alias is for lex * compatibility. */ #define YY_START ((yyg->yy_start - 1) / 2) #define YYSTATE YY_START /* Action number for EOF rule of a given start state. */ #define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) /* Special action meaning "start processing a new file". */ #define YY_NEW_FILE yyrestart(yyin ,yyscanner ) #define YY_END_OF_BUFFER_CHAR 0 /* Size of default input buffer. */ #ifndef YY_BUF_SIZE #define YY_BUF_SIZE 16384 #endif /* The state buf must be large enough to hold one state per character in the main buffer. */ #define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) #ifndef YY_TYPEDEF_YY_BUFFER_STATE #define YY_TYPEDEF_YY_BUFFER_STATE typedef struct yy_buffer_state *YY_BUFFER_STATE; #endif #define EOB_ACT_CONTINUE_SCAN 0 #define EOB_ACT_END_OF_FILE 1 #define EOB_ACT_LAST_MATCH 2 #define YY_LESS_LINENO(n) /* Return all but the first "n" matched characters back to the input stream. */ #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ *yy_cp = yyg->yy_hold_char; \ YY_RESTORE_YY_MORE_OFFSET \ yyg->yy_c_buf_p = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ YY_DO_BEFORE_ACTION; /* set up yytext again */ \ } \ while ( 0 ) #define unput(c) yyunput( c, yyg->yytext_ptr , yyscanner ) /* The following is because we cannot portably get our hands on size_t * (without autoconf's help, which isn't available because we want * flex-generated scanners to compile on their own). */ #ifndef YY_TYPEDEF_YY_SIZE_T #define YY_TYPEDEF_YY_SIZE_T typedef unsigned int yy_size_t; #endif #ifndef YY_STRUCT_YY_BUFFER_STATE #define YY_STRUCT_YY_BUFFER_STATE struct yy_buffer_state { FILE *yy_input_file; char *yy_ch_buf; /* input buffer */ char *yy_buf_pos; /* current position in input buffer */ /* Size of input buffer in bytes, not including room for EOB * characters. */ yy_size_t yy_buf_size; /* Number of characters read into yy_ch_buf, not including EOB * characters. */ int yy_n_chars; /* Whether we "own" the buffer - i.e., we know we created it, * and can realloc() it to grow it, and should free() it to * delete it. */ int yy_is_our_buffer; /* Whether this is an "interactive" input source; if so, and * if we're using stdio for input, then we want to use getc() * instead of fread(), to make sure we stop fetching input after * each newline. */ int yy_is_interactive; /* Whether we're considered to be at the beginning of a line. * If so, '^' rules will be active on the next match, otherwise * not. */ int yy_at_bol; int yy_bs_lineno; /**< The line count. */ int yy_bs_column; /**< The column count. */ /* Whether to try to fill the input buffer when we reach the * end of it. */ int yy_fill_buffer; int yy_buffer_status; #define YY_BUFFER_NEW 0 #define YY_BUFFER_NORMAL 1 /* When an EOF's been seen but there's still some text to process * then we mark the buffer as YY_EOF_PENDING, to indicate that we * shouldn't try reading from the input source any more. We might * still have a bunch of tokens to match, though, because of * possible backing-up. * * When we actually see the EOF, we change the status to "new" * (via yyrestart()), so that the user can continue scanning by * just pointing yyin at a new input file. */ #define YY_BUFFER_EOF_PENDING 2 }; #endif /* !YY_STRUCT_YY_BUFFER_STATE */ /* We provide macros for accessing buffer states in case in the * future we want to put the buffer states in a more general * "scanner state". * * Returns the top of the stack, or NULL. */ #define YY_CURRENT_BUFFER ( yyg->yy_buffer_stack \ ? yyg->yy_buffer_stack[yyg->yy_buffer_stack_top] \ : NULL) /* Same as previous macro, but useful when we know that the buffer stack is not * NULL or when we need an lvalue. For internal use only. */ #define YY_CURRENT_BUFFER_LVALUE yyg->yy_buffer_stack[yyg->yy_buffer_stack_top] void yyrestart (FILE *input_file ,yyscan_t yyscanner ); void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ,yyscan_t yyscanner ); YY_BUFFER_STATE yy_create_buffer (FILE *file,int size ,yyscan_t yyscanner ); void yy_delete_buffer (YY_BUFFER_STATE b ,yyscan_t yyscanner ); void yy_flush_buffer (YY_BUFFER_STATE b ,yyscan_t yyscanner ); void yypush_buffer_state (YY_BUFFER_STATE new_buffer ,yyscan_t yyscanner ); void yypop_buffer_state (yyscan_t yyscanner ); static void yyensure_buffer_stack (yyscan_t yyscanner ); static void yy_load_buffer_state (yyscan_t yyscanner ); static void yy_init_buffer (YY_BUFFER_STATE b,FILE *file ,yyscan_t yyscanner ); #define YY_FLUSH_BUFFER yy_flush_buffer(YY_CURRENT_BUFFER ,yyscanner) YY_BUFFER_STATE yy_scan_buffer (char *base,yy_size_t size ,yyscan_t yyscanner ); YY_BUFFER_STATE yy_scan_string (yyconst char *yy_str ,yyscan_t yyscanner ); YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes,int len ,yyscan_t yyscanner ); void *yyalloc (yy_size_t ,yyscan_t yyscanner ); void *yyrealloc (void *,yy_size_t ,yyscan_t yyscanner ); void yyfree (void * ,yyscan_t yyscanner ); #define yy_new_buffer yy_create_buffer #define yy_set_interactive(is_interactive) \ { \ if ( ! YY_CURRENT_BUFFER ){ \ yyensure_buffer_stack (yyscanner); \ YY_CURRENT_BUFFER_LVALUE = \ yy_create_buffer(yyin,YY_BUF_SIZE ,yyscanner); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ } #define yy_set_bol(at_bol) \ { \ if ( ! YY_CURRENT_BUFFER ){\ yyensure_buffer_stack (yyscanner); \ YY_CURRENT_BUFFER_LVALUE = \ yy_create_buffer(yyin,YY_BUF_SIZE ,yyscanner); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ } #define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) /* Begin user sect3 */ #define yywrap(n) 1 #define YY_SKIP_YYWRAP typedef unsigned char YY_CHAR; typedef int yy_state_type; #define yytext_ptr yytext_r static yy_state_type yy_get_previous_state (yyscan_t yyscanner ); static yy_state_type yy_try_NUL_trans (yy_state_type current_state ,yyscan_t yyscanner); static int yy_get_next_buffer (yyscan_t yyscanner ); static void yy_fatal_error (yyconst char msg[] ,yyscan_t yyscanner ); /* Done after the current pattern has been matched and before the * corresponding action - sets up yytext. */ #define YY_DO_BEFORE_ACTION \ yyg->yytext_ptr = yy_bp; \ yyleng = (size_t) (yy_cp - yy_bp); \ yyg->yy_hold_char = *yy_cp; \ *yy_cp = '\0'; \ yyg->yy_c_buf_p = yy_cp; #define YY_NUM_RULES 19 #define YY_END_OF_BUFFER 20 /* This struct is not used in this scanner, but its presence is necessary. */ struct yy_trans_info { flex_int32_t yy_verify; flex_int32_t yy_nxt; }; static yyconst flex_int16_t yy_accept[1758] = { 0, 0, 0, 20, 18, 19, 18, 18, 18, 18, 18, 18, 18, 18, 16, 1, 12, 2, 7, 8, 10, 15, 0, 13, 5, 11, 0, 16, 16, 0, 1, 12, 12, 12, 0, 0, 0, 2, 0, 0, 0, 7, 7, 0, 0, 0, 8, 0, 0, 0, 10, 10, 10, 10, 10, 15, 15, 15, 17, 14, 0, 13, 13, 13, 0, 0, 5, 11, 11, 11, 16, 16, 0, 16, 0, 0, 12, 12, 12, 12, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 10, 10, 10, 10, 15, 15, 15, 15, 17, 14, 14, 14, 0, 13, 13, 13, 13, 14, 0, 13, 13, 13, 13, 13, 13, 5, 0, 0, 0, 11, 11, 11, 16, 16, 0, 0, 12, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 15, 15, 14, 0, 0, 0, 13, 13, 0, 0, 13, 13, 13, 14, 14, 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 13, 13, 13, 13, 13, 13, 5, 0, 0, 5, 5, 0, 11, 1, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 7, 0, 7, 0, 0, 7, 0, 0, 0, 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 14, 14, 0, 13, 13, 13, 0, 13, 13, 13, 13, 13, 0, 0, 13, 13, 13, 13, 13, 13, 13, 0, 13, 13, 13, 13, 13, 13, 0, 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 5, 0, 0, 0, 5, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 7, 0, 0, 0, 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 5, 0, 0, 4, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 5, 0, 0, 0, 0, 0, 0, 4, 2, 0, 4, 2, 0, 0, 0, 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 5, 0, 5, 0, 3, 0, 0, 0, 0, 0, 0, 9, 8, 0, 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 13, 13, 5, 0, 5, 0, 3, 0, 0, 0, 0, 3, 9, 0, 0, 0, 9, 8, 0, 0, 0, 9, 8, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 5, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 8, 9, 0, 0, 0, 8, 0, 0, 0, 5, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 8, 5, 0, 5, 0, 0, 0, 0, 0, 9, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 9, 0, 8, 0, 0, 0, 0, 9, 0, 0, 0, 8, 6, 0, 9, 8, 9, 0, 8, 0, 6, 6, 6, 9, 8, 9, 8, 0, 0, 6, 9, 8, 9, 8, 0, 9, 8, 9, 8, 9, 8, 9, 8, 9, 8, 9, 8, 9, 8, 0 } ; static yyconst flex_int32_t yy_ec[256] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 6, 8, 9, 6, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 6, 6, 21, 6, 6, 6, 22, 22, 22, 23, 24, 22, 22, 22, 22, 22, 22, 22, 23, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 22, 23, 22, 6, 25, 6, 26, 22, 6, 27, 6, 28, 29, 30, 6, 6, 6, 31, 6, 6, 32, 33, 34, 35, 36, 6, 6, 37, 38, 39, 6, 6, 6, 6, 6, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 } ; static yyconst flex_int32_t yy_meta[40] = { 0, 1, 2, 2, 3, 4, 5, 6, 6, 7, 8, 9, 9, 9, 9, 9, 10, 10, 10, 10, 11, 12, 13, 13, 14, 15, 16, 5, 5, 5, 17, 5, 5, 5, 5, 5, 5, 5, 5, 5 } ; static yyconst flex_int16_t yy_base[2921] = { 0, 0, 38, 1197,19143,19143, 0, 1153, 6, 1148, 7, 1134, 1131, 1131, 0, 1134, 1, 9, 10, 35, 73, 36, 0, 47, 38, 46, 50, 54, 57, 0, 1129, 88, 89, 90, 0, 4, 1118, 85, 94, 2, 0, 99, 113, 0, 35, 1116, 100, 1099, 123, 1, 144, 101, 122, 111, 165, 112, 139, 140, 1117, 141, 166, 180, 183, 189, 0, 129, 186, 125, 126, 143, 188, 194, 195, 197, 0, 0, 198, 202, 207, 211, 0, 222, 0, 232, 0, 39, 1107, 223, 224, 226, 249, 210, 252, 257, 0, 258, 0, 253, 0, 279, 0, 206, 1104, 289, 230, 270, 261, 271, 310, 273, 306, 305, 307, 308, 331, 341, 352, 332, 362, 370, 313, 386, 353, 374, 385, 387, 388, 1107, 389, 393, 395, 1050, 396, 397, 403, 411, 400, 1068, 422, 425, 428, 430, 435, 437, 439, 0, 455, 1038, 352, 432, 460, 447, 465, 1012, 0, 466, 468, 0, 0, 0, 0, 0, 459, 0, 469, 226, 479, 277, 0, 481, 483, 487, 490, 492, 396, 0, 0, 0, 0, 0, 508, 0, 518, 528, 493, 544, 494, 531, 532, 565, 548, 586, 543, 561, 560, 562, 568, 607, 596, 569, 590, 608, 629, 611, 650, 624, 646, 625, 633, 671, 647, 668, 669, 672, 675, 696, 706, 697, 698, 699, 1008, 984, 959, 700, 721, 945, 930, 723, 725, 730, 727, 732, 903, 729, 734, 740, 757, 738, 759, 765, 767, 774, 885, 762, 771, 784, 793, 769, 796, 798, 0, 0, 801, 810, 894, 480, 868, 867, 541, 731, 0, 0, 0, 0, 0, 799, 0, 802, 399, 815, 431, 0, 803, 500, 524, 0, 0, 0, 0, 841, 811, 837, 824, 836, 838, 862, 872, 839, 845, 863, 884, 866, 905, 887, 903, 900, 901, 902, 926, 936, 927, 928, 929, 950, 951, 952, 953, 954, 965, 986, 970, 1007, 967, 983, 981, 982, 984, 1028, 1017, 1049, 990, 1045, 1009, 1011, 1032, 1070, 1080, 1044, 1046, 1047, 1091, 1053, 1072, 1074, 843, 1093, 1095, 1106, 839, 1108, 1116, 1118, 1110, 1125, 799, 780, 1120, 1122, 1131, 1133, 1144, 1150, 1156, 776, 1135, 1148, 1158, 1167, 1161, 1173, 755, 751, 1162, 1175, 1184, 1186, 1191, 1197, 1199, 1208, 1190, 1214, 1201, 0, 0, 821, 1202, 0, 0, 750, 553, 0, 1220, 0, 1226, 1231, 1234, 0, 1203, 0, 1241, 0, 1237, 0, 1240, 578, 617, 1262, 1257, 1258, 1259, 1260, 1265, 1286, 1243, 1281, 1283, 1284, 1307, 1288, 1289, 1290, 1302, 1305, 1328, 1338, 1349, 1311, 1365, 1330, 1332, 1353, 1386, 1369, 1364, 1367, 1368, 1407, 1381, 1382, 1383, 1389, 1390, 1428, 1417, 1411, 1429, 1430, 1432, 1443, 1444, 1445, 1466, 1447, 1482, 1461, 1469, 1470, 1503, 1486, 1484, 1485, 1498, 1524, 1499, 1545, 1500, 1501, 1522, 1526, 1527, 1566, 1555, 1528, 1549, 1567, 1588, 1570, 1583, 1584, 1585, 1589, 1610, 1620, 1591, 1613, 1631, 1635, 1636, 1638, 1644, 1646, 1641, 1653, 747, 1650, 1643, 1668, 1674, 1676, 1682, 1679, 1684, 745, 712, 1681, 1686, 1693, 1691, 1708, 1710, 1716, 1718, 1715, 1725, 710, 1722, 1720, 1727, 1733, 1744, 1746, 1750, 1752, 1755, 1758, 1761, 1763, 0, 713, 1769, 1780, 0, 0, 1248, 1448, 1779, 681, 0, 1534, 0, 1642, 1785, 1789, 0, 1796, 0, 1799, 1807, 1788, 1823, 1810, 1811, 1822, 1844, 1827, 1825, 1826, 1839, 1865, 1840, 1841, 1847, 1848, 1862, 1886, 1896, 1863, 1869, 1887, 1888, 1890, 1909, 1911, 1932, 1913, 1914, 1915, 1916, 1927, 1953, 1963, 1928, 1930, 1954, 1975, 1956, 1957, 1978, 1979, 1990, 2011, 1995, 1992, 1993, 1994, 2006, 2007, 2015, 2030, 2032, 2033, 2034, 2036, 2037, 2038, 2059, 2034, 2080, 2043, 2055, 2062, 2076, 2077, 2101, 2039, 2078, 2083, 2084, 2122, 2099, 2105, 2117, 2118, 2120, 2143, 2153, 2164, 2124, 2180, 2126, 2145, 2147, 2201, 2182, 2179, 2182, 2183, 2222, 2196, 2197, 2198, 2204, 2205, 2243, 2232, 2226, 2244, 2245, 2247, 2258, 2259, 2260, 2261, 2266, 2268, 2270, 2271, 2276, 2283, 2285, 2274, 2293, 2295, 2298, 2300, 2302, 2308, 2310, 2317, 2307, 2325, 705, 2332, 2334, 2335, 2342, 2344, 2350, 2339, 2357, 2367, 2369, 2375, 2348, 2361, 2372, 2376, 2374, 2379, 2386, 2398, 2401, 2384, 2408, 2409, 2410, 2411, 0, 0, 709, 718, 0, 685, 688, 0, 660, 758, 0, 1919, 2187, 2427, 0, 649, 827, 0, 643, 963, 2431, 2435, 2444, 2403, 2460, 2427, 2448, 2459, 2481, 2464, 2462, 2463, 2476, 2502, 2477, 2478, 2484, 2485, 2499, 2523, 2533, 2500, 2506, 2524, 2525, 2527, 2546, 2548, 2549, 2550, 2551, 2552, 2553, 2554, 2575, 2550, 2596, 2577, 2593, 2591, 2592, 2594, 2617, 2556, 2600, 2615, 2618, 2639, 2621, 2634, 2636, 2640, 2642, 2663, 2673, 2664, 2665, 2666, 2667, 2688, 2689, 2690, 2691, 2692, 2693, 2694, 2695, 2696, 2717, 2692, 2701, 2718, 2719, 2720, 2732, 2733, 2734, 2755, 2736, 2776, 2750, 2772, 2751, 2759, 2773, 2797, 2736, 2774, 2780, 2795, 2818, 2799, 2801, 2813, 2814, 2816, 2839, 2849, 2820, 2822, 2841, 2843, 2860, 2862, 2864, 2885, 2866, 2867, 2868, 2869, 2881, 2906, 2916, 2883, 2907, 2908, 2929, 2910, 2931, 2932, 2933, 2944, 2965, 2949, 2946, 2947, 2948, 2960, 2961, 2969, 2984, 2986, 2987, 2988, 2990, 2991, 2992, 3013, 2699, 2994, 2996, 3009, 3028, 3030, 3031, 3032, 3034, 3036, 3038, 3039, 3044, 3061, 3063, 3042, 3049, 3066, 3068, 3071, 3072, 3074, 3080, 3097, 3078, 3099, 3104, 3105, 3102, 3106, 3108, 3110, 3111, 3116, 3133, 3135, 3114, 0, 0, 3138, 0, 2741, 612, 610, 622, 0, 604, 1318, 0, 582, 1374, 2872, 2992, 0, 511, 1399, 0, 492, 1454, 3159, 3140, 3141, 3143, 3156, 3157, 3180, 3190, 3162, 3181, 3183, 3204, 3202, 3205, 3206, 3207, 3208, 3229, 3239, 3230, 3231, 3232, 3233, 3254, 3255, 3256, 3257, 3258, 3259, 3260, 3261, 3262, 3283, 2995, 3264, 3265, 3266, 3267, 3298, 3299, 3300, 3321, 3302, 3342, 3304, 3305, 3316, 3317, 3323, 3363, 3352, 3344, 3345, 3346, 3384, 3367, 3379, 3380, 3381, 3382, 3405, 3415, 3386, 3388, 3407, 3409, 3426, 3428, 3430, 3431, 3432, 3433, 3434, 3435, 3436, 3457, 3265, 3438, 3439, 3440, 3461, 3472, 3473, 3474, 3495, 3476, 3478, 3479, 3490, 3491, 3497, 3512, 3513, 3514, 3535, 3477, 3556, 3516, 3518, 3519, 3530, 3531, 3577, 3520, 3537, 3552, 3553, 3598, 3554, 3558, 3559, 3560, 3575, 3619, 3608, 3581, 3600, 3602, 3621, 3623, 3634, 3635, 3636, 3637, 3638, 3640, 3642, 3644, 3665, 3301, 3686, 3646, 3663, 3661, 3667, 3682, 3707, 3644, 3684, 3688, 3689, 3728, 3690, 3703, 3705, 3711, 3724, 3749, 3759, 3726, 3730, 3732, 3751, 3753, 3770, 3772, 3774, 3775, 3776, 3777, 3778, 3779, 3800, 3307, 3781, 3782, 3803, 3804, 3815, 3816, 3817, 3838, 3819, 3821, 3822, 3833, 3840, 3855, 3856, 3857, 3862, 3859, 3863, 3865, 3867, 3868, 3874, 3881, 3889, 3871, 3872, 3896, 3898, 3899, 3904, 3906, 3903, 491, 0, 0, 0, 486, 1491, 469, 3901, 3780, 462, 420, 0, 3820, 0, 3824, 3214, 3333, 3927, 3910, 3943, 3911, 3925, 3942, 3964, 3945, 3946, 3959, 3960, 3985, 3961, 3967, 3968, 3982, 3983, 4006, 4016, 3989, 4007, 4008, 4010, 4029, 4031, 4032, 4033, 4034, 4035, 4036, 4037, 4038, 4059, 3907, 4040, 4041, 4042, 4043, 4074, 4075, 4076, 4097, 4078, 4080, 4081, 4092, 4093, 4099, 4114, 4115, 4116, 4137, 4077, 4158, 4118, 4120, 4121, 4132, 4133, 4179, 4082, 4139, 4154, 4155, 4200, 4156, 4160, 4161, 4162, 4177, 4221, 4122, 4183, 4195, 4196, 4198, 4202, 4223, 4204, 4219, 4225, 4238, 4240, 4242, 4244, 4265, 3950, 4246, 4247, 4248, 4249, 4261, 4263, 4280, 4301, 4282, 4284, 4296, 4297, 4298, 4299, 4303, 4305, 4320, 4341, 4245, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1568, 4322, 4362, 4324, 4358, 4336, 4337, 4339, 4383, 4281, 4345, 4360, 4366, 4404, 4379, 4381, 4385, 4387, 4400, 4425, 4286, 4402, 4406, 4408, 4421, 4423, 4440, 4427, 4429, 4442, 4444, 4446, 4448, 4450, 4471, 4321, 4452, 4455, 4467, 4469, 4473, 4474, 4486, 4507, 4488, 4528, 4490, 4524, 4502, 4503, 4505, 4549, 4325, 4511, 4526, 4532, 4570, 4545, 4547, 4551, 4553, 4566, 4591, 4490, 4568, 4572, 4574, 4587, 4589, 4606, 4593, 4595, 4608, 4610, 4612, 4614, 4616, 4637, 4451, 4618, 4621, 4633, 4635, 4639, 4640, 4652, 4673, 4654, 4656, 4668, 4669, 4670, 4671, 4675, 4677, 4692, 4713, 4656, 4694, 4696, 4708, 4710, 4715, 4717, 4732, 4734, 4736, 4738, 4739, 0, 4740, 425, 406, 0, 1593, 407, 0, 399, 1634, 4741, 4762, 0, 4617, 0, 4693, 4783, 4746, 4767, 4749, 4751, 4755, 4804, 4697, 4757, 4778, 4779, 4825, 4780, 4781, 4785, 4786, 4802, 4846, 4835, 4807, 4808, 4829, 4847, 4848, 4850, 4861, 4862, 4865, 4869, 4871, 4872, 4873, 4894, 4869, 4878, 4890, 4895, 4896, 4897, 4909, 4911, 4932, 4913, 4927, 4928, 4930, 4934, 4935, 4936, 4949, 4951, 4972, 4913, 0, 0, 0, 0, 0, 0, 0, 0, 0, 357, 4953, 4993, 4967, 4970, 4968, 4974, 4989, 5014, 4952, 4991, 4995, 4996, 5035, 4997, 5010, 5012, 5018, 5031, 5056, 4957, 5033, 5037, 5039, 5052, 5054, 5071, 5058, 5060, 5073, 5075, 5077, 5079, 5081, 5102, 4918, 5083, 5086, 5098, 5100, 5104, 5105, 5117, 5138, 5119, 5121, 5133, 5134, 5135, 5136, 5140, 5142, 5157, 5178, 5121, 5199, 5159, 5161, 5173, 5174, 5175, 5220, 5163, 5176, 5180, 5182, 5241, 5197, 5201, 5203, 5215, 5216, 5262, 5251, 5218, 5222, 5224, 5243, 5245, 5264, 5266, 5279, 5280, 5281, 5283, 5285, 5287, 5308, 5082, 5289, 5290, 5291, 5292, 5304, 5306, 5323, 5344, 5325, 5327, 5339, 5340, 5341, 5342, 5346, 5348, 5363, 5384, 5288, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1664, 5365, 5367, 5379, 5380, 0, 5381, 0, 309, 0, 5319, 0, 5329, 294, 5382, 1751, 1793, 0, 284, 5386, 1832, 1875, 0, 5405, 5409, 5430, 5403, 5413, 5414, 5426, 5427, 5451, 5364, 5428, 5432, 5449, 5472, 5453, 5454, 5455, 5467, 5468, 5493, 5369, 5470, 5476, 5489, 5491, 5494, 5508, 5495, 5497, 5510, 5512, 5516, 5518, 5519, 5540, 5518, 5535, 5537, 5541, 5542, 5543, 5544, 5556, 5577, 5558, 5559, 5572, 5573, 5574, 5575, 5580, 5581, 5596, 5617, 5560, 0, 0, 0, 0, 0, 0, 0, 0, 0, 278, 5598, 5599, 0, 5612, 0, 0, 0, 0, 0, 0, 0, 5597, 0, 3438, 5633, 0, 5602, 0, 3482, 5638, 5614, 1912, 1991, 0, 5639, 2003, 2214, 0, 5642, 0, 5643, 0, 0, 2306, 2341, 0, 277, 0, 242, 0, 0, 220, 0, 216, 0, 0, 5639, 0, 3515, 5649, 0, 5659, 0, 3587, 5654, 5650, 0, 5655, 0, 0, 0, 211, 185, 5676, 0, 179, 176, 5681, 0, 164, 0, 142, 0, 0, 133, 0, 99, 0, 0, 5671, 0, 98, 5672, 0, 5673, 0, 0, 95, 90, 5686, 0, 54, 41, 5695, 5682, 0, 5705, 5709, 5694, 0, 5700, 0, 5703, 5711, 5704, 5719, 5730, 5734, 5738, 0, 5737, 5726, 5749, 5753, 5757, 5761, 4, 5765, 5772, 5776, 5780, 5784, 5788, 5795, 5799, 5803, 5807, 5811, 5818, 5822, 5826,19143, 5851, 5865, 5875, 5887, 5895, 5907, 5915, 5928, 5944, 5959, 5969, 5981, 5995, 6005, 6008, 6020, 6028, 6031, 6039, 6046, 6060, 6068, 6071, 6079, 6086, 6098, 6111, 6126, 6141, 6156, 6171, 6181, 6185, 6193, 6205, 6215, 6218, 6221, 6224, 6227, 6234, 6246, 6249, 6256, 6266, 6269, 6272, 6279, 6291, 6303, 6315, 6327, 6339, 6347, 6354, 6366, 6379, 6394, 6410, 6425, 6440, 6455, 6470, 6485, 6500, 6515, 6530, 6545, 6560, 6575, 6590, 6605, 6620, 6635, 6649, 6657, 6660, 6664, 6673, 6685, 6695, 6702, 6710, 6713, 6716, 6719, 6724, 6731, 6743, 6746, 6753, 6767, 6781, 6793, 6796, 6799, 6802, 6805, 6812, 6824, 6836, 6848, 6860, 6872, 6884, 6896, 6908, 6920, 6932, 6944, 6956, 6968, 6980, 6992, 7004, 7016, 7029, 7044, 7059, 7074, 7089, 7104, 7119, 7134, 7149, 7164, 7179, 7194, 7209, 7224, 7239, 7254, 7269, 7284, 7299, 7314, 7329, 7344, 7359, 7374, 7389, 7404, 7419, 7434, 7449, 7459, 2409, 7466, 7474, 7478, 7486, 7489, 7492, 7495, 7500, 7507, 7519, 7522, 7525, 7528, 7535, 7547, 7559, 7571, 7583, 7595, 7607, 7619, 7631, 7643, 7655, 7667, 7679, 7691, 7703, 7715, 7727, 7739, 7751, 7763, 7775, 7787, 7799, 7811, 7823, 7835, 7847, 7859, 7871, 7883, 7895, 7907, 7920, 7935, 7950, 7965, 7980, 7995, 8010, 8025, 8040, 8055, 8070, 8085, 8100, 8115, 8130, 8145, 8160, 8175, 8190, 8205, 8220, 8235, 8250, 8265, 8280, 8295, 8310, 8325, 8340, 8355, 8370, 8385, 8400, 8415, 8430, 8445, 8459, 8467, 8470, 8473, 2442, 2470, 2513, 8476, 8479, 2574, 2628, 8486, 8498, 8510, 8522, 8534, 8546, 8558, 8570, 8582, 8594, 8606, 8618, 8630, 8642, 8654, 8666, 8678, 8690, 8702, 8714, 8726, 8738, 8750, 8762, 8774, 8786, 8798, 8810, 8822, 8834, 8846, 8858, 8870, 8882, 8894, 8906, 8918, 8930, 8942, 8954, 8966, 8978, 8990, 9002, 9014, 9026, 9038, 9050, 9062, 9074, 9086, 9099, 9114, 9129, 9144, 9159, 9174, 9189, 9204, 9219, 9234, 9249, 9264, 9279, 9294, 9309, 9324, 9339, 9354, 9369, 9384, 9399, 9414, 9429, 9444, 9459, 9474, 9489, 9504, 9519, 9534, 9549, 9564, 9579, 9594, 9609, 9624, 9639, 9654, 9664, 9671, 9683, 9691, 2653, 2753, 2866, 2958, 3036, 9698, 9710, 9722, 9734, 9746, 9758, 9770, 9782, 9794, 9806, 9818, 9830, 9842, 9854, 9866, 9878, 9890, 9902, 9914, 9926, 9938, 9950, 9962, 9974, 9986, 9998, 10010,10022,10034,10046,10058,10070,10082,10094,10106,10118, 10130,10142,10154,10166,10178,10190,10202,10214,10226,10238, 10250,10262,10274,10286,10298,10310,10322,10334,10346,10358, 10370,10382,10394,10406,10418,10430,10442,10454,10466,10478, 10490,10502,10514,10526,10538,10550,10562,10574,10586,10599, 10614,10629,10644,10659,10674,10689,10704,10719,10734,10749, 10764,10779,10794,10809,10824,10839,10854,10869,10884,10899, 10914,10929,10944,10959,10974,10989,11004,11019,11034,11049, 11064,11079,11094,11109, 3072,11119, 3080, 3140, 3170, 3865, 3924,11126,11138,11150,11162,11174,11186,11198,11210,11222, 11234,11246,11258,11270,11282,11294,11306,11318,11330,11342, 11354,11366,11378,11390,11402,11414,11426,11438,11450,11462, 11474,11486,11498,11510,11522,11534,11546,11558,11570,11582, 11594,11606,11618,11630,11642,11654,11666,11678,11690,11702, 11714,11726,11738,11750,11762,11774,11786,11798,11810,11822, 11834,11846,11858,11870,11882,11894,11906,11918,11930,11942, 11954,11966,11978,11990,12002,12014,12026,12038,12050,12062, 12074,12086,12098,12110,12122,12134,12146,12158,12170,12182, 12194,12206,12218,12230,12242,12254,12266,12278,12290,12302, 12314,12326,12338,12351,12366,12381,12396,12411,12426,12441, 12456,12471,12486,12501,12516,12531,12546,12561,12576,12591, 12606,12621,12636,12651,12666,12681,12696,12711,12726,12741, 12751,12754, 3997, 4042, 4118, 4251, 4496,12761,12773,12785, 12797,12809,12821,12833,12845,12857,12869,12881,12893,12905, 12917,12929,12941,12953,12965,12977,12989,13001,13013,13025, 13037,13049,13061,13073,13085,13097,13109,13121,13133,13145, 13157,13169,13181,13193,13205,13217,13229,13241,13253,13265, 13277,13289,13301,13313,13325,13337,13349,13361,13373,13385, 13397,13409,13421,13433,13445,13457,13469,13481,13493,13505, 13517,13529,13541,13553,13565,13577,13589,13601,13613,13625, 13637,13649,13661,13673,13685,13697,13709,13721,13733,13745, 13757,13769,13781,13793,13805,13817,13829,13841,13853,13865, 13877,13889,13901,13913,13925,13937,13949,13961,13973,13985, 13997,14009,14021,14033,14045,14057,14069,14081,14093,14105, 14117,14129,14141,14153,14165,14177,14189,14201,14213,14225, 14237,14249,14261,14273,14285,14297,14309,14321,14333,14346, 14361,14376,14391,14406,14421,14436,14451,14466,14481,14496, 14511,14526,14541,14556,14571,14585,14593,14596, 4662,14599, 14607,14610,14617,14629,14641,14653,14665,14677,14689,14701, 14713,14725,14737,14749,14761,14773,14785,14797,14809,14821, 14833,14845,14857,14869,14881,14893,14905,14917,14929,14941, 14953,14965,14977,14989,15001,15013,15025,15037,15049,15061, 15073,15085,15097,15109,15121,15133,15145,15157,15169,15181, 15193,15205,15217,15229,15241,15253,15265,15277,15289,15301, 15313,15325,15337,15349,15361,15373,15385,15397,15409,15421, 15433,15445,15457,15469,15481,15493,15505,15517,15529,15541, 15553,15565,15577,15589,15601,15613,15625,15637,15649,15661, 15673,15685,15697,15709,15721,15733,15745,15757,15769,15781, 15793,15805,15817,15829,15841,15853,15865,15877,15889,15901, 15913,15925,15937,15949,15961,15973,15985,15997,16009,16021, 16033,16045,16057,16069,16081,16093,16105,16117,16129,16141, 16153,16165,16177,16189,16201,16213,16225,16237,16249,16261, 16273,16285,16297,16309,16321,16333,16345,16357,16369,16381, 16393,16405,16417,16429,16441,16453,16465,16477,16490,16505, 16520,16535,16550,16565,16579,16587,16594,16602, 4815,16609, 16621,16629,16632,16639,16651,16663,16675,16687,16699,16711, 16723,16735,16747,16759,16771,16783,16795,16807,16819,16831, 16843,16855,16867,16879,16891,16903,16915,16927,16939,16951, 16963,16975,16987,16999,17011,17023,17035,17047,17059,17071, 17083,17095,17107,17119,17131,17143,17155,17167,17179,17191, 17203,17215,17227,17239,17251,17263,17275,17287,17299,17311, 17323,17335,17347,17359,17371,17383,17395,17407,17419,17431, 17443,17455,17467,17479,17491,17503,17515,17527,17539,17551, 17563,17575,17587,17599,17611,17623,17635,17647,17659,17671, 17683,17695,17707,17719,17731,17743,17755,17767,17779,17791, 17803,17815,17827,17839,17851,17863,17875,17887,17899,17911, 17923,17935,17947,17959,17971,17983,17995,18007,18019,18031, 18043,18055,18067,18079,18091,18103,18116,18130,18138,18145, 18153,18156,18164,18167,18170,18173,18181,18188,18200,18212, 18224,18236,18248,18260,18272,18284,18296,18308,18320,18332, 18344,18356,18368,18380,18392,18404,18416,18428,18440,18452, 18464,18476,18488,18500,18512,18524,18536,18548,18560,18572, 18584,18596,18608,18620,18632,18644,18656,18668,18680,18692, 18704,18712,18719,18727,18730,18733,18736, 4875, 4879,18743, 4882, 5127,18755,18763,18766,18773,18781,18788,18796,18799, 5160,18802, 5412,18805, 5416, 5529,18812, 5566, 5616,18824, 18832,18839,18847,18850,18853,18856, 5657,18859, 5724,18862, 18865,18868,18871,18874,18877,18880,18883,18890,18902,18910, 18913,18920,18932,18944,18956,18964,18971,18983,18995,19007, 19019,19031,19043,19055,19067,19079,19091,19103,19115,19127 } ; static yyconst flex_int16_t yy_def[2921] = { 0, 1758, 1758, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1759, 1760, 1761, 1762, 1763, 1764, 1757, 1765, 1766, 1767, 1757, 1768, 1759, 1769, 1770, 1771, 1772, 1761, 1761, 1773, 1774, 1774, 1774, 1775, 1763, 38, 1776, 1777, 1778, 1779, 1779, 1779, 1780, 20, 20, 1781, 1757, 1782, 1783, 1783, 1757, 1765, 1765, 1784, 1766, 1785, 1767, 1786, 1787, 1788, 1789, 1757, 1757, 1757, 1790, 1791, 1769, 1769, 1770, 1792, 1793, 1794, 1761, 1761, 1773, 1773, 1795, 1795, 1796, 1795, 1797, 1797, 1797, 1776, 1757, 1798, 1777, 1799, 1778, 92, 1800, 1801, 1802, 1802, 1803, 1802, 1804, 1804, 1804, 1757, 1805, 1806, 1806, 1757, 1757, 1807, 1808, 1808, 1809, 1810, 1757, 114, 1757, 116, 1811, 1757, 1812, 1813, 1813, 1814, 1814, 1815, 1815, 1816, 1817, 1817, 1818, 1819, 1820, 1821, 1822, 1823, 1824, 1825, 1826, 1827, 1828, 1829, 1830, 1831, 1832, 1833, 1757, 1834, 1835, 1757, 1836, 1837, 1837, 1757, 1838, 1839, 1839, 1840, 1841, 1841, 1841, 1842, 1842, 1843, 1842, 1844, 1845, 1846, 1847, 1847, 1848, 1757, 1849, 1850, 1851, 1852, 1853, 1853, 1853, 1854, 1854, 1855, 1854, 1757, 1856, 1857, 1857, 1858, 1859, 1757, 189, 1757, 1860, 1861, 1861, 1862, 1863, 1757, 197, 1864, 1865, 1866, 1757, 1867, 1757, 1868, 1869, 1869, 1757, 1757, 1870, 1871, 1871, 1872, 1873, 1757, 215, 1874, 1874, 1875, 1876, 1877, 1878, 1879, 1880, 1881, 1882, 1883, 1884, 1885, 1886, 1886, 1887, 1888, 1889, 1890, 1891, 1892, 1893, 1894, 1895, 1895, 1896, 1897, 1898, 1899, 1900, 1901, 1902, 1757, 1903, 1904, 1757, 1905, 1906, 1907, 1757, 1757, 1757, 1757, 1908, 1909, 1909, 1909, 1910, 1910, 1911, 1911, 1912, 1913, 1914, 1915, 1915, 1757, 1757, 1916, 1917, 1917, 1917, 1757, 1918, 1919, 1919, 1920, 1921, 1757, 285, 1922, 1923, 1924, 1757, 1925, 1757, 1926, 1927, 1927, 1928, 1929, 1757, 298, 1930, 1931, 1932, 1757, 1933, 1934, 1935, 1936, 1937, 1757, 309, 1757, 1938, 1939, 1939, 1940, 1941, 1757, 317, 1757, 1942, 1943, 1943, 1944, 1945, 1757, 325, 1946, 1947, 1948, 1757, 1949, 1950, 1950, 1951, 1952, 1953, 1954, 1955, 1956, 1956, 1957, 1958, 1959, 1960, 1961, 1962, 1963, 1964, 1965, 1966, 1967, 1967, 1968, 1969, 1970, 1971, 1972, 1973, 1974, 1975, 1976, 1977, 1978, 1979, 1980, 1981, 1982, 1982, 1983, 1984, 1985, 1986, 1987, 1988, 1757, 1757, 1989, 1990, 1757, 1757, 1991, 1757, 1992, 1757, 1757, 1757, 1993, 1993, 1994, 1994, 1995, 1757, 1996, 1757, 1757, 1757, 1757, 1997, 1998, 1998, 1999, 2000, 1757, 403, 2001, 2002, 2003, 1757, 2004, 2005, 2006, 2007, 2008, 1757, 414, 1757, 2009, 2010, 2010, 2011, 2012, 1757, 422, 2013, 2014, 2015, 1757, 2016, 2017, 2018, 2019, 2020, 1757, 433, 2021, 2022, 2023, 2024, 2025, 2026, 2027, 1757, 2028, 2029, 2029, 2030, 2031, 1757, 448, 2032, 2033, 2034, 1757, 2035, 1757, 2036, 2037, 2037, 2038, 2039, 1757, 461, 2040, 2041, 2042, 1757, 2043, 2044, 2045, 2046, 2047, 1757, 472, 2048, 2048, 2049, 2050, 2051, 2052, 2052, 2053, 2054, 2055, 2056, 2057, 2058, 2059, 2060, 2060, 2061, 2062, 2063, 2064, 2065, 2066, 2067, 2068, 2069, 2070, 2071, 2071, 2072, 2073, 2074, 2075, 2076, 2077, 2078, 2079, 2079, 2080, 2081, 2082, 2083, 2083, 2084, 2085, 2086, 1757, 2087, 2088, 2089, 2090, 1757, 1757, 1757, 1757, 2091, 1757, 2092, 1757, 1757, 1757, 2093, 1757, 2094, 1757, 1757, 2095, 2096, 2096, 2097, 2098, 1757, 544, 2099, 2100, 2101, 1757, 2102, 2103, 2104, 2105, 2106, 1757, 555, 2107, 2108, 2109, 2110, 2111, 2112, 2113, 1757, 2114, 2115, 2115, 2116, 2117, 1757, 570, 2118, 2119, 2120, 1757, 2121, 2122, 2123, 2124, 2125, 1757, 581, 2126, 2127, 2128, 2129, 2130, 2131, 2132, 2133, 2134, 2135, 2136, 2137, 2138, 1757, 596, 1757, 2139, 2140, 2140, 2141, 2142, 1757, 604, 2143, 2144, 2145, 1757, 2146, 2147, 2148, 2149, 2150, 1757, 615, 1757, 2151, 2152, 2152, 2153, 2154, 1757, 623, 2155, 2156, 2157, 1757, 2158, 2159, 2160, 2161, 2162, 1757, 634, 2163, 2164, 2165, 2166, 2167, 2168, 2169, 2170, 2170, 2171, 2172, 2173, 2174, 2174, 2175, 2176, 2177, 2177, 2178, 2179, 2180, 2181, 2181, 2182, 2183, 2184, 2185, 2186, 2187, 2188, 2189, 2189, 2190, 2191, 2192, 2193, 2193, 2194, 2195, 2196, 2196, 2197, 2198, 2199, 2200, 2200, 2201, 2202, 2203, 2204, 2204, 1757, 2205, 2206, 1757, 1757, 2207, 2207, 1757, 2208, 2208, 1757, 2209, 1757, 1757, 1757, 2210, 2210, 1757, 2211, 2211, 1757, 1757, 1757, 1757, 2212, 2213, 2213, 2214, 2215, 1757, 716, 2216, 2217, 2218, 1757, 2219, 2220, 2221, 2222, 2223, 1757, 727, 2224, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2233, 2234, 2235, 2236, 1757, 742, 1757, 2237, 2238, 2238, 2239, 2240, 1757, 750, 2241, 2242, 2243, 1757, 2244, 2245, 2246, 2247, 2248, 1757, 761, 2249, 2250, 2251, 2252, 2253, 2254, 2255, 2256, 2257, 2258, 2259, 2260, 2261, 1757, 776, 2262, 2263, 2264, 2265, 2266, 2267, 2268, 1757, 2269, 1757, 2270, 2271, 2271, 2272, 2273, 1757, 793, 2274, 2275, 2276, 1757, 2277, 2278, 2279, 2280, 2281, 1757, 804, 2282, 2283, 2284, 2285, 2286, 2287, 2288, 1757, 2289, 2290, 2290, 2291, 2292, 1757, 819, 2293, 2294, 2295, 1757, 2296, 2297, 2298, 2299, 2300, 1757, 830, 2301, 2302, 2303, 2304, 2305, 2306, 2307, 2308, 2309, 2310, 2311, 2312, 2313, 1757, 845, 2314, 2314, 2315, 2316, 2317, 2317, 2318, 2318, 2319, 2320, 2321, 2322, 2322, 2323, 2324, 2325, 2325, 2326, 2327, 2328, 2329, 2329, 2330, 2331, 2332, 2333, 2333, 2334, 2334, 2335, 2336, 2337, 2338, 2338, 2339, 2340, 2341, 2342, 1757, 2343, 1757, 1757, 1757, 1757, 2344, 2344, 1757, 2345, 2345, 1757, 1757, 1757, 2346, 2346, 1757, 2347, 2347, 1757, 1757, 2348, 2349, 2349, 2350, 2351, 1757, 911, 2352, 2353, 2354, 1757, 2355, 2356, 2357, 2358, 2359, 1757, 922, 2360, 2361, 2362, 2363, 2364, 2365, 2366, 2367, 2368, 2369, 2370, 2371, 2372, 1757, 937, 2373, 2374, 2375, 2376, 2377, 2378, 2379, 1757, 2380, 1757, 2381, 2382, 2382, 2383, 2384, 1757, 954, 2385, 2386, 2387, 1757, 2388, 2389, 2390, 2391, 2392, 1757, 965, 2393, 2394, 2395, 2396, 2397, 2398, 2399, 2400, 2401, 2402, 2403, 2404, 2405, 1757, 980, 2406, 2407, 2408, 2409, 2410, 2411, 2412, 1757, 2413, 2414, 2415, 2416, 2417, 2418, 2419, 2420, 2421, 1757, 999, 1757, 2422, 2423, 2423, 2424, 2425, 1757, 1007, 2426, 2427, 2428, 1757, 2429, 2430, 2431, 2432, 2433, 1757, 1018, 2434, 2435, 2436, 2437, 2438, 2439, 2440, 2441, 2442, 2443, 2444, 2445, 2446, 1757, 1033, 1757, 2447, 2448, 2448, 2449, 2450, 1757, 1041, 2451, 2452, 2453, 1757, 2454, 2455, 2456, 2457, 2458, 1757, 1052, 2459, 2460, 2461, 2462, 2463, 2464, 2465, 2466, 2467, 2468, 2469, 2470, 2471, 1757, 1067, 2472, 2473, 2474, 2475, 2476, 2477, 2478, 1757, 2479, 2480, 2480, 2481, 2481, 2482, 2483, 2484, 2484, 2485, 2485, 2486, 2487, 2488, 2489, 2489, 2490, 2491, 2492, 2492, 2493, 2494, 2495, 2495, 2496, 1757, 2497, 2498, 2499, 2499, 1757, 2500, 2500, 1757, 1757, 1757, 2501, 1757, 2502, 1757, 1757, 1757, 1757, 2503, 2504, 2504, 2505, 2506, 1757, 1125, 2507, 2508, 2509, 1757, 2510, 2511, 2512, 2513, 2514, 1757, 1136, 2515, 2516, 2517, 2518, 2519, 2520, 2521, 2522, 2523, 2524, 2525, 2526, 2527, 1757, 1151, 2528, 2529, 2530, 2531, 2532, 2533, 2534, 1757, 2535, 2536, 2537, 2538, 2539, 2540, 2541, 2542, 2543, 1757, 1170, 1757, 2544, 2545, 2545, 2546, 2547, 1757, 1178, 2548, 2549, 2550, 1757, 2551, 2552, 2553, 2554, 2555, 1757, 1189, 2556, 2557, 2558, 2559, 2560, 2561, 2562, 2563, 2564, 2565, 2566, 2567, 2568, 1757, 1204, 2569, 2570, 2571, 2572, 2573, 2574, 2575, 1757, 2576, 2577, 2578, 2579, 2580, 2581, 2582, 2583, 2584, 1757, 1223, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1757, 1757, 2585, 2586, 2586, 2587, 2588, 1757, 1242, 2589, 2590, 2591, 1757, 2592, 2593, 2594, 2595, 2596, 1757, 1253, 2597, 2598, 2599, 2600, 2601, 2602, 2603, 2604, 2605, 2606, 2607, 2608, 2609, 1757, 1268, 2610, 2611, 2612, 2613, 2614, 2615, 2616, 1757, 2617, 1757, 2618, 2619, 2619, 2620, 2621, 1757, 1285, 2622, 2623, 2624, 1757, 2625, 2626, 2627, 2628, 2629, 1757, 1296, 2630, 2631, 2632, 2633, 2634, 2635, 2636, 2637, 2638, 2639, 2640, 2641, 2642, 1757, 1311, 2643, 2644, 2645, 2646, 2647, 2648, 2649, 1757, 2650, 2651, 2652, 2653, 2654, 2655, 2656, 2657, 2658, 1757, 1330, 2659, 2659, 2660, 2660, 2661, 2662, 2663, 2663, 2664, 2664, 2665, 2666, 2667, 1757, 1757, 2668, 2668, 2668, 2669, 2669, 1757, 2670, 2671, 2672, 1757, 2673, 1757, 1757, 2674, 2675, 2675, 2676, 2677, 1757, 1365, 2678, 2679, 2680, 1757, 2681, 2682, 2683, 2684, 2685, 1757, 1376, 2686, 2687, 2688, 2689, 2690, 2691, 2692, 2693, 2694, 2695, 2696, 2697, 2698, 1757, 1391, 2699, 2700, 2701, 2702, 2703, 2704, 2705, 1757, 2706, 2707, 2708, 2709, 2710, 2711, 2712, 2713, 2714, 1757, 1410, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1757, 1757, 2715, 2716, 2716, 2717, 2718, 1757, 1429, 2719, 2720, 2721, 1757, 2722, 2723, 2724, 2725, 2726, 1757, 1440, 2727, 2728, 2729, 2730, 2731, 2732, 2733, 2734, 2735, 2736, 2737, 2738, 2739, 1757, 1455, 2740, 2741, 2742, 2743, 2744, 2745, 2746, 1757, 2747, 2748, 2749, 2750, 2751, 2752, 2753, 2754, 2755, 1757, 1474, 1757, 2756, 2757, 2757, 2758, 2759, 1757, 1482, 2760, 2761, 2762, 1757, 2763, 2764, 2765, 2766, 2767, 1757, 1493, 2768, 2769, 2770, 2771, 2772, 2773, 2774, 2775, 2776, 2777, 2778, 2779, 2780, 1757, 1508, 2781, 2782, 2783, 2784, 2785, 2786, 2787, 1757, 2788, 2789, 2790, 2791, 2792, 2793, 2794, 2795, 2796, 1757, 1527, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1757, 2797, 2797, 2798, 2799, 2800, 2801, 2802, 2803, 2803, 2804, 2803, 1757, 1757, 1757, 1757, 2805, 2806, 1757, 1757, 1757, 2807, 2808, 2809, 1757, 2810, 2811, 2811, 2812, 2813, 1757, 1569, 2814, 2815, 2816, 1757, 2817, 2818, 2819, 2820, 2821, 1757, 1580, 2822, 2823, 2824, 2825, 2826, 2827, 2828, 2829, 2830, 2831, 2832, 2833, 2834, 1757, 1595, 2835, 2836, 2837, 2838, 2839, 2840, 2841, 1757, 2842, 2843, 2844, 2845, 2846, 2847, 2848, 2849, 2850, 1757, 1614, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1757, 2851, 2852, 2853, 2854, 2855, 2856, 2857, 2857, 2857, 2858, 1757, 2859, 1757, 2860, 2861, 1757, 2862, 1757, 2863, 1757, 1757, 1757, 2864, 1757, 1757, 1757, 2865, 2866, 2867, 2868, 2869, 2870, 1757, 1757, 2871, 1757, 2871, 1757, 2872, 2873, 1757, 2873, 1757, 2874, 2875, 1757, 2876, 1757, 2877, 2878, 1757, 2879, 1757, 2880, 1757, 2881, 2882, 2883, 2884, 2885, 1757, 1757, 1757, 2886, 1757, 1757, 1757, 2887, 1757, 2887, 1757, 2888, 2889, 1757, 2889, 1757, 2890, 2891, 1757, 2892, 1757, 1757, 2893, 1757, 2894, 2895, 1757, 1757, 1757, 2896, 1757, 1757, 1757, 1757, 2897, 2898, 2899, 1757, 2900, 1757, 2901, 1757, 1757, 1757, 2902, 2903, 2904, 2905, 2906, 1757, 1757, 2907, 2908, 2909, 2910, 1757, 2911, 2912, 2913, 2914, 2915, 2916, 2917, 2918, 1757, 1757, 2919, 2920, 1757, 1757, 0, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757 } ; static yyconst flex_int16_t yy_nxt[19183] = { 0, 1757, 5, 1757, 1757, 26, 31, 1757, 1757, 1757, 1757, 103, 104, 105, 1757, 38, 1757, 39, 39, 40, 35, 36, 81, 82, 378, 28, 33, 6, 7, 8, 14, 9, 10, 17, 37, 42, 11, 15, 12, 13, 5, 56, 21, 18, 19, 22, 44, 45, 64, 64, 65, 1726, 60, 97, 98, 26, 67, 162, 163, 70, 46, 57, 72, 66, 1726, 6, 7, 8, 61, 9, 10, 69, 62, 63, 11, 1757, 12, 13, 47, 28, 48, 49, 28, 50, 51, 52, 53, 53, 53, 53, 53, 53, 53, 76, 77, 78, 85, 86, 54, 38, 1724, 39, 39, 40, 88, 1724, 107, 527, 89, 1718, 37, 101, 102, 33, 33, 33, 107, 123, 92, 1757, 93, 93, 94, 91, 42, 46, 54, 107, 1757, 91, 1757, 1757, 113, 114, 147, 147, 54, 57, 42, 144, 144, 144, 144, 1717, 124, 126, 129, 54, 1757, 107, 69, 69, 1714, 149, 108, 109, 110, 111, 111, 111, 111, 111, 111, 111, 57, 57, 130, 63, 69, 54, 116, 60, 117, 118, 1713, 119, 120, 121, 122, 122, 122, 122, 122, 122, 122, 132, 1710, 1757, 137, 1710, 54, 1757, 1757, 70, 141, 1708, 145, 145, 146, 70, 72, 133, 151, 76, 138, 134, 135, 77, 62, 139, 142, 66, 155, 28, 134, 143, 156, 168, 168, 28, 1757, 1708, 28, 33, 180, 181, 1692, 33, 88, 88, 1691, 88, 33, 264, 264, 107, 33, 158, 158, 158, 158, 158, 160, 160, 160, 160, 160, 165, 42, 42, 167, 42, 1688, 165, 88, 54, 167, 92, 89, 93, 93, 94, 1757, 171, 1757, 1757, 107, 172, 176, 176, 176, 176, 176, 91, 42, 107, 107, 1757, 107, 91, 188, 189, 174, 42, 266, 266, 54, 1687, 174, 178, 178, 178, 178, 178, 107, 54, 54, 1757, 54, 183, 184, 185, 186, 186, 186, 186, 186, 186, 186, 1556, 107, 107, 107, 107, 54, 107, 196, 197, 208, 1546, 191, 192, 193, 194, 194, 194, 194, 194, 194, 194, 54, 54, 54, 54, 1546, 54, 107, 1757, 54, 1757, 1757, 201, 201, 201, 201, 202, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 54, 116, 208, 117, 118, 147, 119, 120, 121, 122, 122, 122, 122, 122, 122, 122, 204, 205, 206, 208, 1757, 69, 54, 123, 209, 210, 211, 212, 212, 212, 212, 212, 212, 212, 124, 208, 217, 218, 129, 54, 214, 215, 129, 57, 220, 132, 223, 271, 271, 231, 387, 387, 226, 1551, 57, 54, 57, 57, 130, 63, 228, 1550, 130, 63, 130, 134, 134, 224, 138, 130, 139, 233, 134, 139, 237, 1546, 133, 241, 1545, 141, 134, 229, 389, 389, 243, 254, 247, 234, 249, 1109, 238, 134, 235, 142, 134, 239, 151, 134, 143, 134, 244, 69, 142, 251, 134, 245, 134, 248, 252, 253, 253, 253, 253, 254, 151, 155, 28, 156, 261, 261, 261, 261, 261, 263, 263, 263, 263, 263, 88, 69, 88, 1108, 171, 254, 28, 33, 171, 33, 1108, 171, 1346, 171, 107, 107, 1343, 172, 1118, 91, 42, 69, 42, 268, 42, 91, 391, 392, 42, 268, 270, 42, 174, 42, 54, 54, 270, 1117, 174, 276, 276, 276, 276, 276, 278, 278, 278, 278, 278, 107, 393, 394, 107, 107, 279, 280, 281, 282, 282, 282, 282, 282, 282, 282, 107, 107, 380, 381, 382, 54, 284, 285, 54, 54, 291, 291, 291, 291, 291, 523, 524, 107, 107, 107, 54, 54, 107, 297, 298, 107, 107, 289, 289, 289, 289, 290, 291, 291, 291, 291, 291, 54, 54, 54, 534, 535, 54, 107, 1112, 54, 54, 107, 292, 293, 294, 295, 295, 295, 295, 295, 295, 295, 304, 304, 304, 304, 304, 54, 107, 107, 1111, 54, 107, 302, 302, 302, 302, 303, 304, 304, 304, 304, 304, 536, 537, 208, 208, 1110, 54, 54, 107, 1109, 54, 1108, 208, 308, 308, 308, 308, 308, 308, 308, 309, 310, 310, 54, 54, 208, 208, 898, 54, 208, 316, 317, 54, 897, 311, 312, 313, 314, 314, 314, 314, 314, 314, 314, 889, 54, 54, 208, 208, 54, 208, 208, 324, 325, 208, 319, 320, 321, 322, 322, 322, 322, 322, 322, 322, 698, 699, 54, 54, 888, 54, 54, 888, 888, 54, 208, 217, 218, 333, 223, 329, 329, 329, 329, 330, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 54, 57, 57, 130, 134, 336, 887, 340, 886, 228, 496, 231, 688, 233, 342, 363, 231, 496, 346, 380, 383, 384, 237, 133, 349, 134, 337, 134, 229, 134, 133, 130, 139, 134, 134, 343, 130, 139, 134, 347, 234, 352, 134, 354, 134, 350, 243, 889, 889, 358, 356, 241, 347, 247, 30, 362, 363, 238, 241, 355, 245, 134, 239, 134, 356, 238, 134, 142, 365, 134, 359, 134, 143, 134, 142, 134, 363, 368, 134, 143, 370, 356, 249, 88, 244, 347, 88, 171, 134, 366, 374, 374, 375, 142, 376, 107, 142, 134, 248, 171, 134, 371, 252, 42, 235, 252, 42, 42, 107, 378, 520, 520, 520, 520, 252, 54, 897, 897, 174, 42, 107, 107, 107, 107, 174, 107, 402, 403, 54, 107, 397, 398, 399, 400, 400, 400, 400, 400, 400, 400, 54, 54, 54, 54, 139, 54, 107, 107, 224, 54, 107, 407, 407, 407, 407, 408, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 54, 54, 107, 379, 54, 107, 30, 413, 413, 413, 413, 413, 413, 413, 414, 415, 415, 149, 107, 107, 107, 107, 54, 107, 245, 54, 421, 422, 416, 417, 418, 419, 419, 419, 419, 419, 419, 419, 54, 54, 54, 54, 235, 54, 107, 107, 107, 107, 226, 426, 426, 426, 426, 427, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 54, 54, 54, 54, 107, 107, 107, 107, 107, 432, 432, 432, 432, 432, 432, 432, 433, 434, 434, 107, 139, 208, 898, 898, 54, 54, 54, 54, 54, 441, 441, 441, 441, 441, 224, 208, 208, 208, 208, 54, 107, 54, 447, 448, 208, 439, 439, 439, 439, 440, 441, 441, 441, 441, 441, 54, 54, 54, 54, 135, 54, 208, 220, 208, 54, 208, 442, 443, 444, 445, 445, 445, 445, 445, 445, 445, 454, 454, 454, 454, 454, 54, 208, 54, 256, 54, 208, 452, 452, 452, 452, 453, 454, 454, 454, 454, 454, 67, 208, 208, 208, 208, 54, 208, 460, 461, 54, 208, 455, 456, 457, 458, 458, 458, 458, 458, 458, 458, 54, 54, 54, 54, 137, 54, 208, 135, 333, 54, 333, 465, 465, 465, 465, 466, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 54, 208, 130, 475, 130, 336, 471, 471, 471, 471, 471, 471, 471, 472, 473, 473, 477, 127, 340, 182, 342, 54, 164, 134, 337, 134, 340, 127, 480, 1757, 346, 99, 486, 83, 133, 482, 134, 478, 134, 229, 134, 489, 133, 349, 133, 354, 134, 229, 134, 343, 134, 133, 134, 487, 491, 134, 483, 234, 495, 30, 352, 134, 350, 134, 30, 134, 352, 25, 498, 24, 234, 358, 362, 23, 134, 492, 238, 501, 134, 496, 134, 239, 238, 503, 355, 507, 134, 239, 134, 499, 20, 134, 134, 238, 510, 16, 365, 134, 359, 238, 370, 512, 1757, 134, 504, 134, 508, 368, 1757, 368, 244, 249, 376, 171, 134, 366, 134, 244, 515, 1757, 134, 134, 513, 142, 517, 142, 1757, 134, 248, 134, 248, 252, 252, 42, 142, 525, 525, 525, 134, 371, 142, 526, 526, 526, 134, 527, 528, 529, 527, 530, 531, 171, 532, 532, 532, 533, 533, 533, 550, 550, 550, 550, 550, 691, 691, 691, 1757, 107, 107, 107, 107, 42, 107, 543, 544, 107, 1757, 538, 539, 540, 541, 541, 541, 541, 541, 541, 541, 54, 54, 54, 54, 107, 54, 107, 107, 54, 107, 1757, 107, 107, 107, 548, 548, 548, 548, 549, 550, 550, 550, 550, 550, 54, 107, 54, 54, 107, 54, 107, 54, 54, 54, 107, 554, 554, 554, 554, 554, 554, 554, 555, 556, 556, 54, 1111, 1111, 54, 1757, 54, 107, 1757, 107, 54, 107, 561, 561, 561, 561, 562, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 54, 107, 54, 1757, 54, 107, 564, 565, 566, 567, 567, 567, 567, 567, 567, 567, 107, 107, 1757, 107, 107, 54, 569, 570, 1757, 54, 576, 576, 576, 576, 576, 1112, 1112, 107, 107, 107, 54, 54, 107, 54, 54, 107, 107, 574, 574, 574, 574, 575, 576, 576, 576, 576, 576, 54, 54, 54, 1117, 1117, 54, 107, 1757, 54, 54, 107, 580, 580, 580, 580, 580, 580, 580, 581, 582, 582, 589, 589, 589, 589, 589, 54, 107, 107, 107, 54, 107, 587, 587, 587, 587, 588, 589, 589, 589, 589, 589, 107, 107, 107, 1757, 208, 54, 54, 54, 1757, 54, 692, 693, 693, 694, 596, 597, 1118, 1118, 208, 1757, 54, 54, 54, 208, 54, 1757, 208, 208, 598, 599, 600, 601, 601, 601, 601, 601, 601, 601, 54, 208, 1757, 208, 208, 54, 603, 604, 54, 54, 610, 610, 610, 610, 610, 1346, 1346, 208, 208, 208, 208, 54, 208, 54, 54, 622, 623, 608, 608, 608, 608, 609, 610, 610, 610, 610, 610, 54, 54, 54, 54, 208, 54, 208, 1757, 208, 208, 208, 614, 614, 614, 614, 614, 614, 614, 615, 616, 616, 700, 700, 700, 54, 1757, 54, 208, 54, 54, 54, 208, 617, 618, 619, 620, 620, 620, 620, 620, 620, 620, 629, 629, 629, 629, 629, 54, 208, 208, 1757, 54, 208, 627, 627, 627, 627, 628, 629, 629, 629, 629, 629, 1757, 1757, 208, 208, 208, 54, 54, 208, 208, 54, 475, 1757, 633, 633, 633, 633, 633, 633, 633, 634, 635, 635, 54, 54, 54, 1548, 1549, 54, 54, 208, 134, 337, 475, 1757, 640, 640, 640, 640, 641, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 54, 644, 1757, 134, 337, 477, 646, 1757, 480, 1551, 1551, 482, 1757, 486, 480, 1757, 649, 701, 701, 701, 653, 134, 478, 651, 133, 134, 134, 647, 134, 343, 133, 134, 133, 134, 134, 343, 134, 483, 655, 133, 134, 487, 1757, 134, 489, 1757, 489, 1757, 1757, 491, 1757, 495, 658, 1757, 660, 1757, 664, 1757, 134, 656, 234, 498, 234, 667, 134, 350, 134, 350, 234, 134, 234, 134, 134, 492, 134, 661, 134, 665, 669, 355, 501, 134, 1757, 134, 499, 503, 501, 1757, 672, 1757, 507, 1757, 676, 1757, 355, 674, 238, 678, 134, 670, 134, 359, 238, 510, 238, 134, 134, 359, 134, 504, 134, 238, 134, 508, 510, 134, 681, 134, 679, 244, 512, 1757, 683, 134, 366, 515, 1636, 1637, 515, 1757, 244, 686, 244, 517, 134, 366, 134, 513, 244, 376, 134, 142, 134, 684, 142, 134, 371, 142, 134, 371, 376, 134, 1757, 134, 695, 696, 696, 697, 107, 252, 702, 703, 703, 704, 705, 706, 706, 707, 1638, 1639, 252, 708, 708, 708, 709, 709, 709, 107, 54, 1757, 107, 107, 710, 711, 712, 713, 713, 713, 713, 713, 713, 713, 107, 107, 1757, 107, 107, 54, 715, 716, 54, 54, 722, 722, 722, 722, 722, 1641, 1642, 107, 107, 107, 54, 54, 107, 54, 54, 107, 107, 720, 720, 720, 720, 721, 722, 722, 722, 722, 722, 54, 54, 54, 107, 107, 54, 107, 1757, 54, 54, 107, 726, 726, 726, 726, 726, 726, 726, 727, 728, 728, 1643, 1644, 54, 54, 1757, 54, 107, 107, 107, 54, 107, 733, 733, 733, 733, 734, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 54, 54, 54, 107, 54, 107, 1757, 107, 107, 107, 107, 1671, 1672, 749, 750, 1757, 742, 743, 890, 890, 890, 107, 107, 54, 107, 54, 107, 54, 54, 54, 54, 744, 745, 746, 747, 747, 747, 747, 747, 747, 747, 54, 54, 1757, 54, 1757, 54, 107, 107, 1757, 107, 107, 754, 754, 754, 754, 755, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 54, 54, 107, 54, 54, 107, 107, 760, 760, 760, 760, 760, 760, 760, 761, 762, 762, 107, 1757, 107, 107, 107, 54, 1673, 1674, 54, 54, 769, 769, 769, 769, 769, 1757, 107, 107, 1676, 1677, 54, 107, 54, 54, 54, 107, 767, 767, 767, 767, 768, 769, 769, 769, 769, 769, 54, 54, 776, 777, 107, 54, 107, 107, 107, 54, 107, 107, 107, 786, 786, 786, 786, 208, 799, 799, 799, 799, 799, 1757, 54, 1757, 54, 54, 54, 208, 54, 54, 54, 107, 792, 793, 208, 54, 784, 784, 784, 785, 786, 786, 786, 786, 786, 786, 1757, 54, 208, 208, 208, 54, 208, 1757, 54, 208, 208, 787, 788, 789, 790, 790, 790, 790, 790, 790, 790, 1757, 54, 54, 54, 208, 54, 208, 1757, 54, 54, 208, 797, 797, 797, 797, 798, 799, 799, 799, 799, 799, 1757, 208, 208, 54, 208, 54, 208, 1757, 208, 54, 208, 803, 803, 803, 803, 803, 803, 803, 804, 805, 805, 54, 54, 1757, 54, 1757, 54, 208, 54, 208, 54, 208, 810, 810, 810, 810, 811, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 54, 208, 54, 1757, 54, 1757, 813, 814, 815, 816, 816, 816, 816, 816, 816, 816, 208, 208, 1757, 208, 208, 54, 818, 819, 825, 825, 825, 825, 825, 891, 892, 892, 893, 208, 208, 208, 54, 54, 208, 54, 54, 208, 208, 823, 823, 823, 823, 824, 825, 825, 825, 825, 825, 54, 54, 54, 1678, 1679, 54, 208, 1757, 54, 54, 208, 829, 829, 829, 829, 829, 829, 829, 830, 831, 831, 838, 838, 838, 838, 838, 54, 208, 208, 208, 54, 208, 836, 836, 836, 836, 837, 838, 838, 838, 838, 838, 208, 208, 208, 644, 1757, 54, 54, 54, 644, 54, 848, 1757, 646, 850, 845, 846, 651, 1757, 649, 1757, 54, 54, 54, 134, 478, 649, 1757, 852, 134, 478, 134, 647, 134, 134, 133, 653, 134, 653, 134, 483, 854, 133, 655, 133, 856, 134, 483, 134, 1757, 660, 658, 1757, 658, 528, 529, 134, 487, 134, 487, 859, 134, 656, 134, 1757, 134, 857, 234, 861, 234, 134, 134, 492, 134, 492, 863, 234, 664, 865, 1757, 134, 661, 669, 1757, 234, 667, 1757, 667, 134, 530, 531, 674, 1757, 868, 1757, 134, 665, 134, 134, 866, 870, 355, 134, 355, 676, 134, 499, 134, 499, 355, 672, 134, 672, 134, 670, 676, 355, 678, 873, 875, 134, 871, 877, 1757, 134, 508, 238, 683, 238, 681, 134, 504, 134, 504, 238, 134, 508, 134, 134, 134, 679, 681, 134, 878, 880, 244, 107, 134, 1757, 134, 513, 882, 686, 686, 249, 373, 373, 244, 883, 1757, 244, 134, 513, 1757, 134, 684, 54, 244, 142, 142, 107, 134, 134, 134, 252, 894, 895, 895, 896, 899, 900, 900, 901, 902, 903, 903, 904, 107, 522, 522, 54, 107, 905, 906, 907, 908, 908, 908, 908, 908, 908, 908, 107, 107, 1757, 107, 107, 54, 910, 911, 1757, 54, 917, 917, 917, 917, 917, 525, 525, 107, 107, 107, 54, 54, 107, 54, 54, 107, 107, 915, 915, 915, 915, 916, 917, 917, 917, 917, 917, 54, 54, 54, 107, 107, 54, 107, 1757, 54, 54, 107, 921, 921, 921, 921, 921, 921, 921, 922, 923, 923, 526, 526, 54, 54, 1757, 54, 107, 107, 107, 54, 107, 928, 928, 928, 928, 929, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 54, 54, 54, 107, 54, 107, 107, 107, 107, 107, 107, 107, 947, 947, 947, 947, 937, 938, 960, 960, 960, 960, 960, 54, 1757, 54, 54, 54, 54, 54, 54, 54, 107, 1757, 107, 532, 532, 945, 945, 945, 946, 947, 947, 947, 947, 947, 947, 1757, 107, 107, 107, 107, 54, 107, 54, 953, 954, 107, 948, 949, 950, 951, 951, 951, 951, 951, 951, 951, 54, 54, 54, 54, 107, 54, 107, 107, 1757, 54, 107, 958, 958, 958, 958, 959, 960, 960, 960, 960, 960, 533, 533, 107, 54, 107, 54, 54, 107, 107, 54, 107, 1757, 964, 964, 964, 964, 964, 964, 964, 965, 966, 966, 54, 1757, 54, 691, 691, 54, 54, 1757, 54, 107, 107, 107, 107, 107, 971, 971, 971, 971, 972, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 54, 54, 54, 54, 54, 107, 107, 107, 107, 107, 107, 107, 107, 107, 990, 990, 990, 990, 107, 980, 981, 1077, 1077, 1077, 1077, 54, 54, 54, 54, 54, 54, 54, 54, 54, 107, 107, 107, 107, 54, 988, 988, 988, 989, 990, 990, 990, 990, 990, 990, 107, 107, 107, 1757, 107, 54, 54, 54, 54, 1013, 1013, 1013, 1013, 1013, 1105, 1106, 1106, 1107, 208, 208, 54, 54, 54, 107, 54, 700, 700, 208, 998, 998, 998, 998, 998, 998, 999, 1000, 1000, 1000, 54, 54, 208, 208, 208, 54, 208, 1006, 1007, 54, 208, 1001, 1002, 1003, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1757, 54, 54, 54, 208, 54, 208, 1757, 208, 54, 208, 1011, 1011, 1011, 1011, 1012, 1013, 1013, 1013, 1013, 1013, 1757, 208, 208, 54, 208, 54, 208, 54, 208, 54, 208, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1018, 1019, 1019, 54, 54, 1757, 54, 1757, 54, 208, 54, 208, 54, 208, 1024, 1024, 1024, 1024, 1025, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 54, 208, 54, 208, 54, 208, 1757, 208, 208, 208, 208, 701, 701, 1040, 1041, 1757, 1033, 1034, 1113, 1113, 1114, 54, 208, 54, 208, 54, 208, 54, 54, 54, 54, 1035, 1036, 1037, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1757, 54, 1757, 54, 1757, 54, 208, 208, 208, 1757, 208, 1045, 1045, 1045, 1045, 1046, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 54, 54, 54, 208, 54, 208, 208, 208, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1052, 1053, 1053, 208, 1757, 208, 208, 208, 54, 1757, 54, 54, 54, 1060, 1060, 1060, 1060, 1060, 1757, 208, 208, 708, 708, 54, 208, 54, 54, 54, 208, 1058, 1058, 1058, 1058, 1059, 1060, 1060, 1060, 1060, 1060, 54, 54, 1067, 1068, 208, 54, 208, 208, 208, 54, 208, 208, 208, 1757, 848, 1757, 848, 1115, 1115, 1116, 1161, 1161, 1161, 1161, 54, 1757, 54, 54, 54, 1079, 54, 54, 54, 208, 134, 647, 134, 647, 1075, 1075, 1075, 1076, 1077, 1077, 1077, 1077, 1077, 1077, 850, 134, 852, 852, 854, 54, 854, 1757, 1081, 1757, 856, 1083, 709, 709, 861, 1757, 859, 1757, 133, 133, 134, 863, 134, 134, 134, 656, 134, 656, 134, 857, 134, 134, 234, 859, 134, 1085, 134, 661, 863, 1757, 1087, 134, 665, 865, 1089, 1757, 868, 884, 884, 234, 870, 234, 868, 134, 661, 134, 888, 888, 134, 665, 134, 866, 355, 134, 134, 1090, 134, 670, 355, 1092, 134, 1094, 134, 670, 875, 1757, 873, 873, 875, 1757, 1096, 1757, 877, 1098, 1757, 355, 882, 355, 880, 134, 871, 134, 238, 238, 134, 679, 134, 134, 134, 679, 134, 878, 134, 134, 244, 880, 134, 1100, 134, 684, 376, 1757, 107, 107, 1103, 107, 889, 889, 1124, 1125, 1757, 244, 1757, 244, 1757, 134, 684, 134, 107, 107, 252, 107, 54, 54, 107, 54, 1119, 1120, 1121, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 890, 890, 54, 54, 1757, 54, 107, 107, 54, 107, 1757, 1129, 1129, 1129, 1129, 1130, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 54, 54, 107, 54, 107, 107, 107, 107, 107, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1136, 1137, 1137, 1355, 1355, 1356, 54, 1757, 54, 54, 54, 54, 54, 107, 107, 107, 107, 107, 1142, 1142, 1142, 1142, 1143, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 54, 54, 54, 54, 54, 107, 107, 107, 107, 107, 107, 107, 107, 107, 1757, 107, 107, 107, 107, 1151, 1152, 1214, 1214, 1214, 1214, 54, 54, 54, 54, 54, 54, 54, 54, 54, 107, 54, 54, 54, 54, 1159, 1159, 1159, 1160, 1161, 1161, 1161, 1161, 1161, 1161, 107, 107, 107, 1757, 107, 54, 107, 107, 1278, 1278, 1278, 1278, 1177, 1178, 1321, 1321, 1321, 1321, 107, 107, 54, 54, 54, 107, 54, 107, 54, 54, 1169, 1169, 1169, 1169, 1169, 1169, 1170, 1171, 1171, 1171, 54, 54, 1357, 1357, 1358, 54, 107, 54, 107, 107, 107, 1172, 1173, 1174, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1184, 1184, 1184, 1184, 1184, 54, 107, 54, 54, 54, 107, 1182, 1182, 1182, 1182, 1183, 1184, 1184, 1184, 1184, 1184, 1757, 107, 107, 107, 107, 54, 107, 1757, 107, 54, 107, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1189, 1190, 1190, 54, 54, 54, 54, 1757, 54, 107, 54, 107, 54, 107, 1195, 1195, 1195, 1195, 1196, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 54, 107, 54, 107, 54, 107, 107, 107, 107, 107, 107, 107, 1757, 107, 107, 107, 1204, 1205, 1663, 1663, 1664, 54, 1757, 54, 1757, 54, 54, 54, 54, 54, 54, 54, 107, 54, 54, 54, 107, 1212, 1212, 1212, 1213, 1214, 1214, 1214, 1214, 1214, 1214, 107, 107, 107, 1757, 107, 54, 107, 107, 1757, 54, 1235, 1235, 1235, 1235, 1235, 1668, 1668, 1669, 107, 107, 54, 54, 54, 107, 54, 107, 54, 54, 1222, 1222, 1222, 1222, 1222, 1222, 1223, 1224, 1224, 1224, 54, 54, 107, 107, 107, 54, 208, 54, 208, 208, 1696, 1696, 1697, 1241, 1242, 1248, 1248, 1248, 1248, 1248, 208, 208, 54, 54, 54, 107, 54, 208, 54, 54, 1233, 1233, 1233, 1233, 1234, 1235, 1235, 1235, 1235, 1235, 54, 54, 208, 208, 208, 54, 208, 54, 208, 208, 208, 1236, 1237, 1238, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1757, 54, 54, 54, 208, 54, 208, 54, 54, 54, 208, 1246, 1246, 1246, 1246, 1247, 1248, 1248, 1248, 1248, 1248, 1701, 1701, 1702, 54, 1757, 54, 208, 1757, 208, 54, 208, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1253, 1254, 1254, 1261, 1261, 1261, 1261, 1261, 54, 208, 54, 208, 54, 208, 1259, 1259, 1259, 1259, 1260, 1261, 1261, 1261, 1261, 1261, 208, 208, 208, 208, 208, 54, 208, 54, 208, 54, 208, 1757, 208, 1268, 1269, 1291, 1291, 1291, 1291, 1291, 54, 54, 54, 54, 54, 1757, 54, 208, 54, 208, 54, 208, 54, 208, 1284, 1285, 1276, 1276, 1276, 1277, 1278, 1278, 1278, 1278, 1278, 1278, 1757, 54, 208, 54, 208, 54, 208, 54, 208, 208, 208, 1279, 1280, 1281, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1757, 54, 208, 54, 208, 54, 208, 54, 54, 54, 208, 1289, 1289, 1289, 1289, 1290, 1291, 1291, 1291, 1291, 1291, 1757, 54, 208, 54, 208, 54, 208, 1757, 208, 54, 208, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1296, 1297, 1297, 1757, 54, 1757, 54, 1757, 54, 208, 54, 208, 54, 208, 1302, 1302, 1302, 1302, 1303, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 54, 208, 54, 208, 54, 208, 208, 208, 208, 208, 208, 1757, 208, 208, 1311, 1312, 1350, 1351, 1351, 1352, 1757, 54, 1757, 54, 1757, 54, 54, 54, 54, 54, 54, 208, 54, 54, 208, 208, 1319, 1319, 1319, 1320, 1321, 1321, 1321, 1321, 1321, 1321, 208, 208, 208, 1757, 208, 54, 1079, 1079, 54, 54, 1353, 1353, 1353, 1353, 1354, 1354, 1354, 1354, 1081, 1757, 54, 54, 54, 208, 54, 1081, 134, 134, 1329, 1329, 1329, 1329, 1329, 1329, 1330, 1331, 1331, 1331, 134, 857, 1333, 1083, 1085, 54, 1087, 134, 857, 1085, 1087, 1757, 1335, 1757, 1089, 1337, 897, 897, 1094, 1096, 234, 1092, 134, 134, 134, 234, 134, 866, 1092, 134, 134, 866, 134, 1090, 134, 134, 1339, 355, 134, 134, 878, 134, 871, 1096, 355, 1341, 1098, 1757, 134, 871, 249, 1100, 355, 1100, 1348, 1349, 134, 107, 107, 1401, 1401, 1401, 1401, 134, 878, 134, 134, 244, 1109, 244, 252, 134, 107, 134, 107, 898, 898, 54, 54, 1359, 1360, 1361, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 107, 107, 1757, 54, 107, 54, 1364, 1365, 1371, 1371, 1371, 1371, 1371, 1214, 1214, 1214, 1214, 107, 107, 107, 54, 54, 107, 1757, 54, 107, 107, 1369, 1369, 1369, 1369, 1370, 1371, 1371, 1371, 1371, 1371, 54, 54, 54, 107, 107, 54, 107, 1757, 54, 54, 107, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1376, 1377, 1377, 1104, 1104, 54, 54, 1757, 54, 107, 107, 107, 54, 107, 1382, 1382, 1382, 1382, 1383, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 54, 54, 54, 107, 54, 107, 107, 107, 107, 107, 107, 107, 107, 1757, 107, 107, 107, 107, 1391, 1392, 1111, 1111, 1757, 54, 1757, 54, 54, 54, 54, 54, 54, 54, 54, 107, 54, 54, 54, 54, 1399, 1399, 1399, 1400, 1401, 1401, 1401, 1401, 1401, 1401, 107, 107, 107, 1757, 107, 54, 107, 107, 1422, 1422, 1422, 1422, 1422, 1184, 1184, 1184, 1184, 1184, 107, 107, 54, 54, 54, 107, 54, 107, 54, 54, 1409, 1409, 1409, 1409, 1409, 1409, 1410, 1411, 1411, 1411, 54, 54, 107, 107, 107, 54, 107, 54, 107, 107, 1112, 1112, 1757, 1177, 1178, 1197, 1197, 1197, 1197, 1197, 107, 107, 54, 54, 54, 107, 54, 107, 54, 54, 1420, 1420, 1420, 1420, 1421, 1422, 1422, 1422, 1422, 1422, 54, 54, 107, 107, 107, 54, 107, 54, 107, 107, 107, 1172, 1173, 1174, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1757, 54, 54, 54, 107, 54, 107, 54, 54, 54, 107, 1182, 1182, 1182, 1182, 1183, 1184, 1184, 1184, 1184, 1184, 1757, 107, 107, 54, 107, 54, 107, 1757, 107, 54, 107, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1189, 1190, 1190, 54, 54, 1757, 54, 107, 54, 107, 54, 107, 54, 107, 1195, 1195, 1195, 1195, 1196, 1197, 1197, 1197, 1197, 1197, 1204, 1205, 107, 54, 107, 54, 107, 54, 107, 54, 107, 107, 107, 107, 1235, 1235, 1235, 1235, 1235, 1117, 1117, 1757, 54, 1757, 54, 107, 54, 107, 54, 107, 54, 54, 54, 54, 1212, 1212, 1212, 1213, 1214, 1214, 1214, 1214, 1214, 1214, 107, 54, 107, 54, 107, 54, 1435, 1435, 1435, 1435, 1435, 1448, 1448, 1448, 1448, 1448, 107, 107, 107, 107, 54, 107, 54, 107, 54, 107, 1222, 1222, 1222, 1222, 1222, 1222, 1223, 1224, 1224, 1224, 54, 54, 54, 54, 107, 54, 107, 54, 208, 54, 1465, 1465, 1465, 1465, 1488, 1488, 1488, 1488, 1488, 1757, 208, 208, 1757, 208, 54, 107, 54, 1757, 54, 208, 1233, 1233, 1233, 1233, 1234, 1235, 1235, 1235, 1235, 1235, 54, 54, 208, 54, 208, 54, 208, 1428, 1429, 54, 208, 1423, 1424, 1425, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1757, 54, 208, 54, 208, 54, 208, 1757, 208, 54, 208, 1433, 1433, 1433, 1433, 1434, 1435, 1435, 1435, 1435, 1435, 1757, 54, 208, 54, 208, 54, 208, 54, 208, 54, 208, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1440, 1441, 1441, 1757, 54, 208, 54, 208, 54, 208, 54, 208, 54, 208, 1446, 1446, 1446, 1446, 1447, 1448, 1448, 1448, 1448, 1448, 208, 54, 208, 54, 208, 54, 208, 54, 208, 54, 208, 1757, 208, 1455, 1456, 208, 1518, 1518, 1518, 1518, 54, 1757, 54, 1757, 54, 1757, 54, 208, 54, 208, 54, 208, 54, 208, 208, 54, 1463, 1463, 1463, 1464, 1465, 1465, 1465, 1465, 1465, 1465, 208, 54, 208, 54, 208, 54, 1757, 54, 54, 1501, 1501, 1501, 1501, 1501, 1118, 1118, 208, 208, 1757, 208, 54, 208, 54, 1757, 54, 208, 1473, 1473, 1473, 1473, 1473, 1473, 1474, 1475, 1475, 1475, 54, 54, 208, 54, 208, 54, 208, 1481, 1482, 54, 208, 1476, 1477, 1478, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1757, 54, 208, 54, 208, 54, 208, 1757, 208, 54, 208, 1486, 1486, 1486, 1486, 1487, 1488, 1488, 1488, 1488, 1488, 1757, 54, 208, 54, 208, 54, 208, 54, 208, 54, 208, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1493, 1494, 1494, 1757, 54, 208, 54, 208, 54, 208, 54, 208, 54, 208, 1499, 1499, 1499, 1499, 1500, 1501, 1501, 1501, 1501, 1501, 208, 54, 208, 54, 208, 54, 208, 54, 208, 54, 208, 1757, 208, 1508, 1509, 208, 1561, 1561, 1561, 1561, 54, 1757, 54, 1757, 54, 1757, 54, 208, 54, 208, 54, 208, 54, 208, 208, 54, 1516, 1516, 1516, 1517, 1518, 1518, 1518, 1518, 1518, 1518, 208, 54, 208, 54, 208, 54, 1757, 54, 54, 1539, 1539, 1539, 1539, 1539, 1346, 1346, 208, 208, 208, 208, 54, 208, 54, 208, 54, 208, 1526, 1526, 1526, 1526, 1526, 1526, 1527, 1528, 1528, 1528, 54, 54, 54, 54, 208, 54, 1333, 54, 1333, 54, 1562, 1562, 1562, 1562, 1371, 1371, 1371, 1371, 1371, 1757, 1335, 1757, 1335, 1757, 54, 208, 134, 1541, 134, 1337, 1537, 1537, 1537, 1537, 1538, 1539, 1539, 1539, 1539, 1539, 134, 1090, 134, 1090, 1339, 54, 1339, 134, 1341, 134, 1341, 249, 376, 1552, 1757, 1553, 1554, 1757, 107, 1757, 355, 107, 355, 107, 134, 1757, 134, 107, 134, 107, 134, 252, 252, 1556, 1557, 1757, 1558, 1559, 54, 107, 1757, 54, 1757, 54, 1364, 1365, 1757, 54, 1757, 54, 107, 107, 107, 107, 46, 107, 1757, 107, 107, 54, 1359, 1360, 1361, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 54, 54, 54, 54, 107, 54, 107, 54, 54, 107, 107, 1369, 1369, 1369, 1369, 1370, 1371, 1371, 1371, 1371, 1371, 1551, 1551, 1757, 54, 1757, 54, 107, 1757, 54, 54, 107, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1376, 1377, 1377, 1384, 1384, 1384, 1384, 1384, 54, 107, 107, 107, 54, 107, 1382, 1382, 1382, 1382, 1383, 1384, 1384, 1384, 1384, 1384, 107, 107, 1391, 1392, 107, 54, 54, 54, 107, 54, 107, 107, 107, 1401, 1401, 1401, 1401, 107, 1661, 1661, 54, 54, 1663, 1663, 54, 1666, 1666, 1757, 54, 107, 54, 54, 54, 107, 107, 107, 107, 54, 1399, 1399, 1399, 1400, 1401, 1401, 1401, 1401, 1401, 1401, 107, 54, 107, 1757, 107, 54, 54, 54, 54, 1422, 1422, 1422, 1422, 1422, 1605, 1605, 1605, 1605, 107, 107, 54, 107, 54, 107, 54, 107, 107, 107, 1409, 1409, 1409, 1409, 1409, 1409, 1410, 1411, 1411, 1411, 54, 54, 107, 54, 107, 54, 107, 54, 54, 54, 1575, 1575, 1575, 1575, 1575, 1588, 1588, 1588, 1588, 1588, 208, 208, 54, 208, 54, 107, 54, 208, 1568, 1569, 1420, 1420, 1420, 1420, 1421, 1422, 1422, 1422, 1422, 1422, 54, 54, 208, 54, 208, 54, 208, 54, 208, 208, 208, 1563, 1564, 1565, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1757, 54, 208, 54, 208, 54, 208, 54, 54, 54, 208, 1573, 1573, 1573, 1573, 1574, 1575, 1575, 1575, 1575, 1575, 1757, 54, 208, 54, 208, 54, 208, 1757, 208, 54, 208, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1580, 1581, 1581, 1757, 54, 208, 54, 208, 54, 208, 54, 208, 54, 208, 1586, 1586, 1586, 1586, 1587, 1588, 1588, 1588, 1588, 1588, 208, 54, 208, 54, 208, 54, 208, 54, 208, 54, 208, 1757, 208, 1595, 1596, 208, 1518, 1518, 1518, 1518, 54, 1757, 54, 1757, 54, 1757, 54, 208, 54, 208, 54, 208, 54, 208, 208, 54, 1603, 1603, 1603, 1604, 1605, 1605, 1605, 1605, 1605, 1605, 208, 54, 208, 54, 208, 54, 1757, 54, 54, 1626, 1626, 1626, 1626, 1626, 1668, 1668, 208, 208, 208, 208, 54, 208, 54, 208, 54, 208, 1613, 1613, 1613, 1613, 1613, 1613, 1614, 1615, 1615, 1615, 54, 54, 54, 54, 208, 54, 208, 54, 208, 54, 1686, 1686, 1757, 1481, 1482, 1488, 1488, 1488, 1488, 1488, 208, 208, 208, 208, 54, 208, 54, 208, 54, 208, 1624, 1624, 1624, 1624, 1625, 1626, 1626, 1626, 1626, 1626, 54, 54, 54, 54, 208, 54, 208, 54, 208, 54, 208, 1476, 1477, 1478, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1757, 208, 208, 54, 208, 54, 208, 54, 208, 54, 208, 1486, 1486, 1486, 1486, 1487, 1488, 1488, 1488, 1488, 1488, 54, 54, 1757, 54, 1757, 54, 208, 54, 208, 54, 208, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1493, 1494, 1494, 1501, 1501, 1501, 1501, 1501, 54, 208, 54, 208, 54, 208, 1499, 1499, 1499, 1499, 1500, 1501, 1501, 1501, 1501, 1501, 1508, 1509, 208, 208, 208, 54, 208, 54, 208, 54, 208, 1757, 208, 208, 208, 208, 1539, 1539, 1539, 1539, 1539, 1757, 54, 54, 54, 1757, 54, 208, 54, 208, 54, 208, 54, 54, 54, 54, 1516, 1516, 1516, 1517, 1518, 1518, 1518, 1518, 1518, 1518, 208, 54, 208, 54, 208, 54, 1633, 1633, 1633, 1633, 1633, 1635, 1635, 1635, 1635, 1635, 208, 208, 208, 208, 54, 208, 54, 208, 54, 208, 1526, 1526, 1526, 1526, 1526, 1526, 1527, 1528, 1528, 1528, 54, 54, 54, 54, 208, 54, 208, 54, 1541, 54, 1575, 1575, 1575, 1575, 1575, 1588, 1588, 1588, 1588, 1588, 1541, 249, 376, 1552, 54, 208, 54, 1557, 134, 1757, 1537, 1537, 1537, 1537, 1538, 1539, 1539, 1539, 1539, 1539, 134, 252, 252, 1556, 208, 54, 1646, 46, 1647, 1648, 1650, 1757, 1651, 1652, 208, 208, 1690, 1690, 1757, 1568, 1569, 1694, 1694, 1757, 54, 1757, 1556, 208, 208, 208, 46, 208, 1757, 208, 54, 54, 1563, 1564, 1565, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1757, 54, 54, 54, 208, 54, 208, 54, 208, 208, 208, 1573, 1573, 1573, 1573, 1574, 1575, 1575, 1575, 1575, 1575, 1757, 208, 208, 54, 208, 54, 208, 54, 54, 54, 208, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1580, 1581, 1581, 54, 54, 208, 54, 208, 54, 208, 208, 208, 54, 208, 1586, 1586, 1586, 1586, 1587, 1588, 1588, 1588, 1588, 1588, 208, 54, 208, 54, 208, 54, 54, 54, 208, 54, 208, 208, 1757, 1595, 1596, 1605, 1605, 1605, 1605, 1757, 54, 1757, 54, 1757, 54, 1696, 1696, 208, 54, 208, 54, 54, 208, 208, 208, 208, 208, 1603, 1603, 1603, 1604, 1605, 1605, 1605, 1605, 1605, 1605, 54, 208, 54, 208, 208, 54, 54, 54, 54, 54, 1626, 1626, 1626, 1626, 1626, 1699, 1699, 208, 208, 208, 208, 54, 208, 54, 54, 208, 208, 1613, 1613, 1613, 1613, 1613, 1613, 1614, 1615, 1615, 1615, 54, 54, 54, 54, 208, 54, 208, 249, 54, 54, 1661, 1661, 1661, 1661, 1662, 1666, 1666, 1666, 1666, 1667, 376, 1757, 1646, 1757, 54, 208, 54, 252, 1701, 1701, 1624, 1624, 1624, 1624, 1625, 1626, 1626, 1626, 1626, 1626, 252, 1552, 1556, 1553, 1554, 54, 1557, 1650, 1558, 1559, 249, 376, 1694, 1694, 1694, 1694, 1695, 1646, 249, 1647, 1648, 1556, 1650, 376, 1651, 1652, 46, 46, 1712, 1712, 252, 252, 1699, 1699, 1699, 1699, 1700, 1556, 252, 376, 1552, 1557, 46, 252, 1552, 1757, 1553, 1554, 1709, 1557, 1728, 1558, 1559, 1711, 1646, 1757, 1647, 1648, 1725, 252, 1556, 46, 1646, 1650, 1556, 1651, 1652, 1727, 1650, 46, 1729, 1728, 1737, 1552, 1556, 1553, 1554, 1557, 1757, 1558, 1559, 1757, 1556, 46, 1735, 1735, 1736, 1552, 46, 1553, 1554, 1729, 1729, 1556, 1737, 1716, 1716, 46, 1557, 1729, 1558, 1559, 1646, 1757, 1647, 1648, 1650, 1556, 1651, 1652, 1742, 1742, 1742, 1742, 1729, 1757, 1757, 1552, 46, 1553, 1554, 1557, 1556, 1558, 1559, 1646, 46, 1647, 1648, 1650, 1757, 1651, 1652, 1552, 1757, 1553, 1554, 1556, 1757, 1757, 1557, 46, 1558, 1559, 1646, 1556, 1647, 1648, 1650, 46, 1651, 1652, 1552, 1556, 1553, 1554, 1557, 1757, 1558, 1559, 46, 1757, 1757, 1646, 1556, 1647, 1648, 1650, 46, 1651, 1652, 1552, 1556, 1553, 1554, 1557, 46, 1558, 1559, 1646, 1757, 1647, 1648, 1556, 1757, 1757, 1650, 46, 1651, 1652, 1646, 1556, 1647, 1648, 1650, 46, 1651, 1652, 1757, 1556, 1757, 1757, 1757, 1757, 1757, 1757, 46, 1757, 1757, 1757, 1556, 1757, 1757, 1757, 46, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 29, 29, 29, 1757, 1757, 1757, 1757, 29, 32, 1757, 1757, 1757, 32, 32, 32, 1757, 1757, 32, 32, 32, 34, 34, 34, 1757, 1757, 1757, 1757, 34, 41, 1757, 41, 41, 41, 41, 41, 1757, 1757, 1757, 1757, 41, 43, 43, 43, 1757, 1757, 1757, 1757, 43, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 68, 68, 68, 1757, 1757, 1757, 1757, 68, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 74, 74, 74, 75, 75, 75, 1757, 1757, 1757, 1757, 75, 79, 1757, 1757, 1757, 79, 79, 79, 1757, 1757, 79, 79, 79, 80, 80, 80, 84, 84, 84, 1757, 1757, 1757, 1757, 84, 87, 87, 87, 90, 1757, 1757, 90, 90, 90, 90, 1757, 1757, 1757, 90, 90, 1757, 90, 95, 1757, 95, 95, 95, 95, 95, 1757, 1757, 1757, 1757, 95, 96, 96, 96, 100, 100, 100, 1757, 1757, 1757, 1757, 100, 106, 106, 106, 112, 1757, 1757, 1757, 112, 112, 112, 1757, 1757, 1757, 1757, 112, 115, 1757, 1757, 1757, 115, 115, 115, 1757, 1757, 1757, 1757, 115, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 128, 128, 128, 128, 128, 128, 128, 128, 128, 1757, 128, 128, 128, 128, 128, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 144, 144, 144, 148, 148, 148, 148, 1757, 1757, 1757, 1757, 148, 150, 150, 150, 1757, 1757, 1757, 1757, 150, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 153, 153, 153, 154, 154, 154, 157, 157, 157, 159, 159, 159, 161, 161, 161, 166, 1757, 1757, 1757, 166, 166, 166, 1757, 1757, 1757, 166, 166, 1757, 166, 169, 1757, 169, 169, 169, 170, 170, 170, 173, 1757, 1757, 173, 173, 173, 173, 1757, 1757, 1757, 173, 173, 1757, 173, 175, 175, 175, 177, 177, 177, 179, 179, 179, 187, 1757, 1757, 1757, 187, 187, 187, 1757, 1757, 1757, 1757, 187, 190, 1757, 1757, 1757, 190, 190, 190, 1757, 1757, 1757, 1757, 190, 195, 1757, 1757, 1757, 195, 195, 195, 1757, 1757, 1757, 1757, 195, 198, 1757, 1757, 1757, 198, 198, 198, 1757, 1757, 1757, 1757, 198, 199, 1757, 1757, 1757, 199, 199, 199, 1757, 1757, 1757, 1757, 199, 200, 1757, 1757, 1757, 200, 200, 200, 1757, 1757, 1757, 1757, 200, 207, 207, 207, 213, 1757, 1757, 1757, 213, 213, 213, 1757, 1757, 1757, 1757, 213, 216, 1757, 1757, 1757, 216, 216, 216, 1757, 1757, 1757, 1757, 216, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 128, 128, 128, 128, 128, 128, 128, 128, 128, 1757, 128, 128, 128, 128, 128, 219, 219, 219, 219, 219, 219, 219, 219, 219, 1757, 219, 219, 219, 1757, 219, 221, 221, 221, 221, 221, 221, 221, 221, 221, 1757, 221, 221, 1757, 221, 221, 131, 131, 131, 131, 131, 131, 131, 131, 131, 1757, 131, 131, 131, 1757, 131, 222, 222, 222, 222, 222, 222, 222, 222, 222, 1757, 222, 222, 222, 222, 222, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 230, 230, 230, 230, 230, 230, 230, 230, 230, 1757, 230, 230, 230, 230, 230, 136, 136, 136, 136, 136, 136, 136, 136, 136, 1757, 136, 136, 1757, 1757, 136, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 140, 140, 140, 140, 140, 140, 140, 140, 140, 1757, 140, 140, 140, 1757, 140, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 250, 1757, 1757, 1757, 250, 250, 1757, 250, 1757, 1757, 1757, 250, 253, 253, 253, 68, 68, 68, 148, 148, 148, 148, 1757, 1757, 1757, 1757, 148, 255, 255, 255, 255, 1757, 1757, 1757, 1757, 255, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 257, 257, 257, 79, 1757, 1757, 1757, 79, 79, 79, 1757, 1757, 79, 79, 79, 258, 258, 258, 259, 259, 259, 260, 260, 260, 262, 262, 262, 265, 1757, 265, 265, 265, 166, 1757, 1757, 1757, 166, 166, 166, 1757, 1757, 1757, 166, 166, 1757, 166, 267, 1757, 267, 267, 267, 169, 169, 169, 170, 1757, 1757, 1757, 170, 170, 170, 1757, 1757, 1757, 170, 170, 1757, 170, 269, 1757, 1757, 1757, 269, 269, 269, 1757, 1757, 1757, 269, 269, 1757, 269, 173, 1757, 1757, 173, 173, 173, 173, 1757, 1757, 1757, 173, 173, 1757, 173, 272, 1757, 272, 272, 272, 273, 273, 273, 274, 274, 274, 275, 275, 275, 277, 277, 277, 283, 1757, 1757, 1757, 283, 283, 283, 1757, 1757, 1757, 1757, 283, 286, 1757, 1757, 1757, 286, 286, 286, 1757, 1757, 1757, 1757, 286, 287, 1757, 1757, 1757, 287, 287, 287, 1757, 1757, 1757, 1757, 287, 288, 1757, 1757, 1757, 288, 288, 288, 1757, 1757, 1757, 1757, 288, 296, 1757, 1757, 1757, 296, 296, 296, 1757, 1757, 1757, 1757, 296, 299, 1757, 1757, 1757, 299, 299, 299, 1757, 1757, 1757, 1757, 299, 300, 1757, 1757, 1757, 300, 300, 300, 1757, 1757, 1757, 1757, 300, 301, 1757, 1757, 1757, 301, 301, 301, 1757, 1757, 1757, 1757, 301, 305, 1757, 1757, 1757, 305, 305, 305, 1757, 1757, 1757, 1757, 305, 306, 1757, 1757, 1757, 306, 306, 306, 1757, 1757, 1757, 1757, 306, 307, 1757, 1757, 1757, 307, 307, 307, 1757, 1757, 1757, 1757, 307, 310, 1757, 1757, 1757, 310, 310, 310, 1757, 1757, 1757, 1757, 310, 315, 1757, 1757, 1757, 315, 315, 315, 1757, 1757, 1757, 1757, 315, 318, 1757, 1757, 1757, 318, 318, 318, 1757, 1757, 1757, 1757, 318, 323, 1757, 1757, 1757, 323, 323, 323, 1757, 1757, 1757, 1757, 323, 326, 1757, 1757, 1757, 326, 326, 326, 1757, 1757, 1757, 1757, 326, 327, 1757, 1757, 1757, 327, 327, 327, 1757, 1757, 1757, 1757, 327, 328, 1757, 1757, 1757, 328, 328, 328, 1757, 1757, 1757, 1757, 328, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 332, 332, 332, 332, 332, 332, 332, 332, 332, 1757, 332, 332, 332, 1757, 332, 219, 219, 219, 219, 219, 219, 219, 219, 219, 1757, 219, 219, 1757, 1757, 219, 221, 221, 221, 221, 221, 221, 221, 221, 221, 1757, 221, 221, 1757, 221, 221, 334, 334, 334, 334, 334, 334, 334, 334, 334, 1757, 334, 334, 1757, 334, 334, 222, 222, 222, 222, 222, 222, 222, 222, 222, 1757, 222, 222, 222, 1757, 222, 335, 335, 335, 335, 335, 335, 335, 335, 335, 1757, 335, 335, 335, 335, 335, 338, 338, 338, 338, 338, 338, 338, 338, 338, 1757, 338, 338, 1757, 338, 338, 225, 225, 225, 225, 225, 225, 225, 225, 225, 1757, 225, 225, 1757, 1757, 225, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 227, 227, 227, 227, 227, 227, 227, 227, 227, 1757, 227, 227, 227, 1757, 227, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 230, 230, 230, 230, 230, 230, 230, 230, 230, 1757, 230, 230, 230, 230, 230, 344, 344, 344, 344, 344, 344, 344, 344, 344, 1757, 344, 344, 1757, 344, 344, 232, 232, 232, 232, 232, 232, 232, 232, 232, 1757, 232, 232, 232, 1757, 232, 345, 345, 345, 345, 345, 345, 345, 345, 345, 1757, 345, 345, 345, 345, 345, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 236, 236, 236, 236, 236, 236, 236, 236, 236, 1757, 236, 236, 236, 1757, 236, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 360, 360, 360, 360, 360, 360, 360, 360, 360, 1757, 360, 360, 1757, 360, 360, 242, 242, 242, 242, 242, 242, 242, 242, 242, 1757, 242, 242, 242, 1757, 242, 361, 361, 361, 361, 361, 361, 361, 361, 361, 1757, 361, 361, 361, 361, 361, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 246, 246, 246, 246, 246, 246, 246, 246, 246, 1757, 246, 246, 246, 1757, 246, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 372, 372, 372, 377, 1757, 1757, 1757, 377, 377, 1757, 377, 1757, 1757, 1757, 377, 150, 150, 150, 255, 255, 255, 255, 1757, 1757, 1757, 1757, 255, 385, 385, 385, 386, 386, 386, 265, 265, 265, 267, 267, 267, 388, 1757, 388, 388, 388, 269, 1757, 1757, 1757, 269, 269, 269, 1757, 1757, 1757, 269, 269, 1757, 269, 390, 1757, 390, 390, 390, 272, 272, 272, 395, 395, 395, 396, 396, 396, 401, 1757, 1757, 1757, 401, 401, 401, 1757, 1757, 1757, 1757, 401, 404, 1757, 1757, 1757, 404, 404, 404, 1757, 1757, 1757, 1757, 404, 405, 1757, 1757, 1757, 405, 405, 405, 1757, 1757, 1757, 1757, 405, 406, 1757, 1757, 1757, 406, 406, 406, 1757, 1757, 1757, 1757, 406, 410, 1757, 1757, 1757, 410, 410, 410, 1757, 1757, 1757, 1757, 410, 411, 1757, 1757, 1757, 411, 411, 411, 1757, 1757, 1757, 1757, 411, 412, 1757, 1757, 1757, 412, 412, 412, 1757, 1757, 1757, 1757, 412, 415, 1757, 1757, 1757, 415, 415, 415, 1757, 1757, 1757, 1757, 415, 420, 1757, 1757, 1757, 420, 420, 420, 1757, 1757, 1757, 1757, 420, 423, 1757, 1757, 1757, 423, 423, 423, 1757, 1757, 1757, 1757, 423, 424, 1757, 1757, 1757, 424, 424, 424, 1757, 1757, 1757, 1757, 424, 425, 1757, 1757, 1757, 425, 425, 425, 1757, 1757, 1757, 1757, 425, 429, 1757, 1757, 1757, 429, 429, 429, 1757, 1757, 1757, 1757, 429, 430, 1757, 1757, 1757, 430, 430, 430, 1757, 1757, 1757, 1757, 430, 431, 1757, 1757, 1757, 431, 431, 431, 1757, 1757, 1757, 1757, 431, 434, 1757, 1757, 1757, 434, 434, 434, 1757, 1757, 1757, 1757, 434, 435, 1757, 1757, 1757, 435, 435, 435, 1757, 1757, 1757, 1757, 435, 436, 1757, 1757, 1757, 436, 436, 436, 1757, 1757, 1757, 1757, 436, 437, 1757, 1757, 1757, 437, 437, 437, 1757, 1757, 1757, 1757, 437, 438, 1757, 1757, 1757, 438, 438, 438, 1757, 1757, 1757, 1757, 438, 446, 1757, 1757, 1757, 446, 446, 446, 1757, 1757, 1757, 1757, 446, 449, 1757, 1757, 1757, 449, 449, 449, 1757, 1757, 1757, 1757, 449, 450, 1757, 1757, 1757, 450, 450, 450, 1757, 1757, 1757, 1757, 450, 451, 1757, 1757, 1757, 451, 451, 451, 1757, 1757, 1757, 1757, 451, 459, 1757, 1757, 1757, 459, 459, 459, 1757, 1757, 1757, 1757, 459, 462, 1757, 1757, 1757, 462, 462, 462, 1757, 1757, 1757, 1757, 462, 463, 1757, 1757, 1757, 463, 463, 463, 1757, 1757, 1757, 1757, 463, 464, 1757, 1757, 1757, 464, 464, 464, 1757, 1757, 1757, 1757, 464, 468, 1757, 1757, 1757, 468, 468, 468, 1757, 1757, 1757, 1757, 468, 469, 1757, 1757, 1757, 469, 469, 469, 1757, 1757, 1757, 1757, 469, 470, 1757, 1757, 1757, 470, 470, 470, 1757, 1757, 1757, 1757, 470, 473, 1757, 1757, 1757, 473, 473, 473, 1757, 1757, 1757, 1757, 473, 332, 332, 332, 332, 332, 332, 332, 332, 332, 1757, 332, 332, 332, 1757, 332, 334, 334, 334, 334, 334, 334, 334, 334, 334, 1757, 334, 334, 1757, 334, 334, 474, 474, 474, 474, 474, 474, 474, 474, 474, 1757, 474, 474, 474, 474, 474, 335, 335, 335, 335, 335, 335, 335, 335, 335, 1757, 335, 335, 335, 1757, 335, 476, 476, 476, 476, 476, 476, 476, 476, 476, 1757, 476, 476, 476, 476, 476, 338, 338, 338, 338, 338, 338, 338, 338, 338, 1757, 338, 338, 1757, 338, 338, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 341, 341, 341, 341, 341, 341, 341, 341, 341, 1757, 341, 341, 341, 1757, 341, 481, 481, 481, 481, 481, 481, 481, 481, 481, 481, 481, 481, 481, 481, 481, 344, 344, 344, 344, 344, 344, 344, 344, 344, 1757, 344, 344, 1757, 344, 344, 484, 484, 484, 484, 484, 484, 484, 484, 484, 1757, 484, 484, 1757, 484, 484, 345, 345, 345, 345, 345, 345, 345, 345, 345, 1757, 345, 345, 345, 1757, 345, 485, 485, 485, 485, 485, 485, 485, 485, 485, 1757, 485, 485, 485, 485, 485, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 348, 348, 348, 348, 348, 348, 348, 348, 348, 1757, 348, 348, 348, 1757, 348, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 493, 493, 493, 493, 493, 493, 493, 493, 493, 1757, 493, 493, 1757, 493, 493, 353, 353, 353, 353, 353, 353, 353, 353, 353, 1757, 353, 353, 353, 1757, 353, 494, 494, 494, 494, 494, 494, 494, 494, 494, 1757, 494, 494, 494, 494, 494, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 357, 357, 357, 357, 357, 357, 357, 357, 357, 1757, 357, 357, 357, 1757, 357, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 360, 360, 360, 360, 360, 360, 360, 360, 360, 1757, 360, 360, 1757, 360, 360, 505, 505, 505, 505, 505, 505, 505, 505, 505, 1757, 505, 505, 1757, 505, 505, 361, 361, 361, 361, 361, 361, 361, 361, 361, 1757, 361, 361, 361, 1757, 361, 506, 506, 506, 506, 506, 506, 506, 506, 506, 1757, 506, 506, 506, 506, 506, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 364, 364, 364, 364, 364, 364, 364, 364, 364, 1757, 364, 364, 364, 1757, 364, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 369, 369, 369, 369, 369, 369, 369, 369, 369, 1757, 369, 369, 369, 1757, 369, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 1757, 516, 518, 1757, 1757, 1757, 518, 518, 1757, 1757, 1757, 1757, 1757, 518, 519, 519, 519, 520, 520, 520, 521, 521, 521, 388, 388, 388, 390, 390, 390, 542, 1757, 1757, 1757, 542, 542, 542, 1757, 1757, 1757, 1757, 542, 545, 1757, 1757, 1757, 545, 545, 545, 1757, 1757, 1757, 1757, 545, 546, 1757, 1757, 1757, 546, 546, 546, 1757, 1757, 1757, 1757, 546, 547, 1757, 1757, 1757, 547, 547, 547, 1757, 1757, 1757, 1757, 547, 551, 1757, 1757, 1757, 551, 551, 551, 1757, 1757, 1757, 1757, 551, 552, 1757, 1757, 1757, 552, 552, 552, 1757, 1757, 1757, 1757, 552, 553, 1757, 1757, 1757, 553, 553, 553, 1757, 1757, 1757, 1757, 553, 556, 1757, 1757, 1757, 556, 556, 556, 1757, 1757, 1757, 1757, 556, 557, 1757, 1757, 1757, 557, 557, 557, 1757, 1757, 1757, 1757, 557, 558, 1757, 1757, 1757, 558, 558, 558, 1757, 1757, 1757, 1757, 558, 559, 1757, 1757, 1757, 559, 559, 559, 1757, 1757, 1757, 1757, 559, 560, 1757, 1757, 1757, 560, 560, 560, 1757, 1757, 1757, 1757, 560, 568, 1757, 1757, 1757, 568, 568, 568, 1757, 1757, 1757, 1757, 568, 571, 1757, 1757, 1757, 571, 571, 571, 1757, 1757, 1757, 1757, 571, 572, 1757, 1757, 1757, 572, 572, 572, 1757, 1757, 1757, 1757, 572, 573, 1757, 1757, 1757, 573, 573, 573, 1757, 1757, 1757, 1757, 573, 577, 1757, 1757, 1757, 577, 577, 577, 1757, 1757, 1757, 1757, 577, 578, 1757, 1757, 1757, 578, 578, 578, 1757, 1757, 1757, 1757, 578, 579, 1757, 1757, 1757, 579, 579, 579, 1757, 1757, 1757, 1757, 579, 582, 1757, 1757, 1757, 582, 582, 582, 1757, 1757, 1757, 1757, 582, 583, 1757, 1757, 1757, 583, 583, 583, 1757, 1757, 1757, 1757, 583, 584, 1757, 1757, 1757, 584, 584, 584, 1757, 1757, 1757, 1757, 584, 585, 1757, 1757, 1757, 585, 585, 585, 1757, 1757, 1757, 1757, 585, 586, 1757, 1757, 1757, 586, 586, 586, 1757, 1757, 1757, 1757, 586, 590, 1757, 1757, 1757, 590, 590, 590, 1757, 1757, 1757, 1757, 590, 591, 1757, 1757, 1757, 591, 591, 591, 1757, 1757, 1757, 1757, 591, 592, 1757, 1757, 1757, 592, 592, 592, 1757, 1757, 1757, 1757, 592, 593, 1757, 1757, 1757, 593, 593, 593, 1757, 1757, 1757, 1757, 593, 594, 1757, 1757, 1757, 594, 594, 594, 1757, 1757, 1757, 1757, 594, 595, 1757, 1757, 1757, 595, 595, 595, 1757, 1757, 1757, 1757, 595, 597, 1757, 1757, 1757, 597, 597, 597, 1757, 1757, 1757, 1757, 597, 602, 1757, 1757, 1757, 602, 602, 602, 1757, 1757, 1757, 1757, 602, 605, 1757, 1757, 1757, 605, 605, 605, 1757, 1757, 1757, 1757, 605, 606, 1757, 1757, 1757, 606, 606, 606, 1757, 1757, 1757, 1757, 606, 607, 1757, 1757, 1757, 607, 607, 607, 1757, 1757, 1757, 1757, 607, 611, 1757, 1757, 1757, 611, 611, 611, 1757, 1757, 1757, 1757, 611, 612, 1757, 1757, 1757, 612, 612, 612, 1757, 1757, 1757, 1757, 612, 613, 1757, 1757, 1757, 613, 613, 613, 1757, 1757, 1757, 1757, 613, 616, 1757, 1757, 1757, 616, 616, 616, 1757, 1757, 1757, 1757, 616, 621, 1757, 1757, 1757, 621, 621, 621, 1757, 1757, 1757, 1757, 621, 624, 1757, 1757, 1757, 624, 624, 624, 1757, 1757, 1757, 1757, 624, 625, 1757, 1757, 1757, 625, 625, 625, 1757, 1757, 1757, 1757, 625, 626, 1757, 1757, 1757, 626, 626, 626, 1757, 1757, 1757, 1757, 626, 630, 1757, 1757, 1757, 630, 630, 630, 1757, 1757, 1757, 1757, 630, 631, 1757, 1757, 1757, 631, 631, 631, 1757, 1757, 1757, 1757, 631, 632, 1757, 1757, 1757, 632, 632, 632, 1757, 1757, 1757, 1757, 632, 635, 1757, 1757, 1757, 635, 635, 635, 1757, 1757, 1757, 1757, 635, 636, 1757, 1757, 1757, 636, 636, 636, 1757, 1757, 1757, 1757, 636, 637, 1757, 1757, 1757, 637, 637, 637, 1757, 1757, 1757, 1757, 637, 638, 1757, 1757, 1757, 638, 638, 638, 1757, 1757, 1757, 1757, 638, 639, 1757, 1757, 1757, 639, 639, 639, 1757, 1757, 1757, 1757, 639, 474, 474, 474, 474, 474, 474, 474, 474, 474, 1757, 474, 474, 474, 474, 474, 643, 643, 643, 643, 643, 643, 643, 643, 643, 1757, 643, 643, 643, 643, 643, 476, 476, 476, 476, 476, 476, 476, 476, 476, 1757, 476, 476, 476, 1757, 476, 645, 645, 645, 645, 645, 645, 645, 645, 645, 1757, 645, 645, 645, 645, 645, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 481, 481, 481, 481, 481, 481, 481, 481, 481, 1757, 481, 481, 481, 1757, 481, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 1757, 650, 484, 484, 484, 484, 484, 484, 484, 484, 484, 1757, 484, 484, 1757, 484, 484, 652, 652, 652, 652, 652, 652, 652, 652, 652, 1757, 652, 652, 652, 652, 652, 485, 485, 485, 485, 485, 485, 485, 485, 485, 1757, 485, 485, 485, 1757, 485, 654, 654, 654, 654, 654, 654, 654, 654, 654, 1757, 654, 654, 654, 654, 654, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 490, 490, 490, 490, 490, 490, 490, 490, 490, 1757, 490, 490, 490, 1757, 490, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 493, 493, 493, 493, 493, 493, 493, 493, 493, 1757, 493, 493, 1757, 493, 493, 662, 662, 662, 662, 662, 662, 662, 662, 662, 1757, 662, 662, 1757, 662, 662, 494, 494, 494, 494, 494, 494, 494, 494, 494, 1757, 494, 494, 494, 1757, 494, 663, 663, 663, 663, 663, 663, 663, 663, 663, 1757, 663, 663, 663, 663, 663, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 497, 497, 497, 497, 497, 497, 497, 497, 497, 1757, 497, 497, 497, 1757, 497, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 502, 502, 502, 502, 502, 502, 502, 502, 502, 1757, 502, 502, 502, 1757, 502, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 1757, 673, 505, 505, 505, 505, 505, 505, 505, 505, 505, 1757, 505, 505, 1757, 505, 505, 675, 675, 675, 675, 675, 675, 675, 675, 675, 1757, 675, 675, 675, 675, 675, 506, 506, 506, 506, 506, 506, 506, 506, 506, 1757, 506, 506, 506, 1757, 506, 677, 677, 677, 677, 677, 677, 677, 677, 677, 1757, 677, 677, 677, 677, 677, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 511, 511, 511, 511, 511, 511, 511, 511, 511, 1757, 511, 511, 511, 1757, 511, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 685, 685, 685, 685, 685, 685, 685, 685, 685, 685, 685, 685, 685, 1757, 685, 516, 516, 516, 516, 516, 516, 516, 516, 516, 1757, 516, 516, 516, 1757, 516, 687, 687, 687, 377, 1757, 1757, 1757, 377, 377, 1757, 1757, 1757, 1757, 1757, 377, 689, 1757, 1757, 1757, 689, 689, 1757, 1757, 1757, 1757, 1757, 689, 690, 690, 690, 714, 1757, 1757, 1757, 714, 714, 714, 1757, 1757, 1757, 1757, 714, 717, 1757, 1757, 1757, 717, 717, 717, 1757, 1757, 1757, 1757, 717, 718, 1757, 1757, 1757, 718, 718, 718, 1757, 1757, 1757, 1757, 718, 719, 1757, 1757, 1757, 719, 719, 719, 1757, 1757, 1757, 1757, 719, 723, 1757, 1757, 1757, 723, 723, 723, 1757, 1757, 1757, 1757, 723, 724, 1757, 1757, 1757, 724, 724, 724, 1757, 1757, 1757, 1757, 724, 725, 1757, 1757, 1757, 725, 725, 725, 1757, 1757, 1757, 1757, 725, 728, 1757, 1757, 1757, 728, 728, 728, 1757, 1757, 1757, 1757, 728, 729, 1757, 1757, 1757, 729, 729, 729, 1757, 1757, 1757, 1757, 729, 730, 1757, 1757, 1757, 730, 730, 730, 1757, 1757, 1757, 1757, 730, 731, 1757, 1757, 1757, 731, 731, 731, 1757, 1757, 1757, 1757, 731, 732, 1757, 1757, 1757, 732, 732, 732, 1757, 1757, 1757, 1757, 732, 736, 1757, 1757, 1757, 736, 736, 736, 1757, 1757, 1757, 1757, 736, 737, 1757, 1757, 1757, 737, 737, 737, 1757, 1757, 1757, 1757, 737, 738, 1757, 1757, 1757, 738, 738, 738, 1757, 1757, 1757, 1757, 738, 739, 1757, 1757, 1757, 739, 739, 739, 1757, 1757, 1757, 1757, 739, 740, 1757, 1757, 1757, 740, 740, 740, 1757, 1757, 1757, 1757, 740, 741, 1757, 1757, 1757, 741, 741, 741, 1757, 1757, 1757, 1757, 741, 743, 1757, 1757, 1757, 743, 743, 743, 1757, 1757, 1757, 1757, 743, 748, 1757, 1757, 1757, 748, 748, 748, 1757, 1757, 1757, 1757, 748, 751, 1757, 1757, 1757, 751, 751, 751, 1757, 1757, 1757, 1757, 751, 752, 1757, 1757, 1757, 752, 752, 752, 1757, 1757, 1757, 1757, 752, 753, 1757, 1757, 1757, 753, 753, 753, 1757, 1757, 1757, 1757, 753, 757, 1757, 1757, 1757, 757, 757, 757, 1757, 1757, 1757, 1757, 757, 758, 1757, 1757, 1757, 758, 758, 758, 1757, 1757, 1757, 1757, 758, 759, 1757, 1757, 1757, 759, 759, 759, 1757, 1757, 1757, 1757, 759, 762, 1757, 1757, 1757, 762, 762, 762, 1757, 1757, 1757, 1757, 762, 763, 1757, 1757, 1757, 763, 763, 763, 1757, 1757, 1757, 1757, 763, 764, 1757, 1757, 1757, 764, 764, 764, 1757, 1757, 1757, 1757, 764, 765, 1757, 1757, 1757, 765, 765, 765, 1757, 1757, 1757, 1757, 765, 766, 1757, 1757, 1757, 766, 766, 766, 1757, 1757, 1757, 1757, 766, 770, 1757, 1757, 1757, 770, 770, 770, 1757, 1757, 1757, 1757, 770, 771, 1757, 1757, 1757, 771, 771, 771, 1757, 1757, 1757, 1757, 771, 772, 1757, 1757, 1757, 772, 772, 772, 1757, 1757, 1757, 1757, 772, 773, 1757, 1757, 1757, 773, 773, 773, 1757, 1757, 1757, 1757, 773, 774, 1757, 1757, 1757, 774, 774, 774, 1757, 1757, 1757, 1757, 774, 775, 1757, 1757, 1757, 775, 775, 775, 1757, 1757, 1757, 1757, 775, 777, 1757, 1757, 1757, 777, 777, 777, 1757, 1757, 1757, 1757, 777, 778, 1757, 1757, 1757, 778, 778, 778, 1757, 1757, 1757, 1757, 778, 779, 1757, 1757, 1757, 779, 779, 779, 1757, 1757, 1757, 1757, 779, 780, 1757, 1757, 1757, 780, 780, 780, 1757, 1757, 1757, 1757, 780, 781, 1757, 1757, 1757, 781, 781, 781, 1757, 1757, 1757, 1757, 781, 782, 1757, 1757, 1757, 782, 782, 782, 1757, 1757, 1757, 1757, 782, 783, 1757, 1757, 1757, 783, 783, 783, 1757, 1757, 1757, 1757, 783, 791, 1757, 1757, 1757, 791, 791, 791, 1757, 1757, 1757, 1757, 791, 794, 1757, 1757, 1757, 794, 794, 794, 1757, 1757, 1757, 1757, 794, 795, 1757, 1757, 1757, 795, 795, 795, 1757, 1757, 1757, 1757, 795, 796, 1757, 1757, 1757, 796, 796, 796, 1757, 1757, 1757, 1757, 796, 800, 1757, 1757, 1757, 800, 800, 800, 1757, 1757, 1757, 1757, 800, 801, 1757, 1757, 1757, 801, 801, 801, 1757, 1757, 1757, 1757, 801, 802, 1757, 1757, 1757, 802, 802, 802, 1757, 1757, 1757, 1757, 802, 805, 1757, 1757, 1757, 805, 805, 805, 1757, 1757, 1757, 1757, 805, 806, 1757, 1757, 1757, 806, 806, 806, 1757, 1757, 1757, 1757, 806, 807, 1757, 1757, 1757, 807, 807, 807, 1757, 1757, 1757, 1757, 807, 808, 1757, 1757, 1757, 808, 808, 808, 1757, 1757, 1757, 1757, 808, 809, 1757, 1757, 1757, 809, 809, 809, 1757, 1757, 1757, 1757, 809, 817, 1757, 1757, 1757, 817, 817, 817, 1757, 1757, 1757, 1757, 817, 820, 1757, 1757, 1757, 820, 820, 820, 1757, 1757, 1757, 1757, 820, 821, 1757, 1757, 1757, 821, 821, 821, 1757, 1757, 1757, 1757, 821, 822, 1757, 1757, 1757, 822, 822, 822, 1757, 1757, 1757, 1757, 822, 826, 1757, 1757, 1757, 826, 826, 826, 1757, 1757, 1757, 1757, 826, 827, 1757, 1757, 1757, 827, 827, 827, 1757, 1757, 1757, 1757, 827, 828, 1757, 1757, 1757, 828, 828, 828, 1757, 1757, 1757, 1757, 828, 831, 1757, 1757, 1757, 831, 831, 831, 1757, 1757, 1757, 1757, 831, 832, 1757, 1757, 1757, 832, 832, 832, 1757, 1757, 1757, 1757, 832, 833, 1757, 1757, 1757, 833, 833, 833, 1757, 1757, 1757, 1757, 833, 834, 1757, 1757, 1757, 834, 834, 834, 1757, 1757, 1757, 1757, 834, 835, 1757, 1757, 1757, 835, 835, 835, 1757, 1757, 1757, 1757, 835, 839, 1757, 1757, 1757, 839, 839, 839, 1757, 1757, 1757, 1757, 839, 840, 1757, 1757, 1757, 840, 840, 840, 1757, 1757, 1757, 1757, 840, 841, 1757, 1757, 1757, 841, 841, 841, 1757, 1757, 1757, 1757, 841, 842, 1757, 1757, 1757, 842, 842, 842, 1757, 1757, 1757, 1757, 842, 843, 1757, 1757, 1757, 843, 843, 843, 1757, 1757, 1757, 1757, 843, 844, 1757, 1757, 1757, 844, 844, 844, 1757, 1757, 1757, 1757, 844, 846, 1757, 1757, 1757, 846, 846, 846, 1757, 1757, 1757, 1757, 846, 643, 643, 643, 643, 643, 643, 643, 643, 643, 1757, 643, 643, 643, 643, 643, 847, 847, 847, 847, 847, 847, 847, 847, 847, 1757, 847, 847, 847, 847, 847, 645, 645, 645, 645, 645, 645, 645, 645, 645, 1757, 645, 645, 645, 1757, 645, 849, 849, 849, 849, 849, 849, 849, 849, 849, 1757, 849, 849, 849, 1757, 849, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 1757, 851, 650, 650, 650, 650, 650, 650, 650, 650, 650, 1757, 650, 650, 650, 1757, 650, 652, 652, 652, 652, 652, 652, 652, 652, 652, 1757, 652, 652, 652, 652, 652, 853, 853, 853, 853, 853, 853, 853, 853, 853, 1757, 853, 853, 853, 853, 853, 654, 654, 654, 654, 654, 654, 654, 654, 654, 1757, 654, 654, 654, 1757, 654, 855, 855, 855, 855, 855, 855, 855, 855, 855, 1757, 855, 855, 855, 855, 855, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 659, 659, 659, 659, 659, 659, 659, 659, 659, 1757, 659, 659, 659, 1757, 659, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 1757, 860, 662, 662, 662, 662, 662, 662, 662, 662, 662, 1757, 662, 662, 1757, 662, 662, 862, 862, 862, 862, 862, 862, 862, 862, 862, 1757, 862, 862, 862, 862, 862, 663, 663, 663, 663, 663, 663, 663, 663, 663, 1757, 663, 663, 663, 1757, 663, 864, 864, 864, 864, 864, 864, 864, 864, 864, 1757, 864, 864, 864, 864, 864, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 668, 668, 668, 668, 668, 668, 668, 668, 668, 1757, 668, 668, 668, 1757, 668, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 1757, 872, 673, 673, 673, 673, 673, 673, 673, 673, 673, 1757, 673, 673, 673, 1757, 673, 675, 675, 675, 675, 675, 675, 675, 675, 675, 1757, 675, 675, 675, 675, 675, 874, 874, 874, 874, 874, 874, 874, 874, 874, 1757, 874, 874, 874, 874, 874, 677, 677, 677, 677, 677, 677, 677, 677, 677, 1757, 677, 677, 677, 1757, 677, 876, 876, 876, 876, 876, 876, 876, 876, 876, 1757, 876, 876, 876, 876, 876, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 682, 682, 682, 682, 682, 682, 682, 682, 682, 1757, 682, 682, 682, 1757, 682, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 1757, 881, 685, 685, 685, 685, 685, 685, 685, 685, 685, 685, 685, 685, 685, 1757, 685, 885, 885, 885, 909, 1757, 1757, 1757, 909, 909, 909, 1757, 1757, 1757, 1757, 909, 912, 1757, 1757, 1757, 912, 912, 912, 1757, 1757, 1757, 1757, 912, 913, 1757, 1757, 1757, 913, 913, 913, 1757, 1757, 1757, 1757, 913, 914, 1757, 1757, 1757, 914, 914, 914, 1757, 1757, 1757, 1757, 914, 918, 1757, 1757, 1757, 918, 918, 918, 1757, 1757, 1757, 1757, 918, 919, 1757, 1757, 1757, 919, 919, 919, 1757, 1757, 1757, 1757, 919, 920, 1757, 1757, 1757, 920, 920, 920, 1757, 1757, 1757, 1757, 920, 923, 1757, 1757, 1757, 923, 923, 923, 1757, 1757, 1757, 1757, 923, 924, 1757, 1757, 1757, 924, 924, 924, 1757, 1757, 1757, 1757, 924, 925, 1757, 1757, 1757, 925, 925, 925, 1757, 1757, 1757, 1757, 925, 926, 1757, 1757, 1757, 926, 926, 926, 1757, 1757, 1757, 1757, 926, 927, 1757, 1757, 1757, 927, 927, 927, 1757, 1757, 1757, 1757, 927, 931, 1757, 1757, 1757, 931, 931, 931, 1757, 1757, 1757, 1757, 931, 932, 1757, 1757, 1757, 932, 932, 932, 1757, 1757, 1757, 1757, 932, 933, 1757, 1757, 1757, 933, 933, 933, 1757, 1757, 1757, 1757, 933, 934, 1757, 1757, 1757, 934, 934, 934, 1757, 1757, 1757, 1757, 934, 935, 1757, 1757, 1757, 935, 935, 935, 1757, 1757, 1757, 1757, 935, 936, 1757, 1757, 1757, 936, 936, 936, 1757, 1757, 1757, 1757, 936, 938, 1757, 1757, 1757, 938, 938, 938, 1757, 1757, 1757, 1757, 938, 939, 1757, 1757, 1757, 939, 939, 939, 1757, 1757, 1757, 1757, 939, 940, 1757, 1757, 1757, 940, 940, 940, 1757, 1757, 1757, 1757, 940, 941, 1757, 1757, 1757, 941, 941, 941, 1757, 1757, 1757, 1757, 941, 942, 1757, 1757, 1757, 942, 942, 942, 1757, 1757, 1757, 1757, 942, 943, 1757, 1757, 1757, 943, 943, 943, 1757, 1757, 1757, 1757, 943, 944, 1757, 1757, 1757, 944, 944, 944, 1757, 1757, 1757, 1757, 944, 952, 1757, 1757, 1757, 952, 952, 952, 1757, 1757, 1757, 1757, 952, 955, 1757, 1757, 1757, 955, 955, 955, 1757, 1757, 1757, 1757, 955, 956, 1757, 1757, 1757, 956, 956, 956, 1757, 1757, 1757, 1757, 956, 957, 1757, 1757, 1757, 957, 957, 957, 1757, 1757, 1757, 1757, 957, 961, 1757, 1757, 1757, 961, 961, 961, 1757, 1757, 1757, 1757, 961, 962, 1757, 1757, 1757, 962, 962, 962, 1757, 1757, 1757, 1757, 962, 963, 1757, 1757, 1757, 963, 963, 963, 1757, 1757, 1757, 1757, 963, 966, 1757, 1757, 1757, 966, 966, 966, 1757, 1757, 1757, 1757, 966, 967, 1757, 1757, 1757, 967, 967, 967, 1757, 1757, 1757, 1757, 967, 968, 1757, 1757, 1757, 968, 968, 968, 1757, 1757, 1757, 1757, 968, 969, 1757, 1757, 1757, 969, 969, 969, 1757, 1757, 1757, 1757, 969, 970, 1757, 1757, 1757, 970, 970, 970, 1757, 1757, 1757, 1757, 970, 974, 1757, 1757, 1757, 974, 974, 974, 1757, 1757, 1757, 1757, 974, 975, 1757, 1757, 1757, 975, 975, 975, 1757, 1757, 1757, 1757, 975, 976, 1757, 1757, 1757, 976, 976, 976, 1757, 1757, 1757, 1757, 976, 977, 1757, 1757, 1757, 977, 977, 977, 1757, 1757, 1757, 1757, 977, 978, 1757, 1757, 1757, 978, 978, 978, 1757, 1757, 1757, 1757, 978, 979, 1757, 1757, 1757, 979, 979, 979, 1757, 1757, 1757, 1757, 979, 981, 1757, 1757, 1757, 981, 981, 981, 1757, 1757, 1757, 1757, 981, 982, 1757, 1757, 1757, 982, 982, 982, 1757, 1757, 1757, 1757, 982, 983, 1757, 1757, 1757, 983, 983, 983, 1757, 1757, 1757, 1757, 983, 984, 1757, 1757, 1757, 984, 984, 984, 1757, 1757, 1757, 1757, 984, 985, 1757, 1757, 1757, 985, 985, 985, 1757, 1757, 1757, 1757, 985, 986, 1757, 1757, 1757, 986, 986, 986, 1757, 1757, 1757, 1757, 986, 987, 1757, 1757, 1757, 987, 987, 987, 1757, 1757, 1757, 1757, 987, 991, 1757, 1757, 1757, 991, 991, 991, 1757, 1757, 1757, 1757, 991, 992, 1757, 1757, 1757, 992, 992, 992, 1757, 1757, 1757, 1757, 992, 993, 1757, 1757, 1757, 993, 993, 993, 1757, 1757, 1757, 1757, 993, 994, 1757, 1757, 1757, 994, 994, 994, 1757, 1757, 1757, 1757, 994, 995, 1757, 1757, 1757, 995, 995, 995, 1757, 1757, 1757, 1757, 995, 996, 1757, 1757, 1757, 996, 996, 996, 1757, 1757, 1757, 1757, 996, 997, 1757, 1757, 1757, 997, 997, 997, 1757, 1757, 1757, 1757, 997, 1000, 1757, 1757, 1757, 1000, 1000, 1000, 1757, 1757, 1757, 1757, 1000, 1005, 1757, 1757, 1757, 1005, 1005, 1005, 1757, 1757, 1757, 1757, 1005, 1008, 1757, 1757, 1757, 1008, 1008, 1008, 1757, 1757, 1757, 1757, 1008, 1009, 1757, 1757, 1757, 1009, 1009, 1009, 1757, 1757, 1757, 1757, 1009, 1010, 1757, 1757, 1757, 1010, 1010, 1010, 1757, 1757, 1757, 1757, 1010, 1014, 1757, 1757, 1757, 1014, 1014, 1014, 1757, 1757, 1757, 1757, 1014, 1015, 1757, 1757, 1757, 1015, 1015, 1015, 1757, 1757, 1757, 1757, 1015, 1016, 1757, 1757, 1757, 1016, 1016, 1016, 1757, 1757, 1757, 1757, 1016, 1019, 1757, 1757, 1757, 1019, 1019, 1019, 1757, 1757, 1757, 1757, 1019, 1020, 1757, 1757, 1757, 1020, 1020, 1020, 1757, 1757, 1757, 1757, 1020, 1021, 1757, 1757, 1757, 1021, 1021, 1021, 1757, 1757, 1757, 1757, 1021, 1022, 1757, 1757, 1757, 1022, 1022, 1022, 1757, 1757, 1757, 1757, 1022, 1023, 1757, 1757, 1757, 1023, 1023, 1023, 1757, 1757, 1757, 1757, 1023, 1027, 1757, 1757, 1757, 1027, 1027, 1027, 1757, 1757, 1757, 1757, 1027, 1028, 1757, 1757, 1757, 1028, 1028, 1028, 1757, 1757, 1757, 1757, 1028, 1029, 1757, 1757, 1757, 1029, 1029, 1029, 1757, 1757, 1757, 1757, 1029, 1030, 1757, 1757, 1757, 1030, 1030, 1030, 1757, 1757, 1757, 1757, 1030, 1031, 1757, 1757, 1757, 1031, 1031, 1031, 1757, 1757, 1757, 1757, 1031, 1032, 1757, 1757, 1757, 1032, 1032, 1032, 1757, 1757, 1757, 1757, 1032, 1034, 1757, 1757, 1757, 1034, 1034, 1034, 1757, 1757, 1757, 1757, 1034, 1039, 1757, 1757, 1757, 1039, 1039, 1039, 1757, 1757, 1757, 1757, 1039, 1042, 1757, 1757, 1757, 1042, 1042, 1042, 1757, 1757, 1757, 1757, 1042, 1043, 1757, 1757, 1757, 1043, 1043, 1043, 1757, 1757, 1757, 1757, 1043, 1044, 1757, 1757, 1757, 1044, 1044, 1044, 1757, 1757, 1757, 1757, 1044, 1048, 1757, 1757, 1757, 1048, 1048, 1048, 1757, 1757, 1757, 1757, 1048, 1049, 1757, 1757, 1757, 1049, 1049, 1049, 1757, 1757, 1757, 1757, 1049, 1050, 1757, 1757, 1757, 1050, 1050, 1050, 1757, 1757, 1757, 1757, 1050, 1053, 1757, 1757, 1757, 1053, 1053, 1053, 1757, 1757, 1757, 1757, 1053, 1054, 1757, 1757, 1757, 1054, 1054, 1054, 1757, 1757, 1757, 1757, 1054, 1055, 1757, 1757, 1757, 1055, 1055, 1055, 1757, 1757, 1757, 1757, 1055, 1056, 1757, 1757, 1757, 1056, 1056, 1056, 1757, 1757, 1757, 1757, 1056, 1057, 1757, 1757, 1757, 1057, 1057, 1057, 1757, 1757, 1757, 1757, 1057, 1061, 1757, 1757, 1757, 1061, 1061, 1061, 1757, 1757, 1757, 1757, 1061, 1062, 1757, 1757, 1757, 1062, 1062, 1062, 1757, 1757, 1757, 1757, 1062, 1063, 1757, 1757, 1757, 1063, 1063, 1063, 1757, 1757, 1757, 1757, 1063, 1064, 1757, 1757, 1757, 1064, 1064, 1064, 1757, 1757, 1757, 1757, 1064, 1065, 1757, 1757, 1757, 1065, 1065, 1065, 1757, 1757, 1757, 1757, 1065, 1066, 1757, 1757, 1757, 1066, 1066, 1066, 1757, 1757, 1757, 1757, 1066, 1068, 1757, 1757, 1757, 1068, 1068, 1068, 1757, 1757, 1757, 1757, 1068, 1069, 1757, 1757, 1757, 1069, 1069, 1069, 1757, 1757, 1757, 1757, 1069, 1070, 1757, 1757, 1757, 1070, 1070, 1070, 1757, 1757, 1757, 1757, 1070, 1071, 1757, 1757, 1757, 1071, 1071, 1071, 1757, 1757, 1757, 1757, 1071, 1072, 1757, 1757, 1757, 1072, 1072, 1072, 1757, 1757, 1757, 1757, 1072, 1073, 1757, 1757, 1757, 1073, 1073, 1073, 1757, 1757, 1757, 1757, 1073, 1074, 1757, 1757, 1757, 1074, 1074, 1074, 1757, 1757, 1757, 1757, 1074, 847, 847, 847, 847, 847, 847, 847, 847, 847, 1757, 847, 847, 847, 847, 847, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1757, 1078, 1078, 1078, 1757, 1078, 849, 849, 849, 849, 849, 849, 849, 849, 849, 1757, 849, 849, 849, 1757, 849, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 1757, 851, 853, 853, 853, 853, 853, 853, 853, 853, 853, 1757, 853, 853, 853, 853, 853, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1757, 1080, 1080, 1080, 1080, 1080, 855, 855, 855, 855, 855, 855, 855, 855, 855, 1757, 855, 855, 855, 1757, 855, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1757, 1082, 1082, 1082, 1757, 1082, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1757, 1084, 860, 860, 860, 860, 860, 860, 860, 860, 860, 1757, 860, 860, 860, 1757, 860, 862, 862, 862, 862, 862, 862, 862, 862, 862, 1757, 862, 862, 862, 862, 862, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1757, 1086, 1086, 1086, 1086, 1086, 864, 864, 864, 864, 864, 864, 864, 864, 864, 1757, 864, 864, 864, 1757, 864, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1757, 1088, 1088, 1088, 1088, 1088, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 869, 869, 869, 869, 869, 869, 869, 869, 869, 1757, 869, 869, 869, 1757, 869, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1757, 1093, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 1757, 872, 874, 874, 874, 874, 874, 874, 874, 874, 874, 1757, 874, 874, 874, 874, 874, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1757, 1095, 1095, 1095, 1095, 1095, 876, 876, 876, 876, 876, 876, 876, 876, 876, 1757, 876, 876, 876, 1757, 876, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1757, 1097, 1097, 1097, 1757, 1097, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1757, 1099, 881, 881, 881, 881, 881, 881, 881, 881, 881, 1757, 881, 881, 881, 1757, 881, 1101, 1101, 1101, 1102, 1102, 1102, 1123, 1757, 1757, 1757, 1123, 1123, 1123, 1757, 1757, 1757, 1757, 1123, 1126, 1757, 1757, 1757, 1126, 1126, 1126, 1757, 1757, 1757, 1757, 1126, 1127, 1757, 1757, 1757, 1127, 1127, 1127, 1757, 1757, 1757, 1757, 1127, 1128, 1757, 1757, 1757, 1128, 1128, 1128, 1757, 1757, 1757, 1757, 1128, 1132, 1757, 1757, 1757, 1132, 1132, 1132, 1757, 1757, 1757, 1757, 1132, 1133, 1757, 1757, 1757, 1133, 1133, 1133, 1757, 1757, 1757, 1757, 1133, 1134, 1757, 1757, 1757, 1134, 1134, 1134, 1757, 1757, 1757, 1757, 1134, 1137, 1757, 1757, 1757, 1137, 1137, 1137, 1757, 1757, 1757, 1757, 1137, 1138, 1757, 1757, 1757, 1138, 1138, 1138, 1757, 1757, 1757, 1757, 1138, 1139, 1757, 1757, 1757, 1139, 1139, 1139, 1757, 1757, 1757, 1757, 1139, 1140, 1757, 1757, 1757, 1140, 1140, 1140, 1757, 1757, 1757, 1757, 1140, 1141, 1757, 1757, 1757, 1141, 1141, 1141, 1757, 1757, 1757, 1757, 1141, 1145, 1757, 1757, 1757, 1145, 1145, 1145, 1757, 1757, 1757, 1757, 1145, 1146, 1757, 1757, 1757, 1146, 1146, 1146, 1757, 1757, 1757, 1757, 1146, 1147, 1757, 1757, 1757, 1147, 1147, 1147, 1757, 1757, 1757, 1757, 1147, 1148, 1757, 1757, 1757, 1148, 1148, 1148, 1757, 1757, 1757, 1757, 1148, 1149, 1757, 1757, 1757, 1149, 1149, 1149, 1757, 1757, 1757, 1757, 1149, 1150, 1757, 1757, 1757, 1150, 1150, 1150, 1757, 1757, 1757, 1757, 1150, 1152, 1757, 1757, 1757, 1152, 1152, 1152, 1757, 1757, 1757, 1757, 1152, 1153, 1757, 1757, 1757, 1153, 1153, 1153, 1757, 1757, 1757, 1757, 1153, 1154, 1757, 1757, 1757, 1154, 1154, 1154, 1757, 1757, 1757, 1757, 1154, 1155, 1757, 1757, 1757, 1155, 1155, 1155, 1757, 1757, 1757, 1757, 1155, 1156, 1757, 1757, 1757, 1156, 1156, 1156, 1757, 1757, 1757, 1757, 1156, 1157, 1757, 1757, 1757, 1157, 1157, 1157, 1757, 1757, 1757, 1757, 1157, 1158, 1757, 1757, 1757, 1158, 1158, 1158, 1757, 1757, 1757, 1757, 1158, 1162, 1757, 1757, 1757, 1162, 1162, 1162, 1757, 1757, 1757, 1757, 1162, 1163, 1757, 1757, 1757, 1163, 1163, 1163, 1757, 1757, 1757, 1757, 1163, 1164, 1757, 1757, 1757, 1164, 1164, 1164, 1757, 1757, 1757, 1757, 1164, 1165, 1757, 1757, 1757, 1165, 1165, 1165, 1757, 1757, 1757, 1757, 1165, 1166, 1757, 1757, 1757, 1166, 1166, 1166, 1757, 1757, 1757, 1757, 1166, 1167, 1757, 1757, 1757, 1167, 1167, 1167, 1757, 1757, 1757, 1757, 1167, 1168, 1757, 1757, 1757, 1168, 1168, 1168, 1757, 1757, 1757, 1757, 1168, 1171, 1757, 1757, 1757, 1171, 1171, 1171, 1757, 1757, 1757, 1757, 1171, 1176, 1757, 1757, 1757, 1176, 1176, 1176, 1757, 1757, 1757, 1757, 1176, 1179, 1757, 1757, 1757, 1179, 1179, 1179, 1757, 1757, 1757, 1757, 1179, 1180, 1757, 1757, 1757, 1180, 1180, 1180, 1757, 1757, 1757, 1757, 1180, 1181, 1757, 1757, 1757, 1181, 1181, 1181, 1757, 1757, 1757, 1757, 1181, 1185, 1757, 1757, 1757, 1185, 1185, 1185, 1757, 1757, 1757, 1757, 1185, 1186, 1757, 1757, 1757, 1186, 1186, 1186, 1757, 1757, 1757, 1757, 1186, 1187, 1757, 1757, 1757, 1187, 1187, 1187, 1757, 1757, 1757, 1757, 1187, 1190, 1757, 1757, 1757, 1190, 1190, 1190, 1757, 1757, 1757, 1757, 1190, 1191, 1757, 1757, 1757, 1191, 1191, 1191, 1757, 1757, 1757, 1757, 1191, 1192, 1757, 1757, 1757, 1192, 1192, 1192, 1757, 1757, 1757, 1757, 1192, 1193, 1757, 1757, 1757, 1193, 1193, 1193, 1757, 1757, 1757, 1757, 1193, 1194, 1757, 1757, 1757, 1194, 1194, 1194, 1757, 1757, 1757, 1757, 1194, 1198, 1757, 1757, 1757, 1198, 1198, 1198, 1757, 1757, 1757, 1757, 1198, 1199, 1757, 1757, 1757, 1199, 1199, 1199, 1757, 1757, 1757, 1757, 1199, 1200, 1757, 1757, 1757, 1200, 1200, 1200, 1757, 1757, 1757, 1757, 1200, 1201, 1757, 1757, 1757, 1201, 1201, 1201, 1757, 1757, 1757, 1757, 1201, 1202, 1757, 1757, 1757, 1202, 1202, 1202, 1757, 1757, 1757, 1757, 1202, 1203, 1757, 1757, 1757, 1203, 1203, 1203, 1757, 1757, 1757, 1757, 1203, 1205, 1757, 1757, 1757, 1205, 1205, 1205, 1757, 1757, 1757, 1757, 1205, 1206, 1757, 1757, 1757, 1206, 1206, 1206, 1757, 1757, 1757, 1757, 1206, 1207, 1757, 1757, 1757, 1207, 1207, 1207, 1757, 1757, 1757, 1757, 1207, 1208, 1757, 1757, 1757, 1208, 1208, 1208, 1757, 1757, 1757, 1757, 1208, 1209, 1757, 1757, 1757, 1209, 1209, 1209, 1757, 1757, 1757, 1757, 1209, 1210, 1757, 1757, 1757, 1210, 1210, 1210, 1757, 1757, 1757, 1757, 1210, 1211, 1757, 1757, 1757, 1211, 1211, 1211, 1757, 1757, 1757, 1757, 1211, 1215, 1757, 1757, 1757, 1215, 1215, 1215, 1757, 1757, 1757, 1757, 1215, 1216, 1757, 1757, 1757, 1216, 1216, 1216, 1757, 1757, 1757, 1757, 1216, 1217, 1757, 1757, 1757, 1217, 1217, 1217, 1757, 1757, 1757, 1757, 1217, 1218, 1757, 1757, 1757, 1218, 1218, 1218, 1757, 1757, 1757, 1757, 1218, 1219, 1757, 1757, 1757, 1219, 1219, 1219, 1757, 1757, 1757, 1757, 1219, 1220, 1757, 1757, 1757, 1220, 1220, 1220, 1757, 1757, 1757, 1757, 1220, 1221, 1757, 1757, 1757, 1221, 1221, 1221, 1757, 1757, 1757, 1757, 1221, 1224, 1757, 1757, 1757, 1224, 1224, 1224, 1757, 1757, 1757, 1757, 1224, 1225, 1757, 1757, 1757, 1225, 1225, 1225, 1757, 1757, 1757, 1757, 1225, 1226, 1757, 1757, 1757, 1226, 1226, 1226, 1757, 1757, 1757, 1757, 1226, 1227, 1757, 1757, 1757, 1227, 1227, 1227, 1757, 1757, 1757, 1757, 1227, 1228, 1757, 1757, 1757, 1228, 1228, 1228, 1757, 1757, 1757, 1757, 1228, 1229, 1757, 1757, 1757, 1229, 1229, 1229, 1757, 1757, 1757, 1757, 1229, 1230, 1757, 1757, 1757, 1230, 1230, 1230, 1757, 1757, 1757, 1757, 1230, 1231, 1757, 1757, 1757, 1231, 1231, 1231, 1757, 1757, 1757, 1757, 1231, 1232, 1757, 1757, 1757, 1232, 1232, 1232, 1757, 1757, 1757, 1757, 1232, 1240, 1757, 1757, 1757, 1240, 1240, 1240, 1757, 1757, 1757, 1757, 1240, 1243, 1757, 1757, 1757, 1243, 1243, 1243, 1757, 1757, 1757, 1757, 1243, 1244, 1757, 1757, 1757, 1244, 1244, 1244, 1757, 1757, 1757, 1757, 1244, 1245, 1757, 1757, 1757, 1245, 1245, 1245, 1757, 1757, 1757, 1757, 1245, 1249, 1757, 1757, 1757, 1249, 1249, 1249, 1757, 1757, 1757, 1757, 1249, 1250, 1757, 1757, 1757, 1250, 1250, 1250, 1757, 1757, 1757, 1757, 1250, 1251, 1757, 1757, 1757, 1251, 1251, 1251, 1757, 1757, 1757, 1757, 1251, 1254, 1757, 1757, 1757, 1254, 1254, 1254, 1757, 1757, 1757, 1757, 1254, 1255, 1757, 1757, 1757, 1255, 1255, 1255, 1757, 1757, 1757, 1757, 1255, 1256, 1757, 1757, 1757, 1256, 1256, 1256, 1757, 1757, 1757, 1757, 1256, 1257, 1757, 1757, 1757, 1257, 1257, 1257, 1757, 1757, 1757, 1757, 1257, 1258, 1757, 1757, 1757, 1258, 1258, 1258, 1757, 1757, 1757, 1757, 1258, 1262, 1757, 1757, 1757, 1262, 1262, 1262, 1757, 1757, 1757, 1757, 1262, 1263, 1757, 1757, 1757, 1263, 1263, 1263, 1757, 1757, 1757, 1757, 1263, 1264, 1757, 1757, 1757, 1264, 1264, 1264, 1757, 1757, 1757, 1757, 1264, 1265, 1757, 1757, 1757, 1265, 1265, 1265, 1757, 1757, 1757, 1757, 1265, 1266, 1757, 1757, 1757, 1266, 1266, 1266, 1757, 1757, 1757, 1757, 1266, 1267, 1757, 1757, 1757, 1267, 1267, 1267, 1757, 1757, 1757, 1757, 1267, 1269, 1757, 1757, 1757, 1269, 1269, 1269, 1757, 1757, 1757, 1757, 1269, 1270, 1757, 1757, 1757, 1270, 1270, 1270, 1757, 1757, 1757, 1757, 1270, 1271, 1757, 1757, 1757, 1271, 1271, 1271, 1757, 1757, 1757, 1757, 1271, 1272, 1757, 1757, 1757, 1272, 1272, 1272, 1757, 1757, 1757, 1757, 1272, 1273, 1757, 1757, 1757, 1273, 1273, 1273, 1757, 1757, 1757, 1757, 1273, 1274, 1757, 1757, 1757, 1274, 1274, 1274, 1757, 1757, 1757, 1757, 1274, 1275, 1757, 1757, 1757, 1275, 1275, 1275, 1757, 1757, 1757, 1757, 1275, 1283, 1757, 1757, 1757, 1283, 1283, 1283, 1757, 1757, 1757, 1757, 1283, 1286, 1757, 1757, 1757, 1286, 1286, 1286, 1757, 1757, 1757, 1757, 1286, 1287, 1757, 1757, 1757, 1287, 1287, 1287, 1757, 1757, 1757, 1757, 1287, 1288, 1757, 1757, 1757, 1288, 1288, 1288, 1757, 1757, 1757, 1757, 1288, 1292, 1757, 1757, 1757, 1292, 1292, 1292, 1757, 1757, 1757, 1757, 1292, 1293, 1757, 1757, 1757, 1293, 1293, 1293, 1757, 1757, 1757, 1757, 1293, 1294, 1757, 1757, 1757, 1294, 1294, 1294, 1757, 1757, 1757, 1757, 1294, 1297, 1757, 1757, 1757, 1297, 1297, 1297, 1757, 1757, 1757, 1757, 1297, 1298, 1757, 1757, 1757, 1298, 1298, 1298, 1757, 1757, 1757, 1757, 1298, 1299, 1757, 1757, 1757, 1299, 1299, 1299, 1757, 1757, 1757, 1757, 1299, 1300, 1757, 1757, 1757, 1300, 1300, 1300, 1757, 1757, 1757, 1757, 1300, 1301, 1757, 1757, 1757, 1301, 1301, 1301, 1757, 1757, 1757, 1757, 1301, 1305, 1757, 1757, 1757, 1305, 1305, 1305, 1757, 1757, 1757, 1757, 1305, 1306, 1757, 1757, 1757, 1306, 1306, 1306, 1757, 1757, 1757, 1757, 1306, 1307, 1757, 1757, 1757, 1307, 1307, 1307, 1757, 1757, 1757, 1757, 1307, 1308, 1757, 1757, 1757, 1308, 1308, 1308, 1757, 1757, 1757, 1757, 1308, 1309, 1757, 1757, 1757, 1309, 1309, 1309, 1757, 1757, 1757, 1757, 1309, 1310, 1757, 1757, 1757, 1310, 1310, 1310, 1757, 1757, 1757, 1757, 1310, 1312, 1757, 1757, 1757, 1312, 1312, 1312, 1757, 1757, 1757, 1757, 1312, 1313, 1757, 1757, 1757, 1313, 1313, 1313, 1757, 1757, 1757, 1757, 1313, 1314, 1757, 1757, 1757, 1314, 1314, 1314, 1757, 1757, 1757, 1757, 1314, 1315, 1757, 1757, 1757, 1315, 1315, 1315, 1757, 1757, 1757, 1757, 1315, 1316, 1757, 1757, 1757, 1316, 1316, 1316, 1757, 1757, 1757, 1757, 1316, 1317, 1757, 1757, 1757, 1317, 1317, 1317, 1757, 1757, 1757, 1757, 1317, 1318, 1757, 1757, 1757, 1318, 1318, 1318, 1757, 1757, 1757, 1757, 1318, 1322, 1757, 1757, 1757, 1322, 1322, 1322, 1757, 1757, 1757, 1757, 1322, 1323, 1757, 1757, 1757, 1323, 1323, 1323, 1757, 1757, 1757, 1757, 1323, 1324, 1757, 1757, 1757, 1324, 1324, 1324, 1757, 1757, 1757, 1757, 1324, 1325, 1757, 1757, 1757, 1325, 1325, 1325, 1757, 1757, 1757, 1757, 1325, 1326, 1757, 1757, 1757, 1326, 1326, 1326, 1757, 1757, 1757, 1757, 1326, 1327, 1757, 1757, 1757, 1327, 1327, 1327, 1757, 1757, 1757, 1757, 1327, 1328, 1757, 1757, 1757, 1328, 1328, 1328, 1757, 1757, 1757, 1757, 1328, 1331, 1757, 1757, 1757, 1331, 1331, 1331, 1757, 1757, 1757, 1757, 1331, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1757, 1078, 1078, 1078, 1757, 1078, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1757, 1080, 1080, 1080, 1080, 1080, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1757, 1332, 1332, 1332, 1757, 1332, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1757, 1082, 1082, 1082, 1757, 1082, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1757, 1084, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1757, 1086, 1086, 1086, 1086, 1086, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1757, 1334, 1334, 1334, 1334, 1334, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1757, 1088, 1088, 1088, 1757, 1088, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1757, 1336, 1336, 1336, 1757, 1336, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1757, 1338, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1757, 1093, 1093, 1093, 1757, 1093, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1757, 1095, 1095, 1095, 1095, 1095, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1757, 1340, 1340, 1340, 1757, 1340, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1757, 1097, 1097, 1097, 1757, 1097, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1757, 1099, 1342, 1757, 1757, 1757, 1342, 1342, 1342, 1757, 1757, 1757, 1757, 1342, 1344, 1344, 1344, 1345, 1345, 1345, 1347, 1347, 1347, 1757, 1757, 1757, 1757, 1347, 1353, 1353, 1353, 1354, 1354, 1354, 1363, 1757, 1757, 1757, 1363, 1363, 1363, 1757, 1757, 1757, 1757, 1363, 1366, 1757, 1757, 1757, 1366, 1366, 1366, 1757, 1757, 1757, 1757, 1366, 1367, 1757, 1757, 1757, 1367, 1367, 1367, 1757, 1757, 1757, 1757, 1367, 1368, 1757, 1757, 1757, 1368, 1368, 1368, 1757, 1757, 1757, 1757, 1368, 1372, 1757, 1757, 1757, 1372, 1372, 1372, 1757, 1757, 1757, 1757, 1372, 1373, 1757, 1757, 1757, 1373, 1373, 1373, 1757, 1757, 1757, 1757, 1373, 1374, 1757, 1757, 1757, 1374, 1374, 1374, 1757, 1757, 1757, 1757, 1374, 1377, 1757, 1757, 1757, 1377, 1377, 1377, 1757, 1757, 1757, 1757, 1377, 1378, 1757, 1757, 1757, 1378, 1378, 1378, 1757, 1757, 1757, 1757, 1378, 1379, 1757, 1757, 1757, 1379, 1379, 1379, 1757, 1757, 1757, 1757, 1379, 1380, 1757, 1757, 1757, 1380, 1380, 1380, 1757, 1757, 1757, 1757, 1380, 1381, 1757, 1757, 1757, 1381, 1381, 1381, 1757, 1757, 1757, 1757, 1381, 1385, 1757, 1757, 1757, 1385, 1385, 1385, 1757, 1757, 1757, 1757, 1385, 1386, 1757, 1757, 1757, 1386, 1386, 1386, 1757, 1757, 1757, 1757, 1386, 1387, 1757, 1757, 1757, 1387, 1387, 1387, 1757, 1757, 1757, 1757, 1387, 1388, 1757, 1757, 1757, 1388, 1388, 1388, 1757, 1757, 1757, 1757, 1388, 1389, 1757, 1757, 1757, 1389, 1389, 1389, 1757, 1757, 1757, 1757, 1389, 1390, 1757, 1757, 1757, 1390, 1390, 1390, 1757, 1757, 1757, 1757, 1390, 1392, 1757, 1757, 1757, 1392, 1392, 1392, 1757, 1757, 1757, 1757, 1392, 1393, 1757, 1757, 1757, 1393, 1393, 1393, 1757, 1757, 1757, 1757, 1393, 1394, 1757, 1757, 1757, 1394, 1394, 1394, 1757, 1757, 1757, 1757, 1394, 1395, 1757, 1757, 1757, 1395, 1395, 1395, 1757, 1757, 1757, 1757, 1395, 1396, 1757, 1757, 1757, 1396, 1396, 1396, 1757, 1757, 1757, 1757, 1396, 1397, 1757, 1757, 1757, 1397, 1397, 1397, 1757, 1757, 1757, 1757, 1397, 1398, 1757, 1757, 1757, 1398, 1398, 1398, 1757, 1757, 1757, 1757, 1398, 1402, 1757, 1757, 1757, 1402, 1402, 1402, 1757, 1757, 1757, 1757, 1402, 1403, 1757, 1757, 1757, 1403, 1403, 1403, 1757, 1757, 1757, 1757, 1403, 1404, 1757, 1757, 1757, 1404, 1404, 1404, 1757, 1757, 1757, 1757, 1404, 1405, 1757, 1757, 1757, 1405, 1405, 1405, 1757, 1757, 1757, 1757, 1405, 1406, 1757, 1757, 1757, 1406, 1406, 1406, 1757, 1757, 1757, 1757, 1406, 1407, 1757, 1757, 1757, 1407, 1407, 1407, 1757, 1757, 1757, 1757, 1407, 1408, 1757, 1757, 1757, 1408, 1408, 1408, 1757, 1757, 1757, 1757, 1408, 1411, 1757, 1757, 1757, 1411, 1411, 1411, 1757, 1757, 1757, 1757, 1411, 1412, 1757, 1757, 1757, 1412, 1412, 1412, 1757, 1757, 1757, 1757, 1412, 1413, 1757, 1757, 1757, 1413, 1413, 1413, 1757, 1757, 1757, 1757, 1413, 1414, 1757, 1757, 1757, 1414, 1414, 1414, 1757, 1757, 1757, 1757, 1414, 1415, 1757, 1757, 1757, 1415, 1415, 1415, 1757, 1757, 1757, 1757, 1415, 1416, 1757, 1757, 1757, 1416, 1416, 1416, 1757, 1757, 1757, 1757, 1416, 1417, 1757, 1757, 1757, 1417, 1417, 1417, 1757, 1757, 1757, 1757, 1417, 1418, 1757, 1757, 1757, 1418, 1418, 1418, 1757, 1757, 1757, 1757, 1418, 1419, 1757, 1757, 1757, 1419, 1419, 1419, 1757, 1757, 1757, 1757, 1419, 1176, 1757, 1757, 1757, 1176, 1176, 1176, 1757, 1757, 1757, 1757, 1176, 1179, 1757, 1757, 1757, 1179, 1179, 1179, 1757, 1757, 1757, 1757, 1179, 1180, 1757, 1757, 1757, 1180, 1180, 1180, 1757, 1757, 1757, 1757, 1180, 1181, 1757, 1757, 1757, 1181, 1181, 1181, 1757, 1757, 1757, 1757, 1181, 1185, 1757, 1757, 1757, 1185, 1185, 1185, 1757, 1757, 1757, 1757, 1185, 1186, 1757, 1757, 1757, 1186, 1186, 1186, 1757, 1757, 1757, 1757, 1186, 1187, 1757, 1757, 1757, 1187, 1187, 1187, 1757, 1757, 1757, 1757, 1187, 1190, 1757, 1757, 1757, 1190, 1190, 1190, 1757, 1757, 1757, 1757, 1190, 1191, 1757, 1757, 1757, 1191, 1191, 1191, 1757, 1757, 1757, 1757, 1191, 1192, 1757, 1757, 1757, 1192, 1192, 1192, 1757, 1757, 1757, 1757, 1192, 1193, 1757, 1757, 1757, 1193, 1193, 1193, 1757, 1757, 1757, 1757, 1193, 1194, 1757, 1757, 1757, 1194, 1194, 1194, 1757, 1757, 1757, 1757, 1194, 1198, 1757, 1757, 1757, 1198, 1198, 1198, 1757, 1757, 1757, 1757, 1198, 1199, 1757, 1757, 1757, 1199, 1199, 1199, 1757, 1757, 1757, 1757, 1199, 1200, 1757, 1757, 1757, 1200, 1200, 1200, 1757, 1757, 1757, 1757, 1200, 1201, 1757, 1757, 1757, 1201, 1201, 1201, 1757, 1757, 1757, 1757, 1201, 1202, 1757, 1757, 1757, 1202, 1202, 1202, 1757, 1757, 1757, 1757, 1202, 1203, 1757, 1757, 1757, 1203, 1203, 1203, 1757, 1757, 1757, 1757, 1203, 1205, 1757, 1757, 1757, 1205, 1205, 1205, 1757, 1757, 1757, 1757, 1205, 1206, 1757, 1757, 1757, 1206, 1206, 1206, 1757, 1757, 1757, 1757, 1206, 1207, 1757, 1757, 1757, 1207, 1207, 1207, 1757, 1757, 1757, 1757, 1207, 1208, 1757, 1757, 1757, 1208, 1208, 1208, 1757, 1757, 1757, 1757, 1208, 1209, 1757, 1757, 1757, 1209, 1209, 1209, 1757, 1757, 1757, 1757, 1209, 1210, 1757, 1757, 1757, 1210, 1210, 1210, 1757, 1757, 1757, 1757, 1210, 1211, 1757, 1757, 1757, 1211, 1211, 1211, 1757, 1757, 1757, 1757, 1211, 1215, 1757, 1757, 1757, 1215, 1215, 1215, 1757, 1757, 1757, 1757, 1215, 1216, 1757, 1757, 1757, 1216, 1216, 1216, 1757, 1757, 1757, 1757, 1216, 1217, 1757, 1757, 1757, 1217, 1217, 1217, 1757, 1757, 1757, 1757, 1217, 1218, 1757, 1757, 1757, 1218, 1218, 1218, 1757, 1757, 1757, 1757, 1218, 1219, 1757, 1757, 1757, 1219, 1219, 1219, 1757, 1757, 1757, 1757, 1219, 1220, 1757, 1757, 1757, 1220, 1220, 1220, 1757, 1757, 1757, 1757, 1220, 1221, 1757, 1757, 1757, 1221, 1221, 1221, 1757, 1757, 1757, 1757, 1221, 1224, 1757, 1757, 1757, 1224, 1224, 1224, 1757, 1757, 1757, 1757, 1224, 1225, 1757, 1757, 1757, 1225, 1225, 1225, 1757, 1757, 1757, 1757, 1225, 1226, 1757, 1757, 1757, 1226, 1226, 1226, 1757, 1757, 1757, 1757, 1226, 1227, 1757, 1757, 1757, 1227, 1227, 1227, 1757, 1757, 1757, 1757, 1227, 1228, 1757, 1757, 1757, 1228, 1228, 1228, 1757, 1757, 1757, 1757, 1228, 1229, 1757, 1757, 1757, 1229, 1229, 1229, 1757, 1757, 1757, 1757, 1229, 1230, 1757, 1757, 1757, 1230, 1230, 1230, 1757, 1757, 1757, 1757, 1230, 1231, 1757, 1757, 1757, 1231, 1231, 1231, 1757, 1757, 1757, 1757, 1231, 1232, 1757, 1757, 1757, 1232, 1232, 1232, 1757, 1757, 1757, 1757, 1232, 1427, 1757, 1757, 1757, 1427, 1427, 1427, 1757, 1757, 1757, 1757, 1427, 1430, 1757, 1757, 1757, 1430, 1430, 1430, 1757, 1757, 1757, 1757, 1430, 1431, 1757, 1757, 1757, 1431, 1431, 1431, 1757, 1757, 1757, 1757, 1431, 1432, 1757, 1757, 1757, 1432, 1432, 1432, 1757, 1757, 1757, 1757, 1432, 1436, 1757, 1757, 1757, 1436, 1436, 1436, 1757, 1757, 1757, 1757, 1436, 1437, 1757, 1757, 1757, 1437, 1437, 1437, 1757, 1757, 1757, 1757, 1437, 1438, 1757, 1757, 1757, 1438, 1438, 1438, 1757, 1757, 1757, 1757, 1438, 1441, 1757, 1757, 1757, 1441, 1441, 1441, 1757, 1757, 1757, 1757, 1441, 1442, 1757, 1757, 1757, 1442, 1442, 1442, 1757, 1757, 1757, 1757, 1442, 1443, 1757, 1757, 1757, 1443, 1443, 1443, 1757, 1757, 1757, 1757, 1443, 1444, 1757, 1757, 1757, 1444, 1444, 1444, 1757, 1757, 1757, 1757, 1444, 1445, 1757, 1757, 1757, 1445, 1445, 1445, 1757, 1757, 1757, 1757, 1445, 1449, 1757, 1757, 1757, 1449, 1449, 1449, 1757, 1757, 1757, 1757, 1449, 1450, 1757, 1757, 1757, 1450, 1450, 1450, 1757, 1757, 1757, 1757, 1450, 1451, 1757, 1757, 1757, 1451, 1451, 1451, 1757, 1757, 1757, 1757, 1451, 1452, 1757, 1757, 1757, 1452, 1452, 1452, 1757, 1757, 1757, 1757, 1452, 1453, 1757, 1757, 1757, 1453, 1453, 1453, 1757, 1757, 1757, 1757, 1453, 1454, 1757, 1757, 1757, 1454, 1454, 1454, 1757, 1757, 1757, 1757, 1454, 1456, 1757, 1757, 1757, 1456, 1456, 1456, 1757, 1757, 1757, 1757, 1456, 1457, 1757, 1757, 1757, 1457, 1457, 1457, 1757, 1757, 1757, 1757, 1457, 1458, 1757, 1757, 1757, 1458, 1458, 1458, 1757, 1757, 1757, 1757, 1458, 1459, 1757, 1757, 1757, 1459, 1459, 1459, 1757, 1757, 1757, 1757, 1459, 1460, 1757, 1757, 1757, 1460, 1460, 1460, 1757, 1757, 1757, 1757, 1460, 1461, 1757, 1757, 1757, 1461, 1461, 1461, 1757, 1757, 1757, 1757, 1461, 1462, 1757, 1757, 1757, 1462, 1462, 1462, 1757, 1757, 1757, 1757, 1462, 1466, 1757, 1757, 1757, 1466, 1466, 1466, 1757, 1757, 1757, 1757, 1466, 1467, 1757, 1757, 1757, 1467, 1467, 1467, 1757, 1757, 1757, 1757, 1467, 1468, 1757, 1757, 1757, 1468, 1468, 1468, 1757, 1757, 1757, 1757, 1468, 1469, 1757, 1757, 1757, 1469, 1469, 1469, 1757, 1757, 1757, 1757, 1469, 1470, 1757, 1757, 1757, 1470, 1470, 1470, 1757, 1757, 1757, 1757, 1470, 1471, 1757, 1757, 1757, 1471, 1471, 1471, 1757, 1757, 1757, 1757, 1471, 1472, 1757, 1757, 1757, 1472, 1472, 1472, 1757, 1757, 1757, 1757, 1472, 1475, 1757, 1757, 1757, 1475, 1475, 1475, 1757, 1757, 1757, 1757, 1475, 1480, 1757, 1757, 1757, 1480, 1480, 1480, 1757, 1757, 1757, 1757, 1480, 1483, 1757, 1757, 1757, 1483, 1483, 1483, 1757, 1757, 1757, 1757, 1483, 1484, 1757, 1757, 1757, 1484, 1484, 1484, 1757, 1757, 1757, 1757, 1484, 1485, 1757, 1757, 1757, 1485, 1485, 1485, 1757, 1757, 1757, 1757, 1485, 1489, 1757, 1757, 1757, 1489, 1489, 1489, 1757, 1757, 1757, 1757, 1489, 1490, 1757, 1757, 1757, 1490, 1490, 1490, 1757, 1757, 1757, 1757, 1490, 1491, 1757, 1757, 1757, 1491, 1491, 1491, 1757, 1757, 1757, 1757, 1491, 1494, 1757, 1757, 1757, 1494, 1494, 1494, 1757, 1757, 1757, 1757, 1494, 1495, 1757, 1757, 1757, 1495, 1495, 1495, 1757, 1757, 1757, 1757, 1495, 1496, 1757, 1757, 1757, 1496, 1496, 1496, 1757, 1757, 1757, 1757, 1496, 1497, 1757, 1757, 1757, 1497, 1497, 1497, 1757, 1757, 1757, 1757, 1497, 1498, 1757, 1757, 1757, 1498, 1498, 1498, 1757, 1757, 1757, 1757, 1498, 1502, 1757, 1757, 1757, 1502, 1502, 1502, 1757, 1757, 1757, 1757, 1502, 1503, 1757, 1757, 1757, 1503, 1503, 1503, 1757, 1757, 1757, 1757, 1503, 1504, 1757, 1757, 1757, 1504, 1504, 1504, 1757, 1757, 1757, 1757, 1504, 1505, 1757, 1757, 1757, 1505, 1505, 1505, 1757, 1757, 1757, 1757, 1505, 1506, 1757, 1757, 1757, 1506, 1506, 1506, 1757, 1757, 1757, 1757, 1506, 1507, 1757, 1757, 1757, 1507, 1507, 1507, 1757, 1757, 1757, 1757, 1507, 1509, 1757, 1757, 1757, 1509, 1509, 1509, 1757, 1757, 1757, 1757, 1509, 1510, 1757, 1757, 1757, 1510, 1510, 1510, 1757, 1757, 1757, 1757, 1510, 1511, 1757, 1757, 1757, 1511, 1511, 1511, 1757, 1757, 1757, 1757, 1511, 1512, 1757, 1757, 1757, 1512, 1512, 1512, 1757, 1757, 1757, 1757, 1512, 1513, 1757, 1757, 1757, 1513, 1513, 1513, 1757, 1757, 1757, 1757, 1513, 1514, 1757, 1757, 1757, 1514, 1514, 1514, 1757, 1757, 1757, 1757, 1514, 1515, 1757, 1757, 1757, 1515, 1515, 1515, 1757, 1757, 1757, 1757, 1515, 1519, 1757, 1757, 1757, 1519, 1519, 1519, 1757, 1757, 1757, 1757, 1519, 1520, 1757, 1757, 1757, 1520, 1520, 1520, 1757, 1757, 1757, 1757, 1520, 1521, 1757, 1757, 1757, 1521, 1521, 1521, 1757, 1757, 1757, 1757, 1521, 1522, 1757, 1757, 1757, 1522, 1522, 1522, 1757, 1757, 1757, 1757, 1522, 1523, 1757, 1757, 1757, 1523, 1523, 1523, 1757, 1757, 1757, 1757, 1523, 1524, 1757, 1757, 1757, 1524, 1524, 1524, 1757, 1757, 1757, 1757, 1524, 1525, 1757, 1757, 1757, 1525, 1525, 1525, 1757, 1757, 1757, 1757, 1525, 1528, 1757, 1757, 1757, 1528, 1528, 1528, 1757, 1757, 1757, 1757, 1528, 1529, 1757, 1757, 1757, 1529, 1529, 1529, 1757, 1757, 1757, 1757, 1529, 1530, 1757, 1757, 1757, 1530, 1530, 1530, 1757, 1757, 1757, 1757, 1530, 1531, 1757, 1757, 1757, 1531, 1531, 1531, 1757, 1757, 1757, 1757, 1531, 1532, 1757, 1757, 1757, 1532, 1532, 1532, 1757, 1757, 1757, 1757, 1532, 1533, 1757, 1757, 1757, 1533, 1533, 1533, 1757, 1757, 1757, 1757, 1533, 1534, 1757, 1757, 1757, 1534, 1534, 1534, 1757, 1757, 1757, 1757, 1534, 1535, 1757, 1757, 1757, 1535, 1535, 1535, 1757, 1757, 1757, 1757, 1535, 1536, 1757, 1757, 1757, 1536, 1536, 1536, 1757, 1757, 1757, 1757, 1536, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1757, 1332, 1332, 1332, 1757, 1332, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1757, 1334, 1334, 1334, 1334, 1334, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1757, 1540, 1540, 1540, 1757, 1540, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1757, 1336, 1336, 1336, 1757, 1336, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1757, 1338, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1757, 1340, 1340, 1340, 1757, 1340, 1542, 1757, 1757, 1757, 1542, 1542, 1542, 1757, 1757, 1757, 1757, 1542, 1543, 1543, 1543, 1544, 1757, 1757, 1757, 1544, 1544, 1544, 1757, 1757, 1757, 1757, 1544, 1547, 1547, 1547, 1555, 1757, 1555, 1757, 1555, 1555, 1757, 1757, 1757, 1757, 1757, 1555, 1560, 1757, 1560, 1757, 1560, 1560, 1757, 1757, 1757, 1757, 1757, 1560, 1561, 1561, 1561, 1562, 1562, 1562, 1363, 1757, 1757, 1757, 1363, 1363, 1363, 1757, 1757, 1757, 1757, 1363, 1366, 1757, 1757, 1757, 1366, 1366, 1366, 1757, 1757, 1757, 1757, 1366, 1367, 1757, 1757, 1757, 1367, 1367, 1367, 1757, 1757, 1757, 1757, 1367, 1368, 1757, 1757, 1757, 1368, 1368, 1368, 1757, 1757, 1757, 1757, 1368, 1372, 1757, 1757, 1757, 1372, 1372, 1372, 1757, 1757, 1757, 1757, 1372, 1373, 1757, 1757, 1757, 1373, 1373, 1373, 1757, 1757, 1757, 1757, 1373, 1374, 1757, 1757, 1757, 1374, 1374, 1374, 1757, 1757, 1757, 1757, 1374, 1377, 1757, 1757, 1757, 1377, 1377, 1377, 1757, 1757, 1757, 1757, 1377, 1378, 1757, 1757, 1757, 1378, 1378, 1378, 1757, 1757, 1757, 1757, 1378, 1379, 1757, 1757, 1757, 1379, 1379, 1379, 1757, 1757, 1757, 1757, 1379, 1380, 1757, 1757, 1757, 1380, 1380, 1380, 1757, 1757, 1757, 1757, 1380, 1381, 1757, 1757, 1757, 1381, 1381, 1381, 1757, 1757, 1757, 1757, 1381, 1385, 1757, 1757, 1757, 1385, 1385, 1385, 1757, 1757, 1757, 1757, 1385, 1386, 1757, 1757, 1757, 1386, 1386, 1386, 1757, 1757, 1757, 1757, 1386, 1387, 1757, 1757, 1757, 1387, 1387, 1387, 1757, 1757, 1757, 1757, 1387, 1388, 1757, 1757, 1757, 1388, 1388, 1388, 1757, 1757, 1757, 1757, 1388, 1389, 1757, 1757, 1757, 1389, 1389, 1389, 1757, 1757, 1757, 1757, 1389, 1390, 1757, 1757, 1757, 1390, 1390, 1390, 1757, 1757, 1757, 1757, 1390, 1392, 1757, 1757, 1757, 1392, 1392, 1392, 1757, 1757, 1757, 1757, 1392, 1393, 1757, 1757, 1757, 1393, 1393, 1393, 1757, 1757, 1757, 1757, 1393, 1394, 1757, 1757, 1757, 1394, 1394, 1394, 1757, 1757, 1757, 1757, 1394, 1395, 1757, 1757, 1757, 1395, 1395, 1395, 1757, 1757, 1757, 1757, 1395, 1396, 1757, 1757, 1757, 1396, 1396, 1396, 1757, 1757, 1757, 1757, 1396, 1397, 1757, 1757, 1757, 1397, 1397, 1397, 1757, 1757, 1757, 1757, 1397, 1398, 1757, 1757, 1757, 1398, 1398, 1398, 1757, 1757, 1757, 1757, 1398, 1402, 1757, 1757, 1757, 1402, 1402, 1402, 1757, 1757, 1757, 1757, 1402, 1403, 1757, 1757, 1757, 1403, 1403, 1403, 1757, 1757, 1757, 1757, 1403, 1404, 1757, 1757, 1757, 1404, 1404, 1404, 1757, 1757, 1757, 1757, 1404, 1405, 1757, 1757, 1757, 1405, 1405, 1405, 1757, 1757, 1757, 1757, 1405, 1406, 1757, 1757, 1757, 1406, 1406, 1406, 1757, 1757, 1757, 1757, 1406, 1407, 1757, 1757, 1757, 1407, 1407, 1407, 1757, 1757, 1757, 1757, 1407, 1408, 1757, 1757, 1757, 1408, 1408, 1408, 1757, 1757, 1757, 1757, 1408, 1411, 1757, 1757, 1757, 1411, 1411, 1411, 1757, 1757, 1757, 1757, 1411, 1412, 1757, 1757, 1757, 1412, 1412, 1412, 1757, 1757, 1757, 1757, 1412, 1413, 1757, 1757, 1757, 1413, 1413, 1413, 1757, 1757, 1757, 1757, 1413, 1414, 1757, 1757, 1757, 1414, 1414, 1414, 1757, 1757, 1757, 1757, 1414, 1415, 1757, 1757, 1757, 1415, 1415, 1415, 1757, 1757, 1757, 1757, 1415, 1416, 1757, 1757, 1757, 1416, 1416, 1416, 1757, 1757, 1757, 1757, 1416, 1417, 1757, 1757, 1757, 1417, 1417, 1417, 1757, 1757, 1757, 1757, 1417, 1418, 1757, 1757, 1757, 1418, 1418, 1418, 1757, 1757, 1757, 1757, 1418, 1419, 1757, 1757, 1757, 1419, 1419, 1419, 1757, 1757, 1757, 1757, 1419, 1567, 1757, 1757, 1757, 1567, 1567, 1567, 1757, 1757, 1757, 1757, 1567, 1570, 1757, 1757, 1757, 1570, 1570, 1570, 1757, 1757, 1757, 1757, 1570, 1571, 1757, 1757, 1757, 1571, 1571, 1571, 1757, 1757, 1757, 1757, 1571, 1572, 1757, 1757, 1757, 1572, 1572, 1572, 1757, 1757, 1757, 1757, 1572, 1576, 1757, 1757, 1757, 1576, 1576, 1576, 1757, 1757, 1757, 1757, 1576, 1577, 1757, 1757, 1757, 1577, 1577, 1577, 1757, 1757, 1757, 1757, 1577, 1578, 1757, 1757, 1757, 1578, 1578, 1578, 1757, 1757, 1757, 1757, 1578, 1581, 1757, 1757, 1757, 1581, 1581, 1581, 1757, 1757, 1757, 1757, 1581, 1582, 1757, 1757, 1757, 1582, 1582, 1582, 1757, 1757, 1757, 1757, 1582, 1583, 1757, 1757, 1757, 1583, 1583, 1583, 1757, 1757, 1757, 1757, 1583, 1584, 1757, 1757, 1757, 1584, 1584, 1584, 1757, 1757, 1757, 1757, 1584, 1585, 1757, 1757, 1757, 1585, 1585, 1585, 1757, 1757, 1757, 1757, 1585, 1589, 1757, 1757, 1757, 1589, 1589, 1589, 1757, 1757, 1757, 1757, 1589, 1590, 1757, 1757, 1757, 1590, 1590, 1590, 1757, 1757, 1757, 1757, 1590, 1591, 1757, 1757, 1757, 1591, 1591, 1591, 1757, 1757, 1757, 1757, 1591, 1592, 1757, 1757, 1757, 1592, 1592, 1592, 1757, 1757, 1757, 1757, 1592, 1593, 1757, 1757, 1757, 1593, 1593, 1593, 1757, 1757, 1757, 1757, 1593, 1594, 1757, 1757, 1757, 1594, 1594, 1594, 1757, 1757, 1757, 1757, 1594, 1596, 1757, 1757, 1757, 1596, 1596, 1596, 1757, 1757, 1757, 1757, 1596, 1597, 1757, 1757, 1757, 1597, 1597, 1597, 1757, 1757, 1757, 1757, 1597, 1598, 1757, 1757, 1757, 1598, 1598, 1598, 1757, 1757, 1757, 1757, 1598, 1599, 1757, 1757, 1757, 1599, 1599, 1599, 1757, 1757, 1757, 1757, 1599, 1600, 1757, 1757, 1757, 1600, 1600, 1600, 1757, 1757, 1757, 1757, 1600, 1601, 1757, 1757, 1757, 1601, 1601, 1601, 1757, 1757, 1757, 1757, 1601, 1602, 1757, 1757, 1757, 1602, 1602, 1602, 1757, 1757, 1757, 1757, 1602, 1606, 1757, 1757, 1757, 1606, 1606, 1606, 1757, 1757, 1757, 1757, 1606, 1607, 1757, 1757, 1757, 1607, 1607, 1607, 1757, 1757, 1757, 1757, 1607, 1608, 1757, 1757, 1757, 1608, 1608, 1608, 1757, 1757, 1757, 1757, 1608, 1609, 1757, 1757, 1757, 1609, 1609, 1609, 1757, 1757, 1757, 1757, 1609, 1610, 1757, 1757, 1757, 1610, 1610, 1610, 1757, 1757, 1757, 1757, 1610, 1611, 1757, 1757, 1757, 1611, 1611, 1611, 1757, 1757, 1757, 1757, 1611, 1612, 1757, 1757, 1757, 1612, 1612, 1612, 1757, 1757, 1757, 1757, 1612, 1615, 1757, 1757, 1757, 1615, 1615, 1615, 1757, 1757, 1757, 1757, 1615, 1616, 1757, 1757, 1757, 1616, 1616, 1616, 1757, 1757, 1757, 1757, 1616, 1617, 1757, 1757, 1757, 1617, 1617, 1617, 1757, 1757, 1757, 1757, 1617, 1618, 1757, 1757, 1757, 1618, 1618, 1618, 1757, 1757, 1757, 1757, 1618, 1619, 1757, 1757, 1757, 1619, 1619, 1619, 1757, 1757, 1757, 1757, 1619, 1620, 1757, 1757, 1757, 1620, 1620, 1620, 1757, 1757, 1757, 1757, 1620, 1621, 1757, 1757, 1757, 1621, 1621, 1621, 1757, 1757, 1757, 1757, 1621, 1622, 1757, 1757, 1757, 1622, 1622, 1622, 1757, 1757, 1757, 1757, 1622, 1623, 1757, 1757, 1757, 1623, 1623, 1623, 1757, 1757, 1757, 1757, 1623, 1480, 1757, 1757, 1757, 1480, 1480, 1480, 1757, 1757, 1757, 1757, 1480, 1483, 1757, 1757, 1757, 1483, 1483, 1483, 1757, 1757, 1757, 1757, 1483, 1484, 1757, 1757, 1757, 1484, 1484, 1484, 1757, 1757, 1757, 1757, 1484, 1485, 1757, 1757, 1757, 1485, 1485, 1485, 1757, 1757, 1757, 1757, 1485, 1489, 1757, 1757, 1757, 1489, 1489, 1489, 1757, 1757, 1757, 1757, 1489, 1490, 1757, 1757, 1757, 1490, 1490, 1490, 1757, 1757, 1757, 1757, 1490, 1491, 1757, 1757, 1757, 1491, 1491, 1491, 1757, 1757, 1757, 1757, 1491, 1494, 1757, 1757, 1757, 1494, 1494, 1494, 1757, 1757, 1757, 1757, 1494, 1495, 1757, 1757, 1757, 1495, 1495, 1495, 1757, 1757, 1757, 1757, 1495, 1496, 1757, 1757, 1757, 1496, 1496, 1496, 1757, 1757, 1757, 1757, 1496, 1497, 1757, 1757, 1757, 1497, 1497, 1497, 1757, 1757, 1757, 1757, 1497, 1498, 1757, 1757, 1757, 1498, 1498, 1498, 1757, 1757, 1757, 1757, 1498, 1502, 1757, 1757, 1757, 1502, 1502, 1502, 1757, 1757, 1757, 1757, 1502, 1503, 1757, 1757, 1757, 1503, 1503, 1503, 1757, 1757, 1757, 1757, 1503, 1504, 1757, 1757, 1757, 1504, 1504, 1504, 1757, 1757, 1757, 1757, 1504, 1505, 1757, 1757, 1757, 1505, 1505, 1505, 1757, 1757, 1757, 1757, 1505, 1506, 1757, 1757, 1757, 1506, 1506, 1506, 1757, 1757, 1757, 1757, 1506, 1507, 1757, 1757, 1757, 1507, 1507, 1507, 1757, 1757, 1757, 1757, 1507, 1509, 1757, 1757, 1757, 1509, 1509, 1509, 1757, 1757, 1757, 1757, 1509, 1510, 1757, 1757, 1757, 1510, 1510, 1510, 1757, 1757, 1757, 1757, 1510, 1511, 1757, 1757, 1757, 1511, 1511, 1511, 1757, 1757, 1757, 1757, 1511, 1512, 1757, 1757, 1757, 1512, 1512, 1512, 1757, 1757, 1757, 1757, 1512, 1513, 1757, 1757, 1757, 1513, 1513, 1513, 1757, 1757, 1757, 1757, 1513, 1514, 1757, 1757, 1757, 1514, 1514, 1514, 1757, 1757, 1757, 1757, 1514, 1515, 1757, 1757, 1757, 1515, 1515, 1515, 1757, 1757, 1757, 1757, 1515, 1519, 1757, 1757, 1757, 1519, 1519, 1519, 1757, 1757, 1757, 1757, 1519, 1520, 1757, 1757, 1757, 1520, 1520, 1520, 1757, 1757, 1757, 1757, 1520, 1521, 1757, 1757, 1757, 1521, 1521, 1521, 1757, 1757, 1757, 1757, 1521, 1522, 1757, 1757, 1757, 1522, 1522, 1522, 1757, 1757, 1757, 1757, 1522, 1523, 1757, 1757, 1757, 1523, 1523, 1523, 1757, 1757, 1757, 1757, 1523, 1524, 1757, 1757, 1757, 1524, 1524, 1524, 1757, 1757, 1757, 1757, 1524, 1525, 1757, 1757, 1757, 1525, 1525, 1525, 1757, 1757, 1757, 1757, 1525, 1528, 1757, 1757, 1757, 1528, 1528, 1528, 1757, 1757, 1757, 1757, 1528, 1529, 1757, 1757, 1757, 1529, 1529, 1529, 1757, 1757, 1757, 1757, 1529, 1530, 1757, 1757, 1757, 1530, 1530, 1530, 1757, 1757, 1757, 1757, 1530, 1531, 1757, 1757, 1757, 1531, 1531, 1531, 1757, 1757, 1757, 1757, 1531, 1532, 1757, 1757, 1757, 1532, 1532, 1532, 1757, 1757, 1757, 1757, 1532, 1533, 1757, 1757, 1757, 1533, 1533, 1533, 1757, 1757, 1757, 1757, 1533, 1534, 1757, 1757, 1757, 1534, 1534, 1534, 1757, 1757, 1757, 1757, 1534, 1535, 1757, 1757, 1757, 1535, 1535, 1535, 1757, 1757, 1757, 1757, 1535, 1536, 1757, 1757, 1757, 1536, 1536, 1536, 1757, 1757, 1757, 1757, 1536, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1757, 1540, 1540, 1540, 1757, 1540, 1627, 1757, 1757, 1757, 1627, 1627, 1627, 1757, 1757, 1757, 1757, 1627, 1628, 1628, 1628, 1629, 1757, 1757, 1757, 1629, 1629, 1629, 1757, 1757, 1757, 1757, 1629, 1630, 1630, 1630, 1631, 1631, 1631, 1757, 1757, 1757, 1757, 1631, 1632, 1632, 1632, 1634, 1634, 1634, 1640, 1640, 1640, 100, 100, 100, 1757, 1757, 1757, 1757, 100, 1645, 1645, 1645, 1649, 1757, 1649, 1757, 1649, 1649, 1757, 1757, 1757, 1757, 1757, 1649, 1653, 1757, 1653, 1757, 1653, 1653, 1757, 1757, 1757, 1757, 1757, 1653, 1567, 1757, 1757, 1757, 1567, 1567, 1567, 1757, 1757, 1757, 1757, 1567, 1570, 1757, 1757, 1757, 1570, 1570, 1570, 1757, 1757, 1757, 1757, 1570, 1571, 1757, 1757, 1757, 1571, 1571, 1571, 1757, 1757, 1757, 1757, 1571, 1572, 1757, 1757, 1757, 1572, 1572, 1572, 1757, 1757, 1757, 1757, 1572, 1576, 1757, 1757, 1757, 1576, 1576, 1576, 1757, 1757, 1757, 1757, 1576, 1577, 1757, 1757, 1757, 1577, 1577, 1577, 1757, 1757, 1757, 1757, 1577, 1578, 1757, 1757, 1757, 1578, 1578, 1578, 1757, 1757, 1757, 1757, 1578, 1581, 1757, 1757, 1757, 1581, 1581, 1581, 1757, 1757, 1757, 1757, 1581, 1582, 1757, 1757, 1757, 1582, 1582, 1582, 1757, 1757, 1757, 1757, 1582, 1583, 1757, 1757, 1757, 1583, 1583, 1583, 1757, 1757, 1757, 1757, 1583, 1584, 1757, 1757, 1757, 1584, 1584, 1584, 1757, 1757, 1757, 1757, 1584, 1585, 1757, 1757, 1757, 1585, 1585, 1585, 1757, 1757, 1757, 1757, 1585, 1589, 1757, 1757, 1757, 1589, 1589, 1589, 1757, 1757, 1757, 1757, 1589, 1590, 1757, 1757, 1757, 1590, 1590, 1590, 1757, 1757, 1757, 1757, 1590, 1591, 1757, 1757, 1757, 1591, 1591, 1591, 1757, 1757, 1757, 1757, 1591, 1592, 1757, 1757, 1757, 1592, 1592, 1592, 1757, 1757, 1757, 1757, 1592, 1593, 1757, 1757, 1757, 1593, 1593, 1593, 1757, 1757, 1757, 1757, 1593, 1594, 1757, 1757, 1757, 1594, 1594, 1594, 1757, 1757, 1757, 1757, 1594, 1596, 1757, 1757, 1757, 1596, 1596, 1596, 1757, 1757, 1757, 1757, 1596, 1597, 1757, 1757, 1757, 1597, 1597, 1597, 1757, 1757, 1757, 1757, 1597, 1598, 1757, 1757, 1757, 1598, 1598, 1598, 1757, 1757, 1757, 1757, 1598, 1599, 1757, 1757, 1757, 1599, 1599, 1599, 1757, 1757, 1757, 1757, 1599, 1600, 1757, 1757, 1757, 1600, 1600, 1600, 1757, 1757, 1757, 1757, 1600, 1601, 1757, 1757, 1757, 1601, 1601, 1601, 1757, 1757, 1757, 1757, 1601, 1602, 1757, 1757, 1757, 1602, 1602, 1602, 1757, 1757, 1757, 1757, 1602, 1606, 1757, 1757, 1757, 1606, 1606, 1606, 1757, 1757, 1757, 1757, 1606, 1607, 1757, 1757, 1757, 1607, 1607, 1607, 1757, 1757, 1757, 1757, 1607, 1608, 1757, 1757, 1757, 1608, 1608, 1608, 1757, 1757, 1757, 1757, 1608, 1609, 1757, 1757, 1757, 1609, 1609, 1609, 1757, 1757, 1757, 1757, 1609, 1610, 1757, 1757, 1757, 1610, 1610, 1610, 1757, 1757, 1757, 1757, 1610, 1611, 1757, 1757, 1757, 1611, 1611, 1611, 1757, 1757, 1757, 1757, 1611, 1612, 1757, 1757, 1757, 1612, 1612, 1612, 1757, 1757, 1757, 1757, 1612, 1615, 1757, 1757, 1757, 1615, 1615, 1615, 1757, 1757, 1757, 1757, 1615, 1616, 1757, 1757, 1757, 1616, 1616, 1616, 1757, 1757, 1757, 1757, 1616, 1617, 1757, 1757, 1757, 1617, 1617, 1617, 1757, 1757, 1757, 1757, 1617, 1618, 1757, 1757, 1757, 1618, 1618, 1618, 1757, 1757, 1757, 1757, 1618, 1619, 1757, 1757, 1757, 1619, 1619, 1619, 1757, 1757, 1757, 1757, 1619, 1620, 1757, 1757, 1757, 1620, 1620, 1620, 1757, 1757, 1757, 1757, 1620, 1621, 1757, 1757, 1757, 1621, 1621, 1621, 1757, 1757, 1757, 1757, 1621, 1622, 1757, 1757, 1757, 1622, 1622, 1622, 1757, 1757, 1757, 1757, 1622, 1623, 1757, 1757, 1757, 1623, 1623, 1623, 1757, 1757, 1757, 1757, 1623, 1654, 1757, 1757, 1757, 1654, 1654, 1654, 1757, 1757, 1757, 1757, 1654, 1655, 1655, 1655, 1656, 1757, 1757, 1757, 1656, 1656, 1656, 1757, 1757, 1757, 1757, 1656, 1657, 1657, 1657, 1658, 1658, 1658, 1659, 1659, 1659, 1660, 1660, 1660, 1665, 1757, 1665, 1757, 1665, 1665, 1757, 1757, 1757, 1757, 1757, 1665, 1670, 1757, 1670, 1757, 1670, 1670, 1757, 1757, 1757, 1757, 1757, 1670, 1675, 1675, 1675, 1680, 1680, 1680, 1681, 1757, 1757, 1757, 1681, 1681, 1681, 1757, 1757, 1757, 1757, 1681, 1682, 1682, 1682, 1683, 1757, 1757, 1757, 1683, 1683, 1683, 1757, 1757, 1757, 1757, 1683, 1684, 1684, 1684, 1685, 1685, 1685, 1689, 1689, 1689, 1693, 1693, 1693, 1698, 1757, 1698, 1757, 1698, 1698, 1757, 1757, 1757, 1757, 1757, 1698, 1703, 1757, 1703, 1757, 1703, 1703, 1757, 1757, 1757, 1757, 1757, 1703, 1704, 1704, 1704, 1705, 1757, 1757, 1757, 1705, 1705, 1705, 1757, 1757, 1757, 1757, 1705, 1706, 1706, 1706, 1707, 1707, 1707, 1708, 1708, 1708, 1710, 1710, 1710, 1715, 1715, 1715, 1719, 1719, 1719, 1720, 1720, 1720, 1721, 1721, 1721, 1722, 1722, 1722, 1723, 1723, 1723, 1724, 1724, 1724, 1726, 1726, 1726, 1730, 1730, 1730, 1731, 1757, 1731, 1757, 1731, 1731, 1731, 1757, 1757, 1757, 1757, 1731, 1732, 1757, 1732, 1757, 1732, 1732, 1732, 1757, 1757, 1757, 1757, 1732, 1733, 1733, 1733, 1734, 1734, 1734, 1738, 1757, 1738, 1757, 1738, 1738, 1738, 1757, 1757, 1757, 1757, 1738, 1739, 1757, 1739, 1757, 1739, 1739, 1739, 1757, 1757, 1757, 1757, 1739, 1740, 1757, 1740, 1757, 1740, 1740, 1740, 1757, 1757, 1757, 1757, 1740, 1741, 1757, 1741, 1757, 1741, 1741, 1741, 1757, 1757, 1757, 1757, 1741, 1742, 1742, 1742, 1743, 1757, 1743, 1757, 1743, 1743, 1743, 1757, 1757, 1757, 1757, 1743, 1744, 1757, 1744, 1757, 1744, 1744, 1744, 1757, 1757, 1757, 1757, 1744, 1745, 1757, 1745, 1757, 1745, 1745, 1745, 1757, 1757, 1757, 1757, 1745, 1746, 1757, 1746, 1757, 1746, 1746, 1746, 1757, 1757, 1757, 1757, 1746, 1747, 1757, 1747, 1757, 1747, 1747, 1747, 1757, 1757, 1757, 1757, 1747, 1748, 1757, 1748, 1757, 1748, 1748, 1748, 1757, 1757, 1757, 1757, 1748, 1749, 1757, 1749, 1757, 1749, 1749, 1749, 1757, 1757, 1757, 1757, 1749, 1750, 1757, 1750, 1757, 1750, 1750, 1750, 1757, 1757, 1757, 1757, 1750, 1751, 1757, 1751, 1757, 1751, 1751, 1751, 1757, 1757, 1757, 1757, 1751, 1752, 1757, 1752, 1757, 1752, 1752, 1752, 1757, 1757, 1757, 1757, 1752, 1753, 1757, 1753, 1757, 1753, 1753, 1753, 1757, 1757, 1757, 1757, 1753, 1754, 1757, 1754, 1757, 1754, 1754, 1754, 1757, 1757, 1757, 1757, 1754, 1755, 1757, 1755, 1757, 1755, 1755, 1755, 1757, 1757, 1757, 1757, 1755, 1756, 1757, 1756, 1757, 1756, 1756, 1756, 1757, 1757, 1757, 1757, 1756, 3, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757 } ; static yyconst flex_int16_t yy_chk[19183] = { 0, 0, 1, 0, 0, 14, 16, 39, 0, 39, 39, 49, 49, 49, 0, 18, 0, 18, 18, 18, 17, 17, 35, 35, 1742, 14, 16, 1, 1, 1, 6, 1, 1, 8, 17, 18, 1, 6, 1, 1, 2, 21, 10, 8, 8, 10, 19, 19, 24, 24, 24, 1718, 23, 44, 44, 26, 25, 85, 85, 27, 19, 21, 28, 24, 1717, 2, 2, 2, 23, 2, 2, 25, 23, 23, 2, 26, 2, 2, 20, 27, 20, 20, 28, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 31, 32, 33, 37, 37, 20, 38, 1714, 38, 38, 38, 41, 1713, 51, 1707, 41, 1702, 37, 46, 46, 31, 32, 33, 53, 55, 42, 38, 42, 42, 42, 41, 41, 46, 51, 52, 48, 41, 48, 48, 52, 52, 67, 68, 53, 55, 42, 65, 65, 65, 65, 1700, 56, 57, 59, 52, 48, 50, 67, 68, 1697, 69, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 56, 57, 59, 59, 69, 50, 54, 60, 54, 54, 1695, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 61, 1692, 60, 62, 1691, 54, 60, 60, 70, 63, 1688, 66, 66, 66, 71, 72, 61, 73, 76, 62, 61, 61, 77, 62, 62, 63, 66, 78, 70, 63, 63, 79, 91, 91, 71, 72, 1687, 73, 76, 101, 101, 1669, 77, 87, 88, 1667, 89, 78, 165, 165, 104, 79, 81, 81, 81, 81, 81, 83, 83, 83, 83, 83, 87, 87, 88, 89, 89, 1664, 87, 90, 104, 89, 92, 90, 92, 92, 92, 93, 95, 93, 93, 106, 95, 97, 97, 97, 97, 97, 90, 90, 105, 107, 92, 109, 90, 105, 105, 95, 95, 167, 167, 106, 1662, 95, 99, 99, 99, 99, 99, 103, 105, 107, 1625, 109, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 1556, 111, 110, 112, 113, 103, 108, 110, 110, 120, 1551, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 111, 110, 112, 113, 1546, 108, 114, 117, 120, 117, 117, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 115, 115, 115, 115, 115, 114, 116, 122, 116, 116, 148, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 118, 118, 118, 119, 1421, 148, 122, 123, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 124, 121, 125, 126, 128, 119, 121, 121, 129, 123, 130, 132, 133, 174, 174, 136, 268, 268, 134, 1351, 124, 121, 125, 126, 128, 128, 135, 1349, 129, 129, 130, 132, 133, 133, 134, 136, 136, 138, 134, 134, 139, 1346, 135, 140, 1345, 141, 135, 135, 270, 270, 142, 149, 143, 138, 144, 1112, 139, 138, 138, 140, 139, 139, 151, 140, 140, 141, 142, 149, 143, 144, 142, 142, 143, 143, 144, 146, 146, 146, 146, 150, 152, 155, 151, 156, 162, 162, 162, 162, 162, 164, 164, 164, 164, 164, 166, 150, 169, 1111, 170, 255, 152, 155, 171, 156, 1108, 172, 1106, 173, 184, 186, 1102, 173, 903, 166, 166, 255, 169, 170, 170, 166, 273, 273, 171, 170, 172, 172, 173, 173, 184, 186, 172, 900, 173, 180, 180, 180, 180, 180, 182, 182, 182, 182, 182, 183, 274, 274, 187, 188, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 192, 185, 258, 258, 258, 183, 185, 185, 187, 188, 190, 190, 190, 190, 190, 380, 380, 194, 193, 195, 192, 185, 189, 193, 193, 196, 199, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 194, 193, 195, 395, 395, 189, 191, 895, 196, 199, 200, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 198, 198, 198, 198, 198, 191, 197, 201, 892, 200, 203, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 396, 396, 205, 207, 890, 197, 201, 202, 889, 203, 888, 208, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 205, 207, 206, 210, 706, 202, 204, 206, 206, 208, 703, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 696, 206, 210, 211, 212, 204, 209, 213, 211, 211, 214, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 527, 527, 211, 212, 693, 209, 213, 694, 694, 214, 215, 217, 218, 219, 223, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 216, 216, 216, 216, 216, 215, 217, 218, 219, 223, 224, 691, 227, 690, 228, 662, 230, 519, 233, 229, 505, 231, 494, 234, 259, 259, 259, 237, 227, 235, 224, 224, 227, 227, 228, 229, 230, 230, 233, 229, 229, 231, 231, 234, 234, 235, 236, 237, 238, 235, 235, 243, 697, 697, 239, 493, 240, 484, 247, 379, 244, 361, 236, 241, 238, 360, 236, 236, 238, 238, 239, 243, 240, 245, 239, 239, 240, 240, 247, 241, 244, 244, 246, 241, 241, 248, 353, 249, 265, 245, 345, 267, 272, 245, 245, 252, 252, 252, 246, 253, 280, 248, 246, 246, 269, 248, 248, 249, 265, 344, 252, 267, 272, 282, 253, 375, 375, 375, 375, 253, 280, 704, 704, 269, 269, 283, 281, 284, 287, 269, 279, 281, 281, 282, 288, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 283, 281, 284, 287, 338, 279, 285, 289, 334, 288, 291, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 286, 286, 286, 286, 286, 285, 289, 290, 257, 291, 293, 256, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 254, 295, 296, 297, 294, 290, 292, 242, 293, 294, 294, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 295, 296, 297, 294, 232, 292, 298, 300, 301, 302, 226, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 299, 299, 299, 299, 299, 298, 300, 301, 302, 303, 304, 305, 306, 307, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 308, 225, 312, 707, 707, 303, 304, 305, 306, 307, 310, 310, 310, 310, 310, 222, 314, 315, 313, 316, 308, 309, 312, 313, 313, 320, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 314, 315, 313, 316, 221, 309, 311, 220, 322, 320, 323, 311, 311, 311, 311, 311, 311, 311, 311, 311, 311, 318, 318, 318, 318, 318, 311, 317, 322, 153, 323, 324, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 147, 327, 321, 328, 329, 317, 319, 321, 321, 324, 331, 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, 327, 321, 328, 329, 137, 319, 325, 131, 332, 331, 333, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 326, 326, 326, 326, 326, 325, 330, 332, 335, 333, 336, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 337, 127, 339, 102, 342, 330, 86, 335, 335, 336, 340, 58, 341, 47, 346, 45, 347, 36, 339, 343, 337, 337, 339, 339, 342, 348, 340, 349, 341, 354, 340, 340, 341, 341, 346, 343, 347, 347, 350, 343, 343, 348, 355, 30, 351, 348, 348, 349, 15, 354, 352, 13, 356, 12, 350, 358, 362, 11, 350, 350, 351, 357, 355, 355, 351, 351, 352, 359, 356, 363, 352, 352, 356, 356, 9, 358, 362, 357, 364, 7, 365, 357, 357, 359, 370, 366, 3, 359, 359, 363, 363, 367, 0, 368, 364, 372, 376, 388, 364, 364, 365, 366, 369, 0, 370, 366, 366, 367, 371, 368, 0, 367, 367, 368, 368, 372, 376, 388, 369, 382, 382, 382, 369, 369, 371, 384, 384, 384, 371, 385, 385, 385, 386, 386, 386, 390, 392, 392, 392, 394, 394, 394, 404, 404, 404, 404, 404, 524, 524, 524, 0, 398, 399, 400, 401, 390, 397, 399, 399, 402, 0, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 398, 399, 400, 401, 405, 397, 406, 407, 402, 403, 0, 409, 410, 411, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 405, 412, 406, 407, 413, 403, 408, 409, 410, 411, 417, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 412, 893, 893, 413, 0, 408, 414, 0, 419, 417, 420, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 415, 415, 415, 415, 415, 414, 416, 419, 0, 420, 421, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 424, 418, 0, 425, 426, 416, 418, 418, 0, 421, 423, 423, 423, 423, 423, 896, 896, 428, 429, 430, 424, 418, 422, 425, 426, 431, 432, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 428, 429, 430, 901, 901, 422, 427, 0, 431, 432, 435, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 434, 434, 434, 434, 434, 427, 433, 436, 437, 435, 438, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 439, 440, 441, 0, 443, 433, 436, 437, 0, 438, 525, 525, 525, 525, 440, 440, 904, 904, 445, 0, 439, 440, 441, 442, 443, 0, 446, 447, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 445, 444, 0, 450, 451, 442, 444, 444, 446, 447, 449, 449, 449, 449, 449, 1107, 1107, 452, 454, 456, 457, 444, 448, 450, 451, 457, 457, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 452, 454, 456, 457, 458, 448, 453, 0, 459, 460, 463, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 529, 529, 529, 458, 0, 453, 455, 459, 460, 463, 464, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 462, 462, 462, 462, 462, 455, 461, 465, 0, 464, 467, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 1234, 1234, 468, 469, 470, 461, 465, 466, 471, 467, 474, 0, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 468, 469, 470, 1348, 1348, 466, 471, 472, 474, 474, 475, 0, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 473, 473, 473, 473, 473, 472, 476, 0, 475, 475, 477, 478, 0, 479, 1352, 1352, 482, 0, 486, 480, 0, 481, 531, 531, 531, 485, 476, 476, 483, 479, 477, 478, 478, 479, 479, 480, 482, 481, 486, 480, 480, 481, 481, 487, 483, 485, 485, 0, 483, 488, 0, 489, 1538, 1538, 491, 0, 495, 490, 0, 492, 0, 496, 0, 487, 487, 488, 498, 489, 497, 488, 488, 489, 489, 490, 491, 492, 495, 490, 490, 492, 492, 496, 496, 499, 497, 500, 498, 0, 497, 497, 503, 501, 0, 502, 0, 507, 0, 506, 0, 499, 504, 500, 508, 499, 499, 500, 500, 501, 509, 502, 503, 501, 501, 502, 502, 507, 504, 506, 506, 510, 504, 511, 508, 508, 509, 512, 0, 513, 509, 509, 514, 1553, 1553, 515, 0, 510, 516, 511, 517, 510, 510, 511, 511, 513, 520, 512, 514, 513, 513, 515, 514, 514, 516, 515, 515, 521, 516, 0, 517, 526, 526, 526, 526, 539, 520, 532, 532, 532, 532, 533, 533, 533, 533, 1554, 1554, 521, 535, 535, 535, 537, 537, 537, 538, 539, 0, 541, 542, 538, 538, 538, 538, 538, 538, 538, 538, 538, 538, 543, 540, 0, 546, 547, 538, 540, 540, 541, 542, 545, 545, 545, 545, 545, 1558, 1558, 548, 550, 551, 543, 540, 544, 546, 547, 552, 553, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 548, 550, 551, 554, 557, 544, 549, 0, 552, 553, 558, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 1559, 1559, 554, 557, 0, 549, 555, 559, 560, 558, 561, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 556, 556, 556, 556, 556, 555, 559, 560, 562, 561, 563, 0, 565, 566, 567, 568, 1647, 1647, 566, 566, 0, 562, 562, 699, 699, 699, 569, 572, 562, 573, 563, 564, 565, 566, 567, 568, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 569, 572, 0, 573, 0, 564, 570, 574, 0, 576, 577, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 571, 571, 571, 571, 571, 570, 574, 575, 576, 577, 578, 579, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 580, 0, 583, 584, 585, 575, 1648, 1648, 578, 579, 582, 582, 582, 582, 582, 0, 586, 587, 1651, 1651, 580, 581, 583, 584, 585, 588, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 586, 587, 588, 588, 589, 581, 590, 591, 592, 588, 593, 594, 595, 597, 597, 597, 597, 599, 605, 605, 605, 605, 605, 0, 589, 0, 590, 591, 592, 600, 593, 594, 595, 596, 600, 600, 601, 599, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 0, 600, 602, 603, 606, 596, 598, 0, 601, 607, 608, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 0, 602, 603, 606, 610, 598, 604, 0, 607, 608, 611, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 0, 612, 613, 610, 614, 604, 609, 0, 618, 611, 620, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 612, 613, 0, 614, 0, 609, 615, 618, 621, 620, 622, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 616, 616, 616, 616, 616, 615, 617, 621, 0, 622, 0, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 625, 619, 0, 626, 627, 617, 619, 619, 624, 624, 624, 624, 624, 700, 700, 700, 700, 629, 630, 631, 625, 619, 623, 626, 627, 632, 633, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 629, 630, 631, 1652, 1652, 623, 628, 0, 632, 633, 636, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 635, 635, 635, 635, 635, 628, 634, 637, 638, 636, 639, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 640, 641, 642, 643, 0, 634, 637, 638, 644, 639, 645, 0, 646, 647, 641, 641, 651, 0, 648, 0, 640, 641, 642, 643, 643, 649, 0, 650, 644, 644, 645, 645, 646, 647, 648, 652, 651, 653, 648, 648, 654, 649, 655, 650, 656, 649, 649, 650, 0, 660, 657, 0, 658, 1659, 1659, 652, 652, 653, 653, 659, 654, 654, 655, 0, 656, 656, 657, 661, 658, 660, 657, 657, 658, 658, 663, 659, 664, 665, 0, 659, 659, 669, 0, 661, 666, 0, 667, 661, 1660, 1660, 674, 0, 668, 0, 663, 663, 664, 665, 665, 670, 666, 669, 667, 675, 666, 666, 667, 667, 668, 671, 674, 672, 668, 668, 676, 670, 678, 673, 677, 670, 670, 679, 0, 675, 675, 671, 683, 672, 680, 671, 671, 672, 672, 673, 676, 676, 678, 673, 677, 677, 681, 679, 679, 682, 680, 711, 683, 0, 680, 680, 684, 685, 686, 687, 1904, 1904, 681, 687, 0, 682, 681, 681, 0, 682, 682, 711, 684, 685, 686, 713, 684, 685, 686, 687, 701, 701, 701, 701, 708, 708, 708, 708, 709, 709, 709, 709, 710, 1990, 1990, 713, 714, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 715, 712, 0, 718, 719, 710, 712, 712, 0, 714, 717, 717, 717, 717, 717, 1991, 1991, 720, 722, 723, 715, 712, 716, 718, 719, 724, 725, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 720, 722, 723, 726, 729, 716, 721, 0, 724, 725, 730, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 1992, 1992, 726, 729, 0, 721, 727, 731, 732, 730, 733, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 728, 728, 728, 728, 728, 727, 731, 732, 734, 733, 735, 736, 737, 738, 739, 740, 741, 743, 743, 743, 743, 734, 734, 751, 751, 751, 751, 751, 734, 0, 735, 736, 737, 738, 739, 740, 741, 742, 0, 745, 1995, 1995, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 0, 747, 748, 746, 749, 742, 744, 745, 746, 746, 752, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 747, 748, 746, 749, 753, 744, 750, 754, 0, 752, 756, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 1996, 1996, 757, 753, 758, 750, 754, 755, 759, 756, 760, 0, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 757, 0, 758, 2090, 2090, 755, 759, 0, 760, 761, 763, 764, 765, 766, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 762, 762, 762, 762, 762, 761, 763, 764, 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, 775, 777, 777, 777, 777, 778, 768, 768, 846, 846, 846, 846, 767, 768, 769, 770, 771, 772, 773, 774, 775, 776, 779, 780, 781, 778, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 782, 783, 784, 0, 786, 776, 779, 780, 781, 794, 794, 794, 794, 794, 887, 887, 887, 887, 788, 790, 782, 783, 784, 785, 786, 2091, 2091, 791, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 788, 790, 789, 792, 795, 785, 787, 789, 789, 791, 796, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 0, 789, 792, 795, 797, 787, 793, 0, 799, 796, 800, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 0, 801, 802, 797, 803, 793, 798, 799, 806, 800, 807, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 801, 802, 0, 803, 0, 798, 804, 806, 808, 807, 809, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 805, 805, 805, 805, 805, 804, 810, 808, 811, 809, 812, 0, 814, 815, 816, 817, 2092, 2092, 815, 815, 0, 811, 811, 897, 897, 897, 810, 818, 811, 821, 812, 813, 814, 815, 816, 817, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 0, 818, 0, 821, 0, 813, 819, 822, 823, 0, 825, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 820, 820, 820, 820, 820, 819, 822, 823, 824, 825, 826, 827, 828, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 829, 0, 832, 833, 834, 824, 0, 826, 827, 828, 831, 831, 831, 831, 831, 0, 835, 836, 2093, 2093, 829, 830, 832, 833, 834, 837, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 835, 836, 837, 837, 838, 830, 839, 840, 841, 837, 842, 843, 844, 0, 847, 0, 848, 898, 898, 898, 938, 938, 938, 938, 838, 0, 839, 840, 841, 849, 842, 843, 844, 845, 847, 847, 848, 848, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 850, 849, 851, 852, 853, 845, 854, 0, 855, 0, 856, 857, 2094, 2094, 861, 0, 858, 0, 851, 852, 850, 862, 851, 852, 853, 853, 854, 854, 855, 855, 856, 857, 858, 859, 861, 860, 858, 858, 863, 0, 864, 862, 862, 865, 866, 0, 867, 2205, 2205, 859, 870, 860, 868, 859, 859, 860, 2207, 2207, 863, 863, 864, 864, 867, 865, 866, 866, 867, 867, 868, 869, 870, 871, 868, 868, 874, 0, 872, 873, 875, 0, 876, 0, 877, 878, 0, 869, 882, 871, 879, 869, 869, 871, 872, 873, 874, 874, 872, 873, 875, 875, 876, 876, 877, 878, 879, 880, 882, 881, 879, 879, 885, 0, 906, 907, 885, 908, 2208, 2208, 907, 907, 0, 880, 0, 881, 0, 880, 880, 881, 909, 910, 885, 905, 906, 907, 913, 908, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 2209, 2209, 909, 910, 0, 905, 911, 914, 913, 915, 0, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 912, 912, 912, 912, 912, 911, 914, 917, 915, 916, 918, 919, 920, 921, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 1117, 1117, 1117, 917, 0, 916, 918, 919, 920, 921, 922, 924, 925, 926, 927, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 923, 923, 923, 923, 923, 922, 924, 925, 926, 927, 928, 929, 930, 931, 932, 933, 934, 935, 936, 0, 939, 940, 941, 942, 929, 929, 981, 981, 981, 981, 928, 929, 930, 931, 932, 933, 934, 935, 936, 937, 939, 940, 941, 942, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 943, 944, 945, 0, 947, 937, 949, 950, 1034, 1034, 1034, 1034, 950, 950, 1068, 1068, 1068, 1068, 951, 952, 943, 944, 945, 946, 947, 953, 949, 950, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 951, 952, 1118, 1118, 1118, 946, 948, 953, 956, 957, 958, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 955, 955, 955, 955, 955, 948, 954, 956, 957, 958, 960, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 0, 961, 962, 963, 964, 954, 959, 0, 967, 960, 968, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 961, 962, 963, 964, 0, 959, 965, 967, 969, 968, 970, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 966, 966, 966, 966, 966, 965, 971, 969, 972, 970, 973, 974, 975, 976, 977, 978, 979, 0, 982, 983, 984, 972, 972, 1639, 1639, 1639, 971, 0, 972, 0, 973, 974, 975, 976, 977, 978, 979, 980, 982, 983, 984, 985, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 986, 987, 988, 0, 990, 980, 991, 992, 0, 985, 1000, 1000, 1000, 1000, 1000, 1644, 1644, 1644, 993, 994, 986, 987, 988, 989, 990, 995, 991, 992, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 993, 994, 996, 997, 998, 989, 1002, 995, 1003, 1004, 1674, 1674, 1674, 1003, 1003, 1008, 1008, 1008, 1008, 1008, 1005, 1006, 996, 997, 998, 999, 1002, 1009, 1003, 1004, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 1005, 1006, 1010, 1011, 1013, 999, 1001, 1009, 1014, 1015, 1016, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 0, 1010, 1011, 1013, 1017, 1001, 1007, 1014, 1015, 1016, 1020, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1679, 1679, 1679, 1017, 0, 1007, 1012, 0, 1021, 1020, 1022, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1019, 1019, 1019, 1019, 1019, 1012, 1018, 1021, 1023, 1022, 1024, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1025, 1026, 1027, 1028, 1029, 1018, 1030, 1023, 1031, 1024, 1032, 0, 1036, 1025, 1025, 1042, 1042, 1042, 1042, 1042, 1025, 1026, 1027, 1028, 1029, 0, 1030, 1038, 1031, 1037, 1032, 1033, 1036, 1039, 1037, 1037, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 0, 1038, 1040, 1037, 1043, 1033, 1035, 1039, 1044, 1045, 1047, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 0, 1040, 1048, 1043, 1049, 1035, 1041, 1044, 1045, 1047, 1050, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 0, 1048, 1051, 1049, 1054, 1041, 1046, 0, 1055, 1050, 1056, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 0, 1051, 0, 1054, 0, 1046, 1052, 1055, 1057, 1056, 1058, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1053, 1053, 1053, 1053, 1053, 1052, 1059, 1057, 1060, 1058, 1061, 1062, 1063, 1064, 1065, 1066, 0, 1069, 1070, 1059, 1059, 1110, 1110, 1110, 1110, 0, 1059, 0, 1060, 0, 1061, 1062, 1063, 1064, 1065, 1066, 1067, 1069, 1070, 1071, 1072, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1073, 1074, 1075, 0, 1077, 1067, 1078, 1079, 1071, 1072, 1114, 1114, 1114, 1114, 1116, 1116, 1116, 1116, 1080, 0, 1073, 1074, 1075, 1076, 1077, 1081, 1078, 1079, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1080, 1080, 1082, 1083, 1084, 1076, 1086, 1081, 1081, 1085, 1087, 0, 1088, 0, 1089, 1090, 2210, 2210, 1094, 1095, 1084, 1091, 1082, 1083, 1084, 1085, 1086, 1086, 1092, 1085, 1087, 1087, 1088, 1088, 1089, 1090, 1093, 1091, 1094, 1095, 1095, 1091, 1091, 1096, 1092, 1097, 1098, 0, 1092, 1092, 1101, 1099, 1093, 1100, 1109, 1109, 1093, 1120, 1122, 1152, 1152, 1152, 1152, 1096, 1096, 1097, 1098, 1099, 1109, 1100, 1101, 1099, 1123, 1100, 1119, 2211, 2211, 1120, 1122, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1124, 1121, 0, 1123, 1127, 1119, 1121, 1121, 1126, 1126, 1126, 1126, 1126, 1205, 1205, 1205, 1205, 1128, 1129, 1131, 1124, 1121, 1125, 0, 1127, 1132, 1133, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1128, 1129, 1131, 1134, 1135, 1125, 1130, 0, 1132, 1133, 1138, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 2343, 2343, 1134, 1135, 0, 1130, 1136, 1139, 1140, 1138, 1141, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1137, 1137, 1137, 1137, 1137, 1136, 1139, 1140, 1142, 1141, 1143, 1144, 1145, 1146, 1147, 1148, 1149, 1150, 0, 1153, 1154, 1155, 1156, 1143, 1143, 2344, 2344, 0, 1142, 0, 1143, 1144, 1145, 1146, 1147, 1148, 1149, 1150, 1151, 1153, 1154, 1155, 1156, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1157, 1158, 1159, 0, 1161, 1151, 1162, 1163, 1171, 1171, 1171, 1171, 1171, 1179, 1179, 1179, 1179, 1179, 1164, 1165, 1157, 1158, 1159, 1160, 1161, 1166, 1162, 1163, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1164, 1165, 1167, 1168, 1169, 1160, 1173, 1166, 1174, 1175, 2345, 2345, 0, 1174, 1174, 1190, 1190, 1190, 1190, 1190, 1176, 1177, 1167, 1168, 1169, 1170, 1173, 1180, 1174, 1175, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1176, 1177, 1181, 1182, 1184, 1170, 1172, 1180, 1185, 1186, 1187, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 0, 1181, 1182, 1184, 1188, 1172, 1178, 1185, 1186, 1187, 1191, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 0, 1192, 1193, 1188, 1194, 1178, 1183, 0, 1195, 1191, 1197, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1192, 1193, 0, 1194, 1198, 1183, 1189, 1195, 1196, 1197, 1199, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1196, 1196, 1200, 1198, 1201, 1189, 1202, 1196, 1203, 1199, 1206, 1207, 1208, 1209, 1224, 1224, 1224, 1224, 1224, 2346, 2346, 0, 1200, 0, 1201, 1210, 1202, 1211, 1203, 1204, 1206, 1207, 1208, 1209, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1212, 1210, 1214, 1211, 1215, 1204, 1243, 1243, 1243, 1243, 1243, 1254, 1254, 1254, 1254, 1254, 1216, 1217, 1218, 1219, 1212, 1213, 1214, 1220, 1215, 1221, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1216, 1217, 1218, 1219, 1222, 1213, 1235, 1220, 1237, 1221, 1269, 1269, 1269, 1269, 1286, 1286, 1286, 1286, 1286, 0, 1239, 1240, 0, 1241, 1222, 1223, 1235, 0, 1237, 1244, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1239, 1240, 1238, 1241, 1245, 1223, 1236, 1238, 1238, 1244, 1246, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 0, 1238, 1248, 1245, 1249, 1236, 1242, 0, 1250, 1246, 1251, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 0, 1248, 1252, 1249, 1255, 1242, 1247, 1250, 1256, 1251, 1257, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 0, 1252, 1258, 1255, 1259, 1247, 1253, 1256, 1261, 1257, 1262, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1260, 1258, 1263, 1259, 1264, 1253, 1265, 1261, 1266, 1262, 1267, 0, 1270, 1260, 1260, 1271, 1312, 1312, 1312, 1312, 1260, 0, 1263, 0, 1264, 0, 1265, 1272, 1266, 1273, 1267, 1268, 1270, 1274, 1275, 1271, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1276, 1272, 1278, 1273, 1280, 1268, 0, 1274, 1275, 1297, 1297, 1297, 1297, 1297, 2347, 2347, 1282, 1283, 0, 1284, 1276, 1277, 1278, 0, 1280, 1287, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1282, 1283, 1281, 1284, 1288, 1277, 1279, 1281, 1281, 1287, 1289, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 0, 1281, 1291, 1288, 1292, 1279, 1285, 0, 1293, 1289, 1294, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 0, 1291, 1295, 1292, 1298, 1285, 1290, 1293, 1299, 1294, 1300, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 0, 1295, 1301, 1298, 1302, 1290, 1296, 1299, 1304, 1300, 1305, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1303, 1301, 1306, 1302, 1307, 1296, 1308, 1304, 1309, 1305, 1310, 0, 1313, 1303, 1303, 1314, 1356, 1356, 1356, 1356, 1303, 0, 1306, 0, 1307, 0, 1308, 1315, 1309, 1316, 1310, 1311, 1313, 1317, 1318, 1314, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1319, 1315, 1321, 1316, 1322, 1311, 0, 1317, 1318, 1331, 1331, 1331, 1331, 1331, 2499, 2499, 1323, 1324, 1325, 1326, 1319, 1320, 1321, 1327, 1322, 1328, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1323, 1324, 1325, 1326, 1329, 1320, 1332, 1327, 1333, 1328, 1358, 1358, 1358, 1358, 1366, 1366, 1366, 1366, 1366, 0, 1334, 0, 1335, 0, 1329, 1330, 1332, 1336, 1333, 1337, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1334, 1334, 1335, 1335, 1338, 1330, 1339, 1336, 1340, 1337, 1341, 1342, 1344, 1353, 0, 1353, 1353, 0, 1360, 0, 1338, 1362, 1339, 1363, 1338, 0, 1339, 1364, 1340, 1367, 1341, 1342, 1344, 1353, 1354, 0, 1354, 1354, 1360, 1361, 0, 1362, 0, 1363, 1361, 1361, 0, 1364, 0, 1367, 1368, 1369, 1371, 1372, 1354, 1359, 0, 1373, 1374, 1361, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1368, 1369, 1371, 1372, 1375, 1359, 1365, 1373, 1374, 1378, 1379, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 2669, 2669, 0, 1375, 0, 1365, 1370, 0, 1378, 1379, 1380, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1377, 1377, 1377, 1377, 1377, 1370, 1376, 1381, 1382, 1380, 1383, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1384, 1385, 1383, 1383, 1386, 1376, 1381, 1382, 1387, 1383, 1388, 1389, 1390, 1392, 1392, 1392, 1392, 1393, 2858, 2858, 1384, 1385, 2859, 2859, 1386, 2861, 2861, 0, 1387, 1394, 1388, 1389, 1390, 1391, 1395, 1396, 1397, 1393, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1398, 1394, 1399, 0, 1401, 1391, 1395, 1396, 1397, 1411, 1411, 1411, 1411, 1411, 1456, 1456, 1456, 1456, 1402, 1403, 1398, 1404, 1399, 1400, 1401, 1405, 1406, 1407, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1402, 1403, 1408, 1404, 1409, 1400, 1422, 1405, 1406, 1407, 1430, 1430, 1430, 1430, 1430, 1441, 1441, 1441, 1441, 1441, 1424, 1426, 1408, 1425, 1409, 1410, 1422, 1427, 1425, 1425, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1424, 1426, 1428, 1425, 1431, 1410, 1423, 1427, 1432, 1433, 1435, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 0, 1428, 1436, 1431, 1437, 1423, 1429, 1432, 1433, 1435, 1438, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 0, 1436, 1439, 1437, 1442, 1429, 1434, 0, 1443, 1438, 1444, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 0, 1439, 1445, 1442, 1446, 1434, 1440, 1443, 1448, 1444, 1449, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1447, 1445, 1450, 1446, 1451, 1440, 1452, 1448, 1453, 1449, 1454, 0, 1457, 1447, 1447, 1458, 1509, 1509, 1509, 1509, 1447, 0, 1450, 0, 1451, 0, 1452, 1459, 1453, 1460, 1454, 1455, 1457, 1461, 1462, 1458, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1463, 1459, 1465, 1460, 1466, 1455, 0, 1461, 1462, 1475, 1475, 1475, 1475, 1475, 2862, 2862, 1467, 1468, 1469, 1470, 1463, 1464, 1465, 1471, 1466, 1472, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1467, 1468, 1469, 1470, 1473, 1464, 1477, 1471, 1478, 1472, 2871, 2871, 0, 1478, 1478, 1483, 1483, 1483, 1483, 1483, 1479, 1480, 1481, 1484, 1473, 1474, 1477, 1485, 1478, 1486, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1479, 1480, 1481, 1484, 1488, 1474, 1476, 1485, 1489, 1486, 1490, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 0, 1491, 1492, 1488, 1495, 1476, 1482, 1489, 1496, 1490, 1497, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1491, 1492, 0, 1495, 0, 1482, 1487, 1496, 1498, 1497, 1499, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1494, 1494, 1494, 1494, 1494, 1487, 1493, 1498, 1500, 1499, 1501, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1500, 1500, 1502, 1503, 1504, 1493, 1505, 1500, 1506, 1501, 1507, 0, 1510, 1511, 1512, 1513, 1528, 1528, 1528, 1528, 1528, 0, 1502, 1503, 1504, 0, 1505, 1514, 1506, 1515, 1507, 1508, 1510, 1511, 1512, 1513, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1516, 1514, 1518, 1515, 1519, 1508, 1548, 1548, 1548, 1548, 1548, 1550, 1550, 1550, 1550, 1550, 1520, 1521, 1522, 1523, 1516, 1517, 1518, 1524, 1519, 1525, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1520, 1521, 1522, 1523, 1526, 1517, 1539, 1524, 1540, 1525, 1570, 1570, 1570, 1570, 1570, 1581, 1581, 1581, 1581, 1581, 1541, 1542, 1544, 1552, 1526, 1527, 1539, 1557, 1540, 0, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1541, 1542, 1544, 1552, 1564, 1527, 1561, 1557, 1561, 1561, 1562, 0, 1562, 1562, 1565, 1566, 2873, 2873, 0, 1565, 1565, 2875, 2875, 0, 1564, 0, 1561, 1567, 1568, 1571, 1562, 1563, 0, 1572, 1565, 1566, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 0, 1567, 1568, 1571, 1573, 1563, 1569, 1572, 1575, 1576, 1577, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 0, 1578, 1579, 1573, 1582, 1569, 1574, 1575, 1576, 1577, 1583, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1578, 1579, 1584, 1582, 1585, 1574, 1580, 1586, 1588, 1583, 1589, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1587, 1584, 1590, 1585, 1591, 1580, 1586, 1588, 1592, 1589, 1593, 1594, 0, 1587, 1587, 1596, 1596, 1596, 1596, 0, 1587, 0, 1590, 0, 1591, 2876, 2876, 1597, 1592, 1598, 1593, 1594, 1595, 1599, 1600, 1601, 1602, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1597, 1603, 1598, 1605, 1606, 1595, 1599, 1600, 1601, 1602, 1615, 1615, 1615, 1615, 1615, 2878, 2878, 1607, 1608, 1609, 1610, 1603, 1604, 1605, 1606, 1611, 1612, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1607, 1608, 1609, 1610, 1613, 1604, 1626, 1627, 1611, 1612, 1637, 1637, 1637, 1637, 1637, 1642, 1642, 1642, 1642, 1642, 1629, 0, 1646, 0, 1613, 1614, 1626, 1627, 2879, 2879, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1629, 1640, 1646, 1640, 1640, 1614, 1645, 1650, 1645, 1645, 1654, 1656, 1672, 1672, 1672, 1672, 1672, 1675, 1681, 1675, 1675, 1640, 1680, 1683, 1680, 1680, 1645, 1650, 2887, 2887, 1654, 1656, 1677, 1677, 1677, 1677, 1677, 1675, 1681, 1705, 1708, 1710, 1680, 1683, 1689, 0, 1689, 1689, 1689, 1693, 1720, 1693, 1693, 1693, 1715, 0, 1715, 1715, 1715, 1705, 1708, 1710, 1724, 1719, 1689, 1719, 1719, 1719, 1726, 1693, 1720, 1728, 1730, 1722, 1715, 1722, 1722, 1723, 0, 1723, 1723, 0, 1724, 1719, 1729, 1729, 1729, 1731, 1726, 1731, 1731, 1728, 1730, 1722, 1737, 2889, 2889, 1723, 1732, 1729, 1732, 1732, 1733, 0, 1733, 1733, 1734, 1731, 1734, 1734, 1736, 1736, 1736, 1736, 1737, 0, 0, 1738, 1732, 1738, 1738, 1739, 1733, 1739, 1739, 1740, 1734, 1740, 1740, 1741, 0, 1741, 1741, 1743, 0, 1743, 1743, 1738, 0, 0, 1744, 1739, 1744, 1744, 1745, 1740, 1745, 1745, 1746, 1741, 1746, 1746, 1747, 1743, 1747, 1747, 1748, 0, 1748, 1748, 1744, 0, 0, 1749, 1745, 1749, 1749, 1750, 1746, 1750, 1750, 1751, 1747, 1751, 1751, 1752, 1748, 1752, 1752, 1753, 0, 1753, 1753, 1749, 0, 0, 1754, 1750, 1754, 1754, 1755, 1751, 1755, 1755, 1756, 1752, 1756, 1756, 0, 1753, 0, 0, 0, 0, 0, 0, 1754, 0, 0, 0, 1755, 0, 0, 0, 1756, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1760, 1760, 1760, 0, 0, 0, 0, 1760, 1761, 0, 0, 0, 1761, 1761, 1761, 0, 0, 1761, 1761, 1761, 1762, 1762, 1762, 0, 0, 0, 0, 1762, 1763, 0, 1763, 1763, 1763, 1763, 1763, 0, 0, 0, 0, 1763, 1764, 1764, 1764, 0, 0, 0, 0, 1764, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1768, 1768, 1768, 0, 0, 0, 0, 1768, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1771, 1771, 1771, 1772, 1772, 1772, 0, 0, 0, 0, 1772, 1773, 0, 0, 0, 1773, 1773, 1773, 0, 0, 1773, 1773, 1773, 1774, 1774, 1774, 1775, 1775, 1775, 0, 0, 0, 0, 1775, 1776, 1776, 1776, 1777, 0, 0, 1777, 1777, 1777, 1777, 0, 0, 0, 1777, 1777, 0, 1777, 1778, 0, 1778, 1778, 1778, 1778, 1778, 0, 0, 0, 0, 1778, 1779, 1779, 1779, 1780, 1780, 1780, 0, 0, 0, 0, 1780, 1781, 1781, 1781, 1782, 0, 0, 0, 1782, 1782, 1782, 0, 0, 0, 0, 1782, 1783, 0, 0, 0, 1783, 1783, 1783, 0, 0, 0, 0, 1783, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 0, 1785, 1785, 1785, 1785, 1785, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1789, 1789, 1789, 1790, 1790, 1790, 1790, 0, 0, 0, 0, 1790, 1791, 1791, 1791, 0, 0, 0, 0, 1791, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1793, 1793, 1793, 1794, 1794, 1794, 1795, 1795, 1795, 1796, 1796, 1796, 1797, 1797, 1797, 1798, 0, 0, 0, 1798, 1798, 1798, 0, 0, 0, 1798, 1798, 0, 1798, 1799, 0, 1799, 1799, 1799, 1800, 1800, 1800, 1801, 0, 0, 1801, 1801, 1801, 1801, 0, 0, 0, 1801, 1801, 0, 1801, 1802, 1802, 1802, 1803, 1803, 1803, 1804, 1804, 1804, 1805, 0, 0, 0, 1805, 1805, 1805, 0, 0, 0, 0, 1805, 1806, 0, 0, 0, 1806, 1806, 1806, 0, 0, 0, 0, 1806, 1807, 0, 0, 0, 1807, 1807, 1807, 0, 0, 0, 0, 1807, 1808, 0, 0, 0, 1808, 1808, 1808, 0, 0, 0, 0, 1808, 1809, 0, 0, 0, 1809, 1809, 1809, 0, 0, 0, 0, 1809, 1810, 0, 0, 0, 1810, 1810, 1810, 0, 0, 0, 0, 1810, 1811, 1811, 1811, 1812, 0, 0, 0, 1812, 1812, 1812, 0, 0, 0, 0, 1812, 1813, 0, 0, 0, 1813, 1813, 1813, 0, 0, 0, 0, 1813, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 0, 1817, 1817, 1817, 1817, 1817, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 0, 1818, 1818, 1818, 0, 1818, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 0, 1819, 1819, 0, 1819, 1819, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 0, 1820, 1820, 1820, 0, 1820, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 0, 1821, 1821, 1821, 1821, 1821, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 0, 1824, 1824, 1824, 1824, 1824, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 0, 1825, 1825, 0, 0, 1825, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 0, 1829, 1829, 1829, 0, 1829, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1832, 0, 0, 0, 1832, 1832, 0, 1832, 0, 0, 0, 1832, 1833, 1833, 1833, 1834, 1834, 1834, 1835, 1835, 1835, 1835, 0, 0, 0, 0, 1835, 1836, 1836, 1836, 1836, 0, 0, 0, 0, 1836, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1838, 1838, 1838, 1839, 0, 0, 0, 1839, 1839, 1839, 0, 0, 1839, 1839, 1839, 1840, 1840, 1840, 1841, 1841, 1841, 1842, 1842, 1842, 1843, 1843, 1843, 1844, 0, 1844, 1844, 1844, 1845, 0, 0, 0, 1845, 1845, 1845, 0, 0, 0, 1845, 1845, 0, 1845, 1846, 0, 1846, 1846, 1846, 1847, 1847, 1847, 1848, 0, 0, 0, 1848, 1848, 1848, 0, 0, 0, 1848, 1848, 0, 1848, 1849, 0, 0, 0, 1849, 1849, 1849, 0, 0, 0, 1849, 1849, 0, 1849, 1850, 0, 0, 1850, 1850, 1850, 1850, 0, 0, 0, 1850, 1850, 0, 1850, 1851, 0, 1851, 1851, 1851, 1852, 1852, 1852, 1853, 1853, 1853, 1854, 1854, 1854, 1855, 1855, 1855, 1856, 0, 0, 0, 1856, 1856, 1856, 0, 0, 0, 0, 1856, 1857, 0, 0, 0, 1857, 1857, 1857, 0, 0, 0, 0, 1857, 1858, 0, 0, 0, 1858, 1858, 1858, 0, 0, 0, 0, 1858, 1859, 0, 0, 0, 1859, 1859, 1859, 0, 0, 0, 0, 1859, 1860, 0, 0, 0, 1860, 1860, 1860, 0, 0, 0, 0, 1860, 1861, 0, 0, 0, 1861, 1861, 1861, 0, 0, 0, 0, 1861, 1862, 0, 0, 0, 1862, 1862, 1862, 0, 0, 0, 0, 1862, 1863, 0, 0, 0, 1863, 1863, 1863, 0, 0, 0, 0, 1863, 1864, 0, 0, 0, 1864, 1864, 1864, 0, 0, 0, 0, 1864, 1865, 0, 0, 0, 1865, 1865, 1865, 0, 0, 0, 0, 1865, 1866, 0, 0, 0, 1866, 1866, 1866, 0, 0, 0, 0, 1866, 1867, 0, 0, 0, 1867, 1867, 1867, 0, 0, 0, 0, 1867, 1868, 0, 0, 0, 1868, 1868, 1868, 0, 0, 0, 0, 1868, 1869, 0, 0, 0, 1869, 1869, 1869, 0, 0, 0, 0, 1869, 1870, 0, 0, 0, 1870, 1870, 1870, 0, 0, 0, 0, 1870, 1871, 0, 0, 0, 1871, 1871, 1871, 0, 0, 0, 0, 1871, 1872, 0, 0, 0, 1872, 1872, 1872, 0, 0, 0, 0, 1872, 1873, 0, 0, 0, 1873, 1873, 1873, 0, 0, 0, 0, 1873, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 0, 1875, 1875, 1875, 0, 1875, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 0, 1876, 1876, 0, 0, 1876, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 0, 1877, 1877, 0, 1877, 1877, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 0, 1878, 1878, 0, 1878, 1878, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 0, 1879, 1879, 1879, 0, 1879, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 0, 1880, 1880, 1880, 1880, 1880, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 0, 1881, 1881, 0, 1881, 1881, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 0, 1882, 1882, 0, 0, 1882, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 0, 1884, 1884, 1884, 0, 1884, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 0, 1886, 1886, 1886, 1886, 1886, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 0, 1887, 1887, 0, 1887, 1887, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 0, 1888, 1888, 1888, 0, 1888, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 0, 1889, 1889, 1889, 1889, 1889, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 0, 1892, 1892, 1892, 0, 1892, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 0, 1896, 1896, 0, 1896, 1896, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 0, 1897, 1897, 1897, 0, 1897, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 0, 1898, 1898, 1898, 1898, 1898, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 0, 1901, 1901, 1901, 0, 1901, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1903, 1903, 1903, 1905, 0, 0, 0, 1905, 1905, 0, 1905, 0, 0, 0, 1905, 1906, 1906, 1906, 1907, 1907, 1907, 1907, 0, 0, 0, 0, 1907, 1908, 1908, 1908, 1909, 1909, 1909, 1910, 1910, 1910, 1911, 1911, 1911, 1912, 0, 1912, 1912, 1912, 1913, 0, 0, 0, 1913, 1913, 1913, 0, 0, 0, 1913, 1913, 0, 1913, 1914, 0, 1914, 1914, 1914, 1915, 1915, 1915, 1916, 1916, 1916, 1917, 1917, 1917, 1918, 0, 0, 0, 1918, 1918, 1918, 0, 0, 0, 0, 1918, 1919, 0, 0, 0, 1919, 1919, 1919, 0, 0, 0, 0, 1919, 1920, 0, 0, 0, 1920, 1920, 1920, 0, 0, 0, 0, 1920, 1921, 0, 0, 0, 1921, 1921, 1921, 0, 0, 0, 0, 1921, 1922, 0, 0, 0, 1922, 1922, 1922, 0, 0, 0, 0, 1922, 1923, 0, 0, 0, 1923, 1923, 1923, 0, 0, 0, 0, 1923, 1924, 0, 0, 0, 1924, 1924, 1924, 0, 0, 0, 0, 1924, 1925, 0, 0, 0, 1925, 1925, 1925, 0, 0, 0, 0, 1925, 1926, 0, 0, 0, 1926, 1926, 1926, 0, 0, 0, 0, 1926, 1927, 0, 0, 0, 1927, 1927, 1927, 0, 0, 0, 0, 1927, 1928, 0, 0, 0, 1928, 1928, 1928, 0, 0, 0, 0, 1928, 1929, 0, 0, 0, 1929, 1929, 1929, 0, 0, 0, 0, 1929, 1930, 0, 0, 0, 1930, 1930, 1930, 0, 0, 0, 0, 1930, 1931, 0, 0, 0, 1931, 1931, 1931, 0, 0, 0, 0, 1931, 1932, 0, 0, 0, 1932, 1932, 1932, 0, 0, 0, 0, 1932, 1933, 0, 0, 0, 1933, 1933, 1933, 0, 0, 0, 0, 1933, 1934, 0, 0, 0, 1934, 1934, 1934, 0, 0, 0, 0, 1934, 1935, 0, 0, 0, 1935, 1935, 1935, 0, 0, 0, 0, 1935, 1936, 0, 0, 0, 1936, 1936, 1936, 0, 0, 0, 0, 1936, 1937, 0, 0, 0, 1937, 1937, 1937, 0, 0, 0, 0, 1937, 1938, 0, 0, 0, 1938, 1938, 1938, 0, 0, 0, 0, 1938, 1939, 0, 0, 0, 1939, 1939, 1939, 0, 0, 0, 0, 1939, 1940, 0, 0, 0, 1940, 1940, 1940, 0, 0, 0, 0, 1940, 1941, 0, 0, 0, 1941, 1941, 1941, 0, 0, 0, 0, 1941, 1942, 0, 0, 0, 1942, 1942, 1942, 0, 0, 0, 0, 1942, 1943, 0, 0, 0, 1943, 1943, 1943, 0, 0, 0, 0, 1943, 1944, 0, 0, 0, 1944, 1944, 1944, 0, 0, 0, 0, 1944, 1945, 0, 0, 0, 1945, 1945, 1945, 0, 0, 0, 0, 1945, 1946, 0, 0, 0, 1946, 1946, 1946, 0, 0, 0, 0, 1946, 1947, 0, 0, 0, 1947, 1947, 1947, 0, 0, 0, 0, 1947, 1948, 0, 0, 0, 1948, 1948, 1948, 0, 0, 0, 0, 1948, 1949, 0, 0, 0, 1949, 1949, 1949, 0, 0, 0, 0, 1949, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 0, 1950, 1950, 1950, 0, 1950, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 0, 1951, 1951, 0, 1951, 1951, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 0, 1952, 1952, 1952, 1952, 1952, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 0, 1953, 1953, 1953, 0, 1953, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 0, 1954, 1954, 1954, 1954, 1954, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 0, 1955, 1955, 0, 1955, 1955, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 0, 1958, 1958, 1958, 0, 1958, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 0, 1960, 1960, 0, 1960, 1960, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 0, 1961, 1961, 0, 1961, 1961, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 0, 1962, 1962, 1962, 0, 1962, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 0, 1963, 1963, 1963, 1963, 1963, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 0, 1965, 1965, 1965, 0, 1965, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 0, 1968, 1968, 0, 1968, 1968, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 0, 1969, 1969, 1969, 0, 1969, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 0, 1970, 1970, 1970, 1970, 1970, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 0, 1973, 1973, 1973, 0, 1973, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 0, 1975, 1975, 0, 1975, 1975, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 0, 1976, 1976, 0, 1976, 1976, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 0, 1977, 1977, 1977, 0, 1977, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 0, 1978, 1978, 1978, 1978, 1978, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 0, 1980, 1980, 1980, 0, 1980, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 0, 1984, 1984, 1984, 0, 1984, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 0, 1985, 1986, 0, 0, 0, 1986, 1986, 0, 0, 0, 0, 0, 1986, 1987, 1987, 1987, 1988, 1988, 1988, 1989, 1989, 1989, 1993, 1993, 1993, 1994, 1994, 1994, 1997, 0, 0, 0, 1997, 1997, 1997, 0, 0, 0, 0, 1997, 1998, 0, 0, 0, 1998, 1998, 1998, 0, 0, 0, 0, 1998, 1999, 0, 0, 0, 1999, 1999, 1999, 0, 0, 0, 0, 1999, 2000, 0, 0, 0, 2000, 2000, 2000, 0, 0, 0, 0, 2000, 2001, 0, 0, 0, 2001, 2001, 2001, 0, 0, 0, 0, 2001, 2002, 0, 0, 0, 2002, 2002, 2002, 0, 0, 0, 0, 2002, 2003, 0, 0, 0, 2003, 2003, 2003, 0, 0, 0, 0, 2003, 2004, 0, 0, 0, 2004, 2004, 2004, 0, 0, 0, 0, 2004, 2005, 0, 0, 0, 2005, 2005, 2005, 0, 0, 0, 0, 2005, 2006, 0, 0, 0, 2006, 2006, 2006, 0, 0, 0, 0, 2006, 2007, 0, 0, 0, 2007, 2007, 2007, 0, 0, 0, 0, 2007, 2008, 0, 0, 0, 2008, 2008, 2008, 0, 0, 0, 0, 2008, 2009, 0, 0, 0, 2009, 2009, 2009, 0, 0, 0, 0, 2009, 2010, 0, 0, 0, 2010, 2010, 2010, 0, 0, 0, 0, 2010, 2011, 0, 0, 0, 2011, 2011, 2011, 0, 0, 0, 0, 2011, 2012, 0, 0, 0, 2012, 2012, 2012, 0, 0, 0, 0, 2012, 2013, 0, 0, 0, 2013, 2013, 2013, 0, 0, 0, 0, 2013, 2014, 0, 0, 0, 2014, 2014, 2014, 0, 0, 0, 0, 2014, 2015, 0, 0, 0, 2015, 2015, 2015, 0, 0, 0, 0, 2015, 2016, 0, 0, 0, 2016, 2016, 2016, 0, 0, 0, 0, 2016, 2017, 0, 0, 0, 2017, 2017, 2017, 0, 0, 0, 0, 2017, 2018, 0, 0, 0, 2018, 2018, 2018, 0, 0, 0, 0, 2018, 2019, 0, 0, 0, 2019, 2019, 2019, 0, 0, 0, 0, 2019, 2020, 0, 0, 0, 2020, 2020, 2020, 0, 0, 0, 0, 2020, 2021, 0, 0, 0, 2021, 2021, 2021, 0, 0, 0, 0, 2021, 2022, 0, 0, 0, 2022, 2022, 2022, 0, 0, 0, 0, 2022, 2023, 0, 0, 0, 2023, 2023, 2023, 0, 0, 0, 0, 2023, 2024, 0, 0, 0, 2024, 2024, 2024, 0, 0, 0, 0, 2024, 2025, 0, 0, 0, 2025, 2025, 2025, 0, 0, 0, 0, 2025, 2026, 0, 0, 0, 2026, 2026, 2026, 0, 0, 0, 0, 2026, 2027, 0, 0, 0, 2027, 2027, 2027, 0, 0, 0, 0, 2027, 2028, 0, 0, 0, 2028, 2028, 2028, 0, 0, 0, 0, 2028, 2029, 0, 0, 0, 2029, 2029, 2029, 0, 0, 0, 0, 2029, 2030, 0, 0, 0, 2030, 2030, 2030, 0, 0, 0, 0, 2030, 2031, 0, 0, 0, 2031, 2031, 2031, 0, 0, 0, 0, 2031, 2032, 0, 0, 0, 2032, 2032, 2032, 0, 0, 0, 0, 2032, 2033, 0, 0, 0, 2033, 2033, 2033, 0, 0, 0, 0, 2033, 2034, 0, 0, 0, 2034, 2034, 2034, 0, 0, 0, 0, 2034, 2035, 0, 0, 0, 2035, 2035, 2035, 0, 0, 0, 0, 2035, 2036, 0, 0, 0, 2036, 2036, 2036, 0, 0, 0, 0, 2036, 2037, 0, 0, 0, 2037, 2037, 2037, 0, 0, 0, 0, 2037, 2038, 0, 0, 0, 2038, 2038, 2038, 0, 0, 0, 0, 2038, 2039, 0, 0, 0, 2039, 2039, 2039, 0, 0, 0, 0, 2039, 2040, 0, 0, 0, 2040, 2040, 2040, 0, 0, 0, 0, 2040, 2041, 0, 0, 0, 2041, 2041, 2041, 0, 0, 0, 0, 2041, 2042, 0, 0, 0, 2042, 2042, 2042, 0, 0, 0, 0, 2042, 2043, 0, 0, 0, 2043, 2043, 2043, 0, 0, 0, 0, 2043, 2044, 0, 0, 0, 2044, 2044, 2044, 0, 0, 0, 0, 2044, 2045, 0, 0, 0, 2045, 2045, 2045, 0, 0, 0, 0, 2045, 2046, 0, 0, 0, 2046, 2046, 2046, 0, 0, 0, 0, 2046, 2047, 0, 0, 0, 2047, 2047, 2047, 0, 0, 0, 0, 2047, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 0, 2048, 2048, 2048, 2048, 2048, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 0, 2049, 2049, 2049, 2049, 2049, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 0, 2050, 2050, 2050, 0, 2050, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 0, 2051, 2051, 2051, 2051, 2051, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 0, 2054, 2054, 2054, 0, 2054, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 0, 2055, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 0, 2056, 2056, 0, 2056, 2056, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 0, 2057, 2057, 2057, 2057, 2057, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 0, 2058, 2058, 2058, 0, 2058, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 0, 2059, 2059, 2059, 2059, 2059, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 0, 2062, 2062, 2062, 0, 2062, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 0, 2064, 2064, 0, 2064, 2064, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 0, 2065, 2065, 0, 2065, 2065, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 0, 2066, 2066, 2066, 0, 2066, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 0, 2067, 2067, 2067, 2067, 2067, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 0, 2069, 2069, 2069, 0, 2069, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 0, 2073, 2073, 2073, 0, 2073, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 0, 2074, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 0, 2075, 2075, 0, 2075, 2075, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 0, 2076, 2076, 2076, 2076, 2076, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 0, 2077, 2077, 2077, 0, 2077, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 0, 2078, 2078, 2078, 2078, 2078, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 0, 2081, 2081, 2081, 0, 2081, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 0, 2084, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 0, 2085, 2085, 2085, 0, 2085, 2086, 2086, 2086, 2087, 0, 0, 0, 2087, 2087, 0, 0, 0, 0, 0, 2087, 2088, 0, 0, 0, 2088, 2088, 0, 0, 0, 0, 0, 2088, 2089, 2089, 2089, 2095, 0, 0, 0, 2095, 2095, 2095, 0, 0, 0, 0, 2095, 2096, 0, 0, 0, 2096, 2096, 2096, 0, 0, 0, 0, 2096, 2097, 0, 0, 0, 2097, 2097, 2097, 0, 0, 0, 0, 2097, 2098, 0, 0, 0, 2098, 2098, 2098, 0, 0, 0, 0, 2098, 2099, 0, 0, 0, 2099, 2099, 2099, 0, 0, 0, 0, 2099, 2100, 0, 0, 0, 2100, 2100, 2100, 0, 0, 0, 0, 2100, 2101, 0, 0, 0, 2101, 2101, 2101, 0, 0, 0, 0, 2101, 2102, 0, 0, 0, 2102, 2102, 2102, 0, 0, 0, 0, 2102, 2103, 0, 0, 0, 2103, 2103, 2103, 0, 0, 0, 0, 2103, 2104, 0, 0, 0, 2104, 2104, 2104, 0, 0, 0, 0, 2104, 2105, 0, 0, 0, 2105, 2105, 2105, 0, 0, 0, 0, 2105, 2106, 0, 0, 0, 2106, 2106, 2106, 0, 0, 0, 0, 2106, 2107, 0, 0, 0, 2107, 2107, 2107, 0, 0, 0, 0, 2107, 2108, 0, 0, 0, 2108, 2108, 2108, 0, 0, 0, 0, 2108, 2109, 0, 0, 0, 2109, 2109, 2109, 0, 0, 0, 0, 2109, 2110, 0, 0, 0, 2110, 2110, 2110, 0, 0, 0, 0, 2110, 2111, 0, 0, 0, 2111, 2111, 2111, 0, 0, 0, 0, 2111, 2112, 0, 0, 0, 2112, 2112, 2112, 0, 0, 0, 0, 2112, 2113, 0, 0, 0, 2113, 2113, 2113, 0, 0, 0, 0, 2113, 2114, 0, 0, 0, 2114, 2114, 2114, 0, 0, 0, 0, 2114, 2115, 0, 0, 0, 2115, 2115, 2115, 0, 0, 0, 0, 2115, 2116, 0, 0, 0, 2116, 2116, 2116, 0, 0, 0, 0, 2116, 2117, 0, 0, 0, 2117, 2117, 2117, 0, 0, 0, 0, 2117, 2118, 0, 0, 0, 2118, 2118, 2118, 0, 0, 0, 0, 2118, 2119, 0, 0, 0, 2119, 2119, 2119, 0, 0, 0, 0, 2119, 2120, 0, 0, 0, 2120, 2120, 2120, 0, 0, 0, 0, 2120, 2121, 0, 0, 0, 2121, 2121, 2121, 0, 0, 0, 0, 2121, 2122, 0, 0, 0, 2122, 2122, 2122, 0, 0, 0, 0, 2122, 2123, 0, 0, 0, 2123, 2123, 2123, 0, 0, 0, 0, 2123, 2124, 0, 0, 0, 2124, 2124, 2124, 0, 0, 0, 0, 2124, 2125, 0, 0, 0, 2125, 2125, 2125, 0, 0, 0, 0, 2125, 2126, 0, 0, 0, 2126, 2126, 2126, 0, 0, 0, 0, 2126, 2127, 0, 0, 0, 2127, 2127, 2127, 0, 0, 0, 0, 2127, 2128, 0, 0, 0, 2128, 2128, 2128, 0, 0, 0, 0, 2128, 2129, 0, 0, 0, 2129, 2129, 2129, 0, 0, 0, 0, 2129, 2130, 0, 0, 0, 2130, 2130, 2130, 0, 0, 0, 0, 2130, 2131, 0, 0, 0, 2131, 2131, 2131, 0, 0, 0, 0, 2131, 2132, 0, 0, 0, 2132, 2132, 2132, 0, 0, 0, 0, 2132, 2133, 0, 0, 0, 2133, 2133, 2133, 0, 0, 0, 0, 2133, 2134, 0, 0, 0, 2134, 2134, 2134, 0, 0, 0, 0, 2134, 2135, 0, 0, 0, 2135, 2135, 2135, 0, 0, 0, 0, 2135, 2136, 0, 0, 0, 2136, 2136, 2136, 0, 0, 0, 0, 2136, 2137, 0, 0, 0, 2137, 2137, 2137, 0, 0, 0, 0, 2137, 2138, 0, 0, 0, 2138, 2138, 2138, 0, 0, 0, 0, 2138, 2139, 0, 0, 0, 2139, 2139, 2139, 0, 0, 0, 0, 2139, 2140, 0, 0, 0, 2140, 2140, 2140, 0, 0, 0, 0, 2140, 2141, 0, 0, 0, 2141, 2141, 2141, 0, 0, 0, 0, 2141, 2142, 0, 0, 0, 2142, 2142, 2142, 0, 0, 0, 0, 2142, 2143, 0, 0, 0, 2143, 2143, 2143, 0, 0, 0, 0, 2143, 2144, 0, 0, 0, 2144, 2144, 2144, 0, 0, 0, 0, 2144, 2145, 0, 0, 0, 2145, 2145, 2145, 0, 0, 0, 0, 2145, 2146, 0, 0, 0, 2146, 2146, 2146, 0, 0, 0, 0, 2146, 2147, 0, 0, 0, 2147, 2147, 2147, 0, 0, 0, 0, 2147, 2148, 0, 0, 0, 2148, 2148, 2148, 0, 0, 0, 0, 2148, 2149, 0, 0, 0, 2149, 2149, 2149, 0, 0, 0, 0, 2149, 2150, 0, 0, 0, 2150, 2150, 2150, 0, 0, 0, 0, 2150, 2151, 0, 0, 0, 2151, 2151, 2151, 0, 0, 0, 0, 2151, 2152, 0, 0, 0, 2152, 2152, 2152, 0, 0, 0, 0, 2152, 2153, 0, 0, 0, 2153, 2153, 2153, 0, 0, 0, 0, 2153, 2154, 0, 0, 0, 2154, 2154, 2154, 0, 0, 0, 0, 2154, 2155, 0, 0, 0, 2155, 2155, 2155, 0, 0, 0, 0, 2155, 2156, 0, 0, 0, 2156, 2156, 2156, 0, 0, 0, 0, 2156, 2157, 0, 0, 0, 2157, 2157, 2157, 0, 0, 0, 0, 2157, 2158, 0, 0, 0, 2158, 2158, 2158, 0, 0, 0, 0, 2158, 2159, 0, 0, 0, 2159, 2159, 2159, 0, 0, 0, 0, 2159, 2160, 0, 0, 0, 2160, 2160, 2160, 0, 0, 0, 0, 2160, 2161, 0, 0, 0, 2161, 2161, 2161, 0, 0, 0, 0, 2161, 2162, 0, 0, 0, 2162, 2162, 2162, 0, 0, 0, 0, 2162, 2163, 0, 0, 0, 2163, 2163, 2163, 0, 0, 0, 0, 2163, 2164, 0, 0, 0, 2164, 2164, 2164, 0, 0, 0, 0, 2164, 2165, 0, 0, 0, 2165, 2165, 2165, 0, 0, 0, 0, 2165, 2166, 0, 0, 0, 2166, 2166, 2166, 0, 0, 0, 0, 2166, 2167, 0, 0, 0, 2167, 2167, 2167, 0, 0, 0, 0, 2167, 2168, 0, 0, 0, 2168, 2168, 2168, 0, 0, 0, 0, 2168, 2169, 0, 0, 0, 2169, 2169, 2169, 0, 0, 0, 0, 2169, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 0, 2170, 2170, 2170, 2170, 2170, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 0, 2171, 2171, 2171, 2171, 2171, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 0, 2172, 2172, 2172, 0, 2172, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 0, 2173, 2173, 2173, 0, 2173, 2174, 2174, 2174, 2174, 2174, 2174, 2174, 2174, 2174, 2174, 2174, 2174, 2174, 2174, 2174, 2175, 2175, 2175, 2175, 2175, 2175, 2175, 2175, 2175, 2175, 2175, 2175, 2175, 0, 2175, 2176, 2176, 2176, 2176, 2176, 2176, 2176, 2176, 2176, 0, 2176, 2176, 2176, 0, 2176, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 0, 2177, 2177, 2177, 2177, 2177, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 0, 2178, 2178, 2178, 2178, 2178, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 0, 2179, 2179, 2179, 0, 2179, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 0, 2180, 2180, 2180, 2180, 2180, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 0, 2183, 2183, 2183, 0, 2183, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 0, 2184, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 0, 2185, 2185, 0, 2185, 2185, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 0, 2186, 2186, 2186, 2186, 2186, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 0, 2187, 2187, 2187, 0, 2187, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 0, 2188, 2188, 2188, 2188, 2188, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 0, 2191, 2191, 2191, 0, 2191, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 0, 2194, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 0, 2195, 2195, 2195, 0, 2195, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 0, 2196, 2196, 2196, 2196, 2196, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 0, 2197, 2197, 2197, 2197, 2197, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 0, 2198, 2198, 2198, 0, 2198, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 0, 2199, 2199, 2199, 2199, 2199, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2202, 2202, 2202, 2202, 2202, 2202, 2202, 2202, 2202, 0, 2202, 2202, 2202, 0, 2202, 2203, 2203, 2203, 2203, 2203, 2203, 2203, 2203, 2203, 2203, 2203, 2203, 2203, 0, 2203, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 0, 2204, 2206, 2206, 2206, 2212, 0, 0, 0, 2212, 2212, 2212, 0, 0, 0, 0, 2212, 2213, 0, 0, 0, 2213, 2213, 2213, 0, 0, 0, 0, 2213, 2214, 0, 0, 0, 2214, 2214, 2214, 0, 0, 0, 0, 2214, 2215, 0, 0, 0, 2215, 2215, 2215, 0, 0, 0, 0, 2215, 2216, 0, 0, 0, 2216, 2216, 2216, 0, 0, 0, 0, 2216, 2217, 0, 0, 0, 2217, 2217, 2217, 0, 0, 0, 0, 2217, 2218, 0, 0, 0, 2218, 2218, 2218, 0, 0, 0, 0, 2218, 2219, 0, 0, 0, 2219, 2219, 2219, 0, 0, 0, 0, 2219, 2220, 0, 0, 0, 2220, 2220, 2220, 0, 0, 0, 0, 2220, 2221, 0, 0, 0, 2221, 2221, 2221, 0, 0, 0, 0, 2221, 2222, 0, 0, 0, 2222, 2222, 2222, 0, 0, 0, 0, 2222, 2223, 0, 0, 0, 2223, 2223, 2223, 0, 0, 0, 0, 2223, 2224, 0, 0, 0, 2224, 2224, 2224, 0, 0, 0, 0, 2224, 2225, 0, 0, 0, 2225, 2225, 2225, 0, 0, 0, 0, 2225, 2226, 0, 0, 0, 2226, 2226, 2226, 0, 0, 0, 0, 2226, 2227, 0, 0, 0, 2227, 2227, 2227, 0, 0, 0, 0, 2227, 2228, 0, 0, 0, 2228, 2228, 2228, 0, 0, 0, 0, 2228, 2229, 0, 0, 0, 2229, 2229, 2229, 0, 0, 0, 0, 2229, 2230, 0, 0, 0, 2230, 2230, 2230, 0, 0, 0, 0, 2230, 2231, 0, 0, 0, 2231, 2231, 2231, 0, 0, 0, 0, 2231, 2232, 0, 0, 0, 2232, 2232, 2232, 0, 0, 0, 0, 2232, 2233, 0, 0, 0, 2233, 2233, 2233, 0, 0, 0, 0, 2233, 2234, 0, 0, 0, 2234, 2234, 2234, 0, 0, 0, 0, 2234, 2235, 0, 0, 0, 2235, 2235, 2235, 0, 0, 0, 0, 2235, 2236, 0, 0, 0, 2236, 2236, 2236, 0, 0, 0, 0, 2236, 2237, 0, 0, 0, 2237, 2237, 2237, 0, 0, 0, 0, 2237, 2238, 0, 0, 0, 2238, 2238, 2238, 0, 0, 0, 0, 2238, 2239, 0, 0, 0, 2239, 2239, 2239, 0, 0, 0, 0, 2239, 2240, 0, 0, 0, 2240, 2240, 2240, 0, 0, 0, 0, 2240, 2241, 0, 0, 0, 2241, 2241, 2241, 0, 0, 0, 0, 2241, 2242, 0, 0, 0, 2242, 2242, 2242, 0, 0, 0, 0, 2242, 2243, 0, 0, 0, 2243, 2243, 2243, 0, 0, 0, 0, 2243, 2244, 0, 0, 0, 2244, 2244, 2244, 0, 0, 0, 0, 2244, 2245, 0, 0, 0, 2245, 2245, 2245, 0, 0, 0, 0, 2245, 2246, 0, 0, 0, 2246, 2246, 2246, 0, 0, 0, 0, 2246, 2247, 0, 0, 0, 2247, 2247, 2247, 0, 0, 0, 0, 2247, 2248, 0, 0, 0, 2248, 2248, 2248, 0, 0, 0, 0, 2248, 2249, 0, 0, 0, 2249, 2249, 2249, 0, 0, 0, 0, 2249, 2250, 0, 0, 0, 2250, 2250, 2250, 0, 0, 0, 0, 2250, 2251, 0, 0, 0, 2251, 2251, 2251, 0, 0, 0, 0, 2251, 2252, 0, 0, 0, 2252, 2252, 2252, 0, 0, 0, 0, 2252, 2253, 0, 0, 0, 2253, 2253, 2253, 0, 0, 0, 0, 2253, 2254, 0, 0, 0, 2254, 2254, 2254, 0, 0, 0, 0, 2254, 2255, 0, 0, 0, 2255, 2255, 2255, 0, 0, 0, 0, 2255, 2256, 0, 0, 0, 2256, 2256, 2256, 0, 0, 0, 0, 2256, 2257, 0, 0, 0, 2257, 2257, 2257, 0, 0, 0, 0, 2257, 2258, 0, 0, 0, 2258, 2258, 2258, 0, 0, 0, 0, 2258, 2259, 0, 0, 0, 2259, 2259, 2259, 0, 0, 0, 0, 2259, 2260, 0, 0, 0, 2260, 2260, 2260, 0, 0, 0, 0, 2260, 2261, 0, 0, 0, 2261, 2261, 2261, 0, 0, 0, 0, 2261, 2262, 0, 0, 0, 2262, 2262, 2262, 0, 0, 0, 0, 2262, 2263, 0, 0, 0, 2263, 2263, 2263, 0, 0, 0, 0, 2263, 2264, 0, 0, 0, 2264, 2264, 2264, 0, 0, 0, 0, 2264, 2265, 0, 0, 0, 2265, 2265, 2265, 0, 0, 0, 0, 2265, 2266, 0, 0, 0, 2266, 2266, 2266, 0, 0, 0, 0, 2266, 2267, 0, 0, 0, 2267, 2267, 2267, 0, 0, 0, 0, 2267, 2268, 0, 0, 0, 2268, 2268, 2268, 0, 0, 0, 0, 2268, 2269, 0, 0, 0, 2269, 2269, 2269, 0, 0, 0, 0, 2269, 2270, 0, 0, 0, 2270, 2270, 2270, 0, 0, 0, 0, 2270, 2271, 0, 0, 0, 2271, 2271, 2271, 0, 0, 0, 0, 2271, 2272, 0, 0, 0, 2272, 2272, 2272, 0, 0, 0, 0, 2272, 2273, 0, 0, 0, 2273, 2273, 2273, 0, 0, 0, 0, 2273, 2274, 0, 0, 0, 2274, 2274, 2274, 0, 0, 0, 0, 2274, 2275, 0, 0, 0, 2275, 2275, 2275, 0, 0, 0, 0, 2275, 2276, 0, 0, 0, 2276, 2276, 2276, 0, 0, 0, 0, 2276, 2277, 0, 0, 0, 2277, 2277, 2277, 0, 0, 0, 0, 2277, 2278, 0, 0, 0, 2278, 2278, 2278, 0, 0, 0, 0, 2278, 2279, 0, 0, 0, 2279, 2279, 2279, 0, 0, 0, 0, 2279, 2280, 0, 0, 0, 2280, 2280, 2280, 0, 0, 0, 0, 2280, 2281, 0, 0, 0, 2281, 2281, 2281, 0, 0, 0, 0, 2281, 2282, 0, 0, 0, 2282, 2282, 2282, 0, 0, 0, 0, 2282, 2283, 0, 0, 0, 2283, 2283, 2283, 0, 0, 0, 0, 2283, 2284, 0, 0, 0, 2284, 2284, 2284, 0, 0, 0, 0, 2284, 2285, 0, 0, 0, 2285, 2285, 2285, 0, 0, 0, 0, 2285, 2286, 0, 0, 0, 2286, 2286, 2286, 0, 0, 0, 0, 2286, 2287, 0, 0, 0, 2287, 2287, 2287, 0, 0, 0, 0, 2287, 2288, 0, 0, 0, 2288, 2288, 2288, 0, 0, 0, 0, 2288, 2289, 0, 0, 0, 2289, 2289, 2289, 0, 0, 0, 0, 2289, 2290, 0, 0, 0, 2290, 2290, 2290, 0, 0, 0, 0, 2290, 2291, 0, 0, 0, 2291, 2291, 2291, 0, 0, 0, 0, 2291, 2292, 0, 0, 0, 2292, 2292, 2292, 0, 0, 0, 0, 2292, 2293, 0, 0, 0, 2293, 2293, 2293, 0, 0, 0, 0, 2293, 2294, 0, 0, 0, 2294, 2294, 2294, 0, 0, 0, 0, 2294, 2295, 0, 0, 0, 2295, 2295, 2295, 0, 0, 0, 0, 2295, 2296, 0, 0, 0, 2296, 2296, 2296, 0, 0, 0, 0, 2296, 2297, 0, 0, 0, 2297, 2297, 2297, 0, 0, 0, 0, 2297, 2298, 0, 0, 0, 2298, 2298, 2298, 0, 0, 0, 0, 2298, 2299, 0, 0, 0, 2299, 2299, 2299, 0, 0, 0, 0, 2299, 2300, 0, 0, 0, 2300, 2300, 2300, 0, 0, 0, 0, 2300, 2301, 0, 0, 0, 2301, 2301, 2301, 0, 0, 0, 0, 2301, 2302, 0, 0, 0, 2302, 2302, 2302, 0, 0, 0, 0, 2302, 2303, 0, 0, 0, 2303, 2303, 2303, 0, 0, 0, 0, 2303, 2304, 0, 0, 0, 2304, 2304, 2304, 0, 0, 0, 0, 2304, 2305, 0, 0, 0, 2305, 2305, 2305, 0, 0, 0, 0, 2305, 2306, 0, 0, 0, 2306, 2306, 2306, 0, 0, 0, 0, 2306, 2307, 0, 0, 0, 2307, 2307, 2307, 0, 0, 0, 0, 2307, 2308, 0, 0, 0, 2308, 2308, 2308, 0, 0, 0, 0, 2308, 2309, 0, 0, 0, 2309, 2309, 2309, 0, 0, 0, 0, 2309, 2310, 0, 0, 0, 2310, 2310, 2310, 0, 0, 0, 0, 2310, 2311, 0, 0, 0, 2311, 2311, 2311, 0, 0, 0, 0, 2311, 2312, 0, 0, 0, 2312, 2312, 2312, 0, 0, 0, 0, 2312, 2313, 0, 0, 0, 2313, 2313, 2313, 0, 0, 0, 0, 2313, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 0, 2314, 2314, 2314, 2314, 2314, 2315, 2315, 2315, 2315, 2315, 2315, 2315, 2315, 2315, 0, 2315, 2315, 2315, 0, 2315, 2316, 2316, 2316, 2316, 2316, 2316, 2316, 2316, 2316, 0, 2316, 2316, 2316, 0, 2316, 2317, 2317, 2317, 2317, 2317, 2317, 2317, 2317, 2317, 2317, 2317, 2317, 2317, 0, 2317, 2318, 2318, 2318, 2318, 2318, 2318, 2318, 2318, 2318, 0, 2318, 2318, 2318, 2318, 2318, 2319, 2319, 2319, 2319, 2319, 2319, 2319, 2319, 2319, 0, 2319, 2319, 2319, 2319, 2319, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 0, 2320, 2320, 2320, 0, 2320, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 0, 2321, 2321, 2321, 0, 2321, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 0, 2323, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 0, 2324, 2324, 2324, 0, 2324, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 0, 2325, 2325, 2325, 2325, 2325, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 0, 2326, 2326, 2326, 2326, 2326, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 0, 2327, 2327, 2327, 0, 2327, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 0, 2328, 2328, 2328, 2328, 2328, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 0, 2331, 2331, 2331, 0, 2331, 2332, 2332, 2332, 2332, 2332, 2332, 2332, 2332, 2332, 2332, 2332, 2332, 2332, 0, 2332, 2333, 2333, 2333, 2333, 2333, 2333, 2333, 2333, 2333, 2333, 2333, 2333, 2333, 0, 2333, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 0, 2334, 2334, 2334, 2334, 2334, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 0, 2335, 2335, 2335, 2335, 2335, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 0, 2336, 2336, 2336, 0, 2336, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 0, 2337, 2337, 2337, 0, 2337, 2338, 2338, 2338, 2338, 2338, 2338, 2338, 2338, 2338, 2338, 2338, 2338, 2338, 2338, 2338, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 0, 2339, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 0, 2340, 2340, 2340, 0, 2340, 2341, 2341, 2341, 2342, 2342, 2342, 2348, 0, 0, 0, 2348, 2348, 2348, 0, 0, 0, 0, 2348, 2349, 0, 0, 0, 2349, 2349, 2349, 0, 0, 0, 0, 2349, 2350, 0, 0, 0, 2350, 2350, 2350, 0, 0, 0, 0, 2350, 2351, 0, 0, 0, 2351, 2351, 2351, 0, 0, 0, 0, 2351, 2352, 0, 0, 0, 2352, 2352, 2352, 0, 0, 0, 0, 2352, 2353, 0, 0, 0, 2353, 2353, 2353, 0, 0, 0, 0, 2353, 2354, 0, 0, 0, 2354, 2354, 2354, 0, 0, 0, 0, 2354, 2355, 0, 0, 0, 2355, 2355, 2355, 0, 0, 0, 0, 2355, 2356, 0, 0, 0, 2356, 2356, 2356, 0, 0, 0, 0, 2356, 2357, 0, 0, 0, 2357, 2357, 2357, 0, 0, 0, 0, 2357, 2358, 0, 0, 0, 2358, 2358, 2358, 0, 0, 0, 0, 2358, 2359, 0, 0, 0, 2359, 2359, 2359, 0, 0, 0, 0, 2359, 2360, 0, 0, 0, 2360, 2360, 2360, 0, 0, 0, 0, 2360, 2361, 0, 0, 0, 2361, 2361, 2361, 0, 0, 0, 0, 2361, 2362, 0, 0, 0, 2362, 2362, 2362, 0, 0, 0, 0, 2362, 2363, 0, 0, 0, 2363, 2363, 2363, 0, 0, 0, 0, 2363, 2364, 0, 0, 0, 2364, 2364, 2364, 0, 0, 0, 0, 2364, 2365, 0, 0, 0, 2365, 2365, 2365, 0, 0, 0, 0, 2365, 2366, 0, 0, 0, 2366, 2366, 2366, 0, 0, 0, 0, 2366, 2367, 0, 0, 0, 2367, 2367, 2367, 0, 0, 0, 0, 2367, 2368, 0, 0, 0, 2368, 2368, 2368, 0, 0, 0, 0, 2368, 2369, 0, 0, 0, 2369, 2369, 2369, 0, 0, 0, 0, 2369, 2370, 0, 0, 0, 2370, 2370, 2370, 0, 0, 0, 0, 2370, 2371, 0, 0, 0, 2371, 2371, 2371, 0, 0, 0, 0, 2371, 2372, 0, 0, 0, 2372, 2372, 2372, 0, 0, 0, 0, 2372, 2373, 0, 0, 0, 2373, 2373, 2373, 0, 0, 0, 0, 2373, 2374, 0, 0, 0, 2374, 2374, 2374, 0, 0, 0, 0, 2374, 2375, 0, 0, 0, 2375, 2375, 2375, 0, 0, 0, 0, 2375, 2376, 0, 0, 0, 2376, 2376, 2376, 0, 0, 0, 0, 2376, 2377, 0, 0, 0, 2377, 2377, 2377, 0, 0, 0, 0, 2377, 2378, 0, 0, 0, 2378, 2378, 2378, 0, 0, 0, 0, 2378, 2379, 0, 0, 0, 2379, 2379, 2379, 0, 0, 0, 0, 2379, 2380, 0, 0, 0, 2380, 2380, 2380, 0, 0, 0, 0, 2380, 2381, 0, 0, 0, 2381, 2381, 2381, 0, 0, 0, 0, 2381, 2382, 0, 0, 0, 2382, 2382, 2382, 0, 0, 0, 0, 2382, 2383, 0, 0, 0, 2383, 2383, 2383, 0, 0, 0, 0, 2383, 2384, 0, 0, 0, 2384, 2384, 2384, 0, 0, 0, 0, 2384, 2385, 0, 0, 0, 2385, 2385, 2385, 0, 0, 0, 0, 2385, 2386, 0, 0, 0, 2386, 2386, 2386, 0, 0, 0, 0, 2386, 2387, 0, 0, 0, 2387, 2387, 2387, 0, 0, 0, 0, 2387, 2388, 0, 0, 0, 2388, 2388, 2388, 0, 0, 0, 0, 2388, 2389, 0, 0, 0, 2389, 2389, 2389, 0, 0, 0, 0, 2389, 2390, 0, 0, 0, 2390, 2390, 2390, 0, 0, 0, 0, 2390, 2391, 0, 0, 0, 2391, 2391, 2391, 0, 0, 0, 0, 2391, 2392, 0, 0, 0, 2392, 2392, 2392, 0, 0, 0, 0, 2392, 2393, 0, 0, 0, 2393, 2393, 2393, 0, 0, 0, 0, 2393, 2394, 0, 0, 0, 2394, 2394, 2394, 0, 0, 0, 0, 2394, 2395, 0, 0, 0, 2395, 2395, 2395, 0, 0, 0, 0, 2395, 2396, 0, 0, 0, 2396, 2396, 2396, 0, 0, 0, 0, 2396, 2397, 0, 0, 0, 2397, 2397, 2397, 0, 0, 0, 0, 2397, 2398, 0, 0, 0, 2398, 2398, 2398, 0, 0, 0, 0, 2398, 2399, 0, 0, 0, 2399, 2399, 2399, 0, 0, 0, 0, 2399, 2400, 0, 0, 0, 2400, 2400, 2400, 0, 0, 0, 0, 2400, 2401, 0, 0, 0, 2401, 2401, 2401, 0, 0, 0, 0, 2401, 2402, 0, 0, 0, 2402, 2402, 2402, 0, 0, 0, 0, 2402, 2403, 0, 0, 0, 2403, 2403, 2403, 0, 0, 0, 0, 2403, 2404, 0, 0, 0, 2404, 2404, 2404, 0, 0, 0, 0, 2404, 2405, 0, 0, 0, 2405, 2405, 2405, 0, 0, 0, 0, 2405, 2406, 0, 0, 0, 2406, 2406, 2406, 0, 0, 0, 0, 2406, 2407, 0, 0, 0, 2407, 2407, 2407, 0, 0, 0, 0, 2407, 2408, 0, 0, 0, 2408, 2408, 2408, 0, 0, 0, 0, 2408, 2409, 0, 0, 0, 2409, 2409, 2409, 0, 0, 0, 0, 2409, 2410, 0, 0, 0, 2410, 2410, 2410, 0, 0, 0, 0, 2410, 2411, 0, 0, 0, 2411, 2411, 2411, 0, 0, 0, 0, 2411, 2412, 0, 0, 0, 2412, 2412, 2412, 0, 0, 0, 0, 2412, 2413, 0, 0, 0, 2413, 2413, 2413, 0, 0, 0, 0, 2413, 2414, 0, 0, 0, 2414, 2414, 2414, 0, 0, 0, 0, 2414, 2415, 0, 0, 0, 2415, 2415, 2415, 0, 0, 0, 0, 2415, 2416, 0, 0, 0, 2416, 2416, 2416, 0, 0, 0, 0, 2416, 2417, 0, 0, 0, 2417, 2417, 2417, 0, 0, 0, 0, 2417, 2418, 0, 0, 0, 2418, 2418, 2418, 0, 0, 0, 0, 2418, 2419, 0, 0, 0, 2419, 2419, 2419, 0, 0, 0, 0, 2419, 2420, 0, 0, 0, 2420, 2420, 2420, 0, 0, 0, 0, 2420, 2421, 0, 0, 0, 2421, 2421, 2421, 0, 0, 0, 0, 2421, 2422, 0, 0, 0, 2422, 2422, 2422, 0, 0, 0, 0, 2422, 2423, 0, 0, 0, 2423, 2423, 2423, 0, 0, 0, 0, 2423, 2424, 0, 0, 0, 2424, 2424, 2424, 0, 0, 0, 0, 2424, 2425, 0, 0, 0, 2425, 2425, 2425, 0, 0, 0, 0, 2425, 2426, 0, 0, 0, 2426, 2426, 2426, 0, 0, 0, 0, 2426, 2427, 0, 0, 0, 2427, 2427, 2427, 0, 0, 0, 0, 2427, 2428, 0, 0, 0, 2428, 2428, 2428, 0, 0, 0, 0, 2428, 2429, 0, 0, 0, 2429, 2429, 2429, 0, 0, 0, 0, 2429, 2430, 0, 0, 0, 2430, 2430, 2430, 0, 0, 0, 0, 2430, 2431, 0, 0, 0, 2431, 2431, 2431, 0, 0, 0, 0, 2431, 2432, 0, 0, 0, 2432, 2432, 2432, 0, 0, 0, 0, 2432, 2433, 0, 0, 0, 2433, 2433, 2433, 0, 0, 0, 0, 2433, 2434, 0, 0, 0, 2434, 2434, 2434, 0, 0, 0, 0, 2434, 2435, 0, 0, 0, 2435, 2435, 2435, 0, 0, 0, 0, 2435, 2436, 0, 0, 0, 2436, 2436, 2436, 0, 0, 0, 0, 2436, 2437, 0, 0, 0, 2437, 2437, 2437, 0, 0, 0, 0, 2437, 2438, 0, 0, 0, 2438, 2438, 2438, 0, 0, 0, 0, 2438, 2439, 0, 0, 0, 2439, 2439, 2439, 0, 0, 0, 0, 2439, 2440, 0, 0, 0, 2440, 2440, 2440, 0, 0, 0, 0, 2440, 2441, 0, 0, 0, 2441, 2441, 2441, 0, 0, 0, 0, 2441, 2442, 0, 0, 0, 2442, 2442, 2442, 0, 0, 0, 0, 2442, 2443, 0, 0, 0, 2443, 2443, 2443, 0, 0, 0, 0, 2443, 2444, 0, 0, 0, 2444, 2444, 2444, 0, 0, 0, 0, 2444, 2445, 0, 0, 0, 2445, 2445, 2445, 0, 0, 0, 0, 2445, 2446, 0, 0, 0, 2446, 2446, 2446, 0, 0, 0, 0, 2446, 2447, 0, 0, 0, 2447, 2447, 2447, 0, 0, 0, 0, 2447, 2448, 0, 0, 0, 2448, 2448, 2448, 0, 0, 0, 0, 2448, 2449, 0, 0, 0, 2449, 2449, 2449, 0, 0, 0, 0, 2449, 2450, 0, 0, 0, 2450, 2450, 2450, 0, 0, 0, 0, 2450, 2451, 0, 0, 0, 2451, 2451, 2451, 0, 0, 0, 0, 2451, 2452, 0, 0, 0, 2452, 2452, 2452, 0, 0, 0, 0, 2452, 2453, 0, 0, 0, 2453, 2453, 2453, 0, 0, 0, 0, 2453, 2454, 0, 0, 0, 2454, 2454, 2454, 0, 0, 0, 0, 2454, 2455, 0, 0, 0, 2455, 2455, 2455, 0, 0, 0, 0, 2455, 2456, 0, 0, 0, 2456, 2456, 2456, 0, 0, 0, 0, 2456, 2457, 0, 0, 0, 2457, 2457, 2457, 0, 0, 0, 0, 2457, 2458, 0, 0, 0, 2458, 2458, 2458, 0, 0, 0, 0, 2458, 2459, 0, 0, 0, 2459, 2459, 2459, 0, 0, 0, 0, 2459, 2460, 0, 0, 0, 2460, 2460, 2460, 0, 0, 0, 0, 2460, 2461, 0, 0, 0, 2461, 2461, 2461, 0, 0, 0, 0, 2461, 2462, 0, 0, 0, 2462, 2462, 2462, 0, 0, 0, 0, 2462, 2463, 0, 0, 0, 2463, 2463, 2463, 0, 0, 0, 0, 2463, 2464, 0, 0, 0, 2464, 2464, 2464, 0, 0, 0, 0, 2464, 2465, 0, 0, 0, 2465, 2465, 2465, 0, 0, 0, 0, 2465, 2466, 0, 0, 0, 2466, 2466, 2466, 0, 0, 0, 0, 2466, 2467, 0, 0, 0, 2467, 2467, 2467, 0, 0, 0, 0, 2467, 2468, 0, 0, 0, 2468, 2468, 2468, 0, 0, 0, 0, 2468, 2469, 0, 0, 0, 2469, 2469, 2469, 0, 0, 0, 0, 2469, 2470, 0, 0, 0, 2470, 2470, 2470, 0, 0, 0, 0, 2470, 2471, 0, 0, 0, 2471, 2471, 2471, 0, 0, 0, 0, 2471, 2472, 0, 0, 0, 2472, 2472, 2472, 0, 0, 0, 0, 2472, 2473, 0, 0, 0, 2473, 2473, 2473, 0, 0, 0, 0, 2473, 2474, 0, 0, 0, 2474, 2474, 2474, 0, 0, 0, 0, 2474, 2475, 0, 0, 0, 2475, 2475, 2475, 0, 0, 0, 0, 2475, 2476, 0, 0, 0, 2476, 2476, 2476, 0, 0, 0, 0, 2476, 2477, 0, 0, 0, 2477, 2477, 2477, 0, 0, 0, 0, 2477, 2478, 0, 0, 0, 2478, 2478, 2478, 0, 0, 0, 0, 2478, 2479, 0, 0, 0, 2479, 2479, 2479, 0, 0, 0, 0, 2479, 2480, 2480, 2480, 2480, 2480, 2480, 2480, 2480, 2480, 0, 2480, 2480, 2480, 0, 2480, 2481, 2481, 2481, 2481, 2481, 2481, 2481, 2481, 2481, 0, 2481, 2481, 2481, 2481, 2481, 2482, 2482, 2482, 2482, 2482, 2482, 2482, 2482, 2482, 0, 2482, 2482, 2482, 0, 2482, 2483, 2483, 2483, 2483, 2483, 2483, 2483, 2483, 2483, 0, 2483, 2483, 2483, 0, 2483, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 0, 2484, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 0, 2485, 2485, 2485, 2485, 2485, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 0, 2486, 2486, 2486, 2486, 2486, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 0, 2487, 2487, 2487, 0, 2487, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 0, 2488, 2488, 2488, 0, 2488, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2490, 2490, 2490, 2490, 2490, 2490, 2490, 2490, 2490, 2490, 2490, 2490, 2490, 0, 2490, 2491, 2491, 2491, 2491, 2491, 2491, 2491, 2491, 2491, 0, 2491, 2491, 2491, 0, 2491, 2492, 2492, 2492, 2492, 2492, 2492, 2492, 2492, 2492, 0, 2492, 2492, 2492, 2492, 2492, 2493, 2493, 2493, 2493, 2493, 2493, 2493, 2493, 2493, 0, 2493, 2493, 2493, 0, 2493, 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494, 0, 2494, 2494, 2494, 0, 2494, 2495, 2495, 2495, 2495, 2495, 2495, 2495, 2495, 2495, 2495, 2495, 2495, 2495, 0, 2495, 2496, 0, 0, 0, 2496, 2496, 2496, 0, 0, 0, 0, 2496, 2497, 2497, 2497, 2498, 2498, 2498, 2500, 2500, 2500, 0, 0, 0, 0, 2500, 2501, 2501, 2501, 2502, 2502, 2502, 2503, 0, 0, 0, 2503, 2503, 2503, 0, 0, 0, 0, 2503, 2504, 0, 0, 0, 2504, 2504, 2504, 0, 0, 0, 0, 2504, 2505, 0, 0, 0, 2505, 2505, 2505, 0, 0, 0, 0, 2505, 2506, 0, 0, 0, 2506, 2506, 2506, 0, 0, 0, 0, 2506, 2507, 0, 0, 0, 2507, 2507, 2507, 0, 0, 0, 0, 2507, 2508, 0, 0, 0, 2508, 2508, 2508, 0, 0, 0, 0, 2508, 2509, 0, 0, 0, 2509, 2509, 2509, 0, 0, 0, 0, 2509, 2510, 0, 0, 0, 2510, 2510, 2510, 0, 0, 0, 0, 2510, 2511, 0, 0, 0, 2511, 2511, 2511, 0, 0, 0, 0, 2511, 2512, 0, 0, 0, 2512, 2512, 2512, 0, 0, 0, 0, 2512, 2513, 0, 0, 0, 2513, 2513, 2513, 0, 0, 0, 0, 2513, 2514, 0, 0, 0, 2514, 2514, 2514, 0, 0, 0, 0, 2514, 2515, 0, 0, 0, 2515, 2515, 2515, 0, 0, 0, 0, 2515, 2516, 0, 0, 0, 2516, 2516, 2516, 0, 0, 0, 0, 2516, 2517, 0, 0, 0, 2517, 2517, 2517, 0, 0, 0, 0, 2517, 2518, 0, 0, 0, 2518, 2518, 2518, 0, 0, 0, 0, 2518, 2519, 0, 0, 0, 2519, 2519, 2519, 0, 0, 0, 0, 2519, 2520, 0, 0, 0, 2520, 2520, 2520, 0, 0, 0, 0, 2520, 2521, 0, 0, 0, 2521, 2521, 2521, 0, 0, 0, 0, 2521, 2522, 0, 0, 0, 2522, 2522, 2522, 0, 0, 0, 0, 2522, 2523, 0, 0, 0, 2523, 2523, 2523, 0, 0, 0, 0, 2523, 2524, 0, 0, 0, 2524, 2524, 2524, 0, 0, 0, 0, 2524, 2525, 0, 0, 0, 2525, 2525, 2525, 0, 0, 0, 0, 2525, 2526, 0, 0, 0, 2526, 2526, 2526, 0, 0, 0, 0, 2526, 2527, 0, 0, 0, 2527, 2527, 2527, 0, 0, 0, 0, 2527, 2528, 0, 0, 0, 2528, 2528, 2528, 0, 0, 0, 0, 2528, 2529, 0, 0, 0, 2529, 2529, 2529, 0, 0, 0, 0, 2529, 2530, 0, 0, 0, 2530, 2530, 2530, 0, 0, 0, 0, 2530, 2531, 0, 0, 0, 2531, 2531, 2531, 0, 0, 0, 0, 2531, 2532, 0, 0, 0, 2532, 2532, 2532, 0, 0, 0, 0, 2532, 2533, 0, 0, 0, 2533, 2533, 2533, 0, 0, 0, 0, 2533, 2534, 0, 0, 0, 2534, 2534, 2534, 0, 0, 0, 0, 2534, 2535, 0, 0, 0, 2535, 2535, 2535, 0, 0, 0, 0, 2535, 2536, 0, 0, 0, 2536, 2536, 2536, 0, 0, 0, 0, 2536, 2537, 0, 0, 0, 2537, 2537, 2537, 0, 0, 0, 0, 2537, 2538, 0, 0, 0, 2538, 2538, 2538, 0, 0, 0, 0, 2538, 2539, 0, 0, 0, 2539, 2539, 2539, 0, 0, 0, 0, 2539, 2540, 0, 0, 0, 2540, 2540, 2540, 0, 0, 0, 0, 2540, 2541, 0, 0, 0, 2541, 2541, 2541, 0, 0, 0, 0, 2541, 2542, 0, 0, 0, 2542, 2542, 2542, 0, 0, 0, 0, 2542, 2543, 0, 0, 0, 2543, 2543, 2543, 0, 0, 0, 0, 2543, 2544, 0, 0, 0, 2544, 2544, 2544, 0, 0, 0, 0, 2544, 2545, 0, 0, 0, 2545, 2545, 2545, 0, 0, 0, 0, 2545, 2546, 0, 0, 0, 2546, 2546, 2546, 0, 0, 0, 0, 2546, 2547, 0, 0, 0, 2547, 2547, 2547, 0, 0, 0, 0, 2547, 2548, 0, 0, 0, 2548, 2548, 2548, 0, 0, 0, 0, 2548, 2549, 0, 0, 0, 2549, 2549, 2549, 0, 0, 0, 0, 2549, 2550, 0, 0, 0, 2550, 2550, 2550, 0, 0, 0, 0, 2550, 2551, 0, 0, 0, 2551, 2551, 2551, 0, 0, 0, 0, 2551, 2552, 0, 0, 0, 2552, 2552, 2552, 0, 0, 0, 0, 2552, 2553, 0, 0, 0, 2553, 2553, 2553, 0, 0, 0, 0, 2553, 2554, 0, 0, 0, 2554, 2554, 2554, 0, 0, 0, 0, 2554, 2555, 0, 0, 0, 2555, 2555, 2555, 0, 0, 0, 0, 2555, 2556, 0, 0, 0, 2556, 2556, 2556, 0, 0, 0, 0, 2556, 2557, 0, 0, 0, 2557, 2557, 2557, 0, 0, 0, 0, 2557, 2558, 0, 0, 0, 2558, 2558, 2558, 0, 0, 0, 0, 2558, 2559, 0, 0, 0, 2559, 2559, 2559, 0, 0, 0, 0, 2559, 2560, 0, 0, 0, 2560, 2560, 2560, 0, 0, 0, 0, 2560, 2561, 0, 0, 0, 2561, 2561, 2561, 0, 0, 0, 0, 2561, 2562, 0, 0, 0, 2562, 2562, 2562, 0, 0, 0, 0, 2562, 2563, 0, 0, 0, 2563, 2563, 2563, 0, 0, 0, 0, 2563, 2564, 0, 0, 0, 2564, 2564, 2564, 0, 0, 0, 0, 2564, 2565, 0, 0, 0, 2565, 2565, 2565, 0, 0, 0, 0, 2565, 2566, 0, 0, 0, 2566, 2566, 2566, 0, 0, 0, 0, 2566, 2567, 0, 0, 0, 2567, 2567, 2567, 0, 0, 0, 0, 2567, 2568, 0, 0, 0, 2568, 2568, 2568, 0, 0, 0, 0, 2568, 2569, 0, 0, 0, 2569, 2569, 2569, 0, 0, 0, 0, 2569, 2570, 0, 0, 0, 2570, 2570, 2570, 0, 0, 0, 0, 2570, 2571, 0, 0, 0, 2571, 2571, 2571, 0, 0, 0, 0, 2571, 2572, 0, 0, 0, 2572, 2572, 2572, 0, 0, 0, 0, 2572, 2573, 0, 0, 0, 2573, 2573, 2573, 0, 0, 0, 0, 2573, 2574, 0, 0, 0, 2574, 2574, 2574, 0, 0, 0, 0, 2574, 2575, 0, 0, 0, 2575, 2575, 2575, 0, 0, 0, 0, 2575, 2576, 0, 0, 0, 2576, 2576, 2576, 0, 0, 0, 0, 2576, 2577, 0, 0, 0, 2577, 2577, 2577, 0, 0, 0, 0, 2577, 2578, 0, 0, 0, 2578, 2578, 2578, 0, 0, 0, 0, 2578, 2579, 0, 0, 0, 2579, 2579, 2579, 0, 0, 0, 0, 2579, 2580, 0, 0, 0, 2580, 2580, 2580, 0, 0, 0, 0, 2580, 2581, 0, 0, 0, 2581, 2581, 2581, 0, 0, 0, 0, 2581, 2582, 0, 0, 0, 2582, 2582, 2582, 0, 0, 0, 0, 2582, 2583, 0, 0, 0, 2583, 2583, 2583, 0, 0, 0, 0, 2583, 2584, 0, 0, 0, 2584, 2584, 2584, 0, 0, 0, 0, 2584, 2585, 0, 0, 0, 2585, 2585, 2585, 0, 0, 0, 0, 2585, 2586, 0, 0, 0, 2586, 2586, 2586, 0, 0, 0, 0, 2586, 2587, 0, 0, 0, 2587, 2587, 2587, 0, 0, 0, 0, 2587, 2588, 0, 0, 0, 2588, 2588, 2588, 0, 0, 0, 0, 2588, 2589, 0, 0, 0, 2589, 2589, 2589, 0, 0, 0, 0, 2589, 2590, 0, 0, 0, 2590, 2590, 2590, 0, 0, 0, 0, 2590, 2591, 0, 0, 0, 2591, 2591, 2591, 0, 0, 0, 0, 2591, 2592, 0, 0, 0, 2592, 2592, 2592, 0, 0, 0, 0, 2592, 2593, 0, 0, 0, 2593, 2593, 2593, 0, 0, 0, 0, 2593, 2594, 0, 0, 0, 2594, 2594, 2594, 0, 0, 0, 0, 2594, 2595, 0, 0, 0, 2595, 2595, 2595, 0, 0, 0, 0, 2595, 2596, 0, 0, 0, 2596, 2596, 2596, 0, 0, 0, 0, 2596, 2597, 0, 0, 0, 2597, 2597, 2597, 0, 0, 0, 0, 2597, 2598, 0, 0, 0, 2598, 2598, 2598, 0, 0, 0, 0, 2598, 2599, 0, 0, 0, 2599, 2599, 2599, 0, 0, 0, 0, 2599, 2600, 0, 0, 0, 2600, 2600, 2600, 0, 0, 0, 0, 2600, 2601, 0, 0, 0, 2601, 2601, 2601, 0, 0, 0, 0, 2601, 2602, 0, 0, 0, 2602, 2602, 2602, 0, 0, 0, 0, 2602, 2603, 0, 0, 0, 2603, 2603, 2603, 0, 0, 0, 0, 2603, 2604, 0, 0, 0, 2604, 2604, 2604, 0, 0, 0, 0, 2604, 2605, 0, 0, 0, 2605, 2605, 2605, 0, 0, 0, 0, 2605, 2606, 0, 0, 0, 2606, 2606, 2606, 0, 0, 0, 0, 2606, 2607, 0, 0, 0, 2607, 2607, 2607, 0, 0, 0, 0, 2607, 2608, 0, 0, 0, 2608, 2608, 2608, 0, 0, 0, 0, 2608, 2609, 0, 0, 0, 2609, 2609, 2609, 0, 0, 0, 0, 2609, 2610, 0, 0, 0, 2610, 2610, 2610, 0, 0, 0, 0, 2610, 2611, 0, 0, 0, 2611, 2611, 2611, 0, 0, 0, 0, 2611, 2612, 0, 0, 0, 2612, 2612, 2612, 0, 0, 0, 0, 2612, 2613, 0, 0, 0, 2613, 2613, 2613, 0, 0, 0, 0, 2613, 2614, 0, 0, 0, 2614, 2614, 2614, 0, 0, 0, 0, 2614, 2615, 0, 0, 0, 2615, 2615, 2615, 0, 0, 0, 0, 2615, 2616, 0, 0, 0, 2616, 2616, 2616, 0, 0, 0, 0, 2616, 2617, 0, 0, 0, 2617, 2617, 2617, 0, 0, 0, 0, 2617, 2618, 0, 0, 0, 2618, 2618, 2618, 0, 0, 0, 0, 2618, 2619, 0, 0, 0, 2619, 2619, 2619, 0, 0, 0, 0, 2619, 2620, 0, 0, 0, 2620, 2620, 2620, 0, 0, 0, 0, 2620, 2621, 0, 0, 0, 2621, 2621, 2621, 0, 0, 0, 0, 2621, 2622, 0, 0, 0, 2622, 2622, 2622, 0, 0, 0, 0, 2622, 2623, 0, 0, 0, 2623, 2623, 2623, 0, 0, 0, 0, 2623, 2624, 0, 0, 0, 2624, 2624, 2624, 0, 0, 0, 0, 2624, 2625, 0, 0, 0, 2625, 2625, 2625, 0, 0, 0, 0, 2625, 2626, 0, 0, 0, 2626, 2626, 2626, 0, 0, 0, 0, 2626, 2627, 0, 0, 0, 2627, 2627, 2627, 0, 0, 0, 0, 2627, 2628, 0, 0, 0, 2628, 2628, 2628, 0, 0, 0, 0, 2628, 2629, 0, 0, 0, 2629, 2629, 2629, 0, 0, 0, 0, 2629, 2630, 0, 0, 0, 2630, 2630, 2630, 0, 0, 0, 0, 2630, 2631, 0, 0, 0, 2631, 2631, 2631, 0, 0, 0, 0, 2631, 2632, 0, 0, 0, 2632, 2632, 2632, 0, 0, 0, 0, 2632, 2633, 0, 0, 0, 2633, 2633, 2633, 0, 0, 0, 0, 2633, 2634, 0, 0, 0, 2634, 2634, 2634, 0, 0, 0, 0, 2634, 2635, 0, 0, 0, 2635, 2635, 2635, 0, 0, 0, 0, 2635, 2636, 0, 0, 0, 2636, 2636, 2636, 0, 0, 0, 0, 2636, 2637, 0, 0, 0, 2637, 2637, 2637, 0, 0, 0, 0, 2637, 2638, 0, 0, 0, 2638, 2638, 2638, 0, 0, 0, 0, 2638, 2639, 0, 0, 0, 2639, 2639, 2639, 0, 0, 0, 0, 2639, 2640, 0, 0, 0, 2640, 2640, 2640, 0, 0, 0, 0, 2640, 2641, 0, 0, 0, 2641, 2641, 2641, 0, 0, 0, 0, 2641, 2642, 0, 0, 0, 2642, 2642, 2642, 0, 0, 0, 0, 2642, 2643, 0, 0, 0, 2643, 2643, 2643, 0, 0, 0, 0, 2643, 2644, 0, 0, 0, 2644, 2644, 2644, 0, 0, 0, 0, 2644, 2645, 0, 0, 0, 2645, 2645, 2645, 0, 0, 0, 0, 2645, 2646, 0, 0, 0, 2646, 2646, 2646, 0, 0, 0, 0, 2646, 2647, 0, 0, 0, 2647, 2647, 2647, 0, 0, 0, 0, 2647, 2648, 0, 0, 0, 2648, 2648, 2648, 0, 0, 0, 0, 2648, 2649, 0, 0, 0, 2649, 2649, 2649, 0, 0, 0, 0, 2649, 2650, 0, 0, 0, 2650, 2650, 2650, 0, 0, 0, 0, 2650, 2651, 0, 0, 0, 2651, 2651, 2651, 0, 0, 0, 0, 2651, 2652, 0, 0, 0, 2652, 2652, 2652, 0, 0, 0, 0, 2652, 2653, 0, 0, 0, 2653, 2653, 2653, 0, 0, 0, 0, 2653, 2654, 0, 0, 0, 2654, 2654, 2654, 0, 0, 0, 0, 2654, 2655, 0, 0, 0, 2655, 2655, 2655, 0, 0, 0, 0, 2655, 2656, 0, 0, 0, 2656, 2656, 2656, 0, 0, 0, 0, 2656, 2657, 0, 0, 0, 2657, 2657, 2657, 0, 0, 0, 0, 2657, 2658, 0, 0, 0, 2658, 2658, 2658, 0, 0, 0, 0, 2658, 2659, 2659, 2659, 2659, 2659, 2659, 2659, 2659, 2659, 0, 2659, 2659, 2659, 0, 2659, 2660, 2660, 2660, 2660, 2660, 2660, 2660, 2660, 2660, 0, 2660, 2660, 2660, 2660, 2660, 2661, 2661, 2661, 2661, 2661, 2661, 2661, 2661, 2661, 0, 2661, 2661, 2661, 0, 2661, 2662, 2662, 2662, 2662, 2662, 2662, 2662, 2662, 2662, 0, 2662, 2662, 2662, 0, 2662, 2663, 2663, 2663, 2663, 2663, 2663, 2663, 2663, 2663, 2663, 2663, 2663, 2663, 0, 2663, 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664, 0, 2664, 2664, 2664, 0, 2664, 2665, 0, 0, 0, 2665, 2665, 2665, 0, 0, 0, 0, 2665, 2666, 2666, 2666, 2667, 0, 0, 0, 2667, 2667, 2667, 0, 0, 0, 0, 2667, 2668, 2668, 2668, 2670, 0, 2670, 0, 2670, 2670, 0, 0, 0, 0, 0, 2670, 2671, 0, 2671, 0, 2671, 2671, 0, 0, 0, 0, 0, 2671, 2672, 2672, 2672, 2673, 2673, 2673, 2674, 0, 0, 0, 2674, 2674, 2674, 0, 0, 0, 0, 2674, 2675, 0, 0, 0, 2675, 2675, 2675, 0, 0, 0, 0, 2675, 2676, 0, 0, 0, 2676, 2676, 2676, 0, 0, 0, 0, 2676, 2677, 0, 0, 0, 2677, 2677, 2677, 0, 0, 0, 0, 2677, 2678, 0, 0, 0, 2678, 2678, 2678, 0, 0, 0, 0, 2678, 2679, 0, 0, 0, 2679, 2679, 2679, 0, 0, 0, 0, 2679, 2680, 0, 0, 0, 2680, 2680, 2680, 0, 0, 0, 0, 2680, 2681, 0, 0, 0, 2681, 2681, 2681, 0, 0, 0, 0, 2681, 2682, 0, 0, 0, 2682, 2682, 2682, 0, 0, 0, 0, 2682, 2683, 0, 0, 0, 2683, 2683, 2683, 0, 0, 0, 0, 2683, 2684, 0, 0, 0, 2684, 2684, 2684, 0, 0, 0, 0, 2684, 2685, 0, 0, 0, 2685, 2685, 2685, 0, 0, 0, 0, 2685, 2686, 0, 0, 0, 2686, 2686, 2686, 0, 0, 0, 0, 2686, 2687, 0, 0, 0, 2687, 2687, 2687, 0, 0, 0, 0, 2687, 2688, 0, 0, 0, 2688, 2688, 2688, 0, 0, 0, 0, 2688, 2689, 0, 0, 0, 2689, 2689, 2689, 0, 0, 0, 0, 2689, 2690, 0, 0, 0, 2690, 2690, 2690, 0, 0, 0, 0, 2690, 2691, 0, 0, 0, 2691, 2691, 2691, 0, 0, 0, 0, 2691, 2692, 0, 0, 0, 2692, 2692, 2692, 0, 0, 0, 0, 2692, 2693, 0, 0, 0, 2693, 2693, 2693, 0, 0, 0, 0, 2693, 2694, 0, 0, 0, 2694, 2694, 2694, 0, 0, 0, 0, 2694, 2695, 0, 0, 0, 2695, 2695, 2695, 0, 0, 0, 0, 2695, 2696, 0, 0, 0, 2696, 2696, 2696, 0, 0, 0, 0, 2696, 2697, 0, 0, 0, 2697, 2697, 2697, 0, 0, 0, 0, 2697, 2698, 0, 0, 0, 2698, 2698, 2698, 0, 0, 0, 0, 2698, 2699, 0, 0, 0, 2699, 2699, 2699, 0, 0, 0, 0, 2699, 2700, 0, 0, 0, 2700, 2700, 2700, 0, 0, 0, 0, 2700, 2701, 0, 0, 0, 2701, 2701, 2701, 0, 0, 0, 0, 2701, 2702, 0, 0, 0, 2702, 2702, 2702, 0, 0, 0, 0, 2702, 2703, 0, 0, 0, 2703, 2703, 2703, 0, 0, 0, 0, 2703, 2704, 0, 0, 0, 2704, 2704, 2704, 0, 0, 0, 0, 2704, 2705, 0, 0, 0, 2705, 2705, 2705, 0, 0, 0, 0, 2705, 2706, 0, 0, 0, 2706, 2706, 2706, 0, 0, 0, 0, 2706, 2707, 0, 0, 0, 2707, 2707, 2707, 0, 0, 0, 0, 2707, 2708, 0, 0, 0, 2708, 2708, 2708, 0, 0, 0, 0, 2708, 2709, 0, 0, 0, 2709, 2709, 2709, 0, 0, 0, 0, 2709, 2710, 0, 0, 0, 2710, 2710, 2710, 0, 0, 0, 0, 2710, 2711, 0, 0, 0, 2711, 2711, 2711, 0, 0, 0, 0, 2711, 2712, 0, 0, 0, 2712, 2712, 2712, 0, 0, 0, 0, 2712, 2713, 0, 0, 0, 2713, 2713, 2713, 0, 0, 0, 0, 2713, 2714, 0, 0, 0, 2714, 2714, 2714, 0, 0, 0, 0, 2714, 2715, 0, 0, 0, 2715, 2715, 2715, 0, 0, 0, 0, 2715, 2716, 0, 0, 0, 2716, 2716, 2716, 0, 0, 0, 0, 2716, 2717, 0, 0, 0, 2717, 2717, 2717, 0, 0, 0, 0, 2717, 2718, 0, 0, 0, 2718, 2718, 2718, 0, 0, 0, 0, 2718, 2719, 0, 0, 0, 2719, 2719, 2719, 0, 0, 0, 0, 2719, 2720, 0, 0, 0, 2720, 2720, 2720, 0, 0, 0, 0, 2720, 2721, 0, 0, 0, 2721, 2721, 2721, 0, 0, 0, 0, 2721, 2722, 0, 0, 0, 2722, 2722, 2722, 0, 0, 0, 0, 2722, 2723, 0, 0, 0, 2723, 2723, 2723, 0, 0, 0, 0, 2723, 2724, 0, 0, 0, 2724, 2724, 2724, 0, 0, 0, 0, 2724, 2725, 0, 0, 0, 2725, 2725, 2725, 0, 0, 0, 0, 2725, 2726, 0, 0, 0, 2726, 2726, 2726, 0, 0, 0, 0, 2726, 2727, 0, 0, 0, 2727, 2727, 2727, 0, 0, 0, 0, 2727, 2728, 0, 0, 0, 2728, 2728, 2728, 0, 0, 0, 0, 2728, 2729, 0, 0, 0, 2729, 2729, 2729, 0, 0, 0, 0, 2729, 2730, 0, 0, 0, 2730, 2730, 2730, 0, 0, 0, 0, 2730, 2731, 0, 0, 0, 2731, 2731, 2731, 0, 0, 0, 0, 2731, 2732, 0, 0, 0, 2732, 2732, 2732, 0, 0, 0, 0, 2732, 2733, 0, 0, 0, 2733, 2733, 2733, 0, 0, 0, 0, 2733, 2734, 0, 0, 0, 2734, 2734, 2734, 0, 0, 0, 0, 2734, 2735, 0, 0, 0, 2735, 2735, 2735, 0, 0, 0, 0, 2735, 2736, 0, 0, 0, 2736, 2736, 2736, 0, 0, 0, 0, 2736, 2737, 0, 0, 0, 2737, 2737, 2737, 0, 0, 0, 0, 2737, 2738, 0, 0, 0, 2738, 2738, 2738, 0, 0, 0, 0, 2738, 2739, 0, 0, 0, 2739, 2739, 2739, 0, 0, 0, 0, 2739, 2740, 0, 0, 0, 2740, 2740, 2740, 0, 0, 0, 0, 2740, 2741, 0, 0, 0, 2741, 2741, 2741, 0, 0, 0, 0, 2741, 2742, 0, 0, 0, 2742, 2742, 2742, 0, 0, 0, 0, 2742, 2743, 0, 0, 0, 2743, 2743, 2743, 0, 0, 0, 0, 2743, 2744, 0, 0, 0, 2744, 2744, 2744, 0, 0, 0, 0, 2744, 2745, 0, 0, 0, 2745, 2745, 2745, 0, 0, 0, 0, 2745, 2746, 0, 0, 0, 2746, 2746, 2746, 0, 0, 0, 0, 2746, 2747, 0, 0, 0, 2747, 2747, 2747, 0, 0, 0, 0, 2747, 2748, 0, 0, 0, 2748, 2748, 2748, 0, 0, 0, 0, 2748, 2749, 0, 0, 0, 2749, 2749, 2749, 0, 0, 0, 0, 2749, 2750, 0, 0, 0, 2750, 2750, 2750, 0, 0, 0, 0, 2750, 2751, 0, 0, 0, 2751, 2751, 2751, 0, 0, 0, 0, 2751, 2752, 0, 0, 0, 2752, 2752, 2752, 0, 0, 0, 0, 2752, 2753, 0, 0, 0, 2753, 2753, 2753, 0, 0, 0, 0, 2753, 2754, 0, 0, 0, 2754, 2754, 2754, 0, 0, 0, 0, 2754, 2755, 0, 0, 0, 2755, 2755, 2755, 0, 0, 0, 0, 2755, 2756, 0, 0, 0, 2756, 2756, 2756, 0, 0, 0, 0, 2756, 2757, 0, 0, 0, 2757, 2757, 2757, 0, 0, 0, 0, 2757, 2758, 0, 0, 0, 2758, 2758, 2758, 0, 0, 0, 0, 2758, 2759, 0, 0, 0, 2759, 2759, 2759, 0, 0, 0, 0, 2759, 2760, 0, 0, 0, 2760, 2760, 2760, 0, 0, 0, 0, 2760, 2761, 0, 0, 0, 2761, 2761, 2761, 0, 0, 0, 0, 2761, 2762, 0, 0, 0, 2762, 2762, 2762, 0, 0, 0, 0, 2762, 2763, 0, 0, 0, 2763, 2763, 2763, 0, 0, 0, 0, 2763, 2764, 0, 0, 0, 2764, 2764, 2764, 0, 0, 0, 0, 2764, 2765, 0, 0, 0, 2765, 2765, 2765, 0, 0, 0, 0, 2765, 2766, 0, 0, 0, 2766, 2766, 2766, 0, 0, 0, 0, 2766, 2767, 0, 0, 0, 2767, 2767, 2767, 0, 0, 0, 0, 2767, 2768, 0, 0, 0, 2768, 2768, 2768, 0, 0, 0, 0, 2768, 2769, 0, 0, 0, 2769, 2769, 2769, 0, 0, 0, 0, 2769, 2770, 0, 0, 0, 2770, 2770, 2770, 0, 0, 0, 0, 2770, 2771, 0, 0, 0, 2771, 2771, 2771, 0, 0, 0, 0, 2771, 2772, 0, 0, 0, 2772, 2772, 2772, 0, 0, 0, 0, 2772, 2773, 0, 0, 0, 2773, 2773, 2773, 0, 0, 0, 0, 2773, 2774, 0, 0, 0, 2774, 2774, 2774, 0, 0, 0, 0, 2774, 2775, 0, 0, 0, 2775, 2775, 2775, 0, 0, 0, 0, 2775, 2776, 0, 0, 0, 2776, 2776, 2776, 0, 0, 0, 0, 2776, 2777, 0, 0, 0, 2777, 2777, 2777, 0, 0, 0, 0, 2777, 2778, 0, 0, 0, 2778, 2778, 2778, 0, 0, 0, 0, 2778, 2779, 0, 0, 0, 2779, 2779, 2779, 0, 0, 0, 0, 2779, 2780, 0, 0, 0, 2780, 2780, 2780, 0, 0, 0, 0, 2780, 2781, 0, 0, 0, 2781, 2781, 2781, 0, 0, 0, 0, 2781, 2782, 0, 0, 0, 2782, 2782, 2782, 0, 0, 0, 0, 2782, 2783, 0, 0, 0, 2783, 2783, 2783, 0, 0, 0, 0, 2783, 2784, 0, 0, 0, 2784, 2784, 2784, 0, 0, 0, 0, 2784, 2785, 0, 0, 0, 2785, 2785, 2785, 0, 0, 0, 0, 2785, 2786, 0, 0, 0, 2786, 2786, 2786, 0, 0, 0, 0, 2786, 2787, 0, 0, 0, 2787, 2787, 2787, 0, 0, 0, 0, 2787, 2788, 0, 0, 0, 2788, 2788, 2788, 0, 0, 0, 0, 2788, 2789, 0, 0, 0, 2789, 2789, 2789, 0, 0, 0, 0, 2789, 2790, 0, 0, 0, 2790, 2790, 2790, 0, 0, 0, 0, 2790, 2791, 0, 0, 0, 2791, 2791, 2791, 0, 0, 0, 0, 2791, 2792, 0, 0, 0, 2792, 2792, 2792, 0, 0, 0, 0, 2792, 2793, 0, 0, 0, 2793, 2793, 2793, 0, 0, 0, 0, 2793, 2794, 0, 0, 0, 2794, 2794, 2794, 0, 0, 0, 0, 2794, 2795, 0, 0, 0, 2795, 2795, 2795, 0, 0, 0, 0, 2795, 2796, 0, 0, 0, 2796, 2796, 2796, 0, 0, 0, 0, 2796, 2797, 2797, 2797, 2797, 2797, 2797, 2797, 2797, 2797, 0, 2797, 2797, 2797, 0, 2797, 2798, 0, 0, 0, 2798, 2798, 2798, 0, 0, 0, 0, 2798, 2799, 2799, 2799, 2800, 0, 0, 0, 2800, 2800, 2800, 0, 0, 0, 0, 2800, 2801, 2801, 2801, 2802, 2802, 2802, 0, 0, 0, 0, 2802, 2803, 2803, 2803, 2804, 2804, 2804, 2805, 2805, 2805, 2806, 2806, 2806, 0, 0, 0, 0, 2806, 2807, 2807, 2807, 2808, 0, 2808, 0, 2808, 2808, 0, 0, 0, 0, 0, 2808, 2809, 0, 2809, 0, 2809, 2809, 0, 0, 0, 0, 0, 2809, 2810, 0, 0, 0, 2810, 2810, 2810, 0, 0, 0, 0, 2810, 2811, 0, 0, 0, 2811, 2811, 2811, 0, 0, 0, 0, 2811, 2812, 0, 0, 0, 2812, 2812, 2812, 0, 0, 0, 0, 2812, 2813, 0, 0, 0, 2813, 2813, 2813, 0, 0, 0, 0, 2813, 2814, 0, 0, 0, 2814, 2814, 2814, 0, 0, 0, 0, 2814, 2815, 0, 0, 0, 2815, 2815, 2815, 0, 0, 0, 0, 2815, 2816, 0, 0, 0, 2816, 2816, 2816, 0, 0, 0, 0, 2816, 2817, 0, 0, 0, 2817, 2817, 2817, 0, 0, 0, 0, 2817, 2818, 0, 0, 0, 2818, 2818, 2818, 0, 0, 0, 0, 2818, 2819, 0, 0, 0, 2819, 2819, 2819, 0, 0, 0, 0, 2819, 2820, 0, 0, 0, 2820, 2820, 2820, 0, 0, 0, 0, 2820, 2821, 0, 0, 0, 2821, 2821, 2821, 0, 0, 0, 0, 2821, 2822, 0, 0, 0, 2822, 2822, 2822, 0, 0, 0, 0, 2822, 2823, 0, 0, 0, 2823, 2823, 2823, 0, 0, 0, 0, 2823, 2824, 0, 0, 0, 2824, 2824, 2824, 0, 0, 0, 0, 2824, 2825, 0, 0, 0, 2825, 2825, 2825, 0, 0, 0, 0, 2825, 2826, 0, 0, 0, 2826, 2826, 2826, 0, 0, 0, 0, 2826, 2827, 0, 0, 0, 2827, 2827, 2827, 0, 0, 0, 0, 2827, 2828, 0, 0, 0, 2828, 2828, 2828, 0, 0, 0, 0, 2828, 2829, 0, 0, 0, 2829, 2829, 2829, 0, 0, 0, 0, 2829, 2830, 0, 0, 0, 2830, 2830, 2830, 0, 0, 0, 0, 2830, 2831, 0, 0, 0, 2831, 2831, 2831, 0, 0, 0, 0, 2831, 2832, 0, 0, 0, 2832, 2832, 2832, 0, 0, 0, 0, 2832, 2833, 0, 0, 0, 2833, 2833, 2833, 0, 0, 0, 0, 2833, 2834, 0, 0, 0, 2834, 2834, 2834, 0, 0, 0, 0, 2834, 2835, 0, 0, 0, 2835, 2835, 2835, 0, 0, 0, 0, 2835, 2836, 0, 0, 0, 2836, 2836, 2836, 0, 0, 0, 0, 2836, 2837, 0, 0, 0, 2837, 2837, 2837, 0, 0, 0, 0, 2837, 2838, 0, 0, 0, 2838, 2838, 2838, 0, 0, 0, 0, 2838, 2839, 0, 0, 0, 2839, 2839, 2839, 0, 0, 0, 0, 2839, 2840, 0, 0, 0, 2840, 2840, 2840, 0, 0, 0, 0, 2840, 2841, 0, 0, 0, 2841, 2841, 2841, 0, 0, 0, 0, 2841, 2842, 0, 0, 0, 2842, 2842, 2842, 0, 0, 0, 0, 2842, 2843, 0, 0, 0, 2843, 2843, 2843, 0, 0, 0, 0, 2843, 2844, 0, 0, 0, 2844, 2844, 2844, 0, 0, 0, 0, 2844, 2845, 0, 0, 0, 2845, 2845, 2845, 0, 0, 0, 0, 2845, 2846, 0, 0, 0, 2846, 2846, 2846, 0, 0, 0, 0, 2846, 2847, 0, 0, 0, 2847, 2847, 2847, 0, 0, 0, 0, 2847, 2848, 0, 0, 0, 2848, 2848, 2848, 0, 0, 0, 0, 2848, 2849, 0, 0, 0, 2849, 2849, 2849, 0, 0, 0, 0, 2849, 2850, 0, 0, 0, 2850, 2850, 2850, 0, 0, 0, 0, 2850, 2851, 0, 0, 0, 2851, 2851, 2851, 0, 0, 0, 0, 2851, 2852, 2852, 2852, 2853, 0, 0, 0, 2853, 2853, 2853, 0, 0, 0, 0, 2853, 2854, 2854, 2854, 2855, 2855, 2855, 2856, 2856, 2856, 2857, 2857, 2857, 2860, 0, 2860, 0, 2860, 2860, 0, 0, 0, 0, 0, 2860, 2863, 0, 2863, 0, 2863, 2863, 0, 0, 0, 0, 0, 2863, 2864, 2864, 2864, 2865, 2865, 2865, 2866, 0, 0, 0, 2866, 2866, 2866, 0, 0, 0, 0, 2866, 2867, 2867, 2867, 2868, 0, 0, 0, 2868, 2868, 2868, 0, 0, 0, 0, 2868, 2869, 2869, 2869, 2870, 2870, 2870, 2872, 2872, 2872, 2874, 2874, 2874, 2877, 0, 2877, 0, 2877, 2877, 0, 0, 0, 0, 0, 2877, 2880, 0, 2880, 0, 2880, 2880, 0, 0, 0, 0, 0, 2880, 2881, 2881, 2881, 2882, 0, 0, 0, 2882, 2882, 2882, 0, 0, 0, 0, 2882, 2883, 2883, 2883, 2884, 2884, 2884, 2885, 2885, 2885, 2886, 2886, 2886, 2888, 2888, 2888, 2890, 2890, 2890, 2891, 2891, 2891, 2892, 2892, 2892, 2893, 2893, 2893, 2894, 2894, 2894, 2895, 2895, 2895, 2896, 2896, 2896, 2897, 2897, 2897, 2898, 0, 2898, 0, 2898, 2898, 2898, 0, 0, 0, 0, 2898, 2899, 0, 2899, 0, 2899, 2899, 2899, 0, 0, 0, 0, 2899, 2900, 2900, 2900, 2901, 2901, 2901, 2902, 0, 2902, 0, 2902, 2902, 2902, 0, 0, 0, 0, 2902, 2903, 0, 2903, 0, 2903, 2903, 2903, 0, 0, 0, 0, 2903, 2904, 0, 2904, 0, 2904, 2904, 2904, 0, 0, 0, 0, 2904, 2905, 0, 2905, 0, 2905, 2905, 2905, 0, 0, 0, 0, 2905, 2906, 2906, 2906, 2907, 0, 2907, 0, 2907, 2907, 2907, 0, 0, 0, 0, 2907, 2908, 0, 2908, 0, 2908, 2908, 2908, 0, 0, 0, 0, 2908, 2909, 0, 2909, 0, 2909, 2909, 2909, 0, 0, 0, 0, 2909, 2910, 0, 2910, 0, 2910, 2910, 2910, 0, 0, 0, 0, 2910, 2911, 0, 2911, 0, 2911, 2911, 2911, 0, 0, 0, 0, 2911, 2912, 0, 2912, 0, 2912, 2912, 2912, 0, 0, 0, 0, 2912, 2913, 0, 2913, 0, 2913, 2913, 2913, 0, 0, 0, 0, 2913, 2914, 0, 2914, 0, 2914, 2914, 2914, 0, 0, 0, 0, 2914, 2915, 0, 2915, 0, 2915, 2915, 2915, 0, 0, 0, 0, 2915, 2916, 0, 2916, 0, 2916, 2916, 2916, 0, 0, 0, 0, 2916, 2917, 0, 2917, 0, 2917, 2917, 2917, 0, 0, 0, 0, 2917, 2918, 0, 2918, 0, 2918, 2918, 2918, 0, 0, 0, 0, 2918, 2919, 0, 2919, 0, 2919, 2919, 2919, 0, 0, 0, 0, 2919, 2920, 0, 2920, 0, 2920, 2920, 2920, 0, 0, 0, 0, 2920, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757 } ; /* The intent behind this definition is that it'll catch * any uses of REJECT which flex missed. */ #define REJECT reject_used_but_not_detected #define yymore() yymore_used_but_not_detected #define YY_MORE_ADJ 0 #define YY_RESTORE_YY_MORE_OFFSET #line 1 "vrscanl.l" /* * * Copyright (C) 1997-2010, 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: dcmdata * * Author: Hermann Grevemeyer et al. * * Purpose: * These are the regular expressions for the value representations * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:07:00 $ * CVS/RCS Revision: $Revision: 1.6 $ * Status: $State: Exp $ * * CVS/RCS Log: * $Log: vrscanl.c,v $ * Revision 1.6 2010-10-14 13:07:00 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.6 2010-10-14 13:04:24 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.5 2010-09-03 07:26:19 uli * Make the VR scanner work on windows again. * * Revision 1.4 2010-09-02 12:02:06 uli * Use longjmp() for error handling in the VR scanner. * * Revision 1.3 2010-09-02 10:37:37 uli * Fix a compiler warning about an unused function. * * Revision 1.2 2010-09-02 09:23:15 uli * Made the VR scanner reentrant again. * * Revision 1.1 2010-08-26 12:29:48 uli * Ported vrscan from ancient flex++ to current flex version. * * Revision 1.15 2009-08-03 09:20:39 joergr * Fixed various bugs and inconsistencies in the grammar of the VR scanner. * * Revision 1.14 2009-05-11 14:43:55 joergr * Fixed wrong definition of value representation DS (Decimal String): According * to the referenced standard (ANSI X3.9 - 1978), the sign symbol after the "E" * or "e" is optional). * * Revision 1.13 2008-07-18 13:55:57 meichel * New test for dubious date field (with years before 1850 or after 2050) * generating new warning message W-33. * * Revision 1.12 2006-08-16 16:31:34 meichel * Updated all code in module dcmcheck to correctly compile when * all standard C++ classes remain in namespace std. * * Revision 1.11 2003/08/26 16:13:06 meichel * Extended VR scanner to explicitly test for IS value range. * Added warning for retired PN form (without caret). * * Revision 1.10 2003/08/26 15:10:37 meichel * Extended VR scanner to detect leading zeroes in UIDs and illegal values * in date and time expressions. * * Revision 1.9 2003/08/25 15:42:59 meichel * Changed VR scanner to allow empty values in multi-VM elements. * This is explicitly needed, for example, for ImageType in DX objects. * * Revision 1.8 2001/01/18 15:14:14 meichel * Updated copyright header. * * Revision 1.7 2000/03/08 16:11:49 meichel * Updated copyright header. * * Revision 1.6 2000/03/03 14:21:58 meichel * Implemented library support for redirecting error messages into memory * instead of printing them to stdout/stderr for GUI applications. * * Revision 1.5 1998/07/02 09:03:16 meichel * Some code purifications to avoid gcc 2.8.1 -Weffc++ warnings. * * Revision 1.4 1997/09/24 13:04:13 hewett * Corrected default and charset_without_control_chars regular expressions used for checking * the allowed character repertoirs for VRs. The '+' character was missing * as a valid character. * * Revision 1.3 1997/07/09 16:33:52 meichel * Adapted dcmcheck to use the new OFString and OFBool classes instead * of Gnu libg++. Removed references to Gnu-specific code (e.g. ). * #includes in header files now restricted to required minimum, * speeds up compilation and keeps the code lean. * reimplementation of some helper functions (hex.cc, tools.cc) * to improve efficiency. * Added copyright message to all source files. * * */ /* Avoid compiler warnings about unused functions */ #define YY_NO_INPUT 1 #line 109 "vrscanl.l" #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "vrscani.h" /* Make this work on windows (we don't need interactivity anyway) */ /* This seems to be a bug: The .c file won't include it, but .h will still. * %option nounistd */ #line 120 "vrscanl.l" static int isatty(int fd) { return 0; } #line 5605 "vrscanl.c" #define INITIAL 0 #ifndef YY_NO_UNISTD_H /* Special case for "unistd.h", since it is non-ANSI. We include it way * down here because we want the user's section 1 to have been scanned first. * The user has a chance to override it with an option. */ #include #endif #ifndef YY_EXTRA_TYPE #define YY_EXTRA_TYPE void * #endif /* Holds the entire state of the reentrant scanner. */ struct yyguts_t { /* User-defined. Not touched by flex. */ YY_EXTRA_TYPE yyextra_r; /* The rest are the same as the globals declared in the non-reentrant scanner. */ FILE *yyin_r, *yyout_r; size_t yy_buffer_stack_top; /**< index of top of stack. */ size_t yy_buffer_stack_max; /**< capacity of stack. */ YY_BUFFER_STATE * yy_buffer_stack; /**< Stack as an array. */ char yy_hold_char; int yy_n_chars; int yyleng_r; char *yy_c_buf_p; int yy_init; int yy_start; int yy_did_buffer_switch_on_eof; int yy_start_stack_ptr; int yy_start_stack_depth; int *yy_start_stack; yy_state_type yy_last_accepting_state; char* yy_last_accepting_cpos; int yylineno_r; int yy_flex_debug_r; char *yytext_r; int yy_more_flag; int yy_more_len; }; /* end struct yyguts_t */ static int yy_init_globals (yyscan_t yyscanner ); /* Accessor methods to globals. These are made visible to non-reentrant scanners for convenience. */ int yylex_destroy (yyscan_t yyscanner ); int yyget_debug (yyscan_t yyscanner ); void yyset_debug (int debug_flag ,yyscan_t yyscanner ); YY_EXTRA_TYPE yyget_extra (yyscan_t yyscanner ); void yyset_extra (YY_EXTRA_TYPE user_defined ,yyscan_t yyscanner ); FILE *yyget_in (yyscan_t yyscanner ); void yyset_in (FILE * in_str ,yyscan_t yyscanner ); FILE *yyget_out (yyscan_t yyscanner ); void yyset_out (FILE * out_str ,yyscan_t yyscanner ); int yyget_leng (yyscan_t yyscanner ); char *yyget_text (yyscan_t yyscanner ); int yyget_lineno (yyscan_t yyscanner ); void yyset_lineno (int line_number ,yyscan_t yyscanner ); /* Macros after this point can all be overridden by user definitions in * section 1. */ #ifndef YY_SKIP_YYWRAP #ifdef __cplusplus extern "C" int yywrap (yyscan_t yyscanner ); #else extern int yywrap (yyscan_t yyscanner ); #endif #endif #ifndef yytext_ptr static void yy_flex_strncpy (char *,yyconst char *,int ,yyscan_t yyscanner); #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen (yyconst char * ,yyscan_t yyscanner); #endif #ifndef YY_NO_INPUT #ifdef __cplusplus static int yyinput (yyscan_t yyscanner ); #else static int input (yyscan_t yyscanner ); #endif #endif /* Amount of stuff to slurp up with each read. */ #ifndef YY_READ_BUF_SIZE #define YY_READ_BUF_SIZE 8192 #endif /* Copy whatever the last rule matched to the standard output. */ #ifndef ECHO /* This used to be an fputs(), but since the string might contain NUL's, * we now use fwrite(). */ #define ECHO (void) fwrite( yytext, yyleng, 1, yyout ) #endif /* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, * is returned in "result". */ #ifndef YY_INPUT #define YY_INPUT(buf,result,max_size) \ if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ { \ int c = '*'; \ size_t n; \ for ( n = 0; n < max_size && \ (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ buf[n] = (char) c; \ if ( c == '\n' ) \ buf[n++] = (char) c; \ if ( c == EOF && ferror( yyin ) ) \ YY_FATAL_ERROR( "input in flex scanner failed" ); \ result = n; \ } \ else \ { \ errno=0; \ while ( (result = fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \ { \ if( errno != EINTR) \ { \ YY_FATAL_ERROR( "input in flex scanner failed" ); \ break; \ } \ errno=0; \ clearerr(yyin); \ } \ }\ \ #endif /* No semi-colon after return; correct usage is to write "yyterminate();" - * we don't want an extra ';' after the "return" because that will cause * some compilers to complain about unreachable statements. */ #ifndef yyterminate #define yyterminate() return YY_NULL #endif /* Number of entries by which start-condition stack grows. */ #ifndef YY_START_STACK_INCR #define YY_START_STACK_INCR 25 #endif /* Report a fatal error. */ #ifndef YY_FATAL_ERROR #define YY_FATAL_ERROR(msg) yy_fatal_error( msg , yyscanner) #endif /* end tables serialization structures and prototypes */ /* Default declaration of generated scanner - a define so the user can * easily add parameters. */ #ifndef YY_DECL #define YY_DECL_IS_OURS 1 extern int yylex (yyscan_t yyscanner); #define YY_DECL int yylex (yyscan_t yyscanner) #endif /* !YY_DECL */ /* Code executed at the beginning of each rule, after yytext and yyleng * have been set up. */ #ifndef YY_USER_ACTION #define YY_USER_ACTION #endif /* Code executed at the end of each rule. */ #ifndef YY_BREAK #define YY_BREAK break; #endif #define YY_RULE_SETUP \ YY_USER_ACTION /** The main scanner function which does all the work. */ YY_DECL { register yy_state_type yy_current_state; register char *yy_cp, *yy_bp; register int yy_act; struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; #line 176 "vrscanl.l" #line 5823 "vrscanl.c" if ( !yyg->yy_init ) { yyg->yy_init = 1; #ifdef YY_USER_INIT YY_USER_INIT; #endif if ( ! yyg->yy_start ) yyg->yy_start = 1; /* first start state */ if ( ! yyin ) yyin = stdin; if ( ! yyout ) yyout = stdout; if ( ! YY_CURRENT_BUFFER ) { yyensure_buffer_stack (yyscanner); YY_CURRENT_BUFFER_LVALUE = yy_create_buffer(yyin,YY_BUF_SIZE ,yyscanner); } yy_load_buffer_state(yyscanner ); } while ( 1 ) /* loops until end-of-file is reached */ { yy_cp = yyg->yy_c_buf_p; /* Support of yytext. */ *yy_cp = yyg->yy_hold_char; /* yy_bp points to the position in yy_ch_buf of the start of * the current run. */ yy_bp = yy_cp; yy_current_state = yyg->yy_start; yy_match: do { register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; if ( yy_accept[yy_current_state] ) { yyg->yy_last_accepting_state = yy_current_state; yyg->yy_last_accepting_cpos = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 1758 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; ++yy_cp; } while ( yy_current_state != 1757 ); yy_cp = yyg->yy_last_accepting_cpos; yy_current_state = yyg->yy_last_accepting_state; yy_find_action: yy_act = yy_accept[yy_current_state]; YY_DO_BEFORE_ACTION; do_action: /* This label is used only to access EOF actions. */ switch ( yy_act ) { /* beginning of action switch */ case 0: /* must back up */ /* undo the effects of YY_DO_BEFORE_ACTION */ *yy_cp = yyg->yy_hold_char; yy_cp = yyg->yy_last_accepting_cpos; yy_current_state = yyg->yy_last_accepting_state; goto yy_find_action; case 1: YY_RULE_SETUP #line 178 "vrscanl.l" {return 1; /* AS */} YY_BREAK case 2: YY_RULE_SETUP #line 179 "vrscanl.l" {return 2; /* DA */} YY_BREAK case 3: YY_RULE_SETUP #line 180 "vrscanl.l" {return 3; /* OLD_DA */} YY_BREAK case 4: YY_RULE_SETUP #line 181 "vrscanl.l" {return 17; /* dubious DA */} YY_BREAK case 5: YY_RULE_SETUP #line 182 "vrscanl.l" {return 4; /* TM */} YY_BREAK case 6: YY_RULE_SETUP #line 183 "vrscanl.l" {return 5; /* OLD_TM */} YY_BREAK case 7: YY_RULE_SETUP #line 184 "vrscanl.l" {return 6; /* DS */} YY_BREAK case 8: YY_RULE_SETUP #line 185 "vrscanl.l" {return 7; /* DT */} YY_BREAK case 9: YY_RULE_SETUP #line 186 "vrscanl.l" {return 18; /* dubious DT */} YY_BREAK case 10: YY_RULE_SETUP #line 187 "vrscanl.l" {return 8; /* IS */} YY_BREAK case 11: YY_RULE_SETUP #line 188 "vrscanl.l" {return 9; /* UI */} YY_BREAK case 12: YY_RULE_SETUP #line 189 "vrscanl.l" {return 10; /* CS */} YY_BREAK case 13: YY_RULE_SETUP #line 190 "vrscanl.l" {return 11; /* PN */} YY_BREAK case 14: YY_RULE_SETUP #line 191 "vrscanl.l" {return 15; /* OLD_PN */} YY_BREAK case 15: YY_RULE_SETUP #line 192 "vrscanl.l" {return 12; /* LO | SH */} YY_BREAK case 16: YY_RULE_SETUP #line 193 "vrscanl.l" {return 13; /* AE */} YY_BREAK case 17: /* rule 17 can match eol */ YY_RULE_SETUP #line 194 "vrscanl.l" {return 14; /* LT | ST | UT */} YY_BREAK case 18: YY_RULE_SETUP #line 195 "vrscanl.l" {return 16; /* UNKNOWN */;} YY_BREAK case 19: YY_RULE_SETUP #line 197 "vrscanl.l" ECHO; YY_BREAK #line 5998 "vrscanl.c" case YY_STATE_EOF(INITIAL): yyterminate(); case YY_END_OF_BUFFER: { /* Amount of text matched not including the EOB char. */ int yy_amount_of_matched_text = (int) (yy_cp - yyg->yytext_ptr) - 1; /* Undo the effects of YY_DO_BEFORE_ACTION. */ *yy_cp = yyg->yy_hold_char; YY_RESTORE_YY_MORE_OFFSET if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) { /* We're scanning a new file or input source. It's * possible that this happened because the user * just pointed yyin at a new source and called * yylex(). If so, then we have to assure * consistency between YY_CURRENT_BUFFER and our * globals. Here is the right place to do so, because * this is the first action (other than possibly a * back-up) that will match for the new input source. */ yyg->yy_n_chars = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin; YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; } /* Note that here we test for yy_c_buf_p "<=" to the position * of the first EOB in the buffer, since yy_c_buf_p will * already have been incremented past the NUL character * (since all states make transitions on EOB to the * end-of-buffer state). Contrast this with the test * in input(). */ if ( yyg->yy_c_buf_p <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] ) { /* This was really a NUL. */ yy_state_type yy_next_state; yyg->yy_c_buf_p = yyg->yytext_ptr + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state( yyscanner ); /* Okay, we're now positioned to make the NUL * transition. We couldn't have * yy_get_previous_state() go ahead and do it * for us because it doesn't know how to deal * with the possibility of jamming (and we don't * want to build jamming into it because then it * will run more slowly). */ yy_next_state = yy_try_NUL_trans( yy_current_state , yyscanner); yy_bp = yyg->yytext_ptr + YY_MORE_ADJ; if ( yy_next_state ) { /* Consume the NUL. */ yy_cp = ++yyg->yy_c_buf_p; yy_current_state = yy_next_state; goto yy_match; } else { yy_cp = yyg->yy_last_accepting_cpos; yy_current_state = yyg->yy_last_accepting_state; goto yy_find_action; } } else switch ( yy_get_next_buffer( yyscanner ) ) { case EOB_ACT_END_OF_FILE: { yyg->yy_did_buffer_switch_on_eof = 0; if ( yywrap(yyscanner ) ) { /* Note: because we've taken care in * yy_get_next_buffer() to have set up * yytext, we can now set up * yy_c_buf_p so that if some total * hoser (like flex itself) wants to * call the scanner after we return the * YY_NULL, it'll still work - another * YY_NULL will get returned. */ yyg->yy_c_buf_p = yyg->yytext_ptr + YY_MORE_ADJ; yy_act = YY_STATE_EOF(YY_START); goto do_action; } else { if ( ! yyg->yy_did_buffer_switch_on_eof ) YY_NEW_FILE; } break; } case EOB_ACT_CONTINUE_SCAN: yyg->yy_c_buf_p = yyg->yytext_ptr + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state( yyscanner ); yy_cp = yyg->yy_c_buf_p; yy_bp = yyg->yytext_ptr + YY_MORE_ADJ; goto yy_match; case EOB_ACT_LAST_MATCH: yyg->yy_c_buf_p = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars]; yy_current_state = yy_get_previous_state( yyscanner ); yy_cp = yyg->yy_c_buf_p; yy_bp = yyg->yytext_ptr + YY_MORE_ADJ; goto yy_find_action; } break; } default: YY_FATAL_ERROR( "fatal flex scanner internal error--no action found" ); } /* end of action switch */ } /* end of scanning one token */ } /* end of yylex */ /* yy_get_next_buffer - try to read in a new buffer * * Returns a code representing an action: * EOB_ACT_LAST_MATCH - * EOB_ACT_CONTINUE_SCAN - continue scanning from current position * EOB_ACT_END_OF_FILE - end of file */ static int yy_get_next_buffer (yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; register char *source = yyg->yytext_ptr; register int number_to_move, i; int ret_val; if ( yyg->yy_c_buf_p > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars + 1] ) YY_FATAL_ERROR( "fatal flex scanner internal error--end of buffer missed" ); if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) { /* Don't try to fill the buffer, so this is an EOF. */ if ( yyg->yy_c_buf_p - yyg->yytext_ptr - YY_MORE_ADJ == 1 ) { /* We matched a single character, the EOB, so * treat this as a final EOF. */ return EOB_ACT_END_OF_FILE; } else { /* We matched some text prior to the EOB, first * process it. */ return EOB_ACT_LAST_MATCH; } } /* Try to read more data. */ /* First move last chars to start of buffer. */ number_to_move = (int) (yyg->yy_c_buf_p - yyg->yytext_ptr) - 1; for ( i = 0; i < number_to_move; ++i ) *(dest++) = *(source++); if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) /* don't do the read, it's not guaranteed to return an EOF, * just force an EOF */ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars = 0; else { int num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; while ( num_to_read <= 0 ) { /* Not enough room in the buffer - grow it. */ /* just a shorter name for the current buffer */ YY_BUFFER_STATE b = YY_CURRENT_BUFFER; int yy_c_buf_p_offset = (int) (yyg->yy_c_buf_p - b->yy_ch_buf); if ( b->yy_is_our_buffer ) { int new_size = b->yy_buf_size * 2; if ( new_size <= 0 ) b->yy_buf_size += b->yy_buf_size / 8; else b->yy_buf_size *= 2; b->yy_ch_buf = (char *) /* Include room in for 2 EOB chars. */ yyrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 ,yyscanner ); } else /* Can't grow it, we don't own it. */ b->yy_ch_buf = 0; if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "fatal error - scanner input buffer overflow" ); yyg->yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset]; num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; } if ( num_to_read > YY_READ_BUF_SIZE ) num_to_read = YY_READ_BUF_SIZE; /* Read in more data. */ YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), yyg->yy_n_chars, (size_t) num_to_read ); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars; } if ( yyg->yy_n_chars == 0 ) { if ( number_to_move == YY_MORE_ADJ ) { ret_val = EOB_ACT_END_OF_FILE; yyrestart(yyin ,yyscanner); } else { ret_val = EOB_ACT_LAST_MATCH; YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_EOF_PENDING; } } else ret_val = EOB_ACT_CONTINUE_SCAN; yyg->yy_n_chars += number_to_move; YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] = YY_END_OF_BUFFER_CHAR; YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR; yyg->yytext_ptr = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; return ret_val; } /* yy_get_previous_state - get the state just before the EOB char was reached */ static yy_state_type yy_get_previous_state (yyscan_t yyscanner) { register yy_state_type yy_current_state; register char *yy_cp; struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; yy_current_state = yyg->yy_start; for ( yy_cp = yyg->yytext_ptr + YY_MORE_ADJ; yy_cp < yyg->yy_c_buf_p; ++yy_cp ) { register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); if ( yy_accept[yy_current_state] ) { yyg->yy_last_accepting_state = yy_current_state; yyg->yy_last_accepting_cpos = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 1758 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; } return yy_current_state; } /* yy_try_NUL_trans - try to make a transition on the NUL character * * synopsis * next_state = yy_try_NUL_trans( current_state ); */ static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state , yyscan_t yyscanner) { register int yy_is_jam; struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; /* This var may be unused depending upon options. */ register char *yy_cp = yyg->yy_c_buf_p; register YY_CHAR yy_c = 1; if ( yy_accept[yy_current_state] ) { yyg->yy_last_accepting_state = yy_current_state; yyg->yy_last_accepting_cpos = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 1758 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; yy_is_jam = (yy_current_state == 1757); return yy_is_jam ? 0 : yy_current_state; } #ifndef YY_NO_INPUT #ifdef __cplusplus static int yyinput (yyscan_t yyscanner) #else static int input (yyscan_t yyscanner) #endif { int c; struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; *yyg->yy_c_buf_p = yyg->yy_hold_char; if ( *yyg->yy_c_buf_p == YY_END_OF_BUFFER_CHAR ) { /* yy_c_buf_p now points to the character we want to return. * If this occurs *before* the EOB characters, then it's a * valid NUL; if not, then we've hit the end of the buffer. */ if ( yyg->yy_c_buf_p < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] ) /* This was really a NUL. */ *yyg->yy_c_buf_p = '\0'; else { /* need more input */ int offset = yyg->yy_c_buf_p - yyg->yytext_ptr; ++yyg->yy_c_buf_p; switch ( yy_get_next_buffer( yyscanner ) ) { case EOB_ACT_LAST_MATCH: /* This happens because yy_g_n_b() * sees that we've accumulated a * token and flags that we need to * try matching the token before * proceeding. But for input(), * there's no matching to consider. * So convert the EOB_ACT_LAST_MATCH * to EOB_ACT_END_OF_FILE. */ /* Reset buffer status. */ yyrestart(yyin ,yyscanner); /*FALLTHROUGH*/ case EOB_ACT_END_OF_FILE: { if ( yywrap(yyscanner ) ) return EOF; if ( ! yyg->yy_did_buffer_switch_on_eof ) YY_NEW_FILE; #ifdef __cplusplus return yyinput(yyscanner); #else return input(yyscanner); #endif } case EOB_ACT_CONTINUE_SCAN: yyg->yy_c_buf_p = yyg->yytext_ptr + offset; break; } } } c = *(unsigned char *) yyg->yy_c_buf_p; /* cast for 8-bit char's */ *yyg->yy_c_buf_p = '\0'; /* preserve yytext */ yyg->yy_hold_char = *++yyg->yy_c_buf_p; return c; } #endif /* ifndef YY_NO_INPUT */ /** Immediately switch to a different input stream. * @param input_file A readable stream. * @param yyscanner The scanner object. * @note This function does not reset the start condition to @c INITIAL . */ void yyrestart (FILE * input_file , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; if ( ! YY_CURRENT_BUFFER ){ yyensure_buffer_stack (yyscanner); YY_CURRENT_BUFFER_LVALUE = yy_create_buffer(yyin,YY_BUF_SIZE ,yyscanner); } yy_init_buffer(YY_CURRENT_BUFFER,input_file ,yyscanner); yy_load_buffer_state(yyscanner ); } /** Switch to a different input buffer. * @param new_buffer The new input buffer. * @param yyscanner The scanner object. */ void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; /* TODO. We should be able to replace this entire function body * with * yypop_buffer_state(); * yypush_buffer_state(new_buffer); */ yyensure_buffer_stack (yyscanner); if ( YY_CURRENT_BUFFER == new_buffer ) return; if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ *yyg->yy_c_buf_p = yyg->yy_hold_char; YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = yyg->yy_c_buf_p; YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars; } YY_CURRENT_BUFFER_LVALUE = new_buffer; yy_load_buffer_state(yyscanner ); /* We don't actually know whether we did this switch during * EOF (yywrap()) processing, but the only time this flag * is looked at is after yywrap() is called, so it's safe * to go ahead and always set it. */ yyg->yy_did_buffer_switch_on_eof = 1; } static void yy_load_buffer_state (yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; yyg->yy_n_chars = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; yyg->yytext_ptr = yyg->yy_c_buf_p = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; yyg->yy_hold_char = *yyg->yy_c_buf_p; } /** Allocate and initialize an input buffer state. * @param file A readable stream. * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. * @param yyscanner The scanner object. * @return the allocated buffer state. */ YY_BUFFER_STATE yy_create_buffer (FILE * file, int size , yyscan_t yyscanner) { YY_BUFFER_STATE b; b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ,yyscanner ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_buf_size = size; /* yy_ch_buf has to be 2 characters longer than the size given because * we need to put in 2 end-of-buffer characters. */ b->yy_ch_buf = (char *) yyalloc(b->yy_buf_size + 2 ,yyscanner ); if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_is_our_buffer = 1; yy_init_buffer(b,file ,yyscanner); return b; } /** Destroy the buffer. * @param b a buffer created with yy_create_buffer() * @param yyscanner The scanner object. */ void yy_delete_buffer (YY_BUFFER_STATE b , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; if ( ! b ) return; if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; if ( b->yy_is_our_buffer ) yyfree((void *) b->yy_ch_buf ,yyscanner ); yyfree((void *) b ,yyscanner ); } #ifndef __cplusplus extern int isatty (int ); #endif /* __cplusplus */ /* Initializes or reinitializes a buffer. * This function is sometimes called more than once on the same buffer, * such as during a yyrestart() or at EOF. */ static void yy_init_buffer (YY_BUFFER_STATE b, FILE * file , yyscan_t yyscanner) { int oerrno = errno; struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; yy_flush_buffer(b ,yyscanner); b->yy_input_file = file; b->yy_fill_buffer = 1; /* If b is the current buffer, then yy_init_buffer was _probably_ * called from yyrestart() or through yy_get_next_buffer. * In that case, we don't want to reset the lineno or column. */ if (b != YY_CURRENT_BUFFER){ b->yy_bs_lineno = 1; b->yy_bs_column = 0; } b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; errno = oerrno; } /** Discard all buffered characters. On the next scan, YY_INPUT will be called. * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. * @param yyscanner The scanner object. */ void yy_flush_buffer (YY_BUFFER_STATE b , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; if ( ! b ) return; b->yy_n_chars = 0; /* We always need two end-of-buffer characters. The first causes * a transition to the end-of-buffer state. The second causes * a jam in that state. */ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; b->yy_buf_pos = &b->yy_ch_buf[0]; b->yy_at_bol = 1; b->yy_buffer_status = YY_BUFFER_NEW; if ( b == YY_CURRENT_BUFFER ) yy_load_buffer_state(yyscanner ); } /** Pushes the new state onto the stack. The new state becomes * the current state. This function will allocate the stack * if necessary. * @param new_buffer The new state. * @param yyscanner The scanner object. */ void yypush_buffer_state (YY_BUFFER_STATE new_buffer , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; if (new_buffer == NULL) return; yyensure_buffer_stack(yyscanner); /* This block is copied from yy_switch_to_buffer. */ if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ *yyg->yy_c_buf_p = yyg->yy_hold_char; YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = yyg->yy_c_buf_p; YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars; } /* Only push if top exists. Otherwise, replace top. */ if (YY_CURRENT_BUFFER) yyg->yy_buffer_stack_top++; YY_CURRENT_BUFFER_LVALUE = new_buffer; /* copied from yy_switch_to_buffer. */ yy_load_buffer_state(yyscanner ); yyg->yy_did_buffer_switch_on_eof = 1; } /** Removes and deletes the top of the stack, if present. * The next element becomes the new top. * @param yyscanner The scanner object. */ void yypop_buffer_state (yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; if (!YY_CURRENT_BUFFER) return; yy_delete_buffer(YY_CURRENT_BUFFER ,yyscanner); YY_CURRENT_BUFFER_LVALUE = NULL; if (yyg->yy_buffer_stack_top > 0) --yyg->yy_buffer_stack_top; if (YY_CURRENT_BUFFER) { yy_load_buffer_state(yyscanner ); yyg->yy_did_buffer_switch_on_eof = 1; } } /* Allocates the stack if it does not exist. * Guarantees space for at least one push. */ static void yyensure_buffer_stack (yyscan_t yyscanner) { int num_to_alloc; struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; if (!yyg->yy_buffer_stack) { /* First allocation is just for 2 elements, since we don't know if this * scanner will even need a stack. We use 2 instead of 1 to avoid an * immediate realloc on the next call. */ num_to_alloc = 1; yyg->yy_buffer_stack = (struct yy_buffer_state**)yyalloc (num_to_alloc * sizeof(struct yy_buffer_state*) , yyscanner); memset(yyg->yy_buffer_stack, 0, num_to_alloc * sizeof(struct yy_buffer_state*)); yyg->yy_buffer_stack_max = num_to_alloc; yyg->yy_buffer_stack_top = 0; return; } if (yyg->yy_buffer_stack_top >= (yyg->yy_buffer_stack_max) - 1){ /* Increase the buffer to prepare for a possible push. */ int grow_size = 8 /* arbitrary grow size */; num_to_alloc = yyg->yy_buffer_stack_max + grow_size; yyg->yy_buffer_stack = (struct yy_buffer_state**)yyrealloc (yyg->yy_buffer_stack, num_to_alloc * sizeof(struct yy_buffer_state*) , yyscanner); /* zero only the new slots.*/ memset(yyg->yy_buffer_stack + yyg->yy_buffer_stack_max, 0, grow_size * sizeof(struct yy_buffer_state*)); yyg->yy_buffer_stack_max = num_to_alloc; } } /** Setup the input buffer state to scan directly from a user-specified character buffer. * @param base the character buffer * @param size the size in bytes of the character buffer * @param yyscanner The scanner object. * @return the newly allocated buffer state object. */ YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size , yyscan_t yyscanner) { YY_BUFFER_STATE b; if ( size < 2 || base[size-2] != YY_END_OF_BUFFER_CHAR || base[size-1] != YY_END_OF_BUFFER_CHAR ) /* They forgot to leave room for the EOB's. */ return 0; b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ,yyscanner ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ b->yy_buf_pos = b->yy_ch_buf = base; b->yy_is_our_buffer = 0; b->yy_input_file = 0; b->yy_n_chars = b->yy_buf_size; b->yy_is_interactive = 0; b->yy_at_bol = 1; b->yy_fill_buffer = 0; b->yy_buffer_status = YY_BUFFER_NEW; yy_switch_to_buffer(b ,yyscanner ); return b; } /** Setup the input buffer state to scan a string. The next call to yylex() will * scan from a @e copy of @a str. * @param yystr a NUL-terminated string to scan * @param yyscanner The scanner object. * @return the newly allocated buffer state object. * @note If you want to scan bytes that may contain NUL values, then use * yy_scan_bytes() instead. */ YY_BUFFER_STATE yy_scan_string (yyconst char * yystr , yyscan_t yyscanner) { return yy_scan_bytes(yystr,strlen(yystr) ,yyscanner); } /** Setup the input buffer state to scan the given bytes. The next call to yylex() will * scan from a @e copy of @a bytes. * @param bytes the byte buffer to scan * @param len the number of bytes in the buffer pointed to by @a bytes. * @param yyscanner The scanner object. * @return the newly allocated buffer state object. */ YY_BUFFER_STATE yy_scan_bytes (yyconst char * yybytes, int _yybytes_len , yyscan_t yyscanner) { YY_BUFFER_STATE b; char *buf; yy_size_t n; int i; /* Get memory for full buffer, including space for trailing EOB's. */ n = _yybytes_len + 2; buf = (char *) yyalloc(n ,yyscanner ); if ( ! buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); for ( i = 0; i < _yybytes_len; ++i ) buf[i] = yybytes[i]; buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR; b = yy_scan_buffer(buf,n ,yyscanner); if ( ! b ) YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); /* It's okay to grow etc. this buffer, and we should throw it * away when we're done. */ b->yy_is_our_buffer = 1; return b; } #ifndef YY_EXIT_FAILURE #define YY_EXIT_FAILURE 2 #endif static void yy_fatal_error (yyconst char* msg , yyscan_t yyscanner) { (void) fprintf( stderr, "%s\n", msg ); exit( YY_EXIT_FAILURE ); } /* Redefine yyless() so it works in section 3 code. */ #undef yyless #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ yytext[yyleng] = yyg->yy_hold_char; \ yyg->yy_c_buf_p = yytext + yyless_macro_arg; \ yyg->yy_hold_char = *yyg->yy_c_buf_p; \ *yyg->yy_c_buf_p = '\0'; \ yyleng = yyless_macro_arg; \ } \ while ( 0 ) /* Accessor methods (get/set functions) to struct members. */ /** Get the user-defined data for this scanner. * @param yyscanner The scanner object. */ YY_EXTRA_TYPE yyget_extra (yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; return yyextra; } /** Get the current line number. * @param yyscanner The scanner object. */ int yyget_lineno (yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; if (! YY_CURRENT_BUFFER) return 0; return yylineno; } /** Get the current column number. * @param yyscanner The scanner object. */ int yyget_column (yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; if (! YY_CURRENT_BUFFER) return 0; return yycolumn; } /** Get the input stream. * @param yyscanner The scanner object. */ FILE *yyget_in (yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; return yyin; } /** Get the output stream. * @param yyscanner The scanner object. */ FILE *yyget_out (yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; return yyout; } /** Get the length of the current token. * @param yyscanner The scanner object. */ int yyget_leng (yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; return yyleng; } /** Get the current token. * @param yyscanner The scanner object. */ char *yyget_text (yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; return yytext; } /** Set the user-defined data. This data is never touched by the scanner. * @param user_defined The data to be associated with this scanner. * @param yyscanner The scanner object. */ void yyset_extra (YY_EXTRA_TYPE user_defined , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; yyextra = user_defined ; } /** Set the current line number. * @param line_number * @param yyscanner The scanner object. */ void yyset_lineno (int line_number , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; /* lineno is only valid if an input buffer exists. */ if (! YY_CURRENT_BUFFER ) yy_fatal_error( "yyset_lineno called with no buffer" , yyscanner); yylineno = line_number; } /** Set the current column. * @param line_number * @param yyscanner The scanner object. */ void yyset_column (int column_no , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; /* column is only valid if an input buffer exists. */ if (! YY_CURRENT_BUFFER ) yy_fatal_error( "yyset_column called with no buffer" , yyscanner); yycolumn = column_no; } /** Set the input stream. This does not discard the current * input buffer. * @param in_str A readable stream. * @param yyscanner The scanner object. * @see yy_switch_to_buffer */ void yyset_in (FILE * in_str , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; yyin = in_str ; } void yyset_out (FILE * out_str , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; yyout = out_str ; } int yyget_debug (yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; return yy_flex_debug; } void yyset_debug (int bdebug , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; yy_flex_debug = bdebug ; } /* Accessor methods for yylval and yylloc */ /* User-visible API */ /* yylex_init is special because it creates the scanner itself, so it is * the ONLY reentrant function that doesn't take the scanner as the last argument. * That's why we explicitly handle the declaration, instead of using our macros. */ int yylex_init(yyscan_t* ptr_yy_globals) { if (ptr_yy_globals == NULL){ errno = EINVAL; return 1; } *ptr_yy_globals = (yyscan_t) yyalloc ( sizeof( struct yyguts_t ), NULL ); if (*ptr_yy_globals == NULL){ errno = ENOMEM; return 1; } /* By setting to 0xAA, we expose bugs in yy_init_globals. Leave at 0x00 for releases. */ memset(*ptr_yy_globals,0x00,sizeof(struct yyguts_t)); return yy_init_globals ( *ptr_yy_globals ); } static int yy_init_globals (yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; /* Initialization is the same as for the non-reentrant scanner. * This function is called from yylex_destroy(), so don't allocate here. */ yyg->yy_buffer_stack = 0; yyg->yy_buffer_stack_top = 0; yyg->yy_buffer_stack_max = 0; yyg->yy_c_buf_p = (char *) 0; yyg->yy_init = 0; yyg->yy_start = 0; yyg->yy_start_stack_ptr = 0; yyg->yy_start_stack_depth = 0; yyg->yy_start_stack = NULL; /* Defined in main.c */ #ifdef YY_STDINIT yyin = stdin; yyout = stdout; #else yyin = (FILE *) 0; yyout = (FILE *) 0; #endif /* For future reference: Set errno on error, since we are called by * yylex_init() */ return 0; } /* yylex_destroy is for both reentrant and non-reentrant scanners. */ int yylex_destroy (yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; /* Pop the buffer stack, destroying each element. */ while(YY_CURRENT_BUFFER){ yy_delete_buffer(YY_CURRENT_BUFFER ,yyscanner ); YY_CURRENT_BUFFER_LVALUE = NULL; yypop_buffer_state(yyscanner); } /* Destroy the stack itself. */ yyfree(yyg->yy_buffer_stack ,yyscanner); yyg->yy_buffer_stack = NULL; /* Destroy the start condition stack. */ yyfree(yyg->yy_start_stack ,yyscanner ); yyg->yy_start_stack = NULL; /* Reset the globals. This is important in a non-reentrant scanner so the next time * yylex() is called, initialization will occur. */ yy_init_globals( yyscanner); /* Destroy the main struct (reentrant only). */ yyfree ( yyscanner , yyscanner ); yyscanner = NULL; return 0; } /* * Internal utility routines. */ #ifndef yytext_ptr static void yy_flex_strncpy (char* s1, yyconst char * s2, int n , yyscan_t yyscanner) { register int i; for ( i = 0; i < n; ++i ) s1[i] = s2[i]; } #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen (yyconst char * s , yyscan_t yyscanner) { register int n; for ( n = 0; s[n]; ++n ) ; return n; } #endif void *yyalloc (yy_size_t size , yyscan_t yyscanner) { return (void *) malloc( size ); } void *yyrealloc (void * ptr, yy_size_t size , yyscan_t yyscanner) { /* The cast to (char *) in the following accommodates both * implementations that use char* generic pointers, and those * that use void* generic pointers. It works with the latter * because both ANSI C and C++ allow castless assignment from * any pointer type to void*, and deal with argument conversions * as though doing an assignment. */ return (void *) realloc( (char *) ptr, size ); } void yyfree (void * ptr , yyscan_t yyscanner) { free( (char *) ptr ); /* see yyrealloc() for (char *) cast */ } #define YYTABLES_NAME "yytables" #line 197 "vrscanl.l" dcmtk-3.6.0/dcmdata/libsrc/dcvm.cc0000644000310500011400000000477711455601041016166 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Andreas Barth * * Purpose: functions to derive VM from string * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:14:09 $ * CVS/RCS Revision: $Revision: 1.10 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" #include "dcmtk/dcmdata/dcvm.h" #define INCLUDE_CSTRING #include "dcmtk/ofstd/ofstdinc.h" // get the number of values stored in string unsigned long getVMFromString(const char * val) { unsigned long vm = 1; if (val == NULL) vm = 0; else { for(const char * s = strchr(val, '\\'); s; s = strchr(++s, '\\')) vm++; } return vm; } // get first value stored in string, set the parameter to beginning of the // next value char * getFirstValueFromString(const char * & s) { if (s) { const char * p = strchr(s, '\\'); const char * backup = s; size_t len = 0; if (p) { len = p-s; s += (len+1); } else { len = strlen(s); s = NULL; } char * result = new char[len+1]; strncpy(result, backup, len); result[len] = '\0'; return result; } else return NULL; } /* ** CVS/RCS Log: ** $Log: dcvm.cc,v $ ** Revision 1.10 2010-10-14 13:14:09 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.9 2009-11-04 09:58:10 uli ** Switched to logging mechanism provided by the "new" oflog module ** ** Revision 1.8 2005-12-08 15:41:43 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.7 2002/11/27 12:06:54 meichel ** Adapted module dcmdata to use of new header file ofstdinc.h ** ** Revision 1.6 2001/06/01 15:49:13 meichel ** Updated copyright header ** ** Revision 1.5 2000/03/08 16:26:44 meichel ** Updated copyright header. ** ** Revision 1.4 1999/03/31 09:25:44 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.3 1996/04/29 13:35:27 savonge ** -checking NULL string in getVMFromString ** ** Revision 1.2 1996/03/26 09:59:33 meichel ** corrected bug (deletion of const char *) which prevented compilation on NeXT ** ** Revision 1.1 1996/01/29 13:38:30 andreas ** - new put method for every VR to put value as a string ** - better and unique print methods ** */ dcmtk-3.6.0/dcmdata/libsrc/cmdlnarg.cc0000644000310500011400000001775211455601036017025 0ustar joergrdicom3/* * * Copyright (C) 1996-2010, 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: dcmdata * * Author: Andrew Hewett * * Purpose: Provide prototype of command line argument gathering routine * for OS environments which cannot pass arguments on the command line. * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:14:06 $ * CVS/RCS Revision: $Revision: 1.27 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/cmdlnarg.h" #include "dcmtk/dcmdata/dctypes.h" /* ** prepareCmdLineArgs ** ** Should do nothing on Unix OS's. ** On other OS's (e.g. MacOS with CW6) allows command line arguments ** to be input from the standard input. */ #ifdef HAVE_EMPTY_ARGC_ARGV #define INCLUDE_CSTDLIB #define INCLUDE_CSTDIO #define INCLUDE_CSTRING #include "dcmtk/ofstd/ofstdinc.h" #include "dcmtk/ofstd/ofstream.h" void prepareCmdLineArgs(int& argc, char* argv[], const char* progname) { const int bufsize = 2024; char buf[bufsize]; char arg[1024]; argv[0] = new char[strlen(progname)+1]; strcpy(argv[0], progname); argc = 1; ofConsole.lockCout() << "CmdLineArgs-> "; ofConsole.unlockCout(); cin.getline(buf, bufsize); istringstream is(buf); arg[0] = '\0'; while (is.good()) { is >> arg; if (strlen(arg) > 0) { argv[argc] = new char[strlen(arg)+1]; strcpy(argv[argc], arg); argc++; } arg[0] = '\0'; } } #else #define INCLUDE_CSTDLIB #define INCLUDE_CSTDIO #define INCLUDE_CSTRING #include "dcmtk/ofstd/ofstdinc.h" #ifdef HAVE_IO_H #include #endif BEGIN_EXTERN_C #ifdef HAVE_FCNTL_H #include /* for O_BINARY */ #endif END_EXTERN_C #include "dcmtk/ofstd/ofstd.h" #include "dcmtk/ofstd/ofstream.h" void prepareCmdLineArgs(int& /* argc */, char** /* argv */, const char* /* progname */) { #ifdef _WIN32 #ifndef DCMTK_GUI #ifndef __CYGWIN__ /* Map stderr onto stdout (cannot redirect stderr under windows). * Remove any buffering (windows uses a 2k buffer for stdout when not * writing to the console. since dcmtk uses mixed stdout, stderr * cout and cerr, this results in _very_ mixed up output). */ /* duplicate the stderr file descriptor be the same as stdout */ close(fileno(stderr)); int fderr = dup(fileno(stdout)); if (fderr != fileno(stderr)) { char buf[256]; DCMDATA_ERROR("INTERNAL ERROR: cannot map stderr to stdout: " << OFStandard::strerror(errno, buf, sizeof(buf))); } #ifndef NO_IOS_BASE_ASSIGN /* make cout refer to cerr. This does not work with all iostream implementations :-( */ cout = cerr; #endif /* make stdout the same as stderr */ *stdout = *stderr; #ifdef USE_BINARY_MODE_FOR_STDOUT_ON_WINDOWS /* use binary mode for stdout in order to be more consistent with common Unix behavior */ setmode(fileno(stdout), O_BINARY); #endif #ifndef __BORLANDC__ /* setvbuf on stdout/stderr does not work with Borland C++ */ /* make sure the buffering is removed */ if (setvbuf(stdout, NULL, _IONBF, 0 ) != 0 ) { char buf[256]; DCMDATA_ERROR("INTERNAL ERROR: cannot unbuffer stdout: " << OFStandard::strerror(errno, buf, sizeof(buf))); } if (setvbuf(stderr, NULL, _IONBF, 0 ) != 0 ) { char buf[256]; DCMDATA_ERROR("INTERNAL ERROR: cannot unbuffer stderr: " << OFStandard::strerror(errno, buf, sizeof(buf))); } #endif /* __BORLANDC__ */ #endif #endif #endif /* no need to process the arguments */ } #endif /* ** CVS/RCS Log: ** $Log: cmdlnarg.cc,v $ ** Revision 1.27 2010-10-14 13:14:06 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.26 2010-06-11 14:32:02 joergr ** On Windows systems, the binary mode for stdout is now disabled by default ** since this causes newlines in textual output to be converted to LF only. ** ** Revision 1.25 2010-06-03 13:29:43 joergr ** Fixed issues on Windows platforms introduced with last commit. ** ** Revision 1.24 2010-06-03 10:29:20 joergr ** Replaced calls to strerror() by new helper function OFStandard::strerror() ** which results in using the thread safe version of strerror() if available. ** ** Revision 1.23 2010-04-23 08:11:02 joergr ** On Windows systems, use binary mode for stdout in order to be more consistent ** with common Unix behavior, e.g. useful for command line tools like dcm2pnm. ** ** Revision 1.22 2009-11-13 14:41:54 joergr ** Fixed wrong header include (now, "oflog.h" instead of "ofconsol.h" required). ** ** Revision 1.21 2009-11-10 12:38:29 uli ** Fix compilation on windows. ** ** Revision 1.20 2009-11-04 09:58:08 uli ** Switched to logging mechanism provided by the "new" oflog module ** ** Revision 1.19 2006-08-15 15:49:54 meichel ** Updated all code in module dcmdata to correctly compile when ** all standard C++ classes remain in namespace std. ** ** Revision 1.18 2005/12/08 15:40:55 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.17 2004/01/16 13:51:38 joergr ** Removed acknowledgements with e-mail addresses from CVS log. ** ** Revision 1.16 2003/10/13 13:32:15 meichel ** Disabled setvbuf calls on stdout/stderr on Win32/Borland C++. ** ** Revision 1.15 2002/11/27 12:06:42 meichel ** Adapted module dcmdata to use of new header file ofstdinc.h ** ** Revision 1.14 2002/04/16 13:43:14 joergr ** Added configurable support for C++ ANSI standard includes (e.g. streams). ** ** Revision 1.13 2001/06/01 15:48:57 meichel ** Updated copyright header ** ** Revision 1.12 2000/04/14 15:55:02 meichel ** Dcmdata library code now consistently uses ofConsole for error output. ** ** Revision 1.11 2000/03/08 16:26:28 meichel ** Updated copyright header. ** ** Revision 1.10 2000/03/06 18:13:08 joergr ** Added missing include (reported by MSVC). ** ** Revision 1.9 2000/03/03 14:05:30 meichel ** Implemented library support for redirecting error messages into memory ** instead of printing them to stdout/stderr for GUI applications. ** ** Revision 1.8 2000/02/23 15:11:45 meichel ** Corrected macro for Borland C++ Builder 4 workaround. ** ** Revision 1.7 2000/02/01 10:12:04 meichel ** Avoiding to include as extern "C" on Borland C++ Builder 4, ** workaround for bug in compiler header files. ** ** Revision 1.6 1999/05/04 12:20:20 joergr ** Minor changes to support Cygwin B20.1 (check __CYGWIN__ to distinguish from ** MSVC which also defines _WIN32). ** ** Revision 1.5 1999/04/21 15:45:10 meichel ** Now always including instead of on Win32 platforms. ** This makes sure that is used if available. ** ** Revision 1.4 1999/03/31 09:25:14 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.3 1999/03/17 11:09:21 meichel ** Added code to prepareCmdLineArgs() to redirect stderr, cout, ** cerr to stdout on Windows and make output unbuffered. ** This allows to redirect the output of DCMTK tools to file on Windows. ** ** Revision 1.2 1997/01/13 15:39:23 hewett ** Now includes cmdlnarg.h ** ** Revision 1.1 1996/09/24 16:18:41 hewett ** Moved from dcmdata/apps and dcmnet/apps to be part of the dcmdata library. ** ** Revision 1.2 1996/09/03 11:39:00 hewett ** Added copyright information. ** ** Revision 1.1.1.1 1996/03/26 18:38:44 hewett ** Initial Release. ** ** Revision 1.1.1.1 1996/03/25 15:17:00 hewett ** dcmnet DICOM network libraries. Adapted from CEN network libraries ** for use with the DICOM C++ dcmdata toolkit. ** ** Revision 1.1 1996/03/12 15:08:06 hewett ** Main program argc, argv handling for environments which do not make ** argc,argv available in main(). ** */ dcmtk-3.6.0/dcmdata/libsrc/dcrleccd.cc0000644000310500011400000007432611463514644017010 0ustar joergrdicom3/* * * Copyright (C) 2002-2010, 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: dcmdata * * Author: Marco Eichelberg * * Purpose: decoder codec class for RLE * * Last Update: $Author: uli $ * Update Date: $Date: 2010-11-01 10:42:44 $ * CVS/RCS Revision: $Revision: 1.18 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" #include "dcmtk/dcmdata/dcrleccd.h" // dcmdata includes #include "dcmtk/dcmdata/dcrlecp.h" /* for class DcmRLECodecParameter */ #include "dcmtk/dcmdata/dcrledec.h" /* for class DcmRLEDecoder */ #include "dcmtk/dcmdata/dcdatset.h" /* for class DcmDataset */ #include "dcmtk/dcmdata/dcdeftag.h" /* for tag constants */ #include "dcmtk/dcmdata/dcpixseq.h" /* for class DcmPixelSequence */ #include "dcmtk/dcmdata/dcpxitem.h" /* for class DcmPixelItem */ #include "dcmtk/dcmdata/dcvrpobw.h" /* for class DcmPolymorphOBOW */ #include "dcmtk/dcmdata/dcswap.h" /* for swapIfNecessary() */ #include "dcmtk/dcmdata/dcuid.h" /* for dcmGenerateUniqueIdentifer()*/ DcmRLECodecDecoder::DcmRLECodecDecoder() : DcmCodec() { } DcmRLECodecDecoder::~DcmRLECodecDecoder() { } OFBool DcmRLECodecDecoder::canChangeCoding( const E_TransferSyntax oldRepType, const E_TransferSyntax newRepType) const { E_TransferSyntax myXfer = EXS_RLELossless; DcmXfer newRep(newRepType); if (newRep.isNotEncapsulated() && (oldRepType == myXfer)) return OFTrue; // decompress requested // we don't support re-coding for now. return OFFalse; } OFCondition DcmRLECodecDecoder::decode( const DcmRepresentationParameter * /* fromRepParam */, DcmPixelSequence * pixSeq, DcmPolymorphOBOW& uncompressedPixelData, const DcmCodecParameter * cp, const DcmStack& objStack) const { OFCondition result = EC_Normal; // assume we can cast the codec parameter to what we need const DcmRLECodecParameter *djcp = OFstatic_cast(const DcmRLECodecParameter *, cp); OFBool enableReverseByteOrder = djcp->getReverseDecompressionByteOrder(); DcmStack localStack(objStack); (void)localStack.pop(); // pop pixel data element from stack DcmObject *dataset = localStack.pop(); // this is the item in which the pixel data is located if ((!dataset)||((dataset->ident()!= EVR_dataset) && (dataset->ident()!= EVR_item))) result = EC_InvalidTag; else { Uint16 imageSamplesPerPixel = 0; Uint16 imageRows = 0; Uint16 imageColumns = 0; Sint32 imageFrames = 1; Uint16 imageBitsAllocated = 0; Uint16 imageBytesAllocated = 0; Uint16 imagePlanarConfiguration = 0; Uint32 rleHeader[16]; DcmItem *ditem = OFstatic_cast(DcmItem *, dataset); OFBool numberOfFramesPresent = OFFalse; if (result.good()) result = ditem->findAndGetUint16(DCM_SamplesPerPixel, imageSamplesPerPixel); if (result.good()) result = ditem->findAndGetUint16(DCM_Rows, imageRows); if (result.good()) result = ditem->findAndGetUint16(DCM_Columns, imageColumns); if (result.good()) result = ditem->findAndGetUint16(DCM_BitsAllocated, imageBitsAllocated); if (result.good()) { imageBytesAllocated = OFstatic_cast(Uint16, imageBitsAllocated / 8); if ((imageBitsAllocated < 8)||(imageBitsAllocated % 8 != 0)) result = EC_CannotChangeRepresentation; } if (result.good() && (imageSamplesPerPixel > 1)) { result = ditem->findAndGetUint16(DCM_PlanarConfiguration, imagePlanarConfiguration); } // number of frames is an optional attribute - we don't mind if it isn't present. if (result.good()) { if (ditem->findAndGetSint32(DCM_NumberOfFrames, imageFrames).good()) numberOfFramesPresent = OFTrue; } if (imageFrames >= OFstatic_cast(Sint32, pixSeq->card())) imageFrames = pixSeq->card() - 1; // limit number of frames to number of pixel items - 1 if (imageFrames < 1) imageFrames = 1; // default in case the number of frames attribute is absent or contains garbage if (result.good()) { DcmPixelItem *pixItem = NULL; Uint8 * rleData = NULL; const size_t bytesPerStripe = imageColumns * imageRows; DcmRLEDecoder rledecoder(bytesPerStripe); if (rledecoder.fail()) result = EC_MemoryExhausted; // RLE decoder failed to initialize else { Uint32 frameSize = imageBytesAllocated * imageRows * imageColumns * imageSamplesPerPixel; Uint32 totalSize = frameSize * imageFrames; if (totalSize & 1) totalSize++; // align on 16-bit word boundary Uint16 *imageData16 = NULL; Sint32 currentFrame = 0; Uint32 currentItem = 1; // ignore offset table Uint32 numberOfStripes = 0; Uint32 fragmentLength = 0; Uint32 i; result = uncompressedPixelData.createUint16Array(totalSize/sizeof(Uint16), imageData16); if (result.good()) { Uint8 *imageData8 = OFreinterpret_cast(Uint8 *, imageData16); while ((currentFrame < imageFrames) && result.good()) { DCMDATA_DEBUG("RLE decoder processes frame " << currentFrame); DCMDATA_DEBUG("RLE decoder processes pixel item " << currentItem); // get first pixel item of this frame result = pixSeq->getItem(pixItem, currentItem++); if (result.good()) { fragmentLength = pixItem->getLength(); result = pixItem->getUint8Array(rleData); if (result.good()) { // we require that the RLE header must be completely // contained in the first fragment; otherwise bail out if (fragmentLength < 64) result = EC_CannotChangeRepresentation; } } if (result.good()) { // copy RLE header to buffer and adjust byte order memcpy(rleHeader, rleData, 64); swapIfNecessary(gLocalByteOrder, EBO_LittleEndian, rleHeader, 16*sizeof(Uint32), sizeof(Uint32)); // determine number of stripes. numberOfStripes = rleHeader[0]; // check that number of stripes in RLE header matches our expectation if ((numberOfStripes < 1) || (numberOfStripes > 15) || (numberOfStripes != OFstatic_cast(Uint32, imageBytesAllocated) * imageSamplesPerPixel)) result = EC_CannotChangeRepresentation; } if (result.good()) { // this variable keeps the number of bytes we have processed // for the current frame in earlier pixel fragments Uint32 fragmentOffset = 0; // this variable keeps the current position within the current fragment Uint32 byteOffset = 0; OFBool lastStripe = OFFalse; Uint32 inputBytes = 0; // pointers for buffer copy operations Uint8 *outputBuffer = NULL; Uint8 *pixelPointer = NULL; // byte offset for first sample in frame Uint32 sampleOffset = 0; // byte offset between samples Uint32 offsetBetweenSamples = 0; // temporary variables Uint32 sample = 0; Uint32 byte = 0; register Uint32 pixel = 0; // for each stripe in stripe set for (i=0; (i fragmentLength) && result.good()) { DCMDATA_DEBUG("RLE decoder processes pixel item " << currentItem); result = pixSeq->getItem(pixItem, currentItem++); if (result.good()) { byteOffset -= fragmentLength; fragmentOffset += fragmentLength; fragmentLength = pixItem->getLength(); result = pixItem->getUint8Array(rleData); } } } // byteOffset now points to the first byte of the new RLE stripe // check if the current stripe is the last one for this frame if (i+1 == numberOfStripes) lastStripe = OFTrue; else lastStripe = OFFalse; if (lastStripe) { // the last stripe needs special handling because we cannot use the // offset table to determine the number of bytes to feed to the codec // if the RLE data is split in multiple fragments. We need to feed // data fragment by fragment until the RLE codec has produced // sufficient output. while ((rledecoder.size() < bytesPerStripe) && result.good()) { // feed complete remaining content of fragment to RLE codec and // switch to next fragment result = rledecoder.decompress(rleData + byteOffset, OFstatic_cast(size_t, fragmentLength - byteOffset)); // special handling for zero pad byte at the end of the RLE stream // which results in an EC_StreamNotifyClient return code // or trailing garbage data which results in EC_CorruptedData if (rledecoder.size() == bytesPerStripe) result = EC_Normal; // Check if we're already done. If yes, don't change fragment if (result.good() || result == EC_StreamNotifyClient) { if (rledecoder.size() < bytesPerStripe) { DCMDATA_WARN("RLE decoder is finished but has produced insufficient data for this stripe, will continue with next pixel item"); DCMDATA_DEBUG("RLE decoder processes pixel item " << currentItem); result = pixSeq->getItem(pixItem, currentItem++); if (result.good()) { byteOffset = 0; fragmentOffset += fragmentLength; fragmentLength = pixItem->getLength(); result = pixItem->getUint8Array(rleData); } } else byteOffset = fragmentLength; } } /* while */ } else { // not the last stripe. We can use the offset table to determine // the number of bytes to feed to the RLE codec. inputBytes = rleHeader[i+2]; if (inputBytes < rleHeader[i+1]) result = EC_CannotChangeRepresentation; else { inputBytes -= rleHeader[i+1]; // number of bytes to feed to codec while ((inputBytes > (fragmentLength - byteOffset)) && result.good()) { // feed complete remaining content of fragment to RLE codec and // switch to next fragment result = rledecoder.decompress(rleData + byteOffset, OFstatic_cast(size_t, fragmentLength - byteOffset)); if (result.good() || result == EC_StreamNotifyClient) { DCMDATA_DEBUG("RLE decoder processes pixel item " << currentItem); result = pixSeq->getItem(pixItem, currentItem++); } if (result.good()) { inputBytes -= fragmentLength - byteOffset; byteOffset = 0; fragmentOffset += fragmentLength; fragmentLength = pixItem->getLength(); result = pixItem->getUint8Array(rleData); } } /* while */ // last fragment for this RLE stripe result = rledecoder.decompress(rleData + byteOffset, OFstatic_cast(size_t, inputBytes)); // special handling for zero pad byte at the end of the RLE stream // which results in an EC_StreamNotifyClient return code // or trailing garbage data which results in EC_CorruptedData if (rledecoder.size() == bytesPerStripe) result = EC_Normal; byteOffset += inputBytes; } } // make sure the RLE decoder has produced the right amount of data if (result.good() && (rledecoder.size() != bytesPerStripe)) { DCMDATA_ERROR("RLE decoder is finished but has produced insufficient data for this stripe"); result = EC_CannotChangeRepresentation; } // distribute decompressed bytes into output image array if (result.good()) { // which sample and byte are we currently compressing? sample = i / imageBytesAllocated; byte = i % imageBytesAllocated; // raw buffer containing bytesPerStripe bytes of uncompressed data outputBuffer = OFstatic_cast(Uint8 *, rledecoder.getOutputBuffer()); // compute byte offsets if (imagePlanarConfiguration == 0) { sampleOffset = sample * imageBytesAllocated; offsetBetweenSamples = imageSamplesPerPixel * imageBytesAllocated; } else { sampleOffset = sample * imageBytesAllocated * imageColumns * imageRows; offsetBetweenSamples = imageBytesAllocated; } // initialize pointer to output data if (enableReverseByteOrder) { // assume incorrect LSB to MSB order of RLE segments as produced by some tools pixelPointer = imageData8 + sampleOffset + byte; } else { pixelPointer = imageData8 + sampleOffset + imageBytesAllocated - byte - 1; } // loop through all pixels of the frame for (pixel = 0; pixel < bytesPerStripe; ++pixel) { *pixelPointer = *outputBuffer++; pixelPointer += offsetBetweenSamples; } } } /* for */ } // advance by one frame if (result.good()) { currentFrame++; imageData8 += frameSize; } } /* while still frames to process */ // adjust byte order for uncompressed image to little endian swapIfNecessary(EBO_LittleEndian, gLocalByteOrder, imageData16, totalSize, sizeof(Uint16)); // Number of Frames might have changed in case the previous value was wrong if (result.good() && (numberOfFramesPresent || (imageFrames > 1))) { char numBuf[20]; sprintf(numBuf, "%ld", OFstatic_cast(long, imageFrames)); result = OFstatic_cast(DcmItem *, dataset)->putAndInsertString(DCM_NumberOfFrames, numBuf); } } } } // the following operations do not affect the Image Pixel Module // but other modules such as SOP Common. We only perform these // changes if we're on the main level of the dataset, // which should always identify itself as dataset, not as item. if (dataset->ident() == EVR_dataset) { // create new SOP instance UID if codec parameters require so if (result.good() && djcp->getUIDCreation()) result = DcmCodec::newInstance(OFstatic_cast(DcmItem *, dataset), NULL, NULL, NULL); } } return result; } OFCondition DcmRLECodecDecoder::decodeFrame( const DcmRepresentationParameter * /* fromParam */, DcmPixelSequence * fromPixSeq, const DcmCodecParameter * cp, DcmItem *dataset, Uint32 frameNo, Uint32& startFragment, void *buffer, Uint32 bufSize, OFString& decompressedColorModel) const { OFCondition result = EC_Normal; // assume we can cast the codec parameter to what we need const DcmRLECodecParameter *djcp = OFstatic_cast(const DcmRLECodecParameter *, cp); OFBool enableReverseByteOrder = djcp->getReverseDecompressionByteOrder(); if ((!dataset)||((dataset->ident()!= EVR_dataset) && (dataset->ident()!= EVR_item))) return EC_InvalidTag; Uint16 imageSamplesPerPixel = 0; Uint16 imageRows = 0; Uint16 imageColumns = 0; Sint32 imageFrames = 1; Uint16 imageBitsAllocated = 0; Uint16 imageBytesAllocated = 0; Uint16 imagePlanarConfiguration = 0; Uint32 rleHeader[16]; OFString photometricInterpretation; DcmItem *ditem = OFstatic_cast(DcmItem *, dataset); if (result.good()) result = ditem->findAndGetUint16(DCM_SamplesPerPixel, imageSamplesPerPixel); if (result.good()) result = ditem->findAndGetUint16(DCM_Rows, imageRows); if (result.good()) result = ditem->findAndGetUint16(DCM_Columns, imageColumns); if (result.good()) result = ditem->findAndGetUint16(DCM_BitsAllocated, imageBitsAllocated); if (result.good()) result = dataset->findAndGetOFString(DCM_PhotometricInterpretation, photometricInterpretation); if (result.good()) { imageBytesAllocated = OFstatic_cast(Uint16, imageBitsAllocated / 8); if ((imageBitsAllocated < 8)||(imageBitsAllocated % 8 != 0)) return EC_CannotChangeRepresentation; } if (result.good() && (imageSamplesPerPixel > 1)) { result = ditem->findAndGetUint16(DCM_PlanarConfiguration, imagePlanarConfiguration); } // number of frames is an optional attribute - we don't mind if it isn't present. if (result.good()) (void) ditem->findAndGetSint32(DCM_NumberOfFrames, imageFrames); if (imageFrames < 1) imageFrames = 1; // default in case this attribute contains garbage if (result.bad()) return result; DcmPixelItem *pixItem = NULL; Uint8 * rleData = NULL; const size_t bytesPerStripe = imageColumns * imageRows; Uint32 numberOfStripes = 0; Uint32 fragmentLength = 0; Uint32 i; Uint32 frameSize = imageBytesAllocated * imageRows * imageColumns * imageSamplesPerPixel; if (frameSize > bufSize) return EC_IllegalCall; DcmRLEDecoder rledecoder(bytesPerStripe); if (rledecoder.fail()) return EC_MemoryExhausted; // RLE decoder failed to initialize DCMDATA_DEBUG("RLE decoder processes frame " << frameNo); // determine the corresponding item (first fragment) for this frame Uint32 currentItem = startFragment; // if the user has provided this information, we trust him. // If the user has passed a zero, try to find out ourselves. if (currentItem == 0 && result.good()) { result = determineStartFragment(frameNo, imageFrames, fromPixSeq, currentItem); if (result.bad()) return result; } DCMDATA_DEBUG("RLE decoder processes pixel item " << currentItem); // now access and decompress the frame starting at the item we have identified result = fromPixSeq->getItem(pixItem, currentItem); if (result.bad()) return result; fragmentLength = pixItem->getLength(); result = pixItem->getUint8Array(rleData); if (result.bad()) return result; // copy RLE header to buffer and adjust byte order memcpy(rleHeader, rleData, 64); swapIfNecessary(gLocalByteOrder, EBO_LittleEndian, rleHeader, 16*sizeof(Uint32), sizeof(Uint32)); // determine number of stripes. numberOfStripes = rleHeader[0]; // check that number of stripes in RLE header matches our expectation if ((numberOfStripes < 1) || (numberOfStripes > 15) || (numberOfStripes != OFstatic_cast(Uint32, imageBytesAllocated) * imageSamplesPerPixel)) return EC_CannotChangeRepresentation; // this variable keeps the current position within the current fragment Uint32 byteOffset = 0; OFBool lastStripe = OFFalse; Uint32 inputBytes = 0; // pointers for buffer copy operations Uint8 *outputBuffer = NULL; Uint8 *pixelPointer = NULL; Uint16 *imageData16 = OFreinterpret_cast(Uint16 *, buffer); Uint8 *imageData8 = OFreinterpret_cast(Uint8 *, buffer); // byte offset for first sample in frame Uint32 sampleOffset = 0; // byte offset between samples Uint32 offsetBetweenSamples = 0; // temporary variables Uint32 sample = 0; Uint32 byte = 0; register Uint32 pixel = 0; size_t bytesToDecode; // for each stripe in stripe set for (i = 0; i < numberOfStripes; ++i) { // reset RLE codec rledecoder.clear(); // adjust start point for RLE stripe byteOffset = rleHeader[i+1]; // byteOffset now points to the first byte of the new RLE stripe // check if the current stripe is the last one for this frame if (i+1 == numberOfStripes) lastStripe = OFTrue; else lastStripe = OFFalse; if (lastStripe) { // the last stripe needs special handling because we cannot use the // offset table to determine the number of bytes to feed to the codec // if the RLE data is split in multiple fragments. We need to feed // data fragment by fragment until the RLE codec has produced // sufficient output. bytesToDecode = OFstatic_cast(size_t, fragmentLength - byteOffset); } else { // not the last stripe. We can use the offset table to determine // the number of bytes to feed to the RLE codec. inputBytes = rleHeader[i+2]; if (inputBytes < rleHeader[i+1]) return EC_CannotChangeRepresentation; inputBytes -= rleHeader[i+1]; // number of bytes to feed to codec bytesToDecode = OFstatic_cast(size_t, inputBytes); } // last fragment for this RLE stripe result = rledecoder.decompress(rleData + byteOffset, bytesToDecode); // special handling for zero pad byte at the end of the RLE stream // which results in an EC_StreamNotifyClient return code // or trailing garbage data which results in EC_CorruptedData if (rledecoder.size() == bytesPerStripe) result = EC_Normal; byteOffset += inputBytes; // copy the decoded stuff over to the buffer here... // make sure the RLE decoder has produced the right amount of data if (lastStripe && (rledecoder.size() < bytesPerStripe)) { // stream ended premature? report a warning and continue if (result == EC_StreamNotifyClient) { DCMDATA_WARN("RLE decoder is finished but has produced insufficient data for this stripe, filling remaining pixels"); result = EC_Normal; } } else if (rledecoder.size() != bytesPerStripe) { DCMDATA_ERROR("RLE decoder is finished but has produced insufficient data for this stripe"); return EC_CannotChangeRepresentation; } // distribute decompressed bytes into output image array // which sample and byte are we currently decompressing? sample = i / imageBytesAllocated; byte = i % imageBytesAllocated; // raw buffer containing bytesPerStripe bytes of uncompressed data outputBuffer = OFstatic_cast(Uint8 *, rledecoder.getOutputBuffer()); // compute byte offsets if (imagePlanarConfiguration == 0) { sampleOffset = sample * imageBytesAllocated; offsetBetweenSamples = imageSamplesPerPixel * imageBytesAllocated; } else { sampleOffset = sample * imageBytesAllocated * imageColumns * imageRows; offsetBetweenSamples = imageBytesAllocated; } // initialize pointer to output data if (enableReverseByteOrder) { // assume incorrect LSB to MSB order of RLE segments as produced by some tools pixelPointer = imageData8 + sampleOffset + byte; } else { pixelPointer = imageData8 + sampleOffset + imageBytesAllocated - byte - 1; } // copy the pixel data that was decoded const size_t decoderSize = rledecoder.size(); for (pixel = 0; pixel < decoderSize; ++pixel) { *pixelPointer = *outputBuffer++; pixelPointer += offsetBetweenSamples; } // and fill the remainder of the image with copies of the last decoded pixel const Uint8 lastPixelValue = *(outputBuffer - 1); for (pixel = decoderSize; pixel < bytesPerStripe; ++pixel) { *pixelPointer = lastPixelValue; pixelPointer += offsetBetweenSamples; } } /* remove used fragment from memory */ pixItem->compact(); // there should only be one... if (result.good()) { // compression was successful. Now update output parameters startFragment = currentItem + 1; decompressedColorModel = photometricInterpretation; } // adjust byte order for uncompressed image to little endian swapIfNecessary(EBO_LittleEndian, gLocalByteOrder, imageData16, frameSize, sizeof(Uint16)); return result; } OFCondition DcmRLECodecDecoder::encode( const Uint16 * /* pixelData */, const Uint32 /* length */, const DcmRepresentationParameter * /* toRepParam */, DcmPixelSequence * & /* pixSeq */, const DcmCodecParameter * /* cp */, DcmStack & /* objStack */) const { // we are a decoder only return EC_IllegalCall; } OFCondition DcmRLECodecDecoder::encode( const E_TransferSyntax /* fromRepType */, const DcmRepresentationParameter * /* fromRepParam */, DcmPixelSequence * /* fromPixSeq */, const DcmRepresentationParameter * /* toRepParam */, DcmPixelSequence * & /* toPixSeq */, const DcmCodecParameter * /* cp */, DcmStack & /* objStack */) const { // we don't support re-coding for now. return EC_IllegalCall; } OFCondition DcmRLECodecDecoder::determineDecompressedColorModel( const DcmRepresentationParameter * /* fromParam */, DcmPixelSequence * /* fromPixSeq */, const DcmCodecParameter * /* cp */, DcmItem *dataset, OFString &decompressedColorModel) const { OFCondition result = EC_InvalidTag; if ((dataset != NULL ) && ((dataset->ident() == EVR_dataset) || (dataset->ident() == EVR_item))) { // retrieve color model from given dataset result = dataset->findAndGetOFString(DCM_PhotometricInterpretation, decompressedColorModel); } return result; } /* * CVS/RCS Log * $Log: dcrleccd.cc,v $ * Revision 1.18 2010-11-01 10:42:44 uli * Fixed some compiler warnings reported by gcc with additional flags. * * Revision 1.17 2010-10-14 13:14:09 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.16 2010-10-01 10:21:05 uli * Fixed most compiler warnings from -Wall -Wextra -pedantic in dcmdata. * * Revision 1.15 2010-05-27 16:52:32 joergr * Re-added comment that was accidentally removed by the last commit. * * Revision 1.14 2010-05-21 14:02:48 joergr * Fixed issue with incorrectly encoded RLE images: Now, if the RLE decoder is * finished but has produced insufficient data, the remaining pixels of the * image are filled with the value of the last pixel. Applies to decodeFrame(). * Added useful log messages on various levels to decode() and decodeFrame(). * * Revision 1.13 2009-11-17 16:41:26 joergr * Added new method that allows for determining the color model of the * decompressed image. * * Revision 1.12 2009-11-04 09:58:10 uli * Switched to logging mechanism provided by the "new" oflog module * * Revision 1.11 2009-08-10 11:27:00 meichel * Added working implementation of DcmRLECodecDecoder::decodeFrame(). * * Revision 1.10 2009-08-10 09:38:06 meichel * All decompression codecs now replace NumberOfFrames if larger than one * or present in the original image. * * Revision 1.9 2008-08-15 09:18:13 meichel * Decoder now gracefully handles the case of faulty images where value of * NumberOfFrames is larger than the number of compressed fragments, if and only * if there is just a single fragment per frame. * * Revision 1.8 2008-05-29 10:46:16 meichel * Implemented new method DcmPixelData::getUncompressedFrame * that permits frame-wise access to compressed and uncompressed * objects without ever loading the complete object into main memory. * For this new method to work with compressed images, all classes derived from * DcmCodec need to implement a new method decodeFrame(). For now, only * dummy implementations returning an error code have been defined. * * Revision 1.7 2005/12/08 15:41:29 meichel * Changed include path schema for all DCMTK header files * * Revision 1.6 2005/07/26 17:08:35 meichel * Added option to RLE decoder that allows to correctly decode images with * incorrect byte order of byte segments (LSB instead of MSB). * * Revision 1.5 2004/08/24 14:54:20 meichel * Updated compression helper methods. Image type is not set to SECONDARY * any more, support for the purpose of reference code sequence added. * * Revision 1.4 2003/08/14 09:01:06 meichel * Adapted type casts to new-style typecast operators defined in ofcast.h * * Revision 1.3 2003/03/21 13:08:04 meichel * Minor code purifications for warnings reported by MSVC in Level 4 * * Revision 1.2 2002/07/18 12:15:39 joergr * Added explicit type casts to keep Sun CC 2.0.1 quiet. * * Revision 1.1 2002/06/06 14:52:40 meichel * Initial release of the new RLE codec classes * and the dcmcrle/dcmdrle tools in module dcmdata * * */ dcmtk-3.6.0/dcmdata/libsrc/dcelem.cc0000644000310500011400000022000711464747626016474 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Gerd Ehlers, Andreas Barth * * Purpose: Implementation of class DcmElement * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-11-05 09:34:14 $ * CVS/RCS Revision: $Revision: 1.88 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #define INCLUDE_NEW #define INCLUDE_CSTDLIB #define INCLUDE_CSTRING #include "dcmtk/ofstd/ofstdinc.h" #include "dcmtk/ofstd/ofdefine.h" #include "dcmtk/ofstd/ofstd.h" #include "dcmtk/ofstd/ofstream.h" #include "dcmtk/dcmdata/dcelem.h" #include "dcmtk/dcmdata/dcobject.h" #include "dcmtk/dcmdata/dcswap.h" #include "dcmtk/dcmdata/dcistrma.h" /* for class DcmInputStream */ #include "dcmtk/dcmdata/dcostrma.h" /* for class DcmOutputStream */ #include "dcmtk/dcmdata/dcfcache.h" /* for class DcmFileCache */ #include "dcmtk/dcmdata/dcwcache.h" /* for class DcmWriteCache */ #include "dcmtk/dcmdata/dcitem.h" #include "dcmtk/dcmdata/dcdeftag.h" #include "dcmtk/dcmdata/vrscan.h" #define SWAPBUFFER_SIZE 16 /* sufficient for all DICOM VRs as per the 2007 edition */ // // CLASS DcmElement // DcmElement::DcmElement(const DcmTag &tag, const Uint32 len) : DcmObject(tag, len), fByteOrder(gLocalByteOrder), fLoadValue(NULL), fValue(NULL) { } DcmElement::DcmElement(const DcmElement &elem) : DcmObject(elem), fByteOrder(elem.fByteOrder), fLoadValue(NULL), fValue(NULL) { if (elem.fValue) { DcmVR vr(elem.getVR()); const unsigned short pad = (vr.isaString()) ? OFstatic_cast(unsigned short, 1) : OFstatic_cast(unsigned short, 0); // The next lines are a special version of newValueField(). // newValueField() cannot be used because it is virtual and it does // not allocate enough bytes for strings. The number of pad bytes // is added to the Length for this purpose. if (getLengthField() & 1) { #ifdef HAVE_STD__NOTHROW // we want to use a non-throwing new here if available // If the allocation fails, we report an EC_MemoryExhausted error // back to the caller. fValue = new (std::nothrow) Uint8[getLengthField() + 1 + pad]; // protocol error: odd value length #else fValue = new Uint8[getLengthField() + 1 + pad]; // protocol error: odd value length #endif if (fValue) fValue[getLengthField()] = 0; setLengthField(getLengthField() + 1); // make Length even } else { #ifdef HAVE_STD__NOTHROW // we want to use a non-throwing new here if available. // If the allocation fails, we report an EC_MemoryExhausted error // back to the caller. fValue = new (std::nothrow) Uint8[getLengthField() + pad]; #else fValue = new Uint8[getLengthField() + pad]; #endif } if (!fValue) errorFlag = EC_MemoryExhausted; if (pad && fValue) fValue[getLengthField()] = 0; memcpy(fValue, elem.fValue, size_t(getLengthField() + pad)); } if (elem.fLoadValue) fLoadValue = elem.fLoadValue->clone(); } DcmElement &DcmElement::operator=(const DcmElement &obj) { if (this != &obj) { #if defined(HAVE_STD__NOTHROW) && defined(HAVE_NOTHROW_DELETE) // if created with the nothrow version it must also be deleted with // the nothrow version else memory error. operator delete[] (fValue, std::nothrow); #else delete[] fValue; #endif delete fLoadValue; fLoadValue = NULL; fValue = NULL; DcmObject::operator=(obj); fByteOrder = obj.fByteOrder; if (obj.fValue) { DcmVR vr(obj.getVR()); const unsigned short pad = (vr.isaString()) ? OFstatic_cast(unsigned short, 1) : OFstatic_cast(unsigned short, 0); // The next lines are a special version of newValueField(). // newValueField() cannot be used because it is virtual and it does // not allocate enough bytes for strings. The number of pad bytes // is added to the Length for this purpose. if (getLengthField() & 1) { #ifdef HAVE_STD__NOTHROW // we want to use a non-throwing new here if available. // If the allocation fails, we report an EC_MemoryExhausted error // back to the caller. fValue = new (std::nothrow) Uint8[getLengthField() + 1 + pad]; // protocol error: odd value length #else fValue = new Uint8[getLengthField() + 1 + pad]; // protocol error: odd value length #endif if (fValue) fValue[getLengthField()] = 0; setLengthField(getLengthField() + 1); // make Length even } else { #ifdef HAVE_STD__NOTHROW // we want to use a non-throwing new here if available. // If the allocation fails, we report an EC_MemoryExhausted error // back to the caller. fValue = new (std::nothrow) Uint8[getLengthField() + pad]; #else fValue = new Uint8[getLengthField() + pad]; #endif } if (!fValue) errorFlag = EC_MemoryExhausted; if (pad && fValue) fValue[getLengthField()] = 0; memcpy(fValue, obj.fValue, size_t(getLengthField()+pad)); } if (obj.fLoadValue) fLoadValue = obj.fLoadValue->clone(); } return *this; } OFCondition DcmElement::copyFrom(const DcmObject& rhs) { if (this != &rhs) { if (rhs.ident() != ident()) return EC_IllegalCall; *this = OFstatic_cast(const DcmElement &, rhs); } return EC_Normal; } DcmElement::~DcmElement() { #if defined(HAVE_STD__NOTHROW) && defined(HAVE_NOTHROW_DELETE) // if created with the nothrow version it must also be deleted with // the nothrow version else memory error. operator delete[] (fValue, std::nothrow); #else delete[] fValue; #endif delete fLoadValue; } // ******************************** OFCondition DcmElement::clear() { errorFlag = EC_Normal; #if defined(HAVE_STD__NOTHROW) && defined(HAVE_NOTHROW_DELETE) // if created with the nothrow version it must also be deleted with // the nothrow version else memory error. operator delete[] (fValue, std::nothrow); #else delete[] fValue; #endif fValue = NULL; delete fLoadValue; fLoadValue = NULL; setLengthField(0); return errorFlag; } OFCondition DcmElement::checkValue(const OFString & /*vm*/, const OFBool /*oldFormat*/) { return EC_IllegalCall; } // ******************************** Uint32 DcmElement::calcElementLength(const E_TransferSyntax xfer, const E_EncodingType enctype) { DcmXfer xferSyn(xfer); const Uint32 headerLength = xferSyn.sizeofTagHeader(getVR()); const Uint32 elemLength = getLength(xfer, enctype); if (OFStandard::check32BitAddOverflow(headerLength, elemLength)) return DCM_UndefinedLength; else return headerLength + elemLength; } OFBool DcmElement::canWriteXfer(const E_TransferSyntax newXfer, const E_TransferSyntax /*oldXfer*/) { OFBool canWrite = (newXfer != EXS_Unknown); if (canWrite) { /* check whether element value exceeds length field (in case of 16 bit) */ if (DcmXfer(newXfer).isExplicitVR() && !DcmVR(getVR()).usesExtendedLengthEncoding()) { const Uint32 length = getLength(newXfer); if (length > 0xffff) { DCMDATA_DEBUG("DcmElement::canWriteXfer() Length of element " << getTagName() << " " << getTag() << " exceeds maximum of 16-bit length field (" << length << " > 65535 bytes)"); canWrite = OFFalse; } } } return canWrite; } OFCondition DcmElement::detachValueField(OFBool copy) { OFCondition l_error = EC_Normal; if (getLengthField() != 0) { if (copy) { if (!fValue) l_error = loadValue(); #ifdef HAVE_STD__NOTHROW // we want to use a non-throwing new here if available Uint8 * newValue = new (std::nothrow) Uint8[getLengthField()]; #else Uint8 * newValue = new Uint8[getLengthField()]; #endif memcpy(newValue, fValue, size_t(getLengthField())); fValue = newValue; } else { fValue = NULL; setLengthField(0); } } return l_error; } // ******************************** OFCondition DcmElement::getUint8(Uint8 & /*val*/, const unsigned long /*pos*/) { errorFlag = EC_IllegalCall; return errorFlag; } OFCondition DcmElement::getSint16(Sint16 & /*val*/, const unsigned long /*pos*/) { errorFlag = EC_IllegalCall; return errorFlag; } OFCondition DcmElement::getUint16(Uint16 & /*val*/, const unsigned long /*pos*/) { errorFlag = EC_IllegalCall; return errorFlag; } OFCondition DcmElement::getSint32(Sint32 & /*val*/, const unsigned long /*pos*/) { errorFlag = EC_IllegalCall; return errorFlag; } OFCondition DcmElement::getUint32(Uint32 & /*val*/, const unsigned long /*pos*/) { errorFlag = EC_IllegalCall; return errorFlag; } OFCondition DcmElement::getFloat32(Float32 & /*val*/, const unsigned long /*pos*/) { errorFlag = EC_IllegalCall; return errorFlag; } OFCondition DcmElement::getFloat64(Float64 & /*val*/, const unsigned long /*pos*/) { errorFlag = EC_IllegalCall; return errorFlag; } OFCondition DcmElement::getTagVal(DcmTagKey & /*val*/, const unsigned long /*pos*/) { errorFlag = EC_IllegalCall; return errorFlag; } OFCondition DcmElement::getOFString(OFString &/*val*/, const unsigned long /*pos*/, OFBool /*normalize*/) { errorFlag = EC_IllegalCall; return errorFlag; } OFCondition DcmElement::getString(char * &/*val*/) { errorFlag = EC_IllegalCall; return errorFlag; } OFCondition DcmElement::getOFStringArray(OFString &value, OFBool normalize) { /* this is a general implementation which is only used when the derived VR class does not reimplement it */ errorFlag = EC_Normal; const unsigned long count = getVM(); /* intialize result string */ value.clear(); if (count > 0) { OFString string; unsigned long i = 0; /* reserve number of bytes expected (heuristic) */ value.reserve(OFstatic_cast(unsigned int, getLength())); /* iterate over all values and convert them to a character string */ while ((i < count) && (errorFlag = getOFString(string, i, normalize)).good()) { if (i > 0) value += '\\'; /* append current value to the result string */ value += string; i++; } } return errorFlag; } OFCondition DcmElement::getUint8Array(Uint8 * &/*val*/) { errorFlag = EC_IllegalCall; return errorFlag; } OFCondition DcmElement::getSint16Array(Sint16 * &/*val*/) { errorFlag = EC_IllegalCall; return errorFlag; } OFCondition DcmElement::getUint16Array(Uint16 * &/*val*/) { errorFlag = EC_IllegalCall; return errorFlag; } OFCondition DcmElement::getSint32Array(Sint32 * &/*val*/) { errorFlag = EC_IllegalCall; return errorFlag; } OFCondition DcmElement::getUint32Array(Uint32 * &/*val*/) { errorFlag = EC_IllegalCall; return errorFlag; } OFCondition DcmElement::getFloat32Array(Float32 * &/*val*/) { errorFlag = EC_IllegalCall; return errorFlag; } OFCondition DcmElement::getFloat64Array(Float64 * &/*val*/) { errorFlag = EC_IllegalCall; return errorFlag; } void *DcmElement::getValue(const E_ByteOrder newByteOrder) { /* initialize return value */ Uint8 * value = NULL; /* if the byte ordering is unknown, this is an illegal call */ if (newByteOrder == EBO_unknown) errorFlag = EC_IllegalCall; else { /* in case this call is not illegal, we need to do something. First of all, set the error flag to ok */ errorFlag = EC_Normal; /* do something only if the length of this element's value does not equal (i.e. is greater than) 0 */ if (getLengthField() != 0) { /* if the value has not yet been loaded, do so now */ if (!fValue) errorFlag = loadValue(); /* íf everything is ok */ if (errorFlag.good()) { /* if this element's value's byte ordering does not correspond to the */ /* desired byte ordering, we need to rearrange this value's bytes and */ /* set its byte order indicator variable correspondingly */ if (newByteOrder != fByteOrder) { swapIfNecessary(newByteOrder, fByteOrder, fValue, getLengthField(), getTag().getVR().getValueWidth()); fByteOrder = newByteOrder; } /* if everything is ok, assign the current value to the result variable */ if (errorFlag.good()) value = fValue; } } } /* return result */ return value; } // ******************************** OFCondition DcmElement::loadAllDataIntoMemory() { errorFlag = EC_Normal; if (!fValue && (getLengthField() != 0)) errorFlag = loadValue(); return errorFlag; } OFCondition DcmElement::loadValue(DcmInputStream *inStream) { /* initiailze return value */ errorFlag = EC_Normal; /* only if the length of this element does not equal 0, read information */ if (getLengthField() != 0) { DcmInputStream *readStream = inStream; OFBool isStreamNew = OFFalse; // if the NULL pointer was passed (i.e. we're not in the middle of // a read() cycle, and fValue is NULL (i.e. the attribute value still // remains in file and fLoadValue is not NULL (i.e. we know how to // load the value from that file, then let's do it.. if (!readStream && fLoadValue && !fValue) { /* we need to read information from the stream which is */ /* accessible through fLoadValue. Hence, reassign readStream */ readStream = fLoadValue->create(); /* set isStreamNew to OFTrue */ isStreamNew = OFTrue; /* reset number of transferred bytes to zero */ setTransferredBytes(0); } /* if we have a stream from which we can read */ if (readStream) { /* check if the stream reported an error */ errorFlag = readStream->status(); /* if we encountered the end of the stream, set the error flag correspondingly */ if (errorFlag.good() && readStream->eos()) errorFlag = EC_EndOfStream; /* if we did not encounter the end of the stream and no error occured so far, go ahead */ else if (errorFlag.good()) { /* if the object which holds this element's value does not yet exist, create it */ if (!fValue) fValue = newValueField(); /* also set errorFlag in case of error */ /* if object could be created (i.e. we have an object which can be used to capture this element's */ /* value) we need to read a certain amount of bytes from the stream */ if (fValue) { /* determine how many bytes shall be read from the stream */ const Uint32 readLength = getLengthField() - getTransferredBytes(); /* read a corresponding amount of bytes from the stream, store the information in fvalue */ /* increase the counter that counts how many bytes were actually read */ incTransferredBytes(OFstatic_cast(Uint32, readStream->read(&fValue[getTransferredBytes()], readLength))); /* if we have read all the bytes which make up this element's value */ if (getLengthField() == getTransferredBytes()) { /* call a function which performs certain operations on the information which was read */ postLoadValue(); errorFlag = EC_Normal; } /* else set the return value correspondingly */ else if (readStream->eos()) { errorFlag = EC_InvalidStream; // premature end of stream DCMDATA_ERROR("DcmElement: " << getTagName() << " " << getTag() << " larger (" << getLengthField() << ") than remaining bytes (" << getTransferredBytes() << ") in file, premature end of stream"); } else errorFlag = EC_StreamNotifyClient; } } /* if we created the stream from which information was read in this */ /* function, we need to we need to delete this object here as well */ if (isStreamNew) delete readStream; } } /* return result value */ return errorFlag; } // ******************************** Uint8 *DcmElement::newValueField() { Uint8 * value; /* if this element's lenght is odd */ Uint32 lengthField = getLengthField(); if (lengthField & 1) { if (lengthField == DCM_UndefinedLength) { /* Print an error message when private attribute states to have an odd length * equal to the maximum length, because we are not able then to make this value even (+1) * which would an overflow on some systems as well as being illegal in DICOM */ DCMDATA_ERROR("DcmElement: " << getTagName() << " " << getTag() << " has odd, maximum length (" << DCM_UndefinedLength << ") and therefore is not loaded"); errorFlag = EC_CorruptedData; return NULL; } /* create an array of Length+1 bytes */ #ifdef HAVE_STD__NOTHROW // we want to use a non-throwing new here if available. // If the allocation fails, we report an EC_MemoryExhausted error // back to the caller. value = new (std::nothrow) Uint8[lengthField + 1]; // protocol error: odd value length #else value = new Uint8[lengthField + 1]; // protocol error: odd value length #endif /* if creation was successful, set last byte to 0 (in order to initialize this byte) */ /* (no value will be assigned to this byte later, since Length was odd) */ if (value) value[lengthField] = 0; /* enforce old (pre DCMTK 3.5.2) behaviour ? */ if (!dcmAcceptOddAttributeLength.get()) { lengthField++; setLengthField(lengthField); // make Length even } } /* if this element's length is even, create a corresponding array of Lenght bytes */ else #ifdef HAVE_STD__NOTHROW // we want to use a non-throwing new here if available. // If the allocation fails, we report an EC_MemoryExhausted error // back to the caller. value = new (std::nothrow) Uint8[lengthField]; #else value = new Uint8[lengthField]; #endif /* if creation was not successful set member error flag correspondingly */ if (!value) errorFlag = EC_MemoryExhausted; /* return byte array */ return value; } // ******************************** void DcmElement::postLoadValue() { if (dcmEnableAutomaticInputDataCorrection.get()) { // newValueField always allocates an even number of bytes // and sets the pad byte to zero, so we can safely increase Length here if (getLengthField() & 1) setLengthField(getLengthField() + 1); // make Length even } } // ******************************** OFCondition DcmElement::changeValue(const void *value, const Uint32 position, const Uint32 num) { OFBool done = OFFalse; errorFlag = EC_Normal; if (position % num != 0 || getLengthField() % num != 0 || position > getLengthField()) errorFlag = EC_IllegalCall; else if (position == getLengthField()) { if (getLengthField() == 0) { errorFlag = putValue(value, num); done = OFTrue; } else { // load value (if not loaded yet) if (!fValue) loadValue(); // allocate new memory for value #ifdef HAVE_STD__NOTHROW // we want to use a non-throwing new here if available. // If the allocation fails, we report an EC_MemoryExhausted error // back to the caller. Uint8 *newValue = new (std::nothrow) Uint8[getLengthField() + num]; #else Uint8 *newValue = new Uint8[getLengthField() + num]; #endif if (!newValue) errorFlag = EC_MemoryExhausted; if (errorFlag.good()) { // swap to local byte order swapIfNecessary(gLocalByteOrder, fByteOrder, fValue, getLengthField(), getTag().getVR().getValueWidth()); fByteOrder = gLocalByteOrder; // copy old value in the beginning of new value memcpy(newValue, fValue, size_t(getLengthField())); // set parameter value in the extension memcpy(&newValue[getLengthField()], OFstatic_cast(const Uint8 *, value), size_t(num)); #if defined(HAVE_STD__NOTHROW) && defined(HAVE_NOTHROW_DELETE) // if created with the nothrow version it must also be deleted with // the nothrow version else memory error. operator delete[] (fValue, std::nothrow); #else delete[] fValue; #endif fValue = newValue; setLengthField(getLengthField() + num); } done = OFTrue; } } // copy value at position if (!done && errorFlag.good()) { // swap to local byte order swapIfNecessary(gLocalByteOrder, fByteOrder, fValue, getLengthField(), getTag().getVR().getValueWidth()); memcpy(&fValue[position], OFstatic_cast(const Uint8 *, value), size_t(num)); fByteOrder = gLocalByteOrder; } return errorFlag; } // ******************************** OFCondition DcmElement::putOFStringArray(const OFString& /* stringValue*/) { errorFlag = EC_IllegalCall; return errorFlag; } OFCondition DcmElement::putString(const char * /*val*/) { errorFlag = EC_IllegalCall; return errorFlag; } OFCondition DcmElement::putSint16(const Sint16 /*val*/, const unsigned long /*pos*/) { errorFlag = EC_IllegalCall; return errorFlag; } OFCondition DcmElement::putUint16(const Uint16 /*val*/, const unsigned long /*pos*/) { errorFlag = EC_IllegalCall; return errorFlag; } OFCondition DcmElement::putSint32(const Sint32 /*val*/, const unsigned long /*pos*/) { errorFlag = EC_IllegalCall; return errorFlag; } OFCondition DcmElement::putUint32(const Uint32 /*val*/, const unsigned long /*pos*/) { errorFlag = EC_IllegalCall; return errorFlag; } OFCondition DcmElement::putFloat32(const Float32 /*val*/, const unsigned long /*pos*/) { errorFlag = EC_IllegalCall; return errorFlag; } OFCondition DcmElement::putFloat64(const Float64 /*val*/, const unsigned long /*pos*/) { errorFlag = EC_IllegalCall; return errorFlag; } OFCondition DcmElement::putTagVal(const DcmTagKey & /*val*/, const unsigned long /*pos*/) { errorFlag = EC_IllegalCall; return errorFlag; } OFCondition DcmElement::putUint8Array(const Uint8 * /*val*/, const unsigned long /*num*/) { errorFlag = EC_IllegalCall; return errorFlag; } OFCondition DcmElement::putSint16Array(const Sint16 * /*val*/, const unsigned long /*num*/) { errorFlag = EC_IllegalCall; return errorFlag; } OFCondition DcmElement::putUint16Array(const Uint16 * /*val*/, const unsigned long /*num*/) { errorFlag = EC_IllegalCall; return errorFlag; } OFCondition DcmElement::putSint32Array(const Sint32 * /*val*/, const unsigned long /*num*/) { errorFlag = EC_IllegalCall; return errorFlag; } OFCondition DcmElement::putUint32Array(const Uint32 * /*val*/, const unsigned long /*num*/) { errorFlag = EC_IllegalCall; return errorFlag; } OFCondition DcmElement::putFloat32Array(const Float32 * /*val*/, const unsigned long /*num*/) { errorFlag = EC_IllegalCall; return errorFlag; } OFCondition DcmElement::putFloat64Array(const Float64 * /*val*/, const unsigned long /*num*/) { errorFlag = EC_IllegalCall; return errorFlag; } OFCondition DcmElement::putValue(const void * newValue, const Uint32 length) { errorFlag = EC_Normal; if (fValue) { #if defined(HAVE_STD__NOTHROW) && defined(HAVE_NOTHROW_DELETE) // if created with the nothrow version it must also be deleted with // the nothrow version else memory error. operator delete[] (fValue, std::nothrow); #else delete[] fValue; #endif } fValue = NULL; if (fLoadValue) delete fLoadValue; fLoadValue = NULL; setLengthField(length); if (length != 0) { fValue = newValueField(); // newValueField always allocates an even number of bytes // and sets the pad byte to zero, so we can safely increase Length here if (getLengthField() & 1) setLengthField(getLengthField() + 1); // make Length even // copy length (which may be odd), not Length (which is always even) if (fValue) memcpy(fValue, newValue, size_t(length)); else errorFlag = EC_MemoryExhausted; } fByteOrder = gLocalByteOrder; return errorFlag; } // ******************************** OFCondition DcmElement::createUint8Array(const Uint32 /*numBytes*/, Uint8 *& /*bytes*/) { errorFlag = EC_IllegalCall; return errorFlag; } OFCondition DcmElement::createUint16Array(const Uint32 /*numWords*/, Uint16 *& /*bytes*/) { errorFlag = EC_IllegalCall; return errorFlag; } // ******************************** OFCondition DcmElement::createEmptyValue(const Uint32 length) { errorFlag = EC_Normal; if (fValue) { #if defined(HAVE_STD__NOTHROW) && defined(HAVE_NOTHROW_DELETE) // if created with the nothrow version it must also be deleted with // the nothrow version else memory error. operator delete[] (fValue, std::nothrow); #else delete[] fValue; #endif } fValue = NULL; if (fLoadValue) delete fLoadValue; fLoadValue = NULL; setLengthField(length); if (length != 0) { fValue = newValueField(); // newValueField always allocates an even number of bytes // and sets the pad byte to zero, so we can safely increase Length here if (getLengthField() & 1) setLengthField(getLengthField() + 1); // make Length even // initialize bytes (which may be odd), not Length (which is always even) if (fValue) memzero(fValue, size_t(length)); else errorFlag = EC_MemoryExhausted; } fByteOrder = gLocalByteOrder; return errorFlag; } // ******************************** OFCondition DcmElement::read(DcmInputStream &inStream, const E_TransferSyntax ixfer, const E_GrpLenEncoding /*glenc*/, const Uint32 maxReadLength) { /* if this element's transfer state shows ERW_notInitialized, this is an illegal call */ if (getTransferState() == ERW_notInitialized) errorFlag = EC_IllegalCall; else { /* if this is not an illegal call, go ahead and create a DcmXfer */ /* object based on the transfer syntax which was passed */ DcmXfer inXfer(ixfer); /* determine the transfer syntax's byte ordering */ fByteOrder = inXfer.getByteOrder(); /* check if the stream reported an error */ errorFlag = inStream.status(); /* if we encountered the end of the stream, set the error flag correspondingly */ if (errorFlag.good() && inStream.eos()) errorFlag = EC_EndOfStream; /* if we did not encounter the end of the stream and no error occured so far, go ahead */ else if (errorFlag.good()) { /* if the transfer state is ERW_init, we need to prepare */ /* the reading of this element's value from the stream */ if (getTransferState() == ERW_init) { /* if the Length of this element's value is greater than the amount of bytes we */ /* can read from the stream and if the stream has random access, we want to create */ /* a DcmInputStreamFactory object that enables us to read this element's value later. */ /* This new object will be stored (together with the position where we have to start */ /* reading the value) in the member variable fLoadValue. */ if (getLengthField() > maxReadLength) { /* try to create a stream factory to read the value later */ delete fLoadValue; fLoadValue = inStream.newFactory(); if (fLoadValue) { offile_off_t skipped = inStream.skip(getLengthField()); if (skipped < getLengthField()) { /* If desired, specific parser errors will be ignored */ if (dcmIgnoreParsingErrors.get()) errorFlag = EC_Normal; else errorFlag = EC_StreamNotifyClient; /* Print an error message when too few bytes are available in the file in order to * distinguish this problem from any other generic "InvalidStream" problem. */ DCMDATA_ERROR("DcmElement: " << getTagName() << " " << getTag() << " larger (" << getLengthField() << ") than remaining bytes in file"); } } } /* if there is already a value for this element, delete this value */ #if defined(HAVE_STD__NOTHROW) && defined(HAVE_NOTHROW_DELETE) // if created with the nothrow version it must also be deleted with // the nothrow version else memory error. operator delete[] (fValue, std::nothrow); #else delete[] fValue; #endif /* set the transfer state to ERW_inWork */ setTransferState(ERW_inWork); } /* if the transfer state is ERW_inWork and we are not supposed */ /* to read this element's value later, read the value now */ if (getTransferState() == ERW_inWork && !fLoadValue) errorFlag = loadValue(&inStream); /* if the amount of transferred bytes equals the Length of this element */ /* or the object which contains information to read the value of this */ /* element later is existent, set the transfer state to ERW_ready */ if (getTransferredBytes() == getLengthField() || fLoadValue) setTransferState(ERW_ready); } } /* return result value */ return errorFlag; } // ******************************** void DcmElement::swapValueField(size_t valueWidth) { if (getLengthField() != 0) { if (!fValue) errorFlag = loadValue(); if (errorFlag.good()) swapBytes(fValue, getLengthField(), valueWidth); } } // ******************************** void DcmElement::transferInit() { DcmObject::transferInit(); setTransferredBytes(0); } // ******************************** OFCondition DcmElement::write(DcmOutputStream &outStream, const E_TransferSyntax oxfer, const E_EncodingType /*enctype*/, DcmWriteCache *wcache) { DcmWriteCache wcache2; /* In case the transfer state is not initialized, this is an illegal call */ if (getTransferState() == ERW_notInitialized) errorFlag = EC_IllegalCall; else { /* if this is not an illegal call, we need to do something. First */ /* of all, check the error state of the stream that was passed */ /* only do something if the error state of the stream is ok */ errorFlag = outStream.status(); if (errorFlag.good()) { /* create an object that represents the transfer syntax */ DcmXfer outXfer(oxfer); /* pointer to element value if value resides in memory or old-style * write behaviour is active (i.e. everything loaded into memory upon write) */ Uint8 *value = NULL; OFBool accessPossible = OFFalse; /* check that we actually do have access to the element's value. * If the element is unaccessable (which would mean that the value resides * in file and access to the file fails), write an empty element with * zero length. */ if (getLengthField() > 0) { if (valueLoaded()) { /* get this element's value. Mind the byte ordering (little */ /* or big endian) of the transfer syntax which shall be used */ value = OFstatic_cast(Uint8 *, getValue(outXfer.getByteOrder())); if (value) accessPossible = OFTrue; } else { /* Use local cache object if needed. This may cause those bytes * that are read but not written because the output stream stalls to * be read again, and the file from being re-opened next time. * Therefore, this case should be avoided. */ if (!wcache) wcache = &wcache2; /* initialize cache object. This is safe even if the object was already initialized */ wcache->init(this, getLengthField(), getTransferredBytes(), outXfer.getByteOrder()); /* access first block of element content */ errorFlag = wcache->fillBuffer(*this); /* check that everything worked and the buffer is non-empty now */ accessPossible = errorFlag.good() && (! wcache->bufferIsEmpty()); } } /* if this element's transfer state is ERW_init (i.e. it has not yet been written to */ /* the stream) and if the outstream provides enough space for tag and length information */ /* write tag and length information to it, do something */ if (getTransferState() == ERW_init) { /* first compare with DCM_TagInfoLength (12). If there is not enough space * in the buffer, check if the buffer is still sufficient for the requirements * of this element, which may need only 8 instead of 12 bytes. */ if ((outStream.avail() >= DCM_TagInfoLength) || (outStream.avail() >= getTagAndLengthSize(oxfer))) { /* if there is no value, Length (member variable) shall be set to 0 */ if (! accessPossible) setLengthField(0); /* remember how many bytes have been written to the stream, currently none so far */ Uint32 writtenBytes = 0; /* write tag and length information (and possibly also data type information) to the stream, */ /* mind the transfer syntax and remember the amount of bytes that have been written */ errorFlag = writeTagAndLength(outStream, oxfer, writtenBytes); /* if the writing was successful, set this element's transfer */ /* state to ERW_inWork and the amount of transferred bytes to 0 */ if (errorFlag.good()) { setTransferState(ERW_inWork); setTransferredBytes(0); } } else errorFlag = EC_StreamNotifyClient; } /* if there is a value that has to be written to the stream */ /* and if this element's transfer state is ERW_inWork */ if (accessPossible && getTransferState() == ERW_inWork) { Uint32 len = 0; if (valueLoaded()) { /* write as many bytes as possible to the stream starting at value[getTransferredBytes()] */ /* (note that the bytes value[0] to value[getTransferredBytes()-1] have already been */ /* written to the stream) */ len = OFstatic_cast(Uint32, outStream.write(&value[getTransferredBytes()], getLengthField() - getTransferredBytes())); /* increase the amount of bytes which have been transfered correspondingly */ incTransferredBytes(len); /* see if there is something fishy with the stream */ errorFlag = outStream.status(); } else { Uint32 buflen = 0; OFBool done = getTransferredBytes() == getLengthField(); while (! done) { // re-fill buffer from file if empty errorFlag = wcache->fillBuffer(*this); buflen = wcache->contentLength(); if (errorFlag.good()) { // write as many bytes from cache buffer to stream as possible len = wcache->writeBuffer(outStream); /* increase the amount of bytes which have been transfered correspondingly */ incTransferredBytes(len); /* see if there is something fishy with the stream */ errorFlag = outStream.status(); } // stop writing if something went wrong, we were unable to send all of the buffer content // (which indicates that the output stream needs to be flushed, or everything was sent out. done = errorFlag.bad() || (len < buflen) || (getTransferredBytes() == getLengthField()); } } /* if the amount of transferred bytes equals the length of the element's value, the */ /* entire value has been written to the stream. Thus, this element's transfer state */ /* has to be set to ERW_ready. If this is not the case but the error flag still shows */ /* an ok value, there was no more space in the stream and a corresponding return value */ /* has to be set. (Isn't the "else if" part superfluous?!?) */ if (getLengthField() == getTransferredBytes()) setTransferState(ERW_ready); else if (errorFlag.good()) errorFlag = EC_StreamNotifyClient; } } } /* return result value */ return errorFlag; } OFCondition DcmElement::writeSignatureFormat(DcmOutputStream &outStream, const E_TransferSyntax oxfer, const E_EncodingType enctype, DcmWriteCache *wcache) { // for normal DICOM elements (everything except sequences), the data // stream used for digital signature creation or verification is // identical to the stream used for network communication or media // storage. return write(outStream, oxfer, enctype, wcache); } // ******************************** void DcmElement::writeXMLStartTag(STD_NAMESPACE ostream &out, const size_t flags, const char *attrText) { OFString xmlString; DcmVR vr(getTag().getVR()); /* write standardized XML start tag for all element types */ out << " 0)) out << " " << attrText; out << ">"; } void DcmElement::writeXMLEndTag(STD_NAMESPACE ostream &out, const size_t /*flags*/) { /* write standardized XML end tag for all element types */ out << "" << OFendl; } OFCondition DcmElement::writeXML(STD_NAMESPACE ostream &out, const size_t flags) { /* XML start tag: */ writeXMLStartTag(out, flags); /* write element value (if loaded) */ if (valueLoaded()) { OFString value; if (getOFStringArray(value).good()) { /* check whether conversion to XML markup string is required */ if (OFStandard::checkForMarkupConversion(value)) OFStandard::convertToMarkupStream(out, value); else out << value; } } /* XML end tag: */ writeXMLEndTag(out, flags); /* always report success */ return EC_Normal; } // ******************************** OFCondition DcmElement::getPartialValue(void *targetBuffer, const Uint32 offset, Uint32 numBytes, DcmFileCache *cache, E_ByteOrder byteOrder) { // check integrity of parameters passed to this method if (targetBuffer == NULL) return EC_IllegalCall; // if the user has only requested zero bytes, we immediately return if (numBytes == 0) return EC_Normal; // offset must always be less than attribute length (unless offset, // attribute length and numBytes are all zero, a case that was // handled above). if (offset >= getLengthField()) return EC_InvalidOffset; // check if the caller is trying to read past the end of the value field if (numBytes > (getLengthField() - offset)) return EC_TooManyBytesRequested; // check if the value is already in memory if (valueLoaded()) { // the attribute value is already in memory. // change internal byte order of the attribute value to the desired byte order. // This should only happen once for multiple calls to this method since the // caller will hopefully always request the same byte order. char *value = OFstatic_cast(char *, getValue(byteOrder)); if (value) { memcpy(targetBuffer, value + offset, numBytes); } else { // this should never happen because valueLoaded() returned true, but // we don't want to dereference a NULL pointer anyway return EC_IllegalCall; } } else { // the value is not in memory. We should directly read from file and // also consider byte order. // since the value is not in memory, fLoadValue should exist. Check anyway. if (! fLoadValue) return EC_IllegalCall; // make sure we have a file cache object DcmFileCache defaultcache; // automatic object, creation is cheap. if (cache == NULL) cache = &defaultcache; // the stream from which we will read the attribute value DcmInputStream *readStream = NULL; // check if we need to seek to a position in file earlier than // the one specified by the user in order to correctly swap according // to the VR. size_t valueWidth = getTag().getVR().getValueWidth(); // we need to cast the target buffer to something we can increment bytewise char *targetBufferChar = OFreinterpret_cast(char *, targetBuffer); // the swap buffer should be large enough to keep one value of the current VR unsigned char swapBuffer[SWAPBUFFER_SIZE]; if (valueWidth > SWAPBUFFER_SIZE) return EC_IllegalCall; // seekoffset is the number of bytes we need to skip from the beginning of the // value field to the point where we will start reading. This is always at the // start of a new value of a multi-valued attribute. Uint32 partialvalue = 0; const Uint32 partialoffset = offset % valueWidth; const offile_off_t seekoffset = offset - partialoffset; // check if cache already contains the stream we're looking for if (cache->isUser(this)) { readStream = cache->getStream(); // since we cannot seek back in the stream (only forward), check if the stream // is already past our needed start position if (readStream->tell() - cache->getOffset() > seekoffset) { readStream = NULL; } } // initialize the cache with new stream if (!readStream) { readStream = fLoadValue->create(); // check that read stream is non-NULL if (readStream == NULL) return EC_InvalidStream; // check that stream status is OK if (readStream->status().bad()) return readStream->status(); cache->init(readStream, this); } // now skip bytes from our current position in file to where we // want to start reading. offile_off_t remainingBytesToSkip = seekoffset - (readStream->tell() - cache->getOffset()); offile_off_t skipResult; while (remainingBytesToSkip) { skipResult = readStream->skip(remainingBytesToSkip); if (skipResult == 0) return EC_InvalidStream; // error while skipping remainingBytesToSkip -= skipResult; } // check if the first few bytes we want to read are "in the middle" of one value // of a multi-valued attribute. In that case we need to read the complete value, // swap it and then copy only the last bytes in desired byte order. if (partialoffset > 0) { // we possibly want to reset the stream to this point later readStream->mark(); // compute the number of bytes we need to copy from the first attributes partialvalue = valueWidth - partialoffset; // we need to read a single data element into the swap buffer if (valueWidth != OFstatic_cast(size_t, readStream->read(swapBuffer, valueWidth))) return EC_InvalidStream; // swap to desired byte order. fByteOrder contains the byte order in file. swapIfNecessary(byteOrder, fByteOrder, swapBuffer, valueWidth, valueWidth); // copy to target buffer and adjust values if (partialvalue > numBytes) { memcpy(targetBufferChar, &swapBuffer[partialoffset], numBytes); targetBufferChar += numBytes; numBytes = 0; // Reset stream to position marked before, since we have not copied the complete value readStream->putback(); } else { memcpy(targetBufferChar, &swapBuffer[partialoffset], partialvalue); targetBufferChar += partialvalue; numBytes -= partialvalue; } } // now read the main block of data directly into the target buffer partialvalue = numBytes % valueWidth; const Uint32 bytesToRead = numBytes - partialvalue; if (bytesToRead > 0) { // here we read the main block of data if (bytesToRead != readStream->read(targetBufferChar, bytesToRead)) return EC_InvalidStream; // swap to desired byte order. fByteOrder contains the byte order in file. swapIfNecessary(byteOrder, fByteOrder, targetBufferChar, bytesToRead, valueWidth); // adjust pointer to target buffer targetBufferChar += bytesToRead; } // check if the last few bytes we want to read are only a partial value. // In that case we need to read the complete value, swap it and then copy // only the first few bytes in desired byte order. if (partialvalue > 0) { // we want to reset the stream to this point later readStream->mark(); // we need to read a single data element into the swap buffer if (valueWidth != OFstatic_cast(size_t, readStream->read(swapBuffer, valueWidth))) return EC_InvalidStream; // swap to desired byte order. fByteOrder contains the byte order in file. swapIfNecessary(byteOrder, fByteOrder, swapBuffer, valueWidth, valueWidth); // copy to target buffer and adjust values memcpy(targetBufferChar, swapBuffer, partialvalue); // finally reset stream to position marked before readStream->putback(); } } // done. return EC_Normal; } void DcmElement::compact() { if (fLoadValue && fValue) { delete[] fValue; fValue = NULL; setTransferredBytes(0); } } OFCondition DcmElement::createValueFromTempFile(DcmInputStreamFactory *factory, const Uint32 length, const E_ByteOrder byteOrder) { if (factory && !(length & 1)) { #if defined(HAVE_STD__NOTHROW) && defined(HAVE_NOTHROW_DELETE) // if created with the nothrow version it must also be deleted with // the nothrow version else memory error. operator delete[] (fValue, std::nothrow); #else delete[] fValue; #endif fValue = 0; delete fLoadValue; fLoadValue = factory; fByteOrder = byteOrder; setLengthField(length); return EC_Normal; } else return EC_IllegalCall; } OFCondition DcmElement::getUncompressedFrameSize(DcmItem *dataset, Uint32 &frameSize) const { if (dataset == NULL) return EC_IllegalCall; Uint16 rows = 0; Uint16 cols = 0; Uint16 samplesPerPixel = 0; Uint16 bitsAllocated = 0; // retrieve values from dataset OFCondition result = EC_Normal; if (result.good()) result = dataset->findAndGetUint16(DCM_Columns, cols); if (result.good()) result = dataset->findAndGetUint16(DCM_Rows, rows); if (result.good()) result = dataset->findAndGetUint16(DCM_SamplesPerPixel, samplesPerPixel); if (result.good()) result = dataset->findAndGetUint16(DCM_BitsAllocated, bitsAllocated); // compute frame size if ((bitsAllocated % 8) == 0) { const Uint16 bytesAllocated = bitsAllocated / 8; frameSize = bytesAllocated * rows * cols * samplesPerPixel; } else { /* need to split calculation in order to avoid integer overflow for large pixel data */ const Uint32 v1 = rows * cols * samplesPerPixel; const Uint32 v2 = (bitsAllocated / 8) * v1; const Uint32 v3 = ((bitsAllocated % 8) * v1 + 7) / 8; // # old code: frameSize = (bitsAllocated * rows * cols * samplesPerPixel + 7) / 8; frameSize = v2 + v3; } return result; } OFCondition DcmElement::getUncompressedFrame(DcmItem * /* dataset */ , Uint32 /* frameNo */ , Uint32& /* startFragment */ , void * /* buffer */ , Uint32 /* bufSize */ , OFString& /* decompressedColorModel */ , DcmFileCache * /* cache */ ) { return EC_IllegalCall; } OFCondition DcmElement::getDecompressedColorModel(DcmItem * /* dataset */, OFString & /* decompressedColorModel */) { return EC_IllegalCall; } // ******************************** int DcmElement::scanValue(const OFString &value, const OFString &vr, const size_t pos, const size_t num) { // Only create a copy of the string if we have to, this could be a lot of data if (pos == 0 && (num == OFString_npos || num >= value.length())) return vrscan::scan(vr, value); // construct input string to be scanned OFString realValue(value, pos, num); return vrscan::scan(vr, realValue); } OFCondition DcmElement::checkVM(const unsigned long vmNum, const OFString &vmStr) { OFCondition result = EC_Normal; // only check non-empty values if (vmNum > 0) { if (vmStr == "1") { if (vmNum != 1) result = EC_ValueMultiplicityViolated; } else if (vmStr == "1-2") { if (vmNum > 2) result = EC_ValueMultiplicityViolated; } else if (vmStr == "1-3") { if (vmNum > 3) result = EC_ValueMultiplicityViolated; } else if (vmStr == "1-8") { if (vmNum > 8) result = EC_ValueMultiplicityViolated; } else if (vmStr == "1-99") { if (vmNum > 99) result = EC_ValueMultiplicityViolated; } else if (vmStr == "2") { if (vmNum != 2) result = EC_ValueMultiplicityViolated; } else if (vmStr == "2-n") { if (vmNum < 2) result = EC_ValueMultiplicityViolated; } else if (vmStr == "2-2n") { if ((vmNum % 2) != 0) result = EC_ValueMultiplicityViolated; } else if (vmStr == "3") { if (vmNum != 3) result = EC_ValueMultiplicityViolated; } else if (vmStr == "3-n") { if (vmNum < 3) result = EC_ValueMultiplicityViolated; } else if (vmStr == "3-3n") { if ((vmNum % 3) != 0) result = EC_ValueMultiplicityViolated; } else if (vmStr == "4") { if (vmNum != 4) result = EC_ValueMultiplicityViolated; } else if (vmStr == "6") { if (vmNum != 6) result = EC_ValueMultiplicityViolated; } else if (vmStr == "9") { if (vmNum != 9) result = EC_ValueMultiplicityViolated; } else if (vmStr == "16") { if (vmNum != 16) result = EC_ValueMultiplicityViolated; } else if (vmStr == "32") { if (vmNum != 32) result = EC_ValueMultiplicityViolated; } else if (vmStr != "1-n") { // given value of 'vmStr' not (yet) supported result = EC_IllegalParameter; } } return result; } /* ** CVS/RCS Log: ** $Log: dcelem.cc,v $ ** Revision 1.88 2010-11-05 09:34:14 joergr ** Added support for checking the value multiplicity "9" (see Supplement 131). ** ** Revision 1.87 2010-10-20 16:44:16 joergr ** Use type cast macros (e.g. OFstatic_cast) where appropriate. ** ** Revision 1.86 2010-10-14 13:14:07 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.85 2010-09-02 09:56:54 uli ** Avoid a pointless data-copy in DcmElement::scanValue() if possible. ** ** Revision 1.84 2010-09-02 09:49:38 uli ** Add the VR prefix into the scanner instead of adding it in the caller. ** ** Revision 1.83 2010-08-26 12:29:48 uli ** Ported vrscan from ancient flex++ to current flex version. ** ** Revision 1.82 2010-04-23 14:33:57 joergr ** Added new method to all VR classes which checks whether the stored value ** conforms to the VR definition and to the specified VM. ** ** Revision 1.81 2010-04-22 09:02:10 joergr ** Added support for further VM values ("1-8", "1-99", "16", "32") to be ** checked. ** ** Revision 1.80 2010-02-25 13:50:15 joergr ** Fixed issue with element values which exceed the maximum of a 16-bit length ** field. ** ** Revision 1.79 2010-01-21 15:05:59 joergr ** Switched to new stream variant of method convertToMarkupString() where ** appropriate. ** ** Revision 1.78 2009-11-17 16:41:26 joergr ** Added new method that allows for determining the color model of the ** decompressed image. ** ** Revision 1.77 2009-11-13 13:11:20 joergr ** Fixed minor issues in log output. ** ** Revision 1.76 2009-11-04 09:58:09 uli ** Switched to logging mechanism provided by the "new" oflog module ** ** Revision 1.75 2009-09-28 13:34:08 joergr ** Moved general purpose definition file from module dcmdata to ofstd, and ** added new defines in order to make the usage easier. ** ** Revision 1.74 2009-08-06 15:57:17 meichel ** Use of std::nothrow delete now conditional on compiler support for this feature ** ** Revision 1.73 2009-08-04 07:57:20 joergr ** Consistently use non-throwing version of "new" and "delete[]" (if available) ** in order to avoid memory creation/deletion mismatches. ** ** Revision 1.72 2009-08-03 09:02:59 joergr ** Added methods that check whether a given string value conforms to the VR and ** VM definitions of the DICOM standards. ** ** Revision 1.71 2009-06-04 17:10:19 joergr ** Fixed minor source code formatting issues. ** ** Revision 1.70 2009-05-13 09:54:54 joergr ** Fixed possible integer overflow for images with very large pixel data in ** method getUncompressedFrameSize() for the rare case that BitsAllocated is ** not a multiple of 8. ** ** Revision 1.69 2009-05-11 16:05:47 meichel ** Minor fix in DcmElement::getUncompressedFrameSize for the rare case that ** BitsAllocated is not 8 or 16. Also the method now returns the true frame ** size without any pad byte. ** ** Revision 1.68 2009-03-05 13:35:07 onken ** Added checks for sequence and item lengths which prevents overflow in length ** field, if total length of contained items (or sequences) exceeds 32-bit ** length field. Also introduced new flag (default: enabled) for writing ** in explicit length mode, which allows for automatically switching encoding ** of only that very sequence/item to undefined length coding (thus permitting ** to actually write the file). ** ** Revision 1.67 2009-02-05 14:59:43 onken ** Make usage of global "ignore parsing errors" flag in case of elements ** being larger than rest of available input. However, if enabled, the ** parser ignores any elements coming after such an input-exceeding ** element. Minor code clarifications. ** ** Revision 1.66 2009-02-04 18:03:56 joergr ** Fixed various type mismatches reported by MSVC introduced with OFFile class. ** ** Revision 1.65 2009-01-29 15:34:45 onken ** Fixed length overflow in case of private attributes having maximum length ** values. Minor code simplifications. ** ** Revision 1.64 2008-11-03 14:26:58 joergr ** Fixed wrong check of odd/even length in method createValueFromTempFile(). ** ** Revision 1.63 2008-10-28 11:40:26 joergr ** Output detailed error message in case of "premature end of stream". ** ** Revision 1.62 2008-07-17 10:31:31 onken ** Implemented copyFrom() method for complete DcmObject class hierarchy, which ** permits setting an instance's value from an existing object. Implemented ** assignment operator where necessary. ** ** Revision 1.61 2008-05-29 10:43:20 meichel ** Implemented new method createValueFromTempFile that allows the content of ** a temporary file to be set as the new value of a DICOM element. ** Also added a new method compact() that removes the value field if the ** value field can still be reconstructed from file. For large attribute ** value the file reference is now kept in memory even when the value has ** been loaded once. Finally, added new helper method getUncompressedFrameSize ** that computes the size of an uncompressed frame for a given dataset. ** ** Revision 1.60 2007/11/29 14:30:21 meichel ** Write methods now handle large raw data elements (such as pixel data) ** without loading everything into memory. This allows very large images to ** be sent over a network connection, or to be copied without ever being ** fully in memory. ** ** Revision 1.59 2007/11/23 15:42:36 meichel ** Copy assignment operators in dcmdata now safe for self assignment ** ** Revision 1.58 2007/07/11 08:50:21 meichel ** Initial release of new method DcmElement::getPartialValue which gives access ** to partial attribute values without loading the complete attribute value ** into memory, if kept in file. ** ** Revision 1.57 2007/06/29 14:17:49 meichel ** Code clean-up: Most member variables in module dcmdata are now private, ** not protected anymore. ** ** Revision 1.56 2007/06/07 09:03:17 joergr ** Added createUint8Array() and createUint16Array() methods. ** ** Revision 1.55 2007/02/20 13:19:25 joergr ** Fixed wrong spelling in error message. ** ** Revision 1.54 2006/10/13 10:07:49 joergr ** Added new helper function that allows to check whether the conversion to an ** HTML/XML markup string is required. ** ** Revision 1.53 2006/08/15 15:49:54 meichel ** Updated all code in module dcmdata to correctly compile when ** all standard C++ classes remain in namespace std. ** ** Revision 1.52 2006/05/11 08:48:35 joergr ** Added new option that allows to omit the element name in the XML output. ** ** Revision 1.51 2005/12/08 15:41:08 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.50 2005/07/27 09:31:45 joergr ** Fixed bug in getOFStringArray() which prevented the result string from being ** cleared under certain circumstances. ** ** Revision 1.49 2004/04/27 09:21:27 wilkens ** Fixed a bug in dcelem.cc which occurs when one is serializing a dataset ** (that contains an attribute whose length value is coded with 2 bytes) into ** a given buffer. Although the number of available bytes in the buffer was ** sufficient, the dataset->write(...) method would always return ** EC_StreamNotifyClient to indicate that there are not sufficient bytes ** available in the buffer. This code modification fixes the problem. ** ** Revision 1.48 2004/02/04 16:29:00 joergr ** Adapted type casts to new-style typecast operators defined in ofcast.h. ** ** Revision 1.47 2003/12/11 13:40:46 meichel ** newValueField() now uses std::nothrow new if available ** ** Revision 1.46 2003/10/15 16:55:43 meichel ** Updated error messages for parse errors ** ** Revision 1.45 2003/03/21 13:08:04 meichel ** Minor code purifications for warnings reported by MSVC in Level 4 ** ** Revision 1.44 2002/12/09 09:30:50 wilkens ** Modified/Added doc++ documentation. ** ** Revision 1.43 2002/12/06 13:15:12 joergr ** Enhanced "print()" function by re-working the implementation and replacing ** the boolean "showFullData" parameter by a more general integer flag. ** Made source code formatting more consistent with other modules/files. ** ** Revision 1.42 2002/11/27 12:06:46 meichel ** Adapted module dcmdata to use of new header file ofstdinc.h ** ** Revision 1.41 2002/09/17 13:00:11 meichel ** Improved one error code return ** ** Revision 1.40 2002/08/27 16:55:46 meichel ** Initial release of new DICOM I/O stream classes that add support for stream ** compression (deflated little endian explicit VR transfer syntax) ** ** Revision 1.39 2002/07/08 14:44:39 meichel ** Improved dcmdata behaviour when reading odd tag length. Depending on the ** global boolean flag dcmAcceptOddAttributeLength, the parser now either accepts ** odd length attributes or implements the old behaviour, i.e. assumes a real ** length larger by one. ** ** Revision 1.38 2002/04/25 10:15:09 joergr ** Added/modified getOFStringArray() implementation. ** Added support for XML output of DICOM objects. ** ** Revision 1.37 2001/11/16 15:55:02 meichel ** Adapted digital signature code to final text of supplement 41. ** ** Revision 1.36 2001/11/01 14:55:36 wilkens ** Added lots of comments. ** ** Revision 1.35 2001/09/25 17:19:49 meichel ** Adapted dcmdata to class OFCondition ** ** Revision 1.34 2001/06/01 15:49:03 meichel ** Updated copyright header ** ** Revision 1.33 2001/05/10 12:50:23 meichel ** Added protected createEmptyValue() method in class DcmElement. ** ** Revision 1.32 2000/11/07 16:56:19 meichel ** Initial release of dcmsign module for DICOM Digital Signatures ** ** Revision 1.31 2000/04/14 15:55:04 meichel ** Dcmdata library code now consistently uses ofConsole for error output. ** ** Revision 1.30 2000/03/08 16:26:34 meichel ** Updated copyright header. ** ** Revision 1.29 2000/03/03 14:05:32 meichel ** Implemented library support for redirecting error messages into memory ** instead of printing them to stdout/stderr for GUI applications. ** ** Revision 1.28 2000/02/23 15:11:51 meichel ** Corrected macro for Borland C++ Builder 4 workaround. ** ** Revision 1.27 2000/02/01 10:12:06 meichel ** Avoiding to include as extern "C" on Borland C++ Builder 4, ** workaround for bug in compiler header files. ** ** Revision 1.26 1999/03/31 09:25:26 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.25 1999/03/22 15:46:24 meichel ** Printing explicit error message when DICOM file is too short. ** ** Revision 1.24 1998/11/12 16:48:15 meichel ** Implemented operator= for all classes derived from DcmObject. ** ** Revision 1.23 1998/07/15 15:51:55 joergr ** Removed several compiler warnings reported by gcc 2.8.1 with ** additional options, e.g. missing copy constructors and assignment ** operators, initialization of member variables in the body of a ** constructor instead of the member initialization list, hiding of ** methods by use of identical names, uninitialized member variables, ** missing const declaration of char pointers. Replaced tabs by spaces. ** ** Revision 1.22 1998/01/14 15:22:35 hewett ** Replaced a switch construct to use to the isaString method. ** ** Revision 1.21 1997/09/11 15:24:39 hewett ** Added a putOFStringArray method. ** ** Revision 1.20 1997/08/29 08:32:54 andreas ** - Added methods getOFString and getOFStringArray for all ** string VRs. These methods are able to normalise the value, i. e. ** to remove leading and trailing spaces. This will be done only if ** it is described in the standard that these spaces are not relevant. ** These methods do not test the strings for conformance, this means ** especially that they do not delete spaces where they are not allowed! ** getOFStringArray returns the string with all its parts separated by \ ** and getOFString returns only one value of the string. ** CAUTION: Currently getString returns a string with trailing ** spaces removed (if dcmEnableAutomaticInputDataCorrection == OFTrue) and ** truncates the original string (since it is not copied!). If you rely on this ** behaviour please change your application now. ** Future changes will ensure that getString returns the original ** string from the DICOM object (NULL terminated) inclusive padding. ** Currently, if you call getOF... before calling getString without ** normalisation, you can get the original string read from the DICOM object. ** ** Revision 1.19 1997/07/31 06:58:04 andreas ** new protected method swapValueField for DcmElement ** ** Revision 1.18 1997/07/24 13:10:51 andreas ** - Removed Warnings from SUN CC 2.0.1 ** ** Revision 1.17 1997/07/21 07:57:57 andreas ** - New method DcmElement::detachValueField to give control over the ** value field to the calling part (see dcelem.h) ** - Replace all boolean types (BOOLEAN, CTNBOOLEAN, DICOM_BOOL, BOOL) ** with one unique boolean type OFBool. ** ** Revision 1.16 1997/07/07 07:46:19 andreas ** - Changed parameter type DcmTag & to DcmTagKey & in all search functions ** in DcmItem, DcmSequenceOfItems, DcmDirectoryRecord and DcmObject ** - Enhanced (faster) byte swapping routine. swapIfNecessary moved from ** a method in DcmObject to a general function. ** ** Revision 1.15 1997/07/03 15:09:57 andreas ** - removed debugging functions Bdebug() and Edebug() since ** they write a static array and are not very useful at all. ** Cdebug and Vdebug are merged since they have the same semantics. ** The debugging functions in dcmdata changed their interfaces ** (see dcmdata/include/dcdebug.h) ** ** Revision 1.14 1997/05/27 13:48:58 andreas ** - Add method canWriteXfer to class DcmObject and all derived classes. ** This method checks whether it is possible to convert the original ** transfer syntax to an new transfer syntax. The check is used in the ** dcmconv utility to prohibit the change of a compressed transfer ** syntax to a uncompressed. ** ** Revision 1.13 1997/05/16 08:23:53 andreas ** - Revised handling of GroupLength elements and support of ** DataSetTrailingPadding elements. The enumeratio E_GrpLenEncoding ** got additional enumeration values (for a description see dctypes.h). ** addGroupLength and removeGroupLength methods are replaced by ** computeGroupLengthAndPadding. To support Padding, the parameters of ** element and sequence write functions changed. ** - Added a new method calcElementLength to calculate the length of an ** element, item or sequence. For elements it returns the length of ** tag, length field, vr field, and value length, for item and ** sequences it returns the length of the whole item. sequence including ** the Delimitation tag (if appropriate). It can never return ** UndefinedLength. ** ** Revision 1.12 1997/05/15 12:29:02 andreas ** - Bug fix for changing binary element values. If a binary existing element ** value changed, byte order was somtimes wrong. ** ** Revision 1.11 1997/04/18 08:17:16 andreas ** - The put/get-methods for all VRs did not conform to the C++-Standard ** draft. Some Compilers (e.g. SUN-C++ Compiler, Metroworks ** CodeWarrier, etc.) create many warnings concerning the hiding of ** overloaded get methods in all derived classes of DcmElement. ** So the interface of all value representation classes in the ** library are changed rapidly, e.g. ** OFCondition get(Uint16 & value, const unsigned long pos); ** becomes ** OFCondition getUint16(Uint16 & value, const unsigned long pos); ** All (retired) "returntype get(...)" methods are deleted. ** For more information see dcmdata/include/dcelem.h ** ** Revision 1.10 1996/07/31 13:41:23 andreas ** *** empty log message *** ** ** Revision 1.9 1996/07/31 13:26:01 andreas ** - Minor corrections: error code for swapping to or from byteorder unknown ** correct read of dataset in fileformat ** ** Revision 1.8 1996/07/29 17:14:26 andreas ** Faster Access with empty value fields ** ** Revision 1.7 1996/04/16 16:04:05 andreas ** - new put parameter DcmTagKey for DcmAttributeTag elements ** - better support for NULL element value ** ** Revision 1.6 1996/03/11 13:11:05 hewett ** Changed prototypes to allow get() and put() of char strings. ** ** Revision 1.5 1996/01/09 11:06:45 andreas ** New Support for Visual C++ ** Correct problems with inconsistent const declarations ** Correct error in reading Item Delimitation Elements ** ** Revision 1.4 1996/01/05 14:00:24 andreas ** - add forgotten initialization for the byte order ** ** Revision 1.3 1996/01/05 13:27:36 andreas ** - changed to support new streaming facilities ** - unique read/write methods for file and block transfer ** - more cleanups ** */ dcmtk-3.6.0/dcmdata/libsrc/dcmetinf.cc0000644000310500011400000007750111503656407017033 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Gerd Ehlers, Andreas Barth * * Purpose: Implementation of class DcmMetaInfo * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-12-20 13:41:27 $ * CVS/RCS Revision: $Revision: 1.57 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #define INCLUDE_CSTDLIB #define INCLUDE_CSTRING #include "dcmtk/ofstd/ofstdinc.h" #include "dcmtk/ofstd/ofstream.h" #include "dcmtk/ofstd/ofstd.h" #include "dcmtk/dcmdata/dcmetinf.h" #include "dcmtk/dcmdata/dcitem.h" #include "dcmtk/dcmdata/dcxfer.h" #include "dcmtk/dcmdata/dcvrul.h" #include "dcmtk/dcmdata/dcdeftag.h" #include "dcmtk/ofstd/ofdefine.h" #include "dcmtk/dcmdata/dcistrma.h" /* for class DcmInputStream */ #include "dcmtk/dcmdata/dcistrmf.h" /* for class DcmInputFileStream */ #include "dcmtk/dcmdata/dcostrma.h" /* for class DcmOutputStream */ const Uint32 DCM_GroupLengthElementLength = 12; // ******************************** DcmMetaInfo::DcmMetaInfo() : DcmItem(ItemTag), preambleUsed(OFFalse), fPreambleTransferState(ERW_init), Xfer(META_HEADER_DEFAULT_TRANSFERSYNTAX) { setPreamble(); } DcmMetaInfo::DcmMetaInfo(const DcmMetaInfo &old) : DcmItem(old), preambleUsed(old.preambleUsed), fPreambleTransferState(ERW_init), Xfer(old.Xfer) { memcpy(filePreamble, old.filePreamble, 128); } DcmMetaInfo& DcmMetaInfo::operator=(const DcmMetaInfo& obj) { if (this != &obj) { // copy parent's member variables DcmItem::operator=(obj); // copy DcmMetaInfo's member variables preambleUsed = obj.preambleUsed; fPreambleTransferState = obj.fPreambleTransferState; Xfer = obj.Xfer; memcpy(filePreamble, obj.filePreamble, 128); } return *this; } OFCondition DcmMetaInfo::copyFrom(const DcmObject& rhs) { if (this != &rhs) { if (rhs.ident() != ident()) return EC_IllegalCall; *this = OFstatic_cast(const DcmMetaInfo &, rhs); } return EC_Normal; } DcmMetaInfo::~DcmMetaInfo() { } // ******************************** DcmEVR DcmMetaInfo::ident() const { return EVR_metainfo; } E_TransferSyntax DcmMetaInfo::getOriginalXfer() const { return Xfer; } void DcmMetaInfo::removeInvalidGroups() { DcmStack stack; DcmObject *object = NULL; /* iterate over all elements */ while (nextObject(stack, OFTrue).good()) { object = stack.top(); /* delete invalid elements */ if (object->getTag().getGroup() != 0x0002) { stack.pop(); /* remove element from meta information header and free memory */ delete OFstatic_cast(DcmItem *, stack.top())->remove(object); } } } // ******************************** void DcmMetaInfo::print(STD_NAMESPACE ostream&out, const size_t flags, const int level, const char *pixelFileName, size_t *pixelCounter) { out << OFendl; if (flags & DCMTypes::PF_useANSIEscapeCodes) out << ANSI_ESCAPE_CODE_COMMENT; printNestingLevel(out, flags, level); out << "# Dicom-Meta-Information-Header" << OFendl; if (flags & DCMTypes::PF_useANSIEscapeCodes) out << ANSI_ESCAPE_CODE_COMMENT; printNestingLevel(out, flags, level); out << "# Used TransferSyntax: " << DcmXfer(Xfer).getXferName() << OFendl; if (flags & DCMTypes::PF_useANSIEscapeCodes) out << ANSI_ESCAPE_CODE_RESET; if (!elementList->empty()) { DcmObject *dO; elementList->seek(ELP_first); do { dO = elementList->get(); dO->print(out, flags, level + 1, pixelFileName, pixelCounter); } while (elementList->seek(ELP_next)); } } // ******************************** OFCondition DcmMetaInfo::writeXML(STD_NAMESPACE ostream&out, const size_t flags) { OFString xmlString; DcmXfer xfer(Xfer); /* XML start tag for "meta-header" */ out << "" << OFendl; if (!elementList->empty()) { /* write content of all children */ DcmObject *dO; elementList->seek(ELP_first); do { dO = elementList->get(); dO->writeXML(out, flags); } while (elementList->seek(ELP_next)); } /* XML end tag for "meta-header" */ out << "" << OFendl; /* always report success */ return EC_Normal; } // ******************************** void DcmMetaInfo::setPreamble() { memzero(filePreamble, sizeof(filePreamble)); preambleUsed = OFFalse; } // ******************************** OFBool DcmMetaInfo::checkAndReadPreamble(DcmInputStream &inStream, E_TransferSyntax &newxfer) { if (fPreambleTransferState == ERW_init) { inStream.mark(); fPreambleTransferState = ERW_inWork; } OFBool retval = OFFalse; if (fPreambleTransferState == ERW_inWork) { const Uint32 preambleLen = DCM_PreambleLen + DCM_MagicLen; const Uint32 readLen = preambleLen - getTransferredBytes(); if (readLen > 0) incTransferredBytes(OFstatic_cast(Uint32, inStream.read(&filePreamble[getTransferredBytes()], readLen))); if (inStream.eos() && getTransferredBytes() != preambleLen) { // file too short, no preamble inStream.putback(); DCMDATA_TRACE("DcmMetaInfo::checkAndReadPreamble() No Preamble available: File too short (" << preambleLen << ") < " << DCM_PreambleLen + DCM_MagicLen << " bytes"); retval = OFFalse; this -> setPreamble(); fPreambleTransferState = ERW_ready; } else if (getTransferredBytes() == preambleLen) // check Preamble and Dicom Prefix { // set prefix to appropriate position char *prefix = filePreamble + DCM_PreambleLen; if (memcmp(prefix, DCM_Magic, DCM_MagicLen) == 0) { retval = OFTrue; // Preamble present // inStream.UnsetPutbackMark(); // not needed anymore with new stream architecture } else { // no Preamble retval = OFFalse; this -> setPreamble(); inStream.putback(); } fPreambleTransferState = ERW_ready; } else errorFlag = EC_StreamNotifyClient; } if (fPreambleTransferState == ERW_ready) { E_TransferSyntax tmpxfer = checkTransferSyntax(inStream); DcmXfer tmpxferSyn(tmpxfer); DcmXfer xferSyn(newxfer); if ((tmpxferSyn.isExplicitVR() && xferSyn.isImplicitVR()) || (tmpxferSyn.isImplicitVR() && xferSyn.isExplicitVR()) || xferSyn.getXfer() == EXS_Unknown) { newxfer = tmpxferSyn.getXfer(); // use determined xfer if (xferSyn.getXfer() != EXS_Unknown) DCMDATA_WARN("DcmMetaInfo: TransferSyntax of MetaInfo is other than expected"); } else newxfer = xferSyn.getXfer(); } if (retval == OFTrue) { DCMDATA_TRACE("DcmMetaInfo::checkAndReadPreamble() Preamble = 0x" << STD_NAMESPACE hex << STD_NAMESPACE setfill('0') << STD_NAMESPACE setw(4) << OFstatic_cast(Uint32, *filePreamble)); } else DCMDATA_TRACE("DcmMetaInfo::checkAndReadPreamble() No Preambel found"); DCMDATA_TRACE("DcmMetaInfo::checkAndReadPreamble() TransferSyntax=\"" << DcmXfer(newxfer).getXferName() << "\""); return retval; } // DcmMetaInfo::checkAndReadPreamble // ******************************** OFBool DcmMetaInfo::nextTagIsMeta(DcmInputStream &inStream) { char testbytes[2]; inStream.mark(); inStream.read(testbytes, 2); inStream.putback(); // check for group 0x0002 only return (testbytes[0] == 0x02 && testbytes[1] == 0x00) || (testbytes[0] == 0x00 && testbytes[1] == 0x02); } // ******************************** Uint32 DcmMetaInfo::calcElementLength(const E_TransferSyntax /*xfer*/, const E_EncodingType enctype) { Uint32 metaLength = DcmItem::getLength(META_HEADER_DEFAULT_TRANSFERSYNTAX, enctype); metaLength += DCM_PreambleLen + DCM_MagicLen; return metaLength; } // ******************************** OFCondition DcmMetaInfo::readGroupLength(DcmInputStream &inStream, const E_TransferSyntax xfer, const DcmTagKey &xtag, const E_GrpLenEncoding glenc, Uint32 &headerLen, Uint32 &bytesRead, const Uint32 maxReadLength) { OFCondition l_error = EC_TagNotFound; E_TransferSyntax newxfer = xfer; bytesRead = 0; headerLen = 0; if (nextTagIsMeta(inStream)) { DcmTag newTag; Uint32 newValueLength = 0; Uint32 bytes_tagAndLen = 0; l_error = DcmItem::readTagAndLength(inStream, newxfer, newTag, newValueLength, bytes_tagAndLen); bytesRead += bytes_tagAndLen; if (l_error.good() && !inStream.good()) l_error = inStream.status(); if (l_error.good()) { l_error = DcmItem::readSubElement(inStream, newTag, newValueLength, newxfer, glenc, maxReadLength); bytesRead += newValueLength; if (l_error.good() && newTag.getXTag() == xtag && elementList->get() != NULL && newValueLength > 0) { l_error = (OFstatic_cast(DcmUnsignedLong *, elementList->get()))->getUint32(headerLen); DCMDATA_TRACE("DcmMetaInfo::readGroupLength() Group Length of File Meta Header = " << headerLen + bytesRead); } else { l_error = EC_CorruptedData; DCMDATA_WARN("DcmMetaInfo: No Group Length available in Meta Information Header"); } } } DCMDATA_TRACE("DcmMetaInfo::readGroupLength() returns error = " << l_error.text()); return l_error; } // ******************************** OFCondition DcmMetaInfo::read(DcmInputStream &inStream, const E_TransferSyntax xfer, const E_GrpLenEncoding glenc, const Uint32 maxReadLength) { if (fPreambleTransferState == ERW_notInitialized || getTransferState() == ERW_notInitialized) errorFlag = EC_IllegalCall; else { Xfer = xfer; E_TransferSyntax newxfer = xfer; /* figure out if the stream reported an error */ errorFlag = inStream.status(); if (errorFlag.good() && inStream.eos()) errorFlag = EC_EndOfStream; else if (errorFlag.good() && getTransferState() != ERW_ready) { if (getTransferState() == ERW_init && fPreambleTransferState != ERW_ready) { if (xfer == EXS_Unknown) preambleUsed = checkAndReadPreamble(inStream, newxfer); else newxfer = xfer; if (fPreambleTransferState == ERW_ready) { Xfer = newxfer; // store parameter transfer syntax setTransferState(ERW_inWork); setTransferredBytes(0); fStartPosition = inStream.tell(); setLengthField(0); } } if (getTransferState() == ERW_inWork && getLengthField() == 0) { if (inStream.avail() < OFstatic_cast(offile_off_t, DCM_GroupLengthElementLength)) errorFlag = EC_StreamNotifyClient; else { Uint32 headerLength = 0; Uint32 bytesRead = 0; errorFlag = readGroupLength(inStream, newxfer, DCM_FileMetaInformationGroupLength, glenc, headerLength, bytesRead, maxReadLength); setTransferredBytes(bytesRead); if (errorFlag.good()) { /* FileMetaInformationGroupLength (0002,0000) is present but should be ignored */ if (dcmIgnoreFileMetaInformationGroupLength.get()) { DCMDATA_WARN("DcmMetaInfo: Ignoring Group Length of Meta Information Header"); setLengthField(DCM_UndefinedLength); } else setLengthField(headerLength + getTransferredBytes()); } else setLengthField(DCM_UndefinedLength); } } #ifdef REJECT_FILE_IF_META_GROUP_LENGTH_ABSENT // this is the old behaviour up to DCMTK 3.5.3: fail with EC_CorruptedData error code // if the file meta header group length (0002,0000) is absent. if (getTransferState() == ERW_inWork && getLengthField() != 0 && errorFlag.good()) { #else // new behaviour: accept file without meta header group length, determine end of // meta header based on heuristic that checks for group 0002 tags. if (getTransferState() == ERW_inWork && getLengthField() != 0 && (errorFlag.good() || ((errorFlag == EC_CorruptedData) && (getLengthField() == DCM_UndefinedLength)))) { /* start with "no error" in order to handle meta-header with only one data element */ errorFlag = EC_Normal; #endif while (inStream.good() && !inStream.eos() && ((getLengthField() < DCM_UndefinedLength && getTransferredBytes() < getLengthField()) || (getLengthField() == DCM_UndefinedLength && nextTagIsMeta(inStream)) || !lastElementComplete)) { DcmTag newTag; Uint32 newValueLength = 0; Uint32 bytes_tagAndLen = 0; if (lastElementComplete) { errorFlag = DcmItem::readTagAndLength(inStream, newxfer, newTag, newValueLength, bytes_tagAndLen); incTransferredBytes(bytes_tagAndLen); if (errorFlag != EC_Normal) break; // terminate while loop lastElementComplete = OFFalse; errorFlag = DcmItem::readSubElement(inStream, newTag, newValueLength, newxfer, glenc, maxReadLength); if (errorFlag.good()) lastElementComplete = OFTrue; /* check for valid meta-header elements */ if (newTag.getGroup() != 0x0002) DCMDATA_WARN("DcmMetaInfo: Invalid Element " << newTag << " found in Meta Information Header"); } else { errorFlag = elementList->get()->read(inStream, xfer, glenc, maxReadLength); if (errorFlag.good()) lastElementComplete = OFTrue; } setTransferredBytes(OFstatic_cast(Uint32, inStream.tell() - fStartPosition)); if (errorFlag.bad()) break; // terminate while loop } //while } if (errorFlag == EC_TagNotFound || errorFlag == EC_EndOfStream) { errorFlag = EC_Normal; // there is no meta header Xfer = EXS_Unknown; } else if (errorFlag == EC_ItemEnd) errorFlag = EC_Normal; if (errorFlag.good()) { if (getLengthField() != DCM_UndefinedLength && getTransferredBytes() != getLengthField()) DCMDATA_WARN("DcmMetaInfo: Group Length of Meta Information Header has incorrect value"); setTransferState(ERW_ready); // MetaInfo is complete } } } return errorFlag; } // DcmMetaInfo::read() // ******************************** void DcmMetaInfo::transferInit() { DcmItem::transferInit(); fPreambleTransferState = ERW_init; } // ******************************** void DcmMetaInfo::transferEnd() { DcmItem::transferEnd(); fPreambleTransferState = ERW_notInitialized; } // ******************************** OFCondition DcmMetaInfo::write( DcmOutputStream &outStream, const E_TransferSyntax /*oxfer*/, const E_EncodingType enctype, DcmWriteCache *wcache) /* * This function writes all data elements which make up the meta header to the stream. * For a specification of the elements that make up the meta header see DICOM standard * (year 2000) part 10, section 7.1)) or the corresponding section in a later version of * the standard). * * Parameters: * outStream - [inout] The stream that the information will be written to. * oxfer - [in] The transfer syntax which shall be used. (is not necessary since the meta header * shall always be encoded in the explicit VR little endian transfer syntax) * enctype - [in] Encoding type for sequences. Specifies how sequences will be handled. */ { /* if the transfer state of this is not initialized, this is an illegal call */ if (getTransferState() == ERW_notInitialized) errorFlag = EC_IllegalCall; else { /* if this is not an illegal call, do something */ /* determine the (default) transfer syntax which shall be used (always explicit VR little endian) */ E_TransferSyntax outxfer = META_HEADER_DEFAULT_TRANSFERSYNTAX; /* check if the stream reported an error so far */ errorFlag = outStream.status(); /* if the stream did not report any error and the transfer state is ERW_ready, */ /* go ahead and write the meta header information to the out stream */ if (errorFlag.good() && getTransferState() != ERW_ready) { /* if some particular conditions are met we need to write the file preamble (128 byte wide) and */ /* the DICOM prefix "DICM" to the stream. Always check if there is enough space in the stream and */ /* set the transfer state of certain elements to indicate that they have already been written. */ if (getTransferState() == ERW_init) { if (preambleUsed || !elementList->empty()) { if (fPreambleTransferState == ERW_init) { incTransferredBytes(OFstatic_cast(Uint32, outStream.write(&filePreamble[getTransferredBytes()], DCM_PreambleLen - getTransferredBytes()))); if (getTransferredBytes() != DCM_PreambleLen) errorFlag = EC_StreamNotifyClient; else fPreambleTransferState = ERW_inWork; } if (fPreambleTransferState == ERW_inWork && outStream.avail() >= 4) { outStream.write(DCM_Magic, 4); fPreambleTransferState = ERW_ready; setTransferState(ERW_inWork); elementList->seek(ELP_first); } else errorFlag = EC_StreamNotifyClient; } } /* if the file premable and the DICOM prefix have been written, go */ /* ahead and write the meta header's data elements to the stream. */ /* (note that at this point elementList->get() should never be NULL, */ /* but lets play the game safe here...) */ if (!elementList->empty() && (getTransferState() == ERW_inWork) && (elementList->get() != NULL)) { DcmObject *dO; /* iterate over the list of data elements and write them to the stream */ do { dO = elementList->get(); errorFlag = dO->write(outStream, outxfer, enctype, wcache); } while (errorFlag.good() && elementList->seek(ELP_next)); } /* if the error flag equals ok and the transfer state equals ERW_inWork, all data elements of the meta */ /* header have been written to the stream. Indicate this by setting the transfer state to ERW_ready */ if (errorFlag.good() && getTransferState() == ERW_inWork) setTransferState(ERW_ready); } } /* return result value */ return errorFlag; } // ******************************** OFCondition DcmMetaInfo::loadFile(const char *fileName, const E_TransferSyntax readXfer, const E_GrpLenEncoding groupLength, const Uint32 maxReadLength) { OFCondition l_error = EC_IllegalParameter; /* check parameters first */ if ((fileName != NULL) && (strlen(fileName) > 0)) { /* open file for input */ DcmInputFileStream fileStream(fileName); /* check stream status */ l_error = fileStream.status(); if (l_error.good()) { /* clear this object */ l_error = clear(); if (l_error.good()) { /* read data from file */ transferInit(); l_error = read(fileStream, readXfer, groupLength, maxReadLength); transferEnd(); } } } return l_error; } /* ** CVS/RCS Log: ** $Log: dcmetinf.cc,v $ ** Revision 1.57 2010-12-20 13:41:27 joergr ** Added explicit type cast in order to keep gcc 2.95.3 quiet. ** ** Revision 1.56 2010-11-12 12:16:11 joergr ** Output ANSI escape codes at the beginnig of each line in order to make sure ** that always the correct color is used in case of truncated multi-line output. ** ** Revision 1.55 2010-10-29 10:57:21 joergr ** Added support for colored output to the print() method. ** ** Revision 1.54 2010-10-20 16:44:16 joergr ** Use type cast macros (e.g. OFstatic_cast) where appropriate. ** ** Revision 1.53 2010-10-14 13:14:08 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.52 2010-06-07 13:55:53 joergr ** Added new method that allows for loading the meta-header only. ** ** Revision 1.51 2010-03-25 16:30:17 joergr ** Made log messages more consistent within this module. ** ** Revision 1.50 2009-11-13 13:11:21 joergr ** Fixed minor issues in log output. ** ** Revision 1.49 2009-11-04 09:58:10 uli ** Switched to logging mechanism provided by the "new" oflog module ** ** Revision 1.48 2009-09-28 13:30:59 joergr ** Moved general purpose definition file from module dcmdata to ofstd, and ** added new defines in order to make the usage easier. ** ** Revision 1.47 2009-08-25 12:54:57 joergr ** Added new methods which remove all data elements with an invalid group number ** from the meta information header, dataset and/or fileformat. ** ** Revision 1.46 2009-06-04 16:58:24 joergr ** Added new parsing flag that allows for ignoring the value of File Meta ** Information Group Length (0002,0000). ** Report a warning on all data elements in the meta-header which have an ** incorrect group number, i.e. everything but 0x0002. ** ** Revision 1.45 2009-03-02 11:16:36 joergr ** Moved variable definition. ** ** Revision 1.44 2009-03-02 11:15:18 joergr ** Fixed issue with incorrectly encoded file meta information header consisting ** of one data element only (e.g. TransferSyntaxUID). ** ** Revision 1.43 2009-02-04 17:57:19 joergr ** Fixes various type mismatches reported by MSVC introduced with OFFile class. ** ** Revision 1.42 2008-07-17 10:31:31 onken ** Implemented copyFrom() method for complete DcmObject class hierarchy, which ** permits setting an instance's value from an existing object. Implemented ** assignment operator where necessary. ** ** Revision 1.41 2008-04-30 12:38:42 meichel ** Fixed compile errors due to changes in attribute tag names ** ** Revision 1.40 2007/11/29 14:30:21 meichel ** Write methods now handle large raw data elements (such as pixel data) ** without loading everything into memory. This allows very large images to ** be sent over a network connection, or to be copied without ever being ** fully in memory. ** ** Revision 1.39 2007/06/29 14:17:49 meichel ** Code clean-up: Most member variables in module dcmdata are now private, ** not protected anymore. ** ** Revision 1.38 2006/08/15 15:49:54 meichel ** Updated all code in module dcmdata to correctly compile when ** all standard C++ classes remain in namespace std. ** ** Revision 1.37 2005/12/08 15:41:18 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.36 2005/11/28 15:53:13 meichel ** Renamed macros in dcdebug.h ** ** Revision 1.35 2005/11/07 16:59:26 meichel ** Cleaned up some copy constructors in the DcmObject hierarchy. ** ** Revision 1.34 2005/05/26 11:51:12 meichel ** Now reading DICOM files in which the meta header group length attribute ** (0002,0000) is absent, based on a heuristic that checks for group 0002 ** attribute tags. New behaviour can be disabled by compiling with the macro ** REJECT_FILE_IF_META_GROUP_LENGTH_ABSENT defined. ** ** Revision 1.33 2004/02/04 16:35:00 joergr ** Adapted type casts to new-style typecast operators defined in ofcast.h. ** Removed acknowledgements with e-mail addresses from CVS log. ** ** Revision 1.32 2003/10/15 16:55:43 meichel ** Updated error messages for parse errors ** ** Revision 1.31 2002/12/06 12:59:39 joergr ** Enhanced "print()" function by re-working the implementation and replacing ** the boolean "showFullData" parameter by a more general integer flag. ** Made source code formatting more consistent with other modules/files. ** Replaced some German comments by English translations. ** ** Revision 1.30 2002/11/27 12:06:49 meichel ** Adapted module dcmdata to use of new header file ofstdinc.h ** ** Revision 1.29 2002/08/27 16:55:51 meichel ** Initial release of new DICOM I/O stream classes that add support for stream ** compression (deflated little endian explicit VR transfer syntax) ** ** Revision 1.28 2002/04/25 10:17:19 joergr ** Added support for XML output of DICOM objects. ** ** Revision 1.27 2002/04/16 13:43:18 joergr ** Added configurable support for C++ ANSI standard includes (e.g. streams). ** ** Revision 1.26 2001/11/01 14:55:40 wilkens ** Added lots of comments. ** ** Revision 1.25 2001/09/26 15:49:30 meichel ** Modified debug messages, required by OFCondition ** ** Revision 1.24 2001/09/25 17:19:51 meichel ** Adapted dcmdata to class OFCondition ** ** Revision 1.23 2001/06/01 15:49:06 meichel ** Updated copyright header ** ** Revision 1.22 2001/05/10 12:46:52 meichel ** Fixed minor bug in DcmMetaInfo::transferEnd() ** ** Revision 1.21 2001/05/03 08:15:22 meichel ** Fixed bug in dcmdata sequence handling code that could lead to application ** failure in rare cases during parsing of a correct DICOM dataset. ** ** Revision 1.20 2000/04/14 15:55:06 meichel ** Dcmdata library code now consistently uses ofConsole for error output. ** ** Revision 1.19 2000/03/08 16:26:38 meichel ** Updated copyright header. ** ** Revision 1.18 2000/03/03 14:05:35 meichel ** Implemented library support for redirecting error messages into memory ** instead of printing them to stdout/stderr for GUI applications. ** ** Revision 1.17 2000/02/23 15:11:56 meichel ** Corrected macro for Borland C++ Builder 4 workaround. ** ** Revision 1.16 2000/02/10 10:52:20 joergr ** Added new feature to dcmdump (enhanced print method of dcmdata): write ** pixel data/item value fields to raw files. ** ** Revision 1.15 2000/02/01 10:12:08 meichel ** Avoiding to include as extern "C" on Borland C++ Builder 4, ** workaround for bug in compiler header files. ** ** Revision 1.14 1999/03/31 09:25:33 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.13 1998/07/15 15:52:02 joergr ** Removed several compiler warnings reported by gcc 2.8.1 with ** additional options, e.g. missing copy constructors and assignment ** operators, initialization of member variables in the body of a ** constructor instead of the member initialization list, hiding of ** methods by use of identical names, uninitialized member variables, ** missing const declaration of char pointers. Replaced tabs by spaces. ** ** Revision 1.12 1997/07/21 08:25:28 andreas ** - Replace all boolean types (BOOLEAN, CTNBOOLEAN, DICOM_BOOL, BOOL) ** with one unique boolean type OFBool. ** ** Revision 1.11 1997/07/03 15:10:00 andreas ** - removed debugging functions Bdebug() and Edebug() since ** they write a static array and are not very useful at all. ** Cdebug and Vdebug are merged since they have the same semantics. ** The debugging functions in dcmdata changed their interfaces ** (see dcmdata/include/dcdebug.h) ** ** Revision 1.10 1997/05/16 08:23:54 andreas ** - Revised handling of GroupLength elements and support of ** DataSetTrailingPadding elements. The enumeratio E_GrpLenEncoding ** got additional enumeration values (for a description see dctypes.h). ** addGroupLength and removeGroupLength methods are replaced by ** computeGroupLengthAndPadding. To support Padding, the parameters of ** element and sequence write functions changed. ** - Added a new method calcElementLength to calculate the length of an ** element, item or sequence. For elements it returns the length of ** tag, length field, vr field, and value length, for item and ** sequences it returns the length of the whole item. sequence including ** the Delimitation tag (if appropriate). It can never return ** UndefinedLength. ** ** Revision 1.9 1997/04/18 08:17:18 andreas ** - The put/get-methods for all VRs did not conform to the C++-Standard ** draft. Some Compilers (e.g. SUN-C++ Compiler, Metroworks ** CodeWarrier, etc.) create many warnings concerning the hiding of ** overloaded get methods in all derived classes of DcmElement. ** So the interface of all value representation classes in the ** library are changed rapidly, e.g. ** OFCondition get(Uint16 & value, const unsigned long pos); ** becomes ** OFCondition getUint16(Uint16 & value, const unsigned long pos); ** All (retired) "returntype get(...)" methods are deleted. ** For more information see dcmdata/include/dcelem.h ** ** Revision 1.8 1996/08/05 08:46:13 andreas ** new print routine with additional parameters: ** - print into files ** - fix output length for elements ** corrected error in search routine with parameter ESM_fromStackTop ** ** Revision 1.7 1996/07/31 13:14:31 andreas ** - Minor corrections: error code for swapping to or from byteorder unknown ** correct read of dataset in fileformat ** ** Revision 1.6 1996/04/27 14:04:56 hewett ** Eliminated compiler warnings when compiling without -DDEBUG. Very ** minor corrections, mostly unused parameters and uninitialized variables. ** ** Revision 1.5 1996/01/29 13:38:27 andreas ** - new put method for every VR to put value as a string ** - better and unique print methods ** ** Revision 1.4 1996/01/09 11:06:47 andreas ** New Support for Visual C++ ** Correct problems with inconsistent const declarations ** Correct error in reading Item Delimitation Elements ** ** Revision 1.3 1996/01/05 13:27:39 andreas ** - changed to support new streaming facilities ** - unique read/write methods for file and block transfer ** - more cleanups ** */ dcmtk-3.6.0/dcmdata/libsrc/dcvrof.cc0000644000310500011400000000546611457616141016525 0ustar joergrdicom3/* * * Copyright (C) 2002-2010, 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: dcmdata * * Author: Joerg Riesmeier * * Purpose: Implementation of class DcmOtherFloat * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-20 16:44:17 $ * CVS/RCS Revision: $Revision: 1.7 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcvrof.h" #include "dcmtk/dcmdata/dcvrfl.h" // ******************************** DcmOtherFloat::DcmOtherFloat(const DcmTag &tag, const Uint32 len) : DcmFloatingPointSingle(tag, len) { } DcmOtherFloat::DcmOtherFloat(const DcmOtherFloat &old) : DcmFloatingPointSingle(old) { } DcmOtherFloat::~DcmOtherFloat() { } DcmOtherFloat &DcmOtherFloat::operator=(const DcmOtherFloat &obj) { DcmFloatingPointSingle::operator=(obj); return *this; } OFCondition DcmOtherFloat::copyFrom(const DcmObject& rhs) { if (this != &rhs) { if (rhs.ident() != ident()) return EC_IllegalCall; *this = OFstatic_cast(const DcmOtherFloat &, rhs); } return EC_Normal; } // ******************************** DcmEVR DcmOtherFloat::ident() const { return EVR_OF; } OFCondition DcmOtherFloat::checkValue(const OFString & /*vm*/, const OFBool /*oldFormat*/) { /* currently no checks are performed */ return EC_Normal; } unsigned long DcmOtherFloat::getVM() { /* value multiplicity for OF is defined as 1 */ return 1; } /* * CVS/RCS Log: * $Log: dcvrof.cc,v $ * Revision 1.7 2010-10-20 16:44:17 joergr * Use type cast macros (e.g. OFstatic_cast) where appropriate. * * Revision 1.6 2010-10-14 13:14:10 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.5 2010-04-23 14:30:34 joergr * Added new method to all VR classes which checks whether the stored value * conforms to the VR definition and to the specified VM. * * Revision 1.4 2009-11-04 09:58:11 uli * Switched to logging mechanism provided by the "new" oflog module * * Revision 1.3 2008-07-17 10:31:32 onken * Implemented copyFrom() method for complete DcmObject class hierarchy, which * permits setting an instance's value from an existing object. Implemented * assignment operator where necessary. * * Revision 1.2 2005-12-08 15:41:58 meichel * Changed include path schema for all DCMTK header files * * Revision 1.1 2002/12/06 12:07:02 joergr * Added support for new value representation Other Float String (OF). * * */ dcmtk-3.6.0/dcmdata/libsrc/dcddirif.cc0000644000310500011400000074247711470227060017015 0ustar joergrdicom3/* * * Copyright (C) 2002-2010, 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: dcmdata * * Author: Joerg Riesmeier * * Purpose: Interface class for simplified creation of a DICOMDIR * * Last Update: $Author: uli $ * Update Date: $Date: 2010-11-15 12:57:20 $ * CVS/RCS Revision: $Revision: 1.56 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #define INCLUDE_CSTDIO #define INCLUDE_CCTYPE #define INCLUDE_CERRNO #include "dcmtk/ofstd/ofstdinc.h" #include "dcmtk/dcmdata/dcddirif.h" #include "dcmtk/dcmdata/dcdeftag.h" #include "dcmtk/dcmdata/dcuid.h" #include "dcmtk/dcmdata/dccodec.h" #include "dcmtk/dcmdata/dcmetinf.h" /* for class DcmMetaInfo */ #include "dcmtk/dcmdata/dcpixel.h" /* for class DcmPixelData */ #include "dcmtk/dcmdata/dcpxitem.h" /* for class DcmPixelItem */ #include "dcmtk/dcmdata/dcpixseq.h" /* for class DcmPixelSequence */ #include "dcmtk/dcmdata/dcvrcs.h" /* for class DcmCodeString */ #include "dcmtk/dcmdata/dcvrda.h" /* for class DcmDate */ #include "dcmtk/dcmdata/dcvrtm.h" /* for class DcmTime */ #include "dcmtk/ofstd/ofstd.h" #include "dcmtk/ofstd/ofstream.h" #include "dcmtk/ofstd/ofbmanip.h" /* for class OFBitmanipTemplate */ #include "dcmtk/ofstd/ofcast.h" /*------------------------* * contant declarations * *------------------------*/ // an ISO 9660 format only allows 8 characters in file name #define MAX_FNAME_COMPONENT_SIZE 8 // DICOM only allows max 8 path components in a file name #define MAX_FNAME_COMPONENTS 8 // max. number of characters printed for string values in a warning message #define MAX_PRINT_LENGTH 64 // filename extension for a backup file #define FNAME_BACKUP_EXTENSION ".BAK" // prefix used to automatically create patient IDs (+ 6 digits) #define AUTO_PATIENTID_PREFIX "DCMTKPAT" // prefix used to automatically create study IDs (+ 6 digits) #define AUTO_STUDYID_PREFIX "DCMTKSTUDY" /*------------------------* * forward declarations * *------------------------*/ static OFBool compareSQAttributes(DcmSequenceOfItems *seq1, DcmSequenceOfItems *seq2, OFString &reason); /*--------------------------* * local helper functions * *--------------------------*/ // count number of filename components static int componentCount(const OFString &filename, const char separator = PATH_SEPARATOR) { const size_t length = filename.length(); int count = (length > 0) ? 1 : 0; for (size_t i = 0; i < length; i++) { if (filename.at(i) == separator) count++; } return count; } // check whether filename component size is within allowed range static OFBool isComponentTooLarge(const OFString &filename, const size_t componentLimit, const OFBool mapFilenames, const char separator = PATH_SEPARATOR) { OFBool result = OFFalse; const size_t length = filename.length(); if (length > 0) { size_t pos1 = 0; size_t pos2 = filename.find(separator); while (pos2 != OFString_npos) { /* check whether component length is within limit */ if (pos2 - pos1 > componentLimit) { result = OFTrue; break; } pos1 = pos2 + 1; pos2 = filename.find(separator, pos1); } if (!result) { /* check last component: disregard trailing point */ if (mapFilenames && (filename.at(length - 1) == '.')) pos1++; if (length - pos1 > componentLimit) result = OFTrue; } } return result; } // check whether filename contains invalid characters (and locate the first one) static OFBool locateInvalidFilenameChars(const OFString &filename, size_t &invalidChar, const OFBool mapFilenames, const char separator = PATH_SEPARATOR) { unsigned char c; size_t i = 0; size_t length = filename.length(); /* disregard trailing point */ if (mapFilenames && (length > 0) && (filename.at(length - 1) == '.')) length--; /* iterate over all charaters */ for (i = 0; i < length; i++) { c = filename.at(i); if ((c == '_') || isdigit(c) || (c == separator) || (isalpha(c) && (isupper(c) || (islower(c) && mapFilenames)))) { /* all ok */ } else if ((c != '\\') || (separator != '\\')) { /* invalid character */ break; } } /* return position of first invalid character (eos if all valid) */ invalidChar = i; /* OFTrue in case of any invalid character */ return (i != length); } // massage filename into DICOM format (DOS conventions for path separators, uppercase characters) static OFString &hostToDicomFilename(const OFString &hostFilename, OFString &dicomFilename) { dicomFilename.clear(); const size_t length = hostFilename.length(); for (size_t i = 0; i < length; i++) { const unsigned char c = hostFilename.at(i); if (c == PATH_SEPARATOR) { /* the PATH_SEPARATOR depends on the OS (see ) */ dicomFilename += '\\'; } else if (isalpha(c)) { /* filenames in DICOM must always be in uppercase */ dicomFilename += OFstatic_cast(char, toupper(c)); } else if (isdigit(c) || (c == '_') || (c == '\\')) { /* only characters, digits, underscore and backslash (path separator) allowed */ dicomFilename += c; } } return dicomFilename; } /* Massage filename into machine format (replace DOS conventions for path separators) */ static OFString &dicomToHostFilename(const OFString &dicomFilename, OFString &hostFilename, OFBool mapToLower = OFFalse) { hostFilename.clear(); const size_t length = dicomFilename.length(); for (size_t i = 0; i < length; i++) { const char c = dicomFilename.at(i); /* the PATH_SEPARATOR depends on the OS (see ) */ if (c == '\\') hostFilename += PATH_SEPARATOR; else if (mapToLower) hostFilename += OFstatic_cast(char, tolower(c)); else hostFilename += c; } return hostFilename; } // check whether given DICOM file exists static OFBool locateDicomFile(const OFString &dicomFilename, OFString &hostFilename) { dicomToHostFilename(dicomFilename, hostFilename); OFBool result = OFStandard::fileExists(hostFilename); if (!result) { /* trailing period */ hostFilename += '.'; result = OFStandard::fileExists(hostFilename); } if (!result) { /* lowercase */ dicomToHostFilename(dicomFilename, hostFilename, OFTrue /*mapToLower*/); result = OFStandard::fileExists(hostFilename); if (!result) { /* lowercase with trailing period */ hostFilename += '.'; result = OFStandard::fileExists(hostFilename); } } if (!result) { /* DICOM file not found */ hostFilename.clear(); } return result; } // compare two strings (empty strings are always regarded as unequal) static OFBool compare(const OFString &string1, const OFString &string2) { if (string1.empty() || string2.empty()) return OFFalse; return (string1.compare(string2) == 0) ? OFTrue : OFFalse; } // contruct tag name from given object static OFString &constructTagName(DcmObject *object, OFString &tagName) { if (object != NULL) { DcmTag tag = object->getTag(); tagName = tag.getTagName(); // use tag name only if not equal to DcmTag_ERROR_TagName if (compare(tagName, DcmTag_ERROR_TagName)) { char buffer[32]; sprintf(buffer, "(0x%04x,0x%04x)", tag.getGTag(), tag.getETag()); tagName = buffer; } } else tagName = "(NULL)"; return tagName; } // contruct tag name from given object and sequence static OFString &constructTagNameWithSQ(DcmObject *object, DcmSequenceOfItems *fromSequence, const unsigned long itemNumber, OFString &tagName) { OFString tempStr; if (fromSequence != NULL) { /* create text */ OFOStringStream oss; oss << constructTagName(fromSequence, tempStr) << "[" << itemNumber << "]" << OFStringStream_ends; OFSTRINGSTREAM_GETSTR(oss, tmpString) tagName = tmpString; OFSTRINGSTREAM_FREESTR(tmpString) /* append "." for tag name */ if (object != NULL) tagName += '.'; } else tagName.clear(); if (object != NULL) tagName += constructTagName(object, tempStr); else if (tagName.empty()) tagName = "(NULL)"; return tagName; } // construct text message of two differing numerical values static OFString &constructDifferentNumbersText(const unsigned long number1, const unsigned long number2, OFString &textValue) { textValue.clear(); /* create message text */ OFOStringStream oss; oss << number1 << " != " << number2 << OFStringStream_ends; OFSTRINGSTREAM_GETSTR(oss, tmpString) textValue = tmpString; OFSTRINGSTREAM_FREESTR(tmpString) return textValue; } // compare given element values and report any deviation static OFBool compareAttributes(DcmElement *elem1, DcmElement *elem2, DcmSequenceOfItems *fromSequence, unsigned long itemNumber, OFString &reason) { reason.clear(); OFString tmpString; /* check whether elements are valid */ if (elem1 != NULL) { if (elem2 != NULL) { /* check whether tags are equal */ if (elem1->getTag().getXTag() == elem2->getTag().getXTag()) { DcmVR vr1(elem1->getVR()); DcmVR vr2(elem2->getVR()); /* are the VRs the same? */ if (vr1.getEVR() == vr2.getEVR()) { const unsigned long length1 = elem1->getLength(); const unsigned long length2 = elem2->getLength(); /* are the lengths the same? */ if (length1 == length2) { /* are the contents the same? */ if (length1 > 0) { if (vr1.getEVR() == EVR_SQ) { /* compare embedded sequences recursively */ compareSQAttributes(OFstatic_cast(DcmSequenceOfItems *, elem1), OFstatic_cast(DcmSequenceOfItems *, elem2), reason); } else { /* everything else is regarded as a string, might be useful to check binary data separately though */ OFString value1, value2; /* compare string value from dataset and record */ if (elem1->getOFStringArray(value1).good() && elem2->getOFStringArray(value2).good()) { if (!compare(value1, value2)) { reason = "different values: "; /* print differing values */ if ((value1.length() < MAX_PRINT_LENGTH) && (value2.length() < MAX_PRINT_LENGTH)) reason += "\"" + value1 + "\" != \"" + value2 + "\" "; reason += "(" + constructTagNameWithSQ(elem1, fromSequence, itemNumber, tmpString) + ")"; } } } } } else { reason = "different value lengths: " + constructDifferentNumbersText(length1, length2, tmpString); reason += " (" + constructTagNameWithSQ(elem1, fromSequence, itemNumber, tmpString) + ")"; } } else reason = "different VRs: " + OFString(vr1.getVRName()) + " != " + vr2.getVRName() + " (" + constructTagNameWithSQ(elem1, fromSequence, itemNumber, tmpString) + ")"; } else reason = "INTERNAL ERROR: different attributes: " + constructTagNameWithSQ(elem1, fromSequence, itemNumber, tmpString) + " != " + constructTagNameWithSQ(elem2, fromSequence, itemNumber, tmpString); } else reason = "missing attribute: " + constructTagNameWithSQ(elem2, fromSequence, itemNumber, tmpString); } else reason = "missing attribute: " + constructTagNameWithSQ(elem1, fromSequence, itemNumber, tmpString); /* non-empty reason variable indicates an error */ return reason.empty(); } // compare given items for equivalence and report any deviation static OFBool compareItems(DcmItem *item1, DcmItem *item2, DcmSequenceOfItems *fromSequence, const unsigned long itemNumber, OFString &reason) { reason.clear(); OFString tmpString; /* check whether items are valid */ if ((item1 != NULL) && (item2 != NULL)) { const unsigned long card1 = item1->card(); const unsigned long card2 = item2->card(); /* check whether number of attributes is identical */ if (card1 == card2) { unsigned long i = 0; OFBool first = OFTrue; DcmStack stack1, stack2; /* check whether attributes are equal */ while (item1->nextObject(stack1, first).good() && item2->nextObject(stack2, first).good()) { if (!compareAttributes(OFstatic_cast(DcmElement *, stack1.top()), OFstatic_cast(DcmElement *, stack2.top()), fromSequence, i++, reason)) break; first = OFFalse; } } else { reason = "different number of attributes in item: " + constructDifferentNumbersText(card1, card2, tmpString); reason += " (" + constructTagNameWithSQ(NULL /*object*/, fromSequence, itemNumber, tmpString) + ")"; } } else reason = "missing item: " + constructTagNameWithSQ(NULL /*object*/, fromSequence, itemNumber, tmpString); /* non-empty reason variable indicates an error */ return reason.empty(); } // compare given sequences for equivalence and report any deviation static OFBool compareSQAttributes(DcmSequenceOfItems *seq1, DcmSequenceOfItems *seq2, OFString &reason) { reason.clear(); OFString tmpString; /* check whether sequences are valid */ if (seq1 != NULL) { if (seq2 != NULL) { /* check whether tags are equal */ if (seq1->getTag().getXTag() == seq2->getTag().getXTag()) { const unsigned long card1 = seq1->card(); const unsigned long card2 = seq2->card(); /* check whether number of items is identical */ if (card1 == card2) { unsigned long i = 0; OFBool first = OFTrue; DcmStack stack1, stack2; /* check whether items are equal */ while (seq1->nextObject(stack1, first).good() && seq2->nextObject(stack2, first).good()) { if (!compareItems(OFstatic_cast(DcmItem *, stack1.top()), OFstatic_cast(DcmItem *, stack2.top()), seq1, i++, reason)) break; first = OFFalse; } } else { reason = "different number of items in sequence: " + constructDifferentNumbersText(card1, card2, tmpString); reason += " (" + constructTagName(seq1, tmpString) + ")"; } } else reason = "INTERNAL ERROR: different sequences: " + constructTagName(seq1, tmpString) + " != " + constructTagName(seq2, tmpString); } else reason = "missing sequence: " + constructTagName(seq2, tmpString); } else reason = "missing sequence: " + constructTagName(seq1, tmpString); /* non-empty reason variable indicates an error */ return reason.empty(); } // get directory record name from type static OFString recordTypeToName(const E_DirRecType recordType) { const char *recordName = NULL; switch (recordType) { case ERT_root: recordName = "Root"; break; case ERT_Curve: recordName = "Curve"; break; case ERT_FilmBox: recordName = "FilmBox"; break; case ERT_FilmSession: recordName = "FilmSession"; break; case ERT_Image: recordName = "Image"; break; case ERT_ImageBox: recordName = "ImageBox"; break; case ERT_Interpretation: recordName = "Interpretation"; break; case ERT_ModalityLut: recordName = "ModalityLUT"; break; case ERT_Mrdr: recordName = "MRDR"; break; case ERT_Overlay: recordName = "Overlay"; break; case ERT_Patient: recordName = "Patient"; break; case ERT_PrintQueue: recordName = "PrintQueue"; break; case ERT_Private: recordName = "Private"; break; case ERT_Results: recordName = "Results"; break; case ERT_Series: recordName = "Series"; break; case ERT_Study: recordName = "Study"; break; case ERT_StudyComponent: recordName = "StudyComponent"; break; case ERT_Topic: recordName = "Topic"; break; case ERT_Visit: recordName = "Visit"; break; case ERT_VoiLut: recordName = "VOILUT"; break; case ERT_SRDocument: recordName = "SRDocument"; break; case ERT_Presentation: recordName = "Presentation"; break; case ERT_Waveform: recordName = "Waveform"; break; case ERT_RTDose: recordName = "RTDose"; break; case ERT_RTStructureSet: recordName = "RTStructureSet"; break; case ERT_RTPlan: recordName = "RTPlan"; break; case ERT_RTTreatRecord: recordName = "RTTreatRecord"; break; case ERT_StoredPrint: recordName = "StoredPrint"; break; case ERT_KeyObjectDoc: recordName = "KeyObjectDoc"; break; case ERT_Registration: recordName = "Registration"; break; case ERT_Fiducial: recordName = "Fiducial"; break; case ERT_RawData: recordName = "RawData"; break; case ERT_Spectroscopy: recordName = "Spectroscopy"; break; case ERT_EncapDoc: recordName = "EncapDoc"; break; case ERT_ValueMap: recordName = "ValueMap"; break; case ERT_HangingProtocol: recordName = "HangingProtocol"; break; case ERT_Stereometric: recordName = "Stereometric"; break; case ERT_HL7StrucDoc: recordName = "HL7StrucDoc"; break; case ERT_Palette: recordName = "Palette"; break; case ERT_Surface: recordName = "Surface"; break; case ERT_Measurement: recordName = "Measurement"; break; case ERT_Implant: recordName = "Implant"; break; case ERT_ImplantGroup: recordName = "ImplantGroup"; break; case ERT_ImplantAssy: recordName = "ImplantAssy"; break; default: recordName = "(unknown-directory-record-type)"; break; } return recordName; } // get record type from SOP class static E_DirRecType sopClassToRecordType(const OFString &sopClass) { /* default: image SOP class */ E_DirRecType result = ERT_Image; /* check whether any non-image SOP class */ if (compare(sopClass, UID_RETIRED_StandaloneOverlayStorage)) result = ERT_Overlay; else if (compare(sopClass, UID_RETIRED_StandaloneModalityLUTStorage)) result = ERT_ModalityLut; else if (compare(sopClass, UID_RETIRED_StandaloneVOILUTStorage)) result = ERT_VoiLut; else if (compare(sopClass, UID_RETIRED_StandaloneCurveStorage) || compare(sopClass, UID_RETIRED_StandalonePETCurveStorage)) { result = ERT_Curve; } else if (compare(sopClass, UID_BasicTextSRStorage) || compare(sopClass, UID_EnhancedSRStorage) || compare(sopClass, UID_ComprehensiveSRStorage) || compare(sopClass, UID_ProcedureLogStorage) || compare(sopClass, UID_MammographyCADSRStorage) || compare(sopClass, UID_ChestCADSRStorage) || compare(sopClass, UID_XRayRadiationDoseSRStorage) || compare(sopClass, UID_ColonCADSRStorage) || compare(sopClass, UID_SpectaclePrescriptionReportStorage) || compare(sopClass, UID_MacularGridThicknessAndVolumeReportStorage) || compare(sopClass, UID_ImplantationPlanSRDocumentStorage)) { result = ERT_SRDocument; } else if (compare(sopClass, UID_GrayscaleSoftcopyPresentationStateStorage) || compare(sopClass, UID_ColorSoftcopyPresentationStateStorage) || compare(sopClass, UID_PseudoColorSoftcopyPresentationStateStorage) || compare(sopClass, UID_BlendingSoftcopyPresentationStateStorage) || compare(sopClass, UID_XAXRFGrayscaleSoftcopyPresentationStateStorage) || compare(sopClass, UID_BasicStructuredDisplayStorage)) { result = ERT_Presentation; } else if (compare(sopClass, UID_TwelveLeadECGWaveformStorage) || compare(sopClass, UID_GeneralECGWaveformStorage) || compare(sopClass, UID_AmbulatoryECGWaveformStorage) || compare(sopClass, UID_HemodynamicWaveformStorage) || compare(sopClass, UID_CardiacElectrophysiologyWaveformStorage) || compare(sopClass, UID_BasicVoiceAudioWaveformStorage) || compare(sopClass, UID_GeneralAudioWaveformStorage) || compare(sopClass, UID_ArterialPulseWaveformStorage) || compare(sopClass, UID_RespiratoryWaveformStorage)) { result = ERT_Waveform; } else if (compare(sopClass, UID_RTDoseStorage)) result = ERT_RTDose; else if (compare(sopClass, UID_RTStructureSetStorage)) result = ERT_RTStructureSet; else if (compare(sopClass, UID_RTPlanStorage) || compare(sopClass, UID_RTIonPlanStorage)) { result = ERT_RTPlan; } else if (compare(sopClass, UID_RTBeamsTreatmentRecordStorage) || compare(sopClass, UID_RTBrachyTreatmentRecordStorage) || compare(sopClass, UID_RTTreatmentSummaryRecordStorage) || compare(sopClass, UID_RTIonBeamsTreatmentRecordStorage)) { result = ERT_RTTreatRecord; } else if (compare(sopClass, UID_RETIRED_StoredPrintStorage)) result = ERT_StoredPrint; else if (compare(sopClass, UID_KeyObjectSelectionDocumentStorage)) result = ERT_KeyObjectDoc; else if (compare(sopClass, UID_SpatialRegistrationStorage) || compare(sopClass, UID_DeformableSpatialRegistrationStorage)) { result = ERT_Registration; } else if (compare(sopClass, UID_SpatialFiducialsStorage)) result = ERT_Fiducial; else if (compare(sopClass, UID_RawDataStorage)) result = ERT_RawData; else if (compare(sopClass, UID_MRSpectroscopyStorage)) result = ERT_Spectroscopy; else if (compare(sopClass, UID_EncapsulatedPDFStorage) || compare(sopClass, UID_EncapsulatedCDAStorage)) { result = ERT_EncapDoc; } else if (compare(sopClass, UID_RealWorldValueMappingStorage)) result = ERT_ValueMap; else if (compare(sopClass, UID_HangingProtocolStorage)) result = ERT_HangingProtocol; else if (compare(sopClass, UID_StereometricRelationshipStorage)) result = ERT_Stereometric; else if (compare(sopClass, UID_ColorPaletteStorage)) result = ERT_Palette; else if (compare(sopClass, UID_SurfaceSegmentationStorage)) result = ERT_Surface; else if (compare(sopClass, UID_LensometryMeasurementsStorage) || compare(sopClass, UID_AutorefractionMeasurementsStorage) || compare(sopClass, UID_KeratometryMeasurementsStorage) || compare(sopClass, UID_SubjectiveRefractionMeasurementsStorage) || compare(sopClass, UID_VisualAcuityMeasurementsStorage) || compare(sopClass, UID_OphthalmicAxialMeasurementsStorage) || compare(sopClass, UID_IntraocularLensCalculationsStorage) || compare(sopClass, UID_OphthalmicVisualFieldStaticPerimetryMeasurementsStorage)) { result = ERT_Measurement; } else if (compare(sopClass, UID_GenericImplantTemplateStorage)) result = ERT_Implant; else if (compare(sopClass, UID_ImplantTemplateGroupStorage)) result = ERT_ImplantGroup; else if (compare(sopClass, UID_ImplantAssemblyTemplateStorage)) result = ERT_ImplantAssy; return result; } // get unique key for the given record type static DcmTagKey getRecordUniqueKey(const E_DirRecType recordType) { /* default for all other record types */ DcmTagKey result = DCM_ReferencedSOPInstanceUIDInFile; /* special cases: patient, study, series */ if (recordType == ERT_Patient) result = DCM_PatientID; else if (recordType == ERT_Study) result = DCM_StudyInstanceUID; else if (recordType == ERT_Series) result = DCM_SeriesInstanceUID; return result; } // copy content items which modify the concept name of the document root static void addConceptModContentItems(DcmDirectoryRecord *record, DcmItem *dataset) { /* Content Sequence, type 1C (see DICOM part 3) "Contains the Target Content Items that modify the Concept Name Code Sequence of the root Content Item (Document Title). Required if the root Content Item is the Source Content Item of HAS CONCEPT MOD relationships." */ if ((record != NULL) && (dataset != NULL)) { OFString tmpString; signed long i = 0; DcmItem *ditem = NULL; /* create new ContentSequence */ DcmSequenceOfItems *newSeq = new DcmSequenceOfItems(DCM_ContentSequence); if (newSeq != NULL) { do { /* get sequence item (not very efficient, but it works) */ if (dataset->findAndGetSequenceItem(DCM_ContentSequence, ditem, i++).good()) { /* check RelationshipType */ if (ditem->findAndGetOFString(DCM_RelationshipType, tmpString).good() && (tmpString.compare("HAS CONCEPT MOD") == 0)) { /* copy content item */ DcmItem *newItem = new DcmItem(*ditem); if (newItem != NULL) { if (newSeq->append(newItem).bad()) delete newItem; } } } } while (ditem != NULL); /* try to insert content sequence into record (if not empty) */ if ((newSeq->card() == 0) || (record->insert(newSeq, OFTrue /*replaceOld*/).bad())) delete newSeq; } } } // copy relevant attributes from the blending sequence static void addBlendingSequence(DcmDirectoryRecord *record, DcmItem *dataset) { if ((record != NULL) && (dataset != NULL)) { /* make sure that the sequence is really present in the original dataset */ if (dataset->tagExistsWithValue(DCM_BlendingSequence)) { signed long i = 0; DcmItem *ditem = NULL; /* create new BlendingSequence */ DcmSequenceOfItems *newSeq = new DcmSequenceOfItems(DCM_BlendingSequence); if (newSeq != NULL) { do { /* get sequence item (not very efficient, but it works) */ if (dataset->findAndGetSequenceItem(DCM_BlendingSequence, ditem, i++).good()) { DcmItem *newItem = new DcmItem(); if (newItem != NULL) { if (newSeq->append(newItem).good()) { ditem->findAndInsertCopyOfElement(DCM_StudyInstanceUID, newItem); ditem->findAndInsertCopyOfElement(DCM_ReferencedSeriesSequence, newItem); } else delete newItem; } } } while ((ditem != NULL) && (i <= 2)); // terminate after two items /* try to insert blending sequence into record (if not empty) */ if ((newSeq->card() == 0) || (record->insert(newSeq, OFTrue /*replaceOld*/).bad())) delete newSeq; } } } } // insert child record into the parent's list based on the numeric value of the criterionKey static OFCondition insertWithISCriterion(DcmDirectoryRecord *parent, DcmDirectoryRecord *child, const DcmTagKey &criterionKey) { OFCondition result = EC_IllegalParameter; /* check parameters first */ if ((parent != NULL) && (child != NULL)) { OFBool found = OFFalse; Sint32 childNumber = 0; Sint32 parentNumber = 0; /* retrieve numeric value */ result = child->findAndGetSint32(criterionKey, childNumber); /* if available search for proper position */ if (result.good()) { DcmDirectoryRecord *record = NULL; /* iterate over all records in the parent list */ while (!found && ((record = parent->nextSub(record)) != NULL)) { /* check for proper position */ if (record->findAndGetSint32(criterionKey, parentNumber).good() && (parentNumber > childNumber)) found = OFTrue; } } /* insert child record at determined position */ if (found) result = parent->insertSubAtCurrentPos(child, OFTrue /*before*/); else /* or append at the end of the list */ result = parent->insertSub(child); } return result; } // insert child record sorted under the parent record static OFCondition insertSortedUnder(DcmDirectoryRecord *parent, DcmDirectoryRecord *child) { OFCondition result = EC_IllegalParameter; /* check parameters first */ if ((parent != NULL) && (child != NULL)) { switch (child->getRecordType()) { case ERT_Image: /* try to insert based on Image/InstanceNumber */ result = insertWithISCriterion(parent, child, DCM_InstanceNumber); break; case ERT_Overlay: /* try to insert based on OverlayNumber */ result = insertWithISCriterion(parent, child, DCM_RETIRED_OverlayNumber); break; case ERT_Curve: /* try to insert based on CurveNumber */ result = insertWithISCriterion(parent, child, DCM_RETIRED_CurveNumber); break; case ERT_ModalityLut: case ERT_VoiLut: /* try to insert based on LUTNumber */ result = insertWithISCriterion(parent, child, DCM_RETIRED_LUTNumber); break; case ERT_SRDocument: case ERT_Presentation: case ERT_Waveform: case ERT_RTDose: case ERT_RTStructureSet: case ERT_RTPlan: case ERT_RTTreatRecord: case ERT_StoredPrint: case ERT_KeyObjectDoc: case ERT_Registration: case ERT_Fiducial: case ERT_RawData: case ERT_Spectroscopy: case ERT_EncapDoc: case ERT_ValueMap: case ERT_Surface: case ERT_Measurement: /* try to insert based on InstanceNumber */ result = insertWithISCriterion(parent, child, DCM_InstanceNumber); break; case ERT_Series: /* try to insert based on SeriesNumber */ result = insertWithISCriterion(parent, child, DCM_SeriesNumber); break; case ERT_Stereometric: /* no InstanceNumber or the like */ default: /* append */ result = parent->insertSub(child); break; } } return result; } // create alternative study date if absent in dataset static OFString &alternativeStudyDate(DcmItem *dataset, OFString &result) { if (dataset != NULL) { /* use another date if present */ if (dataset->findAndGetOFStringArray(DCM_SeriesDate, result).bad() || result.empty()) { if (dataset->findAndGetOFStringArray(DCM_AcquisitionDate, result).bad() || result.empty()) { if (dataset->findAndGetOFStringArray(DCM_ContentDate, result).bad() || result.empty()) { /* use current date, "19000101" in case of error */ DcmDate::getCurrentDate(result); } } } } else result.clear(); return result; } // create alternative study time if absent in dataset static OFString &alternativeStudyTime(DcmItem *dataset, OFString &result) { if (dataset != NULL) { /* use another time if present */ if (dataset->findAndGetOFStringArray(DCM_SeriesTime, result).bad() || result.empty()) { if (dataset->findAndGetOFStringArray(DCM_AcquisitionTime, result).bad() || result.empty()) { if (dataset->findAndGetOFStringArray(DCM_ContentTime, result).bad() || result.empty()) { /* use current time, "0000" in case of error */ DcmTime::getCurrentTime(result); } } } } else result.clear(); return result; } /*------------------* * implementation * *------------------*/ // constructor DicomDirInterface::DicomDirInterface() : DicomDir(NULL), ImagePlugin(NULL), ApplicationProfile(AP_Default), BackupMode(OFTrue), AbortMode(OFFalse), MapFilenamesMode(OFFalse), InventMode(OFFalse), InventPatientIDMode(OFFalse), RetiredSOPClassSupport(OFFalse), EncodingCheck(OFTrue), ResolutionCheck(OFTrue), TransferSyntaxCheck(OFTrue), ConsistencyCheck(OFTrue), IconImageMode(OFFalse), FilesetUpdateMode(OFFalse), BackupFilename(), BackupCreated(OFFalse), IconSize(64), IconPrefix(), DefaultIcon(), RLESupport(OFFalse), JPEGSupport(OFFalse), JP2KSupport(OFFalse), AutoPatientNumber(0), AutoStudyNumber(0), AutoSeriesNumber(0), AutoInstanceNumber(1), AutoOverlayNumber(1), AutoLutNumber(1), AutoCurveNumber(1) { /* check whether (possibly required) RLE/JPEG/JP2K decoders are registered */ RLESupport = DcmCodecList::canChangeCoding(EXS_RLELossless, EXS_LittleEndianExplicit); JPEGSupport = DcmCodecList::canChangeCoding(EXS_JPEGProcess1TransferSyntax, EXS_LittleEndianExplicit) && DcmCodecList::canChangeCoding(EXS_JPEGProcess14SV1TransferSyntax, EXS_LittleEndianExplicit); JP2KSupport = DcmCodecList::canChangeCoding(EXS_JPEG2000LosslessOnly, EXS_LittleEndianExplicit) && DcmCodecList::canChangeCoding(EXS_JPEG2000, EXS_LittleEndianExplicit); } // destructor DicomDirInterface::~DicomDirInterface() { /* reset object to its initial state (free memory) */ cleanup(); } // cleanup the object, i.e. free all memory void DicomDirInterface::cleanup() { /* free all allocated memory */ delete DicomDir; /* invalidate references */ DicomDir = NULL; } // check whether the current DICOMDIR object is valid OFBool DicomDirInterface::isDicomDirValid() const { /* tbd: might add more sophisticated checks later on, e.g. require at least one referenced DICOM file */ return (DicomDir != NULL); } // create a backup of the specified file void DicomDirInterface::createDicomDirBackup(const char *filename) { /* check whether DICOMDIR already exists */ if (OFStandard::fileExists(filename)) { /* rename existing DICOMDIR */ BackupFilename = OFString(filename) + FNAME_BACKUP_EXTENSION; /* delete old backup file (if any) */ deleteDicomDirBackup(); DCMDATA_INFO("creating DICOMDIR backup: " << BackupFilename); /* create backup file */ if (copyFile(filename, BackupFilename.c_str())) BackupCreated = OFTrue; else DCMDATA_ERROR("cannot create backup of: " << filename); } } // delete backup file if one has been created void DicomDirInterface::deleteDicomDirBackup() { /* if a backup of the DICOMDIR exists */ if (OFStandard::fileExists(BackupFilename)) { if (BackupCreated) DCMDATA_INFO("deleting DICOMDIR backup: " << BackupFilename); else DCMDATA_INFO("deleting old DICOMDIR backup: " << BackupFilename); /* delete the backup file */ unlink(BackupFilename.c_str()); } /* reset status variable */ BackupCreated = OFFalse; } // create a new DICOMDIR object, i.e. replace any previously existing 'filename' OFCondition DicomDirInterface::createNewDicomDir(const E_ApplicationProfile profile, const char *filename, const char *filesetID) { OFCondition result = EC_IllegalParameter; if ((filename != NULL) && checkFilesetID(filesetID)) { FilesetUpdateMode = OFFalse; /* first remove any existing DICOMDIR from memory */ cleanup(); /* then create a backup if a DICOMDIR file already exists */ if (OFStandard::fileExists(filename)) { if (BackupMode) createDicomDirBackup(filename); /* and delete it because otherwise DcmDicomDir will parse it and try to append to existing records */ unlink(filename); } /* select new application profile */ result = selectApplicationProfile(profile); if (result.good()) { DCMDATA_INFO("creating DICOMDIR file using " << getProfileName(ApplicationProfile) << " profile: " << filename); /* finally, create a new DICOMDIR object */ DicomDir = new DcmDicomDir(filename, filesetID); if (DicomDir != NULL) result = DicomDir->error(); else result = EC_MemoryExhausted; } } return result; } // create a DICOMDIR based on an existing one, i.e. append the new entries OFCondition DicomDirInterface::appendToDicomDir(const E_ApplicationProfile profile, const char *filename) { OFCondition result = EC_IllegalParameter; if (filename != NULL) { FilesetUpdateMode = OFFalse; /* first remove any existing DICOMDIR from memory */ cleanup(); /* then check whether DICOMDIR file already exists */ if (OFStandard::fileExists(filename)) { /* then create a backup if required */ if (BackupMode) createDicomDirBackup(filename); /* select new application profile */ result = selectApplicationProfile(profile); if (result.good()) { DCMDATA_INFO("appending to DICOMDIR file using " << getProfileName(ApplicationProfile) << " profile: " << filename); /* finally, create a DICOMDIR object based on the existing file */ DicomDir = new DcmDicomDir(filename); if (DicomDir != NULL) result = DicomDir->error(); else result = EC_MemoryExhausted; } } else { /* create error message "No such file or directory" from error code */ char buffer[255]; const char *text = OFStandard::strerror(ENOENT, buffer, 255); if ((text == NULL) || (strlen(text) == 0)) text = "(unknown error code)"; /* error code 18 is reserved for file read error messages (see dcerror.cc) */ result = makeOFCondition(OFM_dcmdata, 18, OF_error, text); /* report an error */ DCMDATA_ERROR(result.text() << ": cannot append to file: " << filename); } } return result; } // create a DICOMDIR based on an existing one, i.e. append new and update existing entries OFCondition DicomDirInterface::updateDicomDir(const E_ApplicationProfile profile, const char *filename) { OFCondition result = EC_IllegalParameter; if (filename != NULL) { FilesetUpdateMode = OFTrue; /* first remove any existing DICOMDIR from memory */ cleanup(); /* then check whether DICOMDIR file already exists */ if (OFStandard::fileExists(filename)) { /* then create a backup if required */ if (BackupMode) createDicomDirBackup(filename); /* select new application profile */ result = selectApplicationProfile(profile); if (result.good()) { DCMDATA_INFO("updating DICOMDIR file using " << getProfileName(ApplicationProfile) << " profile: " << filename); /* finally, create a DICOMDIR object based on the existing file */ DicomDir = new DcmDicomDir(filename); if (DicomDir != NULL) result = DicomDir->error(); else result = EC_MemoryExhausted; } } else { /* create error message "No such file or directory" from error code */ char buffer[255]; const char *text = OFStandard::strerror(ENOENT, buffer, 255); if ((text == NULL) || (strlen(text) == 0)) text = "(unknown error code)"; /* error code 18 is reserved for file read error messages (see dcerror.cc) */ result = makeOFCondition(OFM_dcmdata, 18, OF_error, text); /* report an error */ DCMDATA_ERROR(result.text() << ": cannot update file: " << filename); } } return result; } // write the current DICOMDIR object to file OFCondition DicomDirInterface::writeDicomDir(const E_EncodingType encodingType, const E_GrpLenEncoding groupLength) { OFCondition result = EC_IllegalCall; /* check whether DICOMDIR object is valid */ if (isDicomDirValid()) { DCMDATA_INFO("writing file: " << DicomDir->getDirFileName()); /* write DICOMDIR as Little Endian Explicit as required by the standard */ result = DicomDir->write(DICOMDIR_DEFAULT_TRANSFERSYNTAX, encodingType, groupLength); /* delete backup copy in case the new file could be written without any errors */ if (result.good()) deleteDicomDirBackup(); else { /* report an error */ DCMDATA_ERROR(result.text() << ": writing file: " << DicomDir->getDirFileName()); } } return result; } // check whether the specified filename conforms to the DICOM standard requirements OFBool DicomDirInterface::isFilenameValid(const char *filename, const OFBool allowEmpty) { OFBool result = OFTrue; /* check for empty filename */ if ((filename == NULL) || (strlen(filename) == 0)) { if (!allowEmpty) { DCMDATA_ERROR(" not allowed as filename"); result = OFFalse; } } else { size_t invalidChar = 0; /* check whether the file name path is ok and in local format */ if ((filename[0] == PATH_SEPARATOR) /* absolute path? */ || locateInvalidFilenameChars(filename, invalidChar, MapFilenamesMode)) { DCMDATA_ERROR("invalid character(s) in filename: " << filename << OFendl << OFString(34 /*message*/ + invalidChar, ' ') << "^"); result = OFFalse; } /* ensure that the maximum number of components is not being exceeded */ if (componentCount(filename) > MAX_FNAME_COMPONENTS) { DCMDATA_ERROR("too many path components (max " << MAX_FNAME_COMPONENTS << ") in filename: " << filename); result = OFFalse; } /* ensure that each component is not too large */ if (isComponentTooLarge(filename, MAX_FNAME_COMPONENT_SIZE, MapFilenamesMode)) { /* create error message */ DCMDATA_ERROR("component too large (max " << MAX_FNAME_COMPONENT_SIZE << " characters) in filename: " << filename); result = OFFalse; } } return result; } // check whether the specified character set is defined in the DICOM standard OFBool DicomDirInterface::isCharsetValid(const char *charset) { OFBool result = OFTrue; /* empty charset is also valid */ if ((charset != NULL) && (strlen(charset) > 0)) { /* check for valid charset */ result = (strcmp(charset, "ISO_IR 100") == 0) || (strcmp(charset, "ISO_IR 101") == 0) || (strcmp(charset, "ISO_IR 109") == 0) || (strcmp(charset, "ISO_IR 110") == 0) || (strcmp(charset, "ISO_IR 144") == 0) || (strcmp(charset, "ISO_IR 127") == 0) || (strcmp(charset, "ISO_IR 126") == 0) || (strcmp(charset, "ISO_IR 138") == 0) || (strcmp(charset, "ISO_IR 148") == 0) || (strcmp(charset, "ISO_IR 166") == 0) || (strcmp(charset, "ISO_IR 13") == 0) || (strcmp(charset, "ISO_IR 192") == 0); if (!result) DCMDATA_ERROR("unknown character set for fileset descriptor: " << charset); } return result; } // check the given file (dataset) regarding SOP class and transfer syntax OFCondition DicomDirInterface::checkSOPClassAndXfer(DcmMetaInfo *metainfo, DcmItem *dataset, const char *filename) { OFCondition result = EC_IllegalParameter; if ((filename != NULL) && (metainfo != NULL) && (dataset != NULL)) { /* is sop class ok? */ OFString mediaSOPClassUID; if (metainfo->findAndGetOFStringArray(DCM_MediaStorageSOPClassUID, mediaSOPClassUID).bad()) { DCMDATA_ERROR("MediaStorageSOPClassUID missing in metainfo-header: " << filename); result = EC_TagNotFound; } else { /* check if the SOP Class is a known storage SOP class (an image, overlay, curve, etc.) */ OFBool found = OFFalse; OFString expectedTransferSyntax = UID_LittleEndianExplicitTransferSyntax; switch (ApplicationProfile) { case AP_MPEG2MPatMLDVD: expectedTransferSyntax = UID_MPEG2MainProfileAtMainLevelTransferSyntax; /* multi-frame composite IODs only! */ found = compare(mediaSOPClassUID, UID_BreastTomosynthesisImageStorage) || compare(mediaSOPClassUID, UID_EnhancedCTImageStorage) || compare(mediaSOPClassUID, UID_EnhancedMRColorImageStorage) || compare(mediaSOPClassUID, UID_EnhancedMRImageStorage) || compare(mediaSOPClassUID, UID_EnhancedPETImageStorage) || compare(mediaSOPClassUID, UID_EnhancedUSVolumeStorage) || compare(mediaSOPClassUID, UID_EnhancedXAImageStorage) || compare(mediaSOPClassUID, UID_EnhancedXRFImageStorage) || compare(mediaSOPClassUID, UID_MultiframeGrayscaleByteSecondaryCaptureImageStorage) || compare(mediaSOPClassUID, UID_MultiframeGrayscaleWordSecondaryCaptureImageStorage) || compare(mediaSOPClassUID, UID_MultiframeSingleBitSecondaryCaptureImageStorage) || compare(mediaSOPClassUID, UID_MultiframeTrueColorSecondaryCaptureImageStorage) || compare(mediaSOPClassUID, UID_NuclearMedicineImageStorage) || compare(mediaSOPClassUID, UID_OphthalmicPhotography16BitImageStorage) || compare(mediaSOPClassUID, UID_OphthalmicPhotography8BitImageStorage) || compare(mediaSOPClassUID, UID_OphthalmicTomographyImageStorage) || compare(mediaSOPClassUID, UID_RTDoseStorage) || compare(mediaSOPClassUID, UID_RTImageStorage) || compare(mediaSOPClassUID, UID_UltrasoundMultiframeImageStorage) || compare(mediaSOPClassUID, UID_VideoEndoscopicImageStorage) || compare(mediaSOPClassUID, UID_VideoMicroscopicImageStorage) || compare(mediaSOPClassUID, UID_VideoPhotographicImageStorage) || compare(mediaSOPClassUID, UID_XRay3DAngiographicImageStorage) || compare(mediaSOPClassUID, UID_XRay3DCraniofacialImageStorage) || compare(mediaSOPClassUID, UID_XRayAngiographicImageStorage) || compare(mediaSOPClassUID, UID_XRayRadiofluoroscopicImageStorage); break; case AP_BasicCardiac: if (compare(mediaSOPClassUID, UID_XRayAngiographicImageStorage)) { expectedTransferSyntax = UID_JPEGProcess14SV1TransferSyntax; found = OFTrue; } else if (RetiredSOPClassSupport) { /* the following SOP class has been retired with DICOM 2006: */ found = compare(mediaSOPClassUID, UID_RETIRED_DetachedPatientManagementSOPClass); } break; case AP_XrayAngiographic: case AP_XrayAngiographicDVD: if (compare(mediaSOPClassUID, UID_XRayAngiographicImageStorage)) { /* JPEG lossy compression only allowed for DVD media (checked later) */ if (ApplicationProfile == AP_XrayAngiographic) expectedTransferSyntax = UID_JPEGProcess14SV1TransferSyntax; found = OFTrue; } else { found = compare(mediaSOPClassUID, UID_SecondaryCaptureImageStorage) || compare(mediaSOPClassUID, UID_GrayscaleSoftcopyPresentationStateStorage); if (!found && RetiredSOPClassSupport) { /* the following SOP classes have been retired with DICOM 2004: */ found = compare(mediaSOPClassUID, UID_RETIRED_StandaloneOverlayStorage) || compare(mediaSOPClassUID, UID_RETIRED_StandaloneCurveStorage) || compare(mediaSOPClassUID, UID_RETIRED_DetachedPatientManagementSOPClass); } } break; case AP_DentalRadiograph: found = compare(mediaSOPClassUID, UID_DigitalIntraOralXRayImageStorageForPresentation) || compare(mediaSOPClassUID, UID_DigitalXRayImageStorageForPresentation) || compare(mediaSOPClassUID, UID_BasicStructuredDisplayStorage) || compare(mediaSOPClassUID, UID_GrayscaleSoftcopyPresentationStateStorage); break; case AP_CTandMR: /* transfer syntax needs to be checked later */ found = compare(mediaSOPClassUID, UID_CTImageStorage) || compare(mediaSOPClassUID, UID_MRImageStorage) || compare(mediaSOPClassUID, UID_SecondaryCaptureImageStorage); if (!found && RetiredSOPClassSupport) { /* the following SOP class has been retired with DICOM 2004: */ found = compare(mediaSOPClassUID, UID_RETIRED_DetachedPatientManagementSOPClass); } break; case AP_UltrasoundIDSF: case AP_UltrasoundSCSF: case AP_UltrasoundCCSF: /* transfer syntax needs to be checked later */ found = compare(mediaSOPClassUID, UID_UltrasoundImageStorage); break; case AP_UltrasoundIDMF: case AP_UltrasoundSCMF: case AP_UltrasoundCCMF: /* transfer syntax needs to be checked later */ found = compare(mediaSOPClassUID, UID_UltrasoundImageStorage) || compare(mediaSOPClassUID, UID_UltrasoundMultiframeImageStorage); break; case AP_TwelveLeadECG: found = compare(mediaSOPClassUID, UID_TwelveLeadECGWaveformStorage); break; case AP_HemodynamicWaveform: found = compare(mediaSOPClassUID, UID_HemodynamicWaveformStorage); break; case AP_GeneralPurpose: case AP_GeneralPurposeDVD: case AP_GeneralPurposeMIME: case AP_USBandFlash: default: { /* is it an image ? */ for (int i = 0; i < numberOfDcmImageSOPClassUIDs && !found; i++) found = compare(mediaSOPClassUID, dcmImageSOPClassUIDs[i]); /* is it one of the RT SOP Classes? */ if (!found) { found = compare(mediaSOPClassUID, UID_RTDoseStorage) || compare(mediaSOPClassUID, UID_RTStructureSetStorage) || compare(mediaSOPClassUID, UID_RTBeamsTreatmentRecordStorage) || compare(mediaSOPClassUID, UID_RTPlanStorage) || compare(mediaSOPClassUID, UID_RTBrachyTreatmentRecordStorage) || compare(mediaSOPClassUID, UID_RTTreatmentSummaryRecordStorage) || compare(mediaSOPClassUID, UID_RTIonPlanStorage) || compare(mediaSOPClassUID, UID_RTIonBeamsTreatmentRecordStorage); } /* is it one of the structured reporting SOP Classes? */ if (!found) { found = compare(mediaSOPClassUID, UID_BasicTextSRStorage) || compare(mediaSOPClassUID, UID_EnhancedSRStorage) || compare(mediaSOPClassUID, UID_ComprehensiveSRStorage) || compare(mediaSOPClassUID, UID_ProcedureLogStorage) || compare(mediaSOPClassUID, UID_MammographyCADSRStorage) || compare(mediaSOPClassUID, UID_ChestCADSRStorage) || compare(mediaSOPClassUID, UID_XRayRadiationDoseSRStorage) || compare(mediaSOPClassUID, UID_ColonCADSRStorage) || compare(mediaSOPClassUID, UID_SpectaclePrescriptionReportStorage) || compare(mediaSOPClassUID, UID_MacularGridThicknessAndVolumeReportStorage) || compare(mediaSOPClassUID, UID_ImplantationPlanSRDocumentStorage); } /* is it one of the waveform SOP Classes? */ if (!found) { found = compare(mediaSOPClassUID, UID_TwelveLeadECGWaveformStorage) || compare(mediaSOPClassUID, UID_GeneralECGWaveformStorage) || compare(mediaSOPClassUID, UID_AmbulatoryECGWaveformStorage) || compare(mediaSOPClassUID, UID_HemodynamicWaveformStorage) || compare(mediaSOPClassUID, UID_CardiacElectrophysiologyWaveformStorage) || compare(mediaSOPClassUID, UID_BasicVoiceAudioWaveformStorage) || compare(mediaSOPClassUID, UID_GeneralAudioWaveformStorage) || compare(mediaSOPClassUID, UID_ArterialPulseWaveformStorage) || compare(mediaSOPClassUID, UID_RespiratoryWaveformStorage); } /* is it one of the presentation state SOP Classes? */ if (!found) { found = compare(mediaSOPClassUID, UID_GrayscaleSoftcopyPresentationStateStorage) || compare(mediaSOPClassUID, UID_ColorSoftcopyPresentationStateStorage) || compare(mediaSOPClassUID, UID_PseudoColorSoftcopyPresentationStateStorage) || compare(mediaSOPClassUID, UID_BlendingSoftcopyPresentationStateStorage) || compare(mediaSOPClassUID, UID_XAXRFGrayscaleSoftcopyPresentationStateStorage) || compare(mediaSOPClassUID, UID_BasicStructuredDisplayStorage); } /* is it one of the encapsulated document SOP Classes? */ if (!found) { found = compare(mediaSOPClassUID, UID_EncapsulatedPDFStorage) || compare(mediaSOPClassUID, UID_EncapsulatedCDAStorage); } /* is it one of the spatial registration SOP Classes? */ if (!found) { found = compare(mediaSOPClassUID, UID_SpatialRegistrationStorage) || compare(mediaSOPClassUID, UID_SpatialFiducialsStorage) || compare(mediaSOPClassUID, UID_DeformableSpatialRegistrationStorage); } /* is it one of the segmentation SOP Classes? */ if (!found) { found = compare(mediaSOPClassUID, UID_SegmentationStorage) || // will be mapped to IMAGE record compare(mediaSOPClassUID, UID_SurfaceSegmentationStorage); } /* is it one of the measurement SOP Classes? */ if (!found) { found = compare(mediaSOPClassUID, UID_LensometryMeasurementsStorage) || compare(mediaSOPClassUID, UID_AutorefractionMeasurementsStorage) || compare(mediaSOPClassUID, UID_KeratometryMeasurementsStorage) || compare(mediaSOPClassUID, UID_SubjectiveRefractionMeasurementsStorage) || compare(mediaSOPClassUID, UID_VisualAcuityMeasurementsStorage) || compare(mediaSOPClassUID, UID_OphthalmicAxialMeasurementsStorage) || compare(mediaSOPClassUID, UID_IntraocularLensCalculationsStorage) || compare(mediaSOPClassUID, UID_OphthalmicVisualFieldStaticPerimetryMeasurementsStorage); } /* is it one of the implant SOP Classes? */ if (!found) { found = compare(mediaSOPClassUID, UID_GenericImplantTemplateStorage) || compare(mediaSOPClassUID, UID_ImplantAssemblyTemplateStorage) || compare(mediaSOPClassUID, UID_ImplantTemplateGroupStorage); } /* is it any other SOP class? */ if (!found) { found = compare(mediaSOPClassUID, UID_KeyObjectSelectionDocumentStorage) || compare(mediaSOPClassUID, UID_RawDataStorage) || compare(mediaSOPClassUID, UID_MRSpectroscopyStorage) || compare(mediaSOPClassUID, UID_RealWorldValueMappingStorage) || compare(mediaSOPClassUID, UID_HangingProtocolStorage) || compare(mediaSOPClassUID, UID_StereometricRelationshipStorage) || compare(mediaSOPClassUID, UID_ColorPaletteStorage); } /* the following SOP classes have been retired with previous editions of the DICOM standard */ if (!found && RetiredSOPClassSupport) { found = compare(mediaSOPClassUID, UID_RETIRED_StoredPrintStorage) || compare(mediaSOPClassUID, UID_RETIRED_StandaloneOverlayStorage) || compare(mediaSOPClassUID, UID_RETIRED_StandaloneCurveStorage) || compare(mediaSOPClassUID, UID_RETIRED_StandaloneModalityLUTStorage) || compare(mediaSOPClassUID, UID_RETIRED_StandaloneVOILUTStorage) || compare(mediaSOPClassUID, UID_RETIRED_StandalonePETCurveStorage); if (!found && (ApplicationProfile == AP_GeneralPurpose)) { /* a detached patient mgmt sop class is also ok */ found = compare(mediaSOPClassUID, UID_RETIRED_DetachedPatientManagementSOPClass); } } } } if (found) result = EC_Normal; else { OFString sopClassName = dcmFindNameOfUID(mediaSOPClassUID.c_str(), ""); if (sopClassName.empty()) sopClassName = mediaSOPClassUID; DCMDATA_ERROR("invalid SOP class (" << sopClassName << ") for " << getProfileName(ApplicationProfile) << " profile: " << filename); result = EC_ApplicationProfileViolated; } if (result.good()) { /* is transfer syntax ok? */ OFString transferSyntax; if (metainfo->findAndGetOFStringArray(DCM_TransferSyntaxUID, transferSyntax).bad()) { DCMDATA_ERROR("TransferSyntaxUID missing in metainfo-header: " << filename); result = EC_TagNotFound; } /* is transfer syntax supported */ if (result.good()) { /* RLE comporession */ if (compare(transferSyntax, UID_RLELosslessTransferSyntax)) { if (!RLESupport && IconImageMode) { DCMDATA_ERROR("RLE compression not supported: " << filename); result = EC_CannotChangeRepresentation; } } /* JPEG compression */ if (compare(transferSyntax, UID_JPEGProcess14SV1TransferSyntax) || compare(transferSyntax, UID_JPEGProcess1TransferSyntax)) { if (!JPEGSupport && IconImageMode) { DCMDATA_ERROR("JPEG compression not supported: " << filename); result = EC_CannotChangeRepresentation; } } /* JPEG 2000 compression */ if (compare(transferSyntax, UID_JPEG2000LosslessOnlyTransferSyntax) || compare(transferSyntax, UID_JPEG2000TransferSyntax)) { if (!JP2KSupport && IconImageMode) { DCMDATA_ERROR("JPEG 2000 compression not supported: " << filename); result = EC_CannotChangeRepresentation; } } } /* compare expected and actual transfer syntax */ if (result.good()) { switch (ApplicationProfile) { case AP_GeneralPurposeMIME: /* accept all transfer syntaxes */ break; case AP_GeneralPurposeDVD: case AP_USBandFlash: /* need to check multiple transfer syntaxes */ found = compare(transferSyntax, UID_LittleEndianExplicitTransferSyntax) || compare(transferSyntax, UID_JPEGProcess14SV1TransferSyntax) || compare(transferSyntax, UID_JPEGProcess1TransferSyntax) || compare(transferSyntax, UID_JPEGProcess2_4TransferSyntax) || compare(transferSyntax, UID_JPEG2000LosslessOnlyTransferSyntax) || compare(transferSyntax, UID_JPEG2000TransferSyntax); if (!found) { OFString xferName1 = dcmFindNameOfUID(UID_LittleEndianExplicitTransferSyntax, ""); OFString xferName2 = dcmFindNameOfUID(UID_JPEGProcess14SV1TransferSyntax, ""); OFString xferName3 = dcmFindNameOfUID(UID_JPEGProcess1TransferSyntax, ""); OFString xferName4 = dcmFindNameOfUID(UID_JPEGProcess2_4TransferSyntax, ""); OFString xferName5 = dcmFindNameOfUID(UID_JPEG2000LosslessOnlyTransferSyntax, ""); OFString xferName6 = dcmFindNameOfUID(UID_JPEG2000TransferSyntax, ""); /* create error message */ OFOStringStream oss; oss << xferName1 << ", " << xferName2 << ", " << xferName3 << ", " << xferName4 << ", " << xferName5 << " or " << xferName6 << " expected: " << filename << OFStringStream_ends; OFSTRINGSTREAM_GETSTR(oss, tmpString) if (TransferSyntaxCheck) { DCMDATA_ERROR(tmpString); result = EC_ApplicationProfileViolated; } else DCMDATA_WARN(tmpString); OFSTRINGSTREAM_FREESTR(tmpString) } break; case AP_XrayAngiographicDVD: if (compare(mediaSOPClassUID, UID_XRayAngiographicImageStorage)) { /* need to check multiple transfer syntaxes */ found = compare(transferSyntax, UID_JPEGProcess14SV1TransferSyntax) || compare(transferSyntax, UID_JPEGProcess1TransferSyntax) || compare(transferSyntax, UID_JPEGProcess2_4TransferSyntax); if (!found) { OFString xferName1 = dcmFindNameOfUID(UID_JPEGProcess14SV1TransferSyntax, ""); OFString xferName2 = dcmFindNameOfUID(UID_JPEGProcess1TransferSyntax, ""); OFString xferName3 = dcmFindNameOfUID(UID_JPEGProcess2_4TransferSyntax, ""); /* create error message */ OFOStringStream oss; oss << xferName1 << ", " << xferName2 << " or " << xferName3 << " expected: " << filename << OFStringStream_ends; OFSTRINGSTREAM_GETSTR(oss, tmpString) if (TransferSyntaxCheck) { DCMDATA_ERROR(tmpString); result = EC_ApplicationProfileViolated; } else DCMDATA_WARN(tmpString); OFSTRINGSTREAM_FREESTR(tmpString) } } break; case AP_CTandMR: /* need to check multiple transfer syntaxes */ found = compare(transferSyntax, UID_LittleEndianExplicitTransferSyntax) || compare(transferSyntax, UID_JPEGProcess14SV1TransferSyntax); if (!found) { OFString xferName1 = dcmFindNameOfUID(UID_LittleEndianExplicitTransferSyntax, ""); OFString xferName2 = dcmFindNameOfUID(UID_JPEGProcess14SV1TransferSyntax, ""); /* create error message */ OFOStringStream oss; oss << xferName1 << " or " << xferName2 << " expected: " << filename << OFStringStream_ends; OFSTRINGSTREAM_GETSTR(oss, tmpString) if (TransferSyntaxCheck) { DCMDATA_ERROR(tmpString); result = EC_ApplicationProfileViolated; } else DCMDATA_WARN(tmpString); OFSTRINGSTREAM_FREESTR(tmpString) } break; case AP_UltrasoundIDSF: case AP_UltrasoundSCSF: case AP_UltrasoundCCSF: case AP_UltrasoundIDMF: case AP_UltrasoundSCMF: case AP_UltrasoundCCMF: /* need to check multiple transfer syntaxes */ found = compare(transferSyntax, UID_LittleEndianExplicitTransferSyntax) || compare(transferSyntax, UID_RLELosslessTransferSyntax) || compare(transferSyntax, UID_JPEGProcess1TransferSyntax); if (!found) { OFString xferName1 = dcmFindNameOfUID(UID_LittleEndianExplicitTransferSyntax, ""); OFString xferName2 = dcmFindNameOfUID(UID_RLELosslessTransferSyntax, ""); OFString xferName3 = dcmFindNameOfUID(UID_JPEGProcess1TransferSyntax, ""); /* create error message */ OFOStringStream oss; oss << xferName1 << ", " << xferName2 << " or " << xferName3 << " expected: " << filename << OFStringStream_ends; OFSTRINGSTREAM_GETSTR(oss, tmpString) if (TransferSyntaxCheck) { DCMDATA_ERROR(tmpString); result = EC_ApplicationProfileViolated; } else DCMDATA_WARN(tmpString); OFSTRINGSTREAM_FREESTR(tmpString) } break; case AP_GeneralPurpose: case AP_MPEG2MPatMLDVD: case AP_BasicCardiac: case AP_XrayAngiographic: case AP_DentalRadiograph: case AP_TwelveLeadECG: case AP_HemodynamicWaveform: default: { /* compare with expected transfer syntax */ found = compare(transferSyntax, expectedTransferSyntax); if (!found) { OFString xferName = dcmFindNameOfUID(expectedTransferSyntax.c_str(), ""); if (xferName.empty()) xferName = expectedTransferSyntax; /* create error message */ OFOStringStream oss; oss << xferName << " expected: " << filename << OFStringStream_ends; OFSTRINGSTREAM_GETSTR(oss, tmpString) if (TransferSyntaxCheck) { DCMDATA_ERROR(tmpString); result = EC_ApplicationProfileViolated; } else DCMDATA_WARN(tmpString); OFSTRINGSTREAM_FREESTR(tmpString) } } } } } } } return result; } // check whether dataset conforms to basic cardiac application profile OFCondition DicomDirInterface::checkBasicCardiacAttributes(DcmItem *dataset, const char *filename) { OFCondition result = EC_Normal; if (!checkExistsWithStringValue(dataset, DCM_Modality, "XA", filename)) result = EC_ApplicationProfileViolated; if (!checkExistsWithMinMaxValue(dataset, DCM_Rows, 1, 512, filename, ResolutionCheck)) result = EC_ApplicationProfileViolated; if (!checkExistsWithMinMaxValue(dataset, DCM_Columns, 1, 512, filename, ResolutionCheck)) result = EC_ApplicationProfileViolated; if (!checkExistsWithIntegerValue(dataset, DCM_BitsAllocated, 8, filename, EncodingCheck)) result = EC_ApplicationProfileViolated; if (!checkExistsWithIntegerValue(dataset, DCM_BitsStored, 8, filename, EncodingCheck)) result = EC_ApplicationProfileViolated; /* overlay data, if present, shall be encoded in OverlayData (60XX,3000) */ for (unsigned int grp = 0x6000; grp < 0x601f; grp += 2) { /* check minimum number of attributes required for an overlay plane to be displayed */ if (dataset->tagExistsWithValue(DcmTagKey(grp, DCM_OverlayRows.getElement())) && dataset->tagExistsWithValue(DcmTagKey(grp, DCM_OverlayColumns.getElement())) && dataset->tagExistsWithValue(DcmTagKey(grp, DCM_OverlayBitsAllocated.getElement())) && dataset->tagExistsWithValue(DcmTagKey(grp, DCM_OverlayBitPosition.getElement())) && !dataset->tagExistsWithValue(DcmTagKey(grp, DCM_OverlayData.getElement()))) { DCMDATA_ERROR("embedded overlay data present in group 0x" << STD_NAMESPACE hex << grp << ", file: " << filename); result = EC_ApplicationProfileViolated; } } return result; } // check whether dataset conforms to xray angiographic application profile OFCondition DicomDirInterface::checkXrayAngiographicAttributes(DcmItem *dataset, const OFString &sopClass, const char *filename) { OFCondition result = EC_Normal; /* requirements depend on SOP class */ if (compare(sopClass, UID_XRayAngiographicImageStorage)) { /* a XA image */ if (!checkExistsWithStringValue(dataset, DCM_Modality, "XA", filename)) result = EC_ApplicationProfileViolated; if (!checkExistsWithMinMaxValue(dataset, DCM_Rows, 1, 1024, filename, ResolutionCheck)) result = EC_ApplicationProfileViolated; if (!checkExistsWithMinMaxValue(dataset, DCM_Columns, 1, 1024, filename, ResolutionCheck)) result = EC_ApplicationProfileViolated; if (!checkExistsWithValue(dataset, DCM_BitsStored, filename)) result = EC_InvalidTag; else { long bs; dataset->findAndGetLongInt(DCM_BitsStored, bs); if ((bs != 8) && (bs != 10) && (bs != 12)) { /* report an error or a warning */ printUnexpectedValueMessage(DCM_BitsStored, filename, EncodingCheck); if (EncodingCheck) result = EC_ApplicationProfileViolated; } } } else if (compare(sopClass, UID_SecondaryCaptureImageStorage)) { /* a SC image */ if (!checkExistsWithMinMaxValue(dataset, DCM_Rows, 1, 1024, filename, ResolutionCheck)) result = EC_ApplicationProfileViolated; if (!checkExistsWithMinMaxValue(dataset, DCM_Columns, 1, 1024, filename, ResolutionCheck)) result = EC_ApplicationProfileViolated; if (!checkExistsWithIntegerValue(dataset, DCM_SamplesPerPixel, 1, filename)) result = EC_ApplicationProfileViolated; if (!checkExistsWithStringValue(dataset, DCM_PhotometricInterpretation, "MONOCHROME2", filename)) result = EC_ApplicationProfileViolated; if (!checkExistsWithIntegerValue(dataset, DCM_BitsAllocated, 8, filename, EncodingCheck)) result = EC_ApplicationProfileViolated; if (!checkExistsWithIntegerValue(dataset, DCM_BitsStored, 8, filename, EncodingCheck)) result = EC_ApplicationProfileViolated; if (!checkExistsWithIntegerValue(dataset, DCM_HighBit, 7, filename, EncodingCheck)) result = EC_ApplicationProfileViolated; if (!checkExistsWithIntegerValue(dataset, DCM_PixelRepresentation, 0, filename)) result = EC_ApplicationProfileViolated; /* check whether any overlay is present */ for (unsigned int grp = 0x6000; grp < 0x601f; grp += 2) { /* check minimum number of attributes required for an overlay plane to be displayed */ if (dataset->tagExistsWithValue(DcmTagKey(grp, DCM_OverlayRows.getElement())) && dataset->tagExistsWithValue(DcmTagKey(grp, DCM_OverlayColumns.getElement())) && dataset->tagExistsWithValue(DcmTagKey(grp, DCM_OverlayBitsAllocated.getElement())) && dataset->tagExistsWithValue(DcmTagKey(grp, DCM_OverlayBitPosition.getElement()))) { /* create error message */ DCMDATA_ERROR("overlay group 0x" << STD_NAMESPACE hex << grp << " present in file: " << filename); result = EC_ApplicationProfileViolated; } } } else /* wrong SOP class */ result = EC_ApplicationProfileViolated; return result; } // check whether dataset conforms to dental radiograph application profile OFCondition DicomDirInterface::checkDentalRadiographAttributes(DcmItem *dataset, const char *filename) { OFCondition result = EC_Normal; /* check presence of type 2 elements */ if (!checkExists(dataset, DCM_InstitutionName, filename) || !checkExists(dataset, DCM_ManufacturerModelName, filename) || !checkExists(dataset, DCM_DetectorID, filename) || !checkExists(dataset, DCM_DetectorManufacturerName, filename) || !checkExists(dataset, DCM_DetectorManufacturerModelName, filename)) { result = EC_TagNotFound; } /* check for value constraints */ else if (!checkExistsWithValue(dataset, DCM_BitsAllocated, filename) || !checkExistsWithValue(dataset, DCM_BitsStored, filename)) { result = EC_InvalidTag; } else { long bs; dataset->findAndGetLongInt(DCM_BitsStored, bs); if ((bs != 8) && (bs != 10) && (bs != 12) && (bs != 16)) { /* report an error or a warning */ printUnexpectedValueMessage(DCM_BitsStored, filename, EncodingCheck); if (EncodingCheck) result = EC_ApplicationProfileViolated; } long ba; dataset->findAndGetLongInt(DCM_BitsAllocated, ba); if (((bs == 8) && (ba != 8)) || ((bs != 8) && (ba != 16))) { /* report an error or a warning */ printUnexpectedValueMessage(DCM_BitsAllocated, filename, EncodingCheck); if (EncodingCheck) result = EC_ApplicationProfileViolated; } } return result; } // check whether dataset conforms to ct and mr application profile OFCondition DicomDirInterface::checkCTandMRAttributes(DcmItem *dataset, const OFString &sopClass, const char *filename) { OFCondition result = EC_Normal; /* check presence of type 1 elements */ if (!checkExistsWithValue(dataset, DCM_Rows, filename) || !checkExistsWithValue(dataset, DCM_Columns, filename)) { result = EC_InvalidTag; } /* requirements depend on SOP class */ if (compare(sopClass, UID_CTImageStorage)) { /* a CT image */ if (!checkExistsWithStringValue(dataset, DCM_Modality, "CT", filename)) result = EC_ApplicationProfileViolated; if (!checkExistsWithStringValue(dataset, DCM_PhotometricInterpretation, "MONOCHROME2", filename)) result = EC_ApplicationProfileViolated; } else if (compare(sopClass, UID_MRImageStorage)) { /* a MR image */ if (!checkExistsWithStringValue(dataset, DCM_Modality, "MR", filename)) result = EC_ApplicationProfileViolated; if (!checkExistsWithStringValue(dataset, DCM_PhotometricInterpretation, "MONOCHROME2", filename)) result = EC_ApplicationProfileViolated; if (!checkExistsWithValue(dataset, DCM_BitsStored, filename) || !checkExistsWithValue(dataset, DCM_HighBit, filename)) { result = EC_InvalidTag; } else { long bs; dataset->findAndGetLongInt(DCM_BitsStored, bs); if ((bs != 8) && (bs != 12) && (bs != 16)) { /* report an error or a warning */ printUnexpectedValueMessage(DCM_BitsStored, filename, EncodingCheck); if (EncodingCheck) result = EC_ApplicationProfileViolated; } long hb; dataset->findAndGetLongInt(DCM_HighBit, hb); if (hb != bs - 1) { /* report an error or a warning */ printUnexpectedValueMessage(DCM_HighBit, filename, EncodingCheck); if (EncodingCheck) result = EC_ApplicationProfileViolated; } } } else if (compare(sopClass, UID_SecondaryCaptureImageStorage)) { /* a SC image */ if (!checkExistsWithIntegerValue(dataset, DCM_SamplesPerPixel, 1, filename)) result = EC_ApplicationProfileViolated; if (!checkExists(dataset, DCM_PhotometricInterpretation, filename)) { OFString pi; dataset->findAndGetOFStringArray(DCM_PhotometricInterpretation, pi); if (compare(pi, "MONOCHROME2")) { if (!checkExistsWithValue(dataset, DCM_BitsAllocated, filename) || !checkExistsWithValue(dataset, DCM_BitsStored, filename) || !checkExistsWithValue(dataset, DCM_HighBit, filename)) { result = EC_InvalidTag; } else { long ba; dataset->findAndGetLongInt(DCM_BitsAllocated, ba); if ((ba != 8) && (ba != 16)) { /* report an error or a warning */ printUnexpectedValueMessage(DCM_BitsAllocated, filename, EncodingCheck); if (EncodingCheck) result = EC_ApplicationProfileViolated; } long bs; dataset->findAndGetLongInt(DCM_BitsStored, bs); if (bs != ba) { /* report an error or a warning */ printUnexpectedValueMessage(DCM_BitsStored, filename, EncodingCheck); if (EncodingCheck) result = EC_ApplicationProfileViolated; } long hb; dataset->findAndGetLongInt(DCM_HighBit, hb); if (hb != bs - 1) { /* report an error or a warning */ printUnexpectedValueMessage(DCM_HighBit, filename, EncodingCheck); if (EncodingCheck) result = EC_ApplicationProfileViolated; } } } else if (compare(pi, "PALETTE COLOR")) { if (!checkExistsWithIntegerValue(dataset, DCM_BitsAllocated, 8, filename)) result = EC_ApplicationProfileViolated; if (!checkExistsWithIntegerValue(dataset, DCM_BitsStored, 8, filename)) result = EC_ApplicationProfileViolated; if (!checkExistsWithIntegerValue(dataset, DCM_HighBit, 7, filename)) result = EC_ApplicationProfileViolated; } else { /* report an error */ printUnexpectedValueMessage(DCM_PhotometricInterpretation, filename); result = EC_ApplicationProfileViolated; } } } else /* wrong SOP class */ result = EC_ApplicationProfileViolated; return result; } // check whether dataset conforms to one of the ultrasound application profiles OFCondition DicomDirInterface::checkUltrasoundAttributes(DcmItem *dataset, const OFString &transferSyntax, const char *filename) { OFCondition result = EC_Normal; /* a US image */ if (!checkExistsWithValue(dataset, DCM_PhotometricInterpretation, filename)) result = EC_InvalidTag; else { OFString pi; /* check photometric interpretation */ getStringFromDataset(dataset, DCM_PhotometricInterpretation, pi); const OFBool uncompressed = compare(transferSyntax, UID_LittleEndianExplicitTransferSyntax); const OFBool rle_lossless = compare(transferSyntax, UID_RLELosslessTransferSyntax); const OFBool jpeg_lossy = compare(transferSyntax, UID_JPEGProcess1TransferSyntax); OFBool valid = (compare(pi, "MONOCHROME2") && (uncompressed || rle_lossless)) || (compare(pi, "RGB") && (uncompressed || rle_lossless)) || (compare(pi, "PALETTE COLOR") && (uncompressed || rle_lossless)) || (compare(pi, "YBR_FULL") && rle_lossless) || (compare(pi, "YBR_FULL_422") && (uncompressed || jpeg_lossy)) || (compare(pi, "YBR_PARTIAL_422") && (uncompressed || jpeg_lossy)); if (!valid) { /* report an error */ printUnexpectedValueMessage(DCM_PhotometricInterpretation, filename); result = EC_ApplicationProfileViolated; } } if ((ApplicationProfile == AP_UltrasoundSCSF) || (ApplicationProfile == AP_UltrasoundCCSF) || (ApplicationProfile == AP_UltrasoundSCMF) || (ApplicationProfile == AP_UltrasoundCCMF)) { /* check for US region calibration module (SC and CC profiles) */ OFBool ok = OFTrue; unsigned long i = 0; /* iterate over all sequence items */ DcmItem *ditem = NULL; while (ok && dataset->findAndGetSequenceItem(DCM_SequenceOfUltrasoundRegions, ditem, i).good()) { ok &= checkExistsWithValue(ditem, DCM_RegionLocationMinX0, filename); ok &= checkExistsWithValue(ditem, DCM_RegionLocationMinY0, filename); ok &= checkExistsWithValue(ditem, DCM_RegionLocationMaxX1, filename); ok &= checkExistsWithValue(ditem, DCM_RegionLocationMaxY1, filename); ok &= checkExistsWithValue(ditem, DCM_PhysicalUnitsXDirection, filename); ok &= checkExistsWithValue(ditem, DCM_PhysicalUnitsYDirection, filename); ok &= checkExistsWithValue(ditem, DCM_PhysicalDeltaX, filename); ok &= checkExistsWithValue(ditem, DCM_PhysicalDeltaY, filename); ok &= checkExistsWithValue(ditem, DCM_RegionSpatialFormat, filename); ok &= checkExistsWithValue(ditem, DCM_RegionDataType, filename); ok &= checkExistsWithValue(ditem, DCM_RegionFlags, filename); if ((ApplicationProfile == AP_UltrasoundCCSF) || (ApplicationProfile == AP_UltrasoundCCMF)) { /* check for pixel component organization (CC profile) */ if (checkExistsWithValue(ditem, DCM_PixelComponentOrganization, filename)) { ok &= checkExistsWithValue(ditem, DCM_PixelComponentPhysicalUnits, filename); ok &= checkExistsWithValue(ditem, DCM_PixelComponentDataType, filename); long pco; dataset->findAndGetLongInt(DCM_PixelComponentOrganization, pco); if (pco == 0) { /* pixel component organization: bit aligned positions */ ok &= checkExistsWithValue(ditem, DCM_PixelComponentMask, filename); ok &= checkExistsWithValue(ditem, DCM_NumberOfTableBreakPoints, filename); ok &= checkExistsWithValue(ditem, DCM_TableOfXBreakPoints, filename); ok &= checkExistsWithValue(ditem, DCM_TableOfYBreakPoints, filename); } else if (pco == 1) { /* pixel component organization: ranges */ ok &= checkExistsWithValue(ditem, DCM_PixelComponentRangeStart, filename); ok &= checkExistsWithValue(ditem, DCM_PixelComponentRangeStop, filename); ok &= checkExistsWithValue(ditem, DCM_NumberOfTableBreakPoints, filename); ok &= checkExistsWithValue(ditem, DCM_TableOfXBreakPoints, filename); ok &= checkExistsWithValue(ditem, DCM_TableOfYBreakPoints, filename); } else if (pco == 2) { /* pixel component organization: table look up */ ok &= checkExistsWithValue(ditem, DCM_NumberOfTableEntries, filename); ok &= checkExistsWithValue(ditem, DCM_TableOfPixelValues, filename); ok &= checkExistsWithValue(ditem, DCM_TableOfParameterValues, filename); } else { /* report an error */ printUnexpectedValueMessage(DCM_PixelComponentOrganization, filename); ok = OFFalse; } } else ok = OFFalse; } i++; } if (ok) { if (i == 0) { /* no item found, sequence seems to be empty */ printRequiredAttributeMessage(DCM_SequenceOfUltrasoundRegions, filename); result = EC_ApplicationProfileViolated; } } else { /* report any error within the 'while' loop as an violoation of the application profile */ result = EC_ApplicationProfileViolated; } } return result; } // check the given file (dataset) for mandatory attributes OFCondition DicomDirInterface::checkMandatoryAttributes(DcmMetaInfo *metainfo, DcmItem *dataset, const char *filename) { OFCondition result = EC_IllegalParameter; if ((filename != NULL) && (dataset != NULL)) { /* are mandatory attributes for DICOMDIR available and valued? */ result = EC_Normal; /* get the transfer syntax and SOP class (cannot fail, after checkSOPClassAndXfer has been passed) */ OFString transferSyntax; OFString mediaSOPClassUID; metainfo->findAndGetOFStringArray(DCM_TransferSyntaxUID, transferSyntax); metainfo->findAndGetOFStringArray(DCM_MediaStorageSOPClassUID, mediaSOPClassUID); E_DirRecType recordType = sopClassToRecordType(mediaSOPClassUID); /* hanging protocol, palette and implant files are handled separately */ if (recordType == ERT_HangingProtocol) { /* check whether all type 1 elements are really present */ if (!checkExistsWithValue(dataset, DCM_HangingProtocolName, filename)) result = EC_InvalidTag; if (!checkExistsWithValue(dataset, DCM_HangingProtocolDescription, filename)) result = EC_InvalidTag; if (!checkExistsWithValue(dataset, DCM_HangingProtocolLevel, filename)) result = EC_InvalidTag; if (!checkExistsWithValue(dataset, DCM_HangingProtocolCreator, filename)) result = EC_InvalidTag; if (!checkExistsWithValue(dataset, DCM_HangingProtocolCreationDateTime, filename)) result = EC_InvalidTag; if (!checkExistsWithValue(dataset, DCM_HangingProtocolDefinitionSequence, filename)) result = EC_InvalidTag; if (!checkExistsWithValue(dataset, DCM_NumberOfPriorsReferenced, filename)) result = EC_InvalidTag; } else if (recordType == ERT_Palette) { /* check whether all type 1 elements are really present */ if (!checkExistsWithValue(dataset, DCM_ContentLabel, filename)) result = EC_InvalidTag; } else if (recordType == ERT_Implant) { /* check whether all type 1 elements are really present */ if (!checkExistsWithValue(dataset, DCM_Manufacturer, filename)) result = EC_InvalidTag; if (!checkExistsWithValue(dataset, DCM_ImplantName, filename)) result = EC_InvalidTag; if (!checkExistsWithValue(dataset, DCM_ImplantPartNumber, filename)) result = EC_InvalidTag; } else if (recordType == ERT_ImplantGroup) { /* check whether all type 1 elements are really present */ if (!checkExistsWithValue(dataset, DCM_ImplantAssemblyTemplateName, filename)) result = EC_InvalidTag; if (!checkExistsWithValue(dataset, DCM_ImplantAssemblyTemplateIssuer, filename)) result = EC_InvalidTag; if (!checkExistsWithValue(dataset, DCM_ProcedureTypeCodeSequence, filename)) result = EC_InvalidTag; } else if (recordType == ERT_ImplantAssy) { /* check whether all type 1 elements are really present */ if (!checkExistsWithValue(dataset, DCM_ImplantTemplateGroupName, filename)) result = EC_InvalidTag; if (!checkExistsWithValue(dataset, DCM_ImplantTemplateGroupIssuer, filename)) result = EC_InvalidTag; } else { /* PatientID is type 1 in DICOMDIR and type 2 in images */ if (!InventMode) { if (!checkExistsWithValue(dataset, DCM_PatientID, filename)) result = EC_InvalidTag; } /* PatientName is type 2 in DICOMDIR and images */ if (!checkExists(dataset, DCM_PatientName, filename)) result = EC_TagNotFound; /* StudyDate is type 1 in DICOMDIR and type 2 in images */ if (!InventMode) { if (!checkExistsWithValue(dataset, DCM_StudyDate, filename)) result = EC_InvalidTag; } /* StudyTime is type 1 in DICOMDIR and type 2 in images */ if (!InventMode) { if (!checkExistsWithValue(dataset, DCM_StudyTime, filename)) result = EC_InvalidTag; } /* StudyDescription is type 2 in DICOMDIR and type 3 in images. We can create an empty attribute in the directory */ /* StudyInstanceUID is type 1 in DICOMDIR and images */ if (!checkExistsWithValue(dataset, DCM_StudyInstanceUID, filename)) result = EC_InvalidTag; /* StudyID is type 1 in DICOMDIR and type 2 in images */ if (!InventMode) { if (!checkExistsWithValue(dataset, DCM_StudyID, filename)) result = EC_InvalidTag; } /* AccessionNumber is type 2 in DICOMDIR and type 3 in images We can create an empty attribute in the directory */ /* Modality is type 1 in DICOMDIR and type 1 in images */ if (!checkExistsWithValue(dataset, DCM_Modality, filename)) result = EC_InvalidTag; /* SeriesInstanceUID is type 1 in DICOMDIR and type 1 in images */ if (!checkExistsWithValue(dataset, DCM_SeriesInstanceUID, filename)) result = EC_InvalidTag; /* SeriesNumber is type 1 in DICOMDIR and type 2 in images */ if (!InventMode) { if (!checkExistsWithValue(dataset, DCM_SeriesNumber, filename)) result = EC_InvalidTag; } /* image and other numbers are type 1 in DICOMDIR but type 2 in images */ /* (basically, check whether all type 1 elements are really present) */ switch (recordType) { case ERT_Overlay: if (!InventMode) { if (!checkExistsWithValue(dataset, DCM_RETIRED_OverlayNumber, filename)) result = EC_InvalidTag; } break; case ERT_ModalityLut: if (!InventMode) { if (!checkExistsWithValue(dataset, DCM_RETIRED_LUTNumber, filename)) result = EC_InvalidTag; } break; case ERT_VoiLut: if (!InventMode) { if (!checkExistsWithValue(dataset, DCM_RETIRED_LUTNumber, filename)) result = EC_InvalidTag; } break; case ERT_Curve: if (!InventMode) { if (!checkExistsWithValue(dataset, DCM_RETIRED_CurveNumber, filename)) result = EC_InvalidTag; } break; case ERT_SRDocument: if (!checkExistsWithValue(dataset, DCM_InstanceNumber, filename)) result = EC_InvalidTag; if (!checkExistsWithValue(dataset, DCM_CompletionFlag, filename)) result = EC_InvalidTag; if (!checkExistsWithValue(dataset, DCM_VerificationFlag, filename)) result = EC_InvalidTag; if (!checkExistsWithValue(dataset, DCM_ContentDate, filename)) result = EC_InvalidTag; if (!checkExistsWithValue(dataset, DCM_ContentTime, filename)) result = EC_InvalidTag; if (!checkExistsWithValue(dataset, DCM_ConceptNameCodeSequence, filename)) result = EC_InvalidTag; { OFString tmpString; if (compare(getStringFromDataset(dataset, DCM_VerificationFlag, tmpString), "VERIFIED")) { /* VerificationDateTime is required if verification flag is VERIFIED, retrieve most recent (= last) entry from VerifyingObserverSequence */ DcmItem *ditem = NULL; OFCondition l_status = dataset->findAndGetSequenceItem(DCM_VerifyingObserverSequence, ditem, -1 /*last*/); if (l_status.good()) { if (!checkExistsWithValue(ditem, DCM_VerificationDateTime, filename)) result = EC_InvalidTag; } else result = l_status; } } break; case ERT_Presentation: if (!checkExistsWithValue(dataset, DCM_InstanceNumber, filename)) result = EC_InvalidTag; if (!checkExistsWithValue(dataset, DCM_ContentLabel, filename)) result = EC_InvalidTag; if (!checkExistsWithValue(dataset, DCM_PresentationCreationDate, filename)) result = EC_InvalidTag; if (!checkExistsWithValue(dataset, DCM_PresentationCreationTime, filename)) result = EC_InvalidTag; break; case ERT_Waveform: if (!checkExistsWithValue(dataset, DCM_InstanceNumber, filename)) result = EC_InvalidTag; if (!checkExistsWithValue(dataset, DCM_ContentDate, filename)) result = EC_InvalidTag; if (!checkExistsWithValue(dataset, DCM_ContentTime, filename)) result = EC_InvalidTag; break; case ERT_RTDose: if (!InventMode) { if (!checkExistsWithValue(dataset, DCM_InstanceNumber, filename)) result = EC_InvalidTag; } if (!checkExistsWithValue(dataset, DCM_DoseSummationType, filename)) result = EC_InvalidTag; break; case ERT_RTStructureSet: if (!InventMode) { if (!checkExistsWithValue(dataset, DCM_InstanceNumber, filename)) result = EC_InvalidTag; } if (!checkExistsWithValue(dataset, DCM_StructureSetLabel, filename)) result = EC_InvalidTag; break; case ERT_RTPlan: if (!InventMode) { if (!checkExistsWithValue(dataset, DCM_InstanceNumber, filename)) result = EC_InvalidTag; } if (!checkExistsWithValue(dataset, DCM_RTPlanLabel, filename)) result = EC_InvalidTag; break; case ERT_RTTreatRecord: if (!checkExistsWithValue(dataset, DCM_InstanceNumber, filename)) result = EC_InvalidTag; break; case ERT_StoredPrint: /* (nothing to do) */ break; case ERT_KeyObjectDoc: if (!checkExistsWithValue(dataset, DCM_InstanceNumber, filename)) result = EC_InvalidTag; if (!checkExistsWithValue(dataset, DCM_ContentDate, filename)) result = EC_InvalidTag; if (!checkExistsWithValue(dataset, DCM_ContentTime, filename)) result = EC_InvalidTag; if (!checkExistsWithValue(dataset, DCM_ConceptNameCodeSequence, filename)) result = EC_InvalidTag; break; case ERT_RawData: if (!checkExistsWithValue(dataset, DCM_ContentDate, filename)) result = EC_InvalidTag; if (!checkExistsWithValue(dataset, DCM_ContentTime, filename)) result = EC_InvalidTag; /* InstanceNumber is type 2 in IOD and directory record! */ break; case ERT_Spectroscopy: if (!checkExistsWithValue(dataset, DCM_InstanceNumber, filename)) result = EC_InvalidTag; if (!checkExistsWithValue(dataset, DCM_ImageType, filename)) result = EC_InvalidTag; if (!checkExistsWithValue(dataset, DCM_ContentDate, filename)) result = EC_InvalidTag; if (!checkExistsWithValue(dataset, DCM_ContentTime, filename)) result = EC_InvalidTag; if (!checkExistsWithValue(dataset, DCM_NumberOfFrames, filename)) result = EC_InvalidTag; if (!checkExistsWithValue(dataset, DCM_Rows, filename)) result = EC_InvalidTag; if (!checkExistsWithValue(dataset, DCM_Columns, filename)) result = EC_InvalidTag; if (!checkExistsWithValue(dataset, DCM_DataPointRows, filename)) result = EC_InvalidTag; if (!checkExistsWithValue(dataset, DCM_DataPointColumns, filename)) result = EC_InvalidTag; break; case ERT_EncapDoc: if (!checkExistsWithValue(dataset, DCM_InstanceNumber, filename)) result = EC_InvalidTag; if (!checkExistsWithValue(dataset, DCM_MIMETypeOfEncapsulatedDocument, filename)) result = EC_InvalidTag; break; case ERT_Stereometric: /* nothing to check */ break; case ERT_Registration: case ERT_Fiducial: case ERT_ValueMap: case ERT_Surface: case ERT_Measurement: if (!checkExistsWithValue(dataset, DCM_InstanceNumber, filename)) result = EC_InvalidTag; if (!checkExistsWithValue(dataset, DCM_ContentDate, filename)) result = EC_InvalidTag; if (!checkExistsWithValue(dataset, DCM_ContentTime, filename)) result = EC_InvalidTag; if (!checkExistsWithValue(dataset, DCM_ContentLabel, filename)) result = EC_InvalidTag; break; case ERT_Image: default: { OFCondition l_status = EC_Normal; /* it can only be an image */ if (!InventMode) { if (!checkExistsWithValue(dataset, DCM_InstanceNumber, filename)) result = EC_InvalidTag; } /* check profile specific requirements */ if ((ApplicationProfile == AP_GeneralPurposeDVD) || (ApplicationProfile == AP_USBandFlash) || (ApplicationProfile == AP_MPEG2MPatMLDVD)) { /* check presence of type 1 elements */ if (!checkExistsWithValue(dataset, DCM_Rows, filename) || !checkExistsWithValue(dataset, DCM_Columns, filename)) { result = EC_InvalidTag; } } else if (ApplicationProfile == AP_BasicCardiac) l_status = checkBasicCardiacAttributes(dataset, filename); else if ((ApplicationProfile == AP_XrayAngiographic) || (ApplicationProfile == AP_XrayAngiographicDVD)) l_status = checkXrayAngiographicAttributes(dataset, mediaSOPClassUID, filename); else if (ApplicationProfile == AP_DentalRadiograph) l_status = checkDentalRadiographAttributes(dataset, filename); else if (ApplicationProfile == AP_CTandMR) l_status = checkCTandMRAttributes(dataset, mediaSOPClassUID, filename); else if ((ApplicationProfile == AP_UltrasoundIDSF) || (ApplicationProfile == AP_UltrasoundSCSF) || (ApplicationProfile == AP_UltrasoundCCSF) || (ApplicationProfile == AP_UltrasoundIDMF) || (ApplicationProfile == AP_UltrasoundSCMF) || (ApplicationProfile == AP_UltrasoundCCMF)) { l_status = checkUltrasoundAttributes(dataset, transferSyntax, filename); } /* set final result status (if everything else was ok) */ if (result.good()) result = l_status; } } } } return result; } // select specified application profile and adapt certain settings OFCondition DicomDirInterface::selectApplicationProfile(const E_ApplicationProfile profile) { OFCondition result = EC_Normal; /* special handling for particular profiles */ if ((ApplicationProfile == AP_BasicCardiac) || (ApplicationProfile == AP_XrayAngiographic) || (ApplicationProfile == AP_XrayAngiographicDVD)) { /* check for JPEG image support */ if (!JPEGSupport) result = EC_IllegalCall; } /* store new profile */ if (result.good()) ApplicationProfile = profile; return result; } // check whether DICOM file is suitable for a DICOMDIR of the specified application profile OFCondition DicomDirInterface::checkDicomFile(const char *filename, const char *directory) { /* define fileformat object for the DICOM file to be loaded */ DcmFileFormat fileformat; /* call the "real" function */ return loadAndCheckDicomFile(filename, directory, fileformat); } // load DICOM file and check whether it is suitable for a DICOMDIR of the specified application profile OFCondition DicomDirInterface::loadAndCheckDicomFile(const char *filename, const char *directory, DcmFileFormat &fileformat) { OFCondition result = EC_IllegalParameter; /* create fully qualified pathname of the DICOM file to be added */ OFString pathname; OFStandard::combineDirAndFilename(pathname, OFSTRING_GUARD(directory), OFSTRING_GUARD(filename), OFTrue /*allowEmptyDirName*/); DCMDATA_INFO("checking file: " << pathname); /* check filename */ if (isFilenameValid(filename)) { /* load DICOM file */ result = fileformat.loadFile(pathname.c_str()); if (result.good()) { /* check for correct part 10 file format */ DcmMetaInfo *metainfo = fileformat.getMetaInfo(); if ((metainfo == NULL) || (metainfo->card() == 0)) { DCMDATA_ERROR("file not in part 10 format (no metainfo-header): " << filename); result = EC_InvalidStream; } DcmDataset *dataset = fileformat.getDataset(); if (dataset == NULL) { DCMDATA_ERROR("file contains no data (no dataset): " << filename); result = EC_CorruptedData; } /* only proceed if previous checks have been passed */ if (result.good()) { /* check for SOP class and transfer syntax */ result = checkSOPClassAndXfer(metainfo, dataset, filename); if (result.good()) { /* check for mandatory attributes */ if (checkMandatoryAttributes(metainfo, dataset, filename).bad()) result = EC_ApplicationProfileViolated; } } } else { /* report an error */ DCMDATA_ERROR(result.text() << ": reading file: " << filename); } } return result; } // check whether given record matches dataset OFBool DicomDirInterface::recordMatchesDataset(DcmDirectoryRecord *record, DcmItem *dataset) { OFBool result = OFFalse; if ((record != NULL) && (dataset != NULL)) { OFString recordString, datasetString; /* check matching depending on record type */ switch (record->getRecordType()) { case ERT_Patient: if (checkExistsWithValue(dataset, DCM_PatientID)) { OFString patientID; /* PatientID is the primary key */ result = compare(getStringFromDataset(record, DCM_PatientID, patientID), getStringFromDataset(dataset, DCM_PatientID, datasetString)); /* optional: check whether PatientName also matches */ if (result && !compare(getStringFromDataset(record, DCM_PatientName, recordString), getStringFromDataset(dataset, DCM_PatientName, datasetString))) { if (InventPatientIDMode) { DCMDATA_WARN("PatientName inconsistent for PatientID: " << patientID); /* remove current patient ID, will be replaced later */ dataset->putAndInsertString(DCM_PatientID, ""); result = OFFalse; } } } else { /* if there is no value for PatientID in the dataset try using the PatientName */ result = compare(getStringFromDataset(record, DCM_PatientName, recordString), getStringFromDataset(dataset, DCM_PatientName, datasetString)); } break; case ERT_Study: if (checkExistsWithValue(record, DCM_StudyInstanceUID)) { result = compare(getStringFromDataset(record, DCM_StudyInstanceUID, recordString), getStringFromDataset(dataset, DCM_StudyInstanceUID, datasetString)); } else { /* the Study Instance UID can be in the referenced file instead */ OFString refFilename; if (!getStringFromDataset(record, DCM_ReferencedFileID, refFilename).empty()) { OFString hostFilename; if (locateDicomFile(refFilename, hostFilename)) { result = compare(getStringFromFile(hostFilename.c_str(), DCM_StudyInstanceUID, recordString), getStringFromDataset(dataset, DCM_StudyInstanceUID, datasetString)); } else DCMDATA_ERROR("cannot locate referenced file: " << refFilename); } } break; case ERT_Series: result = compare(getStringFromDataset(record, DCM_SeriesInstanceUID, recordString), getStringFromDataset(dataset, DCM_SeriesInstanceUID, datasetString)); break; case ERT_Image: case ERT_Overlay: case ERT_Curve: case ERT_ModalityLut: case ERT_VoiLut: case ERT_SRDocument: case ERT_Presentation: case ERT_Waveform: case ERT_RTDose: case ERT_RTStructureSet: case ERT_RTPlan: case ERT_RTTreatRecord: case ERT_StoredPrint: case ERT_KeyObjectDoc: case ERT_Registration: case ERT_Fiducial: case ERT_RawData: case ERT_Spectroscopy: case ERT_EncapDoc: case ERT_ValueMap: case ERT_HangingProtocol: case ERT_Stereometric: case ERT_Palette: case ERT_Surface: case ERT_Measurement: case ERT_Implant: case ERT_ImplantGroup: case ERT_ImplantAssy: /* The attribute ReferencedSOPInstanceUID is automatically * put into a Directory Record when a filename is present. */ result = compare(getStringFromDataset(record, DCM_ReferencedSOPInstanceUIDInFile, recordString), getStringFromDataset(dataset, DCM_SOPInstanceUID, datasetString)); break; default: DCMDATA_ERROR("record type not yet implemented"); break; } } return result; } // search for a given record DcmDirectoryRecord *DicomDirInterface::findExistingRecord(DcmDirectoryRecord *parent, const E_DirRecType recordType, DcmItem* dataset) { OFBool found = OFFalse; DcmDirectoryRecord *record = NULL; if (parent != NULL) { /* iterate over all records */ while (!found && ((record = parent->nextSub(record)) != NULL)) { if (record->getRecordType() == recordType) found = recordMatchesDataset(record, dataset); } } return (found) ? record : NULL; } // create or update patient record and copy required values from dataset DcmDirectoryRecord *DicomDirInterface::buildPatientRecord(DcmDirectoryRecord *record, DcmItem *dataset, const OFString &sourceFilename) { /* create new patient record */ if (record == NULL) record = new DcmDirectoryRecord(ERT_Patient, NULL, sourceFilename.c_str()); if (record != NULL) { /* check whether new record is ok */ if (record->error().good()) { /* use type 1C instead of 1 in order to avoid unwanted overwriting */ copyElementType1C(dataset, DCM_PatientID, record, sourceFilename); copyElementType2(dataset, DCM_PatientName, record, sourceFilename); if ((ApplicationProfile == AP_GeneralPurposeDVD) || (ApplicationProfile == AP_USBandFlash) || (ApplicationProfile == AP_MPEG2MPatMLDVD)) { /* additional type 1C keys specified by specific profiles */ copyElementType1C(dataset, DCM_PatientBirthDate, record, sourceFilename); copyElementType1C(dataset, DCM_PatientSex, record, sourceFilename); } else if ((ApplicationProfile == AP_BasicCardiac) || (ApplicationProfile == AP_XrayAngiographic) || (ApplicationProfile == AP_XrayAngiographicDVD)) { /* additional type 2 keys specified by specific profiles */ copyElementType2(dataset, DCM_PatientBirthDate, record, sourceFilename); copyElementType2(dataset, DCM_PatientSex, record, sourceFilename); } } else { printRecordErrorMessage(record->error(), ERT_Patient, "create"); /* free memory */ delete record; record = NULL; } } else DCMDATA_ERROR("out of memory (creating patient record)"); return record; } // create or update study record and copy required values from dataset DcmDirectoryRecord *DicomDirInterface::buildStudyRecord(DcmDirectoryRecord *record, DcmItem *dataset, const OFString &sourceFilename) { /* create new study record */ if (record == NULL) record = new DcmDirectoryRecord(ERT_Study, NULL, sourceFilename.c_str()); if (record != NULL) { /* check whether new record is ok */ if (record->error().good()) { OFString tmpString; /* copy attribute values from dataset to study record */ copyStringWithDefault(dataset, DCM_StudyDate, record, sourceFilename, alternativeStudyDate(dataset, tmpString).c_str(), OFTrue /*printWarning*/); copyStringWithDefault(dataset, DCM_StudyTime, record, sourceFilename, alternativeStudyTime(dataset, tmpString).c_str(), OFTrue /*printWarning*/); copyElementType2(dataset, DCM_StudyDescription, record, sourceFilename); copyElementType1(dataset, DCM_StudyInstanceUID, record, sourceFilename); /* use type 1C instead of 1 in order to avoid unwanted overwriting */ copyElementType1C(dataset, DCM_StudyID, record, sourceFilename); copyElementType2(dataset, DCM_AccessionNumber, record, sourceFilename); } else { printRecordErrorMessage(record->error(), ERT_Study, "create"); /* free memory */ delete record; record = NULL; } } else DCMDATA_ERROR("out of memory (creating study record)"); return record; } // create or update series record and copy required values from dataset DcmDirectoryRecord *DicomDirInterface::buildSeriesRecord(DcmDirectoryRecord *record, DcmItem *dataset, const OFString &sourceFilename) { /* create new series record */ if (record == NULL) record = new DcmDirectoryRecord(ERT_Series, NULL, sourceFilename.c_str()); if (record != NULL) { /* check whether new record is ok */ if (record->error().good()) { /* copy attribute values from dataset to series record */ copyElementType1(dataset, DCM_Modality, record, sourceFilename); copyElementType1(dataset, DCM_SeriesInstanceUID, record, sourceFilename); /* use type 1C instead of 1 in order to avoid unwanted overwriting */ copyElementType1C(dataset, DCM_SeriesNumber, record, sourceFilename); if ((ApplicationProfile == AP_GeneralPurposeDVD) || (ApplicationProfile == AP_USBandFlash) || (ApplicationProfile == AP_MPEG2MPatMLDVD)) { /* additional type 1C keys specified by specific profiles */ copyElementType1C(dataset, DCM_InstitutionName, record, sourceFilename); copyElementType1C(dataset, DCM_InstitutionAddress, record, sourceFilename); copyElementType1C(dataset, DCM_PerformingPhysicianName, record, sourceFilename); } else if ((ApplicationProfile == AP_BasicCardiac) || (ApplicationProfile == AP_XrayAngiographic) || (ApplicationProfile == AP_XrayAngiographicDVD)) { /* additional type 2 keys specified by specific profiles (type 1C or 3 in file) */ copyStringWithDefault(dataset, DCM_InstitutionName, record, sourceFilename); copyStringWithDefault(dataset, DCM_InstitutionAddress, record, sourceFilename); copyStringWithDefault(dataset, DCM_PerformingPhysicianName, record, sourceFilename); } } else { printRecordErrorMessage(record->error(), ERT_Series, "create"); /* free memory */ delete record; record = NULL; } } else DCMDATA_ERROR("out of memory (creating series record)"); return record; } // create or update overlay record and copy required values from dataset DcmDirectoryRecord *DicomDirInterface::buildOverlayRecord(DcmDirectoryRecord *record, DcmItem *dataset, const OFString &referencedFileID, const OFString &sourceFilename) { /* create new overlay record */ if (record == NULL) record = new DcmDirectoryRecord(ERT_Overlay, referencedFileID.c_str(), sourceFilename.c_str()); if (record != NULL) { /* check whether new record is ok */ if (record->error().good()) { /* copy attribute values from dataset to overlay record */ copyElementType1(dataset, DCM_RETIRED_OverlayNumber, record, sourceFilename); } else { printRecordErrorMessage(record->error(), ERT_Overlay, "create"); /* free memory */ delete record; record = NULL; } } else printRecordErrorMessage(EC_MemoryExhausted, ERT_Overlay, "create"); return record; } // create or update modality lut record and copy required values from dataset DcmDirectoryRecord *DicomDirInterface::buildModalityLutRecord(DcmDirectoryRecord *record, DcmItem *dataset, const OFString &referencedFileID, const OFString &sourceFilename) { /* create new modality lut record */ if (record == NULL) record = new DcmDirectoryRecord(ERT_ModalityLut, referencedFileID.c_str(), sourceFilename.c_str()); if (record != NULL) { /* check whether new record is ok */ if (record->error().good()) { /* copy attribute values from dataset to modality lut record */ copyElementType1(dataset, DCM_RETIRED_LUTNumber, record, sourceFilename); } else { printRecordErrorMessage(record->error(), ERT_ModalityLut, "create"); /* free memory */ delete record; record = NULL; } } else printRecordErrorMessage(EC_MemoryExhausted, ERT_ModalityLut, "create"); return record; } // create or update voi lut record and copy required values from dataset DcmDirectoryRecord *DicomDirInterface::buildVoiLutRecord(DcmDirectoryRecord *record, DcmItem *dataset, const OFString &referencedFileID, const OFString &sourceFilename) { /* create new voi lut record */ if (record == NULL) record = new DcmDirectoryRecord(ERT_VoiLut, referencedFileID.c_str(), sourceFilename.c_str()); if (record != NULL) { /* check whether new record is ok */ if (record->error().good()) { /* copy attribute values from dataset to voi lut record */ copyElementType1(dataset, DCM_RETIRED_LUTNumber, record, sourceFilename); } else { printRecordErrorMessage(record->error(), ERT_VoiLut, "create"); /* free memory */ delete record; record = NULL; } } else printRecordErrorMessage(EC_MemoryExhausted, ERT_VoiLut, "create"); return record; } // create or update curve record and copy required values from dataset DcmDirectoryRecord *DicomDirInterface::buildCurveRecord(DcmDirectoryRecord *record, DcmItem *dataset, const OFString &referencedFileID, const OFString &sourceFilename) { /* create new curve record */ if (record == NULL) record = new DcmDirectoryRecord(ERT_Curve, referencedFileID.c_str(), sourceFilename.c_str()); if (record != NULL) { /* check whether new record is ok */ if (record->error().good()) { /* copy attribute values from dataset to curve record */ copyElementType1(dataset, DCM_RETIRED_CurveNumber, record, sourceFilename); } else { printRecordErrorMessage(record->error(), ERT_Curve, "create"); /* free memory */ delete record; record = NULL; } } else printRecordErrorMessage(EC_MemoryExhausted, ERT_Curve, "create"); return record; } // create or update structure reporting record and copy required values from dataset DcmDirectoryRecord *DicomDirInterface::buildStructReportRecord(DcmDirectoryRecord *record, DcmItem *dataset, const OFString &referencedFileID, const OFString &sourceFilename) { /* create new struct report record */ if (record == NULL) record = new DcmDirectoryRecord(ERT_SRDocument, referencedFileID.c_str(), sourceFilename.c_str()); if (record != NULL) { /* check whether new record is ok */ if (record->error().good()) { OFString tmpString; /* copy attribute values from dataset to struct report record */ copyElementType1(dataset, DCM_InstanceNumber, record, sourceFilename); copyElementType1(dataset, DCM_CompletionFlag, record, sourceFilename); copyElementType1(dataset, DCM_VerificationFlag, record, sourceFilename); copyElementType1(dataset, DCM_ContentDate, record, sourceFilename); copyElementType1(dataset, DCM_ContentTime, record, sourceFilename); if (compare(getStringFromDataset(dataset, DCM_VerificationFlag, tmpString), "VERIFIED")) { /* VerificationDateTime is required if verification flag is VERIFIED, retrieve most recent (= last) entry from VerifyingObserverSequence */ DcmItem *ditem = NULL; OFCondition status = dataset->findAndGetSequenceItem(DCM_VerifyingObserverSequence, ditem, -1 /*last*/); if (status.good()) copyElementType1(ditem, DCM_VerificationDateTime, record, sourceFilename); else printAttributeErrorMessage(DCM_VerifyingObserverSequence, status, "retrieve"); } copyElementType1(dataset, DCM_ConceptNameCodeSequence, record, sourceFilename); addConceptModContentItems(record, dataset); } else { printRecordErrorMessage(record->error(), ERT_SRDocument, "create"); /* free memory */ delete record; record = NULL; } } else printRecordErrorMessage(EC_MemoryExhausted, ERT_SRDocument, "create"); return record; } // create or update presentation state record and copy required values from dataset DcmDirectoryRecord *DicomDirInterface::buildPresentationRecord(DcmDirectoryRecord *record, DcmItem *dataset, const OFString &referencedFileID, const OFString &sourceFilename) { /* create new presentation record */ if (record == NULL) record = new DcmDirectoryRecord(ERT_Presentation, referencedFileID.c_str(), sourceFilename.c_str()); if (record != NULL) { /* check whether new record is ok */ if (record->error().good()) { /* copy attribute values from dataset to presentation record */ copyElementType1(dataset, DCM_InstanceNumber, record, sourceFilename); copyElementType1(dataset, DCM_ContentLabel, record, sourceFilename); copyElementType2(dataset, DCM_ContentDescription, record, sourceFilename); copyElementType1(dataset, DCM_PresentationCreationDate, record, sourceFilename); copyElementType1(dataset, DCM_PresentationCreationTime, record, sourceFilename); copyElementType2(dataset, DCM_ContentCreatorName, record, sourceFilename); copyElementType1C(dataset, DCM_ReferencedSeriesSequence, record, sourceFilename); addBlendingSequence(record, dataset); } else { printRecordErrorMessage(record->error(), ERT_Presentation, "create"); /* free memory */ delete record; record = NULL; } } else printRecordErrorMessage(EC_MemoryExhausted, ERT_Presentation, "create"); return record; } // create or update waveform record and copy required values from dataset DcmDirectoryRecord *DicomDirInterface::buildWaveformRecord(DcmDirectoryRecord *record, DcmItem *dataset, const OFString &referencedFileID, const OFString &sourceFilename) { /* create new waveform record */ if (record == NULL) record = new DcmDirectoryRecord(ERT_Waveform, referencedFileID.c_str(), sourceFilename.c_str()); if (record != NULL) { /* check whether new record is ok */ if (record->error().good()) { /* copy attribute values from dataset to waveform record */ copyElementType1(dataset, DCM_InstanceNumber, record, sourceFilename); copyElementType1(dataset, DCM_ContentDate, record, sourceFilename); copyElementType1(dataset, DCM_ContentTime, record, sourceFilename); } else { printRecordErrorMessage(record->error(), ERT_Waveform, "create"); /* free memory */ delete record; record = NULL; } } else printRecordErrorMessage(EC_MemoryExhausted, ERT_Waveform, "create"); return record; } // create or update rt dose record and copy required values from dataset DcmDirectoryRecord *DicomDirInterface::buildRTDoseRecord(DcmDirectoryRecord *record, DcmItem *dataset, const OFString &referencedFileID, const OFString &sourceFilename) { /* create new rt dose record */ if (record == NULL) record = new DcmDirectoryRecord(ERT_RTDose, referencedFileID.c_str(), sourceFilename.c_str()); if (record != NULL) { /* check whether new record is ok */ if (record->error().good()) { /* copy attribute values from dataset to rt dose record */ copyElementType1(dataset, DCM_InstanceNumber, record, sourceFilename); copyElementType1(dataset, DCM_DoseSummationType, record, sourceFilename); copyElementType3(dataset, DCM_DoseComment, record, sourceFilename); /* copy existing icon image (if present) */ copyElementType3(dataset, DCM_IconImageSequence, record, sourceFilename); } else { printRecordErrorMessage(record->error(), ERT_RTDose, "create"); /* free memory */ delete record; record = NULL; } } else printRecordErrorMessage(EC_MemoryExhausted, ERT_RTDose, "create"); return record; } // create or update rt structure set record and copy required values from dataset DcmDirectoryRecord *DicomDirInterface::buildRTStructureSetRecord(DcmDirectoryRecord *record, DcmItem *dataset, const OFString &referencedFileID, const OFString &sourceFilename) { /* create new rt structure set record */ if (record == NULL) record = new DcmDirectoryRecord(ERT_RTStructureSet, referencedFileID.c_str(), sourceFilename.c_str()); if (record != NULL) { /* check whether new record is ok */ if (record->error().good()) { /* copy attribute values from dataset to rt structure set record */ copyElementType1(dataset, DCM_InstanceNumber, record, sourceFilename); copyElementType1(dataset, DCM_StructureSetLabel, record, sourceFilename); copyElementType2(dataset, DCM_StructureSetDate, record, sourceFilename); copyElementType2(dataset, DCM_StructureSetTime, record, sourceFilename); } else { printRecordErrorMessage(record->error(), ERT_RTStructureSet, "create"); /* free memory */ delete record; record = NULL; } } else printRecordErrorMessage(EC_MemoryExhausted, ERT_RTStructureSet, "create"); return record; } // create or update rt plan record and copy required values from dataset DcmDirectoryRecord *DicomDirInterface::buildRTPlanRecord(DcmDirectoryRecord *record, DcmItem *dataset, const OFString &referencedFileID, const OFString &sourceFilename) { /* create new rt plan record */ if (record == NULL) record = new DcmDirectoryRecord(ERT_RTPlan, referencedFileID.c_str(), sourceFilename.c_str()); if (record != NULL) { /* check whether new record is ok */ if (record->error().good()) { /* copy attribute values from dataset to rt plan record */ copyElementType1(dataset, DCM_InstanceNumber, record, sourceFilename); copyElementType1(dataset, DCM_RTPlanLabel, record, sourceFilename); copyElementType2(dataset, DCM_RTPlanDate, record, sourceFilename); copyElementType2(dataset, DCM_RTPlanTime, record, sourceFilename); } else { printRecordErrorMessage(record->error(), ERT_RTPlan, "create"); /* free memory */ delete record; record = NULL; } } else printRecordErrorMessage(EC_MemoryExhausted, ERT_RTPlan, "create"); return record; } // create or update rt treatment record and copy required values from dataset DcmDirectoryRecord *DicomDirInterface::buildRTTreatmentRecord(DcmDirectoryRecord *record, DcmItem *dataset, const OFString &referencedFileID, const OFString &sourceFilename) { /* create new rt treatment record */ if (record == NULL) record = new DcmDirectoryRecord(ERT_RTTreatRecord, referencedFileID.c_str(), sourceFilename.c_str()); if (record != NULL) { /* check whether new record is ok */ if (record->error().good()) { /* copy attribute values from dataset to rt treatment record */ copyElementType1(dataset, DCM_InstanceNumber, record, sourceFilename); copyElementType2(dataset, DCM_TreatmentDate, record, sourceFilename); copyElementType2(dataset, DCM_TreatmentTime, record, sourceFilename); } else { printRecordErrorMessage(record->error(), ERT_RTTreatRecord, "create"); /* free memory */ delete record; record = NULL; } } else printRecordErrorMessage(EC_MemoryExhausted, ERT_RTTreatRecord, "create"); return record; } // create or update stored print record and copy required values from dataset DcmDirectoryRecord *DicomDirInterface::buildStoredPrintRecord(DcmDirectoryRecord *record, DcmItem *dataset, const OFString &referencedFileID, const OFString &sourceFilename) { /* create new stored print record */ if (record == NULL) record = new DcmDirectoryRecord(ERT_StoredPrint, referencedFileID.c_str(), sourceFilename.c_str()); if (record != NULL) { /* check whether new record is ok */ if (record->error().good()) { /* copy attribute values from dataset to stored print record */ copyElementType2(dataset, DCM_InstanceNumber, record, sourceFilename); /* IconImageSequence (type 3) is not created for the referenced images */ } else { printRecordErrorMessage(record->error(), ERT_StoredPrint, "create"); /* free memory */ delete record; record = NULL; } } else printRecordErrorMessage(EC_MemoryExhausted, ERT_StoredPrint, "create"); return record; } // create or update key object doc record and copy required values from dataset DcmDirectoryRecord *DicomDirInterface::buildKeyObjectDocRecord(DcmDirectoryRecord *record, DcmItem *dataset, const OFString &referencedFileID, const OFString &sourceFilename) { /* create new key object doc record */ if (record == NULL) record = new DcmDirectoryRecord(ERT_KeyObjectDoc, referencedFileID.c_str(), sourceFilename.c_str()); if (record != NULL) { /* check whether new record is ok */ if (record->error().good()) { /* copy attribute values from dataset to key object doc record */ copyElementType1(dataset, DCM_InstanceNumber, record, sourceFilename); copyElementType1(dataset, DCM_ContentDate, record, sourceFilename); copyElementType1(dataset, DCM_ContentTime, record, sourceFilename); copyElementType1(dataset, DCM_ConceptNameCodeSequence, record, sourceFilename); addConceptModContentItems(record, dataset); } else { printRecordErrorMessage(record->error(), ERT_KeyObjectDoc, "create"); /* free memory */ delete record; record = NULL; } } else printRecordErrorMessage(EC_MemoryExhausted, ERT_KeyObjectDoc, "create"); return record; } // create or update registration record and copy required values from dataset DcmDirectoryRecord *DicomDirInterface::buildRegistrationRecord(DcmDirectoryRecord *record, DcmItem *dataset, const OFString &referencedFileID, const OFString &sourceFilename) { /* create new registration record */ if (record == NULL) record = new DcmDirectoryRecord(ERT_Registration, referencedFileID.c_str(), sourceFilename.c_str()); if (record != NULL) { /* check whether new record is ok */ if (record->error().good()) { /* copy attribute values from dataset to registration record */ copyElementType1(dataset, DCM_ContentDate, record, sourceFilename); copyElementType1(dataset, DCM_ContentTime, record, sourceFilename); copyElementType1(dataset, DCM_InstanceNumber, record, sourceFilename); copyElementType1(dataset, DCM_ContentLabel, record, sourceFilename); copyElementType2(dataset, DCM_ContentDescription, record, sourceFilename); copyElementType2(dataset, DCM_ContentCreatorName, record, sourceFilename); } else { printRecordErrorMessage(record->error(), ERT_Registration, "create"); /* free memory */ delete record; record = NULL; } } else printRecordErrorMessage(EC_MemoryExhausted, ERT_Registration, "create"); return record; } // create or update fiducial record and copy required values from dataset DcmDirectoryRecord *DicomDirInterface::buildFiducialRecord(DcmDirectoryRecord *record, DcmItem *dataset, const OFString &referencedFileID, const OFString &sourceFilename) { /* create new fiducial record */ if (record == NULL) record = new DcmDirectoryRecord(ERT_Fiducial, referencedFileID.c_str(), sourceFilename.c_str()); if (record != NULL) { /* check whether new record is ok */ if (record->error().good()) { /* copy attribute values from dataset to fiducial record */ copyElementType1(dataset, DCM_ContentDate, record, sourceFilename); copyElementType1(dataset, DCM_ContentTime, record, sourceFilename); copyElementType1(dataset, DCM_InstanceNumber, record, sourceFilename); copyElementType1(dataset, DCM_ContentLabel, record, sourceFilename); copyElementType2(dataset, DCM_ContentDescription, record, sourceFilename); copyElementType2(dataset, DCM_ContentCreatorName, record, sourceFilename); } else { printRecordErrorMessage(record->error(), ERT_Fiducial, "create"); /* free memory */ delete record; record = NULL; } } else printRecordErrorMessage(EC_MemoryExhausted, ERT_Fiducial, "create"); return record; } // create or update raw data record and copy required values from dataset DcmDirectoryRecord *DicomDirInterface::buildRawDataRecord(DcmDirectoryRecord *record, DcmItem *dataset, const OFString &referencedFileID, const OFString &sourceFilename) { /* create new raw data record */ if (record == NULL) record = new DcmDirectoryRecord(ERT_RawData, referencedFileID.c_str(), sourceFilename.c_str()); if (record != NULL) { /* check whether new record is ok */ if (record->error().good()) { /* copy attribute values from dataset to raw data record */ copyElementType1(dataset, DCM_ContentDate, record, sourceFilename); copyElementType1(dataset, DCM_ContentTime, record, sourceFilename); copyElementType2(dataset, DCM_InstanceNumber, record, sourceFilename); /* IconImageSequence (type 3) is not created for the raw data */ } else { printRecordErrorMessage(record->error(), ERT_RawData, "create"); /* free memory */ delete record; record = NULL; } } else printRecordErrorMessage(EC_MemoryExhausted, ERT_RawData, "create"); return record; } // create or update spectroscopy record and copy required values from dataset DcmDirectoryRecord *DicomDirInterface::buildSpectroscopyRecord(DcmDirectoryRecord *record, DcmItem *dataset, const OFString &referencedFileID, const OFString &sourceFilename) { /* create new spectroscopy record */ if (record == NULL) record = new DcmDirectoryRecord(ERT_Spectroscopy, referencedFileID.c_str(), sourceFilename.c_str()); if (record != NULL) { /* check whether new record is ok */ if (record->error().good()) { /* copy attribute values from dataset to spectroscopy record */ copyElementType1(dataset, DCM_ImageType, record, sourceFilename); copyElementType1(dataset, DCM_ContentDate, record, sourceFilename); copyElementType1(dataset, DCM_ContentTime, record, sourceFilename); copyElementType1(dataset, DCM_InstanceNumber, record, sourceFilename); copyElementType1C(dataset, DCM_ReferencedImageEvidenceSequence, record, sourceFilename); copyElementType1(dataset, DCM_NumberOfFrames, record, sourceFilename); copyElementType1(dataset, DCM_Rows, record, sourceFilename); copyElementType1(dataset, DCM_Columns, record, sourceFilename); copyElementType1(dataset, DCM_DataPointRows, record, sourceFilename); copyElementType1(dataset, DCM_DataPointColumns, record, sourceFilename); /* IconImageSequence (type 3) is not created for the spectroscopy data */ /* application profile specific attributes */ if ((ApplicationProfile == AP_GeneralPurposeDVD) || (ApplicationProfile == AP_USBandFlash)) { copyElementType1(dataset, DCM_Rows, record, sourceFilename); copyElementType1(dataset, DCM_Columns, record, sourceFilename); copyElementType1C(dataset, DCM_FrameOfReferenceUID, record, sourceFilename); copyElementType1C(dataset, DCM_SynchronizationFrameOfReferenceUID, record, sourceFilename); copyElementType1C(dataset, DCM_NumberOfFrames, record, sourceFilename); copyElementType1C(dataset, DCM_AcquisitionTimeSynchronized, record, sourceFilename); copyElementType1C(dataset, DCM_AcquisitionDateTime, record, sourceFilename); // tbd: need to examine functional groups for the following attributes copyElementType1C(dataset, DCM_ReferencedImageSequence, record, sourceFilename); copyElementType1C(dataset, DCM_ImagePositionPatient, record, sourceFilename); copyElementType1C(dataset, DCM_ImageOrientationPatient, record, sourceFilename); copyElementType1C(dataset, DCM_PixelSpacing, record, sourceFilename); } } else { printRecordErrorMessage(record->error(), ERT_Spectroscopy, "create"); /* free memory */ delete record; record = NULL; } } else printRecordErrorMessage(EC_MemoryExhausted, ERT_Spectroscopy, "create"); return record; } // create or update encap doc record and copy required values from dataset DcmDirectoryRecord *DicomDirInterface::buildEncapDocRecord(DcmDirectoryRecord *record, DcmItem *dataset, const OFString &referencedFileID, const OFString &sourceFilename) { /* create new encap doc record */ if (record == NULL) record = new DcmDirectoryRecord(ERT_EncapDoc, referencedFileID.c_str(), sourceFilename.c_str()); if (record != NULL) { /* check whether new record is ok */ if (record->error().good()) { /* copy attribute values from dataset to encap doc record */ copyElementType2(dataset, DCM_ContentDate, record, sourceFilename); copyElementType2(dataset, DCM_ContentTime, record, sourceFilename); copyElementType1(dataset, DCM_InstanceNumber, record, sourceFilename); copyElementType2(dataset, DCM_DocumentTitle, record, sourceFilename); /* required if encapsulated document is an HL7 Structured Document */ copyElementType1C(dataset, DCM_HL7InstanceIdentifier, record, sourceFilename); /* baseline context group 7020 is not checked */ copyElementType2(dataset, DCM_ConceptNameCodeSequence, record, sourceFilename); copyElementType1(dataset, DCM_MIMETypeOfEncapsulatedDocument, record, sourceFilename); } else { printRecordErrorMessage(record->error(), ERT_EncapDoc, "create"); /* free memory */ delete record; record = NULL; } } else printRecordErrorMessage(EC_MemoryExhausted, ERT_RawData, "create"); return record; } // create or update value map record and copy required values from dataset DcmDirectoryRecord *DicomDirInterface::buildValueMapRecord(DcmDirectoryRecord *record, DcmItem *dataset, const OFString &referencedFileID, const OFString &sourceFilename) { /* create new value map record */ if (record == NULL) record = new DcmDirectoryRecord(ERT_ValueMap, referencedFileID.c_str(), sourceFilename.c_str()); if (record != NULL) { /* check whether new record is ok */ if (record->error().good()) { /* copy attribute values from dataset to value map record */ copyElementType1(dataset, DCM_ContentDate, record, sourceFilename); copyElementType1(dataset, DCM_ContentTime, record, sourceFilename); copyElementType1(dataset, DCM_InstanceNumber, record, sourceFilename); copyElementType1(dataset, DCM_ContentLabel, record, sourceFilename); copyElementType2(dataset, DCM_ContentDescription, record, sourceFilename); copyElementType2(dataset, DCM_ContentCreatorName, record, sourceFilename); } else { printRecordErrorMessage(record->error(), ERT_ValueMap, "create"); /* free memory */ delete record; record = NULL; } } else printRecordErrorMessage(EC_MemoryExhausted, ERT_ValueMap, "create"); return record; } // create or update hanging protocol record and copy required values from dataset DcmDirectoryRecord *DicomDirInterface::buildHangingProtocolRecord(DcmDirectoryRecord *record, DcmItem *dataset, const OFString &referencedFileID, const OFString &sourceFilename) { /* create new hanging protocol record */ if (record == NULL) record = new DcmDirectoryRecord(ERT_HangingProtocol, referencedFileID.c_str(), sourceFilename.c_str()); if (record != NULL) { /* check whether new record is ok */ if (record->error().good()) { copyElementType1(dataset, DCM_HangingProtocolName, record, sourceFilename); copyElementType1(dataset, DCM_HangingProtocolDescription, record, sourceFilename); copyElementType1(dataset, DCM_HangingProtocolLevel, record, sourceFilename); copyElementType1(dataset, DCM_HangingProtocolCreator, record, sourceFilename); copyElementType1(dataset, DCM_HangingProtocolCreationDateTime, record, sourceFilename); // open issue: shall we do further checks on the sequence content? copyElementType1(dataset, DCM_HangingProtocolDefinitionSequence, record, sourceFilename); copyElementType1(dataset, DCM_NumberOfPriorsReferenced, record, sourceFilename); copyElementType2(dataset, DCM_HangingProtocolUserIdentificationCodeSequence, record, sourceFilename); } else { printRecordErrorMessage(record->error(), ERT_HangingProtocol, "create"); /* free memory */ delete record; record = NULL; } } else DCMDATA_ERROR("out of memory (creating patient record)"); return record; } // create or update stereometric record and copy required values from dataset DcmDirectoryRecord *DicomDirInterface::buildStereometricRecord(DcmDirectoryRecord *record, DcmItem * /* dataset */ , const OFString &referencedFileID, const OFString &sourceFilename) { /* create new value map record */ if (record == NULL) record = new DcmDirectoryRecord(ERT_Stereometric, referencedFileID.c_str(), sourceFilename.c_str()); if (record != NULL) { /* check whether new record is ok */ if (record->error().good()) { /* nothing to do */ } else { printRecordErrorMessage(record->error(), ERT_Stereometric, "create"); /* free memory */ delete record; record = NULL; } } else printRecordErrorMessage(EC_MemoryExhausted, ERT_Stereometric, "create"); return record; } // create or update palette record and copy required values from dataset DcmDirectoryRecord *DicomDirInterface::buildPaletteRecord(DcmDirectoryRecord *record, DcmItem *dataset, const OFString &referencedFileID, const OFString &sourceFilename) { /* create new palette record */ if (record == NULL) record = new DcmDirectoryRecord(ERT_Palette, referencedFileID.c_str(), sourceFilename.c_str()); if (record != NULL) { /* check whether new record is ok */ if (record->error().good()) { /* copy attribute values from dataset to palette record */ copyElementType1(dataset, DCM_ContentLabel, record, sourceFilename); copyElementType2(dataset, DCM_ContentDescription, record, sourceFilename); } else { printRecordErrorMessage(record->error(), ERT_Palette, "create"); /* free memory */ delete record; record = NULL; } } else printRecordErrorMessage(EC_MemoryExhausted, ERT_Palette, "create"); return record; } // create or update surface record and copy required values from dataset DcmDirectoryRecord *DicomDirInterface::buildSurfaceRecord(DcmDirectoryRecord *record, DcmItem *dataset, const OFString &referencedFileID, const OFString &sourceFilename) { /* create new surface record */ if (record == NULL) record = new DcmDirectoryRecord(ERT_Surface, referencedFileID.c_str(), sourceFilename.c_str()); if (record != NULL) { /* check whether new record is ok */ if (record->error().good()) { /* copy attribute values from dataset to surface record */ copyElementType1(dataset, DCM_ContentDate, record, sourceFilename); copyElementType1(dataset, DCM_ContentTime, record, sourceFilename); copyElementType1(dataset, DCM_InstanceNumber, record, sourceFilename); copyElementType1(dataset, DCM_ContentLabel, record, sourceFilename); copyElementType2(dataset, DCM_ContentDescription, record, sourceFilename); copyElementType2(dataset, DCM_ContentCreatorName, record, sourceFilename); } else { printRecordErrorMessage(record->error(), ERT_Surface, "create"); /* free memory */ delete record; record = NULL; } } else printRecordErrorMessage(EC_MemoryExhausted, ERT_Surface, "create"); return record; } // create or update measurement record and copy required values from dataset DcmDirectoryRecord *DicomDirInterface::buildMeasurementRecord(DcmDirectoryRecord *record, DcmItem *dataset, const OFString &referencedFileID, const OFString &sourceFilename) { /* create new measurement record */ if (record == NULL) record = new DcmDirectoryRecord(ERT_Measurement, referencedFileID.c_str(), sourceFilename.c_str()); if (record != NULL) { /* check whether new record is ok */ if (record->error().good()) { /* copy attribute values from dataset to measurement record */ copyElementType1(dataset, DCM_ContentDate, record, sourceFilename); copyElementType1(dataset, DCM_ContentTime, record, sourceFilename); copyElementType1(dataset, DCM_InstanceNumber, record, sourceFilename); copyElementType1(dataset, DCM_ContentLabel, record, sourceFilename); copyElementType2(dataset, DCM_ContentDescription, record, sourceFilename); copyElementType2(dataset, DCM_ContentCreatorName, record, sourceFilename); } else { printRecordErrorMessage(record->error(), ERT_Measurement, "create"); /* free memory */ delete record; record = NULL; } } else printRecordErrorMessage(EC_MemoryExhausted, ERT_Measurement, "create"); return record; } // create or update implant record and copy required values from dataset DcmDirectoryRecord *DicomDirInterface::buildImplantRecord(DcmDirectoryRecord *record, DcmItem *dataset, const OFString &referencedFileID, const OFString &sourceFilename) { /* create new implant record */ if (record == NULL) record = new DcmDirectoryRecord(ERT_Implant, referencedFileID.c_str(), sourceFilename.c_str()); if (record != NULL) { /* check whether new record is ok */ if (record->error().good()) { /* copy attribute values from dataset to implant record */ copyElementType1(dataset, DCM_Manufacturer, record, sourceFilename); copyElementType1(dataset, DCM_ImplantName, record, sourceFilename); copyElementType1C(dataset, DCM_ImplantSize, record, sourceFilename); copyElementType1(dataset, DCM_ImplantPartNumber, record, sourceFilename); } else { printRecordErrorMessage(record->error(), ERT_Implant, "create"); /* free memory */ delete record; record = NULL; } } else printRecordErrorMessage(EC_MemoryExhausted, ERT_Implant, "create"); return record; } // create or update implant group record and copy required values from dataset DcmDirectoryRecord *DicomDirInterface::buildImplantGroupRecord(DcmDirectoryRecord *record, DcmItem *dataset, const OFString &referencedFileID, const OFString &sourceFilename) { /* create new implant group record */ if (record == NULL) record = new DcmDirectoryRecord(ERT_ImplantGroup, referencedFileID.c_str(), sourceFilename.c_str()); if (record != NULL) { /* check whether new record is ok */ if (record->error().good()) { /* copy attribute values from dataset to implant group record */ copyElementType1(dataset, DCM_ImplantAssemblyTemplateName, record, sourceFilename); copyElementType1(dataset, DCM_ImplantAssemblyTemplateIssuer, record, sourceFilename); copyElementType1(dataset, DCM_ProcedureTypeCodeSequence, record, sourceFilename); } else { printRecordErrorMessage(record->error(), ERT_ImplantGroup, "create"); /* free memory */ delete record; record = NULL; } } else printRecordErrorMessage(EC_MemoryExhausted, ERT_ImplantGroup, "create"); return record; } // create or update implant assy record and copy required values from dataset DcmDirectoryRecord *DicomDirInterface::buildImplantAssyRecord(DcmDirectoryRecord *record, DcmItem *dataset, const OFString &referencedFileID, const OFString &sourceFilename) { /* create new implant assy record */ if (record == NULL) record = new DcmDirectoryRecord(ERT_ImplantAssy, referencedFileID.c_str(), sourceFilename.c_str()); if (record != NULL) { /* check whether new record is ok */ if (record->error().good()) { /* copy attribute values from dataset to implant assy record */ copyElementType1(dataset, DCM_ImplantTemplateGroupName, record, sourceFilename); copyElementType3(dataset, DCM_ImplantTemplateGroupDescription, record, sourceFilename); copyElementType1(dataset, DCM_ImplantTemplateGroupIssuer, record, sourceFilename); } else { printRecordErrorMessage(record->error(), ERT_ImplantAssy, "create"); /* free memory */ delete record; record = NULL; } } else printRecordErrorMessage(EC_MemoryExhausted, ERT_ImplantAssy, "create"); return record; } // create or update image record and copy required values from dataset DcmDirectoryRecord *DicomDirInterface::buildImageRecord(DcmDirectoryRecord *record, DcmItem *dataset, const OFString &referencedFileID, const OFString &sourceFilename) { /* create new image record */ if (record == NULL) record = new DcmDirectoryRecord(ERT_Image, referencedFileID.c_str(), sourceFilename.c_str()); if (record != NULL) { /* check whether new record is ok */ if (record->error().good()) { OFBool iconImage = IconImageMode; unsigned int iconSize = (IconSize == 0) ? 64 : IconSize; /* Icon Image Sequence required for particular profiles */ OFBool iconRequired = OFFalse; /* copy attribute values from dataset to image record */ copyElementType1(dataset, DCM_InstanceNumber, record, sourceFilename); /* application profile specific attributes */ switch (ApplicationProfile) { case AP_GeneralPurpose: copyElementType1C(dataset, DCM_ImageType, record, sourceFilename); copyElementType1C(dataset, DCM_ReferencedImageSequence, record, sourceFilename); break; case AP_GeneralPurposeDVD: case AP_USBandFlash: copyElementType1(dataset, DCM_Rows, record, sourceFilename); copyElementType1(dataset, DCM_Columns, record, sourceFilename); copyElementType1C(dataset, DCM_ImageType, record, sourceFilename); copyElementType1C(dataset, DCM_CalibrationImage, record, sourceFilename); copyElementType1C(dataset, DCM_LossyImageCompressionRatio, record, sourceFilename); copyElementType1C(dataset, DCM_FrameOfReferenceUID, record, sourceFilename); copyElementType1C(dataset, DCM_SynchronizationFrameOfReferenceUID, record, sourceFilename); copyElementType1C(dataset, DCM_NumberOfFrames, record, sourceFilename); copyElementType1C(dataset, DCM_AcquisitionTimeSynchronized, record, sourceFilename); copyElementType1C(dataset, DCM_AcquisitionDateTime, record, sourceFilename); // tbd: need to examine functional groups for the following attributes copyElementType1C(dataset, DCM_ReferencedImageSequence, record, sourceFilename); copyElementType1C(dataset, DCM_ImagePositionPatient, record, sourceFilename); copyElementType1C(dataset, DCM_ImageOrientationPatient, record, sourceFilename); copyElementType1C(dataset, DCM_PixelSpacing, record, sourceFilename); break; case AP_MPEG2MPatMLDVD: copyElementType1(dataset, DCM_Rows, record, sourceFilename); copyElementType1(dataset, DCM_Columns, record, sourceFilename); copyElementType1C(dataset, DCM_ImageType, record, sourceFilename); copyElementType1C(dataset, DCM_LossyImageCompressionRatio, record, sourceFilename); break; case AP_XrayAngiographic: case AP_XrayAngiographicDVD: copyElementType1C(dataset, DCM_LossyImageCompressionRatio, record, sourceFilename); case AP_BasicCardiac: { OFString tmpString; OFBool xaImage = compare(getStringFromDataset(dataset, DCM_SOPClassUID, tmpString), UID_XRayAngiographicImageStorage); if (xaImage) { /* type 1C: required for XA images (type 1 for Basic Cardiac Profile) */ copyElementType1(dataset, DCM_ImageType, record, sourceFilename); /* type 1C: required if ImageType value 3 is "BIPLANE A" or "BIPLANE B" */ getStringComponentFromDataset(dataset, DCM_ImageType, tmpString, 2); if (compare(tmpString, "BIPLANE A") || compare(tmpString, "BIPLANE B")) copyElementType1(dataset, DCM_ReferencedImageSequence, record, sourceFilename); } /* additional type 2 keys specified by specific profiles (type 3 in image IOD) */ copyStringWithDefault(dataset, DCM_CalibrationImage, record, sourceFilename); /* icon images */ iconImage = OFTrue; iconRequired = OFTrue; iconSize = 128; } break; case AP_CTandMR: copyElementType1(dataset, DCM_Rows, record, sourceFilename); copyElementType1(dataset, DCM_Columns, record, sourceFilename); copyElementType1C(dataset, DCM_ReferencedImageSequence, record, sourceFilename); copyElementType1C(dataset, DCM_ImagePositionPatient, record, sourceFilename); copyElementType1C(dataset, DCM_ImageOrientationPatient, record, sourceFilename); copyElementType1C(dataset, DCM_FrameOfReferenceUID, record, sourceFilename); copyElementType1C(dataset, DCM_PixelSpacing, record, sourceFilename); /* icon images */ iconImage = OFTrue; iconSize = 64; break; default: /* no additional keys */ break; } /* create icon images */ if (iconImage) { OFCondition status = addIconImage(record, dataset, iconSize, sourceFilename); if (status.bad()) { /* report error or warning */ if (iconRequired) DCMDATA_ERROR("cannot create IconImageSequence"); else DCMDATA_WARN("cannot create IconImageSequence"); } } } else { printRecordErrorMessage(record->error(), ERT_Series, "create"); /* free memory */ delete record; record = NULL; } } else DCMDATA_ERROR("out of memory (creating image record)"); return record; } // create icon image from PGM file OFBool DicomDirInterface::getIconFromFile(const OFString &filename, Uint8 *pixel, const unsigned long count, const unsigned int width, const unsigned int height) { OFBool result = OFFalse; /* check buffer and size */ if ((pixel != NULL) && (count >= width * height)) { /* open specified file */ FILE *file = fopen(filename.c_str(), "rb"); if (file != NULL) { /* according to the pgm format no line should be longer than 70 characters */ const int maxline = 256; char line[maxline]; /* read magic number */ if ((fgets(line, maxline, file) != NULL) && (strcmp(line, "P5\n") == 0)) { OFBool corrupt = OFTrue; if ((fgets(line, maxline, file) != NULL) && (line[0] != '\0')) { unsigned int pgmWidth, pgmHeight = 0; /* skip optional comment line and get width and height */ if (((*line != '#') || (fgets(line, maxline, file) != NULL)) && (sscanf(line, "%u %u", &pgmWidth, &pgmHeight) > 0) && (pgmWidth > 0) && (pgmHeight > 0)) { unsigned int pgmMax = 0; /* get maximum gray value */ if ((fgets(line, maxline, file) != NULL) && (sscanf(line, "%u", &pgmMax) > 0) && (pgmMax == 255)) { const unsigned long pgmSize = pgmWidth * pgmHeight; Uint8 *pgmData = new Uint8[pgmSize]; if (pgmData != NULL) { /* get pgm image data */ if (fread(pgmData, sizeof(Uint8), OFstatic_cast(size_t, pgmSize), file) == pgmSize) { /* if already scaled, just copy the bitmap */ if ((width == pgmWidth) && (height == pgmHeight) && (count == pgmSize)) { OFBitmanipTemplate::copyMem(pgmData, pixel, count); result = OFTrue; } else if (ImagePlugin != NULL) { /* scale image to requested size */ result = ImagePlugin->scaleData(pgmData, pgmWidth, pgmHeight, pixel, width, height); } if (!result) DCMDATA_ERROR("cannot scale external icon, no image support available"); corrupt = OFFalse; } /* free memory */ delete[] pgmData; } else { DCMDATA_ERROR(EC_MemoryExhausted.text() << ": cannot allocate memory for pgm pixel data"); /* avoid double reporting of error message */ corrupt = OFFalse; } } } } if (corrupt) DCMDATA_ERROR("corrupt file format for external icon (not pgm binary)"); } else DCMDATA_ERROR("wrong file format for external icon (pgm required)"); fclose(file); } else DCMDATA_ERROR("cannot open file for external icon: " << filename); } return result; } // create icon image from DICOM dataset OFBool DicomDirInterface::getIconFromDataset(DcmItem *dataset, Uint8 *pixel, const unsigned long count, const unsigned int width, const unsigned int height) { OFBool result = OFFalse; /* check parameters (incl. availability of image plugin) */ if ((ImagePlugin != NULL) && (dataset != NULL) && (pixel != NULL) && (count >= width * height)) { /* choose representitive frame */ long fCount, frame; dataset->findAndGetLongInt(DCM_NumberOfFrames, fCount); dataset->findAndGetLongInt(DCM_RepresentativeFrameNumber, frame); if (fCount <= 0) fCount = 1; if (frame <= 0) { if (fCount > 3) frame = fCount / 3; // recommended in PS3.11 else frame = 1; } else if (frame > fCount) frame = fCount; /* scale image (if required) and retrieve pixel data from dataset */ result = ImagePlugin->scaleImage(dataset, pixel, count, OFstatic_cast(unsigned long, frame), width, height, (fCount == 1) /*decompressAll*/); } return result; } // add icon image sequence to record OFCondition DicomDirInterface::addIconImage(DcmDirectoryRecord *record, DcmItem *dataset, const unsigned int size, const OFString &sourceFilename) { OFCondition result = EC_IllegalParameter; /* check parameters first */ if ((record != NULL) && (dataset != NULL)) { DcmItem *ditem = NULL; /* create icon image sequence with one item */ result = record->findOrCreateSequenceItem(DCM_IconImageSequence, ditem); if (result.good()) { const unsigned int width = size; const unsigned int height = size; const unsigned long count = width * height; /* Image Pixel Module */ ditem->putAndInsertUint16(DCM_SamplesPerPixel, 1); ditem->putAndInsertString(DCM_PhotometricInterpretation, "MONOCHROME2"); ditem->putAndInsertUint16(DCM_Rows, height); ditem->putAndInsertUint16(DCM_Columns, width); ditem->putAndInsertUint16(DCM_BitsAllocated, 8); ditem->putAndInsertUint16(DCM_BitsStored, 8); ditem->putAndInsertUint16(DCM_HighBit, 7); ditem->putAndInsertUint16(DCM_PixelRepresentation, 0); /* Pixel Data */ Uint8 *pixel = new Uint8[count]; if (pixel != NULL) { OFBool iconOk = OFFalse; /* prefix for external icons specified? */ if (!IconPrefix.empty()) { /* try to load external pgm icon */ iconOk = getIconFromFile(IconPrefix + sourceFilename, pixel, count, width, height); } else { /* try to create icon from dataset */ iconOk = getIconFromDataset(dataset, pixel, count, width, height); if (!iconOk) DCMDATA_WARN("cannot create monochrome icon from image file, using default"); } /* could not create icon so far: use default icon (if specified) */ if (!iconOk && !DefaultIcon.empty()) iconOk = getIconFromFile(DefaultIcon, pixel, count, width, height); /* default not available: use black image */ if (!iconOk) OFBitmanipTemplate::zeroMem(pixel, count); /* create Pixel Data element and set pixel data */ result = ditem->putAndInsertUint8Array(DCM_PixelData, pixel, count); /* free pixel data after it has been copied */ delete[] pixel; } else result = EC_MemoryExhausted; /* remove entire icon image sequence in case of error */ if (result.bad()) record->findAndDeleteElement(DCM_IconImageSequence); } } return result; } // add child record to a given parent record DcmDirectoryRecord *DicomDirInterface::addRecord(DcmDirectoryRecord *parent, const E_DirRecType recordType, DcmItem *dataset, const OFString &referencedFileID, const OFString &sourceFilename) { DcmDirectoryRecord *record = NULL; if (parent != NULL) { /* check whether record already exists */ DcmDirectoryRecord *oldRecord = record = findExistingRecord(parent, recordType, dataset); if ((record == NULL) || FilesetUpdateMode) { /* in case an existing record is updated */ if (record != NULL) { /* perform some consistency checks for instance records */ if ((recordType != ERT_Patient) && (recordType != ERT_Study) && (recordType != ERT_Series)) { if (!checkReferencedSOPInstance(record, dataset, referencedFileID, sourceFilename)) return NULL; } } /* create a new one or update existing record */ switch (recordType) { case ERT_Patient: record = buildPatientRecord(record, dataset, sourceFilename); break; case ERT_Study: record = buildStudyRecord(record, dataset, sourceFilename); break; case ERT_Series: record = buildSeriesRecord(record, dataset, sourceFilename); break; case ERT_Overlay: record = buildOverlayRecord(record, dataset, referencedFileID, sourceFilename); break; case ERT_ModalityLut: record = buildModalityLutRecord(record, dataset, referencedFileID, sourceFilename); break; case ERT_VoiLut: record = buildVoiLutRecord(record, dataset, referencedFileID, sourceFilename); break; case ERT_Curve: record = buildCurveRecord(record, dataset, referencedFileID, sourceFilename); break; case ERT_SRDocument: record = buildStructReportRecord(record, dataset, referencedFileID, sourceFilename); break; case ERT_Presentation: record = buildPresentationRecord(record, dataset, referencedFileID, sourceFilename); break; case ERT_Waveform: record = buildWaveformRecord(record, dataset, referencedFileID, sourceFilename); break; case ERT_RTDose: record = buildRTDoseRecord(record, dataset, referencedFileID, sourceFilename); break; case ERT_RTStructureSet: record = buildRTStructureSetRecord(record, dataset, referencedFileID, sourceFilename); break; case ERT_RTPlan: record = buildRTPlanRecord(record, dataset, referencedFileID, sourceFilename); break; case ERT_RTTreatRecord: record = buildRTTreatmentRecord(record, dataset, referencedFileID, sourceFilename); break; case ERT_StoredPrint: record = buildStoredPrintRecord(record, dataset, referencedFileID, sourceFilename); break; case ERT_KeyObjectDoc: record = buildKeyObjectDocRecord(record, dataset, referencedFileID, sourceFilename); break; case ERT_Registration: record = buildRegistrationRecord(record, dataset, referencedFileID, sourceFilename); break; case ERT_Fiducial: record = buildFiducialRecord(record, dataset, referencedFileID, sourceFilename); break; case ERT_RawData: record = buildRawDataRecord(record, dataset, referencedFileID, sourceFilename); break; case ERT_Spectroscopy: record = buildSpectroscopyRecord(record, dataset, referencedFileID, sourceFilename); break; case ERT_EncapDoc: record = buildEncapDocRecord(record, dataset, referencedFileID, sourceFilename); break; case ERT_ValueMap: record = buildValueMapRecord(record, dataset, referencedFileID, sourceFilename); break; case ERT_HangingProtocol: record = buildHangingProtocolRecord(record, dataset, referencedFileID, sourceFilename); break; case ERT_Stereometric: record = buildStereometricRecord(record, dataset, referencedFileID, sourceFilename); break; case ERT_Palette: record = buildPaletteRecord(record, dataset, referencedFileID, sourceFilename); break; case ERT_Surface: record = buildSurfaceRecord(record, dataset, referencedFileID, sourceFilename); break; case ERT_Measurement: record = buildMeasurementRecord(record, dataset, referencedFileID, sourceFilename); break; case ERT_Implant: record = buildImplantRecord(record, dataset, referencedFileID, sourceFilename); break; case ERT_ImplantGroup: record = buildImplantGroupRecord(record, dataset, referencedFileID, sourceFilename); break; case ERT_ImplantAssy: record = buildImplantAssyRecord(record, dataset, referencedFileID, sourceFilename); break; default: /* it can only be an image */ record = buildImageRecord(record, dataset, referencedFileID, sourceFilename); } if (record != NULL) { /* type 1C: required if an extended character set is used in one of the record keys */ if (record->isAffectedBySpecificCharacterSet()) copyElementType1C(dataset, DCM_SpecificCharacterSet, record, sourceFilename); /* in case a new record has been created */ if (record != oldRecord) { /* insert it below parent record */ OFCondition status = insertSortedUnder(parent, record); if (status.bad()) { printRecordErrorMessage(status, recordType, "insert"); /* free memory */ delete record; record = NULL; } } } } else { /* instance record is already referenced by the DICOMDIR */ if ((recordType != ERT_Patient) && (recordType != ERT_Study) && (recordType != ERT_Series)) { /* create warning message */ DCMDATA_WARN("file " << sourceFilename << ": directory record for this SOP instance already exists"); } /* perform consistency check */ if (ConsistencyCheck) { /* abort on any inconsistancy */ if (warnAboutInconsistentAttributes(record, dataset, sourceFilename, AbortMode) && AbortMode) return NULL; } } if (record != NULL) { /* check whether instance is already listed */ if (record->getRecordsOriginFile() == NULL) record->setRecordsOriginFile(sourceFilename.c_str()); } } return record; } // check referenced SOP instance for consistency with a new directory record OFBool DicomDirInterface::checkReferencedSOPInstance(DcmDirectoryRecord *record, DcmItem *dataset, const OFString &referencedFileID, const OFString &sourceFilename) { OFBool result = OFTrue; if ((record != NULL) && (dataset != NULL)) { OFString refFileID; /* check referenced file ID */ if (record->findAndGetOFStringArray(DCM_ReferencedFileID, refFileID).good() && !compare(refFileID, referencedFileID)) { /* create error message */ DCMDATA_ERROR("file " << sourceFilename << ": SOP instance already referenced " << "with different file ID (" << refFileID << ")"); result = OFFalse; } /* check SOP class UID */ if (!compareStringAttributes(dataset, DCM_SOPClassUID, record, DCM_ReferencedSOPClassUIDInFile, sourceFilename, OFTrue /*errorMsg*/)) result = OFFalse; } return result; } // invent missing attributes on root level (and below) void DicomDirInterface::inventMissingAttributes(DcmDirectoryRecord *parent, const OFBool recurse) { if (parent != NULL) { DcmDirectoryRecord *record = NULL; /* iterate over all child records */ while ((record = parent->nextSub(record)) != NULL) { /* only check patient records */ if (record->getRecordType() == ERT_Patient) { if (!record->tagExistsWithValue(DCM_PatientID)) setDefaultValue(record, DCM_PatientID, AutoPatientNumber++, AUTO_PATIENTID_PREFIX); if (recurse) inventMissingStudyLevelAttributes(record); } } } } // invent missing attributes on study level (and below) void DicomDirInterface::inventMissingStudyLevelAttributes(DcmDirectoryRecord *parent) { if (parent != NULL) { DcmDirectoryRecord *record = NULL; /* iterate over all child records */ while ((record = parent->nextSub(record)) != NULL) { if (!record->tagExistsWithValue(DCM_StudyID)) setDefaultValue(record, DCM_StudyID, AutoStudyNumber++, AUTO_STUDYID_PREFIX); inventMissingSeriesLevelAttributes(record); } } } // invent missing attributes on series level (and below) void DicomDirInterface::inventMissingSeriesLevelAttributes(DcmDirectoryRecord *parent) { if (parent != NULL) { DcmDirectoryRecord *record = NULL; /* iterate over all child records */ while ((record = parent->nextSub(record)) != NULL) { if (!record->tagExistsWithValue(DCM_SeriesNumber)) setDefaultValue(record, DCM_SeriesNumber, AutoSeriesNumber++); inventMissingInstanceLevelAttributes(record); } } } // invent missing attributes on instance level (and below) void DicomDirInterface::inventMissingInstanceLevelAttributes(DcmDirectoryRecord *parent) { if (parent != NULL) { DcmDirectoryRecord *record = NULL; /* iterate over all child records */ while ((record = parent->nextSub(record)) != NULL) { switch (record->getRecordType()) { case ERT_Image: case ERT_RTDose: case ERT_RTStructureSet: case ERT_RTPlan: case ERT_StoredPrint: case ERT_Surface: if (!record->tagExistsWithValue(DCM_InstanceNumber)) setDefaultValue(record, DCM_InstanceNumber, AutoInstanceNumber++); break; case ERT_Overlay: if (!record->tagExistsWithValue(DCM_RETIRED_OverlayNumber)) setDefaultValue(record, DCM_RETIRED_OverlayNumber, AutoOverlayNumber++); break; case ERT_ModalityLut: case ERT_VoiLut: if (!record->tagExistsWithValue(DCM_RETIRED_LUTNumber)) setDefaultValue(record, DCM_RETIRED_LUTNumber, AutoLutNumber++); break; case ERT_Curve: if (!record->tagExistsWithValue(DCM_RETIRED_CurveNumber)) setDefaultValue(record, DCM_RETIRED_CurveNumber, AutoCurveNumber++); break; case ERT_SRDocument: case ERT_Presentation: case ERT_Waveform: case ERT_RTTreatRecord: case ERT_KeyObjectDoc: case ERT_Registration: case ERT_Fiducial: case ERT_RawData: case ERT_Spectroscopy: case ERT_EncapDoc: case ERT_ValueMap: case ERT_Stereometric: case ERT_Measurement: /* nothing to do */ break; default: /* should never happen */ break; } } } } // add DICOM file to the current DICOMDIR object OFCondition DicomDirInterface::addDicomFile(const char *filename, const char *directory) { OFCondition result = EC_IllegalParameter; /* first, make sure that a DICOMDIR object exists */ if (DicomDir != NULL) { /* create fully qualified pathname of the DICOM file to be added */ OFString pathname; OFStandard::combineDirAndFilename(pathname, OFSTRING_GUARD(directory), OFSTRING_GUARD(filename), OFTrue /*allowEmptyDirName*/); /* then check the file name, load the file and check the content */ DcmFileFormat fileformat; result = loadAndCheckDicomFile(filename, directory, fileformat); if (result.good()) { DCMDATA_INFO("adding file: " << pathname); /* start creating the DICOMDIR directory structure */ DcmDirectoryRecord *rootRecord = &(DicomDir->getRootRecord()); DcmMetaInfo *metainfo = fileformat.getMetaInfo(); DcmDataset *dataset = fileformat.getDataset(); /* massage filename into DICOM format (DOS conventions for path separators, uppercase) */ OFString fileID; hostToDicomFilename(filename, fileID); /* what kind of object (SOP Class) is stored in the file */ OFString sopClass; metainfo->findAndGetOFString(DCM_MediaStorageSOPClassUID, sopClass); /* if hanging protocol, palette or implant file then attach it to the root record and stop */ if (compare(sopClass, UID_HangingProtocolStorage)) { /* add a hanging protocol record below the root */ if (addRecord(rootRecord, ERT_HangingProtocol, dataset, fileID, pathname) == NULL) result = EC_CorruptedData; } else if (compare(sopClass, UID_ColorPaletteStorage)) { /* add a palette record below the root */ if (addRecord(rootRecord, ERT_Palette, dataset, fileID, pathname) == NULL) result = EC_CorruptedData; } else if (compare(sopClass, UID_GenericImplantTemplateStorage)) { /* add an implant record below the root */ if (addRecord(rootRecord, ERT_Implant, dataset, fileID, pathname) == NULL) result = EC_CorruptedData; } else if (compare(sopClass, UID_ImplantAssemblyTemplateStorage)) { /* add an implant group record below the root */ if (addRecord(rootRecord, ERT_ImplantGroup, dataset, fileID, pathname) == NULL) result = EC_CorruptedData; } else if (compare(sopClass, UID_ImplantTemplateGroupStorage)) { /* add an implant assy record below the root */ if (addRecord(rootRecord, ERT_ImplantAssy, dataset, fileID, pathname) == NULL) result = EC_CorruptedData; } else { /* add a patient record below the root */ DcmDirectoryRecord *patientRecord = addRecord(rootRecord, ERT_Patient, dataset, fileID, pathname); if (patientRecord != NULL) { /* if patient management file then attach it to patient record and stop */ if (compare(sopClass, UID_RETIRED_DetachedPatientManagementMetaSOPClass)) { result = patientRecord->assignToSOPFile(fileID.c_str(), pathname.c_str()); DCMDATA_ERROR(result.text() << ": cannot assign patient record to file: " << pathname); } else { /* add a study record below the current patient record */ DcmDirectoryRecord *studyRecord = addRecord(patientRecord, ERT_Study, dataset, fileID, pathname);; if (studyRecord != NULL) { /* add a series record below the current study record */ DcmDirectoryRecord *seriesRecord = addRecord(studyRecord, ERT_Series, dataset, fileID, pathname);; if (seriesRecord != NULL) { /* add one of the instance record below the current series record */ if (addRecord(seriesRecord, sopClassToRecordType(sopClass), dataset, fileID, pathname) == NULL) result = EC_CorruptedData; } else result = EC_CorruptedData; } else result = EC_CorruptedData; } } else result = EC_CorruptedData; /* invent missing attributes on all levels or PatientID only */ if (InventMode) inventMissingAttributes(rootRecord); else if (InventPatientIDMode) inventMissingAttributes(rootRecord, OFFalse /*recurse*/); } } } return result; } // set the fileset descriptor and character set OFCondition DicomDirInterface::setFilesetDescriptor(const char *filename, const char *charset) { OFCondition result = EC_IllegalCall; if (DicomDir != NULL) { /* check filename and character set */ if (isFilenameValid(filename, OFTrue /*allowEmpty*/) && isCharsetValid(charset)) { /* get dataset of the current DICOMDIR */ DcmDataset *dataset = DicomDir->getDirFileFormat().getDataset(); if (dataset != NULL) { /* set FileSetDescriptorFileID */ if ((filename == NULL) || (strlen(filename) == 0)) { /* remove attribute from the dataset */ dataset->findAndDeleteElement(DCM_FileSetDescriptorFileID); dataset->findAndDeleteElement(DCM_SpecificCharacterSetOfFileSetDescriptorFile); result = EC_Normal; } else { /* massage filename into DICOM format (DOS conventions for path separators, uppercase) */ OFString fileID; hostToDicomFilename(filename, fileID); /* replace attribute value */ result = dataset->putAndInsertString(DCM_FileSetDescriptorFileID, fileID.c_str()); if (result.good()) { /* set SpecificCharacterSetOfFileSetDescriptorFile */ if ((charset == NULL) || (strlen(charset) == 0)) { /* remove attribute from the dataset */ dataset->findAndDeleteElement(DCM_SpecificCharacterSetOfFileSetDescriptorFile); result = EC_Normal; } else { /* replace attribute value */ result = dataset->putAndInsertString(DCM_SpecificCharacterSetOfFileSetDescriptorFile, charset); } } } } } else result = EC_IllegalParameter; // tbd: check whether file exists? } return result; } // set size of icon images (width and height in pixels) OFCondition DicomDirInterface::setIconSize(const unsigned int size) { OFCondition result = EC_IllegalParameter; /* check valid range */ if ((size > 0) && (size <= 256)) { IconSize = size; result = EC_Normal; } return result; } // set filename prefix for icon images (if not retrieved from DICOM image) OFCondition DicomDirInterface::setIconPrefix(const char *prefix) { IconPrefix = prefix; return EC_Normal; } // set filename for default image icon which is used in case of error OFCondition DicomDirInterface::setDefaultIcon(const char *filename) { DefaultIcon = filename; return EC_Normal; } // enable/disable the abort mode, i.e. abort on first inconsistent file (otherwise warn) OFBool DicomDirInterface::enableAbortMode(const OFBool newMode) { /* save current mode */ OFBool oldMode = AbortMode; /* set new mode */ AbortMode = newMode; /* return old mode */ return oldMode; } // enable/disable filename mapping mode, i.e. whether non-conforming filename are adjusted automatically OFBool DicomDirInterface::enableMapFilenamesMode(const OFBool newMode) { /* save current mode */ OFBool oldMode = MapFilenamesMode; /* set new mode */ MapFilenamesMode = newMode; /* return old mode */ return oldMode; } // enable/disable invent mode, i.e. whether missing attribute values are invented OFBool DicomDirInterface::enableInventMode(const OFBool newMode) { /* save current mode */ OFBool oldMode = InventMode; /* set new mode */ InventMode = newMode; /* return old mode */ return oldMode; } // enable/disable invent patient ID mode, i.e. whether missing patient ID is invented OFBool DicomDirInterface::enableInventPatientIDMode(const OFBool newMode) { /* save current mode */ OFBool oldMode = InventPatientIDMode; /* set new mode */ InventPatientIDMode = newMode; /* return old mode */ return oldMode; } // enable/disable retired SOP class support, i.e. whether retired SOP classes are supported OFBool DicomDirInterface::enableRetiredSOPClassSupport(const OFBool newMode) { /* save current mode */ OFBool oldMode = RetiredSOPClassSupport; /* set new mode */ RetiredSOPClassSupport = newMode; /* return old mode */ return oldMode; } // enable/disable icon image mode, i.e. whether to create icon images OFBool DicomDirInterface::enableIconImageMode(const OFBool newMode) { /* save current mode */ OFBool oldMode = IconImageMode; /* set new mode */ IconImageMode = newMode; /* return old mode */ return oldMode; } // enable/disable the backup mode, i.e. whether to create a backup of the DICOMDIR OFBool DicomDirInterface::disableBackupMode(const OFBool newMode) { /* save current mode */ OFBool oldMode = BackupMode; /* set new mode */ BackupMode = newMode; /* return old mode */ return oldMode; } // enable/disable pixel encoding check, i.e. whether the pixel encoding is checked // for particular application profiles OFBool DicomDirInterface::disableEncodingCheck(const OFBool newMode) { /* save current mode */ OFBool oldMode = EncodingCheck; /* set new mode */ EncodingCheck = newMode; /* return old mode */ return oldMode; } // enable/disable resolution check, i.e. whether the spatial resolution is checked // for particular application profiles OFBool DicomDirInterface::disableResolutionCheck(const OFBool newMode) { /* save current mode */ OFBool oldMode = ResolutionCheck; /* set new mode */ ResolutionCheck = newMode; /* return old mode */ return oldMode; } // enable/disable transfer syntax check, i.e. whether the transfer syntax is checked // for particular application profiles OFBool DicomDirInterface::disableTransferSyntaxCheck(const OFBool newMode) { /* save current mode */ OFBool oldMode = TransferSyntaxCheck; /* set new mode */ TransferSyntaxCheck = newMode; /* return old mode */ return oldMode; } // enable/disable consistency check, i.e. whether the file is checked for consistency // with the directory record OFBool DicomDirInterface::disableConsistencyCheck(const OFBool newMode) { /* save current mode */ OFBool oldMode = ConsistencyCheck; /* set new mode */ ConsistencyCheck = newMode; /* return old mode */ return oldMode; } // add support for DicomImage class(es) - required for icon images OFBool DicomDirInterface::addImageSupport(DicomDirImagePlugin *plugin) { // store pointer to plugin ImagePlugin = plugin; return (ImagePlugin != NULL); } // print an error message to the console (stderr) that the value of the given tag is unexpected void DicomDirInterface::printUnexpectedValueMessage(const DcmTagKey &key, const char *filename, const OFBool errorMsg) { OFString str; if (filename != NULL) { str = " in file: "; str += filename; } if (errorMsg) { DCMDATA_ERROR("attribute " << DcmTag(key).getTagName() << " " << key << " has other value than expected" << str); } else { DCMDATA_WARN("attribute " << DcmTag(key).getTagName() << " " << key << " has other value than expected" << str); } } // print an error message to the console (stderr) that a required attribute is missing/empty void DicomDirInterface::printRequiredAttributeMessage(const DcmTagKey &key, const char *filename, const OFBool emptyMsg) { OFString str; if (filename != NULL) { str = " in file: "; str += filename; } DCMDATA_ERROR("required attribute " << DcmTag(key).getTagName() << " " << key << " " << (emptyMsg ? "empty" : "missing") << str); } // print an error message to the console (stderr) that something went wrong with an attribute void DicomDirInterface::printAttributeErrorMessage(const DcmTagKey &key, const OFCondition &error, const char *operation) { if (error.bad()) { OFString str; if (operation != NULL) { str = "cannot "; str += operation; str += " "; } DCMDATA_ERROR(error.text() << ": " << str << DcmTag(key).getTagName() << " " << key); } } // print an error message to the console (stderr) that something went wrong with a given record void DicomDirInterface::printRecordErrorMessage(const OFCondition &error, const E_DirRecType recordType, const char *operation) { if (error.bad()) { OFString str; if (operation != NULL) { str = "cannot "; str += operation; str += " "; } DCMDATA_ERROR(error.text() << ": " << str << recordTypeToName(recordType) << " directory record"); } } // return the name of the specified application profile const char *DicomDirInterface::getProfileName(const E_ApplicationProfile profile) { const char *result = ""; switch(profile) { case AP_GeneralPurpose: result = "STD-GEN-CD/DVD-RAM"; break; case AP_GeneralPurposeDVD: result = "STD-GEN-DVD-JPEG/J2K"; break; case AP_GeneralPurposeMIME: result = "STD-GEN-MIME"; break; case AP_USBandFlash: result = "STD-GEN-USB/MMC/CF/SD-JPEG/J2K"; break; case AP_MPEG2MPatMLDVD: result = "STD-DVD-MPEG2-MPML"; break; case AP_BasicCardiac: result = "STD-XABC-CD"; break; case AP_XrayAngiographic: result = "STD-XA1K-CD"; break; case AP_XrayAngiographicDVD: result = "STD-XA1K-DVD"; break; case AP_DentalRadiograph: result = "STD-DEN-CD"; break; case AP_CTandMR: result = "STD-CTMR-xxxx"; break; case AP_UltrasoundIDSF: result = "STD-US-ID-SF-xxxx"; break; case AP_UltrasoundSCSF: result = "STD-US-SC-SF-xxxx"; break; case AP_UltrasoundCCSF: result = "STD-US-CC-SF-xxxx"; break; case AP_UltrasoundIDMF: result = "STD-US-ID-MF-xxxx"; break; case AP_UltrasoundSCMF: result = "STD-US-SC-MF-xxxx"; break; case AP_UltrasoundCCMF: result = "STD-US-CC-MF-xxxx"; break; case AP_TwelveLeadECG: result = "STD-WVFM-ECG-FD"; break; case AP_HemodynamicWaveform: result = "STD-WVFM-HD-FD"; break; } return result; } // copy contents of specified file OFBool DicomDirInterface::copyFile(const char *fromFilename, const char *toFilename) { OFBool result = OFFalse; /* check filenames first */ if ((fromFilename != NULL) && (toFilename != NULL)) { /* open input file */ FILE *fromFile = fopen(fromFilename, "rb"); if (fromFile != NULL) { /* create output file */ FILE *toFile = fopen(toFilename, "wb"); if (toFile != NULL) { result = OFTrue; int c = 0; /* for all input file characters */ while (result && ((c = getc(fromFile)) != EOF)) { /* copy character to the output file */ if (putc(c, toFile) == EOF) { /* create error message */ OFOStringStream oss; DCMDATA_ERROR("copying files: " << fromFilename << " to " << toFilename); /* abort loop */ result = OFFalse; } } /* close output file */ fclose(toFile); } else DCMDATA_ERROR("copying files, cannot create: " << toFilename); /* close input file */ fclose(fromFile); } else DCMDATA_ERROR("copying files, cannot open: " << fromFilename); } return result; } // see if all the attributes in record match the values in dataset OFBool DicomDirInterface::warnAboutInconsistentAttributes(DcmDirectoryRecord *record, DcmItem *dataset, const OFString &sourceFilename, const OFBool abortCheck) { OFBool result = OFFalse; /* check parameters first */ if ((record != NULL) && (dataset != NULL)) { result = OFTrue; // default: no inconsistency DcmTagKey tag; DcmStack stack; OFBool first = OFTrue; DcmElement *delem = NULL; /* iterate over all record elements */ while (record->nextObject(stack, first).good() && (result || !abortCheck)) { delem = OFstatic_cast(DcmElement *, stack.top()); if ((delem != NULL) && (delem->getLength() > 0)) { /* record attribute has a value */ tag = delem->getTag().getXTag(); if (dataset->tagExistsWithValue(tag)) { if (delem->getTag().getEVR() == EVR_SQ) { /* do not check particular sequences (because they will always deviate) */ if ((delem->getTag() != DCM_ContentSequence) && (delem->getTag() != DCM_BlendingSequence)) result &= compareSequenceAttributes(dataset, tag, record, sourceFilename); } else { /* everything else can be compared as a string */ result &= compareStringAttributes(dataset, tag, record, tag, sourceFilename); } } } first = OFFalse; } } if (!result & abortCheck) DCMDATA_ERROR("aborting on first inconsistent file: " << sourceFilename); /* return OFTrue in case of any inconsistency */ return !result; } // check whether given fileset ID is valid OFBool DicomDirInterface::checkFilesetID(const OFString &filesetID) { OFBool result = OFTrue; if (!filesetID.empty()) { size_t invalidChar = 0; /* are the characters ok? */ if (!DcmCodeString::checkVR(filesetID, &invalidChar, OFFalse /*checkLength*/)) { /* create error message */ DCMDATA_ERROR("invalid character(s) in fileset ID: " << filesetID << OFendl << OFString(7 /*Error: */ + 36 /*message*/ + invalidChar, ' ') << "^"); result = OFFalse; } /* ensure that fileset ID is not too large */ if (isComponentTooLarge(filesetID, OFstatic_cast(size_t, DcmVR(EVR_CS).getMaxValueLength()), MapFilenamesMode)) { DCMDATA_ERROR("fileset ID too large: " << filesetID); result = OFFalse; } } else result = OFFalse; return result; } // check whether specified tag exists in the dataset OFBool DicomDirInterface::checkExists(DcmItem *dataset, const DcmTagKey &key, const char *filename) { /* check whether tag exists */ OFBool result = OFFalse; if (dataset != NULL) { result = dataset->tagExists(key); if (!result && (filename != NULL)) { /* report an error */ printRequiredAttributeMessage(key, filename); } } return result; } // check whether specified tag exists with a value in the dataset OFBool DicomDirInterface::checkExistsWithValue(DcmItem *dataset, const DcmTagKey &key, const char *filename) { /* first, check whether tag exists, and report an error if not */ OFBool result = checkExists(dataset, key, filename); if (result) { /* then check whether tag has a value (is non-empty) */ result = dataset->tagExistsWithValue(key); if (!result && (filename != NULL)) { /* report an error */ printRequiredAttributeMessage(key, filename, OFTrue /*emptyMsg*/); } } return result; } // check whether specified tag exists in the dataset and has the expected string value OFBool DicomDirInterface::checkExistsWithStringValue(DcmItem *dataset, const DcmTagKey &key, const OFString &value, const char *filename) { /* first, check whether tag exists, and report an error if not */ OFBool result = checkExists(dataset, key, filename); if (result) { OFString str; /* retrieve the string value from the element */ dataset->findAndGetOFStringArray(key, str); /* compare with expected value */ result = compare(str, value); if (!result && (filename != NULL)) { /* report an error */ printUnexpectedValueMessage(key, filename); } } return result; } // check whether specified tag exists in the dataset and has the expected integer value OFBool DicomDirInterface::checkExistsWithIntegerValue(DcmItem *dataset, const DcmTagKey &key, const long value, const char *filename, const OFBool reject) { /* first, check whether tag exists, and report an error if not */ OFBool result = checkExists(dataset, key, filename); if (result) { long i; /* retrieve the integer value from the element */ dataset->findAndGetLongInt(key, i); /* compare with expected value */ result = (i == value); if (!result) { if (filename != NULL) { /* report an error or a warning */ printUnexpectedValueMessage(key, filename, reject /*errorMsg*/); } /* do not reject invalid values */ if (!reject) result = OFTrue; } } return result; } // check whether specified tag exists in the dataset and has an integer value in the expected range OFBool DicomDirInterface::checkExistsWithMinMaxValue(DcmItem *dataset, const DcmTagKey &key, const long min, const long max, const char *filename, const OFBool reject) { /* first, check whether tag exists, and report an error if not */ OFBool result = checkExists(dataset, key, filename); if (result) { long i; /* retrieve the integer value from the element */ dataset->findAndGetLongInt(key, i); /* compare with expected value range */ result = (i >= min) && (i <= max); if (!result) { if (filename != NULL) { /* report an error or a warning */ printUnexpectedValueMessage(key, filename, reject /*errorMsg*/); } /* do not reject invalid values */ if (!reject) result = OFTrue; } } return result; } // get string value from dataset and report an error (if any) OFString &DicomDirInterface::getStringFromDataset(DcmItem *dataset, const DcmTagKey &key, OFString &result, OFBool searchIntoSub) { result.clear(); if (dataset != NULL) { /* get string value from dataset and report if tag is missing */ OFCondition status = dataset->findAndGetOFStringArray(key, result, searchIntoSub); printAttributeErrorMessage(key, status, "retrieve"); } return result; } // get string value component from dataset and report an error (if any) OFString &DicomDirInterface::getStringComponentFromDataset(DcmItem *dataset, const DcmTagKey &key, OFString &result, const unsigned long pos, OFBool searchIntoSub) { result.clear(); if (dataset != NULL) { /* get string value component from dataset and report if tag or component is missing */ OFCondition status = dataset->findAndGetOFString(key, result, pos, searchIntoSub); if (status.bad()) { DCMDATA_ERROR(status.text() << ": cannot retrieve value " << (pos + 1) << " of " << DcmTag(key).getTagName() << " " << key); } } return result; } // get string value from file and report an error (if any) OFString &DicomDirInterface::getStringFromFile(const char *filename, const DcmTagKey &key, OFString &result, OFBool searchIntoSub) { result.clear(); if (filename != NULL) { DcmFileFormat fileformat; DCMDATA_INFO("investigating file: " << filename); /* load specified file */ OFCondition status = fileformat.loadFile(filename); /* retrieve string value from dataset */ if (status.good()) getStringFromDataset(fileformat.getDataset(), key, result, searchIntoSub); else DCMDATA_ERROR(status.text() << ": reading file: " << filename); } return result; } // copy element from dataset to directory record void DicomDirInterface::copyElement(DcmItem *dataset, const DcmTagKey &key, DcmDirectoryRecord *record, const OFString &sourceFilename, const OFBool optional, const OFBool copyEmpty) { if ((dataset != NULL) && (record != NULL)) { /* check whether tag exists in source dataset (if optional) */ if (!optional || (copyEmpty && dataset->tagExists(key)) || dataset->tagExistsWithValue(key)) { DcmElement *delem = NULL; /* get copy of element from source dataset */ OFCondition status = dataset->findAndGetElement(key, delem, OFFalse /*searchIntoSub*/, OFTrue /*createCopy*/); if (status.good()) { /* ... and insert it into the destination dataset (record) */ status = record->insert(delem, OFTrue /*replaceOld*/); if (status.good()) { DcmTag tag(key); /* check for correct VR in the dataset */ if (delem->getVR() != tag.getEVR()) { /* create warning message */ DCMDATA_WARN("file " << sourceFilename << ": possibly wrong VR: " << tag.getTagName() << " " << key << " with " << DcmVR(delem->getVR()).getVRName() << " found, expected " << tag.getVRName() << " instead"); } } else delete delem; } else if (status == EC_TagNotFound) status = record->insertEmptyElement(key); printAttributeErrorMessage(key, status, "insert"); } } } // copy optional string value from dataset to directory record void DicomDirInterface::copyStringWithDefault(DcmItem *dataset, const DcmTagKey &key, DcmDirectoryRecord *record, const OFString &sourceFilename, const char *defaultValue, const OFBool printWarning) { if ((dataset != NULL) && (record != NULL)) { OFCondition status; if (dataset->tagExistsWithValue(key)) { OFString stringValue; /* retrieve string value from source dataset and put it into the destination dataset */ status = record->putAndInsertString(key, getStringFromDataset(dataset, key, stringValue).c_str()); } else { if (printWarning && (defaultValue != NULL)) { /* create warning message */ DCMDATA_WARN("file " << sourceFilename << ": " << DcmTag(key).getTagName() << " " << key << " missing, using alternative: " << defaultValue); } /* put default value */ status = record->putAndInsertString(key, defaultValue); } printAttributeErrorMessage(key, status, "insert"); } } // compare string attributes from dataset and record and report any deviation OFBool DicomDirInterface::compareStringAttributes(DcmItem *dataset, const DcmTagKey &datKey, DcmDirectoryRecord *record, const DcmTagKey &recKey, const OFString &sourceFilename, const OFBool errorMsg) { OFBool result = OFFalse; /* check parameters first */ if ((dataset != NULL) && (record != NULL)) { OFString datasetString, recordString; /* compare string value from dataset and record */ result = compare(getStringFromDataset(dataset, datKey, datasetString), getStringFromDataset(record, recKey, recordString)); if (!result) { OFString uniqueString; OFString originFilename = OFSTRING_GUARD(record->getRecordsOriginFile()); const DcmTagKey uniqueKey = getRecordUniqueKey(record->getRecordType()); getStringFromDataset(record, uniqueKey, uniqueString); if (originFilename.empty()) originFilename = ""; /* create warning message */ OFOStringStream oss; oss << "file inconsistent with existing DICOMDIR record" << OFendl; oss << " " << recordTypeToName(record->getRecordType()) << " Record [Key: " << DcmTag(uniqueKey).getTagName() << " " << uniqueKey << "=\"" << uniqueString << "\"]" << OFendl; oss << " Existing Record (origin: " << originFilename << ") defines: " << OFendl; oss << " " << DcmTag(recKey).getTagName() << " " << recKey << "=\"" << recordString << "\"" << OFendl; oss << " File (" << sourceFilename << ") defines:" << OFendl; oss << " " << DcmTag(datKey).getTagName() << " " << datKey << "=\"" << datasetString << "\"" << OFendl; oss << OFStringStream_ends; OFSTRINGSTREAM_GETSTR(oss, tmpString) if (errorMsg) DCMDATA_ERROR(tmpString); else DCMDATA_WARN(tmpString); OFSTRINGSTREAM_FREESTR(tmpString) } } return result; } // compare sequence attributes from dataset and record and report any deviation OFBool DicomDirInterface::compareSequenceAttributes(DcmItem *dataset, DcmTagKey &key, DcmDirectoryRecord *record, const OFString &sourceFilename) { OFBool result = OFFalse; /* check parameters first */ if ((dataset != NULL) && (record != NULL)) { DcmSequenceOfItems *seq1, *seq2; /* compare sequence value from dataset and record */ if (record->findAndGetSequence(key, seq1).good() && dataset->findAndGetSequence(key, seq2).good()) { OFString reason; result = compareSQAttributes(seq1, seq2, reason); if (!result) { OFString uniqueString; OFString originFilename = OFSTRING_GUARD(record->getRecordsOriginFile()); const DcmTagKey uniqueKey = getRecordUniqueKey(record->getRecordType()); getStringFromDataset(record, uniqueKey, uniqueString); if (originFilename.empty()) originFilename = ""; /* create warning message */ DCMDATA_WARN("file inconsistent with existing DICOMDIR record" << OFendl << " " << recordTypeToName(record->getRecordType()) << " Record [Key: " << DcmTag(uniqueKey).getTagName() << " " << uniqueKey << "=\"" << uniqueString << "\"]" << OFendl << " Reason: " << reason << OFendl << " Existing Record (origin: " << originFilename << ") defines: " << OFendl << DcmObject::PrintHelper(*seq1, 0, 4 /* indent */) << " File (" << sourceFilename << ") defines:" << OFendl << DcmObject::PrintHelper(*seq2, 0, 4 /* indent */)); } } } return result; } // set the specified default value (number or prefix and number) to the given tag void DicomDirInterface::setDefaultValue(DcmDirectoryRecord *record, const DcmTagKey &key, const unsigned long number, const char *prefix) { if (record != NULL) { char buffer[64]; if (prefix != NULL) { /* use at most 10 chars from prefix */ OFStandard::strlcpy(buffer, prefix, 10 + 1); /* append a 6 digits number */ sprintf(buffer + strlen(buffer), "%06lu", number); } else { /* create a number string only */ sprintf(buffer, "%lu", number); } record->putAndInsertString(key, buffer); /* create warning message */ DCMDATA_WARN(recordTypeToName(record->getRecordType()) << " Record (origin: " << OFSTRING_GUARD(record->getRecordsOriginFile()) << ") inventing " << DcmTag(key).getTagName() << ": " << buffer); } } /* * CVS/RCS Log: * $Log: dcddirif.cc,v $ * Revision 1.56 2010-11-15 12:57:20 uli * Removed a useless and potentially dangerous use of sscanf(). * * Revision 1.55 2010-11-09 09:50:42 joergr * Added check whether all type 1 attributes are really present and have a * non-empty value; this check was missing for the following record types: * HANGING PROTOCOL, PALETTE, IMPLANT, IMPLANT GROUP, IMPLANT ASSY. * * Revision 1.54 2010-11-08 09:49:03 uli * Fixed even more gcc warnings caused by additional compiler flags. * * Revision 1.53 2010-11-08 09:15:57 joergr * Fixed inconsistency in the list of attributes for the implant group directory * record (this has been corrected with the "FT2" version of Supplement 131). * * Revision 1.52 2010-11-05 13:11:16 joergr * Added support for new directory record types IMPLANT, IMPLANT GROUP and * IMPLANT ASSY from Supplement 131 (Implant Templates). * * Revision 1.51 2010-11-05 10:30:08 joergr * Added support for new Implantation Plan SR Document Storage SOP Class. * * Revision 1.50 2010-10-20 07:41:34 uli * Made sure isalpha() & friends are only called with valid arguments. * * Revision 1.49 2010-10-14 13:14:07 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.48 2010-10-04 09:49:39 joergr * Further enhancements on BlendingSequence (e.g. check whether it exists before * trying to copy certain data elements from it). * * Revision 1.47 2010-10-01 14:01:56 joergr * Added support for the BlendingSequence required for directory records of the * Blending Softcopy Presentation State Storage SOP Class. * * Revision 1.46 2010-10-01 08:09:34 joergr * Added support for new non-image Storage SOP Classes that require the new * directory record type MEASUREMENT. Also fixed issues with other record types. * * Revision 1.45 2010-09-30 17:18:15 joergr * Added support for new non-image Storage SOP Classes that require the new * directory record types PALETTE and SURFACE. Also updated existing records. * * Revision 1.44 2010-09-30 07:53:23 joergr * Fixed typo in the name of a Storage SOP Class (copied from DICOM part 6). * * Revision 1.43 2010-09-28 08:45:08 joergr * Added new non-image Storage SOP Classes that do not require a new directory * record type (e.g. SR DOCUMENT and WAVEFORM). * * Revision 1.42 2010-09-27 15:02:42 joergr * Added newly introduced multi-frame image SOP classes to DVD MPEG2 profile. * * Revision 1.41 2010-09-24 13:24:37 joergr * Compared names of SOP Class UIDs with 2009 edition of the DICOM standard. The * resulting name changes are mainly caused by the fact that the corresponding * SOP Class is now retired. * * Revision 1.40 2010-08-10 11:59:31 uli * Fixed some cases where dcmFindNameOfUID() returning NULL could cause crashes. * * Revision 1.39 2010-08-09 13:01:22 joergr * Updated data dictionary to 2009 edition of the DICOM standard. From now on, * the official "keyword" is used for the attribute name which results in a * number of minor changes (e.g. "PatientsName" is now called "PatientName"). * * Revision 1.38 2010-07-21 14:25:55 joergr * Made sure that no NULL pointer is passed to the OFString constructor. * * Revision 1.37 2010-07-07 09:20:44 onken * Changed binary OR to logical OR (error introduced by last commit). * * Revision 1.36 2010-07-07 07:28:38 onken * Added Ophthalmic Tomography Image Storage to list of supported SOP classes. * * Revision 1.35 2010-06-02 13:03:12 joergr * Introduced new helper function strerror() which is used as a wrapper to the * various approaches found on different systems. * * Revision 1.34 2010-06-02 12:41:38 joergr * Appended missing OFStringStream_ends to the end of output streams because * this is required when OFOStringStream is mapped to ostrstream. * * Revision 1.33 2009-11-25 13:30:51 joergr * Adapted code for new approach to access individual frames of a DICOM image. * * Revision 1.32 2009-11-13 13:11:20 joergr * Fixed minor issues in log output. * * Revision 1.31 2009-11-04 09:58:09 uli * Switched to logging mechanism provided by the "new" oflog module * * Revision 1.30 2009-08-26 07:46:22 joergr * Added parentheses around && within || in order to avoid warnings reported by * gcc 4.3.2. * * Revision 1.29 2009-02-23 13:28:16 joergr * Fixed issue with checking of DICOM input files (wrong handling of OFCondition * return value). * * Revision 1.28 2009-01-15 10:19:03 joergr * Do not reject compressed images if corresponding decoder is not registered * but no icon images are to be created anyway. * Added check whether (possibly required) JPEG 2000 decoder is registered. * * Revision 1.27 2008-06-23 12:09:51 joergr * Added check on value representation of data elements copied from the * referenced DICOM file to the DICOMDIR (compare VR with data dictionary). * * Revision 1.26 2008-04-30 12:38:42 meichel * Fixed compile errors due to changes in attribute tag names * * Revision 1.25 2008-02-27 09:54:30 joergr * Check HAVE_CHARP_STRERROR_R in order to use the correct version of * strerror_r(). * * Revision 1.24 2007/06/08 14:57:56 joergr * Replaced helper function findAndCopyElement() by new optional parameter * 'createCopy' in various findAndGetXXX() functions. * * Revision 1.23 2007/04/26 16:39:55 joergr * Fixed issue with SpecificCharacterSet attribute (treat as type 1C instead of * type 1 when copying from the referenced DICOM file to the directory record). * * Revision 1.22 2007/02/02 15:59:53 joergr * Added warning message when existing SOP instance is added to DICOMDIR in * create or append mode. * Added error message when existing SOP instance is inconsistent with new * directory record in update mode (e.g. different SOP class UID). * Fixed incomplete warning message in update mode (filename was missing). * * Revision 1.21 2007/01/16 12:47:42 joergr * Now treating PatientID, StudyID and SeriesNumber as type 1C elements instead * of 1 in order to avoid unwanted overwriting with empty value in update mode. * * Revision 1.20 2007/01/10 13:09:23 joergr * Added new option that enables support for retired SOP classes. * Added missing transfer syntax to X-ray Angiographic DVD profile. * * Revision 1.19 2006/12/15 16:27:44 joergr * Added new option that allows to update existing entries in a DICOMDIR. This * also adds support for mixed media stored application profiles. * Changed name of enum value for the MPEG2-DVD application profile in order to * be more consistent with other names. * Slightly revised handling of type 1, 1C and 2 elements in directory records. * Fixed bug in cardiac application profiles when checking the ImageType * (0008,0008) for BIPLANE images. * Added check whether the SpecificCharacterSet (0008,0005) is really required * for a particular directory record. * Fixed bug that prevented Key Object Selection Documents from being added to * a DICOMDIR. * * Revision 1.18 2006/08/15 15:49:54 meichel * Updated all code in module dcmdata to correctly compile when * all standard C++ classes remain in namespace std. * * Revision 1.17 2006/07/27 13:09:25 joergr * Added support for DICOMDIR record type "STEREOMETRIC" (CP 628). * Added full support for X-Ray Radiation Dose SR documents and Real World Value * Mapping objects to DICOMDIR. Renamed ERT_StructReport to ERT_SRDocument. * * Revision 1.16 2005/12/15 15:40:18 joergr * Removed unsused parameter. * * Revision 1.15 2005/12/08 15:41:00 meichel * Changed include path schema for all DCMTK header files * * Revision 1.14 2005/10/27 13:40:06 joergr * Added support for Encapsulated Document, Real World Value Mapping and * Hanging Protocol objects to DICOMDIR tools. * Added support for new Color Presentation State objects to DICOMDIR tools. * Minor code changes, e.g. reworked handling of type 2 attributes. * * Revision 1.13 2005/10/25 08:55:34 meichel * Updated list of UIDs and added support for new transfer syntaxes * and storage SOP classes. * * Revision 1.12 2005/06/13 14:46:05 joergr * Fixed typo. * * Revision 1.11 2005/06/13 14:39:07 joergr * Added new options to disable check on pixel encoding and transfer syntax. * Fixed bug: Images with non-standard spatial resolution were rejected even * if "Resolution Check" was disabled. * * Revision 1.10 2005/03/09 17:54:54 joergr * Added support for new Media Storage Application Profiles according to DICOM * PS 3.12-2004. Removed support for non-standard conformant "No profile". * Added support for UTF-8 for the contents of the fileset descriptor file. * * Revision 1.9 2004/04/16 12:55:53 joergr * Minor modifications to keep Sun CC 2.0.1 happy. * * Revision 1.8 2004/04/14 11:52:57 joergr * Changed type of integer variable, added explicit type cast and introduced * default case to switch statement to keep Sun CC 2.0.1 quiet. * * Revision 1.7 2004/04/06 18:04:30 joergr * Added missing suffix "TransferSyntax" to some transfer syntax constants. * * Revision 1.6 2004/02/13 17:36:54 joergr * Added support for new directory records RAW DATA and SPECTROSCOPY introduced * with CP 343. * * Revision 1.5 2004/02/13 14:16:41 joergr * Added support for new directory records REGISTRATION and FIDUCIAL introduced * with supplement 73 (Spatial Registration Storage SOP Classes). * Added support for Procedure Log Storage SOP class (supplement 66). * * Revision 1.4 2004/02/13 11:48:13 joergr * Adapted code for changed tag names (e.g. PresentationLabel -> ContentLabel). * * Revision 1.3 2003/11/10 10:39:49 joergr * Enhanced detection of invalid filenames: forbid leading path separator, i.e. * absolute pathnames. * * Revision 1.2 2003/11/05 18:32:23 joergr * Fixed bug that prevented the addition of DICOM files missing the "sort key" * (e.g. InstanceNumber). * * Revision 1.1 2003/08/12 14:37:36 joergr * Added new interface class for simplified creation of a DICOMDIR. * * */ dcmtk-3.6.0/dcmdata/libsrc/dcvrst.cc0000644000310500011400000001554511457616142016547 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Gerd Ehlers * * Purpose: Implementation of class DcmShortText * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-20 16:44:18 $ * CVS/RCS Revision: $Revision: 1.21 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcvrst.h" // ******************************** DcmShortText::DcmShortText(const DcmTag &tag, const Uint32 len) : DcmCharString(tag, len) { setMaxLength(1024); } DcmShortText::DcmShortText(const DcmShortText &old) : DcmCharString(old) { } DcmShortText::~DcmShortText() { } DcmShortText &DcmShortText::operator=(const DcmShortText &obj) { DcmCharString::operator=(obj); return *this; } OFCondition DcmShortText::copyFrom(const DcmObject& rhs) { if (this != &rhs) { if (rhs.ident() != ident()) return EC_IllegalCall; *this = OFstatic_cast(const DcmShortText &, rhs); } return EC_Normal; } // ******************************** DcmEVR DcmShortText::ident() const { return EVR_ST; } OFCondition DcmShortText::checkValue(const OFString & /*vm*/, const OFBool /*oldFormat*/) { OFString strVal; /* get "raw value" without any modifications (if possible) */ OFCondition l_error = getStringValue(strVal); if (l_error.good()) l_error = DcmShortText::checkStringValue(strVal); return l_error; } unsigned long DcmShortText::getVM() { /* value multiplicity is 1 for non-empty string, 0 otherwise */ return (getRealLength() > 0) ? 1 : 0; } // ******************************** OFCondition DcmShortText::getOFString(OFString &stringVal, const unsigned long /*pos*/, OFBool normalize) { /* treat backslash as a normal character */ return getOFStringArray(stringVal, normalize); } OFCondition DcmShortText::getOFStringArray(OFString &stringVal, OFBool normalize) { /* get string value without handling the "\" as a delimiter */ OFCondition l_error = getStringValue(stringVal); if (l_error.good() && normalize) normalizeString(stringVal, !MULTIPART, !DELETE_LEADING, DELETE_TRAILING); return l_error; } // ******************************** OFCondition DcmShortText::checkStringValue(const OFString &value) { return DcmByteString::checkStringValue(value, "" /* vm */, "lt", 14 /*, maxLength: 1024 characters */); } /* ** CVS/RCS Log: ** $Log: dcvrst.cc,v $ ** Revision 1.21 2010-10-20 16:44:18 joergr ** Use type cast macros (e.g. OFstatic_cast) where appropriate. ** ** Revision 1.20 2010-10-14 13:14:11 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.19 2010-04-23 14:30:35 joergr ** Added new method to all VR classes which checks whether the stored value ** conforms to the VR definition and to the specified VM. ** ** Revision 1.18 2009-08-03 09:03:00 joergr ** Added methods that check whether a given string value conforms to the VR and ** VM definitions of the DICOM standards. ** ** Revision 1.17 2008-07-17 10:31:32 onken ** Implemented copyFrom() method for complete DcmObject class hierarchy, which ** permits setting an instance's value from an existing object. Implemented ** assignment operator where necessary. ** ** Revision 1.16 2007-06-29 14:17:49 meichel ** Code clean-up: Most member variables in module dcmdata are now private, ** not protected anymore. ** ** Revision 1.15 2005/12/08 15:42:04 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.14 2004/01/16 13:47:37 joergr ** Removed acknowledgements with e-mail addresses from CVS log. ** Added missing #include "osconfig.h". ** ** Revision 1.13 2002/12/06 13:05:52 joergr ** Fixed bug in Unlimited Text (UT) class: the backslash character was treated ** as a component separator which is wrong according to the DICOM standard. ** The same bug was found in class Long Text (LT) and Short Text (ST). Also ** changed the behaviour of the getVM() method; now returns 1 only in case of ** non-empty string values. ** Made source code formatting more consistent with other modules/files. ** ** Revision 1.12 2002/04/25 10:33:40 joergr ** Added/modified getOFStringArray() implementation. ** ** Revision 1.11 2001/09/25 17:20:01 meichel ** Adapted dcmdata to class OFCondition ** ** Revision 1.10 2001/06/01 15:49:20 meichel ** Updated copyright header ** ** Revision 1.9 2000/03/08 16:26:51 meichel ** Updated copyright header. ** ** Revision 1.8 1999/03/31 09:25:59 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.7 1998/11/12 16:48:29 meichel ** Implemented operator= for all classes derived from DcmObject. ** ** Revision 1.6 1997/08/29 13:11:49 andreas ** Corrected Bug in getOFStringArray Implementation ** ** Revision 1.5 1997/08/29 08:33:01 andreas ** - Added methods getOFString and getOFStringArray for all ** string VRs. These methods are able to normalise the value, i. e. ** to remove leading and trailing spaces. This will be done only if ** it is described in the standard that these spaces are not relevant. ** These methods do not test the strings for conformance, this means ** especially that they do not delete spaces where they are not allowed! ** getOFStringArray returns the string with all its parts separated by \ ** and getOFString returns only one value of the string. ** CAUTION: Currently getString returns a string with trailing ** spaces removed (if dcmEnableAutomaticInputDataCorrection == OFTrue) and ** truncates the original string (since it is not copied!). If you rely on this ** behaviour please change your application now. ** Future changes will ensure that getString returns the original ** string from the DICOM object (NULL terminated) inclusive padding. ** Currently, if you call getOF... before calling getString without ** normalisation, you can get the original string read from the DICOM object. ** ** Revision 1.4 1997/07/03 15:10:19 andreas ** - removed debugging functions Bdebug() and Edebug() since ** they write a static array and are not very useful at all. ** Cdebug and Vdebug are merged since they have the same semantics. ** The debugging functions in dcmdata changed their interfaces ** (see dcmdata/include/dcdebug.h) ** ** Revision 1.3 1996/01/05 13:27:54 andreas ** - changed to support new streaming facilities ** - unique read/write methods for file and block transfer ** - more cleanups ** */ dcmtk-3.6.0/dcmdata/libsrc/dchashdi.cc0000644000310500011400000004412711466504671017012 0ustar joergrdicom3/* * * Copyright (C) 1997-2010, 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: dcmdata * * Author: Andrew Hewett * * Purpose: Hash table interface for DICOM data dictionary * * Last Update: $Author: uli $ * Update Date: $Date: 2010-11-10 12:02:01 $ * CVS/RCS Revision: $Revision: 1.26 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dchashdi.h" #include "dcmtk/dcmdata/dcdicent.h" #define INCLUDE_CSTDIO #define INCLUDE_CASSERT #include "dcmtk/ofstd/ofstdinc.h" /* ** DcmDictEntryList */ DcmDictEntryList::~DcmDictEntryList() { clear(); } void DcmDictEntryList::clear() { while (!empty()) { delete front(); pop_front(); } } DcmDictEntry* DcmDictEntryList::insertAndReplace(DcmDictEntry* e) { if (empty()) { push_front(e); } else { DcmDictEntryListIterator iter(begin()); DcmDictEntryListIterator last(end()); Uint32 eHash = e->hash(); Uint32 iterHash = 0; // insert smallest first for (iter = begin(); iter != last; ++iter) { iterHash = (*iter)->hash(); if (eHash == iterHash) { if (e->privateCreatorMatch(**iter)) { // entry is already there so replace it DcmDictEntry* oldEntry = *iter; *iter = e; return oldEntry; } else { // insert before listEntry insert(iter, e); return NULL; } } else if (eHash < iterHash) { // insert before listEntry insert(iter, e); return NULL; } } // add to end push_back(e); } return NULL; } DcmDictEntry *DcmDictEntryList::find(const DcmTagKey& k, const char *privCreator) { if (!empty()) { DcmDictEntryListIterator iter; DcmDictEntryListIterator last = end(); Uint32 kHash = k.hash(); Uint32 iterHash = 0; for (iter = begin(); iter != last; ++iter) { iterHash = (*iter)->hash(); if ((iterHash == kHash) && (*iter)->privateCreatorMatch(privCreator)) { return *iter; } else if (iterHash > kHash) { return NULL; // not there } } } return NULL; } /* ** DcmHashDictIterator */ void DcmHashDictIterator::init(const DcmHashDict* d, OFBool atEnd) { dict = d; hindex = 0; iterating = OFFalse; if (dict != NULL) { if (atEnd) { hindex = dict->highestBucket; if (dict->size() > 0) { iter = dict->hashTab[hindex]->end(); iterating = OFTrue; } } else { hindex = dict->lowestBucket; if (dict->size() > 0) { iter = dict->hashTab[hindex]->begin(); iterating = OFTrue; } } } } void DcmHashDictIterator::stepUp() { assert(dict != NULL); while (hindex <= dict->highestBucket) { DcmDictEntryList* bucket = dict->hashTab[hindex]; if (bucket == NULL) { if (hindex == dict->highestBucket) return; /* We reached the end of the dictionary */ hindex++; // move on to next bucket iterating = OFFalse; } else { if (!iterating) { iter = bucket->begin(); iterating = OFTrue; if (iter != bucket->end()) { return; /* we have found the next one */ } } if (iter == bucket->end()) { if (hindex == dict->highestBucket) return; /* We reached the end of the dictionary */ iterating = OFFalse; hindex++; } else { ++iter; if (iter != bucket->end()) { return; /* we have found the next one */ } } } } } /* ** DcmHashDict */ void DcmHashDict::_init(int hashTabLen) { hashTab = new DcmDictEntryList*[hashTabLen]; assert(hashTab != NULL); hashTabLength = hashTabLen; for (int i=0; igetGroup()) { /* the code in this switch statement was generated automatically */ case 0x0: /* %usage: 3.47 */ lower = int(0 * hashTabLength); upper = int(0.0346608 * hashTabLength); break; case 0x2: /* %usage: 0.74 */ lower = int(0.0346608 * hashTabLength); upper = int(0.0420354 * hashTabLength); break; case 0x4: /* %usage: 1.40 */ lower = int(0.0420354 * hashTabLength); upper = int(0.0560472 * hashTabLength); break; case 0x8: /* %usage: 7.30 */ lower = int(0.0560472 * hashTabLength); upper = int(0.129056 * hashTabLength); break; case 0x10: /* %usage: 2.43 */ lower = int(0.129056 * hashTabLength); upper = int(0.153392 * hashTabLength); break; case 0x18: /* %usage: 18.36 */ lower = int(0.153392 * hashTabLength); upper = int(0.337021 * hashTabLength); break; case 0x20: /* %usage: 3.98 */ lower = int(0.337021 * hashTabLength); upper = int(0.376844 * hashTabLength); break; case 0x28: /* %usage: 8.63 */ lower = int(0.376844 * hashTabLength); upper = int(0.463127 * hashTabLength); break; case 0x32: /* %usage: 1.92 */ lower = int(0.463127 * hashTabLength); upper = int(0.482301 * hashTabLength); break; case 0x38: /* %usage: 1.62 */ lower = int(0.482301 * hashTabLength); upper = int(0.498525 * hashTabLength); break; case 0x40: /* %usage: 6.93 */ lower = int(0.498525 * hashTabLength); upper = int(0.567847 * hashTabLength); break; case 0x41: /* %usage: 2.29 */ lower = int(0.567847 * hashTabLength); upper = int(0.590708 * hashTabLength); break; case 0x50: /* %usage: 0.59 */ lower = int(0.590708 * hashTabLength); upper = int(0.596608 * hashTabLength); break; case 0x54: /* %usage: 5.75 */ lower = int(0.596608 * hashTabLength); upper = int(0.65413 * hashTabLength); break; case 0x88: /* %usage: 0.59 */ lower = int(0.65413 * hashTabLength); upper = int(0.660029 * hashTabLength); break; case 0x1000: /* %usage: 0.52 */ lower = int(0.660029 * hashTabLength); upper = int(0.665192 * hashTabLength); break; case 0x1010: /* %usage: 0.15 */ lower = int(0.665192 * hashTabLength); upper = int(0.666667 * hashTabLength); break; case 0x2000: /* %usage: 0.59 */ lower = int(0.666667 * hashTabLength); upper = int(0.672566 * hashTabLength); break; case 0x2010: /* %usage: 1.18 */ lower = int(0.672566 * hashTabLength); upper = int(0.684366 * hashTabLength); break; case 0x2020: /* %usage: 0.59 */ lower = int(0.684366 * hashTabLength); upper = int(0.690265 * hashTabLength); break; case 0x2030: /* %usage: 0.22 */ lower = int(0.690265 * hashTabLength); upper = int(0.692478 * hashTabLength); break; case 0x2040: /* %usage: 0.66 */ lower = int(0.692478 * hashTabLength); upper = int(0.699115 * hashTabLength); break; case 0x2050: /* %usage: 0.22 */ lower = int(0.699115 * hashTabLength); upper = int(0.701327 * hashTabLength); break; case 0x2100: /* %usage: 0.81 */ lower = int(0.701327 * hashTabLength); upper = int(0.70944 * hashTabLength); break; case 0x2110: /* %usage: 0.37 */ lower = int(0.70944 * hashTabLength); upper = int(0.713127 * hashTabLength); break; case 0x2120: /* %usage: 0.29 */ lower = int(0.713127 * hashTabLength); upper = int(0.716077 * hashTabLength); break; case 0x2130: /* %usage: 0.66 */ lower = int(0.716077 * hashTabLength); upper = int(0.722714 * hashTabLength); break; case 0x3002: /* %usage: 1.25 */ lower = int(0.722714 * hashTabLength); upper = int(0.735251 * hashTabLength); break; case 0x3004: /* %usage: 1.62 */ lower = int(0.735251 * hashTabLength); upper = int(0.751475 * hashTabLength); break; case 0x3006: /* %usage: 3.24 */ lower = int(0.751475 * hashTabLength); upper = int(0.783923 * hashTabLength); break; case 0x300a: /* %usage: 16.52 */ lower = int(0.783923 * hashTabLength); upper = int(0.949115 * hashTabLength); break; case 0x300c: /* %usage: 1.84 */ lower = int(0.949115 * hashTabLength); upper = int(0.967552 * hashTabLength); break; case 0x300e: /* %usage: 0.29 */ lower = int(0.967552 * hashTabLength); upper = int(0.970501 * hashTabLength); break; case 0x4000: /* %usage: 0.22 */ lower = int(0.970501 * hashTabLength); upper = int(0.972714 * hashTabLength); break; case 0x4008: /* %usage: 2.06 */ lower = int(0.972714 * hashTabLength); upper = int(0.993363 * hashTabLength); break; case 0x7fe0: /* %usage: 0.37 */ lower = int(0.993363 * hashTabLength); upper = int(0.99705 * hashTabLength); break; case 0xfffc: /* %usage: 0.07 */ lower = int(0.99705 * hashTabLength); upper = int(0.997788 * hashTabLength); break; case 0xfffe: /* %usage: 0.22 */ lower = int(0.997788 * hashTabLength); upper = int(1 * hashTabLength); break; default: lower = 0; /* default */ upper = hashTabLength-1; /* default */ break; } int span = upper - lower; int offset = 0; if (span > 0) { offset = OFstatic_cast(int, (k->hash() & 0x7FFFFFFF) % span); } h = lower + offset; assert((h >= 0) && (h < hashTabLength)); return h; } DcmDictEntry* DcmHashDict::insertInList(DcmDictEntryList& l, DcmDictEntry* e) { return l.insertAndReplace(e); } void DcmHashDict::put(DcmDictEntry* e) { int idx = hash(e); DcmDictEntryList* bucket = hashTab[idx]; // if there is no bucket then create one if (bucket == NULL) { bucket = new DcmDictEntryList; assert(bucket != NULL); hashTab[idx] = bucket; } DcmDictEntry* old = insertInList(*bucket, e); if (old != NULL) { /* an old entry has been replaced */ #ifdef PRINT_REPLACED_DICTIONARY_ENTRIES DCMDATA_WARN("replacing " << *old); #endif delete old; } else { entryCount++; } lowestBucket = (lowestBucketidx)?(highestBucket):(idx); } DcmDictEntry *DcmHashDict::findInList(DcmDictEntryList& l, const DcmTagKey& k, const char *privCreator) const { return l.find(k, privCreator); } const DcmDictEntry* DcmHashDict::get(const DcmTagKey& k, const char *privCreator) const { const DcmDictEntry* entry = NULL; // first we look for an entry that exactly matches the given tag key Uint32 idx = hash(&k); DcmDictEntryList* bucket = hashTab[idx]; if (bucket) entry = findInList(*bucket, k, privCreator); if ((entry == NULL) && privCreator) { // As a second guess, we look for a private tag with flexible element number. DcmTagKey tk(k.getGroup(), OFstatic_cast(unsigned short, k.getElement() & 0xff)); idx = hash(&tk); bucket = hashTab[idx]; if (bucket) entry = findInList(*bucket, tk, privCreator); } return entry; } DcmDictEntry* DcmHashDict::removeInList(DcmDictEntryList& l, const DcmTagKey& k, const char *privCreator) { DcmDictEntry* entry = findInList(l, k, privCreator); l.remove(entry); // does not delete entry return entry; } void DcmHashDict::del(const DcmTagKey& k, const char *privCreator) { Uint32 idx = hash(&k); DcmDictEntryList* bucket = hashTab[idx]; if (bucket != NULL) { DcmDictEntry* entry = removeInList(*bucket, k, privCreator); delete entry; } } STD_NAMESPACE ostream& DcmHashDict::loadSummary(STD_NAMESPACE ostream& out) { out << "DcmHashDict: size=" << hashTabLength << ", total entries=" << size() << OFendl; DcmDictEntryList* bucket = NULL; int largestBucket = 0; for (int i=0; isize()) > largestBucket) { largestBucket = bucket->size(); } } } for (int j=0; jsize() << " entries" << OFendl; } } out << "Bucket Sizes" << OFendl; int n, x, k, l_size; for (x=0; x<=largestBucket; x++) { n = 0; for (k=0; ksize(); } if (l_size == x) { n++; } } out << " entries{" << x << "}: " << n << " buckets" << OFendl; } return out; } /* ** CVS/RCS Log: ** $Log: dchashdi.cc,v $ ** Revision 1.26 2010-11-10 12:02:01 uli ** Made DcmHashDictIterator::stepUp correctly stop at the end of the dict. ** ** Revision 1.25 2010-10-14 13:14:08 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.24 2010-02-22 11:39:54 uli ** Remove some unneeded includes. ** ** Revision 1.23 2009-11-10 12:38:29 uli ** Fix compilation on windows. ** ** Revision 1.22 2009-11-04 09:58:09 uli ** Switched to logging mechanism provided by the "new" oflog module ** ** Revision 1.21 2006-08-15 15:49:54 meichel ** Updated all code in module dcmdata to correctly compile when ** all standard C++ classes remain in namespace std. ** ** Revision 1.20 2005/12/08 15:41:11 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.19 2004/02/04 16:33:02 joergr ** Adapted type casts to new-style typecast operators defined in ofcast.h. ** ** Revision 1.18 2003/06/02 16:58:01 meichel ** Renamed local variables to avoid name clashes with STL ** ** Revision 1.17 2003/03/21 13:08:04 meichel ** Minor code purifications for warnings reported by MSVC in Level 4 ** ** Revision 1.16 2002/11/27 12:06:47 meichel ** Adapted module dcmdata to use of new header file ofstdinc.h ** ** Revision 1.15 2002/07/23 14:21:33 meichel ** Added support for private tag data dictionaries to dcmdata ** ** Revision 1.14 2001/06/01 15:49:04 meichel ** Updated copyright header ** ** Revision 1.13 2000/10/12 10:26:52 meichel ** Updated data dictionary for 2000 edition of the DICOM standard ** ** Revision 1.12 2000/05/03 14:19:09 meichel ** Added new class GlobalDcmDataDictionary which implements read/write lock ** semantics for safe access to the DICOM dictionary from multiple threads ** in parallel. The global dcmDataDict now uses this class. ** ** Revision 1.11 2000/04/14 16:16:22 meichel ** Dcmdata library code now consistently uses ofConsole for error output. ** ** Revision 1.10 2000/03/08 16:26:36 meichel ** Updated copyright header. ** ** Revision 1.9 2000/03/03 14:05:33 meichel ** Implemented library support for redirecting error messages into memory ** instead of printing them to stdout/stderr for GUI applications. ** ** Revision 1.8 2000/02/02 14:32:51 joergr ** Replaced 'delete' statements by 'delete[]' for objects created with 'new[]'. ** ** Revision 1.7 1999/03/31 09:25:29 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.6 1999/03/22 09:58:32 meichel ** Fixed bug in data dictionary causing a segmentation fault ** if dictionary was cleared and a smaller version reloaded. ** ** Revision 1.5 1998/07/28 15:52:37 meichel ** Introduced new compilation flag PRINT_REPLACED_DICTIONARY_ENTRIES ** which causes the dictionary to display all duplicate entries. ** ** Revision 1.4 1998/07/15 15:51:57 joergr ** Removed several compiler warnings reported by gcc 2.8.1 with ** additional options, e.g. missing copy constructors and assignment ** operators, initialization of member variables in the body of a ** constructor instead of the member initialization list, hiding of ** methods by use of identical names, uninitialized member variables, ** missing const declaration of char pointers. Replaced tabs by spaces. ** ** Revision 1.3 1998/06/29 12:17:57 meichel ** Removed some name clashes (e.g. local variable with same ** name as class member) to improve maintainability. ** Applied some code purifications proposed by the gcc 2.8.1 -Weffc++ option. ** ** Revision 1.2 1997/09/18 08:10:54 meichel ** Many minor type conflicts (e.g. long passed as int) solved. ** ** Revision 1.1 1997/08/26 13:35:02 hewett ** Initial Version - Implementation of hash table for data dictionary. ** */ dcmtk-3.6.0/dcmdata/libsrc/dcvrat.cc0000644000310500011400000003336011457616141016517 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Gerd Ehlers, Andreas Barth * * Purpose: Implementation of class DcmAttributeTag * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-20 16:44:17 $ * CVS/RCS Revision: $Revision: 1.33 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/ofstd/ofstream.h" #include "dcmtk/dcmdata/dcvrat.h" #include "dcmtk/dcmdata/dcvm.h" #define INCLUDE_CSTDIO #define INCLUDE_CSTRING #include "dcmtk/ofstd/ofstdinc.h" // ******************************** DcmAttributeTag::DcmAttributeTag(const DcmTag &tag, const Uint32 len) : DcmElement(tag, len) { } DcmAttributeTag::DcmAttributeTag(const DcmAttributeTag &old) : DcmElement(old) { } DcmAttributeTag::~DcmAttributeTag() { } DcmAttributeTag &DcmAttributeTag::operator=(const DcmAttributeTag &obj) { DcmElement::operator=(obj); return *this; } OFCondition DcmAttributeTag::copyFrom(const DcmObject& rhs) { if (this != &rhs) { if (rhs.ident() != ident()) return EC_IllegalCall; *this = OFstatic_cast(const DcmAttributeTag &, rhs); } return EC_Normal; } // ******************************** DcmEVR DcmAttributeTag::ident() const { return EVR_AT; } OFCondition DcmAttributeTag::checkValue(const OFString &vm, const OFBool /*oldFormat*/) { /* check VM only, further checks on the attribute tags could be added later */ return DcmElement::checkVM(getVM(), vm); } unsigned long DcmAttributeTag::getVM() { /* attribute tags store pairs of 16 bit values */ return OFstatic_cast(unsigned long, getLengthField() / (2 * sizeof(Uint16))); } // ******************************** void DcmAttributeTag::print(STD_NAMESPACE ostream& out, const size_t flags, const int level, const char * /*pixelFileName*/, size_t * /*pixelCounter*/) { if (valueLoaded()) { /* get unsigned integer data */ Uint16 *uintVals; errorFlag = getUint16Array(uintVals); const unsigned long count = getVM(); if ((uintVals != NULL) && (count > 0)) { /* determine number of values to be printed */ unsigned long expectedLength = count * (11 + 1) - 1; const unsigned long printCount = ((expectedLength > DCM_OptPrintLineLength) && (flags & DCMTypes::PF_shortenLongTagValues)) ? (DCM_OptPrintLineLength - 3 /* for "..." */ + 1) / (11 /* (gggg,eeee) */ + 1 /* for "\" */) : count; unsigned long printedLength = printCount * (11 + 1) - 1; /* print line start with tag and VR */ printInfoLineStart(out, flags, level); /* print multiple values */ if (printCount > 0) { out << STD_NAMESPACE hex << STD_NAMESPACE setfill('0'); /* print tag values (group,element) in hex mode */ out << '(' << STD_NAMESPACE setw(4) << (*(uintVals++)); out << ',' << STD_NAMESPACE setw(4) << (*(uintVals++)) << ')'; for (unsigned long i = 1; i < printCount; i++) { out << "\\" << '(' << STD_NAMESPACE setw(4) << (*(uintVals++)); out << ',' << STD_NAMESPACE setw(4) << (*(uintVals++)) << ')'; } /* reset i/o manipulators */ out << STD_NAMESPACE dec << STD_NAMESPACE setfill(' '); } /* print trailing "..." if data has been truncated */ if (printCount < count) { out << "..."; printedLength += 3; } /* print line end with length, VM and tag name */ printInfoLineEnd(out, flags, printedLength); } else printInfoLine(out, flags, level, "(no value available)"); } else printInfoLine(out, flags, level, "(not loaded)"); } // ******************************** OFCondition DcmAttributeTag::getTagVal(DcmTagKey &tagVal, const unsigned long pos) { /* get unsigned integer data */ Uint16 *uintValues; errorFlag = getUint16Array(uintValues); /* check data before returning */ if (errorFlag.good()) { if (uintValues == NULL) errorFlag = EC_IllegalCall; else if (pos >= getVM()) errorFlag = EC_IllegalParameter; else tagVal.set(uintValues[2 * pos] /*group*/, uintValues[2 * pos + 1] /*element*/); } /* clear value in case of error */ if (errorFlag.bad()) tagVal = DcmTagKey(); return errorFlag; } OFCondition DcmAttributeTag::getUint16Array(Uint16 *&uintVals) { uintVals = OFstatic_cast(Uint16 *, getValue()); return errorFlag; } // ******************************** OFCondition DcmAttributeTag::getOFString(OFString &stringVal, const unsigned long pos, OFBool /*normalize*/) { DcmTagKey tagVal; /* get the specified tag value */ errorFlag = getTagVal(tagVal, pos); if (errorFlag.good()) { /* ... and convert it to a character string */ char buffer[32]; sprintf(buffer, "(%4.4x,%4.4x)", tagVal.getGroup(), tagVal.getElement()); /* assign result */ stringVal = buffer; } return errorFlag; } // ******************************** OFCondition DcmAttributeTag::putTagVal(const DcmTagKey &tagVal, const unsigned long pos) { /* create tag data */ Uint16 uintVals[2]; uintVals[0] = tagVal.getGroup(); uintVals[1] = tagVal.getElement(); /* change element value */ errorFlag = changeValue(uintVals, 2 * sizeof(Uint16) * OFstatic_cast(Uint32, pos), 2 * sizeof(Uint16)); return errorFlag; } OFCondition DcmAttributeTag::putUint16Array(const Uint16 *uintVals, const unsigned long numUints) { errorFlag = EC_Normal; if (numUints > 0) { /* check for valid data */ if (uintVals != NULL) errorFlag = putValue(uintVals, 2 * sizeof(Uint16) * Uint32(numUints)); else errorFlag = EC_CorruptedData; } else errorFlag = putValue(NULL, 0); return errorFlag; } // ******************************** OFCondition DcmAttributeTag::putString(const char *stringVal) { errorFlag = EC_Normal; /* check input string */ if ((stringVal != NULL) && (strlen(stringVal) > 0)) { unsigned long vm = getVMFromString(stringVal); if (vm > 0) { Uint16 * field = new Uint16[2 * vm]; const char *s = stringVal; char *value; /* retrieve attribute tag data from character string */ for (unsigned long i = 0; (i < 2 * vm) && errorFlag.good(); i += 2) { /* get first value stored in 's', set 's' to beginning of the next value */ value = getFirstValueFromString(s); if ((value == NULL) || sscanf(value, "(%hx,%hx)", &field[i], &field[i + 1]) != 2) errorFlag = EC_CorruptedData; delete[] value; } /* set binary data as the element value */ if (errorFlag.good()) errorFlag = putUint16Array(field, vm); /* delete temporary buffer */ delete[] field; } else putValue(NULL, 0); } else putValue(NULL, 0); return errorFlag; } // ******************************** OFCondition DcmAttributeTag::verify(const OFBool autocorrect) { /* check for valid value length */ if (getLengthField() % (2 * sizeof(Uint16)) != 0) { errorFlag = EC_CorruptedData; if (autocorrect) { /* strip to valid length */ setLengthField(getLengthField() - (getLengthField() % (2* sizeof(Uint16)))); } } else errorFlag = EC_Normal; return errorFlag; } // ******************************** OFCondition DcmAttributeTag::checkStringValue(const OFString &value, const OFString &vm) { return DcmElement::checkVM(getVMFromString(value.c_str()), vm); } /* ** CVS/RCS Log: ** $Log: dcvrat.cc,v $ ** Revision 1.33 2010-10-20 16:44:17 joergr ** Use type cast macros (e.g. OFstatic_cast) where appropriate. ** ** Revision 1.32 2010-10-14 13:14:09 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.31 2010-04-23 14:30:34 joergr ** Added new method to all VR classes which checks whether the stored value ** conforms to the VR definition and to the specified VM. ** ** Revision 1.30 2008-07-17 10:31:32 onken ** Implemented copyFrom() method for complete DcmObject class hierarchy, which ** permits setting an instance's value from an existing object. Implemented ** assignment operator where necessary. ** ** Revision 1.29 2007-06-29 14:17:49 meichel ** Code clean-up: Most member variables in module dcmdata are now private, ** not protected anymore. ** ** Revision 1.28 2006/08/15 15:49:54 meichel ** Updated all code in module dcmdata to correctly compile when ** all standard C++ classes remain in namespace std. ** ** Revision 1.27 2005/12/08 15:41:47 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.26 2004/02/04 16:48:43 joergr ** Adapted type casts to new-style typecast operators defined in ofcast.h. ** Removed acknowledgements with e-mail addresses from CVS log. ** ** Revision 1.25 2003/10/09 13:51:52 joergr ** Fixed issue with the order of group and element number in print method. ** ** Revision 1.24 2003/03/25 17:11:34 joergr ** Fixed bug in print method: wrong position of setw() operators. ** ** Revision 1.23 2002/12/06 13:12:37 joergr ** Enhanced "print()" function by re-working the implementation and replacing ** the boolean "showFullData" parameter by a more general integer flag. ** Made source code formatting more consistent with other modules/files. ** ** Revision 1.22 2002/11/27 12:06:55 meichel ** Adapted module dcmdata to use of new header file ofstdinc.h ** ** Revision 1.21 2002/04/25 10:27:43 joergr ** Added getOFString() implementation. ** ** Revision 1.20 2002/04/16 13:43:23 joergr ** Added configurable support for C++ ANSI standard includes (e.g. streams). ** ** Revision 1.19 2001/09/25 17:19:55 meichel ** Adapted dcmdata to class OFCondition ** ** Revision 1.18 2001/06/01 15:49:14 meichel ** Updated copyright header ** ** Revision 1.17 2000/04/14 15:55:08 meichel ** Dcmdata library code now consistently uses ofConsole for error output. ** ** Revision 1.16 2000/03/08 16:26:45 meichel ** Updated copyright header. ** ** Revision 1.15 2000/03/03 14:05:38 meichel ** Implemented library support for redirecting error messages into memory ** instead of printing them to stdout/stderr for GUI applications. ** ** Revision 1.14 2000/02/10 10:52:23 joergr ** Added new feature to dcmdump (enhanced print method of dcmdata): write ** pixel data/item value fields to raw files. ** ** Revision 1.13 2000/02/02 14:32:55 joergr ** Replaced 'delete' statements by 'delete[]' for objects created with 'new[]'. ** ** Revision 1.12 1999/03/31 09:25:47 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.11 1997/07/21 08:25:32 andreas ** - Replace all boolean types (BOOLEAN, CTNBOOLEAN, DICOM_BOOL, BOOL) ** with one unique boolean type OFBool. ** ** Revision 1.10 1997/07/03 15:10:08 andreas ** - removed debugging functions Bdebug() and Edebug() since ** they write a static array and are not very useful at all. ** Cdebug and Vdebug are merged since they have the same semantics. ** The debugging functions in dcmdata changed their interfaces ** (see dcmdata/include/dcdebug.h) ** ** Revision 1.9 1997/04/18 08:17:19 andreas ** - The put/get-methods for all VRs did not conform to the C++-Standard ** draft. Some Compilers (e.g. SUN-C++ Compiler, Metroworks ** CodeWarrier, etc.) create many warnings concerning the hiding of ** overloaded get methods in all derived classes of DcmElement. ** So the interface of all value representation classes in the ** library are changed rapidly, e.g. ** OFCondition get(Uint16 & value, const unsigned long pos); ** becomes ** OFCondition getUint16(Uint16 & value, const unsigned long pos); ** All (retired) "returntype get(...)" methods are deleted. ** For more information see dcmdata/include/dcelem.h ** ** Revision 1.8 1996/08/05 08:46:18 andreas ** new print routine with additional parameters: ** - print into files ** - fix output length for elements ** corrected error in search routine with parameter ESM_fromStackTop ** ** Revision 1.7 1996/05/20 13:27:50 andreas ** correct minor bug in print routine ** ** Revision 1.6 1996/04/16 16:04:04 andreas ** - new put parameter DcmTagKey for DcmAttributeTag elements ** - better support for NULL element value ** ** Revision 1.5 1996/03/26 09:59:34 meichel ** corrected bug (deletion of const char *) which prevented compilation on NeXT ** ** Revision 1.4 1996/01/29 13:38:31 andreas ** - new put method for every VR to put value as a string ** - better and unique print methods ** ** Revision 1.3 1996/01/05 13:27:46 andreas ** - changed to support new streaming facilities ** - unique read/write methods for file and block transfer ** - more cleanups ** */ dcmtk-3.6.0/dcmdata/libsrc/dcwcache.cc0000644000310500011400000000564311455601043016771 0ustar joergrdicom3/* * * Copyright (C) 2007-2010, 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: dcmdata * * Author: Marco Eichelberg * * Purpose: Implementation of class DcmWriteCache * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:14:11 $ * CVS/RCS Revision: $Revision: 1.3 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcwcache.h" /* for class DcmWriteCache */ #include "dcmtk/dcmdata/dcelem.h" /* for class DcmElement */ #include "dcmtk/dcmdata/dcostrma.h" /* for class DcmOutputStream */ void DcmWriteCache::init(void *owner, Uint32 fieldLength, Uint32 bytesTransferred, E_ByteOrder byteOrder) { if (! buf_) { capacity_ = DcmWriteCacheBufsize; buf_ = new Uint8[capacity_]; } if (owner != owner_) { owner_ = owner; fieldLength_ = fieldLength; fieldOffset_ = bytesTransferred; byteOrder_ = byteOrder; offset_ = 0; numBytes_ = 0; } } OFCondition DcmWriteCache::fillBuffer(DcmElement& elem) { OFCondition result = EC_Normal; if (buf_) { // re-fill the buffer only if completely empty if (! numBytes_) { offset_ = 0; // compute the number of bytes to read - either buffer size or // the remaining number of bytes in the element, whatever is smaller Uint32 bytesToRead = fieldLength_ - fieldOffset_; if (bytesToRead > capacity_) bytesToRead = capacity_; result = elem.getPartialValue(buf_, fieldOffset_, bytesToRead, &fcache_, byteOrder_); if (result.good()) { numBytes_ = bytesToRead; fieldOffset_ += numBytes_; } } } else result = EC_IllegalCall; return result; } Uint32 DcmWriteCache::writeBuffer(DcmOutputStream &outStream) { Uint32 result = 0; if (buf_ && numBytes_) { result = OFstatic_cast(Uint32, outStream.write(buf_ + offset_, numBytes_)); numBytes_ -= result; offset_ += result; } return result; } /* * CVS/RCS Log: * $Log: dcwcache.cc,v $ * Revision 1.3 2010-10-14 13:14:11 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.2 2009-02-04 17:55:30 joergr * Fixes various type mismatches reported by MSVC introduced with OFFile class. * * Revision 1.1 2007-11-29 14:30:20 meichel * Write methods now handle large raw data elements (such as pixel data) * without loading everything into memory. This allows very large images to * be sent over a network connection, or to be copied without ever being * fully in memory. * * */ dcmtk-3.6.0/dcmdata/libsrc/dcistrmb.cc0000644000310500011400000002447411455601040017037 0ustar joergrdicom3/* * * Copyright (C) 2002-2010, 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: dcmdata * * Author: Marco Eichelberg * * Purpose: DcmInputBufferStream and related classes, * implements input to blocks of memory as needed in the dcmnet module. * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:14:08 $ * CVS/RCS Revision: $Revision: 1.9 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" #include "dcmtk/dcmdata/dcistrmb.h" #include "dcmtk/dcmdata/dcerror.h" #define DCMBUFFERPRODUCER_BUFSIZE 1024 DcmBufferProducer::DcmBufferProducer() : DcmProducer() , buffer_(NULL) , backup_(new unsigned char[DCMBUFFERPRODUCER_BUFSIZE]) , bufSize_(0) , bufIndex_(0) , backupIndex_(DCMBUFFERPRODUCER_BUFSIZE) , backupStart_(DCMBUFFERPRODUCER_BUFSIZE) , status_(EC_Normal) , eosflag_(OFFalse) { if (!backup_) status_ = EC_MemoryExhausted; } DcmBufferProducer::~DcmBufferProducer() { delete[] backup_; } OFBool DcmBufferProducer::good() const { return status_.good(); } OFCondition DcmBufferProducer::status() const { return status_; } OFBool DcmBufferProducer::eos() { // end of stream is true if the user has called setEos() before // and there is no more data available in the current buffer. // We also flag end of stream if the status is bad. return (eosflag_ && (avail() == 0)) || (!status_.good()); } offile_off_t DcmBufferProducer::avail() { if (status_.good()) { // in the backup buffer, we have (DCMBUFFERPRODUCER_BUFSIZE - backupIndex_) // bytes available. In the user buffer, we have (bufSize_ - bufIndex_). return DCMBUFFERPRODUCER_BUFSIZE + bufSize_ - bufIndex_ - backupIndex_; } else return 0; } offile_off_t DcmBufferProducer::read(void *buf, offile_off_t buflen) { offile_off_t result = 0; if (status_.good() && buflen && buf) { unsigned char *target = OFstatic_cast(unsigned char *, buf); if (backupIndex_ < DCMBUFFERPRODUCER_BUFSIZE) { // we have data in the backup buffer, read first result = DCMBUFFERPRODUCER_BUFSIZE - backupIndex_; if (result > buflen) result = buflen; memcpy(target, backup_ + backupIndex_, OFstatic_cast(size_t, result)); backupIndex_ += result; target += result; buflen -= result; } if (buflen && bufSize_) { // read data from user buffer offile_off_t numbytes = bufSize_ - bufIndex_; if (numbytes > buflen) numbytes = buflen; memcpy(target, buffer_ + bufIndex_, OFstatic_cast(size_t, numbytes)); bufIndex_ += numbytes; result += numbytes; } } return result; } offile_off_t DcmBufferProducer::skip(offile_off_t skiplen) { offile_off_t result = 0; if (status_.good() && skiplen) { if (backupIndex_ < DCMBUFFERPRODUCER_BUFSIZE) { // we have data in the backup buffer, skip first result = DCMBUFFERPRODUCER_BUFSIZE - backupIndex_; if (result > skiplen) result = skiplen; backupIndex_ += result; skiplen -= result; } if (skiplen && bufSize_) { // skip data from user buffer offile_off_t skipbytes = bufSize_ - bufIndex_; if (skipbytes > skiplen) skipbytes = skiplen; bufIndex_ += skipbytes; result += skipbytes; } } return result; } void DcmBufferProducer::putback(offile_off_t num) { if (status_.good() && num) { if (bufSize_ && bufIndex_) { // since bufIndex_ > 0, data has already been read from the user buffer. // This means we should putback in the user buffer first, and only // if this is not sufficient we also touch the backup buffer. if (num > bufIndex_) { num -= bufIndex_; bufIndex_ = 0; } else { bufIndex_ -= num; num = 0; } } if (num && (backupIndex_ > backupStart_)) { // there is still a number of bytes to putback, and we have data in the // backup buffer, so we can actually putback something there. // This will cause the next read operation to read from the backup // buffer first and only then access the user buffer. if (num > (backupIndex_ - backupStart_)) { num -= backupIndex_ - backupStart_; backupIndex_ = backupStart_; } else { backupIndex_ -= num; num = 0; } } if (num) { // we didn't manage to execute the putback request because there was // not enough data available in both buffers. Producer failure. status_ = EC_PutbackFailed; } } } void DcmBufferProducer::setBuffer(const void *buf, offile_off_t buflen) { if (status_.good()) { if (buffer_ || eosflag_) { // error: attempt to set new buffer without calling releaseBuffer before // or after calling setEos. status_ = EC_IllegalCall; } else if (buf && buflen) { buffer_ = OFstatic_cast(unsigned char *, OFconst_cast(void *, buf)); bufSize_ = buflen; bufIndex_ = 0; } } } void DcmBufferProducer::releaseBuffer() { // releaseBuffer() might be called multiple times, so buffer_ could already be NULL. if (status_.good() && buffer_) { // compute the least number of bytes that we have to store in the backup buffer offile_off_t numBytes = bufSize_ - bufIndex_; if (numBytes > backupIndex_) { // number of bytes is larger than free space in backup buffer; fail. status_ = EC_IllegalCall; } else { // if number of bytes is smaller than free space in backup buffer, make as large as possible if (numBytes < backupIndex_) { numBytes = (backupIndex_ < bufSize_) ? backupIndex_ : bufSize_; } // if number of bytes is smaller than backup buffer, move old // data in backup buffer to keep older data available for putback operations if (numBytes < DCMBUFFERPRODUCER_BUFSIZE) { // move (DCMBUFFERPRODUCER_BUFSIZE - numBytes) bytes from end of backup buffer // to start of backup buffer. Everything else will be overwritten from the // user buffer. memmove(backup_, backup_ + numBytes, OFstatic_cast(size_t, DCMBUFFERPRODUCER_BUFSIZE - numBytes)); // adjust backupStart_ if (backupStart_ < numBytes) backupStart_ = 0; else backupStart_ -= numBytes; } else { // the backup buffer will be filled completely from the user buffer backupStart_ = 0; } // copy (numBytes) bytes from the end of the user buffer to the end of the backup buffer memcpy(backup_ + DCMBUFFERPRODUCER_BUFSIZE - numBytes, buffer_ + bufSize_ - numBytes, OFstatic_cast(size_t, numBytes)); // adjust backupIndex_ if (backupIndex_ == DCMBUFFERPRODUCER_BUFSIZE) { // there was no unread data in the backup buffer before. // backupIndex_ only depends on the number of unread bytes in the user buffer. // we know that (bufSize_ - bufIndex_ < DCMBUFFERPRODUCER_BUFSIZE) because this was tested before. backupIndex_ = DCMBUFFERPRODUCER_BUFSIZE + bufIndex_ - bufSize_; } else { // there was unread data in the backup buffer before. // This implies that all of the user buffer is unread and the complete user // buffer fits into the free space in the backup buffer, because otherwise // we would not have got this far. // Adjust backupIndex_ by the number of bytes we have moved the content of the backup buffer. backupIndex_ -= numBytes; } // release user buffer buffer_ = NULL; bufSize_ = 0; bufIndex_ = 0; } } // the number of bytes that can be putback after this operation depends // on the size of the backup buffer and on the number of unread bytes // in both buffers at the time of the releaseBuffer() operation. // If the user only calls releaseBuffer() when most data has been read // from the buffer, we should be able to putback almost 1K. } void DcmBufferProducer::setEos() { eosflag_ = OFTrue; } /* ======================================================================= */ DcmInputBufferStream::DcmInputBufferStream() : DcmInputStream(&producer_) // safe because DcmInputStream only stores pointer , producer_() { } DcmInputBufferStream::~DcmInputBufferStream() { #ifdef DEBUG if ((!eos()) && (avail() > 0)) { DCMDATA_WARN("closing unflushed DcmInputBufferStream, loss of data!"); } #endif } DcmInputStreamFactory *DcmInputBufferStream::newFactory() const { // we don't support delayed loading from buffer streams return NULL; } void DcmInputBufferStream::setBuffer(const void *buf, offile_off_t buflen) { producer_.setBuffer(buf, buflen); // if there is a compression filter, the following call will // cause it to feed the compression engine with data from the // new buffer. skip(0); } void DcmInputBufferStream::releaseBuffer() { producer_.releaseBuffer(); } void DcmInputBufferStream::setEos() { producer_.setEos(); } /* * CVS/RCS Log: * $Log: dcistrmb.cc,v $ * Revision 1.9 2010-10-14 13:14:08 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.8 2010-02-22 11:39:54 uli * Remove some unneeded includes. * * Revision 1.7 2009-11-04 09:58:09 uli * Switched to logging mechanism provided by the "new" oflog module * * Revision 1.6 2007-02-19 15:45:31 meichel * Class DcmInputStream and related classes are now safe for use with * large files (2 GBytes or more) if supported by compiler and operating system. * * Revision 1.5 2006/08/15 15:49:54 meichel * Updated all code in module dcmdata to correctly compile when * all standard C++ classes remain in namespace std. * * Revision 1.4 2005/12/08 15:41:13 meichel * Changed include path schema for all DCMTK header files * * Revision 1.3 2004/02/04 16:33:40 joergr * Adapted type casts to new-style typecast operators defined in ofcast.h. * * Revision 1.2 2002/09/19 08:32:29 joergr * Added explicit type casts to keep Sun CC 2.0.1 quiet. * * Revision 1.1 2002/08/27 16:55:48 meichel * Initial release of new DICOM I/O stream classes that add support for stream * compression (deflated little endian explicit VR transfer syntax) * * */ dcmtk-3.6.0/dcmdata/libsrc/dcobject.cc0000644000310500011400000006416211462524221017006 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Gerd Ehlers, Andreas Barth * * Purpose: * This file contains the interface to routines which provide * DICOM object encoding/decoding, search and lookup facilities. * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-29 10:57:21 $ * CVS/RCS Revision: $Revision: 1.68 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/ofstd/ofstd.h" #include "dcmtk/ofstd/ofstream.h" #include "dcmtk/dcmdata/dcobject.h" #include "dcmtk/dcmdata/dcdeftag.h" #include "dcmtk/dcmdata/dcvr.h" #include "dcmtk/dcmdata/dcxfer.h" #include "dcmtk/dcmdata/dcswap.h" #include "dcmtk/dcmdata/dcistrma.h" /* for class DcmInputStream */ #include "dcmtk/dcmdata/dcostrma.h" /* for class DcmOutputStream */ #define INCLUDE_CSTDIO #define INCLUDE_IOMANIP #include "dcmtk/ofstd/ofstdinc.h" // global flags OFGlobal dcmEnableAutomaticInputDataCorrection(OFTrue); OFGlobal dcmAcceptOddAttributeLength(OFTrue); OFGlobal dcmEnableCP246Support(OFTrue); OFGlobal dcmEnableOldSignatureFormat(OFFalse); OFGlobal dcmAutoDetectDatasetXfer(OFFalse); OFGlobal dcmAcceptUnexpectedImplicitEncoding(OFFalse); OFGlobal dcmReadImplPrivAttribMaxLengthAsSQ(OFFalse); OFGlobal dcmIgnoreParsingErrors(OFFalse); OFGlobal dcmStopParsingAfterElement(DCM_UndefinedTagKey); // (0xffff,0xffff) OFGlobal dcmWriteOversizedSeqsAndItemsUndefined(OFTrue); OFGlobal dcmIgnoreFileMetaInformationGroupLength(OFFalse); // ****** public methods ********************************** DcmObject::DcmObject(const DcmTag &tag, const Uint32 len) : errorFlag(EC_Normal) , Tag(tag) , Length(len) , fTransferState(ERW_init) , fTransferredBytes(0) { } DcmObject::DcmObject(const DcmObject &obj) : errorFlag(obj.errorFlag) , Tag(obj.Tag) , Length(obj.Length) , fTransferState(obj.fTransferState) , fTransferredBytes(obj.fTransferredBytes) { } DcmObject::~DcmObject() { } DcmObject &DcmObject::operator=(const DcmObject &obj) { if (this != &obj) { Tag = obj.Tag; Length = obj.Length; errorFlag = obj.errorFlag; fTransferState = obj.fTransferState; fTransferredBytes = obj.fTransferredBytes; } return *this; } // ******************************** void DcmObject::transferInit() { fTransferState = ERW_init; fTransferredBytes = 0; } void DcmObject::transferEnd() { fTransferState = ERW_notInitialized; } // ******************************** DcmObject * DcmObject::nextInContainer(const DcmObject * /*obj*/) { return NULL; } OFCondition DcmObject::nextObject(DcmStack & /*stack*/, const OFBool /*intoSub*/) { return EC_TagNotFound; } // ******************************** OFCondition DcmObject::search(const DcmTagKey &/*tag*/, DcmStack &/*resultStack*/, E_SearchMode /*mode*/, OFBool /*searchIntoSub*/) { return EC_TagNotFound; } // ******************************** OFCondition DcmObject::writeXML(STD_NAMESPACE ostream& /*out*/, const size_t /*flags*/) { return EC_IllegalCall; } // *********************************************************** // ****** protected methods ********************************** // *********************************************************** void DcmObject::printNestingLevel(STD_NAMESPACE ostream&out, const size_t flags, const int level) { if (flags & DCMTypes::PF_showTreeStructure) { if (flags & DCMTypes::PF_useANSIEscapeCodes) out << ANSI_ESCAPE_CODE_LINE; /* show vertical bar for the tree structure */ for (int i = 1; i < level; i++) out << "| "; } else { /* show nesting level */ for (int i = 1; i < level; i++) out << " "; } } void DcmObject::printInfoLineStart(STD_NAMESPACE ostream &out, const size_t flags, const int level, DcmTag *tag) { /* default: use object's tag */ if (tag == NULL) tag = &Tag; DcmVR vr(tag->getVR()); /* show nesting level */ printNestingLevel(out, flags, level); if (flags & DCMTypes::PF_showTreeStructure) { if (flags & DCMTypes::PF_useANSIEscapeCodes) { if (*tag == DCM_Item) out << ANSI_ESCAPE_CODE_ITEM; else if ((vr.getEVR() == EVR_SQ) || (vr.getEVR() == EVR_pixelSQ)) { if (level == 1) out << ANSI_ESCAPE_CODE_SEQUENCE_1; else out << ANSI_ESCAPE_CODE_SEQUENCE; } else if (level == 1) out << ANSI_ESCAPE_CODE_NAME_1; else out << ANSI_ESCAPE_CODE_NAME; } /* print tag name */ out << tag->getTagName() << ' '; /* add padding spaces if required */ const signed long padLength = DCM_OptPrintAttributeNameLength - strlen(tag->getTagName()) - 2 * level; if (padLength > 0) out << OFString(OFstatic_cast(size_t, padLength), ' '); } else { if (flags & DCMTypes::PF_useANSIEscapeCodes) out << ANSI_ESCAPE_CODE_TAG; /* print line start: tag */ out << STD_NAMESPACE hex << STD_NAMESPACE setfill('0') << "(" << STD_NAMESPACE setw(4) << tag->getGTag() << "," << STD_NAMESPACE setw(4) << tag->getETag() << ") "; if (flags & DCMTypes::PF_useANSIEscapeCodes) out << ANSI_ESCAPE_CODE_VR; /* print line start: VR */ out << vr.getVRName() << " " << STD_NAMESPACE dec << STD_NAMESPACE setfill(' '); } /* set color for subsequent element value */ if (flags & DCMTypes::PF_useANSIEscapeCodes) out << ANSI_ESCAPE_CODE_VALUE; } void DcmObject::printInfoLineEnd(STD_NAMESPACE ostream &out, const size_t flags, const unsigned long printedLength, DcmTag *tag) { unsigned long vm = 0; unsigned long length = 0; /* default: use object's tag, VM and length */ if (tag == NULL) { tag = &Tag; vm = getVM(); length = Length; } if (flags & DCMTypes::PF_showTreeStructure) { /* finish the current line */ out << OFendl; } else { /* fill with spaces if necessary */ if (printedLength < DCM_OptPrintValueLength) out << OFString(OFstatic_cast(size_t, DCM_OptPrintValueLength - printedLength), ' '); if (flags & DCMTypes::PF_useANSIEscapeCodes) out << ANSI_ESCAPE_CODE_COMMENT; out << " # "; /* print line end: length */ if (flags & DCMTypes::PF_useANSIEscapeCodes) out << ANSI_ESCAPE_CODE_LENGTH; if (length == DCM_UndefinedLength) out << "u/l"; // means "undefined/length" else out << STD_NAMESPACE setw(3) << length; if (flags & DCMTypes::PF_useANSIEscapeCodes) out << ANSI_ESCAPE_CODE_COMMENT; out << ","; /* print line end: VM */ if (flags & DCMTypes::PF_useANSIEscapeCodes) out << ANSI_ESCAPE_CODE_VM; out << STD_NAMESPACE setw(2) << vm << " "; /* print line end: name */ if (flags & DCMTypes::PF_useANSIEscapeCodes) out << ANSI_ESCAPE_CODE_NAME; out << tag->getTagName() << OFendl; } /* reset all colors and styles */ if (flags & DCMTypes::PF_useANSIEscapeCodes) out << ANSI_ESCAPE_CODE_RESET; } void DcmObject::printInfoLine(STD_NAMESPACE ostream &out, const size_t flags, const int level, const char *info, DcmTag *tag, const OFBool isInfo) { /* print tag and VR */ printInfoLineStart(out, flags, level, tag); /* check whether info text fits into the limit */ unsigned long printedLength = 0; /* check for valid info text */ if (info != NULL) { if (isInfo && (flags & DCMTypes::PF_useANSIEscapeCodes)) out << ANSI_ESCAPE_CODE_INFO; /* check info text length */ printedLength = strlen(info); if (printedLength > DCM_OptPrintValueLength) { /* check whether full info text should be printed */ if ((flags & DCMTypes::PF_shortenLongTagValues) && (printedLength > DCM_OptPrintLineLength)) { char output[DCM_OptPrintLineLength + 1]; /* truncate info text and append "..." */ OFStandard::strlcpy(output, info, OFstatic_cast(size_t, DCM_OptPrintLineLength) - 3 /* for "..." */ + 1); OFStandard::strlcat(output, "...", OFstatic_cast(size_t, DCM_OptPrintLineLength) + 1); out << output; printedLength = DCM_OptPrintLineLength; } else out << info; } else out << info; } /* print length, VM and tag name */ printInfoLineEnd(out, flags, printedLength, tag); } // ******************************** OFCondition DcmObject::writeTag(DcmOutputStream &outStream, const DcmTag &tag, const E_TransferSyntax oxfer) /* * This function writes the tag information which was passed to the stream. When * writing information, the transfer syntax which was passed is accounted for. * * Parameters: * outStream - [out] The stream that the information will be written to. * tag - [in] The tag which shall be written. * oxfer - [in] The transfer syntax which shall be used. */ { /* create an object which represents the transfer syntax */ DcmXfer outXfer(oxfer); /* determine the byte ordering */ const E_ByteOrder outByteOrder = outXfer.getByteOrder(); /* if the byte ordering is unknown, this is an illegal call (return error) */ if (outByteOrder == EBO_unknown) return EC_IllegalCall; /* determine the group number, mind the transfer syntax and */ /* write the group number value (2 bytes) to the stream */ Uint16 groupTag = tag.getGTag(); swapIfNecessary(outByteOrder, gLocalByteOrder, &groupTag, 2, 2); outStream.write(&groupTag, 2); /* determine the element number, mind the transfer syntax and */ /* write the element number value (2 bytes) to the stream */ Uint16 elementTag = tag.getETag(); // 2 byte length; swapIfNecessary(outByteOrder, gLocalByteOrder, &elementTag, 2, 2); outStream.write(&elementTag, 2); /* if the stream reports an error return this error, else return ok */ return outStream.status(); } Uint32 DcmObject::getTagAndLengthSize(const E_TransferSyntax oxfer) const { /* create an object which represents the transfer syntax */ DcmXfer oxferSyn(oxfer); if (oxferSyn.isExplicitVR()) { /* map "UN" to "OB" if generation of "UN" is disabled */ DcmVR outvr(getTag().getVR().getValidEVR()); if (outvr.usesExtendedLengthEncoding()) { return 12; } } return 8; } OFCondition DcmObject::writeTagAndLength(DcmOutputStream &outStream, const E_TransferSyntax oxfer, Uint32 &writtenBytes) const /* * This function writes this DICOM object's tag and length information to the stream. When * writing information, the transfer syntax which was passed is accounted for. If the transfer * syntax shows an explicit value representation, the data type of this object is also written * to the stream. In general, this function follows the rules which are specified in the DICOM * standard (see DICOM standard part 5, section 7) concerning the encoding of a data set which * shall be transmitted. * * Parameters: * outStream - [out] The stream that the information will be written to. * oxfer - [in] The transfer syntax which shall be used. * writtenBytes - [out] Contains in the end the amount of bytes which have been written to the stream. */ { /* check the error status of the stream. If it is not ok, nothing can be done */ OFCondition l_error = outStream.status(); if (l_error.bad()) { writtenBytes = 0; } else { /* if the stream is ok, we need to do something */ /* write the tag information (a total of 4 bytes, group number and element */ /* number) to the stream. Mind the transfer syntax's byte ordering. */ l_error = writeTag(outStream, getTag(), oxfer); writtenBytes = 4; /* create an object which represents the transfer syntax */ DcmXfer oxferSyn(oxfer); /* determine the byte ordering */ const E_ByteOrder oByteOrder = oxferSyn.getByteOrder(); /* if the byte ordering is unknown, this is an illegal call (return error) */ if (oByteOrder == EBO_unknown) return EC_IllegalCall; /* if the transfer syntax is one with explicit value representation */ /* this value's data type also has to be written to the stream. Do so */ /* and also write the length information to the stream. */ if (oxferSyn.isExplicitVR()) { /* Create an object that represents this object's data type */ DcmVR myvr(getVR()); /* getValidEVR() will convert datatype "UN" to "OB" if generation of "UN" is disabled */ DcmEVR vr = myvr.getValidEVR(); /* get name of data type */ const char *vrname = myvr.getValidVRName(); /* write data type name to the stream (a total of 2 bytes) */ outStream.write(vrname, 2); writtenBytes += 2; /* create another data type object on the basis of the above created object */ DcmVR outvr(vr); /* in case we are dealing with a transfer syntax with explicit VR (see if above) */ /* and the actual VR uses extended length encoding (see DICOM standard part 5, */ /* section 7.1.2) we have to add 2 reserved bytes (set to a value of 00H) to the */ /* data type field and the actual length field is 4 bytes wide. Write the */ /* corresponding information to the stream. */ if (outvr.usesExtendedLengthEncoding()) { Uint16 reserved = 0; outStream.write(&reserved, 2); // write 2 reserved bytes to stream Uint32 valueLength = Length; // determine length swapIfNecessary(oByteOrder, gLocalByteOrder, &valueLength, 4, 4); // mind transfer syntax outStream.write(&valueLength, 4); // write length, 4 bytes wide writtenBytes += 6; // remember that 6 bytes were written in total } /* in case that we are dealing with a transfer syntax with explicit VR (see if above) and */ /* the actual VR does not use extended length encoding (see DICOM standard part 5, section */ /* 7.1.2) we do not have to add reserved bytes to the data type field and the actual length */ /* is 2 bytes wide. Write the corresponding information to the stream. But, make sure that */ /* the length really fits into the 2-byte field ... */ else if (Length <= 0xffff) { Uint16 valueLength = OFstatic_cast(Uint16, Length); // determine length (cast to 16 bit) swapIfNecessary(oByteOrder, gLocalByteOrder, &valueLength, 2, 2); // mind transfer syntax outStream.write(&valueLength, 2); // write length, 2 bytes wide writtenBytes += 2; // remember that 2 bytes were written in total } /* ... if not, report an error message and return an error code. */ else { DcmTag tag(Tag); DCMDATA_ERROR("DcmObject: Length of element " << tag.getTagName() << " " << tag << " exceeds maximum of 16-bit length field"); l_error = EC_ElemLengthExceeds16BitField; } } /* if the transfer syntax is one with implicit value representation this value's data type */ /* does not have to be written to the stream. Only the length information has to be written */ /* to the stream. According to the DICOM standard the length field is in this case always 4 */ /* byte wide. (see DICOM standard part 5, section 7.1.2) */ else { Uint32 valueLength = Length; // determine length swapIfNecessary(oByteOrder, gLocalByteOrder, &valueLength, 4, 4); // mind transfer syntax outStream.write(&valueLength, 4); // write length, 4 bytes wide writtenBytes += 4; // remember that 4 bytes were written in total } } /* return result */ return l_error; } OFBool DcmObject::isSignable() const { return Tag.isSignable(); } OFBool DcmObject::containsUnknownVR() const { return Tag.isUnknownVR(); } OFBool DcmObject::containsExtendedCharacters(const OFBool /*checkAllStrings*/) { return OFFalse; } OFBool DcmObject::isAffectedBySpecificCharacterSet() const { return OFFalse; } OFBool DcmObject::isEmpty(const OFBool /*normalize*/) { return (Length == 0); } /* * CVS/RCS Log: * $Log: dcobject.cc,v $ * Revision 1.68 2010-10-29 10:57:21 joergr * Added support for colored output to the print() method. * * Revision 1.67 2010-10-14 13:14:08 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.66 2010-02-25 13:50:15 joergr * Fixed issue with element values which exceed the maximum of a 16-bit length * field. * * Revision 1.65 2009-11-13 13:11:21 joergr * Fixed minor issues in log output. * * Revision 1.64 2009-11-04 09:58:10 uli * Switched to logging mechanism provided by the "new" oflog module * * Revision 1.63 2009-08-07 14:35:49 joergr * Enhanced isEmpty() method by checking whether the data element value consists * of non-significant characters only. * * Revision 1.62 2009-06-04 16:52:53 joergr * Added new parsing flag that allows for ignoring the value of File Meta * Information Group Length (0002,0000). * * Revision 1.61 2009-03-25 10:21:22 joergr * Added new method isEmpty() to DICOM object, item and sequence class. * * Revision 1.60 2009-03-05 14:08:05 onken * Fixed typo. * * Revision 1.59 2009-03-05 13:35:07 onken * Added checks for sequence and item lengths which prevents overflow in length * field, if total length of contained items (or sequences) exceeds 32-bit * length field. Also introduced new flag (default: enabled) for writing * in explicit length mode, which allows for automatically switching encoding * of only that very sequence/item to undefined length coding (thus permitting * to actually write the file). * * Revision 1.58 2009-02-11 13:16:36 onken * Added global parser flag permitting to stop parsing after a specific * element was parsed on dataset level (useful for removing garbage at * end of file). * * Revision 1.57 2009-02-04 17:58:53 joergr * Fixed various layout and formatting issues. * * Revision 1.56 2009-02-04 14:04:57 onken * Introduced global flag that, if enabled, tells the parser to continue * parsing if possible. * * Revision 1.55 2009-01-29 15:35:32 onken * Added global parsing option that allows for reading private attributes in * implicit encoding having a maximum length to be read as sequences instead * of relying on the dictionary. * * Revision 1.54 2009-01-06 16:27:03 joergr * Reworked print() output format for option PF_showTreeStructure. * * Revision 1.53 2009-01-05 15:31:42 joergr * Added global flag that allows for reading incorrectly encoded DICOM datasets * where particular data elements are encoded with a differing transfer syntax * (Implicit VR Little endian instead of Explicit VR encoding as declared). * * Revision 1.52 2007/11/23 15:42:36 meichel * Copy assignment operators in dcmdata now safe for self assignment * * Revision 1.51 2007/06/29 14:17:49 meichel * Code clean-up: Most member variables in module dcmdata are now private, * not protected anymore. * * Revision 1.50 2007/02/19 15:04:16 meichel * Removed searchErrors() methods that are not used anywhere and added * error() methods only in the DcmObject subclasses where really used. * * Revision 1.49 2006/12/15 14:14:44 joergr * Added new method that checks whether a DICOM object or element is affected * by SpecificCharacterSet (0008,0005). * * Revision 1.48 2006/12/13 13:59:49 joergr * Added new optional parameter "checkAllStrings" to method containsExtended * Characters(). * * Revision 1.47 2006/08/15 15:49:54 meichel * Updated all code in module dcmdata to correctly compile when * all standard C++ classes remain in namespace std. * * Revision 1.46 2006/05/11 08:50:19 joergr * Moved checkForNonASCIICharacters() from application to library. * * Revision 1.45 2005/12/08 15:41:19 meichel * Changed include path schema for all DCMTK header files * * Revision 1.44 2005/12/02 08:53:57 joergr * Changed macro NO_XFER_DETECTION_FOR_DATASETS into a global option that can * be enabled and disabled at runtime. * * Revision 1.43 2005/11/24 12:50:59 meichel * Fixed bug in code that prepares a byte stream that is fed into the MAC * algorithm when creating or verifying a digital signature. The previous * implementation was non-conformant when signatures included compressed * (encapsulated) pixel data because the item length was included in the byte * stream, while it should not. The global variable dcmEnableOldSignatureFormat * and a corresponding command line option in dcmsign allow to re-enable the old * implementation. * * Revision 1.42 2005/05/10 15:27:18 meichel * Added support for reading UN elements with undefined length according * to CP 246. The global flag dcmEnableCP246Support allows to revert to the * prior behaviour in which UN elements with undefined length were parsed * like a normal explicit VR SQ element. * * Revision 1.41 2004/04/27 09:21:27 wilkens * Fixed a bug in dcelem.cc which occurs when one is serializing a dataset * (that contains an attribute whose length value is coded with 2 bytes) into * a given buffer. Although the number of available bytes in the buffer was * sufficient, the dataset->write(...) method would always return * EC_StreamNotifyClient to indicate that there are not sufficient bytes * available in the buffer. This code modification fixes the problem. * * Revision 1.40 2004/02/04 16:35:46 joergr * Adapted type casts to new-style typecast operators defined in ofcast.h. * Removed acknowledgements with e-mail addresses from CVS log. * * Revision 1.39 2002/12/06 13:15:12 joergr * Enhanced "print()" function by re-working the implementation and replacing * the boolean "showFullData" parameter by a more general integer flag. * Made source code formatting more consistent with other modules/files. * * Revision 1.38 2002/11/27 12:06:49 meichel * Adapted module dcmdata to use of new header file ofstdinc.h * * Revision 1.37 2002/08/27 16:55:52 meichel * Initial release of new DICOM I/O stream classes that add support for stream * compression (deflated little endian explicit VR transfer syntax) * * Revision 1.36 2002/08/20 12:18:48 meichel * Changed parameter list of loadFile and saveFile methods in class * DcmFileFormat. Removed loadFile and saveFile from class DcmObject. * * Revision 1.35 2002/07/08 14:44:40 meichel * Improved dcmdata behaviour when reading odd tag length. Depending on the * global boolean flag dcmAcceptOddAttributeLength, the parser now either accepts * odd length attributes or implements the old behaviour, i.e. assumes a real * length larger by one. * * Revision 1.34 2002/04/25 10:17:19 joergr * Added support for XML output of DICOM objects. * * Revision 1.33 2002/04/16 13:43:19 joergr * Added configurable support for C++ ANSI standard includes (e.g. streams). * * Revision 1.32 2002/04/11 12:27:10 joergr * Added new methods for loading and saving DICOM files. * * Revision 1.31 2001/11/16 15:55:03 meichel * Adapted digital signature code to final text of supplement 41. * * Revision 1.30 2001/11/01 14:55:41 wilkens * Added lots of comments. * * Revision 1.29 2001/09/25 17:19:52 meichel * Adapted dcmdata to class OFCondition * * Revision 1.28 2001/06/01 15:49:06 meichel * Updated copyright header * * Revision 1.27 2000/04/14 16:10:09 meichel * Global flag dcmEnableAutomaticInputDataCorrection now derived from OFGlobal * and, thus, safe for use in multi-thread applications. * * Revision 1.26 2000/03/08 16:26:38 meichel * Updated copyright header. * * Revision 1.25 2000/03/07 15:41:00 joergr * Added explicit type casts to make Sun CC 2.0.1 happy. * * Revision 1.24 2000/02/10 10:52:20 joergr * Added new feature to dcmdump (enhanced print method of dcmdata): write * pixel data/item value fields to raw files. * * Revision 1.23 2000/02/01 10:12:09 meichel * Avoiding to include as extern "C" on Borland C++ Builder 4, * workaround for bug in compiler header files. * * Revision 1.22 1999/03/31 09:25:34 meichel * Updated copyright header in module dcmdata * * */ dcmtk-3.6.0/dcmdata/libsrc/Makefile.in0000644000310500011400000000666311435457073017003 0ustar joergrdicom3# # Makefile for dcmdata/libsrc # @SET_MAKE@ SHELL = /bin/sh VPATH = @srcdir@:@top_srcdir@/include:@top_srcdir@/@configdir@/include srcdir = @srcdir@ top_srcdir = @top_srcdir@ configdir = @top_srcdir@/@configdir@ include $(configdir)/@common_makefile@ ofstddir = $(top_srcdir)/../ofstd oflogdir = $(top_srcdir)/../oflog LOCALINCLUDES = -I$(ofstddir)/include -I$(oflogdir)/include LIBDIRS = -L$(ofstddir)/libsrc -L$(oflogdir)/libsrc LOCALLIBS = -loflog -lofstd LOCALDEFS = # clear environment variable in the scope of this makefile DCMDICTPATH = # Special defines for the Library, define them in LOCALDEFS # DICOMDIR_WITHOUT_BACKUP # no Backup for DICOMDIR files. default: not defined # PRINT_REPLACED_DICTIONARY_ENTRIES # dump duplicate entries in the data dictionary to stderr dicomdic = $(top_srcdir)/data/dicom.dic privatedic = $(top_srcdir)/data/private.dic dictobjs = dctagkey.o dcdicent.o dcdict.o dcdictbi.o dcvr.o dchashdi.o objs = dcpixseq.o dcpxitem.o dcuid.o dcerror.o \ dcstack.o dclist.o dcswap.o dctag.o dcxfer.o \ dcobject.o dcelem.o dcitem.o dcmetinf.o dcdatset.o \ dcsequen.o dcfilefo.o dcbytstr.o dcpixel.o dcvrae.o dcvras.o dcvrcs.o \ dccodec.o dcvrda.o dcvrds.o dcvrdt.o dcvris.o dcvrtm.o dcvrui.o \ dcchrstr.o dcvrlo.o dcvrlt.o dcvrpn.o dcvrsh.o dcvrst.o dcvrobow.o \ dcvrat.o dcvrss.o dcvrus.o dcvrsl.o dcvrul.o dcvrulup.o dcvrfl.o \ dcvrfd.o dcvrpobw.o dcvrof.o dcdirrec.o dcdicdir.o dcvm.o \ dcrleccd.o dcrlecce.o dcrlecp.o dcrlerp.o dcrledrg.o dcrleerg.o \ $(dictobjs) cmdlnarg.o dcvrut.o dctypes.o dcpcache.o dcddirif.o \ dcistrma.o dcistrmb.o dcistrmf.o dcistrmz.o \ dcostrma.o dcostrmb.o dcostrmf.o dcostrmz.o dcwcache.o dcpath.o \ vrscan.o vrscanl.o support_objs = mkdeftag.o mkdictbi.o dcdictzz.o support_progs = mkdeftag mkdictbi # Extra objects needed by support_progs support_progs_objs = cmdlnarg.o dctypes.o library = libdcmdata.$(LIBEXT) all: $(library) install: install-lib install-support install-lib: $(library) $(configdir)/mkinstalldirs $(DESTDIR)$(libdir) $(INSTALL_DATA) $(library) $(DESTDIR)$(libdir)/$(library) $(RANLIB) $(DESTDIR)$(libdir)/$(library) $(library): $(objs) $(AR) $(ARFLAGS) $@ $(objs) $(RANLIB) $@ mkdeftag: mkdeftag.o $(dictobjs) $(support_progs_objs) $(CXX) $(CXXFLAGS) $(LDFLAGS) $(LIBDIRS) -o $@ $@.o $(dictobjs) $(support_progs_objs) $(LOCALLIBS) $(LIBS) mkdictbi: mkdictbi.o $(dictobjs) $(support_progs_objs) $(CXX) $(CXXFLAGS) $(LDFLAGS) $(LIBDIRS) -o $@ $@.o $(dictobjs) $(support_progs_objs) $(LOCALLIBS) $(LIBS) mkvrscan: flex -8 --header-file=vrscanl.h --outfile=vrscanl.c vrscanl.l # Generate a new include file of defined tags gendeftag: mkdeftag $(dicomdic) $(privatedic) `pwd`/mkdeftag $(dicomdic) $(privatedic) > $(top_srcdir)/include/dcmtk/dcmdata/dcdeftag.h # Generate a file which can be used as a builtin dictionary dcdictzz.cc: mkdictbi $(dicomdic) $(privatedic) `pwd`/mkdictbi $(dicomdic) $(privatedic) > dcdictzz.cc # Generate a builtin data dictionary from $(dicomdic) and $(privatedic) builtindict: nobuiltindict mkdictbi $(dicomdic) $(privatedic) `pwd`/mkdictbi $(dicomdic) $(privatedic) > dcdictbi.cc # Generate an empty builtin data dictionary nobuiltindict: cp dcdictbi.nul dcdictbi.cc # Clean-up clean: rm -f $(support_progs) $(support_objs) $(objs) $(library) $(TRASH) distclean: nobuiltindict clean rm -f $(DISTTRASH) # Dependencies dependencies: $(CXX) -MM $(defines) $(includes) $(CPPFLAGS) $(CXXFLAGS) *.cc > $(DEP) include $(DEP) dcmtk-3.6.0/dcmdata/libsrc/dcvrae.cc0000644000310500011400000001520611457616141016477 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Gerd Ehlers, Andreas Barth * * Purpose: Implementation of class DcmApplicationEntity * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-20 16:44:17 $ * CVS/RCS Revision: $Revision: 1.21 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcvrae.h" #define MAX_AE_LENGTH 16 // ******************************** DcmApplicationEntity::DcmApplicationEntity(const DcmTag &tag, const Uint32 len) : DcmByteString(tag, len) { setMaxLength(MAX_AE_LENGTH); setNonSignificantChars(" \\"); } DcmApplicationEntity::DcmApplicationEntity(const DcmApplicationEntity &old) : DcmByteString(old) { } DcmApplicationEntity::~DcmApplicationEntity() { } DcmApplicationEntity &DcmApplicationEntity::operator=(const DcmApplicationEntity &obj) { DcmByteString::operator=(obj); return *this; } OFCondition DcmApplicationEntity::copyFrom(const DcmObject& rhs) { if (this != &rhs) { if (rhs.ident() != ident()) return EC_IllegalCall; *this = OFstatic_cast(const DcmApplicationEntity &, rhs); } return EC_Normal; } // ******************************** DcmEVR DcmApplicationEntity::ident() const { return EVR_AE; } OFCondition DcmApplicationEntity::checkValue(const OFString &vm, const OFBool /*oldFormat*/) { OFString strVal; /* get "raw value" without any modifications (if possible) */ OFCondition l_error = getStringValue(strVal); if (l_error.good()) l_error = DcmApplicationEntity::checkStringValue(strVal, vm); return l_error; } // ******************************** OFCondition DcmApplicationEntity::getOFString(OFString &stringVal, const unsigned long pos, OFBool normalize) { /* call inherited method */ OFCondition l_error = DcmByteString::getOFString(stringVal, pos, normalize); /* normalize string if required */ if (l_error.good() && normalize) normalizeString(stringVal, !MULTIPART, DELETE_LEADING, DELETE_TRAILING); return l_error; } // ******************************** OFCondition DcmApplicationEntity::checkStringValue(const OFString &value, const OFString &vm) { return DcmByteString::checkStringValue(value, vm, "ae", 13, MAX_AE_LENGTH); } /* ** CVS/RCS Log: ** $Log: dcvrae.cc,v $ ** Revision 1.21 2010-10-20 16:44:17 joergr ** Use type cast macros (e.g. OFstatic_cast) where appropriate. ** ** Revision 1.20 2010-10-14 13:14:09 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.19 2010-04-23 14:30:34 joergr ** Added new method to all VR classes which checks whether the stored value ** conforms to the VR definition and to the specified VM. ** ** Revision 1.18 2009-08-07 14:35:49 joergr ** Enhanced isEmpty() method by checking whether the data element value consists ** of non-significant characters only. ** ** Revision 1.17 2009-08-03 09:02:59 joergr ** Added methods that check whether a given string value conforms to the VR and ** VM definitions of the DICOM standards. ** ** Revision 1.16 2008-07-17 10:31:32 onken ** Implemented copyFrom() method for complete DcmObject class hierarchy, which ** permits setting an instance's value from an existing object. Implemented ** assignment operator where necessary. ** ** Revision 1.15 2007-06-29 14:17:49 meichel ** Code clean-up: Most member variables in module dcmdata are now private, ** not protected anymore. ** ** Revision 1.14 2005/12/08 15:41:45 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.13 2002/12/06 13:20:48 joergr ** Enhanced "print()" function by re-working the implementation and replacing ** the boolean "showFullData" parameter by a more general integer flag. ** Made source code formatting more consistent with other modules/files. ** ** Revision 1.12 2002/04/25 10:26:53 joergr ** Removed getOFStringArray() implementation. ** ** Revision 1.11 2001/09/25 17:19:55 meichel ** Adapted dcmdata to class OFCondition ** ** Revision 1.10 2001/06/01 15:49:14 meichel ** Updated copyright header ** ** Revision 1.9 2000/03/08 16:26:45 meichel ** Updated copyright header. ** ** Revision 1.8 1999/03/31 09:25:46 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.7 1998/11/12 16:48:21 meichel ** Implemented operator= for all classes derived from DcmObject. ** ** Revision 1.6 1997/08/29 13:11:43 andreas ** Corrected Bug in getOFStringArray Implementation ** ** Revision 1.5 1997/08/29 08:32:55 andreas ** - Added methods getOFString and getOFStringArray for all ** string VRs. These methods are able to normalise the value, i. e. ** to remove leading and trailing spaces. This will be done only if ** it is described in the standard that these spaces are not relevant. ** These methods do not test the strings for conformance, this means ** especially that they do not delete spaces where they are not allowed! ** getOFStringArray returns the string with all its parts separated by \ ** and getOFString returns only one value of the string. ** CAUTION: Currently getString returns a string with trailing ** spaces removed (if dcmEnableAutomaticInputDataCorrection == OFTrue) and ** truncates the original string (since it is not copied!). If you rely on this ** behaviour please change your application now. ** Future changes will ensure that getString returns the original ** string from the DICOM object (NULL terminated) inclusive padding. ** Currently, if you call getOF... before calling getString without ** normalisation, you can get the original string read from the DICOM object. ** ** Revision 1.4 1997/07/03 15:10:07 andreas ** - removed debugging functions Bdebug() and Edebug() since ** they write a static array and are not very useful at all. ** Cdebug and Vdebug are merged since they have the same semantics. ** The debugging functions in dcmdata changed their interfaces ** (see dcmdata/include/dcdebug.h) ** ** Revision 1.3 1996/01/05 13:27:45 andreas ** - changed to support new streaming facilities ** - unique read/write methods for file and block transfer ** - more cleanups ** */ dcmtk-3.6.0/dcmdata/libsrc/dcrlerp.cc0000644000310500011400000000372511455601041016660 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Marco Eichelberg * * Purpose: representation parameter for RLE * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:14:09 $ * CVS/RCS Revision: $Revision: 1.4 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" #include "dcmtk/dcmdata/dcrlerp.h" DcmRLERepresentationParameter::DcmRLERepresentationParameter() : DcmRepresentationParameter() { } DcmRLERepresentationParameter::DcmRLERepresentationParameter(const DcmRLERepresentationParameter& arg) : DcmRepresentationParameter(arg) { } DcmRLERepresentationParameter::~DcmRLERepresentationParameter() { } DcmRepresentationParameter *DcmRLERepresentationParameter::clone() const { return new DcmRLERepresentationParameter(*this); } const char *DcmRLERepresentationParameter::className() const { return "DcmRLERepresentationParameter"; } OFBool DcmRLERepresentationParameter::operator==(const DcmRepresentationParameter &arg) const { const char *argname = arg.className(); if (argname) { OFString argstring(argname); if (argstring == className()) return OFTrue; } return OFFalse; } /* * CVS/RCS Log * $Log: dcrlerp.cc,v $ * Revision 1.4 2010-10-14 13:14:09 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.3 2009-11-04 09:58:10 uli * Switched to logging mechanism provided by the "new" oflog module * * Revision 1.2 2005-12-08 15:41:35 meichel * Changed include path schema for all DCMTK header files * * Revision 1.1 2002/06/06 14:52:43 meichel * Initial release of the new RLE codec classes * and the dcmcrle/dcmdrle tools in module dcmdata * * */ dcmtk-3.6.0/dcmdata/libsrc/dcdictbi.nul0000644000310500011400000000365511455600204017205 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Andrew Hewett * * Purpose: * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:07:16 $ * CVS/RCS Revision: $Revision: 1.9 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/dcmdata/dcdict.h" /* There is no builtin data dictionary */ const char* dcmBuiltinDictBuildDate = NULL; void DcmDataDictionary::loadBuiltinDictionary() { /* ** Empty Stub. ** ** We don't want a builtin data dictionary or ** it is not yet created. ** A complete builtin dictionary can be created ** by mkdictbi (see mkdictbi.cc) */ } /* * CVS/RCS Log: * $Log: dcdictbi.nul,v $ * Revision 1.9 2010-10-14 13:07:16 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.8 2009-09-03 10:04:09 joergr * Updated copyright date and made .cc and .nul files more consistent. * * Revision 1.14 2008-07-17 10:31:31 onken * Implemented copyFrom() method for complete DcmObject class hierarchy, which * permits setting an instance's value from an existing object. Implemented * assignment operator where necessary. * * Revision 1.7 2005-12-12 09:25:41 meichel * Update for new include file structure * * Revision 1.6 2004/02/13 12:42:37 joergr * Updated copyright header. * * Revision 1.5 2001/06/01 15:49:02 meichel * Updated copyright header * * Revision 1.4 2000/04/14 16:14:46 meichel * Minor changes for thread safety. * * Revision 1.3 2000/03/08 16:26:33 meichel * Updated copyright header. * * Revision 1.2 1999/03/31 09:25:24 meichel * Updated copyright header in module dcmdata * * */ dcmtk-3.6.0/dcmdata/libsrc/Makefile.dep0000644000310500011400000077516411462524221017144 0ustar joergrdicom3cmdlnarg.o: cmdlnarg.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmdata/cmdlnarg.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h dcbytstr.o: dcbytstr.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcbytstr.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcelem.h ../include/dcmtk/dcmdata/dcobject.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dcvr.h \ ../include/dcmtk/dcmdata/dctag.h ../include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmdata/dcstack.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../include/dcmtk/dcmdata/dcvr.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h dcchrstr.o: dcchrstr.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmdata/dcchrstr.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dcbytstr.h ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcelem.h ../include/dcmtk/dcmdata/dcobject.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dcvr.h \ ../include/dcmtk/dcmdata/dctag.h ../include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmdata/dcstack.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h dccodec.o: dccodec.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmdata/dccodec.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dcvr.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../include/dcmtk/dcmdata/dcdeftag.h ../include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmdata/dcuid.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../include/dcmtk/dcmdata/dcitem.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcobject.h ../include/dcmtk/dcmdata/dcerror.h \ ../include/dcmtk/dcmdata/dctag.h ../include/dcmtk/dcmdata/dcstack.h \ ../include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../include/dcmtk/dcmdata/dcpcache.h ../include/dcmtk/dcmdata/dcsequen.h \ ../include/dcmtk/dcmdata/dcelem.h ../include/dcmtk/dcmdata/dcpixseq.h \ ../include/dcmtk/dcmdata/dcsequen.h ../include/dcmtk/dcmdata/dcofsetl.h \ ../include/dcmtk/dcmdata/dcpxitem.h ../include/dcmtk/dcmdata/dcvrobow.h \ ../include/dcmtk/dcmdata/dcswap.h ../include/dcmtk/dcmdata/dcvrui.h \ ../include/dcmtk/dcmdata/dcbytstr.h dcdatset.o: dcdatset.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcdatset.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dcitem.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcobject.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dcvr.h \ ../include/dcmtk/dcmdata/dctag.h ../include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmdata/dcstack.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../include/dcmtk/dcmdata/dcpcache.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dcvrus.h \ ../include/dcmtk/dcmdata/dcelem.h ../include/dcmtk/dcmdata/dcpixel.h \ ../include/dcmtk/dcmdata/dcvrpobw.h ../include/dcmtk/dcmdata/dcvrobow.h \ ../include/dcmtk/dcmdata/dcdeftag.h ../include/dcmtk/dcmdata/dcostrma.h \ ../include/dcmtk/dcmdata/dcostrmf.h ../include/dcmtk/dcmdata/dcostrma.h \ ../include/dcmtk/dcmdata/dcistrma.h ../include/dcmtk/dcmdata/dcistrmf.h \ ../include/dcmtk/dcmdata/dcistrma.h ../include/dcmtk/dcmdata/dcwcache.h \ ../include/dcmtk/dcmdata/dcfcache.h dcddirif.o: dcddirif.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dcddirif.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dcdicdir.h ../include/dcmtk/dcmdata/dcdirrec.h \ ../include/dcmtk/dcmdata/dcitem.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcobject.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dcvr.h \ ../include/dcmtk/dcmdata/dctag.h ../include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmdata/dcstack.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../include/dcmtk/dcmdata/dcpcache.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../include/dcmtk/dcmdata/dcsequen.h ../include/dcmtk/dcmdata/dcelem.h \ ../include/dcmtk/dcmdata/dcfilefo.h ../include/dcmtk/dcmdata/dcdatset.h \ ../include/dcmtk/dcmdata/dcvrulup.h ../include/dcmtk/dcmdata/dcvrul.h \ ../include/dcmtk/dcmdata/dcdeftag.h ../include/dcmtk/dcmdata/dcuid.h \ ../include/dcmtk/dcmdata/dccodec.h ../include/dcmtk/dcmdata/dcmetinf.h \ ../include/dcmtk/dcmdata/dcpixel.h ../include/dcmtk/dcmdata/dcvrpobw.h \ ../include/dcmtk/dcmdata/dcvrobow.h ../include/dcmtk/dcmdata/dcpxitem.h \ ../include/dcmtk/dcmdata/dcofsetl.h ../include/dcmtk/dcmdata/dcpixseq.h \ ../include/dcmtk/dcmdata/dcvrcs.h ../include/dcmtk/dcmdata/dcbytstr.h \ ../include/dcmtk/dcmdata/dcvrda.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../include/dcmtk/dcmdata/dcvrtm.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofbmanip.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h dcdicdir.o: dcdicdir.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcdicdir.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dcdirrec.h ../include/dcmtk/dcmdata/dcitem.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcobject.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dcvr.h \ ../include/dcmtk/dcmdata/dctag.h ../include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmdata/dcstack.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../include/dcmtk/dcmdata/dcpcache.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../include/dcmtk/dcmdata/dcsequen.h ../include/dcmtk/dcmdata/dcelem.h \ ../include/dcmtk/dcmdata/dcfilefo.h ../include/dcmtk/dcmdata/dcdatset.h \ ../include/dcmtk/dcmdata/dcvrulup.h ../include/dcmtk/dcmdata/dcvrul.h \ ../include/dcmtk/dcmdata/dcuid.h ../include/dcmtk/dcmdata/dcdirrec.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dcdeftag.h \ ../include/dcmtk/dcmdata/dcostrma.h ../include/dcmtk/dcmdata/dcostrmf.h \ ../include/dcmtk/dcmdata/dcostrma.h ../include/dcmtk/dcmdata/dcistrmf.h \ ../include/dcmtk/dcmdata/dcistrma.h ../include/dcmtk/dcmdata/dcvrcs.h \ ../include/dcmtk/dcmdata/dcbytstr.h ../include/dcmtk/dcmdata/dcvrus.h \ ../include/dcmtk/dcmdata/dcmetinf.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../include/dcmtk/dcmdata/dcwcache.h ../include/dcmtk/dcmdata/dcfcache.h \ ../include/dcmtk/dcmdata/dcvrui.h dcdicent.o: dcdicent.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dcdicent.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../include/dcmtk/dcmdata/dcvr.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h dcdictbi.o: dcdictbi.cc ../include/dcmtk/dcmdata/dcdict.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../include/dcmtk/dcmdata/dchashdi.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h dcdict.o: dcdict.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcdict.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../include/dcmtk/dcmdata/dchashdi.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h \ ../include/dcmtk/dcmdata/dcdicent.h ../include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmdata/dcvr.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h dcdictzz.o: dcdictzz.cc ../include/dcmtk/dcmdata/dcdict.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../include/dcmtk/dcmdata/dchashdi.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../include/dcmtk/dcmdata/dcdicent.h ../include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmdata/dcvr.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h dcdirrec.o: dcdirrec.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../include/dcmtk/dcmdata/dcdirrec.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dcitem.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcobject.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dcvr.h \ ../include/dcmtk/dcmdata/dctag.h ../include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmdata/dcstack.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../include/dcmtk/dcmdata/dcpcache.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../include/dcmtk/dcmdata/dcsequen.h ../include/dcmtk/dcmdata/dcelem.h \ ../include/dcmtk/dcmdata/dcfilefo.h ../include/dcmtk/dcmdata/dcdatset.h \ ../include/dcmtk/dcmdata/dctk.h ../include/dcmtk/dcmdata/dcswap.h \ ../include/dcmtk/dcmdata/dcistrma.h ../include/dcmtk/dcmdata/dcostrma.h \ ../include/dcmtk/dcmdata/dcuid.h ../include/dcmtk/dcmdata/dcvm.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h \ ../include/dcmtk/dcmdata/dcdicent.h ../include/dcmtk/dcmdata/dchashdi.h \ ../include/dcmtk/dcmdata/dcdict.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../include/dcmtk/dcmdata/dcdeftag.h ../include/dcmtk/dcmdata/dcmetinf.h \ ../include/dcmtk/dcmdata/dcdicdir.h ../include/dcmtk/dcmdata/dcdirrec.h \ ../include/dcmtk/dcmdata/dcvrulup.h ../include/dcmtk/dcmdata/dcvrul.h \ ../include/dcmtk/dcmdata/dcpixseq.h ../include/dcmtk/dcmdata/dcofsetl.h \ ../include/dcmtk/dcmdata/dcbytstr.h ../include/dcmtk/dcmdata/dcvrae.h \ ../include/dcmtk/dcmdata/dcvras.h ../include/dcmtk/dcmdata/dcvrcs.h \ ../include/dcmtk/dcmdata/dcvrda.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../include/dcmtk/dcmdata/dcvrds.h \ ../../ofstd/include/dcmtk/ofstd/ofvector.h \ ../include/dcmtk/dcmdata/dcvrdt.h \ ../../ofstd/include/dcmtk/ofstd/ofdatime.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../include/dcmtk/dcmdata/dcvris.h ../include/dcmtk/dcmdata/dcvrtm.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../include/dcmtk/dcmdata/dcvrui.h ../include/dcmtk/dcmdata/dcchrstr.h \ ../include/dcmtk/dcmdata/dcvrlo.h ../include/dcmtk/dcmdata/dcvrlt.h \ ../include/dcmtk/dcmdata/dcvrpn.h ../include/dcmtk/dcmdata/dcvrsh.h \ ../include/dcmtk/dcmdata/dcvrst.h ../include/dcmtk/dcmdata/dcvrut.h \ ../include/dcmtk/dcmdata/dcvrobow.h ../include/dcmtk/dcmdata/dcpixel.h \ ../include/dcmtk/dcmdata/dcvrpobw.h ../include/dcmtk/dcmdata/dcovlay.h \ ../include/dcmtk/dcmdata/dcvrat.h ../include/dcmtk/dcmdata/dcvrss.h \ ../include/dcmtk/dcmdata/dcvrus.h ../include/dcmtk/dcmdata/dcvrsl.h \ ../include/dcmtk/dcmdata/dcvrfl.h ../include/dcmtk/dcmdata/dcvrfd.h \ ../include/dcmtk/dcmdata/dcvrof.h ../include/dcmtk/dcmdata/cmdlnarg.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dcvr.h \ ../include/dcmtk/dcmdata/dcvrus.h dcelem.o: dcelem.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../include/dcmtk/dcmdata/dcelem.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dcobject.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcvr.h ../include/dcmtk/dcmdata/dctag.h \ ../include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmdata/dcstack.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../include/dcmtk/dcmdata/dcobject.h ../include/dcmtk/dcmdata/dcswap.h \ ../include/dcmtk/dcmdata/dcistrma.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../include/dcmtk/dcmdata/dcostrma.h ../include/dcmtk/dcmdata/dcfcache.h \ ../include/dcmtk/dcmdata/dcistrma.h ../include/dcmtk/dcmdata/dcwcache.h \ ../include/dcmtk/dcmdata/dcfcache.h ../include/dcmtk/dcmdata/dcitem.h \ ../include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../include/dcmtk/dcmdata/dcpcache.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../include/dcmtk/dcmdata/dcdeftag.h ../include/dcmtk/dcmdata/vrscan.h dcerror.o: dcerror.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmdata/dcerror.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h dcfilefo.o: dcfilefo.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../include/dcmtk/dcmdata/dcfilefo.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dcsequen.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcelem.h ../include/dcmtk/dcmdata/dcobject.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcvr.h ../include/dcmtk/dcmdata/dctag.h \ ../include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmdata/dcstack.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../include/dcmtk/dcmdata/dcdatset.h ../include/dcmtk/dcmdata/dcitem.h \ ../include/dcmtk/dcmdata/dcpcache.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../include/dcmtk/dcmdata/dcitem.h ../include/dcmtk/dcmdata/dcxfer.h \ ../include/dcmtk/dcmdata/dcvrobow.h ../include/dcmtk/dcmdata/dcvrui.h \ ../include/dcmtk/dcmdata/dcbytstr.h ../include/dcmtk/dcmdata/dcvrul.h \ ../include/dcmtk/dcmdata/dcvrus.h ../include/dcmtk/dcmdata/dcvrae.h \ ../include/dcmtk/dcmdata/dcvrsh.h ../include/dcmtk/dcmdata/dcchrstr.h \ ../include/dcmtk/dcmdata/dcmetinf.h ../include/dcmtk/dcmdata/dcdeftag.h \ ../include/dcmtk/dcmdata/dcuid.h ../include/dcmtk/dcmdata/dcostrma.h \ ../include/dcmtk/dcmdata/dcostrmf.h ../include/dcmtk/dcmdata/dcostrma.h \ ../include/dcmtk/dcmdata/dcistrma.h ../include/dcmtk/dcmdata/dcistrmf.h \ ../include/dcmtk/dcmdata/dcistrma.h ../include/dcmtk/dcmdata/dcwcache.h \ ../include/dcmtk/dcmdata/dcfcache.h dchashdi.o: dchashdi.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmdata/dchashdi.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../include/dcmtk/dcmdata/dcdicent.h ../include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../include/dcmtk/dcmdata/dcvr.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h dcistrma.o: dcistrma.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmdata/dcistrma.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcvr.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../include/dcmtk/dcmdata/dcistrmz.h ../include/dcmtk/dcmdata/dcistrma.h \ ../include/dcmtk/dcmdata/dcerror.h dcistrmb.o: dcistrmb.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmdata/dcistrmb.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dcistrma.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcvr.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../include/dcmtk/dcmdata/dcerror.h dcistrmf.o: dcistrmf.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmdata/dcistrmf.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dcistrma.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcvr.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h dcistrmz.o: dcistrmz.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmdata/dcistrmz.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dcistrma.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcvr.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../include/dcmtk/dcmdata/dcerror.h dcitem.o: dcitem.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dcitem.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcobject.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dcvr.h \ ../include/dcmtk/dcmdata/dctag.h ../include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmdata/dcstack.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../include/dcmtk/dcmdata/dcpcache.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h \ ../include/dcmtk/dcmdata/dcdeftag.h ../include/dcmtk/dcmdata/dcistrma.h \ ../include/dcmtk/dcmdata/dcobject.h ../include/dcmtk/dcmdata/dcostrma.h \ ../include/dcmtk/dcmdata/dcovlay.h ../include/dcmtk/dcmdata/dcvrpobw.h \ ../include/dcmtk/dcmdata/dcvrobow.h ../include/dcmtk/dcmdata/dcelem.h \ ../include/dcmtk/dcmdata/dcpixel.h ../include/dcmtk/dcmdata/dcsequen.h \ ../include/dcmtk/dcmdata/dcswap.h ../include/dcmtk/dcmdata/dcvr.h \ ../include/dcmtk/dcmdata/dcvrae.h ../include/dcmtk/dcmdata/dcbytstr.h \ ../include/dcmtk/dcmdata/dcvras.h ../include/dcmtk/dcmdata/dcvrat.h \ ../include/dcmtk/dcmdata/dcvrcs.h ../include/dcmtk/dcmdata/dcvrda.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../include/dcmtk/dcmdata/dcvrds.h \ ../../ofstd/include/dcmtk/ofstd/ofvector.h \ ../include/dcmtk/dcmdata/dcvrdt.h \ ../../ofstd/include/dcmtk/ofstd/ofdatime.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../include/dcmtk/dcmdata/dcvrfd.h ../include/dcmtk/dcmdata/dcvrfl.h \ ../include/dcmtk/dcmdata/dcvris.h ../include/dcmtk/dcmdata/dcvrlo.h \ ../include/dcmtk/dcmdata/dcchrstr.h ../include/dcmtk/dcmdata/dcvrlt.h \ ../include/dcmtk/dcmdata/dcvrobow.h ../include/dcmtk/dcmdata/dcvrof.h \ ../include/dcmtk/dcmdata/dcvrfl.h ../include/dcmtk/dcmdata/dcvrpn.h \ ../include/dcmtk/dcmdata/dcvrsh.h ../include/dcmtk/dcmdata/dcvrsl.h \ ../include/dcmtk/dcmdata/dcvrss.h ../include/dcmtk/dcmdata/dcvrst.h \ ../include/dcmtk/dcmdata/dcvrtm.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../include/dcmtk/dcmdata/dcvrui.h ../include/dcmtk/dcmdata/dcvrul.h \ ../include/dcmtk/dcmdata/dcvrulup.h ../include/dcmtk/dcmdata/dcvrul.h \ ../include/dcmtk/dcmdata/dcvrus.h ../include/dcmtk/dcmdata/dcvrut.h \ ../include/dcmtk/dcmdata/dcxfer.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h dclist.o: dclist.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dclist.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcobject.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../include/dcmtk/dcmdata/dcvr.h ../include/dcmtk/dcmdata/dctag.h \ ../include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmdata/dcstack.h dcmetinf.o: dcmetinf.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcmetinf.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dcitem.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcobject.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dcvr.h \ ../include/dcmtk/dcmdata/dctag.h ../include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmdata/dcstack.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../include/dcmtk/dcmdata/dcpcache.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../include/dcmtk/dcmdata/dcitem.h ../include/dcmtk/dcmdata/dcxfer.h \ ../include/dcmtk/dcmdata/dcvrul.h ../include/dcmtk/dcmdata/dcelem.h \ ../include/dcmtk/dcmdata/dcdeftag.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h \ ../include/dcmtk/dcmdata/dcistrma.h ../include/dcmtk/dcmdata/dcistrmf.h \ ../include/dcmtk/dcmdata/dcistrma.h ../include/dcmtk/dcmdata/dcostrma.h dcobject.o: dcobject.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../include/dcmtk/dcmdata/dcobject.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcvr.h ../include/dcmtk/dcmdata/dctag.h \ ../include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmdata/dcstack.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../include/dcmtk/dcmdata/dcdeftag.h ../include/dcmtk/dcmdata/dcvr.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dcswap.h \ ../include/dcmtk/dcmdata/dcistrma.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../include/dcmtk/dcmdata/dcostrma.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h dcostrma.o: dcostrma.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmdata/dcostrma.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcvr.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcostrmz.h ../include/dcmtk/dcmdata/dcostrma.h \ ../include/dcmtk/dcmdata/dcerror.h dcostrmb.o: dcostrmb.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmdata/dcostrmb.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dcostrma.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcvr.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcerror.h dcostrmf.o: dcostrmf.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmdata/dcostrmf.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dcostrma.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcvr.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h dcostrmz.o: dcostrmz.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmdata/dcostrmz.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dcostrma.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcvr.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcerror.h dcpath.o: dcpath.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmdata/dcpath.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dcdatset.h ../include/dcmtk/dcmdata/dcitem.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcobject.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dcvr.h \ ../include/dcmtk/dcmdata/dctag.h ../include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmdata/dcstack.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../include/dcmtk/dcmdata/dcpcache.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../include/dcmtk/dcmdata/dcsequen.h ../include/dcmtk/dcmdata/dcelem.h dcpcache.o: dcpcache.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmdata/dcpcache.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../include/dcmtk/dcmdata/dcelem.h ../include/dcmtk/dcmdata/dcobject.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcvr.h ../include/dcmtk/dcmdata/dctag.h \ ../include/dcmtk/dcmdata/dcstack.h dcpixel.o: dcpixel.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmdata/dcpixel.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dcvrpobw.h ../include/dcmtk/dcmdata/dcvrobow.h \ ../include/dcmtk/dcmdata/dcelem.h ../include/dcmtk/dcmdata/dcobject.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcvr.h ../include/dcmtk/dcmdata/dctag.h \ ../include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmdata/dcstack.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../include/dcmtk/dcmdata/dccodec.h ../include/dcmtk/dcmdata/dcpixseq.h \ ../include/dcmtk/dcmdata/dcsequen.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../include/dcmtk/dcmdata/dcofsetl.h ../include/dcmtk/dcmdata/dcdeftag.h \ ../include/dcmtk/dcmdata/dcitem.h ../include/dcmtk/dcmdata/dcpcache.h dcpixseq.o: dcpixseq.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../include/dcmtk/dcmdata/dcpixseq.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dcsequen.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcelem.h ../include/dcmtk/dcmdata/dcobject.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcvr.h ../include/dcmtk/dcmdata/dctag.h \ ../include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmdata/dcstack.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../include/dcmtk/dcmdata/dcofsetl.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../include/dcmtk/dcmdata/dcpxitem.h ../include/dcmtk/dcmdata/dcvrobow.h \ ../include/dcmtk/dcmdata/dcitem.h ../include/dcmtk/dcmdata/dcpcache.h \ ../include/dcmtk/dcmdata/dcvr.h ../include/dcmtk/dcmdata/dcdeftag.h dcpxitem.o: dcpxitem.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../include/dcmtk/dcmdata/dcpxitem.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dcvrobow.h ../include/dcmtk/dcmdata/dcelem.h \ ../include/dcmtk/dcmdata/dcobject.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcvr.h ../include/dcmtk/dcmdata/dctag.h \ ../include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmdata/dcstack.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../include/dcmtk/dcmdata/dcofsetl.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../include/dcmtk/dcmdata/dcswap.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcistrma.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../include/dcmtk/dcmdata/dcostrma.h ../include/dcmtk/dcmdata/dcwcache.h \ ../include/dcmtk/dcmdata/dcfcache.h ../include/dcmtk/dcmdata/dcistrma.h dcrleccd.o: dcrleccd.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmdata/dcrleccd.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dccodec.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dcvr.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../include/dcmtk/dcmdata/dcrlecp.h ../include/dcmtk/dcmdata/dcrledec.h \ ../include/dcmtk/dcmdata/dcerror.h ../include/dcmtk/dcmdata/dcdatset.h \ ../include/dcmtk/dcmdata/dcitem.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcobject.h ../include/dcmtk/dcmdata/dctag.h \ ../include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmdata/dcstack.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../include/dcmtk/dcmdata/dcpcache.h ../include/dcmtk/dcmdata/dcdeftag.h \ ../include/dcmtk/dcmdata/dcpixseq.h ../include/dcmtk/dcmdata/dcsequen.h \ ../include/dcmtk/dcmdata/dcelem.h ../include/dcmtk/dcmdata/dcofsetl.h \ ../include/dcmtk/dcmdata/dcpxitem.h ../include/dcmtk/dcmdata/dcvrobow.h \ ../include/dcmtk/dcmdata/dcvrpobw.h ../include/dcmtk/dcmdata/dcswap.h \ ../include/dcmtk/dcmdata/dcuid.h dcrlecce.o: dcrlecce.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmdata/dcrlecce.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dccodec.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dcvr.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../include/dcmtk/dcmdata/dcrleenc.h ../include/dcmtk/dcmdata/dcrlecp.h \ ../include/dcmtk/dcmdata/dcdeftag.h ../include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmdata/dcpixseq.h ../include/dcmtk/dcmdata/dcsequen.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcelem.h ../include/dcmtk/dcmdata/dcobject.h \ ../include/dcmtk/dcmdata/dcerror.h ../include/dcmtk/dcmdata/dctag.h \ ../include/dcmtk/dcmdata/dcstack.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../include/dcmtk/dcmdata/dcofsetl.h ../include/dcmtk/dcmdata/dcpxitem.h \ ../include/dcmtk/dcmdata/dcvrobow.h ../include/dcmtk/dcmdata/dcswap.h \ ../include/dcmtk/dcmdata/dcitem.h ../include/dcmtk/dcmdata/dcpcache.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h dcrlecp.o: dcrlecp.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmdata/dcrlecp.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dccodec.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dcvr.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h dcrledrg.o: dcrledrg.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmdata/dcrledrg.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dccodec.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dcvr.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../include/dcmtk/dcmdata/dcrleccd.h ../include/dcmtk/dcmdata/dccodec.h \ ../include/dcmtk/dcmdata/dcrlecp.h dcrleerg.o: dcrleerg.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmdata/dcrleerg.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dccodec.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dcvr.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../include/dcmtk/dcmdata/dcrlecce.h ../include/dcmtk/dcmdata/dccodec.h \ ../include/dcmtk/dcmdata/dcrlecp.h dcrlerp.o: dcrlerp.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmdata/dcrlerp.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dcpixel.h ../include/dcmtk/dcmdata/dcvrpobw.h \ ../include/dcmtk/dcmdata/dcvrobow.h ../include/dcmtk/dcmdata/dcelem.h \ ../include/dcmtk/dcmdata/dcobject.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcvr.h ../include/dcmtk/dcmdata/dctag.h \ ../include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmdata/dcstack.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h dcsequen.o: dcsequen.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../include/dcmtk/dcmdata/dcsequen.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../include/dcmtk/dcmdata/dcelem.h ../include/dcmtk/dcmdata/dcobject.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcvr.h ../include/dcmtk/dcmdata/dctag.h \ ../include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmdata/dcstack.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../include/dcmtk/dcmdata/dcitem.h ../include/dcmtk/dcmdata/dcpcache.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../include/dcmtk/dcmdata/dcdirrec.h ../include/dcmtk/dcmdata/dcitem.h \ ../include/dcmtk/dcmdata/dcsequen.h ../include/dcmtk/dcmdata/dcfilefo.h \ ../include/dcmtk/dcmdata/dcdatset.h ../include/dcmtk/dcmdata/dcvr.h \ ../include/dcmtk/dcmdata/dcpxitem.h ../include/dcmtk/dcmdata/dcvrobow.h \ ../include/dcmtk/dcmdata/dcofsetl.h ../include/dcmtk/dcmdata/dcswap.h \ ../include/dcmtk/dcmdata/dcmetinf.h ../include/dcmtk/dcmdata/dcdeftag.h \ ../include/dcmtk/dcmdata/dcistrma.h ../include/dcmtk/dcmdata/dcostrma.h dcstack.o: dcstack.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../include/dcmtk/dcmdata/dcstack.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h dcswap.o: dcswap.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmdata/dcswap.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcvr.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h dctag.o: dctag.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmdata/dctag.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmdata/dcvr.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../include/dcmtk/dcmdata/dcerror.h ../include/dcmtk/dcmdata/dcdict.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../include/dcmtk/dcmdata/dchashdi.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../include/dcmtk/dcmdata/dcdicent.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h dctagkey.o: dctagkey.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmdata/dctagkey.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h dctypes.o: dctypes.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmdata/dctypes.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h dcuid.o: dcuid.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../include/dcmtk/dcmdata/dcuid.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofcrc32.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h dcvm.o: dcvm.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmdata/dcvm.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../config/include/dcmtk/config/osconfig.h dcvrae.o: dcvrae.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmdata/dcvrae.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dcbytstr.h ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcelem.h ../include/dcmtk/dcmdata/dcobject.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dcvr.h \ ../include/dcmtk/dcmdata/dctag.h ../include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmdata/dcstack.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h dcvras.o: dcvras.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmdata/dcvras.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dcbytstr.h ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcelem.h ../include/dcmtk/dcmdata/dcobject.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dcvr.h \ ../include/dcmtk/dcmdata/dctag.h ../include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmdata/dcstack.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h dcvrat.o: dcvrat.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dcvrat.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dcelem.h ../include/dcmtk/dcmdata/dcobject.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcvr.h ../include/dcmtk/dcmdata/dctag.h \ ../include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmdata/dcstack.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../include/dcmtk/dcmdata/dcvm.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h dcvr.o: dcvr.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmdata/dcvr.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h dcvrcs.o: dcvrcs.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dcvrcs.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dcbytstr.h ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcelem.h ../include/dcmtk/dcmdata/dcobject.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dcvr.h \ ../include/dcmtk/dcmdata/dctag.h ../include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmdata/dcstack.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h dcvrda.o: dcvrda.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmdata/dcvrda.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dcbytstr.h ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcelem.h ../include/dcmtk/dcmdata/dcobject.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dcvr.h \ ../include/dcmtk/dcmdata/dctag.h ../include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmdata/dcstack.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h dcvrds.o: dcvrds.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmdata/dcvrds.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofvector.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../include/dcmtk/dcmdata/dcbytstr.h ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcelem.h ../include/dcmtk/dcmdata/dcobject.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dcvr.h \ ../include/dcmtk/dcmdata/dctag.h ../include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmdata/dcstack.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h dcvrdt.o: dcvrdt.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmdata/dcvrdt.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dcbytstr.h ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcelem.h ../include/dcmtk/dcmdata/dcobject.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dcvr.h \ ../include/dcmtk/dcmdata/dctag.h ../include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmdata/dcstack.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofdatime.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../include/dcmtk/dcmdata/dcvrda.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../include/dcmtk/dcmdata/dcvrtm.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h dcvrfd.o: dcvrfd.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcvrfd.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dcelem.h ../include/dcmtk/dcmdata/dcobject.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcvr.h ../include/dcmtk/dcmdata/dctag.h \ ../include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmdata/dcstack.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../include/dcmtk/dcmdata/dcvm.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h dcvrfl.o: dcvrfl.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcvrfl.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dcelem.h ../include/dcmtk/dcmdata/dcobject.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcvr.h ../include/dcmtk/dcmdata/dctag.h \ ../include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmdata/dcstack.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../include/dcmtk/dcmdata/dcvm.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h dcvris.o: dcvris.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmdata/dcvris.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dcbytstr.h ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcelem.h ../include/dcmtk/dcmdata/dcobject.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dcvr.h \ ../include/dcmtk/dcmdata/dctag.h ../include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmdata/dcstack.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h dcvrlo.o: dcvrlo.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmdata/dcvrlo.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dcchrstr.h ../include/dcmtk/dcmdata/dcbytstr.h \ ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcelem.h ../include/dcmtk/dcmdata/dcobject.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dcvr.h \ ../include/dcmtk/dcmdata/dctag.h ../include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmdata/dcstack.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h dcvrlt.o: dcvrlt.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmdata/dcvrlt.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dcchrstr.h ../include/dcmtk/dcmdata/dcbytstr.h \ ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcelem.h ../include/dcmtk/dcmdata/dcobject.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dcvr.h \ ../include/dcmtk/dcmdata/dctag.h ../include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmdata/dcstack.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h dcvrobow.o: dcvrobow.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../include/dcmtk/dcmdata/dcvrobow.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dcelem.h ../include/dcmtk/dcmdata/dcobject.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcvr.h ../include/dcmtk/dcmdata/dctag.h \ ../include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmdata/dcstack.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../include/dcmtk/dcmdata/dcdeftag.h ../include/dcmtk/dcmdata/dcswap.h \ ../include/dcmtk/dcmdata/dcvm.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h dcvrof.o: dcvrof.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmdata/dcvrof.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dcvrfl.h ../include/dcmtk/dcmdata/dcelem.h \ ../include/dcmtk/dcmdata/dcobject.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcvr.h ../include/dcmtk/dcmdata/dctag.h \ ../include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmdata/dcstack.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../include/dcmtk/dcmdata/dcvrfl.h dcvrpn.o: dcvrpn.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmdata/dcvrpn.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dcchrstr.h ../include/dcmtk/dcmdata/dcbytstr.h \ ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcelem.h ../include/dcmtk/dcmdata/dcobject.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dcvr.h \ ../include/dcmtk/dcmdata/dctag.h ../include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmdata/dcstack.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h dcvrpobw.o: dcvrpobw.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmdata/dcvrpobw.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dcvrobow.h ../include/dcmtk/dcmdata/dcelem.h \ ../include/dcmtk/dcmdata/dcobject.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcvr.h ../include/dcmtk/dcmdata/dctag.h \ ../include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmdata/dcstack.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h dcvrsh.o: dcvrsh.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmdata/dcvrsh.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dcchrstr.h ../include/dcmtk/dcmdata/dcbytstr.h \ ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcelem.h ../include/dcmtk/dcmdata/dcobject.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dcvr.h \ ../include/dcmtk/dcmdata/dctag.h ../include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmdata/dcstack.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h dcvrsl.o: dcvrsl.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dcvrsl.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dcelem.h ../include/dcmtk/dcmdata/dcobject.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcvr.h ../include/dcmtk/dcmdata/dctag.h \ ../include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmdata/dcstack.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../include/dcmtk/dcmdata/dcvm.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h dcvrss.o: dcvrss.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dcvrss.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dcelem.h ../include/dcmtk/dcmdata/dcobject.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcvr.h ../include/dcmtk/dcmdata/dctag.h \ ../include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmdata/dcstack.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../include/dcmtk/dcmdata/dcvm.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h dcvrst.o: dcvrst.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmdata/dcvrst.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dcchrstr.h ../include/dcmtk/dcmdata/dcbytstr.h \ ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcelem.h ../include/dcmtk/dcmdata/dcobject.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dcvr.h \ ../include/dcmtk/dcmdata/dctag.h ../include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmdata/dcstack.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h dcvrtm.o: dcvrtm.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmdata/dcvrtm.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcbytstr.h ../include/dcmtk/dcmdata/dcelem.h \ ../include/dcmtk/dcmdata/dcobject.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dcvr.h \ ../include/dcmtk/dcmdata/dctag.h ../include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmdata/dcstack.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h dcvrui.o: dcvrui.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcvrui.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dcbytstr.h ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcelem.h ../include/dcmtk/dcmdata/dcobject.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dcvr.h \ ../include/dcmtk/dcmdata/dctag.h ../include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmdata/dcstack.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../include/dcmtk/dcmdata/dcuid.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h dcvrul.o: dcvrul.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dcvrul.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dcelem.h ../include/dcmtk/dcmdata/dcobject.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcvr.h ../include/dcmtk/dcmdata/dctag.h \ ../include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmdata/dcstack.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../include/dcmtk/dcmdata/dcvm.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h dcvrulup.o: dcvrulup.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmdata/dcvrulup.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dcvrul.h ../include/dcmtk/dcmdata/dcelem.h \ ../include/dcmtk/dcmdata/dcobject.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcvr.h ../include/dcmtk/dcmdata/dctag.h \ ../include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmdata/dcstack.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h dcvrus.o: dcvrus.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dcvrus.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dcelem.h ../include/dcmtk/dcmdata/dcobject.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcvr.h ../include/dcmtk/dcmdata/dctag.h \ ../include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmdata/dcstack.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../include/dcmtk/dcmdata/dcvm.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h dcvrut.o: dcvrut.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmdata/dcvrut.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcchrstr.h ../include/dcmtk/dcmdata/dcbytstr.h \ ../include/dcmtk/dcmdata/dcelem.h ../include/dcmtk/dcmdata/dcobject.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dcvr.h \ ../include/dcmtk/dcmdata/dctag.h ../include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmdata/dcstack.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h dcwcache.o: dcwcache.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmdata/dcwcache.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dcfcache.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcistrma.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dcxfer.h ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcvr.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../include/dcmtk/dcmdata/dcelem.h ../include/dcmtk/dcmdata/dcobject.h \ ../include/dcmtk/dcmdata/dcerror.h ../include/dcmtk/dcmdata/dctag.h \ ../include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmdata/dcstack.h ../include/dcmtk/dcmdata/dcostrma.h dcxfer.o: dcxfer.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmdata/dcxfer.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmdata/dcvr.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../include/dcmtk/dcmdata/dcuid.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h mkdeftag.o: mkdeftag.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dcdict.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../include/dcmtk/dcmdata/dchashdi.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../include/dcmtk/dcmdata/cmdlnarg.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofdatime.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../include/dcmtk/dcmdata/dcdicent.h ../include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmdata/dcvr.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h mkdictbi.o: mkdictbi.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmdata/dcdict.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../include/dcmtk/dcmdata/dchashdi.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../include/dcmtk/dcmdata/cmdlnarg.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofdatime.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../include/dcmtk/dcmdata/dcdicent.h ../include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmdata/dcvr.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h vrscan.o: vrscan.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmdata/vrscan.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofbmanip.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h vrscani.h vrscanl.h dcmtk-3.6.0/dcmdata/libsrc/dcostrmz.cc0000644000310500011400000002716411455601040017074 0ustar joergrdicom3/* * * Copyright (C) 2002-2010, 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: dcmdata * * Author: Marco Eichelberg * * Purpose: zlib compression filter for output streams * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:14:08 $ * CVS/RCS Revision: $Revision: 1.8 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" #ifdef WITH_ZLIB #include "dcmtk/dcmdata/dcostrmz.h" #include "dcmtk/dcmdata/dcerror.h" #define DCMZLIBOUTPUTFILTER_BUFSIZE 4096 /* taken from zutil.h */ #if MAX_MEM_LEVEL >= 8 #define DEF_MEM_LEVEL 8 #else #define DEF_MEM_LEVEL MAX_MEM_LEVEL #endif OFGlobal dcmZlibCompressionLevel(Z_DEFAULT_COMPRESSION); DcmZLibOutputFilter::DcmZLibOutputFilter() : DcmOutputFilter() , current_(NULL) , zstream_(new z_stream) , status_(EC_MemoryExhausted) , flushed_(OFFalse) , inputBuf_(new unsigned char[DCMZLIBOUTPUTFILTER_BUFSIZE]) , inputBufStart_(0) , inputBufCount_(0) , outputBuf_(new unsigned char[DCMZLIBOUTPUTFILTER_BUFSIZE]) , outputBufStart_(0) , outputBufCount_(0) { if (zstream_ && inputBuf_ && outputBuf_) { zstream_->zalloc = Z_NULL; zstream_->zfree = Z_NULL; zstream_->opaque = Z_NULL; #ifdef ZLIB_ENCODE_RFC1950_HEADER /* create deflated ZLIB format instead of deflated bitstream format * (i.e. RFC 1950 instead of RFC 1951). * THE RESULTING BITSTREAM IS NOT DICOM COMPLIANT! * Use only for testing, and use with care. */ if (Z_OK == deflateInit(zstream_, dcmZlibCompressionLevel.get())) #else /* windowBits is passed < 0 to suppress zlib header */ if (Z_OK == deflateInit2(zstream_, dcmZlibCompressionLevel.get(), Z_DEFLATED, -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY)) #endif { status_ = EC_Normal; } else { OFString etext = "ZLib Error: "; if (zstream_->msg) etext += zstream_->msg; status_ = makeOFCondition(OFM_dcmdata, 16, OF_error, etext.c_str()); } } } DcmZLibOutputFilter::~DcmZLibOutputFilter() { if (zstream_) { deflateEnd(zstream_); // discards any unprocessed input and does not flush any pending output delete zstream_; } delete[] inputBuf_; delete[] outputBuf_; } OFBool DcmZLibOutputFilter::good() const { return status_.good(); } OFCondition DcmZLibOutputFilter::status() const { return status_; } OFBool DcmZLibOutputFilter::isFlushed() const { if (status_.bad() || (current_ == NULL)) return OFTrue; return (inputBufCount_ == 0) && (outputBufCount_ == 0) && flushed_ && current_->isFlushed(); } offile_off_t DcmZLibOutputFilter::avail() const { // compute number of bytes available in input buffer if (status_.good() ) return DCMZLIBOUTPUTFILTER_BUFSIZE - inputBufCount_; else return 0; } void DcmZLibOutputFilter::flushOutputBuffer() { if (outputBufCount_) { // flush from outputBufStart_ to end of data or end of buffer, whatever comes first offile_off_t numBytes = (outputBufStart_ + outputBufCount_ > DCMZLIBOUTPUTFILTER_BUFSIZE) ? (DCMZLIBOUTPUTFILTER_BUFSIZE - outputBufStart_) : outputBufCount_ ; offile_off_t written = current_->write(outputBuf_ + outputBufStart_, numBytes); // adjust counters outputBufCount_ -= written; outputBufStart_ += written; if (outputBufStart_ == DCMZLIBOUTPUTFILTER_BUFSIZE) { // wrapped around outputBufStart_ = 0; // now flush to end of data if (outputBufCount_ && written) { written = current_->write(outputBuf_, outputBufCount_); // adjust counters outputBufCount_ -= written; outputBufStart_ += written; } } // reset buffer start to make things faster if (outputBufCount_ == 0) outputBufStart_ = 0; } } offile_off_t DcmZLibOutputFilter::fillInputBuffer(const void *buf, offile_off_t buflen) { offile_off_t result = 0; if (buf && buflen && inputBufCount_ < DCMZLIBOUTPUTFILTER_BUFSIZE) { const unsigned char *data = OFstatic_cast(const unsigned char *, buf); // use first part of input buffer if (inputBufStart_ + inputBufCount_ < DCMZLIBOUTPUTFILTER_BUFSIZE) { result = DCMZLIBOUTPUTFILTER_BUFSIZE - (inputBufStart_ + inputBufCount_); if (result > buflen) result = buflen; memcpy(inputBuf_ + inputBufStart_ + inputBufCount_, data, OFstatic_cast(size_t, result)); inputBufCount_ += result; data += result; buflen -= result; } // use second part of input buffer if (buflen && (inputBufCount_ < DCMZLIBOUTPUTFILTER_BUFSIZE) && inputBufStart_ + inputBufCount_ >= DCMZLIBOUTPUTFILTER_BUFSIZE) { offile_off_t len = DCMZLIBOUTPUTFILTER_BUFSIZE - inputBufCount_; if (len > buflen) len = buflen; memcpy(inputBuf_ + (inputBufStart_ + inputBufCount_ - DCMZLIBOUTPUTFILTER_BUFSIZE), data, OFstatic_cast(size_t, len)); inputBufCount_ += len; result += len; } } return result; } void DcmZLibOutputFilter::compressInputBuffer(OFBool finalize) { if (inputBufCount_ || finalize) { // flush from inputBufStart_ to end of data or end of buffer, whatever comes first offile_off_t numBytes = (inputBufStart_ + inputBufCount_ > DCMZLIBOUTPUTFILTER_BUFSIZE) ? (DCMZLIBOUTPUTFILTER_BUFSIZE - inputBufStart_) : inputBufCount_ ; offile_off_t written = compress(inputBuf_ + inputBufStart_, numBytes, finalize); // adjust counters inputBufCount_ -= written; inputBufStart_ += written; if (inputBufStart_ == DCMZLIBOUTPUTFILTER_BUFSIZE) { // wrapped around inputBufStart_ = 0; // now flush to end of data if (inputBufCount_ && written) { written = compress(inputBuf_, inputBufCount_, finalize); // adjust counters inputBufCount_ -= written; inputBufStart_ += written; } } // reset buffer start to make things faster if (inputBufCount_ == 0) inputBufStart_ = 0; } } offile_off_t DcmZLibOutputFilter::compress(const void *buf, offile_off_t buflen, OFBool finalize) { offile_off_t result = 0; if (outputBufCount_ < DCMZLIBOUTPUTFILTER_BUFSIZE) { zstream_->next_in = OFstatic_cast(Bytef *, OFconst_cast(void *, buf)); zstream_->avail_in = OFstatic_cast(uInt, buflen); int zstatus; // use first part of output buffer if (outputBufStart_ + outputBufCount_ < DCMZLIBOUTPUTFILTER_BUFSIZE) { zstream_->next_out = OFstatic_cast(Bytef *, outputBuf_ + outputBufStart_ + outputBufCount_); zstream_->avail_out = OFstatic_cast(uInt, DCMZLIBOUTPUTFILTER_BUFSIZE - (outputBufStart_ + outputBufCount_)); zstatus = deflate(zstream_, (finalize ? Z_FINISH : 0)); if (zstatus == Z_OK || zstatus == Z_BUF_ERROR) { /* everything OK */ } else if (zstatus == Z_STREAM_END) flushed_ = OFTrue; else { OFString etext = "ZLib Error: "; if (zstream_->msg) etext += zstream_->msg; status_ = makeOFCondition(OFM_dcmdata, 16, OF_error, etext.c_str()); } outputBufCount_ = DCMZLIBOUTPUTFILTER_BUFSIZE - outputBufStart_ - OFstatic_cast(offile_off_t, zstream_->avail_out); } // use second part of output buffer if ((outputBufCount_ < DCMZLIBOUTPUTFILTER_BUFSIZE) && outputBufStart_ + outputBufCount_ >= DCMZLIBOUTPUTFILTER_BUFSIZE) { zstream_->next_out = OFstatic_cast(Bytef *, outputBuf_ + (outputBufStart_ + outputBufCount_ - DCMZLIBOUTPUTFILTER_BUFSIZE)); zstream_->avail_out = OFstatic_cast(uInt, DCMZLIBOUTPUTFILTER_BUFSIZE - outputBufCount_); zstatus = deflate(zstream_, (finalize ? Z_FINISH : 0)); if (zstatus == Z_OK || zstatus == Z_BUF_ERROR) { /* everything OK */ } else if (zstatus == Z_STREAM_END) flushed_ = OFTrue; else { OFString etext = "ZLib Error: "; if (zstream_->msg) etext += zstream_->msg; status_ = makeOFCondition(OFM_dcmdata, 16, OF_error, etext.c_str()); } outputBufCount_ = DCMZLIBOUTPUTFILTER_BUFSIZE - OFstatic_cast(offile_off_t, zstream_->avail_out); } result = (buflen - OFstatic_cast(offile_off_t, zstream_->avail_in)); } return result; } offile_off_t DcmZLibOutputFilter::write(const void *buf, offile_off_t buflen) { if (status_.bad() || (current_ == NULL)) return 0; // flush output buffer if necessary if (outputBufCount_ == DCMZLIBOUTPUTFILTER_BUFSIZE) flushOutputBuffer(); // compress pending input from input buffer while (status_.good() && inputBufCount_ > 0 && outputBufCount_ < DCMZLIBOUTPUTFILTER_BUFSIZE) { compressInputBuffer(OFFalse); if (outputBufCount_ == DCMZLIBOUTPUTFILTER_BUFSIZE) flushOutputBuffer(); } const unsigned char *data = OFstatic_cast(const unsigned char *, buf); offile_off_t result = 0; // compress user data only if input buffer is empty if (inputBufCount_ == 0) { while (status_.good() && (buflen > result) && outputBufCount_ < DCMZLIBOUTPUTFILTER_BUFSIZE) { result += compress(data+result, buflen-result, OFFalse); if (outputBufCount_ == DCMZLIBOUTPUTFILTER_BUFSIZE) flushOutputBuffer(); } } // finally stuff as much into the input buffer as possible result += fillInputBuffer(data+result, buflen-result); // total number of bytes consumed from input return result; } void DcmZLibOutputFilter::flush() { if (status_.good() && current_) { // flush output buffer first if (outputBufCount_ == DCMZLIBOUTPUTFILTER_BUFSIZE) flushOutputBuffer(); // compress pending input from input buffer while (status_.good() && inputBufCount_ > 0 && outputBufCount_ < DCMZLIBOUTPUTFILTER_BUFSIZE) { compressInputBuffer(OFTrue); if (outputBufCount_ == DCMZLIBOUTPUTFILTER_BUFSIZE) flushOutputBuffer(); } while (status_.good() && (! flushed_) && outputBufCount_ < DCMZLIBOUTPUTFILTER_BUFSIZE) { // create output from compression engine until end of compressed stream compress(NULL, 0, OFTrue); if (outputBufCount_ == DCMZLIBOUTPUTFILTER_BUFSIZE) flushOutputBuffer(); } // final attempt to flush output buffer if (outputBufCount_ > 0) flushOutputBuffer(); } } void DcmZLibOutputFilter::append(DcmConsumer& consumer) { current_ = &consumer; } #else /* WITH_ZLIB */ /* make sure that the object file is not completely empty if compiled * without zlib because some linkers might fail otherwise. */ void dcostrmz_dummy_function() { return; } #endif /* WITH_ZLIB */ /* * CVS/RCS Log: * $Log: dcostrmz.cc,v $ * Revision 1.8 2010-10-14 13:14:08 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.7 2009-11-04 09:58:10 uli * Switched to logging mechanism provided by the "new" oflog module * * Revision 1.6 2007-02-19 16:06:10 meichel * Class DcmOutputStream and related classes are now safe for use with * large files (2 GBytes or more) if supported by compiler and operating system. * * Revision 1.5 2005/12/08 15:41:23 meichel * Changed include path schema for all DCMTK header files * * Revision 1.4 2004/04/07 12:19:14 joergr * Adapted type casts to new-style typecast operators defined in ofcast.h. * * Revision 1.3 2002/12/20 14:55:34 wilkens * Inserted three casts in order to get rid of compiler warning on Solaris 2.5.1 * using compiler SC 2.0.1. * * Revision 1.2 2002/08/29 15:57:49 meichel * Updated zlib-related classes to correctly compile when WITH_ZLIB is undefined * * Revision 1.1 2002/08/27 16:55:54 meichel * Initial release of new DICOM I/O stream classes that add support for stream * compression (deflated little endian explicit VR transfer syntax) * * */ dcmtk-3.6.0/dcmdata/libsrc/dcswap.cc0000644000310500011400000001175111455601041016504 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Andreas Barth * * Purpose: byte order functions * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:14:09 $ * CVS/RCS Revision: $Revision: 1.17 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcswap.h" OFCondition swapIfNecessary(const E_ByteOrder newByteOrder, const E_ByteOrder oldByteOrder, void * value, const Uint32 byteLength, const size_t valWidth) /* * This function swaps byteLength bytes in value if newByteOrder and oldByteOrder * differ from each other. In case bytes have to be swapped, these bytes are seperated * in valWidth elements which will be swapped seperately. * * Parameters: * newByteOrder - [in] The new byte ordering (little or big endian). * oldByteOrder - [in] The current old byte ordering (little or big endian). * value - [in] Array that contains the actual bytes which might have to be swapped. * byteLength - [in] Length of the above array. * valWidth - [in] Specifies how many bytes shall be treated together as one element. */ { /* if the two byte orderings are unknown this is an illegal call */ if(oldByteOrder != EBO_unknown && newByteOrder != EBO_unknown ) { /* and if they differ from each other and valWidth is not 1 */ if (oldByteOrder != newByteOrder && valWidth != 1) { /* in case the array length equals valWidth and only 2 or 4 bytes have to be swapped */ /* we can swiftly swap these bytes by calling the corresponding functions. If this is */ /* not the case we have to call a more sophisticated function. */ if (byteLength == valWidth) { if (valWidth == 2) swap2Bytes(OFstatic_cast(Uint8 *, value)); else if (valWidth == 4) swap4Bytes(OFstatic_cast(Uint8 *, value)); else swapBytes(value, byteLength, valWidth); } else swapBytes(value, byteLength, valWidth); } return EC_Normal; } return EC_IllegalCall; } void swapBytes(void * value, const Uint32 byteLength, const size_t valWidth) /* * This function swaps byteLength bytes in value. These bytes are seperated * in valWidth elements which will be swapped seperately. * * Parameters: * value - [in] Array that contains the actual bytes which might have to be swapped. * byteLength - [in] Length of the above array. * valWidth - [in] Specifies how many bytes shall be treated together as one element. */ { /* use register (if available) to increase speed */ register Uint8 save; /* in case valWidth equals 2, swap correspondingly */ if (valWidth == 2) { register Uint8 * first = &OFstatic_cast(Uint8*, value)[0]; register Uint8 * second = &OFstatic_cast(Uint8*, value)[1]; register Uint32 times = byteLength/2; while(times--) { save = *first; *first = *second; *second = save; first +=2; second +=2; } } /* if valWidth is greater than 2, swap correspondingly */ else if (valWidth > 2) { register size_t i; const size_t halfWidth = valWidth/2; const size_t offset = valWidth-1; register Uint8 *start; register Uint8 *end; Uint32 times = byteLength/valWidth; Uint8 *base = OFstatic_cast(Uint8 *, value); while (times--) { i = halfWidth; start = base; end = base+offset; while (i--) { save = *start; *start++ = *end; *end-- = save; } base += valWidth; } } } Uint16 swapShort(const Uint16 toSwap) { Uint8 *swapped = OFreinterpret_cast(Uint8 *, OFconst_cast(Uint16 *, &toSwap)); swap2Bytes(swapped); return *OFreinterpret_cast(Uint16*, swapped); } /* * CVS/RCS Log: * $Log: dcswap.cc,v $ * Revision 1.17 2010-10-14 13:14:09 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.16 2009-11-04 09:58:10 uli * Switched to logging mechanism provided by the "new" oflog module * * Revision 1.15 2005-12-08 15:41:38 meichel * Changed include path schema for all DCMTK header files * * Revision 1.14 2004/02/04 16:45:00 joergr * Adapted type casts to new-style typecast operators defined in ofcast.h. * * Revision 1.13 2001/11/01 14:55:43 wilkens * Added lots of comments. * * Revision 1.12 2001/09/25 17:19:54 meichel * Adapted dcmdata to class OFCondition * * Revision 1.11 2001/06/01 15:49:10 meichel * Updated copyright header * * Revision 1.10 2000/03/08 16:26:42 meichel * Updated copyright header. * * Revision 1.9 1999/03/31 09:25:40 meichel * Updated copyright header in module dcmdata * * */ dcmtk-3.6.0/dcmdata/libsrc/dcvrui.cc0000644000310500011400000002607511462524221016526 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Gerd Ehlers, Andreas Barth * * Purpose: Implementation of class DcmUniqueIdentifier * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-29 10:57:21 $ * CVS/RCS Revision: $Revision: 1.35 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #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/ofstd/ofstd.h" #include "dcmtk/dcmdata/dcvrui.h" #include "dcmtk/dcmdata/dcuid.h" #define INCLUDE_CSTRING #define INCLUDE_CCTYPE #include "dcmtk/ofstd/ofstdinc.h" #define MAX_UI_LENGTH 64 // ******************************** DcmUniqueIdentifier::DcmUniqueIdentifier(const DcmTag &tag, const Uint32 len) : DcmByteString(tag, len) { /* padding character is NULL not a space! */ setPaddingChar('\0'); setMaxLength(MAX_UI_LENGTH); setNonSignificantChars("\\"); } DcmUniqueIdentifier::DcmUniqueIdentifier(const DcmUniqueIdentifier &old) : DcmByteString(old) { } DcmUniqueIdentifier::~DcmUniqueIdentifier() { } DcmUniqueIdentifier &DcmUniqueIdentifier::operator=(const DcmUniqueIdentifier &obj) { DcmByteString::operator=(obj); return *this; } OFCondition DcmUniqueIdentifier::copyFrom(const DcmObject& rhs) { if (this != &rhs) { if (rhs.ident() != ident()) return EC_IllegalCall; *this = OFstatic_cast(const DcmUniqueIdentifier &, rhs); } return EC_Normal; } // ******************************** DcmEVR DcmUniqueIdentifier::ident() const { return EVR_UI; } OFCondition DcmUniqueIdentifier::checkValue(const OFString &vm, const OFBool /*oldFormat*/) { OFString strVal; /* get "raw value" without any modifications (if possible) */ OFCondition l_error = getStringValue(strVal); if (l_error.good()) l_error = DcmUniqueIdentifier::checkStringValue(strVal, vm); return l_error; } // ******************************** void DcmUniqueIdentifier::print(STD_NAMESPACE ostream &out, const size_t flags, const int level, const char * /*pixelFileName*/, size_t * /*pixelCounter*/) { if (valueLoaded()) { /* get string data (possibly multi-valued) */ char *stringVal = NULL; getString(stringVal); if (stringVal != NULL) { const char *symbol = NULL; if (!(flags & DCMTypes::PF_doNotMapUIDsToNames)) { /* check whether UID number can be mapped to a UID name */ symbol = dcmFindNameOfUID(stringVal); } if ((symbol != NULL) && (strlen(symbol) > 0)) { const size_t bufSize = strlen(symbol) + 1 /* for "=" */ + 1; char *buffer = new char[bufSize]; if (buffer != NULL) { /* concatenate "=" and the UID name */ OFStandard::strlcpy(buffer, "=", bufSize); OFStandard::strlcat(buffer, symbol, bufSize); printInfoLine(out, flags, level, buffer, NULL /*tag*/, OFFalse /*isInfo*/); /* delete temporary character buffer */ delete[] buffer; } else /* could not allocate buffer */ DcmByteString::print(out, flags, level); } else /* no symbol (UID name) found or mapping switched off */ DcmByteString::print(out, flags, level); } else printInfoLine(out, flags, level, "(no value available)"); } else printInfoLine(out, flags, level, "(not loaded)"); } // ******************************** OFCondition DcmUniqueIdentifier::putString(const char *stringVal) { const char *uid = stringVal; /* check whether parameter contains a UID name instead of a UID number */ if ((stringVal != NULL) && (stringVal[0] == '=')) uid = dcmFindUIDFromName(stringVal + 1); /* call inherited method to set the UID string */ return DcmByteString::putString(uid); } // ******************************** OFCondition DcmUniqueIdentifier::makeMachineByteString() { /* get string data */ char *value = OFstatic_cast(char *, getValue()); /* check whether automatic input data correction is enabled */ if ((value != NULL) && dcmEnableAutomaticInputDataCorrection.get()) { const int len = strlen(value); /* ** Remove any leading, embedded, or trailing white space. ** This manipulation attempts to correct problems with ** incorrectly encoded UIDs which have been observed in ** some images. */ int k = 0; for (int i = 0; i < len; i++) { if (!isspace(OFstatic_cast(unsigned char, value[i]))) { value[k] = value[i]; k++; } } value[k] = '\0'; } /* call inherited method: re-computes the string length, etc. */ return DcmByteString::makeMachineByteString(); } // ******************************** OFCondition DcmUniqueIdentifier::checkStringValue(const OFString &value, const OFString &vm) { return DcmByteString::checkStringValue(value, vm, "ui", 9, MAX_UI_LENGTH); } /* ** CVS/RCS Log: ** $Log: dcvrui.cc,v $ ** Revision 1.35 2010-10-29 10:57:21 joergr ** Added support for colored output to the print() method. ** ** Revision 1.34 2010-10-20 16:44:18 joergr ** Use type cast macros (e.g. OFstatic_cast) where appropriate. ** ** Revision 1.33 2010-10-20 07:41:35 uli ** Made sure isalpha() & friends are only called with valid arguments. ** ** Revision 1.32 2010-10-14 13:14:11 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.31 2010-04-23 14:30:35 joergr ** Added new method to all VR classes which checks whether the stored value ** conforms to the VR definition and to the specified VM. ** ** Revision 1.30 2009-08-07 14:35:49 joergr ** Enhanced isEmpty() method by checking whether the data element value consists ** of non-significant characters only. ** ** Revision 1.29 2009-08-03 09:03:00 joergr ** Added methods that check whether a given string value conforms to the VR and ** VM definitions of the DICOM standards. ** ** Revision 1.28 2008-07-17 10:31:32 onken ** Implemented copyFrom() method for complete DcmObject class hierarchy, which ** permits setting an instance's value from an existing object. Implemented ** assignment operator where necessary. ** ** Revision 1.27 2008-02-26 16:59:55 joergr ** Added new print flag that disables the mapping of well-known UID numbers to ** their associated names (e.g. transfer syntax or SOP class). ** ** Revision 1.26 2007/06/29 14:17:49 meichel ** Code clean-up: Most member variables in module dcmdata are now private, ** not protected anymore. ** ** Revision 1.25 2006/10/13 10:08:44 joergr ** Renamed variable "string" to "stringVal". ** ** Revision 1.24 2006/08/15 15:49:54 meichel ** Updated all code in module dcmdata to correctly compile when ** all standard C++ classes remain in namespace std. ** ** Revision 1.23 2005/12/08 15:42:06 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.22 2004/01/16 13:46:03 joergr ** Adapted type casts to new-style typecast operators defined in ofcast.h. ** ** Revision 1.21 2002/12/06 13:19:26 joergr ** Enhanced "print()" function by re-working the implementation and replacing ** the boolean "showFullData" parameter by a more general integer flag. ** Made source code formatting more consistent with other modules/files. ** ** Revision 1.20 2002/11/27 12:06:59 meichel ** Adapted module dcmdata to use of new header file ofstdinc.h ** ** Revision 1.19 2001/09/25 17:20:01 meichel ** Adapted dcmdata to class OFCondition ** ** Revision 1.18 2001/06/01 15:49:21 meichel ** Updated copyright header ** ** Revision 1.17 2000/04/14 16:10:10 meichel ** Global flag dcmEnableAutomaticInputDataCorrection now derived from OFGlobal ** and, thus, safe for use in multi-thread applications. ** ** Revision 1.16 2000/03/08 16:26:51 meichel ** Updated copyright header. ** ** Revision 1.15 2000/02/10 10:52:25 joergr ** Added new feature to dcmdump (enhanced print method of dcmdata): write ** pixel data/item value fields to raw files. ** ** Revision 1.14 2000/02/02 14:33:00 joergr ** Replaced 'delete' statements by 'delete[]' for objects created with 'new[]'. ** ** Revision 1.13 1999/03/31 09:26:01 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.12 1998/11/12 16:48:31 meichel ** Implemented operator= for all classes derived from DcmObject. ** ** Revision 1.11 1997/07/21 08:25:35 andreas ** - Replace all boolean types (BOOLEAN, CTNBOOLEAN, DICOM_BOOL, BOOL) ** with one unique boolean type OFBool. ** ** Revision 1.10 1997/07/03 15:10:20 andreas ** - removed debugging functions Bdebug() and Edebug() since ** they write a static array and are not very useful at all. ** Cdebug and Vdebug are merged since they have the same semantics. ** The debugging functions in dcmdata changed their interfaces ** (see dcmdata/include/dcdebug.h) ** ** Revision 1.9 1997/04/18 08:17:20 andreas ** - The put/get-methods for all VRs did not conform to the C++-Standard ** draft. Some Compilers (e.g. SUN-C++ Compiler, Metroworks ** CodeWarrier, etc.) create many warnings concerning the hiding of ** overloaded get methods in all derived classes of DcmElement. ** So the interface of all value representation classes in the ** library are changed rapidly, e.g. ** OFCondition get(Uint16 & value, const unsigned long pos); ** becomes ** OFCondition getUint16(Uint16 & value, const unsigned long pos); ** All (retired) "returntype get(...)" methods are deleted. ** For more information see dcmdata/include/dcelem.h ** ** Revision 1.8 1997/03/26 17:06:30 hewett ** Added global flag for disabling the automatic correction of small errors. ** Such behaviour is undesirable when performing data validation. ** ** Revision 1.7 1996/08/05 08:46:23 andreas ** new print routine with additional parameters: ** - print into files ** - fix output length for elements ** corrected error in search routine with parameter ESM_fromStackTop ** ** Revision 1.6 1996/05/31 09:09:51 hewett ** Unique Identifiers which are incorrectly encoded with leading, embedded ** or trailing white space are now corrected. ** ** Revision 1.5 1996/05/30 17:19:33 hewett ** Added a makeMachineByteString() method to strip and trailing whitespace ** from a UID. ** ** Revision 1.4 1996/01/29 13:38:34 andreas ** - new put method for every VR to put value as a string ** - better and unique print methods ** */ dcmtk-3.6.0/dcmdata/libsrc/mkdeftag.cc0000644000310500011400000003327411457516457017033 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Andrew Hewett * * Purpose: Generate a C++ header defining symbolic names for DICOM Tags. * * Last Update: $Author: uli $ * Update Date: $Date: 2010-10-20 07:41:35 $ * CVS/RCS Revision: $Revision: 1.31 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #define INCLUDE_CSTDLIB #define INCLUDE_CSTDIO #define INCLUDE_CSTRING #define INCLUDE_CCTYPE #define INCLUDE_LIBC #include "dcmtk/ofstd/ofstdinc.h" #ifdef HAVE_SYS_UTSNAME_H #include #endif #ifdef HAVE_WINDOWS_H #include /* this includes either winsock.h or winsock2.h */ #else #ifdef HAVE_WINSOCK_H #include /* include winsock.h directly i.e. on MacOS */ #endif #endif #ifdef HAVE_GUSI_H #include #endif #include "dcmtk/dcmdata/dcdict.h" #include "dcmtk/dcmdata/cmdlnarg.h" #include "dcmtk/ofstd/ofstring.h" #include "dcmtk/ofstd/ofdatime.h" #include "dcmtk/dcmdata/dcdicent.h" static char* convertToIdentifier(char* s) { if (s == NULL) { return s; } int len = strlen(s); int i=0; unsigned char c; for (i=0; igetTagName() == NULL) return; strcpy(buf, e->getTagName()); convertToIdentifier(buf); tagPrefix = "#define DCM_"; fputs(tagPrefix, fout); /* write out prefix */ fputs(buf, fout); /* write out rest of name */ int n = 48 - (strlen(tagPrefix) + strlen(buf)); for (i=0; igetGroup(), e->getElement()); if (e->isRepeating()) { fprintf(fout, " /* (0x%04x", e->getGroup()); if (e->isRepeatingGroup()) { if (e->getGroupRangeRestriction() != DcmDictRange_Even) { fprintf(fout, "-%c", rangeRestriction2char(e->getGroupRangeRestriction())); } fprintf(fout, "-0x%04x", e->getUpperGroup()); } fprintf(fout, ",0x%04x", e->getElement()); if (e->isRepeatingElement()) { if (e->getElementRangeRestriction() != DcmDictRange_Even) { fprintf(fout, "-%c", rangeRestriction2char(e->getElementRangeRestriction())); } fprintf(fout, "-0x%04x", e->getUpperElement()); } fprintf(fout, ") */"); } fputs("\n", fout); } #ifdef HAVE_CUSERID static char* getUserName(char* userString, int /* maxLen */) { return cuserid(userString); // thread safe, maxLen >= L_cuserid ? } #elif HAVE_GETLOGIN static char* getUserName(char* userString, int maxLen) { #if defined(_REENTRANT) && !defined(_WIN32) && !defined(__CYGWIN__) // use getlogin_r instead of getlogin if (getlogin_r(userString, maxLen) != 0) strncpy(userString, "", maxLen); return userString; #else char* s; s = getlogin(); // thread unsafe if (s == NULL) s = ""; return strncpy(userString, s, maxLen); #endif } #elif defined(_WIN32) #include static char* getUserName(char* userString, int maxLen) { WKSTA_USER_INFO_0 *userinfo; if (NetWkstaUserGetInfo(NULL, 0, (LPBYTE*)&userinfo) == NERR_Success) { // Convert the Unicode full name to ANSI. WideCharToMultiByte( CP_ACP, 0, (WCHAR*)userinfo->wkui0_username, -1, userString, maxLen, NULL, NULL ); } else { strncpy(userString, "", maxLen); } return userString; } #else static char* getUserName(char* userString, int maxLen) { return strncpy(userString, "", maxLen); } #endif #ifdef HAVE_UNAME static char* getHostName(char* hostString, int maxLen) { struct utsname n; uname(&n); strncpy(hostString, n.nodename, maxLen); return hostString; } #elif HAVE_GETHOSTNAME static char* getHostName(char* userString, int maxLen) { gethostname(userString, maxLen); return userString; } #else static char* getHostName(char* hostString, int maxLen) { return strncpy(hostString, "localhost", maxLen); } #endif int main(int argc, char* argv[]) { const char* progname = "mkdeftag"; DcmDictEntry* e = NULL; int i = 0; FILE* fout = NULL; #ifdef HAVE_GUSI_H GUSISetup(GUSIwithSIOUXSockets); GUSISetup(GUSIwithInternetSockets); #endif #ifdef HAVE_WINSOCK_H WSAData winSockData; /* we need at least version 1.1 */ WORD winSockVersionNeeded = MAKEWORD( 1, 1 ); WSAStartup(winSockVersionNeeded, &winSockData); #endif prepareCmdLineArgs(argc, argv, "mkdeftag"); DcmDataDictionary& globalDataDict = dcmDataDict.wrlock(); /* clear out global data dictionary */ globalDataDict.clear(); progname = argv[0]; for (i=1; i 1) { fprintf(fout, "** From: %s\n", argv[1]); for (i=2; igetPrivateCreator() == NULL) // exclude private tags { e = new DcmDictEntry(*(*iter)); list.insertAndReplace(e); } } /* generate the entries themselves */ fputs("\n/*\n", fout); fputs("** Fixed Tags in ascending (gggg,eeee) order.\n", fout); fprintf(fout, "** Number of entries: %lu\n", OFstatic_cast(unsigned long, list.size())); fputs("** Tags with a repeating component (repeating tags) are listed later.\n", fout); fputs("*/\n", fout); /* output the list contents */ DcmDictEntryListIterator listIter(list.begin()); DcmDictEntryListIterator listLast(list.end()); for (; listIter != listLast; ++listIter) { printDefined(fout, *listIter); } // count non-private repeating tags in dictionary int repCount = 0; DcmDictEntryListIterator repIter(globalDataDict.repeatingBegin()); DcmDictEntryListIterator repLast(globalDataDict.repeatingEnd()); for (; repIter != repLast; ++repIter) { if ((*repIter)->getPrivateCreator() == NULL) ++repCount; } fputs("\n/*\n", fout); fputs("** Tags where the group/element can vary (repeating tags).\n", fout); fprintf(fout, "** Number of entries: %d\n", repCount); fputs("*/\n", fout); repIter = globalDataDict.repeatingBegin(); for (; repIter != repLast; ++repIter) { if ((*repIter)->getPrivateCreator() == NULL) // exclude private tags { printDefined(fout, *repIter); } } fputs("\n#endif /* !DCDEFTAG_H */\n", fout); dcmDataDict.unlock(); return 0; } /* ** CVS/RCS Log: ** $Log: mkdeftag.cc,v $ ** Revision 1.31 2010-10-20 07:41:35 uli ** Made sure isalpha() & friends are only called with valid arguments. ** ** Revision 1.30 2010-10-14 13:14:11 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.29 2010-07-02 07:12:29 joergr ** Fixed typo: Changed "SUPRESS_CREATE_STAMP" to "SUPPRESS_CREATE_STAMP". ** ** Revision 1.28 2010-03-03 08:50:30 joergr ** Fixed compilation issue with call to getlogin_r(). ** ** Revision 1.27 2009-11-04 09:58:11 uli ** Switched to logging mechanism provided by the "new" oflog module ** ** Revision 1.26 2009-01-15 14:30:12 joergr ** Added type cast to integer variable in order to avoid compiler warning. ** Changed formatting of comment header. ** ** Revision 1.25 2006/08/02 15:20:42 meichel ** Fixed bugs that prevented compiling the affected tools under MinGW ** ** Revision 1.24 2005/12/09 15:04:37 meichel ** Updated build system for dcdeftag/dcdictzz to reflect new directory structure ** ** Revision 1.23 2005/12/08 15:42:12 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.22 2004/08/03 11:41:10 meichel ** Headers libc.h and unistd.h are now included via ofstdinc.h ** ** Revision 1.21 2002/11/27 12:07:01 meichel ** Adapted module dcmdata to use of new header file ofstdinc.h ** ** Revision 1.20 2002/07/23 14:21:35 meichel ** Added support for private tag data dictionaries to dcmdata ** ** Revision 1.19 2002/04/11 12:31:03 joergr ** Added support for MT-safe system routines (cuserid, getlogin, etc.). ** Replaced direct call of system routines by new standard date and time ** functions. ** ** Revision 1.18 2001/06/01 15:49:24 meichel ** Updated copyright header ** ** Revision 1.17 2000/05/03 14:19:10 meichel ** Added new class GlobalDcmDataDictionary which implements read/write lock ** semantics for safe access to the DICOM dictionary from multiple threads ** in parallel. The global dcmDataDict now uses this class. ** ** Revision 1.16 2000/04/14 16:17:21 meichel ** Minor changes for thread safety. ** ** Revision 1.15 2000/03/08 16:26:54 meichel ** Updated copyright header. ** ** Revision 1.14 2000/02/23 15:12:08 meichel ** Corrected macro for Borland C++ Builder 4 workaround. ** ** Revision 1.13 2000/02/01 10:12:12 meichel ** Avoiding to include as extern "C" on Borland C++ Builder 4, ** workaround for bug in compiler header files. ** ** Revision 1.12 1999/04/21 13:02:33 meichel ** Now always including instead of on Win32 platforms. ** This makes sure that is used if available. ** ** Revision 1.11 1999/03/31 09:26:08 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.10 1999/03/22 15:45:47 meichel ** Implemented getUserName() on Win32 using the NetWkstaUserGetInfo() API. ** ** Revision 1.9 1998/07/28 15:53:04 meichel ** Corrected typo in mkdeftag. ** ** Revision 1.8 1998/07/15 14:08:49 joergr ** Including of to support getlogin() on NeXTSTEP. ** Replaced tabs by spaces. Added const to char pointer to avoid warnings ** (gcc 2.8.1 with additional options). ** ** Revision 1.7 1997/08/26 14:03:19 hewett ** New data structures for data-dictionary. The main part of the ** data-dictionary is now stored in an hash table using an optimized ** hash function. This new data structure reduces data-dictionary ** load times by a factor of 4! he data-dictionary specific linked-list ** has been replaced by a linked list derived from OFList class ** (see ofstd/include/oflist.h). ** The only interface modifications are related to iterating over the entire ** data dictionary which should not be needed by "normal" applications. ** ** Revision 1.6 1997/06/26 12:59:15 andreas ** - Include Additional headers (winsock.h, io.h) for Windows NT/95 ** ** Revision 1.5 1996/09/24 16:37:43 hewett ** Now correctly includes cmdlnarg.h ** ** Revision 1.4 1996/09/24 16:26:28 hewett ** Added preliminary support for the Macintosh environment (GUSI library). ** ** Revision 1.3 1996/03/20 16:44:06 hewett ** Updated for revised data dictionary. Repeating tags are now handled better. ** A linear list of repeating tags has been introduced with a subset ordering ** mechanism to ensure that dictionary searches locate the most precise ** dictionary entry. ** ** Revision 1.2 1996/03/12 15:21:23 hewett ** The repeating sub-dictionary has been split into a repeatingElement and ** a repeatingGroups dictionary. This is a temporary measure to reduce the ** problem of overlapping dictionary entries. A full solution will require ** more radical changes to the data dictionary insertion and search ** mechanims. ** ** Revision 1.1 1995/11/23 17:03:16 hewett ** Updated for loadable data dictionary. Some cleanup (more to do). ** */ dcmtk-3.6.0/dcmdata/libsrc/dcdictbi.cc0000644000310500011400000000404011455601037016766 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Andrew Hewett * * Purpose: * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:14:07 $ * CVS/RCS Revision: $Revision: 1.17 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/dcmdata/dcdict.h" /* There is no builtin data dictionary */ const char* dcmBuiltinDictBuildDate = NULL; void DcmDataDictionary::loadBuiltinDictionary() { /* ** Empty Stub. ** ** We don't want a builtin data dictionary or ** it is not yet created. ** A complete builtin dictionary can be created ** by mkdictbi (see mkdictbi.cc) */ } /* * CVS/RCS Log: * $Log: dcdictbi.cc,v $ * Revision 1.17 2010-10-14 13:14:07 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.16 2009-11-04 09:58:09 uli * Switched to logging mechanism provided by the "new" oflog module * * Revision 1.8 2009-09-03 10:04:09 joergr * Updated copyright date and made .cc and .nul files more consistent. * * Revision 1.14 2008-07-17 10:31:31 onken * Implemented copyFrom() method for complete DcmObject class hierarchy, which * permits setting an instance's value from an existing object. Implemented * assignment operator where necessary. * * Revision 1.7 2005-12-12 09:25:41 meichel * Update for new include file structure * * Revision 1.6 2004/02/13 12:42:37 joergr * Updated copyright header. * * Revision 1.5 2001/06/01 15:49:02 meichel * Updated copyright header * * Revision 1.4 2000/04/14 16:14:46 meichel * Minor changes for thread safety. * * Revision 1.3 2000/03/08 16:26:33 meichel * Updated copyright header. * * Revision 1.2 1999/03/31 09:25:24 meichel * Updated copyright header in module dcmdata * * */ dcmtk-3.6.0/dcmdata/libsrc/vrscan.cc0000644000310500011400000000572311455601043016523 0ustar joergrdicom3/* * * Copyright (C) 2010, 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: dcmdata * * Author: Uli Schlachter * * Purpose: Interface to the VR scanner. * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:14:11 $ * CVS/RCS Revision: $Revision: 1.8 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/vrscan.h" #include "dcmtk/ofstd/ofbmanip.h" #include "dcmtk/ofstd/ofstd.h" /* For OFString::strerror() */ #include "dcmtk/dcmdata/dctypes.h" /* For DCMDATA_WARN() */ BEGIN_EXTERN_C #include "vrscani.h" #include "vrscanl.h" END_EXTERN_C char* vrscan::makeBuffer(const OFString& vr, const OFString& value, size_t& size) { char *buffer, *pos; // Allocate the needed buffer size = vr.length() + value.length() + 2; pos = buffer = new char[size]; // Fill it with the input OFBitmanipTemplate::copyMem(vr.data(), pos, vr.size()); pos += vr.size(); OFBitmanipTemplate::copyMem(value.data(), pos, value.size()); pos += value.size(); // yy_scan_buffer() requires this pos[0] = pos[1] = '\0'; return buffer; } int vrscan::scan(const OFString& vr, const OFString& value) { struct vrscan_error error; yyscan_t scanner; int result; if (yylex_init(&scanner)) { char buf[256]; DCMDATA_WARN("Error while setting up lexer: " << OFStandard::strerror(errno, buf, sizeof(buf))); return 16; } size_t bufSize; char *buf = makeBuffer(vr, value, bufSize); error.error_msg = "(Unknown error)"; yyset_extra(&error, scanner); if (setjmp(error.setjmp_buffer)) { DCMDATA_WARN("Fatal error in lexer: " << error.error_msg); result = 16 /* UNKNOWN */; } else { yy_scan_buffer(buf, bufSize, scanner); result = yylex(scanner); if (yylex(scanner)) result = 16 /* UNKNOWN */; } yylex_destroy(scanner); delete[] buf; return result; } /* ** CVS/RCS Log: ** $Log: vrscan.cc,v $ ** Revision 1.8 2010-10-14 13:14:11 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.7 2010-09-02 12:02:06 uli ** Use longjmp() for error handling in the VR scanner. ** ** Revision 1.6 2010-09-02 10:16:02 uli ** The VR scanner now only copies the input data once, not twice. ** ** Revision 1.5 2010-09-02 09:49:38 uli ** Add the VR prefix into the scanner instead of adding it in the caller. ** ** Revision 1.4 2010-09-02 09:23:15 uli ** Made the VR scanner reentrant again. ** ** Revision 1.3 2010-08-26 12:29:48 uli ** Ported vrscan from ancient flex++ to current flex version. ** ** */ dcmtk-3.6.0/dcmdata/libsrc/dcdicent.cc0000644000310500011400000001624611455601037017011 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Andrew Hewett * * Purpose: a dictionary entry in the loadable DICOM data dictionary * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:14:07 $ * CVS/RCS Revision: $Revision: 1.17 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #define INCLUDE_CSTDIO #define INCLUDE_CSTRING #include "dcmtk/ofstd/ofstdinc.h" #include "dcmtk/dcmdata/dcdicent.h" /* ** DcmDictEntry member functions */ static char* strdup_new(const char* str) { char* s = NULL; if (str != NULL) { s = new char[strlen(str)+1]; strcpy(s, str); } return s; } DcmDictEntry::DcmDictEntry(Uint16 g, Uint16 e, DcmVR vr, const char* nam, int vmMin, int vmMax, const char* vers, OFBool doCopyStrings, const char* pcreator) : DcmTagKey(g,e), upperKey(), valueRepresentation(EVR_UNKNOWN), tagName(nam), valueMultiplicityMin(vmMin), valueMultiplicityMax(vmMax), standardVersion(vers), stringsAreCopies(doCopyStrings), groupRangeRestriction(DcmDictRange_Unspecified), elementRangeRestriction(DcmDictRange_Unspecified), privateCreator(pcreator) { upperKey.set(g,e); /* default: make upper key same as normal key */ valueRepresentation.setVR(vr); if (doCopyStrings) { tagName = strdup_new(nam); standardVersion = strdup_new(vers); privateCreator = strdup_new(pcreator); } } DcmDictEntry::DcmDictEntry(Uint16 g, Uint16 e, Uint16 ug, Uint16 ue, DcmVR vr, const char* nam, int vmMin, int vmMax, const char* vers, OFBool doCopyStrings, const char* pcreator) : DcmTagKey(g,e), upperKey(), valueRepresentation(EVR_UNKNOWN), tagName(nam), valueMultiplicityMin(vmMin), valueMultiplicityMax(vmMax), standardVersion(vers), stringsAreCopies(doCopyStrings), groupRangeRestriction(DcmDictRange_Unspecified), elementRangeRestriction(DcmDictRange_Unspecified), privateCreator(pcreator) { upperKey.set(ug, ue); valueRepresentation.setVR(vr); if (doCopyStrings) { tagName = strdup_new(nam); standardVersion = strdup_new(vers); privateCreator = strdup_new(pcreator); } } DcmDictEntry::DcmDictEntry(const DcmDictEntry& e) : DcmTagKey(e), upperKey(e.upperKey), valueRepresentation(e.valueRepresentation), tagName(e.tagName), valueMultiplicityMin(e.valueMultiplicityMin), valueMultiplicityMax(e.valueMultiplicityMax), standardVersion(e.standardVersion), stringsAreCopies(e.stringsAreCopies), groupRangeRestriction(e.groupRangeRestriction), elementRangeRestriction(e.elementRangeRestriction), privateCreator(e.privateCreator) { if (stringsAreCopies) { tagName = strdup_new(e.tagName); standardVersion = strdup_new(e.standardVersion); privateCreator = strdup_new(e.privateCreator); } } DcmDictEntry::~DcmDictEntry() { if (stringsAreCopies) { /* we have allocated them so it is ok to deallocate them */ delete[] OFconst_cast(char *, tagName); delete[] OFconst_cast(char *, standardVersion); delete[] OFconst_cast(char *, privateCreator); } } /* ** DcmDictEntry friend functions */ STD_NAMESPACE ostream& operator<<(STD_NAMESPACE ostream& s, const DcmDictEntry& e) { const DcmDictEntry* ep = &e; if (ep == NULL) { s << "(nil)"; return s; } char tagBuf[16]; sprintf(tagBuf, "(%04x", e.getGroup()); s << tagBuf; if (e.isRepeatingGroup()) { sprintf(tagBuf, "-%04x", e.getUpperGroup()); s << tagBuf; } sprintf(tagBuf, ",%04x", e.getElement()); s << tagBuf; if (e.isRepeatingElement()) { sprintf(tagBuf, "-%04x", e.getUpperElement()); s << tagBuf; } s << ")"; s << " " << e.getVR().getVRName() << " \"" << e.getTagName() << "\" "; if (e.isFixedSingleVM()) { s << "vm=" << e.getVMMax() << " "; } else if (e.isVariableRangeVM()) { s << "vm=" << e.getVMMin() << "-n "; } else if (e.isFixedRangeVM()){ s << "vm=" << e.getVMMin() << "-" << e.getVMMax() << " "; } else { s << "vm=?(" << e.getVMMin() << "-" << e.getVMMax() << ")? "; } if (e.getStandardVersion() != NULL) { s << " Version=\"" << e.getStandardVersion() << "\" "; } if (e.getPrivateCreator() != NULL) { s << " priv=\"" << e.getPrivateCreator() << "\" "; } return s; } /* ** CVS/RCS Log: ** $Log: dcdicent.cc,v $ ** Revision 1.17 2010-10-14 13:14:07 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.16 2009-11-04 09:58:09 uli ** Switched to logging mechanism provided by the "new" oflog module ** ** Revision 1.15 2006-08-15 15:49:54 meichel ** Updated all code in module dcmdata to correctly compile when ** all standard C++ classes remain in namespace std. ** ** Revision 1.14 2005/12/08 15:41:03 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.13 2004/02/04 16:26:07 joergr ** Adapted type casts to new-style typecast operators defined in ofcast.h. ** ** Revision 1.12 2002/11/27 12:06:44 meichel ** Adapted module dcmdata to use of new header file ofstdinc.h ** ** Revision 1.11 2002/07/23 14:21:29 meichel ** Added support for private tag data dictionaries to dcmdata ** ** Revision 1.10 2001/06/01 15:49:01 meichel ** Updated copyright header ** ** Revision 1.9 2000/03/08 16:26:32 meichel ** Updated copyright header. ** ** Revision 1.8 2000/02/02 14:32:49 joergr ** Replaced 'delete' statements by 'delete[]' for objects created with 'new[]'. ** ** Revision 1.7 1999/03/31 09:25:21 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.6 1998/07/15 15:51:50 joergr ** Removed several compiler warnings reported by gcc 2.8.1 with ** additional options, e.g. missing copy constructors and assignment ** operators, initialization of member variables in the body of a ** constructor instead of the member initialization list, hiding of ** methods by use of identical names, uninitialized member variables, ** missing const declaration of char pointers. Replaced tabs by spaces. ** ** Revision 1.5 1997/08/26 13:48:27 hewett ** Modified constructors to take const reference parameters. ** ** Revision 1.4 1997/07/31 14:40:36 meichel ** Created copy constructor for class DcmDictEntry, required by dcmcheck. ** ** Revision 1.3 1997/07/21 08:25:24 andreas ** - Replace all boolean types (BOOLEAN, CTNBOOLEAN, DICOM_BOOL, BOOL) ** with one unique boolean type OFBool. ** ** Revision 1.2 1996/03/20 16:44:04 hewett ** Updated for revised data dictionary. Repeating tags are now handled better. ** A linear list of repeating tags has been introduced with a subset ordering ** mechanism to ensure that dictionary searches locate the most precise ** dictionary entry. ** */ dcmtk-3.6.0/dcmdata/libsrc/vrscanl.h0000644000310500011400000001745011455601461016545 0ustar joergrdicom3#ifndef yyHEADER_H #define yyHEADER_H 1 #define yyIN_HEADER 1 #line 6 "vrscanl.h" #line 8 "vrscanl.h" #define YY_INT_ALIGNED short int /* A lexical scanner generated by flex */ #define FLEX_SCANNER #define YY_FLEX_MAJOR_VERSION 2 #define YY_FLEX_MINOR_VERSION 5 #define YY_FLEX_SUBMINOR_VERSION 33 #if YY_FLEX_SUBMINOR_VERSION > 0 #define FLEX_BETA #endif /* First, we deal with platform-specific or compiler-specific issues. */ /* begin standard C headers. */ #include #include #include #include /* end standard C headers. */ /* flex integer type definitions */ #ifndef FLEXINT_H #define FLEXINT_H /* C99 systems have . Non-C99 systems may or may not. */ #if __STDC_VERSION__ >= 199901L /* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, * if you want the limit (max/min) macros for int types. */ #ifndef __STDC_LIMIT_MACROS #define __STDC_LIMIT_MACROS 1 #endif #include typedef int8_t flex_int8_t; typedef uint8_t flex_uint8_t; typedef int16_t flex_int16_t; typedef uint16_t flex_uint16_t; typedef int32_t flex_int32_t; typedef uint32_t flex_uint32_t; #else typedef signed char flex_int8_t; typedef short int flex_int16_t; typedef int flex_int32_t; typedef unsigned char flex_uint8_t; typedef unsigned short int flex_uint16_t; typedef unsigned int flex_uint32_t; #endif /* ! C99 */ /* Limits of integral types. */ #ifndef INT8_MIN #define INT8_MIN (-128) #endif #ifndef INT16_MIN #define INT16_MIN (-32767-1) #endif #ifndef INT32_MIN #define INT32_MIN (-2147483647-1) #endif #ifndef INT8_MAX #define INT8_MAX (127) #endif #ifndef INT16_MAX #define INT16_MAX (32767) #endif #ifndef INT32_MAX #define INT32_MAX (2147483647) #endif #ifndef UINT8_MAX #define UINT8_MAX (255U) #endif #ifndef UINT16_MAX #define UINT16_MAX (65535U) #endif #ifndef UINT32_MAX #define UINT32_MAX (4294967295U) #endif #endif /* ! FLEXINT_H */ #ifdef __cplusplus /* The "const" storage-class-modifier is valid. */ #define YY_USE_CONST #else /* ! __cplusplus */ #if __STDC__ #define YY_USE_CONST #endif /* __STDC__ */ #endif /* ! __cplusplus */ #ifdef YY_USE_CONST #define yyconst const #else #define yyconst #endif /* An opaque pointer. */ #ifndef YY_TYPEDEF_YY_SCANNER_T #define YY_TYPEDEF_YY_SCANNER_T typedef void* yyscan_t; #endif /* For convenience, these vars (plus the bison vars far below) are macros in the reentrant scanner. */ #define yyin yyg->yyin_r #define yyout yyg->yyout_r #define yyextra yyg->yyextra_r #define yyleng yyg->yyleng_r #define yytext yyg->yytext_r #define yylineno (YY_CURRENT_BUFFER_LVALUE->yy_bs_lineno) #define yycolumn (YY_CURRENT_BUFFER_LVALUE->yy_bs_column) #define yy_flex_debug yyg->yy_flex_debug_r int yylex_init (yyscan_t* scanner); #ifndef YY_TYPEDEF_YY_BUFFER_STATE #define YY_TYPEDEF_YY_BUFFER_STATE typedef struct yy_buffer_state *YY_BUFFER_STATE; #endif /* The following is because we cannot portably get our hands on size_t * (without autoconf's help, which isn't available because we want * flex-generated scanners to compile on their own). */ #ifndef YY_TYPEDEF_YY_SIZE_T #define YY_TYPEDEF_YY_SIZE_T typedef unsigned int yy_size_t; #endif #ifndef YY_STRUCT_YY_BUFFER_STATE #define YY_STRUCT_YY_BUFFER_STATE struct yy_buffer_state { FILE *yy_input_file; char *yy_ch_buf; /* input buffer */ char *yy_buf_pos; /* current position in input buffer */ /* Size of input buffer in bytes, not including room for EOB * characters. */ yy_size_t yy_buf_size; /* Number of characters read into yy_ch_buf, not including EOB * characters. */ int yy_n_chars; /* Whether we "own" the buffer - i.e., we know we created it, * and can realloc() it to grow it, and should free() it to * delete it. */ int yy_is_our_buffer; /* Whether this is an "interactive" input source; if so, and * if we're using stdio for input, then we want to use getc() * instead of fread(), to make sure we stop fetching input after * each newline. */ int yy_is_interactive; /* Whether we're considered to be at the beginning of a line. * If so, '^' rules will be active on the next match, otherwise * not. */ int yy_at_bol; int yy_bs_lineno; /**< The line count. */ int yy_bs_column; /**< The column count. */ /* Whether to try to fill the input buffer when we reach the * end of it. */ int yy_fill_buffer; int yy_buffer_status; }; #endif /* !YY_STRUCT_YY_BUFFER_STATE */ void yyrestart (FILE *input_file ,yyscan_t yyscanner ); void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ,yyscan_t yyscanner ); YY_BUFFER_STATE yy_create_buffer (FILE *file,int size ,yyscan_t yyscanner ); void yy_delete_buffer (YY_BUFFER_STATE b ,yyscan_t yyscanner ); void yy_flush_buffer (YY_BUFFER_STATE b ,yyscan_t yyscanner ); void yypush_buffer_state (YY_BUFFER_STATE new_buffer ,yyscan_t yyscanner ); void yypop_buffer_state (yyscan_t yyscanner ); YY_BUFFER_STATE yy_scan_buffer (char *base,yy_size_t size ,yyscan_t yyscanner ); YY_BUFFER_STATE yy_scan_string (yyconst char *yy_str ,yyscan_t yyscanner ); YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes,int len ,yyscan_t yyscanner ); void *yyalloc (yy_size_t ,yyscan_t yyscanner ); void *yyrealloc (void *,yy_size_t ,yyscan_t yyscanner ); void yyfree (void * ,yyscan_t yyscanner ); /* Begin user sect3 */ #define yywrap(n) 1 #define YY_SKIP_YYWRAP #define yytext_ptr yytext_r #ifdef YY_HEADER_EXPORT_START_CONDITIONS #define INITIAL 0 #endif #ifndef YY_NO_UNISTD_H /* Special case for "unistd.h", since it is non-ANSI. We include it way * down here because we want the user's section 1 to have been scanned first. * The user has a chance to override it with an option. */ #include #endif #ifndef YY_EXTRA_TYPE #define YY_EXTRA_TYPE void * #endif /* Accessor methods to globals. These are made visible to non-reentrant scanners for convenience. */ int yylex_destroy (yyscan_t yyscanner ); int yyget_debug (yyscan_t yyscanner ); void yyset_debug (int debug_flag ,yyscan_t yyscanner ); YY_EXTRA_TYPE yyget_extra (yyscan_t yyscanner ); void yyset_extra (YY_EXTRA_TYPE user_defined ,yyscan_t yyscanner ); FILE *yyget_in (yyscan_t yyscanner ); void yyset_in (FILE * in_str ,yyscan_t yyscanner ); FILE *yyget_out (yyscan_t yyscanner ); void yyset_out (FILE * out_str ,yyscan_t yyscanner ); int yyget_leng (yyscan_t yyscanner ); char *yyget_text (yyscan_t yyscanner ); int yyget_lineno (yyscan_t yyscanner ); void yyset_lineno (int line_number ,yyscan_t yyscanner ); /* Macros after this point can all be overridden by user definitions in * section 1. */ #ifndef YY_SKIP_YYWRAP #ifdef __cplusplus extern "C" int yywrap (yyscan_t yyscanner ); #else extern int yywrap (yyscan_t yyscanner ); #endif #endif #ifndef yytext_ptr static void yy_flex_strncpy (char *,yyconst char *,int ,yyscan_t yyscanner); #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen (yyconst char * ,yyscan_t yyscanner); #endif #ifndef YY_NO_INPUT #endif /* Amount of stuff to slurp up with each read. */ #ifndef YY_READ_BUF_SIZE #define YY_READ_BUF_SIZE 8192 #endif /* Number of entries by which start-condition stack grows. */ #ifndef YY_START_STACK_INCR #define YY_START_STACK_INCR 25 #endif /* Default declaration of generated scanner - a define so the user can * easily add parameters. */ #ifndef YY_DECL #define YY_DECL_IS_OURS 1 extern int yylex (yyscan_t yyscanner); #define YY_DECL int yylex (yyscan_t yyscanner) #endif /* !YY_DECL */ /* yy_get_previous_state - get the state just before the EOB char was reached */ #undef YY_NEW_FILE #undef YY_FLUSH_BUFFER #undef yy_set_bol #undef yy_new_buffer #undef yy_set_interactive #undef YY_DO_BEFORE_ACTION #ifdef YY_DECL_IS_OURS #undef YY_DECL_IS_OURS #undef YY_DECL #endif #line 197 "vrscanl.l" #line 331 "vrscanl.h" #undef yyIN_HEADER #endif /* yyHEADER_H */ dcmtk-3.6.0/dcmdata/libsrc/dcpxitem.cc0000644000310500011400000005206311457616140017051 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Gerd Ehlers, Andreas Barth * * Purpose: Implementation of class DcmPixelItem * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-20 16:44:16 $ * CVS/RCS Revision: $Revision: 1.43 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #define INCLUDE_CSTDLIB #define INCLUDE_CSTDIO #define INCLUDE_CSTRING #include "dcmtk/ofstd/ofstdinc.h" #include "dcmtk/ofstd/ofstream.h" #include "dcmtk/dcmdata/dcpxitem.h" #include "dcmtk/dcmdata/dcswap.h" #include "dcmtk/ofstd/ofstring.h" #include "dcmtk/ofstd/ofstd.h" #include "dcmtk/dcmdata/dcistrma.h" /* for class DcmInputStream */ #include "dcmtk/dcmdata/dcostrma.h" /* for class DcmOutputStream */ #include "dcmtk/dcmdata/dcwcache.h" /* for class DcmWriteCache */ // ******************************** DcmPixelItem::DcmPixelItem(const DcmTag &tag, const Uint32 len) : DcmOtherByteOtherWord(tag, len) { setTagVR(EVR_pixelItem); } DcmPixelItem::DcmPixelItem(const DcmPixelItem &old) : DcmOtherByteOtherWord(old) { } OFCondition DcmPixelItem::copyFrom(const DcmObject &rhs) { if (this != &rhs) { if (rhs.ident() != ident()) return EC_IllegalCall; *this = OFstatic_cast(const DcmPixelItem &, rhs); } return EC_Normal; } DcmPixelItem::~DcmPixelItem() { } // ******************************** OFCondition DcmPixelItem::writeTagAndLength(DcmOutputStream &outStream, const E_TransferSyntax oxfer, Uint32 &writtenBytes) const { OFCondition l_error = outStream.status(); if (l_error.good()) { /* write tag information */ l_error = writeTag(outStream, getTag(), oxfer); writtenBytes = 4; /* prepare to write the value field */ Uint32 valueLength = getLengthField(); DcmXfer outXfer(oxfer); /* check byte-ordering */ const E_ByteOrder oByteOrder = outXfer.getByteOrder(); if (oByteOrder == EBO_unknown) { return EC_IllegalCall; } swapIfNecessary(oByteOrder, gLocalByteOrder, &valueLength, 4, 4); // availability of four bytes space in output buffer // has been checked by caller. writtenBytes += OFstatic_cast(Uint32, outStream.write(&valueLength, 4)); } else writtenBytes = 0; return l_error; } void DcmPixelItem::print(STD_NAMESPACE ostream &out, const size_t flags, const int level, const char *pixelFileName, size_t *pixelCounter) { /* call inherited method */ printPixel(out, flags, level, pixelFileName, pixelCounter); } OFCondition DcmPixelItem::createOffsetTable(const DcmOffsetList &offsetList) { OFCondition result = EC_Normal; unsigned long numEntries = offsetList.size(); if (numEntries > 0) { Uint32 current = 0; Uint32 *array = new Uint32[numEntries]; if (array) { DCMDATA_DEBUG("DcmPixelItem: creating offset table with " << numEntries << " entries"); OFListConstIterator(Uint32) first = offsetList.begin(); OFListConstIterator(Uint32) last = offsetList.end(); unsigned long idx = 0; while ((first != last) && result.good()) { // check for odd offset values, should never happen at this point if (current & 1) { DCMDATA_WARN("DcmPixelItem: odd frame size (" << current << ") found for frame #" << (idx + 1) << ", cannot create offset table"); result = EC_InvalidBasicOffsetTable; } else { array[idx++] = current; current += *first; ++first; } } if (result.good()) { result = swapIfNecessary(EBO_LittleEndian, gLocalByteOrder, array, numEntries * sizeof(Uint32), sizeof(Uint32)); if (result.good()) result = putUint8Array(OFreinterpret_cast(Uint8 *, array), numEntries * sizeof(Uint32)); } delete[] array; } else result = EC_MemoryExhausted; } return result; } OFCondition DcmPixelItem::writeXML(STD_NAMESPACE ostream&out, const size_t flags) { /* XML start tag for "item" */ out << ""; /* write element value (if loaded) */ if (valueLoaded() && (flags & DCMTypes::XF_writeBinaryData)) { /* encode binary data as Base64 */ if (flags & DCMTypes::XF_encodeBase64) { /* pixel items always contain 8 bit data, therefore, byte swapping not required */ OFStandard::encodeBase64(out, OFstatic_cast(Uint8 *, getValue()), OFstatic_cast(size_t, getLengthField())); } else { /* get and check 8 bit data */ Uint8 *byteValues = NULL; if (getUint8Array(byteValues).good() && (byteValues != NULL)) { const unsigned long count = getLengthField(); out << STD_NAMESPACE hex << STD_NAMESPACE setfill('0'); /* print byte values in hex mode */ out << STD_NAMESPACE setw(2) << OFstatic_cast(int, *(byteValues++)); for (unsigned long i = 1; i < count; i++) out << "\\" << STD_NAMESPACE setw(2) << OFstatic_cast(int, *(byteValues++)); /* reset i/o manipulators */ out << STD_NAMESPACE dec << STD_NAMESPACE setfill(' '); } } } /* XML end tag for "item" */ out << "" << OFendl; /* always report success */ return EC_Normal; } OFCondition DcmPixelItem::writeSignatureFormat( DcmOutputStream &outStream, const E_TransferSyntax oxfer, const E_EncodingType enctype, DcmWriteCache *wcache) { if (dcmEnableOldSignatureFormat.get()) { /* Old signature format as created by DCMTK releases previous to 3.5.4. * This is non-conformant because it includes the item length in pixel items. */ return DcmOtherByteOtherWord::writeSignatureFormat(outStream, oxfer, enctype, wcache); } else { DcmWriteCache wcache2; /* In case the transfer state is not initialized, this is an illegal call */ if (getTransferState() == ERW_notInitialized) errorFlag = EC_IllegalCall; else { /* if this is not an illegal call, we need to do something. First */ /* of all, check the error state of the stream that was passed */ /* only do something if the error state of the stream is ok */ errorFlag = outStream.status(); if (errorFlag.good()) { /* create an object that represents the transfer syntax */ DcmXfer outXfer(oxfer); /* pointer to element value if value resides in memory or old-style * write behaviour is active (i.e. everything loaded into memory upon write */ Uint8 *value = NULL; OFBool accessPossible = OFFalse; /* check that we actually do have access to the element's value. * If the element is unaccessable (which would mean that the value resides * in file and access to the file fails), write an empty element with * zero length. */ if (getLengthField() > 0) { if (valueLoaded()) { /* get this element's value. Mind the byte ordering (little */ /* or big endian) of the transfer syntax which shall be used */ value = OFstatic_cast(Uint8 *, getValue(outXfer.getByteOrder())); if (value) accessPossible = OFTrue; } else { /* Use local cache object if needed. This may cause those bytes * that are read but not written because the output stream stalls to * be read again, and the file from being re-opened next time. * Therefore, this case should be avoided. */ if (!wcache) wcache = &wcache2; /* initialize cache object. This is safe even if the object was already initialized */ wcache->init(this, getLengthField(), getTransferredBytes(), outXfer.getByteOrder()); /* access first block of element content */ errorFlag = wcache->fillBuffer(*this); /* check that everything worked and the buffer is non-empty now */ accessPossible = errorFlag.good() && (! wcache->bufferIsEmpty()); } } /* if this element's transfer state is ERW_init (i.e. it has not yet been written to */ /* the stream) and if the outstream provides enough space for tag and length information */ /* write tag and length information to it, do something */ if (getTransferState() == ERW_init) { /* first compare with DCM_TagInfoLength (12). If there is not enough space * in the buffer, check if the buffer is still sufficient for the requirements * of this element, which may need only 8 instead of 12 bytes. */ if (outStream.avail() >= 4) { /* if there is no value, Length (member variable) shall be set to 0 */ if (! accessPossible) setLengthField(0); /* write tag and length information (and possibly also data type information) to the stream, */ /* mind the transfer syntax and remember the amount of bytes that have been written */ errorFlag = writeTag(outStream, getTag(), oxfer); /* if the writing was successful, set this element's transfer */ /* state to ERW_inWork and the amount of transferred bytes to 0 */ if (errorFlag.good()) { setTransferState(ERW_inWork); setTransferredBytes(0); } } else errorFlag = EC_StreamNotifyClient; } /* if there is a value that has to be written to the stream */ /* and if this element's transfer state is ERW_inWork */ if (accessPossible && getTransferState() == ERW_inWork) { Uint32 len = 0; if (valueLoaded()) { /* write as many bytes as possible to the stream starting at value[getTransferredBytes()] */ /* (note that the bytes value[0] to value[getTransferredBytes()-1] have already been */ /* written to the stream) */ len = OFstatic_cast(Uint32, outStream.write(&value[getTransferredBytes()], getLengthField() - getTransferredBytes())); /* increase the amount of bytes which have been transfered correspondingly */ incTransferredBytes(len); /* see if there is something fishy with the stream */ errorFlag = outStream.status(); } else { Uint32 buflen = 0; OFBool done = getTransferredBytes() == getLengthField(); while (! done) { // re-fill buffer from file if empty errorFlag = wcache->fillBuffer(*this); buflen = wcache->contentLength(); if (errorFlag.good()) { // write as many bytes from cache buffer to stream as possible len = wcache->writeBuffer(outStream); /* increase the amount of bytes which have been transfered correspondingly */ incTransferredBytes(len); /* see if there is something fishy with the stream */ errorFlag = outStream.status(); } // stop writing if something went wrong, we were unable to send all of the buffer content // (which indicates that the output stream needs to be flushed, or everything was sent out. done = errorFlag.bad() || (len < buflen) || (getTransferredBytes() == getLengthField()); } } /* if the amount of transferred bytes equals the length of the element's value, the */ /* entire value has been written to the stream. Thus, this element's transfer state */ /* has to be set to ERW_ready. If this is not the case but the error flag still shows */ /* an ok value, there was no more space in the stream and a corresponding return value */ /* has to be set. (Isn't the "else if" part superfluous?!?) */ if (getLengthField() == getTransferredBytes()) setTransferState(ERW_ready); else if (errorFlag.good()) errorFlag = EC_StreamNotifyClient; } } } } /* return result value */ return errorFlag; } /* ** CVS/RCS Log: ** $Log: dcpxitem.cc,v $ ** Revision 1.43 2010-10-20 16:44:16 joergr ** Use type cast macros (e.g. OFstatic_cast) where appropriate. ** ** Revision 1.42 2010-10-14 13:14:08 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.41 2010-05-27 16:54:27 joergr ** Added debug message with details on created basic offset table (if any). ** ** Revision 1.40 2009-11-13 13:11:21 joergr ** Fixed minor issues in log output. ** ** Revision 1.39 2009-11-04 09:58:10 uli ** Switched to logging mechanism provided by the "new" oflog module ** ** Revision 1.38 2009-09-15 15:02:43 joergr ** Enhanced implementation of writeXML() by writing hex numbers directly to the ** output stream instead of creating a temporary string first. ** ** Revision 1.37 2009-05-04 14:29:02 meichel ** Fixed bug in DcmPixelItem::writeSignatureFormat() that caused pixel data ** to be removed from the dataset when a digital signature was generated ** for a compressed image. ** ** Revision 1.36 2009-02-04 17:57:19 joergr ** Fixes various type mismatches reported by MSVC introduced with OFFile class. ** ** Revision 1.35 2009-02-04 10:18:57 joergr ** Fixed issue with compressed frames of odd length (possibly wrong values in ** basic offset table). ** ** Revision 1.34 2008-07-17 10:31:32 onken ** Implemented copyFrom() method for complete DcmObject class hierarchy, which ** permits setting an instance's value from an existing object. Implemented ** assignment operator where necessary. ** ** Revision 1.33 2007-11-29 14:30:21 meichel ** Write methods now handle large raw data elements (such as pixel data) ** without loading everything into memory. This allows very large images to ** be sent over a network connection, or to be copied without ever being ** fully in memory. ** ** Revision 1.32 2007/06/29 14:17:49 meichel ** Code clean-up: Most member variables in module dcmdata are now private, ** not protected anymore. ** ** Revision 1.31 2007/06/26 16:24:23 joergr ** Added new variant of encodeBase64() method that outputs directly to a stream ** (avoids using a memory buffer for large binary data). ** ** Revision 1.30 2006/08/15 15:49:54 meichel ** Updated all code in module dcmdata to correctly compile when ** all standard C++ classes remain in namespace std. ** ** Revision 1.29 2005/12/08 15:41:27 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.28 2005/11/24 12:50:59 meichel ** Fixed bug in code that prepares a byte stream that is fed into the MAC ** algorithm when creating or verifying a digital signature. The previous ** implementation was non-conformant when signatures included compressed ** (encapsulated) pixel data because the item length was included in the byte ** stream, while it should not. The global variable dcmEnableOldSignatureFormat ** and a corresponding command line option in dcmsign allow to re-enable the old ** implementation. ** ** Revision 1.27 2004/02/04 16:42:42 joergr ** Adapted type casts to new-style typecast operators defined in ofcast.h. ** Removed acknowledgements with e-mail addresses from CVS log. ** ** Revision 1.26 2003/06/12 18:21:46 joergr ** Modified code to use const_iterators where appropriate (required for STL). ** ** Revision 1.25 2002/12/06 13:16:59 joergr ** Enhanced "print()" function by re-working the implementation and replacing ** the boolean "showFullData" parameter by a more general integer flag. ** Made source code formatting more consistent with other modules/files. ** ** Revision 1.24 2002/11/27 12:06:51 meichel ** Adapted module dcmdata to use of new header file ofstdinc.h ** ** Revision 1.23 2002/08/27 16:55:55 meichel ** Initial release of new DICOM I/O stream classes that add support for stream ** compression (deflated little endian explicit VR transfer syntax) ** ** Revision 1.22 2002/05/24 14:51:51 meichel ** Moved helper methods that are useful for different compression techniques ** from module dcmjpeg to module dcmdata ** ** Revision 1.21 2002/05/14 08:21:52 joergr ** Added support for Base64 (MIME) encoded binary data. ** ** Revision 1.20 2002/04/25 10:25:49 joergr ** Added support for XML output of DICOM objects. ** ** Revision 1.19 2002/04/16 13:43:20 joergr ** Added configurable support for C++ ANSI standard includes (e.g. streams). ** ** Revision 1.18 2001/11/16 15:55:04 meichel ** Adapted digital signature code to final text of supplement 41. ** ** Revision 1.17 2001/09/25 17:19:53 meichel ** Adapted dcmdata to class OFCondition ** ** Revision 1.16 2001/06/01 15:49:08 meichel ** Updated copyright header ** ** Revision 1.15 2000/04/14 15:55:06 meichel ** Dcmdata library code now consistently uses ofConsole for error output. ** ** Revision 1.14 2000/03/08 16:26:40 meichel ** Updated copyright header. ** ** Revision 1.13 2000/03/03 14:05:35 meichel ** Implemented library support for redirecting error messages into memory ** instead of printing them to stdout/stderr for GUI applications. ** ** Revision 1.12 2000/02/23 15:12:00 meichel ** Corrected macro for Borland C++ Builder 4 workaround. ** ** Revision 1.11 2000/02/10 10:52:22 joergr ** Added new feature to dcmdump (enhanced print method of dcmdata): write ** pixel data/item value fields to raw files. ** ** Revision 1.10 2000/02/03 16:31:26 joergr ** Fixed bug: encapsulated data (pixel items) have never been loaded using ** method 'loadAllDataIntoMemory'. Therefore, encapsulated pixel data was ** never printed with 'dcmdump'. ** Corrected bug that caused wrong calculation of group length for sequence ** of items (e.g. encapsulated pixel data). ** ** Revision 1.9 2000/02/01 10:12:09 meichel ** Avoiding to include as extern "C" on Borland C++ Builder 4, ** workaround for bug in compiler header files. ** ** Revision 1.8 1999/03/31 09:25:37 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.7 1998/11/12 16:48:19 meichel ** Implemented operator= for all classes derived from DcmObject. ** ** Revision 1.6 1997/07/07 07:52:29 andreas ** - Enhanced (faster) byte swapping routine. swapIfNecessary moved from ** a method in DcmObject to a general function. ** ** Revision 1.5 1997/07/03 15:10:03 andreas ** - removed debugging functions Bdebug() and Edebug() since ** they write a static array and are not very useful at all. ** Cdebug and Vdebug are merged since they have the same semantics. ** The debugging functions in dcmdata changed their interfaces ** (see dcmdata/include/dcdebug.h) ** ** Revision 1.4 1997/05/22 16:57:16 andreas ** - Corrected errors for writing of pixel sequences for encapsulated ** transfer syntaxes. ** ** Revision 1.3 1996/01/05 13:27:41 andreas ** - changed to support new streaming facilities ** - unique read/write methods for file and block transfer ** - more cleanups ** */ dcmtk-3.6.0/dcmdata/libsrc/dcuid.cc0000644000310500011400000030002211464755700016317 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Andrew Hewett * * Purpose: * Definitions of "well known" DICOM Unique Indentifiers, * routines for finding and creating UIDs. * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-11-05 10:26:08 $ * CVS/RCS Revision: $Revision: 1.89 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #ifdef HAVE_WINDOWS_H #include /* this includes either winsock.h or winsock2.h */ #else #ifdef HAVE_WINSOCK_H #include /* include winsock.h directly i.e. on MacOS */ #endif #endif #define INCLUDE_CSTDLIB #define INCLUDE_CSTDIO #define INCLUDE_CSTRING #define INCLUDE_CTIME #define INCLUDE_LIBC #define INCLUDE_UNISTD #include "dcmtk/ofstd/ofstdinc.h" BEGIN_EXTERN_C #ifdef HAVE_SYS_TIME_H #include #endif #ifdef HAVE_SYS_TYPES_H #include #endif #ifdef HAVE_SYS_SOCKET_H #ifndef DCOMPAT_SYS_SOCKET_H_ #define DCOMPAT_SYS_SOCKET_H_ /* some systems don't protect sys/socket.h (e.g. DEC Ultrix) */ #include #endif #endif #ifdef HAVE_NETINET_IN_H #include #endif #ifdef HAVE_ARPA_INET_H #include #endif #ifdef HAVE_NETDB_H #include #endif #ifndef HAVE_WINDOWS_H #ifndef HAVE_PROTOTYPE_GETTIMEOFDAY /* Ultrix has gettimeofday() but no prototype in the header files */ int gettimeofday(struct timeval *tp, void *); #endif #endif END_EXTERN_C #include "dcmtk/ofstd/ofstream.h" #include "dcmtk/dcmdata/dcuid.h" #include "dcmtk/dcmdata/dctypes.h" #include "dcmtk/ofstd/ofthread.h" #include "dcmtk/ofstd/ofcrc32.h" #include "dcmtk/ofstd/ofdefine.h" #include "dcmtk/ofstd/ofstd.h" struct UIDNameMap { const char* uid; const char* name; }; // // It is very important that the names of the UIDs may not use the following // characters: space ( ) [ ], = < > static const UIDNameMap uidNameMap[] = { { UID_StandardApplicationContext, "StandardApplicationContext" }, // Transfer Syntax { UID_LittleEndianImplicitTransferSyntax, "LittleEndianImplicit" }, { UID_LittleEndianExplicitTransferSyntax, "LittleEndianExplicit" }, { UID_BigEndianExplicitTransferSyntax, "BigEndianExplicit" }, { UID_JPEGProcess1TransferSyntax, "JPEGBaseline" }, { UID_JPEGProcess2_4TransferSyntax, "JPEGExtended:Process2+4" }, { UID_JPEGProcess3_5TransferSyntax, "JPEGExtended:Process3+5" }, { UID_JPEGProcess6_8TransferSyntax, "JPEGSpectralSelection:Non-hierarchical:Process6+8" }, { UID_JPEGProcess7_9TransferSyntax, "JPEGSpectralSelection:Non-hierarchical:Process7+9" }, { UID_JPEGProcess10_12TransferSyntax, "JPEGFullProgression:Non-hierarchical:Process10+12" }, { UID_JPEGProcess11_13TransferSyntax, "JPEGFullProgression:Non-hierarchical:Process11+13" }, { UID_JPEGProcess14TransferSyntax, "JPEGLossless:Non-hierarchical:Process14" }, { UID_JPEGProcess15TransferSyntax, "JPEGLossless:Non-hierarchical:Process15" }, { UID_JPEGProcess16_18TransferSyntax, "JPEGExtended:Hierarchical:Process16+18" }, { UID_JPEGProcess17_19TransferSyntax, "JPEGExtended:Hierarchical:Process17+19" }, { UID_JPEGProcess20_22TransferSyntax, "JPEGSpectralSelection:Hierarchical:Process20+22" }, { UID_JPEGProcess21_23TransferSyntax, "JPEGSpectralSelection:Hierarchical:Process21+23" }, { UID_JPEGProcess24_26TransferSyntax, "JPEGFullProgression:Hierarchical:Process24+26" }, { UID_JPEGProcess25_27TransferSyntax, "JPEGFullProgression:Hierarchical:Process25+27" }, { UID_JPEGProcess28TransferSyntax, "JPEGLossless:Hierarchical:Process28" }, { UID_JPEGProcess29TransferSyntax, "JPEGLossless:Hierarchical:Process29" }, { UID_JPEGProcess14SV1TransferSyntax, "JPEGLossless:Non-hierarchical-1stOrderPrediction" }, { UID_JPEGLSLosslessTransferSyntax, "JPEGLSLossless" }, { UID_JPEGLSLossyTransferSyntax, "JPEGLSLossy" }, { UID_RLELosslessTransferSyntax, "RLELossless" }, { UID_DeflatedExplicitVRLittleEndianTransferSyntax, "DeflatedLittleEndianExplicit" }, { UID_JPEG2000LosslessOnlyTransferSyntax, "JPEG2000LosslessOnly" }, { UID_JPEG2000TransferSyntax, "JPEG2000" }, { UID_MPEG2MainProfileAtMainLevelTransferSyntax, "MPEG2MainProfile@MainLevel" }, { UID_MPEG2MainProfileAtHighLevelTransferSyntax, "MPEG2MainProfile@HighLevel" }, { UID_JPEG2000Part2MulticomponentImageCompressionLosslessOnlyTransferSyntax, "JPEG2000MulticomponentLosslessOnly" }, { UID_JPEG2000Part2MulticomponentImageCompressionTransferSyntax, "JPEG2000Multicomponent" }, { UID_JPIPReferencedTransferSyntax, "JPIPReferenced" }, { UID_JPIPReferencedDeflateTransferSyntax, "JPIPReferencedDeflate" }, { UID_RFC2557MIMEEncapsulationTransferSyntax, "RFC2557MIMEEncapsulation" }, { UID_XMLEncodingTransferSyntax, "XMLEncoding" }, // Storage { UID_AmbulatoryECGWaveformStorage, "AmbulatoryECGWaveformStorage" }, { UID_ArterialPulseWaveformStorage, "ArterialPulseWaveformStorage" }, { UID_AutorefractionMeasurementsStorage, "AutorefractionMeasurementsStorage" }, { UID_BasicStructuredDisplayStorage, "BasicStructuredDisplayStorage" }, { UID_BasicTextSRStorage, "BasicTextSRStorage" }, { UID_BasicVoiceAudioWaveformStorage, "BasicVoiceAudioWaveformStorage" }, { UID_BlendingSoftcopyPresentationStateStorage, "BlendingSoftcopyPresentationStateStorage" }, { UID_BreastTomosynthesisImageStorage, "BreastTomosynthesisImageStorage" }, { UID_CardiacElectrophysiologyWaveformStorage, "CardiacElectrophysiologyWaveformStorage" }, { UID_ChestCADSRStorage, "ChestCADSRStorage" }, { UID_ColonCADSRStorage, "ColonCADSRStorage" }, { UID_ColorSoftcopyPresentationStateStorage, "ColorSoftcopyPresentationStateStorage" }, { UID_ComprehensiveSRStorage, "ComprehensiveSRStorage" }, { UID_ComputedRadiographyImageStorage, "ComputedRadiographyImageStorage" }, { UID_CTImageStorage, "CTImageStorage" }, { UID_DeformableSpatialRegistrationStorage, "DeformableSpatialRegistrationStorage" }, { UID_DigitalIntraOralXRayImageStorageForPresentation, "DigitalIntraOralXRayImageStorageForPresentation" }, { UID_DigitalIntraOralXRayImageStorageForProcessing, "DigitalIntraOralXRayImageStorageForProcessing" }, { UID_DigitalMammographyXRayImageStorageForPresentation, "DigitalMammographyXRayImageStorageForPresentation" }, { UID_DigitalMammographyXRayImageStorageForProcessing, "DigitalMammographyXRayImageStorageForProcessing" }, { UID_DigitalXRayImageStorageForPresentation, "DigitalXRayImageStorageForPresentation" }, { UID_DigitalXRayImageStorageForProcessing, "DigitalXRayImageStorageForProcessing" }, { UID_EncapsulatedCDAStorage, "EncapsulatedCDAStorage" }, { UID_EncapsulatedPDFStorage, "EncapsulatedPDFStorage" }, { UID_EnhancedCTImageStorage, "EnhancedCTImageStorage" }, { UID_EnhancedMRColorImageStorage, "EnhancedMRColorImageStorage" }, { UID_EnhancedMRImageStorage, "EnhancedMRImageStorage" }, { UID_EnhancedPETImageStorage, "EnhancedPETImageStorage" }, { UID_EnhancedSRStorage, "EnhancedSRStorage" }, { UID_EnhancedUSVolumeStorage, "EnhancedUSVolumeStorage" }, { UID_EnhancedXAImageStorage, "EnhancedXAImageStorage" }, { UID_EnhancedXRFImageStorage, "EnhancedXRFImageStorage" }, { UID_GeneralAudioWaveformStorage, "GeneralAudioWaveformStorage" }, { UID_GeneralECGWaveformStorage, "GeneralECGWaveformStorage" }, { UID_GenericImplantTemplateStorage, "GenericImplantTemplateStorage" }, { UID_GrayscaleSoftcopyPresentationStateStorage, "GrayscaleSoftcopyPresentationStateStorage" }, { UID_HangingProtocolStorage, "HangingProtocolStorage" }, { UID_HemodynamicWaveformStorage, "HemodynamicWaveformStorage" }, { UID_ImplantAssemblyTemplateStorage, "ImplantAssemblyTemplateStorage" }, { UID_ImplantationPlanSRDocumentStorage, "ImplantationPlanSRDocumentStorage" }, { UID_ImplantTemplateGroupStorage, "ImplantTemplateGroupStorage" }, { UID_IntraocularLensCalculationsStorage, "IntraocularLensCalculationsStorage" }, { UID_KeratometryMeasurementsStorage, "KeratometryMeasurementsStorage" }, { UID_KeyObjectSelectionDocumentStorage, "KeyObjectSelectionDocumentStorage" }, { UID_LensometryMeasurementsStorage, "LensometryMeasurementsStorage" }, { UID_MacularGridThicknessAndVolumeReportStorage, "MacularGridThicknessAndVolumeReportStorage" }, { UID_MammographyCADSRStorage, "MammographyCADSRStorage" }, { UID_MediaStorageDirectoryStorage, "MediaStorageDirectoryStorage" }, { UID_MRImageStorage, "MRImageStorage" }, { UID_MRSpectroscopyStorage, "MRSpectroscopyStorage" }, { UID_MultiframeGrayscaleByteSecondaryCaptureImageStorage, "MultiframeGrayscaleByteSecondaryCaptureImageStorage" }, { UID_MultiframeGrayscaleWordSecondaryCaptureImageStorage, "MultiframeGrayscaleWordSecondaryCaptureImageStorage" }, { UID_MultiframeSingleBitSecondaryCaptureImageStorage, "MultiframeSingleBitSecondaryCaptureImageStorage" }, { UID_MultiframeTrueColorSecondaryCaptureImageStorage, "MultiframeTrueColorSecondaryCaptureImageStorage" }, { UID_NuclearMedicineImageStorage, "NuclearMedicineImageStorage" }, { UID_OphthalmicAxialMeasurementsStorage, "OphthalmicAxialMeasurementsStorage" }, { UID_OphthalmicPhotography16BitImageStorage, "OphthalmicPhotography16BitImageStorage" }, { UID_OphthalmicPhotography8BitImageStorage, "OphthalmicPhotography8BitImageStorage" }, { UID_OphthalmicTomographyImageStorage, "OphthalmicTomographyImageStorage" }, { UID_OphthalmicVisualFieldStaticPerimetryMeasurementsStorage, "OphthalmicVisualFieldStaticPerimetryMeasurementsStorage" }, { UID_PositronEmissionTomographyImageStorage, "PositronEmissionTomographyImageStorage" }, { UID_ProcedureLogStorage, "ProcedureLogStorage" }, { UID_PseudoColorSoftcopyPresentationStateStorage, "PseudoColorSoftcopyPresentationStateStorage" }, { UID_RawDataStorage, "RawDataStorage" }, { UID_RealWorldValueMappingStorage, "RealWorldValueMappingStorage" }, { UID_RespiratoryWaveformStorage, "RespiratoryWaveformStorage" }, { UID_RTBeamsTreatmentRecordStorage, "RTBeamsTreatmentRecordStorage" }, { UID_RTBrachyTreatmentRecordStorage, "RTBrachyTreatmentRecordStorage" }, { UID_RTDoseStorage, "RTDoseStorage" }, { UID_RTImageStorage, "RTImageStorage" }, { UID_RTIonBeamsTreatmentRecordStorage, "RTIonBeamsTreatmentRecordStorage" }, { UID_RTIonPlanStorage, "RTIonPlanStorage" }, { UID_RTPlanStorage, "RTPlanStorage" }, { UID_RTStructureSetStorage, "RTStructureSetStorage" }, { UID_RTTreatmentSummaryRecordStorage, "RTTreatmentSummaryRecordStorage" }, { UID_SecondaryCaptureImageStorage, "SecondaryCaptureImageStorage" }, { UID_SegmentationStorage, "SegmentationStorage" }, { UID_SpatialFiducialsStorage, "SpatialFiducialsStorage" }, { UID_SpatialRegistrationStorage, "SpatialRegistrationStorage" }, { UID_SpectaclePrescriptionReportStorage, "SpectaclePrescriptionReportStorage" }, { UID_StereometricRelationshipStorage, "StereometricRelationshipStorage" }, { UID_SubjectiveRefractionMeasurementsStorage, "SubjectiveRefractionMeasurementsStorage" }, { UID_SurfaceSegmentationStorage, "SurfaceSegmentationStorage" }, { UID_TwelveLeadECGWaveformStorage, "TwelveLeadECGWaveformStorage" }, { UID_UltrasoundImageStorage, "UltrasoundImageStorage" }, { UID_UltrasoundMultiframeImageStorage, "UltrasoundMultiframeImageStorage" }, { UID_VideoEndoscopicImageStorage, "VideoEndoscopicImageStorage" }, { UID_VideoMicroscopicImageStorage, "VideoMicroscopicImageStorage" }, { UID_VideoPhotographicImageStorage, "VideoPhotographicImageStorage" }, { UID_VisualAcuityMeasurementsStorage, "VisualAcuityMeasurementsStorage" }, { UID_VLEndoscopicImageStorage, "VLEndoscopicImageStorage" }, { UID_VLMicroscopicImageStorage, "VLMicroscopicImageStorage" }, { UID_VLPhotographicImageStorage, "VLPhotographicImageStorage" }, { UID_VLSlideCoordinatesMicroscopicImageStorage, "VLSlideCoordinatesMicroscopicImageStorage" }, { UID_VLWholeSlideMicroscopyImageStorage, "VLWholeSlideMicroscopyImageStorage" }, { UID_XAXRFGrayscaleSoftcopyPresentationStateStorage, "XAXRFGrayscaleSoftcopyPresentationStateStorage" }, { UID_XRay3DAngiographicImageStorage, "XRay3DAngiographicImageStorage" }, { UID_XRay3DCraniofacialImageStorage, "XRay3DCraniofacialImageStorage" }, { UID_XRayAngiographicImageStorage, "XRayAngiographicImageStorage" }, { UID_XRayRadiationDoseSRStorage, "XRayRadiationDoseSRStorage" }, { UID_XRayRadiofluoroscopicImageStorage, "XRayRadiofluoroscopicImageStorage" }, // Storage (retired) { UID_RETIRED_HardcopyColorImageStorage, "RETIRED_HardcopyColorImageStorage" }, { UID_RETIRED_HardcopyGrayscaleImageStorage, "RETIRED_HardcopyGrayscaleImageStorage" }, { UID_RETIRED_NuclearMedicineImageStorage, "RETIRED_NuclearMedicineImageStorage" }, { UID_RETIRED_StandaloneCurveStorage, "RETIRED_StandaloneCurveStorage" }, { UID_RETIRED_StandaloneModalityLUTStorage, "RETIRED_StandaloneModalityLUTStorage" }, { UID_RETIRED_StandaloneOverlayStorage, "RETIRED_StandaloneOverlayStorage" }, { UID_RETIRED_StandalonePETCurveStorage, "RETIRED_StandalonePETCurveStorage" }, { UID_RETIRED_StandaloneVOILUTStorage, "RETIRED_StandaloneVOILUTStorage" }, { UID_RETIRED_StoredPrintStorage, "RETIRED_StoredPrintStorage" }, { UID_RETIRED_UltrasoundImageStorage, "RETIRED_UltrasoundImageStorage" }, { UID_RETIRED_UltrasoundMultiframeImageStorage, "RETIRED_UltrasoundMultiframeImageStorage" }, { UID_RETIRED_VLImageStorage, "RETIRED_VLImageStorage" }, { UID_RETIRED_VLMultiFrameImageStorage, "RETIRED_VLMultiFrameImageStorage" }, { UID_RETIRED_XRayAngiographicBiPlaneImageStorage, "RETIRED_XRayAngiographicBiPlaneImageStorage" }, // Query/Retrieve { UID_FINDPatientRootQueryRetrieveInformationModel, "FINDPatientRootQueryRetrieveInformationModel" }, { UID_FINDStudyRootQueryRetrieveInformationModel, "FINDStudyRootQueryRetrieveInformationModel" }, { UID_GETPatientRootQueryRetrieveInformationModel, "GETPatientRootQueryRetrieveInformationModel" }, { UID_GETStudyRootQueryRetrieveInformationModel, "GETStudyRootQueryRetrieveInformationModel" }, { UID_MOVEPatientRootQueryRetrieveInformationModel, "MOVEPatientRootQueryRetrieveInformationModel" }, { UID_MOVEStudyRootQueryRetrieveInformationModel, "MOVEStudyRootQueryRetrieveInformationModel" }, { UID_RETIRED_FINDPatientStudyOnlyQueryRetrieveInformationModel, "RETIRED_FINDPatientStudyOnlyQueryRetrieveInformationModel" }, { UID_RETIRED_GETCompositeInstanceRetrieveWithoutBulkData, "RETIRED_GETCompositeInstanceRetrieveWithoutBulkData" }, { UID_RETIRED_GETCompositeInstanceRootRetrieve, "RETIRED_GETCompositeInstanceRootRetrieve" }, { UID_RETIRED_GETPatientStudyOnlyQueryRetrieveInformationModel, "RETIRED_GETPatientStudyOnlyQueryRetrieveInformationModel" }, { UID_RETIRED_MOVECompositeInstanceRootRetrieve, "RETIRED_MOVECompositeInstanceRootRetrieve" }, { UID_RETIRED_MOVEPatientStudyOnlyQueryRetrieveInformationModel, "RETIRED_MOVEPatientStudyOnlyQueryRetrieveInformationModel" }, // Worklist { UID_FINDGeneralPurposeWorklistInformationModel, "FINDGeneralPurposeWorklistInformationModel" }, { UID_FINDModalityWorklistInformationModel, "FINDModalityWorklistInformationModel" }, // General Purpose Worklist { UID_GeneralPurposePerformedProcedureStepSOPClass, "GeneralPurposePerformedProcedureStepSOPClass" }, { UID_GeneralPurposeScheduledProcedureStepSOPClass, "GeneralPurposeScheduledProcedureStepSOPClass" }, { UID_GeneralPurposeWorklistManagementMetaSOPClass, "GeneralPurposeWorklistManagementMetaSOPClass" }, // MPPS { UID_ModalityPerformedProcedureStepNotificationSOPClass, "ModalityPerformedProcedureStepNotificationSOPClass" }, { UID_ModalityPerformedProcedureStepRetrieveSOPClass, "ModalityPerformedProcedureStepRetrieveSOPClass" }, { UID_ModalityPerformedProcedureStepSOPClass, "ModalityPerformedProcedureStepSOPClass" }, // Unified Worklist and Procedure Step { UID_UnifiedWorklistAndProcedureStepServiceClass, "UnifiedWorklistAndProcedureStepServiceClass" }, { UID_UnifiedProcedureStepPushSOPClass, "UnifiedProcedureStepPushSOPClass" }, { UID_UnifiedProcedureStepWatchSOPClass, "UnifiedProcedureStepWatchSOPClass" }, { UID_UnifiedProcedureStepPullSOPClass, "UnifiedProcedureStepPullSOPClass" }, { UID_UnifiedProcedureStepEventSOPClass, "UnifiedProcedureStepEventSOPClass" }, { UID_UnifiedWorklistAndProcedureStepSOPInstance, "UnifiedWorklistAndProcedureStepSOPInstance" }, // Storage Commitment { UID_RETIRED_StorageCommitmentPullModelSOPClass, "RETIRED_StorageCommitmentPullModelSOPClass" }, { UID_RETIRED_StorageCommitmentPullModelSOPInstance, "RETIRED_StorageCommitmentPullModelSOPInstance" }, { UID_StorageCommitmentPushModelSOPClass, "StorageCommitmentPushModelSOPClass" }, { UID_StorageCommitmentPushModelSOPInstance, "StorageCommitmentPushModelSOPInstance" }, // Hanging Protocols { UID_FINDHangingProtocolInformationModel, "FINDHangingProtocolInformationModel" }, { UID_MOVEHangingProtocolInformationModel, "MOVEHangingProtocolInformationModel" }, // Relevant Patient Information Query { UID_BreastImagingRelevantPatientInformationQuery, "BreastImagingRelevantPatientInformationQuery" }, { UID_CardiacRelevantPatientInformationQuery, "CardiacRelevantPatientInformationQuery" }, { UID_GeneralRelevantPatientInformationQuery, "GeneralRelevantPatientInformationQuery" }, // Color Palette Storage and Query/Retrieve { UID_ColorPaletteStorage, "ColorPaletteStorage" }, { UID_FINDColorPaletteInformationModel, "FINDColorPaletteInformationModel" }, { UID_MOVEColorPaletteInformationModel, "MOVEColorPaletteInformationModel" }, { UID_GETColorPaletteInformationModel, "GETColorPaletteInformationModel" }, // Implant Template Query/Retrieve { UID_FINDGenericImplantTemplateInformationModel, "FINDGenericImplantTemplateInformationModel" }, { UID_MOVEGenericImplantTemplateInformationModel, "MOVEGenericImplantTemplateInformationModel" }, { UID_GETGenericImplantTemplateInformationModel, "GETGenericImplantTemplateInformationModel" }, { UID_FINDImplantAssemblyTemplateInformationModel, "FINDImplantAssemblyTemplateInformationModel" }, { UID_MOVEImplantAssemblyTemplateInformationModel, "MOVEImplantAssemblyTemplateInformationModel" }, { UID_GETImplantAssemblyTemplateInformationModel, "GETImplantAssemblyTemplateInformationModel" }, { UID_FINDImplantTemplateGroupInformationModel, "FINDImplantTemplateGroupInformationModel" }, { UID_MOVEImplantTemplateGroupInformationModel, "MOVEImplantTemplateGroupInformationModel" }, { UID_GETImplantTemplateGroupInformationModel, "GETImplantTemplateGroupInformationModel" }, // Print { UID_BasicAnnotationBoxSOPClass, "BasicAnnotationBoxSOPClass" }, { UID_BasicColorImageBoxSOPClass, "BasicColorImageBoxSOPClass" }, { UID_BasicColorPrintManagementMetaSOPClass, "BasicColorPrintManagementMetaSOPClass" }, { UID_BasicFilmBoxSOPClass, "BasicFilmBoxSOPClass" }, { UID_BasicFilmSessionSOPClass, "BasicFilmSessionSOPClass" }, { UID_BasicGrayscaleImageBoxSOPClass, "BasicGrayscaleImageBoxSOPClass" }, { UID_BasicGrayscalePrintManagementMetaSOPClass, "BasicGrayscalePrintManagementMetaSOPClass" }, { UID_PresentationLUTSOPClass, "PresentationLUTSOPClass" }, { UID_PrintJobSOPClass, "PrintJobSOPClass" }, { UID_PrinterConfigurationRetrievalSOPClass, "PrinterConfigurationRetrievalSOPClass" }, { UID_PrinterConfigurationRetrievalSOPInstance, "PrinterConfigurationRetrievalSOPInstance" }, { UID_PrinterSOPClass, "PrinterSOPClass" }, { UID_PrinterSOPInstance, "PrinterSOPInstance" }, { UID_RETIRED_BasicPrintImageOverlayBoxSOPClass, "RETIRED_BasicPrintImageOverlayBoxSOPClass" }, { UID_RETIRED_ImageOverlayBoxSOPClass, "RETIRED_ImageOverlayBoxSOPClass" }, { UID_RETIRED_PrintQueueManagementSOPClass, "RETIRED_PrintQueueManagementSOPClass" }, { UID_RETIRED_PrintQueueSOPInstance, "RETIRED_PrintQueueSOPInstance" }, { UID_RETIRED_PullPrintRequestSOPClass, "RETIRED_PullPrintRequestSOPClass" }, { UID_RETIRED_PullStoredPrintManagementMetaSOPClass, "RETIRED_PullStoredPrintManagementMetaSOPClass" }, { UID_RETIRED_ReferencedColorPrintManagementMetaSOPClass, "RETIRED_ReferencedColorPrintManagementMetaSOPClass" }, { UID_RETIRED_ReferencedGrayscalePrintManagementMetaSOPClass, "RETIRED_ReferencedGrayscalePrintManagementMetaSOPClass" }, { UID_RETIRED_ReferencedImageBoxSOPClass, "RETIRED_ReferencedImageBoxSOPClass" }, { UID_VOILUTBoxSOPClass, "VOILUTBoxSOPClass" }, // Detached Management { UID_RETIRED_DetachedInterpretationManagementSOPClass, "RETIRED_DetachedInterpretationManagementSOPClass" }, { UID_RETIRED_DetachedPatientManagementMetaSOPClass, "RETIRED_DetachedPatientManagementMetaSOPClass" }, { UID_RETIRED_DetachedPatientManagementSOPClass, "RETIRED_DetachedPatientManagementSOPClass" }, { UID_RETIRED_DetachedResultsManagementMetaSOPClass, "RETIRED_DetachedResultsManagementMetaSOPClass" }, { UID_RETIRED_DetachedResultsManagementSOPClass, "RETIRED_DetachedResultsManagementSOPClass" }, { UID_RETIRED_DetachedStudyManagementMetaSOPClass, "RETIRED_DetachedStudyManagementMetaSOPClass" }, { UID_RETIRED_DetachedStudyManagementSOPClass, "RETIRED_DetachedStudyManagementSOPClass" }, { UID_RETIRED_DetachedVisitManagementSOPClass, "RETIRED_DetachedVisitManagementSOPClass" }, // Procedure Log { UID_ProceduralEventLoggingSOPClass, "ProceduralEventLoggingSOPClass" }, { UID_ProceduralEventLoggingSOPInstance, "ProceduralEventLoggingSOPInstance" }, // Substance Administration { UID_SubstanceAdministrationLoggingSOPClass, "SubstanceAdministrationLoggingSOPClass" }, { UID_SubstanceAdministrationLoggingSOPInstance, "SubstanceAdministrationLoggingSOPInstance" }, { UID_ProductCharacteristicsQuerySOPClass, "ProductCharacteristicsQuerySOPClass" }, { UID_SubstanceApprovalQuerySOPClass, "SubstanceApprovalQuerySOPClass" }, // Media Creation { UID_MediaCreationManagementSOPClass, "MediaCreationManagementSOPClass" }, // SOP Class Relationship Negotiation { UID_StorageServiceClass, "StorageServiceClass" }, // Instance Availability Notification { UID_InstanceAvailabilityNotificationSOPClass, "InstanceAvailabilityNotificationSOPClass" }, // Application Hosting { UID_NativeDICOMModel, "NativeDICOMModel" }, { UID_AbstractMultiDimensionalImageModel, "AbstractMultiDimensionalImageModel" }, // Other { UID_RETIRED_BasicStudyContentNotificationSOPClass, "RETIRED_BasicStudyContentNotificationSOPClass" }, { UID_RETIRED_StudyComponentManagementSOPClass, "RETIRED_StudyComponentManagementSOPClass" }, { UID_VerificationSOPClass, "VerificationSOPClass" }, // Coding Schemes { UID_DICOMControlledTerminologyCodingScheme, "DICOMControlledTerminologyCodingScheme" }, { UID_DICOMUIDRegistryCodingScheme, "DICOMUIDRegistryCodingScheme" }, // Configuration Management LDAP UIDs { UID_LDAP_dicomAETitle, "LDAP_dicomAETitle" }, { UID_LDAP_dicomApplicationCluster, "LDAP_dicomApplicationCluster" }, { UID_LDAP_dicomAssociationAcceptor, "LDAP_dicomAssociationAcceptor" }, { UID_LDAP_dicomAssociationInitiator, "LDAP_dicomAssociationInitiator" }, { UID_LDAP_dicomAuthorizedNodeCertificateReference, "LDAP_dicomAuthorizedNodeCertificateReference" }, { UID_LDAP_dicomConfigurationRoot, "LDAP_dicomConfigurationRoot" }, { UID_LDAP_dicomDescription, "LDAP_dicomDescription" }, { UID_LDAP_dicomDevice, "LDAP_dicomDevice" }, { UID_LDAP_dicomDeviceName, "LDAP_dicomDeviceName" }, { UID_LDAP_dicomDeviceSerialNumber, "LDAP_dicomDeviceSerialNumber" }, { UID_LDAP_dicomDevicesRoot, "LDAP_dicomDevicesRoot" }, { UID_LDAP_dicomHostname, "LDAP_dicomHostname" }, { UID_LDAP_dicomInstalled, "LDAP_dicomInstalled" }, { UID_LDAP_dicomInstitutionAddress, "LDAP_dicomInstitutionAddress" }, { UID_LDAP_dicomInstitutionDepartmentName, "LDAP_dicomInstitutionDepartmentName" }, { UID_LDAP_dicomInstitutionName, "LDAP_dicomInstitutionName" }, { UID_LDAP_dicomIssuerOfPatientID, "LDAP_dicomIssuerOfPatientID" }, { UID_LDAP_dicomManufacturer, "LDAP_dicomManufacturer" }, { UID_LDAP_dicomManufacturerModelName, "LDAP_dicomManufacturerModelName" }, { UID_LDAP_dicomNetworkAE, "LDAP_dicomNetworkAE" }, { UID_LDAP_dicomNetworkConnection, "LDAP_dicomNetworkConnection" }, { UID_LDAP_dicomNetworkConnectionReference, "LDAP_dicomNetworkConnectionReference" }, { UID_LDAP_dicomPort, "LDAP_dicomPort" }, { UID_LDAP_dicomPreferredCalledAETitle, "LDAP_dicomPreferredCalledAETitle" }, { UID_LDAP_dicomPreferredCallingAETitle, "LDAP_dicomPreferredCallingAETitle" }, { UID_LDAP_dicomPrimaryDeviceType, "LDAP_dicomPrimaryDeviceType" }, { UID_LDAP_dicomRelatedDeviceReference, "LDAP_dicomRelatedDeviceReference" }, { UID_LDAP_dicomSOPClass, "LDAP_dicomSOPClass" }, { UID_LDAP_dicomSoftwareVersion, "LDAP_dicomSoftwareVersion" }, { UID_LDAP_dicomStationName, "LDAP_dicomStationName" }, { UID_LDAP_dicomSupportedCharacterSet, "LDAP_dicomSupportedCharacterSet" }, { UID_LDAP_dicomTLSCyphersuite, "LDAP_dicomTLSCyphersuite" }, { UID_LDAP_dicomThisNodeCertificateReference, "LDAP_dicomThisNodeCertificateReference" }, { UID_LDAP_dicomTransferCapability, "LDAP_dicomTransferCapability" }, { UID_LDAP_dicomTransferRole, "LDAP_dicomTransferRole" }, { UID_LDAP_dicomTransferSyntax, "LDAP_dicomTransferSyntax" }, { UID_LDAP_dicomUniqueAETitle, "LDAP_dicomUniqueAETitle" }, { UID_LDAP_dicomUniqueAETitlesRegistryRoot, "LDAP_dicomUniqueAETitlesRegistryRoot" }, { UID_LDAP_dicomVendorData, "LDAP_dicomVendorData" }, // Well-known Frame of References { UID_ICBM452T1FrameOfReference, "ICBM452T1FrameOfReference" }, { UID_ICBMSingleSubjectMRIFrameOfReference, "ICBMSingleSubjectMRIFrameOfReference" }, { UID_SPM2AVG152PDFrameOfReference, "SPM2AVG152PDFrameOfReference" }, { UID_SPM2AVG152T1FrameOfReference, "SPM2AVG152T1FrameOfReference" }, { UID_SPM2AVG152T2FrameOfReference, "SPM2AVG152T2FrameOfReference" }, { UID_SPM2AVG305T1FrameOfReference, "SPM2AVG305T1FrameOfReference" }, { UID_SPM2BRAINMASKFrameOfReference, "SPM2BRAINMASKFrameOfReference" }, { UID_SPM2CSFFrameOfReference, "SPM2CSFFrameOfReference" }, { UID_SPM2EPIFrameOfReference, "SPM2EPIFrameOfReference" }, { UID_SPM2FILT1FrameOfReference, "SPM2FILT1FrameOfReference" }, { UID_SPM2GRAYFrameOfReference, "SPM2GRAYFrameOfReference" }, { UID_SPM2PDFrameOfReference, "SPM2PDFrameOfReference" }, { UID_SPM2PETFrameOfReference, "SPM2PETFrameOfReference" }, { UID_SPM2SINGLESUBJT1FrameOfReference, "SPM2SINGLESUBJT1FrameOfReference" }, { UID_SPM2SPECTFrameOfReference, "SPM2SPECTFrameOfReference" }, { UID_SPM2T1FrameOfReference, "SPM2T1FrameOfReference" }, { UID_SPM2T2FrameOfReference, "SPM2T2FrameOfReference" }, { UID_SPM2TRANSMFrameOfReference, "SPM2TRANSMFrameOfReference" }, { UID_SPM2WHITEFrameOfReference, "SPM2WHITEFrameOfReference" }, { UID_TalairachBrainAtlasFrameOfReference, "TalairachBrainAtlasFrameOfReference" }, // UTC Synchronization Frame of Reference (CP 432) { UID_UniversalCoordinatedTimeSynchronizationFrameOfReference, "UniversalCoordinatedTimeSynchronizationFrameOfReference" }, // Well-known SOP Instances for Color Palettes { UID_HotIronColorPaletteSOPInstance, "HotIronColorPaletteSOPInstance" }, { UID_HotMetalBlueColorPaletteSOPInstance, "HotMetalBlueColorPaletteSOPInstance" }, { UID_PET20StepColorPaletteSOPInstance, "PET20StepColorPaletteSOPInstance" }, { UID_PETColorPaletteSOPInstance, "PETColorPaletteSOPInstance" }, // Draft Supplements { UID_DRAFT_RTBeamsDeliveryInstructionStorage, "DRAFT_RTBeamsDeliveryInstructionStorage" }, { UID_DRAFT_RTConventionalMachineVerification, "DRAFT_RTConventionalMachineVerification" }, { UID_DRAFT_RTIonMachineVerification, "DRAFT_RTIonMachineVerification" }, { UID_DRAFT_SRAudioStorage, "DRAFT_SRAudioStorage" }, { UID_DRAFT_SRComprehensiveStorage, "DRAFT_SRComprehensiveStorage" }, { UID_DRAFT_SRDetailStorage, "DRAFT_SRDetailStorage" }, { UID_DRAFT_SRTextStorage, "DRAFT_SRTextStorage" }, { UID_DRAFT_WaveformStorage, "DRAFT_WaveformStorage" }, { NULL, NULL } }; static const int uidNameMap_size = ( sizeof(uidNameMap) / sizeof(UIDNameMap) ); /** an array of const strings containing all known Storage SOP Classes * that fit into the conventional PATIENT-STUDY-SERIES-INSTANCE information * model, i.e. everything a Storage SCP might want to store in a PACS. * Special cases such as hanging protocol storage or the Storage SOP Class * are not included in this list. * * THIS LIST CONTAINS ALL STORAGE SOP CLASSES INCLUDING RETIRED ONES * AND IS LARGER THAN 64 ENTRIES. */ const char* dcmAllStorageSOPClassUIDs[] = { UID_AmbulatoryECGWaveformStorage, UID_ArterialPulseWaveformStorage, UID_AutorefractionMeasurementsStorage, UID_BasicStructuredDisplayStorage, UID_BasicTextSRStorage, UID_BasicVoiceAudioWaveformStorage, UID_BlendingSoftcopyPresentationStateStorage, UID_BreastTomosynthesisImageStorage, UID_CardiacElectrophysiologyWaveformStorage, UID_ChestCADSRStorage, UID_ColonCADSRStorage, UID_ColorSoftcopyPresentationStateStorage, UID_ComprehensiveSRStorage, UID_ComputedRadiographyImageStorage, UID_CTImageStorage, UID_DeformableSpatialRegistrationStorage, UID_DigitalIntraOralXRayImageStorageForPresentation, UID_DigitalIntraOralXRayImageStorageForProcessing, UID_DigitalMammographyXRayImageStorageForPresentation, UID_DigitalMammographyXRayImageStorageForProcessing, UID_DigitalXRayImageStorageForPresentation, UID_DigitalXRayImageStorageForProcessing, UID_EncapsulatedCDAStorage, UID_EncapsulatedPDFStorage, UID_EnhancedCTImageStorage, UID_EnhancedMRColorImageStorage, UID_EnhancedMRImageStorage, UID_EnhancedPETImageStorage, UID_EnhancedSRStorage, UID_EnhancedUSVolumeStorage, UID_EnhancedXAImageStorage, UID_EnhancedXRFImageStorage, UID_GeneralAudioWaveformStorage, UID_GeneralECGWaveformStorage, UID_GenericImplantTemplateStorage, UID_GrayscaleSoftcopyPresentationStateStorage, UID_HemodynamicWaveformStorage, UID_ImplantAssemblyTemplateStorage, UID_ImplantationPlanSRDocumentStorage, UID_ImplantTemplateGroupStorage, UID_IntraocularLensCalculationsStorage, UID_KeratometryMeasurementsStorage, UID_KeyObjectSelectionDocumentStorage, UID_LensometryMeasurementsStorage, UID_MacularGridThicknessAndVolumeReportStorage, UID_MammographyCADSRStorage, UID_MRImageStorage, UID_MRSpectroscopyStorage, UID_MultiframeGrayscaleByteSecondaryCaptureImageStorage, UID_MultiframeGrayscaleWordSecondaryCaptureImageStorage, UID_MultiframeSingleBitSecondaryCaptureImageStorage, UID_MultiframeTrueColorSecondaryCaptureImageStorage, UID_NuclearMedicineImageStorage, UID_OphthalmicAxialMeasurementsStorage, UID_OphthalmicPhotography16BitImageStorage, UID_OphthalmicPhotography8BitImageStorage, UID_OphthalmicTomographyImageStorage, UID_OphthalmicVisualFieldStaticPerimetryMeasurementsStorage, UID_PositronEmissionTomographyImageStorage, UID_ProcedureLogStorage, UID_PseudoColorSoftcopyPresentationStateStorage, UID_RawDataStorage, UID_RealWorldValueMappingStorage, UID_RespiratoryWaveformStorage, UID_RTBeamsTreatmentRecordStorage, UID_RTBrachyTreatmentRecordStorage, UID_RTDoseStorage, UID_RTImageStorage, UID_RTIonBeamsTreatmentRecordStorage, UID_RTIonPlanStorage, UID_RTPlanStorage, UID_RTStructureSetStorage, UID_RTTreatmentSummaryRecordStorage, UID_SecondaryCaptureImageStorage, UID_SegmentationStorage, UID_SpatialFiducialsStorage, UID_SpatialRegistrationStorage, UID_SpectaclePrescriptionReportStorage, UID_StereometricRelationshipStorage, UID_SubjectiveRefractionMeasurementsStorage, UID_SurfaceSegmentationStorage, UID_TwelveLeadECGWaveformStorage, UID_UltrasoundImageStorage, UID_UltrasoundMultiframeImageStorage, UID_VideoEndoscopicImageStorage, UID_VideoMicroscopicImageStorage, UID_VideoPhotographicImageStorage, UID_VisualAcuityMeasurementsStorage, UID_VLEndoscopicImageStorage, UID_VLMicroscopicImageStorage, UID_VLPhotographicImageStorage, UID_VLSlideCoordinatesMicroscopicImageStorage, UID_VLWholeSlideMicroscopyImageStorage, UID_XAXRFGrayscaleSoftcopyPresentationStateStorage, UID_XRay3DAngiographicImageStorage, UID_XRay3DCraniofacialImageStorage, UID_XRayAngiographicImageStorage, UID_XRayRadiationDoseSRStorage, UID_XRayRadiofluoroscopicImageStorage, // retired UID_RETIRED_HardcopyColorImageStorage, UID_RETIRED_HardcopyGrayscaleImageStorage, UID_RETIRED_NuclearMedicineImageStorage, UID_RETIRED_StandaloneCurveStorage, UID_RETIRED_StandaloneModalityLUTStorage, UID_RETIRED_StandaloneOverlayStorage, UID_RETIRED_StandalonePETCurveStorage, UID_RETIRED_StandaloneVOILUTStorage, UID_RETIRED_StoredPrintStorage, UID_RETIRED_UltrasoundImageStorage, UID_RETIRED_UltrasoundMultiframeImageStorage, UID_RETIRED_VLImageStorage, UID_RETIRED_VLMultiFrameImageStorage, UID_RETIRED_XRayAngiographicBiPlaneImageStorage, // draft UID_DRAFT_SRAudioStorage, UID_DRAFT_SRComprehensiveStorage, UID_DRAFT_SRDetailStorage, UID_DRAFT_SRTextStorage, UID_DRAFT_WaveformStorage, UID_DRAFT_RTBeamsDeliveryInstructionStorage, NULL }; const int numberOfAllDcmStorageSOPClassUIDs = (sizeof(dcmAllStorageSOPClassUIDs) / sizeof(const char*)) - 1; /* an array of const strings containing all storage SOP classes that * are proposed by default by those Storage SCU components in DCMTK * that always propose one presentation context for each SOP class, * e.g. movescu or dcmqrdb. This list is guaranteed to have at most * 120 entries (currently: 119) to leave enough room for FIND/MOVE * presentation contexts. */ const char* dcmLongSCUStorageSOPClassUIDs[] = { UID_AmbulatoryECGWaveformStorage, UID_ArterialPulseWaveformStorage, UID_AutorefractionMeasurementsStorage, UID_BasicStructuredDisplayStorage, UID_BasicTextSRStorage, UID_BasicVoiceAudioWaveformStorage, UID_BlendingSoftcopyPresentationStateStorage, UID_BreastTomosynthesisImageStorage, UID_CardiacElectrophysiologyWaveformStorage, UID_ChestCADSRStorage, UID_ColonCADSRStorage, UID_ColorSoftcopyPresentationStateStorage, UID_ComprehensiveSRStorage, UID_ComputedRadiographyImageStorage, UID_CTImageStorage, UID_DeformableSpatialRegistrationStorage, UID_DigitalIntraOralXRayImageStorageForPresentation, UID_DigitalIntraOralXRayImageStorageForProcessing, UID_DigitalMammographyXRayImageStorageForPresentation, UID_DigitalMammographyXRayImageStorageForProcessing, UID_DigitalXRayImageStorageForPresentation, UID_DigitalXRayImageStorageForProcessing, UID_EncapsulatedCDAStorage, UID_EncapsulatedPDFStorage, UID_EnhancedCTImageStorage, UID_EnhancedMRColorImageStorage, UID_EnhancedMRImageStorage, UID_EnhancedPETImageStorage, UID_EnhancedSRStorage, UID_EnhancedUSVolumeStorage, UID_EnhancedXAImageStorage, UID_EnhancedXRFImageStorage, UID_GeneralAudioWaveformStorage, UID_GeneralECGWaveformStorage, UID_GenericImplantTemplateStorage, UID_GrayscaleSoftcopyPresentationStateStorage, UID_HemodynamicWaveformStorage, UID_ImplantAssemblyTemplateStorage, UID_ImplantationPlanSRDocumentStorage, UID_ImplantTemplateGroupStorage, UID_IntraocularLensCalculationsStorage, UID_KeratometryMeasurementsStorage, UID_KeyObjectSelectionDocumentStorage, UID_LensometryMeasurementsStorage, UID_MacularGridThicknessAndVolumeReportStorage, UID_MammographyCADSRStorage, UID_MRImageStorage, UID_MRSpectroscopyStorage, UID_MultiframeGrayscaleByteSecondaryCaptureImageStorage, UID_MultiframeGrayscaleWordSecondaryCaptureImageStorage, UID_MultiframeSingleBitSecondaryCaptureImageStorage, UID_MultiframeTrueColorSecondaryCaptureImageStorage, UID_NuclearMedicineImageStorage, UID_OphthalmicAxialMeasurementsStorage, UID_OphthalmicPhotography16BitImageStorage, UID_OphthalmicPhotography8BitImageStorage, UID_OphthalmicTomographyImageStorage, UID_OphthalmicVisualFieldStaticPerimetryMeasurementsStorage, UID_PositronEmissionTomographyImageStorage, UID_ProcedureLogStorage, UID_PseudoColorSoftcopyPresentationStateStorage, UID_RawDataStorage, UID_RealWorldValueMappingStorage, UID_RespiratoryWaveformStorage, UID_RTBeamsTreatmentRecordStorage, UID_RTBrachyTreatmentRecordStorage, UID_RTDoseStorage, UID_RTImageStorage, UID_RTIonBeamsTreatmentRecordStorage, UID_RTIonPlanStorage, UID_RTPlanStorage, UID_RTStructureSetStorage, UID_RTTreatmentSummaryRecordStorage, UID_SecondaryCaptureImageStorage, UID_SegmentationStorage, UID_SpatialFiducialsStorage, UID_SpatialRegistrationStorage, UID_SpectaclePrescriptionReportStorage, UID_StereometricRelationshipStorage, UID_SubjectiveRefractionMeasurementsStorage, UID_SurfaceSegmentationStorage, UID_TwelveLeadECGWaveformStorage, UID_UltrasoundImageStorage, UID_UltrasoundMultiframeImageStorage, UID_VideoEndoscopicImageStorage, UID_VideoMicroscopicImageStorage, UID_VideoPhotographicImageStorage, UID_VisualAcuityMeasurementsStorage, UID_VLEndoscopicImageStorage, UID_VLMicroscopicImageStorage, UID_VLPhotographicImageStorage, UID_VLSlideCoordinatesMicroscopicImageStorage, UID_VLWholeSlideMicroscopyImageStorage, UID_XAXRFGrayscaleSoftcopyPresentationStateStorage, UID_XRay3DAngiographicImageStorage, UID_XRay3DCraniofacialImageStorage, UID_XRayAngiographicImageStorage, UID_XRayRadiationDoseSRStorage, UID_XRayRadiofluoroscopicImageStorage, // retired UID_RETIRED_HardcopyColorImageStorage, UID_RETIRED_HardcopyGrayscaleImageStorage, UID_RETIRED_NuclearMedicineImageStorage, UID_RETIRED_StandaloneCurveStorage, UID_RETIRED_StandaloneModalityLUTStorage, UID_RETIRED_StandaloneOverlayStorage, UID_RETIRED_StandalonePETCurveStorage, UID_RETIRED_StandaloneVOILUTStorage, UID_RETIRED_StoredPrintStorage, UID_RETIRED_UltrasoundImageStorage, UID_RETIRED_UltrasoundMultiframeImageStorage, UID_RETIRED_VLImageStorage, UID_RETIRED_VLMultiFrameImageStorage, UID_RETIRED_XRayAngiographicBiPlaneImageStorage, // draft UID_DRAFT_RTBeamsDeliveryInstructionStorage, UID_DRAFT_SRAudioStorage, UID_DRAFT_SRComprehensiveStorage, UID_DRAFT_SRDetailStorage, UID_DRAFT_SRTextStorage, UID_DRAFT_WaveformStorage, NULL }; const int numberOfDcmLongSCUStorageSOPClassUIDs = (sizeof(dcmLongSCUStorageSOPClassUIDs) / sizeof(const char*)) - 1; /** an array of const strings containing all storage SOP classes that * are proposed by default by those Storage SCU components in DCMTK * that always propose TWO presentation context for each SOP class, * e.g. storescu. This list is guaranteed to have at most 64 entries. */ const char* dcmShortSCUStorageSOPClassUIDs[] = { /* This list *must* be limited to 64 SOP classes or less (currently: 64). * If we have more than 64 storage transfer syntaxes, tools such as * storescu will fail because they attempt to negotiate two presentation * contexts for each SOP class, and there is a total limit of 128 contexts * for one association. * Because of this limitation, all draft and retired storage SOP classes * are removed from this list. We have also omitted support for some * recently approved SOP classes. * UID_MediaStorageDirectoryStorage should not be present in this list. */ UID_AmbulatoryECGWaveformStorage, UID_BasicTextSRStorage, UID_BasicVoiceAudioWaveformStorage, UID_BlendingSoftcopyPresentationStateStorage, UID_CardiacElectrophysiologyWaveformStorage, UID_ChestCADSRStorage, UID_ColonCADSRStorage, UID_ColorSoftcopyPresentationStateStorage, UID_ComprehensiveSRStorage, UID_ComputedRadiographyImageStorage, UID_CTImageStorage, UID_DigitalIntraOralXRayImageStorageForPresentation, UID_DigitalIntraOralXRayImageStorageForProcessing, UID_DigitalMammographyXRayImageStorageForPresentation, UID_DigitalMammographyXRayImageStorageForProcessing, UID_DigitalXRayImageStorageForPresentation, UID_DigitalXRayImageStorageForProcessing, UID_EncapsulatedPDFStorage, UID_EnhancedCTImageStorage, UID_EnhancedMRImageStorage, UID_EnhancedSRStorage, UID_EnhancedXAImageStorage, UID_EnhancedXRFImageStorage, UID_GeneralECGWaveformStorage, UID_GrayscaleSoftcopyPresentationStateStorage, UID_HemodynamicWaveformStorage, UID_KeyObjectSelectionDocumentStorage, UID_MammographyCADSRStorage, UID_MRImageStorage, UID_MRSpectroscopyStorage, UID_MultiframeGrayscaleByteSecondaryCaptureImageStorage, UID_MultiframeGrayscaleWordSecondaryCaptureImageStorage, UID_MultiframeSingleBitSecondaryCaptureImageStorage, UID_MultiframeTrueColorSecondaryCaptureImageStorage, UID_NuclearMedicineImageStorage, UID_OphthalmicPhotography16BitImageStorage, UID_OphthalmicPhotography8BitImageStorage, UID_OphthalmicTomographyImageStorage, UID_PositronEmissionTomographyImageStorage, UID_ProcedureLogStorage, UID_PseudoColorSoftcopyPresentationStateStorage, UID_RawDataStorage, UID_RealWorldValueMappingStorage, UID_RTBeamsTreatmentRecordStorage, UID_RTBrachyTreatmentRecordStorage, UID_RTDoseStorage, UID_RTImageStorage, UID_RTPlanStorage, UID_RTStructureSetStorage, UID_RTTreatmentSummaryRecordStorage, UID_SecondaryCaptureImageStorage, UID_SpatialFiducialsStorage, UID_SpatialRegistrationStorage, UID_StereometricRelationshipStorage, UID_TwelveLeadECGWaveformStorage, UID_UltrasoundImageStorage, UID_UltrasoundMultiframeImageStorage, UID_VLEndoscopicImageStorage, UID_VLMicroscopicImageStorage, UID_VLPhotographicImageStorage, UID_VLSlideCoordinatesMicroscopicImageStorage, UID_XRayAngiographicImageStorage, UID_XRayRadiationDoseSRStorage, UID_XRayRadiofluoroscopicImageStorage, NULL }; const int numberOfDcmShortSCUStorageSOPClassUIDs = (sizeof(dcmShortSCUStorageSOPClassUIDs) / sizeof(const char*)) - 1; /* ** The global variable dcmImageSOPClassUIDs is an array of ** string pointers containing the UIDs of all known Image SOP ** Classes. The instances of SOP Classes in this list can be ** referenced from DICOMDIR IMAGE records. ** ** The dcmgpdir/dcmmkdir program uses this list to determine ** what kind of objects can be referenced from IMAGE records. ** Be _very_ careful when adding SOP Classes to this list!! ** ** The global variable numberOfDcmImageSOPClassUIDs defines the ** size of the array. */ const char* dcmImageSOPClassUIDs[] = { // retired UID_BreastTomosynthesisImageStorage, UID_ComputedRadiographyImageStorage, UID_CTImageStorage, UID_DigitalIntraOralXRayImageStorageForPresentation, UID_DigitalIntraOralXRayImageStorageForProcessing, UID_DigitalMammographyXRayImageStorageForPresentation, UID_DigitalMammographyXRayImageStorageForProcessing, UID_DigitalXRayImageStorageForPresentation, UID_DigitalXRayImageStorageForProcessing, UID_EnhancedCTImageStorage, UID_EnhancedMRColorImageStorage, UID_EnhancedMRImageStorage, UID_EnhancedPETImageStorage, UID_EnhancedUSVolumeStorage, UID_EnhancedXAImageStorage, UID_EnhancedXRFImageStorage, UID_MRImageStorage, UID_MultiframeGrayscaleByteSecondaryCaptureImageStorage, UID_MultiframeGrayscaleWordSecondaryCaptureImageStorage, UID_MultiframeSingleBitSecondaryCaptureImageStorage, UID_MultiframeTrueColorSecondaryCaptureImageStorage, UID_NuclearMedicineImageStorage, UID_OphthalmicPhotography16BitImageStorage, UID_OphthalmicPhotography8BitImageStorage, UID_OphthalmicTomographyImageStorage, UID_PositronEmissionTomographyImageStorage, UID_RETIRED_HardcopyColorImageStorage, UID_RETIRED_HardcopyGrayscaleImageStorage, UID_RETIRED_NuclearMedicineImageStorage, UID_RETIRED_UltrasoundImageStorage, UID_RETIRED_UltrasoundMultiframeImageStorage, UID_RETIRED_VLImageStorage, UID_RETIRED_VLMultiFrameImageStorage, UID_RETIRED_XRayAngiographicBiPlaneImageStorage, UID_RTImageStorage, UID_SecondaryCaptureImageStorage, UID_UltrasoundImageStorage, UID_UltrasoundMultiframeImageStorage, UID_VideoEndoscopicImageStorage, UID_VideoMicroscopicImageStorage, UID_VideoPhotographicImageStorage, UID_VLEndoscopicImageStorage, UID_VLMicroscopicImageStorage, UID_VLPhotographicImageStorage, UID_VLSlideCoordinatesMicroscopicImageStorage, UID_VLWholeSlideMicroscopyImageStorage, UID_XRay3DAngiographicImageStorage, UID_XRay3DCraniofacialImageStorage, UID_XRayAngiographicImageStorage, UID_XRayRadiofluoroscopicImageStorage, NULL }; const int numberOfDcmImageSOPClassUIDs = (sizeof(dcmImageSOPClassUIDs) / sizeof(const char*)) - 1; typedef struct { const char *sopClass; const char *modality; unsigned long averageSize; /* can be way, way out */ } DcmModalityTable; /* ** The modalities table defines a short character code for each ** Storage SOP Class for use in filenames. ** It also gives a typical size for each SOP Instance. This will ** ususally be way out, but is useful in user interfaces to give an ** idea of progress when receiving an image (C-STORE does not indicate ** the size of an image being transmitted). */ static const DcmModalityTable modalities[] = { { UID_AmbulatoryECGWaveformStorage, "ECA", 4096 }, { UID_ArterialPulseWaveformStorage, "WVa", 4096 }, { UID_AutorefractionMeasurementsStorage, "OPa", 4096 }, { UID_BasicStructuredDisplayStorage, "SD", 4096 }, { UID_BasicTextSRStorage, "SRt", 4096 }, { UID_BasicVoiceAudioWaveformStorage, "AUV", 4096 }, { UID_BlendingSoftcopyPresentationStateStorage, "PSb", 4096 }, { UID_BreastTomosynthesisImageStorage, "BT", 4096 * 4096 * 2 }, { UID_CardiacElectrophysiologyWaveformStorage, "WVc", 4096 }, { UID_ChestCADSRStorage, "SRh", 4096 }, { UID_ColonCADSRStorage, "SRo", 4096 }, { UID_ColorSoftcopyPresentationStateStorage, "PSc", 4096 }, { UID_ComprehensiveSRStorage, "SRc", 4096 }, { UID_ComputedRadiographyImageStorage, "CR", 2048 * 2048 * 2 }, { UID_CTImageStorage, "CT", 512 * 512 * 2 }, { UID_DeformableSpatialRegistrationStorage, "RGd", 4096 }, { UID_DigitalIntraOralXRayImageStorageForPresentation, "DXo", 1024 * 1024 * 2 }, { UID_DigitalIntraOralXRayImageStorageForProcessing, "DPo", 1024 * 1024 * 2 }, { UID_DigitalMammographyXRayImageStorageForPresentation, "DXm", 4096 * 4096 * 2 }, { UID_DigitalMammographyXRayImageStorageForProcessing, "DPm", 4096 * 4096 * 2 }, { UID_DigitalXRayImageStorageForPresentation, "DX", 2048 * 2048 * 2 }, { UID_DigitalXRayImageStorageForProcessing, "DP", 2048 * 2048 * 2 }, { UID_EncapsulatedCDAStorage, "CDA", 4096 }, { UID_EncapsulatedPDFStorage, "PDF", 1024 * 1024 }, { UID_EnhancedCTImageStorage, "CTe", 256 * 512 * 512 }, { UID_EnhancedMRColorImageStorage, "MRc", 256 * 512 * 512 * 3 }, { UID_EnhancedMRImageStorage, "MRe", 256 * 512 * 512 }, { UID_EnhancedPETImageStorage, "PIe", 512 * 512 * 2 }, { UID_EnhancedSRStorage, "SRe", 4096 }, { UID_EnhancedUSVolumeStorage, "USe", 512 * 512 }, { UID_EnhancedXAImageStorage, "XAe", 256 * 512 * 512 }, { UID_EnhancedXRFImageStorage, "RFe", 256 * 512 * 512 }, { UID_GeneralAudioWaveformStorage, "AUG", 4096 }, { UID_GeneralECGWaveformStorage, "ECG", 4096 }, { UID_GenericImplantTemplateStorage, "IT", 4096 }, { UID_GrayscaleSoftcopyPresentationStateStorage, "PSg", 4096 }, { UID_HemodynamicWaveformStorage, "WVh", 4096 }, { UID_ImplantAssemblyTemplateStorage, "ITa", 4096 }, { UID_ImplantationPlanSRDocumentStorage, "SRi", 4096 }, { UID_ImplantTemplateGroupStorage, "ITg", 4096 }, { UID_IntraocularLensCalculationsStorage, "OPc", 4096 }, { UID_KeratometryMeasurementsStorage, "OPk", 4096 }, { UID_KeyObjectSelectionDocumentStorage, "KO", 4096 }, { UID_LensometryMeasurementsStorage, "OPl", 4096 }, { UID_MacularGridThicknessAndVolumeReportStorage, "SRg", 4096 }, { UID_MammographyCADSRStorage, "SRm", 4096 }, { UID_MRImageStorage, "MR", 256 * 256 * 2}, { UID_MRSpectroscopyStorage, "MRs", 256 * 512 * 512 }, { UID_MultiframeGrayscaleByteSecondaryCaptureImageStorage, "SCb", 512 * 512 }, { UID_MultiframeGrayscaleWordSecondaryCaptureImageStorage, "SCw", 512 * 512 * 2 }, { UID_MultiframeSingleBitSecondaryCaptureImageStorage, "SCs", 1024 * 1024 }, /* roughly an A4 300dpi scan */ { UID_MultiframeTrueColorSecondaryCaptureImageStorage, "SCc", 512 * 512 * 3 }, { UID_NuclearMedicineImageStorage, "NM", 64 * 64 * 2 }, { UID_OphthalmicAxialMeasurementsStorage, "OPx", 4096 }, { UID_OphthalmicPhotography16BitImageStorage, "OPw", 768 * 576 * 6 }, { UID_OphthalmicPhotography8BitImageStorage, "OPb", 768 * 576 * 3 }, { UID_OphthalmicTomographyImageStorage, "OPt", 768 * 576 * 3 }, { UID_OphthalmicVisualFieldStaticPerimetryMeasurementsStorage, "OPp", 4096 }, { UID_PositronEmissionTomographyImageStorage, "PI", 512 * 512 * 2 }, { UID_ProcedureLogStorage, "SRp", 4096 }, { UID_PseudoColorSoftcopyPresentationStateStorage, "PSp", 4096 }, { UID_RawDataStorage, "RAW", 512 * 512 * 256 }, { UID_RealWorldValueMappingStorage, "RWM", 4096 }, { UID_RespiratoryWaveformStorage, "WVr", 4096 }, { UID_RTBeamsTreatmentRecordStorage, "RTb", 4096 }, { UID_RTBrachyTreatmentRecordStorage, "RTr", 4096 }, { UID_RTDoseStorage, "RD", 4096 }, { UID_RTImageStorage, "RI", 4096 }, { UID_RTIonBeamsTreatmentRecordStorage, "RTi", 4096 }, { UID_RTIonPlanStorage, "RPi", 4096 }, { UID_RTPlanStorage, "RP" , 4096 }, { UID_RTStructureSetStorage, "RS", 4096 }, { UID_RTTreatmentSummaryRecordStorage, "RTs", 4096 }, { UID_SecondaryCaptureImageStorage, "SC", 512 * 512 * 2 }, { UID_SegmentationStorage, "SG", 4096 }, { UID_SpatialFiducialsStorage, "FID", 4096 }, { UID_SpatialRegistrationStorage, "RGs", 4096 }, { UID_SpectaclePrescriptionReportStorage, "SRs", 4096 }, { UID_StereometricRelationshipStorage, "OPr", 4096 }, { UID_SubjectiveRefractionMeasurementsStorage, "OPs", 4096 }, { UID_SurfaceSegmentationStorage, "SGs", 4096 }, { UID_TwelveLeadECGWaveformStorage, "TLE", 4096 }, { UID_UltrasoundImageStorage, "US", 512 * 512 }, { UID_UltrasoundMultiframeImageStorage, "USm", 512 * 512 }, { UID_VideoEndoscopicImageStorage, "VVe", 768 * 576 * 3 }, { UID_VideoMicroscopicImageStorage, "VVm", 768 * 576 * 3 }, { UID_VideoPhotographicImageStorage, "VVp", 768 * 576 * 3 }, { UID_VisualAcuityMeasurementsStorage, "OPv", 4096 }, { UID_VLEndoscopicImageStorage, "VLe", 768 * 576 * 3 }, { UID_VLMicroscopicImageStorage, "VLm", 768 * 576 * 3 }, { UID_VLPhotographicImageStorage, "VLp", 768 * 576 * 3 }, { UID_VLSlideCoordinatesMicroscopicImageStorage, "VLs", 768 * 576 * 3 }, { UID_VLWholeSlideMicroscopyImageStorage, "VLw", 10000 * 10000 * 3}, { UID_XAXRFGrayscaleSoftcopyPresentationStateStorage, "PSx", 4096 }, { UID_XRay3DAngiographicImageStorage, "XA3", 256 * 512 * 512 }, { UID_XRay3DCraniofacialImageStorage, "XC3", 256 * 512 * 512 }, { UID_XRayAngiographicImageStorage, "XA", 256 * 512 * 512 }, { UID_XRayRadiationDoseSRStorage, "SRd", 4096 }, { UID_XRayRadiofluoroscopicImageStorage, "RF", 256 * 512 * 512 }, // retired { UID_RETIRED_HardcopyColorImageStorage, "HC", 4096 }, { UID_RETIRED_HardcopyGrayscaleImageStorage, "HG", 4096 }, { UID_RETIRED_NuclearMedicineImageStorage, "NMr", 64 * 64 * 2 }, { UID_RETIRED_StandaloneCurveStorage, "CV", 4096 }, { UID_RETIRED_StandaloneModalityLUTStorage, "ML", 4096 * 2 }, { UID_RETIRED_StandaloneOverlayStorage, "OV", 512 * 512 }, { UID_RETIRED_StandalonePETCurveStorage, "PC", 4096 }, { UID_RETIRED_StandaloneVOILUTStorage, "VO", 4096 * 2 }, { UID_RETIRED_StoredPrintStorage, "SP", 4096 }, { UID_RETIRED_UltrasoundImageStorage, "USr", 512 * 512 }, { UID_RETIRED_UltrasoundMultiframeImageStorage, "USf", 512 * 512 }, { UID_RETIRED_VLImageStorage, "VLr", 768 * 576 * 3 }, { UID_RETIRED_VLMultiFrameImageStorage, "VMr", 768 * 576 * 3 }, { UID_RETIRED_XRayAngiographicBiPlaneImageStorage, "XB", 512 * 512 * 2 }, // draft { UID_DRAFT_RTBeamsDeliveryInstructionStorage, "RBd", 4096 }, { UID_DRAFT_SRAudioStorage, "SRw", 4096 }, { UID_DRAFT_SRComprehensiveStorage, "SRx", 4096 }, { UID_DRAFT_SRDetailStorage, "SRy", 4096 }, { UID_DRAFT_SRTextStorage, "SRz", 4096 }, { UID_DRAFT_WaveformStorage, "WVd", 4096 } }; static const int numberOfDcmModalityTableEntries = (sizeof(modalities) / sizeof(DcmModalityTable)); /* * Public Function Prototypes */ const char *dcmSOPClassUIDToModality(const char *sopClassUID, const char *defaultValue) { if (sopClassUID == NULL) return NULL; /* check for known SOP class */ for (int i = 0; i < numberOfDcmModalityTableEntries; i++) { if (strcmp(modalities[i].sopClass, sopClassUID) == 0) return modalities[i].modality; } /* SOP class not found */ return defaultValue; } unsigned long dcmGuessModalityBytes(const char *sopClassUID) { unsigned long nbytes = 1048576; /* default: 1 MByte */ if (sopClassUID == NULL) return nbytes; int found=0; for (int i = 0; (!found && (i < numberOfDcmModalityTableEntries)); i++) { found = (strcmp(modalities[i].sopClass, sopClassUID) == 0); if (found) nbytes = modalities[i].averageSize; } return nbytes; } /* ** dcmFindNameOfUID(const char* uid) ** Return the name of a UID. ** Performs a table lookup and returns a pointer to a read-only string. ** Returns defaultValue of the UID is not known. */ const char* dcmFindNameOfUID(const char* uid, const char* defaultValue) { int i = 0; if (uid == NULL) return defaultValue; for (i=0; i static long gethostid(void) { char buf[128]; if (sysinfo(SI_HW_SERIAL, buf, 128) == -1) { char buf[256]; DCMDATA_FATAL("sysinfo: " << OFStandard::strerror(errno, buf, sizeof(buf)); exit(1); } #ifdef HAVE_STRTOUL return(strtoul(buf, NULL, 0)); #else long result; sscanf(buf, "%ld", &result); return result; #endif } #else // !HAVE_SYSINFO /* ** There is no implementation of gethostid() and we cannot implement it in ** terms of sysinfo() so define a workaround. */ #if (defined(HAVE_GETHOSTNAME) && defined(HAVE_GETHOSTBYNAME)) || defined(HAVE_WINDOWS_H) // 16K should be large enough to handle everything pointed to by a struct hostent #define GETHOSTBYNAME_R_BUFSIZE 16384 /* On Windows systems specify a routine to determine the MAC address of the Ethernet adapter */ /* Special handling for MinGW which does not yet (as of MinGW 2.0) support snmp.h */ #if defined(HAVE_WINDOWS_H) && !defined(__MINGW32__) #include // Visual C++ prior to version 6 declared different type names // in , so we need to define a mapping #if _MSC_VER < 1200 typedef RFC1157VarBind SnmpVarBind; typedef RFC1157VarBindList SnmpVarBindList; typedef AsnInteger AsnInteger32; #define SNMP_PDU_GETNEXT ASN_RFC1157_GETNEXTREQUEST #endif typedef int(WINAPI *pSnmpUtilOidCpy) ( OUT AsnObjectIdentifier *pOidDst, IN AsnObjectIdentifier *pOidSrc); typedef int(WINAPI *pSnmpUtilOidNCmp) ( IN AsnObjectIdentifier *pOid1, IN AsnObjectIdentifier *pOid2, IN UINT nSubIds); typedef void(WINAPI *pSnmpUtilVarBindFree) ( IN OUT SnmpVarBind *pVb); typedef bool(WINAPI *pSnmpExtensionInit) ( IN DWORD dwTimeZeroReference, OUT HANDLE *hPollForTrapEvent, OUT AsnObjectIdentifier *supportedView); typedef bool(WINAPI *pSnmpExtensionTrap) ( OUT AsnObjectIdentifier *enterprise, OUT AsnInteger32 *genericTrap, OUT AsnInteger32 *specificTrap, OUT AsnTimeticks *timeStamp, OUT SnmpVarBindList *variableBindings); typedef bool(WINAPI *pSnmpExtensionQuery) ( IN BYTE requestType, IN OUT SnmpVarBindList *variableBindings, OUT AsnInteger32 *errorStatus, OUT AsnInteger32 *errorIndex); typedef bool(WINAPI *pSnmpExtensionInitEx) ( OUT AsnObjectIdentifier *supportedView); typedef struct _ASTAT_ { ADAPTER_STATUS adapt; NAME_BUFFER NameBuff[30]; } ASTAT, *PASTAT; /* get the MAC address of the (first) Ethernet adapter (6 bytes) */ static unsigned char *getMACAddress(unsigned char buffer[6]) { OFBool success = OFFalse; /* init return variable */ memzero(buffer, 6 * sizeof(unsigned char)); NCB ncb; memzero(&ncb, sizeof(ncb)); /* reset the LAN adapter */ ncb.ncb_command = NCBRESET; /* it is considered bad practice to hardcode the LANA number (should enumerate adapters first), but at least this approach also works on Windows 9x */ ncb.ncb_lana_num = 0; if (Netbios(&ncb) == NRC_GOODRET) { ASTAT Adapter; /* prepare to get the adapter status block */ memzero(&ncb, sizeof(ncb)); ncb.ncb_command = NCBASTAT; /* it is considered bad practice to hardcode the LANA number (should enumerate adapters first), but at least this approach also works on Windows 9x */ ncb.ncb_lana_num = 0; strcpy((char *)ncb.ncb_callname, "*"); ncb.ncb_buffer = (unsigned char *)&Adapter; ncb.ncb_length = sizeof(Adapter); /* get the adapter's info */ if (Netbios(&ncb) == 0) { /* store the MAC address */ buffer[0] = Adapter.adapt.adapter_address[0]; buffer[1] = Adapter.adapt.adapter_address[1]; buffer[2] = Adapter.adapt.adapter_address[2]; buffer[3] = Adapter.adapt.adapter_address[3]; buffer[4] = Adapter.adapt.adapter_address[4]; buffer[5] = Adapter.adapt.adapter_address[5]; success = OFTrue; } } /* check whether NetBIOS routines succeeded, if not try the SNMP approach */ if (!success) { HINSTANCE m_hInst1, m_hInst2; /* load the "SNMP Utility Library" dll and get the addresses of the functions necessary */ m_hInst1 = LoadLibrary("snmpapi.dll"); if (m_hInst1 >= (HINSTANCE)HINSTANCE_ERROR) { pSnmpUtilOidCpy m_Copy = (pSnmpUtilOidCpy)GetProcAddress(m_hInst1, "SnmpUtilOidCpy"); pSnmpUtilOidNCmp m_Compare = (pSnmpUtilOidNCmp)GetProcAddress(m_hInst1, "SnmpUtilOidNCmp"); pSnmpUtilVarBindFree m_BindFree = (pSnmpUtilVarBindFree)GetProcAddress(m_hInst1, "SnmpUtilVarBindFree"); /* load the "SNMP Internet MIB" dll and get the addresses of the functions necessary */ m_hInst2 = LoadLibrary("inetmib1.dll"); if (m_hInst2 >= (HINSTANCE)HINSTANCE_ERROR) { HANDLE PollForTrapEvent; AsnObjectIdentifier SupportedView; UINT OID_ifEntryType[] = {1, 3, 6, 1, 2, 1, 2, 2, 1, 3}; UINT OID_ifEntryNum[] = {1, 3, 6, 1, 2, 1, 2, 1}; UINT OID_ipMACEntAddr[] = {1, 3, 6, 1, 2, 1, 2, 2, 1, 6}; AsnObjectIdentifier MIB_ifMACEntAddr = {sizeof(OID_ipMACEntAddr) / sizeof(UINT), OID_ipMACEntAddr}; AsnObjectIdentifier MIB_ifEntryType = {sizeof(OID_ifEntryType) / sizeof(UINT), OID_ifEntryType}; AsnObjectIdentifier MIB_ifEntryNum = {sizeof(OID_ifEntryNum) / sizeof(UINT), OID_ifEntryNum}; SnmpVarBindList varBindList; SnmpVarBind varBind[2]; AsnInteger32 errorStatus; AsnInteger32 errorIndex; AsnObjectIdentifier MIB_NULL = {0, 0}; int ret; int dtmp; int j = 0; pSnmpExtensionInit m_Init = (pSnmpExtensionInit)GetProcAddress(m_hInst2, "SnmpExtensionInit"); /* pSnmpExtensionInitEx m_InitEx = (pSnmpExtensionInitEx)GetProcAddress(m_hInst2, "SnmpExtensionInitEx"); */ pSnmpExtensionQuery m_Query = (pSnmpExtensionQuery)GetProcAddress(m_hInst2, "SnmpExtensionQuery"); /* pSnmpExtensionTrap m_Trap = (pSnmpExtensionTrap)GetProcAddress(m_hInst2, "SnmpExtensionTrap"); */ m_Init(GetTickCount(), &PollForTrapEvent, &SupportedView); /* initialize the variable list to be retrieved by m_Query */ varBindList.list = varBind; varBind[0].name = MIB_NULL; varBind[1].name = MIB_NULL; /* copy in the OID to find the number of entries in the inteface table */ varBindList.len = 1; /* only retrieving one item */ m_Copy(&varBind[0].name, &MIB_ifEntryNum); ret = m_Query(SNMP_PDU_GETNEXT, &varBindList, &errorStatus, &errorIndex); varBindList.len = 2; /* copy in the OID of ifType, the type of interface */ m_Copy(&varBind[0].name, &MIB_ifEntryType); /* copy in the OID of ifPhysAddress, the address */ m_Copy(&varBind[1].name, &MIB_ifMACEntAddr); do { /* Submit the query. Responses will be loaded into varBindList. We can expect this call to succeed a # of times corresponding to the # of adapters reported to be in the system */ ret = m_Query(SNMP_PDU_GETNEXT, &varBindList, &errorStatus, &errorIndex); if (!ret) ret = 1; else { /* confirm that the proper type has been returned */ ret = m_Compare(&varBind[0].name, &MIB_ifEntryType, MIB_ifEntryType.idLength); } if (!ret) { j++; dtmp = varBind[0].value.asnValue.number; /* type 6 describes ethernet interfaces */ if (dtmp == 6) { /* confirm that we have an address here */ ret = m_Compare(&varBind[1].name, &MIB_ifMACEntAddr,MIB_ifMACEntAddr.idLength); if ((!ret) && (varBind[1].value.asnValue.address.stream != NULL)) { if ((varBind[1].value.asnValue.address.stream[0] == 0x44) && (varBind[1].value.asnValue.address.stream[1] == 0x45) && (varBind[1].value.asnValue.address.stream[2] == 0x53) && (varBind[1].value.asnValue.address.stream[3] == 0x54) && (varBind[1].value.asnValue.address.stream[4] == 0x00)) { /* ignore all dial-up networking adapters */ continue; } if ((varBind[1].value.asnValue.address.stream[0] == 0x00) && (varBind[1].value.asnValue.address.stream[1] == 0x00) && (varBind[1].value.asnValue.address.stream[2] == 0x00) && (varBind[1].value.asnValue.address.stream[3] == 0x00) && (varBind[1].value.asnValue.address.stream[4] == 0x00) && (varBind[1].value.asnValue.address.stream[5] == 0x00)) { /* ignore NULL addresses returned by other network interfaces */ continue; } /* store the MAC address */ buffer[0] = varBind[1].value.asnValue.address.stream[0]; buffer[1] = varBind[1].value.asnValue.address.stream[1]; buffer[2] = varBind[1].value.asnValue.address.stream[2]; buffer[3] = varBind[1].value.asnValue.address.stream[3]; buffer[4] = varBind[1].value.asnValue.address.stream[4]; buffer[5] = varBind[1].value.asnValue.address.stream[5]; ret = 1; // we found an address -> exit } } } } while (!ret); /* Stop only on an error. An error will occur when we go exhaust the list of interfaces to be examined */ FreeLibrary(m_hInst2); /* free the bindings */ m_BindFree(&varBind[0]); m_BindFree(&varBind[1]); } FreeLibrary(m_hInst1); } } return buffer; } #endif #ifdef HAVE_PROTOTYPE_GETHOSTID /* CW10 has a prototype but no implementation (gethostid() is already declared extern */ long gethostid(void) #else static long gethostid(void) #endif { long result = 0; #if (defined(HAVE_GETHOSTNAME) && defined(HAVE_GETHOSTBYNAME)) || defined(HAVE_WINDOWS_H) char name[1024]; struct hostent *hent = NULL; char **p = NULL; struct in_addr in; #ifdef HAVE_WINSOCK_H WSAData winSockData; /* we need at least version 1.1 */ WORD winSockVersionNeeded = MAKEWORD(1, 1); WSAStartup(winSockVersionNeeded, &winSockData); #endif /* ** Define the hostid to be the system's main TCP/IP address. ** This is not perfect but it is better than nothing (i.e. using zero) */ if (gethostname(name, 1024) == 0) { #if defined(_REENTRANT) && !defined(_WIN32) && !defined(__CYGWIN__) // use gethostbyname_r instead of gethostbyname int h_errnop=0; struct hostent theHostent; char buffer[GETHOSTBYNAME_R_BUFSIZE]; if ((hent = gethostbyname_r(name, &theHostent, buffer, GETHOSTBYNAME_R_BUFSIZE, &h_errnop)) != NULL) #else if ((hent = gethostbyname(name)) != NULL) #endif { p = hent->h_addr_list; if (p && *p) { (void) memcpy(&in.s_addr, *p, sizeof(in.s_addr)); result = (long)in.s_addr; } } } #ifdef HAVE_WINSOCK_H WSACleanup(); #endif #endif /* defined(HAVE_GETHOSTNAME) && defined(HAVE_GETHOSTBYNAME) */ /* on Windows systems determine some system specific information (e.g. MAC address) */ #ifdef HAVE_WINDOWS_H OFCRC32 crc; /* get some processor specific information in addition to the MAC address */ SYSTEM_INFO systemInfo; GetSystemInfo(&systemInfo); /* get volume information of the system drive */ char systemDrive[MAX_PATH]; DWORD serialNumber = 0; if (GetSystemDirectory(systemDrive, sizeof(systemDrive)) >= 0) { /* check for proper pathname */ if ((strlen(systemDrive) >= 3) && (systemDrive[1] == ':') && (systemDrive[2] == '\\')) { /* truncate the pathname directly after the drive specification */ systemDrive[3] = 0; if (!GetVolumeInformation(systemDrive, NULL, 0, &serialNumber, NULL, NULL, NULL, 0)) serialNumber = 0; } } /* concatenate the host specific elements and compute a 32-bit checksum */ crc.addBlock(&result /*ip address*/, sizeof(result)); #ifndef __MINGW32__ /* on MinGW, getMacAddress() is not yet available. */ unsigned char buffer[6]; crc.addBlock(getMACAddress(buffer), sizeof(buffer)); #endif crc.addBlock(&serialNumber, sizeof(serialNumber)); crc.addBlock(&systemInfo.wProcessorLevel, sizeof(systemInfo.wProcessorLevel)); crc.addBlock(&systemInfo.wProcessorRevision, sizeof(systemInfo.wProcessorRevision)); crc.addBlock(&systemInfo.dwProcessorType, sizeof(systemInfo.dwProcessorType)); result = (long)crc.getCRC32(); #endif /* 'artificial' hostid: on Windows system a CRC32 checksum over some host specific information (e.g. MAC address), the 4 bytes TCP/IP address otherwise. */ return result; } #else // !(defined(HAVE_GETHOSTNAME) && defined(HAVE_GETHOSTBYNAME)) /* ** last chance workaround if there is no other way */ #ifdef HAVE_PROTOTYPE_GETHOSTID /* CW10 has a prototype but no implementation (gethostid() is already declared extern */ long gethostid(void) { return 0; } #else static long gethostid(void) { return 0; } #endif #endif // !(defined(HAVE_GETHOSTNAME) && defined(HAVE_GETHOSTBYNAME)) #endif // !HAVE_SYSINFO #else // HAVE_GETHOSTID #ifndef HAVE_PROTOTYPE_GETHOSTID extern "C" { long gethostid(void); } #endif // !HAVE_PROTOTYPE_GETHOSTID #endif // HAVE_GETHOSTID // ******************************** /* * Global variable storing the return value of gethostid(). * Since the variable is not declared in the header file it can only be used * within this source file. Any access to or modification of its value is * protected by a mutex (see dcmGenerateUniqueIdentifier()). */ static unsigned long hostIdentifier = 0; /* ** char* generateUniqueIdentifer(char* buf) ** Creates a Unique Identifer in buf and returns buf. ** buf must be at least 65 bytes. */ #ifdef WITH_THREADS static OFMutex uidCounterMutex; // mutex protecting access to counterOfCurrentUID and hostIdentifier #endif static unsigned int counterOfCurrentUID = 0; static const unsigned int maxUIDLen = 64; /* A UID may be 64 chars or less */ static void initCounterOfCurrentUID() { /* Code taken from oftime.cc */ #ifdef HAVE_WINDOWS_H /* Windows: no microseconds available, use milliseconds instead */ SYSTEMTIME timebuf; GetSystemTime(&timebuf); counterOfCurrentUID = timebuf.wMilliseconds; /* This is in the range 0 - 999 */ #else /* Unix */ struct timeval tv; if (gettimeofday(&tv, NULL) == 0) counterOfCurrentUID = tv.tv_usec; /* This is in the range 0 - 999999 */ #endif /* Do not ever use "0" for the counter */ counterOfCurrentUID++; } static char* stripTrailing(char* s, char c) { int i, n; if (s == NULL) return s; n = strlen(s); for (i = n - 1; (i >= 0) && (s[i] == c); i--) s[i] = '\0'; return s; } static void addUIDComponent(char* uid, const char* s) { /* copy into UID as much of the contents of s as possible */ if (OFStandard::strlcat(uid, s, maxUIDLen + 1) >= maxUIDLen + 1) // maxUIDLen+1 because strlcat() wants the size of the buffer, not the permitted number of characters. { DCMDATA_WARN("Truncated UID in dcmGenerateUniqueIdentifier(), SITE_UID_ROOT too long?"); } stripTrailing(uid, '.'); } inline static unsigned long forcePositive(long i) { return (i < 0) ? OFstatic_cast(unsigned long, -i) : OFstatic_cast(unsigned long, i); } char* dcmGenerateUniqueIdentifier(char* uid, const char* prefix) { char buf[128]; /* be very safe */ uid[0] = '\0'; /* initialise */ #ifdef WITH_THREADS uidCounterMutex.lock(); #endif if (hostIdentifier == 0) { /* On 64-bit Linux, the "32-bit identifier" returned by gethostid() is sign-extended to a 64-bit long, so we need to blank the upper 32 bits */ hostIdentifier = OFstatic_cast(unsigned long, gethostid() & 0xffffffff); } if (counterOfCurrentUID == 0) initCounterOfCurrentUID(); unsigned int counter = counterOfCurrentUID++; #ifdef WITH_THREADS uidCounterMutex.unlock(); #endif if (prefix != NULL ) { addUIDComponent(uid, prefix); } else { addUIDComponent(uid, SITE_INSTANCE_UID_ROOT); } sprintf(buf, ".%lu", hostIdentifier); addUIDComponent(uid, buf); sprintf(buf, ".%lu", forcePositive(OFStandard::getProcessID())); addUIDComponent(uid, buf); sprintf(buf, ".%lu", forcePositive(OFstatic_cast(long, time(NULL)))); addUIDComponent(uid, buf); sprintf(buf, ".%u", counter); addUIDComponent(uid, buf); return uid; } /* ** CVS/RCS Log: ** $Log: dcuid.cc,v $ ** Revision 1.89 2010-11-05 10:26:08 joergr ** Added new SOP Class UIDs from Supplement 131 and 134 (Implant Templates). ** ** Revision 1.88 2010-10-14 13:14:09 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.87 2010-10-04 14:44:42 joergr ** Replaced "#ifdef _REENTRANT" by "#ifdef WITH_THREADS" where appropriate (i.e. ** in all cases where OFMutex, OFReadWriteLock, etc. are used). ** ** Revision 1.86 2010-10-01 10:21:05 uli ** Fixed most compiler warnings from -Wall -Wextra -pedantic in dcmdata. ** ** Revision 1.85 2010-09-30 14:08:17 joergr ** Added two Model UIDs from Supplement 118 (Application Hosting). ** ** Revision 1.84 2010-09-30 07:53:23 joergr ** Fixed typo in the name of a Storage SOP Class (copied from DICOM part 6). ** ** Revision 1.83 2010-09-28 07:56:07 joergr ** Added VL Whole Slide Microscopy Image Storage SOP Class (Supplement 145). ** ** Revision 1.82 2010-09-27 14:05:01 joergr ** Updated list of SOP Class UIDs and well-known SOP Instance UIDs according to ** the current edition of the DICOM standard (including final text supplements). ** ** Revision 1.81 2010-09-24 13:24:37 joergr ** Compared names of SOP Class UIDs with 2009 edition of the DICOM standard. The ** resulting name changes are mainly caused by the fact that the corresponding ** SOP Class is now retired. ** ** Revision 1.80 2010-09-15 08:53:05 joergr ** Added definition of XML encoding transfer syntax (Supplement 114) and JPIP ** referenced transfer syntaxes (Supplement 106). ** ** Revision 1.79 2010-09-02 12:12:46 joergr ** Added support for "MPEG2 Main Profile @ High Level" transfer syntax. ** ** Revision 1.78 2010-08-10 12:31:15 uli ** Fixed some cases where dcmFindNameOfUID() returning NULL could cause crashes. ** ** Revision 1.77 2010-07-07 07:28:38 onken ** Added Ophthalmic Tomography Image Storage to list of supported SOP classes. ** ** Revision 1.76 2010-06-03 10:28:41 joergr ** Replaced calls to strerror() by new helper function OFStandard::strerror() ** which results in using the thread safe version of strerror() if available. ** ** Revision 1.75 2010-03-01 09:08:45 uli ** Removed some unnecessary include directives in the headers. ** ** Revision 1.74 2010-02-22 11:39:54 uli ** Remove some unneeded includes. ** ** Revision 1.73 2010-01-20 13:49:47 uli ** Added OFStandard::getProcessID(). ** ** Revision 1.72 2009-11-04 09:58:10 uli ** Switched to logging mechanism provided by the "new" oflog module ** ** Revision 1.71 2009-09-28 13:30:59 joergr ** Moved general purpose definition file from module dcmdata to ofstd, and ** added new defines in order to make the usage easier. ** ** Revision 1.70 2009-08-03 16:01:41 meichel ** In order to reduce the probability of generating duplicate UIDs when one ** process is spawned immediately after termination of another one, and both ** use the same process ID and generate UIDs within the same second of ** system time (which may happen if a command line tool is implemented that ** just generates and prints a single UID and then terminates, and that tool ** is called repeatedly from a shell script), initialize the counter ** component of the UID with a sub-second fraction from the system time ** (microseconds on Posix systems, milliseconds on Win32). ** ** Revision 1.69 2009-08-03 15:50:09 meichel ** Fixed possible buffer overflow in UID generation code when UID root too ** long. Now printing warning message to stderr when truncating a UID. ** ** Revision 1.68 2009-01-29 15:58:47 onken ** Fixed compilation under windows (missing memzero) by including dcdefine.h. ** ** Revision 1.67 2009-01-29 11:14:07 joergr ** Fixed issue with array initialization on x64 platform with Windows Vista and ** VisualStudio 2008. ** ** Revision 1.66 2007/07/11 08:49:54 meichel ** Changed the modality codes used for filename generation for the current and ** retired ultrasound multiframe SOP classes to USm and USf, respectively. ** ** Revision 1.65 2006/11/17 15:37:32 joergr ** Mask out the upper 32 bits gethostid()'s return value since on 64-bit Linux ** it is sign-extended to a 64-bit long. ** ** Revision 1.64 2006/10/27 11:42:24 joergr ** Added new default parameter to dcmSOPClassUIDToModality() that allows for ** the specification of the return value in case the SOP Class is unknown. ** ** Revision 1.63 2006/08/15 15:49:54 meichel ** Updated all code in module dcmdata to correctly compile when ** all standard C++ classes remain in namespace std. ** ** Revision 1.62 2005/12/08 15:41:42 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.61 2005/11/17 14:25:12 meichel ** Fixed warnings reported by VS2005 ** ** Revision 1.60 2005/11/16 18:36:10 joergr ** Added support for X-Ray Radiation Dose SR SOP class. ** Synchronized list of supported SOP classes in source code and documentation. ** ** Revision 1.59 2005/10/25 08:55:34 meichel ** Updated list of UIDs and added support for new transfer syntaxes ** and storage SOP classes. ** ** Revision 1.58 2005/02/17 13:10:41 joergr ** Renamed "MicroscopicImageStorage" to "VideoMicroscopicImageStorage". ** ** Revision 1.57 2004/11/10 12:37:56 meichel ** Updated directory of UIDs for 2004 DICOM edition. Removed all standalone and ** most retired storage SOP classes from list of storage SOP classes for ** storescu, storescp, imagectn etc. to keep list shorter than 64 entries. ** ** Revision 1.56 2004/08/03 11:41:09 meichel ** Headers libc.h and unistd.h are now included via ofstdinc.h ** ** Revision 1.55 2004/04/16 08:38:41 joergr ** Added missing comma separator to UIDNameMap. ** ** Revision 1.54 2004/04/06 18:08:04 joergr ** Updated data dictionary, UIDs and transfer syntaxes for the latest Final Text ** Supplements (42 and 47) and Correction Proposals (CP 25). ** Added missing suffix "TransferSyntax" to some transfer syntax constants. ** ** Revision 1.53 2004/03/16 13:49:49 joergr ** Updated comment. ** ** Revision 1.52 2004/03/16 13:43:08 joergr ** Renamed UID_BasicDirectoryStorageSOPClass to UID_MediaStorageDirectoryStorage. ** ** Revision 1.51 2004/02/13 14:11:54 joergr ** Fixed wrong spelling of "SpatialFiducialsStorage". ** ** Revision 1.50 2004/02/13 11:46:44 joergr ** Corrected order of UIDs, modified comments and other minor corrections. ** Changed filename prefix for some storage SOP classes (array "modalities"). ** Replaced non-Unix newline characters. ** ** Revision 1.49 2004/02/11 15:53:30 wilkens ** Updated attribute and UID specification (update before dcmtk 3.5.3 release). ** ** Revision 1.48 2004/02/04 16:47:04 joergr ** Adapted type casts to new-style typecast operators defined in ofcast.h. ** Removed acknowledgements with e-mail addresses from CVS log. ** ** Revision 1.47 2003/10/09 12:50:25 joergr ** Added support for SOP Class "Procedure Log" (Supplement 66). ** ** Revision 1.46 2003/07/03 14:25:30 meichel ** Added special handling for MinGW where getMacAddress() cannot ** be compiled because the header file is not (yet) available. ** ** Revision 1.45 2003/05/20 09:06:28 joergr ** Added support for SOP Class "Chest CAD SR" (Supplement 65). ** ** Revision 1.44 2003/03/21 13:08:04 meichel ** Minor code purifications for warnings reported by MSVC in Level 4 ** ** Revision 1.43 2002/12/09 13:14:07 joergr ** Renamed parameter/local variable to avoid name clashes with global ** declaration left and/or right (used for as iostream manipulators). ** ** Revision 1.42 2002/12/09 13:03:22 meichel ** Updated list of UIDs ** ** Revision 1.41 2002/11/27 12:06:53 meichel ** Adapted module dcmdata to use of new header file ofstdinc.h ** ** Revision 1.40 2002/08/27 16:55:14 meichel ** Restricted list of storage SOP classes to less than 64 to prevent ** presentation context overflow in various tools ** ** Revision 1.39 2002/06/19 15:35:46 meichel ** Updated list of SOP Class UIDs for Supplement 49 ** ** Revision 1.38 2002/05/16 12:37:31 meichel ** Fixed problem with new UID creation routines on Visual C++ 5 where ** some type names and constants in are defined differently ** than on Visual C++ 6. ** ** Revision 1.37 2002/04/16 13:43:22 joergr ** Added configurable support for C++ ANSI standard includes (e.g. streams). ** ** Revision 1.36 2002/01/08 11:16:58 joergr ** Enhanced algorithm to create unique identifiers (i.e. a unique suffix for ** DICOM UIDs) on Windows systems where gethostid() is not available. Fixed ** some minor inconsistencies regarding the creation of unique identifiers. ** ** Revision 1.35 2001/11/08 16:17:34 meichel ** Updated data dictionary, UIDs and transfer syntaxes for DICOM 2001 edition. ** ** Revision 1.34 2001/06/05 10:08:16 joergr ** Replaced some #ifdef _WIN32 statements by #ifdef HAVE_WINDOWS_H or #ifdef ** __CYGWIN__ respectively to reflect the fact that the latest Cygwin/gcc ** version does not define _WIN32 any more. ** ** Revision 1.33 2001/06/01 15:49:12 meichel ** Updated copyright header ** ** Revision 1.32 2001/05/25 09:50:24 meichel ** Updated data dictionary and UID list (again). ** ** Revision 1.31 2001/05/10 16:10:41 meichel ** Updated data dictionary and UID list ** ** Revision 1.30 2000/12/14 12:48:27 joergr ** Updated SOP Class and Transfer Syntax UIDs for 2000 edition of the DICOM ** standard. ** ** Revision 1.29 2000/12/12 12:32:43 joergr ** Replaced #ifdef HAVE_WINDOWS_H by _WIN32 to allow Cygwin 1.1.x to compile ** with Posix threads. ** ** Revision 1.28 2000/05/30 15:45:11 joergr ** Changed #ifdef statement to ensure correct compilation under Windows. ** ** Revision 1.27 2000/04/14 16:04:53 meichel ** Made function dcmGenerateUniqueIdentifer thread safe by protecting ** the counter with a Mutex and using gethostbyname_r instead of ** gethostbyname on Posix platforms. ** ** Revision 1.26 2000/03/08 16:26:43 meichel ** Updated copyright header. ** ** Revision 1.25 2000/03/03 14:05:37 meichel ** Implemented library support for redirecting error messages into memory ** instead of printing them to stdout/stderr for GUI applications. ** ** Revision 1.24 2000/02/23 15:12:04 meichel ** Corrected macro for Borland C++ Builder 4 workaround. ** ** Revision 1.23 2000/02/03 11:48:26 meichel ** Rebuilt data dictionary based on 1999 standard text, ** latest supplements and CP packet 6. ** ** Revision 1.22 2000/02/01 10:12:10 meichel ** Avoiding to include as extern "C" on Borland C++ Builder 4, ** workaround for bug in compiler header files. ** ** Revision 1.21 1999/07/14 12:02:36 meichel ** Updated data dictionary for supplement 29, 39, 33_lb, CP packet 4 and 5. ** Corrected dcmtk applications for changes in attribute name constants. ** ** Revision 1.20 1999/04/21 13:02:32 meichel ** Now always including instead of on Win32 platforms. ** This makes sure that is used if available. ** ** Revision 1.19 1999/03/31 09:25:43 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.18 1999/03/29 10:13:40 meichel ** Corrected list of image SOP classes ** ** Revision 1.17 1999/03/22 13:41:24 meichel ** Reworked UID list based on the 1998 DICOM edition and the latest ** supplement versions. ** ** Revision 1.16 1998/10/26 13:02:53 meichel ** Updated data dictionary and UIDs for Grayscale Softcopy Presentation State ** (Supplement 33 frozen draft). ** ** Revision 1.15 1998/02/25 14:29:02 hewett ** Updated data dictionary and UID information to reflect changes in ** Supplement 24 (Stored Print Related SOP Classes). Some data dictionary ** attibutes and UIDs have changed between the Letter Ballot version and ** the Final Text version. ** ** Revision 1.14 1998/02/06 09:41:56 hewett ** Corrected typo in UID table. ** ** Revision 1.13 1998/02/06 09:05:16 hewett ** Updated support for Supplements 15 (Visible Light), ** 16 (Postscript Print Management), 17 (Modality Performed Procedure Step), ** 22 (Presentation Look Up Table (LUT)), 23 (Structured Reporting), ** 24 (Stored Print), 30 (Waveform Interchange). ** ** Revision 1.12 1998/01/14 15:15:02 hewett ** Added basic support for the Structured Reporting (SR) SOP Classes. ** ** Revision 1.11 1997/10/13 11:34:49 hewett ** Fixed unimportant spelling error in comment (StopClass -> SOPClass). ** ** Revision 1.10 1997/09/22 14:56:56 hewett ** Added a global list of Image SOP Classes UIDs (dcmImageSOPClassUIDs) ** which is used by dcmgpdir to identify SOP Classes which can be ** referenced from a DICOMDIR IMAGE record. ** ** Revision 1.9 1997/05/13 13:54:27 hewett ** Added UIDs and data dictionary attributes for the draft supplements 12 (PET), ** 13 (Queue Management), 15 (Visible Light), 17 (Modality Performed Procedure ** Step), 22 (User Preference LUT) and 24 (Print Storage). Updated UID tables ** so that recompiled Storage SCP/SCU's will handle the new SOPs. ** ** Revision 1.8 1997/01/13 15:50:49 hewett ** Fixed bug when creating unique identifers. No check was made to ensure ** that negative numbers never appeared in a UID. Also added an ** implementation of a simple gethostid() function for systems which ** lack this function (e.g. Mac & Windows). The implementation requires ** TCP/IP to be available. ** ** Revision 1.7 1996/09/24 16:00:59 hewett ** Added SOP Class UIDs for Radiotherapy Objects. ** Added a separate table of Storage SOP Class UIDs (usefull during ** association negotiation). ** ** Revision 1.6 1996/04/19 12:46:21 hewett ** Added UID for RLE Lossless transfer syntax ** ** Revision 1.5 1996/03/22 12:42:22 andreas ** findUIDfromName does not dump anymore if name does not correspond to a uid ** ** Revision 1.4 1996/03/11 14:38:01 hewett ** Added new SOP Class UIDs. ** ** Revision 1.3 1996/01/29 13:38:30 andreas ** - new put method for every VR to put value as a string ** - better and unique print methods ** ** Revision 1.2 1996/01/23 17:29:25 andreas ** Support for old fashioned make without @^ ** Support for machines that have mktemp but do not define it. ** ** Revision 1.1 1995/11/23 17:02:56 hewett ** Updated for loadable data dictionary. Some cleanup (more to do). ** */ dcmtk-3.6.0/dcmdata/libsrc/dcchrstr.cc0000644000310500011400000000747511457616140017057 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Andreas Barth * * Purpose: Implementation of class DcmCharString * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-20 16:44:16 $ * CVS/RCS Revision: $Revision: 1.15 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ // // This implementation does not support 16 bit character sets. Since 8 bit // character sets are supported by the class DcmByteString the class // DcmCharString is derived from DcmByteString without any extensions. // No special implementation is necessary. // // If the extension for 16 bit character sets will be implemented this class // must be derived directly from DcmElement. This class is designed to support // the value representations (LO, LT, PN, SH, ST, UT). They are a problem because // their value width (1, 2, .. Bytes) is specified by the element // SpecificCharacterSet (0008, 0005) and an implementation must support // different value widths that cannot be derived from the value representation. // #include "dcmtk/dcmdata/dcchrstr.h" DcmCharString::DcmCharString(const DcmTag &tag, const Uint32 len) : DcmByteString(tag, len) { } DcmCharString::DcmCharString(const DcmCharString &old) : DcmByteString(old) { } DcmCharString::~DcmCharString(void) { } DcmCharString &DcmCharString::operator=(const DcmCharString &obj) { DcmByteString::operator=(obj); return *this; } OFCondition DcmCharString::copyFrom(const DcmObject& rhs) { if (this != &rhs) { if (rhs.ident() != ident()) return EC_IllegalCall; *this = OFstatic_cast(const DcmCharString &, rhs); } return EC_Normal; } OFBool DcmCharString::containsExtendedCharacters(const OFBool /*checkAllStrings*/) { char *c = NULL; if (getString(c).good() && c) { while (*c) { /* check for 8 bit characters */ if (OFstatic_cast(unsigned char, *c) > 127) return OFTrue; ++c; } } return OFFalse; } OFBool DcmCharString::isAffectedBySpecificCharacterSet() const { return OFTrue; } /* * CVS/RCS Log: * $Log: dcchrstr.cc,v $ * Revision 1.15 2010-10-20 16:44:16 joergr * Use type cast macros (e.g. OFstatic_cast) where appropriate. * * Revision 1.14 2010-10-14 13:14:06 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.13 2008-07-17 10:31:31 onken * Implemented copyFrom() method for complete DcmObject class hierarchy, which * permits setting an instance's value from an existing object. Implemented * assignment operator where necessary. * * Revision 1.12 2006-12-15 14:14:44 joergr * Added new method that checks whether a DICOM object or element is affected * by SpecificCharacterSet (0008,0005). * * Revision 1.11 2006/12/13 13:59:49 joergr * Added new optional parameter "checkAllStrings" to method containsExtended * Characters(). * * Revision 1.10 2006/05/11 08:47:05 joergr * Moved checkForNonASCIICharacters() from application to library. * * Revision 1.9 2005/12/08 15:40:57 meichel * Changed include path schema for all DCMTK header files * * Revision 1.8 2002/12/06 13:08:18 joergr * Made source code formatting more consistent with other modules/files. * * Revision 1.7 2001/06/01 15:48:59 meichel * Updated copyright header * * Revision 1.6 2000/03/08 16:26:30 meichel * Updated copyright header. * * Revision 1.5 1999/03/31 09:25:17 meichel * Updated copyright header in module dcmdata * * */ dcmtk-3.6.0/dcmdata/libsrc/dcbytstr.cc0000644000310500011400000007710611465743617017110 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Gerd Ehlers, Andreas Barth * * Purpose: Implementation of class DcmByteString * * Last Update: $Author: uli $ * Update Date: $Date: 2010-11-08 09:49:03 $ * CVS/RCS Revision: $Revision: 1.61 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #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/ofstd/ofstd.h" #include "dcmtk/dcmdata/dcbytstr.h" #include "dcmtk/dcmdata/dcvr.h" #define INCLUDE_CSTDLIB #define INCLUDE_CSTDIO #define INCLUDE_CSTRING #define INCLUDE_NEW #include "dcmtk/ofstd/ofstdinc.h" // ******************************** DcmByteString::DcmByteString(const DcmTag &tag, const Uint32 len) : DcmElement(tag, len), paddingChar(' '), maxLength(DCM_UndefinedLength), realLength(len), fStringMode(DCM_UnknownString), nonSignificantChars() { } DcmByteString::DcmByteString(const DcmByteString &old) : DcmElement(old), paddingChar(old.paddingChar), maxLength(old.maxLength), realLength(old.realLength), fStringMode(old.fStringMode), nonSignificantChars() { } DcmByteString::~DcmByteString() { } DcmByteString &DcmByteString::operator=(const DcmByteString &obj) { if (this != &obj) { DcmElement::operator=(obj); /* copy member variables */ realLength = obj.realLength; fStringMode = obj.fStringMode; paddingChar = obj.paddingChar; maxLength = obj.maxLength; } return *this; } OFCondition DcmByteString::copyFrom(const DcmObject& rhs) { if (this != &rhs) { if (rhs.ident() != ident()) return EC_IllegalCall; *this = OFstatic_cast(const DcmByteString &, rhs); } return EC_Normal; } // ******************************** DcmEVR DcmByteString::ident() const { /* valid type identifier is set by derived classes */ return EVR_UNKNOWN; } unsigned long DcmByteString::getVM() { char *s = NULL; /* get stored string value */ getString(s); unsigned long vm = 0; /* check for empty string */ if ((s == NULL) || (getLengthField() == 0)) vm = 0; else { /* count number of delimiters */ vm = 1; char c; while ((c = *s++) != 0) { if (c == '\\') vm++; } } return vm; } OFCondition DcmByteString::clear() { /* call inherited method */ errorFlag = DcmElement::clear(); /* set string representation to unknown */ fStringMode = DCM_UnknownString; return errorFlag; } Uint32 DcmByteString::getRealLength() { /* convert string to internal representation (if required) */ if (fStringMode != DCM_MachineString) { /* strips non-significant trailing spaces (padding) and determines 'realLength' */ makeMachineByteString(); } /* strig length of the internal representation */ return realLength; } Uint32 DcmByteString::getLength(const E_TransferSyntax /*xfer*/, const E_EncodingType /*enctype*/) { /* convert string to DICOM representation, i.e. add padding if required */ makeDicomByteString(); /* DICOM value length is always an even number */ return getLengthField(); } // ******************************** void DcmByteString::print(STD_NAMESPACE ostream& out, const size_t flags, const int level, const char * /*pixelFileName*/, size_t * /*pixelCounter*/) { if (valueLoaded()) { /* get string data */ char *stringVal = NULL; getString(stringVal); if (stringVal) { /* print line start with tag and VR */ printInfoLineStart(out, flags, level); out << '['; OFString outString; if (flags & DCMTypes::PF_convertToMarkup) OFStandard::convertToMarkupString(stringVal, outString, OFTrue, OFStandard::MM_XML, OFFalse); else outString = stringVal; unsigned long printedLength = outString.length() + 2 /* for enclosing brackets */; /* check whether full value text should be printed */ if ((flags & DCMTypes::PF_shortenLongTagValues) && (printedLength > DCM_OptPrintLineLength)) { /* truncate value text and append "..." */ outString.erase(DCM_OptPrintLineLength - 4); out << outString << "..."; printedLength = DCM_OptPrintLineLength; } else out << outString << ']'; /* print line end with length, VM and tag name */ printInfoLineEnd(out, flags, printedLength); } else printInfoLine(out, flags, level, "(no value available)" ); } else printInfoLine(out, flags, level, "(not loaded)" ); } // ******************************** OFCondition DcmByteString::write( DcmOutputStream &outStream, const E_TransferSyntax oxfer, const E_EncodingType enctype, DcmWriteCache *wcache) { if (getTransferState() == ERW_notInitialized) errorFlag = EC_IllegalCall; else { /* convert string value to DICOM representation and call inherited method */ if (getTransferState() == ERW_init) makeDicomByteString(); errorFlag = DcmElement::write(outStream, oxfer, enctype, wcache); } return errorFlag; } OFCondition DcmByteString::writeSignatureFormat( DcmOutputStream &outStream, const E_TransferSyntax oxfer, const E_EncodingType enctype, DcmWriteCache *wcache) { if (getTransferState() == ERW_notInitialized) errorFlag = EC_IllegalCall; else { /* convert string value to DICOM representation and call inherited method */ if (getTransferState() == ERW_init) makeDicomByteString(); errorFlag = DcmElement::writeSignatureFormat(outStream, oxfer, enctype, wcache); } return errorFlag; } // ******************************** OFCondition DcmByteString::getOFString(OFString &stringVal, const unsigned long pos, OFBool /*normalize*/) { errorFlag = EC_Normal; /* check given string position index */ if (pos >= getVM()) errorFlag = EC_IllegalParameter; else { /* get string data */ char *s = OFstatic_cast(char *, getValue()); /* extract specified string component */ errorFlag = getStringPart(stringVal, s, pos); } return errorFlag; } OFCondition DcmByteString::getStringValue(OFString &stringVal) { const char *s = OFstatic_cast(char *, getValue()); /* check whether string value is present */ if (s != NULL) stringVal = s; else { /* return empty string in case of empty value field */ stringVal = ""; } return errorFlag; } OFCondition DcmByteString::getString(char *&stringVal) { /* get string data */ stringVal = OFstatic_cast(char *, getValue()); /* convert to internal string representation (without padding) if required */ if ((stringVal != NULL) && (fStringMode != DCM_MachineString)) makeMachineByteString(); return errorFlag; } // ******************************** OFCondition DcmByteString::putString(const char *stringVal) { errorFlag = EC_Normal; /* check for an empty string parameter */ if ((stringVal != NULL) && (strlen(stringVal) > 0)) putValue(stringVal, strlen(stringVal)); else putValue(NULL, 0); /* make sure that extra padding is removed from the string */ fStringMode = DCM_UnknownString; makeMachineByteString(); return errorFlag; } OFCondition DcmByteString::putOFStringArray(const OFString &stringVal) { /* sets the value of a complete (possibly multi-valued) string attribute */ return putString(stringVal.c_str()); } // ******************************** OFCondition DcmByteString::makeDicomByteString() { /* get string data */ char *value = NULL; errorFlag = getString(value); if (value != NULL) { /* check for odd length */ if (realLength & 1) { /* if so add a padding character */ setLengthField(realLength + 1); value[realLength] = paddingChar; } else if (realLength < getLengthField()) setLengthField(realLength); /* terminate string (removes additional trailing padding characters) */ value[getLengthField()] = '\0'; } /* current string representation is now the DICOM one */ fStringMode = DCM_DicomString; return errorFlag; } OFCondition DcmByteString::makeMachineByteString() { errorFlag = EC_Normal; /* get string data */ char *value = OFstatic_cast(char *, getValue()); /* determine initial string length */ if (value != NULL) { realLength = strlen(value); /* remove all trailing spaces if automatic input data correction is enabled */ if (dcmEnableAutomaticInputDataCorrection.get()) { /* ** This code removes extra padding chars at the end of ** a ByteString. Trailing padding can cause problems ** when comparing strings. */ if (realLength > 0) { size_t i = 0; for(i = OFstatic_cast(size_t, realLength); (i > 0) && (value[i - 1] == paddingChar); i--) value[i - 1] = '\0'; realLength = OFstatic_cast(Uint32, i); } } } else realLength = 0; /* current string representation is now the internal one */ fStringMode = DCM_MachineString; return errorFlag; } // ******************************** Uint8 *DcmByteString::newValueField() { Uint8 *value = NULL; Uint32 lengthField = getLengthField(); /* check for odd length (in case of a protocol error) */ if (lengthField & 1) { if (lengthField == DCM_UndefinedLength) { /* Print an error message when private attribute states to have an odd length * equal to the maximum length, because we are not able then to make this value even (+1) * which would an overflow on some systems as well as being illegal in DICOM */ DCMDATA_WARN("DcmByteString: " << getTagName() << " " << getTag().getXTag() << " has odd, maximum length (" << DCM_UndefinedLength << ") and therefore is not loaded"); errorFlag = EC_CorruptedData; return NULL; } /* allocate space for extra padding character (required for the DICOM representation of the string) */ #ifdef HAVE_STD__NOTHROW // we want to use a non-throwing new here if available. // If the allocation fails, we report an EC_MemoryExhausted error // back to the caller. value = new (std::nothrow) Uint8[lengthField + 2]; #else value = new Uint8[lengthField + 2]; #endif /* terminate string after real length */ if (value != NULL) value[lengthField] = 0; /* enforce old (pre DCMTK 3.5.2) behaviour? */ if (!dcmAcceptOddAttributeLength.get()) { /* make length even */ lengthField++; setLengthField(lengthField); } } else { /* length is even */ #ifdef HAVE_STD__NOTHROW // we want to use a non-throwing new here if available. // If the allocation fails, we report an EC_MemoryExhausted error // back to the caller. value = new (std::nothrow) Uint8[lengthField + 1]; #else value = new Uint8[lengthField + 1]; #endif } /* make sure that the string is properly terminates by a 0 byte */ if (value != NULL) value[lengthField] = 0; else errorFlag = EC_MemoryExhausted; return value; } // ******************************** void DcmByteString::postLoadValue() { /* initially, after loading an attribute the string mode is unknown */ fStringMode = DCM_UnknownString; /* correct value length if automatic input data correction is enabled */ if (dcmEnableAutomaticInputDataCorrection.get()) { /* check for odd length */ if (getLengthField() & 1) { // newValueField always allocates an even number of bytes and sets // the pad byte to zero, so we can safely increase Length here. setLengthField(getLengthField() + 1); } } } // ******************************** OFCondition DcmByteString::verify(const OFBool autocorrect) { char *value = NULL; /* get string data */ errorFlag = getString(value); /* check for non-empty string */ if ((value != NULL) && (realLength != 0)) { /* create a temporary buffer for the string value */ char *tempstr = new char[realLength + 1]; unsigned long field = 0; unsigned long num = getVM(); unsigned long pos = 0; unsigned long temppos = 0; char c; /* check all string components */ while (field < num ) { unsigned long fieldlen = 0; /* check size limit for each string component */ while (((c = value[pos++]) != 0) && (c != '\\')) { if ((fieldlen < maxLength) && autocorrect) tempstr[temppos++] = c; fieldlen++; } if (fieldlen >= maxLength) errorFlag = EC_CorruptedData; /* 'c' is either '\\' or NULL */ if (autocorrect) tempstr[temppos++] = c; field++; if (pos > getLengthField()) break; } /* replace current string value if auto correction is enabled */ if (autocorrect) putString(tempstr); delete[] tempstr; } /* report a debug message if an error occurred */ if (errorFlag.bad()) { DCMDATA_DEBUG("DcmByteString::verify() Illegal values in Tag (" << STD_NAMESPACE hex << STD_NAMESPACE setfill('0') << STD_NAMESPACE setw(4) << getGTag() << "," << STD_NAMESPACE setw(4) << getETag() << ") VM=" << getVM()); } return errorFlag; } OFBool DcmByteString::containsExtendedCharacters(const OFBool checkAllStrings) { /* only check if parameter is true since derived VRs are not affected by the attribute SpecificCharacterSet (0008,0005) */ if (checkAllStrings) { char *c = NULL; if (getString(c).good() && c) { while (*c) { /* check for 8 bit characters */ if (OFstatic_cast(unsigned char, *c) > 127) return OFTrue; ++c; } } } return OFFalse; } OFBool DcmByteString::isAffectedBySpecificCharacterSet() const { return OFFalse; } // ******************************** OFBool DcmByteString::isEmpty(const OFBool normalize) { OFBool result = OFFalse; if (normalize && !nonSignificantChars.empty()) { OFString value; DcmByteString::getStringValue(value); /* check whether string value consists of non-significant characters only */ result = (value.find_first_not_of(nonSignificantChars) == OFString_npos); } else result = DcmObject::isEmpty(normalize); return result; } // ******************************** // global function to get a particular component of a DICOM string OFCondition getStringPart(OFString &result, const char *orgStr, const unsigned long pos) { OFCondition l_error = EC_Normal; /* check string parameter */ if (orgStr != NULL) { /* search for beginning of specified string component */ unsigned long i = 0; while ((i < pos) && (*orgStr != '\0')) { if (*orgStr++ == '\\') i++; } /* if found ... */ if (i == pos) { /* search for end of specified string component */ const char *t = orgStr; while ((*t != '\0') && (*t != '\\')) t++; /* check whether string component is non-empty */ if (t - orgStr > 0) result.assign(orgStr, t - orgStr); else result = ""; } else { /* specified component index not found in string */ l_error = EC_IllegalParameter; } } else l_error = EC_IllegalParameter; return l_error; } // global function for normalizing a DICOM string void normalizeString(OFString &string, const OFBool multiPart, const OFBool leading, const OFBool trailing) { /* check for non-empty string */ if (!string.empty()) { size_t partindex = 0; size_t offset = 0; size_t len = string.length(); while (partindex < len) { // remove leading spaces in every part of the string if (leading) { offset = 0; while ((partindex + offset < len) && (string[partindex + offset] == ' ')) offset++; if (offset > 0) string.erase(partindex, offset); } len = string.length(); // compute begin to the next separator index! if (multiPart) { partindex = string.find('\\', partindex); if (partindex == OFString_npos) partindex = len; } else partindex = len; // remove trailing spaces in every part of the string if (trailing && partindex) { offset = partindex - 1; while ((offset > 0) && (string[offset] == ' ')) offset--; if (offset != partindex - 1) { if (string[offset] == ' ') { string.erase(offset, partindex - offset); partindex = offset; } else { string.erase(offset+1, partindex - offset-1); partindex = offset+1; } } } len = string.length(); if (partindex != len) ++partindex; } } } // ******************************** OFCondition DcmByteString::checkStringValue(const OFString &value, const OFString &vm, const OFString &vr, const int vrID, const size_t maxLen) { OFCondition result = EC_Normal; const size_t valLen = value.length(); if (valLen > 0) { /* do we need to search for value components at all? */ if (vm.empty()) { /* check value length (if a maximum is specified) */ if ((maxLen > 0) && (value.length() > maxLen)) result = EC_MaximumLengthViolated; /* check value representation */ else if (DcmElement::scanValue(value, vr) != vrID) result = EC_ValueRepresentationViolated; } else { size_t posStart = 0; unsigned long vmNum = 0; /* iterate over all value components */ while (posStart != OFString_npos) { ++vmNum; /* search for next component separator */ const size_t posEnd = value.find('\\', posStart); const size_t length = (posEnd == OFString_npos) ? valLen - posStart : posEnd - posStart; /* check length of current value component */ if ((maxLen > 0) && (length > maxLen)) { result = EC_MaximumLengthViolated; break; } else { /* check value representation */ if (DcmElement::scanValue(value, vr, posStart, length) != vrID) { result = EC_ValueRepresentationViolated; break; } } posStart = (posEnd == OFString_npos) ? posEnd : posEnd + 1; } if (result.good()) { /* check value multiplicity */ result = DcmElement::checkVM(vmNum, vm); } } } return result; } /* ** CVS/RCS Log: ** $Log: dcbytstr.cc,v $ ** Revision 1.61 2010-11-08 09:49:03 uli ** Fixed even more gcc warnings caused by additional compiler flags. ** ** Revision 1.60 2010-10-20 16:44:16 joergr ** Use type cast macros (e.g. OFstatic_cast) where appropriate. ** ** Revision 1.59 2010-10-14 13:14:06 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.58 2010-04-23 14:33:28 joergr ** Renamed static helper function checkValue() to checkStringValue(). ** ** Revision 1.57 2009-12-04 17:13:30 joergr ** Slightly modified some log messages. ** ** Revision 1.56 2009-11-13 13:11:20 joergr ** Fixed minor issues in log output. ** ** Revision 1.55 2009-11-04 09:58:09 uli ** Switched to logging mechanism provided by the "new" oflog module ** ** Revision 1.54 2009-08-07 14:35:49 joergr ** Enhanced isEmpty() method by checking whether the data element value consists ** of non-significant characters only. ** ** Revision 1.53 2009-08-03 09:02:59 joergr ** Added methods that check whether a given string value conforms to the VR and ** VM definitions of the DICOM standards. ** ** Revision 1.52 2009-03-02 14:41:08 joergr ** Fixed bug that caused the print flag PF_convertToMarkup always being set. ** ** Revision 1.51 2009-01-29 15:34:45 onken ** Fixed length overflow in case of private attributes having maximum length ** values. Minor code simplifications. ** ** Revision 1.50 2008-07-17 10:31:31 onken ** Implemented copyFrom() method for complete DcmObject class hierarchy, which ** permits setting an instance's value from an existing object. Implemented ** assignment operator where necessary. ** ** Revision 1.49 2008-04-28 09:22:41 meichel ** New flag DCMTypes::PF_convertToMarkup causes DcmObject::print to ** quote non-ASCII string content as XML markup ** ** Revision 1.48 2007/11/29 14:30:20 meichel ** Write methods now handle large raw data elements (such as pixel data) ** without loading everything into memory. This allows very large images to ** be sent over a network connection, or to be copied without ever being ** fully in memory. ** ** Revision 1.47 2007/11/23 15:42:36 meichel ** Copy assignment operators in dcmdata now safe for self assignment ** ** Revision 1.46 2007/06/29 14:17:49 meichel ** Code clean-up: Most member variables in module dcmdata are now private, ** not protected anymore. ** ** Revision 1.45 2006/12/15 14:14:44 joergr ** Added new method that checks whether a DICOM object or element is affected ** by SpecificCharacterSet (0008,0005). ** ** Revision 1.44 2006/12/13 13:59:49 joergr ** Added new optional parameter "checkAllStrings" to method containsExtended ** Characters(). ** ** Revision 1.43 2006/11/08 17:00:04 meichel ** Added DcmByteString::containsExtendedCharacters ** ** Revision 1.42 2006/10/13 10:07:02 joergr ** Renamed variable "string" to "stringVal". ** ** Revision 1.41 2006/08/15 15:49:54 meichel ** Updated all code in module dcmdata to correctly compile when ** all standard C++ classes remain in namespace std. ** ** Revision 1.40 2005/12/08 15:40:56 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.39 2005/11/28 15:53:13 meichel ** Renamed macros in dcdebug.h ** ** Revision 1.38 2004/02/04 16:10:49 joergr ** Adapted type casts to new-style typecast operators defined in ofcast.h. ** Removed acknowledgements with e-mail addresses from CVS log. ** ** Revision 1.37 2003/12/11 13:40:46 meichel ** newValueField() now uses std::nothrow new if available ** ** Revision 1.36 2002/12/06 13:07:28 joergr ** Enhanced "print()" function by re-working the implementation and replacing ** the boolean "showFullData" parameter by a more general integer flag. ** Made source code formatting more consistent with other modules/files. ** ** Revision 1.35 2002/11/27 12:06:42 meichel ** Adapted module dcmdata to use of new header file ofstdinc.h ** ** Revision 1.34 2002/08/27 16:55:43 meichel ** Initial release of new DICOM I/O stream classes that add support for stream ** compression (deflated little endian explicit VR transfer syntax) ** ** Revision 1.33 2002/07/08 14:44:38 meichel ** Improved dcmdata behaviour when reading odd tag length. Depending on the ** global boolean flag dcmAcceptOddAttributeLength, the parser now either accepts ** odd length attributes or implements the old behaviour, i.e. assumes a real ** length larger by one. ** ** Revision 1.32 2002/04/25 10:13:47 joergr ** Removed getOFStringArray() implementation. ** ** Revision 1.31 2002/04/16 13:43:14 joergr ** Added configurable support for C++ ANSI standard includes (e.g. streams). ** ** Revision 1.30 2001/09/25 17:19:46 meichel ** Adapted dcmdata to class OFCondition ** ** Revision 1.29 2001/06/01 15:48:58 meichel ** Updated copyright header ** ** Revision 1.28 2000/11/07 16:56:17 meichel ** Initial release of dcmsign module for DICOM Digital Signatures ** ** Revision 1.27 2000/04/14 16:10:09 meichel ** Global flag dcmEnableAutomaticInputDataCorrection now derived from OFGlobal ** and, thus, safe for use in multi-thread applications. ** ** Revision 1.26 2000/03/08 16:26:29 meichel ** Updated copyright header. ** ** Revision 1.25 2000/02/23 15:11:46 meichel ** Corrected macro for Borland C++ Builder 4 workaround. ** ** Revision 1.24 2000/02/10 10:52:16 joergr ** Added new feature to dcmdump (enhanced print method of dcmdata): write ** pixel data/item value fields to raw files. ** ** Revision 1.23 2000/02/02 14:32:47 joergr ** Replaced 'delete' statements by 'delete[]' for objects created with 'new[]'. ** ** Revision 1.22 2000/02/01 10:12:04 meichel ** Avoiding to include as extern "C" on Borland C++ Builder 4, ** workaround for bug in compiler header files. ** ** Revision 1.21 1999/03/31 09:25:16 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.20 1998/11/12 16:48:13 meichel ** Implemented operator= for all classes derived from DcmObject. ** ** Revision 1.19 1998/07/15 15:51:46 joergr ** Removed several compiler warnings reported by gcc 2.8.1 with ** additional options, e.g. missing copy constructors and assignment ** operators, initialization of member variables in the body of a ** constructor instead of the member initialization list, hiding of ** methods by use of identical names, uninitialized member variables, ** missing const declaration of char pointers. Replaced tabs by spaces. ** ** Revision 1.18 1997/10/13 11:33:48 hewett ** Fixed bug in DcmByteString::getOFString due to inverse logic causing ** a string to be retrieved for all illegal values of pos while the errorFlag ** was set to EC_IllegalCall for all legal values of pos. ** ** Revision 1.17 1997/09/11 15:18:16 hewett ** Added a putOFStringArray method. ** ** Revision 1.16 1997/08/29 08:32:53 andreas ** - Added methods getOFString and getOFStringArray for all ** string VRs. These methods are able to normalise the value, i. e. ** to remove leading and trailing spaces. This will be done only if ** it is described in the standard that these spaces are not relevant. ** These methods do not test the strings for conformance, this means ** especially that they do not delete spaces where they are not allowed! ** getOFStringArray returns the string with all its parts separated by \ ** and getOFString returns only one value of the string. ** CAUTION: Currently getString returns a string with trailing ** spaces removed (if dcmEnableAutomaticInputDataCorrection == OFTrue) and ** truncates the original string (since it is not copied!). If you rely on this ** behaviour please change your application now. ** Future changes will ensure that getString returns the original ** string from the DICOM object (NULL terminated) inclusive padding. ** Currently, if you call getOF... before calling getString without ** normalisation, you can get the original string read from the DICOM object. ** ** Revision 1.15 1997/07/24 13:10:50 andreas ** - Removed Warnings from SUN CC 2.0.1 ** ** Revision 1.14 1997/07/21 07:56:39 andreas ** - Corrected error in length computation of DcmItem for strings in ** items. ** - Replace all boolean types (BOOLEAN, CTNBOOLEAN, DICOM_BOOL, BOOL) ** with one unique boolean type OFBool. ** ** Revision 1.13 1997/07/03 15:09:52 andreas ** - removed debugging functions Bdebug() and Edebug() since ** they write a static array and are not very useful at all. ** Cdebug and Vdebug are merged since they have the same semantics. ** The debugging functions in dcmdata changed their interfaces ** (see dcmdata/include/dcdebug.h) ** ** Revision 1.12 1997/05/16 08:31:27 andreas ** - Revised handling of GroupLength elements and support of ** DataSetTrailingPadding elements. The enumeratio E_GrpLenEncoding ** got additional enumeration values (for a description see dctypes.h). ** addGroupLength and removeGroupLength methods are replaced by ** computeGroupLengthAndPadding. To support Padding, the parameters of ** element and sequence write functions changed. ** ** Revision 1.11 1997/04/18 08:17:13 andreas ** - The put/get-methods for all VRs did not conform to the C++-Standard ** draft. Some Compilers (e.g. SUN-C++ Compiler, Metroworks ** CodeWarrier, etc.) create many warnings concerning the hiding of ** overloaded get methods in all derived classes of DcmElement. ** So the interface of all value representation classes in the ** library are changed rapidly, e.g. ** OFCondition get(Uint16 & value, const unsigned long pos); ** becomes ** OFCondition getUint16(Uint16 & value, const unsigned long pos); ** All (retired) "returntype get(...)" methods are deleted. ** For more information see dcmdata/include/dcelem.h ** ** Revision 1.10 1997/03/26 17:05:51 hewett ** Added global flag for disabling the automatic correction of small errors. ** Such behaviour is undesirable when performing data validation. ** ** Revision 1.9 1996/08/05 08:46:07 andreas ** new print routine with additional parameters: ** - print into files ** - fix output length for elements ** corrected error in search routine with parameter ESM_fromStackTop ** ** Revision 1.8 1996/05/31 09:09:08 hewett ** The stripping of trailing padding characters has been restored (without ** the 8bit char removal bug). Trailing padding characters are insignificant ** and if they are not removed problems arise with string comparisons since ** the dicom encoding rules require the addition of a padding character for ** odd length strings. ** ** Revision 1.7 1996/05/30 17:17:49 hewett ** Disabled erroneous code to strip trailing padding characters. ** ** Revision 1.6 1996/04/16 16:05:22 andreas ** - better support und bug fixes for NULL element value ** ** Revision 1.5 1996/03/11 13:17:23 hewett ** Removed get function for unsigned char* ** ** Revision 1.4 1996/01/09 11:06:42 andreas ** New Support for Visual C++ ** Correct problems with inconsistent const declarations ** Correct error in reading Item Delimitation Elements ** ** Revision 1.3 1996/01/05 13:27:32 andreas ** - changed to support new streaming facilities ** - unique read/write methods for file and block transfer ** - more cleanups ** */ dcmtk-3.6.0/dcmdata/libsrc/dcostrma.cc0000644000310500011400000000610111455601040017027 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Marco Eichelberg * * Purpose: base classes for output streams * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:14:08 $ * CVS/RCS Revision: $Revision: 1.5 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" #include "dcmtk/dcmdata/dcostrma.h" #include "dcmtk/dcmdata/dcostrmz.h" /* for DcmZLibOutputFilter */ #include "dcmtk/dcmdata/dcerror.h" /* for EC_IllegalCall */ DcmOutputStream::DcmOutputStream(DcmConsumer *initial) : current_(initial) , compressionFilter_(NULL) , tell_(0) { } DcmOutputStream::~DcmOutputStream() { // we cannot access the stream anymore at this point because the // consumer has most probably already been deleted. delete compressionFilter_; } OFCondition DcmOutputStream::installCompressionFilter(E_StreamCompression filterType) { OFCondition result = EC_Normal; if (compressionFilter_) result = EC_DoubleCompressionFilters; else { switch (filterType) { #ifdef WITH_ZLIB case ESC_zlib: compressionFilter_ = new DcmZLibOutputFilter(); if (compressionFilter_) { compressionFilter_->append(*current_); current_ = compressionFilter_; } else result = EC_MemoryExhausted; break; #endif case ESC_none: case ESC_unsupported: result = EC_UnsupportedEncoding; break; } } return result; } OFBool DcmOutputStream::good() const { return current_->good(); } OFCondition DcmOutputStream::status() const { return current_->status(); } OFBool DcmOutputStream::isFlushed() const { return current_->isFlushed(); } offile_off_t DcmOutputStream::avail() const { return current_->avail(); } offile_off_t DcmOutputStream::write(const void *buf, offile_off_t buflen) { offile_off_t result = current_->write(buf, buflen); tell_ += result; return result; } void DcmOutputStream::flush() { current_->flush(); } offile_off_t DcmOutputStream::tell() const { return tell_; } /* * CVS/RCS Log: * $Log: dcostrma.cc,v $ * Revision 1.5 2010-10-14 13:14:08 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.4 2009-11-04 09:58:10 uli * Switched to logging mechanism provided by the "new" oflog module * * Revision 1.3 2007-02-19 16:06:10 meichel * Class DcmOutputStream and related classes are now safe for use with * large files (2 GBytes or more) if supported by compiler and operating system. * * Revision 1.2 2005/12/08 15:41:20 meichel * Changed include path schema for all DCMTK header files * * Revision 1.1 2002/08/27 16:55:52 meichel * Initial release of new DICOM I/O stream classes that add support for stream * compression (deflated little endian explicit VR transfer syntax) * * */ dcmtk-3.6.0/dcmdata/libsrc/dctagkey.cc0000644000310500011400000000746611455601041017026 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Andrew Hewett * * Purpose: Basis class for dicom tags. * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:14:09 $ * CVS/RCS Revision: $Revision: 1.16 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dctagkey.h" #define INCLUDE_CSTDIO #define INCLUDE_CSTRING #include "dcmtk/ofstd/ofstdinc.h" /* * DcmTagKey member functions */ OFString DcmTagKey::toString() const { char tagBuf[16]; if (group == 0xffff && element == 0xffff) { strcpy(tagBuf, "(\?\?\?\?,\?\?\?\?)"); // prevent trigraph expansion in string constant } else { sprintf(tagBuf, "(%04x,%04x)", OFstatic_cast(unsigned, group), OFstatic_cast(unsigned, element)); } return tagBuf; } OFBool DcmTagKey::isSignableTag() const { //no group length tags (element number of 0000) if (element == 0) return OFFalse; // no Length to End Tag if ((group == 0x0008)&&(element==0x0001)) return OFFalse; //no tags with group number less than 0008 if (group < 8) return OFFalse; //no tags from group FFFA (digital signatures sequence) if (group == 0xfffa) return OFFalse; // no MAC Parameters sequence if ((group == 0x4ffe)&&(element==0x0001)) return OFFalse; //no Data Set trailing Padding if ((group == 0xfffc)&&(element==0xfffc)) return OFFalse; //no Sequence or Item Delimitation Tag if ((group == 0xfffe)&&((element==0xe00d)||(element==0xe0dd))) return OFFalse; return OFTrue; } /* ** DcmTagKey friend functions */ STD_NAMESPACE ostream& operator<<(STD_NAMESPACE ostream& s, const DcmTagKey& k) { s << k.toString(); return s; } /* ** CVS/RCS Log: ** $Log: dctagkey.cc,v $ ** Revision 1.16 2010-10-14 13:14:09 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.15 2010-06-25 09:15:19 uli ** Fixed issues with compiling with HAVE_STD_STRING. ** ** Revision 1.14 2009-11-04 09:58:10 uli ** Switched to logging mechanism provided by the "new" oflog module ** ** Revision 1.13 2006-08-15 15:49:54 meichel ** Updated all code in module dcmdata to correctly compile when ** all standard C++ classes remain in namespace std. ** ** Revision 1.12 2005/12/08 15:41:40 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.11 2004/02/04 16:46:20 joergr ** Adapted type casts to new-style typecast operators defined in ofcast.h. ** ** Revision 1.10 2002/11/27 12:06:53 meichel ** Adapted module dcmdata to use of new header file ofstdinc.h ** ** Revision 1.9 2001/11/19 15:23:29 meichel ** Cleaned up signature code to avoid some gcc warnings. ** ** Revision 1.8 2001/11/02 13:18:52 meichel ** Removed character sequences that could be interpreted as ISO C++ trigraphs ** ** Revision 1.7 2001/06/01 15:49:11 meichel ** Updated copyright header ** ** Revision 1.6 2000/11/07 16:56:23 meichel ** Initial release of dcmsign module for DICOM Digital Signatures ** ** Revision 1.5 2000/03/08 16:26:43 meichel ** Updated copyright header. ** ** Revision 1.4 2000/02/07 14:45:17 meichel ** Removed const qualifier from DcmTagKey::toString(), avoids warning on Irix. ** ** Revision 1.3 1999/03/31 09:25:42 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.2 1999/03/17 11:08:58 meichel ** added method DcmTagKey::toString() ** ** Revision 1.1 1995/11/23 17:02:55 hewett ** Updated for loadable data dictionary. Some cleanup (more to do). ** */ dcmtk-3.6.0/dcmdata/libsrc/dclist.cc0000644000310500011400000002172411455601040016505 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Gerd Ehlers * * Purpose: generic list class * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:14:08 $ * CVS/RCS Revision: $Revision: 1.18 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/ofstd/ofstream.h" #include "dcmtk/dcmdata/dclist.h" // ***************************************** // *** DcmListNode ************************* // ***************************************** DcmListNode::DcmListNode( DcmObject *obj ) : nextNode(NULL), prevNode(NULL), objNodeValue(obj) { } // ******************************** DcmListNode::~DcmListNode() { } // ***************************************** // *** DcmList ***************************** // ***************************************** DcmList::DcmList() : firstNode(NULL), lastNode(NULL), currentNode(NULL), cardinality(0) { } // ******************************** DcmList::~DcmList() { if ( !DcmList::empty() ) // list is not empty ! { lastNode->nextNode = NULL; // set to 0 for safety reasons do { DcmListNode *temp = firstNode; firstNode = firstNode->nextNode; // delete temp->objNodeValue;; // dangerous! delete temp; } while ( firstNode != NULL ); currentNode = firstNode = lastNode = NULL; } } // ******************************** DcmObject *DcmList::append( DcmObject *obj ) { if ( obj != NULL ) { if ( DcmList::empty() ) // list is empty ! currentNode = firstNode = lastNode = new DcmListNode(obj); else { DcmListNode *node = new DcmListNode(obj); lastNode->nextNode = node; node->prevNode = lastNode; currentNode = lastNode = node; } cardinality++; } // obj == NULL return obj; } // ******************************** DcmObject *DcmList::prepend( DcmObject *obj ) { if ( obj != NULL ) { if ( DcmList::empty() ) // list is empty ! currentNode = firstNode = lastNode = new DcmListNode(obj); else { DcmListNode *node = new DcmListNode(obj); node->nextNode = firstNode; firstNode->prevNode = node; currentNode = firstNode = node; } cardinality++; } // obj == NULL return obj; } // ******************************** DcmObject *DcmList::insert( DcmObject *obj, E_ListPos pos ) { if ( obj != NULL ) { if ( DcmList::empty() ) // list is empty ! { currentNode = firstNode = lastNode = new DcmListNode(obj); cardinality++; } else { if ( pos==ELP_last ) DcmList::append( obj ); // cardinality++; else if ( pos==ELP_first ) DcmList::prepend( obj ); // cardinality++; else if ( !DcmList::valid() ) // set current node to the end if there is no predecessor or // there are successors to be determined DcmList::append( obj ); // cardinality++; else if ( pos == ELP_prev ) // insert before current node { DcmListNode *node = new DcmListNode(obj); if ( currentNode->prevNode == NULL ) firstNode = node; // insert at the beginning else currentNode->prevNode->nextNode = node; node->prevNode = currentNode->prevNode; node->nextNode = currentNode; currentNode->prevNode = node; currentNode = node; cardinality++; } else //( pos==ELP_next || pos==ELP_atpos ) // insert after current node { DcmListNode *node = new DcmListNode(obj); if ( currentNode->nextNode == NULL ) lastNode = node; // append to the end else currentNode->nextNode->prevNode = node; node->nextNode = currentNode->nextNode; node->prevNode = currentNode; currentNode->nextNode = node; currentNode = node; cardinality++; } } } // obj == NULL return obj; } // ******************************** DcmObject *DcmList::remove() { DcmObject *tempobj; DcmListNode *tempnode; if ( DcmList::empty() ) // list is empty ! return NULL; else if ( !DcmList::valid() ) return NULL; // current node is 0 else { tempnode = currentNode; if ( currentNode->prevNode == NULL ) firstNode = currentNode->nextNode; // delete first element else currentNode->prevNode->nextNode = currentNode->nextNode; if ( currentNode->nextNode == NULL ) lastNode = currentNode->prevNode; // delete last element else currentNode->nextNode->prevNode = currentNode->prevNode; currentNode = currentNode->nextNode; tempobj = tempnode->value(); delete tempnode; cardinality--; return tempobj; } } // ******************************** DcmObject *DcmList::get( E_ListPos pos ) { return seek( pos ); } // ******************************** DcmObject *DcmList::seek( E_ListPos pos ) { switch (pos) { case ELP_first : currentNode = firstNode; break; case ELP_last : currentNode = lastNode; break; case ELP_prev : if ( DcmList::valid() ) currentNode = currentNode->prevNode; break; case ELP_next : if ( DcmList::valid() ) currentNode = currentNode->nextNode; break; default: break; } return DcmList::valid() ? currentNode->value() : NULL; } // ******************************** DcmObject *DcmList::seek_to(unsigned long absolute_position) { const unsigned long tmppos = absolute_position < cardinality ? absolute_position : cardinality; seek( ELP_first ); for (unsigned long i = 0; i < tmppos; i++) seek( ELP_next ); return get( ELP_atpos ); } // ******************************** void DcmList::deleteAllElements() { unsigned long numElements = cardinality; DcmListNode* tmpNode = NULL; DcmObject* tmpObject = NULL; // delete all elements for (unsigned long i = 0; i < numElements; i++) { // always select first node so no search is necessary tmpNode = firstNode; // clear value of node tmpObject = tmpNode->value(); if (tmpObject != NULL) { // delete load of selected list node delete tmpObject; tmpObject = NULL; } firstNode = tmpNode->nextNode; // delete the list node itself delete tmpNode; } // reset all attributes for later use firstNode = NULL; lastNode = NULL; currentNode = NULL; cardinality = 0; } /* * CVS/RCS Log: * $Log: dclist.cc,v $ * Revision 1.18 2010-10-14 13:14:08 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.17 2010-03-25 16:24:59 joergr * Removed redundant variable declaration in order to avoid a warning message * reported by gcc 4.1.2. * * Revision 1.16 2010-03-24 11:52:46 onken * Introduced new function to delete all elements (including memory de-allocation) * from DcmList. * * Revision 1.15 2009-11-04 09:58:10 uli * Switched to logging mechanism provided by the "new" oflog module * * Revision 1.14 2005-12-08 15:41:17 meichel * Changed include path schema for all DCMTK header files * * Revision 1.13 2004/01/16 13:50:22 joergr * Removed acknowledgements with e-mail addresses from CVS log. * * Revision 1.12 2003/08/08 12:55:12 joergr * Made DcmListNode::value() inline. Translated German comments. * Renamed member variable "actualNode" to "currentNode". * Removed needless type casts (e.g. on the NULL constant). * * Revision 1.11 2002/04/16 13:43:18 joergr * Added configurable support for C++ ANSI standard includes (e.g. streams). * * Revision 1.10 2001/06/01 15:49:06 meichel * Updated copyright header * * Revision 1.9 2000/03/08 16:26:37 meichel * Updated copyright header. * * Revision 1.8 1999/03/31 09:25:32 meichel * Updated copyright header in module dcmdata * * */ dcmtk-3.6.0/dcmdata/libsrc/dcdict.cc0000644000310500011400000007603311457516457016503 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Andrew Hewett * * Purpose: loadable DICOM data dictionary * * Last Update: $Author: uli $ * Update Date: $Date: 2010-10-20 07:41:35 $ * CVS/RCS Revision: $Revision: 1.49 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/ofstd/ofstd.h" #include "dcmtk/dcmdata/dcdict.h" #include "dcmtk/ofstd/ofdefine.h" #include "dcmtk/dcmdata/dcdicent.h" #include "dcmtk/dcmdata/dctypes.h" #define INCLUDE_CSTDLIB #define INCLUDE_CSTDIO #define INCLUDE_CSTRING #define INCLUDE_CCTYPE #include "dcmtk/ofstd/ofstdinc.h" /* ** The separator character between fields in the data dictionary file(s) */ #define DCM_DICT_FIELD_SEPARATOR_CHAR '\t' /* ** Comment character for the data dictionary file(s) */ #define DCM_DICT_COMMENT_CHAR '#' /* ** THE Global DICOM Data Dictionary */ #ifdef DONT_LOAD_EXTERNAL_DICTIONARIES // if defined at compilation time, only the builtin dictionary is loaded GlobalDcmDataDictionary dcmDataDict(OFTrue /*loadBuiltin*/, OFFalse /*loadExternal*/); #else // this is the default case, i.e. both the builtin and the external dictionaries are loaded GlobalDcmDataDictionary dcmDataDict(OFTrue /*loadBuiltin*/, OFTrue /*loadExternal*/); #endif /* ** Member Functions */ static DcmDictEntry* makeSkelEntry(Uint16 group, Uint16 element, Uint16 upperGroup, Uint16 upperElement, DcmEVR evr, const char* tagName, int vmMin, int vmMax, const char* standardVersion, DcmDictRangeRestriction groupRestriction, DcmDictRangeRestriction elementRestriction, const char* privCreator) { DcmDictEntry* e = NULL; e = new DcmDictEntry(group, element, upperGroup, upperElement, evr, tagName, vmMin, vmMax, standardVersion, OFFalse, privCreator); if (e != NULL) { e->setGroupRangeRestriction(groupRestriction); e->setElementRangeRestriction(elementRestriction); } return e; } OFBool DcmDataDictionary::loadSkeletonDictionary() { /* ** We need to know about Group Lengths to compute them */ DcmDictEntry* e = NULL; e = makeSkelEntry(0x0000, 0x0000, 0xffff, 0x0000, EVR_UL, "GenericGroupLength", 1, 1, "GENERIC", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL); addEntry(e); /* ** We need to know about Items and Delimitation Items to parse ** (and construct) sequences. */ e = makeSkelEntry(0xfffe, 0xe000, 0xfffe, 0xe000, EVR_na, "Item", 1, 1, "DICOM3", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL); addEntry(e); e = makeSkelEntry(0xfffe, 0xe00d, 0xfffe, 0xe00d, EVR_na, "ItemDelimitationItem", 1, 1, "DICOM3", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL); addEntry(e); e = makeSkelEntry(0xfffe, 0xe0dd, 0xfffe, 0xe0dd, EVR_na, "SequenceDelimitationItem", 1, 1, "DICOM3", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL); addEntry(e); skeletonCount = numberOfEntries(); return OFTrue; } DcmDataDictionary::DcmDataDictionary(OFBool loadBuiltin, OFBool loadExternal) : hashDict(), repDict(), skeletonCount(0), dictionaryLoaded(OFFalse) { reloadDictionaries(loadBuiltin, loadExternal); } DcmDataDictionary::~DcmDataDictionary() { clear(); } void DcmDataDictionary::clear() { hashDict.clear(); repDict.clear(); skeletonCount = 0; dictionaryLoaded = OFFalse; } static void stripWhitespace(char* s) { if (s) { register unsigned char c; register unsigned char *t; register unsigned char *p; t=p=OFreinterpret_cast(unsigned char *, s); while ((c = *t++)) if (!isspace(c)) *p++ = c; *p = '\0'; } } static char* stripTrailingWhitespace(char* s) { int i, n; if (s == NULL) return s; n = strlen(s); for (i = n - 1; i >= 0 && isspace(OFstatic_cast(unsigned char, s[i])); i--) s[i] = '\0'; return s; } static void stripLeadingWhitespace(char* s) { if (s) { register unsigned char c; register unsigned char *t; register unsigned char *p; t=p=OFreinterpret_cast(unsigned char *, s); while (isspace(*t)) t++; while ((c = *t++)) *p++ = c; *p = '\0'; } } static OFBool parseVMField(char* vmField, int& vmMin, int& vmMax) { OFBool ok = OFTrue; char c = 0; int dummy = 0; /* strip any whitespace */ stripWhitespace(vmField); if (sscanf(vmField, "%d-%d%c", &vmMin, &dummy, &c) == 3) { /* treat "2-2n" like "2-n" for the moment */ if ((c == 'n') || (c == 'N')) { vmMax = DcmVariableVM; } else { ok = OFFalse; } } else if (sscanf(vmField, "%d-%d", &vmMin, &vmMax) == 2) { /* range VM (e.g. "2-6") */ } else if (sscanf(vmField, "%d-%c", &vmMin, &c) == 2) { if ((c == 'n') || (c == 'N')) { vmMax = DcmVariableVM; } else { ok = OFFalse; } } else if (sscanf(vmField, "%d%c", &vmMin, &c) == 2) { /* treat "2n" like "2-n" for the moment */ if ((c == 'n') || (c == 'N')) { vmMax = DcmVariableVM; } else { ok = OFFalse; } } else if (sscanf(vmField, "%d", &vmMin) == 1) { /* fixed VM */ vmMax = vmMin; } else if (sscanf(vmField, "%c", &c) == 1) { /* treat "n" like "1-n" */ if ((c == 'n') || (c == 'N')) { vmMin = 1; vmMax = DcmVariableVM; } else { ok = OFFalse; } } else { ok = OFFalse; } return ok; } static int splitFields(const char* line, char* fields[], int maxFields, char splitChar) { const char *p; int foundFields = 0; int len; do { #ifdef __BORLANDC__ // Borland Builder expects a non-const argument p = strchr(OFconst_cast(char *, line), splitChar); #else p = strchr(line, splitChar); #endif if (p == NULL) { len = strlen(line); } else { len = p - line; } fields[foundFields] = OFstatic_cast(char *, malloc(len + 1)); strncpy(fields[foundFields], line, len); fields[foundFields][len] = '\0'; foundFields++; line = p + 1; } while ((foundFields < maxFields) && (p != NULL)); return foundFields; } static OFBool parseTagPart(char *s, unsigned int& l, unsigned int& h, DcmDictRangeRestriction& r) { OFBool ok = OFTrue; char restrictor = ' '; r = DcmDictRange_Unspecified; /* by default */ if (sscanf(s, "%x-%c-%x", &l, &restrictor, &h) == 3) { switch (restrictor) { case 'o': case 'O': r = DcmDictRange_Odd; break; case 'e': case 'E': r = DcmDictRange_Even; break; case 'u': case 'U': r = DcmDictRange_Unspecified; break; default: DCMDATA_ERROR("DcmDataDictionary: Unknown range restrictor: " << restrictor); ok = OFFalse; break; } } else if (sscanf(s, "%x-%x", &l, &h) == 2) { r = DcmDictRange_Even; /* by default */ } else if (sscanf(s, "%x", &l) == 1) { h = l; } else { ok = OFFalse; } return ok; } static OFBool parseWholeTagField(char* s, DcmTagKey& key, DcmTagKey& upperKey, DcmDictRangeRestriction& groupRestriction, DcmDictRangeRestriction& elementRestriction, char *&privCreator) { unsigned int gl, gh, el, eh; groupRestriction = DcmDictRange_Unspecified; elementRestriction = DcmDictRange_Unspecified; stripLeadingWhitespace(s); stripTrailingWhitespace(s); char gs[64]; char es[64]; char pc[64]; int slen = strlen(s); if (s[0] != '(') return OFFalse; if (s[slen - 1] != ')') return OFFalse; if (strchr(s, ',') == NULL) return OFFalse; /* separate the group and element parts */ int i = 1; /* after the '(' */ int gi = 0; for (; s[i] != ',' && s[i] != '\0'; i++) { gs[gi] = s[i]; gi++; } gs[gi] = '\0'; if (s[i] == '\0') return OFFalse; /* element part missing */ i++; /* after the ',' */ stripLeadingWhitespace(s + i); int pi = 0; if (s[i] == '\"') /* private creator */ { i++; // skip opening quotation mark for (; s[i] != '\"' && s[i] != '\0'; i++) pc[pi++] = s[i]; pc[pi] = '\0'; if (s[i] == '\0') return OFFalse; /* closing quotation mark missing */ i++; stripLeadingWhitespace(s + i); if (s[i] != ',') return OFFalse; /* element part missing */ i++; /* after the ',' */ } int ei = 0; for (; s[i] != ')' && s[i] != '\0'; i++) { es[ei] = s[i]; ei++; } es[ei] = '\0'; /* parse the tag parts into their components */ stripWhitespace(gs); if (parseTagPart(gs, gl, gh, groupRestriction) == OFFalse) return OFFalse; stripWhitespace(es); if (parseTagPart(es, el, eh, elementRestriction) == OFFalse) return OFFalse; if (pi > 0) { // copy private creator name privCreator = new char[strlen(pc) + 1]; // deleted by caller if (privCreator) strcpy(privCreator,pc); } key.set(OFstatic_cast(unsigned short, gl), OFstatic_cast(unsigned short, el)); upperKey.set(OFstatic_cast(unsigned short, gh), OFstatic_cast(unsigned short, eh)); return OFTrue; } static OFBool onlyWhitespace(const char* s) { int len = strlen(s); int charsFound = OFFalse; for (int i = 0; (!charsFound) && (i < len); i++) { charsFound = !isspace(OFstatic_cast(unsigned char, s[i])); } return (!charsFound)? (OFTrue) : (OFFalse); } static char* getLine(char* line, int maxLineLen, FILE* f) { char* s; s = fgets(line, maxLineLen, f); /* strip any trailing white space */ stripTrailingWhitespace(line); return s; } static OFBool isaCommentLine(const char* s) { OFBool isComment = OFFalse; /* assumption */ int len = strlen(s); int i = 0; for (i = 0; i < len && isspace(OFstatic_cast(unsigned char, s[i])); i++) /*loop*/; isComment = (s[i] == DCM_DICT_COMMENT_CHAR); return isComment; } OFBool DcmDataDictionary::reloadDictionaries(OFBool loadBuiltin, OFBool loadExternal) { OFBool result = OFTrue; clear(); loadSkeletonDictionary(); if (loadBuiltin) { loadBuiltinDictionary(); dictionaryLoaded = (numberOfEntries() > skeletonCount); if (!dictionaryLoaded) result = OFFalse; } if (loadExternal) { if (loadExternalDictionaries()) dictionaryLoaded = OFTrue; else result = OFFalse; } return result; } OFBool DcmDataDictionary::loadDictionary(const char* fileName, OFBool errorIfAbsent) { char lineBuf[DCM_MAXDICTLINESIZE + 1]; FILE* f = NULL; int lineNumber = 0; char* lineFields[DCM_MAXDICTFIELDS + 1]; int fieldsPresent; DcmDictEntry* e; int errorsEncountered = 0; OFBool errorOnThisLine = OFFalse; int i; DcmTagKey key, upperKey; DcmDictRangeRestriction groupRestriction = DcmDictRange_Unspecified; DcmDictRangeRestriction elementRestriction = DcmDictRange_Unspecified; DcmVR vr; char* vrName; char* tagName; char* privCreator; int vmMin, vmMax = 1; const char* standardVersion; /* first, check whether 'fileName' really points to a file (and not to a directory or the like) */ if (!OFStandard::fileExists(fileName) || (f = fopen(fileName, "r")) == NULL) { if (errorIfAbsent) { DCMDATA_ERROR("DcmDataDictionary: Cannot open file: " << fileName); } return OFFalse; } #ifdef DEBUG DCMDATA_INFO("DcmDataDictionary: Loading file: " << fileName); #endif while (getLine(lineBuf, DCM_MAXDICTLINESIZE, f)) { lineNumber++; if (onlyWhitespace(lineBuf)) { continue; /* ignore this line */ } if (isaCommentLine(lineBuf)) { continue; /* ignore this line */ } errorOnThisLine = OFFalse; /* fields are tab separated */ fieldsPresent = splitFields(lineBuf, lineFields, DCM_MAXDICTFIELDS, DCM_DICT_FIELD_SEPARATOR_CHAR); /* initialize dict entry fields */ vrName = NULL; tagName = NULL; privCreator = NULL; vmMin = vmMax = 1; standardVersion = "DICOM"; switch (fieldsPresent) { case 0: case 1: case 2: DCMDATA_ERROR("DcmDataDictionary: "<< fileName << ": " << "too few fields (line " << lineNumber << ")"); errorOnThisLine = OFTrue; break; default: DCMDATA_ERROR("DcmDataDictionary: " << fileName << ": " << "too many fields (line " << lineNumber << "): "); errorOnThisLine = OFTrue; break; case 5: stripWhitespace(lineFields[4]); standardVersion = lineFields[4]; /* drop through to next case label */ case 4: /* the VM field is present */ if (!parseVMField(lineFields[3], vmMin, vmMax)) { DCMDATA_ERROR("DcmDataDictionary: " << fileName << ": " << "bad VM field (line " << lineNumber << "): " << lineFields[3]); errorOnThisLine = OFTrue; } /* drop through to next case label */ case 3: if (!parseWholeTagField(lineFields[0], key, upperKey, groupRestriction, elementRestriction, privCreator)) { DCMDATA_ERROR("DcmDataDictionary: " << fileName << ": " << "bad Tag field (line " << lineNumber << "): " << lineFields[0]); errorOnThisLine = OFTrue; } else { /* all is OK */ vrName = lineFields[1]; stripWhitespace(vrName); tagName = lineFields[2]; stripWhitespace(tagName); } } if (!errorOnThisLine) { /* check the VR Field */ vr.setVR(vrName); if (vr.getEVR() == EVR_UNKNOWN) { DCMDATA_ERROR("DcmDataDictionary: " << fileName << ": " << "bad VR field (line " << lineNumber << "): " << vrName); errorOnThisLine = OFTrue; } } if (!errorOnThisLine) { e = new DcmDictEntry( key.getGroup(), key.getElement(), upperKey.getGroup(), upperKey.getElement(), vr, tagName, vmMin, vmMax, standardVersion, OFTrue, privCreator); e->setGroupRangeRestriction(groupRestriction); e->setElementRangeRestriction(elementRestriction); addEntry(e); } for (i = 0; i < fieldsPresent; i++) { free(lineFields[i]); lineFields[i] = NULL; } delete[] privCreator; if (errorOnThisLine) { errorsEncountered++; } } fclose(f); /* return OFFalse in case of errors and set internal state accordingly */ if (errorsEncountered == 0) { dictionaryLoaded = OFTrue; return OFTrue; } else { dictionaryLoaded = OFFalse; return OFFalse; } } #ifndef HAVE_GETENV static char* getenv() { return NULL; } #endif /* !HAVE_GETENV */ OFBool DcmDataDictionary::loadExternalDictionaries() { const char* env = NULL; int len; int sepCnt = 0; OFBool msgIfDictAbsent = OFTrue; OFBool loadFailed = OFFalse; env = getenv(DCM_DICT_ENVIRONMENT_VARIABLE); if ((env == NULL) || (strlen(env) == 0)) { env = DCM_DICT_DEFAULT_PATH; msgIfDictAbsent = OFFalse; } if ((env != NULL) && (strlen(env) != 0)) { len = strlen(env); for (int i = 0; i < len; i++) { if (env[i] == ENVIRONMENT_PATH_SEPARATOR) { sepCnt++; } } if (sepCnt == 0) { if (!loadDictionary(env, msgIfDictAbsent)) { return OFFalse; } } else { char** dictArray; dictArray = OFstatic_cast(char **, malloc((sepCnt + 1) * sizeof(char*))); int ndicts = splitFields(env, dictArray, sepCnt + 1, ENVIRONMENT_PATH_SEPARATOR); for (int ii = 0; ii < ndicts; ii++) { if ((dictArray[ii] != NULL) && (strlen(dictArray[ii]) > 0)) { if (!loadDictionary(dictArray[ii], msgIfDictAbsent)) { loadFailed = OFTrue; } } free(dictArray[ii]); } free(dictArray); } } return (loadFailed) ? (OFFalse) : (OFTrue); } void DcmDataDictionary::addEntry(DcmDictEntry* e) { if (e->isRepeating()) { /* * Find the best position in repeating tag list * Existing entries are replaced if the ranges and repetition * constraints are the same. * If a range represents a subset of an existing range then it * will be placed before it in the list. This ensures that a * search will find the subset rather than the superset. * Otherwise entries are appended to the end of the list. */ OFBool inserted = OFFalse; DcmDictEntryListIterator iter(repDict.begin()); DcmDictEntryListIterator last(repDict.end()); for (; !inserted && iter != last; ++iter) { if (e->setEQ(**iter)) { /* replace the old entry with the new */ DcmDictEntry *old = *iter; *iter = e; #ifdef PRINT_REPLACED_DICTIONARY_ENTRIES DCMDATA_WARN("replacing " << *old); #endif delete old; inserted = OFTrue; } else if (e->subset(**iter)) { /* e is a subset of the current list position, insert before */ repDict.insert(iter, e); inserted = OFTrue; } } if (!inserted) { /* insert at end */ repDict.push_back(e); inserted = OFTrue; } } else { hashDict.put(e); } } void DcmDataDictionary::deleteEntry(const DcmDictEntry& entry) { DcmDictEntry* e = NULL; e = OFconst_cast(DcmDictEntry *, findEntry(entry)); if (e != NULL) { if (e->isRepeating()) { repDict.remove(e); delete e; } else { hashDict.del(entry.getKey(), entry.getPrivateCreator()); } } } const DcmDictEntry* DcmDataDictionary::findEntry(const DcmDictEntry& entry) const { const DcmDictEntry* e = NULL; if (entry.isRepeating()) { OFBool found = OFFalse; DcmDictEntryListConstIterator iter(repDict.begin()); DcmDictEntryListConstIterator last(repDict.end()); for (; !found && iter != last; ++iter) { if (entry.setEQ(**iter)) { found = OFTrue; e = *iter; } } } else { e = hashDict.get(entry, entry.getPrivateCreator()); } return e; } const DcmDictEntry* DcmDataDictionary::findEntry(const DcmTagKey& key, const char *privCreator) const { /* search first in the normal tags dictionary and if not found * then search in the repeating tags list. */ const DcmDictEntry* e = NULL; e = hashDict.get(key, privCreator); if (e == NULL) { /* search in the repeating tags dictionary */ OFBool found = OFFalse; DcmDictEntryListConstIterator iter(repDict.begin()); DcmDictEntryListConstIterator last(repDict.end()); for (; !found && iter != last; ++iter) { if ((*iter)->contains(key, privCreator)) { found = OFTrue; e = *iter; } } } return e; } const DcmDictEntry* DcmDataDictionary::findEntry(const char *name) const { const DcmDictEntry* e = NULL; const DcmDictEntry* ePrivate = NULL; /* search first in the normal tags dictionary and if not found * then search in the repeating tags list. */ DcmHashDictIterator iter; for (iter = hashDict.begin(); (e == NULL) && (iter != hashDict.end()); ++iter) { if ((*iter)->contains(name)) { e = *iter; if (e->getGroup() % 2) { /* tag is a private tag - continue search to be sure to find non-private keys first */ if (!ePrivate) ePrivate = e; e = NULL; } } } if (e == NULL) { /* search in the repeating tags dictionary */ OFBool found = OFFalse; DcmDictEntryListConstIterator iter2(repDict.begin()); DcmDictEntryListConstIterator last(repDict.end()); for (; !found && iter2 != last; ++iter2) { if ((*iter2)->contains(name)) { found = OFTrue; e = *iter2; } } } if (e == NULL && ePrivate != NULL) { /* no standard key found - use the first private key found */ e = ePrivate; } return e; } /* ================================================================== */ GlobalDcmDataDictionary::GlobalDcmDataDictionary(OFBool loadBuiltin, OFBool loadExternal) : dataDict(loadBuiltin, loadExternal) #ifdef WITH_THREADS , dataDictLock() #endif { } GlobalDcmDataDictionary::~GlobalDcmDataDictionary() { } const DcmDataDictionary& GlobalDcmDataDictionary::rdlock() { #ifdef WITH_THREADS dataDictLock.rdlock(); #endif return dataDict; } DcmDataDictionary& GlobalDcmDataDictionary::wrlock() { #ifdef WITH_THREADS dataDictLock.wrlock(); #endif return dataDict; } void GlobalDcmDataDictionary::unlock() { #ifdef WITH_THREADS dataDictLock.unlock(); #endif } OFBool GlobalDcmDataDictionary::isDictionaryLoaded() { OFBool result = rdlock().isDictionaryLoaded(); unlock(); return result; } void GlobalDcmDataDictionary::clear() { wrlock().clear(); unlock(); } /* ** CVS/RCS Log: ** $Log: dcdict.cc,v $ ** Revision 1.49 2010-10-20 07:41:35 uli ** Made sure isalpha() & friends are only called with valid arguments. ** ** Revision 1.48 2010-10-14 13:14:07 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.47 2010-10-04 14:44:42 joergr ** Replaced "#ifdef _REENTRANT" by "#ifdef WITH_THREADS" where appropriate (i.e. ** in all cases where OFMutex, OFReadWriteLock, etc. are used). ** ** Revision 1.46 2010-07-06 16:19:37 onken ** Fixed status flag in dictionary denoting that a dictionary is loaded which ** was not set if a single dictionary was loaded explicitly with ** loadDictionary(). In that case isDictionaryLoaded() returned OFFalse where ** OFTrue would be correct. Thanks to forum user "Chichon" for the bug report. ** ** Revision 1.45 2010-07-02 08:26:17 joergr ** Introduced new macro "DONT_LOAD_EXTERNAL_DICTIONARIES" that allows for ** loading the builtin dictionary only (at application start), i.e. ignore the ** environment variable DCMDICTPATH and the default dictionary files. ** ** Revision 1.44 2010-03-01 09:08:45 uli ** Removed some unnecessary include directives in the headers. ** ** Revision 1.43 2010-02-22 11:39:54 uli ** Remove some unneeded includes. ** ** Revision 1.42 2009-11-10 12:38:29 uli ** Fix compilation on windows. ** ** Revision 1.41 2009-11-04 09:58:09 uli ** Switched to logging mechanism provided by the "new" oflog module ** ** Revision 1.40 2009-09-28 13:31:29 joergr ** Moved general purpose definition file from module dcmdata to ofstd, and ** added new defines in order to make the usage easier. ** ** Revision 1.39 2009-02-05 13:15:17 joergr ** Added reload method to data dictionary class. ** Added re-initialization of missing member variables in clear() method. ** Output name of loaded data dictionary files in debug mode. ** ** Revision 1.38 2008-02-08 16:28:51 meichel ** Removed "GenericGroupLengthToEnd" from the built-in skeleton dictionary. ** ** Revision 1.37 2006/08/15 15:49:54 meichel ** Updated all code in module dcmdata to correctly compile when ** all standard C++ classes remain in namespace std. ** ** Revision 1.36 2005/12/08 15:41:04 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.35 2005/11/28 16:13:57 meichel ** Minor adaptations needed for Borland Builder 6 ** ** Revision 1.34 2005/11/17 13:33:11 meichel ** When locating DICOM tags by name in DcmDataDictionary::findEntry, ** public tags are now preferred over private tags of the same name. ** ** Revision 1.33 2004/08/03 16:45:58 meichel ** Minor changes for platforms on which strchr/strrchr return a const pointer. ** ** Revision 1.32 2004/02/04 16:27:12 joergr ** Adapted type casts to new-style typecast operators defined in ofcast.h. ** Removed acknowledgements with e-mail addresses from CVS log. ** ** Revision 1.31 2003/10/15 16:55:43 meichel ** Updated error messages for parse errors ** ** Revision 1.30 2003/07/03 15:38:14 meichel ** Introduced DcmDictEntryListConstIterator, needed for compiling with HAVE_STL. ** ** Revision 1.29 2003/03/21 13:08:04 meichel ** Minor code purifications for warnings reported by MSVC in Level 4 ** ** Revision 1.28 2002/11/27 12:06:44 meichel ** Adapted module dcmdata to use of new header file ofstdinc.h ** ** Revision 1.27 2002/07/23 14:21:30 meichel ** Added support for private tag data dictionaries to dcmdata ** ** Revision 1.26 2002/06/12 16:57:52 joergr ** Added test to "load data dictionary" routine checking whether given filename ** really points to a file and not to a directory or the like. ** ** Revision 1.25 2002/02/27 14:21:35 meichel ** Declare dcmdata read/write locks only when compiled in multi-thread mode ** ** Revision 1.24 2001/06/01 15:49:01 meichel ** Updated copyright header ** ** Revision 1.23 2000/05/03 14:19:09 meichel ** Added new class GlobalDcmDataDictionary which implements read/write lock ** semantics for safe access to the DICOM dictionary from multiple threads ** in parallel. The global dcmDataDict now uses this class. ** ** Revision 1.22 2000/04/14 15:55:03 meichel ** Dcmdata library code now consistently uses ofConsole for error output. ** ** Revision 1.21 2000/03/08 16:26:32 meichel ** Updated copyright header. ** ** Revision 1.20 2000/03/03 14:05:31 meichel ** Implemented library support for redirecting error messages into memory ** instead of printing them to stdout/stderr for GUI applications. ** ** Revision 1.19 2000/02/23 15:11:49 meichel ** Corrected macro for Borland C++ Builder 4 workaround. ** ** Revision 1.18 2000/02/01 10:12:05 meichel ** Avoiding to include as extern "C" on Borland C++ Builder 4, ** workaround for bug in compiler header files. ** ** Revision 1.17 1999/03/31 09:25:22 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.16 1998/07/28 15:52:37 meichel ** Introduced new compilation flag PRINT_REPLACED_DICTIONARY_ENTRIES ** which causes the dictionary to display all duplicate entries. ** ** Revision 1.15 1998/07/15 15:51:51 joergr ** Removed several compiler warnings reported by gcc 2.8.1 with ** additional options, e.g. missing copy constructors and assignment ** operators, initialization of member variables in the body of a ** constructor instead of the member initialization list, hiding of ** methods by use of identical names, uninitialized member variables, ** missing const declaration of char pointers. Replaced tabs by spaces. ** ** Revision 1.14 1998/02/06 15:07:23 meichel ** Removed many minor problems (name clashes, unreached code) ** reported by Sun CC4 with "+w" or Sun CC2. ** ** Revision 1.13 1998/01/27 10:51:40 meichel ** Removed some unused variables, meaningless const modifiers ** and unreached statements. ** ** Revision 1.12 1997/08/26 14:03:17 hewett ** New data structures for data-dictionary. The main part of the ** data-dictionary is now stored in an hash table using an optimized ** hash function. This new data structure reduces data-dictionary ** load times by a factor of 4! he data-dictionary specific linked-list ** has been replaced by a linked list derived from OFList class ** (see ofstd/include/oflist.h). ** The only interface modifications are related to iterating over the entire ** data dictionary which should not be needed by "normal" applications. ** ** Revision 1.11 1997/07/31 15:55:11 meichel ** New routine stripWhitespace() in dcdict.cc, much faster. ** ** Revision 1.10 1997/07/21 08:25:25 andreas ** - Replace all boolean types (BOOLEAN, CTNBOOLEAN, DICOM_BOOL, BOOL) ** with one unique boolean type OFBool. ** ** Revision 1.9 1997/05/22 13:16:04 hewett ** Added method DcmDataDictionary::isDictionaryLoaded() to ask if a full ** data dictionary has been loaded. This method should be used in tests ** rather that querying the number of entries (a sekelton dictionary is ** now always present). ** ** Revision 1.8 1997/05/13 13:49:37 hewett ** Modified the data dictionary parse code so that it can handle VM ** descriptions of the form "2-2n" (as used in some supplements). ** Currently, a VM of "2-2n" will be represented internally as "2-n". ** Also added preload of a few essential attribute descriptions into ** the data dictionary (e.g. Item and ItemDelimitation tags). ** ** Revision 1.7 1996/09/18 16:37:26 hewett ** Added capability to search data dictionary by tag name. ** ** Revision 1.6 1996/04/18 09:51:00 hewett ** White space is now being stripped from data dictionary fields. Previously ** a tag name could retain trailing whitespace which caused silly results ** when generating dcdeftag.h (e.g. tag names wil trailing underscores). ** ** Revision 1.5 1996/03/20 16:44:04 hewett ** Updated for revised data dictionary. Repeating tags are now handled better. ** A linear list of repeating tags has been introduced with a subset ordering ** mechanism to ensure that dictionary searches locate the most precise ** dictionary entry. ** ** Revision 1.4 1996/03/12 15:21:22 hewett ** The repeating sub-dictionary has been split into a repeatingElement and ** a repeatingGroups dictionary. This is a temporary measure to reduce the ** problem of overlapping dictionary entries. A full solution will require ** more radical changes to the data dictionary insertion and search ** mechanims. ** ** Revision 1.3 1996/01/09 11:06:44 andreas ** New Support for Visual C++ ** Correct problems with inconsistent const declarations ** Correct error in reading Item Delimitation Elements ** ** Revision 1.2 1996/01/05 13:27:34 andreas ** - changed to support new streaming facilities ** - unique read/write methods for file and block transfer ** - more cleanups ** ** Revision 1.1 1995/11/23 17:02:39 hewett ** Updated for loadable data dictionary. Some cleanup (more to do). ** */ dcmtk-3.6.0/dcmdata/libsrc/dcistrmf.cc0000644000310500011400000001704411465743617017060 0ustar joergrdicom3/* * * Copyright (C) 2002-2010, 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: dcmdata * * Author: Marco Eichelberg * * Purpose: DcmInputFileStream and related classes, * implements streamed input from files. * * Last Update: $Author: uli $ * Update Date: $Date: 2010-11-08 09:49:03 $ * CVS/RCS Revision: $Revision: 1.10 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" #include "dcmtk/dcmdata/dcistrmf.h" #include "dcmtk/dcmdata/dcerror.h" #define INCLUDE_CSTDIO #define INCLUDE_CERRNO #include "dcmtk/ofstd/ofstdinc.h" DcmFileProducer::DcmFileProducer(const char *filename, offile_off_t offset) : DcmProducer() , file_() , status_(EC_Normal) , size_(0) { if (file_.fopen(filename, "rb")) { // Get number of bytes in file file_.fseek(0L, SEEK_END); size_ = file_.ftell(); if (0 != file_.fseek(offset, SEEK_SET)) { OFString s("(unknown error code)"); file_.getLastErrorString(s); status_ = makeOFCondition(OFM_dcmdata, 18, OF_error, s.c_str()); } } else { OFString s("(unknown error code)"); file_.getLastErrorString(s); status_ = makeOFCondition(OFM_dcmdata, 18, OF_error, s.c_str()); } } DcmFileProducer::~DcmFileProducer() { } OFBool DcmFileProducer::good() const { return status_.good(); } OFCondition DcmFileProducer::status() const { return status_; } OFBool DcmFileProducer::eos() { if (file_.open()) { return (file_.eof() || (size_ == file_.ftell())); } else return OFTrue; } offile_off_t DcmFileProducer::avail() { if (file_.open()) return size_ - file_.ftell(); else return 0; } offile_off_t DcmFileProducer::read(void *buf, offile_off_t buflen) { offile_off_t result = 0; if (status_.good() && file_.open() && buf && buflen) { result = file_.fread(buf, 1, OFstatic_cast(size_t, buflen)); } return result; } offile_off_t DcmFileProducer::skip(offile_off_t skiplen) { offile_off_t result = 0; if (status_.good() && file_.open() && skiplen) { offile_off_t pos = file_.ftell(); result = (size_ - pos < skiplen) ? (size_ - pos) : skiplen; if (file_.fseek(result, SEEK_CUR)) { OFString s("(unknown error code)"); file_.getLastErrorString(s); status_ = makeOFCondition(OFM_dcmdata, 18, OF_error, s.c_str()); } } return result; } void DcmFileProducer::putback(offile_off_t num) { if (status_.good() && file_.open() && num) { offile_off_t pos = file_.ftell(); if (num <= pos) { if (file_.fseek(-num, SEEK_CUR)) { OFString s("(unknown error code)"); file_.getLastErrorString(s); status_ = makeOFCondition(OFM_dcmdata, 18, OF_error, s.c_str()); } } else status_ = EC_PutbackFailed; // tried to putback before start of file } } /* ======================================================================= */ DcmInputFileStreamFactory::DcmInputFileStreamFactory(const char *filename, offile_off_t offset) : DcmInputStreamFactory() , filename_() , offset_(offset) { if (filename) filename_ = filename; } DcmInputFileStreamFactory::DcmInputFileStreamFactory(const DcmInputFileStreamFactory& arg) : DcmInputStreamFactory(arg) , filename_(arg.filename_) , offset_(arg.offset_) { } DcmInputFileStreamFactory::~DcmInputFileStreamFactory() { } DcmInputStream *DcmInputFileStreamFactory::create() const { return new DcmInputFileStream(filename_.c_str(), offset_); } /* ======================================================================= */ DcmInputFileStream::DcmInputFileStream(const char *filename, offile_off_t offset) : DcmInputStream(&producer_) // safe because DcmInputStream only stores pointer , producer_(filename, offset) , filename_() { if (filename) filename_ = filename; } DcmInputFileStream::~DcmInputFileStream() { } DcmInputStreamFactory *DcmInputFileStream::newFactory() const { DcmInputStreamFactory *result = NULL; if (currentProducer() == &producer_) { // no filter installed, can create factory object result = new DcmInputFileStreamFactory(filename_.c_str(), tell()); } return result; } /* ======================================================================= */ DcmInputStream *DcmTempFileHandler::create() const { return new DcmInputFileStream(filename_.c_str(), 0); } DcmTempFileHandler::DcmTempFileHandler(const char *fname) #ifdef WITH_THREADS : refCount_(1), mutex_(), filename_(fname) #else : refCount_(1), filename_(fname) #endif { } DcmTempFileHandler::~DcmTempFileHandler() { unlink(filename_.c_str()); } DcmTempFileHandler *DcmTempFileHandler::newInstance(const char *fname) { return new DcmTempFileHandler(fname); } void DcmTempFileHandler::increaseRefCount() { #ifdef WITH_THREADS mutex_.lock(); #endif ++refCount_; #ifdef WITH_THREADS mutex_.unlock(); #endif } void DcmTempFileHandler::decreaseRefCount() { #ifdef WITH_THREADS mutex_.lock(); #endif size_t result = --refCount_; #ifdef WITH_THREADS mutex_.unlock(); #endif if (result == 0) delete this; } /* ======================================================================= */ DcmInputTempFileStreamFactory::DcmInputTempFileStreamFactory(DcmTempFileHandler *handler) : DcmInputStreamFactory() , fileHandler_(handler) { fileHandler_->increaseRefCount(); } DcmInputTempFileStreamFactory::DcmInputTempFileStreamFactory(const DcmInputTempFileStreamFactory &arg) : DcmInputStreamFactory(arg) , fileHandler_(arg.fileHandler_) { fileHandler_->increaseRefCount(); } DcmInputTempFileStreamFactory::~DcmInputTempFileStreamFactory() { fileHandler_->decreaseRefCount(); } DcmInputStream *DcmInputTempFileStreamFactory::create() const { return fileHandler_->create(); } DcmInputStreamFactory *DcmInputTempFileStreamFactory::clone() const { return new DcmInputTempFileStreamFactory(*this); } /* * CVS/RCS Log: * $Log: dcistrmf.cc,v $ * Revision 1.10 2010-11-08 09:49:03 uli * Fixed even more gcc warnings caused by additional compiler flags. * * Revision 1.9 2010-10-14 13:14:08 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.8 2010-10-04 14:44:42 joergr * Replaced "#ifdef _REENTRANT" by "#ifdef WITH_THREADS" where appropriate (i.e. * in all cases where OFMutex, OFReadWriteLock, etc. are used). * * Revision 1.7 2008-05-29 10:39:41 meichel * Implemented new classes DcmTempFileHandler and DcmInputTempFileStreamFactory * that perform thread-safe reference counted life cycle management of a * temporary file and are needed for DcmElement temporary file extensions to come. * * Revision 1.6 2007/02/19 15:45:31 meichel * Class DcmInputStream and related classes are now safe for use with * large files (2 GBytes or more) if supported by compiler and operating system. * * Revision 1.5 2005/12/08 15:41:14 meichel * Changed include path schema for all DCMTK header files * * Revision 1.4 2004/02/04 16:34:09 joergr * Adapted type casts to new-style typecast operators defined in ofcast.h. * * Revision 1.3 2002/11/27 12:06:48 meichel * Adapted module dcmdata to use of new header file ofstdinc.h * * Revision 1.2 2002/09/19 08:32:29 joergr * Added explicit type casts to keep Sun CC 2.0.1 quiet. * * Revision 1.1 2002/08/27 16:55:49 meichel * Initial release of new DICOM I/O stream classes that add support for stream * compression (deflated little endian explicit VR transfer syntax) * * */ dcmtk-3.6.0/dcmdata/libsrc/dcfilefo.cc0000644000310500011400000013000711503634153016776 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Gerd Ehlers, Andreas Barth * * Purpose: class DcmFileFormat * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-12-20 11:05:15 $ * CVS/RCS Revision: $Revision: 1.64 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #define INCLUDE_CSTDLIB #define INCLUDE_CSTDIO #define INCLUDE_CSTRING #define INCLUDE_CTIME #define INCLUDE_UNISTD #include "dcmtk/ofstd/ofstdinc.h" #include "dcmtk/ofstd/ofstream.h" #include "dcmtk/dcmdata/dcfilefo.h" #include "dcmtk/dcmdata/dcitem.h" #include "dcmtk/dcmdata/dcxfer.h" #include "dcmtk/dcmdata/dcvrobow.h" #include "dcmtk/dcmdata/dcvrui.h" #include "dcmtk/dcmdata/dcvrul.h" #include "dcmtk/dcmdata/dcvrus.h" #include "dcmtk/dcmdata/dcvrae.h" #include "dcmtk/dcmdata/dcvrsh.h" #include "dcmtk/dcmdata/dcmetinf.h" #include "dcmtk/dcmdata/dcdeftag.h" #include "dcmtk/dcmdata/dcuid.h" #include "dcmtk/dcmdata/dcostrma.h" /* for class DcmOutputStream */ #include "dcmtk/dcmdata/dcostrmf.h" /* for class DcmOutputFileStream */ #include "dcmtk/dcmdata/dcistrma.h" /* for class DcmInputStream */ #include "dcmtk/dcmdata/dcistrmf.h" /* for class DcmInputFileStream */ #include "dcmtk/dcmdata/dcwcache.h" /* for class DcmWriteCache */ // ******************************** DcmFileFormat::DcmFileFormat() : DcmSequenceOfItems(InternalUseTag), FileReadMode(ERM_autoDetect) { DcmMetaInfo *MetaInfo = new DcmMetaInfo(); DcmSequenceOfItems::itemList->insert(MetaInfo); DcmDataset *Dataset = new DcmDataset(); DcmSequenceOfItems::itemList->insert(Dataset); } DcmFileFormat::DcmFileFormat(DcmDataset *dataset) : DcmSequenceOfItems(InternalUseTag), FileReadMode(ERM_autoDetect) { DcmMetaInfo *MetaInfo = new DcmMetaInfo(); DcmSequenceOfItems::itemList->insert(MetaInfo); DcmDataset *newDataset; if (dataset == NULL) newDataset = new DcmDataset(); else newDataset = new DcmDataset(*dataset); DcmSequenceOfItems::itemList->insert(newDataset); } DcmFileFormat::DcmFileFormat(const DcmFileFormat &old) : DcmSequenceOfItems(old), FileReadMode(old.FileReadMode) { } OFCondition DcmFileFormat::copyFrom(const DcmObject& rhs) { if (this != &rhs) { if (rhs.ident() != ident()) return EC_IllegalCall; *this = OFstatic_cast(const DcmFileFormat &, rhs); } return EC_Normal; } DcmFileFormat::~DcmFileFormat() { } DcmFileFormat &DcmFileFormat::operator=(const DcmFileFormat &obj) { if (this != &obj) { DcmSequenceOfItems::operator=(obj); FileReadMode = obj.FileReadMode; } return *this; } // ******************************** DcmEVR DcmFileFormat::ident() const { return EVR_fileFormat; } // ******************************** void DcmFileFormat::print(STD_NAMESPACE ostream &out, const size_t flags, const int level, const char *pixelFileName, size_t *pixelCounter) { out << OFendl; if (flags & DCMTypes::PF_useANSIEscapeCodes) out << ANSI_ESCAPE_CODE_COMMENT; printNestingLevel(out, flags, level); out << "# Dicom-File-Format" << OFendl; if (flags & DCMTypes::PF_useANSIEscapeCodes) out << ANSI_ESCAPE_CODE_RESET; if (!itemList->empty()) { DcmObject *dO; itemList->seek(ELP_first); do { dO = itemList->get(); dO->print(out, flags, level, pixelFileName, pixelCounter); } while (itemList->seek(ELP_next)); } else { if (flags & DCMTypes::PF_useANSIEscapeCodes) out << ANSI_ESCAPE_CODE_COMMENT; printNestingLevel(out, flags, level); out << "# Dicom-File-Format has been erased" << OFendl; if (flags & DCMTypes::PF_useANSIEscapeCodes) out << ANSI_ESCAPE_CODE_RESET; } } // ******************************** OFCondition DcmFileFormat::writeXML(STD_NAMESPACE ostream &out, const size_t flags) { OFCondition result = EC_CorruptedData; /* XML start tag for "file-format" */ out << "" << OFendl; if (!itemList->empty()) { /* write content of all children */ DcmObject *dO; itemList->seek(ELP_first); do { dO = itemList->get(); dO->writeXML(out, flags & ~DCMTypes::XF_useDcmtkNamespace); } while (itemList->seek(ELP_next)); result = EC_Normal; } /* XML end tag for "file-format" */ out << "" << OFendl; return result; } // ******************************** OFCondition DcmFileFormat::checkMetaHeaderValue(DcmMetaInfo *metainfo, DcmDataset *dataset, const DcmTagKey &atagkey, DcmObject *obj, const E_TransferSyntax oxfer, const E_FileWriteMode writeMode) /* * This function checks if a particular data element of the file meta information header is * existent. If the element is not existent, it will be inserted. Additionally, this function * makes sure that the corresponding data element will contain a correct value. * * Parameters: * metainfo - [in] The meta header information. * dataset - [in] The data set information. * atagkey - [in] Tag of the data element which shall be checked. * obj - [in] Data object from metainfo which represents the data element that shall be checked. * Equals NULL, if this data element is not existent in the meta header information. * oxfer - [in] The transfer syntax which shall be used. * writeMode - [in] Flag indicating whether to update the file meta information or not. */ { /* initialize result value */ OFCondition l_error = EC_Normal; /* if there is meta header information and also data set information, do something */ if (metainfo != NULL && dataset != NULL) { /* intitialize variables */ DcmStack stack; DcmTag tag(atagkey); if (obj != NULL) tag = obj->getTag(); DcmTagKey xtag = tag.getXTag(); DcmElement *elem = OFstatic_cast(DcmElement *, obj); /* go ahaed and scrutinize one particular data element (depending on xtag) */ if (xtag == DCM_FileMetaInformationGroupLength) // (0002,0000) { if (elem == NULL) { elem = new DcmUnsignedLong(tag); metainfo->insert(elem, OFTrue); } Uint32 temp = 0; if (elem->getLength() == 0 && elem->ident() == EVR_UL) OFstatic_cast(DcmUnsignedLong *, elem)->putUint32Array(&temp, 1); // the calculation of actual group length value is contained in validateMetaInfo() } else if (xtag == DCM_FileMetaInformationVersion) // (0002,0001) { if (elem == NULL) { elem = new DcmOtherByteOtherWord(tag); metainfo->insert(elem, OFTrue); } Uint8 version[2] = {0,1}; if (elem->getLength() == 0 && elem->ident() == EVR_OB) OFstatic_cast(DcmOtherByteOtherWord *, elem)->putUint8Array(version, 2); // check version of meta header Uint8 *currVers = NULL; l_error = OFstatic_cast(DcmOtherByteOtherWord *, elem)->getUint8Array(currVers); if (l_error.good() && (currVers != NULL)) { if (((currVers[0] & version[0] & 0xff) == version[0]) && ((currVers[1] & version[1] & 0xff) == version[1])) { DCMDATA_DEBUG("DcmFileFormat::checkMetaHeaderValue() Version of MetaHeader is ok: 0x" << STD_NAMESPACE hex << STD_NAMESPACE setfill('0') << STD_NAMESPACE setw(2) << OFstatic_cast(int, currVers[1]) << STD_NAMESPACE setw(2) << OFstatic_cast(int, currVers[0])); } else { currVers[0] = OFstatic_cast(Uint8, currVers[0] | version[0]); // direct manipulation currVers[1] = OFstatic_cast(Uint8, currVers[1] | version[1]); // of data DCMDATA_WARN ("DcmFileFormat: Unknown Version of MetaHeader detected: 0x" << STD_NAMESPACE hex << STD_NAMESPACE setfill('0') << STD_NAMESPACE setw(2) << OFstatic_cast(int, currVers[1]) << STD_NAMESPACE setw(2) << OFstatic_cast(int, currVers[0]) << " supported: 0x" << STD_NAMESPACE setw(2) << OFstatic_cast(int, version[1]) << STD_NAMESPACE setw(2) << OFstatic_cast(int, version[0])); } } else { DCMDATA_ERROR("DcmFileFormat: Cannot determine Version of MetaHeader"); } } else if (xtag == DCM_MediaStorageSOPClassUID) // (0002,0002) { if (elem == NULL) { elem = new DcmUniqueIdentifier(tag); metainfo->insert(elem, OFTrue); } if (((writeMode == EWM_updateMeta) || (elem->getLength() == 0)) && (elem->ident() == EVR_UI)) { if (dataset->search(DCM_SOPClassUID, stack).good()) { char *uid = NULL; l_error = OFstatic_cast(DcmUniqueIdentifier *, stack.top())->getString(uid); OFstatic_cast(DcmUniqueIdentifier *, elem)->putString(uid); DCMDATA_DEBUG("DcmFileFormat::checkMetaHeaderValue() use SOPClassUID [" << uid << "]"); } else if (elem->getLength() == 0) { OFstatic_cast(DcmUniqueIdentifier *, elem)->putString(UID_PrivateGenericFileSOPClass); DCMDATA_DEBUG("DcmFileFormat::checkMetaHeaderValue() no SOPClassUID in Dataset, using PrivateGenericFileSOPClass"); } } } else if (xtag == DCM_MediaStorageSOPInstanceUID) // (0002,0003) { if (elem == NULL) { elem = new DcmUniqueIdentifier(tag); metainfo->insert(elem, OFTrue); } if (((writeMode == EWM_updateMeta) || (elem->getLength() == 0)) && (elem->ident() == EVR_UI)) { if (dataset->search(DCM_SOPInstanceUID, stack).good()) { char* uid = NULL; l_error = OFstatic_cast(DcmUniqueIdentifier *, stack.top())->getString(uid); OFstatic_cast(DcmUniqueIdentifier *, elem)->putString(uid); DCMDATA_DEBUG("DcmFileFormat::checkMetaHeaderValue() use SOPInstanceUID [" << uid << "] from Dataset"); } else if (elem->getLength() == 0) { char uid[128]; dcmGenerateUniqueIdentifier(uid); // from dcuid.h OFstatic_cast(DcmUniqueIdentifier *, elem)->putString(uid); DCMDATA_DEBUG("DcmFileFormat::checkMetaHeaderValue() use new generated SOPInstanceUID [" << uid << "]"); } } } else if (xtag == DCM_TransferSyntaxUID) // (0002,0010) { if (elem == NULL) { elem = new DcmUniqueIdentifier(tag); metainfo->insert(elem, OFTrue); } if (elem->ident() == EVR_UI) { #ifdef DEBUG char * uidtmp = NULL; OFstatic_cast(DcmUniqueIdentifier *, elem)->getString(uidtmp); if (uidtmp != NULL) DCMDATA_DEBUG("DcmFileFormat::checkMetaHeaderValue() found old TransferSyntaxUID [" << uidtmp << "]"); #endif DcmXfer dcXfer(oxfer); const char *uid = dcXfer.getXferID(); elem->putString(uid); DCMDATA_DEBUG("DcmFileFormat::checkMetaHeaderValue() use new TransferSyntaxUID [" << dcXfer.getXferName() << "] on writing following Dataset"); } } else if (xtag == DCM_ImplementationClassUID) // (0002,0012) { if (elem == NULL) { elem = new DcmUniqueIdentifier(tag); metainfo->insert(elem, OFTrue); } if (elem->ident() == EVR_UI) { const char *uid = OFFIS_IMPLEMENTATION_CLASS_UID; OFstatic_cast(DcmUniqueIdentifier *, elem)->putString(uid); } } else if (xtag == DCM_ImplementationVersionName) // (0002,0013) { if (elem == NULL) { elem = new DcmShortString(tag); metainfo->insert(elem, OFTrue); } if (elem->ident() == EVR_SH) { const char *uid = OFFIS_DTK_IMPLEMENTATION_VERSION_NAME; OFstatic_cast(DcmShortString *, elem)->putString(uid); } } else if (xtag == DCM_SourceApplicationEntityTitle) // (0002,0016) { if (elem == NULL) { elem = new DcmApplicationEntity(tag); metainfo->insert(elem, OFTrue); } DCMDATA_ERROR("DcmFileFormat: Don't know how to handle SourceApplicationEntityTitle"); } else if (xtag == DCM_PrivateInformationCreatorUID) // (0002,0100) { if (elem == NULL) { elem = new DcmUniqueIdentifier(tag); metainfo->insert(elem, OFTrue); } DCMDATA_ERROR("DcmFileFormat: Don't know how to handle PrivateInformationCreatorUID"); } else if (xtag == DCM_PrivateInformation) // (0002,0102) { if (elem == NULL) { elem = new DcmOtherByteOtherWord(tag); metainfo->insert(elem, OFTrue); } DCMDATA_WARN("DcmFileFormat: Don't know how to handle PrivateInformation"); } else { DCMDATA_WARN("DcmFileFormat: Don't know how to handle " << tag.getTagName()); } /* if at this point elem still equals NULL, something is fishy */ if (elem == NULL) l_error = EC_InvalidVR; } else { /* (i.e. there is either no meta header information or no data set information */ l_error = EC_IllegalCall; } /* return result value */ return l_error; } // ******************************** OFCondition DcmFileFormat::validateMetaInfo(const E_TransferSyntax oxfer, const E_FileWriteMode writeMode) /* * This function makes sure that all data elements of the meta header information are existent * in metainfo and contain correct values. * * Parameters: * oxfer - [in] The transfer syntax which shall be used. * writeMode - [in] Flag indicating whether to update the file meta information or not. */ { /* initialize some variables */ OFCondition l_error = EC_Normal; DcmMetaInfo *metinf = getMetaInfo(); DcmDataset *datset = getDataset(); /* if there is meta header information and data set information, do something */ if (metinf != NULL && datset != NULL) { if (writeMode == EWM_dontUpdateMeta) { DCMDATA_WARN("DcmFileFormat::validateMetaInfo(): Meta Information Header is not updated!"); } else { /* start with empty file meta information */ if (writeMode == EWM_createNewMeta) metinf->clear(); /* in the following, we want to make sure all elements of the meta header */ /* are existent in metinf and contain correct values */ DcmStack stack; /* DCM_FileMetaInformationGroupLength */ metinf->search(DCM_FileMetaInformationGroupLength, stack, ESM_fromHere, OFFalse); checkMetaHeaderValue(metinf, datset, DCM_FileMetaInformationGroupLength, stack.top(), oxfer, writeMode); /* DCM_FileMetaInformationVersion */ metinf->search(DCM_FileMetaInformationVersion, stack, ESM_fromHere, OFFalse); checkMetaHeaderValue(metinf, datset, DCM_FileMetaInformationVersion, stack.top(), oxfer, writeMode); /* DCM_MediaStorageSOPClassUID */ metinf->search(DCM_MediaStorageSOPClassUID, stack, ESM_fromHere, OFFalse); checkMetaHeaderValue(metinf, datset, DCM_MediaStorageSOPClassUID, stack.top(), oxfer, writeMode); /* DCM_MediaStorageSOPInstanceUID */ metinf->search(DCM_MediaStorageSOPInstanceUID, stack, ESM_fromHere, OFFalse); checkMetaHeaderValue(metinf, datset, DCM_MediaStorageSOPInstanceUID, stack.top(), oxfer, writeMode); /* DCM_TransferSyntaxUID */ metinf->search(DCM_TransferSyntaxUID, stack, ESM_fromHere, OFFalse); checkMetaHeaderValue(metinf, datset, DCM_TransferSyntaxUID, stack.top(), oxfer, writeMode); /* DCM_ImplementationClassUID */ metinf->search(DCM_ImplementationClassUID, stack, ESM_fromHere, OFFalse); checkMetaHeaderValue(metinf, datset, DCM_ImplementationClassUID, stack.top(), oxfer, writeMode); /* DCM_ImplementationVersionName */ metinf->search(DCM_ImplementationVersionName, stack, ESM_fromHere, OFFalse); checkMetaHeaderValue(metinf, datset, DCM_ImplementationVersionName, stack.top(), oxfer, writeMode); /* dump some information if required */ DCMDATA_DEBUG("DcmFileFormat: Found " << metinf->card() << " Elements in DcmMetaInfo 'metinf'"); /* calculate new GroupLength for meta header */ if (metinf->computeGroupLengthAndPadding(EGL_withGL, EPD_noChange, META_HEADER_DEFAULT_TRANSFERSYNTAX, EET_UndefinedLength).bad()) { DCMDATA_ERROR("DcmFileFormat::validateMetaInfo() Group length of Meta Information Header not adapted"); } } } else { /* (i.e. there is either no meta header information or no data set information, or both are missing) */ l_error = EC_CorruptedData; } /* return result value */ return l_error; } // ******************************** E_TransferSyntax DcmFileFormat::lookForXfer(DcmMetaInfo *metainfo) { E_TransferSyntax newxfer = EXS_Unknown; DcmStack stack; if (metainfo && metainfo->search(DCM_TransferSyntaxUID, stack).good()) { DcmUniqueIdentifier *xferUI = OFstatic_cast(DcmUniqueIdentifier *, stack.top()); if (xferUI->getTag().getXTag() == DCM_TransferSyntaxUID) { char * xferid = NULL; xferUI->getString(xferid); DcmXfer localXfer(xferid); // decode to E_TransferSyntax newxfer = localXfer.getXfer(); DCMDATA_TRACE("DcmFileFormat::lookForXfer() TransferSyntax=\"" << localXfer.getXferName() << "\" in MetaInfo"); } } return newxfer; } // ******************************** Uint32 DcmFileFormat::calcElementLength(const E_TransferSyntax xfer, const E_EncodingType enctype) { return getMetaInfo()->calcElementLength(xfer, enctype) + getDataset()->calcElementLength(xfer, enctype); } // ******************************** OFBool DcmFileFormat::canWriteXfer(const E_TransferSyntax newXfer, const E_TransferSyntax oldXfer) { DcmDataset *dataset = getDataset(); if (dataset) return dataset->canWriteXfer(newXfer, oldXfer); else return OFFalse; } // ******************************** OFCondition DcmFileFormat::read(DcmInputStream &inStream, const E_TransferSyntax xfer, const E_GrpLenEncoding glenc, const Uint32 maxReadLength) { if (getTransferState() == ERW_notInitialized) errorFlag = EC_IllegalCall; else { errorFlag = inStream.status(); E_TransferSyntax newxfer = xfer; DcmDataset *dataset = NULL; if (errorFlag.good() && inStream.eos()) errorFlag = EC_EndOfStream; else if (errorFlag.good() && getTransferState() != ERW_ready) { // the new data is added to the end itemList->seek(ELP_last); DcmMetaInfo *metaInfo = getMetaInfo(); if (metaInfo == NULL && getTransferState() == ERW_init) { metaInfo = new DcmMetaInfo(); itemList->insert(metaInfo, ELP_first); } if (metaInfo && metaInfo->transferState() != ERW_ready) { errorFlag = metaInfo->read(inStream, xfer, glenc, maxReadLength); } // determine xfer from tag (0002,0010) in the meta header newxfer = lookForXfer(metaInfo); if ((FileReadMode == ERM_fileOnly) || (FileReadMode == ERM_metaOnly)) { // reject file if no meta header present if (errorFlag.good() && (newxfer == EXS_Unknown)) errorFlag = EC_FileMetaInfoHeaderMissing; } if (errorFlag.good() && (!metaInfo || metaInfo->transferState() == ERW_ready)) { dataset = getDataset(); if (dataset == NULL && getTransferState() == ERW_init) { dataset = new DcmDataset(); itemList->seek (ELP_first); itemList->insert(dataset, ELP_next); } // check whether to read the dataset at all if (FileReadMode != ERM_metaOnly) { if (dataset && dataset->transferState() != ERW_ready) { errorFlag = dataset->read(inStream, newxfer, glenc, maxReadLength); } } } } if (getTransferState() == ERW_init) setTransferState(ERW_inWork); if (dataset && dataset->transferState() == ERW_ready) setTransferState(ERW_ready); } return errorFlag; } // DcmFileFormat::read() // ******************************** OFCondition DcmFileFormat::write(DcmOutputStream &outStream, const E_TransferSyntax oxfer, const E_EncodingType enctype, DcmWriteCache *wcache) { return write(outStream, oxfer, enctype, wcache, EGL_recalcGL, EPD_noChange); } OFCondition DcmFileFormat::write(DcmOutputStream &outStream, const E_TransferSyntax oxfer, const E_EncodingType enctype, DcmWriteCache *wcache, const E_GrpLenEncoding glenc, const E_PaddingEncoding padenc, const Uint32 padlen, const Uint32 subPadlen, Uint32 instanceLength, const E_FileWriteMode writeMode) /* * This function writes data values which are contained in this to the stream which is * passed as first argument. With regard to the writing of information, the other parameters * which are passed are accounted for. The function will return EC_Normal, if the information * from all elements of this data set has been written to the buffer, and it will return some * other (error) value if there was an error. * * Parameters: * outStream - [inout] The stream that the information will be written to. * oxfer - [in] The transfer syntax which shall be used. * enctype - [in] Encoding type for sequences. Specifies how sequences will be handled. * glenc - [in] Encoding type for group length. Specifies what will be done with group length tags. * padenc - [in] Encoding type for padding. Specifies what will be done with padding tags. * padlen - [in] The length up to which the dataset shall be padded, if padding is desired. * subPadlen - [in] For sequences (i.e. sub elements), the length up to which item shall be padded, * if padding is desired. * instanceLength - [in] Number of extra bytes added to the item/dataset length used when computing the * padding. This parameter is for instance used to pass the length of the file meta * header from the DcmFileFormat to the DcmDataset object. * writeMode - [in] Write file with or without meta header. Also allows for updating the information * in the file meta information header. */ { /* if the transfer state of this is not initialized, this is an illegal call */ if (getTransferState() == ERW_notInitialized) errorFlag = EC_IllegalCall; else { /* if this is not an illegal call, do something */ /* assign data set and the meta information header to local variables */ DcmDataset *dataset = getDataset(); DcmMetaInfo *metainfo = getMetaInfo(); /* Determine the transfer syntax which shall be used. Either we use the one which was passed, */ /* or (if it's an unknown tranfer syntax) we use the data set's original transfer syntax. */ E_TransferSyntax outxfer = oxfer; if (outxfer == EXS_Unknown && dataset) outxfer = dataset->getOriginalXfer(); /* check if the stream reported an error so far */ errorFlag = outStream.status(); /* check if we can actually write data to the stream; in certain cases we cannot. */ if (outxfer == EXS_Unknown || outxfer == EXS_BigEndianImplicit) errorFlag = EC_IllegalCall; else if (itemList->empty()) errorFlag = EC_CorruptedData; else if (errorFlag.good() && getTransferState() != ERW_ready) { /* in this case we can write data to the stream */ /* if this function was called for the first time for the dataset object, the transferState is */ /* still set to ERW_init. In this case, we need to validate the meta header information, set the */ /* item list pointer to the fist element and we need to set the transfer state to ERW_inWork. */ if (getTransferState() == ERW_init) { validateMetaInfo(outxfer, writeMode); itemList->seek(ELP_first); setTransferState(ERW_inWork); } /* if the transfer state is set to ERW_inWork, we need to write the */ /* information which is included in this to the buffer which was passed. */ if (getTransferState() == ERW_inWork) { /* write meta header information */ errorFlag = metainfo->write(outStream, outxfer, enctype, wcache); /* recalculate the instance length */ instanceLength += metainfo->calcElementLength(outxfer, enctype); /* if everything is ok, write the data set */ if (errorFlag.good()) errorFlag = dataset->write(outStream, outxfer, enctype, wcache, glenc, padenc, padlen, subPadlen, instanceLength); /* if everything is ok, set the transfer state to ERW_ready */ if (errorFlag.good()) setTransferState(ERW_ready); } } /* in case the transfer syntax which shall be used is indeed the */ /* BigEndianImplicit transfer syntax dump some error information */ if (outxfer == EXS_BigEndianImplicit) DCMDATA_ERROR("DcmFileFormat::write() Illegal TransferSyntax (BigEndianImplicit) used"); } /* return result value */ return errorFlag; } // ******************************** OFCondition DcmFileFormat::loadFile(const char *fileName, const E_TransferSyntax readXfer, const E_GrpLenEncoding groupLength, const Uint32 maxReadLength, const E_FileReadMode readMode) { if (readMode == ERM_dataset) return getDataset()->loadFile(fileName, readXfer, groupLength, maxReadLength); OFCondition l_error = EC_IllegalParameter; /* check parameters first */ if ((fileName != NULL) && (strlen(fileName) > 0)) { /* open file for input */ DcmInputFileStream fileStream(fileName); /* check stream status */ l_error = fileStream.status(); if (l_error.good()) { /* clear this object */ l_error = clear(); if (l_error.good()) { /* save old value */ const E_FileReadMode oldMode = FileReadMode; FileReadMode = readMode; /* read data from file */ transferInit(); l_error = read(fileStream, readXfer, groupLength, maxReadLength); transferEnd(); /* restore old value */ FileReadMode = oldMode; } } } return l_error; } OFCondition DcmFileFormat::saveFile(const char *fileName, const E_TransferSyntax writeXfer, const E_EncodingType encodingType, const E_GrpLenEncoding groupLength, const E_PaddingEncoding padEncoding, const Uint32 padLength, const Uint32 subPadLength, const E_FileWriteMode writeMode) { if (writeMode == EWM_dataset) { return getDataset()->saveFile(fileName, writeXfer, encodingType, groupLength, padEncoding, padLength, subPadLength); } OFCondition l_error = EC_IllegalParameter; /* check parameters first */ if ((fileName != NULL) && (strlen(fileName) > 0)) { DcmWriteCache wcache; /* open file for output */ DcmOutputFileStream fileStream(fileName); /* check stream status */ l_error = fileStream.status(); if (l_error.good()) { /* write data to file */ transferInit(); l_error = write(fileStream, writeXfer, encodingType, &wcache, groupLength, padEncoding, padLength, subPadLength, 0 /*instanceLength*/, writeMode); transferEnd(); } } return l_error; } // ******************************** OFCondition DcmFileFormat::insertItem(DcmItem * /*item*/, const unsigned long /*where*/) { DCMDATA_WARN("Illegal call of DcmFileFormat::insert(DcmItem *, unsigned long)"); errorFlag = EC_IllegalCall; return errorFlag; } // ******************************** void DcmFileFormat::removeInvalidGroups() { getMetaInfo()->removeInvalidGroups(); getDataset()->removeInvalidGroups(); } // ******************************** DcmItem *DcmFileFormat::remove(const unsigned long /*num*/) { DCMDATA_WARN("Illegal call of DcmFileFormat::remove(unsigned long)"); errorFlag = EC_IllegalCall; return NULL; } // ******************************** DcmItem *DcmFileFormat::remove(DcmItem* /*item*/) { DCMDATA_WARN("Illegal call of DcmFileFormat::remove(DcmItem *)"); errorFlag = EC_IllegalCall; return NULL; } // ******************************** OFCondition DcmFileFormat::clear() { getMetaInfo()->clear(); return getDataset()->clear(); } // ******************************** DcmMetaInfo *DcmFileFormat::getMetaInfo() { errorFlag = EC_Normal; DcmMetaInfo *meta = NULL; if (itemList->seek_to(0) != NULL && itemList->get()->ident() == EVR_metainfo) meta = OFstatic_cast(DcmMetaInfo *, itemList->get()); else errorFlag = EC_IllegalCall; return meta; } // ******************************** DcmDataset *DcmFileFormat::getDataset() { errorFlag = EC_Normal; DcmDataset *data = NULL; if (itemList->seek_to(1) != NULL && itemList->get()->ident() == EVR_dataset) data = OFstatic_cast(DcmDataset *, itemList->get()); else errorFlag = EC_IllegalCall; return data; } // ******************************** DcmDataset *DcmFileFormat::getAndRemoveDataset() { errorFlag = EC_Normal; DcmDataset *data = NULL; if (itemList->seek_to(1) != NULL && itemList->get()->ident() == EVR_dataset) { data = OFstatic_cast(DcmDataset *, itemList->remove()); DcmDataset *Dataset = new DcmDataset(); DcmSequenceOfItems::itemList->insert(Dataset, ELP_last); } else errorFlag = EC_IllegalCall; return data; } /* ** CVS/RCS Log: ** $Log: dcfilefo.cc,v $ ** Revision 1.64 2010-12-20 11:05:15 joergr ** Fixed possible NULL pointer dereferencing when checking the meta-header ** version (and no data dictionary is loaded). ** ** Revision 1.63 2010-10-29 10:57:21 joergr ** Added support for colored output to the print() method. ** ** Revision 1.62 2010-10-20 16:44:16 joergr ** Use type cast macros (e.g. OFstatic_cast) where appropriate. ** ** Revision 1.61 2010-10-20 16:34:12 joergr ** Renamed method to avoid warnings reported by gcc with additional flags. ** ** Revision 1.60 2010-10-14 13:14:07 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.59 2010-06-07 13:59:51 joergr ** Added new file read mode that allows for loading the meta-header only. ** ** Revision 1.58 2010-03-25 16:30:17 joergr ** Made log messages more consistent within this module. ** ** Revision 1.57 2009-12-04 17:11:48 joergr ** Slightly modified some log messages. ** ** Revision 1.56 2009-11-13 13:11:20 joergr ** Fixed minor issues in log output. ** ** Revision 1.55 2009-11-04 09:58:09 uli ** Switched to logging mechanism provided by the "new" oflog module ** ** Revision 1.54 2009-08-25 12:54:57 joergr ** Added new methods which remove all data elements with an invalid group number ** from the meta information header, dataset and/or fileformat. ** ** Revision 1.53 2009-08-21 10:44:49 joergr ** Added new 'writeMode' which does not update the the meta header. This could ** be useful for tools like dump2dcm and xml2dcm. ** ** Revision 1.52 2009-08-21 09:19:43 joergr ** Added parameter 'writeMode' to save/write methods which allows for specifying ** whether to write a dataset or fileformat as well as whether to update the ** file meta information or to create a new file meta information header. ** ** Revision 1.51 2009-08-19 11:55:44 meichel ** Added additional includes needed for Sun Studio 11 on Solaris. ** ** Revision 1.50 2009-06-04 17:00:13 joergr ** Fixed typo. ** ** Revision 1.49 2009-02-11 16:35:27 joergr ** Introduced new error code EC_FileMetaInfoHeaderMissing. ** ** Revision 1.48 2008-07-17 10:31:31 onken ** Implemented copyFrom() method for complete DcmObject class hierarchy, which ** permits setting an instance's value from an existing object. Implemented ** assignment operator where necessary. ** ** Revision 1.47 2008-04-30 12:38:42 meichel ** Fixed compile errors due to changes in attribute tag names ** ** Revision 1.46 2007/11/29 14:30:21 meichel ** Write methods now handle large raw data elements (such as pixel data) ** without loading everything into memory. This allows very large images to ** be sent over a network connection, or to be copied without ever being ** fully in memory. ** ** Revision 1.45 2007/11/23 15:42:36 meichel ** Copy assignment operators in dcmdata now safe for self assignment ** ** Revision 1.44 2007/06/29 14:17:49 meichel ** Code clean-up: Most member variables in module dcmdata are now private, ** not protected anymore. ** ** Revision 1.43 2006/08/15 15:49:54 meichel ** Updated all code in module dcmdata to correctly compile when ** all standard C++ classes remain in namespace std. ** ** Revision 1.42 2005/12/08 15:41:10 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.41 2005/12/02 11:57:44 joergr ** Fixed minor bug. ** ** Revision 1.40 2005/12/02 08:53:36 joergr ** Added new file read mode that makes it possible to distinguish between DICOM ** files, datasets and other non-DICOM files. For this reason, the last ** parameter of method loadFile() changed from OFBool to E_FileReadMode. ** ** Revision 1.39 2005/11/28 15:53:13 meichel ** Renamed macros in dcdebug.h ** ** Revision 1.38 2005/11/07 17:22:33 meichel ** Implemented DcmFileFormat::clear(). Now the loadFile methods in class ** DcmFileFormat and class DcmDataset both make sure that clear() is called ** before new data is read, allowing for a re-use of the object. ** ** Revision 1.37 2004/08/03 11:41:09 meichel ** Headers libc.h and unistd.h are now included via ofstdinc.h ** ** Revision 1.36 2004/02/04 16:32:01 joergr ** Adapted type casts to new-style typecast operators defined in ofcast.h. ** Removed acknowledgements with e-mail addresses from CVS log. ** ** Revision 1.35 2003/04/01 14:57:20 joergr ** Added support for XML namespaces. ** ** Revision 1.34 2003/03/21 13:08:04 meichel ** Minor code purifications for warnings reported by MSVC in Level 4 ** ** Revision 1.33 2002/12/06 13:09:26 joergr ** Enhanced "print()" function by re-working the implementation and replacing ** the boolean "showFullData" parameter by a more general integer flag. ** Made source code formatting more consistent with other modules/files. ** ** Revision 1.32 2002/11/27 12:06:47 meichel ** Adapted module dcmdata to use of new header file ofstdinc.h ** ** Revision 1.31 2002/08/27 16:55:47 meichel ** Initial release of new DICOM I/O stream classes that add support for stream ** compression (deflated little endian explicit VR transfer syntax) ** ** Revision 1.30 2002/08/20 12:18:48 meichel ** Changed parameter list of loadFile and saveFile methods in class ** DcmFileFormat. Removed loadFile and saveFile from class DcmObject. ** ** Revision 1.29 2002/05/14 08:21:14 joergr ** Renamed some element names. ** ** Revision 1.28 2002/04/25 10:15:35 joergr ** Added support for XML output of DICOM objects. ** ** Revision 1.27 2002/04/16 13:43:17 joergr ** Added configurable support for C++ ANSI standard includes (e.g. streams). ** ** Revision 1.26 2002/04/11 12:27:10 joergr ** Added new methods for loading and saving DICOM files. ** ** Revision 1.25 2002/01/08 10:43:45 joergr ** Corrected spelling of function dcmGenerateUniqueIdentifier(). ** ** Revision 1.24 2001/11/01 14:55:37 wilkens ** Added lots of comments. ** ** Revision 1.23 2001/09/28 14:20:26 joergr ** Added "#include " to keep gcc 3.0 quiet. ** ** Revision 1.22 2001/09/25 17:19:50 meichel ** Adapted dcmdata to class OFCondition ** ** Revision 1.21 2001/06/01 15:49:04 meichel ** Updated copyright header ** ** Revision 1.20 2000/04/14 15:55:05 meichel ** Dcmdata library code now consistently uses ofConsole for error output. ** ** Revision 1.19 2000/03/08 16:26:35 meichel ** Updated copyright header. ** ** Revision 1.18 2000/03/03 14:05:33 meichel ** Implemented library support for redirecting error messages into memory ** instead of printing them to stdout/stderr for GUI applications. ** ** Revision 1.17 2000/02/23 15:11:53 meichel ** Corrected macro for Borland C++ Builder 4 workaround. ** ** Revision 1.16 2000/02/10 10:52:18 joergr ** Added new feature to dcmdump (enhanced print method of dcmdata): write ** pixel data/item value fields to raw files. ** ** Revision 1.15 2000/02/01 10:12:07 meichel ** Avoiding to include as extern "C" on Borland C++ Builder 4, ** workaround for bug in compiler header files. ** ** Revision 1.14 1999/03/31 09:25:28 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.13 1998/07/15 15:51:56 joergr ** Removed several compiler warnings reported by gcc 2.8.1 with ** additional options, e.g. missing copy constructors and assignment ** operators, initialization of member variables in the body of a ** constructor instead of the member initialization list, hiding of ** methods by use of identical names, uninitialized member variables, ** missing const declaration of char pointers. Replaced tabs by spaces. ** ** Revision 1.12 1997/07/21 08:25:28 andreas ** - Replace all boolean types (BOOLEAN, CTNBOOLEAN, DICOM_BOOL, BOOL) ** with one unique boolean type OFBool. ** ** Revision 1.11 1997/07/03 15:09:57 andreas ** - removed debugging functions Bdebug() and Edebug() since ** they write a static array and are not very useful at all. ** Cdebug and Vdebug are merged since they have the same semantics. ** The debugging functions in dcmdata changed their interfaces ** (see dcmdata/include/dcdebug.h) ** ** Revision 1.10 1997/05/27 13:48:59 andreas ** - Add method canWriteXfer to class DcmObject and all derived classes. ** This method checks whether it is possible to convert the original ** transfer syntax to an new transfer syntax. The check is used in the ** dcmconv utility to prohibit the change of a compressed transfer ** syntax to a uncompressed. ** ** Revision 1.9 1997/05/16 08:23:54 andreas ** - Revised handling of GroupLength elements and support of ** DataSetTrailingPadding elements. The enumeratio E_GrpLenEncoding ** got additional enumeration values (for a description see dctypes.h). ** addGroupLength and removeGroupLength methods are replaced by ** computeGroupLengthAndPadding. To support Padding, the parameters of ** element and sequence write functions changed. ** - Added a new method calcElementLength to calculate the length of an ** element, item or sequence. For elements it returns the length of ** tag, length field, vr field, and value length, for item and ** sequences it returns the length of the whole item. sequence including ** the Delimitation tag (if appropriate). It can never return ** UndefinedLength. ** ** Revision 1.8 1997/04/18 08:17:17 andreas ** - The put/get-methods for all VRs did not conform to the C++-Standard ** draft. Some Compilers (e.g. SUN-C++ Compiler, Metroworks ** CodeWarrier, etc.) create many warnings concerning the hiding of ** overloaded get methods in all derived classes of DcmElement. ** So the interface of all value representation classes in the ** library are changed rapidly, e.g. ** OFCondition get(Uint16 & value, const unsigned long pos); ** becomes ** OFCondition getUint16(Uint16 & value, const unsigned long pos); ** All (retired) "returntype get(...)" methods are deleted. ** For more information see dcmdata/include/dcelem.h ** ** Revision 1.7 1996/08/05 08:46:11 andreas ** new print routine with additional parameters: ** - print into files ** - fix output length for elements ** corrected error in search routine with parameter ESM_fromStackTop ** ** Revision 1.6 1996/07/29 15:47:00 andreas ** add method getAndRemoveDataset to remove connection of dataset from fileformat ** ** Revision 1.5 1996/04/12 13:17:22 andreas ** Minor changes to support DEC ALPHA and DEC MIPS ** ** Revision 1.4 1996/03/11 14:48:04 hewett ** When creating a DICOM file, if a SOP Class UID is present in the ** data set then it will be used. Otherwise, a private UID will now be used ** in the meta header attribute MediaStorageSOPClass UID. Previously this ** attribute was left empty (an error for type 1 attributes). ** ** Revision 1.3 1996/01/05 13:27:37 andreas ** - changed to support new streaming facilities ** - unique read/write methods for file and block transfer ** - more cleanups ** ** */ dcmtk-3.6.0/dcmdata/libsrc/dcpcache.cc0000644000310500011400000000677611455601040016767 0ustar joergrdicom3/* * * Copyright (C) 2002-2010, 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: ofstd * * Author: Marco Eichelberg * * Purpose: general purpose 32-bit CRC in C++ * Code is based on the CRC32 implementation (C)1986 Gary S. Brown * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:14:08 $ * CVS/RCS Revision: $Revision: 1.7 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcpcache.h" #include "dcmtk/dcmdata/dcelem.h" /* for DcmElement, DcmObject */ DcmPrivateTagCacheEntry::DcmPrivateTagCacheEntry(const DcmTagKey& tk, const char *pc) : tagKey(tk) , privateCreator(pc) { } DcmPrivateTagCacheEntry::~DcmPrivateTagCacheEntry() { } const char *DcmPrivateTagCacheEntry::getPrivateCreator() const { return privateCreator.c_str(); } OFBool DcmPrivateTagCacheEntry::isPrivateCreatorFor(const DcmTagKey& tk) const { return (tagKey.getGroup() == tk.getGroup()) && ((tagKey.getElement() << 8) == (tk.getElement() & 0xff00)); } /* ======================================================================= */ DcmPrivateTagCache::DcmPrivateTagCache() : list_() { } DcmPrivateTagCache::~DcmPrivateTagCache() { clear(); } void DcmPrivateTagCache::clear() { OFListIterator(DcmPrivateTagCacheEntry *) first = list_.begin(); OFListIterator(DcmPrivateTagCacheEntry *) last = list_.end(); while (first != last) { delete (*first); first = list_.erase(first); } } const char *DcmPrivateTagCache::findPrivateCreator(const DcmTagKey& tk) const { OFListConstIterator(DcmPrivateTagCacheEntry *) first = list_.begin(); OFListConstIterator(DcmPrivateTagCacheEntry *) last = list_.end(); while (first != last) { if ((*first)->isPrivateCreatorFor(tk)) return (*first)->getPrivateCreator(); ++first; } return NULL; } void DcmPrivateTagCache::updateCache(DcmObject *dobj) { if (dobj) { const DcmTag& tag = dobj->getTag(); if (dobj->isLeaf() && (tag.getGTag() & 1) && (tag.getETag() <= 0xff) && (tag.getETag() >= 0x10)) { // dobj is DcmElement containing private creator char *c = NULL; if ((OFstatic_cast(DcmElement *, dobj)->getString(c)).good() && c) { list_.push_back(new DcmPrivateTagCacheEntry(tag, c)); } } } } /* * CVS/RCS Log: * $Log: dcpcache.cc,v $ * Revision 1.7 2010-10-14 13:14:08 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.6 2006/07/24 15:43:52 meichel * Fixed memory leak in private tag lookup cache. * * Revision 1.5 2005/12/08 15:41:24 meichel * Changed include path schema for all DCMTK header files * * Revision 1.4 2004/10/20 15:56:15 meichel * Changed private inheritance from OFList to class member, * needed for compilation with HAVE_STL. * * Revision 1.3 2004/02/04 16:40:48 joergr * Adapted type casts to new-style typecast operators defined in ofcast.h. * Removed acknowledgements with e-mail addresses from CVS log. * * Revision 1.2 2003/06/12 18:22:23 joergr * Modified code to use const_iterators where appropriate (required for STL). * * Revision 1.1 2002/07/23 14:21:34 meichel * Added support for private tag data dictionaries to dcmdata * * */ dcmtk-3.6.0/dcmdata/libsrc/dcvrulup.cc0000644000310500011400000001753111457616142017103 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Gerd Ehlers, Andreas Barth * * Purpose: Implementation of class DcmUnsignedLongOffset * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-20 16:44:18 $ * CVS/RCS Revision: $Revision: 1.30 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" #include "dcmtk/dcmdata/dcvrulup.h" #define INCLUDE_CSTDIO #define INCLUDE_CSTRING #include "dcmtk/ofstd/ofstdinc.h" // ******************************** DcmUnsignedLongOffset::DcmUnsignedLongOffset(const DcmTag &tag, const Uint32 len) : DcmUnsignedLong(tag, len), nextRecord(NULL) { } DcmUnsignedLongOffset::DcmUnsignedLongOffset(const DcmUnsignedLongOffset &old) : DcmUnsignedLong(old), nextRecord(old.nextRecord) { } DcmUnsignedLongOffset& DcmUnsignedLongOffset::operator=(const DcmUnsignedLongOffset& obj) { if (this != &obj) { // copy parent's member variables DcmUnsignedLong::operator=(obj); // copy member variables nextRecord = obj.nextRecord; } return *this; } DcmUnsignedLongOffset::~DcmUnsignedLongOffset() { } OFCondition DcmUnsignedLongOffset::copyFrom(const DcmObject& rhs) { if (this != &rhs) { if (rhs.ident() != ident()) return EC_IllegalCall; *this = OFstatic_cast(const DcmUnsignedLongOffset &, rhs); } return EC_Normal; } // ******************************** DcmEVR DcmUnsignedLongOffset::ident() const { /* internal type identifier */ return EVR_up; } OFCondition DcmUnsignedLongOffset::clear() { /* call inherited method */ errorFlag = DcmUnsignedLong::clear(); /* remove reference to object */ nextRecord = NULL; return errorFlag; } // ******************************** DcmObject* DcmUnsignedLongOffset::getNextRecord() { errorFlag = EC_Normal; /* return pointer to currently stored object reference */ return nextRecord; } DcmObject *DcmUnsignedLongOffset::setNextRecord(DcmObject *record) { errorFlag = EC_Normal; /* store new object reference */ nextRecord = record; return record; } // ******************************** OFCondition DcmUnsignedLongOffset::verify(const OFBool autocorrect) { /* call inherited method */ errorFlag = DcmUnsignedLong::verify(autocorrect); /* perform additional checks on the stored value */ Uint32 *uintVals; errorFlag = getUint32Array(uintVals); if (errorFlag.good() && (getLengthField() > 0) && (uintVals != NULL) && (*uintVals != 0) && (nextRecord == NULL)) errorFlag = EC_CorruptedData; return errorFlag; } /* ** CVS/RCS Log: ** $Log: dcvrulup.cc,v $ ** Revision 1.30 2010-10-20 16:44:18 joergr ** Use type cast macros (e.g. OFstatic_cast) where appropriate. ** ** Revision 1.29 2010-10-14 13:14:11 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.28 2008-07-17 10:31:32 onken ** Implemented copyFrom() method for complete DcmObject class hierarchy, which ** permits setting an instance's value from an existing object. Implemented ** assignment operator where necessary. ** ** Revision 1.27 2007-06-29 14:17:49 meichel ** Code clean-up: Most member variables in module dcmdata are now private, ** not protected anymore. ** ** Revision 1.26 2005/12/08 15:42:08 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.25 2004/01/16 13:45:34 joergr ** Removed acknowledgements with e-mail addresses from CVS log. ** ** Revision 1.24 2002/12/06 13:19:27 joergr ** Enhanced "print()" function by re-working the implementation and replacing ** the boolean "showFullData" parameter by a more general integer flag. ** Made source code formatting more consistent with other modules/files. ** ** Revision 1.23 2002/11/27 12:07:00 meichel ** Adapted module dcmdata to use of new header file ofstdinc.h ** ** Revision 1.22 2002/04/16 13:43:27 joergr ** Added configurable support for C++ ANSI standard includes (e.g. streams). ** ** Revision 1.21 2001/09/25 17:20:02 meichel ** Adapted dcmdata to class OFCondition ** ** Revision 1.20 2001/06/01 15:49:22 meichel ** Updated copyright header ** ** Revision 1.19 2000/04/14 15:55:10 meichel ** Dcmdata library code now consistently uses ofConsole for error output. ** ** Revision 1.18 2000/03/08 16:26:52 meichel ** Updated copyright header. ** ** Revision 1.17 2000/03/03 14:05:41 meichel ** Implemented library support for redirecting error messages into memory ** instead of printing them to stdout/stderr for GUI applications. ** ** Revision 1.16 2000/02/10 10:52:26 joergr ** Added new feature to dcmdump (enhanced print method of dcmdata): write ** pixel data/item value fields to raw files. ** ** Revision 1.15 2000/02/02 14:33:02 joergr ** Replaced 'delete' statements by 'delete[]' for objects created with 'new[]'. ** ** Revision 1.14 1999/04/13 16:29:36 meichel ** Fixed bug in DcmUnsignedLongOffset::print that caused an application crash ** when very large DICOMDIRs were printed (i.e. with dcmdump). ** ** Revision 1.13 1999/03/31 09:26:02 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.12 1998/07/15 15:52:12 joergr ** Removed several compiler warnings reported by gcc 2.8.1 with ** additional options, e.g. missing copy constructors and assignment ** operators, initialization of member variables in the body of a ** constructor instead of the member initialization list, hiding of ** methods by use of identical names, uninitialized member variables, ** missing const declaration of char pointers. Replaced tabs by spaces. ** ** Revision 1.11 1997/07/21 08:25:36 andreas ** - Replace all boolean types (BOOLEAN, CTNBOOLEAN, DICOM_BOOL, BOOL) ** with one unique boolean type OFBool. ** ** Revision 1.10 1997/07/03 15:10:21 andreas ** - removed debugging functions Bdebug() and Edebug() since ** they write a static array and are not very useful at all. ** Cdebug and Vdebug are merged since they have the same semantics. ** The debugging functions in dcmdata changed their interfaces ** (see dcmdata/include/dcdebug.h) ** ** Revision 1.9 1997/04/18 08:17:22 andreas ** - The put/get-methods for all VRs did not conform to the C++-Standard ** draft. Some Compilers (e.g. SUN-C++ Compiler, Metroworks ** CodeWarrier, etc.) create many warnings concerning the hiding of ** overloaded get methods in all derived classes of DcmElement. ** So the interface of all value representation classes in the ** library are changed rapidly, e.g. ** OFCondition get(Uint16 & value, const unsigned long pos); ** becomes ** OFCondition getUint16(Uint16 & value, const unsigned long pos); ** All (retired) "returntype get(...)" methods are deleted. ** For more information see dcmdata/include/dcelem.h ** ** Revision 1.8 1996/08/05 08:46:25 andreas ** new print routine with additional parameters: ** - print into files ** - fix output length for elements ** corrected error in search routine with parameter ESM_fromStackTop ** ** Revision 1.7 1996/05/20 13:27:54 andreas ** correct minor bug in print routine ** ** Revision 1.6 1996/04/12 13:17:23 andreas ** Minor changes to support DEC ALPHA and DEC MIPS ** ** Revision 1.5 1996/03/11 13:09:44 hewett ** Corrected ambiguous use of this->get(0). ** ** Revision 1.4 1996/01/09 11:06:50 andreas ** New Support for Visual C++ ** Correct problems with inconsistent const declarations ** Correct error in reading Item Delimitation Elements ** ** Revision 1.3 1996/01/05 13:27:56 andreas ** - changed to support new streaming facilities ** - unique read/write methods for file and block transfer ** - more cleanups ** */ dcmtk-3.6.0/dcmdata/libsrc/dccodec.cc0000644000310500011400000006103711455601037016616 0ustar joergrdicom3/* * * Copyright (C) 1997-2010, 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: dcmdata * * Author: Andreas Barth * * Purpose: abstract class DcmCodec and the class DcmCodecStruct * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:14:07 $ * CVS/RCS Revision: $Revision: 1.22 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dccodec.h" #include "dcmtk/ofstd/oflist.h" #include "dcmtk/ofstd/ofthread.h" #include "dcmtk/dcmdata/dcdeftag.h" /* for tag constants */ #include "dcmtk/dcmdata/dcuid.h" /* for dcmGenerateUniqueIdentifer()*/ #include "dcmtk/dcmdata/dcitem.h" /* for class DcmItem */ #include "dcmtk/dcmdata/dcsequen.h" /* for DcmSequenceOfItems */ #include "dcmtk/dcmdata/dcpixseq.h" /* for DcmPixelSequence */ #include "dcmtk/dcmdata/dcpxitem.h" /* for DcmPixelItem */ #include "dcmtk/dcmdata/dcswap.h" /* for swapIfNecessary */ #include "dcmtk/dcmdata/dcvrui.h" /* for DcmUniqueIdentifier */ // static member variables OFList DcmCodecList::registeredCodecs; #ifdef WITH_THREADS OFReadWriteLock DcmCodecList::codecLock; #endif /* --------------------------------------------------------------- */ // DcmCodec static helper methods OFCondition DcmCodec::insertStringIfMissing(DcmItem *dataset, const DcmTagKey& tag, const char *val) { DcmStack stack; if ((dataset->search(tag, stack, ESM_fromHere, OFFalse)).bad()) { return dataset->putAndInsertString(tag, val, OFTrue); } return EC_Normal; } OFCondition DcmCodec::convertToSecondaryCapture(DcmItem *dataset) { if (dataset == NULL) return EC_IllegalCall; OFCondition result = EC_Normal; char buf[70]; // SOP Class UID - always replace if (result.good()) result = dataset->putAndInsertString(DCM_SOPClassUID, UID_SecondaryCaptureImageStorage); // SOP Instance UID - only insert if missing. dcmGenerateUniqueIdentifier(buf); if (result.good()) result = insertStringIfMissing(dataset, DCM_SOPInstanceUID, buf); // Type 1 attributes - insert with value if missing dcmGenerateUniqueIdentifier(buf, SITE_STUDY_UID_ROOT); if (result.good()) result = insertStringIfMissing(dataset, DCM_StudyInstanceUID, buf); dcmGenerateUniqueIdentifier(buf, SITE_SERIES_UID_ROOT); if (result.good()) result = insertStringIfMissing(dataset, DCM_SeriesInstanceUID, buf); if (result.good()) result = insertStringIfMissing(dataset, DCM_ConversionType, "WSD"); if (result.good()) result = insertStringIfMissing(dataset, DCM_Modality, "OT"); // Type 2 attributes - insert without value if missing if (result.good()) result = insertStringIfMissing(dataset, DCM_PatientName, NULL); if (result.good()) result = insertStringIfMissing(dataset, DCM_PatientID, NULL); if (result.good()) result = insertStringIfMissing(dataset, DCM_PatientBirthDate, NULL); if (result.good()) result = insertStringIfMissing(dataset, DCM_PatientSex, NULL); if (result.good()) result = insertStringIfMissing(dataset, DCM_PatientOrientation, NULL); if (result.good()) result = insertStringIfMissing(dataset, DCM_StudyDate, NULL); if (result.good()) result = insertStringIfMissing(dataset, DCM_StudyTime, NULL); if (result.good()) result = insertStringIfMissing(dataset, DCM_ReferringPhysicianName, NULL); if (result.good()) result = insertStringIfMissing(dataset, DCM_StudyID, NULL); if (result.good()) result = insertStringIfMissing(dataset, DCM_AccessionNumber, NULL); if (result.good()) result = insertStringIfMissing(dataset, DCM_SeriesNumber, NULL); if (result.good()) result = insertStringIfMissing(dataset, DCM_InstanceNumber, NULL); return result; } OFCondition DcmCodec::insertCodeSequence( DcmItem *dataset, const DcmTagKey &tagKey, const char *codingSchemeDesignator, const char *codeValue, const char *codeMeaning) { if (dataset == NULL || codingSchemeDesignator == NULL || codeValue == NULL || codeMeaning == NULL) return EC_IllegalCall; OFCondition result = EC_Normal; DcmSequenceOfItems *dseq = new DcmSequenceOfItems(tagKey); if (dseq) { DcmItem *ditem = new DcmItem(); if (ditem) { dseq->insert(ditem); result = ditem->putAndInsertString(DCM_CodingSchemeDesignator, codingSchemeDesignator); if (result.good()) result = ditem->putAndInsertString(DCM_CodeValue, codeValue); if (result.good()) result = ditem->putAndInsertString(DCM_CodeMeaning, codeMeaning); } else result = EC_MemoryExhausted; // insert sequence into dataset if everything went well if (result.good()) dataset->insert(dseq, OFTrue /*replaceOld*/); else delete dseq; } else result = EC_MemoryExhausted; return result; } OFCondition DcmCodec::newInstance( DcmItem *dataset, const char *purposeOfReferenceCodingScheme, const char *purposeOfReferenceCodeValue, const char *purposeOfReferenceCodeMeaning) { if (dataset == NULL) return EC_IllegalCall; OFCondition result = EC_Normal; // look up current SOP Class UID and SOP Instance UID const char *classUID = NULL; const char *instanceUID = NULL; // search for existing SOP Class UID / SOP Instance UID OFCondition tempResult = dataset->findAndGetString(DCM_SOPClassUID, classUID); if (tempResult.good()) tempResult = dataset->findAndGetString(DCM_SOPInstanceUID, instanceUID); if (tempResult.good() && classUID && instanceUID) { // create source image sequence DcmSequenceOfItems *dseq = new DcmSequenceOfItems(DCM_SourceImageSequence); if (dseq) { DcmItem *ditem = new DcmItem(); if (ditem) { dseq->insert(ditem); DcmElement *elem1 = new DcmUniqueIdentifier(DCM_ReferencedSOPClassUID); if (elem1) { result = elem1->putString(classUID); ditem->insert(elem1, OFTrue /*replaceOld*/); if (result.good()) { DcmElement *elem2 = new DcmUniqueIdentifier(DCM_ReferencedSOPInstanceUID); if (elem2) { result = elem2->putString(instanceUID); ditem->insert(elem2, OFTrue /*replaceOld*/); } else result = EC_MemoryExhausted; } } else result = EC_MemoryExhausted; if (result.good() && purposeOfReferenceCodingScheme && purposeOfReferenceCodeValue && purposeOfReferenceCodeMeaning) { // add purpose of reference code sequence result = DcmCodec::insertCodeSequence(ditem, DCM_PurposeOfReferenceCodeSequence, purposeOfReferenceCodingScheme, purposeOfReferenceCodeValue, purposeOfReferenceCodeMeaning); } } else result = EC_MemoryExhausted; if (result.good()) dataset->insert(dseq, OFTrue); else delete dseq; } else result = EC_MemoryExhausted; } // create new SOP instance UID if (result.good()) { char new_uid[100]; DcmElement *elem = new DcmUniqueIdentifier(DCM_SOPInstanceUID); if (elem) { if (EC_Normal == (result = elem->putString(dcmGenerateUniqueIdentifier(new_uid)))) dataset->insert(elem, OFTrue); // replace SOP Instance UID else delete elem; } else result = EC_MemoryExhausted; } return result; } OFCondition DcmCodec::updateImageType(DcmItem *dataset) { if (dataset == NULL) return EC_IllegalCall; DcmStack stack; OFString imageType("DERIVED"); OFString a; /* find existing Image Type element */ OFCondition status = dataset->search(DCM_ImageType, stack, ESM_fromHere, OFFalse); if (status.good()) { DcmElement *elem = OFstatic_cast(DcmElement *, stack.top()); unsigned long pos = 1; // append old image type information beginning with second entry while ((elem->getOFString(a, pos++)).good()) { imageType += "\\"; imageType += a; } } // insert new Image Type, replace old value return dataset->putAndInsertString(DCM_ImageType, imageType.c_str(), OFTrue); } OFCondition DcmCodec::determineStartFragment( Uint32 frameNo, Sint32 numberOfFrames, DcmPixelSequence * fromPixSeq, Uint32& currentItem) { Uint32 numberOfFragments = fromPixSeq->card(); if (numberOfFrames < 1 || numberOfFragments <= OFstatic_cast(Uint32, numberOfFrames) || frameNo >= OFstatic_cast(Uint32, numberOfFrames)) return EC_IllegalCall; if (frameNo == 0) { // simple case: first frame is always at second fragment currentItem = 1; return EC_Normal; } if (numberOfFragments == OFstatic_cast(Uint32, numberOfFrames) + 1) { // standard case: there is one fragment per frame. currentItem = frameNo + 1; return EC_Normal; } // non-standard case: multiple fragments per frame. // We now try to consult the offset table. DcmPixelItem *pixItem = NULL; Uint8 * rawOffsetTable = NULL; // get first pixel item, i.e. the fragment containing the offset table OFCondition result = fromPixSeq->getItem(pixItem, 0); if (result.good()) { Uint32 tableLength = pixItem->getLength(); result = pixItem->getUint8Array(rawOffsetTable); if (result.good()) { // check if the offset table has the right size: 4 bytes for each frame (not fragment!) if (tableLength != 4* OFstatic_cast(Uint32, numberOfFrames)) return EC_IllegalCall; // byte swap offset table into local byte order. In file, the offset table is always in little endian swapIfNecessary(gLocalByteOrder, EBO_LittleEndian, rawOffsetTable, tableLength, sizeof(Uint32)); // cast offset table to Uint32. Uint32 *offsetTable = OFreinterpret_cast(Uint32 *, rawOffsetTable); // now access offset of the frame we're looking for Uint32 offset = offsetTable[frameNo]; // OK, now let's look if we can find a fragment that actually corresponds to that offset. // In counter we compute the offset for each frame by adding all fragment lenghts Uint32 counter = 0; // now iterate over all fragments except the index table. The start of the first fragment // is defined as zero. for (Uint32 idx = 1; idx < numberOfFragments; ++idx) { if (counter == offset) { // hooray, we are lucky. We have found the fragment we're looking for currentItem = idx; return EC_Normal; } // access pixel item in order to determine its length result = fromPixSeq->getItem(pixItem, idx); if (result.bad()) return result; // add pixel item length plus 8 bytes overhead for the item tag and length field counter += pixItem->getLength() + 8; } // bad luck. We have not found a fragment corresponding to the offset in the offset table. // Either we cannot correctly add numbers, or they cannot :-) return EC_TagNotFound; } } return result; } /* --------------------------------------------------------------- */ DcmCodecList::DcmCodecList( const DcmCodec *aCodec, const DcmRepresentationParameter *aDefaultRepParam, const DcmCodecParameter *aCodecParameter) : codec(aCodec) , defaultRepParam(aDefaultRepParam) , codecParameter(aCodecParameter) { } DcmCodecList::~DcmCodecList() { } OFCondition DcmCodecList::registerCodec( const DcmCodec *aCodec, const DcmRepresentationParameter *aDefaultRepParam, const DcmCodecParameter *aCodecParameter) { if ((aCodec == NULL)||(aCodecParameter == NULL)) return EC_IllegalParameter; #ifdef WITH_THREADS if (! codecLock.initialized()) return EC_IllegalCall; // should never happen #endif // acquire write lock on codec list. Will block if some codec is currently active. OFCondition result = EC_Normal; #ifdef WITH_THREADS OFReadWriteLocker locker(codecLock); if (0 == locker.wrlock()) { #endif DcmCodecList *listEntry = new DcmCodecList(aCodec, aDefaultRepParam, aCodecParameter); if (listEntry) { // prevent codec from being registered twice OFListIterator(DcmCodecList *) first = registeredCodecs.begin(); OFListIterator(DcmCodecList *) last = registeredCodecs.end(); while (first != last) { if ((*first)->codec == aCodec) { // this codec is already registered. first = last; result = EC_IllegalCall; } else ++first; } if (result.good()) registeredCodecs.push_back(listEntry); else delete listEntry; } else result = EC_MemoryExhausted; #ifdef WITH_THREADS } else result = EC_IllegalCall; #endif return result; } OFCondition DcmCodecList::deregisterCodec(const DcmCodec *aCodec) { if (aCodec == NULL) return EC_IllegalParameter; #ifdef WITH_THREADS if (! codecLock.initialized()) return EC_IllegalCall; // should never happen #endif // acquire write lock on codec list. Will block if some codec is currently active. OFCondition result = EC_Normal; #ifdef WITH_THREADS OFReadWriteLocker locker(codecLock); if (0 == locker.wrlock()) { #endif OFListIterator(DcmCodecList *) first = registeredCodecs.begin(); OFListIterator(DcmCodecList *) last = registeredCodecs.end(); while (first != last) { if ((*first)->codec == aCodec) { delete *first; first = registeredCodecs.erase(first); } else ++first; } #ifdef WITH_THREADS } else result = EC_IllegalCall; #endif return result; } OFCondition DcmCodecList::updateCodecParameter( const DcmCodec *aCodec, const DcmCodecParameter *aCodecParameter) { if ((aCodec == NULL)||(aCodecParameter == NULL)) return EC_IllegalParameter; #ifdef WITH_THREADS if (! codecLock.initialized()) return EC_IllegalCall; // should never happen #endif // acquire write lock on codec list. Will block if some codec is currently active. OFCondition result = EC_Normal; #ifdef WITH_THREADS OFReadWriteLocker locker(codecLock); if (0 == locker.wrlock()) { #endif OFListIterator(DcmCodecList *) first = registeredCodecs.begin(); OFListIterator(DcmCodecList *) last = registeredCodecs.end(); while (first != last) { if ((*first)->codec == aCodec) (*first)->codecParameter = aCodecParameter; ++first; } #ifdef WITH_THREADS } else result = EC_IllegalCall; #endif return result; } OFCondition DcmCodecList::decode( const DcmXfer & fromType, const DcmRepresentationParameter * fromParam, DcmPixelSequence * fromPixSeq, DcmPolymorphOBOW& uncompressedPixelData, DcmStack & pixelStack) { #ifdef WITH_THREADS if (! codecLock.initialized()) return EC_IllegalCall; // should never happen #endif OFCondition result = EC_CannotChangeRepresentation; // acquire write lock on codec list. Will block if some write lock is currently active. #ifdef WITH_THREADS OFReadWriteLocker locker(codecLock); if (0 == locker.rdlock()) { #endif E_TransferSyntax fromXfer = fromType.getXfer(); OFListIterator(DcmCodecList *) first = registeredCodecs.begin(); OFListIterator(DcmCodecList *) last = registeredCodecs.end(); while (first != last) { if ((*first)->codec->canChangeCoding(fromXfer, EXS_LittleEndianExplicit)) { result = (*first)->codec->decode(fromParam, fromPixSeq, uncompressedPixelData, (*first)->codecParameter, pixelStack); first = last; } else ++first; } #ifdef WITH_THREADS } else result = EC_IllegalCall; #endif return result; } OFCondition DcmCodecList::decodeFrame( const DcmXfer & fromType, const DcmRepresentationParameter * fromParam, DcmPixelSequence * fromPixSeq, DcmItem *dataset, Uint32 frameNo, Uint32& startFragment, void *buffer, Uint32 bufSize, OFString& decompressedColorModel) { #ifdef WITH_THREADS if (! codecLock.initialized()) return EC_IllegalCall; // should never happen #endif OFCondition result = EC_CannotChangeRepresentation; // acquire write lock on codec list. Will block if some write lock is currently active. #ifdef WITH_THREADS OFReadWriteLocker locker(codecLock); if (0 == locker.rdlock()) { #endif E_TransferSyntax fromXfer = fromType.getXfer(); OFListIterator(DcmCodecList *) first = registeredCodecs.begin(); OFListIterator(DcmCodecList *) last = registeredCodecs.end(); while (first != last) { if ((*first)->codec->canChangeCoding(fromXfer, EXS_LittleEndianExplicit)) { result = (*first)->codec->decodeFrame(fromParam, fromPixSeq, (*first)->codecParameter, dataset, frameNo, startFragment, buffer, bufSize, decompressedColorModel); first = last; } else ++first; } #ifdef WITH_THREADS } else result = EC_IllegalCall; #endif return result; } OFCondition DcmCodecList::encode( const E_TransferSyntax fromRepType, const DcmRepresentationParameter * fromParam, DcmPixelSequence * fromPixSeq, const E_TransferSyntax toRepType, const DcmRepresentationParameter * toRepParam, DcmPixelSequence * & toPixSeq, DcmStack & pixelStack) { toPixSeq = NULL; #ifdef WITH_THREADS if (! codecLock.initialized()) return EC_IllegalCall; // should never happen #endif OFCondition result = EC_CannotChangeRepresentation; // acquire write lock on codec list. Will block if some write lock is currently active. #ifdef WITH_THREADS OFReadWriteLocker locker(codecLock); if (0 == locker.rdlock()) { #endif OFListIterator(DcmCodecList *) first = registeredCodecs.begin(); OFListIterator(DcmCodecList *) last = registeredCodecs.end(); while (first != last) { if ((*first)->codec->canChangeCoding(fromRepType, toRepType)) { if (!toRepParam) toRepParam = (*first)->defaultRepParam; result = (*first)->codec->encode(fromRepType, fromParam, fromPixSeq, toRepParam, toPixSeq, (*first)->codecParameter, pixelStack); first = last; } else ++first; } #ifdef WITH_THREADS } else result = EC_IllegalCall; #endif return result; } OFCondition DcmCodecList::encode( const E_TransferSyntax fromRepType, const Uint16 * pixelData, const Uint32 length, const E_TransferSyntax toRepType, const DcmRepresentationParameter * toRepParam, DcmPixelSequence * & toPixSeq, DcmStack & pixelStack) { toPixSeq = NULL; #ifdef WITH_THREADS if (! codecLock.initialized()) return EC_IllegalCall; // should never happen #endif OFCondition result = EC_CannotChangeRepresentation; // acquire write lock on codec list. Will block if some write lock is currently active. #ifdef WITH_THREADS OFReadWriteLocker locker(codecLock); if (0 == locker.rdlock()) { #endif OFListIterator(DcmCodecList *) first = registeredCodecs.begin(); OFListIterator(DcmCodecList *) last = registeredCodecs.end(); while (first != last) { if ((*first)->codec->canChangeCoding(fromRepType, toRepType)) { if (!toRepParam) toRepParam = (*first)->defaultRepParam; result = (*first)->codec->encode(pixelData, length, toRepParam, toPixSeq, (*first)->codecParameter, pixelStack); first = last; } else ++first; } #ifdef WITH_THREADS } else result = EC_IllegalCall; #endif return result; } OFBool DcmCodecList::canChangeCoding( const E_TransferSyntax fromRepType, const E_TransferSyntax toRepType) { #ifdef WITH_THREADS if (! codecLock.initialized()) return OFFalse; // should never happen #endif OFBool result = OFFalse; // acquire write lock on codec list. Will block if some write lock is currently active. #ifdef WITH_THREADS OFReadWriteLocker locker(codecLock); if (0 == locker.rdlock()) { #endif OFListIterator(DcmCodecList *) first = registeredCodecs.begin(); OFListIterator(DcmCodecList *) last = registeredCodecs.end(); while (first != last) { if ((*first)->codec->canChangeCoding(fromRepType, toRepType)) { result = OFTrue; first = last; } else ++first; } #ifdef WITH_THREADS } #endif return result; } OFCondition DcmCodecList::determineDecompressedColorModel( const DcmXfer &fromType, const DcmRepresentationParameter *fromParam, DcmPixelSequence *fromPixSeq, DcmItem *dataset, OFString &decompressedColorModel) { #ifdef WITH_THREADS if (! codecLock.initialized()) return EC_IllegalCall; // should never happen #endif OFCondition result = EC_CannotChangeRepresentation; // acquire write lock on codec list. Will block if some write lock is currently active. #ifdef WITH_THREADS OFReadWriteLocker locker(codecLock); if (0 == locker.rdlock()) { #endif E_TransferSyntax fromXfer = fromType.getXfer(); OFListIterator(DcmCodecList *) first = registeredCodecs.begin(); OFListIterator(DcmCodecList *) last = registeredCodecs.end(); while (first != last) { if ((*first)->codec->canChangeCoding(fromXfer, EXS_LittleEndianExplicit)) { result = (*first)->codec->determineDecompressedColorModel(fromParam, fromPixSeq, (*first)->codecParameter, dataset, decompressedColorModel); first = last; } else ++first; } #ifdef WITH_THREADS } else result = EC_IllegalCall; #endif return result; } /* ** CVS/RCS Log: ** $Log: dccodec.cc,v $ ** Revision 1.22 2010-10-14 13:14:07 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.21 2010-10-04 14:26:19 joergr ** Fixed issue with codec registry when compiled on Linux x86_64 with "configure ** --disable-threads" (replaced "#ifdef _REENTRANT" by "#ifdef WITH_THREADS"). ** ** Revision 1.20 2010-08-09 13:01:22 joergr ** Updated data dictionary to 2009 edition of the DICOM standard. From now on, ** the official "keyword" is used for the attribute name which results in a ** number of minor changes (e.g. "PatientsName" is now called "PatientName"). ** ** Revision 1.19 2010-06-04 14:22:39 uli ** Use new OFReadWriteLocker to avoid dead locks when we return from a codec ** via an exception. ** ** Revision 1.18 2010-03-01 09:08:45 uli ** Removed some unnecessary include directives in the headers. ** ** Revision 1.17 2009-11-17 16:41:26 joergr ** Added new method that allows for determining the color model of the ** decompressed image. ** ** Revision 1.16 2008-11-03 14:34:10 joergr ** Fixed typo. ** ** Revision 1.15 2008-05-29 10:46:16 meichel ** Implemented new method DcmPixelData::getUncompressedFrame ** that permits frame-wise access to compressed and uncompressed ** objects without ever loading the complete object into main memory. ** For this new method to work with compressed images, all classes derived from ** DcmCodec need to implement a new method decodeFrame(). For now, only ** dummy implementations returning an error code have been defined. ** ** Revision 1.14 2005/12/08 15:40:58 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.13 2004/08/24 14:54:20 meichel ** Updated compression helper methods. Image type is not set to SECONDARY ** any more, support for the purpose of reference code sequence added. ** ** Revision 1.12 2004/02/04 16:11:42 joergr ** Adapted type casts to new-style typecast operators defined in ofcast.h. ** ** Revision 1.11 2002/06/27 15:15:53 meichel ** Now adding empty Patient Orientation when converting to ** Secondary Capture. ** ** Revision 1.10 2002/05/24 14:51:50 meichel ** Moved helper methods that are useful for different compression techniques ** from module dcmjpeg to module dcmdata ** ** Revision 1.9 2002/02/27 14:21:35 meichel ** Declare dcmdata read/write locks only when compiled in multi-thread mode ** ** Revision 1.8 2001/11/08 16:19:42 meichel ** Changed interface for codec registration. Now everything is thread-safe ** and multiple codecs can be registered for a single transfer syntax (e.g. ** one encoder and one decoder). ** ** Revision 1.7 2001/09/25 17:19:09 meichel ** Updated abstract class DcmCodecParameter for use with dcmjpeg. ** Added new function deregisterGlobalCodec(). ** ** Revision 1.6 2001/06/01 15:48:59 meichel ** Updated copyright header ** ** Revision 1.5 2000/09/27 08:19:57 meichel ** Minor changes in DcmCodec interface, required for future dcmjpeg module. ** ** Revision 1.4 2000/04/14 16:09:16 meichel ** Made function DcmCodec and related functions thread safe. ** registerGlobalCodec() should not be called anymore from the constructor ** of global objects. ** ** Revision 1.3 2000/03/08 16:26:30 meichel ** Updated copyright header. ** ** Revision 1.2 1999/03/31 09:25:18 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.1 1997/07/21 07:55:04 andreas ** - New environment for encapsulated pixel representations. DcmPixelData ** can contain different representations and uses codecs to convert ** between them. Codecs are derived from the DcmCodec class. New error ** codes are introduced for handling of representations. New internal ** value representation (only for ident()) for PixelData ** */ dcmtk-3.6.0/dcmdata/libsrc/dcrlecce.cc0000644000310500011400000004260411455601041016770 0ustar joergrdicom3/* * * Copyright (C) 2002-2010, 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: dcmdata * * Author: Marco Eichelberg * * Purpose: encoder codec class for RLE * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:14:09 $ * CVS/RCS Revision: $Revision: 1.16 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" #include "dcmtk/dcmdata/dcrlecce.h" #include "dcmtk/dcmdata/dcrleenc.h" /* for class DcmRLEEncoder */ #include "dcmtk/dcmdata/dcrlecp.h" /* for class DcmRLECodecParameter */ #include "dcmtk/dcmdata/dcdeftag.h" /* for tag constants */ #include "dcmtk/dcmdata/dcpixseq.h" /* for class DcmPixelSequence */ #include "dcmtk/dcmdata/dcpxitem.h" /* for class DcmPixelItem */ #include "dcmtk/dcmdata/dcswap.h" /* for swapIfNecessary */ #include "dcmtk/dcmdata/dcitem.h" #include "dcmtk/ofstd/ofstd.h" #define INCLUDE_CSTDIO #include "dcmtk/ofstd/ofstdinc.h" typedef OFList DcmRLEEncoderList; typedef OFListIterator(DcmRLEEncoder *) DcmRLEEncoderListIterator; // ======================================================================= DcmRLECodecEncoder::DcmRLECodecEncoder() : DcmCodec() { } DcmRLECodecEncoder::~DcmRLECodecEncoder() { } OFBool DcmRLECodecEncoder::canChangeCoding( const E_TransferSyntax oldRepType, const E_TransferSyntax newRepType) const { E_TransferSyntax myXfer = EXS_RLELossless; DcmXfer newRep(newRepType); DcmXfer oldRep(oldRepType); if (oldRep.isNotEncapsulated() && (newRepType == myXfer)) return OFTrue; // compress requested // we don't support re-coding for now. return OFFalse; } OFCondition DcmRLECodecEncoder::decode( const DcmRepresentationParameter * /* fromRepParam */, DcmPixelSequence * /* pixSeq */, DcmPolymorphOBOW& /* uncompressedPixelData */, const DcmCodecParameter * /* cp */, const DcmStack& /* objStack */) const { // we are an encoder only return EC_IllegalCall; } OFCondition DcmRLECodecEncoder::decodeFrame( const DcmRepresentationParameter * /* fromParam */ , DcmPixelSequence * /* fromPixSeq */ , const DcmCodecParameter * /* cp */ , DcmItem * /* dataset */ , Uint32 /* frameNo */ , Uint32& /* startFragment */ , void * /* buffer */ , Uint32 /* bufSize */ , OFString& /* decompressedColorModel */ ) const { // we are an encoder only return EC_IllegalCall; } OFCondition DcmRLECodecEncoder::encode( const E_TransferSyntax /* fromRepType */, const DcmRepresentationParameter * /* fromRepParam */, DcmPixelSequence * /* fromPixSeq */, const DcmRepresentationParameter * /* toRepParam */, DcmPixelSequence * & /* toPixSeq */, const DcmCodecParameter * /* cp */, DcmStack & /* objStack */) const { // we don't support re-coding for now. return EC_IllegalCall; } OFCondition DcmRLECodecEncoder::encode( const Uint16 *pixelData, const Uint32 length, const DcmRepresentationParameter * /* toRepParam */ , DcmPixelSequence * & pixSeq, const DcmCodecParameter *cp, DcmStack & objStack) const { OFCondition result = EC_Normal; // assume we can cast the codec parameter to what we need const DcmRLECodecParameter *djcp = OFstatic_cast(const DcmRLECodecParameter *, cp); DcmStack localStack(objStack); (void)localStack.pop(); // pop pixel data element from stack DcmObject *dataset = localStack.pop(); // this is the item in which the pixel data is located Uint8 *pixelData8 = OFreinterpret_cast(Uint8 *, OFconst_cast(Uint16 *, pixelData)); Uint8 *pixelPointer = NULL; DcmOffsetList offsetList; DcmRLEEncoderList rleEncoderList; DcmRLEEncoderListIterator first = rleEncoderList.begin(); DcmRLEEncoderListIterator last = rleEncoderList.end(); Uint32 rleHeader[16]; Uint32 i; OFBool byteSwapped = OFFalse; // true if we have byte-swapped the original pixel data if ((!dataset)||((dataset->ident()!= EVR_dataset) && (dataset->ident()!= EVR_item))) result = EC_InvalidTag; else { DcmItem *ditem = OFstatic_cast(DcmItem *, dataset); Uint16 bitsAllocated = 0; Uint16 bytesAllocated = 0; Uint16 samplesPerPixel = 0; Uint16 planarConfiguration = 0; Uint16 columns = 0; Uint16 rows = 0; Sint32 numberOfFrames = 1; Uint32 numberOfStripes = 0; Uint32 compressedSize = 0; result = ditem->findAndGetUint16(DCM_BitsAllocated, bitsAllocated); if (result.good()) result = ditem->findAndGetUint16(DCM_SamplesPerPixel, samplesPerPixel); if (result.good()) result = ditem->findAndGetUint16(DCM_Columns, columns); if (result.good()) result = ditem->findAndGetUint16(DCM_Rows, rows); if (result.good()) { result = ditem->findAndGetSint32(DCM_NumberOfFrames, numberOfFrames); if (result.bad() || numberOfFrames < 1) numberOfFrames = 1; result = EC_Normal; } if (result.good() && (samplesPerPixel > 1)) { result = ditem->findAndGetUint16(DCM_PlanarConfiguration, planarConfiguration); } if (result.good()) { // check if bitsAllocated is a multiple of 8 - we don't handle anything else bytesAllocated = OFstatic_cast(Uint16, bitsAllocated / 8); if ((bitsAllocated < 8)||(bitsAllocated % 8 != 0)) result = EC_CannotChangeRepresentation; // make sure that all the descriptive attributes have sensible values if ((columns < 1)||(rows < 1)||(samplesPerPixel < 1)) result = EC_CannotChangeRepresentation; // an RLE stripe set can have at most 15 stripes, i.e. 15 bytes allocated per pixel numberOfStripes = bytesAllocated * samplesPerPixel; if (numberOfStripes > 15) result = EC_CannotChangeRepresentation; // make sure that we have at least as many bytes of pixel data as we expect if (numberOfStripes * columns * rows * numberOfFrames > length) result = EC_CannotChangeRepresentation; } DcmPixelSequence *pixelSequence = NULL; DcmPixelItem *offsetTable = NULL; // create initial pixel sequence if (result.good()) { pixelSequence = new DcmPixelSequence(DcmTag(DCM_PixelData,EVR_OB)); if (pixelSequence == NULL) result = EC_MemoryExhausted; else { // create empty offset table offsetTable = new DcmPixelItem(DcmTag(DCM_Item,EVR_OB)); if (offsetTable == NULL) result = EC_MemoryExhausted; else pixelSequence->insert(offsetTable); } } // byte swap pixel data to little endian if (gLocalByteOrder == EBO_BigEndian) { swapIfNecessary(EBO_LittleEndian, gLocalByteOrder, OFstatic_cast(void *, OFconst_cast(Uint16 *, pixelData)), length, sizeof(Uint16)); } // create RLE stripe sets if (result.good()) { const Uint32 bytesPerStripe = columns * rows; const Uint32 frameSize = columns * rows * samplesPerPixel * bytesAllocated; Uint32 frameOffset = 0; Uint32 sampleOffset = 0; Uint32 offsetBetweenSamples = 0; Uint32 sample = 0; Uint32 byte = 0; register Uint32 pixel = 0; register Uint32 columnCounter = 0; DcmRLEEncoder *rleEncoder = NULL; Uint32 rleSize = 0; Uint8 *rleData = NULL; Uint8 *rleData2 = NULL; // compute byte offset between samples if (planarConfiguration == 0) offsetBetweenSamples = samplesPerPixel * bytesAllocated; else offsetBetweenSamples = bytesAllocated; // loop through all frames of the image for (Uint32 currentFrame = 0; ((currentFrame < OFstatic_cast(Uint32, numberOfFrames)) && result.good()); currentFrame++) { // offset to start of frame, in bytes frameOffset = frameSize * currentFrame; // loop through all samples of one frame for (sample = 0; sample < samplesPerPixel; sample++) { // compute byte offset for first sample in frame if (planarConfiguration == 0) sampleOffset = sample * bytesAllocated; else sampleOffset = sample * bytesAllocated * columns * rows; // loop through the bytes of one sample for (byte = 0; byte < bytesAllocated; byte++) { pixelPointer = pixelData8 + frameOffset + sampleOffset + bytesAllocated - byte - 1; // initialize new RLE codec for this stripe rleEncoder = new DcmRLEEncoder(1 /* DICOM padding required */); if (rleEncoder) { rleEncoderList.push_back(rleEncoder); columnCounter = columns; // loop through all pixels of the frame for (pixel = 0; pixel < bytesPerStripe; ++pixel) { rleEncoder->add(*pixelPointer); // enforce DICOM rule that "Each row of the image shall be encoded // separately and not cross a row boundary." // (see DICOM part 5 section G.3.1) if (--columnCounter == 0) { rleEncoder->flush(); columnCounter = columns; } pixelPointer += offsetBetweenSamples; } rleEncoder->flush(); if (rleEncoder->fail()) result = EC_MemoryExhausted; } else result = EC_MemoryExhausted; } } // store frame and erase RLE codec list if (result.good() && (rleEncoderList.size() > 0) && (rleEncoderList.size() < 16)) { // compute size of compressed frame including RLE header // and populate RLE header for (i=0; i<16; i++) rleHeader[i] = 0; rleHeader[0] = rleEncoderList.size(); rleSize = 64; i = 1; first = rleEncoderList.begin(); while (first != last) { rleHeader[i++] = rleSize; rleSize += (*first)->size(); ++first; } // allocate buffer for compressed frame rleData = new Uint8[rleSize]; if (rleData) { // copy RLE header to compressed frame buffer swapIfNecessary(EBO_LittleEndian, gLocalByteOrder, rleHeader, 16*sizeof(Uint32), sizeof(Uint32)); memcpy(rleData, rleHeader, 64); // store RLE stripe sets in compressed frame buffer rleData2 = rleData + 64; first = rleEncoderList.begin(); while (first != last) { (*first)->write(rleData2); rleData2 += (*first)->size(); delete *first; first = rleEncoderList.erase(first); } // store compressed frame, breaking into segments if necessary result = pixelSequence->storeCompressedFrame(offsetList, rleData, rleSize, djcp->getFragmentSize()); compressedSize += rleSize; // erase buffer for compressed frame delete[] rleData; } else result = EC_MemoryExhausted; } else { // erase RLE codec list first = rleEncoderList.begin(); while (first != last) { delete *first; first = rleEncoderList.erase(first); } if (result.good()) result = EC_CannotChangeRepresentation; } } } // store pixel sequence if everything went well. if (result.good()) pixSeq = pixelSequence; else { delete pixelSequence; pixSeq = NULL; } if ((result.good()) && (djcp->getCreateOffsetTable())) { // create offset table result = offsetTable->createOffsetTable(offsetList); } // the following operations do not affect the Image Pixel Module // but other modules such as SOP Common. We only perform these // changes if we're on the main level of the dataset, // which should always identify itself as dataset, not as item. if (dataset->ident() == EVR_dataset) { if (result.good()) { // create new UID if mode is true or if we're converting to Secondary Capture if (djcp->getConvertToSC() || djcp->getUIDCreation()) { result = DcmCodec::newInstance(OFstatic_cast(DcmItem *, dataset), "DCM", "121320", "Uncompressed predecessor"); // set image type to DERIVED if (result.good()) result = updateImageType(OFstatic_cast(DcmItem *, dataset)); // update derivation description if (result.good()) { // compute original image size in bytes, ignoring any padding bits. double compressionRatio = 0.0; if (compressedSize > 0) compressionRatio = (OFstatic_cast(double, columns * rows * bitsAllocated * OFstatic_cast(Uint32, numberOfFrames) * samplesPerPixel) / 8.0) / compressedSize; result = updateDerivationDescription(OFstatic_cast(DcmItem *, dataset), compressionRatio); } } } // convert to Secondary Capture if requested by user. // This method creates a new SOP class UID, so it should be executed // after the call to newInstance() which creates a Source Image Sequence. if (result.good() && djcp->getConvertToSC()) result = DcmCodec::convertToSecondaryCapture(OFstatic_cast(DcmItem *, dataset)); } } // byte swap pixel data back to local endian if necessary if (byteSwapped) { swapIfNecessary(gLocalByteOrder, EBO_LittleEndian, OFstatic_cast(void *, OFconst_cast(Uint16 *, pixelData)), length, sizeof(Uint16)); } return result; } OFCondition DcmRLECodecEncoder::updateDerivationDescription( DcmItem *dataset, double ratio) { char buf[32]; // create new Derivation Description OFString derivationDescription = "Lossless RLE compression, compression ratio "; OFStandard::ftoa(buf, sizeof(buf), ratio, OFStandard::ftoa_uppercase, 0, 5); derivationDescription += buf; // append old Derivation Description, if any const char *oldDerivation = NULL; if ((dataset->findAndGetString(DCM_DerivationDescription, oldDerivation)).good() && oldDerivation) { derivationDescription += " ["; derivationDescription += oldDerivation; derivationDescription += "]"; if (derivationDescription.length() > 1024) { // ST is limited to 1024 characters, cut off tail derivationDescription.erase(1020); derivationDescription += "...]"; } } return dataset->putAndInsertString(DCM_DerivationDescription, derivationDescription.c_str()); } OFCondition DcmRLECodecEncoder::determineDecompressedColorModel( const DcmRepresentationParameter * /* fromParam */, DcmPixelSequence * /* fromPixSeq */, const DcmCodecParameter * /* cp */, DcmItem * /* dataset */, OFString & /* decompressedColorModel */) const { return EC_IllegalCall; } /* * CVS/RCS Log * $Log: dcrlecce.cc,v $ * Revision 1.16 2010-10-14 13:14:09 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.15 2010-03-01 09:08:45 uli * Removed some unnecessary include directives in the headers. * * Revision 1.14 2009-11-17 16:41:26 joergr * Added new method that allows for determining the color model of the * decompressed image. * * Revision 1.13 2009-11-04 09:58:10 uli * Switched to logging mechanism provided by the "new" oflog module * * Revision 1.12 2008-05-29 10:46:16 meichel * Implemented new method DcmPixelData::getUncompressedFrame * that permits frame-wise access to compressed and uncompressed * objects without ever loading the complete object into main memory. * For this new method to work with compressed images, all classes derived from * DcmCodec need to implement a new method decodeFrame(). For now, only * dummy implementations returning an error code have been defined. * * Revision 1.11 2005/12/08 15:41:30 meichel * Changed include path schema for all DCMTK header files * * Revision 1.10 2004/08/24 14:54:20 meichel * Updated compression helper methods. Image type is not set to SECONDARY * any more, support for the purpose of reference code sequence added. * * Revision 1.9 2004/02/04 16:43:42 joergr * Adapted type casts to new-style typecast operators defined in ofcast.h. * Removed acknowledgements with e-mail addresses from CVS log. * * Revision 1.8 2003/08/14 09:01:06 meichel * Adapted type casts to new-style typecast operators defined in ofcast.h * * Revision 1.7 2003/03/21 13:08:04 meichel * Minor code purifications for warnings reported by MSVC in Level 4 * * Revision 1.6 2002/12/04 10:41:01 meichel * Changed toolkit to use OFStandard::ftoa instead of sprintf for all * double to string conversions that are supposed to be locale independent * * Revision 1.5 2002/11/27 12:06:51 meichel * Adapted module dcmdata to use of new header file ofstdinc.h * * Revision 1.4 2002/08/27 16:55:56 meichel * Initial release of new DICOM I/O stream classes that add support for stream * compression (deflated little endian explicit VR transfer syntax) * * Revision 1.3 2002/07/18 12:15:40 joergr * Added explicit type casts to keep Sun CC 2.0.1 quiet. * * Revision 1.2 2002/06/27 15:15:43 meichel * Modified RLE encoder to make it usable for other purposes than * DICOM encoding as well (e.g. PostScript, TIFF) * * Revision 1.1 2002/06/06 14:52:41 meichel * Initial release of the new RLE codec classes * and the dcmcrle/dcmdrle tools in module dcmdata * * */ dcmtk-3.6.0/dcmdata/libsrc/dcvrds.cc0000644000310500011400000002504511461767147016532 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Gerd Ehlers, Andreas Barth * * Purpose: Implementation of class DcmDecimalString * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-27 09:18:31 $ * CVS/RCS Revision: $Revision: 1.28 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcvrds.h" #include "dcmtk/ofstd/ofstring.h" #include "dcmtk/ofstd/ofstd.h" #define MAX_DS_LENGTH 16 // ******************************** DcmDecimalString::DcmDecimalString(const DcmTag &tag, const Uint32 len) : DcmByteString(tag, len) { setMaxLength(MAX_DS_LENGTH); setNonSignificantChars(" \\"); } DcmDecimalString::DcmDecimalString(const DcmDecimalString &old) : DcmByteString(old) { } DcmDecimalString::~DcmDecimalString() { } DcmDecimalString &DcmDecimalString::operator=(const DcmDecimalString &obj) { DcmByteString::operator=(obj); return *this; } OFCondition DcmDecimalString::copyFrom(const DcmObject& rhs) { if (this != &rhs) { if (rhs.ident() != ident()) return EC_IllegalCall; *this = OFstatic_cast(const DcmDecimalString &, rhs); } return EC_Normal; } // ******************************** DcmEVR DcmDecimalString::ident() const { return EVR_DS; } OFCondition DcmDecimalString::checkValue(const OFString &vm, const OFBool /*oldFormat*/) { OFString strVal; /* get "raw value" without any modifications (if possible) */ OFCondition l_error = getStringValue(strVal); if (l_error.good()) l_error = DcmDecimalString::checkStringValue(strVal, vm); return l_error; } // ******************************** OFCondition DcmDecimalString::getFloat64(Float64 &doubleVal, const unsigned long pos) { /* get decimal string value */ OFString str; OFCondition l_error = getOFString(str, pos, OFTrue /*normalize*/); if (l_error.good()) { OFBool success = OFFalse; /* convert string to float value */ doubleVal = OFStandard::atof(str.c_str(), &success); if (!success) l_error = EC_CorruptedData; } return l_error; } OFCondition DcmDecimalString::getFloat64Vector(OFVector &doubleVals) { /* get stored value */ char *strVal = NULL; OFCondition l_error = getString(strVal); /* clear result variable */ doubleVals.clear(); if (l_error.good() && (strVal != NULL)) { /* determine number of stored values */ const unsigned long vm = getVM(); if (vm > 0) { char c; Float64 doubleVal; OFString doubleStr; char *p = strVal; OFBool success = OFFalse; /* avoid memory re-allocations by specifying the expected size */ doubleVals.reserve(vm); /* iterate over the string value and search for delimiters */ do { c = *p; if ((c == '\\') || (c == '\0')) { /* extract single value and convert it to floating point */ doubleStr.assign(strVal, p - strVal); doubleVal = OFStandard::atof(doubleStr.c_str(), &success); if (success) { /* store floating point value in result variable */ doubleVals.push_back(doubleVal); strVal = p + 1; } else { l_error = EC_CorruptedData; break; } } ++p; } while (c != '\0'); } } return l_error; } // ******************************** OFCondition DcmDecimalString::getOFString(OFString &stringVal, const unsigned long pos, OFBool normalize) { /* call inherited method */ OFCondition l_error = DcmByteString::getOFString(stringVal, pos); /* normalize string if required */ if (l_error.good() && normalize) normalizeString(stringVal, !MULTIPART, DELETE_LEADING, DELETE_TRAILING); return l_error; } // ******************************** OFCondition DcmDecimalString::writeXML(STD_NAMESPACE ostream &out, const size_t flags) { /* XML start tag: */ writeXMLStartTag(out, flags); /* write element value (if loaded) */ if (valueLoaded()) { /* get string data (without normalization) */ char *value = NULL; getString(value); if (value != NULL) { /* check whether conversion to XML markup string is required */ if (OFStandard::checkForMarkupConversion(value)) OFStandard::convertToMarkupStream(out, value); else out << value; } } /* XML end tag: */ writeXMLEndTag(out, flags); /* always report success */ return EC_Normal; } // ******************************** OFCondition DcmDecimalString::checkStringValue(const OFString &value, const OFString &vm) { return DcmByteString::checkStringValue(value, vm, "ds", 6, MAX_DS_LENGTH); } /* ** CVS/RCS Log: ** $Log: dcvrds.cc,v $ ** Revision 1.28 2010-10-27 09:18:31 joergr ** Added getFloat64Vector() method which allows for retrieving the stored ** floating point values more efficiently (especially when there are many ** values). ** ** Revision 1.27 2010-10-20 16:44:17 joergr ** Use type cast macros (e.g. OFstatic_cast) where appropriate. ** ** Revision 1.26 2010-10-14 13:14:10 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.25 2010-04-23 14:30:34 joergr ** Added new method to all VR classes which checks whether the stored value ** conforms to the VR definition and to the specified VM. ** ** Revision 1.24 2010-01-21 15:05:59 joergr ** Switched to new stream variant of method convertToMarkupString() where ** appropriate. ** ** Revision 1.23 2009-08-07 14:35:49 joergr ** Enhanced isEmpty() method by checking whether the data element value consists ** of non-significant characters only. ** ** Revision 1.22 2009-08-03 09:02:59 joergr ** Added methods that check whether a given string value conforms to the VR and ** VM definitions of the DICOM standards. ** ** Revision 1.21 2008-07-17 10:31:32 onken ** Implemented copyFrom() method for complete DcmObject class hierarchy, which ** permits setting an instance's value from an existing object. Implemented ** assignment operator where necessary. ** ** Revision 1.20 2007-06-29 14:17:49 meichel ** Code clean-up: Most member variables in module dcmdata are now private, ** not protected anymore. ** ** Revision 1.19 2006/10/13 10:08:19 joergr ** Enhanced performance of writeXML() for large multi-valued DS elements. ** ** Revision 1.18 2005/12/08 15:41:50 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.17 2004/01/16 13:49:00 joergr ** Removed acknowledgements with e-mail addresses from CVS log. ** ** Revision 1.16 2002/12/06 13:20:49 joergr ** Enhanced "print()" function by re-working the implementation and replacing ** the boolean "showFullData" parameter by a more general integer flag. ** Made source code formatting more consistent with other modules/files. ** ** Revision 1.15 2002/06/20 12:06:16 meichel ** Changed toolkit to use OFStandard::atof instead of atof, strtod or ** sscanf for all string to double conversions that are supposed to ** be locale independent ** ** Revision 1.14 2002/04/25 10:28:42 joergr ** Removed getOFStringArray() implementation. ** ** Revision 1.13 2001/09/25 17:19:56 meichel ** Adapted dcmdata to class OFCondition ** ** Revision 1.12 2001/06/01 15:49:15 meichel ** Updated copyright header ** ** Revision 1.11 2000/03/08 16:26:46 meichel ** Updated copyright header. ** ** Revision 1.10 1999/03/31 09:25:49 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.9 1998/11/12 16:48:23 meichel ** Implemented operator= for all classes derived from DcmObject. ** ** Revision 1.8 1997/08/29 13:11:45 andreas ** Corrected Bug in getOFStringArray Implementation ** ** Revision 1.7 1997/08/29 08:32:57 andreas ** - Added methods getOFString and getOFStringArray for all ** string VRs. These methods are able to normalise the value, i. e. ** to remove leading and trailing spaces. This will be done only if ** it is described in the standard that these spaces are not relevant. ** These methods do not test the strings for conformance, this means ** especially that they do not delete spaces where they are not allowed! ** getOFStringArray returns the string with all its parts separated by \ ** and getOFString returns only one value of the string. ** CAUTION: Currently getString returns a string with trailing ** spaces removed (if dcmEnableAutomaticInputDataCorrection == OFTrue) and ** truncates the original string (since it is not copied!). If you rely on this ** behaviour please change your application now. ** Future changes will ensure that getString returns the original ** string from the DICOM object (NULL terminated) inclusive padding. ** Currently, if you call getOF... before calling getString without ** normalisation, you can get the original string read from the DICOM object. ** ** Revision 1.6 1997/07/03 15:10:10 andreas ** - removed debugging functions Bdebug() and Edebug() since ** they write a static array and are not very useful at all. ** Cdebug and Vdebug are merged since they have the same semantics. ** The debugging functions in dcmdata changed their interfaces ** (see dcmdata/include/dcdebug.h) ** ** Revision 1.5 1997/07/03 10:22:45 andreas ** - corrected Bug in DcmDecimalString::getFloat64 ** ** Revision 1.4 1997/05/12 07:38:26 andreas ** - new get-Methods for DcmDecimalString: getFloat64 and ** DcmIntegerString: getSint32 ** ** Revision 1.3 1996/01/05 13:27:47 andreas ** - changed to support new streaming facilities ** - unique read/write methods for file and block transfer ** - more cleanups ** */ dcmtk-3.6.0/dcmdata/libsrc/dcvrss.cc0000644000310500011400000003124611457616141016541 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Gerd Ehlers, Andreas Barth * * Purpose: Implementation of class DcmSignedShort * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-20 16:44:17 $ * CVS/RCS Revision: $Revision: 1.31 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/ofstd/ofstream.h" #include "dcmtk/dcmdata/dcvrss.h" #include "dcmtk/dcmdata/dcvm.h" #define INCLUDE_CSTDIO #define INCLUDE_CSTRING #include "dcmtk/ofstd/ofstdinc.h" // ******************************** DcmSignedShort::DcmSignedShort(const DcmTag &tag, const Uint32 len) : DcmElement(tag, len) { } DcmSignedShort::DcmSignedShort(const DcmSignedShort &old) : DcmElement(old) { } DcmSignedShort::~DcmSignedShort() { } DcmSignedShort &DcmSignedShort::operator=(const DcmSignedShort &obj) { DcmElement::operator=(obj); return *this; } OFCondition DcmSignedShort::copyFrom(const DcmObject& rhs) { if (this != &rhs) { if (rhs.ident() != ident()) return EC_IllegalCall; *this = OFstatic_cast(const DcmSignedShort &, rhs); } return EC_Normal; } // ******************************** DcmEVR DcmSignedShort::ident() const { return EVR_SS; } OFCondition DcmSignedShort::checkValue(const OFString &vm, const OFBool /*oldFormat*/) { /* check VM only */ return DcmElement::checkVM(getVM(), vm); } unsigned long DcmSignedShort::getVM() { return getLengthField() / sizeof(Sint16); } // ******************************** void DcmSignedShort::print(STD_NAMESPACE ostream&out, const size_t flags, const int level, const char * /*pixelFileName*/, size_t * /*pixelCounter*/) { if (valueLoaded()) { /* get signed integer data */ Sint16 *sintVals; errorFlag = getSint16Array(sintVals); if (sintVals != NULL) { const unsigned long count = getVM(); const unsigned long maxLength = (flags & DCMTypes::PF_shortenLongTagValues) ? DCM_OptPrintLineLength : OFstatic_cast(unsigned long, -1) /*unlimited*/; unsigned long printedLength = 0; unsigned long newLength = 0; char buffer[32]; /* print line start with tag and VR */ printInfoLineStart(out, flags, level); /* print multiple values */ for (unsigned int i = 0; i < count; i++, sintVals++) { /* check whether first value is printed (omit delimiter) */ if (i == 0) sprintf(buffer, "%hd", *sintVals); else sprintf(buffer, "\\%hd", *sintVals); /* check whether current value sticks to the length limit */ newLength = printedLength + strlen(buffer); if ((newLength <= maxLength) && ((i + 1 == count) || (newLength + 3 <= maxLength))) { out << buffer; printedLength = newLength; } else { /* check whether output has been truncated */ if (i + 1 < count) { out << "..."; printedLength += 3; } break; } } /* print line end with length, VM and tag name */ printInfoLineEnd(out, flags, printedLength); } else printInfoLine(out, flags, level, "(no value available)"); } else printInfoLine(out, flags, level, "(not loaded)"); } // ******************************** OFCondition DcmSignedShort::getSint16(Sint16 &sintVal, const unsigned long pos) { /* get signed integer data */ Sint16 *sintValues = NULL; errorFlag = getSint16Array(sintValues); /* check data before returning */ if (errorFlag.good()) { if (sintValues == NULL) errorFlag = EC_IllegalCall; else if (pos >= getVM()) errorFlag = EC_IllegalParameter; else sintVal = sintValues[pos]; } /* clear value in case of error */ if (errorFlag.bad()) sintVal = 0; return errorFlag; } OFCondition DcmSignedShort::getSint16Array(Sint16 *&sintVals) { sintVals = OFstatic_cast(Sint16 *, getValue()); return errorFlag; } // ******************************** OFCondition DcmSignedShort::getOFString(OFString &stringVal, const unsigned long pos, OFBool /*normalize*/) { Sint16 sintVal; /* get the specified numeric value */ errorFlag = getSint16(sintVal, pos); if (errorFlag.good()) { /* ... and convert it to a character string */ char buffer[32]; sprintf(buffer, "%i", sintVal); /* assign result */ stringVal = buffer; } return errorFlag; } // ******************************** OFCondition DcmSignedShort::putSint16(const Sint16 sintVal, const unsigned long pos) { Sint16 val = sintVal; errorFlag = changeValue(&val, sizeof(Sint16) * pos, sizeof(Sint16)); return errorFlag; } OFCondition DcmSignedShort::putSint16Array(const Sint16 *sintVals, const unsigned long numSints) { errorFlag = EC_Normal; if (numSints > 0) { /* check for valid data */ if (sintVals != NULL) errorFlag = putValue(sintVals, sizeof(Sint16) * OFstatic_cast(Uint32, numSints)); else errorFlag = EC_CorruptedData; } else errorFlag = putValue(NULL, 0); return errorFlag; } // ******************************** OFCondition DcmSignedShort::putString(const char *stringVal) { errorFlag = EC_Normal; /* check input string */ if ((stringVal != NULL) && (strlen(stringVal) > 0)) { const unsigned long vm = getVMFromString(stringVal); if (vm > 0) { Sint16 *field = new Sint16[vm]; const char *s = stringVal; char *value; /* retrieve signed integer data from character string */ for (unsigned long i = 0; (i < vm) && errorFlag.good(); i++) { /* get first value stored in 's', set 's' to beginning of the next value */ value = getFirstValueFromString(s); if ((value == NULL) || (sscanf(value, "%hd", &field[i]) != 1)) errorFlag = EC_CorruptedData; delete[] value; } /* set binary data as the element value */ if (errorFlag.good()) errorFlag = putSint16Array(field, vm); /* delete temporary buffer */ delete[] field; } else errorFlag = putValue(NULL, 0); } else errorFlag = putValue(NULL, 0); return errorFlag; } // ******************************** OFCondition DcmSignedShort::verify(const OFBool autocorrect) { /* check for valid value length */ if (getLengthField() % (sizeof(Sint16)) != 0) { errorFlag = EC_CorruptedData; if (autocorrect) { /* strip to valid length */ setLengthField(getLengthField() - (getLengthField() % (sizeof(Sint16)))); } } else errorFlag = EC_Normal; return errorFlag; } /* ** CVS/RCS Log: ** $Log: dcvrss.cc,v $ ** Revision 1.31 2010-10-20 16:44:17 joergr ** Use type cast macros (e.g. OFstatic_cast) where appropriate. ** ** Revision 1.30 2010-10-14 13:14:10 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.29 2010-04-23 14:30:35 joergr ** Added new method to all VR classes which checks whether the stored value ** conforms to the VR definition and to the specified VM. ** ** Revision 1.28 2008-07-17 10:31:32 onken ** Implemented copyFrom() method for complete DcmObject class hierarchy, which ** permits setting an instance's value from an existing object. Implemented ** assignment operator where necessary. ** ** Revision 1.27 2007-06-29 14:17:49 meichel ** Code clean-up: Most member variables in module dcmdata are now private, ** not protected anymore. ** ** Revision 1.26 2006/08/15 15:49:54 meichel ** Updated all code in module dcmdata to correctly compile when ** all standard C++ classes remain in namespace std. ** ** Revision 1.25 2005/12/08 15:42:03 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.24 2004/02/04 16:07:15 joergr ** Adapted type casts to new-style typecast operators defined in ofcast.h. ** Removed acknowledgements with e-mail addresses from CVS log. ** ** Revision 1.23 2002/12/06 13:12:38 joergr ** Enhanced "print()" function by re-working the implementation and replacing ** the boolean "showFullData" parameter by a more general integer flag. ** Made source code formatting more consistent with other modules/files. ** ** Revision 1.22 2002/11/27 12:06:58 meichel ** Adapted module dcmdata to use of new header file ofstdinc.h ** ** Revision 1.21 2002/04/25 10:33:20 joergr ** Added getOFString() implementation. ** ** Revision 1.20 2002/04/16 13:43:26 joergr ** Added configurable support for C++ ANSI standard includes (e.g. streams). ** ** Revision 1.19 2001/09/25 17:20:00 meichel ** Adapted dcmdata to class OFCondition ** ** Revision 1.18 2001/06/01 15:49:20 meichel ** Updated copyright header ** ** Revision 1.17 2000/04/14 15:55:09 meichel ** Dcmdata library code now consistently uses ofConsole for error output. ** ** Revision 1.16 2000/03/08 16:26:50 meichel ** Updated copyright header. ** ** Revision 1.15 2000/03/03 14:05:40 meichel ** Implemented library support for redirecting error messages into memory ** instead of printing them to stdout/stderr for GUI applications. ** ** Revision 1.14 2000/02/10 10:52:25 joergr ** Added new feature to dcmdump (enhanced print method of dcmdata): write ** pixel data/item value fields to raw files. ** ** Revision 1.13 2000/02/02 14:32:59 joergr ** Replaced 'delete' statements by 'delete[]' for objects created with 'new[]'. ** ** Revision 1.12 1999/03/31 09:25:58 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.11 1997/07/21 08:25:34 andreas ** - Replace all boolean types (BOOLEAN, CTNBOOLEAN, DICOM_BOOL, BOOL) ** with one unique boolean type OFBool. ** ** Revision 1.10 1997/07/03 15:10:18 andreas ** - removed debugging functions Bdebug() and Edebug() since ** they write a static array and are not very useful at all. ** Cdebug and Vdebug are merged since they have the same semantics. ** The debugging functions in dcmdata changed their interfaces ** (see dcmdata/include/dcdebug.h) ** ** Revision 1.9 1997/04/18 08:10:53 andreas ** - Corrected debugging code ** - The put/get-methods for all VRs did not conform to the C++-Standard ** draft. Some Compilers (e.g. SUN-C++ Compiler, Metroworks ** CodeWarrier, etc.) create many warnings concerning the hiding of ** overloaded get methods in all derived classes of DcmElement. ** So the interface of all value representation classes in the ** library are changed rapidly, e.g. ** OFCondition get(Uint16 & value, const unsigned long pos); ** becomes ** OFCondition getUint16(Uint16 & value, const unsigned long pos); ** All (retired) "returntype get(...)" methods are deleted. ** For more information see dcmdata/include/dcelem.h ** ** Revision 1.8 1996/08/05 08:46:22 andreas ** new print routine with additional parameters: ** - print into files ** - fix output length for elements ** corrected error in search routine with parameter ESM_fromStackTop ** ** Revision 1.7 1996/05/20 13:27:52 andreas ** correct minor bug in print routine ** ** Revision 1.6 1996/04/16 16:05:26 andreas ** - better support und bug fixes for NULL element value ** ** Revision 1.5 1996/03/26 09:59:38 meichel ** corrected bug (deletion of const char *) which prevented compilation on NeXT ** ** Revision 1.4 1996/01/29 13:38:34 andreas ** - new put method for every VR to put value as a string ** - better and unique print methods ** ** Revision 1.3 1996/01/05 13:27:53 andreas ** - changed to support new streaming facilities ** - unique read/write methods for file and block transfer ** - more cleanups ** */ dcmtk-3.6.0/dcmdata/libsrc/dcostrmb.cc0000644000310500011400000000741411455601040017040 0ustar joergrdicom3/* * * Copyright (C) 2002-2010, 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: dcmdata * * Author: Marco Eichelberg * * Purpose: DcmOutputBufferStream and related classes, * implements output to blocks of memory as needed in the dcmnet module. * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:14:08 $ * CVS/RCS Revision: $Revision: 1.10 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" #include "dcmtk/dcmdata/dcostrmb.h" #include "dcmtk/dcmdata/dcerror.h" DcmBufferConsumer::DcmBufferConsumer(void *buf, offile_off_t bufLen) : DcmConsumer() , buffer_(OFstatic_cast(unsigned char *, buf)) , bufSize_(bufLen) , filled_(0) , status_(EC_Normal) { if ((buffer_ == NULL) || (bufSize_ == 0)) status_ = EC_IllegalCall; } DcmBufferConsumer::~DcmBufferConsumer() { } OFBool DcmBufferConsumer::good() const { return status_.good(); } OFCondition DcmBufferConsumer::status() const { return status_; } OFBool DcmBufferConsumer::isFlushed() const { return (filled_ == 0); } offile_off_t DcmBufferConsumer::avail() const { return bufSize_ - filled_; } offile_off_t DcmBufferConsumer::write(const void *buf, offile_off_t buflen) { offile_off_t result = 0; if (status_.good() && buf && buflen) { result = bufSize_ - filled_; if (result > buflen) result = buflen; memcpy(buffer_+ filled_, buf, OFstatic_cast(size_t, result)); filled_ += result; } return result; } void DcmBufferConsumer::flush() { // nothing to flush } void DcmBufferConsumer::flushBuffer(void *& buffer, offile_off_t& length) { buffer = buffer_; length = filled_; filled_ = 0; } /* ======================================================================= */ DcmOutputBufferStream::DcmOutputBufferStream(void *buf, offile_off_t bufLen) : DcmOutputStream(&consumer_) // safe because DcmOutputStream only stores pointer , consumer_(buf, bufLen) { } DcmOutputBufferStream::~DcmOutputBufferStream() { #ifdef DEBUG if (! isFlushed()) { DCMDATA_WARN("DcmOutputBufferStream: Closing unflushed DcmOutputBufferStream, loss of data!"); } #endif } void DcmOutputBufferStream::flushBuffer(void *& buffer, offile_off_t& length) { consumer_.flushBuffer(buffer, length); } /* * CVS/RCS Log: * $Log: dcostrmb.cc,v $ * Revision 1.10 2010-10-14 13:14:08 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.9 2010-02-22 11:39:54 uli * Remove some unneeded includes. * * Revision 1.8 2009-12-04 17:10:00 joergr * Slightly modified some log messages. * * Revision 1.7 2009-11-04 09:58:10 uli * Switched to logging mechanism provided by the "new" oflog module * * Revision 1.6 2007-02-19 16:06:10 meichel * Class DcmOutputStream and related classes are now safe for use with * large files (2 GBytes or more) if supported by compiler and operating system. * * Revision 1.5 2006/08/15 15:49:54 meichel * Updated all code in module dcmdata to correctly compile when * all standard C++ classes remain in namespace std. * * Revision 1.4 2005/12/08 15:41:21 meichel * Changed include path schema for all DCMTK header files * * Revision 1.3 2004/02/04 16:36:47 joergr * Adapted type casts to new-style typecast operators defined in ofcast.h. * * Revision 1.2 2002/09/19 08:32:28 joergr * Added explicit type casts to keep Sun CC 2.0.1 quiet. * * Revision 1.1 2002/08/27 16:55:53 meichel * Initial release of new DICOM I/O stream classes that add support for stream * compression (deflated little endian explicit VR transfer syntax) * * */ dcmtk-3.6.0/dcmdata/libsrc/dcdirrec.cc0000644000310500011400000014704711465001164017013 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Gerd Ehlers, Andreas Barth * * Purpose: Implementation of class DcmDirectoryRecord * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-11-05 13:11:16 $ * CVS/RCS Revision: $Revision: 1.78 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #define INCLUDE_CSTDLIB #define INCLUDE_CSTDIO #define INCLUDE_CSTRING #define INCLUDE_CERRNO #define INCLUDE_CCTYPE #define INCLUDE_LIBC #define INCLUDE_UNISTD #include "dcmtk/ofstd/ofstdinc.h" #include "dcmtk/ofstd/ofstream.h" #include "dcmtk/ofstd/ofcast.h" #include "dcmtk/dcmdata/dcdirrec.h" #include "dcmtk/dcmdata/dctk.h" #include "dcmtk/dcmdata/dcxfer.h" #include "dcmtk/dcmdata/dcvr.h" #include "dcmtk/dcmdata/dcvrus.h" #ifdef HAVE_UNIX_H #if defined(macintosh) && defined (HAVE_WINSOCK_H) /* unix.h defines timeval incompatible with winsock.h */ #define timeval _UNWANTED_timeval #endif #include /* for unlink() under Metrowerks C++ (Macintosh) */ #undef timeval #endif // ******************************** static const char *DRTypeNames[] = { "root", "CURVE", "FILM BOX", "FILM SESSION", "IMAGE", "IMAGE BOX", "INTERPRETATION", "MODALITY LUT", "MRDR", "OVERLAY", "PATIENT", "PRINT QUEUE", "PRIVATE", "RESULTS", "SERIES", "STUDY", "STUDY COMPONENT", "TOPIC", "VISIT", "VOI LUT", "SR DOCUMENT", /* was "STRUCT REPORT" in old frozen draft */ "PRESENTATION", "WAVEFORM", "RT DOSE", "RT STRUCTURE SET", "RT PLAN", "RT TREAT RECORD", "STORED PRINT", "KEY OBJECT DOC", "REGISTRATION", "FIDUCIAL", "RAW DATA", "SPECTROSCOPY", "ENCAP DOC", "VALUE MAP", "HANGING PROTOCOL", "STEREOMETRIC", "HL7 STRUC DOC", "PALETTE", "SURFACE", "MEASUREMENT", "IMPLANT", "IMPLANT GROUP", "IMPLANT ASSY" }; static const short DIM_OF_DRTypeNames = (sizeof(DRTypeNames) / sizeof(DRTypeNames[0])); // ******************************** DcmDirectoryRecord::DcmDirectoryRecord() : DcmItem(ItemTag), recordsOriginFile(NULL), lowerLevelList(new DcmSequenceOfItems(DCM_DirectoryRecordSequence)), DirRecordType(ERT_Private), referencedMRDR(NULL), numberOfReferences(0), offsetInFile(0) { } // ******************************** DcmDirectoryRecord::DcmDirectoryRecord(const DcmTag &tag, const Uint32 len) : DcmItem(tag, len), recordsOriginFile(NULL), lowerLevelList(new DcmSequenceOfItems(DCM_DirectoryRecordSequence)), DirRecordType(ERT_Private), referencedMRDR(NULL), numberOfReferences(0), offsetInFile(0) { } // ******************************** DcmDirectoryRecord::DcmDirectoryRecord(const E_DirRecType recordType, const char *referencedFileID, const char *sourceFilename) : DcmItem(ItemTag), recordsOriginFile(NULL), lowerLevelList(new DcmSequenceOfItems(DCM_DirectoryRecordSequence)), DirRecordType(recordType), referencedMRDR(NULL), numberOfReferences(0), offsetInFile(0) { setRecordsOriginFile(sourceFilename); if (DirRecordType != ERT_root) errorFlag = fillElementsAndReadSOP(referencedFileID, sourceFilename); } // ******************************** DcmDirectoryRecord::DcmDirectoryRecord(const char *recordTypeName, const char *referencedFileID, const char *sourceFilename) : DcmItem(ItemTag), recordsOriginFile(NULL), lowerLevelList(new DcmSequenceOfItems(DCM_DirectoryRecordSequence)), DirRecordType(ERT_Private), referencedMRDR(NULL), numberOfReferences(0), offsetInFile(0) { DirRecordType = recordNameToType(recordTypeName); setRecordsOriginFile(sourceFilename); if (DirRecordType != ERT_root) errorFlag = fillElementsAndReadSOP(referencedFileID, sourceFilename); } // ******************************** DcmDirectoryRecord::DcmDirectoryRecord(const DcmDirectoryRecord &old) : DcmItem(old), recordsOriginFile(old.recordsOriginFile), lowerLevelList(new DcmSequenceOfItems(*old.lowerLevelList)), DirRecordType(old.DirRecordType), referencedMRDR(old.referencedMRDR), numberOfReferences(old.numberOfReferences), offsetInFile(old.offsetInFile) { } // ******************************** DcmDirectoryRecord& DcmDirectoryRecord::operator=(const DcmDirectoryRecord& obj) { if (this != &obj) { // copy parent's member variables DcmItem::operator=(obj); // copy DcmDirectoryRecords' member variables recordsOriginFile = obj.recordsOriginFile; lowerLevelList = new DcmSequenceOfItems(*obj.lowerLevelList); DirRecordType = obj.DirRecordType; referencedMRDR = obj.referencedMRDR; numberOfReferences = obj.numberOfReferences; offsetInFile = obj.offsetInFile; } return *this; } // ******************************** OFCondition DcmDirectoryRecord::copyFrom(const DcmObject& rhs) { if (this != &rhs) { if (rhs.ident() != ident()) return EC_IllegalCall; *this = OFstatic_cast(const DcmDirectoryRecord &, rhs); } return EC_Normal; } // ******************************** DcmDirectoryRecord::~DcmDirectoryRecord() { delete lowerLevelList; delete[] recordsOriginFile; } // ******************************** E_DirRecType DcmDirectoryRecord::recordNameToType(const char *recordTypeName) { E_DirRecType recType = ERT_Private; if (recordTypeName != NULL) { short i = 0; while (i < DIM_OF_DRTypeNames && strcmp(DRTypeNames[i], recordTypeName) != 0) i++; if (i < DIM_OF_DRTypeNames && strcmp(DRTypeNames[i], recordTypeName) == 0) recType = OFstatic_cast(E_DirRecType, i); else if (strcmp(recordTypeName,"STRUCT REPORT") == 0) recType = ERT_SRDocument; // we recognise the old name as well DCMDATA_TRACE("DcmDirectoryRecord::recordNameToType() input char*=\"" << recordTypeName << "\" output enum=" << recType); } return recType; } // ******************************** char *DcmDirectoryRecord::buildFileName(const char *origName, char *destName) { const char *from = origName; char *to = destName; char c; char lastchar = '\0'; while ((c = *from++) != 0) { if (c == '\\') { if (lastchar != '\\') // eliminate double '\\' *to++ = PATH_SEPARATOR; } else { *to++ = c; } lastchar = c; } *to = '\0'; /* ** Some OS's append a '.' to the filename of a ISO9660 filesystem. ** If the filename does not exist then try appending a '.' */ FILE* f = NULL; if ((f = fopen(destName, "rb")) != NULL) { fclose(f); } else { char* newname = new char[strlen(destName) + 2]; strcpy(newname, destName); strcat(newname, "."); if ((f = fopen(newname, "rb")) != NULL) { fclose(f); strcpy(destName, newname); } else { /* we cannot find the file. let the caller deal with this */ } } return destName; } // ******************************** OFCondition DcmDirectoryRecord::checkHierarchy(const E_DirRecType upperRecord, const E_DirRecType lowerRecord) { OFCondition l_error = EC_IllegalCall; switch (upperRecord) { case ERT_root: switch (lowerRecord) { case ERT_Patient: case ERT_PrintQueue: case ERT_Topic: case ERT_HangingProtocol: case ERT_Palette: case ERT_Implant: case ERT_ImplantGroup: case ERT_ImplantAssy: case ERT_Private: l_error = EC_Normal; break; default: l_error = EC_IllegalCall; break; } break; case ERT_FilmBox: switch (lowerRecord) { case ERT_ImageBox: case ERT_Private: l_error = EC_Normal; break; default: l_error = EC_IllegalCall; break; } break; case ERT_FilmSession: switch (lowerRecord) { case ERT_FilmBox: case ERT_Private: l_error = EC_Normal; break; default: l_error = EC_IllegalCall; break; } break; case ERT_Patient: switch (lowerRecord) { case ERT_Study: case ERT_HL7StrucDoc: case ERT_Private: l_error = EC_Normal; break; default: l_error = EC_IllegalCall; break; } break; case ERT_PrintQueue: switch (lowerRecord) { case ERT_FilmSession: case ERT_Private: l_error = EC_Normal; break; default: l_error = EC_IllegalCall; break; } break; case ERT_Results: switch (lowerRecord) { case ERT_Interpretation: case ERT_Private: l_error = EC_Normal; break; default: l_error = EC_IllegalCall; break; } break; case ERT_Series: switch (lowerRecord) { case ERT_Curve: case ERT_Image: case ERT_ModalityLut: case ERT_Overlay: case ERT_VoiLut: case ERT_SRDocument: case ERT_Presentation: case ERT_Waveform: case ERT_RTDose: case ERT_RTStructureSet: case ERT_RTPlan: case ERT_RTTreatRecord: case ERT_StoredPrint: case ERT_KeyObjectDoc: case ERT_Registration: case ERT_Fiducial: case ERT_RawData: case ERT_Spectroscopy: case ERT_EncapDoc: case ERT_ValueMap: case ERT_Stereometric: case ERT_Surface: case ERT_Measurement: case ERT_Private: l_error = EC_Normal; break; default: l_error = EC_IllegalCall; break; } break; case ERT_Study: switch (lowerRecord) { case ERT_FilmSession: case ERT_Results: case ERT_Series: case ERT_StudyComponent: case ERT_Visit: case ERT_Private: l_error = EC_Normal; break; default: l_error = EC_IllegalCall; break; } break; case ERT_Topic: switch (lowerRecord) { case ERT_Curve: case ERT_FilmSession: case ERT_Image: case ERT_ModalityLut: case ERT_Overlay: case ERT_Series: case ERT_Study: case ERT_VoiLut: case ERT_SRDocument: case ERT_Presentation: case ERT_Waveform: case ERT_RTDose: case ERT_RTStructureSet: case ERT_RTPlan: case ERT_RTTreatRecord: case ERT_StoredPrint: case ERT_KeyObjectDoc: case ERT_Registration: case ERT_Fiducial: case ERT_RawData: case ERT_Spectroscopy: case ERT_Private: l_error = EC_Normal; break; default: l_error = EC_IllegalCall; break; } break; case ERT_Mrdr: l_error = EC_IllegalCall; break; case ERT_Curve: case ERT_Image: case ERT_ImageBox: case ERT_Interpretation: case ERT_ModalityLut: case ERT_Overlay: case ERT_StudyComponent: case ERT_Visit: case ERT_VoiLut: case ERT_SRDocument: case ERT_Presentation: case ERT_Waveform: case ERT_RTDose: case ERT_RTStructureSet: case ERT_RTPlan: case ERT_RTTreatRecord: case ERT_StoredPrint: case ERT_KeyObjectDoc: case ERT_Registration: case ERT_Fiducial: case ERT_RawData: case ERT_Spectroscopy: case ERT_EncapDoc: case ERT_ValueMap: case ERT_HangingProtocol: case ERT_Stereometric: case ERT_HL7StrucDoc: case ERT_Palette: case ERT_Surface: case ERT_Measurement: case ERT_Implant: case ERT_ImplantGroup: case ERT_ImplantAssy: case ERT_Private: switch (lowerRecord) { case ERT_Private: l_error = EC_Normal; break; default: l_error = EC_IllegalCall; break; } break; default: l_error = EC_Normal; break; } return l_error; } // ******************************** OFCondition DcmDirectoryRecord::setRecordType(E_DirRecType newType) { OFCondition l_error = EC_Normal; DcmTag dirRecTag(DCM_DirectoryRecordType); DcmCodeString *csP = new DcmCodeString(dirRecTag); csP->putString(DRTypeNames[newType]); insert(csP, OFTrue); return l_error; } // ******************************** E_DirRecType DcmDirectoryRecord::lookForRecordType() { E_DirRecType localType = ERT_Private; if (!elementList->empty()) { DcmStack stack; if (search(DCM_DirectoryRecordType, stack, ESM_fromHere, OFFalse).good()) { if (stack.top()->ident() == EVR_CS) { char *recName = NULL; DcmCodeString *recType = OFstatic_cast(DcmCodeString *, stack.top()); recType->verify(OFTrue); // force dealignment recType->getString(recName); localType = recordNameToType(recName); DCMDATA_TRACE("DcmDirectoryRecord::lookForRecordType() RecordType Element (" << STD_NAMESPACE hex << STD_NAMESPACE setfill('0') << STD_NAMESPACE setw(4) << recType->getGTag() << "," << STD_NAMESPACE setw(4) << recType->getETag() << ") Type = " << DRTypeNames[DirRecordType]); } } } return localType; } // ******************************** static void hostToDicomFilename(char *fname) { /* ** Massage filename into dicom format. ** Elmiminate any invalid characters. ** Most commonly there is a '.' at the end of a filename. */ int len = strlen(fname); int k = 0; char c = '\0'; for (int i = 0; i < len; i++) { c = OFstatic_cast(unsigned char, fname[i]); /* the PATH_SEPARATOR depends on the OS (see ) */ if (c == PATH_SEPARATOR) { fname[k++] = '\\'; } else if (isalpha(c) || isdigit(c) || (c == '_') || (c == '\\')) { /* filenames in DICOM must always be in uppercase */ fname[k++] = OFstatic_cast(char, toupper(c)); } } fname[k] = '\0'; } OFCondition DcmDirectoryRecord::setReferencedFileID(const char *referencedFileID) { OFCondition l_error = EC_Normal; char* newFname = new char[strlen(referencedFileID) + 1]; strcpy(newFname, referencedFileID); hostToDicomFilename(newFname); DcmTag refFileTag(DCM_ReferencedFileID); DcmCodeString *csP = new DcmCodeString(refFileTag); if (referencedFileID != NULL) csP->putString(newFname); insert(csP, OFTrue); delete[] newFname; return l_error; } // ******************************** const char *DcmDirectoryRecord::lookForReferencedFileID() { char *localFile = NULL; if (!elementList->empty()) { DcmStack stack; if (search(DCM_ReferencedFileID, stack, ESM_fromHere, OFFalse).good()) { if (stack.top()->ident() == EVR_CS) { DcmCodeString *refFile = OFstatic_cast(DcmCodeString *, stack.top()); refFile->verify(OFTrue); // force dealignment refFile->getString(localFile); if (localFile != NULL && *localFile == '\0') localFile = NULL; } } } DCMDATA_TRACE("DcmDirectoryRecord::lookForReferencedFileID() ReferencedFileID = " << ((localFile) ? localFile : "")); return localFile; } // ******************************** DcmDirectoryRecord *DcmDirectoryRecord::lookForReferencedMRDR() { DcmDirectoryRecord *localMRDR = NULL; if (!elementList->empty()) { DcmStack stack; if (search(DCM_RETIRED_MRDRDirectoryRecordOffset, stack, ESM_fromHere, OFFalse).good()) { if (stack.top()->ident() == EVR_up) { DcmUnsignedLongOffset *offElem; offElem = OFstatic_cast(DcmUnsignedLongOffset *, stack.top()); localMRDR = OFstatic_cast(DcmDirectoryRecord *, offElem->getNextRecord()); #ifdef DEBUG Uint32 l_uint = 0; offElem->getUint32(l_uint); DCMDATA_TRACE("DcmDirectoryRecord::lookForReferencedMRDR() MRDR Offset Element (" << STD_NAMESPACE hex << STD_NAMESPACE setfill('0') << STD_NAMESPACE setw(4) << offElem->getGTag() << "," << STD_NAMESPACE setw(4) << offElem->getETag() << ") offs=0x" << STD_NAMESPACE setw(8) << l_uint << " p=" << OFstatic_cast(void *, offElem) << " n=" << OFstatic_cast(void *, localMRDR)); #endif } } } if (localMRDR == NULL) DCMDATA_TRACE("DcmDirectoryRecord::lookForReferencedMRDR() no ReferencedMRDR found"); return localMRDR; } // ******************************** const char *DcmDirectoryRecord::getReferencedFileName() { const char *localFile = NULL; if (referencedMRDR != NULL) localFile = referencedMRDR->lookForReferencedFileID(); else localFile = lookForReferencedFileID(); return localFile; } // ******************************** OFCondition DcmDirectoryRecord::setRecordInUseFlag(const Uint16 newFlag) { OFCondition l_error = EC_Normal; DcmTag recInUseTag(DCM_RecordInUseFlag); DcmUnsignedShort *usP = new DcmUnsignedShort(recInUseTag); usP->putUint16(newFlag); insert(usP, OFTrue); return l_error; } // ******************************** Uint16 DcmDirectoryRecord::lookForRecordInUseFlag() { Uint16 localFlag = Uint16(0xffff); // default value: Record is in use if (!elementList->empty()) { DcmStack stack; if (search(DCM_RecordInUseFlag, stack, ESM_fromHere, OFFalse).good()) { if (stack.top()->ident() == EVR_US) errorFlag = OFstatic_cast(DcmUnsignedShort *, stack.top())->getUint16(localFlag); } } return localFlag; } // ******************************** Uint32 DcmDirectoryRecord::getFileOffset() const { return offsetInFile; } // ******************************** Uint32 DcmDirectoryRecord::setFileOffset(Uint32 position) { offsetInFile = position; return position; } // ******************************** OFCondition DcmDirectoryRecord::setNumberOfReferences(Uint32 newRefNum) { OFCondition l_error = EC_Normal; if (DirRecordType == ERT_Mrdr) { // insert new value DcmTag numRefTag(DCM_RETIRED_NumberOfReferences); DcmUnsignedLong *newUL = new DcmUnsignedLong(numRefTag); newUL->putUint32(newRefNum); insert(newUL, OFTrue); } else { errorFlag = EC_IllegalCall; DCMDATA_ERROR("illegal usage of DcmDirectoryRecord::setNumberOfReferences() - RecordType must be MRDR"); } return l_error; } // ******************************** Uint32 DcmDirectoryRecord::lookForNumberOfReferences() { Uint32 localRefNum = 0L; if (!elementList->empty()) { DcmStack stack; if (search(DCM_RETIRED_NumberOfReferences, stack, ESM_fromHere, OFFalse).good()) { if (stack.top()->ident() == EVR_UL) errorFlag = OFstatic_cast(DcmUnsignedLong *, stack.top())->getUint32(localRefNum); } } return localRefNum; } // ******************************** Uint32 DcmDirectoryRecord::increaseRefNum() { if (DirRecordType == ERT_Mrdr) { if (numberOfReferences == 0L) setRecordInUseFlag(0xffff); // activate record numberOfReferences++; errorFlag = setNumberOfReferences(numberOfReferences); } else { errorFlag = EC_IllegalCall; DCMDATA_ERROR("illegal usage of DcmDirectoryRecord::increaseRefNum() - RecordType must be MRDR"); } return numberOfReferences; } // ******************************** Uint32 DcmDirectoryRecord::decreaseRefNum() { if (DirRecordType == ERT_Mrdr) { if (numberOfReferences > 0) { numberOfReferences--; if (numberOfReferences == 0L) setRecordInUseFlag(0x0000); // deactivate record errorFlag = setNumberOfReferences(numberOfReferences); } else { errorFlag = EC_IllegalCall; DCMDATA_WARN("DcmDirectoryRecord::decreaseRefNum() attempt to decrease value lower than zero"); } } else { errorFlag = EC_IllegalCall; DCMDATA_ERROR("illegal usage of DcmDirectoryRecord::decreaseRefNum() - RecordType must be MRDR"); } return numberOfReferences; } // ******************************** // --- IGNORE THE FOLLOWING GERMAN COMMENT --- // // Es werden alle Datenelemente gemaess Tabelle B.3.2.2-1 DICOM part 10 // erzeugt. // Wird ein gueltiger Dateiname (referencedFileID) fuer eine SOP-Instanz // uebergeben, so werden alle benoetigten keys aus dieser Datei ausgelesen: // Das Datenelement MRDRDirectoryRecordOffset entfaellt. // directFromFile == OFTrue // // Ist referencedFileID ein NULL-Zeiger, so wird versucht, die keys indirekt // ueber den referenzierten MRDR zu besorgen. // Das Datenelement ReferencedFileID bekommt die Laenge 0. // indirectViaMRDR == OFTrue // // Existiert kein Verweis auf einen MRDR, so wird davon ausgegangen, das auch // keine SOP-Instanz mit dem aktuellen Directory Record verknuepft werden soll: // Die Datenelemente ReferencedFileID, MRDRDirectoryRecordOffset, // ReferencedSOPClassUIDinFile und ReferencedSOPInstanceUIDinFile entfallen. // !directFromFile && !indirectViaMRDR // OFCondition DcmDirectoryRecord::fillElementsAndReadSOP(const char *referencedFileID, const char *sourceFileName) { OFCondition l_error = EC_Normal; char *fileName = NULL; DcmFileFormat *refFile = NULL; OFBool directFromFile = OFFalse; OFBool indirectViaMRDR = OFFalse; if (referencedFileID != NULL && *referencedFileID != '\0') directFromFile = OFTrue; else if (DirRecordType != ERT_Mrdr && referencedMRDR != NULL) // illegal for MRDR { indirectViaMRDR = OFTrue; referencedFileID = referencedMRDR->lookForReferencedFileID(); } if (referencedFileID != NULL && *referencedFileID != '\0') { if (!sourceFileName) { fileName = new char[strlen(referencedFileID) + 2]; buildFileName(referencedFileID, fileName); } else { fileName = new char[strlen(sourceFileName)+1]; strcpy(fileName, sourceFileName); } if (DirRecordType != ERT_Mrdr) { refFile = new DcmFileFormat(); l_error = refFile->loadFile(fileName); if (l_error.bad()) { DCMDATA_ERROR("DcmDirectoryRecord::readSOPandFileElements(): DicomFile \"" << fileName << "\" not found"); directFromFile = OFFalse; indirectViaMRDR = OFFalse; } } } else { directFromFile = OFFalse; indirectViaMRDR = OFFalse; } DcmStack stack; DcmUnsignedLongOffset *uloP; DcmUniqueIdentifier *uiP; DcmTag nextOffTag(DCM_OffsetOfTheNextDirectoryRecord); // (0004,1400) uloP = new DcmUnsignedLongOffset(nextOffTag); uloP->putUint32(Uint32(0)); if (insert(uloP, OFFalse).bad()) delete uloP; setRecordInUseFlag(0xffff); // (0004,1410) DcmTag lowerOffTag(DCM_OffsetOfReferencedLowerLevelDirectoryEntity); uloP = new DcmUnsignedLongOffset(lowerOffTag); // (0004,1420) uloP->putUint32(Uint32(0)); if (insert(uloP, OFFalse).bad()) delete uloP; setRecordType(DirRecordType); // (0004,1430) DcmTag privRecTag(DCM_PrivateRecordUID); // (0004,1432) if (DirRecordType == ERT_Private) { uiP = new DcmUniqueIdentifier(privRecTag); if (insert(uiP, OFFalse).bad()) delete uiP; } else delete remove(privRecTag); if (directFromFile) // (0004,1500) setReferencedFileID(referencedFileID); else { DcmTag refFileTag(DCM_ReferencedFileID); delete remove(refFileTag); } DcmTag mrdrOffTag(DCM_RETIRED_MRDRDirectoryRecordOffset); // (0004,1504) if (indirectViaMRDR) { // create pointer attribute to MRDR DcmUnsignedLongOffset *uloP2 = new DcmUnsignedLongOffset(mrdrOffTag); uloP2->putUint32(Uint32(0)); uloP2->setNextRecord(referencedMRDR); insert(uloP2, OFTrue); } else delete remove(mrdrOffTag); DcmTag refSOPClassTag(DCM_ReferencedSOPClassUIDInFile); DcmTag refSOPInstTag(DCM_ReferencedSOPInstanceUIDInFile); DcmTag refFileXferTag(DCM_ReferencedTransferSyntaxUIDInFile); if (DirRecordType != ERT_Mrdr && (directFromFile || indirectViaMRDR)) { if (refFile == NULL) { DCMDATA_ERROR("Internal ERROR in DcmDirectoryRecord::fillElementsAndReadSOP()"); } uiP = new DcmUniqueIdentifier(refSOPClassTag); // (0004,1510) if (refFile->search(DCM_SOPClassUID, stack).good()) { char *uid = NULL; OFstatic_cast(DcmUniqueIdentifier *, stack.top())->getString(uid); uiP->putString(uid); } else { DCMDATA_ERROR("DcmDirectoryRecord::fillElementsAndReadSOP(): " << "can't find SOPClassUID in Dataset: " << fileName); l_error = EC_CorruptedData; } insert(uiP, OFTrue); uiP = new DcmUniqueIdentifier(refSOPInstTag); // (0004,1511) if (refFile->search(DCM_SOPInstanceUID, stack).good() || refFile->search(DCM_MediaStorageSOPInstanceUID, stack).good()) { char *uid = NULL; OFstatic_cast(DcmUniqueIdentifier *, stack.top())->getString(uid); uiP->putString(uid); } else { DCMDATA_ERROR("DcmDirectoryRecord::fillElementsAndReadSOP(): " << "can't find SOPInstanceUID neither in Dataset or MetaInfo of file: " << fileName); l_error = EC_CorruptedData; } insert(uiP, OFTrue); uiP = new DcmUniqueIdentifier(refFileXferTag); // (0004,1512) if (refFile->search(DCM_TransferSyntaxUID, stack).good()) { char *uid = NULL; OFstatic_cast(DcmUniqueIdentifier *, stack.top())->getString(uid); uiP->putString(uid); } else { DCMDATA_ERROR("DcmDirectoryRecord::fillElementsAndReadSOP(): " << "can't find TransferSyntaxUID in MetaInfo of file: " << fileName); l_error = EC_CorruptedData; } insert(uiP, OFTrue); } else // not only in this case: if (DirRecordType == ERT_Mrdr) { // remove SOP UIDs from Directory Record delete remove(refSOPClassTag); delete remove(refSOPInstTag); delete remove(refFileXferTag); } delete refFile; delete[] fileName; return l_error; } // ******************************** OFCondition DcmDirectoryRecord::masterInsertSub(DcmDirectoryRecord *dirRec, const unsigned long where) { // insert without type check errorFlag = lowerLevelList->insert(dirRec, where); return errorFlag; } // ******************************** OFCondition DcmDirectoryRecord::purgeReferencedFile() { OFCondition l_error = EC_Normal; if (DirRecordType != ERT_root) { char *localFileName = NULL; // remove filename from directory record const char *fileName = lookForReferencedFileID(); if (fileName != NULL) { localFileName = new char[strlen(fileName) + 2]; buildFileName(fileName, localFileName); setReferencedFileID(NULL); } DCMDATA_DEBUG("DcmDirectoryRecord::purgeReferencedFile() trying to purge file " << localFileName << " from file system"); if (localFileName != NULL) { // filename exists if (unlink(localFileName) != 0) { char buf[256]; const char *text = OFStandard::strerror(errno, buf, sizeof(buf)); if (text == NULL) text = "(unknown error code)"; errorFlag = makeOFCondition(OFM_dcmdata, 19, OF_error, text); } delete[] localFileName; } else { // no referenced file exists // do nothing } } else l_error = EC_IllegalCall; return l_error; } // ******************************** // ******** public methods ******** // ******************************** DcmEVR DcmDirectoryRecord::ident() const { return EVR_dirRecord; } // ******************************** void DcmDirectoryRecord::print(STD_NAMESPACE ostream&out, const size_t flags, const int level, const char *pixelFileName, size_t *pixelCounter) { if (flags & DCMTypes::PF_showTreeStructure) { /* print record line */ OFOStringStream oss; oss << "\"Directory Record\" (offset=$" << getFileOffset() << ")" << OFStringStream_ends; OFSTRINGSTREAM_GETSTR(oss, tmpString) printInfoLine(out, flags, level, tmpString); OFSTRINGSTREAM_FREESTR(tmpString) /* print item content */ if (!elementList->empty()) { DcmObject *dO; elementList->seek(ELP_first); do { dO = elementList->get(); dO->print(out, flags, level + 1, pixelFileName, pixelCounter); } while (elementList->seek(ELP_next)); } if (lowerLevelList->card() > 0) lowerLevelList->print(out, flags, level + 1); } else { /* print record start line */ OFOStringStream oss; oss << "\"Directory Record\" " << DRTypeNames[DirRecordType] << " #=" << card() << OFStringStream_ends; OFSTRINGSTREAM_GETSTR(oss, tmpString) printInfoLine(out, flags, level, tmpString); OFSTRINGSTREAM_FREESTR(tmpString) /* print record comment line */ if (flags & DCMTypes::PF_useANSIEscapeCodes) out << ANSI_ESCAPE_CODE_INFO; printNestingLevel(out, flags, level); out << "# offset=$" << getFileOffset(); if (referencedMRDR != NULL) out << " refMRDR=$" << referencedMRDR->getFileOffset(); if (DirRecordType == ERT_Mrdr) out << " refCount=" << numberOfReferences; const char *refFile = getReferencedFileName(); if (refFile != NULL) out << " refFileID=\"" << refFile << "\""; out << OFendl; /* print item content */ if (!elementList->empty()) { DcmObject *dO; elementList->seek(ELP_first); do { dO = elementList->get(); dO->print(out, flags, level + 1, pixelFileName, pixelCounter); } while (elementList->seek(ELP_next)); } if (lowerLevelList->card() > 0) lowerLevelList->print(out, flags, level + 1); /* print record end line */ DcmTag delimItemTag(DCM_ItemDelimitationItem); if (getLengthField() == DCM_UndefinedLength) printInfoLine(out, flags, level, "\"ItemDelimitationItem\"", &delimItemTag); else printInfoLine(out, flags, level, "\"ItemDelimitationItem for re-encoding\"", &delimItemTag); } } // ******************************** OFCondition DcmDirectoryRecord::writeXML(STD_NAMESPACE ostream&out, const size_t flags) { /* XML start tag for "item" */ out << "" << OFendl; /* write item content */ if (!elementList->empty()) { /* write content of all children */ DcmObject *dO; elementList->seek(ELP_first); do { dO = elementList->get(); dO->writeXML(out, flags); } while (elementList->seek(ELP_next)); } if (lowerLevelList->card() > 0) lowerLevelList->writeXML(out, flags); /* XML end tag for "item" */ out << "" << OFendl; /* always report success */ return EC_Normal; } // ******************************** OFCondition DcmDirectoryRecord::read(DcmInputStream &inStream, const E_TransferSyntax xfer, const E_GrpLenEncoding glenc, const Uint32 maxReadLength) { if (getTransferState() == ERW_notInitialized) errorFlag = EC_IllegalCall; else { if (getTransferState() != ERW_ready) { DcmXfer xferSyn(xfer); errorFlag = DcmItem::read(inStream, xfer, glenc, maxReadLength); /* ** Remember the actual file offset for this Directory Record. ** Compute by subtracting the Item header (tag & length fields) ** from the start position of data within the Item (fStartPosition). ** fStartPosition is set in DcmItem::read(...) ** offsetInFile is used in the print(...) method. */ offsetInFile = OFstatic_cast(Uint32, fStartPosition) - xferSyn.sizeofTagHeader(getTag().getEVR()); } if (getTransferState() == ERW_ready && DirRecordType == ERT_Private) // minimizes multiple evaluation { DirRecordType = lookForRecordType(); if (DirRecordType == ERT_Mrdr) numberOfReferences = lookForNumberOfReferences(); } } return errorFlag; } // ******************************** OFCondition DcmDirectoryRecord::verify(const OFBool autocorrect) { OFCondition err1 = EC_Normal; OFCondition err2 = EC_Normal; errorFlag = EC_Normal; if (autocorrect == OFTrue && DirRecordType != ERT_root) errorFlag = fillElementsAndReadSOP(getReferencedFileName(), NULL); err1 = DcmItem::verify(autocorrect); err2 = lowerLevelList->verify(autocorrect); if (errorFlag.good() && (err1.bad() || err2.bad())) errorFlag = EC_CorruptedData; return errorFlag; } // ******************************** OFCondition DcmDirectoryRecord::search(const DcmTagKey &tag, DcmStack &resultStack, E_SearchMode mode, OFBool searchIntoSub) { OFCondition l_error = DcmItem::search(tag, resultStack, mode, searchIntoSub); if (l_error.bad()) { if (mode != ESM_afterStackTop || resultStack.top() == this) resultStack.push(lowerLevelList); l_error = lowerLevelList->search(tag, resultStack, mode, searchIntoSub); if (l_error.bad()) resultStack.pop(); } return l_error; } // ******************************** E_DirRecType DcmDirectoryRecord::getRecordType() { return DirRecordType; } // ******************************** DcmDirectoryRecord* DcmDirectoryRecord::getReferencedMRDR() { return referencedMRDR; } // ******************************** OFCondition DcmDirectoryRecord::assignToSOPFile(const char *referencedFileID, const char *sourceFileName) { errorFlag = EC_Normal; if (DirRecordType != ERT_root) { DCMDATA_DEBUG("DcmDirectoryRecord::assignToSOPFile() old Referenced File ID was " << getReferencedFileName()); DCMDATA_DEBUG("new Referenced File ID is " << referencedFileID); // update against the old reference counter if (referencedMRDR != NULL) referencedMRDR->decreaseRefNum(); referencedMRDR = NULL; errorFlag = fillElementsAndReadSOP(referencedFileID, sourceFileName); } else errorFlag = EC_IllegalCall; return errorFlag; } // ******************************** OFCondition DcmDirectoryRecord::assignToMRDR(DcmDirectoryRecord *mrdr) { errorFlag = EC_Normal; if (DirRecordType != ERT_root && mrdr != NULL // new MRDR available && mrdr != referencedMRDR // old MRDR != new MRDR ) { DCMDATA_DEBUG("DcmDirectoryRecord::assignToMRDR() old Referenced File ID was " << getReferencedFileName()); DCMDATA_DEBUG("new Referenced File ID is " << mrdr->lookForReferencedFileID()); // set internal pointer to mrdr and update against the old value if (referencedMRDR != NULL) referencedMRDR->decreaseRefNum(); referencedMRDR = mrdr; // increase reference counter in referencedMRDR by one referencedMRDR->increaseRefNum(); // set length of Referenced File ID to zero and fill data elements errorFlag = fillElementsAndReadSOP(NULL, NULL); } else errorFlag = EC_IllegalCall; return errorFlag; } // ******************************** unsigned long DcmDirectoryRecord::cardSub() { return lowerLevelList->card(); } // ******************************** OFCondition DcmDirectoryRecord::insertSub(DcmDirectoryRecord *dirRec, unsigned long where, OFBool before) { if (dirRec != NULL) { if (checkHierarchy(DirRecordType, dirRec->DirRecordType).good()) errorFlag = lowerLevelList->insert(dirRec, where, before); else { errorFlag = EC_IllegalCall; DCMDATA_DEBUG("DcmDirectoryRecord::insertSub() dcdirrec: (" << DRTypeNames[getRecordType()] << " -> " << DRTypeNames[dirRec->getRecordType()] << ") hierarchy not allowed"); } } return errorFlag; } // ******************************** OFCondition DcmDirectoryRecord::insertSubAtCurrentPos(DcmDirectoryRecord *dirRec, OFBool before) { if (dirRec != NULL) { if (checkHierarchy(DirRecordType, dirRec->DirRecordType).good()) errorFlag = lowerLevelList->insertAtCurrentPos(dirRec, before); else { errorFlag = EC_IllegalCall; DCMDATA_DEBUG("DcmDirectoryRecord::insertSubAtCurrentPos() dcdirrec: (" << DRTypeNames[getRecordType()] << " -> " << DRTypeNames[dirRec->getRecordType()] << ") hierarchy not allowed"); } } return errorFlag; } // ******************************** DcmDirectoryRecord *DcmDirectoryRecord::getSub(const unsigned long num) { DcmDirectoryRecord *retRec = OFstatic_cast(DcmDirectoryRecord *, lowerLevelList->getItem(num)); errorFlag = lowerLevelList->error(); return retRec; } // ******************************** DcmDirectoryRecord *DcmDirectoryRecord::nextSub(const DcmDirectoryRecord *dirRec) { DcmDirectoryRecord *retRec = OFstatic_cast(DcmDirectoryRecord *, lowerLevelList->nextInContainer(dirRec)); errorFlag = lowerLevelList->error(); return retRec; } // ******************************** DcmDirectoryRecord* DcmDirectoryRecord::removeSub(const unsigned long num) { DcmDirectoryRecord *retRec = OFstatic_cast(DcmDirectoryRecord *, lowerLevelList->remove(num)); errorFlag = lowerLevelList->error(); return retRec; } // ******************************** DcmDirectoryRecord* DcmDirectoryRecord::removeSub(DcmDirectoryRecord *dirRec) { DcmDirectoryRecord *retRec = OFstatic_cast(DcmDirectoryRecord *, lowerLevelList->remove(dirRec)); errorFlag = lowerLevelList->error(); return retRec; } // ******************************** OFCondition DcmDirectoryRecord::deleteSubAndPurgeFile(const unsigned long num) { DcmDirectoryRecord *subDirRec = OFstatic_cast(DcmDirectoryRecord *, lowerLevelList->remove(num)); errorFlag = lowerLevelList->error(); if (subDirRec != NULL) { DcmDirectoryRecord *localSubRefMRDR = subDirRec->getReferencedMRDR(); if (localSubRefMRDR != NULL) { // file is referenced (indirect) localSubRefMRDR->decreaseRefNum(); } else // remove file directly errorFlag = subDirRec->purgeReferencedFile(); DCMDATA_DEBUG("DcmDirectoryRecord::deleteSubAndPurgeFile() now purging lower records:"); while (subDirRec->cardSub() > 0) // remove all sub sub records subDirRec->deleteSubAndPurgeFile(OFstatic_cast(unsigned long, 0)); delete subDirRec; // remove sub directory record } return errorFlag; } // ******************************** OFCondition DcmDirectoryRecord::deleteSubAndPurgeFile(DcmDirectoryRecord *dirRec) { DcmDirectoryRecord *subDirRec = OFstatic_cast(DcmDirectoryRecord *, lowerLevelList->remove(dirRec)); errorFlag = lowerLevelList->error(); if (subDirRec != NULL) { DcmDirectoryRecord *localSubRefMRDR = subDirRec->getReferencedMRDR(); if (localSubRefMRDR != NULL) { // file is referenced (indirect) localSubRefMRDR->decreaseRefNum(); } else // remove file directly errorFlag = subDirRec->purgeReferencedFile(); DCMDATA_DEBUG("DcmDirectoryRecord::deleteSubAndPurgeFile() now purging lower records:"); while (subDirRec->cardSub() > 0) // remove all sub sub records subDirRec->deleteSubAndPurgeFile(OFstatic_cast(unsigned long, 0)); delete subDirRec; // remove sub directory record } return errorFlag; } OFCondition DcmDirectoryRecord::clearSub() { errorFlag = lowerLevelList->clear(); return errorFlag; } void DcmDirectoryRecord::setRecordsOriginFile(const char *fname) { if (recordsOriginFile != NULL) delete[] recordsOriginFile; if (fname != NULL) { recordsOriginFile = new char[strlen(fname) + 1]; strcpy(recordsOriginFile, fname); } else recordsOriginFile = NULL; } const char* DcmDirectoryRecord::getRecordsOriginFile() { return recordsOriginFile; } /* * CVS/RCS Log: * $Log: dcdirrec.cc,v $ * Revision 1.78 2010-11-05 13:11:16 joergr * Added support for new directory record types IMPLANT, IMPLANT GROUP and * IMPLANT ASSY from Supplement 131 (Implant Templates). * * Revision 1.77 2010-10-29 10:57:21 joergr * Added support for colored output to the print() method. * * Revision 1.76 2010-10-20 16:44:16 joergr * Use type cast macros (e.g. OFstatic_cast) where appropriate. * * Revision 1.75 2010-10-20 07:41:35 uli * Made sure isalpha() & friends are only called with valid arguments. * * Revision 1.74 2010-10-14 13:14:07 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.73 2010-10-01 10:21:05 uli * Fixed most compiler warnings from -Wall -Wextra -pedantic in dcmdata. * * Revision 1.72 2010-10-01 08:06:19 joergr * Added new directory record type MEASUREMENT from Supplement 144. * * Revision 1.71 2010-09-30 16:43:21 joergr * Added new directory record types HL7 STRUC DOC, PALETTE and SURFACE. * * Revision 1.70 2010-06-03 10:28:41 joergr * Replaced calls to strerror() by new helper function OFStandard::strerror() * which results in using the thread safe version of strerror() if available. * * Revision 1.69 2009-12-04 17:10:31 joergr * Slightly modified some log messages. * * Revision 1.68 2009-11-13 13:11:20 joergr * Fixed minor issues in log output. * * Revision 1.67 2009-11-04 09:58:09 uli * Switched to logging mechanism provided by the "new" oflog module * * Revision 1.66 2009-05-15 09:15:11 joergr * Made output of directory record in "tree mode" more consistent with the rest * of the textual dump (print flag = PF_showTreeStructure). * * Revision 1.65 2009-02-04 18:02:11 joergr * Fixed wrong CVS log entry. * * Revision 1.64 2009-02-04 17:59:57 joergr * Fixed various type mismatches reported by MSVC introduced with OFFile class. * * Revision 1.63 2008-07-17 10:31:31 onken * Implemented copyFrom() method for complete DcmObject class hierarchy, which * permits setting an instance's value from an existing object. Implemented * assignment operator where necessary. * * Revision 1.62 2008-06-03 13:41:40 meichel * DcmDirectoryRecord::getFileOffset() is now const and public. * * Revision 1.61 2008-04-30 12:38:42 meichel * Fixed compile errors due to changes in attribute tag names * * Revision 1.60 2007/06/29 14:17:49 meichel * Code clean-up: Most member variables in module dcmdata are now private, * not protected anymore. * * Revision 1.59 2007/02/19 15:04:15 meichel * Removed searchErrors() methods that are not used anywhere and added * error() methods only in the DcmObject subclasses where really used. * * Revision 1.58 2006/08/15 15:49:54 meichel * Updated all code in module dcmdata to correctly compile when * all standard C++ classes remain in namespace std. * * Revision 1.57 2006/07/27 13:10:18 joergr * Added support for DICOMDIR record type "STEREOMETRIC" (CP 628). * Renamed ERT_StructReport to ERT_SRDocument. * * Revision 1.56 2006/05/11 17:48:28 joergr * Fixed wrong CVS log entry. * * Revision 1.55 2006/05/11 08:47:56 joergr * Added "offset" attribute to DICOMDIR record items. * * Revision 1.54 2005/12/08 15:41:07 meichel * Changed include path schema for all DCMTK header files * * Revision 1.53 2005/11/28 15:53:13 meichel * Renamed macros in dcdebug.h * * Revision 1.52 2005/11/07 16:59:26 meichel * Cleaned up some copy constructors in the DcmObject hierarchy. * * Revision 1.51 2005/10/27 13:33:08 joergr * Added support for Encapsulated Document, Real World Value Mapping and * Hanging Protocol objects to DICOMDIR tools. * * Revision 1.50 2004/08/03 11:41:09 meichel * Headers libc.h and unistd.h are now included via ofstdinc.h * * Revision 1.49 2004/02/13 17:36:54 joergr * Added support for new directory records RAW DATA and SPECTROSCOPY introduced * with CP 343. * * Revision 1.48 2004/02/13 14:12:38 joergr * Added support for new directory records REGISTRATION and FIDUCIAL introduced * with supplement 73 (Spatial Registration Storage SOP Classes). * * Revision 1.47 2004/01/16 13:50:53 joergr * Removed acknowledgements with e-mail addresses from CVS log. * * Revision 1.46 2003/08/08 14:17:26 joergr * Added two new methods insertSubAtCurrentPos() and nextSub() which allow for * a much more efficient insertion (avoids re-searching for correct position). * Adapted type casts to new-style typecast operators defined in ofcast.h. * Translated most German comments. * * Revision 1.45 2003/03/21 13:08:04 meichel * Minor code purifications for warnings reported by MSVC in Level 4 * * Revision 1.44 2002/12/06 12:55:43 joergr * Enhanced "print()" function by re-working the implementation and replacing * the boolean "showFullData" parameter by a more general integer flag. * Made source code formatting more consistent with other modules/files. * Replaced some German comments by English translations. * * Revision 1.43 2002/11/27 12:06:45 meichel * Adapted module dcmdata to use of new header file ofstdinc.h * * Revision 1.42 2002/10/10 16:39:25 joergr * Fixed bug that prevented old frozen draft SR documents from being recognized * in DICOMDIR files. * * Revision 1.41 2002/08/27 16:55:45 meichel * Initial release of new DICOM I/O stream classes that add support for stream * compression (deflated little endian explicit VR transfer syntax) * * Revision 1.40 2002/08/21 10:14:20 meichel * Adapted code to new loadFile and saveFile methods, thus removing direct * use of the DICOM stream classes. * * Revision 1.39 2002/04/16 13:43:16 joergr * Added configurable support for C++ ANSI standard includes (e.g. streams). * * Revision 1.38 2001/09/25 17:19:48 meichel * Adapted dcmdata to class OFCondition * * Revision 1.37 2001/06/20 14:58:38 joergr * Added support for new SOP class Key Object Selection Document (suppl. 59). * * Revision 1.36 2001/06/01 15:49:02 meichel * Updated copyright header * * Revision 1.35 2000/12/14 12:48:07 joergr * Updated for 2000 edition of the DICOM standard (added: SR, PR, WV, SP, RT). * * Revision 1.34 2000/04/14 15:55:04 meichel * Dcmdata library code now consistently uses ofConsole for error output. * * Revision 1.33 2000/03/08 16:26:34 meichel * Updated copyright header. * * Revision 1.32 2000/03/03 14:05:32 meichel * Implemented library support for redirecting error messages into memory * instead of printing them to stdout/stderr for GUI applications. * * Revision 1.31 2000/02/23 15:11:50 meichel * Corrected macro for Borland C++ Builder 4 workaround. * * Revision 1.30 2000/02/10 10:52:18 joergr * Added new feature to dcmdump (enhanced print method of dcmdata): write * pixel data/item value fields to raw files. * * Revision 1.29 2000/02/03 11:49:07 meichel * Updated dcmgpdir to new directory record structure in letter ballot text * of Structured Report. * * Revision 1.28 2000/02/02 14:32:50 joergr * Replaced 'delete' statements by 'delete[]' for objects created with 'new[]'. * * Revision 1.27 2000/02/01 10:12:05 meichel * Avoiding to include as extern "C" on Borland C++ Builder 4, * workaround for bug in compiler header files. * * Revision 1.26 1999/03/31 09:25:25 meichel * Updated copyright header in module dcmdata * * */ dcmtk-3.6.0/dcmdata/libsrc/dcpath.cc0000644000310500011400000007352711465743617016520 0ustar joergrdicom3/* * * Copyright (C) 2008-2010, 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: dcmdata * * Author: Michael Onken * * Purpose: Class definitions for accessing DICOM dataset structures (items, * sequences and leaf elements via string-based path access. * * Last Update: $Author: uli $ * Update Date: $Date: 2010-11-08 09:49:03 $ * CVS/RCS Revision: $Revision: 1.15 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcpath.h" #include "dcmtk/dcmdata/dcsequen.h" /*******************************************************************/ /* Implementation of class DcmPath */ /*******************************************************************/ // Constructor DcmPath::DcmPath() : m_path() { } // Construct from existing path (kind of copy constructor) DcmPath::DcmPath(const OFList& currentPath) : m_path() { OFListConstIterator(DcmPathNode*) it = currentPath.begin(); OFListConstIterator(DcmPathNode*) endOfPath = currentPath.end(); while (it != endOfPath) { m_path.push_back(new DcmPathNode( (*it)->m_obj, (*it)->m_itemNo )); it++; } } // Append a node to the path void DcmPath::append(DcmPathNode* node) { if (node != NULL) m_path.push_back(node); // do any validity checking? } // Deletes last node from the path and frees corresponding memory void DcmPath::deleteBackNode() { DcmPathNode *node = m_path.back(); m_path.pop_back(); if (node) { delete node; node = NULL; } } // Returns iterator to first element of the path OFListIterator(DcmPathNode*) DcmPath::begin() { return m_path.begin(); } // Returns iterator to last element of the path DcmPathNode* DcmPath::back() { return m_path.back(); } // Returns iterator to the end of path, ie. dummy after actual last element OFListIterator(DcmPathNode*) DcmPath::end() { return m_path.end(); } // Returns number of path nodes in the path Uint32 DcmPath::size() const { return m_path.size(); } // Returns true if path is empty, ie. number of path nodes is zero OFBool DcmPath::empty() const { return (m_path.size() == 0); } // Returns string representation of the path OFString DcmPath::toString() const { OFListConstIterator(DcmPathNode*) it = m_path.begin(); OFListConstIterator(DcmPathNode*) endOfList = m_path.end(); OFString pathStr; DcmEVR vr; DcmObject* obj; char buf[500]; while (it != endOfList) { if ( ((*it) == NULL) || ((*it)->m_obj == NULL) ) return "Invalid search result"; obj = (*it)->m_obj; vr = obj->ident(); if ((vr == EVR_SQ) || ( obj->isLeaf()) ) { pathStr.append( OFconst_cast(DcmTag*, &obj->getTag())->getTagName() ); it++; } else if ( (vr == EVR_item) || (vr == EVR_dataset) ) { #if SIZEOF_LONG == 8 sprintf(buf, "[%u]", (*it)->m_itemNo); #else sprintf(buf, "[%lu]", (*it)->m_itemNo); #endif pathStr.append(buf); it++; if (it != endOfList) pathStr.append("."); } else { pathStr.append(""); it++; } } return pathStr; } // Checks whether a specific group number is used in the path's path nodes OFBool DcmPath::containsGroup(const Uint16& groupNo) const { OFListConstIterator(DcmPathNode*) it = m_path.begin(); OFListConstIterator(DcmPathNode*) endOfList = m_path.end(); while (it != endOfList) { DcmPathNode* node = *it; if ( (node == NULL) || (node->m_obj == NULL) ) return OFFalse; if (node->m_obj->getGTag() == groupNo) return OFTrue; it++; } return OFFalse; } // Helper function for findOrCreatePath(). Parses item no from start of string OFCondition DcmPath::parseItemNoFromPath(OFString& path, // inout Uint32& itemNo, // out OFBool& wasWildcard) // out { wasWildcard = OFFalse; itemNo = 0; // check whether there is an item to parse size_t closePos = path.find_first_of(']', 0); if ( (closePos != OFString_npos) && (path[0] == '[') ) { long int parsedNo; // try parsing item number; parsing for %lu would cause overflows in case of negative numbers int parsed = sscanf(path.c_str(), "[%ld]", &parsedNo); if (parsed == 1) { if (parsedNo < 0) { OFString errMsg = "Negative item number (not permitted) at beginning of path: "; errMsg += path; return makeOFCondition(OFM_dcmdata, 25, OF_error, errMsg.c_str()); } itemNo = OFstatic_cast(Uint32, parsedNo); if (closePos + 1 < path.length()) // if end of path not reached, cut off "." closePos ++; path.erase(0, closePos + 1); // remove item from path return EC_Normal; } char aChar; parsed = sscanf(path.c_str(), "[%c]", &aChar); if ( (parsed == 1) && (aChar =='*') ) { wasWildcard = OFTrue; if (closePos + 1 < path.length()) // if end of path not reached, cut off "." closePos ++; path.erase(0, closePos + 1); // remove item from path return EC_Normal; } } OFString errMsg = "Unable to parse item number at beginning of path: "; errMsg += path; return makeOFCondition(OFM_dcmdata, 25, OF_error, errMsg.c_str()); } // Function that parses a tag from the beginning of a path string. OFCondition DcmPath::parseTagFromPath(OFString& path, // inout DcmTag& tag) // out { OFCondition result; size_t pos = OFString_npos; // In case we have a tag "(gggg,xxxx)" if ( path[0] == '(') { pos = path.find_first_of(')', 0); if (pos != OFString_npos) result = DcmTag::findTagFromName(path.substr(1, pos - 1).c_str() /* "gggg,eeee" */, tag); else { OFString errMsg("Unable to parse tag at beginning of path: "); errMsg += path; return makeOFCondition(OFM_dcmdata, 25, OF_error, errMsg.c_str()); } pos++; // also cut off closing bracket } // otherwise we could have a dictionary name else { // maybe an item follows pos = path.find_first_of('[', 0); if (pos == OFString_npos) result = DcmTag::findTagFromName(path.c_str(), tag); // check full path else result = DcmTag::findTagFromName(path.substr(0, pos).c_str(), tag); // parse path up to "[" char } // construct error message if necessary and return if (result.bad()) { OFString errMsg("Unable to parse tag/dictionary name at beginning of path: "); errMsg += path; return makeOFCondition(OFM_dcmdata, 25, OF_error, errMsg.c_str()); } // else remove parsed tag from path and return success else path.erase(0, pos); return EC_Normal; } // Destructor, frees memory of path nodes (but not of underlying DICOM objects) DcmPath::~DcmPath() { // free dynamically allocated memory while (m_path.size() != 0) { DcmPathNode* node = m_path.front(); delete node; node = NULL; m_path.pop_front(); } } // Seperate a string path into the different nodes OFCondition DcmPath::separatePathNodes(const OFString& path, OFList& result) { OFString pathStr(path); OFCondition status = EC_Normal; OFBool nextIsItem = OFTrue; Uint32 itemNo = 0; OFBool isWildcard = OFFalse; // initialize parsing loop if (!pathStr.empty()) { if (pathStr[0] != '[') nextIsItem = OFFalse; } char buf[100]; // parse node for node and only stop if error occurs or parsing completes while ( !pathStr.empty() ) { if (nextIsItem) { status = parseItemNoFromPath(pathStr, itemNo, isWildcard); if (status.bad()) return status; if (isWildcard) result.push_back("[*]"); else { #if SIZEOF_LONG == 8 if (sprintf(buf, "[%u]", itemNo) < 2) return EC_IllegalParameter; #else if (sprintf(buf, "[%lu]", itemNo) < 2) return EC_IllegalParameter; #endif result.push_back(buf); } nextIsItem = OFFalse; } else { DcmTag tag; status = parseTagFromPath(pathStr, tag); if (status.bad()) return status; if (sprintf(buf, "(%04X,%04X)", tag.getGroup(), tag.getElement()) != 11) return EC_IllegalParameter; result.push_back(buf); nextIsItem = OFTrue; } } return status; } /*******************************************************************/ /* Implementation of class DcmPathProcessor */ /*******************************************************************/ // Constructor, constructs an empty path processor DcmPathProcessor::DcmPathProcessor() : m_currentPath(), m_results(), m_createIfNecessary(OFFalse), m_checkPrivateReservations(OFTrue), m_itemWildcardsEnabled(OFTrue) { } // enables (class default:enabled) or disables checking of private reservations void DcmPathProcessor::checkPrivateReservations(const OFBool& doChecking) { m_checkPrivateReservations = doChecking; } // enables (class default:enabled) or disables support for item wildcards void DcmPathProcessor::setItemWildcardSupport(const OFBool& supported) { m_itemWildcardsEnabled = supported; } // Permits finding and creating DICOM object hierarchies based on a path string OFCondition DcmPathProcessor::findOrCreatePath(DcmObject* obj, const OFString& path, OFBool createIfNecessary) { // check input parameters if ( (obj == NULL) || path.empty()) return EC_IllegalParameter; if (!m_itemWildcardsEnabled) { if (path.find('*') != OFString_npos) { return makeOFCondition(OFM_dcmdata, 25, OF_error, "Item wildcard '*' found in path but wildcards disabled"); } } clear(); m_createIfNecessary = createIfNecessary; // do real work in private member functions OFString pathCopy = path; if ((obj->ident() == EVR_item) || (obj->ident() == EVR_dataset)) return findOrCreateItemPath(OFstatic_cast(DcmItem*, obj), pathCopy); else if (obj->ident() == EVR_SQ) return findOrCreateSequencePath(OFstatic_cast(DcmSequenceOfItems*, obj), pathCopy); else return EC_IllegalParameter; } // Permits deleting DICOM object hierarchies based on a path string OFCondition DcmPathProcessor::findOrDeletePath(DcmObject* obj, const OFString& path, Uint32& numDeleted) { // check input parameters if ( (obj == NULL) || path.empty()) return EC_IllegalParameter; numDeleted = 0; if (!m_itemWildcardsEnabled) { if (path.find('*') != OFString_npos) { return makeOFCondition(OFM_dcmdata, 25, OF_error, "Item wildcard '*' found in path but wildcards disabled"); } } // search m_createIfNecessary = OFFalse; OFString pathCopy = path; OFCondition result; clear(); if ((obj->ident() == EVR_item) || (obj->ident() == EVR_dataset)) result = findOrCreateItemPath(OFstatic_cast(DcmItem*, obj), pathCopy); else if (obj->ident() == EVR_SQ) result = findOrCreateSequencePath(OFstatic_cast(DcmSequenceOfItems*, obj), pathCopy); else return EC_IllegalParameter; if (result.bad()) return result; // check results OFList resultPaths; Uint32 numPaths = getResults(resultPaths); if (numPaths == 0) return EC_IllegalCall; // should never happen at this point OFListIterator(DcmPath*) pathIt = resultPaths.begin(); OFListIterator(DcmPath*) endIt = resultPaths.end(); while (pathIt != endIt) { // get last item/element from path which should be deleted DcmPathNode* nodeToDelete = (*pathIt)->back(); if ( (nodeToDelete == NULL) || (nodeToDelete->m_obj == NULL) ) return EC_IllegalCall; // if it's not an item, delete element from item. // deletes DICOM content of node but not node itself (done later) if (nodeToDelete->m_obj->ident() != EVR_item) { result = deleteLastElemFromPath(obj, *pathIt, nodeToDelete); } // otherwise we need to delete an item from a sequence else { result = deleteLastItemFromPath(obj, *pathIt, nodeToDelete); } if (result.bad()) return result; // if success, remove node from path and clear node memory (*pathIt)->deleteBackNode(); numDeleted++; pathIt++; } return result; } // Get results of a an operation started before (e. g. findOrCreatePath()) Uint32 DcmPathProcessor::getResults(OFList& searchResults) { if (m_results.size() > 0) { // explicitely copy (shallow) OFListIterator(DcmPath*) it = m_results.begin(); while (it != m_results.end()) { searchResults.push_back(*it); it++; } } return m_results.size(); } // applies a string path (optionally with value) to a dataset OFCondition DcmPathProcessor::applyPathWithValue(DcmDataset *dataset, const OFString& overrideKey) { if (dataset == NULL) return EC_IllegalCall; if (overrideKey.empty()) return EC_Normal; OFString path = overrideKey; OFString value; size_t pos = path.find('='); // separate tag from value if there is one if (pos != OFString_npos) { value = path.substr(pos+1); // value now contains value path.erase(pos); // pure path without value } clear(); // create path OFCondition result = findOrCreatePath(dataset, path, OFTrue /* create if necessary */); if (result.bad()) return result; // prepare for value insertion OFListConstIterator(DcmPath*) it = m_results.begin(); OFListConstIterator(DcmPath*) endList = m_results.end(); DcmPathNode *last = (*it)->back(); if (last == NULL) return EC_IllegalCall; // if value is specified, be sure path does not end with item if ( !last->m_obj->isLeaf() ) { if (value.empty()) return EC_Normal; else return makeOFCondition(OFM_dcmdata, 25, OF_error, "Cannot insert value into path ending with item or sequence"); } // insert value into each element affected by path while (it != endList) { last = (*it)->back(); if (last == NULL) return EC_IllegalCall; DcmElement *elem = OFstatic_cast(DcmElement*, last->m_obj); if (elem == NULL) return EC_IllegalCall; result = elem->putString(value.c_str()); if (result.bad()) break; it++; } return result; } // Resets status (including results) of DcmPathProcessor and frees corresponding memory void DcmPathProcessor::clear() { while (m_results.size() != 0) { DcmPath* result = m_results.front(); if (result != NULL) { delete result; result = NULL; } m_results.pop_front(); } while (m_currentPath.size() != 0) { DcmPathNode* node = m_currentPath.front(); if (node != NULL) { delete node; node = NULL; } m_currentPath.pop_front(); } } // Destructor, frees memory by calling clear() DcmPathProcessor::~DcmPathProcessor() { clear(); } /* protected helper functions */ // Helper function that deletes last DICOM element from a path from the DICOM hierarchy OFCondition DcmPathProcessor::deleteLastElemFromPath(DcmObject* objSearchedIn, DcmPath *path, DcmPathNode* toDelete) { // item containing the element to delete DcmItem *containingItem = NULL; if ( path->size() == 1) { // if we have only a single elem in path, given object must be cont. item if ( (objSearchedIn->ident() != EVR_item) && (objSearchedIn->ident() != EVR_dataset) ) return makeOFCondition(OFM_dcmdata, 25, OF_error, "Cannot search leaf element in object being not an item"); containingItem = OFstatic_cast(DcmItem*, objSearchedIn); } else { // get containing item from path which is the penultimate in the path OFListIterator(DcmPathNode*) temp = path->end(); temp--; temp--; if (*temp == NULL) return EC_IllegalCall; // never happens here... if ( (*temp)->m_obj == NULL ) return EC_IllegalCall; if ( (*temp)->m_obj->ident() != EVR_item) // (no test for dataset needed) return makeOFCondition(OFM_dcmdata, 25, OF_error, "Cannot search leaf element in object being not an item"); containingItem = OFstatic_cast(DcmItem*, (*temp)->m_obj); } if (containingItem == NULL) return EC_IllegalCall; OFCondition result = containingItem->findAndDeleteElement(toDelete->m_obj->getTag(), OFFalse, OFFalse); return result; } // Helper function that deletes last DICOM item from a path from the DICOM hierarchy OFCondition DcmPathProcessor::deleteLastItemFromPath(DcmObject* objSearchedIn, DcmPath *path, DcmPathNode* toDelete) { DcmSequenceOfItems *containingSeq = NULL; if ( path->size() == 1) { // if we have only a single elem in path, given object must be cont. item if (objSearchedIn->ident() != EVR_SQ) return makeOFCondition(OFM_dcmdata, 25, OF_error, "Cannot search item in object being not a sequence"); containingSeq = OFstatic_cast(DcmSequenceOfItems*, objSearchedIn); } else { // get containing item from path which is the penultimate in the path OFListIterator(DcmPathNode*) temp = path->end(); temp--; temp--; if (*temp == NULL) return EC_IllegalCall; // never happens here... if ( (*temp)->m_obj == NULL ) return EC_IllegalCall; if ( (*temp)->m_obj->ident() != EVR_SQ) return makeOFCondition(OFM_dcmdata, 25, OF_error, "Cannot search item in object being not a sequence"); containingSeq = OFstatic_cast(DcmSequenceOfItems*, (*temp)->m_obj); } if (containingSeq == NULL ) return EC_IllegalCall; DcmItem *item2BDeleted = containingSeq->remove(OFstatic_cast(DcmItem*, toDelete->m_obj)); if ( item2BDeleted == NULL ) return EC_IllegalCall; // should not happen here... delete item2BDeleted; item2BDeleted = NULL; return EC_Normal; } // Helper function that does work for findOrCreatePath() OFCondition DcmPathProcessor::findOrCreateItemPath(DcmItem* item, OFString& path) { if (item == NULL) return EC_IllegalParameter; if (path.empty()) return EC_IllegalParameter; OFString restPath(path); OFCondition status = EC_Normal; DcmTag tag; OFString privCreator; OFBool newlyCreated = OFFalse; // denotes whether an element was created DcmElement *elem = NULL; DcmPath* currentResult = NULL; // parse tag status = DcmPath::parseTagFromPath(restPath, tag); if (status.bad()) return status; // insert element or sequence if ( !(item->tagExists(tag)) ) // do not to overwrite existing tags { if (m_createIfNecessary) { // private tags needs special handling, e. g. checking reservation if (tag.isPrivate() && m_checkPrivateReservations) { status = checkPrivateTagReservation(item, tag); if (status.bad()) return status; } elem = newDicomElement(tag); if (elem == NULL) return EC_IllegalCall; status = item->insert(elem, OFTrue); if (status.bad()) { delete elem; elem = NULL; return status; } newlyCreated = OFTrue; } else return EC_TagNotFound; } // get element status = item->findAndGetElement(tag, elem); if (status.bad()) return EC_CorruptedData; // should not happen // start recursion if element was a sequence if (tag.getEVR() == EVR_SQ) { DcmSequenceOfItems* seq = NULL; seq = OFstatic_cast(DcmSequenceOfItems*, elem); if (!seq) status = EC_IllegalCall; // should not happen else { // if sequence could be inserted and there is nothing more to do: add current path to results and return success if (restPath.empty()) { currentResult = new DcmPath(m_currentPath); currentResult->append(new DcmPathNode(elem,0)); m_results.push_back(currentResult); return EC_Normal; } // start recursion if there is path left DcmPathNode* node = new DcmPathNode(seq, 0); m_currentPath.push_back(node); status = findOrCreateSequencePath(seq, restPath); m_currentPath.pop_back(); // avoid side effects delete node; } } else if (restPath.empty()) // we inserted a leaf element: path must be completed { // add element and add current path to overall results; then return success currentResult = new DcmPath(m_currentPath); currentResult->append(new DcmPathNode(elem, 0)); m_results.push_back(currentResult); return EC_Normal; } else // we inserted a leaf element but there is path left -> error status = makeOFCondition(OFM_dcmdata, 25, OF_error, "Invalid Path: Non-sequence tag found with rest path following"); // in case of errors: delete result path copy and delete DICOM element if it was newly created if ( status.bad() && (elem != NULL) ) { m_results.remove(currentResult); // remove from search result if (currentResult) { delete currentResult; currentResult = NULL; } if (newlyCreated) // only delete from this dataset and memory if newly created ("undo") { if (item->findAndDeleteElement(tag).bad()) delete elem; // delete manually if not found in dataset } elem = NULL; } return status; } // Helper function that does work for findOrCreatePath() OFCondition DcmPathProcessor::findOrCreateSequencePath(DcmSequenceOfItems* seq, OFString& path) { if (seq == NULL) return EC_IllegalParameter; // prepare variables OFString restPath(path); OFCondition status = EC_Normal; DcmItem *resultItem = NULL; Uint32 itemNo = 0; Uint32 newlyCreated = 0; // number of items created (appended) (only non-wildcard mode) Uint32 newPathsCreated = 0; // wildcard mode: number of paths found // parse item number OFBool isWildcard = OFFalse; status = DcmPath::parseItemNoFromPath(restPath, itemNo, isWildcard); if (status.bad()) return status; // wildcard code: add result path for every matching item if (isWildcard) { // if there are no items -> no results are found Uint32 numItems = seq->card(); if (numItems == 0) { if (!m_createIfNecessary) return EC_TagNotFound; else return makeOFCondition(OFM_dcmdata, 25, OF_error, "Cannot insert unspecified number (wildcard) of items into sequence"); } // copy every item to result for (itemNo = 0; itemNo < numItems; itemNo++) { DcmItem* oneItem = seq->getItem(itemNo); /* if we found an item that matches, copy current result path, then add the item found and finally start recursive search for that item. */ if (oneItem != NULL) { // if the item was the last thing to parse, add list to results and return if (restPath.empty()) { DcmPathNode* itemNode = new DcmPathNode(oneItem, itemNo); DcmPath* currentResult = new DcmPath(m_currentPath); currentResult->append(itemNode); m_results.push_back(currentResult); newPathsCreated++; } // else there is path left: continue searching in the new item else { DcmPathNode* itemNode = new DcmPathNode(oneItem, itemNo); m_currentPath.push_back(itemNode); status = findOrCreateItemPath(oneItem, restPath); m_currentPath.pop_back(); // avoid side effects delete itemNode; itemNode = NULL; if (status.bad()) // we did not find the path in that item { if (status != EC_TagNotFound) return status; } else { newPathsCreated++; } } } else // should be possible to get every item, however... return EC_IllegalCall; } // if there was at least one result, success can be returned if (newPathsCreated != 0) { return EC_Normal; } else return EC_TagNotFound; } /* no wildcard, just select single item or create it if necessary */ // if item already exists, just grab a reference if (itemNo < seq->card()) resultItem = seq->getItem(itemNo); // if item does not exist, create new if desired else if (m_createIfNecessary) { // create and insert items until desired item count is reached while ( (seq->card() <= itemNo) || (status.bad()) ) { resultItem = new DcmItem(); if (!resultItem) return EC_MemoryExhausted; status = seq->insert(resultItem); if (status.bad()) delete resultItem; else newlyCreated++; } } // item does not exist and should not be created newly, return "path not found" else return EC_TagNotFound; // at this point, the item has been obtained and everyhthing is fine so far // finding/creating the path was successful. now check whether there is more to do if (!restPath.empty()) { // push new item to result path and continue DcmPathNode* itemNode = new DcmPathNode(resultItem, itemNo); m_currentPath.push_back(itemNode); status = findOrCreateItemPath(resultItem, restPath); m_currentPath.pop_back(); // avoid side effects to input parameter delete itemNode; itemNode = NULL; // in case of no success, delete any items that were newly created and return error if (status.bad()) { for (Uint32 i=newlyCreated; i > 0; i--) { DcmItem *todelete = seq->remove(i-1); if (todelete != NULL) { delete todelete; todelete = NULL; } } return status; } } else // finally everything was successful { DcmPathNode* itemNode = new DcmPathNode(resultItem, itemNo); m_currentPath.push_back(itemNode); m_results.push_back(new DcmPath(m_currentPath)); m_currentPath.pop_back(); // avoid side effects delete itemNode; itemNode = NULL; status = EC_Normal; } return status; } DcmTagKey DcmPathProcessor::calcPrivateReservationTag(const DcmTagKey &privateKey) { DcmTagKey reservationTag(0xFFFF, 0xFFFF); // if not a private key is given return "error" if (!privateKey.isPrivate()) return reservationTag; // if the private key given is already a reservation key, return it if (privateKey.isPrivateReservation()) return privateKey; // Calculate corresponding private creator element Uint16 elemNo = privateKey.getElement(); // Get yz from given element number wxyz, groups stays the same elemNo >>= 8; reservationTag.setGroup(privateKey.getGroup()); reservationTag.setElement(elemNo); return reservationTag; } OFCondition DcmPathProcessor::checkPrivateTagReservation(DcmItem *item /* in */, DcmTag& tag /* in/out */) { OFCondition result; // if this is already a private reservation, there is nothing to do if (m_checkPrivateReservations && !tag.isPrivateReservation()) { DcmTagKey reservationKey = calcPrivateReservationTag(tag); if (reservationKey == DCM_UndefinedTagKey) { OFString msg("Path evaluation error: Unable to compute private reservation for tag: "); msg += tag.toString(); return makeOFCondition(OFM_dcmdata, 25, OF_error, msg.c_str()); } if (!item->tagExists(reservationKey)) { OFString msg("Invalid path: No private reservation found for tag: "); msg += tag.toString(); return makeOFCondition(OFM_dcmdata, 25, OF_error, msg.c_str()); } else { // set private creator for new element OFString privCreator; result = item->findAndGetOFString(reservationKey, privCreator); if (result.bad() || (privCreator.empty())) { privCreator = "Invalid or empty private creator tag: "; privCreator += reservationKey.toString(); return makeOFCondition(OFM_dcmdata, 25, OF_error, privCreator.c_str()); } // tell tag that its private creator and VR tag.setPrivateCreator(privCreator.c_str()); tag.lookupVRinDictionary(); // not done automatically when saving } } return EC_Normal; } /* ** CVS/RCS Log: ** $Log: dcpath.cc,v $ ** Revision 1.15 2010-11-08 09:49:03 uli ** Fixed even more gcc warnings caused by additional compiler flags. ** ** Revision 1.14 2010-11-01 10:42:44 uli ** Fixed some compiler warnings reported by gcc with additional flags. ** ** Revision 1.13 2010-10-14 13:14:08 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.12 2010-07-01 16:56:17 joergr ** Replaced "OFString::length() == 0" by "OFString::empty()". ** Removed superfluous curly brackets. ** ** Revision 1.11 2009-11-04 09:58:10 uli ** Switched to logging mechanism provided by the "new" oflog module ** ** Revision 1.10 2009-09-29 12:55:25 uli ** Include only the needed headers in dcpath.h and dcpath.cc ** ** Revision 1.9 2009-09-04 13:53:09 meichel ** Minor const iterator related changes needed to compile with VC6 with HAVE_STL ** ** Revision 1.8 2009-08-26 07:47:34 joergr ** Added check on size of long in order to avoid warnings reported by gcc 4.3.2. ** ** Revision 1.7 2009-08-19 11:56:58 meichel ** Fixed parameter that was declared as const in the implementation and ** as non-const in the class declaration. ** ** Revision 1.6 2009-07-10 13:12:16 onken ** Added override key functionality used by tools like findscu to the more ** central DcmPathProcessor class. ** ** Revision 1.5 2009-07-08 16:09:12 onken ** Cleaned up code for private reservation checking and added option for ** disabling item wildcards for searching/creating tag paths. ** ** Revision 1.4 2009-01-15 16:04:02 onken ** Added options for handling of private tags and fixed bug for deleting ** tags on main level. ** ** Revision 1.3 2009-01-12 12:37:41 onken ** Fixed iterators to also compile with STL classes being enabled. ** ** Revision 1.2 2008-12-12 12:07:11 onken ** Fixed memory leak in path searching function. ** ** Revision 1.1 2008-12-12 11:44:41 onken ** Moved path access functions to separate classes ** */ dcmtk-3.6.0/dcmdata/libsrc/dcvrsh.cc0000644000310500011400000001461411457616141016526 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Gerd Ehlers * * Purpose: Implementation of class DcmShortString * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-20 16:44:17 $ * CVS/RCS Revision: $Revision: 1.21 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcvrsh.h" // ******************************** DcmShortString::DcmShortString(const DcmTag &tag, const Uint32 len) : DcmCharString(tag, len) { setMaxLength(16); setNonSignificantChars(" \\"); } DcmShortString::DcmShortString(const DcmShortString &old) : DcmCharString(old) { } DcmShortString::~DcmShortString() { } DcmShortString &DcmShortString::operator=(const DcmShortString &obj) { DcmCharString::operator=(obj); return *this; } OFCondition DcmShortString::copyFrom(const DcmObject& rhs) { if (this != &rhs) { if (rhs.ident() != ident()) return EC_IllegalCall; *this = OFstatic_cast(const DcmShortString &, rhs); } return EC_Normal; } // ******************************** DcmEVR DcmShortString::ident() const { return EVR_SH; } OFCondition DcmShortString::checkValue(const OFString &vm, const OFBool /*oldFormat*/) { OFString strVal; /* get "raw value" without any modifications (if possible) */ OFCondition l_error = getStringValue(strVal); if (l_error.good()) l_error = DcmShortString::checkStringValue(strVal, vm); return l_error; } // ******************************** OFCondition DcmShortString::getOFString(OFString &stringVal, const unsigned long pos, OFBool normalize) { OFCondition l_error = DcmCharString::getOFString(stringVal, pos, normalize); if (l_error.good() && normalize) normalizeString(stringVal, !MULTIPART, DELETE_LEADING, DELETE_TRAILING); return l_error; } // ******************************** OFCondition DcmShortString::checkStringValue(const OFString &value, const OFString &vm) { return DcmByteString::checkStringValue(value, vm, "lo", 12 /*, maxLength: 16 characters */); } /* ** CVS/RCS Log: ** $Log: dcvrsh.cc,v $ ** Revision 1.21 2010-10-20 16:44:17 joergr ** Use type cast macros (e.g. OFstatic_cast) where appropriate. ** ** Revision 1.20 2010-10-14 13:14:10 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.19 2010-04-23 14:30:34 joergr ** Added new method to all VR classes which checks whether the stored value ** conforms to the VR definition and to the specified VM. ** ** Revision 1.18 2009-08-07 14:35:49 joergr ** Enhanced isEmpty() method by checking whether the data element value consists ** of non-significant characters only. ** ** Revision 1.17 2009-08-03 09:03:00 joergr ** Added methods that check whether a given string value conforms to the VR and ** VM definitions of the DICOM standards. ** ** Revision 1.16 2008-07-17 10:31:32 onken ** Implemented copyFrom() method for complete DcmObject class hierarchy, which ** permits setting an instance's value from an existing object. Implemented ** assignment operator where necessary. ** ** Revision 1.15 2007-06-29 14:17:49 meichel ** Code clean-up: Most member variables in module dcmdata are now private, ** not protected anymore. ** ** Revision 1.14 2005/12/08 15:42:01 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.13 2002/12/06 13:20:51 joergr ** Enhanced "print()" function by re-working the implementation and replacing ** the boolean "showFullData" parameter by a more general integer flag. ** Made source code formatting more consistent with other modules/files. ** ** Revision 1.12 2002/04/25 10:32:46 joergr ** Removed getOFStringArray() implementation. ** ** Revision 1.11 2001/09/25 17:19:59 meichel ** Adapted dcmdata to class OFCondition ** ** Revision 1.10 2001/06/01 15:49:19 meichel ** Updated copyright header ** ** Revision 1.9 2000/03/08 16:26:50 meichel ** Updated copyright header. ** ** Revision 1.8 1999/03/31 09:25:57 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.7 1998/11/12 16:48:29 meichel ** Implemented operator= for all classes derived from DcmObject. ** ** Revision 1.6 1997/08/29 13:11:48 andreas ** Corrected Bug in getOFStringArray Implementation ** ** Revision 1.5 1997/08/29 08:33:00 andreas ** - Added methods getOFString and getOFStringArray for all ** string VRs. These methods are able to normalise the value, i. e. ** to remove leading and trailing spaces. This will be done only if ** it is described in the standard that these spaces are not relevant. ** These methods do not test the strings for conformance, this means ** especially that they do not delete spaces where they are not allowed! ** getOFStringArray returns the string with all its parts separated by \ ** and getOFString returns only one value of the string. ** CAUTION: Currently getString returns a string with trailing ** spaces removed (if dcmEnableAutomaticInputDataCorrection == OFTrue) and ** truncates the original string (since it is not copied!). If you rely on this ** behaviour please change your application now. ** Future changes will ensure that getString returns the original ** string from the DICOM object (NULL terminated) inclusive padding. ** Currently, if you call getOF... before calling getString without ** normalisation, you can get the original string read from the DICOM object. ** ** Revision 1.4 1997/07/03 15:10:17 andreas ** - removed debugging functions Bdebug() and Edebug() since ** they write a static array and are not very useful at all. ** Cdebug and Vdebug are merged since they have the same semantics. ** The debugging functions in dcmdata changed their interfaces ** (see dcmdata/include/dcdebug.h) ** ** Revision 1.3 1996/01/05 13:27:52 andreas ** - changed to support new streaming facilities ** - unique read/write methods for file and block transfer ** - more cleanups ** */ dcmtk-3.6.0/dcmdata/libsrc/dcrlecp.cc0000644000310500011400000000451111455601041016633 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Marco Eichelberg * * Purpose: codec parameter for RLE * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:14:09 $ * CVS/RCS Revision: $Revision: 1.5 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" #include "dcmtk/dcmdata/dcrlecp.h" DcmRLECodecParameter::DcmRLECodecParameter( OFBool pCreateSOPInstanceUID, Uint32 pFragmentSize, OFBool pCreateOffsetTable, OFBool pConvertToSC, OFBool pReverseDecompressionByteOrder) : DcmCodecParameter() , fragmentSize(pFragmentSize) , createOffsetTable(pCreateOffsetTable) , convertToSC(pConvertToSC) , createInstanceUID(pCreateSOPInstanceUID) , reverseDecompressionByteOrder(pReverseDecompressionByteOrder) { } DcmRLECodecParameter::DcmRLECodecParameter(const DcmRLECodecParameter& arg) : DcmCodecParameter(arg) , fragmentSize(arg.fragmentSize) , createOffsetTable(arg.createOffsetTable) , convertToSC(arg.convertToSC) , createInstanceUID(arg.createInstanceUID) , reverseDecompressionByteOrder(arg.reverseDecompressionByteOrder) { } DcmRLECodecParameter::~DcmRLECodecParameter() { } DcmCodecParameter *DcmRLECodecParameter::clone() const { return new DcmRLECodecParameter(*this); } const char *DcmRLECodecParameter::className() const { return "DcmRLECodecParameter"; } /* * CVS/RCS Log * $Log: dcrlecp.cc,v $ * Revision 1.5 2010-10-14 13:14:09 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.4 2009-11-04 09:58:10 uli * Switched to logging mechanism provided by the "new" oflog module * * Revision 1.3 2005-12-08 15:41:31 meichel * Changed include path schema for all DCMTK header files * * Revision 1.2 2005/07/26 17:08:35 meichel * Added option to RLE decoder that allows to correctly decode images with * incorrect byte order of byte segments (LSB instead of MSB). * * Revision 1.1 2002/06/06 14:52:41 meichel * Initial release of the new RLE codec classes * and the dcmcrle/dcmdrle tools in module dcmdata * * */ dcmtk-3.6.0/dcmdata/libsrc/dcvrpn.cc0000644000310500011400000004103111457616141016522 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Gerd Ehlers, Andreas Barth * * Purpose: Implementation of class DcmPersonName * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-20 16:44:17 $ * CVS/RCS Revision: $Revision: 1.25 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcvrpn.h" // ******************************** DcmPersonName::DcmPersonName(const DcmTag &tag, const Uint32 len) : DcmCharString(tag, len) { setMaxLength(64); // not correct: max length of PN is 3*64+2 = 194 characters (not bytes!) setNonSignificantChars(" \\^="); } DcmPersonName::DcmPersonName(const DcmPersonName& old) : DcmCharString(old) { } DcmPersonName::~DcmPersonName() { } DcmPersonName &DcmPersonName::operator=(const DcmPersonName &obj) { DcmCharString::operator=(obj); return *this; } OFCondition DcmPersonName::copyFrom(const DcmObject& rhs) { if (this != &rhs) { if (rhs.ident() != ident()) return EC_IllegalCall; *this = OFstatic_cast(const DcmPersonName &, rhs); } return EC_Normal; } // ******************************** DcmEVR DcmPersonName::ident() const { return EVR_PN; } OFCondition DcmPersonName::checkValue(const OFString &vm, const OFBool oldFormat) { OFString strVal; /* get "raw value" without any modifications (if possible) */ OFCondition l_error = getStringValue(strVal); if (l_error.good()) l_error = DcmPersonName::checkStringValue(strVal, vm, oldFormat); return l_error; } // ******************************** OFCondition DcmPersonName::getOFString(OFString &stringVal, const unsigned long pos, OFBool normalize) { OFCondition l_error = DcmCharString::getOFString(stringVal, pos, normalize); if (l_error.good() && normalize) normalizeString(stringVal, !MULTIPART, !DELETE_LEADING, DELETE_TRAILING); return l_error; } // ******************************** OFCondition DcmPersonName::getNameComponents(OFString &lastName, OFString &firstName, OFString &middleName, OFString &namePrefix, OFString &nameSuffix, const unsigned long pos, const unsigned int componentGroup) { OFString dicomName; OFCondition l_error = getOFString(dicomName, pos); if (l_error.good()) l_error = getNameComponentsFromString(dicomName, lastName, firstName, middleName, namePrefix, nameSuffix, componentGroup); else { lastName.clear(); firstName.clear(); middleName.clear(); namePrefix.clear(); nameSuffix.clear(); } return l_error; } OFCondition DcmPersonName::getNameComponentsFromString(const OFString &dicomName, OFString &lastName, OFString &firstName, OFString &middleName, OFString &namePrefix, OFString &nameSuffix, const unsigned int componentGroup) { OFCondition l_error = EC_Normal; /* initialize all name components */ lastName.clear(); firstName.clear(); middleName.clear(); namePrefix.clear(); nameSuffix.clear(); if (dicomName.length() > 0) { /* Excerpt from DICOM part 5: "For the purpose of writing names in ideographic characters and in phonetic characters, up to 3 groups of components may be used." */ if (componentGroup < 3) { OFString name; // find component group (0..2) const size_t posA = dicomName.find('='); if (posA != OFString_npos) { if (componentGroup > 0) { const size_t posB = dicomName.find('=', posA + 1); if (posB != OFString_npos) { if (componentGroup == 1) name = dicomName.substr(posA + 1, posB - posA - 1); else /* componentGroup == 2 */ name = dicomName.substr(posB + 1); } else if (componentGroup == 1) name = dicomName.substr(posA + 1); } else /* componentGroup == 0 */ name = dicomName.substr(0, posA); } else if (componentGroup == 0) name = dicomName; /* check whether component group is valid (= non-empty) */ if (name.length() > 0) { /* find caret separators */ /* (tbd: add more sophisticated heuristics for comma and space separated names) */ const size_t pos1 = name.find('^'); if (pos1 != OFString_npos) { const size_t pos2 = name.find('^', pos1 + 1); lastName = name.substr(0, pos1); if (pos2 != OFString_npos) { const size_t pos3 = name.find('^', pos2 + 1); firstName = name.substr(pos1 + 1, pos2 - pos1 - 1); if (pos3 != OFString_npos) { const size_t pos4 = name.find('^', pos3 + 1); middleName = name.substr(pos2 + 1, pos3 - pos2 - 1); if (pos4 != OFString_npos) { namePrefix = name.substr(pos3 + 1, pos4 - pos3 - 1); nameSuffix = name.substr(pos4 + 1); } else namePrefix = name.substr(pos3 + 1); } else middleName = name.substr(pos2 + 1); } else firstName = name.substr(pos1 + 1); } else lastName = name; } } else l_error = EC_IllegalParameter; } return l_error; } // ******************************** OFCondition DcmPersonName::getFormattedName(OFString &formattedName, const unsigned long pos, const unsigned int componentGroup) { OFString dicomName; OFCondition l_error = getOFString(dicomName, pos); if (l_error.good()) l_error = getFormattedNameFromString(dicomName, formattedName, componentGroup); else formattedName.clear(); return l_error; } OFCondition DcmPersonName::getFormattedNameFromString(const OFString &dicomName, OFString &formattedName, const unsigned int componentGroup) { OFString lastName, firstName, middleName, namePrefix, nameSuffix; OFCondition l_error = getNameComponentsFromString(dicomName, lastName, firstName, middleName, namePrefix, nameSuffix, componentGroup); if (l_error.good()) l_error = getFormattedNameFromComponents(lastName, firstName, middleName, namePrefix, nameSuffix, formattedName); else formattedName.clear(); return l_error; } OFCondition DcmPersonName::getFormattedNameFromComponents(const OFString &lastName, const OFString &firstName, const OFString &middleName, const OFString &namePrefix, const OFString &nameSuffix, OFString &formattedName) { formattedName.clear(); /* concatenate name components */ if (namePrefix.length() > 0) formattedName += namePrefix; if (firstName.length() > 0) { if (formattedName.length() > 0) formattedName += ' '; formattedName += firstName; } if (middleName.length() > 0) { if (formattedName.length() > 0) formattedName += ' '; formattedName += middleName; } if (lastName.length() > 0) { if (formattedName.length() > 0) formattedName += ' '; formattedName += lastName; } if (nameSuffix.length() > 0) { if (formattedName.length() > 0) formattedName += ", "; formattedName += nameSuffix; } return EC_Normal; } OFCondition DcmPersonName::getStringFromNameComponents(const OFString &lastName, const OFString &firstName, const OFString &middleName, const OFString &namePrefix, const OFString &nameSuffix, OFString &dicomName) { const size_t middleLen = middleName.length(); const size_t prefixLen = namePrefix.length(); const size_t suffixLen = nameSuffix.length(); /* concatenate name components */ dicomName = lastName; if (firstName.length() + middleLen + prefixLen + suffixLen > 0) dicomName += '^'; dicomName += firstName; if (middleLen + prefixLen + suffixLen > 0) dicomName += '^'; dicomName += middleName; if (prefixLen + suffixLen > 0) dicomName += '^'; dicomName += namePrefix; if (suffixLen > 0) dicomName += '^'; dicomName += nameSuffix; return EC_Normal; } // ******************************** OFCondition DcmPersonName::putNameComponents(const OFString &lastName, const OFString &firstName, const OFString &middleName, const OFString &namePrefix, const OFString &nameSuffix) { OFString dicomName; /* concatenate name components */ OFCondition l_error = getStringFromNameComponents(lastName, firstName, middleName, namePrefix, nameSuffix, dicomName); /* put element value */ if (l_error.good()) l_error = putString(dicomName.c_str()); return l_error; } // ******************************** OFCondition DcmPersonName::checkStringValue(const OFString &value, const OFString &vm, const OFBool oldFormat) { /* currently not checked: maximum length per component group (64 characters) */ OFCondition result = EC_Normal; const size_t valLen = value.length(); if (valLen > 0) { size_t posStart = 0; unsigned long vmNum = 0; /* iterate over all value components */ while (posStart != OFString_npos) { ++vmNum; /* search for next component separator */ const size_t posEnd = value.find('\\', posStart); const size_t length = (posEnd == OFString_npos) ? valLen - posStart : posEnd - posStart; /* check value representation */ const int vrID = DcmElement::scanValue(value, "pn", posStart, length); if ((vrID != 11) && (!oldFormat || (vrID != 15))) { result = EC_ValueRepresentationViolated; break; } posStart = (posEnd == OFString_npos) ? posEnd : posEnd + 1; } if (result.good() && !vm.empty()) { /* check value multiplicity */ result = DcmElement::checkVM(vmNum, vm); } } return result; } /* ** CVS/RCS Log: ** $Log: dcvrpn.cc,v $ ** Revision 1.25 2010-10-20 16:44:17 joergr ** Use type cast macros (e.g. OFstatic_cast) where appropriate. ** ** Revision 1.24 2010-10-14 13:14:10 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.23 2010-04-23 14:30:34 joergr ** Added new method to all VR classes which checks whether the stored value ** conforms to the VR definition and to the specified VM. ** ** Revision 1.22 2009-08-07 14:35:49 joergr ** Enhanced isEmpty() method by checking whether the data element value consists ** of non-significant characters only. ** ** Revision 1.21 2009-08-03 09:03:00 joergr ** Added methods that check whether a given string value conforms to the VR and ** VM definitions of the DICOM standards. ** ** Revision 1.20 2008-07-17 10:31:32 onken ** Implemented copyFrom() method for complete DcmObject class hierarchy, which ** permits setting an instance's value from an existing object. Implemented ** assignment operator where necessary. ** ** Revision 1.19 2007-06-29 14:17:49 meichel ** Code clean-up: Most member variables in module dcmdata are now private, ** not protected anymore. ** ** Revision 1.18 2005/12/08 15:41:59 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.17 2003/05/20 09:15:14 joergr ** Added methods and static functions to compose a DICOM Person Name from five ** name components. ** ** Revision 1.16 2002/12/06 13:20:51 joergr ** Enhanced "print()" function by re-working the implementation and replacing ** the boolean "showFullData" parameter by a more general integer flag. ** Made source code formatting more consistent with other modules/files. ** ** Revision 1.15 2002/04/25 10:32:45 joergr ** Removed getOFStringArray() implementation. ** ** Revision 1.14 2002/04/11 12:28:56 joergr ** Enhanced documentation. ** ** Revision 1.13 2001/10/10 15:22:05 joergr ** Updated comments. ** ** Revision 1.12 2001/10/01 15:04:44 joergr ** Introduced new general purpose functions to get/set person names, date, time ** and date/time. ** ** Revision 1.11 2001/09/25 17:19:59 meichel ** Adapted dcmdata to class OFCondition ** ** Revision 1.10 2001/06/01 15:49:19 meichel ** Updated copyright header ** ** Revision 1.9 2000/03/08 16:26:49 meichel ** Updated copyright header. ** ** Revision 1.8 1999/03/31 09:25:55 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.7 1998/11/12 16:48:27 meichel ** Implemented operator= for all classes derived from DcmObject. ** ** Revision 1.6 1997/08/29 13:11:48 andreas ** Corrected Bug in getOFStringArray Implementation ** ** Revision 1.5 1997/08/29 08:33:00 andreas ** - Added methods getOFString and getOFStringArray for all ** string VRs. These methods are able to normalise the value, i. e. ** to remove leading and trailing spaces. This will be done only if ** it is described in the standard that these spaces are not relevant. ** These methods do not test the strings for conformance, this means ** especially that they do not delete spaces where they are not allowed! ** getOFStringArray returns the string with all its parts separated by \ ** and getOFString returns only one value of the string. ** CAUTION: Currently getString returns a string with trailing ** spaces removed (if dcmEnableAutomaticInputDataCorrection == OFTrue) and ** truncates the original string (since it is not copied!). If you rely on this ** behaviour please change your application now. ** Future changes will ensure that getString returns the original ** string from the DICOM object (NULL terminated) inclusive padding. ** Currently, if you call getOF... before calling getString without ** normalisation, you can get the original string read from the DICOM object. ** ** Revision 1.4 1997/07/03 15:10:16 andreas ** - removed debugging functions Bdebug() and Edebug() since ** they write a static array and are not very useful at all. ** Cdebug and Vdebug are merged since they have the same semantics. ** The debugging functions in dcmdata changed their interfaces ** (see dcmdata/include/dcdebug.h) ** ** Revision 1.3 1996/01/05 13:27:52 andreas ** - changed to support new streaming facilities ** - unique read/write methods for file and block transfer ** - more cleanups ** */ dcmtk-3.6.0/dcmdata/libsrc/dcpixseq.cc0000644000310500011400000004454411457616140017061 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Gerd Ehlers, Andreas Barth * * Purpose: Implementation of class DcmPixelSequence * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-20 16:44:16 $ * CVS/RCS Revision: $Revision: 1.48 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #define INCLUDE_CSTDLIB #define INCLUDE_CSTDIO #include "dcmtk/ofstd/ofstdinc.h" #include "dcmtk/ofstd/ofstream.h" #include "dcmtk/dcmdata/dcpixseq.h" #include "dcmtk/dcmdata/dcpxitem.h" #include "dcmtk/dcmdata/dcitem.h" #include "dcmtk/dcmdata/dcvr.h" #include "dcmtk/dcmdata/dcdeftag.h" // ******************************** DcmPixelSequence::DcmPixelSequence(const DcmTag &tag, const Uint32 len) : DcmSequenceOfItems(tag, len), Xfer(EXS_Unknown) { setTagVR(EVR_OB); setLengthField(DCM_UndefinedLength); // pixel sequences always use undefined length } DcmPixelSequence::DcmPixelSequence(const DcmPixelSequence &old) : DcmSequenceOfItems(old), Xfer(old.Xfer) { /* everything gets handled in DcmSequenceOfItems constructor */ } DcmPixelSequence::~DcmPixelSequence() { } DcmPixelSequence &DcmPixelSequence::operator=(const DcmPixelSequence &obj) { if (this != &obj) { DcmSequenceOfItems::operator=(obj); Xfer = obj.Xfer; } return *this; } OFCondition DcmPixelSequence::copyFrom(const DcmObject& rhs) { if (this != &rhs) { if (rhs.ident() != ident()) return EC_IllegalCall; *this = OFstatic_cast(const DcmPixelSequence &, rhs); } return EC_Normal; } // ******************************** void DcmPixelSequence::print(STD_NAMESPACE ostream &out, const size_t flags, const int level, const char *pixelFileName, size_t *pixelCounter) { /* print pixel sequence start line */ if (flags & DCMTypes::PF_showTreeStructure) { /* empty text */ printInfoLine(out, flags, level); /* print pixel sequence content */ if (!itemList->empty()) { /* print pixel items */ DcmObject *dO; itemList->seek(ELP_first); do { dO = itemList->get(); dO->print(out, flags, level + 1, pixelFileName, pixelCounter); } while (itemList->seek(ELP_next)); } } else { OFOStringStream oss; oss << "(PixelSequence "; if (getLengthField() != DCM_UndefinedLength) oss << "with explicit length "; oss << "#=" << card() << ")" << OFStringStream_ends; OFSTRINGSTREAM_GETSTR(oss, tmpString) printInfoLine(out, flags, level, tmpString); OFSTRINGSTREAM_FREESTR(tmpString) /* print pixel sequence content */ if (!itemList->empty()) { DcmObject *dO; itemList->seek(ELP_first); do { dO = itemList->get(); dO->print(out, flags, level + 1, pixelFileName, pixelCounter); } while (itemList->seek(ELP_next)); } /* print pixel sequence end line */ DcmTag delimItemTag(DCM_SequenceDelimitationItem); if (getLengthField() == DCM_UndefinedLength) printInfoLine(out, flags, level, "(SequenceDelimitationItem)", &delimItemTag); else printInfoLine(out, flags, level, "(SequenceDelimitationItem for re-encod.)", &delimItemTag); } } // ******************************** Uint32 DcmPixelSequence::calcElementLength(const E_TransferSyntax xfer, const E_EncodingType enctype) { // add 8 bytes for Sequence Delimitation Tag which always exists for Pixel Sequences return DcmElement::calcElementLength(xfer, enctype) + 8; } // ******************************** OFCondition DcmPixelSequence::makeSubObject(DcmObject *&subObject, const DcmTag &newTag, const Uint32 newLength) { OFCondition l_error = EC_Normal; DcmObject *newObject = NULL; switch (newTag.getEVR()) { case EVR_na: if (newTag.getXTag() == DCM_Item) newObject = new DcmPixelItem(newTag, newLength); else if (newTag.getXTag() == DCM_SequenceDelimitationItem) l_error = EC_SequEnd; else if (newTag.getXTag() == DCM_ItemDelimitationItem) l_error = EC_ItemEnd; else l_error = EC_InvalidTag; break; default: newObject = new DcmPixelItem(newTag, newLength); l_error = EC_CorruptedData; break; } subObject = newObject; return l_error; } // ******************************** OFCondition DcmPixelSequence::insert(DcmPixelItem *item, unsigned long where) { errorFlag = EC_Normal; if (item != NULL) { itemList->seek_to(where); itemList->insert(item); if (where < itemList->card()) DCMDATA_TRACE("DcmPixelSequence::insert() Item at position " << where << " inserted"); if (where >= itemList->card()) DCMDATA_TRACE("DcmPixelSequence::insert() Item at last position inserted"); } else errorFlag = EC_IllegalCall; return errorFlag; } // ******************************** OFCondition DcmPixelSequence::getItem(DcmPixelItem *&item, const unsigned long num) { errorFlag = EC_Normal; item = OFstatic_cast(DcmPixelItem*, itemList->seek_to(num)); // read item from list if (item == NULL) errorFlag = EC_IllegalCall; return errorFlag; } // ******************************** OFCondition DcmPixelSequence::remove(DcmPixelItem *&item, const unsigned long num) { errorFlag = EC_Normal; item = OFstatic_cast(DcmPixelItem*, itemList->seek_to(num)); // read item from list if (item != NULL) itemList->remove(); else errorFlag = EC_IllegalCall; return errorFlag; } // ******************************** OFCondition DcmPixelSequence::remove(DcmPixelItem *item) { errorFlag = EC_IllegalCall; if (!itemList->empty() && item != NULL) { DcmObject *dO; itemList->seek(ELP_first); do { dO = itemList->get(); if (dO == item) { itemList->remove(); // remove element from list, but do no delete it errorFlag = EC_Normal; break; } } while (itemList->seek(ELP_next)); } return errorFlag; } // ******************************** OFCondition DcmPixelSequence::changeXfer(const E_TransferSyntax newXfer) { if (Xfer == EXS_Unknown || canWriteXfer(newXfer, Xfer)) { Xfer = newXfer; return EC_Normal; } else return EC_IllegalCall; } // ******************************** OFBool DcmPixelSequence::canWriteXfer(const E_TransferSyntax newXfer, const E_TransferSyntax oldXfer) { DcmXfer newXferSyn(newXfer); return newXferSyn.isEncapsulated() && newXfer == oldXfer && oldXfer == Xfer; } // ******************************** OFCondition DcmPixelSequence::read(DcmInputStream &inStream, const E_TransferSyntax ixfer, const E_GrpLenEncoding glenc, const Uint32 maxReadLength) { OFCondition l_error = changeXfer(ixfer); if (l_error.good()) return DcmSequenceOfItems::read(inStream, ixfer, glenc, maxReadLength); return l_error; } // ******************************** OFCondition DcmPixelSequence::write(DcmOutputStream &outStream, const E_TransferSyntax oxfer, const E_EncodingType /*enctype*/, DcmWriteCache *wcache) { OFCondition l_error = changeXfer(oxfer); if (l_error.good()) return DcmSequenceOfItems::write(outStream, oxfer, EET_UndefinedLength, wcache); return l_error; } // ******************************** OFCondition DcmPixelSequence::writeSignatureFormat(DcmOutputStream &outStream, const E_TransferSyntax oxfer, const E_EncodingType /*enctype*/, DcmWriteCache *wcache) { OFCondition l_error = changeXfer(oxfer); if (l_error.good()) return DcmSequenceOfItems::writeSignatureFormat(outStream, oxfer, EET_UndefinedLength, wcache); return l_error; } OFCondition DcmPixelSequence::storeCompressedFrame(DcmOffsetList &offsetList, Uint8 *compressedData, Uint32 compressedLen, Uint32 fragmentSize) { if (compressedData == NULL) return EC_IllegalCall; OFCondition result = EC_Normal; if (fragmentSize >= 0x400000) fragmentSize = 0; // prevent overflow else fragmentSize <<= 10; // unit is kbytes if (fragmentSize == 0) fragmentSize = compressedLen; Uint32 offset = 0; Uint32 currentSize = 0; Uint32 numFragments = 0; DcmPixelItem *fragment = NULL; while ((offset < compressedLen) && (result.good())) { fragment = new DcmPixelItem(DcmTag(DCM_Item, EVR_OB)); if (fragment == NULL) result = EC_MemoryExhausted; else { insert(fragment); numFragments++; currentSize = fragmentSize; if (offset + currentSize > compressedLen) currentSize = compressedLen - offset; // if currentSize is odd this will be fixed during DcmOtherByteOtherWord::write() result = fragment->putUint8Array(compressedData + offset, currentSize); if (result.good()) offset += currentSize; } } currentSize = offset + (numFragments << 3); // 8 bytes extra for each item header // odd frame size requires padding, i.e. last fragment uses odd length pixel item if (currentSize & 1) currentSize++; offsetList.push_back(currentSize); return result; } /* ** CVS/RCS Log: ** $Log: dcpixseq.cc,v $ ** Revision 1.48 2010-10-20 16:44:16 joergr ** Use type cast macros (e.g. OFstatic_cast) where appropriate. ** ** Revision 1.47 2010-10-14 13:14:08 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.46 2009-12-04 17:08:52 joergr ** Sightly modified some log messages. ** ** Revision 1.45 2009-11-04 09:58:10 uli ** Switched to logging mechanism provided by the "new" oflog module ** ** Revision 1.44 2009-02-04 17:58:28 joergr ** Uncommented name of unused parameter in order to avoid compiler warnings. ** ** Revision 1.43 2009-02-04 10:18:57 joergr ** Fixed issue with compressed frames of odd length (possibly wrong values in ** basic offset table). ** ** Revision 1.42 2009-01-06 16:27:03 joergr ** Reworked print() output format for option PF_showTreeStructure. ** ** Revision 1.41 2008-07-17 10:31:32 onken ** Implemented copyFrom() method for complete DcmObject class hierarchy, which ** permits setting an instance's value from an existing object. Implemented ** assignment operator where necessary. ** ** Revision 1.40 2007-11-29 14:30:21 meichel ** Write methods now handle large raw data elements (such as pixel data) ** without loading everything into memory. This allows very large images to ** be sent over a network connection, or to be copied without ever being ** fully in memory. ** ** Revision 1.39 2007/11/23 15:42:36 meichel ** Copy assignment operators in dcmdata now safe for self assignment ** ** Revision 1.38 2007/06/29 14:17:49 meichel ** Code clean-up: Most member variables in module dcmdata are now private, ** not protected anymore. ** ** Revision 1.37 2006/08/15 15:49:54 meichel ** Updated all code in module dcmdata to correctly compile when ** all standard C++ classes remain in namespace std. ** ** Revision 1.36 2005/12/08 15:41:26 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.35 2005/11/28 15:53:13 meichel ** Renamed macros in dcdebug.h ** ** Revision 1.34 2005/05/27 09:45:38 meichel ** Fixed bug that caused incorrect sequence and item lengths to be computed for ** compressed pixel data embedded in a sequence such as the IconImageSequence. ** ** Revision 1.33 2004/02/04 16:41:37 joergr ** Adapted type casts to new-style typecast operators defined in ofcast.h. ** Removed acknowledgements with e-mail addresses from CVS log. ** ** Revision 1.32 2003/03/21 13:08:04 meichel ** Minor code purifications for warnings reported by MSVC in Level 4 ** ** Revision 1.31 2003/01/06 09:29:49 joergr ** Performed minor text corrections to get a more consistent print() output. ** ** Revision 1.30 2002/12/06 13:16:58 joergr ** Enhanced "print()" function by re-working the implementation and replacing ** the boolean "showFullData" parameter by a more general integer flag. ** Made source code formatting more consistent with other modules/files. ** ** Revision 1.29 2002/11/27 12:06:50 meichel ** Adapted module dcmdata to use of new header file ofstdinc.h ** ** Revision 1.28 2002/08/27 16:55:55 meichel ** Initial release of new DICOM I/O stream classes that add support for stream ** compression (deflated little endian explicit VR transfer syntax) ** ** Revision 1.27 2002/05/24 14:51:50 meichel ** Moved helper methods that are useful for different compression techniques ** from module dcmjpeg to module dcmdata ** ** Revision 1.26 2002/04/16 13:43:19 joergr ** Added configurable support for C++ ANSI standard includes (e.g. streams). ** ** Revision 1.25 2001/09/25 17:19:52 meichel ** Adapted dcmdata to class OFCondition ** ** Revision 1.24 2001/06/01 15:49:07 meichel ** Updated copyright header ** ** Revision 1.23 2000/11/07 16:56:22 meichel ** Initial release of dcmsign module for DICOM Digital Signatures ** ** Revision 1.22 2000/03/08 16:26:39 meichel ** Updated copyright header. ** ** Revision 1.21 2000/03/06 18:13:44 joergr ** Local variable hided member variable (reported by Sun CC 4.2). ** ** Revision 1.20 2000/03/03 15:02:10 joergr ** Corrected bug related to padding of file and item size. ** ** Revision 1.19 2000/02/23 15:11:58 meichel ** Corrected macro for Borland C++ Builder 4 workaround. ** ** Revision 1.18 2000/02/10 10:52:21 joergr ** Added new feature to dcmdump (enhanced print method of dcmdata): write ** pixel data/item value fields to raw files. ** ** Revision 1.17 2000/02/02 14:32:53 joergr ** Replaced 'delete' statements by 'delete[]' for objects created with 'new[]'. ** ** Revision 1.16 2000/02/01 10:12:09 meichel ** Avoiding to include as extern "C" on Borland C++ Builder 4, ** workaround for bug in compiler header files. ** ** Revision 1.15 1999/03/31 09:25:36 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.14 1998/11/12 16:48:18 meichel ** Implemented operator= for all classes derived from DcmObject. ** ** Revision 1.13 1998/07/15 15:52:05 joergr ** Removed several compiler warnings reported by gcc 2.8.1 with ** additional options, e.g. missing copy constructors and assignment ** operators, initialization of member variables in the body of a ** constructor instead of the member initialization list, hiding of ** methods by use of identical names, uninitialized member variables, ** missing const declaration of char pointers. Replaced tabs by spaces. ** ** Revision 1.12 1997/07/21 08:19:33 andreas ** - New environment for encapsulated pixel representations. DcmPixelData ** can contain different representations and uses codecs to convert ** between them. Codecs are derived from the DcmCodec class. New error ** codes are introduced for handling of representations. New internal ** value representation (only for ident()) for PixelData ** - Replace all boolean types (BOOLEAN, CTNBOOLEAN, DICOM_BOOL, BOOL) ** with one unique boolean type OFBool. ** ** Revision 1.11 1997/07/07 07:51:36 andreas ** - Changed type for Tag attribute in DcmObject from prointer to value ** - Enhanced (faster) byte swapping routine. swapIfNecessary moved from ** a method in DcmObject to a general function. ** ** Revision 1.10 1997/07/03 15:10:02 andreas ** - removed debugging functions Bdebug() and Edebug() since ** they write a static array and are not very useful at all. ** Cdebug and Vdebug are merged since they have the same semantics. ** The debugging functions in dcmdata changed their interfaces ** (see dcmdata/include/dcdebug.h) ** ** Revision 1.9 1997/06/06 09:55:30 andreas ** - corrected error: canWriteXfer returns false if the old transfer syntax ** was unknown, which causes several applications to prohibit the writing ** of dataset. ** ** Revision 1.8 1997/05/27 13:49:01 andreas ** - Add method canWriteXfer to class DcmObject and all derived classes. ** This method checks whether it is possible to convert the original ** transfer syntax to an new transfer syntax. The check is used in the ** dcmconv utility to prohibit the change of a compressed transfer ** syntax to a uncompressed. ** ** Revision 1.7 1997/05/26 15:08:15 andreas ** - Corrected typo in write method ** ** Revision 1.6 1997/05/22 16:57:15 andreas ** - Corrected errors for writing of pixel sequences for encapsulated ** transfer syntaxes. ** ** Revision 1.5 1996/08/05 08:46:15 andreas ** new print routine with additional parameters: ** - print into files ** - fix output length for elements ** corrected error in search routine with parameter ESM_fromStackTop ** ** Revision 1.4 1996/01/29 13:38:29 andreas ** - new put method for every VR to put value as a string ** - better and unique print methods ** ** Revision 1.3 1996/01/05 13:27:40 andreas ** - changed to support new streaming facilities ** - unique read/write methods for file and block transfer ** - more cleanups ** */ dcmtk-3.6.0/dcmdata/libsrc/CMakeLists.txt0000644000310500011400000000134211435754411017457 0ustar joergrdicom3# create library from source files ADD_LIBRARY(dcmdata cmdlnarg dcbytstr dcchrstr dccodec dcdatset dcddirif dcdicdir dcdicent dcdict dcdictzz dcdirrec dcelem dcerror dcfilefo dchashdi dcistrma dcistrmb dcistrmf dcistrmz dcitem dclist dcmetinf dcobject dcostrma dcostrmb dcostrmf dcostrmz dcpcache dcpixel dcpixseq dcpxitem dcrleccd dcrlecce dcrlecp dcrledrg dcrleerg dcrlerp dcsequen dcstack dcswap dctag dctagkey dctypes dcuid dcwcache dcvm dcvr dcvrae dcvras dcvrat dcvrcs dcvrda dcvrds dcvrdt dcvrfd dcvrfl dcvris dcvrlo dcvrlt dcvrobow dcvrof dcvrpn dcvrpobw dcvrsh dcvrsl dcvrss dcvrst dcvrtm dcvrui dcvrul dcvrulup dcvrus dcvrut dcxfer dcpath vrscan vrscanl) # declare installation files INSTALL_TARGETS(${INSTALL_LIBDIR} dcmdata) dcmtk-3.6.0/dcmdata/libsrc/dcitem.cc0000644000310500011400000046430611464027275016513 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Gerd Ehlers * * Purpose: class DcmItem * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-11-02 15:31:09 $ * CVS/RCS Revision: $Revision: 1.150 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #define INCLUDE_CSTDLIB #define INCLUDE_CSTDIO #define INCLUDE_CSTRING #define INCLUDE_CCTYPE #include "dcmtk/ofstd/ofstdinc.h" #include "dcmtk/dcmdata/dcitem.h" #include "dcmtk/ofstd/ofdefine.h" /* for memzero() */ #include "dcmtk/dcmdata/dcdeftag.h" /* for name constants */ #include "dcmtk/dcmdata/dcistrma.h" /* for class DcmInputStream */ #include "dcmtk/dcmdata/dcobject.h" #include "dcmtk/dcmdata/dcostrma.h" /* for class DcmOutputStream */ #include "dcmtk/dcmdata/dcovlay.h" #include "dcmtk/dcmdata/dcpixel.h" #include "dcmtk/dcmdata/dcsequen.h" #include "dcmtk/dcmdata/dcswap.h" #include "dcmtk/dcmdata/dcvr.h" #include "dcmtk/dcmdata/dcvrae.h" #include "dcmtk/dcmdata/dcvras.h" #include "dcmtk/dcmdata/dcvrat.h" #include "dcmtk/dcmdata/dcvrcs.h" #include "dcmtk/dcmdata/dcvrda.h" #include "dcmtk/dcmdata/dcvrds.h" #include "dcmtk/dcmdata/dcvrdt.h" #include "dcmtk/dcmdata/dcvrfd.h" #include "dcmtk/dcmdata/dcvrfl.h" #include "dcmtk/dcmdata/dcvris.h" #include "dcmtk/dcmdata/dcvrlo.h" #include "dcmtk/dcmdata/dcvrlt.h" #include "dcmtk/dcmdata/dcvrobow.h" #include "dcmtk/dcmdata/dcvrof.h" #include "dcmtk/dcmdata/dcvrpn.h" #include "dcmtk/dcmdata/dcvrsh.h" #include "dcmtk/dcmdata/dcvrsl.h" #include "dcmtk/dcmdata/dcvrss.h" #include "dcmtk/dcmdata/dcvrst.h" #include "dcmtk/dcmdata/dcvrtm.h" #include "dcmtk/dcmdata/dcvrui.h" #include "dcmtk/dcmdata/dcvrul.h" #include "dcmtk/dcmdata/dcvrulup.h" #include "dcmtk/dcmdata/dcvrus.h" #include "dcmtk/dcmdata/dcvrut.h" #include "dcmtk/dcmdata/dcxfer.h" #include "dcmtk/ofstd/ofstream.h" #include "dcmtk/ofstd/ofstring.h" #include "dcmtk/ofstd/ofcast.h" #include "dcmtk/ofstd/ofstd.h" // ******************************** DcmItem::DcmItem() : DcmObject(ItemTag), elementList(NULL), lastElementComplete(OFTrue), fStartPosition(0), privateCreatorCache() { elementList = new DcmList; } DcmItem::DcmItem(const DcmTag &tag, const Uint32 len) : DcmObject(tag, len), elementList(NULL), lastElementComplete(OFTrue), fStartPosition(0), privateCreatorCache() { elementList = new DcmList; } DcmItem::DcmItem(const DcmItem &old) : DcmObject(old), elementList(new DcmList), lastElementComplete(old.lastElementComplete), fStartPosition(old.fStartPosition), privateCreatorCache() { if (!old.elementList->empty()) { elementList->seek(ELP_first); old.elementList->seek(ELP_first); do { elementList->insert(old.elementList->get()->clone(), ELP_next); } while (old.elementList->seek(ELP_next)); } } DcmItem& DcmItem::operator=(const DcmItem& obj) { if (this != &obj) { // copy parent's member variables DcmObject::operator=(obj); // delete any existing elements elementList->deleteAllElements(); // copy DcmItem's member variables lastElementComplete = obj.lastElementComplete; fStartPosition = obj.fStartPosition; if (!obj.elementList->empty()) { elementList->seek(ELP_first); obj.elementList->seek(ELP_first); do { elementList->insert(obj.elementList->get()->clone(), ELP_next); } while (obj.elementList->seek(ELP_next)); } } return *this; } OFCondition DcmItem::copyFrom(const DcmObject& rhs) { if (this != &rhs) { if (rhs.ident() != ident()) return EC_IllegalCall; *this = OFstatic_cast(const DcmItem &, rhs); } return EC_Normal; } DcmItem::~DcmItem() { elementList->deleteAllElements(); delete elementList; } // ******************************** OFBool DcmItem::foundVR(const Uint8* atposition) { const Uint8 c1 = atposition[0]; const Uint8 c2 = atposition[1]; OFBool valid = OFFalse; if (isalpha(c1) && isalpha(c2)) { Uint8 vrName[3]; vrName[0] = c1; vrName[1] = c2; vrName[2] = '\0'; /* is this VR name a standard VR descriptor */ DcmVR vr( OFreinterpret_cast(const char*, &vrName[0] ) ); valid = vr.isStandard(); } else { /* cannot be a valid VR name since non-characters */ valid = OFFalse; } return valid; } // ******************************** E_TransferSyntax DcmItem::checkTransferSyntax(DcmInputStream & inStream) { E_TransferSyntax transferSyntax; Uint8 tagAndVR[6]; /* read 6 bytes from the input stream (try to read tag and VR (data type)) */ inStream.mark(); inStream.read(tagAndVR, 6); // check tag & VR inStream.putback(); /* create two tag variables (one for little, one for big */ /* endian) in order to figure out, if there is a valid tag */ const Uint8 c1 = tagAndVR[0]; const Uint8 c2 = tagAndVR[1]; const Uint8 c3 = tagAndVR[2]; const Uint8 c4 = tagAndVR[3]; const Uint16 t1 = OFstatic_cast(unsigned short, (c1 & 0xff) + ((c2 & 0xff) << 8)); // explicit little endian const Uint16 t2 = OFstatic_cast(unsigned short, (c3 & 0xff) + ((c4 & 0xff) << 8)); // conversion DcmTag taglittle(t1, t2); DcmTag tagbig(swapShort(t1), swapShort(t2)); /* now we want to determine the transfer syntax which was used to code the information in the stream. */ /* The decision is based on two questions: a) Did we encounter a valid tag? and b) Do the last 2 bytes */ /* which were read from the stream represent a valid VR? In certain special cases, where the transfer */ /* cannot be determined without doubt, we want to guess the most probable transfer syntax. */ /* if both tag variables show an error, we encountered an invalid tag */ if ((taglittle.error().bad()) && (tagbig.error().bad())) { /* in case we encounterd an invalid tag, we want to assume that the used transfer syntax */ /* is a little endian transfer syntax. Now we have to figure out, if it is an implicit or */ /* explicit transfer syntax. Hence, check if the last 2 bytes represent a valid VR. */ if (foundVR(&tagAndVR[4])) { /* if the last 2 bytes represent a valid VR, we assume that the used */ /* transfer syntax is the little endian explicit transfer syntax. */ transferSyntax = EXS_LittleEndianExplicit; } else { /* if the last 2 bytes did not represent a valid VR, we assume that the */ /* used transfer syntax is the little endian implicit transfer syntax. */ transferSyntax = EXS_LittleEndianImplicit; } } /* if at least one tag variable did not show an error, we encountered a valid tag */ else { /* in case we encounterd a valid tag, we want to figure out, if it is an implicit or */ /* explicit transfer syntax. Hence, check if the last 2 bytes represent a valid VR. */ if (foundVR(&tagAndVR[4])) { /* having figured out that the last 2 bytes represent a valid */ /* VR, we need to find out which of the two tags was valid */ if (taglittle.error().bad()) { /* if the litte endian tag was invalid, the transfer syntax is big endian explicit */ transferSyntax = EXS_BigEndianExplicit; } else if (tagbig.error().bad()) { /* if the big endian tag was invalid, the transfer syntax is little endian explicit */ transferSyntax = EXS_LittleEndianExplicit; } else { /* if both tags were valid, we take a look at the group numbers. Since */ /* group 0008 is much more probable than group 0800 for the first tag */ /* we specify the following: */ if ((taglittle.getGTag() > 0xff)&&(tagbig.getGTag() <= 0xff)) transferSyntax = EXS_BigEndianExplicit; else transferSyntax = EXS_LittleEndianExplicit; } } else { /* having figured out that the last 2 bytes do not represent a */ /* valid VR, we need to find out which of the two tags was valid */ if (taglittle.error().bad()) { /* if the litte endian tag was invalid, the transfer syntax is big endian implicit */ transferSyntax = EXS_BigEndianImplicit; } else if (tagbig.error().bad()) { /* if the big endian tag was invalid, the transfer syntax is little endian implicit */ transferSyntax = EXS_LittleEndianImplicit; } else { /* if both tags were valid, we take a look at the group numbers. Since */ /* group 0008 is much more probable than group 0800 for the first tag */ /* we specify the following: */ if ((taglittle.getGTag() > 0xff)&&(tagbig.getGTag() <= 0xff)) transferSyntax = EXS_BigEndianImplicit; else transferSyntax = EXS_LittleEndianImplicit; } } } /* dump information on a certain debug level */ DCMDATA_DEBUG("DcmItem::checkTransferSyntax() TransferSyntax=\"" << DcmXfer(transferSyntax).getXferName() << "\""); /* return determined transfer syntax */ return transferSyntax; } // ******************************** void DcmItem::checkAndUpdateVR(DcmItem &item, DcmTag &tag) { /* handle special cases where the VR can be determined by some other element values */ if (((tag == DCM_WaveformData) || (tag == DCM_WaveformPaddingValue)) && (tag.getEVR() == EVR_ox)) { /* case 1 (WaveformData and others): see section 8.3 in PS 3.5 */ Uint16 bitsAlloc; if (item.findAndGetUint16(DCM_WaveformBitsAllocated, bitsAlloc).good()) { if (bitsAlloc == 8) { DCMDATA_DEBUG("setting undefined VR of " << tag.getTagName() << " " << tag << " to 'OB' because WaveformBitsAllocated " << DCM_WaveformBitsAllocated << " has a value of 8"); tag.setVR(EVR_OB); } else { DCMDATA_DEBUG("setting undefined VR of " << tag.getTagName() << " " << tag << " to 'OW' because WaveformBitsAllocated " << DCM_WaveformBitsAllocated << " has a value that is different from 8"); tag.setVR(EVR_OW); } } } else if (((tag == DCM_PixelPaddingValue) || (tag == DCM_PixelPaddingRangeLimit) || (tag == DCM_HistogramFirstBinValue) || (tag == DCM_HistogramLastBinValue)) && (tag.getEVR() == EVR_xs)) { /* case 2 (PixelPaddingValue and others): see section C.7.5.1 and C.11.5 in PS 3.3 */ Uint16 pixelRep; if (item.findAndGetUint16(DCM_PixelRepresentation, pixelRep).good()) { if (pixelRep == 0x0001) { DCMDATA_DEBUG("setting undefined VR of " << tag.getTagName() << " " << tag << " to 'SS' because PixelRepresentation " << DCM_PixelRepresentation << " has a value of 1"); tag.setVR(EVR_SS); } else { DCMDATA_DEBUG("setting undefined VR of " << tag.getTagName() << " " << tag << " to 'US' because PixelRepresentation " << DCM_PixelRepresentation << " has a value that is different from 1"); tag.setVR(EVR_US); } } } else if (((tag == DCM_OverlayData) || (tag == DCM_PixelData)) && (tag.getEVR() == EVR_ox)) { /* case 3 (OverlayData and PixelData): see section 8.1.2 and 8.2 in PS 3.5 */ DCMDATA_DEBUG("setting undefined VR of " << tag.getTagName() << " " << tag << " to 'OW'"); tag.setVR(EVR_OW); } else if ((tag == DCM_RETIRED_CurveData) && (tag.getEVR() == EVR_ox)) { /* case 4 (CurveData): see section A.1 in PS 3.5-2004 */ DCMDATA_DEBUG("setting undefined VR of " << tag.getTagName() << " " << tag << " to 'OB'"); tag.setVR(EVR_OB); } } // ******************************** DcmEVR DcmItem::ident() const { return EVR_item; } unsigned long DcmItem::getVM() { return 1; } // ******************************** void DcmItem::print(STD_NAMESPACE ostream &out, const size_t flags, const int level, const char *pixelFileName, size_t *pixelCounter) { if (flags & DCMTypes::PF_showTreeStructure) { /* print item line with empty text */ printInfoLine(out, flags, level); /* print item content */ if (!elementList->empty()) { DcmObject *dO; elementList->seek(ELP_first); do { dO = elementList->get(); dO->print(out, flags, level + 1, pixelFileName, pixelCounter); } while (elementList->seek(ELP_next)); } } else { /* print item start line */ OFOStringStream oss; oss << "(Item with "; if (getLengthField() == DCM_UndefinedLength) oss << "undefined"; else oss << "explicit"; oss << " length #=" << card() << ")" << OFStringStream_ends; OFSTRINGSTREAM_GETSTR(oss, tmpString) printInfoLine(out, flags, level, tmpString); OFSTRINGSTREAM_FREESTR(tmpString) /* print item content */ if (!elementList->empty()) { DcmObject *dO; elementList->seek(ELP_first); do { dO = elementList->get(); dO->print(out, flags, level + 1, pixelFileName, pixelCounter); } while (elementList->seek(ELP_next)); } /* print item end line */ DcmTag delimItemTag(DCM_ItemDelimitationItem); if (getLengthField() == DCM_UndefinedLength) printInfoLine(out, flags, level, "(ItemDelimitationItem)", &delimItemTag); else printInfoLine(out, flags, level, "(ItemDelimitationItem for re-encoding)", &delimItemTag); } } // ******************************** OFCondition DcmItem::writeXML(STD_NAMESPACE ostream &out, const size_t flags) { /* XML start tag for "item" */ out << "" << OFendl; /* write item content */ if (!elementList->empty()) { /* write content of all children */ DcmObject *dO; elementList->seek(ELP_first); do { dO = elementList->get(); dO->writeXML(out, flags); } while (elementList->seek(ELP_next)); } /* XML end tag for "item" */ out << "" << OFendl; /* always report success */ return EC_Normal; } // ******************************** OFBool DcmItem::canWriteXfer(const E_TransferSyntax newXfer, const E_TransferSyntax oldXfer) { OFBool canWrite = OFTrue; if (newXfer == EXS_Unknown) canWrite = OFFalse; else if (!elementList->empty()) { DcmObject *dO; elementList->seek(ELP_first); do { dO = elementList->get(); canWrite = dO->canWriteXfer(newXfer, oldXfer); } while (elementList->seek(ELP_next) && canWrite); } return canWrite; } // ******************************** Uint32 DcmItem::calcElementLength(const E_TransferSyntax xfer, const E_EncodingType enctype) { Uint32 itemlen = 0; DcmXfer xferSyn(xfer); /* Length of item's start header */ Uint32 headersize = xferSyn.sizeofTagHeader(getVR()); /* Length of item's content, i.e. contained elements */ itemlen = getLength(xfer, enctype); /* Since the item's total length can exceed the maximum length of 32 bit, it is * always necessary to check for overflows. The approach taken is not elegant * but should work... */ if ( (itemlen == DCM_UndefinedLength) || OFStandard::check32BitAddOverflow(itemlen, headersize) ) return DCM_UndefinedLength; itemlen += xferSyn.sizeofTagHeader(getVR()); if (enctype == EET_UndefinedLength) // add bytes for closing item tag marker if necessary { if (OFStandard::check32BitAddOverflow(itemlen, 8)) return DCM_UndefinedLength; else itemlen += 8; } return itemlen; } // ******************************** Uint32 DcmItem::getLength(const E_TransferSyntax xfer, const E_EncodingType enctype) { Uint32 itemlen = 0; Uint32 sublen = 0; if (!elementList->empty()) { DcmObject *dO; elementList->seek(ELP_first); do { dO = elementList->get(); sublen = dO->calcElementLength(xfer, enctype); /* explicit length: be sure that total size of contained elements fits into item's 32 Bit length field. If not, switch encoding automatically to undefined length for this item. Nevertheless, any contained elements will be written with explicit length if possible. */ if ( (enctype == EET_ExplicitLength) && OFStandard::check32BitAddOverflow(sublen, itemlen) ) { if (dcmWriteOversizedSeqsAndItemsUndefined.get()) { DCMDATA_WARN("DcmItem: Explicit length of item exceeds 32-Bit length field, " << "trying to encode with undefined length"); } else { DCMDATA_WARN("DcmItem: Explicit length of item exceeds 32-Bit length field, " << "aborting write"); errorFlag = EC_SeqOrItemContentOverflow; } return DCM_UndefinedLength; } else itemlen += sublen; } while (elementList->seek(ELP_next)); } return itemlen; } // ******************************** OFCondition DcmItem::computeGroupLengthAndPadding(const E_GrpLenEncoding glenc, const E_PaddingEncoding padenc, const E_TransferSyntax xfer, const E_EncodingType enctype, const Uint32 padlen, const Uint32 subPadlen, Uint32 instanceLength) { /* if certain conditions are met, this is considered to be an illegal call. */ if ((padenc == EPD_withPadding && (padlen % 2 || subPadlen % 2)) || ((glenc == EGL_recalcGL || glenc == EGL_withGL || padenc == EPD_withPadding) && xfer == EXS_Unknown)) return EC_IllegalCall; /* if the caller specified that group length tags and padding */ /* tags are not supposed to be changed, there is nothing to do. */ if (glenc == EGL_noChange && padenc == EPD_noChange) return EC_Normal; /* if we get to this point, we need to do something. First of all, set the error indicator to normal. */ OFCondition l_error = EC_Normal; /* collects group length elements that cannot be calculated due to length field overflows */ OFList exceededGroupLengthElems; /* if there are elements in this item... */ if (!elementList->empty()) { /* initialize some variables */ DcmObject *dO; OFBool beginning = OFTrue; Uint16 lastGrp = 0x0000; Uint16 actGrp; DcmUnsignedLong * actGLElem = NULL; DcmUnsignedLong * paddingGL = NULL; Uint32 grplen = 0; DcmXfer xferSyn(xfer); Uint32 sublen = 0; OFBool groupLengthExceeded = OFFalse; /* determine the current seek mode and set the list pointer to the first element */ E_ListPos seekmode = ELP_next; elementList->seek(ELP_first); /* start a loop: we want to go through all elements as long as everything is okay */ do { /* set the seek mode to "next" again, in case it has been modified in the last iteration */ seekmode = ELP_next; /* get the current element and assign it to a local variable */ dO = elementList->get(); /* if the current element is a sequence, compute group length and padding for the sub sequence */ if (dO->getVR() == EVR_SQ) { // add size of sequence header Uint32 templen = instanceLength + xferSyn.sizeofTagHeader(EVR_SQ); // call computeGroupLengthAndPadding for all contained items l_error = OFstatic_cast(DcmSequenceOfItems *, dO)->computeGroupLengthAndPadding (glenc, padenc, xfer, enctype, subPadlen, subPadlen, templen); } /* if everything is ok so far */ if (l_error.good()) { /* in case one of the following two conditions is met */ /* (i) the caller specified that we want to add or remove group length elements and the current */ /* element's tag shows that it is a group length element (tag's element number equals 0x0000) */ /* (ii) the caller specified that we want to add or remove padding elements and the current */ /* element's tag shows that it is a padding element (tag is (0xfffc,0xfffc) */ /* then we want to delete the current (group length or padding) element */ if (((glenc == EGL_withGL || glenc == EGL_withoutGL) && dO->getETag() == 0x0000) || (padenc != EPD_noChange && dO->getTag() == DCM_DataSetTrailingPadding)) { delete elementList->remove(); seekmode = ELP_atpos; // remove advances 1 element forward -> make next seek() work dO = NULL; } /* if the above mentioned conditions are not met but the caller specified that we want to add group */ /* length tags for every group or that we want to recalculate values for existing group length tags */ else if (glenc == EGL_withGL || glenc == EGL_recalcGL) { /* we need to determine the current element's group number */ actGrp = dO->getGTag(); /* and if the group number is different from the last remembered group number or */ /* if this id the very first element that is treated then we've found a new group */ if (actGrp != lastGrp || beginning) // new Group found { /* set beginning to false in order to specify that the */ /* very first element has already been treated */ beginning = OFFalse; /* if the current element is a group length element and its data type */ /* is not UL replace this element with one that has a UL datatype since */ /* group length elements are supposed to have this data type */ if (dO->getETag() == 0x0000 && dO->ident() != EVR_UL) { delete elementList->remove(); DcmTag tagUL(actGrp, 0x0000, EVR_UL); DcmUnsignedLong *dUL = new DcmUnsignedLong(tagUL); elementList->insert(dUL, ELP_prev); dO = dUL; DCMDATA_WARN("DcmItem: Group Length with VR other than UL found, corrected"); } /* if the above mentioned condition is not met but the caller specified */ /* that we want to add group length elements, we need to add such an element */ else if (glenc == EGL_withGL) { // Create GroupLength element DcmTag tagUL(actGrp, 0x0000, EVR_UL); DcmUnsignedLong *dUL = new DcmUnsignedLong(tagUL); // insert new GroupLength element elementList->insert(dUL, ELP_prev); dO = dUL; } /* in case we want to add padding elements and the current element is a */ /* padding element we want to remember the padding element so that the */ /* group length of this element can be stored later */ if (padenc == EPD_withPadding && actGrp == 0xfffc) paddingGL = OFstatic_cast(DcmUnsignedLong *, dO); /* if actGLElem contains a valid pointer it was set in one of the last iterations */ /* to the group lenght element of the last group. We need to write the current computed */ /* group length value to this element. Exception: If group length exceeds maximum possible */ /* value, than remove group length element instead of setting it */ if (actGLElem != NULL) { if (!groupLengthExceeded) { // do not use putUint32() in order to make sure that the resulting VM is really 1 actGLElem->putUint32Array(&grplen, 1); DCMDATA_DEBUG("DcmItem::computeGroupLengthAndPadding() Length of Group 0x" << STD_NAMESPACE hex << STD_NAMESPACE setfill('0') << STD_NAMESPACE setw(4) << actGLElem->getGTag() << STD_NAMESPACE dec << STD_NAMESPACE setfill(' ') << " len=" << grplen); } else { DCMDATA_WARN("DcmItem: Group length of group 0x" << STD_NAMESPACE hex << STD_NAMESPACE setfill('0') << STD_NAMESPACE setw(4) << actGLElem->getGTag() << " exceeds 32-Bit length field. " << "Cannot calculate/write group length for this group."); exceededGroupLengthElems.push_back(actGLElem); groupLengthExceeded = OFFalse; } } /* set the group length value to 0 since it is the beginning of the new group */ grplen = 0; /* if the current element is a group length element, remember its address for later */ /* (we need to assign the group length value to this element in a subsequent iteration) */ /* in case the current element (at the beginning of the group) is not a group length */ /* element, set the actGLElem pointer to NULL. */ if (dO->getETag() == 0x0000) actGLElem = OFstatic_cast(DcmUnsignedLong *, dO); else actGLElem = NULL; } /* if this is not a new group, calculate the element's length and add it */ /* to the currently computed group length value. If group length is larger */ /* than group length field permits, set flag to not add group length for this group */ else { sublen = dO->calcElementLength(xfer, enctype); // test for 32-bit overflow return value if ((sublen == DCM_UndefinedLength) || OFStandard::check32BitAddOverflow(sublen, grplen)) { groupLengthExceeded = OFTrue; } else { grplen += sublen; } } /* remember the current element's group number so that it is possible to */ /* figure out if a new group is treated in the following iteration */ lastGrp = actGrp; } } } while (l_error.good() && elementList->seek(seekmode)); /* if there was no error and the caller specified that we want to add or recalculate */ /* group length tags and if actGLElem has a valid value, we need to add the above */ /* computed group length value to the last group's group length element. Exception: */ /* If group length exceeds maximum possible value, remove group length element and */ /* i.e. do not write it for this group. */ if (l_error.good() && (glenc == EGL_withGL || glenc == EGL_recalcGL) && actGLElem) { if (groupLengthExceeded) { exceededGroupLengthElems.push_back(actGLElem); } else { actGLElem->putUint32(grplen); } } /* if the caller specified that we want to add padding elements and */ /* if the length up to which shall be padded does not equal 0 we might */ /* have to add a padding element */ if (padenc == EPD_withPadding && padlen) { /* calculate how much space the entire padding element is supposed to occupy */ Uint32 padding; if (ident() == EVR_dataset) { instanceLength += calcElementLength(xfer, enctype); padding = padlen - (instanceLength % padlen); } else padding = padlen - (getLength(xfer, enctype) % padlen); /* if now padding does not equal padlen we need to create a padding element. (if both values are equal */ /* the element does have the exact required padlen length and does not need a padding element.) */ if (padding != padlen) { /* Create new padding element */ DcmOtherByteOtherWord * paddingEl = new DcmOtherByteOtherWord(DCM_DataSetTrailingPadding); /* calculate the length of the new element */ Uint32 tmplen = paddingEl->calcElementLength(xfer, enctype); /* in case padding is smaller than the header of the padding element, we */ /* need to increase padding (the value which specifies how much space the */ /* entire padding element is supposed to occupy) until it is no longer smaller */ while (tmplen > padding) padding += padlen; /* determine the amount of bytes that have to be added to the */ /* padding element so that it has the correct size */ padding -= tmplen; /* create an array of a corresponding size and set the arrayfields */ Uint8 * padBytes = new Uint8[padding]; memzero(padBytes, size_t(padding)); /* set information in the above created padding element (size and actual value) */ paddingEl->putUint8Array(padBytes, padding); /* delete the above created array */ delete[] padBytes; /* insert the padding element into this */ insert(paddingEl); /* finally we need to update the group length for the padding element if it exists */ if (paddingGL) { Uint32 len; paddingGL->getUint32(len); len += paddingEl->calcElementLength(xfer, enctype); paddingGL->putUint32(len); } } } } /* delete invalid group length elements from item. Cannot be done in */ /* above while loop because then elementList iterator is invalidated */ Uint32 numElems = exceededGroupLengthElems.size(); for (Uint32 i=0; i < numElems; i++) { delete remove(exceededGroupLengthElems.front()); exceededGroupLengthElems.pop_front(); } return l_error; } // ******************************** OFCondition DcmItem::readTagAndLength(DcmInputStream &inStream, const E_TransferSyntax xfer, DcmTag &tag, Uint32 &length, Uint32 &bytesRead) { OFCondition l_error = EC_Normal; Uint32 valueLength = 0; DcmEVR nxtobj = EVR_UNKNOWN; Uint16 groupTag = 0xffff; Uint16 elementTag = 0xffff; /* create a DcmXfer object based on the transfer syntax which was passed */ DcmXfer xferSyn(xfer); #ifdef DEBUG /* dump some information if required */ DCMDATA_TRACE("DcmItem::readTagAndLength() TransferSyntax=\"" << xferSyn.getXferName() << "\""); #endif /* bail out if at end of stream */ if (inStream.eos()) return EC_EndOfStream; /* check if either 4 (for implicit transfer syntaxes) or 6 (for explicit transfer */ /* syntaxes) bytes are available in (i.e. can be read from) inStream. if an error */ /* occured while performing this check return this error */ if (inStream.avail() < (xferSyn.isExplicitVR() ? 6u:4u)) return EC_StreamNotifyClient; /* determine the byte ordering of the transfer syntax which was passed; */ /* if the byte ordering is unknown, this is an illegal call. */ const E_ByteOrder byteOrder = xferSyn.getByteOrder(); if (byteOrder == EBO_unknown) return EC_IllegalCall; /* read tag information (4 bytes) from inStream and create a corresponding DcmTag object */ inStream.mark(); inStream.read(&groupTag, 2); inStream.read(&elementTag, 2); swapIfNecessary(gLocalByteOrder, byteOrder, &groupTag, 2, 2); swapIfNecessary(gLocalByteOrder, byteOrder, &elementTag, 2, 2); // tag has been read bytesRead = 4; DcmTag newTag(groupTag, elementTag); // check whether tag is private OFBool isPrivate = groupTag & 1; /* if the transfer syntax which was passed is an explicit VR syntax and if the current */ /* item is not a delimitation item (note that delimitation items do not have a VR), go */ /* ahead and read 2 bytes from inStream. These 2 bytes contain this item's VR value. */ if (xferSyn.isExplicitVR() && newTag.getEVR() != EVR_na) { char vrstr[3]; vrstr[2] = '\0'; /* read 2 bytes */ inStream.read(vrstr, 2); /* create a corresponding DcmVR object */ DcmVR vr(vrstr); /* if the VR which was read is not a standard VR, print a warning */ if (!vr.isStandard()) { OFOStringStream oss; oss << "DcmItem: Non-standard VR '" << ((OFstatic_cast(unsigned char, vrstr[0]) < 32) ? ' ' : vrstr[0]) << ((OFstatic_cast(unsigned char, vrstr[1]) < 32) ? ' ' : vrstr[1]) << "' (" << STD_NAMESPACE hex << STD_NAMESPACE setfill('0') << STD_NAMESPACE setw(2) << OFstatic_cast(unsigned int, vrstr[0] & 0xff) << "\\" << STD_NAMESPACE setw(2) << OFstatic_cast(unsigned int, vrstr[1] & 0xff) << ") encountered while parsing element " << newTag << OFStringStream_ends; OFSTRINGSTREAM_GETSTR(oss, tmpString) /* encoding of this data element might be wrong, try to correct it */ if (dcmAcceptUnexpectedImplicitEncoding.get()) { DCMDATA_WARN(tmpString << ", trying again with Implicit VR Little Endian"); /* put back read bytes to input stream ... */ inStream.putback(); bytesRead = 0; /* ... and retry with Implicit VR Little Endian transfer syntax */ return readTagAndLength(inStream, EXS_LittleEndianImplicit, tag, length, bytesRead); } else { DCMDATA_WARN(tmpString << ", assuming " << (vr.usesExtendedLengthEncoding() ? "4" : "2") << " byte length field"); } OFSTRINGSTREAM_FREESTR(tmpString) } /* set the VR which was read in the above created tag object. */ newTag.setVR(vr); /* increase counter by 2 */ bytesRead += 2; } /* special handling for private elements */ if (isPrivate && (newTag.getElement() >= 0x1000)) { const char *pc = privateCreatorCache.findPrivateCreator(newTag); if (pc) { // we have a private creator for this element newTag.setPrivateCreator(pc); if (xferSyn.isImplicitVR()) { // try to update VR from dictionary now that private creator is known newTag.lookupVRinDictionary(); } } } /* determine this item's VR */ nxtobj = newTag.getEVR(); /* the next thing we want to do is read the value in the length field from inStream. */ /* determine if there is a corresponding amount of bytes (for the length field) still */ /* available in inStream. If not, return an error. */ if (inStream.avail() < xferSyn.sizeofTagHeader(nxtobj) - bytesRead) { inStream.putback(); // the UnsetPutbackMark is in readSubElement bytesRead = 0; l_error = EC_StreamNotifyClient; return l_error; } /* read the value in the length field. In some cases, it is 4 bytes wide, in other */ /* cases only 2 bytes (see DICOM standard part 5, section 7.1.1) */ if (xferSyn.isImplicitVR() || nxtobj == EVR_na) //note that delimitation items don't have a VR { inStream.read(&valueLength, 4); //length field is 4 bytes wide swapIfNecessary(gLocalByteOrder, byteOrder, &valueLength, 4, 4); bytesRead += 4; } else { //the transfer syntax is explicit VR DcmVR vr(newTag.getEVR()); if (vr.usesExtendedLengthEncoding()) { Uint16 reserved; inStream.read(&reserved, 2); // 2 reserved bytes inStream.read(&valueLength, 4); // length field is 4 bytes wide swapIfNecessary(gLocalByteOrder, byteOrder, &valueLength, 4, 4); bytesRead += 6; } else { Uint16 tmpValueLength; inStream.read(&tmpValueLength, 2); // length field is 2 bytes wide swapIfNecessary(gLocalByteOrder, byteOrder, &tmpValueLength, 2, 2); bytesRead += 2; valueLength = tmpValueLength; } } /* if the value in length is odd, print an error message */ if ( (valueLength & 1) && (valueLength != DCM_UndefinedLength) ) { DCMDATA_WARN("DcmItem: Length of element " << newTag << " is odd"); } /* if desired, handle private attributes with maximum length as VR SQ */ if (isPrivate && dcmReadImplPrivAttribMaxLengthAsSQ.get() && (valueLength == DCM_UndefinedLength)) { /* re-set tag to be a sequence and also delete private creator cache */ newTag.setVR(EVR_SQ); newTag.setPrivateCreator(""); } /* if desired, check if length is greater than length of surrounding item */ const Uint32 valueLengthItem = getLengthField(); if ((ident() == EVR_item /* e.g. meta info would have length 0 */) && (valueLengthItem != DCM_UndefinedLength /* this does not work in undefined length items */) && (valueLength != DCM_UndefinedLength) /* Also, do not check sequences with undefined length 0xFFFFFFFF */ ) { const offile_off_t remainingItemBytes = valueLengthItem - (inStream.tell() - fStartPosition); if (valueLength > remainingItemBytes) { DCMDATA_WARN("DcmItem: Element " << newTag.getTagName() << " " << newTag << " larger (" << valueLength << ") than remaining bytes (" /* need to cast remainingItemBytes to unsigned long because VC6 cannot print offile_off_t (int64_t). */ << OFstatic_cast(unsigned long, remainingItemBytes) << ") of surrounding item"); l_error = EC_ElemLengthLargerThanItem; } } /* assign values to out parameter */ length = valueLength; tag = newTag; /* return return value */ return l_error; } // ******************************** OFCondition DcmItem::readSubElement(DcmInputStream &inStream, DcmTag &newTag, const Uint32 newLength, const E_TransferSyntax xfer, const E_GrpLenEncoding glenc, const Uint32 maxReadLength) { DcmElement *subElem = NULL; /* create a new DcmElement* object with corresponding tag and */ /* length; the object will be accessible through subElem */ OFBool readAsUN = OFFalse; OFCondition l_error = newDicomElement(subElem, newTag, newLength, &privateCreatorCache, readAsUN); /* if no error occured and subElem does not equal NULL, go ahead */ if (l_error.good() && subElem != NULL) { // inStream.UnsetPutbackMark(); // not needed anymore with new stream architecture /* insert the new element into the (sorted) element list and */ /* assign information which was read from the instream to it */ subElem->transferInit(); /* we need to read the content of the attribute, no matter if */ /* inserting the attribute succeeds or fails */ l_error = subElem->read(inStream, (readAsUN ? EXS_LittleEndianImplicit : xfer), glenc, maxReadLength); // try to insert element into item. Note that // "elementList->insert(subElem, ELP_next)" would be faster, // but this is better since this insert-function creates a // sorted element list. // We insert the element even if subElem->read() reported an error // because otherwise I/O suspension would fail. OFCondition temp_error = insert(subElem, OFFalse, OFTrue); if (temp_error.bad()) { // produce diagnostics DCMDATA_WARN("DcmItem: Element " << newTag << " found twice in one dataset/item, ignoring second entry"); delete subElem; } } /* else if an error occured, try to recover from this error */ else if (l_error == EC_InvalidTag) { /* This is the second Putback operation on the putback mark in */ /* readTagAndLength but it is impossible that both can be executed */ /* without setting the Mark twice. */ inStream.putback(); DCMDATA_WARN("DcmItem: Parse error while parsing element " << newTag); } else if (l_error != EC_ItemEnd) { // inStream.UnsetPutbackMark(); // not needed anymore with new stream architecture DCMDATA_WARN("DcmItem: Parse error in sequence item, found " << newTag << " instead of an item delimiter"); } else { // inStream.UnsetPutbackMark(); // not needed anymore with new stream architecture } /* return result value */ return l_error; } // ******************************** OFCondition DcmItem::read(DcmInputStream & inStream, const E_TransferSyntax xfer, const E_GrpLenEncoding glenc, const Uint32 maxReadLength) { /* check if this is an illegal call; if so set the error flag and do nothing, else go ahead */ if (getTransferState() == ERW_notInitialized) { errorFlag = EC_IllegalCall; return errorFlag; } /* figure out if the stream reported an error */ errorFlag = inStream.status(); /* if the stream reported an error or if it is the end of the */ /* stream, set the error flag correspondingly; else go ahead */ if (errorFlag.good() && inStream.eos()) errorFlag = EC_EndOfStream; else if (errorFlag.good() && getTransferState() != ERW_ready) { /* if the transfer state of this item is ERW_init, get its start */ /* position in the stream and set the transfer state to ERW_inWork */ if (getTransferState() == ERW_init) { fStartPosition = inStream.tell(); // start position of this item setTransferState(ERW_inWork); } DcmTag newTag; OFBool readStopElem = OFFalse; /* start a loop in order to read all elements (attributes) which are contained in the inStream */ while (inStream.good() && (getTransferredBytes() < getLengthField() || !lastElementComplete) && !readStopElem) { /* initialize variables */ Uint32 newValueLength = 0; Uint32 bytes_tagAndLen = 0; /* if the reading of the last element was complete, go ahead and read the next element */ if (lastElementComplete) { /* read this element's tag and length information */ /* (and possibly also VR information) from the inStream */ errorFlag = readTagAndLength(inStream, xfer, newTag, newValueLength, bytes_tagAndLen); /* increase counter correspondingly */ incTransferredBytes(bytes_tagAndLen); /* if desired, try to ignore parse error -> skip item */ if ((errorFlag == EC_ElemLengthLargerThanItem) && dcmIgnoreParsingErrors.get()) { DCMDATA_WARN("DcmItem: Element " << newTag.getTagName() << " " << newTag << " too large, trying to skip over rest of item"); /* we can call getLengthField because error does only occur for explicit length items */ const offile_off_t bytesToSkip = getLengthField() - bytes_tagAndLen; if (bytesToSkip > inStream.avail()) // no chance to recover break; inStream.skip(bytesToSkip); errorFlag = EC_Normal; } else /* continue with normal case: parse rest of element */ { /* if there was an error while we were reading from the stream, terminate the while-loop */ /* (note that if the last element had been read from the instream in the last iteration, */ /* another iteration will be started, and of course then readTagAndLength(...) above will */ /* return that it encountered the end of the stream. It is only then (and here) when the */ /* while loop will be terminated.) */ if (errorFlag.bad()) break; /* If we get to this point, we just started reading the first part */ /* of an element; hence, lastElementComplete is not longer true */ lastElementComplete = OFFalse; /* in case of implicit VR, check whether the "default VR" is really appropriate */ if (DcmXfer(xfer).isImplicitVR()) checkAndUpdateVR(*this, newTag); /* read the actual data value which belongs to this element */ /* (attribute) and insert this information into the elementList */ errorFlag = readSubElement(inStream, newTag, newValueLength, xfer, glenc, maxReadLength); /* if reading was successful, we read the entire data value information */ /* for this element; hence lastElementComplete is true again */ if (errorFlag.good()) lastElementComplete = OFTrue; } } else { /* if lastElementComplete is false, we have only read the current element's */ /* tag and length (and possibly VR) information as well as maybe some data */ /* data value information. We need to continue reading the data value */ /* information for this particular element. */ errorFlag = elementList->get()->read(inStream, xfer, glenc, maxReadLength); /* if reading was successful, we read the entire information */ /* for this element; hence lastElementComplete is true */ if (errorFlag.good()) lastElementComplete = OFTrue; } /* remember how many bytes were read */ setTransferredBytes(OFstatic_cast(Uint32, inStream.tell() - fStartPosition)); if (errorFlag.good()) { // If we completed one element, update the private tag cache. if (lastElementComplete) { privateCreatorCache.updateCache(elementList->get()); // evaluate option for skipping rest of dataset if ( (dcmStopParsingAfterElement.get() != DCM_UndefinedTagKey) && (dcmStopParsingAfterElement.get() == elementList->get()->getTag()) && ident() == EVR_dataset) { DCMDATA_WARN("DcmItem: Element " << newTag.getTagName() << " " << newTag << " encountered, skipping rest of dataset"); readStopElem = OFTrue; } } } else break; // if some error was encountered terminate the while-loop } //while /* determine an appropriate result value; note that if the above called read function */ /* encountered the end of the stream before all information for this element could be */ /* read from the stream, the errorFlag has already been set to EC_StreamNotifyClient. */ if (errorFlag.good()) { // if stop element was read or end of stream occurs, tell parser end of stream is reached if (readStopElem || inStream.eos()) errorFlag = EC_EndOfStream; // if all bytes could be read or last element read could not be completed, set to error else if ((getTransferredBytes() < getLengthField() || !lastElementComplete)) errorFlag = EC_StreamNotifyClient; } } // else errorFlag /* modify the result value: two kinds of special error codes do not count as an error */ if (errorFlag == EC_ItemEnd || errorFlag == EC_EndOfStream) errorFlag = EC_Normal; /* if at this point the error flag indicates success, the item has */ /* been read completely; hence, set the transfer state to ERW_ready. */ /* Note that all information for this element could be read from the */ /* stream, the errorFlag is still set to EC_StreamNotifyClient. */ if (errorFlag.good()) setTransferState(ERW_ready); /* return result value */ return errorFlag; } // ******************************** OFCondition DcmItem::write(DcmOutputStream &outStream, const E_TransferSyntax oxfer, const E_EncodingType enctype, DcmWriteCache *wcache) { if (getTransferState() == ERW_notInitialized) errorFlag = EC_IllegalCall; else { errorFlag = outStream.status(); if (errorFlag.good() && getTransferState() != ERW_ready) { if (getTransferState() == ERW_init) { if (outStream.avail() >= 8) { if (enctype == EET_ExplicitLength) setLengthField(getLength(oxfer, enctype)); else setLengthField(DCM_UndefinedLength); if (errorFlag == EC_SeqOrItemContentOverflow) return errorFlag; errorFlag = writeTag(outStream, getTag(), oxfer); Uint32 valueLength = getLengthField(); DcmXfer outXfer(oxfer); const E_ByteOrder oByteOrder = outXfer.getByteOrder(); if (oByteOrder == EBO_unknown) return EC_IllegalCall; swapIfNecessary(oByteOrder, gLocalByteOrder, &valueLength, 4, 4); outStream.write(&valueLength, 4); // 4 bytes length elementList->seek(ELP_first); setTransferState(ERW_inWork); } else errorFlag = EC_StreamNotifyClient; } if (getTransferState() == ERW_inWork) { // elementList->get() can be NULL if buffer was full after // writing the last item but before writing the sequence delimitation. if (!elementList->empty() && (elementList->get() != NULL)) { DcmObject *dO = NULL; do { dO = elementList->get(); if (dO->transferState() != ERW_ready) errorFlag = dO->write(outStream, oxfer, enctype, wcache); } while (errorFlag.good() && elementList->seek(ELP_next)); } if (errorFlag.good()) { setTransferState(ERW_ready); if (getLengthField() == DCM_UndefinedLength) { if (outStream.avail() >= 8) { // write Item delimitation DcmTag delim(DCM_ItemDelimitationItem); errorFlag = writeTag(outStream, delim, oxfer); Uint32 delimLen = 0L; outStream.write(&delimLen, 4); // 4 bytes length } else { // Every subelement of the item is written but it // is not possible to write the delimination item into the buffer. errorFlag = EC_StreamNotifyClient; setTransferState(ERW_inWork); } } } } } } return errorFlag; } // ******************************** OFCondition DcmItem::writeSignatureFormat( DcmOutputStream &outStream, const E_TransferSyntax oxfer, const E_EncodingType enctype, DcmWriteCache *wcache) { if (getTransferState() == ERW_notInitialized) errorFlag = EC_IllegalCall; else { errorFlag = outStream.status(); if (errorFlag.good() && getTransferState() != ERW_ready) { if (getTransferState() == ERW_init) { if (outStream.avail() >= 4) { if (enctype == EET_ExplicitLength) setLengthField(getLength(oxfer, enctype)); else setLengthField(DCM_UndefinedLength); errorFlag = writeTag(outStream, getTag(), oxfer); /* we don't write the item length */ elementList->seek(ELP_first); setTransferState(ERW_inWork); } else errorFlag = EC_StreamNotifyClient; } if (getTransferState() == ERW_inWork) { // elementList->get() can be NULL if buffer was full after // writing the last item but before writing the sequence delimitation. if (!elementList->empty() && (elementList->get() != NULL)) { DcmObject *dO = NULL; do { dO = elementList->get(); if (dO->transferState() != ERW_ready) errorFlag = dO->writeSignatureFormat(outStream, oxfer, enctype, wcache); } while (errorFlag.good() && elementList->seek(ELP_next)); } if (errorFlag.good()) { setTransferState(ERW_ready); /* we don't write an item delimitation even if the item has undefined length */ } } } } return errorFlag; } // ******************************** void DcmItem::transferInit() { DcmObject::transferInit(); fStartPosition = 0; lastElementComplete = OFTrue; privateCreatorCache.clear(); if (!elementList->empty()) { elementList->seek(ELP_first); do { elementList->get()->transferInit(); } while (elementList->seek(ELP_next)); } } // ******************************** void DcmItem::transferEnd() { DcmObject::transferEnd(); privateCreatorCache.clear(); if (!elementList->empty()) { elementList->seek(ELP_first); do { elementList->get()->transferEnd(); } while (elementList->seek(ELP_next)); } } // ******************************** unsigned long DcmItem::card() const { return elementList->card(); } // ******************************** OFCondition DcmItem::insert(DcmElement *elem, OFBool replaceOld, OFBool checkInsertOrder) { /* intialize error flag with ok */ errorFlag = EC_Normal; /* do something only if the pointer which was passed does not equal NULL */ if (elem != NULL) { DcmElement *dE; E_ListPos seekmode = ELP_last; /* iterate through elementList (from the last element to the first) */ do { /* get current element from elementList */ dE = OFstatic_cast(DcmElement *, elementList->seek(seekmode)); /* if there is no element, i.e. elementList is empty */ if (dE == NULL) { /* insert new element at the beginning of elementList */ elementList->insert(elem, ELP_first); if (checkInsertOrder) { // check if we have inserted at the end of the list if (elem != OFstatic_cast(DcmElement *, elementList->seek(ELP_last))) { // produce diagnostics DCMDATA_WARN("DcmItem: Dataset not in ascending tag order, at element " << elem->getTag()); } } /* dump some information if required */ DCMDATA_TRACE("DcmItem::insert() Element " << elem->getTag() << " VR=\"" << DcmVR(elem->getVR()).getVRName() << "\" at beginning inserted"); /* terminate do-while-loop */ break; } /* else if the new element's tag is greater than the current element's tag */ /* (i.e. we have found the position where the new element shall be inserted) */ else if (elem->getTag() > dE->getTag()) { /* insert the new element after the current element */ elementList->insert(elem, ELP_next); if (checkInsertOrder) { // check if we have inserted at the end of the list if (elem != OFstatic_cast(DcmElement *, elementList->seek(ELP_last))) { // produce diagnostics DCMDATA_WARN("DcmItem: Dataset not in ascending tag order, at element " << elem->getTag()); } } /* dump some information if required */ DCMDATA_TRACE("DcmItem::insert() Element " << elem->getTag() << " VR=\"" << DcmVR(elem->getVR()).getVRName() << "\" inserted"); /* terminate do-while-loop */ break; } /* else if the current element and the new element show the same tag */ else if (elem->getTag() == dE->getTag()) { /* if new and current element are not identical */ if (elem != dE) { /* if the current (old) element shall be replaced */ if (replaceOld) { /* remove current element from list */ DcmObject *remObj = elementList->remove(); /* now the following holds: remObj == dE and elementList */ /* points to the element after the former current element. */ /* if the pointer to the removed object does not */ /* equal NULL (the usual case), delete this object */ /* and dump some information if required */ if (remObj != NULL) { /* dump some information if required */ DCMDATA_TRACE("DcmItem::insert() Element " << remObj->getTag() << " VR=\"" << DcmVR(remObj->getVR()).getVRName() << "\" p=" << OFstatic_cast(void *, remObj) << " removed and deleted"); delete remObj; } /* insert the new element before the current element */ elementList->insert(elem, ELP_prev); /* dump some information if required */ DCMDATA_TRACE("DcmItem::insert() Element " << elem->getTag() << " VR=\"" << DcmVR(elem->getVR()).getVRName() << "\" p=" << OFstatic_cast(void *, elem) << " replaced older one"); } // if (replaceOld) /* or else, i.e. the current element shall not be replaced by the new element */ else { /* set the error flag correspondingly; we do not */ /* allow two elements with the same tag in elementList */ errorFlag = EC_DoubledTag; } // if (!replaceOld) } // if (elem != dE) /* if the new and the current element are identical, the caller tries to insert */ /* one element twice. Most probably an application error. */ else { errorFlag = EC_DoubledTag; } /* terminate do-while-loop */ break; } /* set the seek mode to "get the previous element" */ seekmode = ELP_prev; } while (dE); } /* if the pointer which was passed equals NULL, this is an illegal call */ else errorFlag = EC_IllegalCall; /* return result value */ return errorFlag; } // ******************************** DcmElement *DcmItem::getElement(const unsigned long num) { errorFlag = EC_Normal; DcmElement *elem; elem = OFstatic_cast(DcmElement *, elementList->seek_to(num)); /* reads element from list */ if (elem == NULL) errorFlag = EC_IllegalCall; return elem; } // ******************************** DcmObject *DcmItem::nextInContainer(const DcmObject *obj) { if (!obj) return elementList->get(ELP_first); else { if (elementList->get() != obj) { for(DcmObject * search_obj = elementList->seek(ELP_first); search_obj && search_obj != obj; search_obj = elementList->seek(ELP_next) ) { /* do nothing, just keep iterating */ } } return elementList->seek(ELP_next); } } // ******************************** OFCondition DcmItem::nextObject(DcmStack &stack, const OFBool intoSub) { OFCondition l_error = EC_Normal; DcmObject * container = NULL; DcmObject * obj = NULL; DcmObject * result = NULL; OFBool examSub = intoSub; if (stack.empty()) { stack.push(this); examSub = OFTrue; } obj = stack.top(); if (obj->isLeaf() || !intoSub) { stack.pop(); if (stack.card() > 0) { container = stack.top(); result = container->nextInContainer(obj); } } else if (examSub) result = obj->nextInContainer(NULL); if (result) stack.push(result); else if (intoSub) l_error = nextUp(stack); else l_error = EC_SequEnd; return l_error; } // ******************************** DcmElement *DcmItem::remove(const unsigned long num) { errorFlag = EC_Normal; DcmElement *elem; elem = OFstatic_cast(DcmElement *, elementList->seek_to(num)); // read element from list if (elem != NULL) elementList->remove(); // removes element from list but does not delete it else errorFlag = EC_IllegalCall; return elem; } // ******************************** DcmElement *DcmItem::remove(DcmObject *elem) { errorFlag = EC_IllegalCall; if (!elementList->empty() && elem != NULL) { DcmObject *dO; elementList->seek(ELP_first); do { dO = elementList->get(); if (dO == elem) { elementList->remove(); // removes element from list but does not delete it errorFlag = EC_Normal; break; } } while (elementList->seek(ELP_next)); } if (errorFlag == EC_IllegalCall) return NULL; else return OFstatic_cast(DcmElement *, elem); } // ******************************** DcmElement *DcmItem::remove(const DcmTagKey &tag) { errorFlag = EC_TagNotFound; DcmObject *dO = NULL; if (!elementList->empty()) { elementList->seek(ELP_first); do { dO = elementList->get(); if (dO->getTag() == tag) { elementList->remove(); // removes element from list but does not delete it errorFlag = EC_Normal; break; } } while (elementList->seek(ELP_next)); } if (errorFlag == EC_TagNotFound) return NULL; else return OFstatic_cast(DcmElement *, dO); } // ******************************** OFCondition DcmItem::clear() { errorFlag = EC_Normal; // remove all elements from item and delete them from memory elementList->deleteAllElements(); setLengthField(0); return errorFlag; } OFBool DcmItem::isEmpty(const OFBool /*normalize*/) { return elementList->empty(); } // ******************************** OFCondition DcmItem::verify(const OFBool autocorrect) { DCMDATA_TRACE("DcmItem::verify() Element " << getTag() << " VR=\"" << DcmVR(getVR()).getVRName() << "\""); errorFlag = EC_Normal; if (!elementList->empty()) { DcmObject *dO; elementList->seek(ELP_first); do { dO = elementList->get(); if (dO->verify(autocorrect).bad()) errorFlag = EC_CorruptedData; } while (elementList->seek(ELP_next)); } if (autocorrect) setLengthField(getLength()); return errorFlag; } // ******************************** // Precondition: elementList is non-empty! // Result: - return EC_Normal; // push element pointer on resultStack // - return EC_TagNotFound; // resultStack unmodified // Search again: push pointer of sub-element on resultStack and // start sub-search OFCondition DcmItem::searchSubFromHere(const DcmTagKey &tag, DcmStack &resultStack, OFBool searchIntoSub) { DcmObject *dO; OFCondition l_error = EC_TagNotFound; if (!elementList->empty()) { elementList->seek(ELP_first); do { dO = elementList->get(); if (searchIntoSub) { resultStack.push(dO); if (dO->getTag() == tag) l_error = EC_Normal; else l_error = dO->search(tag, resultStack, ESM_fromStackTop, OFTrue); if (l_error.bad()) resultStack.pop(); } else { if (dO->getTag() == tag) { resultStack.push(dO); l_error = EC_Normal; } } } while (l_error.bad() && elementList->seek(ELP_next)); if (l_error==EC_Normal && dO->getTag()==tag) { DCMDATA_TRACE("DcmItem::searchSubFromHere() Element " << tag << " found"); } } return l_error; } // ******************************** OFCondition DcmItem::search(const DcmTagKey &tag, DcmStack &resultStack, E_SearchMode mode, OFBool searchIntoSub) { DcmObject *dO = NULL; OFCondition l_error = EC_TagNotFound; if (mode == ESM_afterStackTop && resultStack.top() == this) { l_error = searchSubFromHere(tag, resultStack, searchIntoSub); } else if (!elementList->empty()) { if (mode == ESM_fromHere || resultStack.empty()) { resultStack.clear(); l_error = searchSubFromHere(tag, resultStack, searchIntoSub); } else if (mode == ESM_fromStackTop) { dO = resultStack.top(); if (dO == this) l_error = searchSubFromHere(tag, resultStack, searchIntoSub); else { // gehe direkt zu Sub-Baum und suche dort weiter l_error = dO->search(tag, resultStack, mode, searchIntoSub); // The next two lines destroy the stack->so delete them // if (l_error.bad()) // raeumt nur die oberste Stackebene // resultStack.pop(); // ab; der Rest ist unveraendert } } else if (mode == ESM_afterStackTop && searchIntoSub) { // resultStack enthaelt Zielinformationen: // - stelle Zustand der letzen Suche in den einzelnen Suchroutinen // wieder her // - finde Position von dO in Baum-Struktur // 1. suche eigenen Stack-Eintrag // - bei Fehlschlag Suche beenden // 2. nehme naechsthoeheren Eintrag dnO // 3. stelle eigene Liste auf Position von dnO // 4. starte Suche ab dnO unsigned long i = resultStack.card(); while (i > 0 && (dO = resultStack.elem(i-1)) != this) { i--; } if (dO != this && resultStack.card() > 0) { // oberste Ebene steht nie in resultStack i = resultStack.card()+1;// zeige jetzt auf hoechste Ebene+1 dO = this; // Treffer der hoechsten Ebene! } if (dO == this) { if (i == 1) // habe resultStack.top() gefunden l_error = EC_TagNotFound; // markiere als kein Treffer, s.o. else // siehe oben { E_SearchMode submode = mode; OFBool searchNode = OFTrue; DcmObject *dnO; dnO = resultStack.elem(i - 2); // Knoten der naechsten Ebene elementList->seek(ELP_first); do { dO = elementList->get(); searchNode = searchNode ? (dO != dnO) : OFFalse; if (!searchNode) { // suche jetzt weiter if (submode == ESM_fromStackTop) resultStack.push(dO); // Stack aktualisieren if (submode == ESM_fromStackTop && dO->getTag() == tag) l_error = EC_Normal; else l_error = dO->search(tag, resultStack, submode, OFTrue); if (l_error.bad()) resultStack.pop(); else break; submode = ESM_fromStackTop; // ab hier normale Suche } } while (elementList->seek(ELP_next)); } } else l_error = EC_IllegalCall; } // (mode == ESM_afterStackTop else l_error = EC_IllegalCall; } return l_error; } // ******************************** OFCondition DcmItem::loadAllDataIntoMemory() { OFCondition l_error = EC_Normal; if (!elementList->empty()) { elementList->seek(ELP_first); do { OFCondition err = EC_Normal; DcmObject *dO = elementList->get(); if ((err = dO->loadAllDataIntoMemory()).bad()) l_error = err; } while (elementList->seek(ELP_next)); } return l_error; } // ******************************** // Support functions OFCondition newDicomElement(DcmElement *&newElement, const DcmTag &tag, const Uint32 length) { DcmTag newTag(tag); OFBool readAsUN = OFFalse; return newDicomElement(newElement, newTag, length, NULL, readAsUN); } DcmElement *newDicomElement(const DcmTag &tag, const Uint32 length) { DcmElement *newElement = NULL; newDicomElement(newElement, tag, length); return newElement; } // ******************************** OFCondition newDicomElement(DcmElement *&newElement, DcmTag &tag, const Uint32 length, DcmPrivateTagCache *privateCreatorCache, OFBool& readAsUN) { /* initialize variables */ OFCondition l_error = EC_Normal; newElement = NULL; DcmEVR evr = tag.getEVR(); readAsUN = OFFalse; /* revert UN elements with finite length back to known VR if possible */ if ((evr == EVR_UN) && (length != DCM_UndefinedLength) && dcmEnableUnknownVRConversion.get()) { /* look up VR in data dictionary */ DcmTag newTag(tag.getGroup(), tag.getElement()); /* special handling for private elements */ if (privateCreatorCache && (newTag.getGroup() & 1) && (newTag.getElement() >= 0x1000)) { const char *pc = privateCreatorCache->findPrivateCreator(newTag); if (pc != NULL) { // we have a private creator for this element newTag.setPrivateCreator(pc); newTag.lookupVRinDictionary(); } } /* update VR for tag, set "readAsUN" flag that makes sure the element value * is read in Little Endian Implicit VR (i.e. the UN encoding) */ if (newTag.getEVR() != EVR_UNKNOWN) { tag.setVR(newTag.getVR()); evr = tag.getEVR(); readAsUN = OFTrue; } } /* depending on the VR of the tag which was passed, create the new object */ switch (evr) { // byte strings: case EVR_AE : newElement = new DcmApplicationEntity(tag, length); break; case EVR_AS : newElement = new DcmAgeString(tag, length); break; case EVR_CS : newElement = new DcmCodeString(tag, length); break; case EVR_DA : newElement = new DcmDate(tag, length); break; case EVR_DS : newElement = new DcmDecimalString(tag, length); break; case EVR_DT : newElement = new DcmDateTime(tag, length); break; case EVR_IS : newElement = new DcmIntegerString(tag, length); break; case EVR_TM : newElement = new DcmTime(tag, length); break; case EVR_UI : newElement = new DcmUniqueIdentifier(tag, length); break; // character strings: case EVR_LO : newElement = new DcmLongString(tag, length); break; case EVR_LT : newElement = new DcmLongText(tag, length); break; case EVR_PN : newElement = new DcmPersonName(tag, length); break; case EVR_SH : newElement = new DcmShortString(tag, length); break; case EVR_ST : newElement = new DcmShortText(tag, length); break; case EVR_UT: newElement = new DcmUnlimitedText(tag, length); break; // dependent on byte order: case EVR_AT : newElement = new DcmAttributeTag(tag, length); break; case EVR_SS : newElement = new DcmSignedShort(tag, length); break; case EVR_xs : // according to DICOM standard case EVR_US : newElement = new DcmUnsignedShort(tag, length); break; case EVR_SL : newElement = new DcmSignedLong(tag, length); break; case EVR_up : // for (0004,eeee) according to DICOM standard case EVR_UL : { // generate tag with VR from dictionary! DcmTag ulupTag(tag.getXTag()); if (ulupTag.getEVR() == EVR_up) newElement = new DcmUnsignedLongOffset(ulupTag, length); else newElement = new DcmUnsignedLong(tag, length); } break; case EVR_FL : newElement = new DcmFloatingPointSingle(tag, length); break; case EVR_FD : newElement = new DcmFloatingPointDouble(tag, length); break; case EVR_OF : newElement = new DcmOtherFloat(tag, length); break; // sequences and items case EVR_SQ : newElement = new DcmSequenceOfItems(tag, length); break; case EVR_na : if (tag.getXTag() == DCM_Item) l_error = EC_InvalidTag; else if (tag.getXTag() == DCM_SequenceDelimitationItem) l_error = EC_SequEnd; else if (tag.getXTag() == DCM_ItemDelimitationItem) l_error = EC_ItemEnd; else l_error = EC_InvalidTag; break; // pixel sequences (EVR_pixelSQ) are handled through class DcmPixelData // and should never appear here. // unclear 8 or 16 bit: case EVR_ox : if (tag == DCM_PixelData) newElement = new DcmPixelData(tag, length); else if (((tag.getGTag() & 0xffe1) == 0x6000) && (tag.getETag() == 0x3000)) // DCM_OverlayData newElement = new DcmOverlayData(tag, length); else /* we don't know this element's real transfer syntax, so we just * use the defaults of class DcmOtherByteOtherWord and let the * application handle it. */ newElement = new DcmOtherByteOtherWord(tag, length); break; case EVR_lt : newElement = new DcmOtherByteOtherWord(tag, length); break; case EVR_OB : case EVR_OW : if (tag == DCM_PixelData) newElement = new DcmPixelData(tag, length); else if (((tag.getGTag() & 0xffe1) == 0x6000) && (tag.getETag() == 0x3000)) // DCM_OverlayData newElement = new DcmOverlayData(tag, length); else if (length == DCM_UndefinedLength) { // The attribute is OB or OW but is encoded with undefined // length. Assume it is really a sequence so that we can // catch the sequence delimitation item. newElement = new DcmSequenceOfItems(tag, length); } else { newElement = new DcmOtherByteOtherWord(tag, length); } break; // read unknown types as byte string: case EVR_UNKNOWN : case EVR_UNKNOWN2B : case EVR_UN : default : if (length == DCM_UndefinedLength) { // The attribute VR is UN with undefined length. Assume it is // really a sequence so that we can catch the sequence delimitation item. DcmVR sqVR(EVR_SQ); // on writing we will handle this element as SQ, not UN DcmTag newTag(tag.getXTag(), sqVR); newElement = new DcmSequenceOfItems(newTag, length, dcmEnableCP246Support.get()); } else { // defined length UN element, treat like OB newElement = new DcmOtherByteOtherWord(tag, length); } break; } /* check for valid element pointer */ if (l_error.good() && (newElement == NULL)) l_error = EC_MemoryExhausted; /* return result value */ return l_error; } OFCondition nextUp(DcmStack &stack) { DcmObject *oldContainer = stack.pop(); if (oldContainer->isLeaf()) return EC_IllegalCall; else if (!stack.empty()) { DcmObject *container = stack.top(); DcmObject *result = container->nextInContainer(oldContainer); if (result) { stack.push(result); return EC_Normal; } else return nextUp(stack); } return EC_TagNotFound; } /* ** Simple tests for existance */ OFBool DcmItem::tagExists(const DcmTagKey &key, OFBool searchIntoSub) { DcmStack stack; OFCondition ec = search(key, stack, ESM_fromHere, searchIntoSub); return (ec.good()); } OFBool DcmItem::tagExistsWithValue(const DcmTagKey &key, OFBool searchIntoSub) { DcmElement *elem = NULL; Uint32 len = 0; DcmStack stack; OFCondition ec = search(key, stack, ESM_fromHere, searchIntoSub); elem = OFstatic_cast(DcmElement *, stack.top()); if (ec.good() && elem != NULL) len = elem->getLength(); return (ec.good()) && (len > 0); } // ******************************** /* --- findAndGet functions: find an element and get it or the value, respectively --- */ OFCondition DcmItem::findAndGetElement(const DcmTagKey &tagKey, DcmElement *&element, const OFBool searchIntoSub, const OFBool createCopy) { DcmStack stack; /* find the element */ OFCondition status = search(tagKey, stack, ESM_fromHere, searchIntoSub); if (status.good()) { element = OFstatic_cast(DcmElement *, stack.top()); /* should never happen but ... */ if (element == NULL) status = EC_CorruptedData; else if (createCopy) { /* create a copy of the element */ element = OFstatic_cast(DcmElement *, element->clone()); if (element == NULL) status = EC_MemoryExhausted; } } else { /* reset element pointer */ element = NULL; } return status; } OFCondition DcmItem::findAndGetElements(const DcmTagKey &tagKey, DcmStack &resultStack) { OFCondition status = EC_TagNotFound; DcmStack stack; DcmObject *object = NULL; /* iterate over all elements */ while (nextObject(stack, OFTrue).good()) { /* get element */ object = stack.top(); if (object->getTag() == tagKey) { /* add it to the result stack */ resultStack.push(object); status = EC_Normal; } } return status; } OFCondition DcmItem::findAndGetString(const DcmTagKey& tagKey, const char *&value, const OFBool searchIntoSub) { DcmElement *elem; /* find the element */ OFCondition status = findAndGetElement(tagKey, elem, searchIntoSub); if (status.good()) { /* get the value */ status = elem->getString(OFconst_cast(char *&, value)); } /* reset value */ if (status.bad()) value = NULL; return status; } OFCondition DcmItem::findAndGetOFString(const DcmTagKey& tagKey, OFString &value, const unsigned long pos, const OFBool searchIntoSub) { DcmElement *elem; /* find the element */ OFCondition status = findAndGetElement(tagKey, elem, searchIntoSub); if (status.good()) { /* get the value */ status = elem->getOFString(value, pos); } /* reset value */ if (status.bad()) value.clear(); return status; } OFCondition DcmItem::findAndGetOFStringArray(const DcmTagKey& tagKey, OFString &value, const OFBool searchIntoSub) { DcmElement *elem; /* find the element */ OFCondition status = findAndGetElement(tagKey, elem, searchIntoSub); if (status.good()) { /* get the value */ status = elem->getOFStringArray(value); } /* reset value */ if (status.bad()) value.clear(); return status; } OFCondition DcmItem::findAndGetUint8(const DcmTagKey& tagKey, Uint8 &value, const unsigned long pos, const OFBool searchIntoSub) { DcmElement *elem; /* find the element */ OFCondition status = findAndGetElement(tagKey, elem, searchIntoSub); if (status.good()) { /* get the value */ status = elem->getUint8(value, pos); } /* reset value */ if (status.bad()) value = 0; return status; } OFCondition DcmItem::findAndGetUint8Array(const DcmTagKey& tagKey, const Uint8 *&value, unsigned long *count, const OFBool searchIntoSub) { DcmElement *elem; /* find the element */ OFCondition status = findAndGetElement(tagKey, elem, searchIntoSub); if (status.good()) { /* get the value */ Uint8 *array = NULL; status = elem->getUint8Array(array); value = array; } /* set optional count parameter */ if (count != NULL) { if (status.good()) *count = elem->getLength() / sizeof(Uint8); else *count = 0; } /* reset value */ if (status.bad()) value = NULL; return status; } OFCondition DcmItem::findAndGetUint16(const DcmTagKey& tagKey, Uint16 &value, const unsigned long pos, const OFBool searchIntoSub) { DcmElement *elem; /* find the element */ OFCondition status = findAndGetElement(tagKey, elem, searchIntoSub); if (status.good()) { /* get the value */ status = elem->getUint16(value, pos); } /* reset value */ if (status.bad()) value = 0; return status; } OFCondition DcmItem::findAndGetUint16Array(const DcmTagKey& tagKey, const Uint16 *&value, unsigned long *count, const OFBool searchIntoSub) { DcmElement *elem; /* find the element */ OFCondition status = findAndGetElement(tagKey, elem, searchIntoSub); if (status.good()) { /* get the value */ Uint16 *array = NULL; status = elem->getUint16Array(array); value = array; } /* set optional count parameter */ if (count != NULL) { if (status.good()) *count = elem->getLength() / sizeof(Uint16); else *count = 0; } /* reset value */ if (status.bad()) value = NULL; return status; } OFCondition DcmItem::findAndGetSint16(const DcmTagKey& tagKey, Sint16 &value, const unsigned long pos, const OFBool searchIntoSub) { DcmElement *elem; /* find the element */ OFCondition status = findAndGetElement(tagKey, elem, searchIntoSub); if (status.good()) { /* get the value */ status = elem->getSint16(value, pos); } /* reset value */ if (status.bad()) value = 0; return status; } OFCondition DcmItem::findAndGetSint16Array(const DcmTagKey& tagKey, const Sint16 *&value, unsigned long *count, const OFBool searchIntoSub) { DcmElement *elem; /* find the element */ OFCondition status = findAndGetElement(tagKey, elem, searchIntoSub); if (status.good()) { /* get the value */ Sint16 *array = NULL; status = elem->getSint16Array(array); value = array; } /* set optional count parameter */ if (count != NULL) { if (status.good()) *count = elem->getLength() / sizeof(Sint16); else *count = 0; } /* reset value */ if (status.bad()) value = NULL; return status; } OFCondition DcmItem::findAndGetUint32(const DcmTagKey& tagKey, Uint32 &value, const unsigned long pos, const OFBool searchIntoSub) { DcmElement *elem; /* find the element */ OFCondition status = findAndGetElement(tagKey, elem, searchIntoSub); if (status.good()) { /* get the value */ status = elem->getUint32(value, pos); } /* reset value */ if (status.bad()) value = 0; return status; } OFCondition DcmItem::findAndGetUint32Array(const DcmTagKey& tagKey, const Uint32 *&value, unsigned long *count, const OFBool searchIntoSub) { DcmElement *elem; /* find the element */ OFCondition status = findAndGetElement(tagKey, elem, searchIntoSub); if (status.good()) { /* get the value */ Uint32 *array = NULL; status = elem->getUint32Array(array); value = array; } /* set optional count parameter */ if (count != NULL) { if (status.good()) *count = elem->getLength() / sizeof(Uint32); else *count = 0; } /* reset value */ if (status.bad()) value = NULL; return status; } OFCondition DcmItem::findAndGetSint32(const DcmTagKey& tagKey, Sint32 &value, const unsigned long pos, const OFBool searchIntoSub) { DcmElement *elem; /* find the element */ OFCondition status = findAndGetElement(tagKey, elem, searchIntoSub); if (status.good()) { /* get the value */ status = elem->getSint32(value, pos); } /* reset value */ if (status.bad()) value = 0; return status; } OFCondition DcmItem::findAndGetSint32Array(const DcmTagKey& tagKey, const Sint32 *&value, unsigned long *count, const OFBool searchIntoSub) { DcmElement *elem; /* find the element */ OFCondition status = findAndGetElement(tagKey, elem, searchIntoSub); if (status.good()) { /* get the value */ Sint32 *array = NULL; status = elem->getSint32Array(array); value = array; } /* set optional count parameter */ if (count != NULL) { if (status.good()) *count = elem->getLength() / sizeof(Sint32); else *count = 0; } /* reset value */ if (status.bad()) value = NULL; return status; } OFCondition DcmItem::findAndGetLongInt(const DcmTagKey& tagKey, long int &value, const unsigned long pos, const OFBool searchIntoSub) { DcmElement *elem; /* find the element */ OFCondition status = findAndGetElement(tagKey, elem, searchIntoSub); if (status.good()) { /* distinguish supported VRs */ switch (elem->ident()) { case EVR_UL: case EVR_up: Uint32 ul; status = elem->getUint32(ul, pos); value = OFstatic_cast(long int, ul); break; case EVR_SL: case EVR_IS: Sint32 sl; status = elem->getSint32(sl, pos); value = OFstatic_cast(long int, sl); break; case EVR_US: case EVR_xs: case EVR_lt: Uint16 us; status = elem->getUint16(us, pos); value = OFstatic_cast(long int, us); break; case EVR_SS: Sint16 ss; status = elem->getSint16(ss, pos); value = OFstatic_cast(long int, ss); break; default: status = EC_IllegalCall; break; } } /* reset value */ if (status.bad()) value = 0; return status; } OFCondition DcmItem::findAndGetFloat32(const DcmTagKey& tagKey, Float32 &value, const unsigned long pos, const OFBool searchIntoSub) { DcmElement *elem; /* find the element */ OFCondition status = findAndGetElement(tagKey, elem, searchIntoSub); if (status.good()) { /* get the value */ status = elem->getFloat32(value, pos); } /* reset value */ if (status.bad()) value = 0; return status; } OFCondition DcmItem::findAndGetFloat32Array(const DcmTagKey& tagKey, const Float32 *&value, unsigned long *count, const OFBool searchIntoSub) { DcmElement *elem; /* find the element */ OFCondition status = findAndGetElement(tagKey, elem, searchIntoSub); if (status.good()) { /* get the value */ Float32 *array = NULL; status = elem->getFloat32Array(array); value = array; } /* set optional count parameter */ if (count != NULL) { if (status.good()) *count = elem->getLength() / sizeof(Float32); else *count = 0; } /* reset value */ if (status.bad()) value = NULL; return status; } OFCondition DcmItem::findAndGetFloat64(const DcmTagKey& tagKey, Float64 &value, const unsigned long pos, const OFBool searchIntoSub) { DcmElement *elem; /* find the element */ OFCondition status = findAndGetElement(tagKey, elem, searchIntoSub); if (status.good()) { /* get the value */ status = elem->getFloat64(value, pos); } /* reset value */ if (status.bad()) value = 0; return status; } OFCondition DcmItem::findAndGetFloat64Array(const DcmTagKey& tagKey, const Float64 *&value, unsigned long *count, const OFBool searchIntoSub) { DcmElement *elem; /* find the element */ OFCondition status = findAndGetElement(tagKey, elem, searchIntoSub); if (status.good()) { /* get the value */ Float64 *array = NULL; status = elem->getFloat64Array(array); value = array; } /* set optional count parameter */ if (count != NULL) { if (status.good()) *count = elem->getLength() / sizeof(Float64); else *count = 0; } /* reset value */ if (status.bad()) value = NULL; return status; } OFCondition DcmItem::findAndGetSequence(const DcmTagKey &seqTagKey, DcmSequenceOfItems *&sequence, const OFBool searchIntoSub, const OFBool createCopy) { DcmStack stack; /* find the element */ OFCondition status = search(seqTagKey, stack, ESM_fromHere, searchIntoSub); if (status.good()) { DcmElement *delem = OFstatic_cast(DcmElement *, stack.top()); /* should never happen but ... */ if (delem == NULL) status = EC_CorruptedData; /* check for correct VR */ else if ((delem->ident() == EVR_SQ) || (delem->ident() == EVR_pixelSQ)) { sequence = OFstatic_cast(DcmSequenceOfItems *, delem); /* create a copy of the sequence? */ if (createCopy) { sequence = OFstatic_cast(DcmSequenceOfItems *, sequence->clone()); if (sequence == NULL) status = EC_MemoryExhausted; } } else status = EC_InvalidVR; } if (status.bad()) { /* reset sequence pointer */ sequence = NULL; } return status; } OFCondition DcmItem::findAndGetSequenceItem(const DcmTagKey &seqTagKey, DcmItem *&item, const signed long itemNum, const OFBool createCopy) { DcmStack stack; /* find sequence */ OFCondition status = search(seqTagKey, stack, ESM_fromHere, OFFalse /*searchIntoSub*/); if (status.good()) { /* get element */ DcmElement *delem = OFstatic_cast(DcmElement *, stack.top()); if (delem != NULL) { /* check VR */ if ((delem->ident() == EVR_SQ) || (delem->ident() == EVR_pixelSQ)) { DcmSequenceOfItems *sequence = OFstatic_cast(DcmSequenceOfItems *, delem); const unsigned long count = sequence->card(); /* empty sequence? */ if (count > 0) { /* get last item */ if (itemNum == -1) item = sequence->getItem(count - 1); /* get specified item */ else if ((itemNum >= 0) && (OFstatic_cast(unsigned long, itemNum) < count)) item = sequence->getItem(OFstatic_cast(unsigned long, itemNum)); /* invalid item number */ else status = EC_IllegalParameter; /* create a copy of the item? */ if (createCopy) { if (status.good() && (item != NULL)) { item = OFstatic_cast(DcmItem *, item->clone()); if (item == NULL) status = EC_MemoryExhausted; } } } else status = EC_IllegalParameter; } else status = EC_InvalidVR; } else status = EC_CorruptedData; } /* reset item value */ if (status.bad()) item = NULL; else if (item == NULL) status = EC_IllegalCall; return status; } // ******************************** /* --- findOrCreate functions: find an element or create a new one --- */ OFCondition DcmItem::findOrCreateSequenceItem(const DcmTag& seqTag, DcmItem *&item, const signed long itemNum) { DcmStack stack; /* find sequence */ OFCondition status = search(seqTag, stack, ESM_fromHere, OFFalse /*searchIntoSub*/); DcmSequenceOfItems *sequence = NULL; /* sequence found? */ if (status.good()) { /* get element */ DcmElement *delem = OFstatic_cast(DcmElement *, stack.top()); if (delem != NULL) { /* check VR */ if ((delem->ident() == EVR_SQ) || (delem->ident() == EVR_pixelSQ)) sequence = OFstatic_cast(DcmSequenceOfItems *, delem); else status = EC_InvalidVR; } else status = EC_CorruptedData; } else { /* create new sequence element */ sequence = new DcmSequenceOfItems(seqTag); if (sequence != NULL) { /* insert into item/dataset */ status = insert(sequence, OFTrue /*replaceOld*/); if (status.bad()) delete sequence; } else status = EC_MemoryExhausted; } if (status.good()) { if (sequence != NULL) { const unsigned long count = sequence->card(); /* existing item? */ if ((count > 0) && (itemNum >= -1) && (itemNum < OFstatic_cast(signed long, count))) { if (itemNum == -1) { /* get last item */ item = sequence->getItem(count - 1); } else { /* get specified item */ item = sequence->getItem(OFstatic_cast(unsigned long, itemNum)); } /* create new item(s) */ } else { unsigned long i = 0; /* create empty trailing items if required */ const unsigned long itemCount = (itemNum > OFstatic_cast(signed long, count)) ? (itemNum - count + 1) : 1; while ((i < itemCount) && status.good()) { item = new DcmItem(); if (item != NULL) { /* append new item to end of sequence */ status = sequence->append(item); if (status.bad()) delete item; } else status = EC_MemoryExhausted; i++; } } } else status = EC_IllegalCall; } /* reset item value */ if (status.bad()) item = NULL; else if (item == NULL) status = EC_IllegalCall; return status; } // ******************************** /* --- findAndXXX functions: find an element and do something with it --- */ OFCondition DcmItem::findAndInsertCopyOfElement(const DcmTagKey &tagKey, DcmItem *destItem, const OFBool replaceOld) { OFCondition status = EC_IllegalParameter; if (destItem != NULL) { DcmElement *delem = NULL; /* get copy of element from current dataset */ status = findAndGetElement(tagKey, delem, OFFalse /*searchIntoSub*/, OFTrue /*createCopy*/); if (status.good()) { /* ... and insert it into the destination dataset */ status = destItem->insert(delem, replaceOld); if (status.bad()) delete delem; } } return status; } OFCondition DcmItem::findAndDeleteElement(const DcmTagKey &tagKey, const OFBool allOccurrences, const OFBool searchIntoSub) { OFCondition status = EC_TagNotFound; DcmStack stack; DcmObject *object = NULL; OFBool intoSub = OFTrue; /* iterate over all elements */ while (nextObject(stack, intoSub).good()) { /* get element */ object = stack.top(); if (object->getTag() == tagKey) { stack.pop(); /* remove element from dataset and free memory */ delete OFstatic_cast(DcmItem *, stack.top())->remove(object); status = EC_Normal; /* delete only the first element? */ if (!allOccurrences) break; } intoSub = searchIntoSub || allOccurrences; } return status; } OFCondition DcmItem::findAndDeleteSequenceItem(const DcmTagKey &seqTagKey, const signed long itemNum) { DcmStack stack; /* find sequence */ OFCondition status = search(seqTagKey, stack, ESM_fromHere, OFFalse /*searchIntoSub*/); if (status.good()) { /* get element */ DcmElement *delem = OFstatic_cast(DcmElement *, stack.top()); if (delem != NULL) { /* check VR */ if ((delem->ident() == EVR_SQ) || (delem->ident() == EVR_pixelSQ)) { DcmSequenceOfItems *sequence = OFstatic_cast(DcmSequenceOfItems *, delem); const unsigned long count = sequence->card(); /* last item? */ if (itemNum == -1) delete sequence->remove(count - 1); /* valid item? */ else if ((itemNum >= 0) && (OFstatic_cast(unsigned long, itemNum) < count)) delete sequence->remove(OFstatic_cast(unsigned long, itemNum)); else status = EC_IllegalParameter; } else status = EC_InvalidVR; } else status = EC_CorruptedData; } return status; } // ******************************** /* --- putAndInsert functions: put value and insert new element --- */ OFCondition DcmItem::putAndInsertString(const DcmTag& tag, const char *value, const OFBool replaceOld) { OFCondition status = EC_Normal; /* create new element */ DcmElement *elem = NULL; switch(tag.getEVR()) { case EVR_AE: elem = new DcmApplicationEntity(tag); break; case EVR_AS: elem = new DcmAgeString(tag); break; case EVR_AT: elem = new DcmAttributeTag(tag); break; case EVR_CS: elem = new DcmCodeString(tag); break; case EVR_DA: elem = new DcmDate(tag); break; case EVR_DS: elem = new DcmDecimalString(tag); break; case EVR_DT: elem = new DcmDateTime(tag); break; case EVR_FL: elem = new DcmFloatingPointSingle(tag); break; case EVR_FD: elem = new DcmFloatingPointDouble(tag); break; case EVR_IS: elem = new DcmIntegerString(tag); break; case EVR_LO: elem = new DcmLongString(tag); break; case EVR_LT: elem = new DcmLongText(tag); break; case EVR_PN: elem = new DcmPersonName(tag); break; case EVR_OB: case EVR_OW: elem = new DcmOtherByteOtherWord(tag); break; case EVR_OF: elem = new DcmOtherFloat(tag); break; case EVR_SH: elem = new DcmShortString(tag); break; case EVR_SL: elem = new DcmSignedLong(tag); break; case EVR_SS: elem = new DcmSignedShort(tag); break; case EVR_ST: elem = new DcmShortText(tag); break; case EVR_TM: elem = new DcmTime(tag); break; case EVR_UI: elem = new DcmUniqueIdentifier(tag); break; case EVR_UL: elem = new DcmUnsignedLong(tag); break; case EVR_US: elem = new DcmUnsignedShort(tag); break; case EVR_UT: elem = new DcmUnlimitedText(tag); break; default: status = EC_IllegalCall; break; } if (elem != NULL) { /* put value */ status = elem->putString(value); /* insert into dataset/item */ if (status.good()) status = insert(elem, replaceOld); /* could not be inserted, therefore, delete it immediately */ if (status.bad()) delete elem; } else if (status.good()) status = EC_MemoryExhausted; return status; } OFCondition DcmItem::putAndInsertOFStringArray(const DcmTag& tag, const OFString &value, const OFBool replaceOld) { OFCondition status = EC_Normal; /* create new element */ DcmElement *elem = NULL; switch(tag.getEVR()) { case EVR_AE: elem = new DcmApplicationEntity(tag); break; case EVR_AS: elem = new DcmAgeString(tag); break; case EVR_CS: elem = new DcmCodeString(tag); break; case EVR_DA: elem = new DcmDate(tag); break; case EVR_DS: elem = new DcmDecimalString(tag); break; case EVR_DT: elem = new DcmDateTime(tag); break; case EVR_IS: elem = new DcmIntegerString(tag); break; case EVR_LO: elem = new DcmLongString(tag); break; case EVR_LT: elem = new DcmLongText(tag); break; case EVR_PN: elem = new DcmPersonName(tag); break; case EVR_SH: elem = new DcmShortString(tag); break; case EVR_ST: elem = new DcmShortText(tag); break; case EVR_TM: elem = new DcmTime(tag); break; case EVR_UI: elem = new DcmUniqueIdentifier(tag); break; case EVR_UT: elem = new DcmUnlimitedText(tag); break; default: status = EC_IllegalCall; break; } if (elem != NULL) { /* put value */ status = elem->putOFStringArray(value); /* insert into dataset/item */ if (status.good()) status = insert(elem, replaceOld); /* could not be inserted, therefore, delete it immediately */ if (status.bad()) delete elem; } else if (status.good()) status = EC_MemoryExhausted; return status; } OFCondition DcmItem::putAndInsertUint8Array(const DcmTag& tag, const Uint8 *value, const unsigned long count, const OFBool replaceOld) { OFCondition status = EC_Normal; /* create new element */ DcmElement *elem = NULL; switch(tag.getEVR()) { case EVR_OB: elem = new DcmOtherByteOtherWord(tag); break; case EVR_ox: /* special handling for Pixel Data */ if (tag == DCM_PixelData) { elem = new DcmPixelData(tag); if (elem != NULL) elem->setVR(EVR_OB); } else elem = new DcmPolymorphOBOW(tag); break; default: status = EC_IllegalCall; break; } if (elem != NULL) { /* put value */ status = elem->putUint8Array(value, count); /* insert into dataset/item */ if (status.good()) status = insert(elem, replaceOld); /* could not be inserted, therefore, delete it immediately */ if (status.bad()) delete elem; } else if (status.good()) status = EC_MemoryExhausted; return status; } OFCondition DcmItem::putAndInsertUint16(const DcmTag& tag, const Uint16 value, const unsigned long pos, const OFBool replaceOld) { OFCondition status = EC_Normal; DcmElement *elem = NULL; /* create new element */ switch(tag.getEVR()) { case EVR_US: elem = new DcmUnsignedShort(tag); break; case EVR_lt: case EVR_xs: /* special handling */ elem = new DcmUnsignedShort(DcmTag(tag, EVR_US)); break; default: status = EC_IllegalCall; break; } if (elem != NULL) { /* put value */ status = elem->putUint16(value, pos); /* insert into dataset/item */ if (status.good()) status = insert(elem, replaceOld); /* could not be inserted, therefore, delete it immediately */ if (status.bad()) delete elem; } else if (status.good()) status = EC_MemoryExhausted; return status; } OFCondition DcmItem::putAndInsertUint16Array(const DcmTag& tag, const Uint16 *value, const unsigned long count, const OFBool replaceOld) { OFCondition status = EC_Normal; /* create new element */ DcmElement *elem = NULL; switch(tag.getEVR()) { case EVR_AT: elem = new DcmAttributeTag(tag); break; case EVR_lt: case EVR_OW: elem = new DcmOtherByteOtherWord(tag); break; case EVR_US: elem = new DcmUnsignedShort(tag); break; case EVR_ox: /* special handling */ if (tag == DCM_PixelData) elem = new DcmPixelData(tag); else elem = new DcmPolymorphOBOW(tag); break; case EVR_xs: /* special handling */ elem = new DcmUnsignedShort(DcmTag(tag, EVR_US)); break; default: status = EC_IllegalCall; break; } if (elem != NULL) { /* put value */ status = elem->putUint16Array(value, count); /* insert into dataset/item */ if (status.good()) status = insert(elem, replaceOld); /* could not be inserted, therefore, delete it immediately */ if (status.bad()) delete elem; } else if (status.good()) status = EC_MemoryExhausted; return status; } OFCondition DcmItem::putAndInsertSint16(const DcmTag& tag, const Sint16 value, const unsigned long pos, const OFBool replaceOld) { OFCondition status = EC_Normal; DcmElement *elem = NULL; /* create new element */ switch(tag.getEVR()) { case EVR_SS: elem = new DcmSignedShort(tag); break; case EVR_lt: case EVR_xs: /* special handling */ elem = new DcmSignedShort(DcmTag(tag, EVR_SS)); break; default: status = EC_IllegalCall; break; } if (elem != NULL) { /* put value */ status = elem->putSint16(value, pos); /* insert into dataset/item */ if (status.good()) status = insert(elem, replaceOld); /* could not be inserted, therefore, delete it immediately */ if (status.bad()) delete elem; } else if (status.good()) status = EC_MemoryExhausted; return status; } OFCondition DcmItem::putAndInsertSint16Array(const DcmTag& tag, const Sint16 *value, const unsigned long count, const OFBool replaceOld) { OFCondition status = EC_Normal; DcmElement *elem = NULL; /* create new element */ switch(tag.getEVR()) { case EVR_SS: elem = new DcmSignedShort(tag); break; case EVR_lt: case EVR_xs: /* special handling */ elem = new DcmSignedShort(DcmTag(tag, EVR_SS)); break; default: status = EC_IllegalCall; break; } if (elem != NULL) { /* put value */ status = elem->putSint16Array(value, count); /* insert into dataset/item */ if (status.good()) status = insert(elem, replaceOld); /* could not be inserted, therefore, delete it immediately */ if (status.bad()) delete elem; } else if (status.good()) status = EC_MemoryExhausted; return status; } OFCondition DcmItem::putAndInsertUint32(const DcmTag& tag, const Uint32 value, const unsigned long pos, const OFBool replaceOld) { OFCondition status = EC_IllegalCall; /* create new element */ if (tag.getEVR() == EVR_UL) { DcmElement *elem = new DcmUnsignedLong(tag); if (elem != NULL) { /* put value */ status = elem->putUint32(value, pos); /* insert into dataset/item */ if (status.good()) status = insert(elem, replaceOld); /* could not be inserted, therefore, delete it immediately */ if (status.bad()) delete elem; } else if (status.good()) status = EC_MemoryExhausted; } return status; } OFCondition DcmItem::putAndInsertSint32(const DcmTag& tag, const Sint32 value, const unsigned long pos, const OFBool replaceOld) { OFCondition status = EC_IllegalCall; /* create new element */ if (tag.getEVR() == EVR_SL) { DcmElement *elem = new DcmSignedLong(tag); if (elem != NULL) { /* put value */ status = elem->putSint32(value, pos); /* insert into dataset/item */ if (status.good()) status = insert(elem, replaceOld); /* could not be inserted, therefore, delete it immediately */ if (status.bad()) delete elem; } else if (status.good()) status = EC_MemoryExhausted; } return status; } OFCondition DcmItem::putAndInsertFloat32(const DcmTag& tag, const Float32 value, const unsigned long pos, const OFBool replaceOld) { OFCondition status = EC_IllegalCall; /* create new element */ DcmElement *elem = NULL; switch(tag.getEVR()) { case EVR_FL: elem = new DcmFloatingPointSingle(tag); break; case EVR_OF: elem = new DcmOtherFloat(tag); break; default: status = EC_IllegalCall; break; } if (elem != NULL) { /* put value */ status = elem->putFloat32(value, pos); /* insert into dataset/item */ if (status.good()) status = insert(elem, replaceOld); /* could not be inserted, therefore, delete it immediately */ if (status.bad()) delete elem; } else if (status.good()) status = EC_MemoryExhausted; return status; } OFCondition DcmItem::putAndInsertFloat64(const DcmTag& tag, const Float64 value, const unsigned long pos, const OFBool replaceOld) { OFCondition status = EC_IllegalCall; /* create new element */ if (tag.getEVR() == EVR_FD) { DcmElement *elem = new DcmFloatingPointDouble(tag); if (elem != NULL) { /* put value */ status = elem->putFloat64(value, pos); /* insert into dataset/item */ if (status.good()) status = insert(elem, replaceOld); /* could not be inserted, therefore, delete it immediately */ if (status.bad()) delete elem; } else if (status.good()) status = EC_MemoryExhausted; } return status; } // ******************************** OFCondition DcmItem::insertEmptyElement(const DcmTag& tag, const OFBool replaceOld) { OFCondition status = EC_Normal; /* create new element */ DcmElement *elem = NULL; switch(tag.getEVR()) { case EVR_AE: elem = new DcmApplicationEntity(tag); break; case EVR_AS: elem = new DcmAgeString(tag); break; case EVR_AT: elem = new DcmAttributeTag(tag); break; case EVR_CS: elem = new DcmCodeString(tag); break; case EVR_DA: elem = new DcmDate(tag); break; case EVR_DS: elem = new DcmDecimalString(tag); break; case EVR_DT: elem = new DcmDateTime(tag); break; case EVR_FL: elem = new DcmFloatingPointSingle(tag); break; case EVR_FD: elem = new DcmFloatingPointDouble(tag); break; case EVR_IS: elem = new DcmIntegerString(tag); break; case EVR_LO: elem = new DcmLongString(tag); break; case EVR_LT: elem = new DcmLongText(tag); break; case EVR_OF: elem = new DcmOtherFloat(tag); break; case EVR_OB: case EVR_OW: elem = new DcmOtherByteOtherWord(tag); break; case EVR_PN: elem = new DcmPersonName(tag); break; case EVR_SH: elem = new DcmShortString(tag); break; case EVR_SL: elem = new DcmSignedLong(tag); break; case EVR_SQ: elem = new DcmSequenceOfItems(tag); break; case EVR_SS: elem = new DcmSignedShort(tag); break; case EVR_ST: elem = new DcmShortText(tag); break; case EVR_TM: elem = new DcmTime(tag); break; case EVR_UI: elem = new DcmUniqueIdentifier(tag); break; case EVR_UL: elem = new DcmUnsignedLong(tag); break; case EVR_US: elem = new DcmUnsignedShort(tag); break; case EVR_UT: elem = new DcmUnlimitedText(tag); break; default: status = EC_IllegalCall; break; } if (elem != NULL) { /* insert new element into dataset/item */ status = insert(elem, replaceOld); /* could not be inserted, therefore, delete it immediately */ if (status.bad()) delete elem; } else if (status.good()) status = EC_MemoryExhausted; return status; } OFCondition DcmItem::insertSequenceItem(const DcmTag &seqTag, DcmItem *item, const signed long itemNum) { OFCondition status = EC_IllegalParameter; if (item != NULL) { DcmStack stack; /* find sequence */ status = search(seqTag, stack, ESM_fromHere, OFFalse /*searchIntoSub*/); DcmSequenceOfItems *sequence = NULL; /* sequence found? */ if (status.good()) { /* get element */ DcmElement *delem = OFstatic_cast(DcmElement *, stack.top()); if (delem != NULL) { /* check VR */ if ((delem->ident() == EVR_SQ) || (delem->ident() == EVR_pixelSQ)) sequence = OFstatic_cast(DcmSequenceOfItems *, delem); else status = EC_InvalidVR; } else status = EC_CorruptedData; } else { /* create new sequence element */ sequence = new DcmSequenceOfItems(seqTag); if (sequence != NULL) { /* insert into item/dataset */ status = insert(sequence, OFTrue /*replaceOld*/); if (status.bad()) delete sequence; } else status = EC_MemoryExhausted; } if (status.good()) { if (sequence != NULL) { const unsigned long count = sequence->card(); /* 'itemNum' specifies and existing item? */ if ((count > 0) && (itemNum >= -1) && (itemNum < OFstatic_cast(signed long, count))) { if (itemNum == -1) { /* insert given item before last entry */ status = sequence->insert(item, count - 1, OFTrue /*before*/); } else { /* insert given item before specified entry */ status = sequence->insert(item, OFstatic_cast(unsigned long, itemNum), OFTrue /*before*/); } /* create empty item(s) and append */ } else { DcmItem *newItem = NULL; unsigned long i = 0; /* create empty trailing items if required */ const unsigned long itemCount = (itemNum > OFstatic_cast(signed long, count)) ? (itemNum - count) : 0; while ((i < itemCount) && status.good()) { newItem = new DcmItem(); if (newItem != NULL) { /* append new item to end of sequence */ status = sequence->append(newItem); if (status.bad()) delete newItem; } else status = EC_MemoryExhausted; i++; } /* append given item to end of sequence */ status = sequence->append(item); } } else status = EC_IllegalCall; } } return status; } // ******************************** OFBool DcmItem::containsUnknownVR() const { if (!elementList->empty()) { elementList->seek(ELP_first); do { if (elementList->get()->containsUnknownVR()) return OFTrue; } while (elementList->seek(ELP_next)); } return OFFalse; } OFBool DcmItem::containsExtendedCharacters(const OFBool checkAllStrings) { if (!elementList->empty()) { elementList->seek(ELP_first); do { if (elementList->get()->containsExtendedCharacters(checkAllStrings)) return OFTrue; } while (elementList->seek(ELP_next)); } return OFFalse; } OFBool DcmItem::isAffectedBySpecificCharacterSet() const { if (!elementList->empty()) { elementList->seek(ELP_first); do { if (elementList->get()->isAffectedBySpecificCharacterSet()) return OFTrue; } while (elementList->seek(ELP_next)); } return OFFalse; } /* ** CVS/RCS Log: ** $Log: dcitem.cc,v $ ** Revision 1.150 2010-11-02 15:31:09 joergr ** Added special handling for data elements that are associated with different ** VRs (according to the data dictinary) when read with an implicit transfer ** syntax, e.g. PixelPaddingValue or WaveformData. ** ** Revision 1.149 2010-10-20 16:44:16 joergr ** Use type cast macros (e.g. OFstatic_cast) where appropriate. ** ** Revision 1.148 2010-10-14 13:14:08 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.147 2010-10-01 13:55:04 joergr ** Added new helper function findAndInsertCopyOfElement(). ** ** Revision 1.146 2010-06-23 08:50:25 joergr ** Moved log output to another code line in order to avoid a possible NULL ** pointer dereference. ** ** Revision 1.145 2010-03-25 16:31:42 joergr ** Use return value of getTag() for stream output where possible. ** Made log messages more consistent within this module. ** ** Revision 1.144 2010-03-24 14:11:54 onken ** Fixed compilation problem introduced with recent assignment operator changes. ** ** Revision 1.143 2010-03-24 11:56:36 onken ** Fixed memory leak in assignment operators of DcmItem and DcmSequenceOfItems. ** Replaced all code occurences of cleaning all elements from internal lists to ** newly introduced function in DcmList. ** ** Revision 1.142 2009-12-04 16:54:54 joergr ** Sightly modified some log messages. ** ** Revision 1.141 2009-11-13 13:11:20 joergr ** Fixed minor issues in log output. ** ** Revision 1.140 2009-11-04 09:58:09 uli ** Switched to logging mechanism provided by the "new" oflog module ** ** Revision 1.139 2009-09-28 13:30:59 joergr ** Moved general purpose definition file from module dcmdata to ofstd, and ** added new defines in order to make the usage easier. ** ** Revision 1.138 2009-08-31 15:21:57 joergr ** Fixed bug in group length computation which could cause a segmentation fault ** for incorrectly encoded DICOM datasets (with illegal group length elements). ** ** Revision 1.137 2009-08-07 14:35:49 joergr ** Enhanced isEmpty() method by checking whether the data element value consists ** of non-significant characters only. ** ** Revision 1.136 2009-05-15 09:20:09 joergr ** Fixed wrong comments in print() method. ** ** Revision 1.135 2009-04-20 16:02:09 joergr ** Fixed typo. ** ** Revision 1.134 2009-03-25 10:21:21 joergr ** Added new method isEmpty() to DICOM object, item and sequence class. ** ** Revision 1.133 2009-03-18 13:54:04 joergr ** Fixed "number overflow" issue with error message on non-standard VR. ** ** Revision 1.132 2009-03-05 14:08:05 onken ** Fixed typo. ** ** Revision 1.131 2009-03-05 13:35:07 onken ** Added checks for sequence and item lengths which prevents overflow in length ** field, if total length of contained items (or sequences) exceeds 32-bit ** length field. Also introduced new flag (default: enabled) for writing ** in explicit length mode, which allows for automatically switching encoding ** of only that very sequence/item to undefined length coding (thus permitting ** to actually write the file). ** ** Revision 1.130 2009-02-18 12:22:11 meichel ** Minor changes needed for VC6 ** ** Revision 1.129 2009-02-16 16:09:36 onken ** Fixed bug that caused incorrect error message when parsing undefined length ** sequences inside defined length items. ** ** Revision 1.128 2009-02-11 13:16:36 onken ** Added global parser flag permitting to stop parsing after a specific ** element was parsed on dataset level (useful for removing garbage at ** end of file). ** ** Revision 1.127 2009-02-05 14:59:43 onken ** Make usage of global "ignore parsing errors" flag in case of elements ** being larger than rest of available input. However, if enabled, the ** parser ignores any elements coming after such an input-exceeding ** element. Minor code clarifications. ** ** Revision 1.126 2009-02-05 10:39:52 joergr ** Made new error messages more consistent with existing messages. ** ** Revision 1.125 2009-02-04 18:07:30 joergr ** Minor fixes and code restructuring (without changing the semantics). ** Fixed various type mismatches reported by MSVC introduced with OFFile class. ** ** Revision 1.124 2009-02-04 14:06:01 onken ** Changed parser to make use of the new error ignoring flag when parsing. ** Added check (makes use of new flag) that notes whether an element's value is ** specified larger than the surrounding item (applicable for explicit length ** coding). ** ** Revision 1.123 2009-01-29 15:35:32 onken ** Added global parsing option that allows for reading private attributes in ** implicit encoding having a maximum length to be read as sequences instead ** of relying on the dictionary. ** ** Revision 1.122 2009-01-06 16:27:03 joergr ** Reworked print() output format for option PF_showTreeStructure. ** ** Revision 1.121 2009-01-05 15:31:42 joergr ** Added global flag that allows for reading incorrectly encoded DICOM datasets ** where particular data elements are encoded with a differing transfer syntax ** (Implicit VR Little endian instead of Explicit VR encoding as declared). ** ** Revision 1.120 2008-12-12 11:44:41 onken ** Moved path access functions to separate classes ** ** Revision 1.119 2008-12-05 13:51:13 onken ** Introduced new error code number for specific findOrCreatePath() errors. ** ** Revision 1.118 2008-12-05 13:28:01 onken ** Splitted findOrCreatePath() function API for also offering a simple API ** for non-wildcard searches. ** ** Revision 1.117 2008-12-04 16:54:54 onken ** Changed findOrCreatePath() to also support wildcard as item numbers. ** ** Revision 1.116 2008-11-26 12:16:52 joergr ** Slightly changed behavior of newDicomElement(): return error code if new ** element could not be created (e.g. because memory is exhausted). ** ** Revision 1.115 2008-11-21 16:18:11 onken ** Changed implementation of findOrCreatePath() to make use of function ** newDicomElement() which also knows how to handle EVRs like ox correctly. ** ** Revision 1.114 2008-10-15 15:49:09 onken ** Fixed incorrect behaviour of findOrCreatePath() if sequence is the last ** attribute to be inserted. ** ** Revision 1.113 2008-10-15 12:31:24 onken ** Added findOrCreatePath() functions which allow for finding or creating a ** hierarchy of sequences, items and attributes according to a given "path" ** string. ** ** Revision 1.112 2008-09-24 13:32:10 joergr ** Fixed typo in comment. ** ** Revision 1.111 2008-07-17 10:31:31 onken ** Implemented copyFrom() method for complete DcmObject class hierarchy, which ** permits setting an instance's value from an existing object. Implemented ** assignment operator where necessary. ** ** Revision 1.110 2007-12-11 12:21:57 onken ** Corrected some putAndInsert functions that returned wrong error code ** (EC_MemoryExhausted) in some cases. ** ** Revision 1.109 2007-11-29 14:30:21 meichel ** Write methods now handle large raw data elements (such as pixel data) ** without loading everything into memory. This allows very large images to ** be sent over a network connection, or to be copied without ever being ** fully in memory. ** ** Revision 1.108 2007/09/21 10:40:18 onken ** Changed foundVR() API and implementation to use Uint8* instead of char* to ** avoid calls to isalpha() with negative arguments (undef. behaviour/assertion) ** ** Revision 1.107 2007/06/29 14:17:49 meichel ** Code clean-up: Most member variables in module dcmdata are now private, ** not protected anymore. ** ** Revision 1.106 2007/06/08 15:18:47 joergr ** Fixed typo that caused MSVC to report an error. ** ** Revision 1.105 2007/06/08 15:12:56 joergr ** Added new helper functions insertSequenceItem(), findAndDeleteSequenceItem(). ** Replaced helper function findAndCopyElement() by new optional parameter ** 'createCopy' in various findAndGetXXX() functions. ** ** Revision 1.104 2007/03/09 10:36:09 joergr ** Added support for missing VRs (SL, SS, UL, SS) to insertEmptyElement(). ** ** Revision 1.103 2007/02/19 15:04:16 meichel ** Removed searchErrors() methods that are not used anywhere and added ** error() methods only in the DcmObject subclasses where really used. ** ** Revision 1.102 2006/12/15 14:14:44 joergr ** Added new method that checks whether a DICOM object or element is affected ** by SpecificCharacterSet (0008,0005). ** ** Revision 1.101 2006/12/13 13:59:49 joergr ** Added new optional parameter "checkAllStrings" to method containsExtended ** Characters(). ** ** Revision 1.100 2006/08/15 15:49:54 meichel ** Updated all code in module dcmdata to correctly compile when ** all standard C++ classes remain in namespace std. ** ** Revision 1.99 2006/05/11 08:49:18 joergr ** Moved checkForNonASCIICharacters() from application to library. ** ** Revision 1.98 2006/01/18 13:44:03 joergr ** Translated remaining German comment. ** ** Revision 1.97 2005/12/08 15:41:16 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.96 2005/11/28 15:53:13 meichel ** Renamed macros in dcdebug.h ** ** Revision 1.95 2005/11/15 18:28:04 meichel ** Added new global flag dcmEnableUnknownVRConversion that enables the automatic ** re-conversion of defined length UN elements read in an explicit VR transfer ** syntax, if the real VR is defined in the data dictionary. Default is OFFalse, ** i.e. to retain the previous behavior. ** ** Revision 1.94 2005/11/15 16:59:25 meichel ** Added new pseudo VR type EVR_lt that is used for LUT Data when read in ** implicit VR, which may be US, SS or OW. DCMTK always treats EVR_lt like OW. ** ** Revision 1.93 2005/11/07 16:59:26 meichel ** Cleaned up some copy constructors in the DcmObject hierarchy. ** ** Revision 1.92 2005/06/24 10:04:04 joergr ** Added support for internal VR "xs" to putAndInsertXXX() helper methods. ** ** Revision 1.91 2005/05/10 15:27:18 meichel ** Added support for reading UN elements with undefined length according ** to CP 246. The global flag dcmEnableCP246Support allows to revert to the ** prior behaviour in which UN elements with undefined length were parsed ** like a normal explicit VR SQ element. ** ** Revision 1.90 2004/07/01 12:28:27 meichel ** Introduced virtual clone method for DcmObject and derived classes. ** ** Revision 1.89 2004/03/10 10:25:36 joergr ** Translated remaining German comments. ** ** Revision 1.88 2004/02/04 16:02:56 joergr ** Removed pointer declaration from parameter "resultStack" in method ** findAndGetElements(). Removed e-mail addresses from CVS log. ** ** Revision 1.87 2003/10/15 16:55:43 meichel ** Updated error messages for parse errors ** ** Revision 1.86 2003/10/08 10:25:00 joergr ** Added support for AT, OB, OF, OW, SL, SS, UL, US to putAndInsertString(). ** ** Revision 1.85 2003/07/16 14:33:43 joergr ** Added new function findAndGetSequence(). ** Adapted type casts to new-style typecast operators defined in ofcast.h. ** ** Revision 1.84 2003/06/26 09:17:29 onken ** Added commandline-application dcmodify. ** ** Revision 1.83 2003/06/02 17:25:28 joergr ** Added new helper function DcmItem::findAndCopyElement(). ** Fixed bug in findAndDelete() implementation. ** Added explicit support for class DcmPixelData to putAndInsertUintXXArray(). ** Changed implementation of findAndGetXXXArray() to avoid problems with MSVC5. ** ** Revision 1.82 2003/05/20 09:17:46 joergr ** Added new helper methods: findAndGetElement(), findAndGetUint32Array(), ** findAndGetSint32Array(), findAndGetFloat64Array(), findAndDeleteElement(). ** Enhanced findAndGetSequenceItem() and findOrCreateSequenceItem() by checking ** the return value of ident() - avoids crashes when applied to non-sequence ** elements. ** ** Revision 1.81 2003/03/21 13:08:04 meichel ** Minor code purifications for warnings reported by MSVC in Level 4 ** ** Revision 1.80 2002/12/09 09:30:52 wilkens ** Modified/Added doc++ documentation. ** ** Revision 1.79 2002/12/06 12:57:58 joergr ** Enhanced "print()" function by re-working the implementation and replacing ** the boolean "showFullData" parameter by a more general integer flag. ** Made source code formatting more consistent with other modules/files. ** Replaced some German comments by English translations. ** ** Revision 1.78 2002/11/27 12:06:48 meichel ** Adapted module dcmdata to use of new header file ofstdinc.h ** ** Revision 1.77 2002/08/27 16:55:50 meichel ** Initial release of new DICOM I/O stream classes that add support for stream ** compression (deflated little endian explicit VR transfer syntax) ** ** Revision 1.76 2002/08/02 15:06:33 joergr ** Fixed problems reported by Sun CC 2.0.1. ** ** Revision 1.75 2002/08/02 08:42:33 joergr ** Added optional 'pos' parameter to the putAndInsertXXX() methods. ** ** Revision 1.74 2002/07/23 14:21:33 meichel ** Added support for private tag data dictionaries to dcmdata ** ** Revision 1.73 2002/07/08 16:15:40 meichel ** Unknown undefined length attributes are now converted into SQ instead of UN. ** ** Revision 1.72 2002/07/08 14:44:39 meichel ** Improved dcmdata behaviour when reading odd tag length. Depending on the ** global boolean flag dcmAcceptOddAttributeLength, the parser now either accepts ** odd length attributes or implements the old behaviour, i.e. assumes a real ** length larger by one. ** ** Revision 1.71 2002/07/04 16:35:31 joergr ** Fixed inconsistent formatting of the print() output. ** ** Revision 1.70 2002/06/26 15:49:59 joergr ** Added support for polymorp OB/OW value representation (e.g. pixel data) to ** putAndInsertUint8/16Array() methods. ** ** Revision 1.69 2002/05/29 09:59:37 meichel ** fixed follow-up problem in DcmItem caused by the modifications ** committed 2002-05-17. ** ** Revision 1.68 2002/05/17 09:58:24 meichel ** fixed bug in DcmItem which caused the parser to fail if the same attribute ** tag appeared twice within one dataset (which is illegal in DICOM anyway). ** Added console warning if the attributes read are not in ascending order. ** ** Revision 1.67 2002/04/25 10:15:56 joergr ** Added support for XML output of DICOM objects. ** ** Revision 1.66 2002/04/16 13:43:17 joergr ** Added configurable support for C++ ANSI standard includes (e.g. streams). ** ** Revision 1.65 2002/04/11 12:28:00 joergr ** Enhanced documentation. ** ** Revision 1.64 2001/12/18 11:37:44 joergr ** Added helper method allowing to create and insert empty elements into an ** item/dataset. ** ** Revision 1.63 2001/11/16 15:55:02 meichel ** Adapted digital signature code to final text of supplement 41. ** ** Revision 1.62 2001/11/09 15:53:53 joergr ** Added new helper routines for managing sequences and items. ** ** Revision 1.61 2001/11/01 14:55:39 wilkens ** Added lots of comments. ** ** Revision 1.60 2001/10/10 15:19:51 joergr ** Changed parameter DcmTagKey to DcmTag in DcmItem::putAndInsert... methods ** to support elements which are not in the data dictionary (e.g. private ** extensions). ** ** Revision 1.59 2001/10/02 11:48:01 joergr ** Added functions to get/put 8 bit values/arrays from/to an item/dataset. ** ** Revision 1.58 2001/10/01 15:04:14 joergr ** Introduced new general purpose functions to get/put DICOM element values ** from/to an item/dataset - removed some old and rarely used functions. ** Added "#include " to keep gcc 3.0 quiet. ** ** Revision 1.57 2001/09/25 17:19:50 meichel ** Adapted dcmdata to class OFCondition ** ** Revision 1.56 2001/06/01 15:49:05 meichel ** Updated copyright header ** ** Revision 1.55 2001/05/07 16:08:09 joergr ** Added support for VR=IS to method findIntegerNumber(). ** ** Revision 1.54 2001/05/03 08:15:21 meichel ** Fixed bug in dcmdata sequence handling code that could lead to application ** failure in rare cases during parsing of a correct DICOM dataset. ** ** Revision 1.53 2000/11/07 16:56:20 meichel ** Initial release of dcmsign module for DICOM Digital Signatures ** ** Revision 1.52 2000/04/14 15:55:05 meichel ** Dcmdata library code now consistently uses ofConsole for error output. ** ** Revision 1.51 2000/03/08 16:26:36 meichel ** Updated copyright header. ** ** Revision 1.50 2000/03/03 15:02:09 joergr ** Corrected bug related to padding of file and item size. ** ** Revision 1.49 2000/03/03 14:05:34 meichel ** Implemented library support for redirecting error messages into memory ** instead of printing them to stdout/stderr for GUI applications. ** ** Revision 1.48 2000/02/29 11:49:29 meichel ** Removed support for VS value representation. This was proposed in CP 101 ** but never became part of the standard. ** ** Revision 1.47 2000/02/23 15:11:55 meichel ** Corrected macro for Borland C++ Builder 4 workaround. ** ** Revision 1.46 2000/02/10 10:52:19 joergr ** Added new feature to dcmdump (enhanced print method of dcmdata): write ** pixel data/item value fields to raw files. ** ** Revision 1.45 2000/02/02 14:32:52 joergr ** Replaced 'delete' statements by 'delete[]' for objects created with 'new[]'. ** ** Revision 1.44 2000/02/01 10:12:07 meichel ** Avoiding to include as extern "C" on Borland C++ Builder 4, ** workaround for bug in compiler header files. ** ** Revision 1.43 1999/03/31 09:25:30 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.42 1999/03/22 15:55:52 meichel ** New handling of unknown (unsupported) VRs encountered when reading explicit ** VR data. If the VR string consists of uppercase letters, we assume a ** "future DICOM VR" and decode it expecting an extended length field ** (4 bytes). Otherwise, we assume an illegal VR string created by some old ** equipment (i.e.) "??" and decode without extended length (2 bytes). ** ** Revision 1.41 1998/07/15 15:51:59 joergr ** Removed several compiler warnings reported by gcc 2.8.1 with ** additional options, e.g. missing copy constructors and assignment ** operators, initialization of member variables in the body of a ** constructor instead of the member initialization list, hiding of ** methods by use of identical names, uninitialized member variables, ** missing const declaration of char pointers. Replaced tabs by spaces. ** ** Revision 1.40 1998/01/14 15:23:42 hewett ** Added support for the VRs UT (Unlimited Text) and VS (Virtual String). ** ** Revision 1.39 1998/01/14 09:13:53 meichel ** Corrected bug: Overlay Data elements in the groups ** 6002-601f were handled by DcmOtherByteOtherWord ** instead of the "polymorphous" DcmOverlayData class. ** ** Revision 1.38 1998/01/14 08:42:32 meichel ** Improved algorithm for auto-detection of transfer syntax ** used when opening a DICOM file without metaheader. ** Big endian datasets are now detected much more reliably. ** ** Revision 1.37 1997/11/07 08:52:18 meichel ** Corrected bug in the dcmdata read routines which caused incorrect reading ** of datasets containing attributes with value representation "ox" (= OB or OW) ** in the dicom dictionary other than PixelData and OverlayData. ** ** Revision 1.36 1997/09/22 14:50:53 hewett ** - Added 2 simple methods to test for the existance of an attribute ** to DcmItem class (tagExists and tagExistsWithValue). This code ** was part of dcmgpdir.cc but is more generally useful. ** - Added 2 methods to find an attribute and retrieve numeric values ** to DcmItem class (findIntegerNumber and findRealNumber). The old ** method findLong is now marked as obsolete and reimplemented using ** findIntegerNumber. ** ** Revision 1.35 1997/09/12 13:44:53 meichel ** The algorithm introduced on 97.08.28 to detect incorrect odd-length ** value fields falsely reported undefined length sequences and items ** to be wrong. Corrected. ** ** Revision 1.34 1997/08/29 08:31:33 andreas ** - Added methods getOFString and getOFStringArray for all ** string VRs. These methods are able to normalise the value, i. e. ** to remove leading and trailing spaces. This will be done only if ** it is described in the standard that these spaces are not relevant. ** These methods do not test the strings for conformance, this means ** especially that they do not delete spaces where they are not allowed! ** getOFStringArray returns the string with all its parts separated by \ ** and getOFString returns only one value of the string. ** CAUTION: Currently getString returns a string with trailing ** spaces removed (if dcmEnableAutomaticInputDataCorrection == OFTrue) and ** truncates the original string (since it is not copied!). If you rely on this ** behaviour please change your application now. ** Future changes will ensure that getString returns the original ** string from the DICOM object (NULL terminated) inclusive padding. ** Currently, if you call getOF... before calling getString without ** normalisation, you can get the original string read from the DICOM object. ** ** Revision 1.33 1997/08/29 07:52:40 andreas ** - New error messages if length of an element is odd. Previously, no ** error was reported. But the length is corrected by the method ** newValueFiel and. so it was impossible for a checking utility to find ** such an error in DICOM objects. ** ** Revision 1.32 1997/07/24 13:10:52 andreas ** - Removed Warnings from SUN CC 2.0.1 ** ** Revision 1.31 1997/07/21 08:11:42 andreas ** - Support for CP 14. PixelData and OverlayData can have VR OW or OB ** (depending on the transfer syntax). New internal value ** representation (only for ident()) for OverlayData. ** - New environment for encapsulated pixel representations. DcmPixelData ** can contain different representations and uses codecs to convert ** between them. Codecs are derived from the DcmCodec class. New error ** codes are introduced for handling of representations. New internal ** value representation (only for ident()) for PixelData ** - Replace all boolean types (BOOLEAN, CTNBOOLEAN, DICOM_BOOL, BOOL) ** with one unique boolean type OFBool. ** ** Revision 1.30 1997/07/07 07:43:59 andreas ** - Changed type for Tag attribute in DcmObject from prointer to value ** - Changed parameter type DcmTag & to DcmTagKey & in all search functions ** in DcmItem, DcmSequenceOfItems, DcmDirectoryRecord and DcmObject ** - Enhanced (faster) byte swapping routine. swapIfNecessary moved from ** a method in DcmObject to a general function. ** ** Revision 1.29 1997/07/03 15:09:59 andreas ** - removed debugging functions Bdebug() and Edebug() since ** they write a static array and are not very useful at all. ** Cdebug and Vdebug are merged since they have the same semantics. ** The debugging functions in dcmdata changed their interfaces ** (see dcmdata/include/dcdebug.h) ** ** Revision 1.28 1997/06/06 09:55:29 andreas ** - corrected error: canWriteXfer returns false if the old transfer syntax ** was unknown, which causes several applications to prohibit the writing ** of dataset. ** ** Revision 1.27 1997/05/27 13:49:00 andreas ** - Add method canWriteXfer to class DcmObject and all derived classes. ** This method checks whether it is possible to convert the original ** transfer syntax to an new transfer syntax. The check is used in the ** dcmconv utility to prohibit the change of a compressed transfer ** syntax to a uncompressed. ** ** Revision 1.26 1997/05/16 08:13:49 andreas ** - Revised handling of GroupLength elements and support of ** DataSetTrailingPadding elements. The enumeratio E_GrpLenEncoding ** got additional enumeration values (for a description see dctypes.h). ** addGroupLength and removeGroupLength methods are replaced by ** computeGroupLengthAndPadding. To support Padding, the parameters of ** element and sequence write functions changed. ** - Added a new method calcElementLength to calculate the length of an ** element, item or sequence. For elements it returns the length of ** tag, length field, vr field, and value length, for item and ** sequences it returns the length of the whole item. sequence including ** the Delimitation tag (if appropriate). It can never return ** UndefinedLength. ** - Deleted obsolete method DcmItem::calcHeaderLength because the ** samce functionality is performed by DcmXfer::sizeofTagHeader ** ** Revision 1.25 1997/05/07 12:27:27 andreas ** Corrected error reading ItemDelimitationItem using explicit transfer syntaxes ** ** Revision 1.24 1997/04/30 16:32:50 andreas ** - Corrected Bug for reading of encapsulated pixel sequences ** ** Revision 1.23 1997/04/24 12:12:18 hewett ** Fixed DICOMDIR generation bug affecting the use of Unknown VR ** attributes (the file offsets were not being computed correctly). ** ** Revision 1.22 1997/04/18 08:10:49 andreas ** - Corrected debugging code ** - The put/get-methods for all VRs did not conform to the C++-Standard ** draft. Some Compilers (e.g. SUN-C++ Compiler, Metroworks ** CodeWarrier, etc.) create many warnings concerning the hiding of ** overloaded get methods in all derived classes of DcmElement. ** So the interface of all value representation classes in the ** library are changed rapidly, e.g. ** OFCondition get(Uint16 & value, const unsigned long pos); ** becomes ** OFCondition getUint16(Uint16 & value, const unsigned long pos); ** All (retired) "returntype get(...)" methods are deleted. ** For more information see dcmdata/include/dcelem.h ** ** Revision 1.21 1997/03/27 15:52:50 hewett ** Extended preliminary support for Unknown VR (UN) described in ** Supplement 14. Attributes with undefined length should now ** be handled as a sequence. ** ** Revision 1.20 1997/03/26 17:15:57 hewett ** Added very preliminary support for Unknown VR (UN) described in ** Supplement 14. WARNING: handling of unknown attributes with undefined ** length is not yet supported. ** ** Revision 1.19 1996/09/24 15:54:14 hewett ** Corrected erroneous setting of an error flag when inserting an ** attribute into an Item (via Item::insert(...)) and the attribute ** was already present. Now the error flag is only set if replaceOld ** is OFFalse and an attribute already exists. ** ** Revision 1.18 1996/09/13 12:04:12 hewett ** Corrected missing () in function call (stack.card()) used in nextObject(...) ** ** Revision 1.17 1996/08/08 10:15:09 andreas ** Some more testing in nextObject ** ** Revision 1.16 1996/08/08 10:06:23 andreas ** Correct error for intoSub=OFFalse ** ** Revision 1.15 1996/08/05 08:46:12 andreas ** new print routine with additional parameters: ** - print into files ** - fix output length for elements ** corrected error in search routine with parameter ESM_fromStackTop ** ** Revision 1.14 1996/07/31 13:14:30 andreas ** - Minor corrections: error code for swapping to or from byteorder unknown ** correct read of dataset in fileformat ** ** Revision 1.13 1996/07/17 12:39:38 andreas ** new nextObject for DcmDataSet, DcmFileFormat, DcmItem, ... ** ** Revision 1.12 1996/04/29 15:08:14 hewett ** Replaced DcmItem::findInt(...) with the more general DcmItem::findLong(...). ** ** Revision 1.11 1996/04/27 14:04:55 hewett ** Eliminated compiler warnings when compiling without -DDEBUG. Very ** minor corrections, mostly unused parameters and uninitialized variables. ** ** Revision 1.10 1996/04/16 16:04:54 andreas ** - const tag Parameter in newDicomElement ** ** Revision 1.9 1996/03/28 18:52:39 hewett ** Added 2 simple find&get methods (findString & findInt). ** ** Revision 1.8 1996/03/12 15:23:27 hewett ** When generating group length tags, the VR of a tag is now explicity ** set to be EVR_UL. Group length tags not in the dictionary (e.g. for ** private groups) were getting coded incorrectly. ** ** Revision 1.7 1996/03/11 14:16:00 hewett ** Corrected error whereby explicit encoding was being recognised as implicit. ** ** Revision 1.6 1996/03/11 13:03:51 hewett ** Rearranged logic of DcmItem::checkTransferSyntax to make little-endian ** the default if both big and little endian are possible. ** ** Revision 1.5 1996/01/29 13:38:27 andreas ** - new put method for every VR to put value as a string ** - better and unique print methods ** ** Revision 1.4 1996/01/09 11:06:46 andreas ** New Support for Visual C++ ** Correct problems with inconsistent const declarations ** Correct error in reading Item Delimitation Elements ** ** Revision 1.3 1996/01/05 13:27:37 andreas ** - changed to support new streaming facilities ** - unique read/write methods for file and block transfer ** - more cleanups ** */ dcmtk-3.6.0/dcmdata/libsrc/mkdictbi.cc0000644000310500011400000003547111455601043017020 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Andrew Hewett * * Purpose: * Generate a builtin data dictionary which can be compiled into * the dcmdata library. * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:14:11 $ * CVS/RCS Revision: $Revision: 1.34 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #define INCLUDE_CSTDLIB #define INCLUDE_CSTDIO #define INCLUDE_CSTRING #define INCLUDE_CCTYPE #define INCLUDE_LIBC #include "dcmtk/ofstd/ofstdinc.h" #ifdef HAVE_SYS_UTSNAME_H #include #endif #ifdef HAVE_WINDOWS_H #include /* this includes either winsock.h or winsock2.h */ #else #ifdef HAVE_WINSOCK_H #include /* include winsock.h directly i.e. on MacOS */ #endif #endif #ifdef HAVE_GUSI_H #include #endif #include "dcmtk/dcmdata/dcdict.h" #include "dcmtk/dcmdata/cmdlnarg.h" #include "dcmtk/ofstd/ofstring.h" #include "dcmtk/ofstd/ofdatime.h" #include "dcmtk/dcmdata/dcdicent.h" #define PRIVATE_TAGS_IFNAME "WITH_PRIVATE_TAGS" static const char* rr2s(DcmDictRangeRestriction rr) { const char* s; switch (rr) { case DcmDictRange_Unspecified: s = "DcmDictRange_Unspecified"; break; case DcmDictRange_Odd: s = "DcmDictRange_Odd"; break; case DcmDictRange_Even: s = "DcmDictRange_Even"; break; default: s = "DcmDictRange_GENERATOR_ERROR"; break; } return s; } static void printSimpleEntry(FILE* fout, const DcmDictEntry* e, OFBool& isFirst, OFBool& isPrivate) { const char *c = e->getPrivateCreator(); if (c && !isPrivate) { fprintf(fout, "#ifdef %s\n", PRIVATE_TAGS_IFNAME); isPrivate = OFTrue; } else if (isPrivate && !c) { fprintf(fout, "#endif\n"); isPrivate = OFFalse; } if (isFirst) { fprintf(fout, " "); isFirst = OFFalse; } else fprintf(fout, " , "); fprintf(fout, "{ 0x%04x, 0x%04x, 0x%04x, 0x%04x,\n", e->getGroup(), e->getElement(), e->getUpperGroup(), e->getUpperElement()); fprintf(fout, " EVR_%s, \"%s\", %d, %d, \"%s\",\n", e->getVR().getVRName(), e->getTagName(), e->getVMMin(), e->getVMMax(), OFSTRING_GUARD(e->getStandardVersion())); fprintf(fout, " %s, %s,\n", rr2s(e->getGroupRangeRestriction()), rr2s(e->getElementRangeRestriction())); if (c) fprintf(fout, " \"%s\" }\n", c); else fprintf(fout, " NULL }\n"); } #ifdef HAVE_CUSERID static char* getUserName(char* userString, int /* maxLen */) { return cuserid(userString); // thread safe, maxLen >= L_cuserid ? } #elif HAVE_GETLOGIN static char* getUserName(char* userString, int maxLen) { #if defined(_REENTRANT) && !defined(_WIN32) && !defined(__CYGWIN__) // use getlogin_r instead of getlogin if (getlogin_r(userString, maxLen) != 0) strncpy(userString, "", maxLen); return userString; #else char* s; s = getlogin(); // thread unsafe if (s == NULL) s = ""; return strncpy(userString, s, maxLen); #endif } #elif defined(_WIN32) #include static char* getUserName(char* userString, int maxLen) { WKSTA_USER_INFO_0 *userinfo; if (NetWkstaUserGetInfo(NULL, 0, (LPBYTE*)&userinfo) == NERR_Success) { // Convert the Unicode full name to ANSI. WideCharToMultiByte( CP_ACP, 0, (WCHAR*)userinfo->wkui0_username, -1, userString, maxLen, NULL, NULL ); } else { strncpy(userString, "", maxLen); } return userString; } #else static char* getUserName(char* userString, int maxLen) { return strncpy(userString, "", maxLen); } #endif #ifdef HAVE_UNAME static char* getHostName(char* hostString, int maxLen) { struct utsname n; uname(&n); strncpy(hostString, n.nodename, maxLen); return hostString; } #elif HAVE_GETHOSTNAME static char* getHostName(char* userString, int maxLen) { gethostname(userString, maxLen); return userString; } #else static char* getHostName(char* hostString, int maxLen) { return strncpy(hostString, "localhost", maxLen); } #endif int main(int argc, char* argv[]) { char* progname; FILE* fout = NULL; DcmDictEntry* e = NULL; #ifdef HAVE_GUSI_H GUSISetup(GUSIwithSIOUXSockets); GUSISetup(GUSIwithInternetSockets); #endif #ifdef HAVE_WINSOCK_H WSAData winSockData; /* we need at least version 1.1 */ WORD winSockVersionNeeded = MAKEWORD( 1, 1 ); WSAStartup(winSockVersionNeeded, &winSockData); #endif prepareCmdLineArgs(argc, argv, "mkdictbi"); DcmDataDictionary& globalDataDict = dcmDataDict.wrlock(); /* clear out any preloaded dictionary */ globalDataDict.clear(); progname = argv[0]; int i; for (i=1; i 1) { fprintf(fout, "** From: %s\n", argv[1]); for (i=2; igroup, b->element,\n"); fprintf(fout, " b->upperGroup, b->upperElement, b->evr,\n"); fprintf(fout, " b->tagName, b->vmMin, b->vmMax,\n"); fprintf(fout, " b->standardVersion, OFFalse, b->privateCreator);\n"); fprintf(fout, " e->setGroupRangeRestriction(b->groupRestriction);\n"); fprintf(fout, " e->setElementRangeRestriction(b->elementRestriction);\n"); fprintf(fout, " addEntry(e);\n"); fprintf(fout, " }\n"); fprintf(fout, "}\n"); fprintf(fout, "\n"); fprintf(fout, "\n"); dcmDataDict.unlock(); return 0; } /* ** CVS/RCS Log: ** $Log: mkdictbi.cc,v $ ** Revision 1.34 2010-10-14 13:14:11 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.33 2010-08-10 11:59:31 uli ** Fixed some cases where dcmFindNameOfUID() returning NULL could cause crashes. ** ** Revision 1.32 2010-07-02 07:12:29 joergr ** Fixed typo: Changed "SUPRESS_CREATE_STAMP" to "SUPPRESS_CREATE_STAMP". ** ** Revision 1.31 2010-03-03 08:50:30 joergr ** Fixed compilation issue with call to getlogin_r(). ** ** Revision 1.30 2009-11-04 09:58:11 uli ** Switched to logging mechanism provided by the "new" oflog module ** ** Revision 1.29 2009-01-15 14:30:26 joergr ** Changed formatting of comment header. ** ** Revision 1.28 2006/08/02 15:20:42 meichel ** Fixed bugs that prevented compiling the affected tools under MinGW ** ** Revision 1.27 2005/12/09 15:04:37 meichel ** Updated build system for dcdeftag/dcdictzz to reflect new directory structure ** ** Revision 1.26 2005/12/08 15:42:13 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.25 2004/08/03 11:41:10 meichel ** Headers libc.h and unistd.h are now included via ofstdinc.h ** ** Revision 1.24 2002/11/27 12:07:02 meichel ** Adapted module dcmdata to use of new header file ofstdinc.h ** ** Revision 1.23 2002/08/02 09:47:33 meichel ** Fixed bug in mkdictbi which would cause the builtin dictionary to fail ** to compile if the last dictionary entry was a private tag. ** ** Revision 1.22 2002/07/23 14:21:35 meichel ** Added support for private tag data dictionaries to dcmdata ** ** Revision 1.21 2002/04/11 12:31:04 joergr ** Added support for MT-safe system routines (cuserid, getlogin, etc.). ** Replaced direct call of system routines by new standard date and time ** functions. ** ** Revision 1.20 2001/06/01 15:49:25 meichel ** Updated copyright header ** ** Revision 1.19 2000/05/03 14:19:10 meichel ** Added new class GlobalDcmDataDictionary which implements read/write lock ** semantics for safe access to the DICOM dictionary from multiple threads ** in parallel. The global dcmDataDict now uses this class. ** ** Revision 1.18 2000/04/14 16:17:21 meichel ** Minor changes for thread safety. ** ** Revision 1.17 2000/03/08 16:26:55 meichel ** Updated copyright header. ** ** Revision 1.16 2000/02/23 15:12:09 meichel ** Corrected macro for Borland C++ Builder 4 workaround. ** ** Revision 1.15 2000/02/01 10:12:12 meichel ** Avoiding to include as extern "C" on Borland C++ Builder 4, ** workaround for bug in compiler header files. ** ** Revision 1.14 1999/04/21 13:02:34 meichel ** Now always including instead of on Win32 platforms. ** This makes sure that is used if available. ** ** Revision 1.13 1999/03/31 09:26:09 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.12 1999/03/22 15:45:48 meichel ** Implemented getUserName() on Win32 using the NetWkstaUserGetInfo() API. ** ** Revision 1.11 1998/07/15 14:09:52 joergr ** Including of to support getlogin() on NeXTSTEP. ** Replaced tabs by spaces. ** ** Revision 1.10 1997/08/26 14:03:20 hewett ** New data structures for data-dictionary. The main part of the ** data-dictionary is now stored in an hash table using an optimized ** hash function. This new data structure reduces data-dictionary ** load times by a factor of 4! he data-dictionary specific linked-list ** has been replaced by a linked list derived from OFList class ** (see ofstd/include/oflist.h). ** The only interface modifications are related to iterating over the entire ** data dictionary which should not be needed by "normal" applications. ** ** Revision 1.9 1997/07/21 08:25:37 andreas ** - Replace all boolean types (BOOLEAN, CTNBOOLEAN, DICOM_BOOL, BOOL) ** with one unique boolean type OFBool. ** ** Revision 1.8 1997/06/26 12:59:16 andreas ** - Include Additional headers (winsock.h, io.h) for Windows NT/95 ** ** Revision 1.7 1997/05/13 13:44:30 hewett ** Fixed spelling in generated comments. ** ** Revision 1.6 1997/03/26 17:14:04 hewett ** Now uses proper enumerated type names for VR instead of numbers. ** ** Revision 1.5 1996/09/24 16:37:43 hewett ** Now correctly includes cmdlnarg.h ** ** Revision 1.4 1996/09/24 16:26:28 hewett ** Added preliminary support for the Macintosh environment (GUSI library). ** ** Revision 1.3 1996/03/20 16:44:07 hewett ** Updated for revised data dictionary. Repeating tags are now handled better. ** A linear list of repeating tags has been introduced with a subset ordering ** mechanism to ensure that dictionary searches locate the most precise ** dictionary entry. ** ** Revision 1.2 1996/03/12 15:21:24 hewett ** The repeating sub-dictionary has been split into a repeatingElement and ** a repeatingGroups dictionary. This is a temporary measure to reduce the ** problem of overlapping dictionary entries. A full solution will require ** more radical changes to the data dictionary insertion and search ** mechanims. ** ** Revision 1.1 1995/11/23 17:03:16 hewett ** Updated for loadable data dictionary. Some cleanup (more to do). ** */ dcmtk-3.6.0/dcmdata/libsrc/dcvrtm.cc0000644000310500011400000004301311457616142016530 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Gerd Ehlers, Joerg Riesmeier * * Purpose: Implementation of class DcmTime * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-20 16:44:18 $ * CVS/RCS Revision: $Revision: 1.34 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcvrtm.h" #include "dcmtk/ofstd/ofstd.h" #define INCLUDE_CSTDIO #include "dcmtk/ofstd/ofstdinc.h" #define MAX_TM_LENGTH 16 // ******************************** DcmTime::DcmTime(const DcmTag &tag, const Uint32 len) : DcmByteString(tag, len) { setMaxLength(MAX_TM_LENGTH); setNonSignificantChars("\\"); } DcmTime::DcmTime(const DcmTime &old) : DcmByteString(old) { } DcmTime::~DcmTime() { } DcmTime &DcmTime::operator=(const DcmTime &obj) { DcmByteString::operator=(obj); return *this; } OFCondition DcmTime::copyFrom(const DcmObject& rhs) { if (this != &rhs) { if (rhs.ident() != ident()) return EC_IllegalCall; *this = OFstatic_cast(const DcmTime &, rhs); } return EC_Normal; } // ******************************** DcmEVR DcmTime::ident() const { return EVR_TM; } OFCondition DcmTime::checkValue(const OFString &vm, const OFBool oldFormat) { OFString strVal; /* get "raw value" without any modifications (if possible) */ OFCondition l_error = getStringValue(strVal); if (l_error.good()) l_error = DcmTime::checkStringValue(strVal, vm, oldFormat); return l_error; } // ******************************** OFCondition DcmTime::getOFString(OFString &stringVal, const unsigned long pos, OFBool normalize) { OFCondition l_error = DcmByteString::getOFString(stringVal, pos, normalize); if (l_error.good() && normalize) normalizeString(stringVal, !MULTIPART, !DELETE_LEADING, DELETE_TRAILING); return l_error; } // ******************************** OFCondition DcmTime::getOFTime(OFTime &timeValue, const unsigned long pos, const OFBool supportOldFormat) { OFString dicomTime; /* convert the current element value to OFTime format */ OFCondition l_error = getOFString(dicomTime, pos); if (l_error.good()) l_error = getOFTimeFromString(dicomTime, timeValue, supportOldFormat); else timeValue.clear(); return l_error; } OFCondition DcmTime::getISOFormattedTime(OFString &formattedTime, const unsigned long pos, const OFBool seconds, const OFBool fraction, const OFBool createMissingPart, const OFBool supportOldFormat) { OFString dicomTime; /* get current element value and convert to ISO formatted time */ OFCondition l_error = getOFString(dicomTime, pos); if (l_error.good()) l_error = getISOFormattedTimeFromString(dicomTime, formattedTime, seconds, fraction, createMissingPart, supportOldFormat); else formattedTime.clear(); return l_error; } OFCondition DcmTime::setCurrentTime(const OFBool seconds, const OFBool fraction) { OFString dicomTime; /* set the element value to the current system time */ OFCondition l_error = getCurrentTime(dicomTime, seconds, fraction); if (l_error.good()) l_error = putString(dicomTime.c_str()); return l_error; } OFCondition DcmTime::setOFTime(const OFTime &timeValue) { OFString dicomTime; /* convert OFTime value to DICOM TM format and set the element value */ OFCondition l_error = getDicomTimeFromOFTime(timeValue, dicomTime); if (l_error.good()) l_error = putString(dicomTime.c_str()); return l_error; } // ******************************** OFCondition DcmTime::getCurrentTime(OFString &dicomTime, const OFBool seconds, const OFBool fraction) { OFCondition l_error = EC_IllegalCall; OFTime timeValue; /* get the current system time */ if (timeValue.setCurrentTime()) { /* format: HHMM[SS[.FFFFFF]] */ if (timeValue.getISOFormattedTime(dicomTime, seconds, fraction, OFFalse /*timeZone*/, OFFalse /*showDelimiter*/)) l_error = EC_Normal; } /* set default time if an error occurred */ if (l_error.bad()) { /* if the current system time cannot be retrieved create a valid default time */ if (seconds) { if (fraction) { /* format: HHMMSS.FFFFFF */ dicomTime = "000000.000000"; } else { /* format: HHMMS */ dicomTime = "000000"; } } else { /* format: HHMM */ dicomTime = "0000"; } } return l_error; } OFCondition DcmTime::getDicomTimeFromOFTime(const OFTime &timeValue, OFString &dicomTime, const OFBool seconds, const OFBool fraction) { OFCondition l_error = EC_IllegalParameter; /* convert OFTime value to DICOM TM format */ if (timeValue.getISOFormattedTime(dicomTime, seconds, fraction, OFFalse /*timeZone*/, OFFalse /*showDelimiter*/)) l_error = EC_Normal; return l_error; } OFCondition DcmTime::getOFTimeFromString(const OFString &dicomTime, OFTime &timeValue, const OFBool supportOldFormat) { OFCondition l_error = EC_IllegalParameter; /* clear result variable */ timeValue.clear(); /* minimal check for valid format */ if (supportOldFormat || (dicomTime.find(":") == OFString_npos)) { unsigned int hour, minute = 0; double second = 0.0; /* normalize time format (remove ":" chars) */ OFString string = dicomTime; if ((string.length() > 5) && (string[5] == ':')) string.erase(5, 1); if ((string.length() > 2) && (string[2] == ':')) string.erase(2, 1); /* extract components from time string: HH[MM[SS[.FFFFFF]]] */ /* scan seconds using OFStandard::atof to avoid locale issues */ if (sscanf(string.c_str(), "%02u%02u", &hour, &minute) >= 1) { if (string.length() > 4) { /* get optional seconds part */ string.erase(0, 4); second = OFStandard::atof(string.c_str()); } /* always use the local time zone */ if (timeValue.setTime(hour, minute, second, OFTime::getLocalTimeZone())) l_error = EC_Normal; } } return l_error; } OFCondition DcmTime::getISOFormattedTimeFromString(const OFString &dicomTime, OFString &formattedTime, const OFBool seconds, const OFBool fraction, const OFBool createMissingPart, const OFBool supportOldFormat) { OFCondition result = EC_IllegalParameter; /* minimal check for valid format */ if (supportOldFormat || (dicomTime.find(":") == OFString_npos)) { const size_t length = dicomTime.length(); /* check for prior V3.0 version of VR=TM: HH:MM:SS.frac */ const size_t minPos = (supportOldFormat && (length > 2) && (dicomTime[2] == ':')) ? 3 : 2; const size_t secPos = (supportOldFormat && (length > minPos + 2) && (dicomTime[minPos + 2] == ':')) ? minPos + 3 : minPos + 2; /* decimal point for fractional seconds */ const size_t decPoint = dicomTime.find("."); const size_t decLength = (decPoint != OFString_npos) ? decPoint : length; OFString hourStr, minStr, secStr, fracStr; /* hours */ if (decLength >= 2) hourStr = dicomTime.substr(0, 2); else hourStr = "00"; /* minutes */ if (decLength >= minPos + 2) minStr = dicomTime.substr(minPos, 2); else minStr = "00"; /* seconds */ if (decLength >= secPos + 2) secStr = dicomTime.substr(secPos, 2); else if (createMissingPart) secStr = "00"; /* fractional seconds */ if ((length >= secPos + 4) && (decPoint == secPos + 2)) { if (length < secPos + 9) { fracStr = dicomTime.substr(secPos + 3); fracStr.append(secPos + 9 - length, '0'); } else fracStr = dicomTime.substr(secPos + 3, 6); } else if (createMissingPart) fracStr = "000000"; /* concatenate time components */ formattedTime = hourStr; formattedTime += ":"; formattedTime += minStr; if (seconds && (secStr.length() > 0)) { formattedTime += ":"; formattedTime += secStr; if (fraction && (fracStr.length() > 0)) { formattedTime += "."; formattedTime += fracStr; } } result = EC_Normal; } else formattedTime.clear(); return result; } OFCondition DcmTime::getTimeZoneFromString(const OFString &dicomTimeZone, double &timeZone) { OFCondition result = EC_IllegalParameter; /* init return value */ timeZone = 0; /* minimal check for valid format */ if ((dicomTimeZone.length() == 5) && ((dicomTimeZone[0] == '+') || (dicomTimeZone[0] == '-'))) { signed int hour; unsigned int minute; /* extract components from time zone string */ if (sscanf(dicomTimeZone.c_str(), "%03i%02u", &hour, &minute) == 2) { timeZone = OFstatic_cast(double, hour) + OFstatic_cast(double, minute) / 60; result = EC_Normal; } } return result; } // ******************************** OFCondition DcmTime::checkStringValue(const OFString &value, const OFString &vm, const OFBool oldFormat) { OFCondition result = EC_Normal; const size_t valLen = value.length(); if (valLen > 0) { size_t posStart = 0; unsigned long vmNum = 0; /* iterate over all value components */ while (posStart != OFString_npos) { ++vmNum; /* search for next component separator */ const size_t posEnd = value.find('\\', posStart); const size_t length = (posEnd == OFString_npos) ? valLen - posStart : posEnd - posStart; /* check length of current value component */ if (length > MAX_TM_LENGTH) { result = EC_MaximumLengthViolated; break; } else { /* check value representation */ const int vrID = DcmElement::scanValue(value, "tm", posStart, length); if ((vrID != 4) && (!oldFormat || (vrID != 5))) { result = EC_ValueRepresentationViolated; break; } } posStart = (posEnd == OFString_npos) ? posEnd : posEnd + 1; } if (result.good() && !vm.empty()) { /* check value multiplicity */ result = DcmElement::checkVM(vmNum, vm); } } return result; } /* ** CVS/RCS Log: ** $Log: dcvrtm.cc,v $ ** Revision 1.34 2010-10-20 16:44:18 joergr ** Use type cast macros (e.g. OFstatic_cast) where appropriate. ** ** Revision 1.33 2010-10-14 13:14:11 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.32 2010-04-23 14:30:35 joergr ** Added new method to all VR classes which checks whether the stored value ** conforms to the VR definition and to the specified VM. ** ** Revision 1.31 2009-08-07 14:35:49 joergr ** Enhanced isEmpty() method by checking whether the data element value consists ** of non-significant characters only. ** ** Revision 1.30 2009-08-03 09:03:00 joergr ** Added methods that check whether a given string value conforms to the VR and ** VM definitions of the DICOM standards. ** ** Revision 1.29 2008-07-17 10:31:32 onken ** Implemented copyFrom() method for complete DcmObject class hierarchy, which ** permits setting an instance's value from an existing object. Implemented ** assignment operator where necessary. ** ** Revision 1.28 2007-06-29 14:17:49 meichel ** Code clean-up: Most member variables in module dcmdata are now private, ** not protected anymore. ** ** Revision 1.27 2005/12/08 15:42:05 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.26 2004/01/16 13:46:38 joergr ** Adapted type casts to new-style typecast operators defined in ofcast.h. ** ** Revision 1.25 2002/12/06 13:20:52 joergr ** Enhanced "print()" function by re-working the implementation and replacing ** the boolean "showFullData" parameter by a more general integer flag. ** Made source code formatting more consistent with other modules/files. ** ** Revision 1.24 2002/11/27 12:06:59 meichel ** Adapted module dcmdata to use of new header file ofstdinc.h ** ** Revision 1.23 2002/08/27 16:56:00 meichel ** Initial release of new DICOM I/O stream classes that add support for stream ** compression (deflated little endian explicit VR transfer syntax) ** ** Revision 1.22 2002/07/16 14:33:08 joergr ** Fixed bug in DcmTime::getCurrentTime(). ** ** Revision 1.21 2002/07/16 14:21:29 joergr ** Fixed bug in DcmTime::getOFTimeFromString(). ** ** Revision 1.20 2002/06/20 12:06:18 meichel ** Changed toolkit to use OFStandard::atof instead of atof, strtod or ** sscanf for all string to double conversions that are supposed to ** be locale independent ** ** Revision 1.19 2002/04/25 10:34:35 joergr ** Removed getOFStringArray() implementation. ** ** Revision 1.18 2002/04/11 12:31:35 joergr ** Enhanced DICOM date, time and date/time classes. Added support for new ** standard date and time functions. ** ** Revision 1.17 2001/12/19 09:59:31 meichel ** Added prototype declaration for gettimeofday() for systems like Ultrix ** where the function is known but no prototype present in the system headers. ** ** Revision 1.16 2001/12/18 10:42:25 meichel ** Added typecasts to avoid warning on gcc 2.95.3 on OSF/1 (Alpha) ** ** Revision 1.15 2001/11/01 16:16:01 meichel ** Including if present, needed on Linux. ** ** Revision 1.14 2001/10/10 15:20:42 joergr ** Added new flag to date/time routines allowing to choose whether the old ** prior V3.0 format for the corresponding DICOM VRs is supported or not. ** ** Revision 1.13 2001/10/04 10:16:59 joergr ** Adapted new time/date routines to Windows systems. ** ** Revision 1.12 2001/10/01 15:04:45 joergr ** Introduced new general purpose functions to get/set person names, date, time ** and date/time. ** ** Revision 1.11 2001/09/25 17:20:01 meichel ** Adapted dcmdata to class OFCondition ** ** Revision 1.10 2001/06/01 15:49:21 meichel ** Updated copyright header ** ** Revision 1.9 2000/03/08 16:26:51 meichel ** Updated copyright header. ** ** Revision 1.8 1999/03/31 09:26:00 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.7 1998/11/12 16:48:30 meichel ** Implemented operator= for all classes derived from DcmObject. ** ** Revision 1.6 1997/08/29 13:11:49 andreas ** Corrected Bug in getOFStringArray Implementation ** ** Revision 1.5 1997/08/29 08:33:01 andreas ** - Added methods getOFString and getOFStringArray for all ** string VRs. These methods are able to normalise the value, i. e. ** to remove leading and trailing spaces. This will be done only if ** it is described in the standard that these spaces are not relevant. ** These methods do not test the strings for conformance, this means ** especially that they do not delete spaces where they are not allowed! ** getOFStringArray returns the string with all its parts separated by \ ** and getOFString returns only one value of the string. ** CAUTION: Currently getString returns a string with trailing ** spaces removed (if dcmEnableAutomaticInputDataCorrection == OFTrue) and ** truncates the original string (since it is not copied!). If you rely on this ** behaviour please change your application now. ** Future changes will ensure that getString returns the original ** string from the DICOM object (NULL terminated) inclusive padding. ** Currently, if you call getOF... before calling getString without ** normalisation, you can get the original string read from the DICOM object. ** ** Revision 1.4 1997/07/03 15:10:19 andreas ** - removed debugging functions Bdebug() and Edebug() since ** they write a static array and are not very useful at all. ** Cdebug and Vdebug are merged since they have the same semantics. ** The debugging functions in dcmdata changed their interfaces ** (see dcmdata/include/dcdebug.h) ** ** Revision 1.3 1996/01/05 13:27:54 andreas ** - changed to support new streaming facilities ** - unique read/write methods for file and block transfer ** - more cleanups ** */ dcmtk-3.6.0/dcmdata/libsrc/dcvr.cc0000644000310500011400000003471411455601042016166 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Gerd Ehlers, Andreas Barth, Andrew Hewett * * Purpose: class DcmVR: Value Representation * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:14:10 $ * CVS/RCS Revision: $Revision: 1.39 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcvr.h" #include "dcmtk/dcmdata/dctypes.h" #define INCLUDE_CSTDLIB #define INCLUDE_CSTRING #include "dcmtk/ofstd/ofstdinc.h" /* * global flags */ OFGlobal dcmEnableUnknownVRGeneration(OFTrue); OFGlobal dcmEnableUnlimitedTextVRGeneration(OFTrue); OFGlobal dcmEnableUnknownVRConversion(OFFalse); /* ** VR property table */ #define DCMVR_PROP_NONE 0x00 #define DCMVR_PROP_NONSTANDARD 0x01 #define DCMVR_PROP_INTERNAL 0x02 #define DCMVR_PROP_EXTENDEDLENGTHENCODING 0x04 #define DCMVR_PROP_ISASTRING 0x08 struct DcmVREntry { DcmEVR vr; // Enumeration Value of Value representation const char* vrName; // Name of Value representation size_t fValWidth; // Length of minimal unit, used for swapping int propertyFlags; // Normal, internal, non-standard vr Uint32 minValueLength; // Minimum length of a single value (bytes) Uint32 maxValueLength; // Maximum length of a single value (bytes) }; static const DcmVREntry DcmVRDict[] = { { EVR_AE, "AE", sizeof(char), DCMVR_PROP_ISASTRING, 0, 16 }, { EVR_AS, "AS", sizeof(char), DCMVR_PROP_ISASTRING, 4, 4 }, { EVR_AT, "AT", sizeof(Uint16), DCMVR_PROP_NONE, 4, 4 }, { EVR_CS, "CS", sizeof(char), DCMVR_PROP_ISASTRING, 0, 16 }, { EVR_DA, "DA", sizeof(char), DCMVR_PROP_ISASTRING, 8, 10 }, { EVR_DS, "DS", sizeof(char), DCMVR_PROP_ISASTRING, 0, 16 }, { EVR_DT, "DT", sizeof(char), DCMVR_PROP_ISASTRING, 0, 26}, { EVR_FL, "FL", sizeof(Float32), DCMVR_PROP_NONE, 4, 4 }, { EVR_FD, "FD", sizeof(Float64), DCMVR_PROP_NONE, 8, 8 }, { EVR_IS, "IS", sizeof(char), DCMVR_PROP_ISASTRING, 0, 12 }, { EVR_LO, "LO", sizeof(char), DCMVR_PROP_ISASTRING, 0, 64 }, { EVR_LT, "LT", sizeof(char), DCMVR_PROP_ISASTRING, 0, 10240 }, { EVR_OB, "OB", sizeof(Uint8), DCMVR_PROP_EXTENDEDLENGTHENCODING, 0, DCM_UndefinedLength }, { EVR_OF, "OF", sizeof(Float32), DCMVR_PROP_EXTENDEDLENGTHENCODING, 0, DCM_UndefinedLength }, { EVR_OW, "OW", sizeof(Uint16), DCMVR_PROP_EXTENDEDLENGTHENCODING, 0, DCM_UndefinedLength }, { EVR_PN, "PN", sizeof(char), DCMVR_PROP_ISASTRING, 0, 64 }, { EVR_SH, "SH", sizeof(char), DCMVR_PROP_ISASTRING, 0, 16 }, { EVR_SL, "SL", sizeof(Sint32), DCMVR_PROP_NONE, 4, 4 }, { EVR_SQ, "SQ", 0, DCMVR_PROP_EXTENDEDLENGTHENCODING, 0, DCM_UndefinedLength }, { EVR_SS, "SS", sizeof(Sint16), DCMVR_PROP_NONE, 2, 2 }, { EVR_ST, "ST", sizeof(char), DCMVR_PROP_ISASTRING, 0, 1024 }, { EVR_TM, "TM", sizeof(char), DCMVR_PROP_ISASTRING, 0, 16 }, { EVR_UI, "UI", sizeof(char), DCMVR_PROP_ISASTRING, 0, 64 }, { EVR_UL, "UL", sizeof(Uint32), DCMVR_PROP_NONE, 4, 4 }, { EVR_US, "US", sizeof(Uint16), DCMVR_PROP_NONE, 2, 2 }, { EVR_UT, "UT", sizeof(char), DCMVR_PROP_ISASTRING|DCMVR_PROP_EXTENDEDLENGTHENCODING, 0, DCM_UndefinedLength }, { EVR_ox, "ox", sizeof(Uint8), DCMVR_PROP_NONSTANDARD | DCMVR_PROP_EXTENDEDLENGTHENCODING, 0, DCM_UndefinedLength }, { EVR_xs, "xs", sizeof(Uint16), DCMVR_PROP_NONSTANDARD, 2, 2 }, { EVR_lt, "lt", sizeof(Uint16), DCMVR_PROP_NONSTANDARD | DCMVR_PROP_EXTENDEDLENGTHENCODING, 0, DCM_UndefinedLength }, { EVR_na, "na", 0, DCMVR_PROP_NONSTANDARD, 0, 0 }, { EVR_up, "up", sizeof(Uint32), DCMVR_PROP_NONSTANDARD, 4, 4 }, /* unique prefixes have been "invented" for the following internal VRs */ { EVR_item, "it_EVR_item", 0, DCMVR_PROP_NONSTANDARD | DCMVR_PROP_INTERNAL, 0, 0 }, { EVR_metainfo, "mi_EVR_metainfo", 0, DCMVR_PROP_NONSTANDARD | DCMVR_PROP_INTERNAL, 0, 0 }, { EVR_dataset, "ds_EVR_dataset", 0, DCMVR_PROP_NONSTANDARD | DCMVR_PROP_INTERNAL, 0, 0 }, { EVR_fileFormat, "ff_EVR_fileFormat", 0, DCMVR_PROP_NONSTANDARD | DCMVR_PROP_INTERNAL, 0, 0 }, { EVR_dicomDir, "dd_EVR_dicomDir", 0, DCMVR_PROP_NONSTANDARD | DCMVR_PROP_INTERNAL, 0, 0 }, { EVR_dirRecord, "dr_EVR_dirRecord", 0, DCMVR_PROP_NONSTANDARD | DCMVR_PROP_INTERNAL, 0, 0 }, { EVR_pixelSQ, "ps_EVR_pixelSQ", sizeof(Uint8), DCMVR_PROP_NONSTANDARD | DCMVR_PROP_INTERNAL, 0, DCM_UndefinedLength }, /* Moved from internal use to non standard only: necessary to distinguish from "normal" OB */ { EVR_pixelItem, "pi", sizeof(Uint8), DCMVR_PROP_NONSTANDARD, 0, DCM_UndefinedLength }, { EVR_UNKNOWN, "??", sizeof(Uint8), /* EVR_UNKNOWN (i.e. "future" VRs) should be mapped to UN or OB */ DCMVR_PROP_NONSTANDARD | DCMVR_PROP_INTERNAL | DCMVR_PROP_EXTENDEDLENGTHENCODING, 0, DCM_UndefinedLength }, /* Unknown Value Representation - Supplement 14 */ { EVR_UN, "UN", sizeof(Uint8), DCMVR_PROP_EXTENDEDLENGTHENCODING, 0, DCM_UndefinedLength }, /* Pixel Data - only used in ident() */ { EVR_PixelData, "PixelData", 0, DCMVR_PROP_INTERNAL, 0, DCM_UndefinedLength }, /* Overlay Data - only used in ident() */ { EVR_OverlayData, "OverlayData", 0, DCMVR_PROP_INTERNAL, 0, DCM_UndefinedLength }, { EVR_UNKNOWN2B, "??", sizeof(Uint8), /* illegal VRs, we assume no extended length coding */ DCMVR_PROP_NONSTANDARD | DCMVR_PROP_INTERNAL , 0, DCM_UndefinedLength }, }; static const int DcmVRDict_DIM = sizeof(DcmVRDict) / sizeof(DcmVREntry); /* ** Check the consistency of the DcmVRDict */ #ifdef DEBUG #include "dcmtk/ofstd/ofstream.h" class DcmVRDict_checker { private: int error_found; public: DcmVRDict_checker(); }; DcmVRDict_checker::DcmVRDict_checker() : error_found(OFFalse) { for (int i=0; i= 0) && (OFstatic_cast(int, evr) < DcmVRDict_DIM)) { vr = evr; } else { vr = EVR_UNKNOWN; } } void DcmVR::setVR(const char* vrName) { vr = EVR_UNKNOWN; /* default */ if ( vrName != NULL) { int found = OFFalse; int i = 0; for (i=0; (!found && (i < DcmVRDict_DIM)); i++) { if (strncmp(vrName, DcmVRDict[i].vrName, 2) == 0) { found = OFTrue; vr = DcmVRDict[i].vr; } } /* Workaround: There have been reports of systems transmitting * illegal VR strings in explicit VR (i.e. "??") without using * extended length fields. This is particularly bad because the * DICOM committee has announced that all future VRs will use * extended length. In order to distinguish between these two * variants, we treat all unknown VRs consisting of uppercase * letters as "real" future VRs (and thus assume extended length). * All other VR strings are treated as "illegal" VRs. */ register char c1 = *vrName; register char c2 = (c1)?(*(vrName+1)):('\0'); if ((c1=='?')&&(c2=='?')) vr = EVR_UNKNOWN2B; if (!found && ((c1<'A')||(c1>'Z')||(c2<'A')||(c2>'Z'))) vr = EVR_UNKNOWN2B; } } DcmEVR DcmVR::getValidEVR() const { DcmEVR evr = EVR_UNKNOWN; if (isStandard()) { evr = vr; } else { switch (vr) { case EVR_up: evr = EVR_UL; break; case EVR_xs: evr = EVR_US; break; case EVR_lt: evr = EVR_OW; break; case EVR_ox: case EVR_pixelSQ: evr = EVR_OB; break; default: evr = EVR_UN; /* handle as Unknown VR (Supplement 14) */ break; } } /* ** If the generation of UN is not globally enabled then use OB instead. ** We may not want to generate UN if other software cannot handle it. */ if (evr == EVR_UN) { if (!dcmEnableUnknownVRGeneration.get()) evr = EVR_OB; /* handle UN as if OB */ } /* ** If the generation of UT is not globally enabled then use OB instead. ** We may not want to generate UT if other software cannot handle it. */ if (evr == EVR_UT) { if (!dcmEnableUnlimitedTextVRGeneration.get()) evr = EVR_OB; /* handle UT as if OB */ } return evr; } size_t DcmVR::getValueWidth(void) const { return DcmVRDict[vr].fValWidth; } const char* DcmVR::getVRName() const { return DcmVRDict[vr].vrName; } const char* DcmVR::getValidVRName() const { DcmVR avr(getValidEVR()); return avr.getVRName(); } OFBool DcmVR::isStandard() const { return (DcmVRDict[vr].propertyFlags & DCMVR_PROP_NONSTANDARD) ? OFFalse : OFTrue; } OFBool DcmVR::isForInternalUseOnly() const { return (DcmVRDict[vr].propertyFlags & DCMVR_PROP_INTERNAL) ? OFTrue : OFFalse; } /* returns true if VR represents a string */ OFBool DcmVR::isaString() const { return (DcmVRDict[vr].propertyFlags & DCMVR_PROP_ISASTRING) ? OFTrue : OFFalse; } /* * returns true if VR uses an extended length encoding * for explicit transfer syntaxes */ OFBool DcmVR::usesExtendedLengthEncoding() const { return (DcmVRDict[vr].propertyFlags & DCMVR_PROP_EXTENDEDLENGTHENCODING) ? OFTrue : OFFalse; } Uint32 DcmVR::getMinValueLength() const { return (DcmVRDict[vr].minValueLength); } Uint32 DcmVR::getMaxValueLength() const { return (DcmVRDict[vr].maxValueLength); } /* returns true if the vr is equivalent */ OFBool DcmVR::isEquivalent(const DcmVR& avr) const { DcmEVR evr = avr.getEVR(); if (vr == evr) return OFTrue; OFBool result = OFFalse; switch (vr) { case EVR_ox: result = (evr == EVR_OB || evr == EVR_OW); break; case EVR_lt: result = (evr == EVR_OW || evr == EVR_US || evr == EVR_SS); break; case EVR_OB: result = (evr == EVR_ox); break; case EVR_OW: result = (evr == EVR_ox || evr == EVR_lt); break; case EVR_up: result = (evr == EVR_UL); break; case EVR_UL: result = (evr == EVR_up); break; case EVR_xs: result = (evr == EVR_SS || evr == EVR_US); break; case EVR_SS: case EVR_US: result = (evr == EVR_xs || evr == EVR_lt); break; default: break; } return result; } /* * CVS/RCS Log: * $Log: dcvr.cc,v $ * Revision 1.39 2010-10-14 13:14:10 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.38 2010-03-01 09:08:45 uli * Removed some unnecessary include directives in the headers. * * Revision 1.37 2010-02-22 11:39:54 uli * Remove some unneeded includes. * * Revision 1.36 2009-12-04 17:08:11 joergr * Sightly modified some log messages. * * Revision 1.35 2009-11-04 09:58:10 uli * Switched to logging mechanism provided by the "new" oflog module * * Revision 1.34 2006-08-15 15:49:54 meichel * Updated all code in module dcmdata to correctly compile when * all standard C++ classes remain in namespace std. * * Revision 1.33 2005/12/08 15:41:44 meichel * Changed include path schema for all DCMTK header files * * Revision 1.32 2005/11/15 18:28:04 meichel * Added new global flag dcmEnableUnknownVRConversion that enables the automatic * re-conversion of defined length UN elements read in an explicit VR transfer * syntax, if the real VR is defined in the data dictionary. Default is OFFalse, * i.e. to retain the previous behavior. * * Revision 1.31 2005/11/15 16:59:25 meichel * Added new pseudo VR type EVR_lt that is used for LUT Data when read in * implicit VR, which may be US, SS or OW. DCMTK always treats EVR_lt like OW. * * Revision 1.30 2004/02/04 16:47:59 joergr * Adapted type casts to new-style typecast operators defined in ofcast.h. * Removed acknowledgements with e-mail addresses from CVS log. * * Revision 1.29 2003/06/04 12:41:07 meichel * Cleaned up usage of boolean constants * * Revision 1.28 2003/03/21 13:08:04 meichel * Minor code purifications for warnings reported by MSVC in Level 4 * * Revision 1.27 2002/12/06 13:00:31 joergr * Added support for new value representation Other Float String (OF). * * Revision 1.26 2002/11/27 12:06:54 meichel * Adapted module dcmdata to use of new header file ofstdinc.h * * Revision 1.25 2002/04/16 13:43:23 joergr * Added configurable support for C++ ANSI standard includes (e.g. streams). * * Revision 1.24 2001/11/02 13:18:52 meichel * Removed character sequences that could be interpreted as ISO C++ trigraphs * * Revision 1.23 2001/09/28 14:21:40 joergr * Replaced "cerr" by "CERR". * * Revision 1.22 2001/06/01 15:49:13 meichel * Updated copyright header * * Revision 1.21 2000/04/14 15:42:58 meichel * Global VR generation flags are now derived from OFGlobal and, thus, * safe for use in multi-thread applications. * * Revision 1.20 2000/03/08 16:26:44 meichel * Updated copyright header. * * Revision 1.19 2000/03/03 14:05:38 meichel * Implemented library support for redirecting error messages into memory * instead of printing them to stdout/stderr for GUI applications. * * Revision 1.18 2000/02/29 11:49:30 meichel * Removed support for VS value representation. This was proposed in CP 101 * but never became part of the standard. * * Revision 1.17 2000/02/03 16:35:12 joergr * Fixed bug: encapsulated data (pixel items) have never been loaded using * method 'loadAllDataIntoMemory'. Therefore, encapsulated pixel data was * never printed with 'dcmdump'. * Corrected bug that caused wrong calculation of group length for sequence * of items (e.g. encapsulated pixel data). * * Revision 1.16 1999/03/31 09:25:45 meichel * Updated copyright header in module dcmdata * * */ dcmtk-3.6.0/dcmdata/libsrc/dcistrmz.cc0000644000310500011400000003507611475445716017111 0ustar joergrdicom3/* * * Copyright (C) 2002-2010, 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: dcmdata * * Author: Marco Eichelberg * * Purpose: zlib compression filter for input streams * * Last Update: $Author: uli $ * Update Date: $Date: 2010-12-01 13:21:18 $ * CVS/RCS Revision: $Revision: 1.13 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" #ifdef WITH_ZLIB #include "dcmtk/dcmdata/dcistrmz.h" #include "dcmtk/dcmdata/dcerror.h" #define DCMZLIBINPUTFILTER_BUFSIZE 4096 #define DCMZLIBINPUTFILTER_PUTBACKSIZE 1024 OFGlobal dcmZlibExpectRFC1950Encoding(OFFalse); DcmZLibInputFilter::DcmZLibInputFilter() : DcmInputFilter() , current_(NULL) , zstream_(new z_stream) , status_(EC_MemoryExhausted) , eos_(OFFalse) , inputBuf_(new unsigned char[DCMZLIBINPUTFILTER_BUFSIZE]) , inputBufStart_(0) , inputBufCount_(0) , outputBuf_(new unsigned char[DCMZLIBINPUTFILTER_BUFSIZE]) , outputBufStart_(0) , outputBufCount_(0) , outputBufPutback_(0) , padded_(OFFalse) { if (zstream_ && inputBuf_ && outputBuf_) { zstream_->zalloc = Z_NULL; zstream_->zfree = Z_NULL; zstream_->opaque = Z_NULL; zstream_->next_in = Z_NULL; zstream_->avail_in = 0; if (dcmZlibExpectRFC1950Encoding.get()) { /* expect non-standard bitstream *with* zlib header * This is easy because it is the normal zlib format anyway. */ if (Z_OK == inflateInit(zstream_)) status_ = EC_Normal; else { OFString etext = "ZLib Error: "; if (zstream_->msg) etext += zstream_->msg; status_ = makeOFCondition(OFM_dcmdata, 16, OF_error, etext.c_str()); } } else { /* windowBits is passed < 0 to tell that there is no zlib header. * Note that in this case inflate *requires* an extra "dummy" byte * after the compressed stream in order to complete decompression and * return Z_STREAM_END. */ if (Z_OK == inflateInit2(zstream_, -MAX_WBITS)) status_ = EC_Normal; else { OFString etext = "ZLib Error: "; if (zstream_->msg) etext += zstream_->msg; status_ = makeOFCondition(OFM_dcmdata, 16, OF_error, etext.c_str()); } } } } DcmZLibInputFilter::~DcmZLibInputFilter() { if (zstream_) { inflateEnd(zstream_); // discards any unprocessed input and does not flush any pending output delete zstream_; } delete[] inputBuf_; delete[] outputBuf_; } OFBool DcmZLibInputFilter::good() const { return status_.good(); } OFCondition DcmZLibInputFilter::status() const { return status_; } OFBool DcmZLibInputFilter::eos() { if (status_.bad() || (current_ == NULL)) return OFTrue; // there may be trailing garbage after the compressed stream. // we report eos if the decompressor has reported Z_STREAM_END // and the output buffer is empty. return (outputBufCount_ == 0) && eos_; } offile_off_t DcmZLibInputFilter::avail() { if (status_.good()) return outputBufCount_; else return 0; } offile_off_t DcmZLibInputFilter::read(void *buf, offile_off_t buflen) { if (status_.bad() || (current_ == NULL) || (buf == NULL)) return 0; unsigned char *target = OFstatic_cast(unsigned char *, buf); offile_off_t offset = 0; offile_off_t availBytes = 0; offile_off_t result = 0; do { // copy bytes from output buffer to user provided block of data if (outputBufCount_) { // determine next block of data in output buffer offset = outputBufStart_ + outputBufPutback_; if (offset >= DCMZLIBINPUTFILTER_BUFSIZE) offset -= DCMZLIBINPUTFILTER_BUFSIZE; availBytes = outputBufCount_; if (offset + availBytes > DCMZLIBINPUTFILTER_BUFSIZE) availBytes = DCMZLIBINPUTFILTER_BUFSIZE - offset; if (availBytes > buflen) availBytes = buflen; if (availBytes) memcpy(target, outputBuf_ + offset, OFstatic_cast(size_t, availBytes)); target += availBytes; result += availBytes; buflen -= availBytes; // adjust pointers outputBufPutback_ += availBytes; outputBufCount_ -= availBytes; if (outputBufPutback_ > DCMZLIBINPUTFILTER_PUTBACKSIZE) { outputBufStart_ += outputBufPutback_ - DCMZLIBINPUTFILTER_PUTBACKSIZE; if (outputBufStart_ >= DCMZLIBINPUTFILTER_BUFSIZE) outputBufStart_ -= DCMZLIBINPUTFILTER_BUFSIZE; outputBufPutback_ = DCMZLIBINPUTFILTER_PUTBACKSIZE; } } // refill output buffer fillOutputBuffer(); } while (buflen && outputBufCount_); // we're either done or the output buffer is empty because of producer suspension return result; } offile_off_t DcmZLibInputFilter::skip(offile_off_t skiplen) { if (status_.bad() || (current_ == NULL)) return 0; offile_off_t offset = 0; offile_off_t availBytes = 0; offile_off_t result = 0; do { // copy bytes from output buffer to user provided block of data if (outputBufCount_) { // determine next block of data in output buffer offset = outputBufStart_ + outputBufPutback_; if (offset >= DCMZLIBINPUTFILTER_BUFSIZE) offset -= DCMZLIBINPUTFILTER_BUFSIZE; availBytes = outputBufCount_; if (offset + availBytes > DCMZLIBINPUTFILTER_BUFSIZE) availBytes = DCMZLIBINPUTFILTER_BUFSIZE - offset; if (availBytes > skiplen) availBytes = skiplen; result += availBytes; skiplen -= availBytes; // adjust pointers outputBufPutback_ += availBytes; outputBufCount_ -= availBytes; if (outputBufPutback_ > DCMZLIBINPUTFILTER_PUTBACKSIZE) { outputBufStart_ += outputBufPutback_ - DCMZLIBINPUTFILTER_PUTBACKSIZE; outputBufPutback_ = DCMZLIBINPUTFILTER_PUTBACKSIZE; if (outputBufStart_ >= DCMZLIBINPUTFILTER_BUFSIZE) outputBufStart_ -= DCMZLIBINPUTFILTER_BUFSIZE; } } // refill output buffer fillOutputBuffer(); } while (skiplen && outputBufCount_); // we're either done or the output buffer is empty because of producer suspension return result; } void DcmZLibInputFilter::putback(offile_off_t num) { if (num > outputBufPutback_) status_ = EC_PutbackFailed; else { outputBufPutback_ -= num; outputBufCount_ += num; } } void DcmZLibInputFilter::append(DcmProducer& producer) { current_ = &producer; } offile_off_t DcmZLibInputFilter::fillInputBuffer() { offile_off_t result = 0; if (status_.good() && current_ && (inputBufCount_ < DCMZLIBINPUTFILTER_BUFSIZE)) { // use first part of input buffer if (inputBufStart_ + inputBufCount_ < DCMZLIBINPUTFILTER_BUFSIZE) { result = current_->read(inputBuf_ + inputBufStart_ + inputBufCount_, DCMZLIBINPUTFILTER_BUFSIZE - (inputBufStart_ + inputBufCount_)); inputBufCount_ += result; if (result == 0) { if (current_->eos() && !padded_) { // producer has signalled eos, now append zero pad byte that makes // zlib recognize the end of stream when no zlib header is present *(inputBuf_ + inputBufStart_ + inputBufCount_) = 0; inputBufCount_++; padded_ = OFTrue; } return result; // producer suspension } } // use second part of input buffer if (inputBufCount_ < DCMZLIBINPUTFILTER_BUFSIZE && inputBufStart_ + inputBufCount_ >= DCMZLIBINPUTFILTER_BUFSIZE) { offile_off_t result2 = current_->read(inputBuf_ + (inputBufStart_ + inputBufCount_ - DCMZLIBINPUTFILTER_BUFSIZE), DCMZLIBINPUTFILTER_BUFSIZE - inputBufCount_); inputBufCount_ += result2; result += result2; if (result2 == 0 && current_->eos() && !padded_) { // producer has signalled eos, now append zero pad byte that makes // zlib recognize the end of stream when no zlib header is present *(inputBuf_ + inputBufStart_ + inputBufCount_ - DCMZLIBINPUTFILTER_BUFSIZE) = 0; inputBufCount_++; padded_ = OFTrue; } } } return result; } offile_off_t DcmZLibInputFilter::decompress(const void *buf, offile_off_t buflen) { offile_off_t result = 0; zstream_->next_out = OFstatic_cast(Bytef *, OFconst_cast(void *, buf)); zstream_->avail_out = OFstatic_cast(uInt, buflen); int astatus; // decompress from inputBufStart_ to end of data or end of buffer, whatever comes first offile_off_t numBytes = (inputBufStart_ + inputBufCount_ > DCMZLIBINPUTFILTER_BUFSIZE) ? (DCMZLIBINPUTFILTER_BUFSIZE - inputBufStart_) : inputBufCount_ ; if (numBytes || buflen) { zstream_->next_in = OFstatic_cast(Bytef *, inputBuf_ + inputBufStart_); zstream_->avail_in = OFstatic_cast(uInt, numBytes); astatus = inflate(zstream_, 0); if (astatus == Z_OK || astatus == Z_BUF_ERROR) { /* everything OK */ } else if (astatus == Z_STREAM_END) { #ifdef DEBUG if (!eos_) { offile_off_t count = inputBufCount_ - (numBytes - OFstatic_cast(offile_off_t, zstream_->avail_in)); if (count > 2) { /* we silently ignore up to two trailing bytes after the end of the * deflated stream. One byte has been added by ourselves to make sure * zlib detects eos, another one might be the padding necessary for * odd length zlib streams transmitted through a DICOM network * (where PDVs always have even length). * Everything else generates a warning. */ DCMDATA_WARN("zlib: " << OFstatic_cast(ulong, count-1) << " pending input bytes in buffer."); } } #endif eos_ = OFTrue; } else { OFString etext = "ZLib Error: "; if (zstream_->msg) etext += zstream_->msg; status_ = makeOFCondition(OFM_dcmdata, 16, OF_error, etext.c_str()); } // adjust counters inputBufStart_ += numBytes - OFstatic_cast(offile_off_t, zstream_->avail_in); inputBufCount_ -= numBytes - OFstatic_cast(offile_off_t, zstream_->avail_in); if (inputBufStart_ == DCMZLIBINPUTFILTER_BUFSIZE) { // wrapped around inputBufStart_ = 0; // now flush to end of data if (inputBufCount_ && (zstream_->avail_out > 0)) { zstream_->next_in = OFstatic_cast(Bytef *, inputBuf_); zstream_->avail_in = OFstatic_cast(uInt, inputBufCount_); astatus = inflate(zstream_, 0); if (astatus == Z_OK || astatus == Z_BUF_ERROR) { /* everything OK */ } else if (astatus == Z_STREAM_END) { #ifdef DEBUG if (!eos_) { offile_off_t count = OFstatic_cast(offile_off_t, zstream_->avail_in); if (count > 2) { /* we silently ignore up to two trailing bytes after the end of the * deflated stream. One byte has been added by ourselves to make sure * zlib detects eos, another one might be the padding necessary for * odd length zlib streams transmitted through a DICOM network * (where PDVs always have even length). * Everything else generates a warning. */ DCMDATA_WARN("zlib: " << OFstatic_cast(ulong, count-1) << " pending input bytes in buffer."); } } #endif eos_ = OFTrue; } else { OFString etext = "ZLib Error: "; if (zstream_->msg) etext += zstream_->msg; status_ = makeOFCondition(OFM_dcmdata, 16, OF_error, etext.c_str()); } // adjust counters inputBufStart_ += inputBufCount_ - OFstatic_cast(offile_off_t, zstream_->avail_in); inputBufCount_ = OFstatic_cast(offile_off_t, zstream_->avail_in); } } // reset buffer start to make things faster if (inputBufCount_ == 0) inputBufStart_ = 0; // compute result result = buflen - OFstatic_cast(offile_off_t, zstream_->avail_out); } return result; } void DcmZLibInputFilter::fillOutputBuffer() { offile_off_t inputBytes = 0; offile_off_t outputBytes = 0; offile_off_t offset = 0; offile_off_t availBytes = 0; do { inputBytes = fillInputBuffer(); // determine next block of free space in output buffer offset = outputBufStart_ + outputBufPutback_ + outputBufCount_; if (offset >= DCMZLIBINPUTFILTER_BUFSIZE) offset -= DCMZLIBINPUTFILTER_BUFSIZE; availBytes = DCMZLIBINPUTFILTER_BUFSIZE - (outputBufPutback_ + outputBufCount_); if (offset + availBytes > DCMZLIBINPUTFILTER_BUFSIZE) availBytes = DCMZLIBINPUTFILTER_BUFSIZE - offset; // decompress to output buffer outputBytes = decompress(outputBuf_ + offset, availBytes); outputBufCount_ += outputBytes; } while (inputBytes || outputBytes); } #else /* WITH_ZLIB */ /* make sure that the object file is not completely empty if compiled * without zlib because some linkers might fail otherwise. */ void dcistrmz_dummy_function() { return; } #endif /* WITH_ZLIB */ /* * CVS/RCS Log: * $Log: dcistrmz.cc,v $ * Revision 1.13 2010-12-01 13:21:18 uli * Fixed build problem with MSC6 when zlib support is enabled. * * Revision 1.12 2010-10-14 13:14:08 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.11 2010-08-05 08:38:10 uli * Fixed some warnings from -Wold-style-cast. * * Revision 1.10 2010-02-22 11:39:54 uli * Remove some unneeded includes. * * Revision 1.9 2009-11-04 09:58:09 uli * Switched to logging mechanism provided by the "new" oflog module * * Revision 1.8 2007-02-19 15:45:31 meichel * Class DcmInputStream and related classes are now safe for use with * large files (2 GBytes or more) if supported by compiler and operating system. * * Revision 1.7 2006/08/15 15:49:54 meichel * Updated all code in module dcmdata to correctly compile when * all standard C++ classes remain in namespace std. * * Revision 1.6 2005/12/08 15:41:15 meichel * Changed include path schema for all DCMTK header files * * Revision 1.5 2004/04/07 12:19:14 joergr * Adapted type casts to new-style typecast operators defined in ofcast.h. * * Revision 1.4 2002/12/20 14:55:34 wilkens * Inserted three casts in order to get rid of compiler warning on Solaris 2.5.1 * using compiler SC 2.0.1. * * Revision 1.3 2002/09/19 08:32:28 joergr * Added explicit type casts to keep Sun CC 2.0.1 quiet. * * Revision 1.2 2002/08/29 15:57:49 meichel * Updated zlib-related classes to correctly compile when WITH_ZLIB is undefined * * Revision 1.1 2002/08/27 16:55:50 meichel * Initial release of new DICOM I/O stream classes that add support for stream * compression (deflated little endian explicit VR transfer syntax) * * */ dcmtk-3.6.0/dcmdata/libsrc/dcvras.cc0000644000310500011400000001042511457616141016513 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Gerd Ehlers, Andreas Barth * * Purpose: Implementation of class DcmAgeString * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-20 16:44:17 $ * CVS/RCS Revision: $Revision: 1.16 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcvras.h" // ******************************** DcmAgeString::DcmAgeString(const DcmTag &tag, const Uint32 len) : DcmByteString(tag, len) { setMaxLength(4); } DcmAgeString::DcmAgeString(const DcmAgeString &old) : DcmByteString(old) { } DcmAgeString::~DcmAgeString() { } DcmAgeString &DcmAgeString::operator=(const DcmAgeString &obj) { DcmByteString::operator=(obj); return *this; } OFCondition DcmAgeString::copyFrom(const DcmObject& rhs) { if (this != &rhs) { if (rhs.ident() != ident()) return EC_IllegalCall; *this = OFstatic_cast(const DcmAgeString &, rhs); } return EC_Normal; } // ******************************** DcmEVR DcmAgeString::ident() const { return EVR_AS; } OFCondition DcmAgeString::checkValue(const OFString &vm, const OFBool /*oldFormat*/) { OFString strVal; /* get "raw value" without any modifications (if possible) */ OFCondition l_error = getStringValue(strVal); if (l_error.good()) l_error = DcmAgeString::checkStringValue(strVal, vm); return l_error; } // ******************************** OFCondition DcmAgeString::checkStringValue(const OFString &value, const OFString &vm) { return DcmByteString::checkStringValue(value, vm, "as", 1); } /* ** CVS/RCS Log: ** $Log: dcvras.cc,v $ ** Revision 1.16 2010-10-20 16:44:17 joergr ** Use type cast macros (e.g. OFstatic_cast) where appropriate. ** ** Revision 1.15 2010-10-14 13:14:09 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.14 2010-04-23 14:30:34 joergr ** Added new method to all VR classes which checks whether the stored value ** conforms to the VR definition and to the specified VM. ** ** Revision 1.13 2009-08-03 09:02:59 joergr ** Added methods that check whether a given string value conforms to the VR and ** VM definitions of the DICOM standards. ** ** Revision 1.12 2008-07-17 10:31:32 onken ** Implemented copyFrom() method for complete DcmObject class hierarchy, which ** permits setting an instance's value from an existing object. Implemented ** assignment operator where necessary. ** ** Revision 1.11 2007-06-29 14:17:49 meichel ** Code clean-up: Most member variables in module dcmdata are now private, ** not protected anymore. ** ** Revision 1.10 2005/12/08 15:41:46 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.9 2002/12/06 13:20:48 joergr ** Enhanced "print()" function by re-working the implementation and replacing ** the boolean "showFullData" parameter by a more general integer flag. ** Made source code formatting more consistent with other modules/files. ** ** Revision 1.8 2001/06/01 15:49:14 meichel ** Updated copyright header ** ** Revision 1.7 2000/03/08 16:26:45 meichel ** Updated copyright header. ** ** Revision 1.6 1999/03/31 09:25:46 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.5 1998/11/12 16:48:22 meichel ** Implemented operator= for all classes derived from DcmObject. ** ** Revision 1.4 1997/07/03 15:10:08 andreas ** - removed debugging functions Bdebug() and Edebug() since ** they write a static array and are not very useful at all. ** Cdebug and Vdebug are merged since they have the same semantics. ** The debugging functions in dcmdata changed their interfaces ** (see dcmdata/include/dcdebug.h) ** ** Revision 1.3 1996/01/05 13:27:45 andreas ** - changed to support new streaming facilities ** - unique read/write methods for file and block transfer ** - more cleanups ** */ dcmtk-3.6.0/dcmdata/libsrc/dcvrobow.cc0000644000310500011400000010751711462524221017060 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Gerd Ehlers, Andreas Barth * * Purpose: Implementation of class DcmOtherByteOtherWord * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-29 10:57:21 $ * CVS/RCS Revision: $Revision: 1.64 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/ofstd/ofstd.h" #include "dcmtk/ofstd/ofstream.h" #include "dcmtk/dcmdata/dcvrobow.h" #include "dcmtk/dcmdata/dcdeftag.h" #include "dcmtk/dcmdata/dcswap.h" #include "dcmtk/dcmdata/dcvm.h" #define INCLUDE_CSTDIO #define INCLUDE_CSTDLIB #define INCLUDE_CSTRING #include "dcmtk/ofstd/ofstdinc.h" // ******************************** DcmOtherByteOtherWord::DcmOtherByteOtherWord(const DcmTag &tag, const Uint32 len) : DcmElement(tag, len) , compactAfterTransfer(OFFalse) { } DcmOtherByteOtherWord::DcmOtherByteOtherWord(const DcmOtherByteOtherWord &old) : DcmElement(old) , compactAfterTransfer(old.compactAfterTransfer) { } DcmOtherByteOtherWord::~DcmOtherByteOtherWord() { } DcmOtherByteOtherWord &DcmOtherByteOtherWord::operator=(const DcmOtherByteOtherWord &obj) { DcmElement::operator=(obj); compactAfterTransfer = obj.compactAfterTransfer; return *this; } OFCondition DcmOtherByteOtherWord::copyFrom(const DcmObject& rhs) { if (this != &rhs) { if (rhs.ident() != ident()) return EC_IllegalCall; *this = OFstatic_cast(const DcmOtherByteOtherWord &, rhs); } return EC_Normal; } // ******************************** DcmEVR DcmOtherByteOtherWord::ident() const { return getTag().getEVR(); } OFCondition DcmOtherByteOtherWord::checkValue(const OFString & /*vm*/, const OFBool /*oldFormat*/) { /* currently no checks are performed */ return EC_Normal; } unsigned long DcmOtherByteOtherWord::getVM() { /* value multiplicity for OB/OW is defined as 1 */ return 1; } OFCondition DcmOtherByteOtherWord::setVR(DcmEVR vr) { setTagVR(vr); return EC_Normal; } // ******************************** void DcmOtherByteOtherWord::print(STD_NAMESPACE ostream&out, const size_t flags, const int level, const char * /*pixelFileName*/, size_t * /*pixelCounter*/) { if (valueLoaded()) { const DcmEVR evr = getTag().getEVR(); Uint16 *wordValues = NULL; Uint8 *byteValues = NULL; /* get 8 or 16 bit data respectively */ if (evr == EVR_OW || evr == EVR_lt) errorFlag = getUint16Array(wordValues); else errorFlag = getUint8Array(byteValues); /* check data */ if ((wordValues != NULL) || (byteValues != NULL)) { /* determine number of values to be printed */ const unsigned int vrSize = (evr == EVR_OW || evr == EVR_lt) ? 4 : 2; const unsigned long count = (evr == EVR_OW || evr == EVR_lt) ? (getLengthField() / 2) : getLengthField(); unsigned long expectedLength = count * (vrSize + 1) - 1; const unsigned long printCount = ((expectedLength > DCM_OptPrintLineLength) && (flags & DCMTypes::PF_shortenLongTagValues)) ? (DCM_OptPrintLineLength - 3 /* for "..." */ + 1 /* for last "\" */) / (vrSize + 1) : count; unsigned long printedLength = printCount * (vrSize + 1) - 1; /* print line start with tag and VR */ printInfoLineStart(out, flags, level); /* print multiple values */ if (printCount > 0) { out << STD_NAMESPACE hex << STD_NAMESPACE setfill('0'); if (evr == EVR_OW || evr == EVR_lt) { /* print word values in hex mode */ out << STD_NAMESPACE setw(vrSize) << (*(wordValues++)); for (unsigned long i = 1; i < printCount; i++) out << "\\" << STD_NAMESPACE setw(vrSize) << (*(wordValues++)); } else { /* print byte values in hex mode */ out << STD_NAMESPACE setw(vrSize) << OFstatic_cast(int, *(byteValues++)); for (unsigned long i = 1; i < printCount; i++) out << "\\" << STD_NAMESPACE setw(vrSize) << OFstatic_cast(int, *(byteValues++)); } /* reset i/o manipulators */ out << STD_NAMESPACE dec << STD_NAMESPACE setfill(' '); } /* print trailing "..." if data has been truncated */ if (printCount < count) { out << "..."; printedLength += 3; } /* print line end with length, VM and tag name */ printInfoLineEnd(out, flags, printedLength); } else printInfoLine(out, flags, level, "(no value available)"); } else printInfoLine(out, flags, level, "(not loaded)"); } void DcmOtherByteOtherWord::printPixel(STD_NAMESPACE ostream&out, const size_t flags, const int level, const char *pixelFileName, size_t *pixelCounter) { if (pixelFileName != NULL) { /* create filename for pixel data file */ OFString fname = pixelFileName; fname += "."; if (pixelCounter != NULL) { char num[20]; sprintf(num, "%ld", OFstatic_cast(long, (*pixelCounter)++)); fname += num; } fname += ".raw"; /* create reference to pixel data file in dump output */ OFString str = "="; str += fname; printInfoLine(out, flags, level, str.c_str(), NULL /*tag*/, OFFalse /*isInfo*/); /* check whether pixel data file already exists */ if (!OFStandard::fileExists(fname)) { /* create binary file for pixel data */ FILE *file = fopen(fname.c_str(), "wb"); if (file != NULL) { if (getTag().getEVR() == EVR_OW || getTag().getEVR() == EVR_lt) { /* write 16 bit data in little endian byte-order */ Uint16 *data = NULL; getUint16Array(data); if (data != NULL) { swapIfNecessary(EBO_LittleEndian, gLocalByteOrder, data, getLengthField(), sizeof(Uint16)); setByteOrder(EBO_LittleEndian); fwrite(data, sizeof(Uint16), OFstatic_cast(size_t, getLengthField() / sizeof(Uint16)), file); } } else { Uint8 *data = NULL; getUint8Array(data); if (data != NULL) fwrite(data, sizeof(Uint8), OFstatic_cast(size_t, getLengthField()), file); } fclose(file); } else { DCMDATA_WARN("DcmOtherByteOtherWord: Can't open output file for pixel data: " << fname); } } else { DCMDATA_WARN("DcmOtherByteOtherWord: Output file for pixel data already exists, skipping: " << fname); } } else DcmOtherByteOtherWord::print(out, flags, level, pixelFileName, pixelCounter); } // ******************************** OFCondition DcmOtherByteOtherWord::alignValue() { errorFlag = EC_Normal; if ((getTag().getEVR() != EVR_OW && getTag().getEVR() != EVR_lt) && (getLengthField() > 0) && ((getLengthField() & 1) != 0)) { // We have an odd number of bytes. This should never happen and is certainly not allowed in DICOM. // To fix this problem, we will add a zero pad byte at the end of the value field. // This requires us to load the value field into memory, which may very well be a problem // if this is part of a very large multi-frame object. Uint8 *bytes = OFstatic_cast(Uint8 *, getValue(getByteOrder())); if (bytes) { // set zero pad byte bytes[getLengthField()] = 0; // increase length field setLengthField(getLengthField() + 1); } } return errorFlag; } void DcmOtherByteOtherWord::postLoadValue() { if (dcmEnableAutomaticInputDataCorrection.get()) alignValue(); } // ******************************** OFCondition DcmOtherByteOtherWord::putUint8Array(const Uint8 *byteValue, const unsigned long numBytes) { errorFlag = EC_Normal; if (numBytes > 0) { /* check for valid 8 bit data */ if ((byteValue != NULL) && (getTag().getEVR() != EVR_OW && getTag().getEVR() != EVR_lt)) { errorFlag = putValue(byteValue, sizeof(Uint8) * OFstatic_cast(Uint32, numBytes)); alignValue(); } else errorFlag = EC_CorruptedData; } else putValue(NULL, 0); return errorFlag; } OFCondition DcmOtherByteOtherWord::putUint16Array(const Uint16 *wordValue, const unsigned long numWords) { errorFlag = EC_Normal; if (numWords > 0) { /* check for valid 16 bit data */ if ((wordValue != NULL) && (getTag().getEVR() == EVR_OW || getTag().getEVR() == EVR_lt)) errorFlag = putValue(wordValue, sizeof(Uint16) * OFstatic_cast(Uint32, numWords)); else errorFlag = EC_CorruptedData; } else errorFlag = putValue(NULL, 0); return errorFlag; } // ******************************** OFCondition DcmOtherByteOtherWord::createUint8Array(const Uint32 numBytes, Uint8 *&bytes) { /* check value representation */ if ((getTag().getEVR() != EVR_OW) && (getTag().getEVR() != EVR_lt)) errorFlag = createEmptyValue(sizeof(Uint8) * OFstatic_cast(Uint32, numBytes)); else errorFlag = EC_CorruptedData; if (errorFlag.good()) bytes = OFstatic_cast(Uint8 *, this->getValue()); else bytes = NULL; return errorFlag; } OFCondition DcmOtherByteOtherWord::createUint16Array(const Uint32 numWords, Uint16 *&words) { /* check value representation */ if ((getTag().getEVR() == EVR_OW) || (getTag().getEVR() == EVR_lt)) errorFlag = createEmptyValue(sizeof(Uint16) * OFstatic_cast(Uint32, numWords)); else errorFlag = EC_CorruptedData; if (errorFlag.good()) words = OFstatic_cast(Uint16 *, this->getValue()); else words = NULL; return errorFlag; } // ******************************** OFCondition DcmOtherByteOtherWord::putString(const char *stringVal) { errorFlag = EC_Normal; /* check input string */ if ((stringVal != NULL) && (strlen(stringVal) > 0)) { unsigned long vm = getVMFromString(stringVal); if (vm > 0) { const DcmEVR evr = getTag().getEVR(); Uint8 *byteField = NULL; Uint16 *wordField = NULL; /* create new value field */ if (evr == EVR_OW || evr == EVR_lt) wordField = new Uint16[vm]; else byteField = new Uint8[vm]; const char *s = stringVal; Uint16 intVal = 0; char *value; /* retrieve binary data from hexa-decimal string */ for (unsigned long i = 0; (i < vm) && errorFlag.good(); i++) { /* get first value stored in 's', set 's' to beginning of the next value */ value = getFirstValueFromString(s); if (value != NULL) { /* integer overflow is currently not checked! */ if (sscanf(value, "%hx", &intVal) != 1) errorFlag = EC_CorruptedData; else if (evr == EVR_OW || evr == EVR_lt) wordField[i] = OFstatic_cast(Uint16, intVal); else byteField[i] = OFstatic_cast(Uint8, intVal); delete[] value; } else errorFlag = EC_CorruptedData; } /* set binary data as the element value */ if (errorFlag.good()) { if (evr == EVR_OW || evr == EVR_lt) errorFlag = putUint16Array(wordField, vm); else errorFlag = putUint8Array(byteField, vm); } /* delete temporary buffers */ delete[] byteField; delete[] wordField; } else putValue(NULL, 0); } else putValue(NULL, 0); return errorFlag; } // ******************************** OFCondition DcmOtherByteOtherWord::getUint8(Uint8 &byteVal, const unsigned long pos) { /* get 8 bit data */ Uint8 *uintValues = NULL; errorFlag = getUint8Array(uintValues); /* check data before returning */ if (errorFlag.good()) { if (uintValues == NULL) errorFlag = EC_IllegalCall; else if (pos >= getLength() /*bytes*/) errorFlag = EC_IllegalParameter; else byteVal = uintValues[pos]; } /* clear value in case of error */ if (errorFlag.bad()) byteVal = 0; return errorFlag; } OFCondition DcmOtherByteOtherWord::getUint8Array(Uint8 *&byteVals) { errorFlag = EC_Normal; if (getTag().getEVR() != EVR_OW && getTag().getEVR() != EVR_lt) byteVals = OFstatic_cast(Uint8 *, getValue()); else errorFlag = EC_IllegalCall; return errorFlag; } // ******************************** OFCondition DcmOtherByteOtherWord::getUint16(Uint16 &wordVal, const unsigned long pos) { Uint16 *uintValues = NULL; errorFlag = getUint16Array(uintValues); /* check data before returning */ if (errorFlag.good()) { if (uintValues == NULL) errorFlag = EC_IllegalCall; else if (pos >= getLength() / sizeof(Uint16) /*words*/) errorFlag = EC_IllegalParameter; else wordVal = uintValues[pos]; } /* clear value in case of error */ if (errorFlag.bad()) wordVal = 0; return errorFlag; } OFCondition DcmOtherByteOtherWord::getUint16Array(Uint16 *&wordVals) { errorFlag = EC_Normal; if (getTag().getEVR() == EVR_OW || getTag().getEVR() == EVR_lt) wordVals = OFstatic_cast(Uint16 *, getValue()); else errorFlag = EC_IllegalCall; return errorFlag; } // ******************************** OFCondition DcmOtherByteOtherWord::getOFString(OFString &stringVal, const unsigned long pos, OFBool /*normalize*/) { if (getTag().getEVR() == EVR_OW || getTag().getEVR() == EVR_lt) { Uint16 uint16Val; /* get the specified numeric value (16 bit) */ errorFlag = getUint16(uint16Val, pos); if (errorFlag.good()) { /* ... and convert it to a character string (hex mode) */ char buffer[32]; sprintf(buffer, "%4.4hx", uint16Val); /* assign result */ stringVal = buffer; } } else { Uint8 uint8Val; /* get the specified numeric value (8 bit) */ errorFlag = getUint8(uint8Val, pos); if (errorFlag.good()) { /* ... and convert it to a character string (hex mode) */ char buffer[32]; sprintf(buffer, "%2.2hx", uint8Val); /* assign result */ stringVal = buffer; } } return errorFlag; } OFCondition DcmOtherByteOtherWord::getOFStringArray(OFString &stringVal, OFBool /*normalize*/) { if (getTag().getEVR() == EVR_OW || getTag().getEVR() == EVR_lt) { /* get array of 16 bit values */ Uint16 *uint16Vals = OFstatic_cast(Uint16 *, getValue()); const size_t count = OFstatic_cast(size_t, getLength() / sizeof(Uint16)); if ((uint16Vals != NULL) && (count > 0)) { OFOStringStream stream; /* output first value in hexadecimal format */ stream << STD_NAMESPACE hex << STD_NAMESPACE setfill('0') << STD_NAMESPACE setw(4) << *(uint16Vals++); /* for all other array elements ... */ for (size_t i = 1; i < count; i++) stream << "\\" << STD_NAMESPACE setw(4) << *(uint16Vals++); stream << OFStringStream_ends; /* convert string stream into a character string */ OFSTRINGSTREAM_GETSTR(stream, buffer_str) stringVal.assign(buffer_str); OFSTRINGSTREAM_FREESTR(buffer_str) errorFlag = EC_Normal; } else errorFlag = EC_IllegalCall; } else { /* get array of 8 bit values */ Uint8 *uint8Vals = OFstatic_cast(Uint8 *, getValue()); const size_t count = OFstatic_cast(size_t, getLength()); if ((uint8Vals != NULL) && (count > 0)) { OFOStringStream stream; /* output first value in hexadecimal format */ stream << STD_NAMESPACE hex << STD_NAMESPACE setfill('0') << STD_NAMESPACE setw(2) << OFstatic_cast(int, *(uint8Vals++)); /* for all other array elements ... */ for (size_t i = 1; i < count; i++) stream << "\\" << STD_NAMESPACE setw(2) << OFstatic_cast(int, *(uint8Vals++)); stream << OFStringStream_ends; /* convert string stream into a character string */ OFSTRINGSTREAM_GETSTR(stream, buffer_str) stringVal.assign(buffer_str); OFSTRINGSTREAM_FREESTR(buffer_str) errorFlag = EC_Normal; } else errorFlag = EC_IllegalCall; } return errorFlag; } // ******************************** OFCondition DcmOtherByteOtherWord::verify(const OFBool autocorrect) { errorFlag = EC_Normal; if (autocorrect) errorFlag = alignValue(); return errorFlag; } // ******************************** OFBool DcmOtherByteOtherWord::canWriteXfer(const E_TransferSyntax newXfer, const E_TransferSyntax /*oldXfer*/) { DcmXfer newXferSyn(newXfer); return (getTag() != DCM_PixelData) || !newXferSyn.isEncapsulated(); } // ******************************** OFCondition DcmOtherByteOtherWord::write( DcmOutputStream &outStream, const E_TransferSyntax oxfer, const E_EncodingType enctype, DcmWriteCache *wcache) { if (getTransferState() == ERW_notInitialized) errorFlag = EC_IllegalCall; else { if (getTransferState() == ERW_init) { // if the attribute value is in file, we should call compact() if the write // operation causes the value to be loaded into main memory, which can happen // for odd length attributes. compactAfterTransfer = ! valueLoaded(); // this call may cause the attribute to be loaded into memory alignValue(); } // call inherited method errorFlag = DcmElement::write(outStream, oxfer, enctype, wcache); } // if the write operation has completed successfully, call compact if the // attribute value resided in file prior to the write operation. if (errorFlag.good() && compactAfterTransfer) compact(); // return error status return errorFlag; } OFCondition DcmOtherByteOtherWord::writeSignatureFormat( DcmOutputStream &outStream, const E_TransferSyntax oxfer, const E_EncodingType enctype, DcmWriteCache *wcache) { if (getTransferState() == ERW_notInitialized) errorFlag = EC_IllegalCall; else { if (getTransferState() == ERW_init) { // if the attribute value is in file, we should call compact() if the write // operation causes the value to be loaded into main memory, which can happen // for odd length attributes. compactAfterTransfer = ! valueLoaded(); // this call may cause the attribute to be loaded into memory alignValue(); } // call inherited method errorFlag = DcmElement::writeSignatureFormat(outStream, oxfer, enctype, wcache); } // if the write operation has completed successfully, call compact if the // attribute value resided in file prior to the write operation. if (errorFlag.good() && compactAfterTransfer) compact(); // return error status return errorFlag; } // ******************************** OFCondition DcmOtherByteOtherWord::writeXML(STD_NAMESPACE ostream &out, const size_t flags) { /* XML start tag: */ if (!(flags & DCMTypes::XF_writeBinaryData)) writeXMLStartTag(out, flags, "binary=\"hidden\""); else if (flags & DCMTypes::XF_encodeBase64) writeXMLStartTag(out, flags, "binary=\"base64\""); else writeXMLStartTag(out, flags, "binary=\"yes\""); /* write element value (if loaded) */ if (valueLoaded() && (flags & DCMTypes::XF_writeBinaryData)) { const DcmEVR evr = getTag().getEVR(); /* encode binary data as Base64 */ if (flags & DCMTypes::XF_encodeBase64) { Uint8 *byteValues = OFstatic_cast(Uint8 *, getValue()); if ((evr == EVR_OW) || (evr == EVR_lt)) { /* Base64 encoder requires big endian input data */ swapIfNecessary(EBO_BigEndian, gLocalByteOrder, byteValues, getLengthField(), sizeof(Uint16)); /* update the byte order indicator variable correspondingly */ setByteOrder(EBO_BigEndian); } OFStandard::encodeBase64(out, byteValues, OFstatic_cast(size_t, getLengthField())); } else { if ((evr == EVR_OW) || (evr == EVR_lt)) { /* get and check 16 bit data */ Uint16 *wordValues = NULL; if (getUint16Array(wordValues).good() && (wordValues != NULL)) { const unsigned long count = getLengthField() / 2; out << STD_NAMESPACE hex << STD_NAMESPACE setfill('0'); /* print word values in hex mode */ out << STD_NAMESPACE setw(4) << (*(wordValues++)); for (unsigned long i = 1; i < count; i++) out << "\\" << STD_NAMESPACE setw(4) << (*(wordValues++)); /* reset i/o manipulators */ out << STD_NAMESPACE dec << STD_NAMESPACE setfill(' '); } } else { /* get and check 8 bit data */ Uint8 *byteValues = NULL; if (getUint8Array(byteValues).good() && (byteValues != NULL)) { const unsigned long count = getLengthField(); out << STD_NAMESPACE hex << STD_NAMESPACE setfill('0'); /* print byte values in hex mode */ out << STD_NAMESPACE setw(2) << OFstatic_cast(int, *(byteValues++)); for (unsigned long i = 1; i < count; i++) out << "\\" << STD_NAMESPACE setw(2) << OFstatic_cast(int, *(byteValues++)); /* reset i/o manipulators */ out << STD_NAMESPACE dec << STD_NAMESPACE setfill(' '); } } } } /* XML end tag: */ writeXMLEndTag(out, flags); /* always report success */ return EC_Normal; } /* ** CVS/RCS Log: ** $Log: dcvrobow.cc,v $ ** Revision 1.64 2010-10-29 10:57:21 joergr ** Added support for colored output to the print() method. ** ** Revision 1.63 2010-10-20 16:44:17 joergr ** Use type cast macros (e.g. OFstatic_cast) where appropriate. ** ** Revision 1.62 2010-10-14 13:14:10 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.61 2010-08-18 14:50:06 joergr ** Revised warning message to indicate that existing pixel data raw files are ** never overwritten. ** ** Revision 1.60 2010-04-23 14:30:34 joergr ** Added new method to all VR classes which checks whether the stored value ** conforms to the VR definition and to the specified VM. ** ** Revision 1.59 2009-12-04 17:07:51 joergr ** Sightly modified some log messages. ** ** Revision 1.58 2009-11-04 09:58:10 uli ** Switched to logging mechanism provided by the "new" oflog module ** ** Revision 1.57 2009-09-15 15:02:31 joergr ** Enhanced implementation of writeXML() by writing hex numbers directly to the ** output stream instead of creating a temporary string first. ** ** Revision 1.56 2009-09-15 10:30:31 joergr ** Removed alternative implementation of getOFStringArray(). Now, always the ** OFStringStream approach is used. ** ** Revision 1.55 2009-09-03 17:22:26 joergr ** Fixed issue with getOFStringArray() when using standard C++ string class. ** ** Revision 1.54 2009-04-30 15:09:34 joergr ** Fixed bug in writeXML(): Used wrong byte order for 16-bit data on systems ** with big endian byte-ordering (wrong parameter order for swapBytes() call). ** Fixed memory leak in putElementContent() for base64 encoded data. ** Avoid swapping the byte-ording back to the original state in printPixel(). ** Update the byte order variable in writeXML() and printPixel() if necessary. ** ** Revision 1.53 2008-08-15 09:26:33 meichel ** Under certain conditions (odd length compressed pixel data fragments) ** class DcmOtherByteOtherWord needs to load the attribute value into main ** memory during a write() operation, in order to add a pad byte. A new flag ** compactAfterTransfer now makes sure that the memory is released once the ** write operation has finished, so that only a single fragment at a time ** needs to fully reside in memory. ** ** Revision 1.52 2008-07-17 10:31:32 onken ** Implemented copyFrom() method for complete DcmObject class hierarchy, which ** permits setting an instance's value from an existing object. Implemented ** assignment operator where necessary. ** ** Revision 1.51 2007-11-29 14:30:21 meichel ** Write methods now handle large raw data elements (such as pixel data) ** without loading everything into memory. This allows very large images to ** be sent over a network connection, or to be copied without ever being ** fully in memory. ** ** Revision 1.50 2007/06/29 14:17:49 meichel ** Code clean-up: Most member variables in module dcmdata are now private, ** not protected anymore. ** ** Revision 1.49 2007/06/26 16:24:23 joergr ** Added new variant of encodeBase64() method that outputs directly to a stream ** (avoids using a memory buffer for large binary data). ** ** Revision 1.48 2007/06/07 09:03:18 joergr ** Added createUint8Array() and createUint16Array() methods. ** ** Revision 1.47 2006/10/13 10:11:30 joergr ** Fixed wrong formatting. ** ** Revision 1.46 2006/08/15 15:49:54 meichel ** Updated all code in module dcmdata to correctly compile when ** all standard C++ classes remain in namespace std. ** ** Revision 1.45 2005/12/08 15:41:57 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.44 2005/11/15 16:59:25 meichel ** Added new pseudo VR type EVR_lt that is used for LUT Data when read in ** implicit VR, which may be US, SS or OW. DCMTK always treats EVR_lt like OW. ** ** Revision 1.43 2004/02/04 16:49:49 joergr ** Adapted type casts to new-style typecast operators defined in ofcast.h. ** Removed acknowledgements with e-mail addresses from CVS log. ** ** Revision 1.42 2003/04/17 15:59:45 joergr ** Use method OFString::c_str() instead of OFString::operator[] to avoid range ** checking (which implies an "expensive" strlen() call). ** ** Revision 1.41 2002/12/06 13:12:36 joergr ** Enhanced "print()" function by re-working the implementation and replacing ** the boolean "showFullData" parameter by a more general integer flag. ** Made source code formatting more consistent with other modules/files. ** ** Revision 1.40 2002/11/27 12:06:57 meichel ** Adapted module dcmdata to use of new header file ofstdinc.h ** ** Revision 1.39 2002/08/27 16:55:59 meichel ** Initial release of new DICOM I/O stream classes that add support for stream ** compression (deflated little endian explicit VR transfer syntax) ** ** Revision 1.38 2002/07/08 14:44:42 meichel ** Improved dcmdata behaviour when reading odd tag length. Depending on the ** global boolean flag dcmAcceptOddAttributeLength, the parser now either accepts ** odd length attributes or implements the old behaviour, i.e. assumes a real ** length larger by one. ** ** Revision 1.37 2002/05/14 08:22:56 joergr ** Added support for Base64 (MIME) encoded binary data. ** ** Revision 1.36 2002/04/25 10:32:16 joergr ** Added getOFString() implementation. ** Added/modified getOFStringArray() implementation. ** Added support for XML output of DICOM objects. ** ** Revision 1.35 2002/04/16 13:43:25 joergr ** Added configurable support for C++ ANSI standard includes (e.g. streams). ** ** Revision 1.34 2001/10/02 11:48:33 joergr ** Added getUint8/16 routines to class DcmOtherByteOtherWord. ** ** Revision 1.33 2001/09/25 17:19:58 meichel ** Adapted dcmdata to class OFCondition ** ** Revision 1.32 2001/06/01 15:49:18 meichel ** Updated copyright header ** ** Revision 1.31 2000/11/07 16:56:24 meichel ** Initial release of dcmsign module for DICOM Digital Signatures ** ** Revision 1.30 2000/04/14 15:55:09 meichel ** Dcmdata library code now consistently uses ofConsole for error output. ** ** Revision 1.29 2000/03/08 16:26:49 meichel ** Updated copyright header. ** ** Revision 1.28 2000/03/07 15:41:02 joergr ** Added explicit type casts to make Sun CC 2.0.1 happy. ** ** Revision 1.27 2000/03/06 16:08:05 meichel ** Changed a couple of definitions that implied that Uint32 or size_t are long ** ** Revision 1.26 2000/03/03 14:05:39 meichel ** Implemented library support for redirecting error messages into memory ** instead of printing them to stdout/stderr for GUI applications. ** ** Revision 1.25 2000/02/23 15:12:07 meichel ** Corrected macro for Borland C++ Builder 4 workaround. ** ** Revision 1.24 2000/02/10 16:04:59 joergr ** Enhanced handling of PixelData/Item element. Externally stored raw data is ** now always imported as little endian and swapped if necessary. This change ** reflects the new 'export' feature of dcmdump. ** ** Revision 1.23 2000/02/10 10:52:24 joergr ** Added new feature to dcmdump (enhanced print method of dcmdata): write ** pixel data/item value fields to raw files. ** ** Revision 1.22 2000/02/03 16:55:20 joergr ** Avoid EVR_pixelItem in comparisons (compare with != EVR_OW instead). ** ** Revision 1.21 2000/02/03 16:35:58 joergr ** Corrected bug that caused wrong calculation of group length for sequence ** of items (e.g. encapsulated pixel data). ** ** Revision 1.20 2000/02/01 10:12:11 meichel ** Avoiding to include as extern "C" on Borland C++ Builder 4, ** workaround for bug in compiler header files. ** ** Revision 1.19 1999/03/31 09:25:55 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.18 1997/07/21 08:11:43 andreas ** - Support for CP 14. PixelData and OverlayData can have VR OW or OB ** (depending on the transfer syntax). New internal value ** representation (only for ident()) for OverlayData. ** - New environment for encapsulated pixel representations. DcmPixelData ** can contain different representations and uses codecs to convert ** between them. Codecs are derived from the DcmCodec class. New error ** codes are introduced for handling of representations. New internal ** value representation (only for ident()) for PixelData ** - Replace all boolean types (BOOLEAN, CTNBOOLEAN, DICOM_BOOL, BOOL) ** with one unique boolean type OFBool. ** ** Revision 1.17 1997/07/07 07:51:35 andreas ** - Changed type for Tag attribute in DcmObject from prointer to value ** - Enhanced (faster) byte swapping routine. swapIfNecessary moved from ** a method in DcmObject to a general function. ** ** Revision 1.16 1997/07/03 15:10:15 andreas ** - removed debugging functions Bdebug() and Edebug() since ** they write a static array and are not very useful at all. ** Cdebug and Vdebug are merged since they have the same semantics. ** The debugging functions in dcmdata changed their interfaces ** (see dcmdata/include/dcdebug.h) ** ** Revision 1.15 1997/06/13 13:07:31 andreas ** - Corrected printing of OW values. The length of the output array was ** computed incorrectly. ** ** Revision 1.14 1997/05/27 13:49:03 andreas ** - Add method canWriteXfer to class DcmObject and all derived classes. ** This method checks whether it is possible to convert the original ** transfer syntax to an new transfer syntax. The check is used in the ** dcmconv utility to prohibit the change of a compressed transfer ** syntax to a uncompressed. ** ** Revision 1.13 1997/05/22 16:54:20 andreas ** - Corrected wrong output length in print routine ** ** Revision 1.12 1997/05/16 08:31:28 andreas ** - Revised handling of GroupLength elements and support of ** DataSetTrailingPadding elements. The enumeratio E_GrpLenEncoding ** got additional enumeration values (for a description see dctypes.h). ** addGroupLength and removeGroupLength methods are replaced by ** computeGroupLengthAndPadding. To support Padding, the parameters of ** element and sequence write functions changed. ** ** Revision 1.11 1997/04/18 08:17:20 andreas ** - The put/get-methods for all VRs did not conform to the C++-Standard ** draft. Some Compilers (e.g. SUN-C++ Compiler, Metroworks ** CodeWarrier, etc.) create many warnings concerning the hiding of ** overloaded get methods in all derived classes of DcmElement. ** So the interface of all value representation classes in the ** library are changed rapidly, e.g. ** OFCondition get(Uint16 & value, const unsigned long pos); ** becomes ** OFCondition getUint16(Uint16 & value, const unsigned long pos); ** All (retired) "returntype get(...)" methods are deleted. ** For more information see dcmdata/include/dcelem.h ** ** Revision 1.10 1997/03/26 17:15:59 hewett ** Added very preliminary support for Unknown VR (UN) described in ** Supplement 14. WARNING: handling of unknown attributes with undefined ** length is not yet supported. ** ** Revision 1.9 1996/08/05 08:46:20 andreas ** new print routine with additional parameters: ** - print into files ** - fix output length for elements ** corrected error in search routine with parameter ESM_fromStackTop ** ** Revision 1.8 1996/05/06 10:22:47 meichel ** Copy constructor now handles case when VR=unknown. ** ** Revision 1.7 1996/04/16 16:05:24 andreas ** - better support und bug fixes for NULL element value ** ** Revision 1.6 1996/03/26 09:59:36 meichel ** corrected bug (deletion of const char *) which prevented compilation on NeXT ** ** Revision 1.5 1996/01/29 13:38:33 andreas ** - new put method for every VR to put value as a string ** - better and unique print methods ** ** Revision 1.4 1996/01/09 11:06:50 andreas ** New Support for Visual C++ ** Correct problems with inconsistent const declarations ** Correct error in reading Item Delimitation Elements ** ** Revision 1.3 1996/01/05 13:27:51 andreas ** - changed to support new streaming facilities ** - unique read/write methods for file and block transfer ** - more cleanups ** ** Revision 1.2 1995/11/23 17:03:07 hewett ** Updated for loadable data dictionary. Some cleanup (more to do). ** */ dcmtk-3.6.0/dcmdata/libsrc/dcvrlt.cc0000644000310500011400000001546411457616141016537 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Gerd Ehlers, Andreas Barth * * Purpose: Implementation of class DcmLongText * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-20 16:44:17 $ * CVS/RCS Revision: $Revision: 1.21 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcvrlt.h" // ******************************** DcmLongText::DcmLongText(const DcmTag &tag, const Uint32 len) : DcmCharString(tag, len) { setMaxLength(10240); } DcmLongText::DcmLongText(const DcmLongText& old) : DcmCharString(old) { } DcmLongText::~DcmLongText() { } DcmLongText &DcmLongText::operator=(const DcmLongText &obj) { DcmCharString::operator=(obj); return *this; } OFCondition DcmLongText::copyFrom(const DcmObject& rhs) { if (this != &rhs) { if (rhs.ident() != ident()) return EC_IllegalCall; *this = OFstatic_cast(const DcmLongText &, rhs); } return EC_Normal; } // ******************************** DcmEVR DcmLongText::ident() const { return EVR_LT; } OFCondition DcmLongText::checkValue(const OFString & /*vm*/, const OFBool /*oldFormat*/) { OFString strVal; /* get "raw value" without any modifications (if possible) */ OFCondition l_error = getStringValue(strVal); if (l_error.good()) l_error = DcmLongText::checkStringValue(strVal); return l_error; } unsigned long DcmLongText::getVM() { /* value multiplicity is 1 for non-empty string, 0 otherwise */ return (getRealLength() > 0) ? 1 : 0; } // ******************************** OFCondition DcmLongText::getOFString(OFString &stringVal, const unsigned long /*pos*/, OFBool normalize) { /* treat backslash as a normal character */ return getOFStringArray(stringVal, normalize); } OFCondition DcmLongText::getOFStringArray(OFString &stringVal, OFBool normalize) { /* get string value without handling the "\" as a delimiter */ OFCondition l_error = getStringValue(stringVal); if (l_error.good() && normalize) normalizeString(stringVal, !MULTIPART, !DELETE_LEADING, DELETE_TRAILING); return l_error; } // ******************************** OFCondition DcmLongText::checkStringValue(const OFString &value) { return DcmByteString::checkStringValue(value, "" /* vm */, "lt", 14 /*, maxLength: 10240 characters */); } /* ** CVS/RCS Log: ** $Log: dcvrlt.cc,v $ ** Revision 1.21 2010-10-20 16:44:17 joergr ** Use type cast macros (e.g. OFstatic_cast) where appropriate. ** ** Revision 1.20 2010-10-14 13:14:10 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.19 2010-04-23 14:30:34 joergr ** Added new method to all VR classes which checks whether the stored value ** conforms to the VR definition and to the specified VM. ** ** Revision 1.18 2009-08-03 09:03:00 joergr ** Added methods that check whether a given string value conforms to the VR and ** VM definitions of the DICOM standards. ** ** Revision 1.17 2008-07-17 10:31:32 onken ** Implemented copyFrom() method for complete DcmObject class hierarchy, which ** permits setting an instance's value from an existing object. Implemented ** assignment operator where necessary. ** ** Revision 1.16 2007-06-29 14:17:49 meichel ** Code clean-up: Most member variables in module dcmdata are now private, ** not protected anymore. ** ** Revision 1.15 2005/12/08 15:41:56 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.14 2004/01/16 13:48:20 joergr ** Removed acknowledgements with e-mail addresses from CVS log. ** ** Revision 1.13 2002/12/06 13:05:51 joergr ** Fixed bug in Unlimited Text (UT) class: the backslash character was treated ** as a component separator which is wrong according to the DICOM standard. ** The same bug was found in class Long Text (LT) and Short Text (ST). Also ** changed the behaviour of the getVM() method; now returns 1 only in case of ** non-empty string values. ** Made source code formatting more consistent with other modules/files. ** ** Revision 1.12 2002/04/25 10:31:20 joergr ** Added/modified getOFStringArray() implementation. ** ** Revision 1.11 2001/09/25 17:19:58 meichel ** Adapted dcmdata to class OFCondition ** ** Revision 1.10 2001/06/01 15:49:18 meichel ** Updated copyright header ** ** Revision 1.9 2000/03/08 16:26:48 meichel ** Updated copyright header. ** ** Revision 1.8 1999/03/31 09:25:54 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.7 1998/11/12 16:48:26 meichel ** Implemented operator= for all classes derived from DcmObject. ** ** Revision 1.6 1997/08/29 13:11:47 andreas ** Corrected Bug in getOFStringArray Implementation ** ** Revision 1.5 1997/08/29 08:32:59 andreas ** - Added methods getOFString and getOFStringArray for all ** string VRs. These methods are able to normalise the value, i. e. ** to remove leading and trailing spaces. This will be done only if ** it is described in the standard that these spaces are not relevant. ** These methods do not test the strings for conformance, this means ** especially that they do not delete spaces where they are not allowed! ** getOFStringArray returns the string with all its parts separated by \ ** and getOFString returns only one value of the string. ** CAUTION: Currently getString returns a string with trailing ** spaces removed (if dcmEnableAutomaticInputDataCorrection == OFTrue) and ** truncates the original string (since it is not copied!). If you rely on this ** behaviour please change your application now. ** Future changes will ensure that getString returns the original ** string from the DICOM object (NULL terminated) inclusive padding. ** Currently, if you call getOF... before calling getString without ** normalisation, you can get the original string read from the DICOM object. ** ** Revision 1.4 1997/07/03 15:10:15 andreas ** - removed debugging functions Bdebug() and Edebug() since ** they write a static array and are not very useful at all. ** Cdebug and Vdebug are merged since they have the same semantics. ** The debugging functions in dcmdata changed their interfaces ** (see dcmdata/include/dcdebug.h) ** ** Revision 1.3 1996/01/05 13:27:50 andreas ** - changed to support new streaming facilities ** - unique read/write methods for file and block transfer ** - more cleanups ** */ dcmtk-3.6.0/dcmdata/libsrc/dcerror.cc0000644000310500011400000002505211455601037016667 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Andrew Hewett * * Purpose: Error handling, codes and strings * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:14:07 $ * CVS/RCS Revision: $Revision: 1.26 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcerror.h" const OFConditionConst ECC_InvalidTag( OFM_dcmdata, 1, OF_error, "Invalid tag" ); const OFConditionConst ECC_TagNotFound( OFM_dcmdata, 2, OF_error, "Tag not found" ); const OFConditionConst ECC_InvalidVR( OFM_dcmdata, 3, OF_error, "Invalid VR" ); const OFConditionConst ECC_InvalidStream( OFM_dcmdata, 4, OF_error, "Invalid stream" ); const OFConditionConst ECC_EndOfStream( OFM_dcmdata, 5, OF_error, "End of stream" ); const OFConditionConst ECC_CorruptedData( OFM_dcmdata, 6, OF_error, "Corrupted data" ); const OFConditionConst ECC_IllegalCall( OFM_dcmdata, 7, OF_error, "Illegal call, perhaps wrong parameters" ); const OFConditionConst ECC_SequEnd( OFM_dcmdata, 8, OF_error, "Sequence end" ); const OFConditionConst ECC_DoubledTag( OFM_dcmdata, 9, OF_error, "Doubled tag" ); const OFConditionConst ECC_StreamNotifyClient( OFM_dcmdata, 10, OF_error, "I/O suspension or premature end of stream" ); const OFConditionConst ECC_WrongStreamMode( OFM_dcmdata, 11, OF_error, "Mode (R/W, random/sequence) is wrong" ); const OFConditionConst ECC_ItemEnd( OFM_dcmdata, 12, OF_error, "Item end" ); const OFConditionConst ECC_RepresentationNotFound( OFM_dcmdata, 13, OF_error, "Pixel representation not found" ); const OFConditionConst ECC_CannotChangeRepresentation( OFM_dcmdata, 14, OF_error, "Pixel representation cannot be changed" ); const OFConditionConst ECC_UnsupportedEncoding( OFM_dcmdata, 15, OF_error, "Unsupported compression or encryption" ); // error code 16 is reserved for zlib-related error messages const OFConditionConst ECC_PutbackFailed( OFM_dcmdata, 17, OF_error, "Parser failure: Putback operation failed" ); // error code 18 is reserved for file read error messages // error code 19 is reserved for file write error messages const OFConditionConst ECC_DoubleCompressionFilters( OFM_dcmdata, 20, OF_error, "Too many compression filters" ); const OFConditionConst ECC_ApplicationProfileViolated( OFM_dcmdata, 21, OF_error, "Storage media application profile violated" ); // error code 22 is reserved for dcmodify error messages const OFConditionConst ECC_InvalidOffset( OFM_dcmdata, 23, OF_error, "Invalid offset" ); const OFConditionConst ECC_TooManyBytesRequested( OFM_dcmdata, 24, OF_error, "Too many bytes requested" ); // error code 25 is reserved for tag path parsing error messages const OFConditionConst ECC_InvalidBasicOffsetTable( OFM_dcmdata, 26, OF_error, "Invalid basic offset table" ); const OFConditionConst ECC_ElemLengthLargerThanItem( OFM_dcmdata, 27, OF_error, "Length of element larger than explicit length of surrounding item" ); const OFConditionConst ECC_FileMetaInfoHeaderMissing( OFM_dcmdata, 28, OF_error, "File meta information header missing" ); const OFConditionConst ECC_SeqOrItemContentOverflow( OFM_dcmdata, 29, OF_error, "Item or sequence content exceeds maximum of 32-bit length field"); const OFConditionConst ECC_ValueRepresentationViolated(OFM_dcmdata, 30, OF_error, "Value Representation violated" ); const OFConditionConst ECC_ValueMultiplicityViolated( OFM_dcmdata, 31, OF_error, "Value Multiplicity violated" ); const OFConditionConst ECC_MaximumLengthViolated( OFM_dcmdata, 32, OF_error, "Maximum VR length violated" ); const OFConditionConst ECC_ElemLengthExceeds16BitField(OFM_dcmdata, 33, OF_error, "Length of element value exceeds maximum of 16-bit length field" ); const OFCondition EC_InvalidTag( ECC_InvalidTag); const OFCondition EC_TagNotFound( ECC_TagNotFound); const OFCondition EC_InvalidVR( ECC_InvalidVR); const OFCondition EC_InvalidStream( ECC_InvalidStream); const OFCondition EC_EndOfStream( ECC_EndOfStream); const OFCondition EC_CorruptedData( ECC_CorruptedData); const OFCondition EC_IllegalCall( ECC_IllegalCall); const OFCondition EC_SequEnd( ECC_SequEnd); const OFCondition EC_DoubledTag( ECC_DoubledTag); const OFCondition EC_StreamNotifyClient( ECC_StreamNotifyClient); const OFCondition EC_WrongStreamMode( ECC_WrongStreamMode); const OFCondition EC_ItemEnd( ECC_ItemEnd); const OFCondition EC_RepresentationNotFound( ECC_RepresentationNotFound); const OFCondition EC_CannotChangeRepresentation( ECC_CannotChangeRepresentation); const OFCondition EC_UnsupportedEncoding( ECC_UnsupportedEncoding); const OFCondition EC_PutbackFailed( ECC_PutbackFailed); const OFCondition EC_DoubleCompressionFilters( ECC_DoubleCompressionFilters); const OFCondition EC_ApplicationProfileViolated( ECC_ApplicationProfileViolated); const OFCondition EC_InvalidOffset( ECC_InvalidOffset); const OFCondition EC_TooManyBytesRequested( ECC_TooManyBytesRequested); const OFCondition EC_InvalidBasicOffsetTable( ECC_InvalidBasicOffsetTable); const OFCondition EC_ElemLengthLargerThanItem( ECC_ElemLengthLargerThanItem); const OFCondition EC_FileMetaInfoHeaderMissing( ECC_FileMetaInfoHeaderMissing); const OFCondition EC_SeqOrItemContentOverflow( ECC_SeqOrItemContentOverflow); const OFCondition EC_ValueRepresentationViolated(ECC_ValueRepresentationViolated); const OFCondition EC_ValueMultiplicityViolated( ECC_ValueMultiplicityViolated); const OFCondition EC_MaximumLengthViolated( ECC_MaximumLengthViolated); const OFCondition EC_ElemLengthExceeds16BitField(ECC_ElemLengthExceeds16BitField); const char *dcmErrorConditionToString(OFCondition cond) { return cond.text(); } /* ** CVS/RCS Log: ** $Log: dcerror.cc,v $ ** Revision 1.26 2010-10-14 13:14:07 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.25 2010-02-25 13:51:15 joergr ** Fixed issue with element values which exceed the maximum of a 16-bit length ** field. ** ** Revision 1.24 2009-08-03 09:02:59 joergr ** Added methods that check whether a given string value conforms to the VR and ** VM definitions of the DICOM standards. ** ** Revision 1.23 2009-03-05 13:35:07 onken ** Added checks for sequence and item lengths which prevents overflow in length ** field, if total length of contained items (or sequences) exceeds 32-bit ** length field. Also introduced new flag (default: enabled) for writing ** in explicit length mode, which allows for automatically switching encoding ** of only that very sequence/item to undefined length coding (thus permitting ** to actually write the file). ** ** Revision 1.22 2009-02-11 16:35:27 joergr ** Introduced new error code EC_FileMetaInfoHeaderMissing. ** ** Revision 1.21 2009-02-04 17:59:15 joergr ** Fixed various layout and formatting issues. ** ** Revision 1.20 2009-02-04 14:06:01 onken ** Changed parser to make use of the new error ignoring flag when parsing. ** Added check (makes use of new flag) that notes whether an element's value is ** specified larger than the surrounding item (applicable for explicit length ** coding). ** ** Revision 1.19 2009-02-04 10:16:51 joergr ** Introduced new error code EC_InvalidBasicOffsetTable. ** ** Revision 1.18 2008-12-05 13:51:13 onken ** Introduced new error code number for specific findOrCreatePath() errors. ** ** Revision 1.17 2007-06-13 14:45:47 meichel ** Added module code OFM_dcmjpls and some new error codes. ** ** Revision 1.16 2005/12/08 15:41:09 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.15 2004/11/05 17:20:31 onken ** Added reservation for dcmodify error messages. ** ** Revision 1.14 2002/12/06 12:18:57 joergr ** Added new error status "EC_ApplicationProfileViolated". ** ** Revision 1.13 2002/08/27 16:55:47 meichel ** Initial release of new DICOM I/O stream classes that add support for stream ** compression (deflated little endian explicit VR transfer syntax) ** ** Revision 1.12 2001/09/25 17:19:50 meichel ** Adapted dcmdata to class OFCondition ** ** Revision 1.11 2001/06/01 15:49:04 meichel ** Updated copyright header ** ** Revision 1.10 2000/03/08 16:26:35 meichel ** Updated copyright header. ** ** Revision 1.9 2000/02/23 15:11:52 meichel ** Corrected macro for Borland C++ Builder 4 workaround. ** ** Revision 1.8 2000/02/01 10:12:07 meichel ** Avoiding to include as extern "C" on Borland C++ Builder 4, ** workaround for bug in compiler header files. ** ** Revision 1.7 1999/03/31 09:25:27 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.6 1997/10/01 08:44:12 meichel ** Including if available. ** ** Revision 1.5 1997/07/21 08:17:41 andreas ** - New environment for encapsulated pixel representations. DcmPixelData ** can contain different representations and uses codecs to convert ** between them. Codecs are derived from the DcmCodec class. New error ** codes are introduced for handling of representations. New internal ** value representation (only for ident()) for PixelData ** ** Revision 1.4 1997/05/22 16:55:05 andreas ** - Added new error code EC_NotImplemented ** ** Revision 1.3 1996/01/29 13:38:26 andreas ** - new put method for every VR to put value as a string ** - better and unique print methods ** ** Revision 1.2 1996/01/05 13:27:36 andreas ** - changed to support new streaming facilities ** - unique read/write methods for file and block transfer ** - more cleanups ** ** Revision 1.1 1995/11/23 17:02:44 hewett ** Updated for loadable data dictionary. Some cleanup (more to do). ** */ dcmtk-3.6.0/dcmdata/libsrc/dcxfer.cc0000644000310500011400000004653511455601043016510 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Gerd Ehlers * * Purpose: handling of transfer syntaxes * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:14:11 $ * CVS/RCS Revision: $Revision: 1.33 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcxfer.h" #include "dcmtk/dcmdata/dcuid.h" #define INCLUDE_CSTRING #include "dcmtk/ofstd/ofstdinc.h" typedef struct { const char *xferID; const char *xferName; E_TransferSyntax xfer; E_ByteOrder byteOrder; E_VRType vrType; E_JPEGEncapsulated encapsulated; Uint32 JPEGProcess8; Uint32 JPEGProcess12; OFBool retired; E_StreamCompression streamCompression; } S_XferNames; #define ERROR_XferName "Unknown Transfer Syntax" const S_XferNames XferNames[] = { { UID_LittleEndianImplicitTransferSyntax, "Little Endian Implicit", EXS_LittleEndianImplicit, EBO_LittleEndian, EVT_Implicit, EJE_NotEncapsulated, 0L, 0L, OFFalse, ESC_none }, { "", // illegal type "Virtual Big Endian Implicit", EXS_BigEndianImplicit, EBO_BigEndian, EVT_Implicit, EJE_NotEncapsulated, 0L, 0L, OFFalse, ESC_none }, { UID_LittleEndianExplicitTransferSyntax, "Little Endian Explicit", EXS_LittleEndianExplicit, EBO_LittleEndian, EVT_Explicit, EJE_NotEncapsulated, 0L, 0L, OFFalse, ESC_none }, { UID_BigEndianExplicitTransferSyntax, // defined in dctypes.h "Big Endian Explicit", EXS_BigEndianExplicit, EBO_BigEndian, EVT_Explicit, EJE_NotEncapsulated, 0L, 0L, OFTrue, ESC_none }, { UID_JPEGProcess1TransferSyntax, "JPEG Baseline", EXS_JPEGProcess1TransferSyntax, EBO_LittleEndian, EVT_Explicit, EJE_Encapsulated, 1L, 1L, OFFalse, ESC_none }, { UID_JPEGProcess2_4TransferSyntax, "JPEG Extended, Process 2+4", EXS_JPEGProcess2_4TransferSyntax, EBO_LittleEndian, EVT_Explicit, EJE_Encapsulated, 2L ,4L, OFFalse, ESC_none }, { UID_JPEGProcess3_5TransferSyntax, "JPEG Extended, Process 3+5", EXS_JPEGProcess3_5TransferSyntax, EBO_LittleEndian, EVT_Explicit, EJE_Encapsulated, 3L ,5L, OFTrue, ESC_none }, { UID_JPEGProcess6_8TransferSyntax, "JPEG Spectral Selection, Non-hierarchical, Process 6+8", EXS_JPEGProcess6_8TransferSyntax, EBO_LittleEndian, EVT_Explicit, EJE_Encapsulated, 6L ,8L, OFTrue, ESC_none }, { UID_JPEGProcess7_9TransferSyntax, "JPEG Spectral Selection, Non-hierarchical, Process 7+9", EXS_JPEGProcess7_9TransferSyntax, EBO_LittleEndian, EVT_Explicit, EJE_Encapsulated, 7L ,9L, OFTrue, ESC_none }, { UID_JPEGProcess10_12TransferSyntax, "JPEG Full Progression, Non-hierarchical, Process 10+12", EXS_JPEGProcess10_12TransferSyntax, EBO_LittleEndian, EVT_Explicit, EJE_Encapsulated, 10L ,12L, OFTrue, ESC_none }, { UID_JPEGProcess11_13TransferSyntax, "JPEG Full Progression, Non-hierarchical, Process 11+13", EXS_JPEGProcess11_13TransferSyntax, EBO_LittleEndian, EVT_Explicit, EJE_Encapsulated, 11L ,13L, OFTrue, ESC_none }, { UID_JPEGProcess14TransferSyntax, "JPEG Lossless, Non-hierarchical, Process 14", EXS_JPEGProcess14TransferSyntax, EBO_LittleEndian, EVT_Explicit, EJE_Encapsulated, 14L ,14L, OFFalse, ESC_none }, { UID_JPEGProcess15TransferSyntax, "JPEG Lossless, Non-hierarchical, Process 15", EXS_JPEGProcess15TransferSyntax, EBO_LittleEndian, EVT_Explicit, EJE_Encapsulated, 15L ,15L, OFTrue, ESC_none }, { UID_JPEGProcess16_18TransferSyntax, "JPEG Extended, Hierarchical, Process 16+18", EXS_JPEGProcess16_18TransferSyntax, EBO_LittleEndian, EVT_Explicit, EJE_Encapsulated, 16L ,18L, OFTrue, ESC_none }, { UID_JPEGProcess17_19TransferSyntax, "JPEG Extended, Hierarchical, Process 17+19", EXS_JPEGProcess17_19TransferSyntax, EBO_LittleEndian, EVT_Explicit, EJE_Encapsulated, 17L ,19L, OFTrue, ESC_none }, { UID_JPEGProcess20_22TransferSyntax, "JPEG Spectral Selection, Hierarchical, Process 20+22", EXS_JPEGProcess20_22TransferSyntax, EBO_LittleEndian, EVT_Explicit, EJE_Encapsulated, 20L ,22L, OFTrue, ESC_none }, { UID_JPEGProcess21_23TransferSyntax, "JPEG Spectral Selection, Hierarchical, Process 21+23", EXS_JPEGProcess21_23TransferSyntax, EBO_LittleEndian, EVT_Explicit, EJE_Encapsulated, 21L ,23L, OFTrue, ESC_none }, { UID_JPEGProcess24_26TransferSyntax, "JPEG Full Progression, Hierarchical, Process 24+26", EXS_JPEGProcess24_26TransferSyntax, EBO_LittleEndian, EVT_Explicit, EJE_Encapsulated, 24L ,26L, OFTrue, ESC_none }, { UID_JPEGProcess25_27TransferSyntax, "JPEG Full Progression, Hierarchical, Process 25+27", EXS_JPEGProcess25_27TransferSyntax, EBO_LittleEndian, EVT_Explicit, EJE_Encapsulated, 25L ,27L, OFTrue, ESC_none }, { UID_JPEGProcess28TransferSyntax, "JPEG Lossless, Hierarchical, Process 28", EXS_JPEGProcess28TransferSyntax, EBO_LittleEndian, EVT_Explicit, EJE_Encapsulated, 28L ,28L, OFTrue, ESC_none }, { UID_JPEGProcess29TransferSyntax, "JPEG Lossless, Hierarchical, Process 29", EXS_JPEGProcess29TransferSyntax, EBO_LittleEndian, EVT_Explicit, EJE_Encapsulated, 29L ,29L, OFTrue, ESC_none }, { UID_JPEGProcess14SV1TransferSyntax, "JPEG Lossless, Non-hierarchical, 1st Order Prediction", EXS_JPEGProcess14SV1TransferSyntax, EBO_LittleEndian, EVT_Explicit, EJE_Encapsulated, 14L ,14L, OFFalse, ESC_none }, { UID_RLELosslessTransferSyntax, "RLE Lossless", EXS_RLELossless, EBO_LittleEndian, EVT_Explicit, EJE_Encapsulated, 0L, 0L, OFFalse, ESC_none }, { UID_JPEGLSLosslessTransferSyntax, "JPEG-LS Lossless", EXS_JPEGLSLossless, EBO_LittleEndian, EVT_Explicit, EJE_Encapsulated, 0L, 0L, OFFalse, ESC_none }, { UID_JPEGLSLossyTransferSyntax, "JPEG-LS Lossy (Near-lossless)", EXS_JPEGLSLossy, EBO_LittleEndian, EVT_Explicit, EJE_Encapsulated, 0L, 0L, OFFalse, ESC_none }, { UID_DeflatedExplicitVRLittleEndianTransferSyntax, "Deflated Explicit VR Little Endian", EXS_DeflatedLittleEndianExplicit, EBO_LittleEndian, EVT_Explicit, EJE_NotEncapsulated, 0L, 0L, OFFalse, #ifdef WITH_ZLIB ESC_zlib #else ESC_unsupported #endif }, { UID_JPEG2000LosslessOnlyTransferSyntax, "JPEG 2000 (Lossless only)", EXS_JPEG2000LosslessOnly, EBO_LittleEndian, EVT_Explicit, EJE_Encapsulated, 0L, 0L, OFFalse, ESC_none }, { UID_JPEG2000TransferSyntax, "JPEG 2000 (Lossless or Lossy)", EXS_JPEG2000, EBO_LittleEndian, EVT_Explicit, EJE_Encapsulated, 0L, 0L, OFFalse, ESC_none }, { UID_MPEG2MainProfileAtMainLevelTransferSyntax, "MPEG2 Main Profile @ Main Level", EXS_MPEG2MainProfileAtMainLevel, EBO_LittleEndian, EVT_Explicit, EJE_Encapsulated, 0L, 0L, OFFalse, ESC_none }, { UID_MPEG2MainProfileAtHighLevelTransferSyntax, "MPEG2 Main Profile @ High Level", EXS_MPEG2MainProfileAtHighLevel, EBO_LittleEndian, EVT_Explicit, EJE_Encapsulated, 0L, 0L, OFFalse, ESC_none }, { UID_JPEG2000Part2MulticomponentImageCompressionLosslessOnlyTransferSyntax, "JPEG 2000 Part 2 Multicomponent Image Compression (Lossless only)", EXS_JPEG2000MulticomponentLosslessOnly, EBO_LittleEndian, EVT_Explicit, EJE_Encapsulated, 0L, 0L, OFFalse, ESC_none }, { UID_JPEG2000Part2MulticomponentImageCompressionTransferSyntax, "JPEG 2000 Part 2 Multicomponent Image Compression (Lossless or Lossy)", EXS_JPEG2000Multicomponent, EBO_LittleEndian, EVT_Explicit, EJE_Encapsulated, 0L, 0L, OFFalse, ESC_none }, { UID_JPIPReferencedTransferSyntax, "JPIP Referenced", EXS_JPIPReferenced, EBO_LittleEndian, EVT_Explicit, EJE_NotEncapsulated, // in fact, pixel data shall be referenced via (0028,7FE0) Pixel Data Provider URL 0L, 0L, OFFalse, ESC_none }, { UID_JPIPReferencedDeflateTransferSyntax, "JPIP Referenced Deflate", EXS_JPIPReferencedDeflate, EBO_LittleEndian, EVT_Explicit, EJE_NotEncapsulated, // in fact, pixel data shall be referenced via (0028,7FE0) Pixel Data Provider URL 0L, 0L, OFFalse, #ifdef WITH_ZLIB ESC_zlib #else ESC_unsupported #endif } // enter further transfer syntaxes here ... }; const int DIM_OF_XferNames = (sizeof(XferNames) / sizeof(S_XferNames)); // ******************************** DcmXfer::DcmXfer(E_TransferSyntax xfer) : xferID(""), xferName(ERROR_XferName), xferSyn(EXS_Unknown), byteOrder(EBO_unknown), vrType(EVT_Implicit), encapsulated(EJE_NotEncapsulated), JPEGProcess8(0L), JPEGProcess12(0L), retired(OFFalse), streamCompression(ESC_none) { int i = 0; while ((i < DIM_OF_XferNames) && XferNames[i].xfer != xfer) i++; if ((i < DIM_OF_XferNames) && (XferNames[i].xfer == xfer)) { xferSyn = XferNames[i].xfer; xferID = XferNames[i].xferID; xferName = XferNames[i].xferName; byteOrder = XferNames[i].byteOrder; vrType = XferNames[i].vrType; encapsulated = XferNames[i].encapsulated; JPEGProcess8 = XferNames[i].JPEGProcess8; JPEGProcess12 = XferNames[i].JPEGProcess12; retired = XferNames[i].retired; streamCompression = XferNames[i].streamCompression; } } // ******************************** DcmXfer::DcmXfer(const char* xferName_xferID) : xferID(""), xferName(ERROR_XferName), xferSyn(EXS_Unknown), byteOrder(EBO_unknown), vrType(EVT_Implicit), encapsulated(EJE_NotEncapsulated), JPEGProcess8(0L), JPEGProcess12(0L), retired(OFFalse), streamCompression(ESC_none) { const char* xname = xferName_xferID; if (xname != NULL) { int i = 0; while ((i < DIM_OF_XferNames) && (strcmp(XferNames[i].xferID, xname) != 0)) i++; if ((i < DIM_OF_XferNames) && (strcmp(XferNames[i].xferID, xname) == 0)) { xferSyn = XferNames[i].xfer; xferID = XferNames[i].xferID; xferName = XferNames[i].xferName; byteOrder = XferNames[i].byteOrder; vrType = XferNames[i].vrType; encapsulated = XferNames[i].encapsulated; JPEGProcess8 = XferNames[i].JPEGProcess8; JPEGProcess12 = XferNames[i].JPEGProcess12; retired = XferNames[i].retired; streamCompression = XferNames[i].streamCompression; } else { i = 0; while ((i < DIM_OF_XferNames) && (strcmp(XferNames[i].xferName, xname) != 0)) i++; if ((i < DIM_OF_XferNames) && (strcmp(XferNames[i].xferName, xname) == 0)) { xferSyn = XferNames[i].xfer; xferID = XferNames[i].xferID; xferName = XferNames[i].xferName; byteOrder = XferNames[i].byteOrder; vrType = XferNames[i].vrType; encapsulated = XferNames[i].encapsulated; JPEGProcess8 = XferNames[i].JPEGProcess8; JPEGProcess12 = XferNames[i].JPEGProcess12; retired = XferNames[i].retired; streamCompression = XferNames[i].streamCompression; } } } } // ******************************** DcmXfer::DcmXfer(const DcmXfer &newXfer) : xferID(newXfer.xferID), xferName(newXfer.xferName), xferSyn(newXfer.xferSyn), byteOrder(newXfer.byteOrder), vrType(newXfer.vrType), encapsulated(newXfer.encapsulated), JPEGProcess8(newXfer.JPEGProcess8), JPEGProcess12(newXfer.JPEGProcess12), retired(newXfer.retired), streamCompression(newXfer.streamCompression) { } // ******************************** DcmXfer::~DcmXfer() { } // ******************************** DcmXfer &DcmXfer::operator=(const E_TransferSyntax xfer) { int i = 0; while ((i < DIM_OF_XferNames) && (XferNames[i].xfer != xfer)) i++; if ((i < DIM_OF_XferNames) && (XferNames[i].xfer == xfer)) { xferSyn = XferNames[i].xfer; xferID = XferNames[i].xferID; xferName = XferNames[i].xferName; byteOrder = XferNames[i].byteOrder; vrType = XferNames[i].vrType; encapsulated = XferNames[i].encapsulated; JPEGProcess8 = XferNames[i].JPEGProcess8; JPEGProcess12 = XferNames[i].JPEGProcess12; retired = XferNames[i].retired; streamCompression = XferNames[i].streamCompression; } else { xferSyn = EXS_Unknown; xferID = ""; xferName = ERROR_XferName; byteOrder = EBO_unknown; vrType = EVT_Implicit; encapsulated = EJE_NotEncapsulated; JPEGProcess8 = 0L; JPEGProcess12 = 0L; retired = OFFalse; streamCompression = ESC_none; } return *this; } // ******************************** DcmXfer &DcmXfer::operator=(const DcmXfer &newXfer) { if (this != &newXfer) { xferSyn = newXfer.xferSyn; xferID = newXfer.xferID; xferName = newXfer.xferName; byteOrder = newXfer.byteOrder; vrType = newXfer.vrType; encapsulated = newXfer.encapsulated; JPEGProcess8 = newXfer.JPEGProcess8; JPEGProcess12 = newXfer.JPEGProcess12; retired = newXfer.retired; streamCompression = newXfer.streamCompression; } return *this; } // ******************************** Uint32 DcmXfer::sizeofTagHeader(DcmEVR evr) const { Uint32 len = 0; if (isExplicitVR()) { // some VRs have an extended format DcmVR vr(evr); if (vr.usesExtendedLengthEncoding()) { len = 12; // for Tag, Length, VR und reserved } else { len = 8; // for Tag, Length und VR } } else { // all implicit VRs have the same format len = 8; // for Tag und Length } return len; } // ******************************** static E_ByteOrder FindMachineTransferSyntax() { E_ByteOrder localByteOrderFlag; union { Uint32 ul; char uc[4]; } tl; union { Uint16 us; char uc[2]; } ts; tl.ul = 1; ts.us = 1; if (tl.uc[0] == 1 && !(tl.uc[1] | tl.uc[2] | tl.uc[3]) && ts.uc[0] == 1 && !(ts.uc[1])) localByteOrderFlag = EBO_LittleEndian; else if (tl.uc[3] == 1 && !(tl.uc[0] | tl.uc[1] | tl.uc[2]) && ts.uc[1] == 1 && !(ts.uc[0])) localByteOrderFlag = EBO_BigEndian; else localByteOrderFlag = EBO_unknown; return localByteOrderFlag; } // global constant: local byte order (little or big endian) const E_ByteOrder gLocalByteOrder = FindMachineTransferSyntax(); /* * CVS/RCS Log: * $Log: dcxfer.cc,v $ * Revision 1.33 2010-10-14 13:14:11 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.32 2010-10-01 10:21:05 uli * Fixed most compiler warnings from -Wall -Wextra -pedantic in dcmdata. * * Revision 1.31 2010-09-15 08:53:05 joergr * Added definition of XML encoding transfer syntax (Supplement 114) and JPIP * referenced transfer syntaxes (Supplement 106). * * Revision 1.30 2010-09-02 12:12:46 joergr * Added support for "MPEG2 Main Profile @ High Level" transfer syntax. * * Revision 1.29 2009-11-04 09:58:11 uli * Switched to logging mechanism provided by the "new" oflog module * * Revision 1.28 2008-04-23 06:39:34 meichel * Added new method DcmXfer::isRetired that returns true for * retired transfer syntaxes. * * Revision 1.27 2007/11/29 14:30:21 meichel * Write methods now handle large raw data elements (such as pixel data) * without loading everything into memory. This allows very large images to * be sent over a network connection, or to be copied without ever being * fully in memory. * * Revision 1.26 2007/02/22 12:49:28 joergr * Fixed inconsistent naming of transfer syntaxes (added space characters). * * Revision 1.25 2005/12/08 15:42:11 meichel * Changed include path schema for all DCMTK header files * * Revision 1.24 2005/10/25 08:55:34 meichel * Updated list of UIDs and added support for new transfer syntaxes * and storage SOP classes. * * Revision 1.23 2004/04/06 18:09:14 joergr * Updated data dictionary, UIDs and transfer syntaxes for the latest Final Text * Supplements (42 and 47) and Correction Proposals (CP 25). * Added missing suffix "TransferSyntax" to some transfer syntax constants. * * Revision 1.22 2004/01/16 13:44:46 joergr * Adapted type casts to new-style typecast operators defined in ofcast.h. * * Revision 1.21 2002/11/29 17:06:50 joergr * Fixed doc++ warning about different number of opening and closing brackets. * Replaced German comments by English translations. * * Revision 1.20 2002/11/27 12:07:01 meichel * Adapted module dcmdata to use of new header file ofstdinc.h * * Revision 1.19 2002/08/27 16:56:01 meichel * Initial release of new DICOM I/O stream classes that add support for stream * compression (deflated little endian explicit VR transfer syntax) * * Revision 1.18 2002/06/19 15:35:01 meichel * Fixed typo in transfer syntax name * * Revision 1.17 2001/11/08 16:17:34 meichel * Updated data dictionary, UIDs and transfer syntaxes for DICOM 2001 edition. * * Revision 1.16 2001/06/01 15:49:23 meichel * Updated copyright header * * Revision 1.15 2001/01/17 10:20:38 meichel * Added toolkit support for JPEG-LS transfer syntaxes * * Revision 1.14 2000/04/14 16:10:35 meichel * Minor changes for thread safety. * * Revision 1.13 2000/03/08 16:26:53 meichel * Updated copyright header. * * Revision 1.12 1999/03/31 09:26:05 meichel * Updated copyright header in module dcmdata * * */ dcmtk-3.6.0/dcmdata/libsrc/dcstack.cc0000644000310500011400000001504611455601041016640 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Gerd Ehlers * * Purpose: stack class * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:14:09 $ * CVS/RCS Revision: $Revision: 1.20 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #define INCLUDE_CSTDLIB #include "dcmtk/ofstd/ofstdinc.h" #include "dcmtk/ofstd/ofcast.h" #include "dcmtk/ofstd/ofstream.h" #include "dcmtk/dcmdata/dcstack.h" // ************************************************ // *** DcmStackNode() ***************************** // ************************************************ DcmStackNode::DcmStackNode( DcmObject *obj ) : link(NULL), objNodeValue(obj) { } // ******************************** DcmStackNode::~DcmStackNode() { } // ******************************** DcmObject* DcmStackNode::value() const { return objNodeValue; } // ************************************************ // *** DcmStack() ********************************* // ************************************************ DcmStack::DcmStack() : topNode_(NULL), cardinality_(0) { } // ************************************************ DcmStack::DcmStack( const DcmStack & oldStack) : topNode_(NULL), cardinality_(oldStack.cardinality_) { if (cardinality_) { topNode_ = new DcmStackNode(oldStack.topNode_->objNodeValue); DcmStackNode * oldPtr = oldStack.topNode_->link; DcmStackNode * newPtr = topNode_; while (oldPtr) { newPtr->link = new DcmStackNode(oldPtr->objNodeValue); oldPtr = oldPtr->link; newPtr = newPtr->link; } } } // ******************************** DcmStack::~DcmStack() { clear(); } // ******************************** void DcmStack::clear() { DcmStackNode *node; while (topNode_ != NULL) { node = topNode_; topNode_ = topNode_->link; delete node; } cardinality_ = 0; } // ******************************** DcmObject* DcmStack::push( DcmObject *obj ) { if ( obj != NULL ) { DcmStackNode *node = new DcmStackNode( obj ); node->link = topNode_; topNode_ = node; cardinality_++; } return obj; } // ******************************** DcmObject* DcmStack::pop() { DcmObject *obj; DcmStackNode *node; if ( topNode_ != NULL ) { obj = topNode_->value(); node = topNode_; topNode_ = topNode_->link; delete node; cardinality_--; } else obj = NULL; return obj; } // ******************************** DcmObject* DcmStack::elem(const unsigned long number) const { unsigned long num = number; DcmObject *obj; DcmStackNode *node = topNode_; while ( num-- > 0 && node != NULL ) node = node->link; if ( node != NULL ) obj = node->value(); else obj = NULL; return obj; } // ******************************** DcmObject* DcmStack::top() const { DcmObject *obj; if ( topNode_ != NULL ) obj = topNode_->value(); else obj = NULL; return obj; } // ******************************** unsigned long DcmStack::card() const { return cardinality_; } // ******************************** OFBool DcmStack::empty() const { return OFstatic_cast(OFBool, topNode_ == NULL ); } DcmStack& DcmStack::operator=(const DcmStack& arg) { if (this != &arg) { clear(); cardinality_ = arg.cardinality_; if (cardinality_) { topNode_ = new DcmStackNode(arg.topNode_->objNodeValue); DcmStackNode * oldPtr = arg.topNode_->link; DcmStackNode * newPtr = topNode_; while (oldPtr) { newPtr->link = new DcmStackNode(oldPtr->objNodeValue); oldPtr = oldPtr->link; newPtr = newPtr->link; } } } return *this; } OFBool DcmStack::operator<(const DcmStack& arg) const { if (cardinality_ < arg.cardinality_) return OFTrue; if (cardinality_ > arg.cardinality_) return OFFalse; // cardinality_ is equal. Now walk through stack and do pointer arithmetics DcmStackNode * thisPtr = topNode_; DcmStackNode * argPtr = arg.topNode_; while (thisPtr) { if (thisPtr->objNodeValue < argPtr->objNodeValue) return OFTrue; if (thisPtr->objNodeValue > argPtr->objNodeValue) return OFFalse; thisPtr = thisPtr->link; argPtr = argPtr->link; } return OFFalse; // stacks are equal } OFBool DcmStack::operator==(const DcmStack& arg) const { if (cardinality_ != arg.cardinality_) return OFFalse; DcmStackNode * thisPtr = topNode_; DcmStackNode * argPtr = arg.topNode_; while (thisPtr) { if (thisPtr->objNodeValue != argPtr->objNodeValue) return OFFalse; thisPtr = thisPtr->link; argPtr = argPtr->link; } return OFTrue; } /* * CVS/RCS Log: * $Log: dcstack.cc,v $ * Revision 1.20 2010-10-14 13:14:09 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.19 2009-11-04 09:58:10 uli * Switched to logging mechanism provided by the "new" oflog module * * Revision 1.18 2005-12-08 15:41:37 meichel * Changed include path schema for all DCMTK header files * * Revision 1.17 2004/02/04 16:44:23 joergr * Adapted type casts to new-style typecast operators defined in ofcast.h. * Removed acknowledgements with e-mail addresses from CVS log. * * Revision 1.16 2003/06/02 16:52:26 meichel * Cleaned up implementation of DcmStack, added doc++ comments * * Revision 1.15 2002/11/27 12:06:52 meichel * Adapted module dcmdata to use of new header file ofstdinc.h * * Revision 1.14 2002/04/16 13:43:21 joergr * Added configurable support for C++ ANSI standard includes (e.g. streams). * * Revision 1.13 2001/06/01 15:49:09 meichel * Updated copyright header * * Revision 1.12 2000/03/08 16:26:41 meichel * Updated copyright header. * * Revision 1.11 2000/02/23 15:12:02 meichel * Corrected macro for Borland C++ Builder 4 workaround. * * Revision 1.10 2000/02/01 10:12:10 meichel * Avoiding to include as extern "C" on Borland C++ Builder 4, * workaround for bug in compiler header files. * * Revision 1.9 1999/03/31 09:25:39 meichel * Updated copyright header in module dcmdata * * */ dcmtk-3.6.0/dcmdata/libsrc/dcvrda.cc0000644000310500011400000002617111457616141016501 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Gerd Ehlers, Andreas Barth, Joerg Riesmeier * * Purpose: Implementation of class DcmDate * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-20 16:44:17 $ * CVS/RCS Revision: $Revision: 1.23 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcvrda.h" #define INCLUDE_CSTDIO #include "dcmtk/ofstd/ofstdinc.h" // ******************************** DcmDate::DcmDate(const DcmTag &tag, const Uint32 len) : DcmByteString(tag, len) { setMaxLength(10); setNonSignificantChars("\\"); } DcmDate::DcmDate(const DcmDate &old) : DcmByteString(old) { } DcmDate::~DcmDate() { } DcmDate &DcmDate::operator=(const DcmDate &obj) { DcmByteString::operator=(obj); return *this; } OFCondition DcmDate::copyFrom(const DcmObject& rhs) { if (this != &rhs) { if (rhs.ident() != ident()) return EC_IllegalCall; *this = OFstatic_cast(const DcmDate &, rhs); } return EC_Normal; } // ******************************** DcmEVR DcmDate::ident() const { return EVR_DA; } OFCondition DcmDate::checkValue(const OFString &vm, const OFBool oldFormat) { OFString strVal; /* get "raw value" without any modifications (if possible) */ OFCondition l_error = getStringValue(strVal); if (l_error.good()) l_error = DcmDate::checkStringValue(strVal, vm, oldFormat); return l_error; } // ******************************** OFCondition DcmDate::getOFString(OFString &stringVal, const unsigned long pos, OFBool normalize) { OFCondition l_error = DcmByteString::getOFString(stringVal, pos, normalize); if (l_error.good() && normalize) normalizeString(stringVal, !MULTIPART, !DELETE_LEADING, DELETE_TRAILING); return l_error; } // ******************************** OFCondition DcmDate::getOFDate(OFDate &dateValue, const unsigned long pos, const OFBool supportOldFormat) { OFString dicomDate; /* convert the current element value to OFDate format */ OFCondition l_error = getOFString(dicomDate, pos); if (l_error.good()) l_error = getOFDateFromString(dicomDate, dateValue, supportOldFormat); else dateValue.clear(); return l_error; } OFCondition DcmDate::getISOFormattedDate(OFString &formattedDate, const unsigned long pos, const OFBool supportOldFormat) { OFString dicomDate; /* get current element value and convert to ISO formatted date */ OFCondition l_error = getOFString(dicomDate, pos); if (l_error.good()) l_error = getISOFormattedDateFromString(dicomDate, formattedDate, supportOldFormat); else formattedDate.clear(); return l_error; } OFCondition DcmDate::setCurrentDate() { OFString dicomDate; /* set the element value to the current system date */ OFCondition l_error = getCurrentDate(dicomDate); if (l_error.good()) l_error = putString(dicomDate.c_str()); return l_error; } OFCondition DcmDate::setOFDate(const OFDate &dateValue) { OFString dicomDate; /* convert OFDate value to DICOM DA format and set the element value */ OFCondition l_error = getDicomDateFromOFDate(dateValue, dicomDate); if (l_error.good()) l_error = putString(dicomDate.c_str()); return l_error; } // ******************************** OFCondition DcmDate::getCurrentDate(OFString &dicomDate) { OFCondition l_error = EC_IllegalCall; OFDate dateValue; /* get the current system date */ if (dateValue.setCurrentDate()) { /* format: YYYYMMDD */ if (dateValue.getISOFormattedDate(dicomDate, OFFalse /*showDelimiter*/)) l_error = EC_Normal; } /* set default date if an error occurred */ if (l_error.bad()) { /* format: YYYYMMDD */ dicomDate = "19000101"; } return l_error; } OFCondition DcmDate::getDicomDateFromOFDate(const OFDate &dateValue, OFString &dicomDate) { OFCondition l_error = EC_IllegalParameter; /* convert OFDate value to DICOM DA format */ if (dateValue.getISOFormattedDate(dicomDate, OFFalse /*showDelimiter*/)) l_error = EC_Normal; return l_error; } OFCondition DcmDate::getOFDateFromString(const OFString &dicomDate, OFDate &dateValue, const OFBool supportOldFormat) { OFCondition l_error = EC_IllegalParameter; /* clear result variable */ dateValue.clear(); /* fixed length (8 or 10 bytes) required by DICOM part 5 */ if ((dicomDate.length() == 8) && (dicomDate.find('.') == OFString_npos)) { unsigned int year, month, day; /* extract components from date string */ if (sscanf(dicomDate.c_str(), "%04u%02u%02u", &year, &month, &day) == 3) { if (dateValue.setDate(year, month, day)) l_error = EC_Normal; } } /* old prior V3.0 version of VR=DA: YYYY.MM.DD */ else if (supportOldFormat && (dicomDate.length() == 10) && (dicomDate[4] == '.') && (dicomDate[7] == '.')) { unsigned int year, month, day; /* extract components from date string */ if (sscanf(dicomDate.c_str(), "%04u.%02u.%02u", &year, &month, &day) == 3) { if (dateValue.setDate(year, month, day)) l_error = EC_Normal; } } return l_error; } OFCondition DcmDate::getISOFormattedDateFromString(const OFString &dicomDate, OFString &formattedDate, const OFBool supportOldFormat) { OFDate dateValue; /* convert string to OFDate */ OFCondition l_error = getOFDateFromString(dicomDate, dateValue, supportOldFormat); if (l_error.good()) { /* convert OFDate to ISO formatted date */ if (!dateValue.getISOFormattedDate(formattedDate)) l_error = EC_CorruptedData; } /* in case of error clear result variable */ if (l_error.bad()) formattedDate.clear(); return l_error; } // ******************************** OFCondition DcmDate::checkStringValue(const OFString &value, const OFString &vm, const OFBool oldFormat) { OFCondition result = EC_Normal; const size_t valLen = value.length(); if (valLen > 0) { size_t posStart = 0; unsigned long vmNum = 0; /* iterate over all value components */ while (posStart != OFString_npos) { ++vmNum; /* search for next component separator */ const size_t posEnd = value.find('\\', posStart); const size_t length = (posEnd == OFString_npos) ? valLen - posStart : posEnd - posStart; /* check value representation */ const int vrID = DcmElement::scanValue(value, "da", posStart, length); if ((vrID != 2) && (!oldFormat || (vrID != 3)) && (vrID != 17)) { result = EC_ValueRepresentationViolated; break; } posStart = (posEnd == OFString_npos) ? posEnd : posEnd + 1; } if (result.good() && !vm.empty()) { /* check value multiplicity */ result = DcmElement::checkVM(vmNum, vm); } } return result; } /* ** CVS/RCS Log: ** $Log: dcvrda.cc,v $ ** Revision 1.23 2010-10-20 16:44:17 joergr ** Use type cast macros (e.g. OFstatic_cast) where appropriate. ** ** Revision 1.22 2010-10-14 13:14:10 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.21 2010-04-23 14:30:34 joergr ** Added new method to all VR classes which checks whether the stored value ** conforms to the VR definition and to the specified VM. ** ** Revision 1.20 2009-08-07 14:35:49 joergr ** Enhanced isEmpty() method by checking whether the data element value consists ** of non-significant characters only. ** ** Revision 1.19 2009-08-03 09:02:59 joergr ** Added methods that check whether a given string value conforms to the VR and ** VM definitions of the DICOM standards. ** ** Revision 1.18 2008-07-17 10:31:32 onken ** Implemented copyFrom() method for complete DcmObject class hierarchy, which ** permits setting an instance's value from an existing object. Implemented ** assignment operator where necessary. ** ** Revision 1.17 2007-06-29 14:17:49 meichel ** Code clean-up: Most member variables in module dcmdata are now private, ** not protected anymore. ** ** Revision 1.16 2005/12/08 15:41:49 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.15 2002/12/06 13:20:49 joergr ** Enhanced "print()" function by re-working the implementation and replacing ** the boolean "showFullData" parameter by a more general integer flag. ** Made source code formatting more consistent with other modules/files. ** ** Revision 1.14 2002/11/27 12:06:55 meichel ** Adapted module dcmdata to use of new header file ofstdinc.h ** ** Revision 1.13 2002/08/27 16:55:58 meichel ** Initial release of new DICOM I/O stream classes that add support for stream ** compression (deflated little endian explicit VR transfer syntax) ** ** Revision 1.12 2002/04/11 12:31:34 joergr ** Enhanced DICOM date, time and date/time classes. Added support for new ** standard date and time functions. ** ** Revision 1.11 2001/10/10 15:20:41 joergr ** Added new flag to date/time routines allowing to choose whether the old ** prior V3.0 format for the corresponding DICOM VRs is supported or not. ** ** Revision 1.10 2001/10/04 10:16:58 joergr ** Adapted new time/date routines to Windows systems. ** ** Revision 1.9 2001/10/01 15:04:43 joergr ** Introduced new general purpose functions to get/set person names, date, time ** and date/time. ** ** Revision 1.8 2001/06/01 15:49:15 meichel ** Updated copyright header ** ** Revision 1.7 2000/03/08 16:26:46 meichel ** Updated copyright header. ** ** Revision 1.6 1999/03/31 09:25:49 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.5 1998/11/12 16:48:23 meichel ** Implemented operator= for all classes derived from DcmObject. ** ** Revision 1.4 1997/07/03 15:10:10 andreas ** - removed debugging functions Bdebug() and Edebug() since ** they write a static array and are not very useful at all. ** Cdebug and Vdebug are merged since they have the same semantics. ** The debugging functions in dcmdata changed their interfaces ** (see dcmdata/include/dcdebug.h) ** ** Revision 1.3 1996/01/05 13:27:47 andreas ** - changed to support new streaming facilities ** - unique read/write methods for file and block transfer ** - more cleanups ** */ dcmtk-3.6.0/dcmdata/libsrc/dcvrut.cc0000644000310500011400000001255411457616142016546 0ustar joergrdicom3/* * * Copyright (C) 1998-2010, 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: dcmdata * * Author: Andrew Hewett * * Purpose: Implementation of class DcmUnlimitedText * Value Representation UT is defined in Correction Proposal 101 * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-20 16:44:18 $ * CVS/RCS Revision: $Revision: 1.16 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcvrut.h" // ******************************** DcmUnlimitedText::DcmUnlimitedText(const DcmTag &tag, const Uint32 len) : DcmCharString(tag, len) { setMaxLength(DCM_UndefinedLength); } DcmUnlimitedText::DcmUnlimitedText(const DcmUnlimitedText &old) : DcmCharString(old) { } DcmUnlimitedText::~DcmUnlimitedText() { } DcmUnlimitedText &DcmUnlimitedText::operator=(const DcmUnlimitedText &obj) { DcmCharString::operator=(obj); return *this; } OFCondition DcmUnlimitedText::copyFrom(const DcmObject& rhs) { if (this != &rhs) { if (rhs.ident() != ident()) return EC_IllegalCall; *this = OFstatic_cast(const DcmUnlimitedText &, rhs); } return EC_Normal; } // ******************************** DcmEVR DcmUnlimitedText::ident() const { return EVR_UT; } OFCondition DcmUnlimitedText::checkValue(const OFString & /*vm*/, const OFBool /*oldFormat*/) { OFString strVal; /* get "raw value" without any modifications (if possible) */ OFCondition l_error = getStringValue(strVal); if (l_error.good()) l_error = DcmUnlimitedText::checkStringValue(strVal); return l_error; } unsigned long DcmUnlimitedText::getVM() { /* value multiplicity is 1 for non-empty string, 0 otherwise */ return (getRealLength() > 0) ? 1 : 0; } // ******************************** OFCondition DcmUnlimitedText::getOFString(OFString &strValue, const unsigned long /*pos*/, OFBool normalize) { /* treat backslash as a normal character */ return getOFStringArray(strValue, normalize); } OFCondition DcmUnlimitedText::getOFStringArray(OFString &strValue, OFBool normalize) { /* get string value without handling the "\" as a delimiter */ OFCondition l_error = getStringValue(strValue); // leading spaces are significant and backslash is normal character if (l_error.good() && normalize) normalizeString(strValue, !MULTIPART, !DELETE_LEADING, DELETE_TRAILING); return l_error; } // ******************************** OFCondition DcmUnlimitedText::checkStringValue(const OFString &value) { return DcmByteString::checkStringValue(value, "" /* vm */, "lt", 14 /*, maxLength: 4294967295 characters */); } /* ** CVS/RCS Log: ** $Log: dcvrut.cc,v $ ** Revision 1.16 2010-10-20 16:44:18 joergr ** Use type cast macros (e.g. OFstatic_cast) where appropriate. ** ** Revision 1.15 2010-10-14 13:14:11 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.14 2010-04-23 14:30:35 joergr ** Added new method to all VR classes which checks whether the stored value ** conforms to the VR definition and to the specified VM. ** ** Revision 1.13 2009-08-03 09:03:00 joergr ** Added methods that check whether a given string value conforms to the VR and ** VM definitions of the DICOM standards. ** ** Revision 1.12 2008-07-17 10:31:32 onken ** Implemented copyFrom() method for complete DcmObject class hierarchy, which ** permits setting an instance's value from an existing object. Implemented ** assignment operator where necessary. ** ** Revision 1.11 2007-06-29 14:17:49 meichel ** Code clean-up: Most member variables in module dcmdata are now private, ** not protected anymore. ** ** Revision 1.10 2005/12/08 15:42:10 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.9 2004/01/16 13:45:06 joergr ** Removed acknowledgements with e-mail addresses from CVS log. ** ** Revision 1.8 2002/12/06 13:01:52 joergr ** Fixed bug in Unlimited Text (UT) class: the backslash character was treated ** as a component separator which is wrong according to the DICOM standard. ** Enhanced "print()" function by re-working the implementation and replacing ** the boolean "showFullData" parameter by a more general integer flag. ** Made source code formatting more consistent with other modules/files. ** ** Revision 1.7 2002/04/25 10:35:29 joergr ** Added/modified getOFStringArray() implementation. ** ** Revision 1.6 2001/09/25 17:20:03 meichel ** Adapted dcmdata to class OFCondition ** ** Revision 1.5 2001/06/01 15:49:22 meichel ** Updated copyright header ** ** Revision 1.4 2000/03/08 16:26:53 meichel ** Updated copyright header. ** ** Revision 1.3 1999/03/31 09:26:04 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.2 1998/11/12 16:48:32 meichel ** Implemented operator= for all classes derived from DcmObject. ** ** Revision 1.1 1998/01/19 13:19:50 hewett ** Initial version. ** */ dcmtk-3.6.0/dcmdata/libsrc/dcdatset.cc0000644000310500011400000007312311467230013017017 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Gerd Ehlers, Andreas Barth * * Purpose: Implementation of class DcmDataset * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-11-12 12:16:11 $ * CVS/RCS Revision: $Revision: 1.52 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #define INCLUDE_CSTDLIB #define INCLUDE_CSTDIO #define INCLUDE_CSTRING #include "dcmtk/ofstd/ofstdinc.h" #include "dcmtk/ofstd/ofstream.h" #include "dcmtk/ofstd/ofstack.h" #include "dcmtk/ofstd/ofstd.h" #include "dcmtk/dcmdata/dcdatset.h" #include "dcmtk/dcmdata/dcxfer.h" #include "dcmtk/dcmdata/dcvrus.h" #include "dcmtk/dcmdata/dcpixel.h" #include "dcmtk/dcmdata/dcdeftag.h" #include "dcmtk/dcmdata/dcostrma.h" /* for class DcmOutputStream */ #include "dcmtk/dcmdata/dcostrmf.h" /* for class DcmOutputFileStream */ #include "dcmtk/dcmdata/dcistrma.h" /* for class DcmInputStream */ #include "dcmtk/dcmdata/dcistrmf.h" /* for class DcmInputFileStream */ #include "dcmtk/dcmdata/dcwcache.h" /* for class DcmWriteCache */ // ******************************** DcmDataset::DcmDataset() : DcmItem(ItemTag, DCM_UndefinedLength), Xfer(EXS_Unknown) { } DcmDataset& DcmDataset::operator=(const DcmDataset& obj) { if (this != &obj) { // copy parent's member variables DcmItem::operator=(obj); // copy DcmDataset's member variables Xfer = obj.Xfer; } return *this; } DcmDataset::DcmDataset(const DcmDataset &old) : DcmItem(old), Xfer(old.Xfer) { } OFCondition DcmDataset::copyFrom(const DcmObject& rhs) { if (this != &rhs) { if (rhs.ident() != ident()) return EC_IllegalCall; *this = OFstatic_cast(const DcmDataset &, rhs); } return EC_Normal; } DcmDataset::~DcmDataset() { } // ******************************** OFCondition DcmDataset::clear() { OFCondition result = DcmItem::clear(); setLengthField(DCM_UndefinedLength); return result; } DcmEVR DcmDataset::ident() const { return EVR_dataset; } E_TransferSyntax DcmDataset::getOriginalXfer() const { return Xfer; } void DcmDataset::removeInvalidGroups() { DcmStack stack; DcmObject *object = NULL; /* iterate over all elements */ while (nextObject(stack, OFTrue).good()) { object = stack.top(); /* delete invalid elements */ if ((object->getTag().getGroup() == 0x0002) || !object->getTag().hasValidGroup()) { stack.pop(); /* remove element from dataset and free memory */ delete OFstatic_cast(DcmItem *, stack.top())->remove(object); } } } // ******************************** Uint32 DcmDataset::calcElementLength(const E_TransferSyntax xfer, const E_EncodingType enctype) { return DcmItem::getLength(xfer, enctype); } // ******************************** OFBool DcmDataset::canWriteXfer(const E_TransferSyntax newXfer, const E_TransferSyntax oldXfer) { register E_TransferSyntax originalXfer = Xfer; if (newXfer == EXS_Unknown) return OFFalse; if (Xfer == EXS_Unknown) originalXfer = oldXfer; /* Check stream compression for this transfer syntax */ DcmXfer xf(newXfer); if (xf.getStreamCompression() == ESC_unsupported) return OFFalse; return DcmItem::canWriteXfer(newXfer, originalXfer); } // ******************************** void DcmDataset::print(STD_NAMESPACE ostream&out, const size_t flags, const int level, const char *pixelFileName, size_t *pixelCounter) { out << OFendl; if (flags & DCMTypes::PF_useANSIEscapeCodes) out << ANSI_ESCAPE_CODE_COMMENT; printNestingLevel(out, flags, level); out << "# Dicom-Data-Set" << OFendl; if (flags & DCMTypes::PF_useANSIEscapeCodes) out << ANSI_ESCAPE_CODE_COMMENT; printNestingLevel(out, flags, level); out << "# Used TransferSyntax: " << DcmXfer(Xfer).getXferName() << OFendl; if (flags & DCMTypes::PF_useANSIEscapeCodes) out << ANSI_ESCAPE_CODE_RESET; if (!elementList->empty()) { DcmObject *dO; elementList->seek(ELP_first); do { dO = elementList->get(); dO->print(out, flags, level + 1, pixelFileName, pixelCounter); } while (elementList->seek(ELP_next)); } } // ******************************** OFCondition DcmDataset::writeXML(STD_NAMESPACE ostream&out, const size_t flags) { OFString xmlString; DcmXfer xfer(Xfer); /* XML start tag for "data-set" */ out << "" << OFendl; if (!elementList->empty()) { /* write content of all children */ DcmObject *dO; elementList->seek(ELP_first); do { dO = elementList->get(); dO->writeXML(out, flags & ~DCMTypes::XF_useDcmtkNamespace); } while (elementList->seek(ELP_next)); } /* XML end tag for "data-set" */ out << "" << OFendl; /* always report success */ return EC_Normal; } // ******************************** OFCondition DcmDataset::read(DcmInputStream &inStream, const E_TransferSyntax xfer, const E_GrpLenEncoding glenc, const Uint32 maxReadLength) { /* check if the stream variable reported an error */ errorFlag = inStream.status(); /* if the stream did not report an error but the stream */ /* is empty, set the error flag correspondingly */ if (errorFlag.good() && inStream.eos()) errorFlag = EC_EndOfStream; /* else if the stream did not report an error but the transfer */ /* state does not equal ERW_ready, go ahead and do something */ else if (errorFlag.good() && getTransferState() != ERW_ready) { /* if the transfer state is ERW_init, go ahead and check the transfer syntax which was passed */ if (getTransferState() == ERW_init) { if (dcmAutoDetectDatasetXfer.get()) { /* To support incorrectly encoded datasets detect the transfer syntax from the stream. */ /* This is possible for given unknown and plain big or little endian transfer syntaxes. */ switch( xfer ) { case EXS_Unknown: case EXS_LittleEndianImplicit: case EXS_LittleEndianExplicit: case EXS_BigEndianExplicit: case EXS_BigEndianImplicit: Xfer = checkTransferSyntax(inStream); if ((xfer != EXS_Unknown) && (Xfer != xfer)) DCMDATA_WARN("DcmDataset: Wrong transfer syntax specified, detecting from dataset"); break; default: Xfer = xfer; } } else /* default behaviour */ { /* If the transfer syntax which was passed equals EXS_Unknown we want to */ /* determine the transfer syntax from the information in the stream itself. */ /* If the transfer syntax is given, we want to use it. */ if (xfer == EXS_Unknown) Xfer = checkTransferSyntax(inStream); else Xfer = xfer; } /* Check stream compression for this transfer syntax */ DcmXfer xf(Xfer); E_StreamCompression sc = xf.getStreamCompression(); switch (sc) { case ESC_none: // nothing to do break; case ESC_unsupported: // stream compressed transfer syntax that we cannot create; bail out. if (errorFlag.good()) errorFlag = EC_UnsupportedEncoding; break; default: // supported stream compressed transfer syntax, install filter errorFlag = inStream.installCompressionFilter(sc); break; } } /* pass processing the task to class DcmItem */ if (errorFlag.good()) errorFlag = DcmItem::read(inStream, Xfer, glenc, maxReadLength); } /* if the error flag shows ok or that the end of the stream was encountered, */ /* we have read information for this particular data set or command; in this */ /* case, we need to do something for the current dataset object */ if (errorFlag.good() || errorFlag == EC_EndOfStream) { /* set the error flag to ok */ errorFlag = EC_Normal; /* take care of group length (according to what is specified */ /* in glenc) and padding elements (don't change anything) */ computeGroupLengthAndPadding(glenc, EPD_noChange, Xfer); /* and set the transfer state to ERW_ready to indicate that the data set is complete */ setTransferState(ERW_ready); } /* dump information if required */ DCMDATA_TRACE("DcmDataset::read() returns error = " << errorFlag.text()); /* return result flag */ return errorFlag; } // ******************************** OFCondition DcmDataset::write( DcmOutputStream &outStream, const E_TransferSyntax oxfer, const E_EncodingType enctype /* = EET_UndefinedLength */, DcmWriteCache *wcache) { return write(outStream, oxfer, enctype, wcache, EGL_recalcGL); } OFCondition DcmDataset::write(DcmOutputStream &outStream, const E_TransferSyntax oxfer, const E_EncodingType enctype, DcmWriteCache *wcache, const E_GrpLenEncoding glenc, const E_PaddingEncoding padenc, const Uint32 padlen, const Uint32 subPadlen, Uint32 instanceLength) { /* if the transfer state of this is not initialized, this is an illegal call */ if (getTransferState() == ERW_notInitialized) errorFlag = EC_IllegalCall; else { /* check if the stream reported an error so far; if not, we can go ahead and write some data to it */ errorFlag = outStream.status(); if (errorFlag.good() && getTransferState() != ERW_ready) { /* Determine the transfer syntax which shall be used. Either we use the one which was passed, */ /* or (if it's an unknown tranfer syntax) we use the one which is contained in this->Xfer. */ E_TransferSyntax newXfer = oxfer; if (newXfer == EXS_Unknown) newXfer = Xfer; /* if this function was called for the first time for the dataset object, the transferState is still */ /* set to ERW_init. In this case, we need to take care of group length and padding elements according */ /* to the strategies which are specified in glenc and padenc. Additionally, we need to set the element */ /* list pointer of this data set to the fist element and we need to set the transfer state to ERW_inWork */ /* so that this scenario will only be executed once for this data set object. */ if (getTransferState() == ERW_init) { /* Check stream compression for this transfer syntax */ DcmXfer xf(newXfer); E_StreamCompression sc = xf.getStreamCompression(); switch (sc) { case ESC_none: // nothing to do break; case ESC_unsupported: // stream compressed transfer syntax that we cannot create; bail out. if (errorFlag.good()) errorFlag = EC_UnsupportedEncoding; break; default: // supported stream compressed transfer syntax, install filter errorFlag = outStream.installCompressionFilter(sc); break; } /* take care of group length and padding elements, according to what is specified in glenc and padenc */ computeGroupLengthAndPadding(glenc, padenc, newXfer, enctype, padlen, subPadlen, instanceLength); elementList->seek(ELP_first); setTransferState(ERW_inWork); } /* if the transfer state is set to ERW_inWork, we need to write the information which */ /* is included in this data set's element list into the buffer which was passed. */ if (getTransferState() == ERW_inWork) { // Remember that elementList->get() can be NULL if buffer was full after // writing the last item but before writing the sequence delimitation. if (!elementList->empty() && (elementList->get() != NULL)) { /* as long as everything is ok, go through all elements of this data */ /* set and write the corresponding information to the buffer */ DcmObject *dO; do { dO = elementList->get(); errorFlag = dO->write(outStream, newXfer, enctype, wcache); } while (errorFlag.good() && elementList->seek(ELP_next)); } /* if all the information in this has been written to the */ /* buffer set this data set's transfer state to ERW_ready */ if (errorFlag.good()) setTransferState(ERW_ready); } } } /* return the corresponding result value */ return errorFlag; } // ******************************** OFCondition DcmDataset::writeSignatureFormat(DcmOutputStream &outStream, const E_TransferSyntax oxfer, const E_EncodingType enctype, DcmWriteCache *wcache) { if (getTransferState() == ERW_notInitialized) errorFlag = EC_IllegalCall; else { E_TransferSyntax newXfer = oxfer; if (newXfer == EXS_Unknown) newXfer = Xfer; errorFlag = outStream.status(); if (errorFlag.good() && getTransferState() != ERW_ready) { if (getTransferState() == ERW_init) { computeGroupLengthAndPadding(EGL_recalcGL, EPD_noChange, newXfer, enctype, 0, 0, 0); elementList->seek(ELP_first); setTransferState(ERW_inWork); } if (getTransferState() == ERW_inWork) { // elementList->get() can be NULL if buffer was full after // writing the last item but before writing the sequence delimitation. if (!elementList->empty() && (elementList->get() != NULL)) { DcmObject *dO; do { dO = elementList->get(); errorFlag = dO->writeSignatureFormat(outStream, newXfer, enctype, wcache); } while (errorFlag.good() && elementList->seek(ELP_next)); } if (errorFlag.good()) setTransferState(ERW_ready); } } } return errorFlag; } // ******************************** OFCondition DcmDataset::loadFile(const char *filename, const E_TransferSyntax readXfer, const E_GrpLenEncoding groupLength, const Uint32 maxReadLength) { OFCondition l_error = EC_IllegalParameter; /* check parameters first */ if ((filename != NULL) && (strlen(filename) > 0)) { /* open file for input */ DcmInputFileStream fileStream(filename); /* check stream status */ l_error = fileStream.status(); if (l_error.good()) { /* clear this object */ l_error = clear(); if (l_error.good()) { /* read data from file */ transferInit(); l_error = read(fileStream, readXfer, groupLength, maxReadLength); transferEnd(); } } } return l_error; } OFCondition DcmDataset::saveFile(const char *fileName, const E_TransferSyntax writeXfer, const E_EncodingType encodingType, const E_GrpLenEncoding groupLength, const E_PaddingEncoding padEncoding, const Uint32 padLength, const Uint32 subPadLength) { DcmWriteCache wcache; OFCondition l_error = EC_IllegalParameter; /* check parameters first */ if ((fileName != NULL) && (strlen(fileName) > 0)) { /* open file for output */ DcmOutputFileStream fileStream(fileName); /* check stream status */ l_error = fileStream.status(); if (l_error.good()) { /* write data to file */ transferInit(); l_error = write(fileStream, writeXfer, encodingType, &wcache, groupLength, padEncoding, padLength, subPadLength); transferEnd(); } } return l_error; } // ******************************** OFCondition DcmDataset::chooseRepresentation(const E_TransferSyntax repType, const DcmRepresentationParameter *repParam) { OFCondition l_error = EC_Normal; OFStack pixelStack; DcmStack resultStack; resultStack.push(this); while(search(DCM_PixelData, resultStack, ESM_afterStackTop, OFTrue).good() && l_error.good()) { if (resultStack.top()->ident() == EVR_PixelData) { DcmPixelData * pixelData = OFstatic_cast(DcmPixelData *, resultStack.top()); if (!pixelData->canChooseRepresentation(repType, repParam)) l_error = EC_CannotChangeRepresentation; pixelStack.push(resultStack); } else l_error = EC_CannotChangeRepresentation; } if (l_error.good()) { while(pixelStack.size() && l_error.good()) { l_error = OFstatic_cast(DcmPixelData *, pixelStack.top().top())-> chooseRepresentation(repType, repParam, pixelStack.top()); #ifdef PIXELSTACK_MEMORY_LEAK_WORKAROUND // on certain platforms there seems to be a memory leak // at this point since for some reason pixelStack.pop does // not completely destruct the DcmStack object taken from the stack. // The following work-around should solve this issue. pixelStack.top().clear(); #endif pixelStack.pop(); } } return l_error; } OFBool DcmDataset::hasRepresentation(const E_TransferSyntax repType, const DcmRepresentationParameter *repParam) { OFBool result = OFTrue; DcmStack resultStack; while(search(DCM_PixelData, resultStack, ESM_afterStackTop, OFTrue).good() && result) { if (resultStack.top()->ident() == EVR_PixelData) { DcmPixelData *pixelData = OFstatic_cast(DcmPixelData *, resultStack.top()); result = pixelData->hasRepresentation(repType, repParam); } else result = OFFalse; } return result; } void DcmDataset::removeAllButCurrentRepresentations() { DcmStack resultStack; while(search(DCM_PixelData, resultStack, ESM_afterStackTop, OFTrue).good()) { if (resultStack.top()->ident() == EVR_PixelData) { DcmPixelData *pixelData = OFstatic_cast(DcmPixelData *, resultStack.top()); pixelData->removeAllButCurrentRepresentations(); } } } void DcmDataset::removeAllButOriginalRepresentations() { DcmStack resultStack; while(search(DCM_PixelData, resultStack, ESM_afterStackTop, OFTrue).good()) { if (resultStack.top()->ident() == EVR_PixelData) { DcmPixelData *pixelData = OFstatic_cast(DcmPixelData *, resultStack.top()); pixelData->removeAllButOriginalRepresentations(); } } } /* ** CVS/RCS Log: ** $Log: dcdatset.cc,v $ ** Revision 1.52 2010-11-12 12:16:11 joergr ** Output ANSI escape codes at the beginnig of each line in order to make sure ** that always the correct color is used in case of truncated multi-line output. ** ** Revision 1.51 2010-10-29 10:57:21 joergr ** Added support for colored output to the print() method. ** ** Revision 1.50 2010-10-20 16:44:16 joergr ** Use type cast macros (e.g. OFstatic_cast) where appropriate. ** ** Revision 1.49 2010-10-14 13:14:07 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.48 2009-12-04 16:55:33 joergr ** Sightly modified some log messages. ** ** Revision 1.47 2009-11-13 13:11:20 joergr ** Fixed minor issues in log output. ** ** Revision 1.46 2009-11-04 09:58:09 uli ** Switched to logging mechanism provided by the "new" oflog module ** ** Revision 1.45 2009-08-25 12:54:57 joergr ** Added new methods which remove all data elements with an invalid group number ** from the meta information header, dataset and/or fileformat. ** ** Revision 1.44 2008-07-17 10:31:31 onken ** Implemented copyFrom() method for complete DcmObject class hierarchy, which ** permits setting an instance's value from an existing object. Implemented ** assignment operator where necessary. ** ** Revision 1.43 2007-11-29 14:30:20 meichel ** Write methods now handle large raw data elements (such as pixel data) ** without loading everything into memory. This allows very large images to ** be sent over a network connection, or to be copied without ever being ** fully in memory. ** ** Revision 1.42 2007/06/29 14:17:49 meichel ** Code clean-up: Most member variables in module dcmdata are now private, ** not protected anymore. ** ** Revision 1.41 2006/08/15 15:49:54 meichel ** Updated all code in module dcmdata to correctly compile when ** all standard C++ classes remain in namespace std. ** ** Revision 1.40 2005/12/08 15:40:59 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.39 2005/12/02 08:51:44 joergr ** Changed macro NO_XFER_DETECTION_FOR_DATASETS into a global option that can ** be enabled and disabled at runtime. ** ** Revision 1.38 2005/12/01 09:57:26 joergr ** Added support for DICOM objects where the dataset is stored with a different ** transfer syntax than specified in the meta header. The new behaviour can be ** disabled by compiling with the macro NO_XFER_DETECTION_FOR_DATASETS defined. ** ** Revision 1.37 2005/11/28 15:53:13 meichel ** Renamed macros in dcdebug.h ** ** Revision 1.36 2005/11/11 10:31:58 meichel ** Added explicit DcmDataset::clear() implementation. ** ** Revision 1.35 2005/11/07 17:22:33 meichel ** Implemented DcmFileFormat::clear(). Now the loadFile methods in class ** DcmFileFormat and class DcmDataset both make sure that clear() is called ** before new data is read, allowing for a re-use of the object. ** ** Revision 1.34 2004/02/04 16:19:15 joergr ** Adapted type casts to new-style typecast operators defined in ofcast.h. ** Removed acknowledgements with e-mail addresses from CVS log. ** ** Revision 1.33 2003/04/01 14:57:20 joergr ** Added support for XML namespaces. ** ** Revision 1.32 2002/12/09 09:30:49 wilkens ** Modified/Added doc++ documentation. ** ** Revision 1.31 2002/12/06 13:09:26 joergr ** Enhanced "print()" function by re-working the implementation and replacing ** the boolean "showFullData" parameter by a more general integer flag. ** Made source code formatting more consistent with other modules/files. ** ** Revision 1.30 2002/11/27 12:06:43 meichel ** Adapted module dcmdata to use of new header file ofstdinc.h ** ** Revision 1.29 2002/08/27 16:55:44 meichel ** Initial release of new DICOM I/O stream classes that add support for stream ** compression (deflated little endian explicit VR transfer syntax) ** ** Revision 1.28 2002/07/10 11:47:45 meichel ** Added workaround for memory leak in handling of compressed representations ** Conditional compilation with PIXELSTACK_MEMORY_LEAK_WORKAROUND #defined. ** ** Revision 1.27 2002/05/14 08:20:53 joergr ** Renamed some element names. ** ** Revision 1.26 2002/04/25 10:14:12 joergr ** Added support for XML output of DICOM objects. ** ** Revision 1.25 2002/04/16 13:43:15 joergr ** Added configurable support for C++ ANSI standard includes (e.g. streams). ** ** Revision 1.24 2002/04/11 12:27:11 joergr ** Added new methods for loading and saving DICOM files. ** ** Revision 1.23 2001/11/01 14:55:35 wilkens ** Added lots of comments. ** ** Revision 1.22 2001/09/26 15:49:29 meichel ** Modified debug messages, required by OFCondition ** ** Revision 1.21 2001/09/25 17:19:47 meichel ** Adapted dcmdata to class OFCondition ** ** Revision 1.20 2001/06/01 15:48:59 meichel ** Updated copyright header ** ** Revision 1.19 2001/05/03 08:15:21 meichel ** Fixed bug in dcmdata sequence handling code that could lead to application ** failure in rare cases during parsing of a correct DICOM dataset. ** ** Revision 1.18 2000/11/07 16:56:18 meichel ** Initial release of dcmsign module for DICOM Digital Signatures ** ** Revision 1.17 2000/04/14 16:07:26 meichel ** Dcmdata library code now consistently uses ofConsole for error output. ** ** Revision 1.16 2000/03/08 16:26:30 meichel ** Updated copyright header. ** ** Revision 1.15 2000/02/10 10:52:16 joergr ** Added new feature to dcmdump (enhanced print method of dcmdata): write ** pixel data/item value fields to raw files. ** ** Revision 1.14 1999/03/31 09:25:19 meichel ** Updated copyright header in module dcmdata ** ** Revision 1.13 1998/07/15 15:51:47 joergr ** Removed several compiler warnings reported by gcc 2.8.1 with ** additional options, e.g. missing copy constructors and assignment ** operators, initialization of member variables in the body of a ** constructor instead of the member initialization list, hiding of ** methods by use of identical names, uninitialized member variables, ** missing const declaration of char pointers. Replaced tabs by spaces. ** ** Revision 1.12 1997/07/21 08:16:43 andreas ** - New environment for encapsulated pixel representations. DcmPixelData ** can contain different representations and uses codecs to convert ** between them. Codecs are derived from the DcmCodec class. New error ** codes are introduced for handling of representations. New internal ** value representation (only for ident()) for PixelData ** - new copy constructor for DcmStack ** - Replace all boolean types (BOOLEAN, CTNBOOLEAN, DICOM_BOOL, BOOL) ** with one unique boolean type OFBool. ** ** Revision 1.11 1997/07/03 15:09:53 andreas ** - removed debugging functions Bdebug() and Edebug() since ** they write a static array and are not very useful at all. ** Cdebug and Vdebug are merged since they have the same semantics. ** The debugging functions in dcmdata changed their interfaces ** (see dcmdata/include/dcdebug.h) ** ** Revision 1.10 1997/06/06 09:55:28 andreas ** - corrected error: canWriteXfer returns false if the old transfer syntax ** was unknown, which causes several applications to prohibit the writing ** of dataset. ** ** Revision 1.9 1997/05/27 13:48:57 andreas ** - Add method canWriteXfer to class DcmObject and all derived classes. ** This method checks whether it is possible to convert the original ** transfer syntax to an new transfer syntax. The check is used in the ** dcmconv utility to prohibit the change of a compressed transfer ** syntax to a uncompressed. ** ** Revision 1.8 1997/05/16 08:23:52 andreas ** - Revised handling of GroupLength elements and support of ** DataSetTrailingPadding elements. The enumeratio E_GrpLenEncoding ** got additional enumeration values (for a description see dctypes.h). ** addGroupLength and removeGroupLength methods are replaced by ** computeGroupLengthAndPadding. To support Padding, the parameters of ** element and sequence write functions changed. ** - Added a new method calcElementLength to calculate the length of an ** element, item or sequence. For elements it returns the length of ** tag, length field, vr field, and value length, for item and ** sequences it returns the length of the whole item. sequence including ** the Delimitation tag (if appropriate). It can never return ** UndefinedLength. ** ** Revision 1.7 1996/08/05 08:46:08 andreas ** new print routine with additional parameters: ** - print into files ** - fix output length for elements ** corrected error in search routine with parameter ESM_fromStackTop ** ** Revision 1.6 1996/04/25 17:08:04 hewett ** Removed out-of-date comment about RESOLVE_AMBIGOUS_VR_OF_PIXELDATA. ** ** Revision 1.5 1996/03/13 14:44:23 hewett ** The DcmDataset::resolveAmbiguous() method was setting the VR of ** PixelData to OW if a non-encapsulated transfer syntax was in use. ** This should only be done if the transfer syntax is implicit. Any ** explicit transfer syntax will carry the VR with the data. ** Solution: Delete the code in DcmDataset::resolveAmbiguous(). ** The VR of PixelData is being correctly set in ** cmItem::readSubElement(...) according to Correction Proposal 14. ** ** Revision 1.4 1996/01/09 11:06:43 andreas ** New Support for Visual C++ ** Correct problems with inconsistent const declarations ** Correct error in reading Item Delimitation Elements ** ** Revision 1.3 1996/01/05 13:27:33 andreas ** - changed to support new streaming facilities ** - unique read/write methods for file and block transfer ** - more cleanups ** */ dcmtk-3.6.0/dcmdata/libsrc/vrscani.h0000644000310500011400000000322711455601461016537 0ustar joergrdicom3/* * * Copyright (C) 2010, 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: dcmdata * * Author: Uli Schlachter * * Purpose: Internal header for vrscanl.c and vrscan.cc * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:18:41 $ * CVS/RCS Revision: $Revision: 1.4 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef VRSCANI_H #define VRSCANI_H /* This needs its own header because both vrscanl.c and vrscan.cc need it. */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include struct vrscan_error { jmp_buf setjmp_buffer; const char *error_msg; }; #define YY_EXTRA_TYPE struct vrscan_error * #define YY_FATAL_ERROR(msg) do { \ yyget_extra(yyscanner)->error_msg = msg; \ longjmp(yyget_extra(yyscanner)->setjmp_buffer, 1); \ } while (0); /* Don't try to include unistd.h which doesn't exist on windows */ #define YY_NO_UNISTD_H #endif /* VRSCANI_H */ /* ** CVS/RCS Log: ** $Log: vrscani.h,v $ ** Revision 1.4 2010-10-14 13:18:41 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.3 2010-10-01 10:21:05 uli ** Fixed most compiler warnings from -Wall -Wextra -pedantic in dcmdata. ** ** Revision 1.2 2010-09-03 07:26:19 uli ** Make the VR scanner work on windows again. ** ** Revision 1.1 2010-09-02 12:02:06 uli ** Use longjmp() for error handling in the VR scanner. ** ** */ dcmtk-3.6.0/dcmdata/libsrc/dcistrma.cc0000644000310500011400000000670611455601040017034 0ustar joergrdicom3/* * * Copyright (C) 1994-2010, 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: dcmdata * * Author: Marco Eichelberg * * Purpose: base classes for input streams * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:14:08 $ * CVS/RCS Revision: $Revision: 1.5 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" #include "dcmtk/dcmdata/dcistrma.h" #include "dcmtk/dcmdata/dcistrmz.h" /* for DcmZLibInputFilter */ #include "dcmtk/dcmdata/dcerror.h" /* for EC_IllegalCall */ DcmInputStream::DcmInputStream(DcmProducer *initial) : current_(initial) , compressionFilter_(NULL) , tell_(0) , mark_(0) { } DcmInputStream::~DcmInputStream() { // we cannot access the stream anymore at this point because the // producer has most probably already been deleted. delete compressionFilter_; } OFBool DcmInputStream::good() const { return current_->good(); } OFCondition DcmInputStream::status() const { return current_->status(); } OFBool DcmInputStream::eos() { return current_->eos(); } offile_off_t DcmInputStream::avail() { return current_->avail(); } offile_off_t DcmInputStream::read(void *buf, offile_off_t buflen) { offile_off_t result = current_->read(buf, buflen); tell_ += result; return result; } offile_off_t DcmInputStream::skip(offile_off_t skiplen) { offile_off_t result = current_->skip(skiplen); tell_ += result; return result; } offile_off_t DcmInputStream::tell() const { return tell_; } void DcmInputStream::mark() { mark_ = tell_; } void DcmInputStream::putback() { current_->putback(tell_ - mark_); tell_ = mark_; } const DcmProducer *DcmInputStream::currentProducer() const { return current_; } OFCondition DcmInputStream::installCompressionFilter(E_StreamCompression filterType) { OFCondition result = EC_Normal; if (compressionFilter_) result = EC_DoubleCompressionFilters; else { switch (filterType) { #ifdef WITH_ZLIB case ESC_zlib: compressionFilter_ = new DcmZLibInputFilter(); if (compressionFilter_) { compressionFilter_->append(*current_); // feed the compression engine with data from the producer compressionFilter_->skip(0); current_ = compressionFilter_; } else result = EC_MemoryExhausted; break; #endif case ESC_none: case ESC_unsupported: result = EC_UnsupportedEncoding; break; } } return result; } /* * CVS/RCS Log: * $Log: dcistrma.cc,v $ * Revision 1.5 2010-10-14 13:14:08 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.4 2009-11-04 09:58:09 uli * Switched to logging mechanism provided by the "new" oflog module * * Revision 1.3 2007-02-19 15:45:30 meichel * Class DcmInputStream and related classes are now safe for use with * large files (2 GBytes or more) if supported by compiler and operating system. * * Revision 1.2 2005/12/08 15:41:12 meichel * Changed include path schema for all DCMTK header files * * Revision 1.1 2002/08/27 16:55:48 meichel * Initial release of new DICOM I/O stream classes that add support for stream * compression (deflated little endian explicit VR transfer syntax) * * */ dcmtk-3.6.0/dcmdata/libsrc/dcdictzz.cc0000644000310500011400000376110011472445161017054 0ustar joergrdicom3/* ** DO NOT EDIT THIS FILE !!! ** It was generated automatically by: ** ** User: joergr ** Host: caesar ** Date: 2010-11-22 11:44:46 ** Prog: /home/joergr/source/dcmtk/dcmdata/libsrc/mkdictbi ** ** From: ../data/dicom.dic ** ../data/private.dic ** */ #include "dcmtk/dcmdata/dcdict.h" #include "dcmtk/dcmdata/dcdicent.h" const char* dcmBuiltinDictBuildDate = "2010-11-22 11:44:46"; struct DBI_SimpleEntry { Uint16 group; Uint16 element; Uint16 upperGroup; Uint16 upperElement; DcmEVR evr; const char* tagName; int vmMin; int vmMax; const char* standardVersion; DcmDictRangeRestriction groupRestriction; DcmDictRangeRestriction elementRestriction; const char* privateCreator; }; static const DBI_SimpleEntry simpleBuiltinDict[] = { { 0x0000, 0x0000, 0x0000, 0x0000, EVR_UL, "CommandGroupLength", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0000, 0x0001, 0x0000, 0x0001, EVR_UL, "ACR_NEMA_CommandGroupLengthToEnd", 1, 1, "ACR/NEMA2", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0000, 0x0002, 0x0000, 0x0002, EVR_UI, "AffectedSOPClassUID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0000, 0x0003, 0x0000, 0x0003, EVR_UI, "RequestedSOPClassUID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0000, 0x0010, 0x0000, 0x0010, EVR_CS, "ACR_NEMA_CommandRecognitionCode", 1, 1, "ACR/NEMA2", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0000, 0x0100, 0x0000, 0x0100, EVR_US, "CommandField", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0000, 0x0110, 0x0000, 0x0110, EVR_US, "MessageID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0000, 0x0120, 0x0000, 0x0120, EVR_US, "MessageIDBeingRespondedTo", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0000, 0x0200, 0x0000, 0x0200, EVR_LO, "ACR_NEMA_Initiator", 1, 1, "ACR/NEMA2", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0000, 0x0300, 0x0000, 0x0300, EVR_LO, "ACR_NEMA_Receiver", 1, 1, "ACR/NEMA2", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0000, 0x0400, 0x0000, 0x0400, EVR_LO, "ACR_NEMA_FindLocation", 1, 1, "ACR/NEMA2", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0000, 0x0600, 0x0000, 0x0600, EVR_AE, "MoveDestination", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0000, 0x0700, 0x0000, 0x0700, EVR_US, "Priority", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0000, 0x0800, 0x0000, 0x0800, EVR_US, "DataSetType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0000, 0x0850, 0x0000, 0x0850, EVR_US, "ACR_NEMA_NumberOfMatches", 1, 1, "ACR/NEMA2", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0000, 0x0860, 0x0000, 0x0860, EVR_US, "ACR_NEMA_ResponseSequenceNumber", 1, 1, "ACR/NEMA2", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0000, 0x0900, 0x0000, 0x0900, EVR_US, "Status", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0000, 0x0901, 0x0000, 0x0901, EVR_AT, "OffendingElement", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0000, 0x0902, 0x0000, 0x0902, EVR_LO, "ErrorComment", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0000, 0x0903, 0x0000, 0x0903, EVR_US, "ErrorID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0000, 0x1000, 0x0000, 0x1000, EVR_UI, "AffectedSOPInstanceUID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0000, 0x1001, 0x0000, 0x1001, EVR_UI, "RequestedSOPInstanceUID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0000, 0x1002, 0x0000, 0x1002, EVR_US, "EventTypeID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0000, 0x1005, 0x0000, 0x1005, EVR_AT, "AttributeIdentifierList", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0000, 0x1008, 0x0000, 0x1008, EVR_US, "ActionTypeID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0000, 0x1020, 0x0000, 0x1020, EVR_US, "NumberOfRemainingSubOperations", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0000, 0x1021, 0x0000, 0x1021, EVR_US, "NumberOfCompletedSubOperations", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0000, 0x1022, 0x0000, 0x1022, EVR_US, "NumberOfFailedSubOperations", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0000, 0x1023, 0x0000, 0x1023, EVR_US, "NumberOfWarningSubOperations", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0000, 0x1030, 0x0000, 0x1030, EVR_AE, "MoveOriginatorApplicationEntityTitle", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0000, 0x1031, 0x0000, 0x1031, EVR_US, "MoveOriginatorMessageID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0000, 0x4000, 0x0000, 0x4000, EVR_LO, "ACR_NEMA_DialogReceiver", 1, 1, "ACR/NEMA2", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0000, 0x4010, 0x0000, 0x4010, EVR_LO, "ACR_NEMA_TerminalType", 1, 1, "ACR/NEMA2", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0000, 0x5010, 0x0000, 0x5010, EVR_LO, "ACR_NEMA_MessageSetID", 1, 1, "ACR/NEMA2", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0000, 0x5020, 0x0000, 0x5020, EVR_LO, "ACR_NEMA_EndMessageSet", 1, 1, "ACR/NEMA2", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0000, 0x5110, 0x0000, 0x5110, EVR_LO, "ACR_NEMA_DisplayFormat", 1, 1, "ACR/NEMA2", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0000, 0x5120, 0x0000, 0x5120, EVR_LO, "ACR_NEMA_PagePositionID", 1, 1, "ACR/NEMA2", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0000, 0x5130, 0x0000, 0x5130, EVR_LO, "ACR_NEMA_TextFormatID", 1, 1, "ACR/NEMA2", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0000, 0x5140, 0x0000, 0x5140, EVR_CS, "ACR_NEMA_NormalReverse", 1, 1, "ACR/NEMA2", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0000, 0x5150, 0x0000, 0x5150, EVR_CS, "ACR_NEMA_AddGrayScale", 1, 1, "ACR/NEMA2", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0000, 0x5160, 0x0000, 0x5160, EVR_CS, "ACR_NEMA_Borders", 1, 1, "ACR/NEMA2", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0000, 0x5170, 0x0000, 0x5170, EVR_IS, "ACR_NEMA_Copies", 1, 1, "ACR/NEMA2", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0000, 0x5180, 0x0000, 0x5180, EVR_LO, "ACR_NEMA_MagnificationType", 1, 1, "ACR/NEMA2", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0000, 0x5190, 0x0000, 0x5190, EVR_LO, "ACR_NEMA_Erase", 1, -1, "ACR/NEMA2", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0000, 0x51a0, 0x0000, 0x51a0, EVR_CS, "ACR_NEMA_Print", 1, 1, "ACR/NEMA2", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0000, 0x51b0, 0x0000, 0x51b0, EVR_US, "ACR_NEMA_Overlays", 1, -1, "ACR/NEMA2", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0002, 0x0000, 0x0002, 0x0000, EVR_UL, "FileMetaInformationGroupLength", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0002, 0x0001, 0x0002, 0x0001, EVR_OB, "FileMetaInformationVersion", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0002, 0x0002, 0x0002, 0x0002, EVR_UI, "MediaStorageSOPClassUID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0002, 0x0003, 0x0002, 0x0003, EVR_UI, "MediaStorageSOPInstanceUID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0002, 0x0010, 0x0002, 0x0010, EVR_UI, "TransferSyntaxUID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0002, 0x0012, 0x0002, 0x0012, EVR_UI, "ImplementationClassUID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0002, 0x0013, 0x0002, 0x0013, EVR_SH, "ImplementationVersionName", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0002, 0x0016, 0x0002, 0x0016, EVR_AE, "SourceApplicationEntityTitle", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0002, 0x0100, 0x0002, 0x0100, EVR_UI, "PrivateInformationCreatorUID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0002, 0x0102, 0x0002, 0x0102, EVR_OB, "PrivateInformation", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } #ifdef WITH_PRIVATE_TAGS , { 0x0003, 0x0000, 0x0003, 0x0000, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "AEGIS_DICOM_2.00" } , { 0x0003, 0x0008, 0x0003, 0x0008, EVR_US, "ISICommandField", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS ISI" } , { 0x0003, 0x0011, 0x0003, 0x0011, EVR_US, "AttachIDApplicationCode", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS ISI" } , { 0x0003, 0x0012, 0x0003, 0x0012, EVR_UL, "AttachIDMessageCount", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS ISI" } , { 0x0003, 0x0013, 0x0003, 0x0013, EVR_DA, "AttachIDDate", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS ISI" } , { 0x0003, 0x0014, 0x0003, 0x0014, EVR_TM, "AttachIDTime", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS ISI" } , { 0x0003, 0x0020, 0x0003, 0x0020, EVR_US, "MessageType", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS ISI" } , { 0x0003, 0x0030, 0x0003, 0x0030, EVR_DA, "MaxWaitingDate", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS ISI" } , { 0x0003, 0x0031, 0x0003, 0x0031, EVR_TM, "MaxWaitingTime", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS ISI" } #endif , { 0x0004, 0x1130, 0x0004, 0x1130, EVR_CS, "FileSetID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0004, 0x1141, 0x0004, 0x1141, EVR_CS, "FileSetDescriptorFileID", 1, 8, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0004, 0x1142, 0x0004, 0x1142, EVR_CS, "SpecificCharacterSetOfFileSetDescriptorFile", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0004, 0x1200, 0x0004, 0x1200, EVR_up, "OffsetOfTheFirstDirectoryRecordOfTheRootDirectoryEntity", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0004, 0x1202, 0x0004, 0x1202, EVR_up, "OffsetOfTheLastDirectoryRecordOfTheRootDirectoryEntity", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0004, 0x1212, 0x0004, 0x1212, EVR_US, "FileSetConsistencyFlag", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0004, 0x1220, 0x0004, 0x1220, EVR_SQ, "DirectoryRecordSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0004, 0x1400, 0x0004, 0x1400, EVR_up, "OffsetOfTheNextDirectoryRecord", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0004, 0x1410, 0x0004, 0x1410, EVR_US, "RecordInUseFlag", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0004, 0x1420, 0x0004, 0x1420, EVR_up, "OffsetOfReferencedLowerLevelDirectoryEntity", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0004, 0x1430, 0x0004, 0x1430, EVR_CS, "DirectoryRecordType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0004, 0x1432, 0x0004, 0x1432, EVR_UI, "PrivateRecordUID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0004, 0x1500, 0x0004, 0x1500, EVR_CS, "ReferencedFileID", 1, 8, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0004, 0x1504, 0x0004, 0x1504, EVR_up, "RETIRED_MRDRDirectoryRecordOffset", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0004, 0x1510, 0x0004, 0x1510, EVR_UI, "ReferencedSOPClassUIDInFile", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0004, 0x1511, 0x0004, 0x1511, EVR_UI, "ReferencedSOPInstanceUIDInFile", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0004, 0x1512, 0x0004, 0x1512, EVR_UI, "ReferencedTransferSyntaxUIDInFile", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0004, 0x151a, 0x0004, 0x151a, EVR_UI, "ReferencedRelatedGeneralSOPClassUIDInFile", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0004, 0x1600, 0x0004, 0x1600, EVR_UL, "RETIRED_NumberOfReferences", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } #ifdef WITH_PRIVATE_TAGS , { 0x0005, 0x0000, 0x0005, 0x0000, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "AEGIS_DICOM_2.00" } #endif , { 0x0008, 0x0001, 0x0008, 0x0001, EVR_UL, "ACR_NEMA_IdentifyingGroupLengthToEnd", 1, 1, "ACR/NEMA2", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x0005, 0x0008, 0x0005, EVR_CS, "SpecificCharacterSet", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x0006, 0x0008, 0x0006, EVR_SQ, "LanguageCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x0008, 0x0008, 0x0008, EVR_CS, "ImageType", 2, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x0010, 0x0008, 0x0010, EVR_LO, "ACR_NEMA_RecognitionCode", 1, 1, "ACR/NEMA2", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x0012, 0x0008, 0x0012, EVR_DA, "InstanceCreationDate", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x0013, 0x0008, 0x0013, EVR_TM, "InstanceCreationTime", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x0014, 0x0008, 0x0014, EVR_UI, "InstanceCreatorUID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x0016, 0x0008, 0x0016, EVR_UI, "SOPClassUID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x0018, 0x0008, 0x0018, EVR_UI, "SOPInstanceUID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x001a, 0x0008, 0x001a, EVR_UI, "RelatedGeneralSOPClassUID", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x001b, 0x0008, 0x001b, EVR_UI, "OriginalSpecializedSOPClassUID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x0020, 0x0008, 0x0020, EVR_DA, "StudyDate", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x0021, 0x0008, 0x0021, EVR_DA, "SeriesDate", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x0022, 0x0008, 0x0022, EVR_DA, "AcquisitionDate", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x0023, 0x0008, 0x0023, EVR_DA, "ContentDate", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x0024, 0x0008, 0x0024, EVR_DA, "RETIRED_OverlayDate", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x0025, 0x0008, 0x0025, EVR_DA, "RETIRED_CurveDate", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x002a, 0x0008, 0x002a, EVR_DT, "AcquisitionDateTime", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x0030, 0x0008, 0x0030, EVR_TM, "StudyTime", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x0031, 0x0008, 0x0031, EVR_TM, "SeriesTime", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x0032, 0x0008, 0x0032, EVR_TM, "AcquisitionTime", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x0033, 0x0008, 0x0033, EVR_TM, "ContentTime", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x0034, 0x0008, 0x0034, EVR_TM, "RETIRED_OverlayTime", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x0035, 0x0008, 0x0035, EVR_TM, "RETIRED_CurveTime", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x0040, 0x0008, 0x0040, EVR_US, "ACR_NEMA_OldDataSetType", 1, 1, "ACR/NEMA2", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x0041, 0x0008, 0x0041, EVR_LO, "ACR_NEMA_DataSetSubtype", 1, 1, "ACR/NEMA2", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x0042, 0x0008, 0x0042, EVR_CS, "RETIRED_NuclearMedicineSeriesType", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x0050, 0x0008, 0x0050, EVR_SH, "AccessionNumber", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x0051, 0x0008, 0x0051, EVR_SQ, "IssuerOfAccessionNumberSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x0052, 0x0008, 0x0052, EVR_CS, "QueryRetrieveLevel", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x0054, 0x0008, 0x0054, EVR_AE, "RetrieveAETitle", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x0056, 0x0008, 0x0056, EVR_CS, "InstanceAvailability", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x0058, 0x0008, 0x0058, EVR_UI, "FailedSOPInstanceUIDList", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x0060, 0x0008, 0x0060, EVR_CS, "Modality", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x0061, 0x0008, 0x0061, EVR_CS, "ModalitiesInStudy", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x0062, 0x0008, 0x0062, EVR_UI, "SOPClassesInStudy", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x0064, 0x0008, 0x0064, EVR_CS, "ConversionType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x0068, 0x0008, 0x0068, EVR_CS, "PresentationIntentType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x0070, 0x0008, 0x0070, EVR_LO, "Manufacturer", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x0080, 0x0008, 0x0080, EVR_LO, "InstitutionName", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x0081, 0x0008, 0x0081, EVR_ST, "InstitutionAddress", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x0082, 0x0008, 0x0082, EVR_SQ, "InstitutionCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x0090, 0x0008, 0x0090, EVR_PN, "ReferringPhysicianName", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x0092, 0x0008, 0x0092, EVR_ST, "ReferringPhysicianAddress", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x0094, 0x0008, 0x0094, EVR_SH, "ReferringPhysicianTelephoneNumbers", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x0096, 0x0008, 0x0096, EVR_SQ, "ReferringPhysicianIdentificationSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x0100, 0x0008, 0x0100, EVR_SH, "CodeValue", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x0102, 0x0008, 0x0102, EVR_SH, "CodingSchemeDesignator", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x0103, 0x0008, 0x0103, EVR_SH, "CodingSchemeVersion", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x0104, 0x0008, 0x0104, EVR_LO, "CodeMeaning", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x0105, 0x0008, 0x0105, EVR_CS, "MappingResource", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x0106, 0x0008, 0x0106, EVR_DT, "ContextGroupVersion", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x0107, 0x0008, 0x0107, EVR_DT, "ContextGroupLocalVersion", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x010b, 0x0008, 0x010b, EVR_CS, "ContextGroupExtensionFlag", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x010c, 0x0008, 0x010c, EVR_UI, "CodingSchemeUID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x010d, 0x0008, 0x010d, EVR_UI, "ContextGroupExtensionCreatorUID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x010f, 0x0008, 0x010f, EVR_CS, "ContextIdentifier", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x0110, 0x0008, 0x0110, EVR_SQ, "CodingSchemeIdentificationSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x0112, 0x0008, 0x0112, EVR_LO, "CodingSchemeRegistry", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x0114, 0x0008, 0x0114, EVR_ST, "CodingSchemeExternalID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x0115, 0x0008, 0x0115, EVR_ST, "CodingSchemeName", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x0116, 0x0008, 0x0116, EVR_ST, "CodingSchemeResponsibleOrganization", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x0117, 0x0008, 0x0117, EVR_UI, "ContextUID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x0201, 0x0008, 0x0201, EVR_SH, "TimezoneOffsetFromUTC", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x1000, 0x0008, 0x1000, EVR_LO, "ACR_NEMA_NetworkID", 1, 1, "ACR/NEMA2", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x1010, 0x0008, 0x1010, EVR_SH, "StationName", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x1030, 0x0008, 0x1030, EVR_LO, "StudyDescription", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x1032, 0x0008, 0x1032, EVR_SQ, "ProcedureCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x103e, 0x0008, 0x103e, EVR_LO, "SeriesDescription", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x103f, 0x0008, 0x103f, EVR_SQ, "SeriesDescriptionCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x1040, 0x0008, 0x1040, EVR_LO, "InstitutionalDepartmentName", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x1048, 0x0008, 0x1048, EVR_PN, "PhysiciansOfRecord", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x1049, 0x0008, 0x1049, EVR_SQ, "PhysiciansOfRecordIdentificationSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x1050, 0x0008, 0x1050, EVR_PN, "PerformingPhysicianName", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x1052, 0x0008, 0x1052, EVR_SQ, "PerformingPhysicianIdentificationSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x1060, 0x0008, 0x1060, EVR_PN, "NameOfPhysiciansReadingStudy", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x1062, 0x0008, 0x1062, EVR_SQ, "PhysiciansReadingStudyIdentificationSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x1070, 0x0008, 0x1070, EVR_PN, "OperatorsName", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x1072, 0x0008, 0x1072, EVR_SQ, "OperatorIdentificationSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x1080, 0x0008, 0x1080, EVR_LO, "AdmittingDiagnosesDescription", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x1084, 0x0008, 0x1084, EVR_SQ, "AdmittingDiagnosesCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x1090, 0x0008, 0x1090, EVR_LO, "ManufacturerModelName", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x1100, 0x0008, 0x1100, EVR_SQ, "RETIRED_ReferencedResultsSequence", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x1110, 0x0008, 0x1110, EVR_SQ, "ReferencedStudySequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x1111, 0x0008, 0x1111, EVR_SQ, "ReferencedPerformedProcedureStepSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x1115, 0x0008, 0x1115, EVR_SQ, "ReferencedSeriesSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x1120, 0x0008, 0x1120, EVR_SQ, "ReferencedPatientSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x1125, 0x0008, 0x1125, EVR_SQ, "ReferencedVisitSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x1130, 0x0008, 0x1130, EVR_SQ, "RETIRED_ReferencedOverlaySequence", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x1134, 0x0008, 0x1134, EVR_SQ, "ReferencedStereometricInstanceSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x113a, 0x0008, 0x113a, EVR_SQ, "ReferencedWaveformSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x1140, 0x0008, 0x1140, EVR_SQ, "ReferencedImageSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x1145, 0x0008, 0x1145, EVR_SQ, "RETIRED_ReferencedCurveSequence", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x114a, 0x0008, 0x114a, EVR_SQ, "ReferencedInstanceSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x114b, 0x0008, 0x114b, EVR_SQ, "ReferencedRealWorldValueMappingInstanceSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x1150, 0x0008, 0x1150, EVR_UI, "ReferencedSOPClassUID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x1155, 0x0008, 0x1155, EVR_UI, "ReferencedSOPInstanceUID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x115a, 0x0008, 0x115a, EVR_UI, "SOPClassesSupported", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x1160, 0x0008, 0x1160, EVR_IS, "ReferencedFrameNumber", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x1161, 0x0008, 0x1161, EVR_UL, "SimpleFrameList", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x1162, 0x0008, 0x1162, EVR_UL, "CalculatedFrameList", 3, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x1163, 0x0008, 0x1163, EVR_FD, "TimeRange", 2, 2, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x1164, 0x0008, 0x1164, EVR_SQ, "FrameExtractionSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x1167, 0x0008, 0x1167, EVR_UI, "MultiFrameSourceSOPInstanceUID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x1195, 0x0008, 0x1195, EVR_UI, "TransactionUID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x1197, 0x0008, 0x1197, EVR_US, "FailureReason", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x1198, 0x0008, 0x1198, EVR_SQ, "FailedSOPSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x1199, 0x0008, 0x1199, EVR_SQ, "ReferencedSOPSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x1200, 0x0008, 0x1200, EVR_SQ, "StudiesContainingOtherReferencedInstancesSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x1250, 0x0008, 0x1250, EVR_SQ, "RelatedSeriesSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x2110, 0x0008, 0x2110, EVR_CS, "RETIRED_LossyImageCompressionRetired", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x2111, 0x0008, 0x2111, EVR_ST, "DerivationDescription", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x2112, 0x0008, 0x2112, EVR_SQ, "SourceImageSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x2120, 0x0008, 0x2120, EVR_SH, "StageName", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x2122, 0x0008, 0x2122, EVR_IS, "StageNumber", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x2124, 0x0008, 0x2124, EVR_IS, "NumberOfStages", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x2127, 0x0008, 0x2127, EVR_SH, "ViewName", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x2128, 0x0008, 0x2128, EVR_IS, "ViewNumber", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x2129, 0x0008, 0x2129, EVR_IS, "NumberOfEventTimers", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x212a, 0x0008, 0x212a, EVR_IS, "NumberOfViewsInStage", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x2130, 0x0008, 0x2130, EVR_DS, "EventElapsedTimes", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x2132, 0x0008, 0x2132, EVR_LO, "EventTimerNames", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x2133, 0x0008, 0x2133, EVR_SQ, "EventTimerSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x2134, 0x0008, 0x2134, EVR_FD, "EventTimeOffset", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x2135, 0x0008, 0x2135, EVR_SQ, "EventCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x2142, 0x0008, 0x2142, EVR_IS, "StartTrim", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x2143, 0x0008, 0x2143, EVR_IS, "StopTrim", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x2144, 0x0008, 0x2144, EVR_IS, "RecommendedDisplayFrameRate", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x2200, 0x0008, 0x2200, EVR_CS, "RETIRED_TransducerPosition", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x2204, 0x0008, 0x2204, EVR_CS, "RETIRED_TransducerOrientation", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x2208, 0x0008, 0x2208, EVR_CS, "RETIRED_AnatomicStructure", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x2218, 0x0008, 0x2218, EVR_SQ, "AnatomicRegionSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x2220, 0x0008, 0x2220, EVR_SQ, "AnatomicRegionModifierSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x2228, 0x0008, 0x2228, EVR_SQ, "PrimaryAnatomicStructureSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x2229, 0x0008, 0x2229, EVR_SQ, "AnatomicStructureSpaceOrRegionSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x2230, 0x0008, 0x2230, EVR_SQ, "PrimaryAnatomicStructureModifierSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x2240, 0x0008, 0x2240, EVR_SQ, "RETIRED_TransducerPositionSequence", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x2242, 0x0008, 0x2242, EVR_SQ, "RETIRED_TransducerPositionModifierSequence", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x2244, 0x0008, 0x2244, EVR_SQ, "RETIRED_TransducerOrientationSequence", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x2246, 0x0008, 0x2246, EVR_SQ, "RETIRED_TransducerOrientationModifierSequence", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x2251, 0x0008, 0x2251, EVR_SQ, "RETIRED_AnatomicStructureSpaceOrRegionCodeSequenceTrial", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x2253, 0x0008, 0x2253, EVR_SQ, "RETIRED_AnatomicPortalOfEntranceCodeSequenceTrial", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x2255, 0x0008, 0x2255, EVR_SQ, "RETIRED_AnatomicApproachDirectionCodeSequenceTrial", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x2256, 0x0008, 0x2256, EVR_ST, "RETIRED_AnatomicPerspectiveDescriptionTrial", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x2257, 0x0008, 0x2257, EVR_SQ, "RETIRED_AnatomicPerspectiveCodeSequenceTrial", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x2258, 0x0008, 0x2258, EVR_ST, "RETIRED_AnatomicLocationOfExaminingInstrumentDescriptionTrial", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x2259, 0x0008, 0x2259, EVR_SQ, "RETIRED_AnatomicLocationOfExaminingInstrumentCodeSequenceTrial", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x225a, 0x0008, 0x225a, EVR_SQ, "RETIRED_AnatomicStructureSpaceOrRegionModifierCodeSequenceTrial", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x225c, 0x0008, 0x225c, EVR_SQ, "RETIRED_OnAxisBackgroundAnatomicStructureCodeSequenceTrial", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x3001, 0x0008, 0x3001, EVR_SQ, "AlternateRepresentationSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x3010, 0x0008, 0x3010, EVR_UI, "IrradiationEventUID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x4000, 0x0008, 0x4000, EVR_LT, "ACR_NEMA_IdentifyingComments", 1, -1, "ACR/NEMA2", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x9007, 0x0008, 0x9007, EVR_CS, "FrameType", 4, 4, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x9092, 0x0008, 0x9092, EVR_SQ, "ReferencedImageEvidenceSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x9121, 0x0008, 0x9121, EVR_SQ, "ReferencedRawDataSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x9123, 0x0008, 0x9123, EVR_UI, "CreatorVersionUID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x9124, 0x0008, 0x9124, EVR_SQ, "DerivationImageSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x9154, 0x0008, 0x9154, EVR_SQ, "SourceImageEvidenceSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x9205, 0x0008, 0x9205, EVR_CS, "PixelPresentation", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x9206, 0x0008, 0x9206, EVR_CS, "VolumetricProperties", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x9207, 0x0008, 0x9207, EVR_CS, "VolumeBasedCalculationTechnique", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x9208, 0x0008, 0x9208, EVR_CS, "ComplexImageComponent", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x9209, 0x0008, 0x9209, EVR_CS, "AcquisitionContrast", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x9215, 0x0008, 0x9215, EVR_SQ, "DerivationCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x9237, 0x0008, 0x9237, EVR_SQ, "ReferencedPresentationStateSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x9410, 0x0008, 0x9410, EVR_SQ, "ReferencedOtherPlaneSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x9458, 0x0008, 0x9458, EVR_SQ, "FrameDisplaySequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x9459, 0x0008, 0x9459, EVR_FL, "RecommendedDisplayFrameRateInFloat", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0008, 0x9460, 0x0008, 0x9460, EVR_CS, "SkipFrameRangeFlag", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } #ifdef WITH_PRIVATE_TAGS , { 0x0009, 0x0000, 0x0009, 0x0000, EVR_IS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "ACUSON" } , { 0x0009, 0x0000, 0x0009, 0x0000, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "AEGIS_DICOM_2.00" } , { 0x0009, 0x0000, 0x0009, 0x0000, EVR_UL, "FileLocation", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "CARDIO-D.R. 1.0" } , { 0x0009, 0x0000, 0x0009, 0x0000, EVR_SQ, "AnonymizerUIDMap", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "DCMTK_ANONYMIZER" } , { 0x0009, 0x0000, 0x0009, 0x0000, EVR_OB, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "MERGE TECHNOLOGIES, INC." } , { 0x0009, 0x0000, 0x0009, 0x0000, EVR_LT, "OriginalFileName", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PAPYRUS" } , { 0x0009, 0x0000, 0x0009, 0x0000, EVR_DS, "NumberOfMeasurements", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CM VA0 CMS" } , { 0x0009, 0x0000, 0x0009, 0x0000, EVR_LT, "DataObjectRecognitionCode", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1" } , { 0x0009, 0x0000, 0x0009, 0x0000, EVR_LO, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-GV-CT Release 1" } , { 0x0009, 0x0001, 0x0009, 0x0001, EVR_IS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "ACUSON" } , { 0x0009, 0x0001, 0x0009, 0x0001, EVR_UL, "FileSize", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "CARDIO-D.R. 1.0" } , { 0x0009, 0x0001, 0x0009, 0x0001, EVR_UN, "CRHeaderInformation", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FFP DATA" } , { 0x0009, 0x0001, 0x0009, 0x0001, EVR_LO, "FullFidelity", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_IDEN_01" } , { 0x0009, 0x0001, 0x0009, 0x0001, EVR_UN, "SIENETGeneralPurposeIMGEF", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "ISI" } , { 0x0009, 0x0001, 0x0009, 0x0001, EVR_UN, "RISPatientInfoIMGEF", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS ISI" } , { 0x0009, 0x0001, 0x0009, 0x0001, EVR_US, "SIENETCommandField", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIENET" } , { 0x0009, 0x0001, 0x0009, 0x0001, EVR_LT, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "TOSHIBA_MEC_1.0" } , { 0x0009, 0x0002, 0x0009, 0x0002, EVR_UN, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "ACUSON" } , { 0x0009, 0x0002, 0x0009, 0x0002, EVR_SH, "SuiteId", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_IDEN_01" } , { 0x0009, 0x0002, 0x0009, 0x0002, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "TOSHIBA_MEC_1.0" } , { 0x0009, 0x0003, 0x0009, 0x0003, EVR_UN, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "ACUSON" } , { 0x0009, 0x0003, 0x0009, 0x0003, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "TOSHIBA_MEC_1.0" } , { 0x0009, 0x0004, 0x0009, 0x0004, EVR_UN, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "ACUSON" } , { 0x0009, 0x0004, 0x0009, 0x0004, EVR_SH, "ImageControlUnit", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0009, 0x0004, 0x0009, 0x0004, EVR_SH, "ProductId", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_IDEN_01" } , { 0x0009, 0x0004, 0x0009, 0x0004, EVR_LO, "ImageDataConsistence", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1" } , { 0x0009, 0x0004, 0x0009, 0x0004, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "TOSHIBA_MEC_1.0" } , { 0x0009, 0x0005, 0x0009, 0x0005, EVR_UN, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "ACUSON" } , { 0x0009, 0x0005, 0x0009, 0x0005, EVR_OW, "ImageUID", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0009, 0x0006, 0x0009, 0x0006, EVR_UN, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "ACUSON" } , { 0x0009, 0x0006, 0x0009, 0x0006, EVR_OW, "RouteImageUID", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0009, 0x0007, 0x0009, 0x0007, EVR_UN, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "ACUSON" } , { 0x0009, 0x0008, 0x0009, 0x0008, EVR_LT, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "ACUSON" } , { 0x0009, 0x0008, 0x0009, 0x0008, EVR_UL, "ImageDisplayInformationVersionNo", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0009, 0x0008, 0x0009, 0x0008, EVR_CS, "ExposureChannel", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "INTEGRIS 1.0" } , { 0x0009, 0x0008, 0x0009, 0x0008, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1" } , { 0x0009, 0x0009, 0x0009, 0x0009, EVR_LT, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "ACUSON" } , { 0x0009, 0x0009, 0x0009, 0x0009, EVR_UL, "PatientInformationVersionNo", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0009, 0x000a, 0x0009, 0x000a, EVR_IS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "ACUSON" } , { 0x0009, 0x000b, 0x0009, 0x000b, EVR_IS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "ACUSON" } , { 0x0009, 0x000c, 0x0009, 0x000c, EVR_IS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "ACUSON" } , { 0x0009, 0x000c, 0x0009, 0x000c, EVR_OW, "FilmUID", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0009, 0x000d, 0x0009, 0x000d, EVR_IS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "ACUSON" } , { 0x0009, 0x000e, 0x0009, 0x000e, EVR_IS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "ACUSON" } , { 0x0009, 0x000f, 0x0009, 0x000f, EVR_UN, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "ACUSON" } , { 0x0009, 0x0010, 0x0009, 0x0010, EVR_IS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "ACUSON" } , { 0x0009, 0x0010, 0x0009, 0x0010, EVR_LO, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "AGFA" } , { 0x0009, 0x0010, 0x0009, 0x0010, EVR_UI, "AnonymizerUIDKey", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "DCMTK_ANONYMIZER" } , { 0x0009, 0x0010, 0x0009, 0x0010, EVR_CS, "ExposureUnitTypeCode", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0009, 0x0010, 0x0009, 0x0010, EVR_LO, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_GENIE_1" } , { 0x0009, 0x0010, 0x0009, 0x0010, EVR_LT, "OriginalFileLocation", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PAPYRUS" } , { 0x0009, 0x0010, 0x0009, 0x0010, EVR_LO, "SPIRelease", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR" } , { 0x0009, 0x0010, 0x0009, 0x0010, EVR_LT, "StorageMode", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CM VA0 CMS" } , { 0x0009, 0x0010, 0x0009, 0x0010, EVR_LT, "GeneratorIdentificationLabel", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CM VA0 LAB" } , { 0x0009, 0x0010, 0x0009, 0x0010, EVR_LT, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 IDE" } , { 0x0009, 0x0010, 0x0009, 0x0010, EVR_UN, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS DICOM" } , { 0x0009, 0x0010, 0x0009, 0x0010, EVR_LO, "RecognitionCode", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MED" } , { 0x0009, 0x0010, 0x0009, 0x0010, EVR_LT, "Comments", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI RELEASE 1" } , { 0x0009, 0x0010, 0x0009, 0x0010, EVR_LT, "Comments", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI Release 1" } , { 0x0009, 0x0010, 0x0009, 0x0010, EVR_LO, "Comments", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI" } , { 0x0009, 0x0010, 0x0009, 0x0010, EVR_LO, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-GV-CT Release 1" } , { 0x0009, 0x0011, 0x0009, 0x0011, EVR_UN, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "ACUSON" } , { 0x0009, 0x0011, 0x0009, 0x0011, EVR_LO, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "AGFA" } , { 0x0009, 0x0011, 0x0009, 0x0011, EVR_SL, "StudyFlags", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_GENIE_1" } , { 0x0009, 0x0011, 0x0009, 0x0011, EVR_LT, "GantryIdentificationLabel", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CM VA0 LAB" } , { 0x0009, 0x0012, 0x0009, 0x0012, EVR_IS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "ACUSON" } , { 0x0009, 0x0012, 0x0009, 0x0012, EVR_SL, "StudyType", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_GENIE_1" } , { 0x0009, 0x0012, 0x0009, 0x0012, EVR_LO, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR" } , { 0x0009, 0x0012, 0x0009, 0x0012, EVR_UL, "EvaluationMaskImage", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CM VA0 CMS" } , { 0x0009, 0x0012, 0x0009, 0x0012, EVR_LT, "X-RayTubeIdentificationLabel", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CM VA0 LAB" } , { 0x0009, 0x0012, 0x0009, 0x0012, EVR_LT, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS DICOM" } , { 0x0009, 0x0012, 0x0009, 0x0012, EVR_LO, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1" } , { 0x0009, 0x0013, 0x0009, 0x0013, EVR_IS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "ACUSON" } , { 0x0009, 0x0013, 0x0009, 0x0013, EVR_LO, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "AGFA" } , { 0x0009, 0x0013, 0x0009, 0x0013, EVR_LT, "DetectorIdentificationLabel", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CM VA0 LAB" } , { 0x0009, 0x0014, 0x0009, 0x0014, EVR_LT, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "ACUSON" } , { 0x0009, 0x0014, 0x0009, 0x0014, EVR_LO, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "AGFA" } , { 0x0009, 0x0014, 0x0009, 0x0014, EVR_LT, "DASIdentificationLabel", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CM VA0 LAB" } , { 0x0009, 0x0014, 0x0009, 0x0014, EVR_LT, "ReceiverPLA", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIENET" } , { 0x0009, 0x0015, 0x0009, 0x0015, EVR_UN, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "ACUSON" } , { 0x0009, 0x0015, 0x0009, 0x0015, EVR_LO, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "AGFA" } , { 0x0009, 0x0015, 0x0009, 0x0015, EVR_LT, "SMIIdentificationLabel", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CM VA0 LAB" } , { 0x0009, 0x0015, 0x0009, 0x0015, EVR_LO, "SPIImageUID", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI RELEASE 1" } , { 0x0009, 0x0015, 0x0009, 0x0015, EVR_LO, "SPIImageUID", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI Release 1" } , { 0x0009, 0x0015, 0x0009, 0x0015, EVR_LO, "SPIImageUID", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI" } , { 0x0009, 0x0015, 0x0009, 0x0015, EVR_LO, "UniqueIdentifier", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1" } , { 0x0009, 0x0016, 0x0009, 0x0016, EVR_LT, "CPUIdentificationLabel", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CM VA0 LAB" } , { 0x0009, 0x0016, 0x0009, 0x0016, EVR_US, "TransferPriority", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIENET" } , { 0x0009, 0x0016, 0x0009, 0x0016, EVR_LO, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1" } , { 0x0009, 0x0017, 0x0009, 0x0017, EVR_LT, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_IDEN_01" } , { 0x0009, 0x0018, 0x0009, 0x0018, EVR_LT, "DataSetIdentifier", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PAPYRUS" } , { 0x0009, 0x0018, 0x0009, 0x0018, EVR_LO, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1" } , { 0x0009, 0x001a, 0x0009, 0x001a, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_IDEN_01" } , { 0x0009, 0x001e, 0x0009, 0x001e, EVR_UI, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_GENIE_1" } , { 0x0009, 0x0020, 0x0009, 0x0020, EVR_UI, "AnonymizerUIDValue", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "DCMTK_ANONYMIZER" } , { 0x0009, 0x0020, 0x0009, 0x0020, EVR_LO, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_GENIE_1" } , { 0x0009, 0x0020, 0x0009, 0x0020, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_IDEN_01" } , { 0x0009, 0x0020, 0x0009, 0x0020, EVR_LT, "HeaderVersion", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CM VA0 LAB" } , { 0x0009, 0x0020, 0x0009, 0x0020, EVR_LT, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 ORI" } , { 0x0009, 0x0020, 0x0009, 0x0020, EVR_LO, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-GV-CT Release 1" } , { 0x0009, 0x0021, 0x0009, 0x0021, EVR_SL, "SeriesFlags", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_GENIE_1" } , { 0x0009, 0x0021, 0x0009, 0x0021, EVR_LT, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1" } , { 0x0009, 0x0022, 0x0009, 0x0022, EVR_SH, "UserOrientation", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_GENIE_1" } , { 0x0009, 0x0023, 0x0009, 0x0023, EVR_SL, "InitiationType", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_GENIE_1" } , { 0x0009, 0x0024, 0x0009, 0x0024, EVR_DS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0009, 0x0024, 0x0009, 0x0024, EVR_SL, "InitiationDelay", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_GENIE_1" } , { 0x0009, 0x0025, 0x0009, 0x0025, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0009, 0x0025, 0x0009, 0x0025, EVR_SL, "InitiationCountRate", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_GENIE_1" } , { 0x0009, 0x0026, 0x0009, 0x0026, EVR_SL, "NumberEnergySets", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_GENIE_1" } , { 0x0009, 0x0026, 0x0009, 0x0026, EVR_DA, "LastMoveDate", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CM VA0 CMS" } , { 0x0009, 0x0027, 0x0009, 0x0027, EVR_SL, "NumberDetectors", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_GENIE_1" } , { 0x0009, 0x0027, 0x0009, 0x0027, EVR_SL, "ImageActualDate", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_IDEN_01" } , { 0x0009, 0x0027, 0x0009, 0x0027, EVR_TM, "LastMoveTime", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CM VA0 CMS" } , { 0x0009, 0x0029, 0x0009, 0x0029, EVR_SL, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_GENIE_1" } , { 0x0009, 0x0029, 0x0009, 0x0029, EVR_LT, "ActualUser", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIENET" } , { 0x0009, 0x002a, 0x0009, 0x002a, EVR_SL, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_GENIE_1" } , { 0x0009, 0x002c, 0x0009, 0x002c, EVR_LO, "SeriesComments", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_GENIE_1" } , { 0x0009, 0x002d, 0x0009, 0x002d, EVR_SL, "TrackBeatAverage", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_GENIE_1" } , { 0x0009, 0x002e, 0x0009, 0x002e, EVR_FD, "DistancePrescribed", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_GENIE_1" } , { 0x0009, 0x002f, 0x0009, 0x002f, EVR_LT, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_IDEN_01" } , { 0x0009, 0x0030, 0x0009, 0x0030, EVR_SQ, "AnonymizerPatientIDMap", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "DCMTK_ANONYMIZER" } , { 0x0009, 0x0030, 0x0009, 0x0030, EVR_LO, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_GENIE_1" } , { 0x0009, 0x0030, 0x0009, 0x0030, EVR_SH, "ServiceId", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_IDEN_01" } , { 0x0009, 0x0030, 0x0009, 0x0030, EVR_LT, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 IDE" } , { 0x0009, 0x0030, 0x0009, 0x0030, EVR_LT, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 ORI" } , { 0x0009, 0x0030, 0x0009, 0x0030, EVR_UL, "ByteOffsetOfOriginalHeader", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MED" } , { 0x0009, 0x0030, 0x0009, 0x0030, EVR_LO, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-GV-CT Release 1" } , { 0x0009, 0x0031, 0x0009, 0x0031, EVR_SH, "MobileLocationNumber", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_IDEN_01" } , { 0x0009, 0x0031, 0x0009, 0x0031, EVR_LT, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 IDE" } , { 0x0009, 0x0031, 0x0009, 0x0031, EVR_UL, "LengthOfOriginalHeader", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MED" } , { 0x0009, 0x0031, 0x0009, 0x0031, EVR_LT, "PACSUniqueIdentifier", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1" } , { 0x0009, 0x0032, 0x0009, 0x0032, EVR_TM, "ExposureStartTime", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "INTEGRIS 1.0" } , { 0x0009, 0x0032, 0x0009, 0x0032, EVR_LT, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 IDE" } , { 0x0009, 0x0034, 0x0009, 0x0034, EVR_LT, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 IDE" } , { 0x0009, 0x0034, 0x0009, 0x0034, EVR_LT, "ClusterUniqueIdentifier", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1" } , { 0x0009, 0x0035, 0x0009, 0x0035, EVR_SL, "GantryLocusType", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_GENIE_1" } , { 0x0009, 0x0037, 0x0009, 0x0037, EVR_SL, "StartingHeartRate", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_GENIE_1" } , { 0x0009, 0x0038, 0x0009, 0x0038, EVR_SL, "RRWindowWidth", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_GENIE_1" } , { 0x0009, 0x0038, 0x0009, 0x0038, EVR_LT, "SystemUniqueIdentifier", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1" } , { 0x0009, 0x0039, 0x0009, 0x0039, EVR_SL, "RRWindowOffset", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_GENIE_1" } , { 0x0009, 0x0039, 0x0009, 0x0039, EVR_LT, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1" } , { 0x0009, 0x003a, 0x0009, 0x003a, EVR_SL, "PercentCycleImaged", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_GENIE_1" } , { 0x0009, 0x003e, 0x0009, 0x003e, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0009, 0x003f, 0x0009, 0x003f, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0009, 0x0040, 0x0009, 0x0040, EVR_SQ, "AlternateImageSequence", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "CARDIO-D.R. 1.0" } , { 0x0009, 0x0040, 0x0009, 0x0040, EVR_LO, "AnonymizerPatientIDKey", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "DCMTK_ANONYMIZER" } , { 0x0009, 0x0040, 0x0009, 0x0040, EVR_LO, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_GENIE_1" } , { 0x0009, 0x0040, 0x0009, 0x0040, EVR_LT, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 IDE" } , { 0x0009, 0x0040, 0x0009, 0x0040, EVR_UL, "ByteOffsetOfPixelmatrix", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MED" } , { 0x0009, 0x0040, 0x0009, 0x0040, EVR_US, "DataObjectType", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI RELEASE 1" } , { 0x0009, 0x0040, 0x0009, 0x0040, EVR_US, "DataObjectType", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI Release 1" } , { 0x0009, 0x0040, 0x0009, 0x0040, EVR_US, "DataObjectType", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI" } , { 0x0009, 0x0040, 0x0009, 0x0040, EVR_LO, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-GV-CT Release 1" } , { 0x0009, 0x0041, 0x0009, 0x0041, EVR_SL, "PatientFlags", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_GENIE_1" } , { 0x0009, 0x0041, 0x0009, 0x0041, EVR_UL, "LengthOfPixelmatrixInBytes", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MED" } , { 0x0009, 0x0041, 0x0009, 0x0041, EVR_LO, "DataObjectSubtype", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI RELEASE 1" } , { 0x0009, 0x0041, 0x0009, 0x0041, EVR_LO, "DataObjectSubtype", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI Release 1" } , { 0x0009, 0x0041, 0x0009, 0x0041, EVR_LT, "DataObjectSubtype", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI" } , { 0x0009, 0x0042, 0x0009, 0x0042, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0009, 0x0042, 0x0009, 0x0042, EVR_DA, "PatientCreationDate", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_GENIE_1" } , { 0x0009, 0x0042, 0x0009, 0x0042, EVR_LT, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 IDE" } , { 0x0009, 0x0043, 0x0009, 0x0043, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0009, 0x0043, 0x0009, 0x0043, EVR_TM, "PatientCreationTime", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_GENIE_1" } , { 0x0009, 0x0050, 0x0009, 0x0050, EVR_LO, "AnonymizerPatientIDValue", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "DCMTK_ANONYMIZER" } , { 0x0009, 0x0050, 0x0009, 0x0050, EVR_LT, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 IDE" } , { 0x0009, 0x0050, 0x0009, 0x0050, EVR_LT, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MED" } , { 0x0009, 0x0050, 0x0009, 0x0050, EVR_LO, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-GV-CT Release 1" } , { 0x0009, 0x0051, 0x0009, 0x0051, EVR_LT, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 IDE" } , { 0x0009, 0x0051, 0x0009, 0x0051, EVR_LT, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MED" } , { 0x0009, 0x0051, 0x0009, 0x0051, EVR_LT, "StudyUniqueIdentifier", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1" } , { 0x0009, 0x0060, 0x0009, 0x0060, EVR_LO, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-GV-CT Release 1" } , { 0x0009, 0x0061, 0x0009, 0x0061, EVR_LT, "SeriesUniqueIdentifier", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1" } , { 0x0009, 0x0070, 0x0009, 0x0070, EVR_LO, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-GV-CT Release 1" } , { 0x0009, 0x0075, 0x0009, 0x0075, EVR_LO, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-GV-CT Release 1" } , { 0x0009, 0x0080, 0x0009, 0x0080, EVR_LO, "KanjiHospitalName", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0009, 0x0080, 0x0009, 0x0080, EVR_LO, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-GV-CT Release 1" } , { 0x0009, 0x0090, 0x0009, 0x0090, EVR_ST, "DistributionCode", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0009, 0x0090, 0x0009, 0x0090, EVR_LO, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-GV-CT Release 1" } , { 0x0009, 0x0091, 0x0009, 0x0091, EVR_LT, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1" } , { 0x0009, 0x0092, 0x0009, 0x0092, EVR_SH, "KanjiDepartmentName", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0009, 0x00c0, 0x0009, 0x00c0, EVR_LT, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1;1" } , { 0x0009, 0x00c1, 0x0009, 0x00c1, EVR_LT, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1;1" } , { 0x0009, 0x00e2, 0x0009, 0x00e2, EVR_LT, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_IDEN_01" } , { 0x0009, 0x00e3, 0x0009, 0x00e3, EVR_UI, "EquipmentUID", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_IDEN_01" } , { 0x0009, 0x00e6, 0x0009, 0x00e6, EVR_SH, "GenesisVersionNow", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_IDEN_01" } , { 0x0009, 0x00e7, 0x0009, 0x00e7, EVR_UL, "ExamRecordChecksum", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_IDEN_01" } , { 0x0009, 0x00e8, 0x0009, 0x00e8, EVR_UL, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_IDEN_01" } , { 0x0009, 0x00e9, 0x0009, 0x00e9, EVR_SL, "ActualSeriesDataTimeStamp", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_IDEN_01" } , { 0x0009, 0x00f0, 0x0009, 0x00f0, EVR_CS, "BlackeningProcessFlag", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0009, 0x00f2, 0x0009, 0x00f2, EVR_LT, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1" } , { 0x0009, 0x00f3, 0x0009, 0x00f3, EVR_UN, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1" } , { 0x0009, 0x00f4, 0x0009, 0x00f4, EVR_LT, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1" } , { 0x0009, 0x00f5, 0x0009, 0x00f5, EVR_LT, "PDMEFIDPlaceholder", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MED" } , { 0x0009, 0x00f5, 0x0009, 0x00f5, EVR_UN, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1" } , { 0x0009, 0x00f6, 0x0009, 0x00f6, EVR_LT, "PDMDataObjectTypeExtension", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MED" } , { 0x0009, 0x00f7, 0x0009, 0x00f7, EVR_LT, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1" } , { 0x0009, 0x00f8, 0x0009, 0x00f8, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0009, 0x00fb, 0x0009, 0x00fb, EVR_IS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } #endif , { 0x0010, 0x0010, 0x0010, 0x0010, EVR_PN, "PatientName", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0010, 0x0020, 0x0010, 0x0020, EVR_LO, "PatientID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0010, 0x0021, 0x0010, 0x0021, EVR_LO, "IssuerOfPatientID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0010, 0x0022, 0x0010, 0x0022, EVR_CS, "TypeOfPatientID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0010, 0x0024, 0x0010, 0x0024, EVR_SQ, "IssuerOfPatientIDQualifiersSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0010, 0x0030, 0x0010, 0x0030, EVR_DA, "PatientBirthDate", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0010, 0x0032, 0x0010, 0x0032, EVR_TM, "PatientBirthTime", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0010, 0x0040, 0x0010, 0x0040, EVR_CS, "PatientSex", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0010, 0x0050, 0x0010, 0x0050, EVR_SQ, "PatientInsurancePlanCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0010, 0x0101, 0x0010, 0x0101, EVR_SQ, "PatientPrimaryLanguageCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0010, 0x0102, 0x0010, 0x0102, EVR_SQ, "PatientPrimaryLanguageModifierCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0010, 0x1000, 0x0010, 0x1000, EVR_LO, "OtherPatientIDs", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0010, 0x1001, 0x0010, 0x1001, EVR_PN, "OtherPatientNames", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0010, 0x1002, 0x0010, 0x1002, EVR_SQ, "OtherPatientIDsSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0010, 0x1005, 0x0010, 0x1005, EVR_PN, "PatientBirthName", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0010, 0x1010, 0x0010, 0x1010, EVR_AS, "PatientAge", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0010, 0x1020, 0x0010, 0x1020, EVR_DS, "PatientSize", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0010, 0x1021, 0x0010, 0x1021, EVR_SQ, "PatientSizeCodeSequence", 1, 1, "CP_650", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0010, 0x1030, 0x0010, 0x1030, EVR_DS, "PatientWeight", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0010, 0x1040, 0x0010, 0x1040, EVR_LO, "PatientAddress", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0010, 0x1050, 0x0010, 0x1050, EVR_LT, "ACR_NEMA_InsurancePlanIdentification", 1, -1, "ACR/NEMA2", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0010, 0x1060, 0x0010, 0x1060, EVR_PN, "PatientMotherBirthName", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0010, 0x1080, 0x0010, 0x1080, EVR_LO, "MilitaryRank", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0010, 0x1081, 0x0010, 0x1081, EVR_LO, "BranchOfService", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0010, 0x1090, 0x0010, 0x1090, EVR_LO, "MedicalRecordLocator", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0010, 0x2000, 0x0010, 0x2000, EVR_LO, "MedicalAlerts", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0010, 0x2110, 0x0010, 0x2110, EVR_LO, "Allergies", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0010, 0x2150, 0x0010, 0x2150, EVR_LO, "CountryOfResidence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0010, 0x2152, 0x0010, 0x2152, EVR_LO, "RegionOfResidence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0010, 0x2154, 0x0010, 0x2154, EVR_SH, "PatientTelephoneNumbers", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0010, 0x2160, 0x0010, 0x2160, EVR_SH, "EthnicGroup", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0010, 0x2180, 0x0010, 0x2180, EVR_SH, "Occupation", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0010, 0x21a0, 0x0010, 0x21a0, EVR_CS, "SmokingStatus", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0010, 0x21b0, 0x0010, 0x21b0, EVR_LT, "AdditionalPatientHistory", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0010, 0x21c0, 0x0010, 0x21c0, EVR_US, "PregnancyStatus", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0010, 0x21d0, 0x0010, 0x21d0, EVR_DA, "LastMenstrualDate", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0010, 0x21f0, 0x0010, 0x21f0, EVR_LO, "PatientReligiousPreference", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0010, 0x2201, 0x0010, 0x2201, EVR_LO, "PatientSpeciesDescription", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0010, 0x2202, 0x0010, 0x2202, EVR_SQ, "PatientSpeciesCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0010, 0x2203, 0x0010, 0x2203, EVR_CS, "PatientSexNeutered", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0010, 0x2210, 0x0010, 0x2210, EVR_CS, "AnatomicalOrientationType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0010, 0x2292, 0x0010, 0x2292, EVR_LO, "PatientBreedDescription", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0010, 0x2293, 0x0010, 0x2293, EVR_SQ, "PatientBreedCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0010, 0x2294, 0x0010, 0x2294, EVR_SQ, "BreedRegistrationSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0010, 0x2295, 0x0010, 0x2295, EVR_LO, "BreedRegistrationNumber", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0010, 0x2296, 0x0010, 0x2296, EVR_SQ, "BreedRegistryCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0010, 0x2297, 0x0010, 0x2297, EVR_PN, "ResponsiblePerson", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0010, 0x2298, 0x0010, 0x2298, EVR_CS, "ResponsiblePersonRole", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0010, 0x2299, 0x0010, 0x2299, EVR_LO, "ResponsibleOrganization", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0010, 0x4000, 0x0010, 0x4000, EVR_LT, "PatientComments", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0010, 0x9431, 0x0010, 0x9431, EVR_FL, "ExaminedBodyThickness", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } #ifdef WITH_PRIVATE_TAGS , { 0x0011, 0x0001, 0x0011, 0x0001, EVR_LT, "PatientDOB", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "DLX_PATNT_01" } , { 0x0011, 0x0001, 0x0011, 0x0001, EVR_LT, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "TOSHIBA_MEC_1.0" } , { 0x0011, 0x0002, 0x0011, 0x0002, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "TOSHIBA_MEC_1.0" } , { 0x0011, 0x0003, 0x0011, 0x0003, EVR_LT, "PatientUID", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS ISI" } , { 0x0011, 0x0004, 0x0011, 0x0004, EVR_LT, "PatientID", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS ISI" } , { 0x0011, 0x000a, 0x0011, 0x000a, EVR_SL, "SeriesType", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_GENIE_1" } , { 0x0011, 0x000a, 0x0011, 0x000a, EVR_LT, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CM VA0 CMS" } , { 0x0011, 0x000a, 0x0011, 0x000a, EVR_LT, "CaseID", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS ISI" } , { 0x0011, 0x000b, 0x0011, 0x000b, EVR_SL, "EffectiveSeriesDuration", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_GENIE_1" } , { 0x0011, 0x000c, 0x0011, 0x000c, EVR_SL, "NumBeats", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_GENIE_1" } , { 0x0011, 0x000d, 0x0011, 0x000d, EVR_LO, "RadioNuclideName", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_GENIE_1" } , { 0x0011, 0x0010, 0x0011, 0x0010, EVR_LO, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_GENIE_1" } , { 0x0011, 0x0010, 0x0011, 0x0010, EVR_SS, "PatientStatus", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_PATI_01" } , { 0x0011, 0x0010, 0x0011, 0x0010, EVR_DA, "RegistrationDate", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CM VA0 CMS" } , { 0x0011, 0x0010, 0x0011, 0x0010, EVR_LT, "PatientUID", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RIS" } , { 0x0011, 0x0010, 0x0011, 0x0010, EVR_LO, "Organ", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI RELEASE 1" } , { 0x0011, 0x0010, 0x0011, 0x0010, EVR_LO, "Organ", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI Release 1" } , { 0x0011, 0x0010, 0x0011, 0x0010, EVR_LT, "Organ", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI" } , { 0x0011, 0x0010, 0x0011, 0x0010, EVR_LO, "Organ", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI RELEASE 1" } , { 0x0011, 0x0010, 0x0011, 0x0010, EVR_LT, "PatientEntryID", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1" } , { 0x0011, 0x0011, 0x0011, 0x0011, EVR_TM, "RegistrationTime", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CM VA0 CMS" } , { 0x0011, 0x0011, 0x0011, 0x0011, EVR_LT, "PatientID", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RIS" } , { 0x0011, 0x0012, 0x0011, 0x0012, EVR_LO, "DatasetName", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_GENIE_1" } , { 0x0011, 0x0013, 0x0011, 0x0013, EVR_SL, "DatasetType", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_GENIE_1" } , { 0x0011, 0x0015, 0x0011, 0x0015, EVR_SL, "DetectorNumber", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_GENIE_1" } , { 0x0011, 0x0015, 0x0011, 0x0015, EVR_LO, "AllergyIndication", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI RELEASE 1" } , { 0x0011, 0x0015, 0x0011, 0x0015, EVR_LO, "AllergyIndication", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI Release 1" } , { 0x0011, 0x0015, 0x0011, 0x0015, EVR_LT, "AllergyIndication", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI" } , { 0x0011, 0x0015, 0x0011, 0x0015, EVR_LO, "AllergyIndication", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI RELEASE 1" } , { 0x0011, 0x0016, 0x0011, 0x0016, EVR_SL, "EnergyNumber", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_GENIE_1" } , { 0x0011, 0x0017, 0x0011, 0x0017, EVR_SL, "RRIntervalWindowNumber", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_GENIE_1" } , { 0x0011, 0x0018, 0x0011, 0x0018, EVR_SL, "MGBinNumber", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_GENIE_1" } , { 0x0011, 0x0018, 0x0011, 0x0018, EVR_LT, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 2;1" } , { 0x0011, 0x0019, 0x0011, 0x0019, EVR_FD, "RadiusOfRotation", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_GENIE_1" } , { 0x0011, 0x001a, 0x0011, 0x001a, EVR_SL, "DetectorCountZone", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_GENIE_1" } , { 0x0011, 0x001b, 0x0011, 0x001b, EVR_SL, "NumEnergyWindows", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_GENIE_1" } , { 0x0011, 0x001c, 0x0011, 0x001c, EVR_SL, "EnergyOffset", 4, 4, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_GENIE_1" } , { 0x0011, 0x001d, 0x0011, 0x001d, EVR_SL, "EnergyRange", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_GENIE_1" } , { 0x0011, 0x001f, 0x0011, 0x001f, EVR_SL, "ImageOrientation", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_GENIE_1" } , { 0x0011, 0x0020, 0x0011, 0x0020, EVR_SL, "FluoroTimer", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA GEN" } , { 0x0011, 0x0020, 0x0011, 0x0020, EVR_DA, "PatientRegistrationDate", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RIS" } , { 0x0011, 0x0020, 0x0011, 0x0020, EVR_LO, "Pregnancy", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI RELEASE 1" } , { 0x0011, 0x0020, 0x0011, 0x0020, EVR_LO, "Pregnancy", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI Release 1" } , { 0x0011, 0x0020, 0x0011, 0x0020, EVR_LT, "Pregnancy", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI" } , { 0x0011, 0x0020, 0x0011, 0x0020, EVR_LO, "Pregnancy", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI RELEASE 1" } , { 0x0011, 0x0021, 0x0011, 0x0021, EVR_TM, "PatientRegistrationTime", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RIS" } , { 0x0011, 0x0021, 0x0011, 0x0021, EVR_UN, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1" } , { 0x0011, 0x0022, 0x0011, 0x0022, EVR_LT, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CM VA0 CMS" } , { 0x0011, 0x0022, 0x0011, 0x0022, EVR_LT, "RequestID", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS ISI" } , { 0x0011, 0x0022, 0x0011, 0x0022, EVR_UN, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1" } , { 0x0011, 0x0023, 0x0011, 0x0023, EVR_SL, "UseFOVMask", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_GENIE_1" } , { 0x0011, 0x0023, 0x0011, 0x0023, EVR_DS, "UsedPatientWeight", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CM VA0 CMS" } , { 0x0011, 0x0023, 0x0011, 0x0023, EVR_LT, "ExaminationUID", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS ISI" } , { 0x0011, 0x0024, 0x0011, 0x0024, EVR_SL, "FOVMaskYCutoffAngle", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_GENIE_1" } , { 0x0011, 0x0025, 0x0011, 0x0025, EVR_SL, "FOVMaskCutoffAngle", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_GENIE_1" } , { 0x0011, 0x0025, 0x0011, 0x0025, EVR_SL, "PtopDoseAreaProduct", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA GEN" } , { 0x0011, 0x0026, 0x0011, 0x0026, EVR_SL, "TableOrientation", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_GENIE_1" } , { 0x0011, 0x0026, 0x0011, 0x0026, EVR_SL, "PtopTotalSkinDose", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA GEN" } , { 0x0011, 0x0027, 0x0011, 0x0027, EVR_SL, "ROITopLeft", 2, 2, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_GENIE_1" } , { 0x0011, 0x0028, 0x0011, 0x0028, EVR_SL, "ROIBottomRight", 2, 2, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_GENIE_1" } , { 0x0011, 0x0028, 0x0011, 0x0028, EVR_SL, "FluoroTimerA", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0011, 0x0028, 0x0011, 0x0028, EVR_SL, "FluoroTimerB", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE B" } , { 0x0011, 0x0029, 0x0011, 0x0029, EVR_SL, "FluoroSkinDoseA", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0011, 0x0029, 0x0011, 0x0029, EVR_SL, "FluoroSkinDoseB", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE B" } , { 0x0011, 0x002a, 0x0011, 0x002a, EVR_SL, "TotalSkinDoseA", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0011, 0x002a, 0x0011, 0x002a, EVR_SL, "TotalSkinDoseB", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE B" } , { 0x0011, 0x002b, 0x0011, 0x002b, EVR_SL, "FluoroDoseAreaProductA", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0011, 0x002b, 0x0011, 0x002b, EVR_SL, "FluoroDoseAreaProductB", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE B" } , { 0x0011, 0x002c, 0x0011, 0x002c, EVR_SL, "TotalDoseAreaProductA", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0011, 0x002c, 0x0011, 0x002c, EVR_SL, "TotalDoseAreaProductB", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE B" } , { 0x0011, 0x0030, 0x0011, 0x0030, EVR_LO, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_GENIE_1" } , { 0x0011, 0x0030, 0x0011, 0x0030, EVR_LT, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA GEN" } , { 0x0011, 0x0030, 0x0011, 0x0030, EVR_LT, "PatientnameRIS", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RIS" } , { 0x0011, 0x0031, 0x0011, 0x0031, EVR_LT, "PatientprenameRIS", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RIS" } , { 0x0011, 0x0031, 0x0011, 0x0031, EVR_UN, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1" } , { 0x0011, 0x0032, 0x0011, 0x0032, EVR_UN, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1" } , { 0x0011, 0x0033, 0x0011, 0x0033, EVR_LO, "EnergyCorrectName", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_GENIE_1" } , { 0x0011, 0x0034, 0x0011, 0x0034, EVR_LO, "SpatialCorrectName", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_GENIE_1" } , { 0x0011, 0x0035, 0x0011, 0x0035, EVR_LO, "TuningCalibName", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_GENIE_1" } , { 0x0011, 0x0035, 0x0011, 0x0035, EVR_LO, "PatientInitialPuckCounter", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA GEN" } , { 0x0011, 0x0036, 0x0011, 0x0036, EVR_LO, "UniformityCorrectName", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_GENIE_1" } , { 0x0011, 0x0037, 0x0011, 0x0037, EVR_LO, "AcquisitionSpecificCorrectName", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_GENIE_1" } , { 0x0011, 0x0038, 0x0011, 0x0038, EVR_SL, "ByteOrder", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_GENIE_1" } , { 0x0011, 0x003a, 0x0011, 0x003a, EVR_SL, "PictureFormat", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_GENIE_1" } , { 0x0011, 0x003b, 0x0011, 0x003b, EVR_FD, "PixelScale", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_GENIE_1" } , { 0x0011, 0x003c, 0x0011, 0x003c, EVR_FD, "PixelOffset", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_GENIE_1" } , { 0x0011, 0x003e, 0x0011, 0x003e, EVR_SL, "FOVShape", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_GENIE_1" } , { 0x0011, 0x003f, 0x0011, 0x003f, EVR_SL, "DatasetFlags", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_GENIE_1" } , { 0x0011, 0x0040, 0x0011, 0x0040, EVR_IS, "OrganCode", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CM VA0 CMS" } , { 0x0011, 0x0040, 0x0011, 0x0040, EVR_SS, "SPIDataObjectType", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA GEN" } , { 0x0011, 0x0040, 0x0011, 0x0040, EVR_LT, "PatientHospitalStatus", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RIS" } , { 0x0011, 0x0041, 0x0011, 0x0041, EVR_LT, "MedicalAlerts", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RIS" } , { 0x0011, 0x0042, 0x0011, 0x0042, EVR_LT, "ContrastAllergies", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RIS" } , { 0x0011, 0x0044, 0x0011, 0x0044, EVR_FD, "ThresholdCenter", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_GENIE_1" } , { 0x0011, 0x0045, 0x0011, 0x0045, EVR_FD, "ThresholdWidth", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_GENIE_1" } , { 0x0011, 0x0046, 0x0011, 0x0046, EVR_SL, "InterpolationType", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_GENIE_1" } , { 0x0011, 0x0055, 0x0011, 0x0055, EVR_FD, "Period", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_GENIE_1" } , { 0x0011, 0x0056, 0x0011, 0x0056, EVR_FD, "ElapsedTime", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_GENIE_1" } , { 0x0011, 0x00a1, 0x0011, 0x00a1, EVR_DA, "PatientRegistrationDate", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS ISI" } , { 0x0011, 0x00a2, 0x0011, 0x00a2, EVR_TM, "PatientRegistrationTime", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS ISI" } , { 0x0011, 0x00b0, 0x0011, 0x00b0, EVR_LT, "PatientLastName", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS ISI" } , { 0x0011, 0x00b2, 0x0011, 0x00b2, EVR_LT, "PatientFirstName", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS ISI" } , { 0x0011, 0x00b4, 0x0011, 0x00b4, EVR_LT, "PatientHospitalStatus", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS ISI" } , { 0x0011, 0x00bc, 0x0011, 0x00bc, EVR_TM, "CurrentLocationTime", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS ISI" } , { 0x0011, 0x00c0, 0x0011, 0x00c0, EVR_LT, "PatientInsuranceStatus", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS ISI" } , { 0x0011, 0x00d0, 0x0011, 0x00d0, EVR_LT, "PatientBillingType", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS ISI" } , { 0x0011, 0x00d2, 0x0011, 0x00d2, EVR_LT, "PatientBillingAddress", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS ISI" } #endif , { 0x0012, 0x0010, 0x0012, 0x0010, EVR_LO, "ClinicalTrialSponsorName", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0012, 0x0020, 0x0012, 0x0020, EVR_LO, "ClinicalTrialProtocolID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0012, 0x0021, 0x0012, 0x0021, EVR_LO, "ClinicalTrialProtocolName", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0012, 0x0030, 0x0012, 0x0030, EVR_LO, "ClinicalTrialSiteID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0012, 0x0031, 0x0012, 0x0031, EVR_LO, "ClinicalTrialSiteName", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0012, 0x0040, 0x0012, 0x0040, EVR_LO, "ClinicalTrialSubjectID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0012, 0x0042, 0x0012, 0x0042, EVR_LO, "ClinicalTrialSubjectReadingID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0012, 0x0050, 0x0012, 0x0050, EVR_LO, "ClinicalTrialTimePointID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0012, 0x0051, 0x0012, 0x0051, EVR_ST, "ClinicalTrialTimePointDescription", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0012, 0x0060, 0x0012, 0x0060, EVR_LO, "ClinicalTrialCoordinatingCenterName", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0012, 0x0062, 0x0012, 0x0062, EVR_CS, "PatientIdentityRemoved", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0012, 0x0063, 0x0012, 0x0063, EVR_LO, "DeidentificationMethod", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0012, 0x0064, 0x0012, 0x0064, EVR_SQ, "DeidentificationMethodCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0012, 0x0071, 0x0012, 0x0071, EVR_LO, "ClinicalTrialSeriesID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0012, 0x0072, 0x0012, 0x0072, EVR_LO, "ClinicalTrialSeriesDescription", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0012, 0x0081, 0x0012, 0x0081, EVR_LO, "ClinicalTrialProtocolEthicsCommitteeName", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0012, 0x0082, 0x0012, 0x0082, EVR_LO, "ClinicalTrialProtocolEthicsCommitteeApprovalNumber", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0012, 0x0083, 0x0012, 0x0083, EVR_SQ, "ConsentForClinicalTrialUseSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0012, 0x0084, 0x0012, 0x0084, EVR_CS, "DistributionType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0012, 0x0085, 0x0012, 0x0085, EVR_CS, "ConsentForDistributionFlag", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } #ifdef WITH_PRIVATE_TAGS , { 0x0013, 0x0000, 0x0013, 0x0000, EVR_LT, "ModifyingPhysician", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CM VA0 CMS" } , { 0x0013, 0x0010, 0x0013, 0x0010, EVR_FD, "DigitalFOV", 2, 2, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_GENIE_1" } , { 0x0013, 0x0010, 0x0013, 0x0010, EVR_DA, "ModificationDate", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CM VA0 CMS" } , { 0x0013, 0x0011, 0x0013, 0x0011, EVR_SL, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_GENIE_1" } , { 0x0013, 0x0012, 0x0013, 0x0012, EVR_SL, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_GENIE_1" } , { 0x0013, 0x0012, 0x0013, 0x0012, EVR_TM, "ModificationTime", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CM VA0 CMS" } , { 0x0013, 0x0016, 0x0013, 0x0016, EVR_SL, "AutoTrackPeak", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_GENIE_1" } , { 0x0013, 0x0017, 0x0013, 0x0017, EVR_SL, "AutoTrackWidth", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_GENIE_1" } , { 0x0013, 0x0018, 0x0013, 0x0018, EVR_FD, "TransmissionScanTime", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_GENIE_1" } , { 0x0013, 0x0019, 0x0013, 0x0019, EVR_FD, "TransmissionMaskWidth", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_GENIE_1" } , { 0x0013, 0x001a, 0x0013, 0x001a, EVR_FD, "CopperAttenuatorThickness", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_GENIE_1" } , { 0x0013, 0x001c, 0x0013, 0x001c, EVR_FD, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_GENIE_1" } , { 0x0013, 0x001d, 0x0013, 0x001d, EVR_FD, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_GENIE_1" } , { 0x0013, 0x001e, 0x0013, 0x001e, EVR_FD, "TomoViewOffset", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_GENIE_1" } , { 0x0013, 0x0020, 0x0013, 0x0020, EVR_LO, "PatientName", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CM VA0 CMS" } , { 0x0013, 0x0022, 0x0013, 0x0022, EVR_LO, "PatientId", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CM VA0 CMS" } , { 0x0013, 0x0026, 0x0013, 0x0026, EVR_LT, "StudyComments", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_GENIE_1" } , { 0x0013, 0x0030, 0x0013, 0x0030, EVR_DA, "PatientBirthdate", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CM VA0 CMS" } , { 0x0013, 0x0031, 0x0013, 0x0031, EVR_DS, "PatientWeight", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CM VA0 CMS" } , { 0x0013, 0x0032, 0x0013, 0x0032, EVR_LT, "PatientsMaidenName", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CM VA0 CMS" } , { 0x0013, 0x0033, 0x0013, 0x0033, EVR_LT, "ReferringPhysician", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CM VA0 CMS" } , { 0x0013, 0x0034, 0x0013, 0x0034, EVR_LT, "AdmittingDiagnosis", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CM VA0 CMS" } , { 0x0013, 0x0035, 0x0013, 0x0035, EVR_LO, "PatientSex", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CM VA0 CMS" } , { 0x0013, 0x0040, 0x0013, 0x0040, EVR_LO, "ProcedureDescription", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CM VA0 CMS" } , { 0x0013, 0x0042, 0x0013, 0x0042, EVR_LO, "RestDirection", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CM VA0 CMS" } , { 0x0013, 0x0044, 0x0013, 0x0044, EVR_LO, "PatientPosition", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CM VA0 CMS" } , { 0x0013, 0x0046, 0x0013, 0x0046, EVR_LT, "ViewDirection", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CM VA0 CMS" } , { 0x0013, 0x0050, 0x0013, 0x0050, EVR_LT, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CM VA0 CMS" } , { 0x0013, 0x0051, 0x0013, 0x0051, EVR_LT, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CM VA0 CMS" } , { 0x0013, 0x0052, 0x0013, 0x0052, EVR_LT, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CM VA0 CMS" } , { 0x0013, 0x0053, 0x0013, 0x0053, EVR_LT, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CM VA0 CMS" } , { 0x0013, 0x0054, 0x0013, 0x0054, EVR_LT, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CM VA0 CMS" } , { 0x0013, 0x0055, 0x0013, 0x0055, EVR_LT, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CM VA0 CMS" } , { 0x0013, 0x0056, 0x0013, 0x0056, EVR_LT, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CM VA0 CMS" } , { 0x0015, 0x0001, 0x0015, 0x0001, EVR_DS, "StenosisCalibrationRatio", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "DLX_EXAMS_01" } , { 0x0015, 0x0002, 0x0015, 0x0002, EVR_DS, "StenosisMagnification", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "DLX_EXAMS_01" } , { 0x0015, 0x0003, 0x0015, 0x0003, EVR_DS, "CardiacCalibrationRatio", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "DLX_EXAMS_01" } , { 0x0017, 0x0000, 0x0017, 0x0000, EVR_LO, "ExtendedBodyPart", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SVISION" } , { 0x0017, 0x0010, 0x0017, 0x0010, EVR_LO, "ExtendedViewPosition", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SVISION" } , { 0x0017, 0x00f0, 0x0017, 0x00f0, EVR_IS, "ImagesSOPClass", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SVISION" } #endif , { 0x0018, 0x0010, 0x0018, 0x0010, EVR_LO, "ContrastBolusAgent", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x0012, 0x0018, 0x0012, EVR_SQ, "ContrastBolusAgentSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x0014, 0x0018, 0x0014, EVR_SQ, "ContrastBolusAdministrationRouteSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x0015, 0x0018, 0x0015, EVR_CS, "BodyPartExamined", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x0020, 0x0018, 0x0020, EVR_CS, "ScanningSequence", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x0021, 0x0018, 0x0021, EVR_CS, "SequenceVariant", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x0022, 0x0018, 0x0022, EVR_CS, "ScanOptions", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x0023, 0x0018, 0x0023, EVR_CS, "MRAcquisitionType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x0024, 0x0018, 0x0024, EVR_SH, "SequenceName", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x0025, 0x0018, 0x0025, EVR_CS, "AngioFlag", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x0026, 0x0018, 0x0026, EVR_SQ, "InterventionDrugInformationSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x0027, 0x0018, 0x0027, EVR_TM, "InterventionDrugStopTime", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x0028, 0x0018, 0x0028, EVR_DS, "InterventionDrugDose", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x0029, 0x0018, 0x0029, EVR_SQ, "InterventionDrugCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x002a, 0x0018, 0x002a, EVR_SQ, "AdditionalDrugSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x0030, 0x0018, 0x0030, EVR_LO, "RETIRED_Radionuclide", 1, -1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x0031, 0x0018, 0x0031, EVR_LO, "Radiopharmaceutical", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x0032, 0x0018, 0x0032, EVR_DS, "RETIRED_EnergyWindowCenterline", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x0033, 0x0018, 0x0033, EVR_DS, "RETIRED_EnergyWindowTotalWidth", 1, -1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x0034, 0x0018, 0x0034, EVR_LO, "InterventionDrugName", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x0035, 0x0018, 0x0035, EVR_TM, "InterventionDrugStartTime", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x0036, 0x0018, 0x0036, EVR_SQ, "InterventionSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x0037, 0x0018, 0x0037, EVR_CS, "RETIRED_TherapyType", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x0038, 0x0018, 0x0038, EVR_CS, "InterventionStatus", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x0039, 0x0018, 0x0039, EVR_CS, "RETIRED_TherapyDescription", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x003a, 0x0018, 0x003a, EVR_ST, "InterventionDescription", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x0040, 0x0018, 0x0040, EVR_IS, "CineRate", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x0042, 0x0018, 0x0042, EVR_CS, "InitialCineRunState", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x0050, 0x0018, 0x0050, EVR_DS, "SliceThickness", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x0060, 0x0018, 0x0060, EVR_DS, "KVP", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x0070, 0x0018, 0x0070, EVR_IS, "CountsAccumulated", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x0071, 0x0018, 0x0071, EVR_CS, "AcquisitionTerminationCondition", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x0072, 0x0018, 0x0072, EVR_DS, "EffectiveDuration", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x0073, 0x0018, 0x0073, EVR_CS, "AcquisitionStartCondition", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x0074, 0x0018, 0x0074, EVR_IS, "AcquisitionStartConditionData", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x0075, 0x0018, 0x0075, EVR_IS, "AcquisitionTerminationConditionData", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x0080, 0x0018, 0x0080, EVR_DS, "RepetitionTime", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x0081, 0x0018, 0x0081, EVR_DS, "EchoTime", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x0082, 0x0018, 0x0082, EVR_DS, "InversionTime", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x0083, 0x0018, 0x0083, EVR_DS, "NumberOfAverages", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x0084, 0x0018, 0x0084, EVR_DS, "ImagingFrequency", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x0085, 0x0018, 0x0085, EVR_SH, "ImagedNucleus", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x0086, 0x0018, 0x0086, EVR_IS, "EchoNumbers", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x0087, 0x0018, 0x0087, EVR_DS, "MagneticFieldStrength", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x0088, 0x0018, 0x0088, EVR_DS, "SpacingBetweenSlices", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x0089, 0x0018, 0x0089, EVR_IS, "NumberOfPhaseEncodingSteps", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x0090, 0x0018, 0x0090, EVR_DS, "DataCollectionDiameter", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x0091, 0x0018, 0x0091, EVR_IS, "EchoTrainLength", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x0093, 0x0018, 0x0093, EVR_DS, "PercentSampling", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x0094, 0x0018, 0x0094, EVR_DS, "PercentPhaseFieldOfView", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x0095, 0x0018, 0x0095, EVR_DS, "PixelBandwidth", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1000, 0x0018, 0x1000, EVR_LO, "DeviceSerialNumber", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1002, 0x0018, 0x1002, EVR_UI, "DeviceUID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1003, 0x0018, 0x1003, EVR_LO, "DeviceID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1004, 0x0018, 0x1004, EVR_LO, "PlateID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1005, 0x0018, 0x1005, EVR_LO, "GeneratorID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1006, 0x0018, 0x1006, EVR_LO, "GridID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1007, 0x0018, 0x1007, EVR_LO, "CassetteID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1008, 0x0018, 0x1008, EVR_LO, "GantryID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1010, 0x0018, 0x1010, EVR_LO, "SecondaryCaptureDeviceID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1011, 0x0018, 0x1011, EVR_LO, "RETIRED_HardcopyCreationDeviceID", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1012, 0x0018, 0x1012, EVR_DA, "DateOfSecondaryCapture", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1014, 0x0018, 0x1014, EVR_TM, "TimeOfSecondaryCapture", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1016, 0x0018, 0x1016, EVR_LO, "SecondaryCaptureDeviceManufacturer", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1017, 0x0018, 0x1017, EVR_LO, "RETIRED_HardcopyDeviceManufacturer", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1018, 0x0018, 0x1018, EVR_LO, "SecondaryCaptureDeviceManufacturerModelName", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1019, 0x0018, 0x1019, EVR_LO, "SecondaryCaptureDeviceSoftwareVersions", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x101a, 0x0018, 0x101a, EVR_LO, "RETIRED_HardcopyDeviceSoftwareVersion", 1, -1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x101b, 0x0018, 0x101b, EVR_LO, "RETIRED_HardcopyDeviceManufacturerModelName", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1020, 0x0018, 0x1020, EVR_LO, "SoftwareVersions", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1022, 0x0018, 0x1022, EVR_SH, "VideoImageFormatAcquired", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1023, 0x0018, 0x1023, EVR_LO, "DigitalImageFormatAcquired", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1030, 0x0018, 0x1030, EVR_LO, "ProtocolName", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1040, 0x0018, 0x1040, EVR_LO, "ContrastBolusRoute", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1041, 0x0018, 0x1041, EVR_DS, "ContrastBolusVolume", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1042, 0x0018, 0x1042, EVR_TM, "ContrastBolusStartTime", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1043, 0x0018, 0x1043, EVR_TM, "ContrastBolusStopTime", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1044, 0x0018, 0x1044, EVR_DS, "ContrastBolusTotalDose", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1045, 0x0018, 0x1045, EVR_IS, "SyringeCounts", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1046, 0x0018, 0x1046, EVR_DS, "ContrastFlowRate", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1047, 0x0018, 0x1047, EVR_DS, "ContrastFlowDuration", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1048, 0x0018, 0x1048, EVR_CS, "ContrastBolusIngredient", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1049, 0x0018, 0x1049, EVR_DS, "ContrastBolusIngredientConcentration", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1050, 0x0018, 0x1050, EVR_DS, "SpatialResolution", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1060, 0x0018, 0x1060, EVR_DS, "TriggerTime", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1061, 0x0018, 0x1061, EVR_LO, "TriggerSourceOrType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1062, 0x0018, 0x1062, EVR_IS, "NominalInterval", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1063, 0x0018, 0x1063, EVR_DS, "FrameTime", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1064, 0x0018, 0x1064, EVR_LO, "CardiacFramingType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1065, 0x0018, 0x1065, EVR_DS, "FrameTimeVector", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1066, 0x0018, 0x1066, EVR_DS, "FrameDelay", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1067, 0x0018, 0x1067, EVR_DS, "ImageTriggerDelay", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1068, 0x0018, 0x1068, EVR_DS, "MultiplexGroupTimeOffset", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1069, 0x0018, 0x1069, EVR_DS, "TriggerTimeOffset", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x106a, 0x0018, 0x106a, EVR_CS, "SynchronizationTrigger", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x106c, 0x0018, 0x106c, EVR_US, "SynchronizationChannel", 2, 2, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x106e, 0x0018, 0x106e, EVR_UL, "TriggerSamplePosition", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1070, 0x0018, 0x1070, EVR_LO, "RadiopharmaceuticalRoute", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1071, 0x0018, 0x1071, EVR_DS, "RadiopharmaceuticalVolume", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1072, 0x0018, 0x1072, EVR_TM, "RadiopharmaceuticalStartTime", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1073, 0x0018, 0x1073, EVR_TM, "RadiopharmaceuticalStopTime", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1074, 0x0018, 0x1074, EVR_DS, "RadionuclideTotalDose", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1075, 0x0018, 0x1075, EVR_DS, "RadionuclideHalfLife", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1076, 0x0018, 0x1076, EVR_DS, "RadionuclidePositronFraction", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1077, 0x0018, 0x1077, EVR_DS, "RadiopharmaceuticalSpecificActivity", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1078, 0x0018, 0x1078, EVR_DT, "RadiopharmaceuticalStartDateTime", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1079, 0x0018, 0x1079, EVR_DT, "RadiopharmaceuticalStopDateTime", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1080, 0x0018, 0x1080, EVR_CS, "BeatRejectionFlag", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1081, 0x0018, 0x1081, EVR_IS, "LowRRValue", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1082, 0x0018, 0x1082, EVR_IS, "HighRRValue", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1083, 0x0018, 0x1083, EVR_IS, "IntervalsAcquired", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1084, 0x0018, 0x1084, EVR_IS, "IntervalsRejected", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1085, 0x0018, 0x1085, EVR_LO, "PVCRejection", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1086, 0x0018, 0x1086, EVR_IS, "SkipBeats", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1088, 0x0018, 0x1088, EVR_IS, "HeartRate", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1090, 0x0018, 0x1090, EVR_IS, "CardiacNumberOfImages", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1094, 0x0018, 0x1094, EVR_IS, "TriggerWindow", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1100, 0x0018, 0x1100, EVR_DS, "ReconstructionDiameter", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1110, 0x0018, 0x1110, EVR_DS, "DistanceSourceToDetector", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1111, 0x0018, 0x1111, EVR_DS, "DistanceSourceToPatient", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1114, 0x0018, 0x1114, EVR_DS, "EstimatedRadiographicMagnificationFactor", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1120, 0x0018, 0x1120, EVR_DS, "GantryDetectorTilt", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1121, 0x0018, 0x1121, EVR_DS, "GantryDetectorSlew", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1130, 0x0018, 0x1130, EVR_DS, "TableHeight", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1131, 0x0018, 0x1131, EVR_DS, "TableTraverse", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1134, 0x0018, 0x1134, EVR_CS, "TableMotion", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1135, 0x0018, 0x1135, EVR_DS, "TableVerticalIncrement", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1136, 0x0018, 0x1136, EVR_DS, "TableLateralIncrement", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1137, 0x0018, 0x1137, EVR_DS, "TableLongitudinalIncrement", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1138, 0x0018, 0x1138, EVR_DS, "TableAngle", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x113a, 0x0018, 0x113a, EVR_CS, "TableType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1140, 0x0018, 0x1140, EVR_CS, "RotationDirection", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1141, 0x0018, 0x1141, EVR_DS, "RETIRED_AngularPosition", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1142, 0x0018, 0x1142, EVR_DS, "RadialPosition", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1143, 0x0018, 0x1143, EVR_DS, "ScanArc", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1144, 0x0018, 0x1144, EVR_DS, "AngularStep", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1145, 0x0018, 0x1145, EVR_DS, "CenterOfRotationOffset", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1146, 0x0018, 0x1146, EVR_DS, "RETIRED_RotationOffset", 1, -1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1147, 0x0018, 0x1147, EVR_CS, "FieldOfViewShape", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1149, 0x0018, 0x1149, EVR_IS, "FieldOfViewDimensions", 1, 2, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1150, 0x0018, 0x1150, EVR_IS, "ExposureTime", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1151, 0x0018, 0x1151, EVR_IS, "XRayTubeCurrent", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1152, 0x0018, 0x1152, EVR_IS, "Exposure", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1153, 0x0018, 0x1153, EVR_IS, "ExposureInuAs", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1154, 0x0018, 0x1154, EVR_DS, "AveragePulseWidth", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1155, 0x0018, 0x1155, EVR_CS, "RadiationSetting", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1156, 0x0018, 0x1156, EVR_CS, "RectificationType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x115a, 0x0018, 0x115a, EVR_CS, "RadiationMode", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x115e, 0x0018, 0x115e, EVR_DS, "ImageAndFluoroscopyAreaDoseProduct", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1160, 0x0018, 0x1160, EVR_SH, "FilterType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1161, 0x0018, 0x1161, EVR_LO, "TypeOfFilters", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1162, 0x0018, 0x1162, EVR_DS, "IntensifierSize", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1164, 0x0018, 0x1164, EVR_DS, "ImagerPixelSpacing", 2, 2, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1166, 0x0018, 0x1166, EVR_CS, "Grid", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1170, 0x0018, 0x1170, EVR_IS, "GeneratorPower", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1180, 0x0018, 0x1180, EVR_SH, "CollimatorGridName", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1181, 0x0018, 0x1181, EVR_CS, "CollimatorType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1182, 0x0018, 0x1182, EVR_IS, "FocalDistance", 1, 2, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1183, 0x0018, 0x1183, EVR_DS, "XFocusCenter", 1, 2, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1184, 0x0018, 0x1184, EVR_DS, "YFocusCenter", 1, 2, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1190, 0x0018, 0x1190, EVR_DS, "FocalSpots", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1191, 0x0018, 0x1191, EVR_CS, "AnodeTargetMaterial", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x11a0, 0x0018, 0x11a0, EVR_DS, "BodyPartThickness", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x11a2, 0x0018, 0x11a2, EVR_DS, "CompressionForce", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1200, 0x0018, 0x1200, EVR_DA, "DateOfLastCalibration", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1201, 0x0018, 0x1201, EVR_TM, "TimeOfLastCalibration", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1210, 0x0018, 0x1210, EVR_SH, "ConvolutionKernel", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1240, 0x0018, 0x1240, EVR_IS, "ACR_NEMA_UpperLowerPixelValues", 1, -1, "ACR/NEMA2", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1242, 0x0018, 0x1242, EVR_IS, "ActualFrameDuration", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1243, 0x0018, 0x1243, EVR_IS, "CountRate", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1244, 0x0018, 0x1244, EVR_US, "PreferredPlaybackSequencing", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1250, 0x0018, 0x1250, EVR_SH, "ReceiveCoilName", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1251, 0x0018, 0x1251, EVR_SH, "TransmitCoilName", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1260, 0x0018, 0x1260, EVR_SH, "PlateType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1261, 0x0018, 0x1261, EVR_LO, "PhosphorType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1300, 0x0018, 0x1300, EVR_DS, "ScanVelocity", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1301, 0x0018, 0x1301, EVR_CS, "WholeBodyTechnique", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1302, 0x0018, 0x1302, EVR_IS, "ScanLength", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1310, 0x0018, 0x1310, EVR_US, "AcquisitionMatrix", 4, 4, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1312, 0x0018, 0x1312, EVR_CS, "InPlanePhaseEncodingDirection", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1314, 0x0018, 0x1314, EVR_DS, "FlipAngle", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1315, 0x0018, 0x1315, EVR_CS, "VariableFlipAngleFlag", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1316, 0x0018, 0x1316, EVR_DS, "SAR", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1318, 0x0018, 0x1318, EVR_DS, "dBdt", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1400, 0x0018, 0x1400, EVR_LO, "AcquisitionDeviceProcessingDescription", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1401, 0x0018, 0x1401, EVR_LO, "AcquisitionDeviceProcessingCode", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1402, 0x0018, 0x1402, EVR_CS, "CassetteOrientation", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1403, 0x0018, 0x1403, EVR_CS, "CassetteSize", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1404, 0x0018, 0x1404, EVR_US, "ExposuresOnPlate", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1405, 0x0018, 0x1405, EVR_IS, "RelativeXRayExposure", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1411, 0x0018, 0x1411, EVR_DS, "ExposureIndex", 1, 1, "CP_1024", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1412, 0x0018, 0x1412, EVR_DS, "TargetExposureIndex", 1, 1, "CP_1024", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1413, 0x0018, 0x1413, EVR_DS, "DeviationIndex", 1, 1, "CP_1024", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1450, 0x0018, 0x1450, EVR_DS, "ColumnAngulation", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1460, 0x0018, 0x1460, EVR_DS, "TomoLayerHeight", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1470, 0x0018, 0x1470, EVR_DS, "TomoAngle", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1480, 0x0018, 0x1480, EVR_DS, "TomoTime", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1490, 0x0018, 0x1490, EVR_CS, "TomoType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1491, 0x0018, 0x1491, EVR_CS, "TomoClass", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1495, 0x0018, 0x1495, EVR_IS, "NumberOfTomosynthesisSourceImages", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1500, 0x0018, 0x1500, EVR_CS, "PositionerMotion", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1508, 0x0018, 0x1508, EVR_CS, "PositionerType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1510, 0x0018, 0x1510, EVR_DS, "PositionerPrimaryAngle", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1511, 0x0018, 0x1511, EVR_DS, "PositionerSecondaryAngle", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1520, 0x0018, 0x1520, EVR_DS, "PositionerPrimaryAngleIncrement", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1521, 0x0018, 0x1521, EVR_DS, "PositionerSecondaryAngleIncrement", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1530, 0x0018, 0x1530, EVR_DS, "DetectorPrimaryAngle", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1531, 0x0018, 0x1531, EVR_DS, "DetectorSecondaryAngle", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1600, 0x0018, 0x1600, EVR_CS, "ShutterShape", 1, 3, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1602, 0x0018, 0x1602, EVR_IS, "ShutterLeftVerticalEdge", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1604, 0x0018, 0x1604, EVR_IS, "ShutterRightVerticalEdge", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1606, 0x0018, 0x1606, EVR_IS, "ShutterUpperHorizontalEdge", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1608, 0x0018, 0x1608, EVR_IS, "ShutterLowerHorizontalEdge", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1610, 0x0018, 0x1610, EVR_IS, "CenterOfCircularShutter", 2, 2, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1612, 0x0018, 0x1612, EVR_IS, "RadiusOfCircularShutter", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1620, 0x0018, 0x1620, EVR_IS, "VerticesOfThePolygonalShutter", 2, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1622, 0x0018, 0x1622, EVR_US, "ShutterPresentationValue", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1623, 0x0018, 0x1623, EVR_US, "ShutterOverlayGroup", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1624, 0x0018, 0x1624, EVR_US, "ShutterPresentationColorCIELabValue", 3, 3, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1700, 0x0018, 0x1700, EVR_CS, "CollimatorShape", 1, 3, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1702, 0x0018, 0x1702, EVR_IS, "CollimatorLeftVerticalEdge", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1704, 0x0018, 0x1704, EVR_IS, "CollimatorRightVerticalEdge", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1706, 0x0018, 0x1706, EVR_IS, "CollimatorUpperHorizontalEdge", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1708, 0x0018, 0x1708, EVR_IS, "CollimatorLowerHorizontalEdge", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1710, 0x0018, 0x1710, EVR_IS, "CenterOfCircularCollimator", 2, 2, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1712, 0x0018, 0x1712, EVR_IS, "RadiusOfCircularCollimator", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1720, 0x0018, 0x1720, EVR_IS, "VerticesOfThePolygonalCollimator", 2, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1800, 0x0018, 0x1800, EVR_CS, "AcquisitionTimeSynchronized", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1801, 0x0018, 0x1801, EVR_SH, "TimeSource", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1802, 0x0018, 0x1802, EVR_CS, "TimeDistributionProtocol", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x1803, 0x0018, 0x1803, EVR_LO, "NTPSourceAddress", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x2001, 0x0018, 0x2001, EVR_IS, "PageNumberVector", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x2002, 0x0018, 0x2002, EVR_SH, "FrameLabelVector", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x2003, 0x0018, 0x2003, EVR_DS, "FramePrimaryAngleVector", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x2004, 0x0018, 0x2004, EVR_DS, "FrameSecondaryAngleVector", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x2005, 0x0018, 0x2005, EVR_DS, "SliceLocationVector", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x2006, 0x0018, 0x2006, EVR_SH, "DisplayWindowLabelVector", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x2010, 0x0018, 0x2010, EVR_DS, "NominalScannedPixelSpacing", 2, 2, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x2020, 0x0018, 0x2020, EVR_CS, "DigitizingDeviceTransportDirection", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x2030, 0x0018, 0x2030, EVR_DS, "RotationOfScannedFilm", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x3100, 0x0018, 0x3100, EVR_CS, "IVUSAcquisition", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x3101, 0x0018, 0x3101, EVR_DS, "IVUSPullbackRate", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x3102, 0x0018, 0x3102, EVR_DS, "IVUSGatedRate", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x3103, 0x0018, 0x3103, EVR_IS, "IVUSPullbackStartFrameNumber", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x3104, 0x0018, 0x3104, EVR_IS, "IVUSPullbackStopFrameNumber", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x3105, 0x0018, 0x3105, EVR_IS, "LesionNumber", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x4000, 0x0018, 0x4000, EVR_LT, "ACR_NEMA_AcquisitionComments", 1, -1, "ACR/NEMA2", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x5000, 0x0018, 0x5000, EVR_SH, "OutputPower", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x5010, 0x0018, 0x5010, EVR_LO, "TransducerData", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x5012, 0x0018, 0x5012, EVR_DS, "FocusDepth", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x5020, 0x0018, 0x5020, EVR_LO, "ProcessingFunction", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x5021, 0x0018, 0x5021, EVR_LO, "RETIRED_PostprocessingFunction", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x5022, 0x0018, 0x5022, EVR_DS, "MechanicalIndex", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x5024, 0x0018, 0x5024, EVR_DS, "BoneThermalIndex", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x5026, 0x0018, 0x5026, EVR_DS, "CranialThermalIndex", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x5027, 0x0018, 0x5027, EVR_DS, "SoftTissueThermalIndex", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x5028, 0x0018, 0x5028, EVR_DS, "SoftTissueFocusThermalIndex", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x5029, 0x0018, 0x5029, EVR_DS, "SoftTissueSurfaceThermalIndex", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x5030, 0x0018, 0x5030, EVR_DS, "ACR_NEMA_DynamicRange", 1, 1, "ACR/NEMA2", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x5040, 0x0018, 0x5040, EVR_DS, "ACR_NEMA_TotalGain", 1, 1, "ACR/NEMA2", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x5050, 0x0018, 0x5050, EVR_IS, "DepthOfScanField", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x5100, 0x0018, 0x5100, EVR_CS, "PatientPosition", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x5101, 0x0018, 0x5101, EVR_CS, "ViewPosition", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x5104, 0x0018, 0x5104, EVR_SQ, "ProjectionEponymousNameCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x5210, 0x0018, 0x5210, EVR_DS, "RETIRED_ImageTransformationMatrix", 6, 6, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x5212, 0x0018, 0x5212, EVR_DS, "RETIRED_ImageTranslationVector", 3, 3, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x6000, 0x0018, 0x6000, EVR_DS, "Sensitivity", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x6011, 0x0018, 0x6011, EVR_SQ, "SequenceOfUltrasoundRegions", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x6012, 0x0018, 0x6012, EVR_US, "RegionSpatialFormat", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x6014, 0x0018, 0x6014, EVR_US, "RegionDataType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x6016, 0x0018, 0x6016, EVR_UL, "RegionFlags", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x6018, 0x0018, 0x6018, EVR_UL, "RegionLocationMinX0", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x601a, 0x0018, 0x601a, EVR_UL, "RegionLocationMinY0", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x601c, 0x0018, 0x601c, EVR_UL, "RegionLocationMaxX1", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x601e, 0x0018, 0x601e, EVR_UL, "RegionLocationMaxY1", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x6020, 0x0018, 0x6020, EVR_SL, "ReferencePixelX0", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x6022, 0x0018, 0x6022, EVR_SL, "ReferencePixelY0", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x6024, 0x0018, 0x6024, EVR_US, "PhysicalUnitsXDirection", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x6026, 0x0018, 0x6026, EVR_US, "PhysicalUnitsYDirection", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x6028, 0x0018, 0x6028, EVR_FD, "ReferencePixelPhysicalValueX", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x602a, 0x0018, 0x602a, EVR_FD, "ReferencePixelPhysicalValueY", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x602c, 0x0018, 0x602c, EVR_FD, "PhysicalDeltaX", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x602e, 0x0018, 0x602e, EVR_FD, "PhysicalDeltaY", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x6030, 0x0018, 0x6030, EVR_UL, "TransducerFrequency", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x6031, 0x0018, 0x6031, EVR_CS, "TransducerType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x6032, 0x0018, 0x6032, EVR_UL, "PulseRepetitionFrequency", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x6034, 0x0018, 0x6034, EVR_FD, "DopplerCorrectionAngle", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x6036, 0x0018, 0x6036, EVR_FD, "SteeringAngle", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x6038, 0x0018, 0x6038, EVR_UL, "RETIRED_DopplerSampleVolumeXPositionRetired", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x6039, 0x0018, 0x6039, EVR_SL, "DopplerSampleVolumeXPosition", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x603a, 0x0018, 0x603a, EVR_UL, "RETIRED_DopplerSampleVolumeYPositionRetired", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x603b, 0x0018, 0x603b, EVR_SL, "DopplerSampleVolumeYPosition", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x603c, 0x0018, 0x603c, EVR_UL, "RETIRED_TMLinePositionX0Retired", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x603d, 0x0018, 0x603d, EVR_SL, "TMLinePositionX0", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x603e, 0x0018, 0x603e, EVR_UL, "RETIRED_TMLinePositionY0Retired", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x603f, 0x0018, 0x603f, EVR_SL, "TMLinePositionY0", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x6040, 0x0018, 0x6040, EVR_UL, "RETIRED_TMLinePositionX1Retired", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x6041, 0x0018, 0x6041, EVR_SL, "TMLinePositionX1", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x6042, 0x0018, 0x6042, EVR_UL, "RETIRED_TMLinePositionY1Retired", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x6043, 0x0018, 0x6043, EVR_SL, "TMLinePositionY1", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x6044, 0x0018, 0x6044, EVR_US, "PixelComponentOrganization", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x6046, 0x0018, 0x6046, EVR_UL, "PixelComponentMask", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x6048, 0x0018, 0x6048, EVR_UL, "PixelComponentRangeStart", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x604a, 0x0018, 0x604a, EVR_UL, "PixelComponentRangeStop", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x604c, 0x0018, 0x604c, EVR_US, "PixelComponentPhysicalUnits", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x604e, 0x0018, 0x604e, EVR_US, "PixelComponentDataType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x6050, 0x0018, 0x6050, EVR_UL, "NumberOfTableBreakPoints", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x6052, 0x0018, 0x6052, EVR_UL, "TableOfXBreakPoints", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x6054, 0x0018, 0x6054, EVR_FD, "TableOfYBreakPoints", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x6056, 0x0018, 0x6056, EVR_UL, "NumberOfTableEntries", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x6058, 0x0018, 0x6058, EVR_UL, "TableOfPixelValues", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x605a, 0x0018, 0x605a, EVR_FL, "TableOfParameterValues", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x6060, 0x0018, 0x6060, EVR_FL, "RWaveTimeVector", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x7000, 0x0018, 0x7000, EVR_CS, "DetectorConditionsNominalFlag", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x7001, 0x0018, 0x7001, EVR_DS, "DetectorTemperature", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x7004, 0x0018, 0x7004, EVR_CS, "DetectorType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x7005, 0x0018, 0x7005, EVR_CS, "DetectorConfiguration", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x7006, 0x0018, 0x7006, EVR_LT, "DetectorDescription", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x7008, 0x0018, 0x7008, EVR_LT, "DetectorMode", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x700a, 0x0018, 0x700a, EVR_SH, "DetectorID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x700c, 0x0018, 0x700c, EVR_DA, "DateOfLastDetectorCalibration", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x700e, 0x0018, 0x700e, EVR_TM, "TimeOfLastDetectorCalibration", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x7010, 0x0018, 0x7010, EVR_IS, "ExposuresOnDetectorSinceLastCalibration", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x7011, 0x0018, 0x7011, EVR_IS, "ExposuresOnDetectorSinceManufactured", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x7012, 0x0018, 0x7012, EVR_DS, "DetectorTimeSinceLastExposure", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x7014, 0x0018, 0x7014, EVR_DS, "DetectorActiveTime", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x7016, 0x0018, 0x7016, EVR_DS, "DetectorActivationOffsetFromExposure", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x701a, 0x0018, 0x701a, EVR_DS, "DetectorBinning", 2, 2, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x7020, 0x0018, 0x7020, EVR_DS, "DetectorElementPhysicalSize", 2, 2, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x7022, 0x0018, 0x7022, EVR_DS, "DetectorElementSpacing", 2, 2, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x7024, 0x0018, 0x7024, EVR_CS, "DetectorActiveShape", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x7026, 0x0018, 0x7026, EVR_DS, "DetectorActiveDimensions", 1, 2, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x7028, 0x0018, 0x7028, EVR_DS, "DetectorActiveOrigin", 2, 2, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x702a, 0x0018, 0x702a, EVR_LO, "DetectorManufacturerName", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x702b, 0x0018, 0x702b, EVR_LO, "DetectorManufacturerModelName", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x7030, 0x0018, 0x7030, EVR_DS, "FieldOfViewOrigin", 2, 2, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x7032, 0x0018, 0x7032, EVR_DS, "FieldOfViewRotation", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x7034, 0x0018, 0x7034, EVR_CS, "FieldOfViewHorizontalFlip", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x7040, 0x0018, 0x7040, EVR_LT, "GridAbsorbingMaterial", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x7041, 0x0018, 0x7041, EVR_LT, "GridSpacingMaterial", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x7042, 0x0018, 0x7042, EVR_DS, "GridThickness", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x7044, 0x0018, 0x7044, EVR_DS, "GridPitch", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x7046, 0x0018, 0x7046, EVR_IS, "GridAspectRatio", 2, 2, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x7048, 0x0018, 0x7048, EVR_DS, "GridPeriod", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x704c, 0x0018, 0x704c, EVR_DS, "GridFocalDistance", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x7050, 0x0018, 0x7050, EVR_CS, "FilterMaterial", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x7052, 0x0018, 0x7052, EVR_DS, "FilterThicknessMinimum", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x7054, 0x0018, 0x7054, EVR_DS, "FilterThicknessMaximum", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x7056, 0x0018, 0x7056, EVR_FL, "FilterBeamPathLengthMinimum", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x7058, 0x0018, 0x7058, EVR_FL, "FilterBeamPathLengthMaximum", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x7060, 0x0018, 0x7060, EVR_CS, "ExposureControlMode", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x7062, 0x0018, 0x7062, EVR_LT, "ExposureControlModeDescription", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x7064, 0x0018, 0x7064, EVR_CS, "ExposureStatus", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x7065, 0x0018, 0x7065, EVR_DS, "PhototimerSetting", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x8150, 0x0018, 0x8150, EVR_DS, "ExposureTimeInuS", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x8151, 0x0018, 0x8151, EVR_DS, "XRayTubeCurrentInuA", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9004, 0x0018, 0x9004, EVR_CS, "ContentQualification", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9005, 0x0018, 0x9005, EVR_SH, "PulseSequenceName", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9006, 0x0018, 0x9006, EVR_SQ, "MRImagingModifierSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9008, 0x0018, 0x9008, EVR_CS, "EchoPulseSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9009, 0x0018, 0x9009, EVR_CS, "InversionRecovery", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9010, 0x0018, 0x9010, EVR_CS, "FlowCompensation", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9011, 0x0018, 0x9011, EVR_CS, "MultipleSpinEcho", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9012, 0x0018, 0x9012, EVR_CS, "MultiPlanarExcitation", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9014, 0x0018, 0x9014, EVR_CS, "PhaseContrast", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9015, 0x0018, 0x9015, EVR_CS, "TimeOfFlightContrast", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9016, 0x0018, 0x9016, EVR_CS, "Spoiling", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9017, 0x0018, 0x9017, EVR_CS, "SteadyStatePulseSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9018, 0x0018, 0x9018, EVR_CS, "EchoPlanarPulseSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9019, 0x0018, 0x9019, EVR_FD, "TagAngleFirstAxis", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9020, 0x0018, 0x9020, EVR_CS, "MagnetizationTransfer", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9021, 0x0018, 0x9021, EVR_CS, "T2Preparation", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9022, 0x0018, 0x9022, EVR_CS, "BloodSignalNulling", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9024, 0x0018, 0x9024, EVR_CS, "SaturationRecovery", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9025, 0x0018, 0x9025, EVR_CS, "SpectrallySelectedSuppression", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9026, 0x0018, 0x9026, EVR_CS, "SpectrallySelectedExcitation", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9027, 0x0018, 0x9027, EVR_CS, "SpatialPresaturation", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9028, 0x0018, 0x9028, EVR_CS, "Tagging", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9029, 0x0018, 0x9029, EVR_CS, "OversamplingPhase", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9030, 0x0018, 0x9030, EVR_FD, "TagSpacingFirstDimension", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9032, 0x0018, 0x9032, EVR_CS, "GeometryOfKSpaceTraversal", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9033, 0x0018, 0x9033, EVR_CS, "SegmentedKSpaceTraversal", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9034, 0x0018, 0x9034, EVR_CS, "RectilinearPhaseEncodeReordering", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9035, 0x0018, 0x9035, EVR_FD, "TagThickness", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9036, 0x0018, 0x9036, EVR_CS, "PartialFourierDirection", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9037, 0x0018, 0x9037, EVR_CS, "CardiacSynchronizationTechnique", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9041, 0x0018, 0x9041, EVR_LO, "ReceiveCoilManufacturerName", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9042, 0x0018, 0x9042, EVR_SQ, "MRReceiveCoilSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9043, 0x0018, 0x9043, EVR_CS, "ReceiveCoilType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9044, 0x0018, 0x9044, EVR_CS, "QuadratureReceiveCoil", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9045, 0x0018, 0x9045, EVR_SQ, "MultiCoilDefinitionSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9046, 0x0018, 0x9046, EVR_LO, "MultiCoilConfiguration", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9047, 0x0018, 0x9047, EVR_SH, "MultiCoilElementName", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9048, 0x0018, 0x9048, EVR_CS, "MultiCoilElementUsed", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9049, 0x0018, 0x9049, EVR_SQ, "MRTransmitCoilSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9050, 0x0018, 0x9050, EVR_LO, "TransmitCoilManufacturerName", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9051, 0x0018, 0x9051, EVR_CS, "TransmitCoilType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9052, 0x0018, 0x9052, EVR_FD, "SpectralWidth", 1, 2, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9053, 0x0018, 0x9053, EVR_FD, "ChemicalShiftReference", 1, 2, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9054, 0x0018, 0x9054, EVR_CS, "VolumeLocalizationTechnique", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9058, 0x0018, 0x9058, EVR_US, "MRAcquisitionFrequencyEncodingSteps", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9059, 0x0018, 0x9059, EVR_CS, "Decoupling", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9060, 0x0018, 0x9060, EVR_CS, "DecoupledNucleus", 1, 2, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9061, 0x0018, 0x9061, EVR_FD, "DecouplingFrequency", 1, 2, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9062, 0x0018, 0x9062, EVR_CS, "DecouplingMethod", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9063, 0x0018, 0x9063, EVR_FD, "DecouplingChemicalShiftReference", 1, 2, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9064, 0x0018, 0x9064, EVR_CS, "KSpaceFiltering", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9065, 0x0018, 0x9065, EVR_CS, "TimeDomainFiltering", 1, 2, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9066, 0x0018, 0x9066, EVR_US, "NumberOfZeroFills", 1, 2, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9067, 0x0018, 0x9067, EVR_CS, "BaselineCorrection", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9069, 0x0018, 0x9069, EVR_FD, "ParallelReductionFactorInPlane", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9070, 0x0018, 0x9070, EVR_FD, "CardiacRRIntervalSpecified", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9073, 0x0018, 0x9073, EVR_FD, "AcquisitionDuration", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9074, 0x0018, 0x9074, EVR_DT, "FrameAcquisitionDateTime", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9075, 0x0018, 0x9075, EVR_CS, "DiffusionDirectionality", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9076, 0x0018, 0x9076, EVR_SQ, "DiffusionGradientDirectionSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9077, 0x0018, 0x9077, EVR_CS, "ParallelAcquisition", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9078, 0x0018, 0x9078, EVR_CS, "ParallelAcquisitionTechnique", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9079, 0x0018, 0x9079, EVR_FD, "InversionTimes", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9080, 0x0018, 0x9080, EVR_ST, "MetaboliteMapDescription", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9081, 0x0018, 0x9081, EVR_CS, "PartialFourier", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9082, 0x0018, 0x9082, EVR_FD, "EffectiveEchoTime", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9083, 0x0018, 0x9083, EVR_SQ, "MetaboliteMapCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9084, 0x0018, 0x9084, EVR_SQ, "ChemicalShiftSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9085, 0x0018, 0x9085, EVR_CS, "CardiacSignalSource", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9087, 0x0018, 0x9087, EVR_FD, "DiffusionBValue", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9089, 0x0018, 0x9089, EVR_FD, "DiffusionGradientOrientation", 3, 3, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9090, 0x0018, 0x9090, EVR_FD, "VelocityEncodingDirection", 3, 3, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9091, 0x0018, 0x9091, EVR_FD, "VelocityEncodingMinimumValue", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9092, 0x0018, 0x9092, EVR_SQ, "VelocityEncodingAcquisitionSequence", 1, 1, "CP_988", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9093, 0x0018, 0x9093, EVR_US, "NumberOfKSpaceTrajectories", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9094, 0x0018, 0x9094, EVR_CS, "CoverageOfKSpace", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9095, 0x0018, 0x9095, EVR_UL, "SpectroscopyAcquisitionPhaseRows", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9096, 0x0018, 0x9096, EVR_FD, "RETIRED_ParallelReductionFactorInPlaneRetired", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9098, 0x0018, 0x9098, EVR_FD, "TransmitterFrequency", 1, 2, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9100, 0x0018, 0x9100, EVR_CS, "ResonantNucleus", 1, 2, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9101, 0x0018, 0x9101, EVR_CS, "FrequencyCorrection", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9103, 0x0018, 0x9103, EVR_SQ, "MRSpectroscopyFOVGeometrySequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9104, 0x0018, 0x9104, EVR_FD, "SlabThickness", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9105, 0x0018, 0x9105, EVR_FD, "SlabOrientation", 3, 3, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9106, 0x0018, 0x9106, EVR_FD, "MidSlabPosition", 3, 3, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9107, 0x0018, 0x9107, EVR_SQ, "MRSpatialSaturationSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9112, 0x0018, 0x9112, EVR_SQ, "MRTimingAndRelatedParametersSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9114, 0x0018, 0x9114, EVR_SQ, "MREchoSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9115, 0x0018, 0x9115, EVR_SQ, "MRModifierSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9117, 0x0018, 0x9117, EVR_SQ, "MRDiffusionSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9118, 0x0018, 0x9118, EVR_SQ, "CardiacSynchronizationSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9119, 0x0018, 0x9119, EVR_SQ, "MRAveragesSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9125, 0x0018, 0x9125, EVR_SQ, "MRFOVGeometrySequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9126, 0x0018, 0x9126, EVR_SQ, "VolumeLocalizationSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9127, 0x0018, 0x9127, EVR_UL, "SpectroscopyAcquisitionDataColumns", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9147, 0x0018, 0x9147, EVR_CS, "DiffusionAnisotropyType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9151, 0x0018, 0x9151, EVR_DT, "FrameReferenceDateTime", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9152, 0x0018, 0x9152, EVR_SQ, "MRMetaboliteMapSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9155, 0x0018, 0x9155, EVR_FD, "ParallelReductionFactorOutOfPlane", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9159, 0x0018, 0x9159, EVR_UL, "SpectroscopyAcquisitionOutOfPlanePhaseSteps", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9166, 0x0018, 0x9166, EVR_CS, "RETIRED_BulkMotionStatus", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9168, 0x0018, 0x9168, EVR_FD, "ParallelReductionFactorSecondInPlane", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9169, 0x0018, 0x9169, EVR_CS, "CardiacBeatRejectionTechnique", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9170, 0x0018, 0x9170, EVR_CS, "RespiratoryMotionCompensationTechnique", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9171, 0x0018, 0x9171, EVR_CS, "RespiratorySignalSource", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9172, 0x0018, 0x9172, EVR_CS, "BulkMotionCompensationTechnique", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9173, 0x0018, 0x9173, EVR_CS, "BulkMotionSignalSource", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9174, 0x0018, 0x9174, EVR_CS, "ApplicableSafetyStandardAgency", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9175, 0x0018, 0x9175, EVR_LO, "ApplicableSafetyStandardDescription", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9176, 0x0018, 0x9176, EVR_SQ, "OperatingModeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9177, 0x0018, 0x9177, EVR_CS, "OperatingModeType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9178, 0x0018, 0x9178, EVR_CS, "OperatingMode", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9179, 0x0018, 0x9179, EVR_CS, "SpecificAbsorptionRateDefinition", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9180, 0x0018, 0x9180, EVR_CS, "GradientOutputType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9181, 0x0018, 0x9181, EVR_FD, "SpecificAbsorptionRateValue", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9182, 0x0018, 0x9182, EVR_FD, "GradientOutput", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9183, 0x0018, 0x9183, EVR_CS, "FlowCompensationDirection", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9184, 0x0018, 0x9184, EVR_FD, "TaggingDelay", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9185, 0x0018, 0x9185, EVR_ST, "RespiratoryMotionCompensationTechniqueDescription", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9186, 0x0018, 0x9186, EVR_SH, "RespiratorySignalSourceID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9195, 0x0018, 0x9195, EVR_FD, "RETIRED_ChemicalShiftMinimumIntegrationLimitInHz", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9196, 0x0018, 0x9196, EVR_FD, "RETIRED_ChemicalShiftMaximumIntegrationLimitInHz", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9197, 0x0018, 0x9197, EVR_SQ, "MRVelocityEncodingSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9198, 0x0018, 0x9198, EVR_CS, "FirstOrderPhaseCorrection", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9199, 0x0018, 0x9199, EVR_CS, "WaterReferencedPhaseCorrection", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9200, 0x0018, 0x9200, EVR_CS, "MRSpectroscopyAcquisitionType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9214, 0x0018, 0x9214, EVR_CS, "RespiratoryCyclePosition", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9217, 0x0018, 0x9217, EVR_FD, "VelocityEncodingMaximumValue", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9218, 0x0018, 0x9218, EVR_FD, "TagSpacingSecondDimension", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9219, 0x0018, 0x9219, EVR_SS, "TagAngleSecondAxis", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9220, 0x0018, 0x9220, EVR_FD, "FrameAcquisitionDuration", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9226, 0x0018, 0x9226, EVR_SQ, "MRImageFrameTypeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9227, 0x0018, 0x9227, EVR_SQ, "MRSpectroscopyFrameTypeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9231, 0x0018, 0x9231, EVR_US, "MRAcquisitionPhaseEncodingStepsInPlane", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9232, 0x0018, 0x9232, EVR_US, "MRAcquisitionPhaseEncodingStepsOutOfPlane", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9234, 0x0018, 0x9234, EVR_UL, "SpectroscopyAcquisitionPhaseColumns", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9236, 0x0018, 0x9236, EVR_CS, "CardiacCyclePosition", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9239, 0x0018, 0x9239, EVR_SQ, "SpecificAbsorptionRateSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9240, 0x0018, 0x9240, EVR_US, "RFEchoTrainLength", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9241, 0x0018, 0x9241, EVR_US, "GradientEchoTrainLength", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9295, 0x0018, 0x9295, EVR_FD, "ChemicalShiftMinimumIntegrationLimitInppm", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9296, 0x0018, 0x9296, EVR_FD, "ChemicalShiftMaximumIntegrationLimitInppm", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9301, 0x0018, 0x9301, EVR_SQ, "CTAcquisitionTypeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9302, 0x0018, 0x9302, EVR_CS, "AcquisitionType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9303, 0x0018, 0x9303, EVR_FD, "TubeAngle", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9304, 0x0018, 0x9304, EVR_SQ, "CTAcquisitionDetailsSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9305, 0x0018, 0x9305, EVR_FD, "RevolutionTime", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9306, 0x0018, 0x9306, EVR_FD, "SingleCollimationWidth", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9307, 0x0018, 0x9307, EVR_FD, "TotalCollimationWidth", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9308, 0x0018, 0x9308, EVR_SQ, "CTTableDynamicsSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9309, 0x0018, 0x9309, EVR_FD, "TableSpeed", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9310, 0x0018, 0x9310, EVR_FD, "TableFeedPerRotation", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9311, 0x0018, 0x9311, EVR_FD, "SpiralPitchFactor", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9312, 0x0018, 0x9312, EVR_SQ, "CTGeometrySequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9313, 0x0018, 0x9313, EVR_FD, "DataCollectionCenterPatient", 3, 3, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9314, 0x0018, 0x9314, EVR_SQ, "CTReconstructionSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9315, 0x0018, 0x9315, EVR_CS, "ReconstructionAlgorithm", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9316, 0x0018, 0x9316, EVR_CS, "ConvolutionKernelGroup", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9317, 0x0018, 0x9317, EVR_FD, "ReconstructionFieldOfView", 2, 2, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9318, 0x0018, 0x9318, EVR_FD, "ReconstructionTargetCenterPatient", 3, 3, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9319, 0x0018, 0x9319, EVR_FD, "ReconstructionAngle", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9320, 0x0018, 0x9320, EVR_SH, "ImageFilter", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9321, 0x0018, 0x9321, EVR_SQ, "CTExposureSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9322, 0x0018, 0x9322, EVR_FD, "ReconstructionPixelSpacing", 2, 2, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9323, 0x0018, 0x9323, EVR_CS, "ExposureModulationType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9324, 0x0018, 0x9324, EVR_FD, "EstimatedDoseSaving", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9325, 0x0018, 0x9325, EVR_SQ, "CTXRayDetailsSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9326, 0x0018, 0x9326, EVR_SQ, "CTPositionSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9327, 0x0018, 0x9327, EVR_FD, "TablePosition", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9328, 0x0018, 0x9328, EVR_FD, "ExposureTimeInms", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9329, 0x0018, 0x9329, EVR_SQ, "CTImageFrameTypeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9330, 0x0018, 0x9330, EVR_FD, "XRayTubeCurrentInmA", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9332, 0x0018, 0x9332, EVR_FD, "ExposureInmAs", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9333, 0x0018, 0x9333, EVR_CS, "ConstantVolumeFlag", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9334, 0x0018, 0x9334, EVR_CS, "FluoroscopyFlag", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9335, 0x0018, 0x9335, EVR_FD, "DistanceSourceToDataCollectionCenter", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9337, 0x0018, 0x9337, EVR_US, "ContrastBolusAgentNumber", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9338, 0x0018, 0x9338, EVR_SQ, "ContrastBolusIngredientCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9340, 0x0018, 0x9340, EVR_SQ, "ContrastAdministrationProfileSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9341, 0x0018, 0x9341, EVR_SQ, "ContrastBolusUsageSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9342, 0x0018, 0x9342, EVR_CS, "ContrastBolusAgentAdministered", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9343, 0x0018, 0x9343, EVR_CS, "ContrastBolusAgentDetected", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9344, 0x0018, 0x9344, EVR_CS, "ContrastBolusAgentPhase", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9345, 0x0018, 0x9345, EVR_FD, "CTDIvol", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9346, 0x0018, 0x9346, EVR_SQ, "CTDIPhantomTypeCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9351, 0x0018, 0x9351, EVR_FL, "CalciumScoringMassFactorPatient", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9352, 0x0018, 0x9352, EVR_FL, "CalciumScoringMassFactorDevice", 3, 3, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9353, 0x0018, 0x9353, EVR_FL, "EnergyWeightingFactor", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9360, 0x0018, 0x9360, EVR_SQ, "CTAdditionalXRaySourceSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9401, 0x0018, 0x9401, EVR_SQ, "ProjectionPixelCalibrationSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9402, 0x0018, 0x9402, EVR_FL, "DistanceSourceToIsocenter", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9403, 0x0018, 0x9403, EVR_FL, "DistanceObjectToTableTop", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9404, 0x0018, 0x9404, EVR_FL, "ObjectPixelSpacingInCenterOfBeam", 2, 2, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9405, 0x0018, 0x9405, EVR_SQ, "PositionerPositionSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9406, 0x0018, 0x9406, EVR_SQ, "TablePositionSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9407, 0x0018, 0x9407, EVR_SQ, "CollimatorShapeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9412, 0x0018, 0x9412, EVR_SQ, "XAXRFFrameCharacteristicsSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9417, 0x0018, 0x9417, EVR_SQ, "FrameAcquisitionSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9420, 0x0018, 0x9420, EVR_CS, "XRayReceptorType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9423, 0x0018, 0x9423, EVR_LO, "AcquisitionProtocolName", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9424, 0x0018, 0x9424, EVR_LT, "AcquisitionProtocolDescription", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9425, 0x0018, 0x9425, EVR_CS, "ContrastBolusIngredientOpaque", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9426, 0x0018, 0x9426, EVR_FL, "DistanceReceptorPlaneToDetectorHousing", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9427, 0x0018, 0x9427, EVR_CS, "IntensifierActiveShape", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9428, 0x0018, 0x9428, EVR_FL, "IntensifierActiveDimensions", 1, 2, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9429, 0x0018, 0x9429, EVR_FL, "PhysicalDetectorSize", 2, 2, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9430, 0x0018, 0x9430, EVR_US, "PositionOfIsocenterProjection", 2, 2, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9432, 0x0018, 0x9432, EVR_SQ, "FieldOfViewSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9433, 0x0018, 0x9433, EVR_LO, "FieldOfViewDescription", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9434, 0x0018, 0x9434, EVR_SQ, "ExposureControlSensingRegionsSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9435, 0x0018, 0x9435, EVR_CS, "ExposureControlSensingRegionShape", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9436, 0x0018, 0x9436, EVR_SS, "ExposureControlSensingRegionLeftVerticalEdge", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9437, 0x0018, 0x9437, EVR_SS, "ExposureControlSensingRegionRightVerticalEdge", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9438, 0x0018, 0x9438, EVR_SS, "ExposureControlSensingRegionUpperHorizontalEdge", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9439, 0x0018, 0x9439, EVR_SS, "ExposureControlSensingRegionLowerHorizontalEdge", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9440, 0x0018, 0x9440, EVR_SS, "CenterOfCircularExposureControlSensingRegion", 2, 2, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9441, 0x0018, 0x9441, EVR_US, "RadiusOfCircularExposureControlSensingRegion", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9442, 0x0018, 0x9442, EVR_SS, "VerticesOfThePolygonalExposureControlSensingRegion", 2, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9447, 0x0018, 0x9447, EVR_FL, "ColumnAngulationPatient", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9449, 0x0018, 0x9449, EVR_FL, "BeamAngle", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9451, 0x0018, 0x9451, EVR_SQ, "FrameDetectorParametersSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9452, 0x0018, 0x9452, EVR_FL, "CalculatedAnatomyThickness", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9455, 0x0018, 0x9455, EVR_SQ, "CalibrationSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9456, 0x0018, 0x9456, EVR_SQ, "ObjectThicknessSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9457, 0x0018, 0x9457, EVR_CS, "PlaneIdentification", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9461, 0x0018, 0x9461, EVR_FL, "FieldOfViewDimensionsInFloat", 1, 2, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9462, 0x0018, 0x9462, EVR_SQ, "IsocenterReferenceSystemSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9463, 0x0018, 0x9463, EVR_FL, "PositionerIsocenterPrimaryAngle", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9464, 0x0018, 0x9464, EVR_FL, "PositionerIsocenterSecondaryAngle", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9465, 0x0018, 0x9465, EVR_FL, "PositionerIsocenterDetectorRotationAngle", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9466, 0x0018, 0x9466, EVR_FL, "TableXPositionToIsocenter", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9467, 0x0018, 0x9467, EVR_FL, "TableYPositionToIsocenter", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9468, 0x0018, 0x9468, EVR_FL, "TableZPositionToIsocenter", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9469, 0x0018, 0x9469, EVR_FL, "TableHorizontalRotationAngle", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9470, 0x0018, 0x9470, EVR_FL, "TableHeadTiltAngle", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9471, 0x0018, 0x9471, EVR_FL, "TableCradleTiltAngle", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9472, 0x0018, 0x9472, EVR_SQ, "FrameDisplayShutterSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9473, 0x0018, 0x9473, EVR_FL, "AcquiredImageAreaDoseProduct", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9474, 0x0018, 0x9474, EVR_CS, "CArmPositionerTabletopRelationship", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9476, 0x0018, 0x9476, EVR_SQ, "XRayGeometrySequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9477, 0x0018, 0x9477, EVR_SQ, "IrradiationEventIdentificationSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9504, 0x0018, 0x9504, EVR_SQ, "XRay3DFrameTypeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9506, 0x0018, 0x9506, EVR_SQ, "ContributingSourcesSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9507, 0x0018, 0x9507, EVR_SQ, "XRay3DAcquisitionSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9508, 0x0018, 0x9508, EVR_FL, "PrimaryPositionerScanArc", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9509, 0x0018, 0x9509, EVR_FL, "SecondaryPositionerScanArc", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9510, 0x0018, 0x9510, EVR_FL, "PrimaryPositionerScanStartAngle", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9511, 0x0018, 0x9511, EVR_FL, "SecondaryPositionerScanStartAngle", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9514, 0x0018, 0x9514, EVR_FL, "PrimaryPositionerIncrement", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9515, 0x0018, 0x9515, EVR_FL, "SecondaryPositionerIncrement", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9516, 0x0018, 0x9516, EVR_DT, "StartAcquisitionDateTime", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9517, 0x0018, 0x9517, EVR_DT, "EndAcquisitionDateTime", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9524, 0x0018, 0x9524, EVR_LO, "ApplicationName", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9525, 0x0018, 0x9525, EVR_LO, "ApplicationVersion", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9526, 0x0018, 0x9526, EVR_LO, "ApplicationManufacturer", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9527, 0x0018, 0x9527, EVR_CS, "AlgorithmType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9528, 0x0018, 0x9528, EVR_LO, "AlgorithmDescription", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9530, 0x0018, 0x9530, EVR_SQ, "XRay3DReconstructionSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9531, 0x0018, 0x9531, EVR_LO, "ReconstructionDescription", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9538, 0x0018, 0x9538, EVR_SQ, "PerProjectionAcquisitionSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9601, 0x0018, 0x9601, EVR_SQ, "DiffusionBMatrixSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9602, 0x0018, 0x9602, EVR_FD, "DiffusionBValueXX", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9603, 0x0018, 0x9603, EVR_FD, "DiffusionBValueXY", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9604, 0x0018, 0x9604, EVR_FD, "DiffusionBValueXZ", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9605, 0x0018, 0x9605, EVR_FD, "DiffusionBValueYY", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9606, 0x0018, 0x9606, EVR_FD, "DiffusionBValueYZ", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9607, 0x0018, 0x9607, EVR_FD, "DiffusionBValueZZ", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9701, 0x0018, 0x9701, EVR_DT, "DecayCorrectionDateTime", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9715, 0x0018, 0x9715, EVR_FD, "StartDensityThreshold", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9716, 0x0018, 0x9716, EVR_FD, "StartRelativeDensityDifferenceThreshold", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9717, 0x0018, 0x9717, EVR_FD, "StartCardiacTriggerCountThreshold", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9718, 0x0018, 0x9718, EVR_FD, "StartRespiratoryTriggerCountThreshold", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9719, 0x0018, 0x9719, EVR_FD, "TerminationCountsThreshold", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9720, 0x0018, 0x9720, EVR_FD, "TerminationDensityThreshold", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9721, 0x0018, 0x9721, EVR_FD, "TerminationRelativeDensityThreshold", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9722, 0x0018, 0x9722, EVR_FD, "TerminationTimeThreshold", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9723, 0x0018, 0x9723, EVR_FD, "TerminationCardiacTriggerCountThreshold", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9724, 0x0018, 0x9724, EVR_FD, "TerminationRespiratoryTriggerCountThreshold", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9725, 0x0018, 0x9725, EVR_CS, "DetectorGeometry", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9726, 0x0018, 0x9726, EVR_FD, "TransverseDetectorSeparation", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9727, 0x0018, 0x9727, EVR_FD, "AxialDetectorDimension", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9729, 0x0018, 0x9729, EVR_US, "RadiopharmaceuticalAgentNumber", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9732, 0x0018, 0x9732, EVR_SQ, "PETFrameAcquisitionSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9733, 0x0018, 0x9733, EVR_SQ, "PETDetectorMotionDetailsSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9734, 0x0018, 0x9734, EVR_SQ, "PETTableDynamicsSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9735, 0x0018, 0x9735, EVR_SQ, "PETPositionSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9736, 0x0018, 0x9736, EVR_SQ, "PETFrameCorrectionFactorsSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9737, 0x0018, 0x9737, EVR_SQ, "RadiopharmaceuticalUsageSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9738, 0x0018, 0x9738, EVR_CS, "AttenuationCorrectionSource", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9739, 0x0018, 0x9739, EVR_US, "NumberOfIterations", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9740, 0x0018, 0x9740, EVR_US, "NumberOfSubsets", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9749, 0x0018, 0x9749, EVR_SQ, "PETReconstructionSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9751, 0x0018, 0x9751, EVR_SQ, "PETFrameTypeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9755, 0x0018, 0x9755, EVR_CS, "TimeOfFlightInformationUsed", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9756, 0x0018, 0x9756, EVR_CS, "ReconstructionType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9758, 0x0018, 0x9758, EVR_CS, "DecayCorrected", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9759, 0x0018, 0x9759, EVR_CS, "AttenuationCorrected", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9760, 0x0018, 0x9760, EVR_CS, "ScatterCorrected", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9761, 0x0018, 0x9761, EVR_CS, "DeadTimeCorrected", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9762, 0x0018, 0x9762, EVR_CS, "GantryMotionCorrected", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9763, 0x0018, 0x9763, EVR_CS, "PatientMotionCorrected", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9764, 0x0018, 0x9764, EVR_CS, "CountLossNormalizationCorrected", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9765, 0x0018, 0x9765, EVR_CS, "RandomsCorrected", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9766, 0x0018, 0x9766, EVR_CS, "NonUniformRadialSamplingCorrected", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9767, 0x0018, 0x9767, EVR_CS, "SensitivityCalibrated", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9768, 0x0018, 0x9768, EVR_CS, "DetectorNormalizationCorrection", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9769, 0x0018, 0x9769, EVR_CS, "IterativeReconstructionMethod", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9770, 0x0018, 0x9770, EVR_CS, "AttenuationCorrectionTemporalRelationship", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9771, 0x0018, 0x9771, EVR_SQ, "PatientPhysiologicalStateSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9772, 0x0018, 0x9772, EVR_SQ, "PatientPhysiologicalStateCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9801, 0x0018, 0x9801, EVR_FD, "DepthsOfFocus", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9803, 0x0018, 0x9803, EVR_SQ, "ExcludedIntervalsSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9804, 0x0018, 0x9804, EVR_DT, "ExclusionStartDatetime", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9805, 0x0018, 0x9805, EVR_FD, "ExclusionDuration", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9806, 0x0018, 0x9806, EVR_SQ, "USImageDescriptionSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9807, 0x0018, 0x9807, EVR_SQ, "ImageDataTypeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9808, 0x0018, 0x9808, EVR_CS, "DataType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x9809, 0x0018, 0x9809, EVR_SQ, "TransducerScanPatternCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x980b, 0x0018, 0x980b, EVR_CS, "AliasedDataType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x980c, 0x0018, 0x980c, EVR_CS, "PositionMeasuringDeviceUsed", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x980d, 0x0018, 0x980d, EVR_SQ, "TransducerGeometryCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x980e, 0x0018, 0x980e, EVR_SQ, "TransducerBeamSteeringCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0x980f, 0x0018, 0x980f, EVR_SQ, "TransducerApplicationCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0xa001, 0x0018, 0xa001, EVR_SQ, "ContributingEquipmentSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0xa002, 0x0018, 0xa002, EVR_DT, "ContributionDateTime", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0018, 0xa003, 0x0018, 0xa003, EVR_ST, "ContributionDescription", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } #ifdef WITH_PRIVATE_TAGS , { 0x0019, 0x0000, 0x0019, 0x0000, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "AEGIS_DICOM_2.00" } , { 0x0019, 0x0000, 0x0019, 0x0000, EVR_CS, "ImageBlankingShape", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "CARDIO-D.R. 1.0" } , { 0x0019, 0x0000, 0x0019, 0x0000, EVR_LO, "APRName", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "INTEGRIS 1.0" } , { 0x0019, 0x0000, 0x0019, 0x0000, EVR_US, "ReviewMode", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX VIEW 1.0" } , { 0x0019, 0x0000, 0x0019, 0x0000, EVR_UN, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1" } , { 0x0019, 0x0000, 0x0019, 0x0000, EVR_UN, "PhysiologicalDataType", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1;1" } , { 0x0019, 0x0000, 0x0019, 0x0000, EVR_IS, "AECField", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SVISION" } , { 0x0019, 0x0001, 0x0019, 0x0001, EVR_DS, "AngleValueLArm", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "DLX_SERIE_01" } , { 0x0019, 0x0001, 0x0019, 0x0001, EVR_LT, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x0001, 0x0019, 0x0001, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR SPECTRO;1" } , { 0x0019, 0x0001, 0x0019, 0x0001, EVR_US, "AnatomicalBackgroundPercent", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX VIEW 1.0" } , { 0x0019, 0x0001, 0x0019, 0x0001, EVR_UN, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1" } , { 0x0019, 0x0001, 0x0019, 0x0001, EVR_UN, "PhysiologicalDataChannelAndKind", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1;1" } , { 0x0019, 0x0001, 0x0019, 0x0001, EVR_IS, "AECFilmScreen", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SVISION" } , { 0x0019, 0x0001, 0x0019, 0x0001, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "TOSHIBA_MEC_1.0" } , { 0x0019, 0x0001, 0x0019, 0x0001, EVR_IS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "TOSHIBA_MEC_CT_1.0" } , { 0x0019, 0x0002, 0x0019, 0x0002, EVR_IS, "ImageBlankingLeftVerticalEdge", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "CARDIO-D.R. 1.0" } , { 0x0019, 0x0002, 0x0019, 0x0002, EVR_DS, "AngleValuePArm", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "DLX_SERIE_01" } , { 0x0019, 0x0002, 0x0019, 0x0002, EVR_SL, "NumberOfCellsInDetector", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x0002, 0x0019, 0x0002, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR SPECTRO;1" } , { 0x0019, 0x0002, 0x0019, 0x0002, EVR_US, "NumberOfPhases", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX VIEW 1.0" } , { 0x0019, 0x0002, 0x0019, 0x0002, EVR_UN, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1" } , { 0x0019, 0x0002, 0x0019, 0x0002, EVR_US, "SampleBitsAllocated", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1;1" } , { 0x0019, 0x0002, 0x0019, 0x0002, EVR_IS, "AECDensity", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SVISION" } , { 0x0019, 0x0002, 0x0019, 0x0002, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "TOSHIBA_MEC_1.0" } , { 0x0019, 0x0002, 0x0019, 0x0002, EVR_IS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "TOSHIBA_MEC_CT_1.0" } , { 0x0019, 0x0003, 0x0019, 0x0003, EVR_DS, "AngleValueCArm", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "DLX_SERIE_01" } , { 0x0019, 0x0003, 0x0019, 0x0003, EVR_DS, "CellNumberAtTheta", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x0003, 0x0019, 0x0003, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR SPECTRO;1" } , { 0x0019, 0x0003, 0x0019, 0x0003, EVR_US, "ApplyAnatomicalBackground", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX VIEW 1.0" } , { 0x0019, 0x0003, 0x0019, 0x0003, EVR_US, "SampleBitsStored", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1;1" } , { 0x0019, 0x0003, 0x0019, 0x0003, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "TOSHIBA_MEC_CT_1.0" } , { 0x0019, 0x0004, 0x0019, 0x0004, EVR_IS, "ImageBlankingRightVerticalEdge", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "CARDIO-D.R. 1.0" } , { 0x0019, 0x0004, 0x0019, 0x0004, EVR_CS, "AngleLabelLArm", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "DLX_SERIE_01" } , { 0x0019, 0x0004, 0x0019, 0x0004, EVR_DS, "CellSpacing", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x0004, 0x0019, 0x0004, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR SPECTRO;1" } , { 0x0019, 0x0004, 0x0019, 0x0004, EVR_SS, "PixelShiftArray", 4, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX VIEW 1.0" } , { 0x0019, 0x0004, 0x0019, 0x0004, EVR_US, "SampleHighBit", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1;1" } , { 0x0019, 0x0004, 0x0019, 0x0004, EVR_LT, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "TOSHIBA_MEC_CT_1.0" } , { 0x0019, 0x0005, 0x0019, 0x0005, EVR_CS, "AngleLabelPArm", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "DLX_SERIE_01" } , { 0x0019, 0x0005, 0x0019, 0x0005, EVR_LT, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x0005, 0x0019, 0x0005, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR SPECTRO;1" } , { 0x0019, 0x0005, 0x0019, 0x0005, EVR_US, "Brightness", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX VIEW 1.0" } , { 0x0019, 0x0005, 0x0019, 0x0005, EVR_US, "SampleRepresentation", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1;1" } , { 0x0019, 0x0005, 0x0019, 0x0005, EVR_LT, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "TOSHIBA_MEC_CT_1.0" } , { 0x0019, 0x0006, 0x0019, 0x0006, EVR_IS, "ImageBlankingUpperHorizontalEdge", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "CARDIO-D.R. 1.0" } , { 0x0019, 0x0006, 0x0019, 0x0006, EVR_CS, "AngleLabelCArm", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "DLX_SERIE_01" } , { 0x0019, 0x0006, 0x0019, 0x0006, EVR_UN, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x0006, 0x0019, 0x0006, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR SPECTRO;1" } , { 0x0019, 0x0006, 0x0019, 0x0006, EVR_US, "Contrast", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX VIEW 1.0" } , { 0x0019, 0x0006, 0x0019, 0x0006, EVR_UN, "SmallestSampleValue", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1;1" } , { 0x0019, 0x0006, 0x0019, 0x0006, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "TOSHIBA_MEC_CT_1.0" } , { 0x0019, 0x0007, 0x0019, 0x0007, EVR_ST, "ProcedureName", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "DLX_SERIE_01" } , { 0x0019, 0x0007, 0x0019, 0x0007, EVR_IS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR SPECTRO;1" } , { 0x0019, 0x0007, 0x0019, 0x0007, EVR_US, "Enabled", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX VIEW 1.0" } , { 0x0019, 0x0007, 0x0019, 0x0007, EVR_UN, "LargestSampleValue", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1;1" } , { 0x0019, 0x0007, 0x0019, 0x0007, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "TOSHIBA_MEC_CT_1.0" } , { 0x0019, 0x0008, 0x0019, 0x0008, EVR_IS, "ImageBlankingLowerHorizontalEdge", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "CARDIO-D.R. 1.0" } , { 0x0019, 0x0008, 0x0019, 0x0008, EVR_ST, "ExamName", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "DLX_SERIE_01" } , { 0x0019, 0x0008, 0x0019, 0x0008, EVR_IS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR SPECTRO;1" } , { 0x0019, 0x0008, 0x0019, 0x0008, EVR_US, "NativeEdgeEnhancementPercentGain", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX VIEW 1.0" } , { 0x0019, 0x0008, 0x0019, 0x0008, EVR_UN, "NumberOfSamples", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1;1" } , { 0x0019, 0x0008, 0x0019, 0x0008, EVR_IS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-GV-CT Release 1" } , { 0x0019, 0x0008, 0x0019, 0x0008, EVR_LT, "OrientationHeadFeet", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "TOSHIBA_MEC_CT_1.0" } , { 0x0019, 0x0009, 0x0019, 0x0009, EVR_SH, "PatientSize", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "DLX_SERIE_01" } , { 0x0019, 0x0009, 0x0019, 0x0009, EVR_IS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR SPECTRO;1" } , { 0x0019, 0x0009, 0x0019, 0x0009, EVR_DS, "MainMagneticField", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/LAST" } , { 0x0019, 0x0009, 0x0019, 0x0009, EVR_SS, "NativeEdgeEnhancementLUTIndex", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX VIEW 1.0" } , { 0x0019, 0x0009, 0x0019, 0x0009, EVR_UN, "SampleData", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1;1" } , { 0x0019, 0x0009, 0x0019, 0x0009, EVR_IS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-GV-CT Release 1" } , { 0x0019, 0x0009, 0x0019, 0x0009, EVR_LT, "ViewDirection", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "TOSHIBA_MEC_CT_1.0" } , { 0x0019, 0x000a, 0x0019, 0x000a, EVR_IS, "RecordView", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "DLX_SERIE_01" } , { 0x0019, 0x000a, 0x0019, 0x000a, EVR_SS, "NativeEdgeEnhancementKernelSize", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX VIEW 1.0" } , { 0x0019, 0x000a, 0x0019, 0x000a, EVR_UN, "SampleRate", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1;1" } , { 0x0019, 0x000a, 0x0019, 0x000a, EVR_IS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-GV-CT Release 1" } , { 0x0019, 0x000a, 0x0019, 0x000a, EVR_LT, "OrientationSupineProne", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "TOSHIBA_MEC_CT_1.0" } , { 0x0019, 0x000b, 0x0019, 0x000b, EVR_US, "SubtrEdgeEnhancementPercentGain", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX VIEW 1.0" } , { 0x0019, 0x000b, 0x0019, 0x000b, EVR_DS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "TOSHIBA_MEC_CT_1.0" } , { 0x0019, 0x000c, 0x0019, 0x000c, EVR_SS, "SubtrEdgeEnhancementLUTIndex", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX VIEW 1.0" } , { 0x0019, 0x000c, 0x0019, 0x000c, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "TOSHIBA_MEC_CT_1.0" } , { 0x0019, 0x000d, 0x0019, 0x000d, EVR_SS, "SubtrEdgeEnhancementKernelSize", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX VIEW 1.0" } , { 0x0019, 0x000d, 0x0019, 0x000d, EVR_TM, "Time", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "TOSHIBA_MEC_CT_1.0" } , { 0x0019, 0x000e, 0x0019, 0x000e, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x000e, 0x0019, 0x000e, EVR_IS, "FlowCompensation", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/LAST" } , { 0x0019, 0x000e, 0x0019, 0x000e, EVR_US, "FadePercent", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX VIEW 1.0" } , { 0x0019, 0x000e, 0x0019, 0x000e, EVR_DS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "TOSHIBA_MEC_CT_1.0" } , { 0x0019, 0x000f, 0x0019, 0x000f, EVR_DS, "HorizontalFrameOfReference", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x000f, 0x0019, 0x000f, EVR_US, "FlippedBeforeLateralityApplied", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX VIEW 1.0" } , { 0x0019, 0x0010, 0x0019, 0x0010, EVR_ST, "CRImageParamsCommon", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "1.2.840.113681" } , { 0x0019, 0x0010, 0x0019, 0x0010, EVR_IS, "CenterOfCircularImageBlanking", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "CARDIO-D.R. 1.0" } , { 0x0019, 0x0010, 0x0019, 0x0010, EVR_DS, "InjectorDelay", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "DLX_SERIE_01" } , { 0x0019, 0x0010, 0x0019, 0x0010, EVR_IS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR SPECTRO;1" } , { 0x0019, 0x0010, 0x0019, 0x0010, EVR_LT, "ParameterFileName", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CM VA0 ACQU" } , { 0x0019, 0x0010, 0x0019, 0x0010, EVR_DS, "NetFrequency", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CM VA0 CMS" } , { 0x0019, 0x0010, 0x0019, 0x0010, EVR_DS, "DistanceSourceToSourceSideCollimator", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 COAD" } , { 0x0019, 0x0010, 0x0019, 0x0010, EVR_DS, "SourceSideCollimatorAperture", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 GEN" } , { 0x0019, 0x0010, 0x0019, 0x0010, EVR_LT, "MeasurementMode", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS DLR.01" } , { 0x0019, 0x0010, 0x0019, 0x0010, EVR_DS, "TotalMeasurementTimeNominal", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 GEN" } , { 0x0019, 0x0010, 0x0019, 0x0010, EVR_US, "ApplyFade", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX VIEW 1.0" } , { 0x0019, 0x0010, 0x0019, 0x0010, EVR_US, "MainsFrequency", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1" } , { 0x0019, 0x0010, 0x0019, 0x0010, EVR_UN, "PhysiologicalDataType2", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1;1" } , { 0x0019, 0x0010, 0x0019, 0x0010, EVR_LO, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-GV-CT Release 1" } , { 0x0019, 0x0010, 0x0019, 0x0010, EVR_UN, "ECGTimeMapDataBitsAllocated", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-Private-DCI Release 1" } , { 0x0019, 0x0010, 0x0019, 0x0010, EVR_LT, "VideoBeamBoost", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-XSB-DCI Release 1" } , { 0x0019, 0x0010, 0x0019, 0x0010, EVR_IS, "PatientThickness", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SVISION" } , { 0x0019, 0x0011, 0x0019, 0x0011, EVR_ST, "CRImageIPParamsSingle", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "1.2.840.113681" } , { 0x0019, 0x0011, 0x0019, 0x0011, EVR_CS, "AutoInject", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "DLX_SERIE_01" } , { 0x0019, 0x0011, 0x0019, 0x0011, EVR_SS, "SeriesContrast", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x0011, 0x0019, 0x0011, EVR_IS, "ChemicalShiftNumber", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS-MR-1" } , { 0x0019, 0x0011, 0x0019, 0x0011, EVR_LO, "SequenceFileName", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CM VA0 ACQU" } , { 0x0019, 0x0011, 0x0019, 0x0011, EVR_DS, "DistanceSourceToDetectorSideCollimator", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 COAD" } , { 0x0019, 0x0011, 0x0019, 0x0011, EVR_DS, "DetectorSideCollimatorAperture", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 GEN" } , { 0x0019, 0x0011, 0x0019, 0x0011, EVR_LT, "ImageType", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS DLR.01" } , { 0x0019, 0x0011, 0x0019, 0x0011, EVR_DS, "TotalMeasurementTimeCurrent", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 GEN" } , { 0x0019, 0x0011, 0x0019, 0x0011, EVR_UN, "PhysiologicalDataChannelAndKind2", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1;1" } , { 0x0019, 0x0011, 0x0019, 0x0011, EVR_UN, "ECGTimeMapDataBitsStored", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-Private-DCI Release 1" } , { 0x0019, 0x0011, 0x0019, 0x0011, EVR_US, "ChannelGeneratingVideoSync", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-XSB-DCI Release 1" } , { 0x0019, 0x0012, 0x0019, 0x0012, EVR_ST, "CRImageIPParamsLeft", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "1.2.840.113681" } , { 0x0019, 0x0012, 0x0019, 0x0012, EVR_IS, "RadiusOfCircularImageBlanking", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "CARDIO-D.R. 1.0" } , { 0x0019, 0x0012, 0x0019, 0x0012, EVR_SS, "LastPseq", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x0012, 0x0019, 0x0012, EVR_IS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR SPECTRO;1" } , { 0x0019, 0x0012, 0x0019, 0x0012, EVR_IS, "PhaseNumber", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS-MR-1" } , { 0x0019, 0x0012, 0x0019, 0x0012, EVR_LT, "SequenceFileOwner", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CM VA0 ACQU" } , { 0x0019, 0x0012, 0x0019, 0x0012, EVR_DS, "MagneticFieldStrength", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 COAD" } , { 0x0019, 0x0012, 0x0019, 0x0012, EVR_DS, "StartDelayTime", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 GEN" } , { 0x0019, 0x0012, 0x0019, 0x0012, EVR_US, "Zoom", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX VIEW 1.0" } , { 0x0019, 0x0012, 0x0019, 0x0012, EVR_US, "SampleBitsAllocated2", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1;1" } , { 0x0019, 0x0012, 0x0019, 0x0012, EVR_UN, "ECGTimeMapDataHighBit", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-Private-DCI Release 1" } , { 0x0019, 0x0012, 0x0019, 0x0012, EVR_US, "VideoGain", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-XSB-DCI Release 1" } , { 0x0019, 0x0013, 0x0019, 0x0013, EVR_ST, "CRImageIPParamsRight", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "1.2.840.113681" } , { 0x0019, 0x0013, 0x0019, 0x0013, EVR_SS, "StartNumberForBaseline", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x0013, 0x0019, 0x0013, EVR_IS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR SPECTRO;1" } , { 0x0019, 0x0013, 0x0019, 0x0013, EVR_LT, "SequenceDescription", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CM VA0 ACQU" } , { 0x0019, 0x0013, 0x0019, 0x0013, EVR_DS, "DwellTime", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 GEN" } , { 0x0019, 0x0013, 0x0019, 0x0013, EVR_SS, "PanX", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX VIEW 1.0" } , { 0x0019, 0x0013, 0x0019, 0x0013, EVR_US, "SampleBitsStored2", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1;1" } , { 0x0019, 0x0013, 0x0019, 0x0013, EVR_UN, "ECGTimeMapDataRepresentation", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-Private-DCI Release 1" } , { 0x0019, 0x0013, 0x0019, 0x0013, EVR_US, "VideoOffset", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-XSB-DCI Release 1" } , { 0x0019, 0x0014, 0x0019, 0x0014, EVR_IS, "AcquisitionMode", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "DLX_SERIE_01" } , { 0x0019, 0x0014, 0x0019, 0x0014, EVR_SS, "EndNumberForBaseline", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x0014, 0x0019, 0x0014, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR SPECTRO;1" } , { 0x0019, 0x0014, 0x0019, 0x0014, EVR_LT, "EPIFileName", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CM VA0 ACQU" } , { 0x0019, 0x0014, 0x0019, 0x0014, EVR_DS, "ADCVoltage", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 COAD" } , { 0x0019, 0x0014, 0x0019, 0x0014, EVR_IS, "NumberOfPhases", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 GEN" } , { 0x0019, 0x0014, 0x0019, 0x0014, EVR_SS, "PanY", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX VIEW 1.0" } , { 0x0019, 0x0014, 0x0019, 0x0014, EVR_US, "SampleHighBit2", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1;1" } , { 0x0019, 0x0014, 0x0019, 0x0014, EVR_UN, "ECGTimeMapDataSmallestDataValue", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-Private-DCI Release 1" } , { 0x0019, 0x0015, 0x0019, 0x0015, EVR_CS, "CameraRotationEnabled", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "DLX_SERIE_01" } , { 0x0019, 0x0015, 0x0019, 0x0015, EVR_LO, "KanjiBodyPartForExposure", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0019, 0x0015, 0x0019, 0x0015, EVR_SS, "StartNumberForEnhancedScans", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x0015, 0x0019, 0x0015, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR SPECTRO;1" } , { 0x0019, 0x0015, 0x0019, 0x0015, EVR_LT, "SoftwareVersion", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS DLR.01" } , { 0x0019, 0x0015, 0x0019, 0x0015, EVR_LO, "AcquiredPlane", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA GEN" } , { 0x0019, 0x0015, 0x0019, 0x0015, EVR_LT, "OfflineUID", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x0015, 0x0019, 0x0015, EVR_SS, "NativeEdgeEnhancementAdvPercGain", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX VIEW 1.0" } , { 0x0019, 0x0015, 0x0019, 0x0015, EVR_US, "SampleRepresentation2", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1;1" } , { 0x0019, 0x0015, 0x0019, 0x0015, EVR_UN, "ECGTimeMapDataLargestDataValue", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-Private-DCI Release 1" } , { 0x0019, 0x0016, 0x0019, 0x0016, EVR_CS, "ReverseSweep", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "DLX_SERIE_01" } , { 0x0019, 0x0016, 0x0019, 0x0016, EVR_SS, "EndNumberForEnhancedScans", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x0016, 0x0019, 0x0016, EVR_IS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR SPECTRO;1" } , { 0x0019, 0x0016, 0x0019, 0x0016, EVR_DS, "ADCOffset", 2, 2, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 COAD" } , { 0x0019, 0x0016, 0x0019, 0x0016, EVR_UL, "SequenceControlMask", 2, 2, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 GEN" } , { 0x0019, 0x0016, 0x0019, 0x0016, EVR_SS, "SubtrEdgeEnhancementAdvPercGain", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX VIEW 1.0" } , { 0x0019, 0x0016, 0x0019, 0x0016, EVR_UN, "SmallestSampleValue2", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1;1" } , { 0x0019, 0x0016, 0x0019, 0x0016, EVR_UN, "ECGTimeMapDataNumberOfDataValues", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-Private-DCI Release 1" } , { 0x0019, 0x0017, 0x0019, 0x0017, EVR_IS, "SpatialFilterStrength", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "DLX_SERIE_01" } , { 0x0019, 0x0017, 0x0019, 0x0017, EVR_SS, "SeriesPlane", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x0017, 0x0019, 0x0017, EVR_IS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR SPECTRO;1" } , { 0x0019, 0x0017, 0x0019, 0x0017, EVR_US, "InvertFlag", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX VIEW 1.0" } , { 0x0019, 0x0017, 0x0019, 0x0017, EVR_UN, "LargestSampleValue2", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1;1" } , { 0x0019, 0x0017, 0x0019, 0x0017, EVR_UN, "ECGTimeMapData", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-Private-DCI Release 1" } , { 0x0019, 0x0018, 0x0019, 0x0018, EVR_IS, "ZoomFactor", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "DLX_SERIE_01" } , { 0x0019, 0x0018, 0x0019, 0x0018, EVR_LO, "FirstScanRAS", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x0018, 0x0019, 0x0018, EVR_UN, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR SPECTRO;1" } , { 0x0019, 0x0018, 0x0019, 0x0018, EVR_UL, "MeasurementStatusMask", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 GEN" } , { 0x0019, 0x0018, 0x0019, 0x0018, EVR_SS, "Internal", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x0018, 0x0019, 0x0018, EVR_SS, "Internal", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE B" } , { 0x0019, 0x0018, 0x0019, 0x0018, EVR_UN, "NumberOfSamples2", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1;1" } , { 0x0019, 0x0018, 0x0019, 0x0018, EVR_IS, "BeamDistance", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SVISION" } , { 0x0019, 0x0019, 0x0019, 0x0019, EVR_IS, "XZoomCenter", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "DLX_SERIE_01" } , { 0x0019, 0x0019, 0x0019, 0x0019, EVR_DS, "FirstScanLocation", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x0019, 0x0019, 0x0019, EVR_SS, "Internal", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x0019, 0x0019, 0x0019, EVR_SS, "Internal", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE B" } , { 0x0019, 0x0019, 0x0019, 0x0019, EVR_UN, "SampleData2", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1;1" } , { 0x0019, 0x001a, 0x0019, 0x001a, EVR_IS, "YZoomCenter", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "DLX_SERIE_01" } , { 0x0019, 0x001a, 0x0019, 0x001a, EVR_LO, "LastScanRAS", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x001a, 0x0019, 0x001a, EVR_SS, "Internal", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x001a, 0x0019, 0x001a, EVR_SS, "Internal", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE B" } , { 0x0019, 0x001a, 0x0019, 0x001a, EVR_OB, "Quant1KOverlay", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX VIEW 1.0" } , { 0x0019, 0x001a, 0x0019, 0x001a, EVR_UN, "SampleRate2", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1;1" } , { 0x0019, 0x001b, 0x0019, 0x001b, EVR_DS, "Focus", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "DLX_SERIE_01" } , { 0x0019, 0x001b, 0x0019, 0x001b, EVR_DS, "LastScanLocation", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x001b, 0x0019, 0x001b, EVR_SS, "Internal", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x001b, 0x0019, 0x001b, EVR_SS, "Internal", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE B" } , { 0x0019, 0x001b, 0x0019, 0x001b, EVR_US, "OriginalResolution", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX VIEW 1.0" } , { 0x0019, 0x001c, 0x0019, 0x001c, EVR_CS, "Dose", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "DLX_SERIE_01" } , { 0x0019, 0x001c, 0x0019, 0x001c, EVR_SS, "Internal", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x001c, 0x0019, 0x001c, EVR_SS, "Internal", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE B" } , { 0x0019, 0x001c, 0x0019, 0x001c, EVR_DS, "AutoWindowCenter", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX VIEW 1.0" } , { 0x0019, 0x001d, 0x0019, 0x001d, EVR_IS, "SideMark", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "DLX_SERIE_01" } , { 0x0019, 0x001d, 0x0019, 0x001d, EVR_SS, "Internal", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x001d, 0x0019, 0x001d, EVR_SS, "Internal", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE B" } , { 0x0019, 0x001d, 0x0019, 0x001d, EVR_DS, "AutoWindowWidth", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX VIEW 1.0" } , { 0x0019, 0x001e, 0x0019, 0x001e, EVR_IS, "PercentageLandscape", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "DLX_SERIE_01" } , { 0x0019, 0x001e, 0x0019, 0x001e, EVR_DS, "DisplayFieldOfView", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x001e, 0x0019, 0x001e, EVR_SS, "Internal", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x001e, 0x0019, 0x001e, EVR_SS, "Internal", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE B" } , { 0x0019, 0x001f, 0x0019, 0x001f, EVR_DS, "ExposureDuration", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "DLX_SERIE_01" } , { 0x0019, 0x001f, 0x0019, 0x001f, EVR_SS, "DefaultTableIsoCenterHeight", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA GEN" } , { 0x0019, 0x001f, 0x0019, 0x001f, EVR_SS, "Internal", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x001f, 0x0019, 0x001f, EVR_SS, "Internal", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE B" } , { 0x0019, 0x0020, 0x0019, 0x0020, EVR_DS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x0020, 0x0019, 0x0020, EVR_IS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR SPECTRO;1" } , { 0x0019, 0x0020, 0x0019, 0x0020, EVR_LT, "MeasurementMode", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CM VA0 CMS" } , { 0x0019, 0x0020, 0x0019, 0x0020, EVR_IS, "NumberOfPossibleChannels", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 COAD" } , { 0x0019, 0x0020, 0x0019, 0x0020, EVR_DS, "ExposureTime", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 GEN" } , { 0x0019, 0x0020, 0x0019, 0x0020, EVR_LT, "MPMCode", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS DLR.01" } , { 0x0019, 0x0020, 0x0019, 0x0020, EVR_DS, "TransmitterAmplitude", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 COAD" } , { 0x0019, 0x0020, 0x0019, 0x0020, EVR_IS, "NumberOfFourierLinesNominal", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 GEN" } , { 0x0019, 0x0020, 0x0019, 0x0020, EVR_SL, "SceneFlag", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA GEN" } , { 0x0019, 0x0020, 0x0019, 0x0020, EVR_SS, "SystemCalibFactorPlaneA", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x0020, 0x0019, 0x0020, EVR_SL, "SystemCalibFactorPlaneB", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE B" } , { 0x0019, 0x0020, 0x0019, 0x0020, EVR_TM, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-GV-CT Release 1" } , { 0x0019, 0x0020, 0x0019, 0x0020, EVR_DS, "RTDDataCompressionFactor", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-XSB-DCI Release 1" } , { 0x0019, 0x0020, 0x0019, 0x0020, EVR_IS, "WorkstationNumber", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SVISION" } , { 0x0019, 0x0021, 0x0019, 0x0021, EVR_IS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR SPECTRO;1" } , { 0x0019, 0x0021, 0x0019, 0x0021, EVR_IS, "MeanChannelNumber", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 COAD" } , { 0x0019, 0x0021, 0x0019, 0x0021, EVR_DS, "ExposureCurrent", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 GEN" } , { 0x0019, 0x0021, 0x0019, 0x0021, EVR_LT, "Latitude", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS DLR.01" } , { 0x0019, 0x0021, 0x0019, 0x0021, EVR_IS, "NumberOfTransmitterAmplitudes", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 COAD" } , { 0x0019, 0x0021, 0x0019, 0x0021, EVR_IS, "NumberOfFourierLinesCurrent", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 GEN" } , { 0x0019, 0x0022, 0x0019, 0x0022, EVR_UN, "RouteAET", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "DIDI TO PCR 1.1" } , { 0x0019, 0x0022, 0x0019, 0x0022, EVR_DS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x0022, 0x0019, 0x0022, EVR_IS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR SPECTRO;1" } , { 0x0019, 0x0022, 0x0019, 0x0022, EVR_DS, "DetectorSpacing", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 COAD" } , { 0x0019, 0x0022, 0x0019, 0x0022, EVR_LT, "Sensitivity", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS DLR.01" } , { 0x0019, 0x0022, 0x0019, 0x0022, EVR_DS, "TransmitterAttenuator", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 COAD" } , { 0x0019, 0x0022, 0x0019, 0x0022, EVR_SL, "RefPhotofileFlag", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA GEN" } , { 0x0019, 0x0022, 0x0019, 0x0022, EVR_SS, "XRayParameterSetNo", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x0022, 0x0019, 0x0022, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE B" } , { 0x0019, 0x0023, 0x0019, 0x0023, EVR_DS, "PCRPrintScale", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "DIDI TO PCR 1.1" } , { 0x0019, 0x0023, 0x0019, 0x0023, EVR_DS, "TableSpeed", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x0023, 0x0019, 0x0023, EVR_IS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR SPECTRO;1" } , { 0x0019, 0x0023, 0x0019, 0x0023, EVR_DS, "DetectorCenter", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 COAD" } , { 0x0019, 0x0023, 0x0019, 0x0023, EVR_LT, "EDR", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS DLR.01" } , { 0x0019, 0x0024, 0x0019, 0x0024, EVR_UN, "PCRPrintJobEnd", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "DIDI TO PCR 1.1" } , { 0x0019, 0x0024, 0x0019, 0x0024, EVR_DS, "MidScanTime", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x0024, 0x0019, 0x0024, EVR_IS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR SPECTRO;1" } , { 0x0019, 0x0024, 0x0019, 0x0024, EVR_DS, "ReadingIntegrationTime", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 COAD" } , { 0x0019, 0x0024, 0x0019, 0x0024, EVR_LT, "LFix", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS DLR.01" } , { 0x0019, 0x0024, 0x0019, 0x0024, EVR_DS, "TransmitterCalibration", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 COAD" } , { 0x0019, 0x0024, 0x0019, 0x0024, EVR_LO, "SceneName", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA GEN" } , { 0x0019, 0x0024, 0x0019, 0x0024, EVR_SS, "XRaySystem", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x0024, 0x0019, 0x0024, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE B" } , { 0x0019, 0x0025, 0x0019, 0x0025, EVR_IS, "PCRNoFilmCopies", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "DIDI TO PCR 1.1" } , { 0x0019, 0x0025, 0x0019, 0x0025, EVR_SS, "MidScanFlag", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x0025, 0x0019, 0x0025, EVR_IS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR SPECTRO;1" } , { 0x0019, 0x0025, 0x0019, 0x0025, EVR_DS, "KVPGeneratorPowerCurrent", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 GEN" } , { 0x0019, 0x0025, 0x0019, 0x0025, EVR_LT, "SFix", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS DLR.01" } , { 0x0019, 0x0025, 0x0019, 0x0025, EVR_LT, "OriginalPixelDataQuality", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1" } , { 0x0019, 0x0026, 0x0019, 0x0026, EVR_IS, "PCRFilmLayoutPosition", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "DIDI TO PCR 1.1" } , { 0x0019, 0x0026, 0x0019, 0x0026, EVR_SL, "DegreesOfAzimuth", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x0026, 0x0019, 0x0026, EVR_IS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR SPECTRO;1" } , { 0x0019, 0x0026, 0x0019, 0x0026, EVR_DS, "GeneratorVoltage", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 GEN" } , { 0x0019, 0x0026, 0x0019, 0x0026, EVR_LT, "PresetMode", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS DLR.01" } , { 0x0019, 0x0026, 0x0019, 0x0026, EVR_DS, "TransmitterReference", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 COAD" } , { 0x0019, 0x0026, 0x0019, 0x0026, EVR_IS, "NumberOfFourierLinesAfterZero", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 GEN" } , { 0x0019, 0x0026, 0x0019, 0x0026, EVR_SS, "AcquisitionIndex", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA GEN" } , { 0x0019, 0x0026, 0x0019, 0x0026, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x0026, 0x0019, 0x0026, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE B" } , { 0x0019, 0x0027, 0x0019, 0x0027, EVR_UN, "PCRPrintReportName", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "DIDI TO PCR 1.1" } , { 0x0019, 0x0027, 0x0019, 0x0027, EVR_DS, "GantryPeriod", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x0027, 0x0019, 0x0027, EVR_IS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR SPECTRO;1" } , { 0x0019, 0x0027, 0x0019, 0x0027, EVR_LT, "Region", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS DLR.01" } , { 0x0019, 0x0028, 0x0019, 0x0028, EVR_IS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR SPECTRO;1" } , { 0x0019, 0x0028, 0x0019, 0x0028, EVR_LT, "Subregion", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS DLR.01" } , { 0x0019, 0x0028, 0x0019, 0x0028, EVR_IS, "FirstMeasuredFourierLine", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 GEN" } , { 0x0019, 0x0028, 0x0019, 0x0028, EVR_SS, "MixedPulseMode", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA GEN" } , { 0x0019, 0x0028, 0x0019, 0x0028, EVR_SS, "AcquiredDisplayMode", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x0028, 0x0019, 0x0028, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE B" } , { 0x0019, 0x0028, 0x0019, 0x0028, EVR_IS, "TubeNumber", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SVISION" } , { 0x0019, 0x0029, 0x0019, 0x0029, EVR_IS, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR SPECTRO;1" } , { 0x0019, 0x002a, 0x0019, 0x002a, EVR_DS, "XrayOnPosition", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x002a, 0x0019, 0x002a, EVR_SS, "NoOfPositions", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA GEN" } , { 0x0019, 0x002a, 0x0019, 0x002a, EVR_SS, "AcquisitionDelay", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x002a, 0x0019, 0x002a, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE B" } , { 0x0019, 0x002b, 0x0019, 0x002b, EVR_DS, "XrayOffPosition", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x002c, 0x0019, 0x002c, EVR_SL, "NumberOfTriggers", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x002c, 0x0019, 0x002c, EVR_SS, "NoOfPhases", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA GEN" } , { 0x0019, 0x002c, 0x0019, 0x002c, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x002c, 0x0019, 0x002c, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE B" } , { 0x0019, 0x002d, 0x0019, 0x002d, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x002e, 0x0019, 0x002e, EVR_DS, "AngleOfFirstView", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x002e, 0x0019, 0x002e, EVR_SS, "FrameRateForPositions", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA GEN" } , { 0x0019, 0x002e, 0x0019, 0x002e, EVR_SS, "MaxFramesLimit", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x002e, 0x0019, 0x002e, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE B" } , { 0x0019, 0x002f, 0x0019, 0x002f, EVR_DS, "TriggerFrequency", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x0030, 0x0019, 0x0030, EVR_UL, "MaximumImageFrameSize", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "CARDIO-D.R. 1.0" } , { 0x0019, 0x0030, 0x0019, 0x0030, EVR_LO, "CREDRMode", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GE ??? From Adantage Review CS" } , { 0x0019, 0x0030, 0x0019, 0x0030, EVR_LT, "CalculationMode", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CM VA0 CMS" } , { 0x0019, 0x0030, 0x0019, 0x0030, EVR_LT, "Orientation", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS DLR.01" } , { 0x0019, 0x0030, 0x0019, 0x0030, EVR_IS, "AcquisitionColumns", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 GEN" } , { 0x0019, 0x0030, 0x0019, 0x0030, EVR_SS, "NoOfFramesForPositions", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA GEN" } , { 0x0019, 0x0030, 0x0019, 0x0030, EVR_US, "MaximumFrameSizeNIU", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x0030, 0x0019, 0x0030, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE B" } , { 0x0019, 0x0030, 0x0019, 0x0030, EVR_US, "ECGTriggering", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1" } , { 0x0019, 0x0030, 0x0019, 0x0030, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-PCR Release 2" } , { 0x0019, 0x0030, 0x0019, 0x0030, EVR_DS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-Private_ICS Release 1" } , { 0x0019, 0x0030, 0x0019, 0x0030, EVR_IS, "BuckyGrid", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SVISION" } , { 0x0019, 0x0031, 0x0019, 0x0031, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR SPECTRO;1" } , { 0x0019, 0x0031, 0x0019, 0x0031, EVR_LT, "MarkOnFilm", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS DLR.01" } , { 0x0019, 0x0031, 0x0019, 0x0031, EVR_IS, "ReconstructionColumns", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 GEN" } , { 0x0019, 0x0031, 0x0019, 0x0031, EVR_UN, "ECG1Offset", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1" } , { 0x0019, 0x0031, 0x0019, 0x0031, EVR_LO, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-Private_ICS Release 1" } , { 0x0019, 0x0032, 0x0019, 0x0032, EVR_LO, "KanjiMenuName", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0019, 0x0032, 0x0019, 0x0032, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR SPECTRO;1" } , { 0x0019, 0x0032, 0x0019, 0x0032, EVR_LT, "RotationOnDRC", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS DLR.01" } , { 0x0019, 0x0032, 0x0019, 0x0032, EVR_SS, "SteppingDirection", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA GEN" } , { 0x0019, 0x0032, 0x0019, 0x0032, EVR_SS, "SubtractedFilterType", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x0032, 0x0019, 0x0032, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE B" } , { 0x0019, 0x0032, 0x0019, 0x0032, EVR_UN, "ECG2Offset1", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1" } , { 0x0019, 0x0033, 0x0019, 0x0033, EVR_UN, "ECG2Offset2", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1" } , { 0x0019, 0x0034, 0x0019, 0x0034, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA GEN" } , { 0x0019, 0x0034, 0x0019, 0x0034, EVR_SS, "FilterFactorNative", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x0034, 0x0019, 0x0034, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE B" } , { 0x0019, 0x0034, 0x0019, 0x0034, EVR_IS, "Focus", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SVISION" } , { 0x0019, 0x0036, 0x0019, 0x0036, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA GEN" } , { 0x0019, 0x0036, 0x0019, 0x0036, EVR_SS, "AnatomicBackgroundFactor", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x0036, 0x0019, 0x0036, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE B" } , { 0x0019, 0x0038, 0x0019, 0x0038, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA GEN" } , { 0x0019, 0x0038, 0x0019, 0x0038, EVR_SS, "WindowUpperLimitNative", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x0038, 0x0019, 0x0038, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE B" } , { 0x0019, 0x0038, 0x0019, 0x0038, EVR_IS, "Child", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SVISION" } , { 0x0019, 0x0039, 0x0019, 0x0039, EVR_SS, "ScanFOVType", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x0039, 0x0019, 0x0039, EVR_SS, "AxialType", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GE_GENESIS_REV3.0" } , { 0x0019, 0x003a, 0x0019, 0x003a, EVR_IS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x003a, 0x0019, 0x003a, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA GEN" } , { 0x0019, 0x003a, 0x0019, 0x003a, EVR_SS, "WindowLowerLimitNative", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x003a, 0x0019, 0x003a, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE B" } , { 0x0019, 0x003b, 0x0019, 0x003b, EVR_LT, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x003c, 0x0019, 0x003c, EVR_UN, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x003c, 0x0019, 0x003c, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA GEN" } , { 0x0019, 0x003c, 0x0019, 0x003c, EVR_SS, "WindowBrightnessPhase1", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x003c, 0x0019, 0x003c, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE B" } , { 0x0019, 0x003e, 0x0019, 0x003e, EVR_UN, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x003e, 0x0019, 0x003e, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA GEN" } , { 0x0019, 0x003e, 0x0019, 0x003e, EVR_SS, "WindowBrightnessPhase2", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x003e, 0x0019, 0x003e, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE B" } , { 0x0019, 0x003f, 0x0019, 0x003f, EVR_UN, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x0040, 0x0019, 0x0040, EVR_CS, "ImageProcessingType", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0019, 0x0040, 0x0019, 0x0040, EVR_LO, "CRLatitude", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GE ??? From Adantage Review CS" } , { 0x0019, 0x0040, 0x0019, 0x0040, EVR_SS, "StatReconFlag", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x0040, 0x0019, 0x0040, EVR_DS, "FrameRate", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "INTEGRIS 1.0" } , { 0x0019, 0x0040, 0x0019, 0x0040, EVR_UL, "MasterControlMask", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 GEN" } , { 0x0019, 0x0040, 0x0019, 0x0040, EVR_LT, "ReaderType", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS DLR.01" } , { 0x0019, 0x0040, 0x0019, 0x0040, EVR_IS, "ArrayCoilElementNumber", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 GEN" } , { 0x0019, 0x0040, 0x0019, 0x0040, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA GEN" } , { 0x0019, 0x0040, 0x0019, 0x0040, EVR_SS, "WindowContrastPhase1", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x0040, 0x0019, 0x0040, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE B" } , { 0x0019, 0x0040, 0x0019, 0x0040, EVR_IS, "CollimatorDistanceX", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SVISION" } , { 0x0019, 0x0041, 0x0019, 0x0041, EVR_SS, "ComputeType", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x0041, 0x0019, 0x0041, EVR_LT, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR SPECTRO;1" } , { 0x0019, 0x0041, 0x0019, 0x0041, EVR_LT, "SubModality", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS DLR.01" } , { 0x0019, 0x0041, 0x0019, 0x0041, EVR_UL, "ArrayCoilElementSelectMask", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 GEN" } , { 0x0019, 0x0041, 0x0019, 0x0041, EVR_IS, "CollimatorDistanceY", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SVISION" } , { 0x0019, 0x0042, 0x0019, 0x0042, EVR_SS, "SegmentNumber", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x0042, 0x0019, 0x0042, EVR_IS, "Unknown", 2, 2, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR SPECTRO;1" } , { 0x0019, 0x0042, 0x0019, 0x0042, EVR_US, "ProcessingMask", 5, 5, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 GEN" } , { 0x0019, 0x0042, 0x0019, 0x0042, EVR_LT, "ReaderSerialNumber", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS DLR.01" } , { 0x0019, 0x0042, 0x0019, 0x0042, EVR_UL, "ArrayCoilElementDataMask", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 GEN" } , { 0x0019, 0x0042, 0x0019, 0x0042, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA GEN" } , { 0x0019, 0x0042, 0x0019, 0x0042, EVR_SS, "WindowContrastPhase2", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x0042, 0x0019, 0x0042, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE B" } , { 0x0019, 0x0043, 0x0019, 0x0043, EVR_SS, "TotalSegmentsRequested", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x0043, 0x0019, 0x0043, EVR_IS, "Unknown", 2, 2, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR SPECTRO;1" } , { 0x0019, 0x0043, 0x0019, 0x0043, EVR_IS, "ArrayCoilElementToADCConnect", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 GEN" } , { 0x0019, 0x0044, 0x0019, 0x0044, EVR_DS, "InterscanDelay", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x0044, 0x0019, 0x0044, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 GEN" } , { 0x0019, 0x0044, 0x0019, 0x0044, EVR_DS, "ArrayCoilElementNoiseLevel", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 GEN" } , { 0x0019, 0x0044, 0x0019, 0x0044, EVR_SS, "ImageTransferDelay", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA GEN" } , { 0x0019, 0x0044, 0x0019, 0x0044, EVR_SS, "FilterFactorSub", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x0044, 0x0019, 0x0044, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE B" } , { 0x0019, 0x0045, 0x0019, 0x0045, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR SPECTRO;1" } , { 0x0019, 0x0045, 0x0019, 0x0045, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 GEN" } , { 0x0019, 0x0045, 0x0019, 0x0045, EVR_IS, "ArrayCoilADCPairNumber", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 GEN" } , { 0x0019, 0x0046, 0x0019, 0x0046, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR SPECTRO;1" } , { 0x0019, 0x0046, 0x0019, 0x0046, EVR_UL, "ArrayCoilCombinationMask", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 GEN" } , { 0x0019, 0x0046, 0x0019, 0x0046, EVR_SL, "InversFlag", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA GEN" } , { 0x0019, 0x0046, 0x0019, 0x0046, EVR_SS, "PeakOpacified", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x0046, 0x0019, 0x0046, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE B" } , { 0x0019, 0x0047, 0x0019, 0x0047, EVR_SS, "ViewCompressionFactor", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x0047, 0x0019, 0x0047, EVR_IS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR SPECTRO;1" } , { 0x0019, 0x0048, 0x0019, 0x0048, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x0048, 0x0019, 0x0048, EVR_IS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR SPECTRO;1" } , { 0x0019, 0x0048, 0x0019, 0x0048, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA GEN" } , { 0x0019, 0x0048, 0x0019, 0x0048, EVR_SL, "MaskFrame", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x0048, 0x0019, 0x0048, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE B" } , { 0x0019, 0x0049, 0x0019, 0x0049, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x0049, 0x0019, 0x0049, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR SPECTRO;1" } , { 0x0019, 0x004a, 0x0019, 0x004a, EVR_SS, "TotalNumberOfRefChannels", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x004a, 0x0019, 0x004a, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA GEN" } , { 0x0019, 0x004a, 0x0019, 0x004a, EVR_SL, "BIHFrame", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x004a, 0x0019, 0x004a, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE B" } , { 0x0019, 0x004b, 0x0019, 0x004b, EVR_SL, "DataSizeForScanData", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x004c, 0x0019, 0x004c, EVR_SS, "BlankingCircleDiameter", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA GEN" } , { 0x0019, 0x004c, 0x0019, 0x004c, EVR_SS, "CentBeamAngulationCaudCran", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x004c, 0x0019, 0x004c, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE B" } , { 0x0019, 0x004e, 0x0019, 0x004e, EVR_SS, "CentBeamAngulationLRAnterior", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x004e, 0x0019, 0x004e, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE B" } , { 0x0019, 0x0050, 0x0019, 0x0050, EVR_CS, "EDRMode", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0019, 0x0050, 0x0019, 0x0050, EVR_LO, "CRGroupNumber", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GE ??? From Adantage Review CS" } , { 0x0019, 0x0050, 0x0019, 0x0050, EVR_UN, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR SPECTRO;1" } , { 0x0019, 0x0050, 0x0019, 0x0050, EVR_IS, "NoiseLevel", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CM VA0 CMS" } , { 0x0019, 0x0050, 0x0019, 0x0050, EVR_DS, "DetectorAlignment", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 COAD" } , { 0x0019, 0x0050, 0x0019, 0x0050, EVR_LT, "CassetteScale", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS DLR.01" } , { 0x0019, 0x0050, 0x0019, 0x0050, EVR_DS, "ReceiverTotalGain", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 COAD" } , { 0x0019, 0x0050, 0x0019, 0x0050, EVR_IS, "NumberOfAverages", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 GEN" } , { 0x0019, 0x0050, 0x0019, 0x0050, EVR_SL, "StandDataValid", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA GEN" } , { 0x0019, 0x0050, 0x0019, 0x0050, EVR_SS, "LongitudinalPosition", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x0050, 0x0019, 0x0050, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE B" } , { 0x0019, 0x0050, 0x0019, 0x0050, EVR_US, "VideoScanMode", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1" } , { 0x0019, 0x0050, 0x0019, 0x0050, EVR_LO, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-GV-CT Release 1" } , { 0x0019, 0x0050, 0x0019, 0x0050, EVR_IS, "CentralBeamHeight", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SVISION" } , { 0x0019, 0x0051, 0x0019, 0x0051, EVR_LT, "CassetteMatrix", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS DLR.01" } , { 0x0019, 0x0051, 0x0019, 0x0051, EVR_DS, "ReceiverAmplifierGain", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 COAD" } , { 0x0019, 0x0051, 0x0019, 0x0051, EVR_US, "VideoLineRate", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1" } , { 0x0019, 0x0052, 0x0019, 0x0052, EVR_SS, "ReconPostProcessingFlag", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x0052, 0x0019, 0x0052, EVR_DS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 COAD" } , { 0x0019, 0x0052, 0x0019, 0x0052, EVR_LT, "CassetteSubmatrix", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS DLR.01" } , { 0x0019, 0x0052, 0x0019, 0x0052, EVR_DS, "ReceiverPreamplifierGain", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 COAD" } , { 0x0019, 0x0052, 0x0019, 0x0052, EVR_SS, "TableTilt", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA GEN" } , { 0x0019, 0x0052, 0x0019, 0x0052, EVR_SS, "SideOffset", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x0052, 0x0019, 0x0052, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE B" } , { 0x0019, 0x0053, 0x0019, 0x0053, EVR_LT, "Barcode", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS DLR.01" } , { 0x0019, 0x0054, 0x0019, 0x0054, EVR_UN, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x0054, 0x0019, 0x0054, EVR_DS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 COAD" } , { 0x0019, 0x0054, 0x0019, 0x0054, EVR_DS, "ReceiverCableAttenuation", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 COAD" } , { 0x0019, 0x0054, 0x0019, 0x0054, EVR_SS, "TableAxisRotation", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA GEN" } , { 0x0019, 0x0054, 0x0019, 0x0054, EVR_SS, "IsoCenterHeight", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x0054, 0x0019, 0x0054, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE B" } , { 0x0019, 0x0055, 0x0019, 0x0055, EVR_DS, "ReceiverReferenceGain", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 COAD" } , { 0x0019, 0x0056, 0x0019, 0x0056, EVR_DS, "ReceiverFilterFrequency", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 COAD" } , { 0x0019, 0x0056, 0x0019, 0x0056, EVR_SS, "TableLongitudalPosition", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA GEN" } , { 0x0019, 0x0056, 0x0019, 0x0056, EVR_SS, "ImageTwist", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x0056, 0x0019, 0x0056, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE B" } , { 0x0019, 0x0057, 0x0019, 0x0057, EVR_SS, "CTWaterNumber", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x0058, 0x0019, 0x0058, EVR_SS, "CTBoneNumber", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x0058, 0x0019, 0x0058, EVR_SS, "TableSideOffset", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA GEN" } , { 0x0019, 0x0058, 0x0019, 0x0058, EVR_SS, "SourceImageDistance", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x0058, 0x0019, 0x0058, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE B" } , { 0x0019, 0x005a, 0x0019, 0x005a, EVR_FL, "AcquisitionDuration", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x005a, 0x0019, 0x005a, EVR_SS, "TableIsoCenterHeight", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA GEN" } , { 0x0019, 0x005a, 0x0019, 0x005a, EVR_SS, "MechanicalMagnificationFactor", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x005a, 0x0019, 0x005a, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE B" } , { 0x0019, 0x005c, 0x0019, 0x005c, EVR_UN, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA GEN" } , { 0x0019, 0x005c, 0x0019, 0x005c, EVR_SL, "CalibrationFlag", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x005c, 0x0019, 0x005c, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE B" } , { 0x0019, 0x005d, 0x0019, 0x005d, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x005e, 0x0019, 0x005e, EVR_SL, "NumberOfChannels1To512", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x005e, 0x0019, 0x005e, EVR_SL, "CollimationDataValid", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA GEN" } , { 0x0019, 0x005e, 0x0019, 0x005e, EVR_SL, "CalibrationAngleCranCaud", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x005e, 0x0019, 0x005e, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE B" } , { 0x0019, 0x005f, 0x0019, 0x005f, EVR_SL, "IncrementBetweenChannels", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x0060, 0x0019, 0x0060, EVR_SH, "RadiographersCode", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0019, 0x0060, 0x0019, 0x0060, EVR_SL, "StartingView", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x0060, 0x0019, 0x0060, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR SPECTRO;1" } , { 0x0019, 0x0060, 0x0019, 0x0060, EVR_IS, "NumberOfDataBytes", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CM VA0 CMS" } , { 0x0019, 0x0060, 0x0019, 0x0060, EVR_DS, "FocusAlignment", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 COAD" } , { 0x0019, 0x0060, 0x0019, 0x0060, EVR_LT, "ContrastType", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS DLR.01" } , { 0x0019, 0x0060, 0x0019, 0x0060, EVR_DS, "ReconstructionScaleFactor", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 COAD" } , { 0x0019, 0x0060, 0x0019, 0x0060, EVR_DS, "FlipAngle", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 GEN" } , { 0x0019, 0x0060, 0x0019, 0x0060, EVR_SL, "PeriSequenceNo", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA GEN" } , { 0x0019, 0x0060, 0x0019, 0x0060, EVR_SL, "CalibrationAngleRAOLAO", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x0060, 0x0019, 0x0060, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE B" } , { 0x0019, 0x0060, 0x0019, 0x0060, EVR_US, "XrayTechnique", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1" } , { 0x0019, 0x0060, 0x0019, 0x0060, EVR_DS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-GV-CT Release 1" } , { 0x0019, 0x0060, 0x0019, 0x0060, EVR_IS, "BuckyAngle", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SVISION" } , { 0x0019, 0x0061, 0x0019, 0x0061, EVR_SL, "NumberOfViews", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x0061, 0x0019, 0x0061, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR SPECTRO;1" } , { 0x0019, 0x0061, 0x0019, 0x0061, EVR_LT, "RotationAmount", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS DLR.01" } , { 0x0019, 0x0061, 0x0019, 0x0061, EVR_DS, "ImageIdentifierFromat", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1" } , { 0x0019, 0x0061, 0x0019, 0x0061, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-GV-CT Release 1" } , { 0x0019, 0x0062, 0x0019, 0x0062, EVR_SL, "IncrementBetweenViews", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x0062, 0x0019, 0x0062, EVR_IS, "NumberOfVirtuellChannels", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 GEN" } , { 0x0019, 0x0062, 0x0019, 0x0062, EVR_LT, "RotationCenter", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS DLR.01" } , { 0x0019, 0x0062, 0x0019, 0x0062, EVR_DS, "ReferenceScaleFactor", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 COAD" } , { 0x0019, 0x0062, 0x0019, 0x0062, EVR_SL, "PeriTotalScenes", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA GEN" } , { 0x0019, 0x0062, 0x0019, 0x0062, EVR_SL, "CalibrationTableToFloorDist", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x0062, 0x0019, 0x0062, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE B" } , { 0x0019, 0x0062, 0x0019, 0x0062, EVR_US, "IrisDiaphragm", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1" } , { 0x0019, 0x0063, 0x0019, 0x0063, EVR_LT, "DensityShift", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS DLR.01" } , { 0x0019, 0x0063, 0x0019, 0x0063, EVR_CS, "Filter", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1" } , { 0x0019, 0x0063, 0x0019, 0x0063, EVR_LO, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-GV-CT Release 1" } , { 0x0019, 0x0064, 0x0019, 0x0064, EVR_US, "FrequencyRank", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS DLR.01" } , { 0x0019, 0x0064, 0x0019, 0x0064, EVR_SL, "PeriOverlapTop", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA GEN" } , { 0x0019, 0x0064, 0x0019, 0x0064, EVR_SL, "CalibrationIsocenterToFloorDist", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x0064, 0x0019, 0x0064, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE B" } , { 0x0019, 0x0064, 0x0019, 0x0064, EVR_CS, "CineParallel", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1" } , { 0x0019, 0x0064, 0x0019, 0x0064, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-GV-CT Release 1" } , { 0x0019, 0x0065, 0x0019, 0x0065, EVR_UL, "FocalSpotDeflectionAmplitude", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 COAD" } , { 0x0019, 0x0065, 0x0019, 0x0065, EVR_LT, "FrequencyEnhancement", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS DLR.01" } , { 0x0019, 0x0065, 0x0019, 0x0065, EVR_CS, "CineMaster", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1" } , { 0x0019, 0x0065, 0x0019, 0x0065, EVR_IS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-GV-CT Release 1" } , { 0x0019, 0x0066, 0x0019, 0x0066, EVR_UL, "FocalSpotDeflectionPhase", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 COAD" } , { 0x0019, 0x0066, 0x0019, 0x0066, EVR_LT, "FrequencyType", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS DLR.01" } , { 0x0019, 0x0066, 0x0019, 0x0066, EVR_SL, "PeriOverlapBottom", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA GEN" } , { 0x0019, 0x0066, 0x0019, 0x0066, EVR_SL, "CalibrationIsocenterToSourceDist", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x0066, 0x0019, 0x0066, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE B" } , { 0x0019, 0x0067, 0x0019, 0x0067, EVR_UL, "FocalSpotDeflectionOffset", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 COAD" } , { 0x0019, 0x0067, 0x0019, 0x0067, EVR_LT, "KernelLength", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS DLR.01" } , { 0x0019, 0x0068, 0x0019, 0x0068, EVR_UL, "KernelMode", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS DLR.01" } , { 0x0019, 0x0068, 0x0019, 0x0068, EVR_SL, "RawImageNumber", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA GEN" } , { 0x0019, 0x0068, 0x0019, 0x0068, EVR_SL, "CalibrationSourceToII", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x0068, 0x0019, 0x0068, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE B" } , { 0x0019, 0x0068, 0x0019, 0x0068, EVR_IS, "CArmAngle", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SVISION" } , { 0x0019, 0x0069, 0x0019, 0x0069, EVR_UL, "ConvolutionMode", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS DLR.01" } , { 0x0019, 0x0069, 0x0019, 0x0069, EVR_IS, "CollimatorAngle", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SVISION" } , { 0x0019, 0x006a, 0x0019, 0x006a, EVR_SS, "DependantOnNumberOfViewsProcessed", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x006a, 0x0019, 0x006a, EVR_SL, "XRayDataValid", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA GEN" } , { 0x0019, 0x006a, 0x0019, 0x006a, EVR_SL, "CalibrationIIZoom", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x006a, 0x0019, 0x006a, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE B" } , { 0x0019, 0x006b, 0x0019, 0x006b, EVR_SS, "FieldOfViewInDetectorCells", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x006c, 0x0019, 0x006c, EVR_SL, "CalibrationIIField", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x006c, 0x0019, 0x006c, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE B" } , { 0x0019, 0x006e, 0x0019, 0x006e, EVR_SL, "CalibrationFactor", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x006e, 0x0019, 0x006e, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE B" } , { 0x0019, 0x0070, 0x0019, 0x0070, EVR_UN, "RADProtocolPrinter", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "DIDI TO PCR 1.1" } , { 0x0019, 0x0070, 0x0019, 0x0070, EVR_IS, "SplitExposureFormat", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0019, 0x0070, 0x0019, 0x0070, EVR_LO, "CRImageSerialNumber", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GE ??? From Adantage Review CS" } , { 0x0019, 0x0070, 0x0019, 0x0070, EVR_SS, "ValueOfBackProjectionButton", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x0070, 0x0019, 0x0070, EVR_UN, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR SPECTRO;1" } , { 0x0019, 0x0070, 0x0019, 0x0070, EVR_DS, "WaterScalingFactor", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 COAD" } , { 0x0019, 0x0070, 0x0019, 0x0070, EVR_IS, "NumberOfReadings", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 GEN" } , { 0x0019, 0x0070, 0x0019, 0x0070, EVR_LT, "PLASource", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS DLR.01" } , { 0x0019, 0x0070, 0x0019, 0x0070, EVR_DS, "PhaseGradientAmplitude", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 COAD" } , { 0x0019, 0x0070, 0x0019, 0x0070, EVR_IS, "NumberOfPrescans", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 GEN" } , { 0x0019, 0x0070, 0x0019, 0x0070, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA GEN" } , { 0x0019, 0x0070, 0x0019, 0x0070, EVR_SL, "CalibrationObjectToImageDistance", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x0070, 0x0019, 0x0070, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE B" } , { 0x0019, 0x0070, 0x0019, 0x0070, EVR_US, "ExposureChannel", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1" } , { 0x0019, 0x0070, 0x0019, 0x0070, EVR_LT, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-GV-CT Release 1" } , { 0x0019, 0x0070, 0x0019, 0x0070, EVR_IS, "FilterNumber", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SVISION" } , { 0x0019, 0x0071, 0x0019, 0x0071, EVR_UN, "RADProtocolMedium", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "DIDI TO PCR 1.1" } , { 0x0019, 0x0071, 0x0019, 0x0071, EVR_IS, "NoOfSplitExposureFrames", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0019, 0x0071, 0x0019, 0x0071, EVR_SS, "SetIfFatqEstimatesWereUsed", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x0071, 0x0019, 0x0071, EVR_IS, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR SPECTRO;1" } , { 0x0019, 0x0071, 0x0019, 0x0071, EVR_DS, "InterpolationFactor", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 COAD" } , { 0x0019, 0x0071, 0x0019, 0x0071, EVR_LT, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 GEN" } , { 0x0019, 0x0071, 0x0019, 0x0071, EVR_LT, "PLADestination", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS DLR.01" } , { 0x0019, 0x0071, 0x0019, 0x0071, EVR_DS, "ReadoutGradientAmplitude", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 COAD" } , { 0x0019, 0x0071, 0x0019, 0x0071, EVR_UN, "ExposureChannelFirstImage", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1" } , { 0x0019, 0x0072, 0x0019, 0x0072, EVR_DS, "ZChannelAvgOverViews", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x0072, 0x0019, 0x0072, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR SPECTRO;1" } , { 0x0019, 0x0072, 0x0019, 0x0072, EVR_DS, "SelectionGradientAmplitude", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 COAD" } , { 0x0019, 0x0072, 0x0019, 0x0072, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA GEN" } , { 0x0019, 0x0072, 0x0019, 0x0072, EVR_SL, "CalibrationSystemFactor", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x0072, 0x0019, 0x0072, EVR_UN, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE B" } , { 0x0019, 0x0072, 0x0019, 0x0072, EVR_US, "ProcessingChannel", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1" } , { 0x0019, 0x0073, 0x0019, 0x0073, EVR_DS, "AvgOfLeftRefChannelsOverViews", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x0073, 0x0019, 0x0073, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR SPECTRO;1" } , { 0x0019, 0x0074, 0x0019, 0x0074, EVR_DS, "MaxLeftChannelOverViews", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x0074, 0x0019, 0x0074, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR SPECTRO;1" } , { 0x0019, 0x0074, 0x0019, 0x0074, EVR_IS, "NumberOfProjections", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 GEN" } , { 0x0019, 0x0074, 0x0019, 0x0074, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA GEN" } , { 0x0019, 0x0074, 0x0019, 0x0074, EVR_SL, "CalibrationSystemCorrection", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x0074, 0x0019, 0x0074, EVR_UN, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE B" } , { 0x0019, 0x0074, 0x0019, 0x0074, EVR_LO, "FilterMaterial1", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SVISION" } , { 0x0019, 0x0075, 0x0019, 0x0075, EVR_DS, "AvgOfRightRefChannelsOverViews", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x0075, 0x0019, 0x0075, EVR_IS, "NumberOfBytes", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 GEN" } , { 0x0019, 0x0075, 0x0019, 0x0075, EVR_LT, "UIDOriginalImage", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS DLR.01" } , { 0x0019, 0x0075, 0x0019, 0x0075, EVR_LO, "FilterMaterial2", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SVISION" } , { 0x0019, 0x0076, 0x0019, 0x0076, EVR_DS, "MaxRightChannelOverViews", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x0076, 0x0019, 0x0076, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR SPECTRO;1" } , { 0x0019, 0x0076, 0x0019, 0x0076, EVR_LT, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS DLR.01" } , { 0x0019, 0x0076, 0x0019, 0x0076, EVR_SL, "FillingAverageFactor", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA GEN" } , { 0x0019, 0x0076, 0x0019, 0x0076, EVR_SL, "CalibrationSystemIIFormats", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x0076, 0x0019, 0x0076, EVR_UN, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE B" } , { 0x0019, 0x0077, 0x0019, 0x0077, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR SPECTRO;1" } , { 0x0019, 0x0078, 0x0019, 0x0078, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR SPECTRO;1" } , { 0x0019, 0x0078, 0x0019, 0x0078, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA GEN" } , { 0x0019, 0x0078, 0x0019, 0x0078, EVR_SL, "CalibrationGantryDataValid", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x0078, 0x0019, 0x0078, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE B" } , { 0x0019, 0x0078, 0x0019, 0x0078, EVR_DS, "FilterThickness1", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SVISION" } , { 0x0019, 0x0079, 0x0019, 0x0079, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR SPECTRO;1" } , { 0x0019, 0x0079, 0x0019, 0x0079, EVR_DS, "FilterThickness2", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SVISION" } , { 0x0019, 0x007a, 0x0019, 0x007a, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA GEN" } , { 0x0019, 0x007a, 0x0019, 0x007a, EVR_SS, "CollimatorSquareBreadth", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x007a, 0x0019, 0x007a, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE B" } , { 0x0019, 0x007c, 0x0019, 0x007c, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA GEN" } , { 0x0019, 0x007c, 0x0019, 0x007c, EVR_SS, "CollimatorSquareHeight", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x007c, 0x0019, 0x007c, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE B" } , { 0x0019, 0x007d, 0x0019, 0x007d, EVR_DS, "SecondEcho", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x007e, 0x0019, 0x007e, EVR_SS, "NumberOfEchos", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x007e, 0x0019, 0x007e, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA GEN" } , { 0x0019, 0x007e, 0x0019, 0x007e, EVR_SS, "CollimatorSquareDiameter", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x007e, 0x0019, 0x007e, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE B" } , { 0x0019, 0x007f, 0x0019, 0x007f, EVR_DS, "TableDelta", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x0080, 0x0019, 0x0080, EVR_IS, "ReadingPositionSpecification", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0019, 0x0080, 0x0019, 0x0080, EVR_LO, "CRBarCodeNumber", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GE ??? From Adantage Review CS" } , { 0x0019, 0x0080, 0x0019, 0x0080, EVR_IS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR SPECTRO;1" } , { 0x0019, 0x0080, 0x0019, 0x0080, EVR_LT, "PatientRegion", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 COAD" } , { 0x0019, 0x0080, 0x0019, 0x0080, EVR_LT, "ReconstructionAlgorithmSet", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 GEN" } , { 0x0019, 0x0080, 0x0019, 0x0080, EVR_LT, "ReaderHeader", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS DLR.01" } , { 0x0019, 0x0080, 0x0019, 0x0080, EVR_DS, "GradientDelayTime", 3, 3, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 COAD" } , { 0x0019, 0x0080, 0x0019, 0x0080, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA GEN" } , { 0x0019, 0x0080, 0x0019, 0x0080, EVR_SS, "CollimaterFingerTurnAngle", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x0080, 0x0019, 0x0080, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE B" } , { 0x0019, 0x0080, 0x0019, 0x0080, EVR_DS, "AcquisitionDelay", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1" } , { 0x0019, 0x0080, 0x0019, 0x0080, EVR_LO, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-GV-CT Release 1" } , { 0x0019, 0x0080, 0x0019, 0x0080, EVR_IS, "BuckyFormat", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SVISION" } , { 0x0019, 0x0081, 0x0019, 0x0081, EVR_IS, "ReadingSensitivityCenter", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0019, 0x0081, 0x0019, 0x0081, EVR_SS, "Contiguous", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x0081, 0x0019, 0x0081, EVR_LT, "ReconstructionAlgorithmIndex", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 GEN" } , { 0x0019, 0x0081, 0x0019, 0x0081, EVR_LT, "FilterTypeForRawData", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 GEN" } , { 0x0019, 0x0081, 0x0019, 0x0081, EVR_UN, "RelativeImageTime", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1" } , { 0x0019, 0x0081, 0x0019, 0x0081, EVR_LO, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-GV-CT Release 1" } , { 0x0019, 0x0081, 0x0019, 0x0081, EVR_IS, "ObjectPosition", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SVISION" } , { 0x0019, 0x0082, 0x0019, 0x0082, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x0082, 0x0019, 0x0082, EVR_LT, "PatientPhaseOfLife", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 COAD" } , { 0x0019, 0x0082, 0x0019, 0x0082, EVR_LT, "RegenerationSoftwareVersion", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 GEN" } , { 0x0019, 0x0082, 0x0019, 0x0082, EVR_DS, "TotalGradientDelayTime", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 COAD" } , { 0x0019, 0x0082, 0x0019, 0x0082, EVR_DS, "FilterParameterForRawData", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 GEN" } , { 0x0019, 0x0082, 0x0019, 0x0082, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA GEN" } , { 0x0019, 0x0082, 0x0019, 0x0082, EVR_SS, "CollimaterFingerPosition", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x0082, 0x0019, 0x0082, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE B" } , { 0x0019, 0x0083, 0x0019, 0x0083, EVR_DS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x0083, 0x0019, 0x0083, EVR_LT, "FilterTypeForImageData", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 GEN" } , { 0x0019, 0x0084, 0x0019, 0x0084, EVR_DS, "PeakSAR", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x0084, 0x0019, 0x0084, EVR_DS, "FilterParameterForImageData", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 GEN" } , { 0x0019, 0x0084, 0x0019, 0x0084, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA GEN" } , { 0x0019, 0x0084, 0x0019, 0x0084, EVR_SS, "CollimaterDiaphragmTurnAngle", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x0084, 0x0019, 0x0084, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE B" } , { 0x0019, 0x0085, 0x0019, 0x0085, EVR_SS, "MonitorSAR", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x0085, 0x0019, 0x0085, EVR_LT, "FilterTypeForPhaseCorrection", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 GEN" } , { 0x0019, 0x0086, 0x0019, 0x0086, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x0086, 0x0019, 0x0086, EVR_DS, "FilterParameterForPhaseCorrection", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 GEN" } , { 0x0019, 0x0086, 0x0019, 0x0086, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA GEN" } , { 0x0019, 0x0086, 0x0019, 0x0086, EVR_SS, "CollimaterDiaphragmPosition1", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x0086, 0x0019, 0x0086, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE B" } , { 0x0019, 0x0087, 0x0019, 0x0087, EVR_DS, "CardiacRepetitionTime", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x0087, 0x0019, 0x0087, EVR_LT, "NormalizationFilterTypeForImageData", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 GEN" } , { 0x0019, 0x0088, 0x0019, 0x0088, EVR_SS, "ImagesPerCardiacCycle", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x0088, 0x0019, 0x0088, EVR_DS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 GEN" } , { 0x0019, 0x0088, 0x0019, 0x0088, EVR_DS, "NormalizationFilterParameterForImageData", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 GEN" } , { 0x0019, 0x0088, 0x0019, 0x0088, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA GEN" } , { 0x0019, 0x0088, 0x0019, 0x0088, EVR_SS, "CollimaterDiaphragmPosition2", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x0088, 0x0019, 0x0088, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE B" } , { 0x0019, 0x008a, 0x0019, 0x008a, EVR_SS, "ActualReceiveGainAnalog", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x008a, 0x0019, 0x008a, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA GEN" } , { 0x0019, 0x008a, 0x0019, 0x008a, EVR_SS, "CollimaterDiaphragmMode", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x008a, 0x0019, 0x008a, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE B" } , { 0x0019, 0x008b, 0x0019, 0x008b, EVR_SS, "ActualReceiveGainDigital", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x008c, 0x0019, 0x008c, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA GEN" } , { 0x0019, 0x008c, 0x0019, 0x008c, EVR_SS, "CollimaterBeamLimitBreadth", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x008c, 0x0019, 0x008c, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE B" } , { 0x0019, 0x008d, 0x0019, 0x008d, EVR_DS, "DelayAfterTrigger", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x008e, 0x0019, 0x008e, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA GEN" } , { 0x0019, 0x008e, 0x0019, 0x008e, EVR_SS, "CollimaterBeamLimitHeight", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x008e, 0x0019, 0x008e, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE B" } , { 0x0019, 0x008f, 0x0019, 0x008f, EVR_SS, "SwapPhaseFrequency", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x008f, 0x0019, 0x008f, EVR_SS, "SwapPhaseFrequency", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GE_GENESIS_REV3.0" } , { 0x0019, 0x0090, 0x0019, 0x0090, EVR_LO, "UnprocessedFlag", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "DIDI TO PCR 1.1" } , { 0x0019, 0x0090, 0x0019, 0x0090, EVR_SH, "FilmAnnotationCharacterString1", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0019, 0x0090, 0x0019, 0x0090, EVR_LO, "CRFilmOutputExposures", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GE ??? From Adantage Review CS" } , { 0x0019, 0x0090, 0x0019, 0x0090, EVR_SS, "PauseInterval", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x0090, 0x0019, 0x0090, EVR_DS, "OsteoOffset", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 COAD" } , { 0x0019, 0x0090, 0x0019, 0x0090, EVR_LT, "PLAOfSecondaryDestination", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS DLR.01" } , { 0x0019, 0x0090, 0x0019, 0x0090, EVR_LT, "SensitivityCorrectionLabel", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 COAD" } , { 0x0019, 0x0090, 0x0019, 0x0090, EVR_IS, "NumberOfSaturationRegions", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 GEN" } , { 0x0019, 0x0090, 0x0019, 0x0090, EVR_SS, "CollimaterBeamLimitDiameter", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x0090, 0x0019, 0x0090, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE B" } , { 0x0019, 0x0090, 0x0019, 0x0090, EVR_CS, "VideoWhiteCompression", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1" } , { 0x0019, 0x0090, 0x0019, 0x0090, EVR_LO, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-GV-CT Release 1" } , { 0x0019, 0x0090, 0x0019, 0x0090, EVR_LO, "DeskCommand", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SVISION" } , { 0x0019, 0x0091, 0x0019, 0x0091, EVR_UN, "KeyValues", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "DIDI TO PCR 1.1" } , { 0x0019, 0x0091, 0x0019, 0x0091, EVR_SH, "FilmAnnotationCharacterString2", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0019, 0x0091, 0x0019, 0x0091, EVR_DS, "PulseTime", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x0091, 0x0019, 0x0091, EVR_DS, "SaturationPhaseEncodingVectorCoronalComponent", 6, 6, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 COAD" } , { 0x0019, 0x0091, 0x0019, 0x0091, EVR_DS, "SaturationPhaseEncodingVectorSagittalComponent", 6, 6, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 GEN" } , { 0x0019, 0x0092, 0x0019, 0x0092, EVR_UN, "DestinationPostprocessingFunction", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "DIDI TO PCR 1.1" } , { 0x0019, 0x0092, 0x0019, 0x0092, EVR_SL, "SliceOffsetOnFrequencyAxis", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x0092, 0x0019, 0x0092, EVR_DS, "OsteoRegressionLineSlope", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 COAD" } , { 0x0019, 0x0092, 0x0019, 0x0092, EVR_DS, "SaturationReadoutVectorCoronalComponent", 6, 6, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 COAD" } , { 0x0019, 0x0092, 0x0019, 0x0092, EVR_DS, "SaturationReadoutVectorSagittalComponent", 6, 6, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 GEN" } , { 0x0019, 0x0092, 0x0019, 0x0092, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA GEN" } , { 0x0019, 0x0092, 0x0019, 0x0092, EVR_SS, "X-RayControlMOde", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x0092, 0x0019, 0x0092, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE B" } , { 0x0019, 0x0093, 0x0019, 0x0093, EVR_DS, "CenterFrequency", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x0093, 0x0019, 0x0093, EVR_DS, "OsteoRegressionLineIntercept", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 COAD" } , { 0x0019, 0x0093, 0x0019, 0x0093, EVR_DS, "EPIStimulationMonitorMode", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 GEN" } , { 0x0019, 0x0094, 0x0019, 0x0094, EVR_SS, "TransmitGain", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x0094, 0x0019, 0x0094, EVR_DS, "OsteoStandardizationCode", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 COAD" } , { 0x0019, 0x0094, 0x0019, 0x0094, EVR_DS, "ImageRotationAngle", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 GEN" } , { 0x0019, 0x0094, 0x0019, 0x0094, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA GEN" } , { 0x0019, 0x0094, 0x0019, 0x0094, EVR_SS, "X-RaySystem", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x0094, 0x0019, 0x0094, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE B" } , { 0x0019, 0x0095, 0x0019, 0x0095, EVR_SS, "AnalogReceiverGain", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x0096, 0x0019, 0x0096, EVR_SS, "DigitalReceiverGain", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x0096, 0x0019, 0x0096, EVR_IS, "OsteoPhantomNumber", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 COAD" } , { 0x0019, 0x0096, 0x0019, 0x0096, EVR_UL, "CoilIDMask", 3, 3, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 GEN" } , { 0x0019, 0x0096, 0x0019, 0x0096, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA GEN" } , { 0x0019, 0x0096, 0x0019, 0x0096, EVR_SS, "FocalSpot", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x0096, 0x0019, 0x0096, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE B" } , { 0x0019, 0x0097, 0x0019, 0x0097, EVR_SL, "BitmapDefiningCVs", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x0097, 0x0019, 0x0097, EVR_UL, "CoilClassMask", 2, 2, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 GEN" } , { 0x0019, 0x0098, 0x0019, 0x0098, EVR_SS, "CenterFrequencyMethod", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x0098, 0x0019, 0x0098, EVR_DS, "CoilPosition", 3, 3, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 GEN" } , { 0x0019, 0x0098, 0x0019, 0x0098, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA GEN" } , { 0x0019, 0x0098, 0x0019, 0x0098, EVR_SS, "ExposureControl", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x0098, 0x0019, 0x0098, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE B" } , { 0x0019, 0x0099, 0x0019, 0x0099, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x009a, 0x0019, 0x009a, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA GEN" } , { 0x0019, 0x009a, 0x0019, 0x009a, EVR_SL, "XRayVoltage", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x009a, 0x0019, 0x009a, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE B" } , { 0x0019, 0x009b, 0x0019, 0x009b, EVR_SS, "PulseSequenceMode", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x009c, 0x0019, 0x009c, EVR_LO, "PulseSequenceName", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x009c, 0x0019, 0x009c, EVR_SS, "PulseSequenceName", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GE_GENESIS_REV3.0" } , { 0x0019, 0x009c, 0x0019, 0x009c, EVR_SL, "IntensifierLevelCalibrationFactor", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA GEN" } , { 0x0019, 0x009c, 0x0019, 0x009c, EVR_SL, "XRayCurrent", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x009c, 0x0019, 0x009c, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE B" } , { 0x0019, 0x009d, 0x0019, 0x009d, EVR_DT, "PulseSequenceDate", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x009e, 0x0019, 0x009e, EVR_LO, "InternalPulseSequenceName", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x009e, 0x0019, 0x009e, EVR_SL, "NativeReviewFlag", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA GEN" } , { 0x0019, 0x009e, 0x0019, 0x009e, EVR_SL, "XRayCurrentTimeProduct", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x009e, 0x0019, 0x009e, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE B" } , { 0x0019, 0x009f, 0x0019, 0x009f, EVR_SS, "TransmittingCoil", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x009f, 0x0019, 0x009f, EVR_SS, "CoilType", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GE_GENESIS_REV3.0" } , { 0x0019, 0x00a0, 0x0019, 0x00a0, EVR_UN, "Version", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "DIDI TO PCR 1.1" } , { 0x0019, 0x00a0, 0x0019, 0x00a0, EVR_SS, "SurfaceCoilType", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x00a0, 0x0019, 0x00a0, EVR_DS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS DLR.01" } , { 0x0019, 0x00a0, 0x0019, 0x00a0, EVR_US, "RFWatchdogMask", 3, 3, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 COAD" } , { 0x0019, 0x00a0, 0x0019, 0x00a0, EVR_DS, "EPIReconstructionPhase", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 GEN" } , { 0x0019, 0x00a0, 0x0019, 0x00a0, EVR_SL, "XRayPulseTime", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x00a0, 0x0019, 0x00a0, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE B" } , { 0x0019, 0x00a0, 0x0019, 0x00a0, EVR_US, "Angulation", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1" } , { 0x0019, 0x00a0, 0x0019, 0x00a0, EVR_LO, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-GV-CT Release 1" } , { 0x0019, 0x00a0, 0x0019, 0x00a0, EVR_DS, "ExtendedExposureTime", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SVISION" } , { 0x0019, 0x00a1, 0x0019, 0x00a1, EVR_UN, "RangingMode", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "DIDI TO PCR 1.1" } , { 0x0019, 0x00a1, 0x0019, 0x00a1, EVR_SS, "ExtremityCoilFlag", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x00a1, 0x0019, 0x00a1, EVR_DS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS DLR.01" } , { 0x0019, 0x00a1, 0x0019, 0x00a1, EVR_DS, "EPIReconstructionSlope", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 COAD" } , { 0x0019, 0x00a1, 0x0019, 0x00a1, EVR_DS, "EPIReconstructionSlope", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 GEN" } , { 0x0019, 0x00a1, 0x0019, 0x00a1, EVR_US, "Rotation", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1" } , { 0x0019, 0x00a1, 0x0019, 0x00a1, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-GV-CT Release 1" } , { 0x0019, 0x00a1, 0x0019, 0x00a1, EVR_DS, "ActualExposureTime", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SVISION" } , { 0x0019, 0x00a2, 0x0019, 0x00a2, EVR_UN, "AbdomenBrightness", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "DIDI TO PCR 1.1" } , { 0x0019, 0x00a2, 0x0019, 0x00a2, EVR_SL, "RawDataRunNumber", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x00a2, 0x0019, 0x00a2, EVR_DS, "RFPowerErrorIndicator", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 COAD" } , { 0x0019, 0x00a2, 0x0019, 0x00a2, EVR_SL, "SceneNumber", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA GEN" } , { 0x0019, 0x00a2, 0x0019, 0x00a2, EVR_SL, "XRaySceneTimeFluoroClock", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x00a2, 0x0019, 0x00a2, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE B" } , { 0x0019, 0x00a2, 0x0019, 0x00a2, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-GV-CT Release 1" } , { 0x0019, 0x00a3, 0x0019, 0x00a3, EVR_UN, "FixedBrightness", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "DIDI TO PCR 1.1" } , { 0x0019, 0x00a3, 0x0019, 0x00a3, EVR_UL, "CalibratedFieldStrength", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x00a3, 0x0019, 0x00a3, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 COAD" } , { 0x0019, 0x00a3, 0x0019, 0x00a3, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-GV-CT Release 1" } , { 0x0019, 0x00a4, 0x0019, 0x00a4, EVR_UN, "DetailContrast", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "DIDI TO PCR 1.1" } , { 0x0019, 0x00a4, 0x0019, 0x00a4, EVR_SS, "SATFatWaterBone", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x00a4, 0x0019, 0x00a4, EVR_SS, "SATFatWaterBone", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GE_GENESIS_REV3.0" } , { 0x0019, 0x00a4, 0x0019, 0x00a4, EVR_DS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 COAD" } , { 0x0019, 0x00a4, 0x0019, 0x00a4, EVR_SS, "AcquisitionMode", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA GEN" } , { 0x0019, 0x00a4, 0x0019, 0x00a4, EVR_SS, "MaximumPulseRate", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x00a4, 0x0019, 0x00a4, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE B" } , { 0x0019, 0x00a5, 0x0019, 0x00a5, EVR_UN, "ContrastBalance", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "DIDI TO PCR 1.1" } , { 0x0019, 0x00a5, 0x0019, 0x00a5, EVR_DS, "ReceiveBandwidth", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x00a5, 0x0019, 0x00a5, EVR_DS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 COAD" } , { 0x0019, 0x00a5, 0x0019, 0x00a5, EVR_DS, "SpecificAbsorptionRateWholeBody", 3, 3, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 COAD" } , { 0x0019, 0x00a5, 0x0019, 0x00a5, EVR_SS, "AcquisitonFrameRate", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA GEN" } , { 0x0019, 0x00a6, 0x0019, 0x00a6, EVR_UN, "StructureBoost", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "DIDI TO PCR 1.1" } , { 0x0019, 0x00a6, 0x0019, 0x00a6, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 COAD" } , { 0x0019, 0x00a6, 0x0019, 0x00a6, EVR_DS, "SpecificEnergyDose", 3, 3, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 COAD" } , { 0x0019, 0x00a6, 0x0019, 0x00a6, EVR_SL, "ECGFlag", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA GEN" } , { 0x0019, 0x00a6, 0x0019, 0x00a6, EVR_SS, "PulsesPerScene", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x00a6, 0x0019, 0x00a6, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE B" } , { 0x0019, 0x00a7, 0x0019, 0x00a7, EVR_UN, "StructurePreference", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "DIDI TO PCR 1.1" } , { 0x0019, 0x00a7, 0x0019, 0x00a7, EVR_DS, "UserData", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x00a7, 0x0019, 0x00a7, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 COAD" } , { 0x0019, 0x00a7, 0x0019, 0x00a7, EVR_SL, "AdditionalSceneData", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA GEN" } , { 0x0019, 0x00a8, 0x0019, 0x00a8, EVR_UN, "NoiseRobustness", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "DIDI TO PCR 1.1" } , { 0x0019, 0x00a8, 0x0019, 0x00a8, EVR_DS, "UserData", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x00a8, 0x0019, 0x00a8, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 COAD" } , { 0x0019, 0x00a8, 0x0019, 0x00a8, EVR_SL, "FileCopyFlag", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA GEN" } , { 0x0019, 0x00a8, 0x0019, 0x00a8, EVR_SL, "DoseAreaProductOfScene", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x00a8, 0x0019, 0x00a8, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE B" } , { 0x0019, 0x00a8, 0x0019, 0x00a8, EVR_DS, "ExtendedXRayTubeCurrent", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SVISION" } , { 0x0019, 0x00a9, 0x0019, 0x00a9, EVR_UN, "NoiseDoseLimit", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "DIDI TO PCR 1.1" } , { 0x0019, 0x00a9, 0x0019, 0x00a9, EVR_DS, "UserData", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x00a9, 0x0019, 0x00a9, EVR_DS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 COAD" } , { 0x0019, 0x00a9, 0x0019, 0x00a9, EVR_SL, "PhlebovisionFlag", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA GEN" } , { 0x0019, 0x00aa, 0x0019, 0x00aa, EVR_UN, "NoiseDoseStep", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "DIDI TO PCR 1.1" } , { 0x0019, 0x00aa, 0x0019, 0x00aa, EVR_DS, "UserData", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x00aa, 0x0019, 0x00aa, EVR_LT, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 COAD" } , { 0x0019, 0x00aa, 0x0019, 0x00aa, EVR_SL, "Co2Flag", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA GEN" } , { 0x0019, 0x00aa, 0x0019, 0x00aa, EVR_SS, "Dose", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x00aa, 0x0019, 0x00aa, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE B" } , { 0x0019, 0x00ab, 0x0019, 0x00ab, EVR_UN, "NoiseFrequencyLimit", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "DIDI TO PCR 1.1" } , { 0x0019, 0x00ab, 0x0019, 0x00ab, EVR_DS, "UserData", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x00ab, 0x0019, 0x00ab, EVR_DS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 COAD" } , { 0x0019, 0x00ab, 0x0019, 0x00ab, EVR_SS, "MaxSpeed", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA GEN" } , { 0x0019, 0x00ac, 0x0019, 0x00ac, EVR_UN, "WeakContrastLimit", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "DIDI TO PCR 1.1" } , { 0x0019, 0x00ac, 0x0019, 0x00ac, EVR_DS, "UserData", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x00ac, 0x0019, 0x00ac, EVR_DS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 COAD" } , { 0x0019, 0x00ac, 0x0019, 0x00ac, EVR_SS, "StepWidth", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA GEN" } , { 0x0019, 0x00ac, 0x0019, 0x00ac, EVR_SS, "DoseRate", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x00ac, 0x0019, 0x00ac, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE B" } , { 0x0019, 0x00ad, 0x0019, 0x00ad, EVR_UN, "StrongContrastLimit", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "DIDI TO PCR 1.1" } , { 0x0019, 0x00ad, 0x0019, 0x00ad, EVR_DS, "UserData", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x00ad, 0x0019, 0x00ad, EVR_DS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 COAD" } , { 0x0019, 0x00ad, 0x0019, 0x00ad, EVR_SL, "DigitalAcquisitionZoom", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA GEN" } , { 0x0019, 0x00ae, 0x0019, 0x00ae, EVR_UN, "StructureBoostOffset", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "DIDI TO PCR 1.1" } , { 0x0019, 0x00ae, 0x0019, 0x00ae, EVR_DS, "UserData", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x00ae, 0x0019, 0x00ae, EVR_DS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 COAD" } , { 0x0019, 0x00ae, 0x0019, 0x00ae, EVR_SL, "IIToCoverDistance", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x00af, 0x0019, 0x00af, EVR_UN, "SmoothGain", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "DIDI TO PCR 1.1" } , { 0x0019, 0x00af, 0x0019, 0x00af, EVR_DS, "UserData", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x00af, 0x0019, 0x00af, EVR_DS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 COAD" } , { 0x0019, 0x00b0, 0x0019, 0x00b0, EVR_UN, "MeasureField1", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "DIDI TO PCR 1.1" } , { 0x0019, 0x00b0, 0x0019, 0x00b0, EVR_DS, "UserData", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x00b0, 0x0019, 0x00b0, EVR_DS, "FeedPerRotation", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 COAD" } , { 0x0019, 0x00b0, 0x0019, 0x00b0, EVR_UL, "AdjustmentStatusMask", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 COAD" } , { 0x0019, 0x00b0, 0x0019, 0x00b0, EVR_SS, "LastFramePhase1", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x00b0, 0x0019, 0x00b0, EVR_LO, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-GV-CT Release 1" } , { 0x0019, 0x00b1, 0x0019, 0x00b1, EVR_UN, "MeasureField2", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "DIDI TO PCR 1.1" } , { 0x0019, 0x00b1, 0x0019, 0x00b1, EVR_DS, "UserData", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x00b1, 0x0019, 0x00b1, EVR_IS, "MinimumRRInterval", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/LAST" } , { 0x0019, 0x00b1, 0x0019, 0x00b1, EVR_SS, "FrameRatePhase1", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x00b1, 0x0019, 0x00b1, EVR_LO, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-GV-CT Release 1" } , { 0x0019, 0x00b2, 0x0019, 0x00b2, EVR_UN, "KeyPercentile1", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "DIDI TO PCR 1.1" } , { 0x0019, 0x00b2, 0x0019, 0x00b2, EVR_DS, "UserData", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x00b2, 0x0019, 0x00b2, EVR_IS, "MaximumRRInterval", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/LAST" } , { 0x0019, 0x00b2, 0x0019, 0x00b2, EVR_SS, "LastFramePhase2", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x00b3, 0x0019, 0x00b3, EVR_UN, "KeyPercentile2", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "DIDI TO PCR 1.1" } , { 0x0019, 0x00b3, 0x0019, 0x00b3, EVR_DS, "UserData", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x00b3, 0x0019, 0x00b3, EVR_IS, "NumberOfRejections", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/LAST" } , { 0x0019, 0x00b3, 0x0019, 0x00b3, EVR_SS, "FrameRatePhase2", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x00b4, 0x0019, 0x00b4, EVR_UN, "DensityLUT", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "DIDI TO PCR 1.1" } , { 0x0019, 0x00b4, 0x0019, 0x00b4, EVR_DS, "UserData", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x00b4, 0x0019, 0x00b4, EVR_IS, "NumberOfRRIntervals", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/LAST" } , { 0x0019, 0x00b4, 0x0019, 0x00b4, EVR_SS, "LastFramePhase3", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x00b5, 0x0019, 0x00b5, EVR_UN, "Brightness", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "DIDI TO PCR 1.1" } , { 0x0019, 0x00b5, 0x0019, 0x00b5, EVR_DS, "UserData", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x00b5, 0x0019, 0x00b5, EVR_IS, "ArrhythmiaRejection", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/LAST" } , { 0x0019, 0x00b5, 0x0019, 0x00b5, EVR_SS, "FrameRatePhase3", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x00b6, 0x0019, 0x00b6, EVR_UN, "Gamma", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "DIDI TO PCR 1.1" } , { 0x0019, 0x00b6, 0x0019, 0x00b6, EVR_DS, "UserData", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x00b6, 0x0019, 0x00b6, EVR_SS, "LastFramePhase4", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x00b7, 0x0019, 0x00b7, EVR_DS, "UserData", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x00b7, 0x0019, 0x00b7, EVR_SS, "FrameRatePhase4", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x00b8, 0x0019, 0x00b8, EVR_DS, "UserData", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x00b8, 0x0019, 0x00b8, EVR_SS, "GammaOfNativeImage", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x00b9, 0x0019, 0x00b9, EVR_DS, "UserData", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x00b9, 0x0019, 0x00b9, EVR_SS, "GammaOfTVSystem", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x00ba, 0x0019, 0x00ba, EVR_DS, "UserData", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x00bb, 0x0019, 0x00bb, EVR_DS, "UserData", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x00bb, 0x0019, 0x00bb, EVR_SL, "PixelshiftX", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x00bc, 0x0019, 0x00bc, EVR_DS, "UserData", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x00bc, 0x0019, 0x00bc, EVR_SL, "PixelshiftY", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x00bd, 0x0019, 0x00bd, EVR_DS, "UserData", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x00bd, 0x0019, 0x00bd, EVR_IS, "PulmoTriggerLevel", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 COAD" } , { 0x0019, 0x00bd, 0x0019, 0x00bd, EVR_SL, "MaskAverageFactor", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x00be, 0x0019, 0x00be, EVR_DS, "ProjectionAngle", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x00be, 0x0019, 0x00be, EVR_DS, "ExpiratoricReserveVolume", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 COAD" } , { 0x0019, 0x00be, 0x0019, 0x00be, EVR_SL, "BlankingCircleFlag", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x00bf, 0x0019, 0x00bf, EVR_DS, "VitalCapacity", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 COAD" } , { 0x0019, 0x00bf, 0x0019, 0x00bf, EVR_SL, "CircleRowStart", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x00c0, 0x0019, 0x00c0, EVR_SS, "SaturationPlanes", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x00c0, 0x0019, 0x00c0, EVR_SS, "BitmapOfSATSelections", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GE_GENESIS_REV3.0" } , { 0x0019, 0x00c0, 0x0019, 0x00c0, EVR_DS, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/LAST" } , { 0x0019, 0x00c0, 0x0019, 0x00c0, EVR_DS, "PulmoWater", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 COAD" } , { 0x0019, 0x00c0, 0x0019, 0x00c0, EVR_SL, "CircleRowEnd", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x00c1, 0x0019, 0x00c1, EVR_SS, "SurfaceCoilIntensityCorrectionFlag", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x00c1, 0x0019, 0x00c1, EVR_SS, "SurfaceCoilIntensityCorrectionFlag", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GE_GENESIS_REV3.0" } , { 0x0019, 0x00c1, 0x0019, 0x00c1, EVR_DS, "PulmoAir", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 COAD" } , { 0x0019, 0x00c1, 0x0019, 0x00c1, EVR_DS, "EPICapacity", 6, 6, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 COAD" } , { 0x0019, 0x00c1, 0x0019, 0x00c1, EVR_SL, "CircleColumnStart", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x00c2, 0x0019, 0x00c2, EVR_SS, "SATLocationR", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x00c2, 0x0019, 0x00c2, EVR_DA, "PulmoDate", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 COAD" } , { 0x0019, 0x00c2, 0x0019, 0x00c2, EVR_DS, "EPIInductance", 3, 3, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 COAD" } , { 0x0019, 0x00c2, 0x0019, 0x00c2, EVR_SL, "CircleColumnEnd", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x00c3, 0x0019, 0x00c3, EVR_SS, "SATLocationL", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x00c3, 0x0019, 0x00c3, EVR_TM, "PulmoTime", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 COAD" } , { 0x0019, 0x00c3, 0x0019, 0x00c3, EVR_IS, "EPISwitchConfigurationCode", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 COAD" } , { 0x0019, 0x00c3, 0x0019, 0x00c3, EVR_SL, "CircleDiameter", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x00c4, 0x0019, 0x00c4, EVR_SS, "SATLocationA", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x00c4, 0x0019, 0x00c4, EVR_IS, "EPISwitchHardwareCode", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 COAD" } , { 0x0019, 0x00c4, 0x0019, 0x00c4, EVR_SL, "RectangularCollimaterFlag", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x00c5, 0x0019, 0x00c5, EVR_SS, "SATLocationP", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x00c5, 0x0019, 0x00c5, EVR_DS, "EPISwitchDelayTime", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 COAD" } , { 0x0019, 0x00c5, 0x0019, 0x00c5, EVR_SL, "RectangleRowStart", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x00c6, 0x0019, 0x00c6, EVR_SS, "SATLocationH", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x00c6, 0x0019, 0x00c6, EVR_IS, "CycledMultipleSlice", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/LAST" } , { 0x0019, 0x00c6, 0x0019, 0x00c6, EVR_SL, "RectangleRowEnd", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x00c7, 0x0019, 0x00c7, EVR_SS, "SATLocationF", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x00c7, 0x0019, 0x00c7, EVR_SL, "RectangleColumnStart", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x00c8, 0x0019, 0x00c8, EVR_SS, "SATThicknessRL", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x00c8, 0x0019, 0x00c8, EVR_SL, "RectangleColumnEnd", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x00c9, 0x0019, 0x00c9, EVR_SS, "SATThicknessAP", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x00c9, 0x0019, 0x00c9, EVR_SL, "RectangleAngulation", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x00ca, 0x0019, 0x00ca, EVR_SS, "SATThicknessHF", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x00ca, 0x0019, 0x00ca, EVR_SL, "IrisCollimatorFlag", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x00cb, 0x0019, 0x00cb, EVR_SS, "PrescribedFlowAxis", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x00cb, 0x0019, 0x00cb, EVR_SS, "PhaseContrastFlowAxis", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GE_GENESIS_REV3.0" } , { 0x0019, 0x00cb, 0x0019, 0x00cb, EVR_SL, "IrisRowStart", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x00cc, 0x0019, 0x00cc, EVR_SS, "VelocityEncoding", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x00cc, 0x0019, 0x00cc, EVR_SS, "PhaseContrastVelocityEncoding", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GE_GENESIS_REV3.0" } , { 0x0019, 0x00cc, 0x0019, 0x00cc, EVR_SL, "IrisRowEnd", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x00cd, 0x0019, 0x00cd, EVR_SS, "ThicknessDisclaimer", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x00cd, 0x0019, 0x00cd, EVR_SL, "IrisColumnStart", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x00ce, 0x0019, 0x00ce, EVR_SS, "PrescanType", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x00ce, 0x0019, 0x00ce, EVR_IS, "REST", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/LAST" } , { 0x0019, 0x00ce, 0x0019, 0x00ce, EVR_SL, "IrisColumnEnd", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x00cf, 0x0019, 0x00cf, EVR_SS, "PrescanStatus", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x00cf, 0x0019, 0x00cf, EVR_SL, "IrisAngulation", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x00d0, 0x0019, 0x00d0, EVR_SH, "RawDataType", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x00d1, 0x0019, 0x00d1, EVR_DS, "FlowSensitivity", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 COAD" } , { 0x0019, 0x00d1, 0x0019, 0x00d1, EVR_SS, "NumberOfFramesPlane", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x00d2, 0x0019, 0x00d2, EVR_SS, "ProjectionAlgorithm", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x00d2, 0x0019, 0x00d2, EVR_LT, "CalculationSubmode", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 COAD" } , { 0x0019, 0x00d2, 0x0019, 0x00d2, EVR_SS, "Internal", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x00d3, 0x0019, 0x00d3, EVR_SH, "ProjectionAlgorithm", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x00d3, 0x0019, 0x00d3, EVR_DS, "FieldOfViewRatio", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 COAD" } , { 0x0019, 0x00d3, 0x0019, 0x00d3, EVR_SS, "Internal", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x00d4, 0x0019, 0x00d4, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x00d4, 0x0019, 0x00d4, EVR_IS, "BaseRawMatrixSize", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 COAD" } , { 0x0019, 0x00d4, 0x0019, 0x00d4, EVR_SS, "Internal", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x00d5, 0x0019, 0x00d5, EVR_SS, "FractionalEcho", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x00d5, 0x0019, 0x00d5, EVR_SS, "FractionalEcho", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GE_GENESIS_REV3.0" } , { 0x0019, 0x00d5, 0x0019, 0x00d5, EVR_DS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/LAST" } , { 0x0019, 0x00d5, 0x0019, 0x00d5, EVR_IS, "2DOversamplingLines", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 COAD" } , { 0x0019, 0x00d5, 0x0019, 0x00d5, EVR_SS, "Internal", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x00d6, 0x0019, 0x00d6, EVR_SS, "PrepPulse", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x00d6, 0x0019, 0x00d6, EVR_IS, "FourierInterpolation", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/LAST" } , { 0x0019, 0x00d6, 0x0019, 0x00d6, EVR_IS, "3DPhaseOversamplingPartitions", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 COAD" } , { 0x0019, 0x00d6, 0x0019, 0x00d6, EVR_SS, "Internal", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x00d7, 0x0019, 0x00d7, EVR_SS, "CardiacPhases", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x00d7, 0x0019, 0x00d7, EVR_IS, "EchoLinePosition", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 COAD" } , { 0x0019, 0x00d7, 0x0019, 0x00d7, EVR_SS, "Internal", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x00d8, 0x0019, 0x00d8, EVR_SS, "VariableEchoFlag", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x00d8, 0x0019, 0x00d8, EVR_SS, "VariableEchoFlag", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GE_GENESIS_REV3.0" } , { 0x0019, 0x00d8, 0x0019, 0x00d8, EVR_IS, "EchoColumnPosition", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 COAD" } , { 0x0019, 0x00d8, 0x0019, 0x00d8, EVR_SS, "Internal", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x00d9, 0x0019, 0x00d9, EVR_DS, "ConcatenatedSAT", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x00d9, 0x0019, 0x00d9, EVR_DS, "ConcatenatedSat", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GE_GENESIS_REV3.0" } , { 0x0019, 0x00d9, 0x0019, 0x00d9, EVR_IS, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/LAST" } , { 0x0019, 0x00d9, 0x0019, 0x00d9, EVR_IS, "LinesPerSegment", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 COAD" } , { 0x0019, 0x00d9, 0x0019, 0x00d9, EVR_SS, "Internal", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x00da, 0x0019, 0x00da, EVR_SS, "ReferenceChannelUsed", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x00da, 0x0019, 0x00da, EVR_LT, "PhaseCodingDirection", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 COAD" } , { 0x0019, 0x00da, 0x0019, 0x00da, EVR_SS, "Internal", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x00db, 0x0019, 0x00db, EVR_DS, "BackProjectorCoefficient", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x00db, 0x0019, 0x00db, EVR_SS, "Internal", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x00dc, 0x0019, 0x00dc, EVR_SS, "PrimarySpeedCorrectionUsed", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x00dc, 0x0019, 0x00dc, EVR_SS, "Internal", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x00dd, 0x0019, 0x00dd, EVR_SS, "OverrangeCorrectionUsed", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x00dd, 0x0019, 0x00dd, EVR_SL, "AnatomicBackground", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x00de, 0x0019, 0x00de, EVR_DS, "DynamicZAlphaValue", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x00de, 0x0019, 0x00de, EVR_SL, "AutoWindowBase", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x00df, 0x0019, 0x00df, EVR_DS, "UserData", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x00df, 0x0019, 0x00df, EVR_SS, "Internal", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x00e0, 0x0019, 0x00e0, EVR_DS, "UserData", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x00e0, 0x0019, 0x00e0, EVR_IS, "Prepulse", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/LAST" } , { 0x0019, 0x00e0, 0x0019, 0x00e0, EVR_SL, "Internal", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA PLANE A" } , { 0x0019, 0x00e1, 0x0019, 0x00e1, EVR_DS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x00e1, 0x0019, 0x00e1, EVR_DS, "PrepulseDelay", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/LAST" } , { 0x0019, 0x00e2, 0x0019, 0x00e2, EVR_DS, "VelocityEncodeScale", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x00e2, 0x0019, 0x00e2, EVR_IS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/LAST" } , { 0x0019, 0x00e3, 0x0019, 0x00e3, EVR_LT, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x00e3, 0x0019, 0x00e3, EVR_DS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/LAST" } , { 0x0019, 0x00e4, 0x0019, 0x00e4, EVR_LT, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x00e5, 0x0019, 0x00e5, EVR_IS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x00e6, 0x0019, 0x00e6, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x00e8, 0x0019, 0x00e8, EVR_DS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x00e9, 0x0019, 0x00e9, EVR_DS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x00eb, 0x0019, 0x00eb, EVR_DS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x00ec, 0x0019, 0x00ec, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x00f0, 0x0019, 0x00f0, EVR_UN, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x00f0, 0x0019, 0x00f0, EVR_LT, "WSProtocolString1", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/LAST" } , { 0x0019, 0x00f1, 0x0019, 0x00f1, EVR_LT, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x00f1, 0x0019, 0x00f1, EVR_LT, "WSProtocolString2", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/LAST" } , { 0x0019, 0x00f2, 0x0019, 0x00f2, EVR_SS, "FastPhases", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x00f2, 0x0019, 0x00f2, EVR_SS, "NumberOfPhases", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GE_GENESIS_REV3.0" } , { 0x0019, 0x00f2, 0x0019, 0x00f2, EVR_LT, "WSProtocolString3", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/LAST" } , { 0x0019, 0x00f3, 0x0019, 0x00f3, EVR_LT, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x00f3, 0x0019, 0x00f3, EVR_LT, "WSProtocolString4", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/LAST" } , { 0x0019, 0x00f4, 0x0019, 0x00f4, EVR_LT, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x00f9, 0x0019, 0x00f9, EVR_DS, "TransmissionGain", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACQU_01" } , { 0x0019, 0x00ff, 0x0019, 0x00ff, EVR_SS, "Internal", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA GEN" } , { 0x0019, 0x1000, 0x0019, 0x1000, EVR_DS, "FieldOfView", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR R5.5/PART" } , { 0x0019, 0x1000, 0x0019, 0x1000, EVR_DS, "FieldOfView", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR R5.6/PART" } , { 0x0019, 0x1000, 0x0019, 0x1000, EVR_DS, "FieldOfView", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0019, 0x1005, 0x0019, 0x1005, EVR_DS, "CCAngulation", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0019, 0x1006, 0x0019, 0x1006, EVR_DS, "APAngulation", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0019, 0x1007, 0x0019, 0x1007, EVR_DS, "LRAngulation", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0019, 0x1008, 0x0019, 0x1008, EVR_IS, "PatientPosition", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0019, 0x1009, 0x0019, 0x1009, EVR_IS, "PatientOrientation", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0019, 0x100a, 0x0019, 0x100a, EVR_IS, "SliceOrientation", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0019, 0x100b, 0x0019, 0x100b, EVR_DS, "LROffcenter", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0019, 0x100c, 0x0019, 0x100c, EVR_DS, "CCOffcenter", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0019, 0x100d, 0x0019, 0x100d, EVR_DS, "APOffcenter", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0019, 0x100e, 0x0019, 0x100e, EVR_DS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0019, 0x100f, 0x0019, 0x100f, EVR_IS, "NumberOfSlices", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0019, 0x1010, 0x0019, 0x1010, EVR_DS, "SliceFactor", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0019, 0x1011, 0x0019, 0x1011, EVR_DS, "EchoTimes", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0019, 0x1015, 0x0019, 0x1015, EVR_IS, "DynamicStudy", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0019, 0x1018, 0x0019, 0x1018, EVR_DS, "HeartbeatInterval", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0019, 0x1019, 0x0019, 0x1019, EVR_DS, "RepetitionTimeFFE", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0019, 0x101a, 0x0019, 0x101a, EVR_DS, "FFEFlipAngle", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0019, 0x101b, 0x0019, 0x101b, EVR_IS, "NumberOfScans", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0019, 0x1021, 0x0019, 0x1021, EVR_DS, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0019, 0x1022, 0x0019, 0x1022, EVR_DS, "DynamicScanTimeBegin", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0019, 0x1024, 0x0019, 0x1024, EVR_IS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0019, 0x1064, 0x0019, 0x1064, EVR_DS, "RepetitionTimeSE", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0019, 0x1065, 0x0019, 0x1065, EVR_DS, "RepetitionTimeIR", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0019, 0x1069, 0x0019, 0x1069, EVR_IS, "NumberOfPhases", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0019, 0x106a, 0x0019, 0x106a, EVR_IS, "CardiacFrequency", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0019, 0x106b, 0x0019, 0x106b, EVR_DS, "InversionDelay", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0019, 0x106c, 0x0019, 0x106c, EVR_DS, "GateDelay", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0019, 0x106d, 0x0019, 0x106d, EVR_DS, "GateWidth", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0019, 0x106e, 0x0019, 0x106e, EVR_DS, "TriggerDelayTime", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0019, 0x1080, 0x0019, 0x1080, EVR_IS, "NumberOfChemicalShifts", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0019, 0x1081, 0x0019, 0x1081, EVR_DS, "ChemicalShift", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0019, 0x1084, 0x0019, 0x1084, EVR_IS, "NumberOfRows", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0019, 0x1085, 0x0019, 0x1085, EVR_IS, "NumberOfSamples", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0019, 0x1094, 0x0019, 0x1094, EVR_LO, "MagnetizationTransferContrast", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0019, 0x1095, 0x0019, 0x1095, EVR_LO, "SpectralPresaturationWithInversionRecovery", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0019, 0x1096, 0x0019, 0x1096, EVR_IS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0019, 0x1097, 0x0019, 0x1097, EVR_LO, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0019, 0x10a0, 0x0019, 0x10a0, EVR_IS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0019, 0x10a1, 0x0019, 0x10a1, EVR_DS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0019, 0x10a3, 0x0019, 0x10a3, EVR_DS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0019, 0x10a4, 0x0019, 0x10a4, EVR_CS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0019, 0x10c8, 0x0019, 0x10c8, EVR_IS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0019, 0x10c9, 0x0019, 0x10c9, EVR_IS, "FoldoverDirectionTransverse", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0019, 0x10ca, 0x0019, 0x10ca, EVR_IS, "FoldoverDirectionSagittal", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0019, 0x10cb, 0x0019, 0x10cb, EVR_IS, "FoldoverDirectionCoronal", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0019, 0x10cc, 0x0019, 0x10cc, EVR_IS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0019, 0x10cd, 0x0019, 0x10cd, EVR_IS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0019, 0x10ce, 0x0019, 0x10ce, EVR_IS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0019, 0x10cf, 0x0019, 0x10cf, EVR_IS, "NumberOfEchoes", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0019, 0x10d0, 0x0019, 0x10d0, EVR_IS, "ScanResolution", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0019, 0x10d2, 0x0019, 0x10d2, EVR_LO, "WaterFatShift", 2, 2, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0019, 0x10d4, 0x0019, 0x10d4, EVR_IS, "ArtifactReduction", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0019, 0x10d5, 0x0019, 0x10d5, EVR_IS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0019, 0x10d6, 0x0019, 0x10d6, EVR_IS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0019, 0x10d7, 0x0019, 0x10d7, EVR_DS, "ScanPercentage", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0019, 0x10d8, 0x0019, 0x10d8, EVR_IS, "Halfscan", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0019, 0x10d9, 0x0019, 0x10d9, EVR_IS, "EPIFactor", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0019, 0x10da, 0x0019, 0x10da, EVR_IS, "TurboFactor", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0019, 0x10db, 0x0019, 0x10db, EVR_IS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0019, 0x10e0, 0x0019, 0x10e0, EVR_IS, "PercentageOfScanCompleted", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0019, 0x10e1, 0x0019, 0x10e1, EVR_IS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0019, 0x1100, 0x0019, 0x1100, EVR_IS, "NumberOfStacks", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0019, 0x1101, 0x0019, 0x1101, EVR_IS, "StackType", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0019, 0x1102, 0x0019, 0x1102, EVR_IS, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0019, 0x110b, 0x0019, 0x110b, EVR_DS, "LROffcenter", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0019, 0x110c, 0x0019, 0x110c, EVR_DS, "CCOffcenter", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0019, 0x110d, 0x0019, 0x110d, EVR_DS, "APOffcenter", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0019, 0x1145, 0x0019, 0x1145, EVR_IS, "ReconstructionResolution", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0019, 0x11fc, 0x0019, 0x11fc, EVR_IS, "ResonanceFrequency", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0019, 0x12c0, 0x0019, 0x12c0, EVR_DS, "TriggerDelayTimes", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0019, 0x12e0, 0x0019, 0x12e0, EVR_IS, "PrepulseType", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0019, 0x12e1, 0x0019, 0x12e1, EVR_DS, "PrepulseDelay", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0019, 0x12e3, 0x0019, 0x12e3, EVR_DS, "PhaseContrastVelocity", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } #endif , { 0x0020, 0x000d, 0x0020, 0x000d, EVR_UI, "StudyInstanceUID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x000e, 0x0020, 0x000e, EVR_UI, "SeriesInstanceUID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x0010, 0x0020, 0x0010, EVR_SH, "StudyID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x0011, 0x0020, 0x0011, EVR_IS, "SeriesNumber", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x0012, 0x0020, 0x0012, EVR_IS, "AcquisitionNumber", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x0013, 0x0020, 0x0013, EVR_IS, "InstanceNumber", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x0014, 0x0020, 0x0014, EVR_IS, "RETIRED_IsotopeNumber", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x0015, 0x0020, 0x0015, EVR_IS, "RETIRED_PhaseNumber", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x0016, 0x0020, 0x0016, EVR_IS, "RETIRED_IntervalNumber", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x0017, 0x0020, 0x0017, EVR_IS, "RETIRED_TimeSlotNumber", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x0018, 0x0020, 0x0018, EVR_IS, "RETIRED_AngleNumber", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x0019, 0x0020, 0x0019, EVR_IS, "ItemNumber", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x0020, 0x0020, 0x0020, EVR_CS, "PatientOrientation", 2, 2, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x0022, 0x0020, 0x0022, EVR_IS, "RETIRED_OverlayNumber", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x0024, 0x0020, 0x0024, EVR_IS, "RETIRED_CurveNumber", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x0026, 0x0020, 0x0026, EVR_IS, "RETIRED_LUTNumber", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x0030, 0x0020, 0x0030, EVR_DS, "ACR_NEMA_ImagePosition", 3, 3, "ACR/NEMA2", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x0032, 0x0020, 0x0032, EVR_DS, "ImagePositionPatient", 3, 3, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x0035, 0x0020, 0x0035, EVR_DS, "ACR_NEMA_ImageOrientation", 6, 6, "ACR/NEMA2", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x0037, 0x0020, 0x0037, EVR_DS, "ImageOrientationPatient", 6, 6, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x0050, 0x0020, 0x0050, EVR_DS, "ACR_NEMA_Location", 1, 1, "ACR/NEMA2", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x0052, 0x0020, 0x0052, EVR_UI, "FrameOfReferenceUID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x0060, 0x0020, 0x0060, EVR_CS, "Laterality", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x0062, 0x0020, 0x0062, EVR_CS, "ImageLaterality", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x0070, 0x0020, 0x0070, EVR_LO, "ACR_NEMA_ImageGeometryType", 1, 1, "ACR/NEMA2", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x0080, 0x0020, 0x0080, EVR_LO, "ACR_NEMA_MaskingImage", 1, -1, "ACR/NEMA2", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x0100, 0x0020, 0x0100, EVR_IS, "TemporalPositionIdentifier", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x0105, 0x0020, 0x0105, EVR_IS, "NumberOfTemporalPositions", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x0110, 0x0020, 0x0110, EVR_DS, "TemporalResolution", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x0200, 0x0020, 0x0200, EVR_UI, "SynchronizationFrameOfReferenceUID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x0242, 0x0020, 0x0242, EVR_UI, "SOPInstanceUIDOfConcatenationSource", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x1000, 0x0020, 0x1000, EVR_IS, "RETIRED_SeriesInStudy", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x1001, 0x0020, 0x1001, EVR_IS, "ACR_NEMA_AcquisitionsInSeries", 1, 1, "ACR/NEMA2", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x1002, 0x0020, 0x1002, EVR_IS, "ImagesInAcquisition", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x1003, 0x0020, 0x1003, EVR_IS, "ACR_NEMA_ImagesInSeries", 1, 1, "ACR/NEMA2", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x1004, 0x0020, 0x1004, EVR_IS, "RETIRED_AcquisitionsInStudy", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x1005, 0x0020, 0x1005, EVR_IS, "ACR_NEMA_ImagesInStudy", 1, 1, "ACR/NEMA2", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x1020, 0x0020, 0x1020, EVR_LO, "ACR_NEMA_Reference", 1, -1, "ACR/NEMA2", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x1040, 0x0020, 0x1040, EVR_LO, "PositionReferenceIndicator", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x1041, 0x0020, 0x1041, EVR_DS, "SliceLocation", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x1070, 0x0020, 0x1070, EVR_IS, "RETIRED_OtherStudyNumbers", 1, -1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x1200, 0x0020, 0x1200, EVR_IS, "NumberOfPatientRelatedStudies", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x1202, 0x0020, 0x1202, EVR_IS, "NumberOfPatientRelatedSeries", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x1204, 0x0020, 0x1204, EVR_IS, "NumberOfPatientRelatedInstances", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x1206, 0x0020, 0x1206, EVR_IS, "NumberOfStudyRelatedSeries", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x1208, 0x0020, 0x1208, EVR_IS, "NumberOfStudyRelatedInstances", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x1209, 0x0020, 0x1209, EVR_IS, "NumberOfSeriesRelatedInstances", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x3401, 0x0020, 0x3401, EVR_LO, "ACR_NEMA_ModifyingDeviceID", 1, 1, "ACR/NEMA2", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x3402, 0x0020, 0x3402, EVR_LO, "ACR_NEMA_ModifiedImageID", 1, 1, "ACR/NEMA2", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x3403, 0x0020, 0x3403, EVR_DA, "ACR_NEMA_ModifiedImageDate", 1, 1, "ACR/NEMA2", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x3404, 0x0020, 0x3404, EVR_LO, "ACR_NEMA_ModifyingDeviceManufacturer", 1, 1, "ACR/NEMA2", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x3405, 0x0020, 0x3405, EVR_TM, "ACR_NEMA_ModifiedImageTime", 1, 1, "ACR/NEMA2", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x3406, 0x0020, 0x3406, EVR_LO, "ACR_NEMA_ModifiedImageDescription", 1, 1, "ACR/NEMA2", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x4000, 0x0020, 0x4000, EVR_LT, "ImageComments", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x5000, 0x0020, 0x5000, EVR_AT, "ACR_NEMA_OriginalImageIdentification", 1, -1, "ACR/NEMA2", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x5002, 0x0020, 0x5002, EVR_LO, "ACR_NEMA_OriginalImageIdentificationNomenclature", 1, -1, "ACR/NEMA2", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x9056, 0x0020, 0x9056, EVR_SH, "StackID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x9057, 0x0020, 0x9057, EVR_UL, "InStackPositionNumber", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x9071, 0x0020, 0x9071, EVR_SQ, "FrameAnatomySequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x9072, 0x0020, 0x9072, EVR_CS, "FrameLaterality", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x9111, 0x0020, 0x9111, EVR_SQ, "FrameContentSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x9113, 0x0020, 0x9113, EVR_SQ, "PlanePositionSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x9116, 0x0020, 0x9116, EVR_SQ, "PlaneOrientationSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x9128, 0x0020, 0x9128, EVR_UL, "TemporalPositionIndex", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x9153, 0x0020, 0x9153, EVR_FD, "NominalCardiacTriggerDelayTime", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x9156, 0x0020, 0x9156, EVR_US, "FrameAcquisitionNumber", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x9157, 0x0020, 0x9157, EVR_UL, "DimensionIndexValues", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x9158, 0x0020, 0x9158, EVR_LT, "FrameComments", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x9161, 0x0020, 0x9161, EVR_UI, "ConcatenationUID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x9162, 0x0020, 0x9162, EVR_US, "InConcatenationNumber", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x9163, 0x0020, 0x9163, EVR_US, "InConcatenationTotalNumber", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x9164, 0x0020, 0x9164, EVR_UI, "DimensionOrganizationUID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x9165, 0x0020, 0x9165, EVR_AT, "DimensionIndexPointer", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x9167, 0x0020, 0x9167, EVR_AT, "FunctionalGroupPointer", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x9213, 0x0020, 0x9213, EVR_LO, "DimensionIndexPrivateCreator", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x9221, 0x0020, 0x9221, EVR_SQ, "DimensionOrganizationSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x9222, 0x0020, 0x9222, EVR_SQ, "DimensionIndexSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x9228, 0x0020, 0x9228, EVR_UL, "ConcatenationFrameOffsetNumber", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x9238, 0x0020, 0x9238, EVR_LO, "FunctionalGroupPrivateCreator", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x9241, 0x0020, 0x9241, EVR_FL, "NominalPercentageOfCardiacPhase", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x9245, 0x0020, 0x9245, EVR_FL, "NominalPercentageOfRespiratoryPhase", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x9246, 0x0020, 0x9246, EVR_FL, "StartingRespiratoryAmplitude", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x9247, 0x0020, 0x9247, EVR_CS, "StartingRespiratoryPhase", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x9248, 0x0020, 0x9248, EVR_FL, "EndingRespiratoryAmplitude", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x9249, 0x0020, 0x9249, EVR_CS, "EndingRespiratoryPhase", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x9250, 0x0020, 0x9250, EVR_CS, "RespiratoryTriggerType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x9251, 0x0020, 0x9251, EVR_FD, "RRIntervalTimeNominal", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x9252, 0x0020, 0x9252, EVR_FD, "ActualCardiacTriggerDelayTime", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x9253, 0x0020, 0x9253, EVR_SQ, "RespiratorySynchronizationSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x9254, 0x0020, 0x9254, EVR_FD, "RespiratoryIntervalTime", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x9255, 0x0020, 0x9255, EVR_FD, "NominalRespiratoryTriggerDelayTime", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x9256, 0x0020, 0x9256, EVR_FD, "RespiratoryTriggerDelayThreshold", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x9257, 0x0020, 0x9257, EVR_FD, "ActualRespiratoryTriggerDelayTime", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x9301, 0x0020, 0x9301, EVR_FD, "ImagePositionVolume", 3, 3, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x9302, 0x0020, 0x9302, EVR_FD, "ImageOrientationVolume", 6, 6, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x9307, 0x0020, 0x9307, EVR_CS, "UltrasoundAcquisitionGeometry", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x9308, 0x0020, 0x9308, EVR_FD, "ApexPosition", 3, 3, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x9309, 0x0020, 0x9309, EVR_FD, "VolumeToTransducerMappingMatrix", 16, 16, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x930a, 0x0020, 0x930a, EVR_FD, "VolumeToTableMappingMatrix", 16, 16, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x930c, 0x0020, 0x930c, EVR_CS, "PatientFrameOfReferenceSource", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x930d, 0x0020, 0x930d, EVR_FD, "TemporalPositionTimeOffset", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x930e, 0x0020, 0x930e, EVR_SQ, "PlanePositionVolumeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x930f, 0x0020, 0x930f, EVR_SQ, "PlaneOrientationVolumeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x9310, 0x0020, 0x9310, EVR_SQ, "TemporalPositionSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x9311, 0x0020, 0x9311, EVR_CS, "DimensionOrganizationType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x9312, 0x0020, 0x9312, EVR_UI, "VolumeFrameOfReferenceUID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x9313, 0x0020, 0x9313, EVR_UI, "TableFrameOfReferenceUID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x9421, 0x0020, 0x9421, EVR_LO, "DimensionDescriptionLabel", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x9450, 0x0020, 0x9450, EVR_SQ, "PatientOrientationInFrameSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x9453, 0x0020, 0x9453, EVR_LO, "FrameLabel", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x9518, 0x0020, 0x9518, EVR_US, "AcquisitionIndex", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x9529, 0x0020, 0x9529, EVR_SQ, "ContributingSOPInstancesReferenceSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x9536, 0x0020, 0x9536, EVR_US, "ReconstructionIndex", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } #ifdef WITH_PRIVATE_TAGS , { 0x0021, 0x0000, 0x0021, 0x0000, EVR_IS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/LAST" } , { 0x0021, 0x0000, 0x0021, 0x0000, EVR_LT, "SequenceType", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 RAW" } , { 0x0021, 0x0000, 0x0021, 0x0000, EVR_US, "AcquisitionType", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX ACQ 1.0" } , { 0x0021, 0x0000, 0x0021, 0x0000, EVR_LT, "WindowOfImagesID", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-Private-CWS Release 1" } , { 0x0021, 0x0000, 0x0021, 0x0000, EVR_DS, "NoiseReduction", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SVISION" } , { 0x0021, 0x0001, 0x0021, 0x0001, EVR_IS, "ReconstructionNumber", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS-MR-1" } , { 0x0021, 0x0001, 0x0021, 0x0001, EVR_IS, "VectorSizeOriginal", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 RAW" } , { 0x0021, 0x0001, 0x0021, 0x0001, EVR_US, "AcquisitionMode", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX ACQ 1.0" } , { 0x0021, 0x0001, 0x0021, 0x0001, EVR_CS, "WindowOfImagesType", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-Private-CWS Release 1" } , { 0x0021, 0x0001, 0x0021, 0x0001, EVR_DS, "ContrastAmplification", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SVISION" } , { 0x0021, 0x0001, 0x0021, 0x0001, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "TOSHIBA_MEC_1.0" } , { 0x0021, 0x0002, 0x0021, 0x0002, EVR_IS, "SliceNumber", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS-MR-1" } , { 0x0021, 0x0002, 0x0021, 0x0002, EVR_IS, "VectorSizeExtended", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 RAW" } , { 0x0021, 0x0002, 0x0021, 0x0002, EVR_US, "FootswitchIndex", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX ACQ 1.0" } , { 0x0021, 0x0002, 0x0021, 0x0002, EVR_IS, "WindowOfImagesScope", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-Private-CWS Release 1" } , { 0x0021, 0x0002, 0x0021, 0x0002, EVR_DS, "EdgeContrastBoosting", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SVISION" } , { 0x0021, 0x0002, 0x0021, 0x0002, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "TOSHIBA_MEC_1.0" } , { 0x0021, 0x0003, 0x0021, 0x0003, EVR_SS, "SeriesFromWhichPrescribed", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_RELA_01" } , { 0x0021, 0x0003, 0x0021, 0x0003, EVR_DS, "AcquiredSpectralRange", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 RAW" } , { 0x0021, 0x0003, 0x0021, 0x0003, EVR_US, "AcquisitionRoom", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX ACQ 1.0" } , { 0x0021, 0x0003, 0x0021, 0x0003, EVR_DS, "LatitudeReduction", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SVISION" } , { 0x0021, 0x0003, 0x0021, 0x0003, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "TOSHIBA_MEC_1.0" } , { 0x0021, 0x0004, 0x0021, 0x0004, EVR_DS, "VOIPosition", 3, 3, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 RAW" } , { 0x0021, 0x0004, 0x0021, 0x0004, EVR_SL, "CurrentTimeProduct", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX ACQ 1.0" } , { 0x0021, 0x0005, 0x0021, 0x0005, EVR_SH, "GenesisVersionNow", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_RELA_01" } , { 0x0021, 0x0005, 0x0021, 0x0005, EVR_DS, "VOISize", 3, 3, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 RAW" } , { 0x0021, 0x0005, 0x0021, 0x0005, EVR_SL, "Dose", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX ACQ 1.0" } , { 0x0021, 0x0006, 0x0021, 0x0006, EVR_IS, "CSIMatrixSizeOriginal", 3, 3, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 RAW" } , { 0x0021, 0x0006, 0x0021, 0x0006, EVR_SL, "SkinDosePercent", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX ACQ 1.0" } , { 0x0021, 0x0007, 0x0021, 0x0007, EVR_UL, "SeriesRecordChecksum", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_RELA_01" } , { 0x0021, 0x0007, 0x0021, 0x0007, EVR_IS, "CSIMatrixSizeExtended", 3, 3, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 RAW" } , { 0x0021, 0x0007, 0x0021, 0x0007, EVR_SL, "SkinDoseAccumulation", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX ACQ 1.0" } , { 0x0021, 0x0008, 0x0021, 0x0008, EVR_DS, "SpatialGridShift", 3, 3, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 RAW" } , { 0x0021, 0x0008, 0x0021, 0x0008, EVR_SL, "SkinDoseRate", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX ACQ 1.0" } , { 0x0021, 0x0009, 0x0021, 0x0009, EVR_DS, "SignalLimitsMinimum", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 RAW" } , { 0x0021, 0x000a, 0x0021, 0x000a, EVR_UL, "CopperFilter", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX ACQ 1.0" } , { 0x0021, 0x000b, 0x0021, 0x000b, EVR_US, "MeasuringField", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX ACQ 1.0" } , { 0x0021, 0x000c, 0x0021, 0x000c, EVR_SS, "PostBlankingCircle", 3, 3, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX ACQ 1.0" } , { 0x0021, 0x000d, 0x0021, 0x000d, EVR_SS, "DynaAngles", 2, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX ACQ 1.0" } , { 0x0021, 0x000e, 0x0021, 0x000e, EVR_SS, "TotalSteps", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX ACQ 1.0" } , { 0x0021, 0x000f, 0x0021, 0x000f, EVR_SL, "DynaXRayInfo", 3, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX ACQ 1.0" } , { 0x0021, 0x0010, 0x0021, 0x0010, EVR_CS, "FCRImageID", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0021, 0x0010, 0x0021, 0x0010, EVR_IS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/LAST" } , { 0x0021, 0x0010, 0x0021, 0x0010, EVR_IS, "RotationAngle", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 GEN" } , { 0x0021, 0x0010, 0x0021, 0x0010, EVR_UL, "CreationMask", 2, 2, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 RAW" } , { 0x0021, 0x0010, 0x0021, 0x0010, EVR_DS, "Zoom", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MED" } , { 0x0021, 0x0010, 0x0021, 0x0010, EVR_DS, "SignalLimitsMaximum", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 RAW" } , { 0x0021, 0x0010, 0x0021, 0x0010, EVR_US, "ModalityLUTInputGamma", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX ACQ 1.0" } , { 0x0021, 0x0010, 0x0021, 0x0010, EVR_LO, "FindRangeAlgorithm", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SVISION" } , { 0x0021, 0x0011, 0x0021, 0x0011, EVR_IS, "StartAngle", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 GEN" } , { 0x0021, 0x0011, 0x0021, 0x0011, EVR_DS, "Target", 2, 2, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MED" } , { 0x0021, 0x0011, 0x0021, 0x0011, EVR_DS, "SpecInfoMask", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 RAW" } , { 0x0021, 0x0011, 0x0021, 0x0011, EVR_US, "ModalityLUTOutputGamma", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX ACQ 1.0" } , { 0x0021, 0x0011, 0x0021, 0x0011, EVR_DS, "ThresholdCAlgorithm", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SVISION" } , { 0x0021, 0x0012, 0x0021, 0x0012, EVR_IS, "ExposureNumber", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "INTEGRIS 1.0" } , { 0x0021, 0x0012, 0x0021, 0x0012, EVR_IS, "TubeAngle", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MED" } , { 0x0021, 0x0012, 0x0021, 0x0012, EVR_DS, "EPITimeRateOfChangeOfMagnitude", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 RAW" } , { 0x0021, 0x0012, 0x0021, 0x0012, EVR_OB, "SH_STPAR", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX ACQ 1.0" } , { 0x0021, 0x0012, 0x0021, 0x0012, EVR_LT, "SeriesUniqueIdentifier", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1" } , { 0x0021, 0x0013, 0x0021, 0x0013, EVR_IS, "ImageSequenceNumber", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "CARDIO-D.R. 1.0" } , { 0x0021, 0x0013, 0x0021, 0x0013, EVR_DS, "EPITimeRateOfChangeOfXComponent", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 RAW" } , { 0x0021, 0x0013, 0x0021, 0x0013, EVR_US, "AcquisitionZoom", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX ACQ 1.0" } , { 0x0021, 0x0014, 0x0021, 0x0014, EVR_DS, "EPITimeRateOfChangeOfYComponent", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 RAW" } , { 0x0021, 0x0014, 0x0021, 0x0014, EVR_SS, "DynaAngulationStepWidth", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX ACQ 1.0" } , { 0x0021, 0x0014, 0x0021, 0x0014, EVR_LT, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1" } , { 0x0021, 0x0015, 0x0021, 0x0015, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_RELA_01" } , { 0x0021, 0x0015, 0x0021, 0x0015, EVR_DS, "EPITimeRateOfChangeOfZComponent", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 RAW" } , { 0x0021, 0x0015, 0x0021, 0x0015, EVR_SS, "ImagesInStudy", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA GEN" } , { 0x0021, 0x0015, 0x0021, 0x0015, EVR_US, "Harmonization", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX ACQ 1.0" } , { 0x0021, 0x0016, 0x0021, 0x0016, EVR_SS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_RELA_01" } , { 0x0021, 0x0016, 0x0021, 0x0016, EVR_DS, "EPITimeRateOfChangeLegalLimit1", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 RAW" } , { 0x0021, 0x0016, 0x0021, 0x0016, EVR_US, "DRSingleFlag", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX ACQ 1.0" } , { 0x0021, 0x0017, 0x0021, 0x0017, EVR_DS, "EPIOperationModeFlag", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 RAW" } , { 0x0021, 0x0017, 0x0021, 0x0017, EVR_SL, "SourceToIsocenter", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX ACQ 1.0" } , { 0x0021, 0x0018, 0x0021, 0x0018, EVR_SH, "GenesisVersionNow", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_RELA_01" } , { 0x0021, 0x0018, 0x0021, 0x0018, EVR_DS, "EPIFieldCalculationSafetyFactor", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 RAW" } , { 0x0021, 0x0018, 0x0021, 0x0018, EVR_US, "PressureData", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX ACQ 1.0" } , { 0x0021, 0x0019, 0x0021, 0x0019, EVR_UL, "AcqReconRecordChecksum", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_RELA_01" } , { 0x0021, 0x0019, 0x0021, 0x0019, EVR_DS, "EPILegalLimit1OfChangeValue", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 RAW" } , { 0x0021, 0x0019, 0x0021, 0x0019, EVR_SL, "ECGIndexArray", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX ACQ 1.0" } , { 0x0021, 0x001a, 0x0021, 0x001a, EVR_US, "FDFlag", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX ACQ 1.0" } , { 0x0021, 0x001b, 0x0021, 0x001b, EVR_OB, "SH_ZOOM", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX ACQ 1.0" } , { 0x0021, 0x001c, 0x0021, 0x001c, EVR_OB, "SH_COLPAR", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX ACQ 1.0" } , { 0x0021, 0x001d, 0x0021, 0x001d, EVR_US, "K_Factor", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX ACQ 1.0" } , { 0x0021, 0x001e, 0x0021, 0x001e, EVR_US, "EVE", 8, 8, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX ACQ 1.0" } , { 0x0021, 0x001f, 0x0021, 0x001f, EVR_SL, "TotalSceneTime", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX ACQ 1.0" } , { 0x0021, 0x0020, 0x0021, 0x0020, EVR_DS, "TableStartLocation", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_RELA_01" } , { 0x0021, 0x0020, 0x0021, 0x0020, EVR_IS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/LAST" } , { 0x0021, 0x0020, 0x0021, 0x0020, EVR_DS, "FoV", 2, 2, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CM VA0 CMS" } , { 0x0021, 0x0020, 0x0021, 0x0020, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 GEN" } , { 0x0021, 0x0020, 0x0021, 0x0020, EVR_UL, "EvaluationMask", 2, 2, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 RAW" } , { 0x0021, 0x0020, 0x0021, 0x0020, EVR_US, "ROIMask", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MED" } , { 0x0021, 0x0020, 0x0021, 0x0020, EVR_IS, "PhaseCorrectionRowsSequence", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 GEN" } , { 0x0021, 0x0020, 0x0021, 0x0020, EVR_DS, "EPILegalLimit2OfChangeValue", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 RAW" } , { 0x0021, 0x0020, 0x0021, 0x0020, EVR_SS, "ScenesInStudy", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA GEN" } , { 0x0021, 0x0020, 0x0021, 0x0020, EVR_US, "RestoreFlag", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX ACQ 1.0" } , { 0x0021, 0x0020, 0x0021, 0x0020, EVR_LO, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-GV-CT Release 1" } , { 0x0021, 0x0020, 0x0021, 0x0020, EVR_LO, "SensometricCurve", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SVISION" } , { 0x0021, 0x0021, 0x0021, 0x0021, EVR_DS, "SliceGap", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/LAST" } , { 0x0021, 0x0021, 0x0021, 0x0021, EVR_IS, "PhaseCorrectionColumnsSequence", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 GEN" } , { 0x0021, 0x0021, 0x0021, 0x0021, EVR_DS, "EPIRiseTime", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 RAW" } , { 0x0021, 0x0021, 0x0021, 0x0021, EVR_US, "StandMovementFlag", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX ACQ 1.0" } , { 0x0021, 0x0022, 0x0021, 0x0022, EVR_DS, "StackRadialAngle", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/LAST" } , { 0x0021, 0x0022, 0x0021, 0x0022, EVR_DS, "ImageMagnificationFactor", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CM VA0 CMS" } , { 0x0021, 0x0022, 0x0021, 0x0022, EVR_IS, "PhaseCorrectionRowsReconstruction", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 GEN" } , { 0x0021, 0x0022, 0x0021, 0x0022, EVR_US, "FDRows", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX ACQ 1.0" } , { 0x0021, 0x0023, 0x0021, 0x0023, EVR_US, "FDColumns", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX ACQ 1.0" } , { 0x0021, 0x0024, 0x0021, 0x0024, EVR_DS, "ImageScrollOffset", 2, 2, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CM VA0 CMS" } , { 0x0021, 0x0024, 0x0021, 0x0024, EVR_IS, "PhaseCorrectionColumnsReconstruction", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 GEN" } , { 0x0021, 0x0024, 0x0021, 0x0024, EVR_US, "TableMovementFlag", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX ACQ 1.0" } , { 0x0021, 0x0025, 0x0021, 0x0025, EVR_SS, "ImagesInPhotofile", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA GEN" } , { 0x0021, 0x0025, 0x0021, 0x0025, EVR_LO, "OriginalOrganProgramName", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX ACQ 1.0" } , { 0x0021, 0x0026, 0x0021, 0x0026, EVR_IS, "ImagePixelOffset", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CM VA0 CMS" } , { 0x0021, 0x0026, 0x0021, 0x0026, EVR_DS, "CrispyXPIFilter", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX ACQ 1.0" } , { 0x0021, 0x0027, 0x0021, 0x0027, EVR_SS, "PlaneBImagesExist", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA GEN" } , { 0x0021, 0x0028, 0x0021, 0x0028, EVR_SS, "NoOf2MBChunks", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA GEN" } , { 0x0021, 0x0030, 0x0021, 0x0030, EVR_CS, "SetNo", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0021, 0x0030, 0x0021, 0x0030, EVR_LT, "ViewDirection", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CM VA0 CMS" } , { 0x0021, 0x0030, 0x0021, 0x0030, EVR_IS, "TopogramTubePosition", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 GEN" } , { 0x0021, 0x0030, 0x0021, 0x0030, EVR_US, "ExtendedProcessingMask", 7, 7, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 RAW" } , { 0x0021, 0x0030, 0x0021, 0x0030, EVR_IS, "NumberOf3DRawPartitionsNominal", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 GEN" } , { 0x0021, 0x0030, 0x0021, 0x0030, EVR_DS, "ArrayCoilADCOffset", 16, 16, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 RAW" } , { 0x0021, 0x0030, 0x0021, 0x0030, EVR_SS, "ImagesInAllScenes", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA GEN" } , { 0x0021, 0x0030, 0x0021, 0x0030, EVR_DS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-GV-CT Release 1" } , { 0x0021, 0x0030, 0x0021, 0x0030, EVR_DS, "LowerWindowOffset", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SVISION" } , { 0x0021, 0x0031, 0x0021, 0x0031, EVR_IS, "NumberOf3DRawPartitionsCurrent", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 GEN" } , { 0x0021, 0x0031, 0x0021, 0x0031, EVR_DS, "ArrayCoilPreamplifierGain", 16, 16, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 RAW" } , { 0x0021, 0x0031, 0x0021, 0x0031, EVR_DS, "UpperWindowOffset", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SVISION" } , { 0x0021, 0x0032, 0x0021, 0x0032, EVR_CS, "PatientRestDirection", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CM VA0 CMS" } , { 0x0021, 0x0032, 0x0021, 0x0032, EVR_DS, "LengthOfTopogram", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 GEN" } , { 0x0021, 0x0034, 0x0021, 0x0034, EVR_DS, "TopogramCorrectionFactor", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 GEN" } , { 0x0021, 0x0034, 0x0021, 0x0034, EVR_IS, "NumberOf3DImagePartitions", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 GEN" } , { 0x0021, 0x0035, 0x0021, 0x0035, EVR_SS, "SeriesFromWhichPrescribed", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_RELA_01" } , { 0x0021, 0x0036, 0x0021, 0x0036, EVR_SS, "ImageFromWhichPrescribed", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_RELA_01" } , { 0x0021, 0x0036, 0x0021, 0x0036, EVR_DS, "MaximumTablePosition", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 GEN" } , { 0x0021, 0x0036, 0x0021, 0x0036, EVR_IS, "Actual3DImagePartitionNumber", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 GEN" } , { 0x0021, 0x0037, 0x0021, 0x0037, EVR_SS, "ScreenFormat", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_RELA_01" } , { 0x0021, 0x0039, 0x0021, 0x0039, EVR_DS, "SlabThickness", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 GEN" } , { 0x0021, 0x0040, 0x0021, 0x0040, EVR_IS, "ImageNoInTheSet", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0021, 0x0040, 0x0021, 0x0040, EVR_IS, "TableMoveDirectionCode", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 GEN" } , { 0x0021, 0x0040, 0x0021, 0x0040, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 RAW" } , { 0x0021, 0x0040, 0x0021, 0x0040, EVR_IS, "NumberOfSlicesNominal", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 GEN" } , { 0x0021, 0x0040, 0x0021, 0x0040, EVR_SS, "ArchiveSWInternalVersion", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RA GEN" } , { 0x0021, 0x0040, 0x0021, 0x0040, EVR_LO, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-GV-CT Release 1" } , { 0x0021, 0x0040, 0x0021, 0x0040, EVR_IS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-Private_CDS Release 1" } , { 0x0021, 0x0040, 0x0021, 0x0040, EVR_DS, "MinPrintableDensity", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SVISION" } , { 0x0021, 0x0041, 0x0021, 0x0041, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 RAW" } , { 0x0021, 0x0041, 0x0021, 0x0041, EVR_IS, "NumberOfSlicesCurrent", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 GEN" } , { 0x0021, 0x0041, 0x0021, 0x0041, EVR_DS, "MaxPrintableDensity", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SVISION" } , { 0x0021, 0x0042, 0x0021, 0x0042, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 RAW" } , { 0x0021, 0x0042, 0x0021, 0x0042, EVR_IS, "CurrentSliceNumber", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 GEN" } , { 0x0021, 0x0043, 0x0021, 0x0043, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 RAW" } , { 0x0021, 0x0043, 0x0021, 0x0043, EVR_IS, "CurrentGroupNumber", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 GEN" } , { 0x0021, 0x0044, 0x0021, 0x0044, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 RAW" } , { 0x0021, 0x0044, 0x0021, 0x0044, EVR_DS, "CurrentSliceDistanceFactor", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 GEN" } , { 0x0021, 0x0045, 0x0021, 0x0045, EVR_IS, "VOIStartRow", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 GEN" } , { 0x0021, 0x0045, 0x0021, 0x0045, EVR_IS, "MIPStartRow", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 GEN" } , { 0x0021, 0x0046, 0x0021, 0x0046, EVR_IS, "VOIStopRow", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 GEN" } , { 0x0021, 0x0046, 0x0021, 0x0046, EVR_IS, "MIPStopRow", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 GEN" } , { 0x0021, 0x0047, 0x0021, 0x0047, EVR_IS, "VOIStartColumn", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 GEN" } , { 0x0021, 0x0047, 0x0021, 0x0047, EVR_IS, "MIPStartColumn", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 GEN" } , { 0x0021, 0x0048, 0x0021, 0x0048, EVR_IS, "VOIStopColumn", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 GEN" } , { 0x0021, 0x0048, 0x0021, 0x0048, EVR_IS, "MIPStartColumn", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 GEN" } , { 0x0021, 0x0049, 0x0021, 0x0049, EVR_IS, "VOIStartSlice", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 GEN" } , { 0x0021, 0x0049, 0x0021, 0x0049, EVR_IS, "MIPStartSliceName=", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 GEN" } , { 0x0021, 0x004a, 0x0021, 0x004a, EVR_LO, "AnatomicalReferenceForScout", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_RELA_01" } , { 0x0021, 0x004a, 0x0021, 0x004a, EVR_IS, "VOIStopSlice", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 GEN" } , { 0x0021, 0x004a, 0x0021, 0x004a, EVR_IS, "MIPStartSlice", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 GEN" } , { 0x0021, 0x004e, 0x0021, 0x004e, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_RELA_01" } , { 0x0021, 0x004f, 0x0021, 0x004f, EVR_SS, "LocationsInAcquisition", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_RELA_01" } , { 0x0021, 0x004f, 0x0021, 0x004f, EVR_LT, "OrderofSlices", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 GEN" } , { 0x0021, 0x0050, 0x0021, 0x0050, EVR_CS, "PairProcessingInformation", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0021, 0x0050, 0x0021, 0x0050, EVR_SS, "GraphicallyPrescribed", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_RELA_01" } , { 0x0021, 0x0050, 0x0021, 0x0050, EVR_IS, "VectorStartRow", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 GEN" } , { 0x0021, 0x0050, 0x0021, 0x0050, EVR_LT, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 RAW" } , { 0x0021, 0x0050, 0x0021, 0x0050, EVR_US, "SignalMask", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 GEN" } , { 0x0021, 0x0050, 0x0021, 0x0050, EVR_LT, "SaturationType", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 RAW" } , { 0x0021, 0x0050, 0x0021, 0x0050, EVR_LO, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-GV-CT Release 1" } , { 0x0021, 0x0051, 0x0021, 0x0051, EVR_DS, "RotationFromSourceXRot", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_RELA_01" } , { 0x0021, 0x0051, 0x0021, 0x0051, EVR_IS, "VectorRowStep", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 GEN" } , { 0x0021, 0x0051, 0x0021, 0x0051, EVR_DS, "SaturationNormalVector", 3, 3, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 RAW" } , { 0x0021, 0x0052, 0x0021, 0x0052, EVR_DS, "RotationFromSourceYRot", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_RELA_01" } , { 0x0021, 0x0052, 0x0021, 0x0052, EVR_IS, "VectorStartColumn", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 GEN" } , { 0x0021, 0x0052, 0x0021, 0x0052, EVR_DS, "DelayAfterTrigger", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 GEN" } , { 0x0021, 0x0052, 0x0021, 0x0052, EVR_DS, "SaturationPositionVector", 3, 3, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 RAW" } , { 0x0021, 0x0053, 0x0021, 0x0053, EVR_DS, "RotationFromSourceZRot", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_RELA_01" } , { 0x0021, 0x0053, 0x0021, 0x0053, EVR_IS, "VectorColumnStep", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 GEN" } , { 0x0021, 0x0053, 0x0021, 0x0053, EVR_IS, "RRInterval", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 GEN" } , { 0x0021, 0x0053, 0x0021, 0x0053, EVR_DS, "SaturationThickness", 6, 6, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 RAW" } , { 0x0021, 0x0054, 0x0021, 0x0054, EVR_SH, "ImagePosition", 3, 3, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_RELA_01" } , { 0x0021, 0x0054, 0x0021, 0x0054, EVR_DS, "NumberOfTriggerPulses", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 GEN" } , { 0x0021, 0x0054, 0x0021, 0x0054, EVR_DS, "SaturationWidth", 6, 6, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 RAW" } , { 0x0021, 0x0055, 0x0021, 0x0055, EVR_SH, "ImageOrientation", 6, 6, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_RELA_01" } , { 0x0021, 0x0055, 0x0021, 0x0055, EVR_DS, "SaturationDistance", 6, 6, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 RAW" } , { 0x0021, 0x0056, 0x0021, 0x0056, EVR_SL, "IntegerSlop", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_RELA_01" } , { 0x0021, 0x0056, 0x0021, 0x0056, EVR_DS, "RepetitionTimeEffective", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 GEN" } , { 0x0021, 0x0057, 0x0021, 0x0057, EVR_SL, "IntegerSlop", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_RELA_01" } , { 0x0021, 0x0057, 0x0021, 0x0057, EVR_LT, "GatePhase", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 GEN" } , { 0x0021, 0x0058, 0x0021, 0x0058, EVR_SL, "IntegerSlop", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_RELA_01" } , { 0x0021, 0x0058, 0x0021, 0x0058, EVR_DS, "GateThreshold", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 GEN" } , { 0x0021, 0x0059, 0x0021, 0x0059, EVR_SL, "IntegerSlop", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_RELA_01" } , { 0x0021, 0x0059, 0x0021, 0x0059, EVR_DS, "GatedRatio", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 GEN" } , { 0x0021, 0x005a, 0x0021, 0x005a, EVR_SL, "IntegerSlop", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_RELA_01" } , { 0x0021, 0x005b, 0x0021, 0x005b, EVR_DS, "FloatSlop", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_RELA_01" } , { 0x0021, 0x005c, 0x0021, 0x005c, EVR_DS, "FloatSlop", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_RELA_01" } , { 0x0021, 0x005d, 0x0021, 0x005d, EVR_DS, "FloatSlop", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_RELA_01" } , { 0x0021, 0x005e, 0x0021, 0x005e, EVR_DS, "FloatSlop", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_RELA_01" } , { 0x0021, 0x005f, 0x0021, 0x005f, EVR_DS, "FloatSlop", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_RELA_01" } , { 0x0021, 0x0060, 0x0021, 0x0060, EVR_DS, "ImagePosition", 3, 3, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CM VA0 CMS" } , { 0x0021, 0x0060, 0x0021, 0x0060, EVR_IS, "RangeTypeCode", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 GEN" } , { 0x0021, 0x0060, 0x0021, 0x0060, EVR_IS, "NumberOfInterpolatedImages", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 GEN" } , { 0x0021, 0x0060, 0x0021, 0x0060, EVR_DS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-GV-CT Release 1" } , { 0x0021, 0x0061, 0x0021, 0x0061, EVR_DS, "ImageNormal", 3, 3, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CM VA0 CMS" } , { 0x0021, 0x0062, 0x0021, 0x0062, EVR_IS, "ReferenceTypeCode", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 GEN" } , { 0x0021, 0x0063, 0x0021, 0x0063, EVR_DS, "ImageDistance", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CM VA0 CMS" } , { 0x0021, 0x0065, 0x0021, 0x0065, EVR_US, "ImagePositioningHistoryMask", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CM VA0 CMS" } , { 0x0021, 0x006a, 0x0021, 0x006a, EVR_DS, "ImageRow", 3, 3, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CM VA0 CMS" } , { 0x0021, 0x006b, 0x0021, 0x006b, EVR_DS, "ImageColumn", 3, 3, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CM VA0 CMS" } , { 0x0021, 0x0070, 0x0021, 0x0070, EVR_LT, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_RELA_01" } , { 0x0021, 0x0070, 0x0021, 0x0070, EVR_LT, "PatientOrientationSet1", 3, 3, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CM VA0 CMS" } , { 0x0021, 0x0070, 0x0021, 0x0070, EVR_DS, "ObjectOrientation", 3, 3, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 GEN" } , { 0x0021, 0x0070, 0x0021, 0x0070, EVR_IS, "NumberOfEchoes", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 GEN" } , { 0x0021, 0x0070, 0x0021, 0x0070, EVR_DS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-GV-CT Release 1" } , { 0x0021, 0x0071, 0x0021, 0x0071, EVR_LT, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_RELA_01" } , { 0x0021, 0x0071, 0x0021, 0x0071, EVR_LT, "PatientOrientationSet2", 3, 3, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CM VA0 CMS" } , { 0x0021, 0x0072, 0x0021, 0x0072, EVR_DS, "LightOrientation", 3, 3, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 GEN" } , { 0x0021, 0x0072, 0x0021, 0x0072, EVR_DS, "SecondEchoTime", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 GEN" } , { 0x0021, 0x0073, 0x0021, 0x0073, EVR_DS, "SecondRepetitionTime", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 GEN" } , { 0x0021, 0x0075, 0x0021, 0x0075, EVR_DS, "LightBrightness", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 GEN" } , { 0x0021, 0x0076, 0x0021, 0x0076, EVR_DS, "LightContrast", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 GEN" } , { 0x0021, 0x007a, 0x0021, 0x007a, EVR_IS, "OverlayThreshold", 2, 2, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 GEN" } , { 0x0021, 0x007b, 0x0021, 0x007b, EVR_IS, "SurfaceThreshold", 2, 2, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 GEN" } , { 0x0021, 0x007c, 0x0021, 0x007c, EVR_IS, "GreyScaleThreshold", 2, 2, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 GEN" } , { 0x0021, 0x0080, 0x0021, 0x0080, EVR_OB, "EquipmentTypeSpecificInformation", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0021, 0x0080, 0x0021, 0x0080, EVR_LT, "StudyName", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CM VA0 CMS" } , { 0x0021, 0x0080, 0x0021, 0x0080, EVR_IS, "CardiacCode", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 GEN" } , { 0x0021, 0x0080, 0x0021, 0x0080, EVR_DS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-GV-CT Release 1" } , { 0x0021, 0x0081, 0x0021, 0x0081, EVR_DS, "AutoWindowLevelAlpha", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_RELA_01" } , { 0x0021, 0x0082, 0x0021, 0x0082, EVR_DS, "AutoWindowLevelBeta", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_RELA_01" } , { 0x0021, 0x0082, 0x0021, 0x0082, EVR_LT, "StudyType", 3, 3, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CM VA0 CMS" } , { 0x0021, 0x0083, 0x0021, 0x0083, EVR_DS, "AutoWindowLevelWindow", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_RELA_01" } , { 0x0021, 0x0084, 0x0021, 0x0084, EVR_DS, "AutoWindowLevelLevel", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_RELA_01" } , { 0x0021, 0x0090, 0x0021, 0x0090, EVR_SS, "TubeFocalSpotPosition", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_RELA_01" } , { 0x0021, 0x0090, 0x0021, 0x0090, EVR_DS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-GV-CT Release 1" } , { 0x0021, 0x0090, 0x0021, 0x0090, EVR_DS, "Brightness", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SVISION" } , { 0x0021, 0x0091, 0x0021, 0x0091, EVR_SS, "BiopsyPosition", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_RELA_01" } , { 0x0021, 0x0091, 0x0021, 0x0091, EVR_DS, "SaturationPhaseEncodingVectorTransverseComponent", 6, 6, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 GEN" } , { 0x0021, 0x0091, 0x0021, 0x0091, EVR_DS, "Contrast", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SVISION" } , { 0x0021, 0x0092, 0x0021, 0x0092, EVR_FL, "BiopsyTLocation", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_RELA_01" } , { 0x0021, 0x0092, 0x0021, 0x0092, EVR_DS, "SaturationReadoutVectorTransverseComponent", 6, 6, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 GEN" } , { 0x0021, 0x0092, 0x0021, 0x0092, EVR_DS, "ShapeFactor", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SVISION" } , { 0x0021, 0x0093, 0x0021, 0x0093, EVR_FL, "BiopsyRefLocation", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_RELA_01" } , { 0x0021, 0x0093, 0x0021, 0x0093, EVR_DS, "EPIChangeValueOfMagnitude", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 GEN" } , { 0x0021, 0x0094, 0x0021, 0x0094, EVR_DS, "EPIChangeValueOfXComponent", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 GEN" } , { 0x0021, 0x0095, 0x0021, 0x0095, EVR_DS, "EPIChangeValueOfYComponent", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 GEN" } , { 0x0021, 0x0096, 0x0021, 0x0096, EVR_DS, "EPIChangeValueOfZComponent", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MR VA0 GEN" } , { 0x0021, 0x00a0, 0x0021, 0x00a0, EVR_DS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 GEN" } , { 0x0021, 0x00a0, 0x0021, 0x00a0, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-GV-CT Release 1" } , { 0x0021, 0x00a1, 0x0021, 0x00a1, EVR_DS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-GV-CT Release 1" } , { 0x0021, 0x00a2, 0x0021, 0x00a2, EVR_LT, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 GEN" } , { 0x0021, 0x00a2, 0x0021, 0x00a2, EVR_DS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-GV-CT Release 1" } , { 0x0021, 0x00a3, 0x0021, 0x00a3, EVR_LT, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-GV-CT Release 1" } , { 0x0021, 0x00a4, 0x0021, 0x00a4, EVR_LT, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-GV-CT Release 1" } , { 0x0021, 0x00a7, 0x0021, 0x00a7, EVR_LT, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 GEN" } , { 0x0021, 0x00b0, 0x0021, 0x00b0, EVR_LO, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-GV-CT Release 1" } , { 0x0021, 0x00c0, 0x0021, 0x00c0, EVR_LO, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-GV-CT Release 1" } , { 0x0021, 0x1000, 0x0021, 0x1000, EVR_IS, "ReconstructionNumber", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0021, 0x1010, 0x0021, 0x1010, EVR_IS, "ImageType", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0021, 0x1020, 0x0021, 0x1020, EVR_IS, "SliceNumber", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0021, 0x1030, 0x0021, 0x1030, EVR_IS, "EchoNumber", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0021, 0x1031, 0x0021, 0x1031, EVR_DS, "PatientReferenceID", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0021, 0x1035, 0x0021, 0x1035, EVR_IS, "ChemicalShiftNumber", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0021, 0x1040, 0x0021, 0x1040, EVR_IS, "PhaseNumber", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0021, 0x1050, 0x0021, 0x1050, EVR_IS, "DynamicScanNumber", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0021, 0x1060, 0x0021, 0x1060, EVR_IS, "NumberOfRowsInObject", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0021, 0x1061, 0x0021, 0x1061, EVR_IS, "RowNumber", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0021, 0x1062, 0x0021, 0x1062, EVR_IS, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0021, 0x1100, 0x0021, 0x1100, EVR_DA, "ScanDate", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0021, 0x1110, 0x0021, 0x1110, EVR_TM, "ScanTime", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0021, 0x1221, 0x0021, 0x1221, EVR_IS, "SliceGap", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } #endif , { 0x0022, 0x0001, 0x0022, 0x0001, EVR_US, "LightPathFilterPassThroughWavelength", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x0002, 0x0022, 0x0002, EVR_US, "LightPathFilterPassBand", 2, 2, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x0003, 0x0022, 0x0003, EVR_US, "ImagePathFilterPassThroughWavelength", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x0004, 0x0022, 0x0004, EVR_US, "ImagePathFilterPassBand", 2, 2, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x0005, 0x0022, 0x0005, EVR_CS, "PatientEyeMovementCommanded", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x0006, 0x0022, 0x0006, EVR_SQ, "PatientEyeMovementCommandCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x0007, 0x0022, 0x0007, EVR_FL, "SphericalLensPower", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x0008, 0x0022, 0x0008, EVR_FL, "CylinderLensPower", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x0009, 0x0022, 0x0009, EVR_FL, "CylinderAxis", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x000a, 0x0022, 0x000a, EVR_FL, "EmmetropicMagnification", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x000b, 0x0022, 0x000b, EVR_FL, "IntraOcularPressure", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x000c, 0x0022, 0x000c, EVR_FL, "HorizontalFieldOfView", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x000d, 0x0022, 0x000d, EVR_CS, "PupilDilated", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x000e, 0x0022, 0x000e, EVR_FL, "DegreeOfDilation", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x0010, 0x0022, 0x0010, EVR_FL, "StereoBaselineAngle", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x0011, 0x0022, 0x0011, EVR_FL, "StereoBaselineDisplacement", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x0012, 0x0022, 0x0012, EVR_FL, "StereoHorizontalPixelOffset", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x0013, 0x0022, 0x0013, EVR_FL, "StereoVerticalPixelOffset", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x0014, 0x0022, 0x0014, EVR_FL, "StereoRotation", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x0015, 0x0022, 0x0015, EVR_SQ, "AcquisitionDeviceTypeCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x0016, 0x0022, 0x0016, EVR_SQ, "IlluminationTypeCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x0017, 0x0022, 0x0017, EVR_SQ, "LightPathFilterTypeStackCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x0018, 0x0022, 0x0018, EVR_SQ, "ImagePathFilterTypeStackCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x0019, 0x0022, 0x0019, EVR_SQ, "LensesCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x001a, 0x0022, 0x001a, EVR_SQ, "ChannelDescriptionCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x001b, 0x0022, 0x001b, EVR_SQ, "RefractiveStateSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x001c, 0x0022, 0x001c, EVR_SQ, "MydriaticAgentCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x001d, 0x0022, 0x001d, EVR_SQ, "RelativeImagePositionCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x0020, 0x0022, 0x0020, EVR_SQ, "StereoPairsSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x0021, 0x0022, 0x0021, EVR_SQ, "LeftImageSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x0022, 0x0022, 0x0022, EVR_SQ, "RightImageSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x0030, 0x0022, 0x0030, EVR_FL, "AxialLengthOfTheEye", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x0031, 0x0022, 0x0031, EVR_SQ, "OphthalmicFrameLocationSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x0032, 0x0022, 0x0032, EVR_FL, "ReferenceCoordinates", 2, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x0035, 0x0022, 0x0035, EVR_FL, "DepthSpatialResolution", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x0036, 0x0022, 0x0036, EVR_FL, "MaximumDepthDistortion", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x0037, 0x0022, 0x0037, EVR_FL, "AlongScanSpatialResolution", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x0038, 0x0022, 0x0038, EVR_FL, "MaximumAlongScanDistortion", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x0039, 0x0022, 0x0039, EVR_CS, "OphthalmicImageOrientation", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x0041, 0x0022, 0x0041, EVR_FL, "DepthOfTransverseImage", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x0042, 0x0022, 0x0042, EVR_SQ, "MydriaticAgentConcentrationUnitsSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x0048, 0x0022, 0x0048, EVR_FL, "AcrossScanSpatialResolution", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x0049, 0x0022, 0x0049, EVR_FL, "MaximumAcrossScanDistortion", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x004e, 0x0022, 0x004e, EVR_DS, "MydriaticAgentConcentration", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x0055, 0x0022, 0x0055, EVR_FL, "IlluminationWaveLength", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x0056, 0x0022, 0x0056, EVR_FL, "IlluminationPower", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x0057, 0x0022, 0x0057, EVR_FL, "IlluminationBandwidth", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x0058, 0x0022, 0x0058, EVR_SQ, "MydriaticAgentSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x1007, 0x0022, 0x1007, EVR_SQ, "OphthalmicAxialMeasurementsRightEyeSequence", 1, 1, "Supplement_144", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x1008, 0x0022, 0x1008, EVR_SQ, "OphthalmicAxialMeasurementsLeftEyeSequence", 1, 1, "Supplement_144", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x1009, 0x0022, 0x1009, EVR_CS, "OphthalmicAxialMeasurementsDeviceType", 1, 1, "Supplement_144", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x1010, 0x0022, 0x1010, EVR_CS, "OphthalmicAxialLengthMeasurementsType", 1, 1, "Supplement_144", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x1012, 0x0022, 0x1012, EVR_SQ, "OphthalmicAxialLengthSequence", 1, 1, "Supplement_144", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x1019, 0x0022, 0x1019, EVR_FL, "OphthalmicAxialLength", 1, 1, "Supplement_144", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x1024, 0x0022, 0x1024, EVR_SQ, "LensStatusCodeSequence", 1, 1, "Supplement_144", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x1025, 0x0022, 0x1025, EVR_SQ, "VitreousStatusCodeSequence", 1, 1, "Supplement_144", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x1028, 0x0022, 0x1028, EVR_SQ, "IOLFormulaCodeSequence", 1, 1, "Supplement_144", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x1029, 0x0022, 0x1029, EVR_LO, "IOLFormulaDetail", 1, 1, "Supplement_144", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x1033, 0x0022, 0x1033, EVR_FL, "KeratometerIndex", 1, 1, "Supplement_144", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x1035, 0x0022, 0x1035, EVR_SQ, "SourceofOphthalmicAxialLengthCodeSequence", 1, 1, "Supplement_144", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x1037, 0x0022, 0x1037, EVR_FL, "TargetRefraction", 1, 1, "Supplement_144", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x1039, 0x0022, 0x1039, EVR_CS, "RefractiveProcedureOccurred", 1, 1, "Supplement_144", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x1040, 0x0022, 0x1040, EVR_SQ, "RefractiveSurgeryTypeCodeSequence", 1, 1, "Supplement_144", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x1044, 0x0022, 0x1044, EVR_SQ, "OphthalmicUltrasoundMethodCodeSequence", 1, 1, "Supplement_144", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x1050, 0x0022, 0x1050, EVR_SQ, "OphthalmicAxialLengthMeasurementsSequence", 1, 1, "Supplement_144", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x1053, 0x0022, 0x1053, EVR_FL, "IOLPower", 1, 1, "Supplement_144", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x1054, 0x0022, 0x1054, EVR_FL, "PredictedRefractiveError", 1, 1, "Supplement_144", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x1059, 0x0022, 0x1059, EVR_FL, "OphthalmicAxialLengthVelocity", 1, 1, "Supplement_144", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x1065, 0x0022, 0x1065, EVR_LO, "LensStatusDescription", 1, 1, "Supplement_144", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x1066, 0x0022, 0x1066, EVR_LO, "VitreousStatusDescription", 1, 1, "Supplement_144", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x1090, 0x0022, 0x1090, EVR_SQ, "IOLPowerSequence", 1, 1, "Supplement_144", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x1092, 0x0022, 0x1092, EVR_SQ, "LensConstantSequence", 1, 1, "Supplement_144", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x1093, 0x0022, 0x1093, EVR_LO, "IOLManufacturer", 1, 1, "Supplement_144", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x1095, 0x0022, 0x1095, EVR_LO, "ImplantName", 1, 1, "Supplement_144", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x1096, 0x0022, 0x1096, EVR_SQ, "KeratometryMeasurementTypeCodeSequence", 1, 1, "Supplement_144", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x1097, 0x0022, 0x1097, EVR_LO, "ImplantPartNumber", 1, 1, "Supplement_144", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x1100, 0x0022, 0x1100, EVR_SQ, "ReferencedOphthalmicAxialMeasurementsSequence", 1, 1, "Supplement_144", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x1101, 0x0022, 0x1101, EVR_SQ, "OphthalmicAxialLengthMeasurementsSegmentNameCodeSequence", 1, 1, "Supplement_144", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x1103, 0x0022, 0x1103, EVR_SQ, "RefractiveErrorBeforeRefractiveSurgeryCodeSequence", 1, 1, "Supplement_144", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x1121, 0x0022, 0x1121, EVR_FL, "IOLPowerForExactEmmetropia", 1, 1, "Supplement_144", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x1122, 0x0022, 0x1122, EVR_FL, "IOLPowerForExactTargetRefraction", 1, 1, "Supplement_144", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x1125, 0x0022, 0x1125, EVR_SQ, "AnteriorChamberDepthDefinitionCodeSequence", 1, 1, "Supplement_144", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x1127, 0x0022, 0x1127, EVR_SQ, "LensThicknessSequence", 1, 1, "Supplement_144", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x1128, 0x0022, 0x1128, EVR_SQ, "AnteriorChamberDepthSequence", 1, 1, "Supplement_144", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x1130, 0x0022, 0x1130, EVR_FL, "LensThickness", 1, 1, "Supplement_144", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x1131, 0x0022, 0x1131, EVR_FL, "AnteriorChamberDepth", 1, 1, "Supplement_144", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x1132, 0x0022, 0x1132, EVR_SQ, "SourceofLensThicknessDataCodeSequence", 1, 1, "Supplement_144", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x1133, 0x0022, 0x1133, EVR_SQ, "SourceofAnteriorChamberDepthDataCodeSequence", 1, 1, "Supplement_144", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x1134, 0x0022, 0x1134, EVR_SQ, "SourceofRefractiveMeasurementsSequence", 1, 1, "Supplement_144", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x1135, 0x0022, 0x1135, EVR_SQ, "SourceofRefractiveMeasurementsCodeSequence", 1, 1, "Supplement_144", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x1140, 0x0022, 0x1140, EVR_CS, "OphthalmicAxialLengthMeasurementModified", 1, 1, "Supplement_144", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x1150, 0x0022, 0x1150, EVR_SQ, "OphthalmicAxialLengthDataSourceCodeSequence", 1, 1, "Supplement_144", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x1155, 0x0022, 0x1155, EVR_FL, "SignaltoNoiseRatio", 1, 1, "Supplement_144", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x1159, 0x0022, 0x1159, EVR_LO, "OphthalmicAxialLengthDataSourceDescription", 1, 1, "Supplement_144", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x1210, 0x0022, 0x1210, EVR_SQ, "OphthalmicAxialLengthMeasurementsTotalLengthSequence", 1, 1, "Supplement_144", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x1211, 0x0022, 0x1211, EVR_SQ, "OphthalmicAxialLengthMeasurementsSegmentalLengthSequence", 1, 1, "Supplement_144", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x1212, 0x0022, 0x1212, EVR_SQ, "OphthalmicAxialLengthMeasurementsLengthSummationSequence", 1, 1, "Supplement_144", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x1220, 0x0022, 0x1220, EVR_SQ, "UltrasoundOphthalmicAxialLengthMeasurementsSequence", 1, 1, "Supplement_144", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x1225, 0x0022, 0x1225, EVR_SQ, "OpticalOphthalmicAxialLengthMeasurementsSequence", 1, 1, "Supplement_144", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x1230, 0x0022, 0x1230, EVR_SQ, "UltrasoundSelectedOphthalmicAxialLengthSequence", 1, 1, "Supplement_144", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x1250, 0x0022, 0x1250, EVR_SQ, "OphthalmicAxialLengthSelectionMethodCodeSequence", 1, 1, "Supplement_144", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x1255, 0x0022, 0x1255, EVR_SQ, "OpticalSelectedOphthalmicAxialLengthSequence", 1, 1, "Supplement_144", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x1257, 0x0022, 0x1257, EVR_SQ, "SelectedSegmentalOphthalmicAxialLengthSequence", 1, 1, "Supplement_144", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x1260, 0x0022, 0x1260, EVR_SQ, "SelectedTotalOphthalmicAxialLengthSequence", 1, 1, "Supplement_144", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x1262, 0x0022, 0x1262, EVR_SQ, "OphthalmicAxialLengthQualityMetricSequence", 1, 1, "Supplement_144", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x1265, 0x0022, 0x1265, EVR_SQ, "OphthalmicAxialLengthQualityMetricTypeCodeSequence", 1, 1, "Supplement_144", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x1300, 0x0022, 0x1300, EVR_SQ, "IntraocularLensCalculationsRightEyeSequence", 1, 1, "Supplement_144", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x1310, 0x0022, 0x1310, EVR_SQ, "IntraocularLensCalculationsLeftEyeSequence", 1, 1, "Supplement_144", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0022, 0x1330, 0x0022, 0x1330, EVR_SQ, "ReferencedOphthalmicAxialLengthMeasurementQCImageSequence", 1, 1, "Supplement_144", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } #ifdef WITH_PRIVATE_TAGS , { 0x0023, 0x0000, 0x0023, 0x0000, EVR_LO, "CRExposureMenuCode", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACRQA_1.0 BLOCK1" } , { 0x0023, 0x0000, 0x0023, 0x0000, EVR_US, "CRSShift", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACRQA_1.0 BLOCK2" } , { 0x0023, 0x0000, 0x0023, 0x0000, EVR_DS, "CRDRE", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACRQA_1.0 BLOCK3" } , { 0x0023, 0x0000, 0x0023, 0x0000, EVR_LO, "CRExposureMenuCode", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACRQA_2.0 BLOCK1" } , { 0x0023, 0x0000, 0x0023, 0x0000, EVR_US, "CRSShift", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACRQA_2.0 BLOCK2" } , { 0x0023, 0x0000, 0x0023, 0x0000, EVR_DS, "CRDRE", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACRQA_2.0 BLOCK3" } , { 0x0023, 0x0000, 0x0023, 0x0000, EVR_DS, "HorizontalCalibrationPixelSize", 2, 2, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX QUANT 1.0" } , { 0x0023, 0x0000, 0x0023, 0x0000, EVR_LO, "ImageLaterality", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SVISION" } , { 0x0023, 0x0001, 0x0023, 0x0001, EVR_SL, "NumberOfSeriesInStudy", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_STDY_01" } , { 0x0023, 0x0001, 0x0023, 0x0001, EVR_DS, "VerticalCalibrationPixelSize", 2, 2, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX QUANT 1.0" } , { 0x0023, 0x0001, 0x0023, 0x0001, EVR_IS, "LetterPosition", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SVISION" } , { 0x0023, 0x0002, 0x0023, 0x0002, EVR_SL, "NumberOfUnarchivedSeries", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_STDY_01" } , { 0x0023, 0x0002, 0x0023, 0x0002, EVR_LO, "CalibrationObject", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX QUANT 1.0" } , { 0x0023, 0x0002, 0x0023, 0x0002, EVR_IS, "BurnedInAnnotation", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SVISION" } , { 0x0023, 0x0003, 0x0023, 0x0003, EVR_DS, "CalibrationObjectSize", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX QUANT 1.0" } , { 0x0023, 0x0003, 0x0023, 0x0003, EVR_LO, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SVISION" } , { 0x0023, 0x0004, 0x0023, 0x0004, EVR_LO, "CalibrationMethod", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX QUANT 1.0" } , { 0x0023, 0x0005, 0x0023, 0x0005, EVR_ST, "Filename", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX QUANT 1.0" } , { 0x0023, 0x0006, 0x0023, 0x0006, EVR_IS, "FrameNumber", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX QUANT 1.0" } , { 0x0023, 0x0007, 0x0023, 0x0007, EVR_IS, "CalibrationFactorMultiplicity", 2, 2, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX QUANT 1.0" } , { 0x0023, 0x0008, 0x0023, 0x0008, EVR_IS, "CalibrationTODValue", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX QUANT 1.0" } , { 0x0023, 0x000d, 0x0023, 0x000d, EVR_UI, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 2;1" } , { 0x0023, 0x000e, 0x0023, 0x000e, EVR_UI, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 2;1" } , { 0x0023, 0x0010, 0x0023, 0x0010, EVR_SQ, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0023, 0x0010, 0x0023, 0x0010, EVR_LO, "CRExposureMenuString", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACRQA_1.0 BLOCK1" } , { 0x0023, 0x0010, 0x0023, 0x0010, EVR_DS, "CRCShift", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACRQA_1.0 BLOCK2" } , { 0x0023, 0x0010, 0x0023, 0x0010, EVR_US, "CRDRN", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACRQA_1.0 BLOCK3" } , { 0x0023, 0x0010, 0x0023, 0x0010, EVR_LO, "CRExposureMenuString", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACRQA_2.0 BLOCK1" } , { 0x0023, 0x0010, 0x0023, 0x0010, EVR_LO, "CRCShift", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACRQA_2.0 BLOCK2" } , { 0x0023, 0x0010, 0x0023, 0x0010, EVR_US, "CRDRN", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACRQA_2.0 BLOCK3" } , { 0x0023, 0x0010, 0x0023, 0x0010, EVR_SS, "ReferenceImageField", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_STDY_01" } , { 0x0023, 0x0020, 0x0023, 0x0020, EVR_SQ, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0023, 0x0020, 0x0023, 0x0020, EVR_LO, "CREDRMode", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACRQA_1.0 BLOCK1" } , { 0x0023, 0x0020, 0x0023, 0x0020, EVR_DS, "CRGT", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACRQA_1.0 BLOCK2" } , { 0x0023, 0x0020, 0x0023, 0x0020, EVR_DS, "CRORE", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACRQA_1.0 BLOCK3" } , { 0x0023, 0x0020, 0x0023, 0x0020, EVR_LO, "CREDRMode", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACRQA_2.0 BLOCK1" } , { 0x0023, 0x0020, 0x0023, 0x0020, EVR_LO, "CRGT", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACRQA_2.0 BLOCK2" } , { 0x0023, 0x0020, 0x0023, 0x0020, EVR_DS, "CRORE", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACRQA_2.0 BLOCK3" } , { 0x0023, 0x0030, 0x0023, 0x0030, EVR_SQ, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0023, 0x0030, 0x0023, 0x0030, EVR_LO, "CRLatitude", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACRQA_1.0 BLOCK1" } , { 0x0023, 0x0030, 0x0023, 0x0030, EVR_DS, "CRGA", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACRQA_1.0 BLOCK2" } , { 0x0023, 0x0030, 0x0023, 0x0030, EVR_US, "CRORN", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACRQA_1.0 BLOCK3" } , { 0x0023, 0x0030, 0x0023, 0x0030, EVR_LO, "CRLatitude", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACRQA_2.0 BLOCK1" } , { 0x0023, 0x0030, 0x0023, 0x0030, EVR_DS, "CRGA", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACRQA_2.0 BLOCK2" } , { 0x0023, 0x0030, 0x0023, 0x0030, EVR_US, "CRORN", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACRQA_2.0 BLOCK3" } , { 0x0023, 0x0040, 0x0023, 0x0040, EVR_LO, "CRGroupNumber", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACRQA_1.0 BLOCK1" } , { 0x0023, 0x0040, 0x0023, 0x0040, EVR_DS, "CRGC", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACRQA_1.0 BLOCK2" } , { 0x0023, 0x0040, 0x0023, 0x0040, EVR_US, "CRORD", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACRQA_1.0 BLOCK3" } , { 0x0023, 0x0040, 0x0023, 0x0040, EVR_LO, "CRGroupNumber", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACRQA_2.0 BLOCK1" } , { 0x0023, 0x0040, 0x0023, 0x0040, EVR_DS, "CRGC", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACRQA_2.0 BLOCK2" } , { 0x0023, 0x0040, 0x0023, 0x0040, EVR_US, "CRORD", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACRQA_2.0 BLOCK3" } , { 0x0023, 0x0050, 0x0023, 0x0050, EVR_US, "CRImageSerialNumber", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACRQA_1.0 BLOCK1" } , { 0x0023, 0x0050, 0x0023, 0x0050, EVR_DS, "CRGS", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACRQA_1.0 BLOCK2" } , { 0x0023, 0x0050, 0x0023, 0x0050, EVR_LO, "CRCassetteSize", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACRQA_1.0 BLOCK3" } , { 0x0023, 0x0050, 0x0023, 0x0050, EVR_US, "CRImageSerialNumber", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACRQA_2.0 BLOCK1" } , { 0x0023, 0x0050, 0x0023, 0x0050, EVR_DS, "CRGS", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACRQA_2.0 BLOCK2" } , { 0x0023, 0x0050, 0x0023, 0x0050, EVR_LO, "CRCassetteSize", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACRQA_2.0 BLOCK3" } , { 0x0023, 0x0050, 0x0023, 0x0050, EVR_SS, "SummaryImage", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_STDY_01" } , { 0x0023, 0x0060, 0x0023, 0x0060, EVR_LO, "CRBarCodeNumber", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACRQA_1.0 BLOCK1" } , { 0x0023, 0x0060, 0x0023, 0x0060, EVR_DS, "CRRT", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACRQA_1.0 BLOCK2" } , { 0x0023, 0x0060, 0x0023, 0x0060, EVR_LO, "CRMachineID", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACRQA_1.0 BLOCK3" } , { 0x0023, 0x0060, 0x0023, 0x0060, EVR_LO, "CRBarCodeNumber", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACRQA_2.0 BLOCK1" } , { 0x0023, 0x0060, 0x0023, 0x0060, EVR_LO, "CRRT", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACRQA_2.0 BLOCK2" } , { 0x0023, 0x0060, 0x0023, 0x0060, EVR_LO, "CRMachineID", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACRQA_2.0 BLOCK3" } , { 0x0023, 0x0070, 0x0023, 0x0070, EVR_LO, "CRFilmOutputExposure", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACRQA_1.0 BLOCK1" } , { 0x0023, 0x0070, 0x0023, 0x0070, EVR_DS, "CRRE", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACRQA_1.0 BLOCK2" } , { 0x0023, 0x0070, 0x0023, 0x0070, EVR_LO, "CRMachineType", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACRQA_1.0 BLOCK3" } , { 0x0023, 0x0070, 0x0023, 0x0070, EVR_LO, "CRFilmOutputExposure", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACRQA_2.0 BLOCK1" } , { 0x0023, 0x0070, 0x0023, 0x0070, EVR_DS, "CRRE", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACRQA_2.0 BLOCK2" } , { 0x0023, 0x0070, 0x0023, 0x0070, EVR_LO, "CRMachineType", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACRQA_2.0 BLOCK3" } , { 0x0023, 0x0070, 0x0023, 0x0070, EVR_FD, "StartTimeSecsInFirstAxial", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_STDY_01" } , { 0x0023, 0x0074, 0x0023, 0x0074, EVR_SL, "NumberOfUpdatesToHeader", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_STDY_01" } , { 0x0023, 0x007d, 0x0023, 0x007d, EVR_SS, "IndicatesIfStudyHasCompleteInfo", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_STDY_01" } , { 0x0023, 0x0080, 0x0023, 0x0080, EVR_LO, "CRFilmFormat", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACRQA_1.0 BLOCK1" } , { 0x0023, 0x0080, 0x0023, 0x0080, EVR_US, "CRRN", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACRQA_1.0 BLOCK2" } , { 0x0023, 0x0080, 0x0023, 0x0080, EVR_LO, "CRTechnicianCode", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACRQA_1.0 BLOCK3" } , { 0x0023, 0x0080, 0x0023, 0x0080, EVR_LO, "CRFilmFormat", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACRQA_2.0 BLOCK1" } , { 0x0023, 0x0080, 0x0023, 0x0080, EVR_US, "CRRN", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACRQA_2.0 BLOCK2" } , { 0x0023, 0x0080, 0x0023, 0x0080, EVR_LO, "CRTechnicianCode", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACRQA_2.0 BLOCK3" } , { 0x0023, 0x0090, 0x0023, 0x0090, EVR_LO, "CRSShiftString", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACRQA_1.0 BLOCK1" } , { 0x0023, 0x0090, 0x0023, 0x0090, EVR_DS, "CRDRT", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACRQA_1.0 BLOCK2" } , { 0x0023, 0x0090, 0x0023, 0x0090, EVR_LO, "CREnergySubtractionParameters", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACRQA_1.0 BLOCK3" } , { 0x0023, 0x0090, 0x0023, 0x0090, EVR_LO, "CRSShiftString", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACRQA_2.0 BLOCK1" } , { 0x0023, 0x0090, 0x0023, 0x0090, EVR_DS, "CRDRT", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACRQA_2.0 BLOCK2" } , { 0x0023, 0x0090, 0x0023, 0x0090, EVR_LO, "CREnergySubtractionParameters", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACRQA_2.0 BLOCK3" } , { 0x0023, 0x00f0, 0x0023, 0x00f0, EVR_LO, "CRDistributionCode", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACRQA_2.0 BLOCK3" } , { 0x0023, 0x00f0, 0x0023, 0x00f0, EVR_IS, "ImageSOPClass", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SVISION" } , { 0x0023, 0x00ff, 0x0023, 0x00ff, EVR_US, "CRShuttersApplied", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ACRQA_2.0 BLOCK3" } #endif , { 0x0024, 0x0010, 0x0024, 0x0010, EVR_FL, "VisualFieldHorizontalExtent", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0011, 0x0024, 0x0011, EVR_FL, "VisualFieldVerticalExtent", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0012, 0x0024, 0x0012, EVR_CS, "VisualFieldShape", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0016, 0x0024, 0x0016, EVR_SQ, "ScreeningTestModeCodeSequence", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0018, 0x0024, 0x0018, EVR_FL, "MaximumStimulusLuminance", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0020, 0x0024, 0x0020, EVR_FL, "BackgroundLuminance", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0021, 0x0024, 0x0021, EVR_SQ, "StimulusColorCodeSequence", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0024, 0x0024, 0x0024, EVR_SQ, "BackgroundIlluminationColorCodeSequence", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0025, 0x0024, 0x0025, EVR_FL, "StimulusArea", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0028, 0x0024, 0x0028, EVR_FL, "StimulusPresentationTime", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0032, 0x0024, 0x0032, EVR_SQ, "FixationSequence", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0033, 0x0024, 0x0033, EVR_SQ, "FixationMonitoringCodeSequence", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0034, 0x0024, 0x0034, EVR_SQ, "VisualFieldCatchTrialSequence", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0035, 0x0024, 0x0035, EVR_US, "FixationCheckedQuantity", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0036, 0x0024, 0x0036, EVR_US, "PatientNotProperlyFixatedQuantity", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0037, 0x0024, 0x0037, EVR_CS, "PresentedVisualStimuliDataFlag", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0038, 0x0024, 0x0038, EVR_US, "NumberOfVisualStimuli", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0039, 0x0024, 0x0039, EVR_CS, "ExcessiveFixationLossesDataFlag", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0040, 0x0024, 0x0040, EVR_CS, "ExcessiveFixationLosses", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0042, 0x0024, 0x0042, EVR_US, "StimuliRetestingQuantity", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0044, 0x0024, 0x0044, EVR_LT, "CommentsOnPatientPerformanceOfVisualField", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0045, 0x0024, 0x0045, EVR_CS, "FalseNegativesEstimateFlag", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0046, 0x0024, 0x0046, EVR_FL, "FalseNegativesEstimate", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0048, 0x0024, 0x0048, EVR_US, "NegativeCatchTrialsQuantity", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0050, 0x0024, 0x0050, EVR_US, "FalseNegativesQuantity", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0051, 0x0024, 0x0051, EVR_CS, "ExcessiveFalseNegativesDataFlag", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0052, 0x0024, 0x0052, EVR_CS, "ExcessiveFalseNegatives", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0053, 0x0024, 0x0053, EVR_CS, "FalsePositivesEstimateFlag", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0054, 0x0024, 0x0054, EVR_FL, "FalsePositivesEstimate", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0055, 0x0024, 0x0055, EVR_CS, "CatchTrialsDataFlag", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0056, 0x0024, 0x0056, EVR_US, "PositiveCatchTrialsQuantity", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0057, 0x0024, 0x0057, EVR_CS, "TestPointNormalsDataFlag", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0058, 0x0024, 0x0058, EVR_SQ, "TestPointNormalsSequence", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0059, 0x0024, 0x0059, EVR_CS, "GlobalDeviationProbabilityNormalsFlag", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0060, 0x0024, 0x0060, EVR_US, "FalsePositivesQuantity", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0061, 0x0024, 0x0061, EVR_CS, "ExcessiveFalsePositivesDataFlag", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0062, 0x0024, 0x0062, EVR_CS, "ExcessiveFalsePositives", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0063, 0x0024, 0x0063, EVR_CS, "VisualFieldTestNormalsFlag", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0064, 0x0024, 0x0064, EVR_SQ, "ResultsNormalsSequence", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0065, 0x0024, 0x0065, EVR_SQ, "AgeCorrectedSensitivityDeviationAlgorithmSequence", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0066, 0x0024, 0x0066, EVR_FL, "GlobalDeviationFromNormal", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0067, 0x0024, 0x0067, EVR_SQ, "GeneralizedDefectSensitivityDeviationAlgorithmSequence", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0068, 0x0024, 0x0068, EVR_FL, "LocalizedDeviationfromNormal", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0069, 0x0024, 0x0069, EVR_LO, "PatientReliabilityIndicator", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0070, 0x0024, 0x0070, EVR_FL, "VisualFieldMeanSensitivity", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0071, 0x0024, 0x0071, EVR_FL, "GlobalDeviationProbability", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0072, 0x0024, 0x0072, EVR_CS, "LocalDeviationProbabilityNormalsFlag", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0073, 0x0024, 0x0073, EVR_FL, "LocalizedDeviationProbability", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0074, 0x0024, 0x0074, EVR_CS, "ShortTermFluctuationCalculated", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0075, 0x0024, 0x0075, EVR_FL, "ShortTermFluctuation", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0076, 0x0024, 0x0076, EVR_CS, "ShortTermFluctuationProbabilityCalculated", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0077, 0x0024, 0x0077, EVR_FL, "ShortTermFluctuationProbability", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0078, 0x0024, 0x0078, EVR_CS, "CorrectedLocalizedDeviationFromNormalCalculated", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0079, 0x0024, 0x0079, EVR_FL, "CorrectedLocalizedDeviationFromNormal", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0080, 0x0024, 0x0080, EVR_CS, "CorrectedLocalizedDeviationFromNormalProbabilityCalculated", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0081, 0x0024, 0x0081, EVR_FL, "CorrectedLocalizedDeviationFromNormalProbability", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0083, 0x0024, 0x0083, EVR_SQ, "GlobalDeviationProbabilitySequence", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0085, 0x0024, 0x0085, EVR_SQ, "LocalizedDeviationProbabilitySequence", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0086, 0x0024, 0x0086, EVR_CS, "FovealSensitivityMeasured", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0087, 0x0024, 0x0087, EVR_FL, "FovealSensitivity", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0088, 0x0024, 0x0088, EVR_FL, "VisualFieldTestDuration", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0089, 0x0024, 0x0089, EVR_SQ, "VisualFieldTestPointSequence", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0090, 0x0024, 0x0090, EVR_FL, "VisualFieldTestPointXCoordinate", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0091, 0x0024, 0x0091, EVR_FL, "VisualFieldTestPointYCoordinate", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0092, 0x0024, 0x0092, EVR_FL, "AgeCorrectedSensitivityDeviationValue", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0093, 0x0024, 0x0093, EVR_CS, "StimulusResults", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0094, 0x0024, 0x0094, EVR_FL, "SensitivityValue", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0095, 0x0024, 0x0095, EVR_CS, "RetestStimulusSeen", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0096, 0x0024, 0x0096, EVR_FL, "RetestSensitivityValue", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0097, 0x0024, 0x0097, EVR_SQ, "VisualFieldTestPointNormalsSequence", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0098, 0x0024, 0x0098, EVR_FL, "QuantifiedDefect", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0102, 0x0024, 0x0102, EVR_CS, "GeneralizedDefectCorrectedSensitivityDeviationFlag", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0103, 0x0024, 0x0103, EVR_FL, "GeneralizedDefectCorrectedSensitivityDeviationValue", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0104, 0x0024, 0x0104, EVR_FL, "GeneralizedDefectCorrectedSensitivityDeviationProbabilityValue", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0105, 0x0024, 0x0105, EVR_FL, "MinimumSensitivityValue", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0106, 0x0024, 0x0106, EVR_CS, "BlindSpotLocalized", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0107, 0x0024, 0x0107, EVR_FL, "BlindSpotXCoordinate", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0108, 0x0024, 0x0108, EVR_FL, "BlindSpotYCoordinate", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0110, 0x0024, 0x0110, EVR_SQ, "VisualAcuityMeasurementSequence", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0112, 0x0024, 0x0112, EVR_SQ, "RefractiveParametersUsedOnPatientSequence", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0113, 0x0024, 0x0113, EVR_CS, "MeasurementLaterality", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0114, 0x0024, 0x0114, EVR_SQ, "OphthalmicPatientClinicalInformationLeftEyeSequence", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0115, 0x0024, 0x0115, EVR_SQ, "OphthalmicPatientClinicalInformationRightEyeSequence", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0117, 0x0024, 0x0117, EVR_CS, "FovealPointNormativeDataFlag", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0118, 0x0024, 0x0118, EVR_FL, "FovealPointProbabilityValue", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0120, 0x0024, 0x0120, EVR_CS, "ScreeningBaselineMeasured", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0122, 0x0024, 0x0122, EVR_SQ, "ScreeningBaselineMeasuredSequence", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0124, 0x0024, 0x0124, EVR_CS, "ScreeningBaselineType", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0126, 0x0024, 0x0126, EVR_FL, "ScreeningBaselineValue", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0202, 0x0024, 0x0202, EVR_LO, "AlgorithmSource", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0306, 0x0024, 0x0306, EVR_LO, "DataSetName", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0307, 0x0024, 0x0307, EVR_LO, "DataSetVersion", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0308, 0x0024, 0x0308, EVR_LO, "DataSetSource", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0309, 0x0024, 0x0309, EVR_LO, "DataSetDescription", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0317, 0x0024, 0x0317, EVR_SQ, "VisualFieldTestReliabilityGlobalIndexSequence", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0320, 0x0024, 0x0320, EVR_SQ, "VisualFieldGlobalResultsIndexSequence", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0325, 0x0024, 0x0325, EVR_SQ, "DataObservationSequence", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0338, 0x0024, 0x0338, EVR_CS, "IndexNormalsFlag", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0341, 0x0024, 0x0341, EVR_FL, "IndexProbability", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0024, 0x0344, 0x0024, 0x0344, EVR_SQ, "IndexProbabilitySequence", 1, 1, "Supplement_146", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } #ifdef WITH_PRIVATE_TAGS , { 0x0025, 0x0000, 0x0025, 0x0000, EVR_US, "ViewNative", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX ORIGINAL IMAGE INFO 1.0" } , { 0x0025, 0x0000, 0x0025, 0x0000, EVR_IS, "OriginalImage", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SVISION" } , { 0x0025, 0x0001, 0x0025, 0x0001, EVR_US, "OriginalSeriesNumber", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX ORIGINAL IMAGE INFO 1.0" } , { 0x0025, 0x0001, 0x0025, 0x0001, EVR_IS, "NotProcessedImage", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SVISION" } , { 0x0025, 0x0002, 0x0025, 0x0002, EVR_US, "OriginalImageNumber", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX ORIGINAL IMAGE INFO 1.0" } , { 0x0025, 0x0002, 0x0025, 0x0002, EVR_IS, "CutOutImage", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SVISION" } , { 0x0025, 0x0003, 0x0025, 0x0003, EVR_US, "WinCenter", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX ORIGINAL IMAGE INFO 1.0" } , { 0x0025, 0x0003, 0x0025, 0x0003, EVR_IS, "DuplicatedImage", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SVISION" } , { 0x0025, 0x0004, 0x0025, 0x0004, EVR_US, "WinWidth", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX ORIGINAL IMAGE INFO 1.0" } , { 0x0025, 0x0004, 0x0025, 0x0004, EVR_IS, "StoredImage", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SVISION" } , { 0x0025, 0x0005, 0x0025, 0x0005, EVR_US, "WinBrightness", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX ORIGINAL IMAGE INFO 1.0" } , { 0x0025, 0x0005, 0x0025, 0x0005, EVR_IS, "RetrievedImage", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SVISION" } , { 0x0025, 0x0006, 0x0025, 0x0006, EVR_SS, "LastPulseSequenceUsed", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_SERS_01" } , { 0x0025, 0x0006, 0x0025, 0x0006, EVR_US, "WinContrast", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX ORIGINAL IMAGE INFO 1.0" } , { 0x0025, 0x0006, 0x0025, 0x0006, EVR_IS, "RemoteImage", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SVISION" } , { 0x0025, 0x0007, 0x0025, 0x0007, EVR_SL, "ImagesInSeries", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_SERS_01" } , { 0x0025, 0x0007, 0x0025, 0x0007, EVR_US, "OriginalFrameNumber", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX ORIGINAL IMAGE INFO 1.0" } , { 0x0025, 0x0007, 0x0025, 0x0007, EVR_IS, "MediaStoredImage", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SVISION" } , { 0x0025, 0x0008, 0x0025, 0x0008, EVR_US, "OriginalMaskFrameNumber", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX ORIGINAL IMAGE INFO 1.0" } , { 0x0025, 0x0008, 0x0025, 0x0008, EVR_IS, "ImageState", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SVISION" } , { 0x0025, 0x0009, 0x0025, 0x0009, EVR_US, "Opac", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX ORIGINAL IMAGE INFO 1.0" } , { 0x0025, 0x000a, 0x0025, 0x000a, EVR_US, "OriginalNumberOfFrames", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX ORIGINAL IMAGE INFO 1.0" } , { 0x0025, 0x000b, 0x0025, 0x000b, EVR_DS, "OriginalSceneDuration", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX ORIGINAL IMAGE INFO 1.0" } , { 0x0025, 0x000c, 0x0025, 0x000c, EVR_LO, "IdentifierLOID", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX ORIGINAL IMAGE INFO 1.0" } , { 0x0025, 0x000d, 0x0025, 0x000d, EVR_SS, "OriginalSceneVFRInfo", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX ORIGINAL IMAGE INFO 1.0" } , { 0x0025, 0x000e, 0x0025, 0x000e, EVR_SS, "OriginalFrameECGPosition", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX ORIGINAL IMAGE INFO 1.0" } , { 0x0025, 0x000f, 0x0025, 0x000f, EVR_SS, "OriginalECG1stFrameOffset_retired", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX ORIGINAL IMAGE INFO 1.0" } , { 0x0025, 0x0010, 0x0025, 0x0010, EVR_US, "RelativeLightEmissionAmountSk", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0025, 0x0010, 0x0025, 0x0010, EVR_SL, "LandmarkCounter", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_SERS_01" } , { 0x0025, 0x0010, 0x0025, 0x0010, EVR_SS, "ZoomFlag", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX ORIGINAL IMAGE INFO 1.0" } , { 0x0025, 0x0011, 0x0025, 0x0011, EVR_US, "TermOfCorrectionForEachIPTypeSt", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0025, 0x0011, 0x0025, 0x0011, EVR_SS, "NumberOfAcquisitions", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_SERS_01" } , { 0x0025, 0x0011, 0x0025, 0x0011, EVR_US, "Flex", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX ORIGINAL IMAGE INFO 1.0" } , { 0x0025, 0x0012, 0x0025, 0x0012, EVR_US, "ReadingGainGp", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0025, 0x0012, 0x0025, 0x0012, EVR_US, "NumberOfMaskFrames", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX ORIGINAL IMAGE INFO 1.0" } , { 0x0025, 0x0013, 0x0025, 0x0013, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0025, 0x0013, 0x0025, 0x0013, EVR_US, "NumberOfFillFrames", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX ORIGINAL IMAGE INFO 1.0" } , { 0x0025, 0x0014, 0x0025, 0x0014, EVR_SL, "IndicatesNumberOfUpdatesToHeader", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_SERS_01" } , { 0x0025, 0x0014, 0x0025, 0x0014, EVR_US, "SeriesNumber", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX ORIGINAL IMAGE INFO 1.0" } , { 0x0025, 0x0015, 0x0025, 0x0015, EVR_CS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0025, 0x0015, 0x0025, 0x0015, EVR_IS, "ImageNumber", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS SMS-AX ORIGINAL IMAGE INFO 1.0" } , { 0x0025, 0x0017, 0x0025, 0x0017, EVR_SL, "SeriesCompleteFlag", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_SERS_01" } , { 0x0025, 0x0018, 0x0025, 0x0018, EVR_SL, "NumberOfImagesArchived", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_SERS_01" } , { 0x0025, 0x0019, 0x0025, 0x0019, EVR_SL, "LastImageNumberUsed", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_SERS_01" } , { 0x0025, 0x001a, 0x0025, 0x001a, EVR_SH, "PrimaryReceiverSuiteAndHost", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_SERS_01" } , { 0x0025, 0x0020, 0x0025, 0x0020, EVR_US, "Unknown", 2, 2, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0025, 0x0020, 0x0025, 0x0020, EVR_LO, "SourceImageFile", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SVISION" } , { 0x0025, 0x0021, 0x0025, 0x0021, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0025, 0x0021, 0x0025, 0x0021, EVR_UI, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SVISION" } , { 0x0025, 0x0030, 0x0025, 0x0030, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0025, 0x0031, 0x0025, 0x0031, EVR_SS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0025, 0x0032, 0x0025, 0x0032, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0025, 0x0033, 0x0025, 0x0033, EVR_SS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0025, 0x0034, 0x0025, 0x0034, EVR_SS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0025, 0x0040, 0x0025, 0x0040, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0025, 0x0041, 0x0025, 0x0041, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0025, 0x0042, 0x0025, 0x0042, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0025, 0x0043, 0x0025, 0x0043, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0025, 0x0050, 0x0025, 0x0050, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0025, 0x0051, 0x0025, 0x0051, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0025, 0x0052, 0x0025, 0x0052, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0025, 0x0053, 0x0025, 0x0053, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0025, 0x0060, 0x0025, 0x0060, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0025, 0x0061, 0x0025, 0x0061, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0025, 0x0062, 0x0025, 0x0062, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0025, 0x0063, 0x0025, 0x0063, EVR_CS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0025, 0x0070, 0x0025, 0x0070, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0025, 0x0071, 0x0025, 0x0071, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0025, 0x0072, 0x0025, 0x0072, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0025, 0x0073, 0x0025, 0x0073, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0025, 0x0074, 0x0025, 0x0074, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0025, 0x0080, 0x0025, 0x0080, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0025, 0x0081, 0x0025, 0x0081, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0025, 0x0082, 0x0025, 0x0082, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0025, 0x0083, 0x0025, 0x0083, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0025, 0x0084, 0x0025, 0x0084, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0025, 0x0090, 0x0025, 0x0090, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0025, 0x0091, 0x0025, 0x0091, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0025, 0x0092, 0x0025, 0x0092, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0025, 0x0093, 0x0025, 0x0093, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0025, 0x0094, 0x0025, 0x0094, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0025, 0x0095, 0x0025, 0x0095, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0025, 0x0096, 0x0025, 0x0096, EVR_CS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0025, 0x00a0, 0x0025, 0x00a0, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0025, 0x00a1, 0x0025, 0x00a1, EVR_SS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0025, 0x00a2, 0x0025, 0x00a2, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0025, 0x00a3, 0x0025, 0x00a3, EVR_SS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0025, 0x1010, 0x0025, 0x1010, EVR_LO, "WorkspaceID", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "CMR42 CIRCLECVI" } , { 0x0025, 0x1020, 0x0025, 0x1020, EVR_LO, "WorkspaceTimeString", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "CMR42 CIRCLECVI" } , { 0x0025, 0x1030, 0x0025, 0x1030, EVR_OB, "WorkspaceStream", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "CMR42 CIRCLECVI" } , { 0x0027, 0x0000, 0x0027, 0x0000, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/LAST" } , { 0x0027, 0x0000, 0x0027, 0x0000, EVR_IS, "NumberOfSeries", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SVISION" } , { 0x0027, 0x0001, 0x0027, 0x0001, EVR_IS, "NumberOfStudies", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SVISION" } , { 0x0027, 0x0006, 0x0027, 0x0006, EVR_SL, "ImageArchiveFlag", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_IMAG_01" } , { 0x0027, 0x0010, 0x0027, 0x0010, EVR_SQ, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0027, 0x0010, 0x0027, 0x0010, EVR_SS, "ScoutType", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_IMAG_01" } , { 0x0027, 0x0010, 0x0027, 0x0010, EVR_DT, "OldestSeries", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SVISION" } , { 0x0027, 0x0011, 0x0027, 0x0011, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/LAST" } , { 0x0027, 0x0011, 0x0027, 0x0011, EVR_DT, "NewestSeries", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SVISION" } , { 0x0027, 0x0012, 0x0027, 0x0012, EVR_DS, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/LAST" } , { 0x0027, 0x0012, 0x0027, 0x0012, EVR_DT, "OldestStudy", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SVISION" } , { 0x0027, 0x0013, 0x0027, 0x0013, EVR_DS, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/LAST" } , { 0x0027, 0x0013, 0x0027, 0x0013, EVR_DT, "NewestStudy", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SVISION" } , { 0x0027, 0x0014, 0x0027, 0x0014, EVR_DS, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/LAST" } , { 0x0027, 0x0015, 0x0027, 0x0015, EVR_DS, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/LAST" } , { 0x0027, 0x0016, 0x0027, 0x0016, EVR_LO, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/LAST" } , { 0x0027, 0x001c, 0x0027, 0x001c, EVR_SL, "VmaMamp", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_IMAG_01" } , { 0x0027, 0x001d, 0x0027, 0x001d, EVR_SS, "VmaPhase", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_IMAG_01" } , { 0x0027, 0x001e, 0x0027, 0x001e, EVR_SL, "VmaMod", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_IMAG_01" } , { 0x0027, 0x001f, 0x0027, 0x001f, EVR_SL, "VmaClip", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_IMAG_01" } , { 0x0027, 0x0020, 0x0027, 0x0020, EVR_SQ, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0027, 0x0020, 0x0027, 0x0020, EVR_SS, "SmartScanOnOffFlag", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_IMAG_01" } , { 0x0027, 0x0030, 0x0027, 0x0030, EVR_SQ, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0027, 0x0030, 0x0027, 0x0030, EVR_SH, "ForeignImageRevision", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_IMAG_01" } , { 0x0027, 0x0031, 0x0027, 0x0031, EVR_SS, "ImagingMode", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_IMAG_01" } , { 0x0027, 0x0032, 0x0027, 0x0032, EVR_SS, "PulseSequence", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_IMAG_01" } , { 0x0027, 0x0033, 0x0027, 0x0033, EVR_SL, "ImagingOptions", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_IMAG_01" } , { 0x0027, 0x0035, 0x0027, 0x0035, EVR_SS, "PlaneType", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_IMAG_01" } , { 0x0027, 0x0036, 0x0027, 0x0036, EVR_SL, "ObliquePlane", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_IMAG_01" } , { 0x0027, 0x0040, 0x0027, 0x0040, EVR_SQ, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0027, 0x0040, 0x0027, 0x0040, EVR_SH, "RASLetterOfImageLocation", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_IMAG_01" } , { 0x0027, 0x0041, 0x0027, 0x0041, EVR_FL, "ImageLocation", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_IMAG_01" } , { 0x0027, 0x0042, 0x0027, 0x0042, EVR_FL, "CenterRCoordOfPlaneImage", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_IMAG_01" } , { 0x0027, 0x0043, 0x0027, 0x0043, EVR_FL, "CenterACoordOfPlaneImage", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_IMAG_01" } , { 0x0027, 0x0044, 0x0027, 0x0044, EVR_FL, "CenterSCoordOfPlaneImage", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_IMAG_01" } , { 0x0027, 0x0045, 0x0027, 0x0045, EVR_FL, "NormalRCoord", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_IMAG_01" } , { 0x0027, 0x0046, 0x0027, 0x0046, EVR_FL, "NormalACoord", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_IMAG_01" } , { 0x0027, 0x0047, 0x0027, 0x0047, EVR_FL, "NormalSCoord", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_IMAG_01" } , { 0x0027, 0x0048, 0x0027, 0x0048, EVR_FL, "RCoordOfTopRightCorner", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_IMAG_01" } , { 0x0027, 0x0049, 0x0027, 0x0049, EVR_FL, "ACoordOfTopRightCorner", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_IMAG_01" } , { 0x0027, 0x004a, 0x0027, 0x004a, EVR_FL, "SCoordOfTopRightCorner", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_IMAG_01" } , { 0x0027, 0x004b, 0x0027, 0x004b, EVR_FL, "RCoordOfBottomRightCorner", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_IMAG_01" } , { 0x0027, 0x004c, 0x0027, 0x004c, EVR_FL, "ACoordOfBottomRightCorner", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_IMAG_01" } , { 0x0027, 0x004d, 0x0027, 0x004d, EVR_FL, "SCoordOfBottomRightCorner", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_IMAG_01" } , { 0x0027, 0x0050, 0x0027, 0x0050, EVR_SQ, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0027, 0x0050, 0x0027, 0x0050, EVR_FL, "TableStartLocation", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_IMAG_01" } , { 0x0027, 0x0051, 0x0027, 0x0051, EVR_FL, "TableEndLocation", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_IMAG_01" } , { 0x0027, 0x0052, 0x0027, 0x0052, EVR_SH, "RASLetterForSideOfImage", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_IMAG_01" } , { 0x0027, 0x0053, 0x0027, 0x0053, EVR_SH, "RASLetterForAnteriorPosterior", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_IMAG_01" } , { 0x0027, 0x0054, 0x0027, 0x0054, EVR_SH, "RASLetterForScoutStartLoc", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_IMAG_01" } , { 0x0027, 0x0055, 0x0027, 0x0055, EVR_SH, "RASLetterForScoutEndLoc", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_IMAG_01" } , { 0x0027, 0x0060, 0x0027, 0x0060, EVR_SQ, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0027, 0x0060, 0x0027, 0x0060, EVR_FL, "ImageDimensionX", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_IMAG_01" } , { 0x0027, 0x0061, 0x0027, 0x0061, EVR_FL, "ImageDimensionY", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_IMAG_01" } , { 0x0027, 0x0062, 0x0027, 0x0062, EVR_FL, "NumberOfExcitations", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_IMAG_01" } , { 0x0027, 0x0070, 0x0027, 0x0070, EVR_SQ, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0027, 0x0080, 0x0027, 0x0080, EVR_SQ, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0027, 0x00a0, 0x0027, 0x00a0, EVR_IS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0027, 0x00a1, 0x0027, 0x00a1, EVR_CS, "Unknown", 2, 2, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0027, 0x00a2, 0x0027, 0x00a2, EVR_CS, "Unknown", 2, 2, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0027, 0x00a3, 0x0027, 0x00a3, EVR_SS, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } #endif , { 0x0028, 0x0002, 0x0028, 0x0002, EVR_US, "SamplesPerPixel", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x0003, 0x0028, 0x0003, EVR_US, "SamplesPerPixelUsed", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x0004, 0x0028, 0x0004, EVR_CS, "PhotometricInterpretation", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x0005, 0x0028, 0x0005, EVR_US, "ACR_NEMA_ImageDimensions", 1, 1, "ACR/NEMA2", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x0006, 0x0028, 0x0006, EVR_US, "PlanarConfiguration", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x0008, 0x0028, 0x0008, EVR_IS, "NumberOfFrames", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x0009, 0x0028, 0x0009, EVR_AT, "FrameIncrementPointer", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x000a, 0x0028, 0x000a, EVR_AT, "FrameDimensionPointer", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x0010, 0x0028, 0x0010, EVR_US, "Rows", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x0011, 0x0028, 0x0011, EVR_US, "Columns", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x0012, 0x0028, 0x0012, EVR_US, "RETIRED_Planes", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x0014, 0x0028, 0x0014, EVR_US, "UltrasoundColorDataPresent", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x0030, 0x0028, 0x0030, EVR_DS, "PixelSpacing", 2, 2, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x0031, 0x0028, 0x0031, EVR_DS, "ZoomFactor", 2, 2, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x0032, 0x0028, 0x0032, EVR_DS, "ZoomCenter", 2, 2, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x0034, 0x0028, 0x0034, EVR_IS, "PixelAspectRatio", 2, 2, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x0040, 0x0028, 0x0040, EVR_CS, "ACR_NEMA_ImageFormat", 1, 1, "ACR/NEMA2", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x0050, 0x0028, 0x0050, EVR_LO, "ACR_NEMA_ManipulatedImage", 1, -1, "ACR/NEMA2", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x0051, 0x0028, 0x0051, EVR_CS, "CorrectedImage", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x005f, 0x0028, 0x005f, EVR_CS, "ACR_NEMA_2C_CompressionRecognitionCode", 1, 1, "ACR/NEMA2C", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x0060, 0x0028, 0x0060, EVR_CS, "ACR_NEMA_CompressionCode", 1, 1, "ACR/NEMA2", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x0061, 0x0028, 0x0061, EVR_SH, "ACR_NEMA_2C_CompressionOriginator", 1, 1, "ACR/NEMA2C", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x0062, 0x0028, 0x0062, EVR_SH, "ACR_NEMA_2C_CompressionLabel", 1, 1, "ACR/NEMA2C", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x0063, 0x0028, 0x0063, EVR_SH, "ACR_NEMA_2C_CompressionDescription", 1, 1, "ACR/NEMA2C", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x0065, 0x0028, 0x0065, EVR_CS, "ACR_NEMA_2C_CompressionSequence", 1, -1, "ACR/NEMA2C", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x0066, 0x0028, 0x0066, EVR_AT, "ACR_NEMA_2C_CompressionStepPointers", 1, -1, "ACR/NEMA2C", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x0068, 0x0028, 0x0068, EVR_US, "ACR_NEMA_2C_RepeatInterval", 1, 1, "ACR/NEMA2C", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x0069, 0x0028, 0x0069, EVR_US, "ACR_NEMA_2C_BitsGrouped", 1, 1, "ACR/NEMA2C", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x0070, 0x0028, 0x0070, EVR_US, "ACR_NEMA_2C_PerimeterTable", 1, -1, "ACR/NEMA2C", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x0071, 0x0028, 0x0071, EVR_xs, "ACR_NEMA_2C_PerimeterValue", 1, 1, "ACR/NEMA2C", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x0080, 0x0028, 0x0080, EVR_US, "ACR_NEMA_2C_PredictorRows", 1, 1, "ACR/NEMA2C", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x0081, 0x0028, 0x0081, EVR_US, "ACR_NEMA_2C_PredictorColumns", 1, 1, "ACR/NEMA2C", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x0082, 0x0028, 0x0082, EVR_US, "ACR_NEMA_2C_PredictorConstants", 1, -1, "ACR/NEMA2C", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x0090, 0x0028, 0x0090, EVR_CS, "ACR_NEMA_2C_BlockedPixels", 1, 1, "ACR/NEMA2C", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x0091, 0x0028, 0x0091, EVR_US, "ACR_NEMA_2C_BlockRows", 1, 1, "ACR/NEMA2C", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x0092, 0x0028, 0x0092, EVR_US, "ACR_NEMA_2C_BlockColumns", 1, 1, "ACR/NEMA2C", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x0093, 0x0028, 0x0093, EVR_US, "ACR_NEMA_2C_RowOverlap", 1, 1, "ACR/NEMA2C", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x0094, 0x0028, 0x0094, EVR_US, "ACR_NEMA_2C_ColumnOverlap", 1, 1, "ACR/NEMA2C", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x0100, 0x0028, 0x0100, EVR_US, "BitsAllocated", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x0101, 0x0028, 0x0101, EVR_US, "BitsStored", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x0102, 0x0028, 0x0102, EVR_US, "HighBit", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x0103, 0x0028, 0x0103, EVR_US, "PixelRepresentation", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x0104, 0x0028, 0x0104, EVR_xs, "ACR_NEMA_SmallestValidPixelValue", 1, 1, "ACR/NEMA2", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x0105, 0x0028, 0x0105, EVR_xs, "ACR_NEMA_LargestValidPixelValue", 1, 1, "ACR/NEMA2", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x0106, 0x0028, 0x0106, EVR_xs, "SmallestImagePixelValue", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x0107, 0x0028, 0x0107, EVR_xs, "LargestImagePixelValue", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x0108, 0x0028, 0x0108, EVR_xs, "SmallestPixelValueInSeries", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x0109, 0x0028, 0x0109, EVR_xs, "LargestPixelValueInSeries", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x0110, 0x0028, 0x0110, EVR_xs, "RETIRED_SmallestImagePixelValueInPlane", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x0111, 0x0028, 0x0111, EVR_xs, "RETIRED_LargestImagePixelValueInPlane", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x0120, 0x0028, 0x0120, EVR_xs, "PixelPaddingValue", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x0121, 0x0028, 0x0121, EVR_xs, "PixelPaddingRangeLimit", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x0200, 0x0028, 0x0200, EVR_US, "ACR_NEMA_ImageLocation", 1, 1, "ACR/NEMA2", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x0300, 0x0028, 0x0300, EVR_CS, "QualityControlImage", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x0301, 0x0028, 0x0301, EVR_CS, "BurnedInAnnotation", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x0400, 0x0028, 0x0400, EVR_CS, "ACR_NEMA_2C_TransformLabel", 1, 1, "ACR/NEMA2C", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x0401, 0x0028, 0x0401, EVR_CS, "ACR_NEMA_2C_TransformVersionNumber", 1, 1, "ACR/NEMA2C", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x0402, 0x0028, 0x0402, EVR_US, "ACR_NEMA_2C_NumberOfTransformSteps", 1, 1, "ACR/NEMA2C", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x0403, 0x0028, 0x0403, EVR_CS, "ACR_NEMA_2C_SequenceOfCompressedData", 1, -1, "ACR/NEMA2C", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x0404, 0x0028, 0x0404, EVR_AT, "ACR_NEMA_2C_DetailsOfCoefficients", 1, -1, "ACR/NEMA2C", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x0410, 0x0028, 0x0410, EVR_US, "ACR_NEMA_2C_RowsForNthOrderCoefficients", 1, 1, "ACR/NEMA2C", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x0411, 0x0028, 0x0411, EVR_US, "ACR_NEMA_2C_ColumnsForNthOrderCoefficients", 1, 1, "ACR/NEMA2C", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x0412, 0x0028, 0x0412, EVR_CS, "ACR_NEMA_2C_CoefficientCoding", 1, -1, "ACR/NEMA2C", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x0413, 0x0028, 0x0413, EVR_AT, "ACR_NEMA_2C_CoefficientCodingPointers", 1, -1, "ACR/NEMA2C", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x0700, 0x0028, 0x0700, EVR_CS, "ACR_NEMA_2C_DCTLabel", 1, 1, "ACR/NEMA2C", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x0701, 0x0028, 0x0701, EVR_CS, "ACR_NEMA_2C_DataBlockDescription", 1, -1, "ACR/NEMA2C", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x0702, 0x0028, 0x0702, EVR_AT, "ACR_NEMA_2C_DataBlock", 1, -1, "ACR/NEMA2C", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x0710, 0x0028, 0x0710, EVR_US, "ACR_NEMA_2C_NormalizationFactorFormat", 1, 1, "ACR/NEMA2C", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x0720, 0x0028, 0x0720, EVR_US, "ACR_NEMA_2C_ZonalMapNumberFormat", 1, 1, "ACR/NEMA2C", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x0721, 0x0028, 0x0721, EVR_AT, "ACR_NEMA_2C_ZonalMapLocation", 1, -1, "ACR/NEMA2C", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x0722, 0x0028, 0x0722, EVR_US, "ACR_NEMA_2C_ZonalMapFormat", 1, 1, "ACR/NEMA2C", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x0730, 0x0028, 0x0730, EVR_US, "ACR_NEMA_2C_AdaptiveMapFormat", 1, 1, "ACR/NEMA2C", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x0740, 0x0028, 0x0740, EVR_US, "ACR_NEMA_2C_CodeNumberFormat", 1, 1, "ACR/NEMA2C", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x0800, 0x0028, 0x0800, EVR_CS, "ACR_NEMA_2C_CodeLabel", 1, -1, "ACR/NEMA2C", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x0802, 0x0028, 0x0802, EVR_US, "ACR_NEMA_2C_NumberOfTables", 1, 1, "ACR/NEMA2C", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x0803, 0x0028, 0x0803, EVR_AT, "ACR_NEMA_2C_CodeTableLocation", 1, -1, "ACR/NEMA2C", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x0804, 0x0028, 0x0804, EVR_US, "ACR_NEMA_2C_BitsForCodeWord", 1, 1, "ACR/NEMA2C", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x0808, 0x0028, 0x0808, EVR_AT, "ACR_NEMA_2C_ImageDataLocation", 1, -1, "ACR/NEMA2C", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x0a02, 0x0028, 0x0a02, EVR_CS, "PixelSpacingCalibrationType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x0a04, 0x0028, 0x0a04, EVR_LO, "PixelSpacingCalibrationDescription", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x1040, 0x0028, 0x1040, EVR_CS, "PixelIntensityRelationship", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x1041, 0x0028, 0x1041, EVR_SS, "PixelIntensityRelationshipSign", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x1050, 0x0028, 0x1050, EVR_DS, "WindowCenter", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x1051, 0x0028, 0x1051, EVR_DS, "WindowWidth", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x1052, 0x0028, 0x1052, EVR_DS, "RescaleIntercept", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x1053, 0x0028, 0x1053, EVR_DS, "RescaleSlope", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x1054, 0x0028, 0x1054, EVR_LO, "RescaleType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x1055, 0x0028, 0x1055, EVR_LO, "WindowCenterWidthExplanation", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x1056, 0x0028, 0x1056, EVR_CS, "VOILUTFunction", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x1080, 0x0028, 0x1080, EVR_CS, "ACR_NEMA_GrayScale", 1, 1, "ACR/NEMA2", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x1090, 0x0028, 0x1090, EVR_CS, "RecommendedViewingMode", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x1100, 0x0028, 0x1100, EVR_xs, "ACR_NEMA_GrayLookupTableDescriptor", 3, 3, "ACR/NEMA2", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x1101, 0x0028, 0x1101, EVR_xs, "RedPaletteColorLookupTableDescriptor", 3, 3, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x1102, 0x0028, 0x1102, EVR_xs, "GreenPaletteColorLookupTableDescriptor", 3, 3, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x1103, 0x0028, 0x1103, EVR_xs, "BluePaletteColorLookupTableDescriptor", 3, 3, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x1104, 0x0028, 0x1104, EVR_US, "AlphaPaletteColorLookupTableDescriptor", 3, 3, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x1111, 0x0028, 0x1111, EVR_xs, "RETIRED_LargeRedPaletteColorLookupTableDescriptor", 4, 4, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x1112, 0x0028, 0x1112, EVR_xs, "RETIRED_LargeGreenPaletteColorLookupTableDescriptor", 4, 4, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x1113, 0x0028, 0x1113, EVR_xs, "RETIRED_LargeBluePaletteColorLookupTableDescriptor", 4, 4, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x1199, 0x0028, 0x1199, EVR_UI, "PaletteColorLookupTableUID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x1200, 0x0028, 0x1200, EVR_xs, "ACR_NEMA_GrayLookupTableData", 1, -1, "ACR/NEMA2", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x1201, 0x0028, 0x1201, EVR_OW, "RedPaletteColorLookupTableData", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x1202, 0x0028, 0x1202, EVR_OW, "GreenPaletteColorLookupTableData", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x1203, 0x0028, 0x1203, EVR_OW, "BluePaletteColorLookupTableData", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x1204, 0x0028, 0x1204, EVR_OW, "AlphaPaletteColorLookupTableData", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x1211, 0x0028, 0x1211, EVR_OW, "RETIRED_LargeRedPaletteColorLookupTableData", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x1212, 0x0028, 0x1212, EVR_OW, "RETIRED_LargeGreenPaletteColorLookupTableData", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x1213, 0x0028, 0x1213, EVR_OW, "RETIRED_LargeBluePaletteColorLookupTableData", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x1214, 0x0028, 0x1214, EVR_UI, "RETIRED_LargePaletteColorLookupTableUID", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x1221, 0x0028, 0x1221, EVR_OW, "SegmentedRedPaletteColorLookupTableData", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x1222, 0x0028, 0x1222, EVR_OW, "SegmentedGreenPaletteColorLookupTableData", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x1223, 0x0028, 0x1223, EVR_OW, "SegmentedBluePaletteColorLookupTableData", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x1300, 0x0028, 0x1300, EVR_CS, "BreastImplantPresent", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x1350, 0x0028, 0x1350, EVR_CS, "PartialView", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x1351, 0x0028, 0x1351, EVR_ST, "PartialViewDescription", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x1352, 0x0028, 0x1352, EVR_SQ, "PartialViewCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x135a, 0x0028, 0x135a, EVR_CS, "SpatialLocationsPreserved", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x1401, 0x0028, 0x1401, EVR_SQ, "DataFrameAssignmentSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x1402, 0x0028, 0x1402, EVR_CS, "DataPathAssignment", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x1403, 0x0028, 0x1403, EVR_US, "BitsMappedToColorLookupTable", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x1404, 0x0028, 0x1404, EVR_SQ, "BlendingLUT1Sequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x1405, 0x0028, 0x1405, EVR_CS, "BlendingLUT1TransferFunction", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x1406, 0x0028, 0x1406, EVR_FD, "BlendingWeightConstant", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x1407, 0x0028, 0x1407, EVR_US, "BlendingLookupTableDescriptor", 3, 3, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x1408, 0x0028, 0x1408, EVR_OW, "BlendingLookupTableData", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x140b, 0x0028, 0x140b, EVR_SQ, "EnhancedPaletteColorLookupTableSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x140c, 0x0028, 0x140c, EVR_SQ, "BlendingLUT2Sequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x140d, 0x0028, 0x140d, EVR_CS, "BlendingLUT2TransferFunction", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x140e, 0x0028, 0x140e, EVR_CS, "DataPathID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x140f, 0x0028, 0x140f, EVR_CS, "RGBLUTTransferFunction", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x1410, 0x0028, 0x1410, EVR_CS, "AlphaLUTTransferFunction", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x2000, 0x0028, 0x2000, EVR_OB, "ICCProfile", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x2110, 0x0028, 0x2110, EVR_CS, "LossyImageCompression", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x2112, 0x0028, 0x2112, EVR_DS, "LossyImageCompressionRatio", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x2114, 0x0028, 0x2114, EVR_CS, "LossyImageCompressionMethod", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x3000, 0x0028, 0x3000, EVR_SQ, "ModalityLUTSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x3002, 0x0028, 0x3002, EVR_xs, "LUTDescriptor", 3, 3, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x3003, 0x0028, 0x3003, EVR_LO, "LUTExplanation", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x3004, 0x0028, 0x3004, EVR_LO, "ModalityLUTType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x3006, 0x0028, 0x3006, EVR_lt, "LUTData", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x3010, 0x0028, 0x3010, EVR_SQ, "VOILUTSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x3110, 0x0028, 0x3110, EVR_SQ, "SoftcopyVOILUTSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x4000, 0x0028, 0x4000, EVR_LT, "ACR_NEMA_ImagePresentationComments", 1, -1, "ACR/NEMA2", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x5000, 0x0028, 0x5000, EVR_SQ, "RETIRED_BiPlaneAcquisitionSequence", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x6010, 0x0028, 0x6010, EVR_US, "RepresentativeFrameNumber", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x6020, 0x0028, 0x6020, EVR_US, "FrameNumbersOfInterest", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x6022, 0x0028, 0x6022, EVR_LO, "FrameOfInterestDescription", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x6023, 0x0028, 0x6023, EVR_CS, "FrameOfInterestType", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x6030, 0x0028, 0x6030, EVR_US, "RETIRED_MaskPointers", 1, -1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x6040, 0x0028, 0x6040, EVR_US, "RWavePointer", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x6100, 0x0028, 0x6100, EVR_SQ, "MaskSubtractionSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x6101, 0x0028, 0x6101, EVR_CS, "MaskOperation", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x6102, 0x0028, 0x6102, EVR_US, "ApplicableFrameRange", 2, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x6110, 0x0028, 0x6110, EVR_US, "MaskFrameNumbers", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x6112, 0x0028, 0x6112, EVR_US, "ContrastFrameAveraging", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x6114, 0x0028, 0x6114, EVR_FL, "MaskSubPixelShift", 2, 2, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x6120, 0x0028, 0x6120, EVR_SS, "TIDOffset", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x6190, 0x0028, 0x6190, EVR_ST, "MaskOperationExplanation", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x7fe0, 0x0028, 0x7fe0, EVR_UT, "PixelDataProviderURL", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x9001, 0x0028, 0x9001, EVR_UL, "DataPointRows", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x9002, 0x0028, 0x9002, EVR_UL, "DataPointColumns", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x9003, 0x0028, 0x9003, EVR_CS, "SignalDomainColumns", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x9099, 0x0028, 0x9099, EVR_US, "RETIRED_LargestMonochromePixelValue", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x9108, 0x0028, 0x9108, EVR_CS, "DataRepresentation", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x9110, 0x0028, 0x9110, EVR_SQ, "PixelMeasuresSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x9132, 0x0028, 0x9132, EVR_SQ, "FrameVOILUTSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x9145, 0x0028, 0x9145, EVR_SQ, "PixelValueTransformationSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x9235, 0x0028, 0x9235, EVR_CS, "SignalDomainRows", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x9411, 0x0028, 0x9411, EVR_FL, "DisplayFilterPercentage", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x9415, 0x0028, 0x9415, EVR_SQ, "FramePixelShiftSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x9416, 0x0028, 0x9416, EVR_US, "SubtractionItemID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x9422, 0x0028, 0x9422, EVR_SQ, "PixelIntensityRelationshipLUTSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x9443, 0x0028, 0x9443, EVR_SQ, "FramePixelDataPropertiesSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x9444, 0x0028, 0x9444, EVR_CS, "GeometricalProperties", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x9445, 0x0028, 0x9445, EVR_FL, "GeometricMaximumDistortion", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x9446, 0x0028, 0x9446, EVR_CS, "ImageProcessingApplied", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x9454, 0x0028, 0x9454, EVR_CS, "MaskSelectionMode", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x9474, 0x0028, 0x9474, EVR_CS, "LUTFunction", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x9478, 0x0028, 0x9478, EVR_FL, "MaskVisibilityPercentage", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x9501, 0x0028, 0x9501, EVR_SQ, "PixelShiftSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x9502, 0x0028, 0x9502, EVR_SQ, "RegionPixelShiftSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x9503, 0x0028, 0x9503, EVR_SS, "VerticesOfTheRegion", 2, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x9505, 0x0028, 0x9505, EVR_SQ, "MultiFramePresentationSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x9506, 0x0028, 0x9506, EVR_US, "PixelShiftFrameRange", 2, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x9507, 0x0028, 0x9507, EVR_US, "LUTFrameRange", 2, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x9520, 0x0028, 0x9520, EVR_DS, "ImageToEquipmentMappingMatrix", 16, 16, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0028, 0x9537, 0x0028, 0x9537, EVR_CS, "EquipmentCoordinateSystemIdentification", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } #ifdef WITH_PRIVATE_TAGS , { 0x0029, 0x0000, 0x0029, 0x0000, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "AEGIS_DICOM_2.00" } , { 0x0029, 0x0000, 0x0029, 0x0000, EVR_SQ, "EdgeEnhancementSequence", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "CARDIO-D.R. 1.0" } , { 0x0029, 0x0000, 0x0029, 0x0000, EVR_DS, "Unknown", 2, 2, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0029, 0x0000, 0x0029, 0x0000, EVR_DS, "Unknown", 4, 4, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1" } , { 0x0029, 0x0000, 0x0029, 0x0000, EVR_LT, "ZoomID", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1;1" } , { 0x0029, 0x0000, 0x0029, 0x0000, EVR_LT, "SubtractionMaskID", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1;2" } , { 0x0029, 0x0000, 0x0029, 0x0000, EVR_LT, "ImageEnhancementID", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1;3" } , { 0x0029, 0x0000, 0x0029, 0x0000, EVR_UN, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-Private_CDS Release 1" } , { 0x0029, 0x0000, 0x0029, 0x0000, EVR_SL, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-Private_ICS Release 1;1" } , { 0x0029, 0x0000, 0x0029, 0x0000, EVR_FD, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-Private_ICS Release 1;2" } , { 0x0029, 0x0000, 0x0029, 0x0000, EVR_UI, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette Graphics Export V1.0" } , { 0x0029, 0x0001, 0x0029, 0x0001, EVR_US, "ConvolutionKernelSize", 2, 2, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "CARDIO-D.R. 1.0" } , { 0x0029, 0x0001, 0x0029, 0x0001, EVR_FD, "ImageCompressionFraction", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "INTELERAD MEDICAL SYSTEMS" } , { 0x0029, 0x0001, 0x0029, 0x0001, EVR_DS, "ZoomRectangle", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1;1" } , { 0x0029, 0x0001, 0x0029, 0x0001, EVR_LT, "ImageEnhancement", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1;3" } , { 0x0029, 0x0001, 0x0029, 0x0001, EVR_FD, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-Private_ICS Release 1;2" } , { 0x0029, 0x0002, 0x0029, 0x0002, EVR_DS, "ConvolutionKernelCoefficients", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "CARDIO-D.R. 1.0" } , { 0x0029, 0x0002, 0x0029, 0x0002, EVR_FD, "ImageQuality", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "INTELERAD MEDICAL SYSTEMS" } , { 0x0029, 0x0002, 0x0029, 0x0002, EVR_LT, "ConvolutionID", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1;3" } , { 0x0029, 0x0002, 0x0029, 0x0002, EVR_FD, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-Private_ICS Release 1;2" } , { 0x0029, 0x0002, 0x0029, 0x0002, EVR_SQ, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-Private_ICS Release 1;4" } , { 0x0029, 0x0003, 0x0029, 0x0003, EVR_DS, "EdgeEnhancementGain", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "CARDIO-D.R. 1.0" } , { 0x0029, 0x0003, 0x0029, 0x0003, EVR_FD, "ImageBytesTransferred", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "INTELERAD MEDICAL SYSTEMS" } , { 0x0029, 0x0003, 0x0029, 0x0003, EVR_DS, "ZoomFactor", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1;1" } , { 0x0029, 0x0003, 0x0029, 0x0003, EVR_LT, "ConvolutionType", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1;3" } , { 0x0029, 0x0003, 0x0029, 0x0003, EVR_SL, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-Private_ICS Release 1;2" } , { 0x0029, 0x0004, 0x0029, 0x0004, EVR_SL, "LowerRangeOfPixels", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_IMPS_01" } , { 0x0029, 0x0004, 0x0029, 0x0004, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0029, 0x0004, 0x0029, 0x0004, EVR_LT, "PhotometricInterpretation", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MED DISPLAY" } , { 0x0029, 0x0004, 0x0029, 0x0004, EVR_US, "ZoomFunction", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1;1" } , { 0x0029, 0x0004, 0x0029, 0x0004, EVR_UN, "MaskingFunction", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1;2" } , { 0x0029, 0x0004, 0x0029, 0x0004, EVR_LT, "ConvolutionKernelSizeID", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1;3" } , { 0x0029, 0x0004, 0x0029, 0x0004, EVR_SL, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-Private_ICS Release 1;2" } , { 0x0029, 0x0005, 0x0029, 0x0005, EVR_DS, "LowerRangeOfPixels", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_IMPS_01" } , { 0x0029, 0x0005, 0x0029, 0x0005, EVR_US, "ConvolutionKernelSize", 2, 2, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1;3" } , { 0x0029, 0x0005, 0x0029, 0x0005, EVR_FL, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-Private_ICS Release 1;1" } , { 0x0029, 0x0005, 0x0029, 0x0005, EVR_SL, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-Private_ICS Release 1;2" } , { 0x0029, 0x0006, 0x0029, 0x0006, EVR_DS, "LowerRangeOfPixels", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_IMPS_01" } , { 0x0029, 0x0006, 0x0029, 0x0006, EVR_US, "ConvolutionKernel", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1;3" } , { 0x0029, 0x0006, 0x0029, 0x0006, EVR_FL, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-Private_ICS Release 1;1" } , { 0x0029, 0x0007, 0x0029, 0x0007, EVR_SL, "LowerRangeOfPixels", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_IMPS_01" } , { 0x0029, 0x0008, 0x0029, 0x0008, EVR_SH, "LowerRangeOfPixels", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_IMPS_01" } , { 0x0029, 0x0008, 0x0029, 0x0008, EVR_IS, "NumberOfExposureResults", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "INTEGRIS 1.0" } , { 0x0029, 0x0008, 0x0029, 0x0008, EVR_CS, "CSAImageHeaderType", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CSA HEADER" } , { 0x0029, 0x0008, 0x0029, 0x0008, EVR_CS, "CSADataType", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CSA NON-IMAGE" } , { 0x0029, 0x0008, 0x0029, 0x0008, EVR_CS, "MedComHeaderType", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MEDCOM HEADER" } , { 0x0029, 0x0008, 0x0029, 0x0008, EVR_CS, "MEDCOMOOGType", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MEDCOM OOG" } , { 0x0029, 0x0008, 0x0029, 0x0008, EVR_SQ, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-Private_ICS Release 1" } , { 0x0029, 0x0009, 0x0029, 0x0009, EVR_SH, "LowerRangeOfPixels", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_IMPS_01" } , { 0x0029, 0x0009, 0x0029, 0x0009, EVR_LO, "CSAImageHeaderVersion", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CSA HEADER" } , { 0x0029, 0x0009, 0x0029, 0x0009, EVR_LO, "CSADataVersion", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CSA NON-IMAGE" } , { 0x0029, 0x0009, 0x0029, 0x0009, EVR_LO, "MedComHeaderVersion", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MEDCOM HEADER" } , { 0x0029, 0x0009, 0x0029, 0x0009, EVR_LO, "MEDCOMOOGVersion", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MEDCOM OOG" } , { 0x0029, 0x000a, 0x0029, 0x000a, EVR_SS, "LowerRangeOfPixels", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_IMPS_01" } , { 0x0029, 0x000c, 0x0029, 0x000c, EVR_UN, "ProprietaryMaskingParameters", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1;2" } , { 0x0029, 0x000c, 0x0029, 0x000c, EVR_DS, "EnhancementGain", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1;3" } , { 0x0029, 0x000e, 0x0029, 0x000e, EVR_CS, "ZoomEnableStatus", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1;1" } , { 0x0029, 0x000f, 0x0029, 0x000f, EVR_CS, "ZoomSelectStatus", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1;1" } , { 0x0029, 0x000f, 0x0029, 0x000f, EVR_SQ, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-Private_ICS Release 1" } , { 0x0029, 0x0010, 0x0029, 0x0010, EVR_LT, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "CAMTRONICS IP" } , { 0x0029, 0x0010, 0x0029, 0x0010, EVR_LT, "Commentline", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "CAMTRONICS" } , { 0x0029, 0x0010, 0x0029, 0x0010, EVR_SH, "J2cParameterType", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "INTELERAD MEDICAL SYSTEMS" } , { 0x0029, 0x0010, 0x0029, 0x0010, EVR_DS, "FPMin", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/LAST" } , { 0x0029, 0x0010, 0x0029, 0x0010, EVR_DS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0029, 0x0010, 0x0029, 0x0010, EVR_LT, "WindowStyle", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CM VA0 CMS" } , { 0x0029, 0x0010, 0x0029, 0x0010, EVR_OB, "CSAImageHeaderInfo", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CSA HEADER" } , { 0x0029, 0x0010, 0x0029, 0x0010, EVR_OB, "CSADataInfo", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CSA NON-IMAGE" } , { 0x0029, 0x0010, 0x0029, 0x0010, EVR_US, "RowsOfSubmatrix", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MED DISPLAY" } , { 0x0029, 0x0010, 0x0029, 0x0010, EVR_US, "ListOfGroupNumbers", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MED HG" } , { 0x0029, 0x0010, 0x0029, 0x0010, EVR_US, "ListOfGroupNumbers", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MED MG" } , { 0x0029, 0x0010, 0x0029, 0x0010, EVR_OB, "MedComHeaderInfo", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MEDCOM HEADER" } , { 0x0029, 0x0010, 0x0029, 0x0010, EVR_OB, "MEDCOMOOGInfo", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MEDCOM OOG" } , { 0x0029, 0x0010, 0x0029, 0x0010, EVR_LO, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-GV-CT Release 1" } , { 0x0029, 0x0010, 0x0029, 0x0010, EVR_SQ, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-Private_ICS Release 1" } , { 0x0029, 0x0011, 0x0029, 0x0011, EVR_US, "J2cPixelRepresentation", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "INTELERAD MEDICAL SYSTEMS" } , { 0x0029, 0x0011, 0x0029, 0x0011, EVR_DS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0029, 0x0011, 0x0029, 0x0011, EVR_LT, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CM VA0 CMS" } , { 0x0029, 0x0011, 0x0029, 0x0011, EVR_US, "ColumnsOfSubmatrix", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MED DISPLAY" } , { 0x0029, 0x0011, 0x0029, 0x0011, EVR_IS, "AnnotationName", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette Annot V1.0" } , { 0x0029, 0x0011, 0x0029, 0x0011, EVR_IS, "LineName", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette Line V1.0" } , { 0x0029, 0x0011, 0x0029, 0x0011, EVR_IS, "ROIName", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette ROI V1.0" } , { 0x0029, 0x0012, 0x0029, 0x0012, EVR_US, "J2cBitsAllocated", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "INTELERAD MEDICAL SYSTEMS" } , { 0x0029, 0x0012, 0x0029, 0x0012, EVR_LT, "AnnotationFont", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette Annot V1.0" } , { 0x0029, 0x0012, 0x0029, 0x0012, EVR_LT, "LineNameFont", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette Line V1.0" } , { 0x0029, 0x0012, 0x0029, 0x0012, EVR_LT, "ROINameFont", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette ROI V1.0" } , { 0x0029, 0x0013, 0x0029, 0x0013, EVR_US, "J2cPixelShiftValue", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "INTELERAD MEDICAL SYSTEMS" } , { 0x0029, 0x0013, 0x0029, 0x0013, EVR_LT, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CM VA0 CMS" } , { 0x0029, 0x0013, 0x0029, 0x0013, EVR_LT, "AnnotationTextForegroundColor", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette Annot V1.0" } , { 0x0029, 0x0013, 0x0029, 0x0013, EVR_UL, "LineNameDisplay", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette Line V1.0" } , { 0x0029, 0x0013, 0x0029, 0x0013, EVR_LT, "ROINormalColor", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette ROI V1.0" } , { 0x0029, 0x0013, 0x0029, 0x0013, EVR_UL, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette V1.0" } , { 0x0029, 0x0014, 0x0029, 0x0014, EVR_US, "J2cPlanarConfiguration", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "INTELERAD MEDICAL SYSTEMS" } , { 0x0029, 0x0014, 0x0029, 0x0014, EVR_LT, "AnnotationTextBackgroundColor", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette Annot V1.0" } , { 0x0029, 0x0014, 0x0029, 0x0014, EVR_LT, "LineNormalColor", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette Line V1.0" } , { 0x0029, 0x0014, 0x0029, 0x0014, EVR_UL, "ROIFillPattern", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette ROI V1.0" } , { 0x0029, 0x0014, 0x0029, 0x0014, EVR_UL, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette V1.0" } , { 0x0029, 0x0015, 0x0029, 0x0015, EVR_SL, "LowerRangeOfPixels", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_IMPS_01" } , { 0x0029, 0x0015, 0x0029, 0x0015, EVR_DS, "J2cRescaleIntercept", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "INTELERAD MEDICAL SYSTEMS" } , { 0x0029, 0x0015, 0x0029, 0x0015, EVR_LT, "ListOfShadowOwnerCodes", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MED HG" } , { 0x0029, 0x0015, 0x0029, 0x0015, EVR_LT, "ListOfShadowOwnerCodes", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MED MG" } , { 0x0029, 0x0015, 0x0029, 0x0015, EVR_UL, "AnnotationTextBackingMode", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette Annot V1.0" } , { 0x0029, 0x0015, 0x0029, 0x0015, EVR_UL, "LineType", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette Line V1.0" } , { 0x0029, 0x0015, 0x0029, 0x0015, EVR_UL, "ROIBpSeg", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette ROI V1.0" } , { 0x0029, 0x0016, 0x0029, 0x0016, EVR_SL, "LowerRangeOfPixels", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_IMPS_01" } , { 0x0029, 0x0016, 0x0029, 0x0016, EVR_UL, "AnnotationTextJustification", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette Annot V1.0" } , { 0x0029, 0x0016, 0x0029, 0x0016, EVR_UL, "LineThickness", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette Line V1.0" } , { 0x0029, 0x0016, 0x0029, 0x0016, EVR_UN, "ROIBpSegPairs", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette ROI V1.0" } , { 0x0029, 0x0017, 0x0029, 0x0017, EVR_SL, "LowerRangeOfPixels", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_IMPS_01" } , { 0x0029, 0x0017, 0x0029, 0x0017, EVR_UL, "AnnotationTextLocation", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette Annot V1.0" } , { 0x0029, 0x0017, 0x0029, 0x0017, EVR_UL, "LineStyle", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette Line V1.0" } , { 0x0029, 0x0017, 0x0029, 0x0017, EVR_UL, "ROISeedSpace", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette ROI V1.0" } , { 0x0029, 0x0017, 0x0029, 0x0017, EVR_UN, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette V1.0" } , { 0x0029, 0x0018, 0x0029, 0x0018, EVR_SL, "UpperRangeOfPixels", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_IMPS_01" } , { 0x0029, 0x0018, 0x0029, 0x0018, EVR_CS, "CSASeriesHeaderType", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CSA HEADER" } , { 0x0029, 0x0018, 0x0029, 0x0018, EVR_LT, "AnnotationTextString", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette Annot V1.0" } , { 0x0029, 0x0018, 0x0029, 0x0018, EVR_UL, "LineDashLength", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette Line V1.0" } , { 0x0029, 0x0018, 0x0029, 0x0018, EVR_UN, "ROISeeds", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette ROI V1.0" } , { 0x0029, 0x0018, 0x0029, 0x0018, EVR_UN, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette V1.0" } , { 0x0029, 0x0019, 0x0029, 0x0019, EVR_LO, "CSASeriesHeaderVersion", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CSA HEADER" } , { 0x0029, 0x0019, 0x0029, 0x0019, EVR_UL, "AnnotationTextAttachMode", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette Annot V1.0" } , { 0x0029, 0x0019, 0x0029, 0x0019, EVR_UL, "LineInteractivity", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette Line V1.0" } , { 0x0029, 0x0019, 0x0029, 0x0019, EVR_UL, "ROILineThickness", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette ROI V1.0" } , { 0x0029, 0x0019, 0x0029, 0x0019, EVR_UL, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette V1.0" } , { 0x0029, 0x001a, 0x0029, 0x001a, EVR_SL, "LengthOfTotalHeaderInBytes", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_IMPS_01" } , { 0x0029, 0x001a, 0x0029, 0x001a, EVR_UN, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette V1.0" } , { 0x0029, 0x001b, 0x0029, 0x001b, EVR_SQ, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-Private_ICS Release 1" } , { 0x0029, 0x001b, 0x0029, 0x001b, EVR_UL, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette V1.0" } , { 0x0029, 0x001c, 0x0029, 0x001c, EVR_SQ, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-Private_ICS Release 1" } , { 0x0029, 0x001c, 0x0029, 0x001c, EVR_UL, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette V1.0" } , { 0x0029, 0x001d, 0x0029, 0x001d, EVR_UN, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette V1.0" } , { 0x0029, 0x001e, 0x0029, 0x001e, EVR_CS, "SubtractionMaskEnableStatus", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1;2" } , { 0x0029, 0x001e, 0x0029, 0x001e, EVR_CS, "ImageEnhancementEnableStatus", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1;3" } , { 0x0029, 0x001e, 0x0029, 0x001e, EVR_UN, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette V1.0" } , { 0x0029, 0x001f, 0x0029, 0x001f, EVR_CS, "SubtractionMaskSelectStatus", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1;2" } , { 0x0029, 0x001f, 0x0029, 0x001f, EVR_CS, "ImageEnhancementSelectStatus", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1;3" } , { 0x0029, 0x0020, 0x0029, 0x0020, EVR_UN, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "CAMTRONICS IP" } , { 0x0029, 0x0020, 0x0029, 0x0020, EVR_DS, "EdgeEnhancementCoefficient", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "CAMTRONICS" } , { 0x0029, 0x0020, 0x0029, 0x0020, EVR_CS, "ImageScanningDirection", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0029, 0x0020, 0x0029, 0x0020, EVR_LO, "PixelDataMD5SumPerFrame", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "INTELERAD MEDICAL SYSTEMS" } , { 0x0029, 0x0020, 0x0029, 0x0020, EVR_DS, "FPMax", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/LAST" } , { 0x0029, 0x0020, 0x0029, 0x0020, EVR_LO, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0029, 0x0020, 0x0029, 0x0020, EVR_LT, "PixelQualityCode", 3, 3, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CM VA0 CMS" } , { 0x0029, 0x0020, 0x0029, 0x0020, EVR_OB, "CSASeriesHeaderInfo", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CSA HEADER" } , { 0x0029, 0x0020, 0x0029, 0x0020, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MED DISPLAY" } , { 0x0029, 0x0020, 0x0029, 0x0020, EVR_US, "ListOfElementNumbers", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MED HG" } , { 0x0029, 0x0020, 0x0029, 0x0020, EVR_US, "ListOfElementNumbers", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MED MG" } , { 0x0029, 0x0020, 0x0029, 0x0020, EVR_OB, "MedComHistoryInformation", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MEDCOM HEADER" } , { 0x0029, 0x0020, 0x0029, 0x0020, EVR_DS, "PixelAspectRatio", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1" } , { 0x0029, 0x0020, 0x0029, 0x0020, EVR_FL, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-Private_ICS Release 1;1" } , { 0x0029, 0x0020, 0x0029, 0x0020, EVR_UL, "AnnotationTextCursorMode", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette Annot V1.0" } , { 0x0029, 0x0020, 0x0029, 0x0020, EVR_LT, "LineMeasurementColor", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette Line V1.0" } , { 0x0029, 0x0020, 0x0029, 0x0020, EVR_UL, "ROILineStyle", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette ROI V1.0" } , { 0x0029, 0x0021, 0x0029, 0x0021, EVR_US, "HistogramPercentileLabels", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "INTELERAD MEDICAL SYSTEMS" } , { 0x0029, 0x0021, 0x0029, 0x0021, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MED DISPLAY" } , { 0x0029, 0x0021, 0x0029, 0x0021, EVR_SQ, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-Private_ICS Release 1" } , { 0x0029, 0x0021, 0x0029, 0x0021, EVR_FL, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-Private_ICS Release 1;1" } , { 0x0029, 0x0021, 0x0029, 0x0021, EVR_UL, "AnnotationTextShadowOffsetX", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette Annot V1.0" } , { 0x0029, 0x0021, 0x0029, 0x0021, EVR_LT, "LineMeasurementFont", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette Line V1.0" } , { 0x0029, 0x0021, 0x0029, 0x0021, EVR_UL, "ROILineDashLength", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette ROI V1.0" } , { 0x0029, 0x0021, 0x0029, 0x0021, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette V1.0" } , { 0x0029, 0x0022, 0x0029, 0x0022, EVR_FD, "HistogramPercentileValues", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "INTELERAD MEDICAL SYSTEMS" } , { 0x0029, 0x0022, 0x0029, 0x0022, EVR_IS, "PixelQualityValue", 3, 3, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CM VA0 CMS" } , { 0x0029, 0x0022, 0x0029, 0x0022, EVR_UL, "AnnotationTextShadowOffsetY", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette Annot V1.0" } , { 0x0029, 0x0022, 0x0029, 0x0022, EVR_UL, "LineMeasurementDashLength", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette Line V1.0" } , { 0x0029, 0x0022, 0x0029, 0x0022, EVR_UL, "ROIInteractivity", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette ROI V1.0" } , { 0x0029, 0x0022, 0x0029, 0x0022, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette V1.0" } , { 0x0029, 0x0023, 0x0029, 0x0023, EVR_LT, "AnnotationLineColor", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette Annot V1.0" } , { 0x0029, 0x0023, 0x0029, 0x0023, EVR_UL, "LinePointSpace", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette Line V1.0" } , { 0x0029, 0x0023, 0x0029, 0x0023, EVR_UL, "ROINamePosition", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette ROI V1.0" } , { 0x0029, 0x0023, 0x0029, 0x0023, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette V1.0" } , { 0x0029, 0x0024, 0x0029, 0x0024, EVR_UL, "AnnotationLineThickness", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette Annot V1.0" } , { 0x0029, 0x0024, 0x0029, 0x0024, EVR_FD, "LinePoints", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette Line V1.0" } , { 0x0029, 0x0024, 0x0029, 0x0024, EVR_UL, "ROINameDisplay", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette ROI V1.0" } , { 0x0029, 0x0024, 0x0029, 0x0024, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette V1.0" } , { 0x0029, 0x0025, 0x0029, 0x0025, EVR_LO, "ProcessedPixelDataQuality", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1" } , { 0x0029, 0x0025, 0x0029, 0x0025, EVR_UL, "AnnotationLineType", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette Annot V1.0" } , { 0x0029, 0x0025, 0x0029, 0x0025, EVR_UL, "LineControlPointSize", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette Line V1.0" } , { 0x0029, 0x0025, 0x0029, 0x0025, EVR_LT, "ROILabel", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette ROI V1.0" } , { 0x0029, 0x0025, 0x0029, 0x0025, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette V1.0" } , { 0x0029, 0x0026, 0x0029, 0x0026, EVR_SS, "VersionOfHeaderStructure", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_IMPS_01" } , { 0x0029, 0x0026, 0x0029, 0x0026, EVR_UL, "AnnotationLineStyle", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette Annot V1.0" } , { 0x0029, 0x0026, 0x0029, 0x0026, EVR_UL, "LineControlPointSpace", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette Line V1.0" } , { 0x0029, 0x0026, 0x0029, 0x0026, EVR_UL, "ROIShape", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette ROI V1.0" } , { 0x0029, 0x0027, 0x0029, 0x0027, EVR_UL, "AnnotationLineDashLength", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette Annot V1.0" } , { 0x0029, 0x0027, 0x0029, 0x0027, EVR_FD, "LineControlPoints", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette Line V1.0" } , { 0x0029, 0x0027, 0x0029, 0x0027, EVR_FD, "ROIShapeTilt", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette ROI V1.0" } , { 0x0029, 0x0027, 0x0029, 0x0027, EVR_UN, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette V1.0" } , { 0x0029, 0x0028, 0x0029, 0x0028, EVR_UL, "AnnotationLineAttachMode", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette Annot V1.0" } , { 0x0029, 0x0028, 0x0029, 0x0028, EVR_LT, "LineLabel", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette Line V1.0" } , { 0x0029, 0x0028, 0x0029, 0x0028, EVR_UL, "ROIShapePointsCount", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette ROI V1.0" } , { 0x0029, 0x0028, 0x0029, 0x0028, EVR_UN, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette V1.0" } , { 0x0029, 0x0029, 0x0029, 0x0029, EVR_UL, "AnnotationLinePointCount", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette Annot V1.0" } , { 0x0029, 0x0029, 0x0029, 0x0029, EVR_UL, "LineDontSave", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette Line V1.0" } , { 0x0029, 0x0029, 0x0029, 0x0029, EVR_UL, "ROIShapePointsSpace", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette ROI V1.0" } , { 0x0029, 0x0029, 0x0029, 0x0029, EVR_UN, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette V1.0" } , { 0x0029, 0x0030, 0x0029, 0x0030, EVR_UN, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "CAMTRONICS IP" } , { 0x0029, 0x0030, 0x0029, 0x0030, EVR_CS, "ExtendedReadingSizeValue", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0029, 0x0030, 0x0029, 0x0030, EVR_DS, "ScaledMinimum", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/LAST" } , { 0x0029, 0x0030, 0x0029, 0x0030, EVR_US, "ListOfTotalDisplayLength", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MED HG" } , { 0x0029, 0x0030, 0x0029, 0x0030, EVR_US, "ListOfTotalDisplayLength", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MED MG" } , { 0x0029, 0x0030, 0x0029, 0x0030, EVR_LT, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1" } , { 0x0029, 0x0030, 0x0029, 0x0030, EVR_UL, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-GV-CT Release 1" } , { 0x0029, 0x0030, 0x0029, 0x0030, EVR_FD, "AnnotationLinePoints", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette Annot V1.0" } , { 0x0029, 0x0030, 0x0029, 0x0030, EVR_FD, "ROIShapePoints", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette ROI V1.0" } , { 0x0029, 0x0030, 0x0029, 0x0030, EVR_UN, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette V1.0" } , { 0x0029, 0x0031, 0x0029, 0x0031, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "DIGISCAN IMAGE" } , { 0x0029, 0x0031, 0x0029, 0x0031, EVR_DS, "Unknown", 2, 2, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0029, 0x0031, 0x0029, 0x0031, EVR_LO, "PMTFInformation1", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MEDCOM HEADER" } , { 0x0029, 0x0031, 0x0029, 0x0031, EVR_UL, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-GV-CT Release 1" } , { 0x0029, 0x0031, 0x0029, 0x0031, EVR_UL, "AnnotationLineControlSize", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette Annot V1.0" } , { 0x0029, 0x0031, 0x0029, 0x0031, EVR_UL, "ROIShapeControlPointsCount", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette ROI V1.0" } , { 0x0029, 0x0032, 0x0029, 0x0032, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "DIGISCAN IMAGE" } , { 0x0029, 0x0032, 0x0029, 0x0032, EVR_DS, "Unknown", 2, 2, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0029, 0x0032, 0x0029, 0x0032, EVR_UL, "PMTFInformation2", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MEDCOM HEADER" } , { 0x0029, 0x0032, 0x0029, 0x0032, EVR_UL, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-GV-CT Release 1" } , { 0x0029, 0x0032, 0x0029, 0x0032, EVR_LT, "AnnotationMarkerColor", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette Annot V1.0" } , { 0x0029, 0x0032, 0x0029, 0x0032, EVR_UL, "ROIShapeControlPointsSpace", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette ROI V1.0" } , { 0x0029, 0x0033, 0x0029, 0x0033, EVR_LT, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "DIGISCAN IMAGE" } , { 0x0029, 0x0033, 0x0029, 0x0033, EVR_UL, "PMTFInformation3", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MEDCOM HEADER" } , { 0x0029, 0x0033, 0x0029, 0x0033, EVR_UL, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-GV-CT Release 1" } , { 0x0029, 0x0033, 0x0029, 0x0033, EVR_UL, "AnnotationMarkerType", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette Annot V1.0" } , { 0x0029, 0x0033, 0x0029, 0x0033, EVR_FD, "ROIShapeControlPoints", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette ROI V1.0" } , { 0x0029, 0x0034, 0x0029, 0x0034, EVR_LT, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "DIGISCAN IMAGE" } , { 0x0029, 0x0034, 0x0029, 0x0034, EVR_US, "MagnificationReductionRatio", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0029, 0x0034, 0x0029, 0x0034, EVR_SL, "AdvantageCompOverflow", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_IMPS_01" } , { 0x0029, 0x0034, 0x0029, 0x0034, EVR_CS, "PMTFInformation4", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MEDCOM HEADER" } , { 0x0029, 0x0034, 0x0029, 0x0034, EVR_UL, "AnnotationMarkerSize", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette Annot V1.0" } , { 0x0029, 0x0034, 0x0029, 0x0034, EVR_UL, "ROIDontSave", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette ROI V1.0" } , { 0x0029, 0x0035, 0x0029, 0x0035, EVR_SL, "AdvantageCompUnderflow", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_IMPS_01" } , { 0x0029, 0x0035, 0x0029, 0x0035, EVR_UL, "PMTFInformation5", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MEDCOM HEADER" } , { 0x0029, 0x0035, 0x0029, 0x0035, EVR_FD, "AnnotationMarkerLocation", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette Annot V1.0" } , { 0x0029, 0x0036, 0x0029, 0x0036, EVR_UL, "AnnotationMarkerAttachMode", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette Annot V1.0" } , { 0x0029, 0x0037, 0x0029, 0x0037, EVR_LT, "AnnotationGeomColor", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette Annot V1.0" } , { 0x0029, 0x0038, 0x0029, 0x0038, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1" } , { 0x0029, 0x0038, 0x0029, 0x0038, EVR_UL, "AnnotationGeomThickness", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette Annot V1.0" } , { 0x0029, 0x0039, 0x0029, 0x0039, EVR_UL, "AnnotationGeomLineStyle", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette Annot V1.0" } , { 0x0029, 0x0040, 0x0029, 0x0040, EVR_UN, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "CAMTRONICS IP" } , { 0x0029, 0x0040, 0x0029, 0x0040, EVR_DS, "ScaledMaximum", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/LAST" } , { 0x0029, 0x0040, 0x0029, 0x0040, EVR_LT, "ListOfDisplayPrefix", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MED HG" } , { 0x0029, 0x0040, 0x0029, 0x0040, EVR_LT, "ListOfDisplayPrefix", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MED MG" } , { 0x0029, 0x0040, 0x0029, 0x0040, EVR_SQ, "ApplicationHeaderSequence", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MEDCOM HEADER" } , { 0x0029, 0x0040, 0x0029, 0x0040, EVR_LT, "MagnifyingGlassID", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1;1" } , { 0x0029, 0x0040, 0x0029, 0x0040, EVR_UL, "AnnotationGeomDashLength", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette Annot V1.0" } , { 0x0029, 0x0041, 0x0029, 0x0041, EVR_CS, "ApplicationHeaderType", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MEDCOM HEADER" } , { 0x0029, 0x0041, 0x0029, 0x0041, EVR_DS, "MagnifyingGlassRectangle", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1;1" } , { 0x0029, 0x0041, 0x0029, 0x0041, EVR_UL, "AnnotationGeomFillPattern", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette Annot V1.0" } , { 0x0029, 0x0041, 0x0029, 0x0041, EVR_SQ, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette Sequence Ids V1.0" } , { 0x0029, 0x0042, 0x0029, 0x0042, EVR_LO, "ApplicationHeaderID", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MEDCOM HEADER" } , { 0x0029, 0x0042, 0x0029, 0x0042, EVR_UL, "AnnotationInteractivity", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette Annot V1.0" } , { 0x0029, 0x0042, 0x0029, 0x0042, EVR_SQ, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette Sequence Ids V1.0" } , { 0x0029, 0x0043, 0x0029, 0x0043, EVR_LO, "ApplicationHeaderVersion", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MEDCOM HEADER" } , { 0x0029, 0x0043, 0x0029, 0x0043, EVR_DS, "MagnifyingGlassFactor", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1;1" } , { 0x0029, 0x0043, 0x0029, 0x0043, EVR_SQ, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-Private_ICS Release 1" } , { 0x0029, 0x0043, 0x0029, 0x0043, EVR_FD, "AnnotationArrowLength", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette Annot V1.0" } , { 0x0029, 0x0043, 0x0029, 0x0043, EVR_SQ, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette Sequence Ids V1.0" } , { 0x0029, 0x0044, 0x0029, 0x0044, EVR_CS, "LineDensityCode", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0029, 0x0044, 0x0029, 0x0044, EVR_OB, "ApplicationHeaderInfo", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MEDCOM HEADER" } , { 0x0029, 0x0044, 0x0029, 0x0044, EVR_US, "MagnifyingGlassFunction", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1;1" } , { 0x0029, 0x0044, 0x0029, 0x0044, EVR_SQ, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-Private_ICS Release 1" } , { 0x0029, 0x0044, 0x0029, 0x0044, EVR_FD, "AnnotationArrowAngle", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette Annot V1.0" } , { 0x0029, 0x0045, 0x0029, 0x0045, EVR_UL, "AnnotationDontSave", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette Annot V1.0" } , { 0x0029, 0x004c, 0x0029, 0x004c, EVR_SQ, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-Private_ICS Release 1" } , { 0x0029, 0x004e, 0x0029, 0x004e, EVR_CS, "MagnifyingGlassEnableStatus", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1;1" } , { 0x0029, 0x004f, 0x0029, 0x004f, EVR_CS, "MagnifyingGlassSelectStatus", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1;1" } , { 0x0029, 0x0050, 0x0029, 0x0050, EVR_LT, "SceneText", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "CAMTRONICS" } , { 0x0029, 0x0050, 0x0029, 0x0050, EVR_CS, "DataCompressionCode", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x0029, 0x0050, 0x0029, 0x0050, EVR_DS, "WindowMinimum", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/LAST" } , { 0x0029, 0x0050, 0x0029, 0x0050, EVR_LT, "ArchiveCode", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CM VA0 CMS" } , { 0x0029, 0x0050, 0x0029, 0x0050, EVR_US, "OriginOfSubmatrix", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MED DISPLAY" } , { 0x0029, 0x0050, 0x0029, 0x0050, EVR_LT, "ListOfDisplayPostfix", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MED HG" } , { 0x0029, 0x0050, 0x0029, 0x0050, EVR_LT, "ListOfDisplayPostfix", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MED MG" } , { 0x0029, 0x0050, 0x0029, 0x0050, EVR_LO, "WorkflowControlFlags", 8, 8, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MEDCOM HEADER" } , { 0x0029, 0x0050, 0x0029, 0x0050, EVR_CS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-Private_ICS Release 1;5" } , { 0x0029, 0x0051, 0x0029, 0x0051, EVR_LT, "ExposureCode", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CM VA0 CMS" } , { 0x0029, 0x0051, 0x0029, 0x0051, EVR_CS, "ArchiveManagementFlagKeepOnline", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MEDCOM HEADER" } , { 0x0029, 0x0052, 0x0029, 0x0052, EVR_LT, "SortCode", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CM VA0 CMS" } , { 0x0029, 0x0052, 0x0029, 0x0052, EVR_CS, "ArchiveManagementFlagDoNotArchive", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MEDCOM HEADER" } , { 0x0029, 0x0052, 0x0029, 0x0052, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette V1.0" } , { 0x0029, 0x0053, 0x0029, 0x0053, EVR_LT, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CM VA0 CMS" } , { 0x0029, 0x0053, 0x0029, 0x0053, EVR_CS, "ImageLocationStatus", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MEDCOM HEADER" } , { 0x0029, 0x0053, 0x0029, 0x0053, EVR_LT, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette V1.0" } , { 0x0029, 0x0054, 0x0029, 0x0054, EVR_DS, "EstimatedRetrieveTime", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MEDCOM HEADER" } , { 0x0029, 0x0054, 0x0029, 0x0054, EVR_UN, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette V1.0" } , { 0x0029, 0x0055, 0x0029, 0x0055, EVR_DS, "DataSizeOfRetrievedImages", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MEDCOM HEADER" } , { 0x0029, 0x0055, 0x0029, 0x0055, EVR_CS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-Private_ICS Release 1;5" } , { 0x0029, 0x0055, 0x0029, 0x0055, EVR_LT, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette V1.0" } , { 0x0029, 0x0056, 0x0029, 0x0056, EVR_LT, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette V1.0" } , { 0x0029, 0x0057, 0x0029, 0x0057, EVR_UN, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Silhouette V1.0" } , { 0x0029, 0x0060, 0x0029, 0x0060, EVR_LT, "ImageText", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "CAMTRONICS" } , { 0x0029, 0x0060, 0x0029, 0x0060, EVR_DS, "WindowMaximum", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/LAST" } , { 0x0029, 0x0060, 0x0029, 0x0060, EVR_LT, "Splash", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CM VA0 CMS" } , { 0x0029, 0x0060, 0x0029, 0x0060, EVR_US, "ListOfTextPosition", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MED HG" } , { 0x0029, 0x0060, 0x0029, 0x0060, EVR_US, "ListOfTextPosition", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MED MG" } , { 0x0029, 0x0060, 0x0029, 0x0060, EVR_LO, "SeriesWorkflowStatus", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MEDCOM HEADER2" } , { 0x0029, 0x0060, 0x0029, 0x0060, EVR_LT, "CompressionAlgorithm", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI RELEASE 1" } , { 0x0029, 0x0060, 0x0029, 0x0060, EVR_LT, "CompressionAlgorithm", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI Release 1" } , { 0x0029, 0x0060, 0x0029, 0x0060, EVR_LT, "CompressionAlgorithm", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI" } , { 0x0029, 0x0060, 0x0029, 0x0060, EVR_LT, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1" } , { 0x0029, 0x0061, 0x0029, 0x0061, EVR_IS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/LAST" } , { 0x0029, 0x0061, 0x0029, 0x0061, EVR_LT, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1" } , { 0x0029, 0x0067, 0x0029, 0x0067, EVR_LT, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1" } , { 0x0029, 0x0067, 0x0029, 0x0067, EVR_LO, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-Private_ICS Release 1" } , { 0x0029, 0x0068, 0x0029, 0x0068, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-Private_ICS Release 1" } , { 0x0029, 0x006a, 0x0029, 0x006a, EVR_LO, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-Private_ICS Release 1" } , { 0x0029, 0x006b, 0x0029, 0x006b, EVR_US, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-Private_ICS Release 1" } , { 0x0029, 0x0070, 0x0029, 0x0070, EVR_IS, "PixelShiftHorizontal", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "CAMTRONICS" } , { 0x0029, 0x0070, 0x0029, 0x0070, EVR_IS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "ISG shadow" } , { 0x0029, 0x0070, 0x0029, 0x0070, EVR_DS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/LAST" } , { 0x0029, 0x0070, 0x0029, 0x0070, EVR_LT, "ListOfTextConcatenation", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MED HG" } , { 0x0029, 0x0070, 0x0029, 0x0070, EVR_LT, "ListOfTextConcatenation", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MED MG" } , { 0x0029, 0x0070, 0x0029, 0x0070, EVR_LT, "WindowID", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1" } , { 0x0029, 0x0071, 0x0029, 0x0071, EVR_DS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/LAST" } , { 0x0029, 0x0071, 0x0029, 0x0071, EVR_CS, "VideoInvertSubtracted", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1" } , { 0x0029, 0x0072, 0x0029, 0x0072, EVR_IS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/LAST" } , { 0x0029, 0x0072, 0x0029, 0x0072, EVR_CS, "VideoInvertNonsubtracted", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1" } , { 0x0029, 0x0077, 0x0029, 0x0077, EVR_CS, "WindowSelectStatus", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1" } , { 0x0029, 0x0078, 0x0029, 0x0078, EVR_LT, "ECGDisplayPrintingID", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1" } , { 0x0029, 0x0079, 0x0029, 0x0079, EVR_CS, "ECGDisplayPrinting", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1" } , { 0x0029, 0x007e, 0x0029, 0x007e, EVR_CS, "ECGDisplayPrintingEnableStatus", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1" } , { 0x0029, 0x007f, 0x0029, 0x007f, EVR_CS, "ECGDisplayPrintingSelectStatus", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1" } , { 0x0029, 0x0080, 0x0029, 0x0080, EVR_IS, "PixelShiftVertical", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "CAMTRONICS" } , { 0x0029, 0x0080, 0x0029, 0x0080, EVR_IS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "ISG shadow" } , { 0x0029, 0x0080, 0x0029, 0x0080, EVR_IS, "ViewCenter", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/LAST" } , { 0x0029, 0x0080, 0x0029, 0x0080, EVR_LT, "PhysiologicalDisplayID", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1" } , { 0x0029, 0x0080, 0x0029, 0x0080, EVR_LO, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-GV-CT Release 1" } , { 0x0029, 0x0081, 0x0029, 0x0081, EVR_IS, "ViewSize", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/LAST" } , { 0x0029, 0x0081, 0x0029, 0x0081, EVR_US, "PreferredPhysiologicalChannelDisplay", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1" } , { 0x0029, 0x0082, 0x0029, 0x0082, EVR_IS, "ViewZoom", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/LAST" } , { 0x0029, 0x0083, 0x0029, 0x0083, EVR_IS, "ViewTransform", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/LAST" } , { 0x0029, 0x008e, 0x0029, 0x008e, EVR_CS, "PhysiologicalDisplayEnableStatus", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1" } , { 0x0029, 0x008f, 0x0029, 0x008f, EVR_CS, "PhysiologicalDisplaySelectStatus", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1" } , { 0x0029, 0x0090, 0x0029, 0x0090, EVR_IS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "CAMTRONICS" } , { 0x0029, 0x0090, 0x0029, 0x0090, EVR_IS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "ISG shadow" } , { 0x0029, 0x0090, 0x0029, 0x0090, EVR_LO, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-GV-CT Release 1" } , { 0x0029, 0x0099, 0x0029, 0x0099, EVR_LT, "ShutterType", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MED DISPLAY" } , { 0x0029, 0x009a, 0x0029, 0x009a, EVR_SQ, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-Private_ICS Release 1;4" } , { 0x0029, 0x00a0, 0x0029, 0x00a0, EVR_US, "RowsOfRectangularShutter", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MED DISPLAY" } , { 0x0029, 0x00a1, 0x0029, 0x00a1, EVR_US, "ColumnsOfRectangularShutter", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MED DISPLAY" } , { 0x0029, 0x00a2, 0x0029, 0x00a2, EVR_US, "OriginOfRectangularShutter", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MED DISPLAY" } , { 0x0029, 0x00b0, 0x0029, 0x00b0, EVR_US, "RadiusOfCircularShutter", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MED DISPLAY" } , { 0x0029, 0x00b2, 0x0029, 0x00b2, EVR_US, "OriginOfCircularShutter", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MED DISPLAY" } , { 0x0029, 0x00c0, 0x0029, 0x00c0, EVR_LT, "FunctionalShutterID", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1" } , { 0x0029, 0x00c0, 0x0029, 0x00c0, EVR_SQ, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-Private_ICS Release 1;3" } , { 0x0029, 0x00c1, 0x0029, 0x00c1, EVR_US, "ContourOfIrregularShutter", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MED DISPLAY" } , { 0x0029, 0x00c1, 0x0029, 0x00c1, EVR_US, "FieldOfShutter", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1" } , { 0x0029, 0x00c1, 0x0029, 0x00c1, EVR_SQ, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-Private_ICS Release 1;3" } , { 0x0029, 0x00c2, 0x0029, 0x00c2, EVR_SQ, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-Private_ICS Release 1;3" } , { 0x0029, 0x00c3, 0x0029, 0x00c3, EVR_IS, "ScanResolution", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0029, 0x00c3, 0x0029, 0x00c3, EVR_SQ, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-Private_ICS Release 1;3" } , { 0x0029, 0x00c4, 0x0029, 0x00c4, EVR_IS, "FieldOfView", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0029, 0x00c4, 0x0029, 0x00c4, EVR_SQ, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-Private_ICS Release 1;3" } , { 0x0029, 0x00c5, 0x0029, 0x00c5, EVR_LT, "FieldOfShutterRectangle", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1" } , { 0x0029, 0x00c5, 0x0029, 0x00c5, EVR_SQ, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-Private_ICS Release 1;3" } , { 0x0029, 0x00cd, 0x0029, 0x00cd, EVR_SQ, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-Private_ICS Release 1;1" } , { 0x0029, 0x00ce, 0x0029, 0x00ce, EVR_CS, "ShutterEnableStatus", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1" } , { 0x0029, 0x00cf, 0x0029, 0x00cf, EVR_CS, "ShutterSelectStatus", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1" } , { 0x0029, 0x00d0, 0x0029, 0x00d0, EVR_IS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-GV-CT Release 1" } , { 0x0029, 0x00d1, 0x0029, 0x00d1, EVR_IS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-GV-CT Release 1" } , { 0x0029, 0x00d5, 0x0029, 0x00d5, EVR_LT, "SliceThickness", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/PART" } , { 0x0029, 0x00e0, 0x0029, 0x00e0, EVR_SQ, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P-Private_ICS Release 1;4" } , { 0x0029, 0x1010, 0x0029, 0x1010, EVR_OB, "OriginalMeasuringData", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "OCULUS Optikgeraete GmbH" } , { 0x0029, 0x1012, 0x0029, 0x1012, EVR_UL, "OriginalMeasuringDataLength", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "OCULUS Optikgeraete GmbH" } , { 0x0029, 0x1020, 0x0029, 0x1020, EVR_OB, "OriginalMeasuringRawData", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "OCULUS Optikgeraete GmbH" } , { 0x0029, 0x1022, 0x0029, 0x1022, EVR_UL, "OriginalMeasuringRawDataLength", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "OCULUS Optikgeraete GmbH" } , { 0x0031, 0x0010, 0x0031, 0x0010, EVR_LT, "RequestUID", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RIS" } , { 0x0031, 0x0012, 0x0031, 0x0012, EVR_LT, "ExaminationReason", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS ISI" } , { 0x0031, 0x0030, 0x0031, 0x0030, EVR_DA, "RequestedDate", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS ISI" } , { 0x0031, 0x0032, 0x0031, 0x0032, EVR_TM, "WorklistRequestStartTime", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS ISI" } , { 0x0031, 0x0033, 0x0031, 0x0033, EVR_TM, "WorklistRequestEndTime", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS ISI" } , { 0x0031, 0x0045, 0x0031, 0x0045, EVR_LT, "RequestingPhysician", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RIS" } , { 0x0031, 0x004a, 0x0031, 0x004a, EVR_TM, "RequestedTime", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS ISI" } , { 0x0031, 0x0050, 0x0031, 0x0050, EVR_LT, "RequestedPhysician", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RIS" } , { 0x0031, 0x0080, 0x0031, 0x0080, EVR_LT, "RequestedLocation", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS ISI" } #endif , { 0x0032, 0x000a, 0x0032, 0x000a, EVR_CS, "RETIRED_StudyStatusID", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0032, 0x000c, 0x0032, 0x000c, EVR_CS, "RETIRED_StudyPriorityID", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0032, 0x0012, 0x0032, 0x0012, EVR_LO, "RETIRED_StudyIDIssuer", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0032, 0x0032, 0x0032, 0x0032, EVR_DA, "RETIRED_StudyVerifiedDate", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0032, 0x0033, 0x0032, 0x0033, EVR_TM, "RETIRED_StudyVerifiedTime", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0032, 0x0034, 0x0032, 0x0034, EVR_DA, "RETIRED_StudyReadDate", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0032, 0x0035, 0x0032, 0x0035, EVR_TM, "RETIRED_StudyReadTime", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0032, 0x1000, 0x0032, 0x1000, EVR_DA, "RETIRED_ScheduledStudyStartDate", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0032, 0x1001, 0x0032, 0x1001, EVR_TM, "RETIRED_ScheduledStudyStartTime", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0032, 0x1010, 0x0032, 0x1010, EVR_DA, "RETIRED_ScheduledStudyStopDate", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0032, 0x1011, 0x0032, 0x1011, EVR_TM, "RETIRED_ScheduledStudyStopTime", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0032, 0x1020, 0x0032, 0x1020, EVR_LO, "RETIRED_ScheduledStudyLocation", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0032, 0x1021, 0x0032, 0x1021, EVR_AE, "RETIRED_ScheduledStudyLocationAETitle", 1, -1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0032, 0x1030, 0x0032, 0x1030, EVR_LO, "RETIRED_ReasonForStudy", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0032, 0x1031, 0x0032, 0x1031, EVR_SQ, "RequestingPhysicianIdentificationSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0032, 0x1032, 0x0032, 0x1032, EVR_PN, "RequestingPhysician", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0032, 0x1033, 0x0032, 0x1033, EVR_LO, "RequestingService", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0032, 0x1034, 0x0032, 0x1034, EVR_SQ, "RequestingServiceCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0032, 0x1040, 0x0032, 0x1040, EVR_DA, "RETIRED_StudyArrivalDate", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0032, 0x1041, 0x0032, 0x1041, EVR_TM, "RETIRED_StudyArrivalTime", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0032, 0x1050, 0x0032, 0x1050, EVR_DA, "RETIRED_StudyCompletionDate", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0032, 0x1051, 0x0032, 0x1051, EVR_TM, "RETIRED_StudyCompletionTime", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0032, 0x1055, 0x0032, 0x1055, EVR_CS, "RETIRED_StudyComponentStatusID", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0032, 0x1060, 0x0032, 0x1060, EVR_LO, "RequestedProcedureDescription", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0032, 0x1064, 0x0032, 0x1064, EVR_SQ, "RequestedProcedureCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0032, 0x1070, 0x0032, 0x1070, EVR_LO, "RequestedContrastAgent", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0032, 0x4000, 0x0032, 0x4000, EVR_LT, "RETIRED_StudyComments", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } #ifdef WITH_PRIVATE_TAGS , { 0x0033, 0x0001, 0x0033, 0x0001, EVR_UN, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_GNHD_01" } , { 0x0033, 0x0002, 0x0033, 0x0002, EVR_UN, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_CTHD_01" } , { 0x0033, 0x0002, 0x0033, 0x0002, EVR_UN, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_GNHD_01" } , { 0x0033, 0x0005, 0x0033, 0x0005, EVR_UN, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_YMHD_01" } , { 0x0033, 0x0006, 0x0033, 0x0006, EVR_UN, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_YMHD_01" } , { 0x0033, 0x0010, 0x0033, 0x0010, EVR_LT, "PatientStudyUID", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS RIS" } , { 0x0037, 0x0010, 0x0037, 0x0010, EVR_LO, "ReferringDepartment", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_DRS_1" } , { 0x0037, 0x0020, 0x0037, 0x0020, EVR_US, "ScreenNumber", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_DRS_1" } , { 0x0037, 0x0040, 0x0037, 0x0040, EVR_SH, "LeftOrientation", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_DRS_1" } , { 0x0037, 0x0042, 0x0037, 0x0042, EVR_SH, "RightOrientation", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_DRS_1" } , { 0x0037, 0x0050, 0x0037, 0x0050, EVR_CS, "Inversion", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_DRS_1" } , { 0x0037, 0x0060, 0x0037, 0x0060, EVR_US, "DSA", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_DRS_1" } #endif , { 0x0038, 0x0004, 0x0038, 0x0004, EVR_SQ, "ReferencedPatientAliasSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0038, 0x0008, 0x0038, 0x0008, EVR_CS, "VisitStatusID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0038, 0x0010, 0x0038, 0x0010, EVR_LO, "AdmissionID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0038, 0x0011, 0x0038, 0x0011, EVR_LO, "RETIRED_IssuerOfAdmissionID", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0038, 0x0014, 0x0038, 0x0014, EVR_SQ, "IssuerOfAdmissionIDSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0038, 0x0016, 0x0038, 0x0016, EVR_LO, "RouteOfAdmissions", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0038, 0x001a, 0x0038, 0x001a, EVR_DA, "RETIRED_ScheduledAdmissionDate", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0038, 0x001b, 0x0038, 0x001b, EVR_TM, "RETIRED_ScheduledAdmissionTime", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0038, 0x001c, 0x0038, 0x001c, EVR_DA, "RETIRED_ScheduledDischargeDate", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0038, 0x001d, 0x0038, 0x001d, EVR_TM, "RETIRED_ScheduledDischargeTime", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0038, 0x001e, 0x0038, 0x001e, EVR_LO, "RETIRED_ScheduledPatientInstitutionResidence", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0038, 0x0020, 0x0038, 0x0020, EVR_DA, "AdmittingDate", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0038, 0x0021, 0x0038, 0x0021, EVR_TM, "AdmittingTime", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0038, 0x0030, 0x0038, 0x0030, EVR_DA, "RETIRED_DischargeDate", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0038, 0x0032, 0x0038, 0x0032, EVR_TM, "RETIRED_DischargeTime", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0038, 0x0040, 0x0038, 0x0040, EVR_LO, "RETIRED_DischargeDiagnosisDescription", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0038, 0x0044, 0x0038, 0x0044, EVR_SQ, "RETIRED_DischargeDiagnosisCodeSequence", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0038, 0x0050, 0x0038, 0x0050, EVR_LO, "SpecialNeeds", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0038, 0x0060, 0x0038, 0x0060, EVR_LO, "ServiceEpisodeID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0038, 0x0061, 0x0038, 0x0061, EVR_LO, "RETIRED_IssuerOfServiceEpisodeID", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0038, 0x0062, 0x0038, 0x0062, EVR_LO, "ServiceEpisodeDescription", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0038, 0x0064, 0x0038, 0x0064, EVR_SQ, "IssuerOfServiceEpisodeIDSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0038, 0x0100, 0x0038, 0x0100, EVR_SQ, "PertinentDocumentsSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0038, 0x0300, 0x0038, 0x0300, EVR_LO, "CurrentPatientLocation", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0038, 0x0400, 0x0038, 0x0400, EVR_LO, "PatientInstitutionResidence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0038, 0x0500, 0x0038, 0x0500, EVR_LO, "PatientState", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0038, 0x0502, 0x0038, 0x0502, EVR_SQ, "PatientClinicalTrialParticipationSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0038, 0x4000, 0x0038, 0x4000, EVR_LT, "VisitComments", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } #ifdef WITH_PRIVATE_TAGS , { 0x0039, 0x0080, 0x0039, 0x0080, EVR_IS, "PrivateEntityNumber", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ADWSoft_DPO" } , { 0x0039, 0x0085, 0x0039, 0x0085, EVR_DA, "PrivateEntityDate", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ADWSoft_DPO" } , { 0x0039, 0x0090, 0x0039, 0x0090, EVR_TM, "PrivateEntityTime", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ADWSoft_DPO" } , { 0x0039, 0x0095, 0x0039, 0x0095, EVR_LO, "PrivateEntityLaunchCommand", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ADWSoft_DPO" } , { 0x0039, 0x00aa, 0x0039, 0x00aa, EVR_CS, "PrivateEntityType", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ADWSoft_DPO" } #endif , { 0x003a, 0x0004, 0x003a, 0x0004, EVR_CS, "WaveformOriginality", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x003a, 0x0005, 0x003a, 0x0005, EVR_US, "NumberOfWaveformChannels", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x003a, 0x0010, 0x003a, 0x0010, EVR_UL, "NumberOfWaveformSamples", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x003a, 0x001a, 0x003a, 0x001a, EVR_DS, "SamplingFrequency", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x003a, 0x0020, 0x003a, 0x0020, EVR_SH, "MultiplexGroupLabel", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x003a, 0x0200, 0x003a, 0x0200, EVR_SQ, "ChannelDefinitionSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x003a, 0x0202, 0x003a, 0x0202, EVR_IS, "WaveformChannelNumber", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x003a, 0x0203, 0x003a, 0x0203, EVR_SH, "ChannelLabel", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x003a, 0x0205, 0x003a, 0x0205, EVR_CS, "ChannelStatus", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x003a, 0x0208, 0x003a, 0x0208, EVR_SQ, "ChannelSourceSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x003a, 0x0209, 0x003a, 0x0209, EVR_SQ, "ChannelSourceModifiersSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x003a, 0x020a, 0x003a, 0x020a, EVR_SQ, "SourceWaveformSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x003a, 0x020c, 0x003a, 0x020c, EVR_LO, "ChannelDerivationDescription", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x003a, 0x0210, 0x003a, 0x0210, EVR_DS, "ChannelSensitivity", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x003a, 0x0211, 0x003a, 0x0211, EVR_SQ, "ChannelSensitivityUnitsSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x003a, 0x0212, 0x003a, 0x0212, EVR_DS, "ChannelSensitivityCorrectionFactor", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x003a, 0x0213, 0x003a, 0x0213, EVR_DS, "ChannelBaseline", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x003a, 0x0214, 0x003a, 0x0214, EVR_DS, "ChannelTimeSkew", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x003a, 0x0215, 0x003a, 0x0215, EVR_DS, "ChannelSampleSkew", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x003a, 0x0218, 0x003a, 0x0218, EVR_DS, "ChannelOffset", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x003a, 0x021a, 0x003a, 0x021a, EVR_US, "WaveformBitsStored", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x003a, 0x0220, 0x003a, 0x0220, EVR_DS, "FilterLowFrequency", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x003a, 0x0221, 0x003a, 0x0221, EVR_DS, "FilterHighFrequency", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x003a, 0x0222, 0x003a, 0x0222, EVR_DS, "NotchFilterFrequency", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x003a, 0x0223, 0x003a, 0x0223, EVR_DS, "NotchFilterBandwidth", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x003a, 0x0230, 0x003a, 0x0230, EVR_FL, "WaveformDataDisplayScale", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x003a, 0x0231, 0x003a, 0x0231, EVR_US, "WaveformDisplayBackgroundCIELabValue", 3, 3, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x003a, 0x0240, 0x003a, 0x0240, EVR_SQ, "WaveformPresentationGroupSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x003a, 0x0241, 0x003a, 0x0241, EVR_US, "PresentationGroupNumber", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x003a, 0x0242, 0x003a, 0x0242, EVR_SQ, "ChannelDisplaySequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x003a, 0x0244, 0x003a, 0x0244, EVR_US, "ChannelRecommendedDisplayCIELabValue", 3, 3, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x003a, 0x0245, 0x003a, 0x0245, EVR_FL, "ChannelPosition", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x003a, 0x0246, 0x003a, 0x0246, EVR_CS, "DisplayShadingFlag", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x003a, 0x0247, 0x003a, 0x0247, EVR_FL, "FractionalChannelDisplayScale", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x003a, 0x0248, 0x003a, 0x0248, EVR_FL, "AbsoluteChannelDisplayScale", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x003a, 0x0300, 0x003a, 0x0300, EVR_SQ, "MultiplexedAudioChannelsDescriptionCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x003a, 0x0301, 0x003a, 0x0301, EVR_IS, "ChannelIdentificationCode", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x003a, 0x0302, 0x003a, 0x0302, EVR_CS, "ChannelMode", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x0001, 0x0040, 0x0001, EVR_AE, "ScheduledStationAETitle", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x0002, 0x0040, 0x0002, EVR_DA, "ScheduledProcedureStepStartDate", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x0003, 0x0040, 0x0003, EVR_TM, "ScheduledProcedureStepStartTime", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x0004, 0x0040, 0x0004, EVR_DA, "ScheduledProcedureStepEndDate", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x0005, 0x0040, 0x0005, EVR_TM, "ScheduledProcedureStepEndTime", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x0006, 0x0040, 0x0006, EVR_PN, "ScheduledPerformingPhysicianName", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x0007, 0x0040, 0x0007, EVR_LO, "ScheduledProcedureStepDescription", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x0008, 0x0040, 0x0008, EVR_SQ, "ScheduledProtocolCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x0009, 0x0040, 0x0009, EVR_SH, "ScheduledProcedureStepID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x000a, 0x0040, 0x000a, EVR_SQ, "StageCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x000b, 0x0040, 0x000b, EVR_SQ, "ScheduledPerformingPhysicianIdentificationSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x0010, 0x0040, 0x0010, EVR_SH, "ScheduledStationName", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x0011, 0x0040, 0x0011, EVR_SH, "ScheduledProcedureStepLocation", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x0012, 0x0040, 0x0012, EVR_LO, "PreMedication", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x0020, 0x0040, 0x0020, EVR_CS, "ScheduledProcedureStepStatus", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x0026, 0x0040, 0x0026, EVR_SQ, "OrderPlacerIdentifierSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x0027, 0x0040, 0x0027, EVR_SQ, "OrderFillerIdentifierSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x0031, 0x0040, 0x0031, EVR_UT, "LocalNamespaceEntityID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x0032, 0x0040, 0x0032, EVR_UT, "UniversalEntityID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x0033, 0x0040, 0x0033, EVR_CS, "UniversalEntityIDType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x0035, 0x0040, 0x0035, EVR_CS, "IdentifierTypeCode", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x0036, 0x0040, 0x0036, EVR_SQ, "AssigningFacilitySequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x0039, 0x0040, 0x0039, EVR_SQ, "AssigningJurisdictionCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x003a, 0x0040, 0x003a, EVR_SQ, "AssigningAgencyOrDepartmentCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x0100, 0x0040, 0x0100, EVR_SQ, "ScheduledProcedureStepSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x0220, 0x0040, 0x0220, EVR_SQ, "ReferencedNonImageCompositeSOPInstanceSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x0241, 0x0040, 0x0241, EVR_AE, "PerformedStationAETitle", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x0242, 0x0040, 0x0242, EVR_SH, "PerformedStationName", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x0243, 0x0040, 0x0243, EVR_SH, "PerformedLocation", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x0244, 0x0040, 0x0244, EVR_DA, "PerformedProcedureStepStartDate", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x0245, 0x0040, 0x0245, EVR_TM, "PerformedProcedureStepStartTime", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x0250, 0x0040, 0x0250, EVR_DA, "PerformedProcedureStepEndDate", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x0251, 0x0040, 0x0251, EVR_TM, "PerformedProcedureStepEndTime", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x0252, 0x0040, 0x0252, EVR_CS, "PerformedProcedureStepStatus", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x0253, 0x0040, 0x0253, EVR_SH, "PerformedProcedureStepID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x0254, 0x0040, 0x0254, EVR_LO, "PerformedProcedureStepDescription", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x0255, 0x0040, 0x0255, EVR_LO, "PerformedProcedureTypeDescription", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x0260, 0x0040, 0x0260, EVR_SQ, "PerformedProtocolCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x0261, 0x0040, 0x0261, EVR_CS, "PerformedProtocolType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x0270, 0x0040, 0x0270, EVR_SQ, "ScheduledStepAttributesSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x0275, 0x0040, 0x0275, EVR_SQ, "RequestAttributesSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x0280, 0x0040, 0x0280, EVR_ST, "CommentsOnThePerformedProcedureStep", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x0281, 0x0040, 0x0281, EVR_SQ, "PerformedProcedureStepDiscontinuationReasonCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x0293, 0x0040, 0x0293, EVR_SQ, "QuantitySequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x0294, 0x0040, 0x0294, EVR_DS, "Quantity", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x0295, 0x0040, 0x0295, EVR_SQ, "MeasuringUnitsSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x0296, 0x0040, 0x0296, EVR_SQ, "BillingItemSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x0300, 0x0040, 0x0300, EVR_US, "TotalTimeOfFluoroscopy", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x0301, 0x0040, 0x0301, EVR_US, "TotalNumberOfExposures", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x0302, 0x0040, 0x0302, EVR_US, "EntranceDose", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x0303, 0x0040, 0x0303, EVR_US, "ExposedArea", 1, 2, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x0306, 0x0040, 0x0306, EVR_DS, "DistanceSourceToEntrance", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x0307, 0x0040, 0x0307, EVR_DS, "RETIRED_DistanceSourceToSupport", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x030e, 0x0040, 0x030e, EVR_SQ, "ExposureDoseSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x0310, 0x0040, 0x0310, EVR_ST, "CommentsOnRadiationDose", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x0312, 0x0040, 0x0312, EVR_DS, "XRayOutput", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x0314, 0x0040, 0x0314, EVR_DS, "HalfValueLayer", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x0316, 0x0040, 0x0316, EVR_DS, "OrganDose", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x0318, 0x0040, 0x0318, EVR_CS, "OrganExposed", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x0320, 0x0040, 0x0320, EVR_SQ, "BillingProcedureStepSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x0321, 0x0040, 0x0321, EVR_SQ, "FilmConsumptionSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x0324, 0x0040, 0x0324, EVR_SQ, "BillingSuppliesAndDevicesSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x0330, 0x0040, 0x0330, EVR_SQ, "RETIRED_ReferencedProcedureStepSequence", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x0340, 0x0040, 0x0340, EVR_SQ, "PerformedSeriesSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x0400, 0x0040, 0x0400, EVR_LT, "CommentsOnTheScheduledProcedureStep", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x0440, 0x0040, 0x0440, EVR_SQ, "ProtocolContextSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x0441, 0x0040, 0x0441, EVR_SQ, "ContentItemModifierSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x0500, 0x0040, 0x0500, EVR_SQ, "ScheduledSpecimenSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x050a, 0x0040, 0x050a, EVR_LO, "RETIRED_SpecimenAccessionNumber", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x0512, 0x0040, 0x0512, EVR_LO, "ContainerIdentifier", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x0513, 0x0040, 0x0513, EVR_SQ, "IssuerOfTheContainerIdentifierSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x0515, 0x0040, 0x0515, EVR_SQ, "AlternateContainerIdentifierSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x0518, 0x0040, 0x0518, EVR_SQ, "ContainerTypeCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x051a, 0x0040, 0x051a, EVR_LO, "ContainerDescription", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x0520, 0x0040, 0x0520, EVR_SQ, "ContainerComponentSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x0550, 0x0040, 0x0550, EVR_SQ, "RETIRED_SpecimenSequence", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x0551, 0x0040, 0x0551, EVR_LO, "SpecimenIdentifier", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x0552, 0x0040, 0x0552, EVR_SQ, "RETIRED_SpecimenDescriptionSequenceTrial", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x0553, 0x0040, 0x0553, EVR_ST, "RETIRED_SpecimenDescriptionTrial", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x0554, 0x0040, 0x0554, EVR_UI, "SpecimenUID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x0555, 0x0040, 0x0555, EVR_SQ, "AcquisitionContextSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x0556, 0x0040, 0x0556, EVR_ST, "AcquisitionContextDescription", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x0560, 0x0040, 0x0560, EVR_SQ, "SpecimenDescriptionSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x0562, 0x0040, 0x0562, EVR_SQ, "IssuerOfTheSpecimenIdentifierSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x059a, 0x0040, 0x059a, EVR_SQ, "SpecimenTypeCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x0600, 0x0040, 0x0600, EVR_LO, "SpecimenShortDescription", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x0602, 0x0040, 0x0602, EVR_UT, "SpecimenDetailedDescription", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x0610, 0x0040, 0x0610, EVR_SQ, "SpecimenPreparationSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x0612, 0x0040, 0x0612, EVR_SQ, "SpecimenPreparationStepContentItemSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x0620, 0x0040, 0x0620, EVR_SQ, "SpecimenLocalizationContentItemSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x06fa, 0x0040, 0x06fa, EVR_LO, "RETIRED_SlideIdentifier", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x071a, 0x0040, 0x071a, EVR_SQ, "ImageCenterPointCoordinatesSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x072a, 0x0040, 0x072a, EVR_DS, "XOffsetInSlideCoordinateSystem", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x073a, 0x0040, 0x073a, EVR_DS, "YOffsetInSlideCoordinateSystem", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x074a, 0x0040, 0x074a, EVR_DS, "ZOffsetInSlideCoordinateSystem", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x08d8, 0x0040, 0x08d8, EVR_SQ, "RETIRED_PixelSpacingSequence", 1, 1, "Supplement_145/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x08da, 0x0040, 0x08da, EVR_SQ, "RETIRED_CoordinateSystemAxisCodeSequence", 1, 1, "Supplement_145/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x08ea, 0x0040, 0x08ea, EVR_SQ, "MeasurementUnitsCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x09f8, 0x0040, 0x09f8, EVR_SQ, "RETIRED_VitalStainCodeSequenceTrial", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x1001, 0x0040, 0x1001, EVR_SH, "RequestedProcedureID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x1002, 0x0040, 0x1002, EVR_LO, "ReasonForTheRequestedProcedure", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x1003, 0x0040, 0x1003, EVR_SH, "RequestedProcedurePriority", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x1004, 0x0040, 0x1004, EVR_LO, "PatientTransportArrangements", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x1005, 0x0040, 0x1005, EVR_LO, "RequestedProcedureLocation", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x1006, 0x0040, 0x1006, EVR_SH, "RETIRED_PlacerOrderNumberProcedure", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x1007, 0x0040, 0x1007, EVR_SH, "RETIRED_FillerOrderNumberProcedure", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x1008, 0x0040, 0x1008, EVR_LO, "ConfidentialityCode", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x1009, 0x0040, 0x1009, EVR_SH, "ReportingPriority", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x100a, 0x0040, 0x100a, EVR_SQ, "ReasonForRequestedProcedureCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x1010, 0x0040, 0x1010, EVR_PN, "NamesOfIntendedRecipientsOfResults", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x1011, 0x0040, 0x1011, EVR_SQ, "IntendedRecipientsOfResultsIdentificationSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x1012, 0x0040, 0x1012, EVR_SQ, "ReasonForPerformedProcedureCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x1101, 0x0040, 0x1101, EVR_SQ, "PersonIdentificationCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x1102, 0x0040, 0x1102, EVR_ST, "PersonAddress", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x1103, 0x0040, 0x1103, EVR_LO, "PersonTelephoneNumbers", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x1400, 0x0040, 0x1400, EVR_LT, "RequestedProcedureComments", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x2001, 0x0040, 0x2001, EVR_LO, "RETIRED_ReasonForTheImagingServiceRequest", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x2004, 0x0040, 0x2004, EVR_DA, "IssueDateOfImagingServiceRequest", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x2005, 0x0040, 0x2005, EVR_TM, "IssueTimeOfImagingServiceRequest", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x2006, 0x0040, 0x2006, EVR_SH, "RETIRED_PlacerOrderNumberImagingServiceRequestRetired", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x2007, 0x0040, 0x2007, EVR_SH, "RETIRED_FillerOrderNumberImagingServiceRequestRetired", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x2008, 0x0040, 0x2008, EVR_PN, "OrderEnteredBy", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x2009, 0x0040, 0x2009, EVR_SH, "OrderEntererLocation", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x2010, 0x0040, 0x2010, EVR_SH, "OrderCallbackPhoneNumber", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x2016, 0x0040, 0x2016, EVR_LO, "PlacerOrderNumberImagingServiceRequest", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x2017, 0x0040, 0x2017, EVR_LO, "FillerOrderNumberImagingServiceRequest", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x2400, 0x0040, 0x2400, EVR_LT, "ImagingServiceRequestComments", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x3001, 0x0040, 0x3001, EVR_LO, "ConfidentialityConstraintOnPatientDataDescription", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x4001, 0x0040, 0x4001, EVR_CS, "GeneralPurposeScheduledProcedureStepStatus", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x4002, 0x0040, 0x4002, EVR_CS, "GeneralPurposePerformedProcedureStepStatus", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x4003, 0x0040, 0x4003, EVR_CS, "GeneralPurposeScheduledProcedureStepPriority", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x4004, 0x0040, 0x4004, EVR_SQ, "ScheduledProcessingApplicationsCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x4005, 0x0040, 0x4005, EVR_DT, "ScheduledProcedureStepStartDateTime", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x4006, 0x0040, 0x4006, EVR_CS, "MultipleCopiesFlag", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x4007, 0x0040, 0x4007, EVR_SQ, "PerformedProcessingApplicationsCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x4009, 0x0040, 0x4009, EVR_SQ, "HumanPerformerCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x4010, 0x0040, 0x4010, EVR_DT, "ScheduledProcedureStepModificationDateTime", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x4011, 0x0040, 0x4011, EVR_DT, "ExpectedCompletionDateTime", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x4015, 0x0040, 0x4015, EVR_SQ, "ResultingGeneralPurposePerformedProcedureStepsSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x4016, 0x0040, 0x4016, EVR_SQ, "ReferencedGeneralPurposeScheduledProcedureStepSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x4018, 0x0040, 0x4018, EVR_SQ, "ScheduledWorkitemCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x4019, 0x0040, 0x4019, EVR_SQ, "PerformedWorkitemCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x4020, 0x0040, 0x4020, EVR_CS, "InputAvailabilityFlag", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x4021, 0x0040, 0x4021, EVR_SQ, "InputInformationSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x4022, 0x0040, 0x4022, EVR_SQ, "RelevantInformationSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x4023, 0x0040, 0x4023, EVR_UI, "ReferencedGeneralPurposeScheduledProcedureStepTransactionUID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x4025, 0x0040, 0x4025, EVR_SQ, "ScheduledStationNameCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x4026, 0x0040, 0x4026, EVR_SQ, "ScheduledStationClassCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x4027, 0x0040, 0x4027, EVR_SQ, "ScheduledStationGeographicLocationCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x4028, 0x0040, 0x4028, EVR_SQ, "PerformedStationNameCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x4029, 0x0040, 0x4029, EVR_SQ, "PerformedStationClassCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x4030, 0x0040, 0x4030, EVR_SQ, "PerformedStationGeographicLocationCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x4031, 0x0040, 0x4031, EVR_SQ, "RequestedSubsequentWorkitemCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x4032, 0x0040, 0x4032, EVR_SQ, "NonDICOMOutputCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x4033, 0x0040, 0x4033, EVR_SQ, "OutputInformationSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x4034, 0x0040, 0x4034, EVR_SQ, "ScheduledHumanPerformersSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x4035, 0x0040, 0x4035, EVR_SQ, "ActualHumanPerformersSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x4036, 0x0040, 0x4036, EVR_LO, "HumanPerformerOrganization", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x4037, 0x0040, 0x4037, EVR_PN, "HumanPerformerName", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x4040, 0x0040, 0x4040, EVR_CS, "RawDataHandling", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x8302, 0x0040, 0x8302, EVR_DS, "EntranceDoseInmGy", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x9094, 0x0040, 0x9094, EVR_SQ, "ReferencedImageRealWorldValueMappingSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x9096, 0x0040, 0x9096, EVR_SQ, "RealWorldValueMappingSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x9098, 0x0040, 0x9098, EVR_SQ, "PixelValueMappingCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x9210, 0x0040, 0x9210, EVR_SH, "LUTLabel", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x9211, 0x0040, 0x9211, EVR_xs, "RealWorldValueLastValueMapped", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x9212, 0x0040, 0x9212, EVR_FD, "RealWorldValueLUTData", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x9216, 0x0040, 0x9216, EVR_xs, "RealWorldValueFirstValueMapped", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x9224, 0x0040, 0x9224, EVR_FD, "RealWorldValueIntercept", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0x9225, 0x0040, 0x9225, EVR_FD, "RealWorldValueSlope", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0xa010, 0x0040, 0xa010, EVR_CS, "RelationshipType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0xa027, 0x0040, 0xa027, EVR_LO, "VerifyingOrganization", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0xa030, 0x0040, 0xa030, EVR_DT, "VerificationDateTime", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0xa032, 0x0040, 0xa032, EVR_DT, "ObservationDateTime", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0xa040, 0x0040, 0xa040, EVR_CS, "ValueType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0xa043, 0x0040, 0xa043, EVR_SQ, "ConceptNameCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0xa050, 0x0040, 0xa050, EVR_CS, "ContinuityOfContent", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0xa073, 0x0040, 0xa073, EVR_SQ, "VerifyingObserverSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0xa075, 0x0040, 0xa075, EVR_PN, "VerifyingObserverName", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0xa078, 0x0040, 0xa078, EVR_SQ, "AuthorObserverSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0xa07a, 0x0040, 0xa07a, EVR_SQ, "ParticipantSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0xa07c, 0x0040, 0xa07c, EVR_SQ, "CustodialOrganizationSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0xa080, 0x0040, 0xa080, EVR_CS, "ParticipationType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0xa082, 0x0040, 0xa082, EVR_DT, "ParticipationDateTime", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0xa084, 0x0040, 0xa084, EVR_CS, "ObserverType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0xa088, 0x0040, 0xa088, EVR_SQ, "VerifyingObserverIdentificationCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0xa090, 0x0040, 0xa090, EVR_SQ, "RETIRED_EquivalentCDADocumentSequence", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0xa0b0, 0x0040, 0xa0b0, EVR_US, "ReferencedWaveformChannels", 2, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0xa120, 0x0040, 0xa120, EVR_DT, "DateTime", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0xa121, 0x0040, 0xa121, EVR_DA, "Date", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0xa122, 0x0040, 0xa122, EVR_TM, "Time", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0xa123, 0x0040, 0xa123, EVR_PN, "PersonName", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0xa124, 0x0040, 0xa124, EVR_UI, "UID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0xa130, 0x0040, 0xa130, EVR_CS, "TemporalRangeType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0xa132, 0x0040, 0xa132, EVR_UL, "ReferencedSamplePositions", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0xa136, 0x0040, 0xa136, EVR_US, "ReferencedFrameNumbers", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0xa138, 0x0040, 0xa138, EVR_DS, "ReferencedTimeOffsets", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0xa13a, 0x0040, 0xa13a, EVR_DT, "ReferencedDateTime", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0xa160, 0x0040, 0xa160, EVR_UT, "TextValue", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0xa168, 0x0040, 0xa168, EVR_SQ, "ConceptCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0xa170, 0x0040, 0xa170, EVR_SQ, "PurposeOfReferenceCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0xa180, 0x0040, 0xa180, EVR_US, "AnnotationGroupNumber", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0xa195, 0x0040, 0xa195, EVR_SQ, "ModifierCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0xa300, 0x0040, 0xa300, EVR_SQ, "MeasuredValueSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0xa301, 0x0040, 0xa301, EVR_SQ, "NumericValueQualifierCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0xa30a, 0x0040, 0xa30a, EVR_DS, "NumericValue", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0xa353, 0x0040, 0xa353, EVR_ST, "RETIRED_AddressTrial", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0xa354, 0x0040, 0xa354, EVR_LO, "RETIRED_TelephoneNumberTrial", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0xa360, 0x0040, 0xa360, EVR_SQ, "PredecessorDocumentsSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0xa370, 0x0040, 0xa370, EVR_SQ, "ReferencedRequestSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0xa372, 0x0040, 0xa372, EVR_SQ, "PerformedProcedureCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0xa375, 0x0040, 0xa375, EVR_SQ, "CurrentRequestedProcedureEvidenceSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0xa385, 0x0040, 0xa385, EVR_SQ, "PertinentOtherEvidenceSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0xa390, 0x0040, 0xa390, EVR_SQ, "HL7StructuredDocumentReferenceSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0xa491, 0x0040, 0xa491, EVR_CS, "CompletionFlag", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0xa492, 0x0040, 0xa492, EVR_LO, "CompletionFlagDescription", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0xa493, 0x0040, 0xa493, EVR_CS, "VerificationFlag", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0xa494, 0x0040, 0xa494, EVR_CS, "ArchiveRequested", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0xa496, 0x0040, 0xa496, EVR_CS, "PreliminaryFlag", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0xa504, 0x0040, 0xa504, EVR_SQ, "ContentTemplateSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0xa525, 0x0040, 0xa525, EVR_SQ, "IdenticalDocumentsSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0xa730, 0x0040, 0xa730, EVR_SQ, "ContentSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0xb020, 0x0040, 0xb020, EVR_SQ, "WaveformAnnotationSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0xdb00, 0x0040, 0xdb00, EVR_CS, "TemplateIdentifier", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0xdb06, 0x0040, 0xdb06, EVR_DT, "RETIRED_TemplateVersion", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0xdb07, 0x0040, 0xdb07, EVR_DT, "RETIRED_TemplateLocalVersion", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0xdb0b, 0x0040, 0xdb0b, EVR_CS, "RETIRED_TemplateExtensionFlag", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0xdb0c, 0x0040, 0xdb0c, EVR_UI, "RETIRED_TemplateExtensionOrganizationUID", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0xdb0d, 0x0040, 0xdb0d, EVR_UI, "RETIRED_TemplateExtensionCreatorUID", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0xdb73, 0x0040, 0xdb73, EVR_UL, "ReferencedContentItemIdentifier", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0xe001, 0x0040, 0xe001, EVR_ST, "HL7InstanceIdentifier", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0xe004, 0x0040, 0xe004, EVR_DT, "HL7DocumentEffectiveTime", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0xe006, 0x0040, 0xe006, EVR_SQ, "HL7DocumentTypeCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0xe010, 0x0040, 0xe010, EVR_UT, "RetrieveURI", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0040, 0xe011, 0x0040, 0xe011, EVR_UI, "RetrieveLocationUID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } #ifdef WITH_PRIVATE_TAGS , { 0x0041, 0x0000, 0x0041, 0x0000, EVR_LT, "PapyrusComments", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PAPYRUS 3.0" } , { 0x0041, 0x0000, 0x0041, 0x0000, EVR_LT, "PapyrusComments", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PAPYRUS" } , { 0x0041, 0x0010, 0x0041, 0x0010, EVR_SQ, "PointerSequence", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PAPYRUS 3.0" } , { 0x0041, 0x0010, 0x0041, 0x0010, EVR_US, "FolderType", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PAPYRUS" } , { 0x0041, 0x0010, 0x0041, 0x0010, EVR_US, "NumberOfHardcopies", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS DLR.01" } , { 0x0041, 0x0011, 0x0041, 0x0011, EVR_UL, "ImagePointer", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PAPYRUS 3.0" } , { 0x0041, 0x0011, 0x0041, 0x0011, EVR_LT, "PatientFolderDataSetID", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PAPYRUS" } , { 0x0041, 0x0012, 0x0041, 0x0012, EVR_UL, "PixelOffset", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PAPYRUS 3.0" } , { 0x0041, 0x0013, 0x0041, 0x0013, EVR_SQ, "ImageIdentifierSequence", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PAPYRUS 3.0" } , { 0x0041, 0x0014, 0x0041, 0x0014, EVR_SQ, "ExternalFileReferenceSequence", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PAPYRUS 3.0" } , { 0x0041, 0x0015, 0x0041, 0x0015, EVR_US, "NumberOfImages", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PAPYRUS 3.0" } , { 0x0041, 0x0020, 0x0041, 0x0020, EVR_FL, "AccumulatedFluoroscopyDose", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "INTEGRIS 1.0" } , { 0x0041, 0x0020, 0x0041, 0x0020, EVR_LT, "FolderName", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PAPYRUS" } , { 0x0041, 0x0020, 0x0041, 0x0020, EVR_LT, "FilmFormat", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS DLR.01" } , { 0x0041, 0x0021, 0x0041, 0x0021, EVR_UI, "ReferencedSOPClassUID", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PAPYRUS 3.0" } , { 0x0041, 0x0022, 0x0041, 0x0022, EVR_UI, "ReferencedSOPInstanceUID", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PAPYRUS 3.0" } , { 0x0041, 0x0030, 0x0041, 0x0030, EVR_FL, "AccumulatedExposureDose", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "INTEGRIS 1.0" } , { 0x0041, 0x0030, 0x0041, 0x0030, EVR_DA, "CreationDate", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PAPYRUS" } , { 0x0041, 0x0030, 0x0041, 0x0030, EVR_LT, "FilmSize", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS DLR.01" } , { 0x0041, 0x0031, 0x0041, 0x0031, EVR_LT, "ReferencedFileName", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PAPYRUS 3.0" } , { 0x0041, 0x0031, 0x0041, 0x0031, EVR_LT, "FullFilmFormat", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS DLR.01" } , { 0x0041, 0x0032, 0x0041, 0x0032, EVR_LT, "ReferencedFilePath", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PAPYRUS 3.0" } , { 0x0041, 0x0032, 0x0041, 0x0032, EVR_TM, "CreationTime", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PAPYRUS" } , { 0x0041, 0x0034, 0x0041, 0x0034, EVR_DA, "ModifiedDate", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PAPYRUS" } , { 0x0041, 0x0036, 0x0041, 0x0036, EVR_TM, "ModifiedTime", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PAPYRUS" } , { 0x0041, 0x0040, 0x0041, 0x0040, EVR_FL, "TotalDose", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "INTEGRIS 1.0" } , { 0x0041, 0x0040, 0x0041, 0x0040, EVR_LT, "OwnerName", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PAPYRUS" } , { 0x0041, 0x0041, 0x0041, 0x0041, EVR_FL, "TotalNumberOfFrames", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "INTEGRIS 1.0" } , { 0x0041, 0x0041, 0x0041, 0x0041, EVR_UI, "ReferencedImageSOPClassUID", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PAPYRUS 3.0" } , { 0x0041, 0x0042, 0x0041, 0x0042, EVR_UI, "ReferencedImageSOPInstanceUID", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PAPYRUS 3.0" } , { 0x0041, 0x0050, 0x0041, 0x0050, EVR_SQ, "ExposureInformationSequence", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "INTEGRIS 1.0" } , { 0x0041, 0x0050, 0x0041, 0x0050, EVR_SQ, "ImageSequence", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PAPYRUS 3.0" } , { 0x0041, 0x0050, 0x0041, 0x0050, EVR_LT, "FolderStatus", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PAPYRUS" } , { 0x0041, 0x0060, 0x0041, 0x0060, EVR_UL, "NumberOfImages", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PAPYRUS" } , { 0x0041, 0x0062, 0x0041, 0x0062, EVR_UL, "NumberOfOther", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PAPYRUS" } , { 0x0041, 0x00a0, 0x0041, 0x00a0, EVR_LT, "ExternalFolderElementDSID", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PAPYRUS" } , { 0x0041, 0x00a1, 0x0041, 0x00a1, EVR_US, "ExternalFolderElementDataSetType", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PAPYRUS" } , { 0x0041, 0x00a2, 0x0041, 0x00a2, EVR_LT, "ExternalFolderElementFileLocation", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PAPYRUS" } , { 0x0041, 0x00a3, 0x0041, 0x00a3, EVR_UL, "ExternalFolderElementLength", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PAPYRUS" } , { 0x0041, 0x00b0, 0x0041, 0x00b0, EVR_LT, "InternalFolderElementDSID", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PAPYRUS" } , { 0x0041, 0x00b1, 0x0041, 0x00b1, EVR_US, "InternalFolderElementDataSetType", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PAPYRUS" } , { 0x0041, 0x00b2, 0x0041, 0x00b2, EVR_UL, "InternalOffsetToDataSet", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PAPYRUS" } , { 0x0041, 0x00b3, 0x0041, 0x00b3, EVR_UL, "InternalOffsetToImage", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PAPYRUS" } #endif , { 0x0042, 0x0010, 0x0042, 0x0010, EVR_ST, "DocumentTitle", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0042, 0x0011, 0x0042, 0x0011, EVR_OB, "EncapsulatedDocument", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0042, 0x0012, 0x0042, 0x0012, EVR_LO, "MIMETypeOfEncapsulatedDocument", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0042, 0x0013, 0x0042, 0x0013, EVR_SQ, "SourceInstanceSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0042, 0x0014, 0x0042, 0x0014, EVR_LO, "ListOfMIMETypes", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } #ifdef WITH_PRIVATE_TAGS , { 0x0043, 0x0001, 0x0043, 0x0001, EVR_SS, "BitmapOfPrescanOptions", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_PARM_01" } , { 0x0043, 0x0002, 0x0043, 0x0002, EVR_SS, "GradientOffsetInX", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_PARM_01" } , { 0x0043, 0x0003, 0x0043, 0x0003, EVR_SS, "GradientOffsetInY", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_PARM_01" } , { 0x0043, 0x0004, 0x0043, 0x0004, EVR_SS, "GradientOffsetInZ", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_PARM_01" } , { 0x0043, 0x0005, 0x0043, 0x0005, EVR_SS, "ImageIsOriginalOrUnoriginal", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_PARM_01" } , { 0x0043, 0x0006, 0x0043, 0x0006, EVR_SS, "NumberOfEPIShots", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_PARM_01" } , { 0x0043, 0x0007, 0x0043, 0x0007, EVR_SS, "ViewsPerSegment", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_PARM_01" } , { 0x0043, 0x0008, 0x0043, 0x0008, EVR_SS, "RespiratoryRateInBPM", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_PARM_01" } , { 0x0043, 0x0009, 0x0043, 0x0009, EVR_SS, "RespiratoryTriggerPoint", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_PARM_01" } , { 0x0043, 0x000a, 0x0043, 0x000a, EVR_SS, "TypeOfReceiverUsed", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_PARM_01" } , { 0x0043, 0x000b, 0x0043, 0x000b, EVR_DS, "PeakRateOfChangeOfGradientField", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_PARM_01" } , { 0x0043, 0x000c, 0x0043, 0x000c, EVR_DS, "LimitsInUnitsOfPercent", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_PARM_01" } , { 0x0043, 0x000d, 0x0043, 0x000d, EVR_DS, "PSDEstimatedLimit", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_PARM_01" } , { 0x0043, 0x000e, 0x0043, 0x000e, EVR_DS, "PSDEstimatedLimitInTeslaPerSecond", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_PARM_01" } , { 0x0043, 0x000f, 0x0043, 0x000f, EVR_DS, "SARAvgHead", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_PARM_01" } , { 0x0043, 0x0010, 0x0043, 0x0010, EVR_US, "WindowValue", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_PARM_01" } , { 0x0043, 0x0011, 0x0043, 0x0011, EVR_US, "TotalInputViews", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_PARM_01" } , { 0x0043, 0x0012, 0x0043, 0x0012, EVR_SS, "XrayChain", 3, 3, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_PARM_01" } , { 0x0043, 0x0013, 0x0043, 0x0013, EVR_SS, "ReconKernelParameters", 5, 5, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_PARM_01" } , { 0x0043, 0x0014, 0x0043, 0x0014, EVR_SS, "CalibrationParameters", 3, 3, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_PARM_01" } , { 0x0043, 0x0015, 0x0043, 0x0015, EVR_SS, "TotalOutputViews", 3, 3, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_PARM_01" } , { 0x0043, 0x0016, 0x0043, 0x0016, EVR_SS, "NumberOfOverranges", 5, 5, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_PARM_01" } , { 0x0043, 0x0017, 0x0043, 0x0017, EVR_DS, "IBHImageScaleFactors", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_PARM_01" } , { 0x0043, 0x0018, 0x0043, 0x0018, EVR_DS, "BBHCoefficients", 3, 3, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_PARM_01" } , { 0x0043, 0x0019, 0x0043, 0x0019, EVR_SS, "NumberOfBBHChainsToBlend", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_PARM_01" } , { 0x0043, 0x001a, 0x0043, 0x001a, EVR_SL, "StartingChannelNumber", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_PARM_01" } , { 0x0043, 0x001b, 0x0043, 0x001b, EVR_SS, "PPScanParameters", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_PARM_01" } , { 0x0043, 0x001c, 0x0043, 0x001c, EVR_SS, "GEImageIntegrity", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_PARM_01" } , { 0x0043, 0x001d, 0x0043, 0x001d, EVR_SS, "LevelValue", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_PARM_01" } , { 0x0043, 0x001e, 0x0043, 0x001e, EVR_DS, "DeltaStartTime", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_PARM_01" } , { 0x0043, 0x001e, 0x0043, 0x001e, EVR_DS, "DeltaStartTime", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GE_GENESIS_REV3.0" } , { 0x0043, 0x001f, 0x0043, 0x001f, EVR_SL, "MaxOverrangesInAView", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_PARM_01" } , { 0x0043, 0x0020, 0x0043, 0x0020, EVR_DS, "AvgOverrangesAllViews", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_PARM_01" } , { 0x0043, 0x0021, 0x0043, 0x0021, EVR_SS, "CorrectedAfterglowTerms", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_PARM_01" } , { 0x0043, 0x0025, 0x0043, 0x0025, EVR_SS, "ReferenceChannels", 6, 6, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_PARM_01" } , { 0x0043, 0x0026, 0x0043, 0x0026, EVR_US, "NoViewsRefChannelsBlocked", 6, 6, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_PARM_01" } , { 0x0043, 0x0027, 0x0043, 0x0027, EVR_SH, "ScanPitchRatio", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_PARM_01" } , { 0x0043, 0x0027, 0x0043, 0x0027, EVR_SH, "ScanPitchRatio", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GE_GENESIS_REV3.0" } , { 0x0043, 0x0028, 0x0043, 0x0028, EVR_OB, "UniqueImageIdentifier", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_PARM_01" } , { 0x0043, 0x0029, 0x0043, 0x0029, EVR_OB, "HistogramTables", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_PARM_01" } , { 0x0043, 0x002a, 0x0043, 0x002a, EVR_OB, "UserDefinedData", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_PARM_01" } , { 0x0043, 0x002b, 0x0043, 0x002b, EVR_SS, "PrivateScanOptions", 4, 4, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_PARM_01" } , { 0x0043, 0x002c, 0x0043, 0x002c, EVR_SS, "EffectiveEchoSpacing", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_PARM_01" } , { 0x0043, 0x002d, 0x0043, 0x002d, EVR_SH, "StringSlopField1", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_PARM_01" } , { 0x0043, 0x002e, 0x0043, 0x002e, EVR_SH, "StringSlopField2", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_PARM_01" } , { 0x0043, 0x002f, 0x0043, 0x002f, EVR_SS, "RawDataType", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_PARM_01" } , { 0x0043, 0x0030, 0x0043, 0x0030, EVR_SS, "RawDataType", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_PARM_01" } , { 0x0043, 0x0031, 0x0043, 0x0031, EVR_DS, "RACoordOfTargetReconCentre", 2, 2, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_PARM_01" } , { 0x0043, 0x0032, 0x0043, 0x0032, EVR_SS, "RawDataType", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_PARM_01" } , { 0x0043, 0x0033, 0x0043, 0x0033, EVR_FL, "NegScanSpacing", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_PARM_01" } , { 0x0043, 0x0034, 0x0043, 0x0034, EVR_IS, "OffsetFrequency", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_PARM_01" } , { 0x0043, 0x0035, 0x0043, 0x0035, EVR_UL, "UserUsageTag", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_PARM_01" } , { 0x0043, 0x0036, 0x0043, 0x0036, EVR_UL, "UserFillMapMSW", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_PARM_01" } , { 0x0043, 0x0037, 0x0043, 0x0037, EVR_UL, "UserFillMapLSW", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_PARM_01" } , { 0x0043, 0x0038, 0x0043, 0x0038, EVR_FL, "User25ToUser48", 24, 24, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_PARM_01" } , { 0x0043, 0x0039, 0x0043, 0x0039, EVR_IS, "SlopInteger6ToSlopInteger9", 4, 4, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_PARM_01" } , { 0x0043, 0x0040, 0x0043, 0x0040, EVR_FL, "TriggerOnPosition", 4, 4, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_PARM_01" } , { 0x0043, 0x0041, 0x0043, 0x0041, EVR_FL, "DegreeOfRotation", 4, 4, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_PARM_01" } , { 0x0043, 0x0042, 0x0043, 0x0042, EVR_SL, "DASTriggerSource", 4, 4, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_PARM_01" } , { 0x0043, 0x0043, 0x0043, 0x0043, EVR_SL, "DASFpaGain", 4, 4, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_PARM_01" } , { 0x0043, 0x0044, 0x0043, 0x0044, EVR_SL, "DASOutputSource", 4, 4, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_PARM_01" } , { 0x0043, 0x0045, 0x0043, 0x0045, EVR_SL, "DASAdInput", 4, 4, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_PARM_01" } , { 0x0043, 0x0046, 0x0043, 0x0046, EVR_SL, "DASCalMode", 4, 4, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_PARM_01" } , { 0x0043, 0x0047, 0x0043, 0x0047, EVR_SL, "DASCalFrequency", 4, 4, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_PARM_01" } , { 0x0043, 0x0048, 0x0043, 0x0048, EVR_SL, "DASRegXm", 4, 4, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_PARM_01" } , { 0x0043, 0x0049, 0x0043, 0x0049, EVR_SL, "DASAutoZero", 4, 4, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_PARM_01" } , { 0x0043, 0x004a, 0x0043, 0x004a, EVR_SS, "StartingChannelOfView", 4, 4, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_PARM_01" } , { 0x0043, 0x004b, 0x0043, 0x004b, EVR_SL, "DASXmPattern", 4, 4, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_PARM_01" } , { 0x0043, 0x004c, 0x0043, 0x004c, EVR_SS, "TGGCTriggerMode", 4, 4, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_PARM_01" } , { 0x0043, 0x004d, 0x0043, 0x004d, EVR_FL, "StartScanToXrayOnDelay", 4, 4, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_PARM_01" } , { 0x0043, 0x004e, 0x0043, 0x004e, EVR_FL, "DurationOfXrayOn", 4, 4, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_PARM_01" } , { 0x0043, 0x0060, 0x0043, 0x0060, EVR_IS, "Unknown", 8, 8, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_PARM_01" } , { 0x0043, 0x0061, 0x0043, 0x0061, EVR_UI, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_PARM_01" } , { 0x0043, 0x0062, 0x0043, 0x0062, EVR_SH, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_PARM_01" } , { 0x0043, 0x006f, 0x0043, 0x006f, EVR_DS, "Unknown", 3, 3, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_PARM_01" } #endif , { 0x0044, 0x0001, 0x0044, 0x0001, EVR_ST, "ProductPackageIdentifier", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0044, 0x0002, 0x0044, 0x0002, EVR_CS, "SubstanceAdministrationApproval", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0044, 0x0003, 0x0044, 0x0003, EVR_LT, "ApprovalStatusFurtherDescription", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0044, 0x0004, 0x0044, 0x0004, EVR_DT, "ApprovalStatusDateTime", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0044, 0x0007, 0x0044, 0x0007, EVR_SQ, "ProductTypeCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0044, 0x0008, 0x0044, 0x0008, EVR_LO, "ProductName", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0044, 0x0009, 0x0044, 0x0009, EVR_LT, "ProductDescription", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0044, 0x000a, 0x0044, 0x000a, EVR_LO, "ProductLotIdentifier", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0044, 0x000b, 0x0044, 0x000b, EVR_DT, "ProductExpirationDateTime", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0044, 0x0010, 0x0044, 0x0010, EVR_DT, "SubstanceAdministrationDateTime", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0044, 0x0011, 0x0044, 0x0011, EVR_LO, "SubstanceAdministrationNotes", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0044, 0x0012, 0x0044, 0x0012, EVR_LO, "SubstanceAdministrationDeviceID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0044, 0x0013, 0x0044, 0x0013, EVR_SQ, "ProductParameterSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0044, 0x0019, 0x0044, 0x0019, EVR_SQ, "SubstanceAdministrationParameterSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } #ifdef WITH_PRIVATE_TAGS , { 0x0045, 0x0004, 0x0045, 0x0004, EVR_CS, "AES", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_SENO_02" } , { 0x0045, 0x0006, 0x0045, 0x0006, EVR_DS, "Angulation", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_SENO_02" } , { 0x0045, 0x0009, 0x0045, 0x0009, EVR_DS, "RealMagnificationFactor", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_SENO_02" } , { 0x0045, 0x000b, 0x0045, 0x000b, EVR_CS, "SenographType", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_SENO_02" } , { 0x0045, 0x000c, 0x0045, 0x000c, EVR_DS, "IntegrationTime", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_SENO_02" } , { 0x0045, 0x000d, 0x0045, 0x000d, EVR_DS, "ROIOriginXY", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_SENO_02" } , { 0x0045, 0x0011, 0x0045, 0x0011, EVR_DS, "ReceptorSizeCmXY", 2, 2, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_SENO_02" } , { 0x0045, 0x0012, 0x0045, 0x0012, EVR_IS, "ReceptorSizePixelsXY", 2, 2, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_SENO_02" } , { 0x0045, 0x0013, 0x0045, 0x0013, EVR_ST, "Screen", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_SENO_02" } , { 0x0045, 0x0014, 0x0045, 0x0014, EVR_DS, "PixelPitchMicrons", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_SENO_02" } , { 0x0045, 0x0015, 0x0045, 0x0015, EVR_IS, "PixelDepthBits", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_SENO_02" } , { 0x0045, 0x0016, 0x0045, 0x0016, EVR_IS, "BinningFactorXY", 2, 2, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_SENO_02" } , { 0x0045, 0x001b, 0x0045, 0x001b, EVR_CS, "ClinicalView", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_SENO_02" } , { 0x0045, 0x001d, 0x0045, 0x001d, EVR_DS, "MeanOfRawGrayLevels", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_SENO_02" } , { 0x0045, 0x001e, 0x0045, 0x001e, EVR_DS, "MeanOfOffsetGrayLevels", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_SENO_02" } , { 0x0045, 0x001f, 0x0045, 0x001f, EVR_DS, "MeanOfCorrectedGrayLevels", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_SENO_02" } , { 0x0045, 0x0020, 0x0045, 0x0020, EVR_DS, "MeanOfRegionGrayLevels", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_SENO_02" } , { 0x0045, 0x0021, 0x0045, 0x0021, EVR_DS, "MeanOfLogRegionGrayLevels", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_SENO_02" } , { 0x0045, 0x0022, 0x0045, 0x0022, EVR_DS, "StandardDeviationOfRawGrayLevels", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_SENO_02" } , { 0x0045, 0x0023, 0x0045, 0x0023, EVR_DS, "StandardDeviationOfCorrectedGrayLevels", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_SENO_02" } , { 0x0045, 0x0024, 0x0045, 0x0024, EVR_DS, "StandardDeviationOfRegionGrayLevels", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_SENO_02" } , { 0x0045, 0x0025, 0x0045, 0x0025, EVR_DS, "StandardDeviationOfLogRegionGrayLevels", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_SENO_02" } , { 0x0045, 0x0026, 0x0045, 0x0026, EVR_OB, "MAOBuffer", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_SENO_02" } , { 0x0045, 0x0027, 0x0045, 0x0027, EVR_IS, "SetNumber", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_SENO_02" } , { 0x0045, 0x0028, 0x0045, 0x0028, EVR_CS, "WindowingType", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_SENO_02" } , { 0x0045, 0x0029, 0x0045, 0x0029, EVR_DS, "WindowingParameters", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_SENO_02" } , { 0x0045, 0x002a, 0x0045, 0x002a, EVR_IS, "CrosshairCursorXCoordinates", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_SENO_02" } , { 0x0045, 0x002b, 0x0045, 0x002b, EVR_IS, "CrosshairCursorYCoordinates", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_SENO_02" } , { 0x0045, 0x0039, 0x0045, 0x0039, EVR_US, "VignetteRows", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_SENO_02" } , { 0x0045, 0x003a, 0x0045, 0x003a, EVR_US, "VignetteColumns", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_SENO_02" } , { 0x0045, 0x003b, 0x0045, 0x003b, EVR_US, "VignetteBitsAllocated", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_SENO_02" } , { 0x0045, 0x003c, 0x0045, 0x003c, EVR_US, "VignetteBitsStored", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_SENO_02" } , { 0x0045, 0x003d, 0x0045, 0x003d, EVR_US, "VignetteHighBit", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_SENO_02" } , { 0x0045, 0x003e, 0x0045, 0x003e, EVR_US, "VignettePixelRepresentation", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_SENO_02" } , { 0x0045, 0x003f, 0x0045, 0x003f, EVR_OB, "VignettePixelData", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_SENO_02" } #endif , { 0x0046, 0x0012, 0x0046, 0x0012, EVR_LO, "LensDescription", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0046, 0x0014, 0x0046, 0x0014, EVR_SQ, "RightLensSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0046, 0x0015, 0x0046, 0x0015, EVR_SQ, "LeftLensSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0046, 0x0016, 0x0046, 0x0016, EVR_SQ, "UnspecifiedLateralityLensSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0046, 0x0018, 0x0046, 0x0018, EVR_SQ, "CylinderSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0046, 0x0028, 0x0046, 0x0028, EVR_SQ, "PrismSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0046, 0x0030, 0x0046, 0x0030, EVR_FD, "HorizontalPrismPower", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0046, 0x0032, 0x0046, 0x0032, EVR_CS, "HorizontalPrismBase", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0046, 0x0034, 0x0046, 0x0034, EVR_FD, "VerticalPrismPower", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0046, 0x0036, 0x0046, 0x0036, EVR_CS, "VerticalPrismBase", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0046, 0x0038, 0x0046, 0x0038, EVR_CS, "LensSegmentType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0046, 0x0040, 0x0046, 0x0040, EVR_FD, "OpticalTransmittance", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0046, 0x0042, 0x0046, 0x0042, EVR_FD, "ChannelWidth", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0046, 0x0044, 0x0046, 0x0044, EVR_FD, "PupilSize", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0046, 0x0046, 0x0046, 0x0046, EVR_FD, "CornealSize", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0046, 0x0050, 0x0046, 0x0050, EVR_SQ, "AutorefractionRightEyeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0046, 0x0052, 0x0046, 0x0052, EVR_SQ, "AutorefractionLeftEyeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0046, 0x0060, 0x0046, 0x0060, EVR_FD, "DistancePupillaryDistance", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0046, 0x0062, 0x0046, 0x0062, EVR_FD, "NearPupillaryDistance", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0046, 0x0063, 0x0046, 0x0063, EVR_FD, "IntermediatePupillaryDistance", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0046, 0x0064, 0x0046, 0x0064, EVR_FD, "OtherPupillaryDistance", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0046, 0x0070, 0x0046, 0x0070, EVR_SQ, "KeratometryRightEyeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0046, 0x0071, 0x0046, 0x0071, EVR_SQ, "KeratometryLeftEyeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0046, 0x0074, 0x0046, 0x0074, EVR_SQ, "SteepKeratometricAxisSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0046, 0x0075, 0x0046, 0x0075, EVR_FD, "RadiusOfCurvature", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0046, 0x0076, 0x0046, 0x0076, EVR_FD, "KeratometricPower", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0046, 0x0077, 0x0046, 0x0077, EVR_FD, "KeratometricAxis", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0046, 0x0080, 0x0046, 0x0080, EVR_SQ, "FlatKeratometricAxisSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0046, 0x0092, 0x0046, 0x0092, EVR_CS, "BackgroundColor", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0046, 0x0094, 0x0046, 0x0094, EVR_CS, "Optotype", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0046, 0x0095, 0x0046, 0x0095, EVR_CS, "OptotypePresentation", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0046, 0x0097, 0x0046, 0x0097, EVR_SQ, "SubjectiveRefractionRightEyeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0046, 0x0098, 0x0046, 0x0098, EVR_SQ, "SubjectiveRefractionLeftEyeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0046, 0x0100, 0x0046, 0x0100, EVR_SQ, "AddNearSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0046, 0x0101, 0x0046, 0x0101, EVR_SQ, "AddIntermediateSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0046, 0x0102, 0x0046, 0x0102, EVR_SQ, "AddOtherSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0046, 0x0104, 0x0046, 0x0104, EVR_FD, "AddPower", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0046, 0x0106, 0x0046, 0x0106, EVR_FD, "ViewingDistance", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0046, 0x0121, 0x0046, 0x0121, EVR_SQ, "VisualAcuityTypeCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0046, 0x0122, 0x0046, 0x0122, EVR_SQ, "VisualAcuityRightEyeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0046, 0x0123, 0x0046, 0x0123, EVR_SQ, "VisualAcuityLeftEyeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0046, 0x0124, 0x0046, 0x0124, EVR_SQ, "VisualAcuityBothEyesOpenSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0046, 0x0125, 0x0046, 0x0125, EVR_CS, "ViewingDistanceType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0046, 0x0135, 0x0046, 0x0135, EVR_SS, "VisualAcuityModifiers", 2, 2, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0046, 0x0137, 0x0046, 0x0137, EVR_FD, "DecimalVisualAcuity", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0046, 0x0139, 0x0046, 0x0139, EVR_LO, "OptotypeDetailedDefinition", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0046, 0x0145, 0x0046, 0x0145, EVR_SQ, "ReferencedRefractiveMeasurementsSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0046, 0x0146, 0x0046, 0x0146, EVR_FD, "SpherePower", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0046, 0x0147, 0x0046, 0x0147, EVR_FD, "CylinderPower", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } #ifdef WITH_PRIVATE_TAGS , { 0x0047, 0x0001, 0x0047, 0x0001, EVR_SQ, "ReconstructionParametersSequence", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ADWSoft_3D1" } , { 0x0047, 0x0050, 0x0047, 0x0050, EVR_UL, "VolumeVoxelCount", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ADWSoft_3D1" } , { 0x0047, 0x0051, 0x0047, 0x0051, EVR_UL, "VolumeSegmentCount", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ADWSoft_3D1" } , { 0x0047, 0x0053, 0x0047, 0x0053, EVR_US, "VolumeSliceSize", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ADWSoft_3D1" } , { 0x0047, 0x0054, 0x0047, 0x0054, EVR_US, "VolumeSliceCount", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ADWSoft_3D1" } , { 0x0047, 0x0055, 0x0047, 0x0055, EVR_SL, "VolumeThresholdValue", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ADWSoft_3D1" } , { 0x0047, 0x0057, 0x0047, 0x0057, EVR_DS, "VolumeVoxelRatio", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ADWSoft_3D1" } , { 0x0047, 0x0058, 0x0047, 0x0058, EVR_DS, "VolumeVoxelSize", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ADWSoft_3D1" } , { 0x0047, 0x0059, 0x0047, 0x0059, EVR_US, "VolumeZPositionSize", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ADWSoft_3D1" } , { 0x0047, 0x0060, 0x0047, 0x0060, EVR_DS, "VolumeBaseLine", 9, 9, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ADWSoft_3D1" } , { 0x0047, 0x0061, 0x0047, 0x0061, EVR_DS, "VolumeCenterPoint", 3, 3, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ADWSoft_3D1" } , { 0x0047, 0x0063, 0x0047, 0x0063, EVR_SL, "VolumeSkewBase", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ADWSoft_3D1" } , { 0x0047, 0x0064, 0x0047, 0x0064, EVR_DS, "VolumeRegistrationTransformRotationMatrix", 9, 9, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ADWSoft_3D1" } , { 0x0047, 0x0065, 0x0047, 0x0065, EVR_DS, "VolumeRegistrationTransformTranslationVector", 3, 3, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ADWSoft_3D1" } , { 0x0047, 0x0070, 0x0047, 0x0070, EVR_DS, "KVPList", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ADWSoft_3D1" } , { 0x0047, 0x0071, 0x0047, 0x0071, EVR_IS, "XRayTubeCurrentList", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ADWSoft_3D1" } , { 0x0047, 0x0072, 0x0047, 0x0072, EVR_IS, "ExposureList", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ADWSoft_3D1" } , { 0x0047, 0x0080, 0x0047, 0x0080, EVR_LO, "AcquisitionDLXIdentifier", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ADWSoft_3D1" } , { 0x0047, 0x0085, 0x0047, 0x0085, EVR_SQ, "AcquisitionDLX2DSeriesSequence", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ADWSoft_3D1" } , { 0x0047, 0x0089, 0x0047, 0x0089, EVR_DS, "ContrastAgentVolumeList", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ADWSoft_3D1" } , { 0x0047, 0x008a, 0x0047, 0x008a, EVR_US, "NumberOfInjections", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ADWSoft_3D1" } , { 0x0047, 0x008b, 0x0047, 0x008b, EVR_US, "FrameCount", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ADWSoft_3D1" } , { 0x0047, 0x0091, 0x0047, 0x0091, EVR_LO, "XA3DReconstructionAlgorithmName", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ADWSoft_3D1" } , { 0x0047, 0x0092, 0x0047, 0x0092, EVR_CS, "XA3DReconstructionAlgorithmVersion", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ADWSoft_3D1" } , { 0x0047, 0x0093, 0x0047, 0x0093, EVR_DA, "DLXCalibrationDate", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ADWSoft_3D1" } , { 0x0047, 0x0094, 0x0047, 0x0094, EVR_TM, "DLXCalibrationTime", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ADWSoft_3D1" } , { 0x0047, 0x0095, 0x0047, 0x0095, EVR_CS, "DLXCalibrationStatus", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ADWSoft_3D1" } , { 0x0047, 0x0096, 0x0047, 0x0096, EVR_IS, "UsedFrames", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ADWSoft_3D1" } , { 0x0047, 0x0098, 0x0047, 0x0098, EVR_US, "TransformCount", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ADWSoft_3D1" } , { 0x0047, 0x0099, 0x0047, 0x0099, EVR_SQ, "TransformSequence", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ADWSoft_3D1" } , { 0x0047, 0x009a, 0x0047, 0x009a, EVR_DS, "TransformRotationMatrix", 9, 9, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ADWSoft_3D1" } , { 0x0047, 0x009b, 0x0047, 0x009b, EVR_DS, "TransformTranslationVector", 3, 3, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ADWSoft_3D1" } , { 0x0047, 0x009c, 0x0047, 0x009c, EVR_LO, "TransformLabel", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ADWSoft_3D1" } , { 0x0047, 0x00b0, 0x0047, 0x00b0, EVR_SQ, "WireframeList", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ADWSoft_3D1" } , { 0x0047, 0x00b1, 0x0047, 0x00b1, EVR_US, "WireframeCount", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ADWSoft_3D1" } , { 0x0047, 0x00b2, 0x0047, 0x00b2, EVR_US, "LocationSystem", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ADWSoft_3D1" } , { 0x0047, 0x00b5, 0x0047, 0x00b5, EVR_LO, "WireframeName", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ADWSoft_3D1" } , { 0x0047, 0x00b6, 0x0047, 0x00b6, EVR_LO, "WireframeGroupName", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ADWSoft_3D1" } , { 0x0047, 0x00b7, 0x0047, 0x00b7, EVR_LO, "WireframeColor", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ADWSoft_3D1" } , { 0x0047, 0x00b8, 0x0047, 0x00b8, EVR_SL, "WireframeAttributes", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ADWSoft_3D1" } , { 0x0047, 0x00b9, 0x0047, 0x00b9, EVR_SL, "WireframePointCount", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ADWSoft_3D1" } , { 0x0047, 0x00ba, 0x0047, 0x00ba, EVR_SL, "WireframeTimestamp", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ADWSoft_3D1" } , { 0x0047, 0x00bb, 0x0047, 0x00bb, EVR_SQ, "WireframePointList", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ADWSoft_3D1" } , { 0x0047, 0x00bc, 0x0047, 0x00bc, EVR_DS, "WireframePointsCoordinates", 3, 3, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ADWSoft_3D1" } , { 0x0047, 0x00c0, 0x0047, 0x00c0, EVR_DS, "VolumeUpperLeftHighCornerRAS", 3, 3, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ADWSoft_3D1" } , { 0x0047, 0x00c1, 0x0047, 0x00c1, EVR_DS, "VolumeSliceToRASRotationMatrix", 9, 9, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ADWSoft_3D1" } , { 0x0047, 0x00c2, 0x0047, 0x00c2, EVR_DS, "VolumeUpperLeftHighCornerTLOC", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ADWSoft_3D1" } , { 0x0047, 0x00d1, 0x0047, 0x00d1, EVR_OB, "VolumeSegmentList", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ADWSoft_3D1" } , { 0x0047, 0x00d2, 0x0047, 0x00d2, EVR_OB, "VolumeGradientList", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ADWSoft_3D1" } , { 0x0047, 0x00d3, 0x0047, 0x00d3, EVR_OB, "VolumeDensityList", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ADWSoft_3D1" } , { 0x0047, 0x00d4, 0x0047, 0x00d4, EVR_OB, "VolumeZPositionList", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ADWSoft_3D1" } , { 0x0047, 0x00d5, 0x0047, 0x00d5, EVR_OB, "VolumeOriginalIndexList", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "GEMS_ADWSoft_3D1" } #endif , { 0x0048, 0x0001, 0x0048, 0x0001, EVR_FL, "ImagedVolumeWidth", 1, 1, "Supplement_145", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0048, 0x0002, 0x0048, 0x0002, EVR_FL, "ImagedVolumeHeight", 1, 1, "Supplement_145", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0048, 0x0003, 0x0048, 0x0003, EVR_FL, "ImagedVolumeDepth", 1, 1, "Supplement_145", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0048, 0x0006, 0x0048, 0x0006, EVR_UL, "TotalPixelMatrixColumns", 1, 1, "Supplement_145", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0048, 0x0007, 0x0048, 0x0007, EVR_UL, "TotalPixelMatrixRows", 1, 1, "Supplement_145", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0048, 0x0008, 0x0048, 0x0008, EVR_SQ, "TotalPixelMatrixOriginSequence", 1, 1, "Supplement_145", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0048, 0x0010, 0x0048, 0x0010, EVR_CS, "SpecimenLabelInImage", 1, 1, "Supplement_145", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0048, 0x0011, 0x0048, 0x0011, EVR_CS, "FocusMethod", 1, 1, "Supplement_145", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0048, 0x0012, 0x0048, 0x0012, EVR_CS, "ExtendedDepthOfField", 1, 1, "Supplement_145", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0048, 0x0013, 0x0048, 0x0013, EVR_US, "NumberOfFocalPlanes", 1, 1, "Supplement_145", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0048, 0x0014, 0x0048, 0x0014, EVR_FL, "DistanceBetweenFocalPlanes", 1, 1, "Supplement_145", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0048, 0x0015, 0x0048, 0x0015, EVR_US, "RecommendedAbsentPixelCIELabValue", 3, 3, "Supplement_145", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0048, 0x0100, 0x0048, 0x0100, EVR_SQ, "IlluminatorTypeCodeSequence", 1, 1, "Supplement_145", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0048, 0x0102, 0x0048, 0x0102, EVR_DS, "ImageOrientationSlide", 6, 6, "Supplement_145", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0048, 0x0105, 0x0048, 0x0105, EVR_SQ, "OpticalPathSequence", 1, 1, "Supplement_145", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0048, 0x0106, 0x0048, 0x0106, EVR_SH, "OpticalPathIdentifier", 1, 1, "Supplement_145", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0048, 0x0107, 0x0048, 0x0107, EVR_ST, "OpticalPathDescription", 1, 1, "Supplement_145", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0048, 0x0108, 0x0048, 0x0108, EVR_SQ, "IlluminationColorCodeSequence", 1, 1, "Supplement_145", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0048, 0x0110, 0x0048, 0x0110, EVR_SQ, "SpecimenReferenceSequence", 1, 1, "Supplement_145", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0048, 0x0111, 0x0048, 0x0111, EVR_DS, "CondenserLensPower", 1, 1, "Supplement_145", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0048, 0x0112, 0x0048, 0x0112, EVR_DS, "ObjectiveLensPower", 1, 1, "Supplement_145", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0048, 0x0113, 0x0048, 0x0113, EVR_DS, "ObjectiveLensNumericalAperture", 1, 1, "Supplement_145", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0048, 0x0120, 0x0048, 0x0120, EVR_SQ, "PaletteColorLookupTableSequence", 1, 1, "Supplement_145", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0048, 0x0200, 0x0048, 0x0200, EVR_SQ, "ReferencedImageNavigationSequence", 1, 1, "Supplement_145", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0048, 0x0201, 0x0048, 0x0201, EVR_US, "TopLeftHandCornerOfLocalizerArea", 2, 2, "Supplement_145", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0048, 0x0202, 0x0048, 0x0202, EVR_US, "BottomRightHandCornerOfLocalizerArea", 2, 2, "Supplement_145", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0048, 0x0207, 0x0048, 0x0207, EVR_SQ, "OpticalPathIdentificationSequence", 1, 1, "Supplement_145", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0048, 0x021a, 0x0048, 0x021a, EVR_SQ, "PlanePositionSlideSequence", 1, 1, "Supplement_145", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0048, 0x021e, 0x0048, 0x021e, EVR_SL, "ColumnPositionInTotalImagePixelMatrix", 1, 1, "Supplement_145", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0048, 0x021f, 0x0048, 0x021f, EVR_SL, "RowPositionInTotalImagePixelMatrix", 1, 1, "Supplement_145", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0048, 0x0301, 0x0048, 0x0301, EVR_CS, "PixelOriginInterpretation", 1, 1, "Supplement_145", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0050, 0x0004, 0x0050, 0x0004, EVR_CS, "CalibrationImage", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0050, 0x0010, 0x0050, 0x0010, EVR_SQ, "DeviceSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0050, 0x0012, 0x0050, 0x0012, EVR_SQ, "ContainerComponentTypeCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0050, 0x0013, 0x0050, 0x0013, EVR_FD, "ContainerComponentThickness", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0050, 0x0014, 0x0050, 0x0014, EVR_DS, "DeviceLength", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0050, 0x0015, 0x0050, 0x0015, EVR_FD, "ContainerComponentWidth", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0050, 0x0016, 0x0050, 0x0016, EVR_DS, "DeviceDiameter", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0050, 0x0017, 0x0050, 0x0017, EVR_CS, "DeviceDiameterUnits", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0050, 0x0018, 0x0050, 0x0018, EVR_DS, "DeviceVolume", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0050, 0x0019, 0x0050, 0x0019, EVR_DS, "InterMarkerDistance", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0050, 0x001a, 0x0050, 0x001a, EVR_CS, "ContainerComponentMaterial", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0050, 0x001b, 0x0050, 0x001b, EVR_LO, "ContainerComponentID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0050, 0x001c, 0x0050, 0x001c, EVR_FD, "ContainerComponentLength", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0050, 0x001d, 0x0050, 0x001d, EVR_FD, "ContainerComponentDiameter", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0050, 0x001e, 0x0050, 0x001e, EVR_LO, "ContainerComponentDescription", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0050, 0x0020, 0x0050, 0x0020, EVR_LO, "DeviceDescription", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } #ifdef WITH_PRIVATE_TAGS , { 0x0051, 0x0010, 0x0051, 0x0010, EVR_LT, "ImageText", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CM VA0 CMS" } #endif , { 0x0054, 0x0010, 0x0054, 0x0010, EVR_US, "EnergyWindowVector", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0054, 0x0011, 0x0054, 0x0011, EVR_US, "NumberOfEnergyWindows", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0054, 0x0012, 0x0054, 0x0012, EVR_SQ, "EnergyWindowInformationSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0054, 0x0013, 0x0054, 0x0013, EVR_SQ, "EnergyWindowRangeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0054, 0x0014, 0x0054, 0x0014, EVR_DS, "EnergyWindowLowerLimit", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0054, 0x0015, 0x0054, 0x0015, EVR_DS, "EnergyWindowUpperLimit", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0054, 0x0016, 0x0054, 0x0016, EVR_SQ, "RadiopharmaceuticalInformationSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0054, 0x0017, 0x0054, 0x0017, EVR_IS, "ResidualSyringeCounts", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0054, 0x0018, 0x0054, 0x0018, EVR_SH, "EnergyWindowName", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0054, 0x0020, 0x0054, 0x0020, EVR_US, "DetectorVector", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0054, 0x0021, 0x0054, 0x0021, EVR_US, "NumberOfDetectors", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0054, 0x0022, 0x0054, 0x0022, EVR_SQ, "DetectorInformationSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0054, 0x0030, 0x0054, 0x0030, EVR_US, "PhaseVector", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0054, 0x0031, 0x0054, 0x0031, EVR_US, "NumberOfPhases", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0054, 0x0032, 0x0054, 0x0032, EVR_SQ, "PhaseInformationSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0054, 0x0033, 0x0054, 0x0033, EVR_US, "NumberOfFramesInPhase", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0054, 0x0036, 0x0054, 0x0036, EVR_IS, "PhaseDelay", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0054, 0x0038, 0x0054, 0x0038, EVR_IS, "PauseBetweenFrames", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0054, 0x0039, 0x0054, 0x0039, EVR_CS, "PhaseDescription", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0054, 0x0050, 0x0054, 0x0050, EVR_US, "RotationVector", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0054, 0x0051, 0x0054, 0x0051, EVR_US, "NumberOfRotations", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0054, 0x0052, 0x0054, 0x0052, EVR_SQ, "RotationInformationSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0054, 0x0053, 0x0054, 0x0053, EVR_US, "NumberOfFramesInRotation", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0054, 0x0060, 0x0054, 0x0060, EVR_US, "RRIntervalVector", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0054, 0x0061, 0x0054, 0x0061, EVR_US, "NumberOfRRIntervals", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0054, 0x0062, 0x0054, 0x0062, EVR_SQ, "GatedInformationSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0054, 0x0063, 0x0054, 0x0063, EVR_SQ, "DataInformationSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0054, 0x0070, 0x0054, 0x0070, EVR_US, "TimeSlotVector", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0054, 0x0071, 0x0054, 0x0071, EVR_US, "NumberOfTimeSlots", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0054, 0x0072, 0x0054, 0x0072, EVR_SQ, "TimeSlotInformationSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0054, 0x0073, 0x0054, 0x0073, EVR_DS, "TimeSlotTime", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0054, 0x0080, 0x0054, 0x0080, EVR_US, "SliceVector", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0054, 0x0081, 0x0054, 0x0081, EVR_US, "NumberOfSlices", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0054, 0x0090, 0x0054, 0x0090, EVR_US, "AngularViewVector", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0054, 0x0100, 0x0054, 0x0100, EVR_US, "TimeSliceVector", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0054, 0x0101, 0x0054, 0x0101, EVR_US, "NumberOfTimeSlices", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0054, 0x0200, 0x0054, 0x0200, EVR_DS, "StartAngle", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0054, 0x0202, 0x0054, 0x0202, EVR_CS, "TypeOfDetectorMotion", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0054, 0x0210, 0x0054, 0x0210, EVR_IS, "TriggerVector", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0054, 0x0211, 0x0054, 0x0211, EVR_US, "NumberOfTriggersInPhase", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0054, 0x0220, 0x0054, 0x0220, EVR_SQ, "ViewCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0054, 0x0222, 0x0054, 0x0222, EVR_SQ, "ViewModifierCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0054, 0x0300, 0x0054, 0x0300, EVR_SQ, "RadionuclideCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0054, 0x0302, 0x0054, 0x0302, EVR_SQ, "AdministrationRouteCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0054, 0x0304, 0x0054, 0x0304, EVR_SQ, "RadiopharmaceuticalCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0054, 0x0306, 0x0054, 0x0306, EVR_SQ, "CalibrationDataSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0054, 0x0308, 0x0054, 0x0308, EVR_US, "EnergyWindowNumber", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0054, 0x0400, 0x0054, 0x0400, EVR_SH, "ImageID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0054, 0x0410, 0x0054, 0x0410, EVR_SQ, "PatientOrientationCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0054, 0x0412, 0x0054, 0x0412, EVR_SQ, "PatientOrientationModifierCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0054, 0x0414, 0x0054, 0x0414, EVR_SQ, "PatientGantryRelationshipCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0054, 0x0500, 0x0054, 0x0500, EVR_CS, "SliceProgressionDirection", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0054, 0x1000, 0x0054, 0x1000, EVR_CS, "SeriesType", 2, 2, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0054, 0x1001, 0x0054, 0x1001, EVR_CS, "Units", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0054, 0x1002, 0x0054, 0x1002, EVR_CS, "CountsSource", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0054, 0x1004, 0x0054, 0x1004, EVR_CS, "ReprojectionMethod", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0054, 0x1100, 0x0054, 0x1100, EVR_CS, "RandomsCorrectionMethod", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0054, 0x1101, 0x0054, 0x1101, EVR_LO, "AttenuationCorrectionMethod", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0054, 0x1102, 0x0054, 0x1102, EVR_CS, "DecayCorrection", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0054, 0x1103, 0x0054, 0x1103, EVR_LO, "ReconstructionMethod", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0054, 0x1104, 0x0054, 0x1104, EVR_LO, "DetectorLinesOfResponseUsed", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0054, 0x1105, 0x0054, 0x1105, EVR_LO, "ScatterCorrectionMethod", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0054, 0x1200, 0x0054, 0x1200, EVR_DS, "AxialAcceptance", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0054, 0x1201, 0x0054, 0x1201, EVR_IS, "AxialMash", 2, 2, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0054, 0x1202, 0x0054, 0x1202, EVR_IS, "TransverseMash", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0054, 0x1203, 0x0054, 0x1203, EVR_DS, "DetectorElementSize", 2, 2, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0054, 0x1210, 0x0054, 0x1210, EVR_DS, "CoincidenceWindowWidth", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0054, 0x1220, 0x0054, 0x1220, EVR_CS, "SecondaryCountsType", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0054, 0x1300, 0x0054, 0x1300, EVR_DS, "FrameReferenceTime", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0054, 0x1310, 0x0054, 0x1310, EVR_IS, "PrimaryPromptsCountsAccumulated", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0054, 0x1311, 0x0054, 0x1311, EVR_IS, "SecondaryCountsAccumulated", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0054, 0x1320, 0x0054, 0x1320, EVR_DS, "SliceSensitivityFactor", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0054, 0x1321, 0x0054, 0x1321, EVR_DS, "DecayFactor", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0054, 0x1322, 0x0054, 0x1322, EVR_DS, "DoseCalibrationFactor", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0054, 0x1323, 0x0054, 0x1323, EVR_DS, "ScatterFractionFactor", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0054, 0x1324, 0x0054, 0x1324, EVR_DS, "DeadTimeFactor", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0054, 0x1330, 0x0054, 0x1330, EVR_US, "ImageIndex", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0054, 0x1400, 0x0054, 0x1400, EVR_CS, "RETIRED_CountsIncluded", 1, -1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0054, 0x1401, 0x0054, 0x1401, EVR_CS, "RETIRED_DeadTimeCorrectionFlag", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } #ifdef WITH_PRIVATE_TAGS , { 0x0055, 0x0046, 0x0055, 0x0046, EVR_LT, "CurrentWard", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS ISI" } #endif , { 0x0060, 0x3000, 0x0060, 0x3000, EVR_SQ, "HistogramSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0060, 0x3002, 0x0060, 0x3002, EVR_US, "HistogramNumberOfBins", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0060, 0x3004, 0x0060, 0x3004, EVR_xs, "HistogramFirstBinValue", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0060, 0x3006, 0x0060, 0x3006, EVR_xs, "HistogramLastBinValue", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0060, 0x3008, 0x0060, 0x3008, EVR_US, "HistogramBinWidth", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0060, 0x3010, 0x0060, 0x3010, EVR_LO, "HistogramExplanation", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0060, 0x3020, 0x0060, 0x3020, EVR_UL, "HistogramData", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0062, 0x0001, 0x0062, 0x0001, EVR_CS, "SegmentationType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0062, 0x0002, 0x0062, 0x0002, EVR_SQ, "SegmentSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0062, 0x0003, 0x0062, 0x0003, EVR_SQ, "SegmentedPropertyCategoryCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0062, 0x0004, 0x0062, 0x0004, EVR_US, "SegmentNumber", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0062, 0x0005, 0x0062, 0x0005, EVR_LO, "SegmentLabel", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0062, 0x0006, 0x0062, 0x0006, EVR_ST, "SegmentDescription", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0062, 0x0008, 0x0062, 0x0008, EVR_CS, "SegmentAlgorithmType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0062, 0x0009, 0x0062, 0x0009, EVR_LO, "SegmentAlgorithmName", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0062, 0x000a, 0x0062, 0x000a, EVR_SQ, "SegmentIdentificationSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0062, 0x000b, 0x0062, 0x000b, EVR_US, "ReferencedSegmentNumber", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0062, 0x000c, 0x0062, 0x000c, EVR_US, "RecommendedDisplayGrayscaleValue", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0062, 0x000d, 0x0062, 0x000d, EVR_US, "RecommendedDisplayCIELabValue", 3, 3, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0062, 0x000e, 0x0062, 0x000e, EVR_US, "MaximumFractionalValue", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0062, 0x000f, 0x0062, 0x000f, EVR_SQ, "SegmentedPropertyTypeCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0062, 0x0010, 0x0062, 0x0010, EVR_CS, "SegmentationFractionalType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0064, 0x0002, 0x0064, 0x0002, EVR_SQ, "DeformableRegistrationSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0064, 0x0003, 0x0064, 0x0003, EVR_UI, "SourceFrameOfReferenceUID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0064, 0x0005, 0x0064, 0x0005, EVR_SQ, "DeformableRegistrationGridSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0064, 0x0007, 0x0064, 0x0007, EVR_UL, "GridDimensions", 3, 3, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0064, 0x0008, 0x0064, 0x0008, EVR_FD, "GridResolution", 3, 3, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0064, 0x0009, 0x0064, 0x0009, EVR_OF, "VectorGridData", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0064, 0x000f, 0x0064, 0x000f, EVR_SQ, "PreDeformationMatrixRegistrationSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0064, 0x0010, 0x0064, 0x0010, EVR_SQ, "PostDeformationMatrixRegistrationSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0066, 0x0001, 0x0066, 0x0001, EVR_UL, "NumberOfSurfaces", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0066, 0x0002, 0x0066, 0x0002, EVR_SQ, "SurfaceSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0066, 0x0003, 0x0066, 0x0003, EVR_UL, "SurfaceNumber", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0066, 0x0004, 0x0066, 0x0004, EVR_LT, "SurfaceComments", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0066, 0x0009, 0x0066, 0x0009, EVR_CS, "SurfaceProcessing", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0066, 0x000a, 0x0066, 0x000a, EVR_FL, "SurfaceProcessingRatio", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0066, 0x000b, 0x0066, 0x000b, EVR_LO, "SurfaceProcessingDescription", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0066, 0x000c, 0x0066, 0x000c, EVR_FL, "RecommendedPresentationOpacity", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0066, 0x000d, 0x0066, 0x000d, EVR_CS, "RecommendedPresentationType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0066, 0x000e, 0x0066, 0x000e, EVR_CS, "FiniteVolume", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0066, 0x0010, 0x0066, 0x0010, EVR_CS, "Manifold", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0066, 0x0011, 0x0066, 0x0011, EVR_SQ, "SurfacePointsSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0066, 0x0012, 0x0066, 0x0012, EVR_SQ, "SurfacePointsNormalsSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0066, 0x0013, 0x0066, 0x0013, EVR_SQ, "SurfaceMeshPrimitivesSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0066, 0x0015, 0x0066, 0x0015, EVR_UL, "NumberOfSurfacePoints", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0066, 0x0016, 0x0066, 0x0016, EVR_OF, "PointCoordinatesData", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0066, 0x0017, 0x0066, 0x0017, EVR_FL, "PointPositionAccuracy", 3, 3, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0066, 0x0018, 0x0066, 0x0018, EVR_FL, "MeanPointDistance", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0066, 0x0019, 0x0066, 0x0019, EVR_FL, "MaximumPointDistance", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0066, 0x001a, 0x0066, 0x001a, EVR_FL, "PointsBoundingBoxCoordinates", 6, 6, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0066, 0x001b, 0x0066, 0x001b, EVR_FL, "AxisOfRotation", 3, 3, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0066, 0x001c, 0x0066, 0x001c, EVR_FL, "CenterOfRotation", 3, 3, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0066, 0x001e, 0x0066, 0x001e, EVR_UL, "NumberOfVectors", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0066, 0x001f, 0x0066, 0x001f, EVR_US, "VectorDimensionality", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0066, 0x0020, 0x0066, 0x0020, EVR_FL, "VectorAccuracy", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0066, 0x0021, 0x0066, 0x0021, EVR_OF, "VectorCoordinateData", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0066, 0x0023, 0x0066, 0x0023, EVR_OW, "TrianglePointIndexList", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0066, 0x0024, 0x0066, 0x0024, EVR_OW, "EdgePointIndexList", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0066, 0x0025, 0x0066, 0x0025, EVR_OW, "VertexPointIndexList", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0066, 0x0026, 0x0066, 0x0026, EVR_SQ, "TriangleStripSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0066, 0x0027, 0x0066, 0x0027, EVR_SQ, "TriangleFanSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0066, 0x0028, 0x0066, 0x0028, EVR_SQ, "LineSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0066, 0x0029, 0x0066, 0x0029, EVR_OW, "PrimitivePointIndexList", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0066, 0x002a, 0x0066, 0x002a, EVR_UL, "SurfaceCount", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0066, 0x002b, 0x0066, 0x002b, EVR_SQ, "ReferencedSurfaceSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0066, 0x002c, 0x0066, 0x002c, EVR_UL, "ReferencedSurfaceNumber", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0066, 0x002d, 0x0066, 0x002d, EVR_SQ, "SegmentSurfaceGenerationAlgorithmIdentificationSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0066, 0x002e, 0x0066, 0x002e, EVR_SQ, "SegmentSurfaceSourceInstanceSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0066, 0x002f, 0x0066, 0x002f, EVR_SQ, "AlgorithmFamilyCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0066, 0x0030, 0x0066, 0x0030, EVR_SQ, "AlgorithmNameCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0066, 0x0031, 0x0066, 0x0031, EVR_LO, "AlgorithmVersion", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0066, 0x0032, 0x0066, 0x0032, EVR_LT, "AlgorithmParameters", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0066, 0x0034, 0x0066, 0x0034, EVR_SQ, "FacetSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0066, 0x0035, 0x0066, 0x0035, EVR_SQ, "SurfaceProcessingAlgorithmIdentificationSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0066, 0x0036, 0x0066, 0x0036, EVR_LO, "AlgorithmName", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0068, 0x6210, 0x0068, 0x6210, EVR_LO, "ImplantSize", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0068, 0x6221, 0x0068, 0x6221, EVR_LO, "ImplantTemplateVersion", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0068, 0x6222, 0x0068, 0x6222, EVR_SQ, "ReplacedImplantTemplateSequence", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0068, 0x6223, 0x0068, 0x6223, EVR_CS, "ImplantType", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0068, 0x6224, 0x0068, 0x6224, EVR_SQ, "DerivationImplantTemplateSequence", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0068, 0x6225, 0x0068, 0x6225, EVR_SQ, "OriginalImplantTemplateSequence", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0068, 0x6226, 0x0068, 0x6226, EVR_DT, "EffectiveDateTime", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0068, 0x6230, 0x0068, 0x6230, EVR_SQ, "ImplantTargetAnatomySequence", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0068, 0x6260, 0x0068, 0x6260, EVR_SQ, "InformationFromManufacturerSequence", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0068, 0x6265, 0x0068, 0x6265, EVR_SQ, "NotificationFromManufacturerSequence", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0068, 0x6270, 0x0068, 0x6270, EVR_DT, "InformationIssueDateTime", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0068, 0x6280, 0x0068, 0x6280, EVR_ST, "InformationSummary", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0068, 0x62a0, 0x0068, 0x62a0, EVR_SQ, "ImplantRegulatoryDisapprovalCodeSequence", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0068, 0x62a5, 0x0068, 0x62a5, EVR_FD, "OverallTemplateSpatialTolerance", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0068, 0x62c0, 0x0068, 0x62c0, EVR_SQ, "HPGLDocumentSequence", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0068, 0x62d0, 0x0068, 0x62d0, EVR_US, "HPGLDocumentID", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0068, 0x62d5, 0x0068, 0x62d5, EVR_LO, "HPGLDocumentLabel", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0068, 0x62e0, 0x0068, 0x62e0, EVR_SQ, "ViewOrientationCodeSequence", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0068, 0x62f0, 0x0068, 0x62f0, EVR_FD, "ViewOrientationModifier", 9, 9, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0068, 0x62f2, 0x0068, 0x62f2, EVR_FD, "HPGLDocumentScaling", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0068, 0x6300, 0x0068, 0x6300, EVR_OB, "HPGLDocument", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0068, 0x6310, 0x0068, 0x6310, EVR_US, "HPGLContourPenNumber", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0068, 0x6320, 0x0068, 0x6320, EVR_SQ, "HPGLPenSequence", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0068, 0x6330, 0x0068, 0x6330, EVR_US, "HPGLPenNumber", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0068, 0x6340, 0x0068, 0x6340, EVR_LO, "HPGLPenLabel", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0068, 0x6345, 0x0068, 0x6345, EVR_ST, "HPGLPenDescription", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0068, 0x6346, 0x0068, 0x6346, EVR_FD, "RecommendedRotationPoint", 2, 2, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0068, 0x6347, 0x0068, 0x6347, EVR_FD, "BoundingRectangle", 4, 4, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0068, 0x6350, 0x0068, 0x6350, EVR_US, "ImplantTemplate3DModelSurfaceNumber", 1, -1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0068, 0x6360, 0x0068, 0x6360, EVR_SQ, "SurfaceModelDescriptionSequence", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0068, 0x6380, 0x0068, 0x6380, EVR_LO, "SurfaceModelLabel", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0068, 0x6390, 0x0068, 0x6390, EVR_FD, "SurfaceModelScalingFactor", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0068, 0x63a0, 0x0068, 0x63a0, EVR_SQ, "MaterialsCodeSequence", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0068, 0x63a4, 0x0068, 0x63a4, EVR_SQ, "CoatingMaterialsCodeSequence", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0068, 0x63a8, 0x0068, 0x63a8, EVR_SQ, "ImplantTypeCodeSequence", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0068, 0x63ac, 0x0068, 0x63ac, EVR_SQ, "FixationMethodCodeSequence", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0068, 0x63b0, 0x0068, 0x63b0, EVR_SQ, "MatingFeatureSetsSequence", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0068, 0x63c0, 0x0068, 0x63c0, EVR_US, "MatingFeatureSetID", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0068, 0x63d0, 0x0068, 0x63d0, EVR_LO, "MatingFeatureSetLabel", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0068, 0x63e0, 0x0068, 0x63e0, EVR_SQ, "MatingFeatureSequence", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0068, 0x63f0, 0x0068, 0x63f0, EVR_US, "MatingFeatureID", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0068, 0x6400, 0x0068, 0x6400, EVR_SQ, "MatingFeatureDegreeOfFreedomSequence", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0068, 0x6410, 0x0068, 0x6410, EVR_US, "DegreeOfFreedomID", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0068, 0x6420, 0x0068, 0x6420, EVR_CS, "DegreeOfFreedomType", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0068, 0x6430, 0x0068, 0x6430, EVR_SQ, "TwoDMatingFeatureCoordinatesSequence", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0068, 0x6440, 0x0068, 0x6440, EVR_US, "ReferencedHPGLDocumentID", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0068, 0x6450, 0x0068, 0x6450, EVR_FD, "TwoDMatingPoint", 2, 2, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0068, 0x6460, 0x0068, 0x6460, EVR_FD, "TwoDMatingAxes", 4, 4, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0068, 0x6470, 0x0068, 0x6470, EVR_SQ, "TwoDDegreeOfFreedomSequence", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0068, 0x6490, 0x0068, 0x6490, EVR_FD, "ThreeDDegreeOfFreedomAxis", 3, 3, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0068, 0x64a0, 0x0068, 0x64a0, EVR_FD, "RangeOfFreedom", 2, 2, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0068, 0x64c0, 0x0068, 0x64c0, EVR_FD, "ThreeDMatingPoint", 3, 3, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0068, 0x64d0, 0x0068, 0x64d0, EVR_FD, "ThreeDMatingAxes", 9, 9, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0068, 0x64f0, 0x0068, 0x64f0, EVR_FD, "TwoDDegreeOfFreedomAxis", 3, 3, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0068, 0x6500, 0x0068, 0x6500, EVR_SQ, "PlanningLandmarkPointSequence", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0068, 0x6510, 0x0068, 0x6510, EVR_SQ, "PlanningLandmarkLineSequence", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0068, 0x6520, 0x0068, 0x6520, EVR_SQ, "PlanningLandmarkPlaneSequence", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0068, 0x6530, 0x0068, 0x6530, EVR_US, "PlanningLandmarkID", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0068, 0x6540, 0x0068, 0x6540, EVR_LO, "PlanningLandmarkDescription", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0068, 0x6545, 0x0068, 0x6545, EVR_SQ, "PlanningLandmarkIdentificationCodeSequence", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0068, 0x6550, 0x0068, 0x6550, EVR_SQ, "TwoDPointCoordinatesSequence", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0068, 0x6560, 0x0068, 0x6560, EVR_FD, "TwoDPointCoordinates", 2, 2, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0068, 0x6590, 0x0068, 0x6590, EVR_FD, "ThreeDPointCoordinates", 3, 3, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0068, 0x65a0, 0x0068, 0x65a0, EVR_SQ, "TwoDLineCoordinatesSequence", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0068, 0x65b0, 0x0068, 0x65b0, EVR_FD, "TwoDLineCoordinates", 4, 4, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0068, 0x65d0, 0x0068, 0x65d0, EVR_FD, "ThreeDLineCoordinates", 6, 6, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0068, 0x65e0, 0x0068, 0x65e0, EVR_SQ, "TwoDPlaneCoordinatesSequence", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0068, 0x65f0, 0x0068, 0x65f0, EVR_FD, "TwoDPlaneIntersection", 4, 4, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0068, 0x6610, 0x0068, 0x6610, EVR_FD, "ThreeDPlaneOrigin", 3, 3, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0068, 0x6620, 0x0068, 0x6620, EVR_FD, "ThreeDPlaneNormal", 3, 3, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0001, 0x0070, 0x0001, EVR_SQ, "GraphicAnnotationSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0002, 0x0070, 0x0002, EVR_CS, "GraphicLayer", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0003, 0x0070, 0x0003, EVR_CS, "BoundingBoxAnnotationUnits", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0004, 0x0070, 0x0004, EVR_CS, "AnchorPointAnnotationUnits", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0005, 0x0070, 0x0005, EVR_CS, "GraphicAnnotationUnits", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0006, 0x0070, 0x0006, EVR_ST, "UnformattedTextValue", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0008, 0x0070, 0x0008, EVR_SQ, "TextObjectSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0009, 0x0070, 0x0009, EVR_SQ, "GraphicObjectSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0010, 0x0070, 0x0010, EVR_FL, "BoundingBoxTopLeftHandCorner", 2, 2, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0011, 0x0070, 0x0011, EVR_FL, "BoundingBoxBottomRightHandCorner", 2, 2, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0012, 0x0070, 0x0012, EVR_CS, "BoundingBoxTextHorizontalJustification", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0014, 0x0070, 0x0014, EVR_FL, "AnchorPoint", 2, 2, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0015, 0x0070, 0x0015, EVR_CS, "AnchorPointVisibility", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0020, 0x0070, 0x0020, EVR_US, "GraphicDimensions", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0021, 0x0070, 0x0021, EVR_US, "NumberOfGraphicPoints", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0022, 0x0070, 0x0022, EVR_FL, "GraphicData", 2, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0023, 0x0070, 0x0023, EVR_CS, "GraphicType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0024, 0x0070, 0x0024, EVR_CS, "GraphicFilled", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0040, 0x0070, 0x0040, EVR_IS, "RETIRED_ImageRotationRetired", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0041, 0x0070, 0x0041, EVR_CS, "ImageHorizontalFlip", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0042, 0x0070, 0x0042, EVR_US, "ImageRotation", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0050, 0x0070, 0x0050, EVR_US, "RETIRED_DisplayedAreaTopLeftHandCornerTrial", 2, 2, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0051, 0x0070, 0x0051, EVR_US, "RETIRED_DisplayedAreaBottomRightHandCornerTrial", 2, 2, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0052, 0x0070, 0x0052, EVR_SL, "DisplayedAreaTopLeftHandCorner", 2, 2, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0053, 0x0070, 0x0053, EVR_SL, "DisplayedAreaBottomRightHandCorner", 2, 2, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x005a, 0x0070, 0x005a, EVR_SQ, "DisplayedAreaSelectionSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0060, 0x0070, 0x0060, EVR_SQ, "GraphicLayerSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0062, 0x0070, 0x0062, EVR_IS, "GraphicLayerOrder", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0066, 0x0070, 0x0066, EVR_US, "GraphicLayerRecommendedDisplayGrayscaleValue", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0067, 0x0070, 0x0067, EVR_US, "RETIRED_GraphicLayerRecommendedDisplayRGBValue", 3, 3, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0068, 0x0070, 0x0068, EVR_LO, "GraphicLayerDescription", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0080, 0x0070, 0x0080, EVR_CS, "ContentLabel", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0081, 0x0070, 0x0081, EVR_LO, "ContentDescription", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0082, 0x0070, 0x0082, EVR_DA, "PresentationCreationDate", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0083, 0x0070, 0x0083, EVR_TM, "PresentationCreationTime", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0084, 0x0070, 0x0084, EVR_PN, "ContentCreatorName", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0086, 0x0070, 0x0086, EVR_SQ, "ContentCreatorIdentificationCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0087, 0x0070, 0x0087, EVR_SQ, "AlternateContentDescriptionSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0100, 0x0070, 0x0100, EVR_CS, "PresentationSizeMode", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0101, 0x0070, 0x0101, EVR_DS, "PresentationPixelSpacing", 2, 2, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0102, 0x0070, 0x0102, EVR_IS, "PresentationPixelAspectRatio", 2, 2, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0103, 0x0070, 0x0103, EVR_FL, "PresentationPixelMagnificationRatio", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0207, 0x0070, 0x0207, EVR_LO, "GraphicGroupLabel", 1, 1, "Supplement_120", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0208, 0x0070, 0x0208, EVR_ST, "GraphicGroupDescription", 1, 1, "Supplement_120", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0209, 0x0070, 0x0209, EVR_SQ, "CompoundGraphicSequence", 1, 1, "Supplement_120", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0226, 0x0070, 0x0226, EVR_UL, "CompoundGraphicInstanceID", 1, 1, "Supplement_120", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0227, 0x0070, 0x0227, EVR_LO, "FontName", 1, 1, "Supplement_120", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0228, 0x0070, 0x0228, EVR_CS, "FontNameType", 1, 1, "Supplement_120", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0229, 0x0070, 0x0229, EVR_LO, "CSSFontName", 1, 1, "Supplement_120", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0230, 0x0070, 0x0230, EVR_FD, "RotationAngle", 1, 1, "Supplement_120", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0231, 0x0070, 0x0231, EVR_SQ, "TextStyleSequence", 1, 1, "Supplement_120", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0232, 0x0070, 0x0232, EVR_SQ, "LineStyleSequence", 1, 1, "Supplement_120", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0233, 0x0070, 0x0233, EVR_SQ, "FillStyleSequence", 1, 1, "Supplement_120", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0234, 0x0070, 0x0234, EVR_SQ, "GraphicGroupSequence", 1, 1, "Supplement_120", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0241, 0x0070, 0x0241, EVR_US, "TextColorCIELabValue", 3, 3, "Supplement_120", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0242, 0x0070, 0x0242, EVR_CS, "HorizontalAlignment", 1, 1, "Supplement_120", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0243, 0x0070, 0x0243, EVR_CS, "VerticalAlignment", 1, 1, "Supplement_120", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0244, 0x0070, 0x0244, EVR_CS, "ShadowStyle", 1, 1, "Supplement_120", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0245, 0x0070, 0x0245, EVR_FL, "ShadowOffsetX", 1, 1, "Supplement_120", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0246, 0x0070, 0x0246, EVR_FL, "ShadowOffsetY", 1, 1, "Supplement_120", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0247, 0x0070, 0x0247, EVR_US, "ShadowColorCIELabValue", 3, 3, "Supplement_120", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0248, 0x0070, 0x0248, EVR_CS, "Underlined", 1, 1, "Supplement_120", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0249, 0x0070, 0x0249, EVR_CS, "Bold", 1, 1, "Supplement_120", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0250, 0x0070, 0x0250, EVR_CS, "Italic", 1, 1, "Supplement_120", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0251, 0x0070, 0x0251, EVR_US, "PatternOnColorCIELabValue", 3, 3, "Supplement_120", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0252, 0x0070, 0x0252, EVR_US, "PatternOffColorCIELabValue", 3, 3, "Supplement_120", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0253, 0x0070, 0x0253, EVR_FL, "LineThickness", 1, 1, "Supplement_120", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0254, 0x0070, 0x0254, EVR_CS, "LineDashingStyle", 1, 1, "Supplement_120", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0255, 0x0070, 0x0255, EVR_UL, "LinePattern", 1, 1, "Supplement_120", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0256, 0x0070, 0x0256, EVR_OB, "FillPattern", 1, 1, "Supplement_120", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0257, 0x0070, 0x0257, EVR_CS, "FillMode", 1, 1, "Supplement_120", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0258, 0x0070, 0x0258, EVR_FL, "ShadowOpacity", 1, 1, "Supplement_120", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0261, 0x0070, 0x0261, EVR_FL, "GapLength", 1, 1, "Supplement_120", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0262, 0x0070, 0x0262, EVR_FL, "DiameterOfVisibility", 1, 1, "Supplement_120", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0273, 0x0070, 0x0273, EVR_FL, "RotationPoint", 2, 2, "Supplement_120", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0274, 0x0070, 0x0274, EVR_CS, "TickAlignment", 1, 1, "Supplement_120", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0278, 0x0070, 0x0278, EVR_CS, "ShowTickLabel", 1, 1, "Supplement_120", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0279, 0x0070, 0x0279, EVR_CS, "TickLabelAlignment", 1, 1, "Supplement_120", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0282, 0x0070, 0x0282, EVR_CS, "CompoundGraphicUnits", 1, 1, "Supplement_120", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0284, 0x0070, 0x0284, EVR_FL, "PatternOnOpacity", 1, 1, "Supplement_120", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0285, 0x0070, 0x0285, EVR_FL, "PatternOffOpacity", 1, 1, "Supplement_120", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0287, 0x0070, 0x0287, EVR_SQ, "MajorTicksSequence", 1, 1, "Supplement_120", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0288, 0x0070, 0x0288, EVR_FL, "TickPosition", 1, 1, "Supplement_120", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0289, 0x0070, 0x0289, EVR_SH, "TickLabel", 1, 1, "Supplement_120", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0294, 0x0070, 0x0294, EVR_CS, "CompoundGraphicType", 1, 1, "Supplement_120", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0295, 0x0070, 0x0295, EVR_UL, "GraphicGroupID", 1, 1, "Supplement_120", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0306, 0x0070, 0x0306, EVR_CS, "ShapeType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0308, 0x0070, 0x0308, EVR_SQ, "RegistrationSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0309, 0x0070, 0x0309, EVR_SQ, "MatrixRegistrationSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x030a, 0x0070, 0x030a, EVR_SQ, "MatrixSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x030c, 0x0070, 0x030c, EVR_CS, "FrameOfReferenceTransformationMatrixType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x030d, 0x0070, 0x030d, EVR_SQ, "RegistrationTypeCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x030f, 0x0070, 0x030f, EVR_ST, "FiducialDescription", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0310, 0x0070, 0x0310, EVR_SH, "FiducialIdentifier", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0311, 0x0070, 0x0311, EVR_SQ, "FiducialIdentifierCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0312, 0x0070, 0x0312, EVR_FD, "ContourUncertaintyRadius", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0314, 0x0070, 0x0314, EVR_SQ, "UsedFiducialsSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0318, 0x0070, 0x0318, EVR_SQ, "GraphicCoordinatesDataSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x031a, 0x0070, 0x031a, EVR_UI, "FiducialUID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x031c, 0x0070, 0x031c, EVR_SQ, "FiducialSetSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x031e, 0x0070, 0x031e, EVR_SQ, "FiducialSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0401, 0x0070, 0x0401, EVR_US, "GraphicLayerRecommendedDisplayCIELabValue", 3, 3, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0402, 0x0070, 0x0402, EVR_SQ, "BlendingSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0403, 0x0070, 0x0403, EVR_FL, "RelativeOpacity", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0404, 0x0070, 0x0404, EVR_SQ, "ReferencedSpatialRegistrationSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0070, 0x0405, 0x0070, 0x0405, EVR_CS, "BlendingPosition", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0002, 0x0072, 0x0002, EVR_SH, "HangingProtocolName", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0004, 0x0072, 0x0004, EVR_LO, "HangingProtocolDescription", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0006, 0x0072, 0x0006, EVR_CS, "HangingProtocolLevel", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0008, 0x0072, 0x0008, EVR_LO, "HangingProtocolCreator", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x000a, 0x0072, 0x000a, EVR_DT, "HangingProtocolCreationDateTime", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x000c, 0x0072, 0x000c, EVR_SQ, "HangingProtocolDefinitionSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x000e, 0x0072, 0x000e, EVR_SQ, "HangingProtocolUserIdentificationCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0010, 0x0072, 0x0010, EVR_LO, "HangingProtocolUserGroupName", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0012, 0x0072, 0x0012, EVR_SQ, "SourceHangingProtocolSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0014, 0x0072, 0x0014, EVR_US, "NumberOfPriorsReferenced", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0020, 0x0072, 0x0020, EVR_SQ, "ImageSetsSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0022, 0x0072, 0x0022, EVR_SQ, "ImageSetSelectorSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0024, 0x0072, 0x0024, EVR_CS, "ImageSetSelectorUsageFlag", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0026, 0x0072, 0x0026, EVR_AT, "SelectorAttribute", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0028, 0x0072, 0x0028, EVR_US, "SelectorValueNumber", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0030, 0x0072, 0x0030, EVR_SQ, "TimeBasedImageSetsSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0032, 0x0072, 0x0032, EVR_US, "ImageSetNumber", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0034, 0x0072, 0x0034, EVR_CS, "ImageSetSelectorCategory", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0038, 0x0072, 0x0038, EVR_US, "RelativeTime", 2, 2, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x003a, 0x0072, 0x003a, EVR_CS, "RelativeTimeUnits", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x003c, 0x0072, 0x003c, EVR_SS, "AbstractPriorValue", 2, 2, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x003e, 0x0072, 0x003e, EVR_SQ, "AbstractPriorCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0040, 0x0072, 0x0040, EVR_LO, "ImageSetLabel", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0050, 0x0072, 0x0050, EVR_CS, "SelectorAttributeVR", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0052, 0x0072, 0x0052, EVR_AT, "SelectorSequencePointer", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0054, 0x0072, 0x0054, EVR_LO, "SelectorSequencePointerPrivateCreator", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0056, 0x0072, 0x0056, EVR_LO, "SelectorAttributePrivateCreator", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0060, 0x0072, 0x0060, EVR_AT, "SelectorATValue", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0062, 0x0072, 0x0062, EVR_CS, "SelectorCSValue", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0064, 0x0072, 0x0064, EVR_IS, "SelectorISValue", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0066, 0x0072, 0x0066, EVR_LO, "SelectorLOValue", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0068, 0x0072, 0x0068, EVR_LT, "SelectorLTValue", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x006a, 0x0072, 0x006a, EVR_PN, "SelectorPNValue", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x006c, 0x0072, 0x006c, EVR_SH, "SelectorSHValue", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x006e, 0x0072, 0x006e, EVR_ST, "SelectorSTValue", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0070, 0x0072, 0x0070, EVR_UT, "SelectorUTValue", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0072, 0x0072, 0x0072, EVR_DS, "SelectorDSValue", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0074, 0x0072, 0x0074, EVR_FD, "SelectorFDValue", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0076, 0x0072, 0x0076, EVR_FL, "SelectorFLValue", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0078, 0x0072, 0x0078, EVR_UL, "SelectorULValue", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x007a, 0x0072, 0x007a, EVR_US, "SelectorUSValue", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x007c, 0x0072, 0x007c, EVR_SL, "SelectorSLValue", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x007e, 0x0072, 0x007e, EVR_SS, "SelectorSSValue", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0080, 0x0072, 0x0080, EVR_SQ, "SelectorCodeSequenceValue", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0100, 0x0072, 0x0100, EVR_US, "NumberOfScreens", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0102, 0x0072, 0x0102, EVR_SQ, "NominalScreenDefinitionSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0104, 0x0072, 0x0104, EVR_US, "NumberOfVerticalPixels", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0106, 0x0072, 0x0106, EVR_US, "NumberOfHorizontalPixels", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0108, 0x0072, 0x0108, EVR_FD, "DisplayEnvironmentSpatialPosition", 4, 4, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x010a, 0x0072, 0x010a, EVR_US, "ScreenMinimumGrayscaleBitDepth", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x010c, 0x0072, 0x010c, EVR_US, "ScreenMinimumColorBitDepth", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x010e, 0x0072, 0x010e, EVR_US, "ApplicationMaximumRepaintTime", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0200, 0x0072, 0x0200, EVR_SQ, "DisplaySetsSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0202, 0x0072, 0x0202, EVR_US, "DisplaySetNumber", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0203, 0x0072, 0x0203, EVR_LO, "DisplaySetLabel", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0204, 0x0072, 0x0204, EVR_US, "DisplaySetPresentationGroup", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0206, 0x0072, 0x0206, EVR_LO, "DisplaySetPresentationGroupDescription", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0208, 0x0072, 0x0208, EVR_CS, "PartialDataDisplayHandling", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0210, 0x0072, 0x0210, EVR_SQ, "SynchronizedScrollingSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0212, 0x0072, 0x0212, EVR_US, "DisplaySetScrollingGroup", 2, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0214, 0x0072, 0x0214, EVR_SQ, "NavigationIndicatorSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0216, 0x0072, 0x0216, EVR_US, "NavigationDisplaySet", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0218, 0x0072, 0x0218, EVR_US, "ReferenceDisplaySets", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0300, 0x0072, 0x0300, EVR_SQ, "ImageBoxesSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0302, 0x0072, 0x0302, EVR_US, "ImageBoxNumber", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0304, 0x0072, 0x0304, EVR_CS, "ImageBoxLayoutType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0306, 0x0072, 0x0306, EVR_US, "ImageBoxTileHorizontalDimension", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0308, 0x0072, 0x0308, EVR_US, "ImageBoxTileVerticalDimension", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0310, 0x0072, 0x0310, EVR_CS, "ImageBoxScrollDirection", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0312, 0x0072, 0x0312, EVR_CS, "ImageBoxSmallScrollType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0314, 0x0072, 0x0314, EVR_US, "ImageBoxSmallScrollAmount", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0316, 0x0072, 0x0316, EVR_CS, "ImageBoxLargeScrollType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0318, 0x0072, 0x0318, EVR_US, "ImageBoxLargeScrollAmount", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0320, 0x0072, 0x0320, EVR_US, "ImageBoxOverlapPriority", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0330, 0x0072, 0x0330, EVR_FD, "CineRelativeToRealTime", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0400, 0x0072, 0x0400, EVR_SQ, "FilterOperationsSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0402, 0x0072, 0x0402, EVR_CS, "FilterByCategory", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0404, 0x0072, 0x0404, EVR_CS, "FilterByAttributePresence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0406, 0x0072, 0x0406, EVR_CS, "FilterByOperator", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0420, 0x0072, 0x0420, EVR_US, "StructuredDisplayBackgroundCIELabValue", 3, 3, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0421, 0x0072, 0x0421, EVR_US, "EmptyImageBoxCIELabValue", 3, 3, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0422, 0x0072, 0x0422, EVR_SQ, "StructuredDisplayImageBoxSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0424, 0x0072, 0x0424, EVR_SQ, "StructuredDisplayTextBoxSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0427, 0x0072, 0x0427, EVR_SQ, "ReferencedFirstFrameSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0430, 0x0072, 0x0430, EVR_SQ, "ImageBoxSynchronizationSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0432, 0x0072, 0x0432, EVR_US, "SynchronizedImageBoxList", 2, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0434, 0x0072, 0x0434, EVR_CS, "TypeOfSynchronization", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0500, 0x0072, 0x0500, EVR_CS, "BlendingOperationType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0510, 0x0072, 0x0510, EVR_CS, "ReformattingOperationType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0512, 0x0072, 0x0512, EVR_FD, "ReformattingThickness", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0514, 0x0072, 0x0514, EVR_FD, "ReformattingInterval", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0516, 0x0072, 0x0516, EVR_CS, "ReformattingOperationInitialViewDirection", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0520, 0x0072, 0x0520, EVR_CS, "ThreeDRenderingType", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0600, 0x0072, 0x0600, EVR_SQ, "SortingOperationsSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0602, 0x0072, 0x0602, EVR_CS, "SortByCategory", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0604, 0x0072, 0x0604, EVR_CS, "SortingDirection", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0700, 0x0072, 0x0700, EVR_CS, "DisplaySetPatientOrientation", 2, 2, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0702, 0x0072, 0x0702, EVR_CS, "VOIType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0704, 0x0072, 0x0704, EVR_CS, "PseudoColorType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0706, 0x0072, 0x0706, EVR_CS, "ShowGrayscaleInverted", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0710, 0x0072, 0x0710, EVR_CS, "ShowImageTrueSizeFlag", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0712, 0x0072, 0x0712, EVR_CS, "ShowGraphicAnnotationFlag", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0714, 0x0072, 0x0714, EVR_CS, "ShowPatientDemographicsFlag", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0716, 0x0072, 0x0716, EVR_CS, "ShowAcquisitionTechniquesFlag", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0717, 0x0072, 0x0717, EVR_CS, "DisplaySetHorizontalJustification", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0072, 0x0718, 0x0072, 0x0718, EVR_CS, "DisplaySetVerticalJustification", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0074, 0x1000, 0x0074, 0x1000, EVR_CS, "UnifiedProcedureStepState", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0074, 0x1002, 0x0074, 0x1002, EVR_SQ, "UnifiedProcedureStepProgressInformationSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0074, 0x1004, 0x0074, 0x1004, EVR_DS, "UnifiedProcedureStepProgress", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0074, 0x1006, 0x0074, 0x1006, EVR_ST, "UnifiedProcedureStepProgressDescription", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0074, 0x1008, 0x0074, 0x1008, EVR_SQ, "UnifiedProcedureStepCommunicationsURISequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0074, 0x100a, 0x0074, 0x100a, EVR_ST, "ContactURI", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0074, 0x100c, 0x0074, 0x100c, EVR_LO, "ContactDisplayName", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0074, 0x100e, 0x0074, 0x100e, EVR_SQ, "UnifiedProcedureStepDiscontinuationReasonCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0074, 0x1020, 0x0074, 0x1020, EVR_SQ, "BeamTaskSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0074, 0x1022, 0x0074, 0x1022, EVR_CS, "BeamTaskType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0074, 0x1024, 0x0074, 0x1024, EVR_IS, "BeamOrderIndex", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0074, 0x1030, 0x0074, 0x1030, EVR_SQ, "DeliveryVerificationImageSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0074, 0x1032, 0x0074, 0x1032, EVR_CS, "VerificationImageTiming", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0074, 0x1034, 0x0074, 0x1034, EVR_CS, "DoubleExposureFlag", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0074, 0x1036, 0x0074, 0x1036, EVR_CS, "DoubleExposureOrdering", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0074, 0x1038, 0x0074, 0x1038, EVR_DS, "DoubleExposureMeterset", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0074, 0x103a, 0x0074, 0x103a, EVR_DS, "DoubleExposureFieldDelta", 4, 4, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0074, 0x1040, 0x0074, 0x1040, EVR_SQ, "RelatedReferenceRTImageSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0074, 0x1042, 0x0074, 0x1042, EVR_SQ, "GeneralMachineVerificationSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0074, 0x1044, 0x0074, 0x1044, EVR_SQ, "ConventionalMachineVerificationSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0074, 0x1046, 0x0074, 0x1046, EVR_SQ, "IonMachineVerificationSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0074, 0x1048, 0x0074, 0x1048, EVR_SQ, "FailedAttributesSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0074, 0x104a, 0x0074, 0x104a, EVR_SQ, "OverriddenAttributesSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0074, 0x104c, 0x0074, 0x104c, EVR_SQ, "ConventionalControlPointVerificationSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0074, 0x104e, 0x0074, 0x104e, EVR_SQ, "IonControlPointVerificationSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0074, 0x1050, 0x0074, 0x1050, EVR_SQ, "AttributeOccurrenceSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0074, 0x1052, 0x0074, 0x1052, EVR_AT, "AttributeOccurrencePointer", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0074, 0x1054, 0x0074, 0x1054, EVR_UL, "AttributeItemSelector", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0074, 0x1056, 0x0074, 0x1056, EVR_LO, "AttributeOccurrencePrivateCreator", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0074, 0x1200, 0x0074, 0x1200, EVR_CS, "ScheduledProcedureStepPriority", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0074, 0x1202, 0x0074, 0x1202, EVR_LO, "WorklistLabel", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0074, 0x1204, 0x0074, 0x1204, EVR_LO, "ProcedureStepLabel", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0074, 0x1210, 0x0074, 0x1210, EVR_SQ, "ScheduledProcessingParametersSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0074, 0x1212, 0x0074, 0x1212, EVR_SQ, "PerformedProcessingParametersSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0074, 0x1216, 0x0074, 0x1216, EVR_SQ, "UnifiedProcedureStepPerformedProcedureSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0074, 0x1220, 0x0074, 0x1220, EVR_SQ, "RelatedProcedureStepSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0074, 0x1222, 0x0074, 0x1222, EVR_LO, "ProcedureStepRelationshipType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0074, 0x1230, 0x0074, 0x1230, EVR_LO, "DeletionLock", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0074, 0x1234, 0x0074, 0x1234, EVR_AE, "ReceivingAE", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0074, 0x1236, 0x0074, 0x1236, EVR_AE, "RequestingAE", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0074, 0x1238, 0x0074, 0x1238, EVR_LT, "ReasonForCancellation", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0074, 0x1242, 0x0074, 0x1242, EVR_CS, "SCPStatus", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0074, 0x1244, 0x0074, 0x1244, EVR_CS, "SubscriptionListStatus", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0074, 0x1246, 0x0074, 0x1246, EVR_CS, "UnifiedProcedureStepListStatus", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0076, 0x0001, 0x0076, 0x0001, EVR_LO, "ImplantAssemblyTemplateName", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0076, 0x0003, 0x0076, 0x0003, EVR_LO, "ImplantAssemblyTemplateIssuer", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0076, 0x0006, 0x0076, 0x0006, EVR_LO, "ImplantAssemblyTemplateVersion", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0076, 0x0008, 0x0076, 0x0008, EVR_SQ, "ReplacedImplantAssemblyTemplateSequence", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0076, 0x000a, 0x0076, 0x000a, EVR_CS, "ImplantAssemblyTemplateType", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0076, 0x000c, 0x0076, 0x000c, EVR_SQ, "OriginalImplantAssemblyTemplateSequence", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0076, 0x000e, 0x0076, 0x000e, EVR_SQ, "DerivationImplantAssemblyTemplateSequence", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0076, 0x0010, 0x0076, 0x0010, EVR_SQ, "ImplantAssemblyTemplateTargetAnatomySequence", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0076, 0x0020, 0x0076, 0x0020, EVR_SQ, "ProcedureTypeCodeSequence", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0076, 0x0030, 0x0076, 0x0030, EVR_LO, "SurgicalTechnique", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0076, 0x0032, 0x0076, 0x0032, EVR_SQ, "ComponentTypesSequence", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0076, 0x0034, 0x0076, 0x0034, EVR_CS, "ComponentTypeCodeSequence", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0076, 0x0036, 0x0076, 0x0036, EVR_CS, "ExclusiveComponentType", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0076, 0x0038, 0x0076, 0x0038, EVR_CS, "MandatoryComponentType", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0076, 0x0040, 0x0076, 0x0040, EVR_SQ, "ComponentSequence", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0076, 0x0055, 0x0076, 0x0055, EVR_US, "ComponentID", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0076, 0x0060, 0x0076, 0x0060, EVR_SQ, "ComponentAssemblySequence", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0076, 0x0070, 0x0076, 0x0070, EVR_US, "Component1ReferencedID", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0076, 0x0080, 0x0076, 0x0080, EVR_US, "Component1ReferencedMatingFeatureSetID", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0076, 0x0090, 0x0076, 0x0090, EVR_US, "Component1ReferencedMatingFeatureID", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0076, 0x00a0, 0x0076, 0x00a0, EVR_US, "Component2ReferencedID", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0076, 0x00b0, 0x0076, 0x00b0, EVR_US, "Component2ReferencedMatingFeatureSetID", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0076, 0x00c0, 0x0076, 0x00c0, EVR_US, "Component2ReferencedMatingFeatureID", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0078, 0x0000, 0x0078, 0x0000, EVR_LO, "ImplantTemplateGroupName", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0078, 0x0010, 0x0078, 0x0010, EVR_ST, "ImplantTemplateGroupDescription", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0078, 0x0020, 0x0078, 0x0020, EVR_LO, "ImplantTemplateGroupIssuer", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0078, 0x0024, 0x0078, 0x0024, EVR_LO, "ImplantTemplateGroupVersion", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0078, 0x0026, 0x0078, 0x0026, EVR_SQ, "ReplacedImplantTemplateGroupSequence", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0078, 0x0028, 0x0078, 0x0028, EVR_SQ, "ImplantTemplateGroupTargetAnatomySequence", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0078, 0x002a, 0x0078, 0x002a, EVR_SQ, "ImplantTemplateGroupMembersSequence", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0078, 0x002e, 0x0078, 0x002e, EVR_US, "ImplantTemplateGroupMemberID", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0078, 0x0050, 0x0078, 0x0050, EVR_FD, "ThreeDImplantTemplateGroupMemberMatchingPoint", 3, 3, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0078, 0x0060, 0x0078, 0x0060, EVR_FD, "ThreeDImplantTemplateGroupMemberMatchingAxes", 9, 9, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0078, 0x0070, 0x0078, 0x0070, EVR_SQ, "ImplantTemplateGroupMemberMatching2DCoordinatesSequence", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0078, 0x0090, 0x0078, 0x0090, EVR_FD, "TwoDImplantTemplateGroupMemberMatchingPoint", 2, 2, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0078, 0x00a0, 0x0078, 0x00a0, EVR_FD, "TwoDImplantTemplateGroupMemberMatchingAxes", 4, 4, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0078, 0x00b0, 0x0078, 0x00b0, EVR_SQ, "ImplantTemplateGroupVariationDimensionSequence", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0078, 0x00b2, 0x0078, 0x00b2, EVR_LO, "ImplantTemplateGroupVariationDimensionName", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0078, 0x00b4, 0x0078, 0x00b4, EVR_SQ, "ImplantTemplateGroupVariationDimensionRankSequence", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0078, 0x00b6, 0x0078, 0x00b6, EVR_US, "ReferencedImplantTemplateGroupMemberID", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0078, 0x00b8, 0x0078, 0x00b8, EVR_US, "ImplantTemplateGroupVariationDimensionRank", 1, 1, "Supplement_131", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } #ifdef WITH_PRIVATE_TAGS , { 0x0087, 0x0010, 0x0087, 0x0010, EVR_CS, "MediaType", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "1.2.840.113708.794.1.1.2.0" } , { 0x0087, 0x0020, 0x0087, 0x0020, EVR_CS, "MediaLocation", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "1.2.840.113708.794.1.1.2.0" } , { 0x0087, 0x0050, 0x0087, 0x0050, EVR_IS, "EstimatedRetrieveTime", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "1.2.840.113708.794.1.1.2.0" } #endif , { 0x0088, 0x0130, 0x0088, 0x0130, EVR_SH, "StorageMediaFileSetID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0088, 0x0140, 0x0088, 0x0140, EVR_UI, "StorageMediaFileSetUID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0088, 0x0200, 0x0088, 0x0200, EVR_SQ, "IconImageSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0088, 0x0904, 0x0088, 0x0904, EVR_LO, "RETIRED_TopicTitle", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0088, 0x0906, 0x0088, 0x0906, EVR_ST, "RETIRED_TopicSubject", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0088, 0x0910, 0x0088, 0x0910, EVR_LO, "RETIRED_TopicAuthor", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0088, 0x0912, 0x0088, 0x0912, EVR_LO, "RETIRED_TopicKeywords", 1, 32, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } #ifdef WITH_PRIVATE_TAGS , { 0x0089, 0x0010, 0x0089, 0x0010, EVR_SQ, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "DIDI TO PCR 1.1" } , { 0x0095, 0x0001, 0x0095, 0x0001, EVR_LT, "ExaminationFolderID", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIENET" } , { 0x0095, 0x0004, 0x0095, 0x0004, EVR_UL, "FolderReportedStatus", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIENET" } , { 0x0095, 0x0005, 0x0095, 0x0005, EVR_LT, "FolderReportingRadiologist", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIENET" } , { 0x0095, 0x0007, 0x0095, 0x0007, EVR_LT, "SIENETISAPLA", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIENET" } , { 0x0099, 0x0002, 0x0099, 0x0002, EVR_UL, "DataObjectAttributes", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIENET" } , { 0x00e1, 0x0001, 0x00e1, 0x0001, EVR_US, "DataDictionaryVersion", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "ELSCINT1" } , { 0x00e1, 0x0014, 0x00e1, 0x0014, EVR_LT, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "ELSCINT1" } , { 0x00e1, 0x0022, 0x00e1, 0x0022, EVR_DS, "Unknown", 2, 2, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "ELSCINT1" } , { 0x00e1, 0x0023, 0x00e1, 0x0023, EVR_DS, "Unknown", 2, 2, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "ELSCINT1" } , { 0x00e1, 0x0024, 0x00e1, 0x0024, EVR_LT, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "ELSCINT1" } , { 0x00e1, 0x0025, 0x00e1, 0x0025, EVR_LT, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "ELSCINT1" } , { 0x00e1, 0x0040, 0x00e1, 0x0040, EVR_SH, "OffsetFromCTMRImages", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "ELSCINT1" } #endif , { 0x0100, 0x0410, 0x0100, 0x0410, EVR_CS, "SOPInstanceStatus", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0100, 0x0420, 0x0100, 0x0420, EVR_DT, "SOPAuthorizationDateTime", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0100, 0x0424, 0x0100, 0x0424, EVR_LT, "SOPAuthorizationComment", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0100, 0x0426, 0x0100, 0x0426, EVR_LO, "AuthorizationEquipmentCertificationNumber", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } #ifdef WITH_PRIVATE_TAGS , { 0x0135, 0x0010, 0x0135, 0x0010, EVR_LO, "UltrasoundScannerName", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SONOWAND AS" } , { 0x0135, 0x0011, 0x0135, 0x0011, EVR_LO, "TransducerSerial", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SONOWAND AS" } , { 0x0135, 0x0012, 0x0135, 0x0012, EVR_LO, "ProbeApplication", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SONOWAND AS" } , { 0x0193, 0x0002, 0x0193, 0x0002, EVR_DS, "RISKey", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS ISI" } , { 0x0307, 0x0001, 0x0307, 0x0001, EVR_UN, "RISWorklistIMGEF", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS ISI" } , { 0x0309, 0x0001, 0x0309, 0x0001, EVR_UN, "RISReportIMGEF", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS ISI" } #endif , { 0x0400, 0x0005, 0x0400, 0x0005, EVR_US, "MACIDNumber", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0400, 0x0010, 0x0400, 0x0010, EVR_UI, "MACCalculationTransferSyntaxUID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0400, 0x0015, 0x0400, 0x0015, EVR_CS, "MACAlgorithm", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0400, 0x0020, 0x0400, 0x0020, EVR_AT, "DataElementsSigned", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0400, 0x0100, 0x0400, 0x0100, EVR_UI, "DigitalSignatureUID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0400, 0x0105, 0x0400, 0x0105, EVR_DT, "DigitalSignatureDateTime", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0400, 0x0110, 0x0400, 0x0110, EVR_CS, "CertificateType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0400, 0x0115, 0x0400, 0x0115, EVR_OB, "CertificateOfSigner", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0400, 0x0120, 0x0400, 0x0120, EVR_OB, "Signature", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0400, 0x0305, 0x0400, 0x0305, EVR_CS, "CertifiedTimestampType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0400, 0x0310, 0x0400, 0x0310, EVR_OB, "CertifiedTimestamp", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0400, 0x0401, 0x0400, 0x0401, EVR_SQ, "DigitalSignaturePurposeCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0400, 0x0402, 0x0400, 0x0402, EVR_SQ, "ReferencedDigitalSignatureSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0400, 0x0403, 0x0400, 0x0403, EVR_SQ, "ReferencedSOPInstanceMACSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0400, 0x0404, 0x0400, 0x0404, EVR_OB, "MAC", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0400, 0x0500, 0x0400, 0x0500, EVR_SQ, "EncryptedAttributesSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0400, 0x0510, 0x0400, 0x0510, EVR_UI, "EncryptedContentTransferSyntaxUID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0400, 0x0520, 0x0400, 0x0520, EVR_OB, "EncryptedContent", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0400, 0x0550, 0x0400, 0x0550, EVR_SQ, "ModifiedAttributesSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0400, 0x0561, 0x0400, 0x0561, EVR_SQ, "OriginalAttributesSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0400, 0x0562, 0x0400, 0x0562, EVR_DT, "AttributeModificationDateTime", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0400, 0x0563, 0x0400, 0x0563, EVR_LO, "ModifyingSystem", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0400, 0x0564, 0x0400, 0x0564, EVR_LO, "SourceOfPreviousValues", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0400, 0x0565, 0x0400, 0x0565, EVR_CS, "ReasonForTheAttributeModification", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } #ifdef WITH_PRIVATE_TAGS , { 0x0601, 0x0000, 0x0601, 0x0000, EVR_SH, "ImplementationVersion", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "ELSCINT1" } , { 0x0601, 0x0020, 0x0601, 0x0020, EVR_DS, "RelativeTablePosition", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "ELSCINT1" } , { 0x0601, 0x0021, 0x0601, 0x0021, EVR_DS, "RelativeTableHeight", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "ELSCINT1" } , { 0x0601, 0x0030, 0x0601, 0x0030, EVR_SH, "SurviewDirection", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "ELSCINT1" } , { 0x0601, 0x0031, 0x0601, 0x0031, EVR_DS, "SurviewLength", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "ELSCINT1" } , { 0x0601, 0x0050, 0x0601, 0x0050, EVR_SH, "ImageViewType", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "ELSCINT1" } , { 0x0601, 0x0070, 0x0601, 0x0070, EVR_DS, "BatchNumber", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "ELSCINT1" } , { 0x0601, 0x0071, 0x0601, 0x0071, EVR_DS, "BatchSize", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "ELSCINT1" } , { 0x0601, 0x0072, 0x0601, 0x0072, EVR_DS, "BatchSliceNumber", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "ELSCINT1" } #endif , { 0x1000, 0x0000, 0x1000, 0x0000, EVR_UL, "ACR_NEMA_2C_CodeTableGroupLength", 1, 1, "ACR/NEMA2C", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x1000, 0x0010, 0x1000, 0x0010, EVR_US, "ACR_NEMA_2C_EscapeTriplet", 3, 3, "ACR/NEMA2C", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x1000, 0x0011, 0x1000, 0x0011, EVR_US, "ACR_NEMA_2C_RunLengthTriplet", 3, 3, "ACR/NEMA2C", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x1000, 0x0012, 0x1000, 0x0012, EVR_US, "ACR_NEMA_2C_HuffmanTableSize", 1, 1, "ACR/NEMA2C", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x1000, 0x0013, 0x1000, 0x0013, EVR_US, "ACR_NEMA_2C_HuffmanTableTriplet", 3, 3, "ACR/NEMA2C", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x1000, 0x0014, 0x1000, 0x0014, EVR_US, "ACR_NEMA_2C_ShiftTableSize", 1, 1, "ACR/NEMA2C", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x1000, 0x0015, 0x1000, 0x0015, EVR_US, "ACR_NEMA_2C_ShiftTableTriplet", 3, 3, "ACR/NEMA2C", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x1010, 0x0000, 0x1010, 0x0000, EVR_UL, "ACR_NEMA_2C_ZonalMapGroupLength", 1, 1, "ACR/NEMA2C", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x1010, 0x0004, 0x1010, 0x0004, EVR_US, "ACR_NEMA_2C_ZonalMap", 1, -1, "ACR/NEMA2C", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } #ifdef WITH_PRIVATE_TAGS , { 0x1369, 0x0000, 0x1369, 0x0000, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "AEGIS_DICOM_2.00" } #endif , { 0x2000, 0x0010, 0x2000, 0x0010, EVR_IS, "NumberOfCopies", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2000, 0x001e, 0x2000, 0x001e, EVR_SQ, "PrinterConfigurationSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2000, 0x0020, 0x2000, 0x0020, EVR_CS, "PrintPriority", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2000, 0x0030, 0x2000, 0x0030, EVR_CS, "MediumType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2000, 0x0040, 0x2000, 0x0040, EVR_CS, "FilmDestination", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2000, 0x0050, 0x2000, 0x0050, EVR_LO, "FilmSessionLabel", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2000, 0x0060, 0x2000, 0x0060, EVR_IS, "MemoryAllocation", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2000, 0x0061, 0x2000, 0x0061, EVR_IS, "MaximumMemoryAllocation", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2000, 0x0062, 0x2000, 0x0062, EVR_CS, "RETIRED_ColorImagePrintingFlag", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2000, 0x0063, 0x2000, 0x0063, EVR_CS, "RETIRED_CollationFlag", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2000, 0x0065, 0x2000, 0x0065, EVR_CS, "RETIRED_AnnotationFlag", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2000, 0x0067, 0x2000, 0x0067, EVR_CS, "RETIRED_ImageOverlayFlag", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2000, 0x0069, 0x2000, 0x0069, EVR_CS, "RETIRED_PresentationLUTFlag", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2000, 0x006a, 0x2000, 0x006a, EVR_CS, "RETIRED_ImageBoxPresentationLUTFlag", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2000, 0x00a0, 0x2000, 0x00a0, EVR_US, "MemoryBitDepth", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2000, 0x00a1, 0x2000, 0x00a1, EVR_US, "PrintingBitDepth", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2000, 0x00a2, 0x2000, 0x00a2, EVR_SQ, "MediaInstalledSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2000, 0x00a4, 0x2000, 0x00a4, EVR_SQ, "OtherMediaAvailableSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2000, 0x00a8, 0x2000, 0x00a8, EVR_SQ, "SupportedImageDisplayFormatsSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2000, 0x0500, 0x2000, 0x0500, EVR_SQ, "ReferencedFilmBoxSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2000, 0x0510, 0x2000, 0x0510, EVR_SQ, "RETIRED_ReferencedStoredPrintSequence", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } #ifdef WITH_PRIVATE_TAGS , { 0x2001, 0x0001, 0x2001, 0x0001, EVR_FL, "ChemicalShift", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Philips Imaging DD 001" } , { 0x2001, 0x0001, 0x2001, 0x0001, EVR_FL, "ChemicalShift", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS IMAGING DD 001" } , { 0x2001, 0x0002, 0x2001, 0x0002, EVR_IS, "ChemicalShiftNumberMR", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Philips Imaging DD 001" } , { 0x2001, 0x0002, 0x2001, 0x0002, EVR_IS, "ChemicalShiftNumberMR", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS IMAGING DD 001" } , { 0x2001, 0x0003, 0x2001, 0x0003, EVR_FL, "DiffusionB-Factor", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Philips Imaging DD 001" } , { 0x2001, 0x0003, 0x2001, 0x0003, EVR_FL, "DiffusionB-Factor", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS IMAGING DD 001" } , { 0x2001, 0x0004, 0x2001, 0x0004, EVR_CS, "DiffusionDirection", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Philips Imaging DD 001" } , { 0x2001, 0x0004, 0x2001, 0x0004, EVR_CS, "DiffusionDirection", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS IMAGING DD 001" } , { 0x2001, 0x0006, 0x2001, 0x0006, EVR_CS, "ImageEnhanced", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Philips Imaging DD 001" } , { 0x2001, 0x0006, 0x2001, 0x0006, EVR_CS, "ImageEnhanced", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS IMAGING DD 001" } , { 0x2001, 0x0007, 0x2001, 0x0007, EVR_CS, "ImageTypeEDES", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Philips Imaging DD 001" } , { 0x2001, 0x0007, 0x2001, 0x0007, EVR_CS, "ImageTypeEDES", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS IMAGING DD 001" } , { 0x2001, 0x0008, 0x2001, 0x0008, EVR_IS, "PhaseNumber", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Philips Imaging DD 001" } , { 0x2001, 0x0008, 0x2001, 0x0008, EVR_IS, "PhaseNumber", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS IMAGING DD 001" } , { 0x2001, 0x000a, 0x2001, 0x000a, EVR_IS, "SliceNumberMR", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Philips Imaging DD 001" } , { 0x2001, 0x000a, 0x2001, 0x000a, EVR_IS, "SliceNumberMR", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS IMAGING DD 001" } , { 0x2001, 0x000b, 0x2001, 0x000b, EVR_CS, "SliceOrientation", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Philips Imaging DD 001" } , { 0x2001, 0x000b, 0x2001, 0x000b, EVR_CS, "SliceOrientation", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS IMAGING DD 001" } , { 0x2001, 0x0011, 0x2001, 0x0011, EVR_FL, "DiffusionEchoTime", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Philips Imaging DD 001" } , { 0x2001, 0x0011, 0x2001, 0x0011, EVR_FL, "DiffusionEchoTime", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS IMAGING DD 001" } , { 0x2001, 0x0012, 0x2001, 0x0012, EVR_CS, "DynamicSeries", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Philips Imaging DD 001" } , { 0x2001, 0x0012, 0x2001, 0x0012, EVR_CS, "DynamicSeries", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS IMAGING DD 001" } , { 0x2001, 0x0013, 0x2001, 0x0013, EVR_SL, "EPIFactor", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Philips Imaging DD 001" } , { 0x2001, 0x0013, 0x2001, 0x0013, EVR_SL, "EPIFactor", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS IMAGING DD 001" } , { 0x2001, 0x0014, 0x2001, 0x0014, EVR_SL, "NumberOfEchoes", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Philips Imaging DD 001" } , { 0x2001, 0x0014, 0x2001, 0x0014, EVR_SL, "NumberOfEchoes", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS IMAGING DD 001" } , { 0x2001, 0x0015, 0x2001, 0x0015, EVR_SS, "NumberOfLocations", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Philips Imaging DD 001" } , { 0x2001, 0x0015, 0x2001, 0x0015, EVR_SS, "NumberOfLocations", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS IMAGING DD 001" } , { 0x2001, 0x0016, 0x2001, 0x0016, EVR_SS, "NumberOfPCDirections", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Philips Imaging DD 001" } , { 0x2001, 0x0016, 0x2001, 0x0016, EVR_SS, "NumberOfPCDirections", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS IMAGING DD 001" } , { 0x2001, 0x0017, 0x2001, 0x0017, EVR_SL, "NumberOfPhasesMR", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Philips Imaging DD 001" } , { 0x2001, 0x0017, 0x2001, 0x0017, EVR_SL, "NumberOfPhasesMR", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS IMAGING DD 001" } , { 0x2001, 0x0018, 0x2001, 0x0018, EVR_SL, "NumberOfSlicesMR", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Philips Imaging DD 001" } , { 0x2001, 0x0018, 0x2001, 0x0018, EVR_SL, "NumberOfSlicesMR", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS IMAGING DD 001" } , { 0x2001, 0x0019, 0x2001, 0x0019, EVR_CS, "PartialMatrixScanned", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Philips Imaging DD 001" } , { 0x2001, 0x0019, 0x2001, 0x0019, EVR_CS, "PartialMatrixScanned", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS IMAGING DD 001" } , { 0x2001, 0x001a, 0x2001, 0x001a, EVR_FL, "PCVelocity", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Philips Imaging DD 001" } , { 0x2001, 0x001a, 0x2001, 0x001a, EVR_FL, "PCVelocity", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS IMAGING DD 001" } , { 0x2001, 0x001b, 0x2001, 0x001b, EVR_FL, "PrepulseDelay", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Philips Imaging DD 001" } , { 0x2001, 0x001b, 0x2001, 0x001b, EVR_FL, "PrepulseDelay", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS IMAGING DD 001" } , { 0x2001, 0x001c, 0x2001, 0x001c, EVR_CS, "PrepulseType", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Philips Imaging DD 001" } , { 0x2001, 0x001c, 0x2001, 0x001c, EVR_CS, "PrepulseType", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS IMAGING DD 001" } , { 0x2001, 0x001d, 0x2001, 0x001d, EVR_IS, "ReconstructionNumberMR", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Philips Imaging DD 001" } , { 0x2001, 0x001d, 0x2001, 0x001d, EVR_IS, "ReconstructionNumberMR", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS IMAGING DD 001" } , { 0x2001, 0x001f, 0x2001, 0x001f, EVR_CS, "RespirationSync", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Philips Imaging DD 001" } , { 0x2001, 0x001f, 0x2001, 0x001f, EVR_CS, "RespirationSync", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS IMAGING DD 001" } , { 0x2001, 0x0021, 0x2001, 0x0021, EVR_CS, "SPIR", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Philips Imaging DD 001" } , { 0x2001, 0x0021, 0x2001, 0x0021, EVR_CS, "SPIR", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS IMAGING DD 001" } , { 0x2001, 0x0022, 0x2001, 0x0022, EVR_FL, "WaterFatShift", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Philips Imaging DD 001" } , { 0x2001, 0x0022, 0x2001, 0x0022, EVR_FL, "WaterFatShift", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS IMAGING DD 001" } , { 0x2001, 0x0023, 0x2001, 0x0023, EVR_DS, "FlipAnglePhilips", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Philips Imaging DD 001" } , { 0x2001, 0x0023, 0x2001, 0x0023, EVR_DS, "FlipAnglePhilips", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS IMAGING DD 001" } , { 0x2001, 0x0025, 0x2001, 0x0025, EVR_SH, "EchoTimeDisplayMR", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Philips Imaging DD 001" } , { 0x2001, 0x0025, 0x2001, 0x0025, EVR_SH, "EchoTimeDisplayMR", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS IMAGING DD 001" } , { 0x2001, 0x002d, 0x2001, 0x002d, EVR_SS, "StackNumberOfSlices", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Philips Imaging DD 001" } , { 0x2001, 0x002d, 0x2001, 0x002d, EVR_SS, "StackNumberOfSlices", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS IMAGING DD 001" } , { 0x2001, 0x0032, 0x2001, 0x0032, EVR_FL, "StackRadialAngle", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Philips Imaging DD 001" } , { 0x2001, 0x0032, 0x2001, 0x0032, EVR_FL, "StackRadialAngle", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS IMAGING DD 001" } , { 0x2001, 0x0033, 0x2001, 0x0033, EVR_CS, "StackRadialAxis", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Philips Imaging DD 001" } , { 0x2001, 0x0033, 0x2001, 0x0033, EVR_CS, "StackRadialAxis", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS IMAGING DD 001" } , { 0x2001, 0x0035, 0x2001, 0x0035, EVR_SS, "StackSliceNumber", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Philips Imaging DD 001" } , { 0x2001, 0x0035, 0x2001, 0x0035, EVR_SS, "StackSliceNumber", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS IMAGING DD 001" } , { 0x2001, 0x0036, 0x2001, 0x0036, EVR_CS, "StackType", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Philips Imaging DD 001" } , { 0x2001, 0x0036, 0x2001, 0x0036, EVR_CS, "StackType", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS IMAGING DD 001" } , { 0x2001, 0x003f, 0x2001, 0x003f, EVR_CS, "ZoomMode", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Philips Imaging DD 001" } , { 0x2001, 0x003f, 0x2001, 0x003f, EVR_CS, "ZoomMode", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS IMAGING DD 001" } , { 0x2001, 0x005f, 0x2001, 0x005f, EVR_SQ, "StackSequence", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Philips Imaging DD 001" } , { 0x2001, 0x005f, 0x2001, 0x005f, EVR_SQ, "StackSequence", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS IMAGING DD 001" } , { 0x2001, 0x0060, 0x2001, 0x0060, EVR_SL, "NumberOfStacks", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Philips Imaging DD 001" } , { 0x2001, 0x0060, 0x2001, 0x0060, EVR_SL, "NumberOfStacks", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS IMAGING DD 001" } , { 0x2001, 0x0061, 0x2001, 0x0061, EVR_CS, "SeriesTransmitted", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Philips Imaging DD 001" } , { 0x2001, 0x0061, 0x2001, 0x0061, EVR_CS, "SeriesTransmitted", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS IMAGING DD 001" } , { 0x2001, 0x0062, 0x2001, 0x0062, EVR_CS, "SeriesCommitted", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Philips Imaging DD 001" } , { 0x2001, 0x0062, 0x2001, 0x0062, EVR_CS, "SeriesCommitted", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS IMAGING DD 001" } , { 0x2001, 0x0063, 0x2001, 0x0063, EVR_CS, "ExaminationSource", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Philips Imaging DD 001" } , { 0x2001, 0x0063, 0x2001, 0x0063, EVR_CS, "ExaminationSource", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS IMAGING DD 001" } , { 0x2001, 0x007b, 0x2001, 0x007b, EVR_IS, "AcquisitionNumber", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Philips Imaging DD 001" } , { 0x2001, 0x007b, 0x2001, 0x007b, EVR_IS, "AcquisitionNumber", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS IMAGING DD 001" } , { 0x2001, 0x0081, 0x2001, 0x0081, EVR_IS, "NumberOfDynamicScans", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Philips Imaging DD 001" } , { 0x2001, 0x0081, 0x2001, 0x0081, EVR_IS, "NumberOfDynamicScans", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS IMAGING DD 001" } , { 0x2005, 0x0002, 0x2005, 0x0002, EVR_SQ, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Philips MR Imaging DD 005" } , { 0x2005, 0x0005, 0x2005, 0x0005, EVR_CS, "SynergyReconstructionType", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Philips MR Imaging DD 001" } , { 0x2005, 0x0005, 0x2005, 0x0005, EVR_CS, "SynergyReconstructionType", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR IMAGING DD 001" } , { 0x2005, 0x001e, 0x2005, 0x001e, EVR_SH, "MIPProtocol", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Philips MR Imaging DD 001" } , { 0x2005, 0x001e, 0x2005, 0x001e, EVR_SH, "MIPProtocol", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR IMAGING DD 001" } , { 0x2005, 0x001f, 0x2005, 0x001f, EVR_SH, "MPRProtocol", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Philips MR Imaging DD 001" } , { 0x2005, 0x001f, 0x2005, 0x001f, EVR_SH, "MPRProtocol", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR IMAGING DD 001" } , { 0x2005, 0x0020, 0x2005, 0x0020, EVR_SL, "NumberOfChemicalShifts", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Philips MR Imaging DD 001" } , { 0x2005, 0x0020, 0x2005, 0x0020, EVR_SL, "NumberOfChemicalShifts", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR IMAGING DD 001" } , { 0x2005, 0x002d, 0x2005, 0x002d, EVR_SS, "NumberOfStackSlices", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Philips MR Imaging DD 001" } , { 0x2005, 0x002d, 0x2005, 0x002d, EVR_SS, "NumberOfStackSlices", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR IMAGING DD 001" } , { 0x2005, 0x0032, 0x2005, 0x0032, EVR_FL, "StackRadialAngle", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Philips MR Imaging DD 001" } , { 0x2005, 0x0032, 0x2005, 0x0032, EVR_FL, "StackRadialAngle", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR IMAGING DD 001" } , { 0x2005, 0x0033, 0x2005, 0x0033, EVR_CS, "StackRadialAxis", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Philips MR Imaging DD 001" } , { 0x2005, 0x0033, 0x2005, 0x0033, EVR_CS, "StackRadialAxis", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR IMAGING DD 001" } , { 0x2005, 0x0035, 0x2005, 0x0035, EVR_SS, "StackSliceNumber", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Philips MR Imaging DD 001" } , { 0x2005, 0x0035, 0x2005, 0x0035, EVR_SS, "StackSliceNumber", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR IMAGING DD 001" } , { 0x2005, 0x0036, 0x2005, 0x0036, EVR_CS, "StackType", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Philips MR Imaging DD 001" } , { 0x2005, 0x0036, 0x2005, 0x0036, EVR_CS, "StackType", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR IMAGING DD 001" } , { 0x2005, 0x005f, 0x2005, 0x005f, EVR_SQ, "StackSequence", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Philips MR Imaging DD 001" } , { 0x2005, 0x005f, 0x2005, 0x005f, EVR_SQ, "StackSequence", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR IMAGING DD 001" } , { 0x2005, 0x0083, 0x2005, 0x0083, EVR_SQ, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Philips MR Imaging DD 001" } , { 0x2005, 0x0083, 0x2005, 0x0083, EVR_SQ, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR IMAGING DD 001" } , { 0x2005, 0x00a1, 0x2005, 0x00a1, EVR_CS, "SyncraScanType", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Philips MR Imaging DD 001" } , { 0x2005, 0x00a1, 0x2005, 0x00a1, EVR_CS, "SyncraScanType", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR IMAGING DD 001" } #endif , { 0x2010, 0x0010, 0x2010, 0x0010, EVR_ST, "ImageDisplayFormat", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2010, 0x0030, 0x2010, 0x0030, EVR_CS, "AnnotationDisplayFormatID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2010, 0x0040, 0x2010, 0x0040, EVR_CS, "FilmOrientation", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2010, 0x0050, 0x2010, 0x0050, EVR_CS, "FilmSizeID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2010, 0x0052, 0x2010, 0x0052, EVR_CS, "PrinterResolutionID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2010, 0x0054, 0x2010, 0x0054, EVR_CS, "DefaultPrinterResolutionID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2010, 0x0060, 0x2010, 0x0060, EVR_CS, "MagnificationType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2010, 0x0080, 0x2010, 0x0080, EVR_CS, "SmoothingType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2010, 0x00a6, 0x2010, 0x00a6, EVR_CS, "DefaultMagnificationType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2010, 0x00a7, 0x2010, 0x00a7, EVR_CS, "OtherMagnificationTypesAvailable", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2010, 0x00a8, 0x2010, 0x00a8, EVR_CS, "DefaultSmoothingType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2010, 0x00a9, 0x2010, 0x00a9, EVR_CS, "OtherSmoothingTypesAvailable", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2010, 0x0100, 0x2010, 0x0100, EVR_CS, "BorderDensity", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2010, 0x0110, 0x2010, 0x0110, EVR_CS, "EmptyImageDensity", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2010, 0x0120, 0x2010, 0x0120, EVR_US, "MinDensity", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2010, 0x0130, 0x2010, 0x0130, EVR_US, "MaxDensity", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2010, 0x0140, 0x2010, 0x0140, EVR_CS, "Trim", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2010, 0x0150, 0x2010, 0x0150, EVR_ST, "ConfigurationInformation", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2010, 0x0152, 0x2010, 0x0152, EVR_LT, "ConfigurationInformationDescription", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2010, 0x0154, 0x2010, 0x0154, EVR_IS, "MaximumCollatedFilms", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2010, 0x015e, 0x2010, 0x015e, EVR_US, "Illumination", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2010, 0x0160, 0x2010, 0x0160, EVR_US, "ReflectedAmbientLight", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2010, 0x0376, 0x2010, 0x0376, EVR_DS, "PrinterPixelSpacing", 2, 2, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2010, 0x0500, 0x2010, 0x0500, EVR_SQ, "ReferencedFilmSessionSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2010, 0x0510, 0x2010, 0x0510, EVR_SQ, "ReferencedImageBoxSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2010, 0x0520, 0x2010, 0x0520, EVR_SQ, "ReferencedBasicAnnotationBoxSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } #ifdef WITH_PRIVATE_TAGS , { 0x2011, 0x0011, 0x2011, 0x0011, EVR_CS, "ImagePositionSpecifyingFlag", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } #endif , { 0x2020, 0x0010, 0x2020, 0x0010, EVR_US, "ImageBoxPosition", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2020, 0x0020, 0x2020, 0x0020, EVR_CS, "Polarity", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2020, 0x0030, 0x2020, 0x0030, EVR_DS, "RequestedImageSize", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2020, 0x0040, 0x2020, 0x0040, EVR_CS, "RequestedDecimateCropBehavior", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2020, 0x0050, 0x2020, 0x0050, EVR_CS, "RequestedResolutionID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2020, 0x00a0, 0x2020, 0x00a0, EVR_CS, "RequestedImageSizeFlag", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2020, 0x00a2, 0x2020, 0x00a2, EVR_CS, "DecimateCropResult", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2020, 0x0110, 0x2020, 0x0110, EVR_SQ, "BasicGrayscaleImageSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2020, 0x0111, 0x2020, 0x0111, EVR_SQ, "BasicColorImageSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2020, 0x0130, 0x2020, 0x0130, EVR_SQ, "RETIRED_ReferencedImageOverlayBoxSequence", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2020, 0x0140, 0x2020, 0x0140, EVR_SQ, "RETIRED_ReferencedVOILUTBoxSequence", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2030, 0x0010, 0x2030, 0x0010, EVR_US, "AnnotationPosition", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2030, 0x0020, 0x2030, 0x0020, EVR_LO, "TextString", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2040, 0x0010, 0x2040, 0x0010, EVR_SQ, "RETIRED_ReferencedOverlayPlaneSequence", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2040, 0x0011, 0x2040, 0x0011, EVR_US, "RETIRED_ReferencedOverlayPlaneGroups", 1, 99, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2040, 0x0020, 0x2040, 0x0020, EVR_SQ, "RETIRED_OverlayPixelDataSequence", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2040, 0x0060, 0x2040, 0x0060, EVR_CS, "RETIRED_OverlayMagnificationType", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2040, 0x0070, 0x2040, 0x0070, EVR_CS, "RETIRED_OverlaySmoothingType", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2040, 0x0072, 0x2040, 0x0072, EVR_CS, "RETIRED_OverlayOrImageMagnification", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2040, 0x0074, 0x2040, 0x0074, EVR_US, "RETIRED_MagnifyToNumberOfColumns", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2040, 0x0080, 0x2040, 0x0080, EVR_CS, "RETIRED_OverlayForegroundDensity", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2040, 0x0082, 0x2040, 0x0082, EVR_CS, "RETIRED_OverlayBackgroundDensity", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2040, 0x0090, 0x2040, 0x0090, EVR_CS, "RETIRED_OverlayMode", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2040, 0x0100, 0x2040, 0x0100, EVR_CS, "RETIRED_ThresholdDensity", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2040, 0x0500, 0x2040, 0x0500, EVR_SQ, "RETIRED_ReferencedImageBoxSequenceRetired", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2050, 0x0010, 0x2050, 0x0010, EVR_SQ, "PresentationLUTSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2050, 0x0020, 0x2050, 0x0020, EVR_CS, "PresentationLUTShape", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2050, 0x0500, 0x2050, 0x0500, EVR_SQ, "ReferencedPresentationLUTSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2100, 0x0010, 0x2100, 0x0010, EVR_SH, "RETIRED_PrintJobID", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2100, 0x0020, 0x2100, 0x0020, EVR_CS, "ExecutionStatus", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2100, 0x0030, 0x2100, 0x0030, EVR_CS, "ExecutionStatusInfo", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2100, 0x0040, 0x2100, 0x0040, EVR_DA, "CreationDate", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2100, 0x0050, 0x2100, 0x0050, EVR_TM, "CreationTime", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2100, 0x0070, 0x2100, 0x0070, EVR_AE, "Originator", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2100, 0x0140, 0x2100, 0x0140, EVR_AE, "RETIRED_DestinationAE", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2100, 0x0160, 0x2100, 0x0160, EVR_SH, "OwnerID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2100, 0x0170, 0x2100, 0x0170, EVR_IS, "NumberOfFilms", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2100, 0x0500, 0x2100, 0x0500, EVR_SQ, "RETIRED_ReferencedPrintJobSequencePullStoredPrint", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2110, 0x0010, 0x2110, 0x0010, EVR_CS, "PrinterStatus", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2110, 0x0020, 0x2110, 0x0020, EVR_CS, "PrinterStatusInfo", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2110, 0x0030, 0x2110, 0x0030, EVR_LO, "PrinterName", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2110, 0x0099, 0x2110, 0x0099, EVR_SH, "RETIRED_PrintQueueID", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2120, 0x0010, 0x2120, 0x0010, EVR_CS, "RETIRED_QueueStatus", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2120, 0x0050, 0x2120, 0x0050, EVR_SQ, "RETIRED_PrintJobDescriptionSequence", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2120, 0x0070, 0x2120, 0x0070, EVR_SQ, "RETIRED_ReferencedPrintJobSequence", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2130, 0x0010, 0x2130, 0x0010, EVR_SQ, "RETIRED_PrintManagementCapabilitiesSequence", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2130, 0x0015, 0x2130, 0x0015, EVR_SQ, "RETIRED_PrinterCharacteristicsSequence", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2130, 0x0030, 0x2130, 0x0030, EVR_SQ, "RETIRED_FilmBoxContentSequence", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2130, 0x0040, 0x2130, 0x0040, EVR_SQ, "RETIRED_ImageBoxContentSequence", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2130, 0x0050, 0x2130, 0x0050, EVR_SQ, "RETIRED_AnnotationContentSequence", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2130, 0x0060, 0x2130, 0x0060, EVR_SQ, "RETIRED_ImageOverlayBoxContentSequence", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2130, 0x0080, 0x2130, 0x0080, EVR_SQ, "RETIRED_PresentationLUTContentSequence", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2130, 0x00a0, 0x2130, 0x00a0, EVR_SQ, "RETIRED_ProposedStudySequence", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2130, 0x00c0, 0x2130, 0x00c0, EVR_SQ, "RETIRED_OriginalImageSequence", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2200, 0x0001, 0x2200, 0x0001, EVR_CS, "LabelUsingInformationExtractedFromInstances", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2200, 0x0002, 0x2200, 0x0002, EVR_UT, "LabelText", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2200, 0x0003, 0x2200, 0x0003, EVR_CS, "LabelStyleSelection", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2200, 0x0004, 0x2200, 0x0004, EVR_LT, "MediaDisposition", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2200, 0x0005, 0x2200, 0x0005, EVR_LT, "BarcodeValue", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2200, 0x0006, 0x2200, 0x0006, EVR_CS, "BarcodeSymbology", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2200, 0x0007, 0x2200, 0x0007, EVR_CS, "AllowMediaSplitting", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2200, 0x0008, 0x2200, 0x0008, EVR_CS, "IncludeNonDICOMObjects", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2200, 0x0009, 0x2200, 0x0009, EVR_CS, "IncludeDisplayApplication", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2200, 0x000a, 0x2200, 0x000a, EVR_CS, "PreserveCompositeInstancesAfterMediaCreation", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2200, 0x000b, 0x2200, 0x000b, EVR_US, "TotalNumberOfPiecesOfMediaCreated", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2200, 0x000c, 0x2200, 0x000c, EVR_LO, "RequestedMediaApplicationProfile", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2200, 0x000d, 0x2200, 0x000d, EVR_SQ, "ReferencedStorageMediaSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2200, 0x000e, 0x2200, 0x000e, EVR_AT, "FailureAttributes", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2200, 0x000f, 0x2200, 0x000f, EVR_CS, "AllowLossyCompression", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x2200, 0x0020, 0x2200, 0x0020, EVR_CS, "RequestPriority", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3002, 0x0002, 0x3002, 0x0002, EVR_SH, "RTImageLabel", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3002, 0x0003, 0x3002, 0x0003, EVR_LO, "RTImageName", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3002, 0x0004, 0x3002, 0x0004, EVR_ST, "RTImageDescription", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3002, 0x000a, 0x3002, 0x000a, EVR_CS, "ReportedValuesOrigin", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3002, 0x000c, 0x3002, 0x000c, EVR_CS, "RTImagePlane", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3002, 0x000d, 0x3002, 0x000d, EVR_DS, "XRayImageReceptorTranslation", 3, 3, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3002, 0x000e, 0x3002, 0x000e, EVR_DS, "XRayImageReceptorAngle", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3002, 0x0010, 0x3002, 0x0010, EVR_DS, "RTImageOrientation", 6, 6, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3002, 0x0011, 0x3002, 0x0011, EVR_DS, "ImagePlanePixelSpacing", 2, 2, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3002, 0x0012, 0x3002, 0x0012, EVR_DS, "RTImagePosition", 2, 2, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3002, 0x0020, 0x3002, 0x0020, EVR_SH, "RadiationMachineName", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3002, 0x0022, 0x3002, 0x0022, EVR_DS, "RadiationMachineSAD", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3002, 0x0024, 0x3002, 0x0024, EVR_DS, "RadiationMachineSSD", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3002, 0x0026, 0x3002, 0x0026, EVR_DS, "RTImageSID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3002, 0x0028, 0x3002, 0x0028, EVR_DS, "SourceToReferenceObjectDistance", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3002, 0x0029, 0x3002, 0x0029, EVR_IS, "FractionNumber", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3002, 0x0030, 0x3002, 0x0030, EVR_SQ, "ExposureSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3002, 0x0032, 0x3002, 0x0032, EVR_DS, "MetersetExposure", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3002, 0x0034, 0x3002, 0x0034, EVR_DS, "DiaphragmPosition", 4, 4, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3002, 0x0040, 0x3002, 0x0040, EVR_SQ, "FluenceMapSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3002, 0x0041, 0x3002, 0x0041, EVR_CS, "FluenceDataSource", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3002, 0x0042, 0x3002, 0x0042, EVR_DS, "FluenceDataScale", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3002, 0x0050, 0x3002, 0x0050, EVR_SQ, "PrimaryFluenceModeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3002, 0x0051, 0x3002, 0x0051, EVR_CS, "FluenceMode", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3002, 0x0052, 0x3002, 0x0052, EVR_SH, "FluenceModeID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3004, 0x0001, 0x3004, 0x0001, EVR_CS, "DVHType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3004, 0x0002, 0x3004, 0x0002, EVR_CS, "DoseUnits", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3004, 0x0004, 0x3004, 0x0004, EVR_CS, "DoseType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3004, 0x0006, 0x3004, 0x0006, EVR_LO, "DoseComment", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3004, 0x0008, 0x3004, 0x0008, EVR_DS, "NormalizationPoint", 3, 3, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3004, 0x000a, 0x3004, 0x000a, EVR_CS, "DoseSummationType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3004, 0x000c, 0x3004, 0x000c, EVR_DS, "GridFrameOffsetVector", 2, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3004, 0x000e, 0x3004, 0x000e, EVR_DS, "DoseGridScaling", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3004, 0x0010, 0x3004, 0x0010, EVR_SQ, "RTDoseROISequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3004, 0x0012, 0x3004, 0x0012, EVR_DS, "DoseValue", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3004, 0x0014, 0x3004, 0x0014, EVR_CS, "TissueHeterogeneityCorrection", 1, 3, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3004, 0x0040, 0x3004, 0x0040, EVR_DS, "DVHNormalizationPoint", 3, 3, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3004, 0x0042, 0x3004, 0x0042, EVR_DS, "DVHNormalizationDoseValue", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3004, 0x0050, 0x3004, 0x0050, EVR_SQ, "DVHSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3004, 0x0052, 0x3004, 0x0052, EVR_DS, "DVHDoseScaling", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3004, 0x0054, 0x3004, 0x0054, EVR_CS, "DVHVolumeUnits", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3004, 0x0056, 0x3004, 0x0056, EVR_IS, "DVHNumberOfBins", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3004, 0x0058, 0x3004, 0x0058, EVR_DS, "DVHData", 2, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3004, 0x0060, 0x3004, 0x0060, EVR_SQ, "DVHReferencedROISequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3004, 0x0062, 0x3004, 0x0062, EVR_CS, "DVHROIContributionType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3004, 0x0070, 0x3004, 0x0070, EVR_DS, "DVHMinimumDose", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3004, 0x0072, 0x3004, 0x0072, EVR_DS, "DVHMaximumDose", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3004, 0x0074, 0x3004, 0x0074, EVR_DS, "DVHMeanDose", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3006, 0x0002, 0x3006, 0x0002, EVR_SH, "StructureSetLabel", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3006, 0x0004, 0x3006, 0x0004, EVR_LO, "StructureSetName", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3006, 0x0006, 0x3006, 0x0006, EVR_ST, "StructureSetDescription", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3006, 0x0008, 0x3006, 0x0008, EVR_DA, "StructureSetDate", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3006, 0x0009, 0x3006, 0x0009, EVR_TM, "StructureSetTime", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3006, 0x0010, 0x3006, 0x0010, EVR_SQ, "ReferencedFrameOfReferenceSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3006, 0x0012, 0x3006, 0x0012, EVR_SQ, "RTReferencedStudySequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3006, 0x0014, 0x3006, 0x0014, EVR_SQ, "RTReferencedSeriesSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3006, 0x0016, 0x3006, 0x0016, EVR_SQ, "ContourImageSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3006, 0x0020, 0x3006, 0x0020, EVR_SQ, "StructureSetROISequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3006, 0x0022, 0x3006, 0x0022, EVR_IS, "ROINumber", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3006, 0x0024, 0x3006, 0x0024, EVR_UI, "ReferencedFrameOfReferenceUID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3006, 0x0026, 0x3006, 0x0026, EVR_LO, "ROIName", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3006, 0x0028, 0x3006, 0x0028, EVR_ST, "ROIDescription", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3006, 0x002a, 0x3006, 0x002a, EVR_IS, "ROIDisplayColor", 3, 3, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3006, 0x002c, 0x3006, 0x002c, EVR_DS, "ROIVolume", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3006, 0x0030, 0x3006, 0x0030, EVR_SQ, "RTRelatedROISequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3006, 0x0033, 0x3006, 0x0033, EVR_CS, "RTROIRelationship", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3006, 0x0036, 0x3006, 0x0036, EVR_CS, "ROIGenerationAlgorithm", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3006, 0x0038, 0x3006, 0x0038, EVR_LO, "ROIGenerationDescription", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3006, 0x0039, 0x3006, 0x0039, EVR_SQ, "ROIContourSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3006, 0x0040, 0x3006, 0x0040, EVR_SQ, "ContourSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3006, 0x0042, 0x3006, 0x0042, EVR_CS, "ContourGeometricType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3006, 0x0044, 0x3006, 0x0044, EVR_DS, "ContourSlabThickness", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3006, 0x0045, 0x3006, 0x0045, EVR_DS, "ContourOffsetVector", 3, 3, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3006, 0x0046, 0x3006, 0x0046, EVR_IS, "NumberOfContourPoints", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3006, 0x0048, 0x3006, 0x0048, EVR_IS, "ContourNumber", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3006, 0x0049, 0x3006, 0x0049, EVR_IS, "AttachedContours", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3006, 0x0050, 0x3006, 0x0050, EVR_DS, "ContourData", 3, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3006, 0x0080, 0x3006, 0x0080, EVR_SQ, "RTROIObservationsSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3006, 0x0082, 0x3006, 0x0082, EVR_IS, "ObservationNumber", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3006, 0x0084, 0x3006, 0x0084, EVR_IS, "ReferencedROINumber", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3006, 0x0085, 0x3006, 0x0085, EVR_SH, "ROIObservationLabel", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3006, 0x0086, 0x3006, 0x0086, EVR_SQ, "RTROIIdentificationCodeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3006, 0x0088, 0x3006, 0x0088, EVR_ST, "ROIObservationDescription", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3006, 0x00a0, 0x3006, 0x00a0, EVR_SQ, "RelatedRTROIObservationsSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3006, 0x00a4, 0x3006, 0x00a4, EVR_CS, "RTROIInterpretedType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3006, 0x00a6, 0x3006, 0x00a6, EVR_PN, "ROIInterpreter", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3006, 0x00b0, 0x3006, 0x00b0, EVR_SQ, "ROIPhysicalPropertiesSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3006, 0x00b2, 0x3006, 0x00b2, EVR_CS, "ROIPhysicalProperty", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3006, 0x00b4, 0x3006, 0x00b4, EVR_DS, "ROIPhysicalPropertyValue", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3006, 0x00b6, 0x3006, 0x00b6, EVR_SQ, "ROIElementalCompositionSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3006, 0x00b7, 0x3006, 0x00b7, EVR_US, "ROIElementalCompositionAtomicNumber", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3006, 0x00b8, 0x3006, 0x00b8, EVR_FL, "ROIElementalCompositionAtomicMassFraction", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3006, 0x00c0, 0x3006, 0x00c0, EVR_SQ, "FrameOfReferenceRelationshipSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3006, 0x00c2, 0x3006, 0x00c2, EVR_UI, "RelatedFrameOfReferenceUID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3006, 0x00c4, 0x3006, 0x00c4, EVR_CS, "FrameOfReferenceTransformationType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3006, 0x00c6, 0x3006, 0x00c6, EVR_DS, "FrameOfReferenceTransformationMatrix", 16, 16, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3006, 0x00c8, 0x3006, 0x00c8, EVR_LO, "FrameOfReferenceTransformationComment", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x0010, 0x3008, 0x0010, EVR_SQ, "MeasuredDoseReferenceSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x0012, 0x3008, 0x0012, EVR_ST, "MeasuredDoseDescription", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x0014, 0x3008, 0x0014, EVR_CS, "MeasuredDoseType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x0016, 0x3008, 0x0016, EVR_DS, "MeasuredDoseValue", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x0020, 0x3008, 0x0020, EVR_SQ, "TreatmentSessionBeamSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x0021, 0x3008, 0x0021, EVR_SQ, "TreatmentSessionIonBeamSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x0022, 0x3008, 0x0022, EVR_IS, "CurrentFractionNumber", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x0024, 0x3008, 0x0024, EVR_DA, "TreatmentControlPointDate", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x0025, 0x3008, 0x0025, EVR_TM, "TreatmentControlPointTime", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x002a, 0x3008, 0x002a, EVR_CS, "TreatmentTerminationStatus", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x002b, 0x3008, 0x002b, EVR_SH, "TreatmentTerminationCode", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x002c, 0x3008, 0x002c, EVR_CS, "TreatmentVerificationStatus", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x0030, 0x3008, 0x0030, EVR_SQ, "ReferencedTreatmentRecordSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x0032, 0x3008, 0x0032, EVR_DS, "SpecifiedPrimaryMeterset", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x0033, 0x3008, 0x0033, EVR_DS, "SpecifiedSecondaryMeterset", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x0036, 0x3008, 0x0036, EVR_DS, "DeliveredPrimaryMeterset", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x0037, 0x3008, 0x0037, EVR_DS, "DeliveredSecondaryMeterset", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x003a, 0x3008, 0x003a, EVR_DS, "SpecifiedTreatmentTime", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x003b, 0x3008, 0x003b, EVR_DS, "DeliveredTreatmentTime", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x0040, 0x3008, 0x0040, EVR_SQ, "ControlPointDeliverySequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x0041, 0x3008, 0x0041, EVR_SQ, "IonControlPointDeliverySequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x0042, 0x3008, 0x0042, EVR_DS, "SpecifiedMeterset", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x0044, 0x3008, 0x0044, EVR_DS, "DeliveredMeterset", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x0045, 0x3008, 0x0045, EVR_FL, "MetersetRateSet", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x0046, 0x3008, 0x0046, EVR_FL, "MetersetRateDelivered", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x0047, 0x3008, 0x0047, EVR_FL, "ScanSpotMetersetsDelivered", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x0048, 0x3008, 0x0048, EVR_DS, "DoseRateDelivered", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x0050, 0x3008, 0x0050, EVR_SQ, "TreatmentSummaryCalculatedDoseReferenceSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x0052, 0x3008, 0x0052, EVR_DS, "CumulativeDoseToDoseReference", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x0054, 0x3008, 0x0054, EVR_DA, "FirstTreatmentDate", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x0056, 0x3008, 0x0056, EVR_DA, "MostRecentTreatmentDate", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x005a, 0x3008, 0x005a, EVR_IS, "NumberOfFractionsDelivered", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x0060, 0x3008, 0x0060, EVR_SQ, "OverrideSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x0061, 0x3008, 0x0061, EVR_AT, "ParameterSequencePointer", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x0062, 0x3008, 0x0062, EVR_AT, "OverrideParameterPointer", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x0063, 0x3008, 0x0063, EVR_IS, "ParameterItemIndex", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x0064, 0x3008, 0x0064, EVR_IS, "MeasuredDoseReferenceNumber", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x0065, 0x3008, 0x0065, EVR_AT, "ParameterPointer", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x0066, 0x3008, 0x0066, EVR_ST, "OverrideReason", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x0068, 0x3008, 0x0068, EVR_SQ, "CorrectedParameterSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x006a, 0x3008, 0x006a, EVR_FL, "CorrectionValue", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x0070, 0x3008, 0x0070, EVR_SQ, "CalculatedDoseReferenceSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x0072, 0x3008, 0x0072, EVR_IS, "CalculatedDoseReferenceNumber", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x0074, 0x3008, 0x0074, EVR_ST, "CalculatedDoseReferenceDescription", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x0076, 0x3008, 0x0076, EVR_DS, "CalculatedDoseReferenceDoseValue", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x0078, 0x3008, 0x0078, EVR_DS, "StartMeterset", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x007a, 0x3008, 0x007a, EVR_DS, "EndMeterset", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x0080, 0x3008, 0x0080, EVR_SQ, "ReferencedMeasuredDoseReferenceSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x0082, 0x3008, 0x0082, EVR_IS, "ReferencedMeasuredDoseReferenceNumber", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x0090, 0x3008, 0x0090, EVR_SQ, "ReferencedCalculatedDoseReferenceSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x0092, 0x3008, 0x0092, EVR_IS, "ReferencedCalculatedDoseReferenceNumber", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x00a0, 0x3008, 0x00a0, EVR_SQ, "BeamLimitingDeviceLeafPairsSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x00b0, 0x3008, 0x00b0, EVR_SQ, "RecordedWedgeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x00c0, 0x3008, 0x00c0, EVR_SQ, "RecordedCompensatorSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x00d0, 0x3008, 0x00d0, EVR_SQ, "RecordedBlockSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x00e0, 0x3008, 0x00e0, EVR_SQ, "TreatmentSummaryMeasuredDoseReferenceSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x00f0, 0x3008, 0x00f0, EVR_SQ, "RecordedSnoutSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x00f2, 0x3008, 0x00f2, EVR_SQ, "RecordedRangeShifterSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x00f4, 0x3008, 0x00f4, EVR_SQ, "RecordedLateralSpreadingDeviceSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x00f6, 0x3008, 0x00f6, EVR_SQ, "RecordedRangeModulatorSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x0100, 0x3008, 0x0100, EVR_SQ, "RecordedSourceSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x0105, 0x3008, 0x0105, EVR_LO, "SourceSerialNumber", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x0110, 0x3008, 0x0110, EVR_SQ, "TreatmentSessionApplicationSetupSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x0116, 0x3008, 0x0116, EVR_CS, "ApplicationSetupCheck", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x0120, 0x3008, 0x0120, EVR_SQ, "RecordedBrachyAccessoryDeviceSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x0122, 0x3008, 0x0122, EVR_IS, "ReferencedBrachyAccessoryDeviceNumber", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x0130, 0x3008, 0x0130, EVR_SQ, "RecordedChannelSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x0132, 0x3008, 0x0132, EVR_DS, "SpecifiedChannelTotalTime", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x0134, 0x3008, 0x0134, EVR_DS, "DeliveredChannelTotalTime", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x0136, 0x3008, 0x0136, EVR_IS, "SpecifiedNumberOfPulses", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x0138, 0x3008, 0x0138, EVR_IS, "DeliveredNumberOfPulses", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x013a, 0x3008, 0x013a, EVR_DS, "SpecifiedPulseRepetitionInterval", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x013c, 0x3008, 0x013c, EVR_DS, "DeliveredPulseRepetitionInterval", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x0140, 0x3008, 0x0140, EVR_SQ, "RecordedSourceApplicatorSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x0142, 0x3008, 0x0142, EVR_IS, "ReferencedSourceApplicatorNumber", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x0150, 0x3008, 0x0150, EVR_SQ, "RecordedChannelShieldSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x0152, 0x3008, 0x0152, EVR_IS, "ReferencedChannelShieldNumber", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x0160, 0x3008, 0x0160, EVR_SQ, "BrachyControlPointDeliveredSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x0162, 0x3008, 0x0162, EVR_DA, "SafePositionExitDate", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x0164, 0x3008, 0x0164, EVR_TM, "SafePositionExitTime", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x0166, 0x3008, 0x0166, EVR_DA, "SafePositionReturnDate", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x0168, 0x3008, 0x0168, EVR_TM, "SafePositionReturnTime", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x0200, 0x3008, 0x0200, EVR_CS, "CurrentTreatmentStatus", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x0202, 0x3008, 0x0202, EVR_ST, "TreatmentStatusComment", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x0220, 0x3008, 0x0220, EVR_SQ, "FractionGroupSummarySequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x0223, 0x3008, 0x0223, EVR_IS, "ReferencedFractionNumber", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x0224, 0x3008, 0x0224, EVR_CS, "FractionGroupType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x0230, 0x3008, 0x0230, EVR_CS, "BeamStopperPosition", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x0240, 0x3008, 0x0240, EVR_SQ, "FractionStatusSummarySequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x0250, 0x3008, 0x0250, EVR_DA, "TreatmentDate", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x3008, 0x0251, 0x3008, 0x0251, EVR_TM, "TreatmentTime", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0002, 0x300a, 0x0002, EVR_SH, "RTPlanLabel", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0003, 0x300a, 0x0003, EVR_LO, "RTPlanName", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0004, 0x300a, 0x0004, EVR_ST, "RTPlanDescription", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0006, 0x300a, 0x0006, EVR_DA, "RTPlanDate", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0007, 0x300a, 0x0007, EVR_TM, "RTPlanTime", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0009, 0x300a, 0x0009, EVR_LO, "TreatmentProtocols", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x000a, 0x300a, 0x000a, EVR_CS, "PlanIntent", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x000b, 0x300a, 0x000b, EVR_LO, "TreatmentSites", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x000c, 0x300a, 0x000c, EVR_CS, "RTPlanGeometry", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x000e, 0x300a, 0x000e, EVR_ST, "PrescriptionDescription", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0010, 0x300a, 0x0010, EVR_SQ, "DoseReferenceSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0012, 0x300a, 0x0012, EVR_IS, "DoseReferenceNumber", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0013, 0x300a, 0x0013, EVR_UI, "DoseReferenceUID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0014, 0x300a, 0x0014, EVR_CS, "DoseReferenceStructureType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0015, 0x300a, 0x0015, EVR_CS, "NominalBeamEnergyUnit", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0016, 0x300a, 0x0016, EVR_LO, "DoseReferenceDescription", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0018, 0x300a, 0x0018, EVR_DS, "DoseReferencePointCoordinates", 3, 3, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x001a, 0x300a, 0x001a, EVR_DS, "NominalPriorDose", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0020, 0x300a, 0x0020, EVR_CS, "DoseReferenceType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0021, 0x300a, 0x0021, EVR_DS, "ConstraintWeight", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0022, 0x300a, 0x0022, EVR_DS, "DeliveryWarningDose", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0023, 0x300a, 0x0023, EVR_DS, "DeliveryMaximumDose", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0025, 0x300a, 0x0025, EVR_DS, "TargetMinimumDose", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0026, 0x300a, 0x0026, EVR_DS, "TargetPrescriptionDose", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0027, 0x300a, 0x0027, EVR_DS, "TargetMaximumDose", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0028, 0x300a, 0x0028, EVR_DS, "TargetUnderdoseVolumeFraction", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x002a, 0x300a, 0x002a, EVR_DS, "OrganAtRiskFullVolumeDose", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x002b, 0x300a, 0x002b, EVR_DS, "OrganAtRiskLimitDose", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x002c, 0x300a, 0x002c, EVR_DS, "OrganAtRiskMaximumDose", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x002d, 0x300a, 0x002d, EVR_DS, "OrganAtRiskOverdoseVolumeFraction", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0040, 0x300a, 0x0040, EVR_SQ, "ToleranceTableSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0042, 0x300a, 0x0042, EVR_IS, "ToleranceTableNumber", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0043, 0x300a, 0x0043, EVR_SH, "ToleranceTableLabel", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0044, 0x300a, 0x0044, EVR_DS, "GantryAngleTolerance", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0046, 0x300a, 0x0046, EVR_DS, "BeamLimitingDeviceAngleTolerance", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0048, 0x300a, 0x0048, EVR_SQ, "BeamLimitingDeviceToleranceSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x004a, 0x300a, 0x004a, EVR_DS, "BeamLimitingDevicePositionTolerance", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x004b, 0x300a, 0x004b, EVR_FL, "SnoutPositionTolerance", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x004c, 0x300a, 0x004c, EVR_DS, "PatientSupportAngleTolerance", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x004e, 0x300a, 0x004e, EVR_DS, "TableTopEccentricAngleTolerance", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x004f, 0x300a, 0x004f, EVR_FL, "TableTopPitchAngleTolerance", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0050, 0x300a, 0x0050, EVR_FL, "TableTopRollAngleTolerance", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0051, 0x300a, 0x0051, EVR_DS, "TableTopVerticalPositionTolerance", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0052, 0x300a, 0x0052, EVR_DS, "TableTopLongitudinalPositionTolerance", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0053, 0x300a, 0x0053, EVR_DS, "TableTopLateralPositionTolerance", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0055, 0x300a, 0x0055, EVR_CS, "RTPlanRelationship", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0070, 0x300a, 0x0070, EVR_SQ, "FractionGroupSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0071, 0x300a, 0x0071, EVR_IS, "FractionGroupNumber", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0072, 0x300a, 0x0072, EVR_LO, "FractionGroupDescription", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0078, 0x300a, 0x0078, EVR_IS, "NumberOfFractionsPlanned", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0079, 0x300a, 0x0079, EVR_IS, "NumberOfFractionPatternDigitsPerDay", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x007a, 0x300a, 0x007a, EVR_IS, "RepeatFractionCycleLength", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x007b, 0x300a, 0x007b, EVR_LT, "FractionPattern", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0080, 0x300a, 0x0080, EVR_IS, "NumberOfBeams", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0082, 0x300a, 0x0082, EVR_DS, "BeamDoseSpecificationPoint", 3, 3, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0084, 0x300a, 0x0084, EVR_DS, "BeamDose", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0086, 0x300a, 0x0086, EVR_DS, "BeamMeterset", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0088, 0x300a, 0x0088, EVR_FL, "BeamDosePointDepth", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0089, 0x300a, 0x0089, EVR_FL, "BeamDosePointEquivalentDepth", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x008a, 0x300a, 0x008a, EVR_FL, "BeamDosePointSSD", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x00a0, 0x300a, 0x00a0, EVR_IS, "NumberOfBrachyApplicationSetups", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x00a2, 0x300a, 0x00a2, EVR_DS, "BrachyApplicationSetupDoseSpecificationPoint", 3, 3, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x00a4, 0x300a, 0x00a4, EVR_DS, "BrachyApplicationSetupDose", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x00b0, 0x300a, 0x00b0, EVR_SQ, "BeamSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x00b2, 0x300a, 0x00b2, EVR_SH, "TreatmentMachineName", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x00b3, 0x300a, 0x00b3, EVR_CS, "PrimaryDosimeterUnit", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x00b4, 0x300a, 0x00b4, EVR_DS, "SourceAxisDistance", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x00b6, 0x300a, 0x00b6, EVR_SQ, "BeamLimitingDeviceSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x00b8, 0x300a, 0x00b8, EVR_CS, "RTBeamLimitingDeviceType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x00ba, 0x300a, 0x00ba, EVR_DS, "SourceToBeamLimitingDeviceDistance", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x00bb, 0x300a, 0x00bb, EVR_FL, "IsocenterToBeamLimitingDeviceDistance", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x00bc, 0x300a, 0x00bc, EVR_IS, "NumberOfLeafJawPairs", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x00be, 0x300a, 0x00be, EVR_DS, "LeafPositionBoundaries", 3, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x00c0, 0x300a, 0x00c0, EVR_IS, "BeamNumber", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x00c2, 0x300a, 0x00c2, EVR_LO, "BeamName", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x00c3, 0x300a, 0x00c3, EVR_ST, "BeamDescription", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x00c4, 0x300a, 0x00c4, EVR_CS, "BeamType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x00c6, 0x300a, 0x00c6, EVR_CS, "RadiationType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x00c7, 0x300a, 0x00c7, EVR_CS, "HighDoseTechniqueType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x00c8, 0x300a, 0x00c8, EVR_IS, "ReferenceImageNumber", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x00ca, 0x300a, 0x00ca, EVR_SQ, "PlannedVerificationImageSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x00cc, 0x300a, 0x00cc, EVR_LO, "ImagingDeviceSpecificAcquisitionParameters", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x00ce, 0x300a, 0x00ce, EVR_CS, "TreatmentDeliveryType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x00d0, 0x300a, 0x00d0, EVR_IS, "NumberOfWedges", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x00d1, 0x300a, 0x00d1, EVR_SQ, "WedgeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x00d2, 0x300a, 0x00d2, EVR_IS, "WedgeNumber", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x00d3, 0x300a, 0x00d3, EVR_CS, "WedgeType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x00d4, 0x300a, 0x00d4, EVR_SH, "WedgeID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x00d5, 0x300a, 0x00d5, EVR_IS, "WedgeAngle", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x00d6, 0x300a, 0x00d6, EVR_DS, "WedgeFactor", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x00d7, 0x300a, 0x00d7, EVR_FL, "TotalWedgeTrayWaterEquivalentThickness", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x00d8, 0x300a, 0x00d8, EVR_DS, "WedgeOrientation", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x00d9, 0x300a, 0x00d9, EVR_FL, "IsocenterToWedgeTrayDistance", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x00da, 0x300a, 0x00da, EVR_DS, "SourceToWedgeTrayDistance", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x00db, 0x300a, 0x00db, EVR_FL, "WedgeThinEdgePosition", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x00dc, 0x300a, 0x00dc, EVR_SH, "BolusID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x00dd, 0x300a, 0x00dd, EVR_ST, "BolusDescription", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x00e0, 0x300a, 0x00e0, EVR_IS, "NumberOfCompensators", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x00e1, 0x300a, 0x00e1, EVR_SH, "MaterialID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x00e2, 0x300a, 0x00e2, EVR_DS, "TotalCompensatorTrayFactor", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x00e3, 0x300a, 0x00e3, EVR_SQ, "CompensatorSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x00e4, 0x300a, 0x00e4, EVR_IS, "CompensatorNumber", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x00e5, 0x300a, 0x00e5, EVR_SH, "CompensatorID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x00e6, 0x300a, 0x00e6, EVR_DS, "SourceToCompensatorTrayDistance", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x00e7, 0x300a, 0x00e7, EVR_IS, "CompensatorRows", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x00e8, 0x300a, 0x00e8, EVR_IS, "CompensatorColumns", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x00e9, 0x300a, 0x00e9, EVR_DS, "CompensatorPixelSpacing", 2, 2, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x00ea, 0x300a, 0x00ea, EVR_DS, "CompensatorPosition", 2, 2, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x00eb, 0x300a, 0x00eb, EVR_DS, "CompensatorTransmissionData", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x00ec, 0x300a, 0x00ec, EVR_DS, "CompensatorThicknessData", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x00ed, 0x300a, 0x00ed, EVR_IS, "NumberOfBoli", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x00ee, 0x300a, 0x00ee, EVR_CS, "CompensatorType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x00f0, 0x300a, 0x00f0, EVR_IS, "NumberOfBlocks", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x00f2, 0x300a, 0x00f2, EVR_DS, "TotalBlockTrayFactor", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x00f3, 0x300a, 0x00f3, EVR_FL, "TotalBlockTrayWaterEquivalentThickness", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x00f4, 0x300a, 0x00f4, EVR_SQ, "BlockSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x00f5, 0x300a, 0x00f5, EVR_SH, "BlockTrayID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x00f6, 0x300a, 0x00f6, EVR_DS, "SourceToBlockTrayDistance", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x00f7, 0x300a, 0x00f7, EVR_FL, "IsocenterToBlockTrayDistance", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x00f8, 0x300a, 0x00f8, EVR_CS, "BlockType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x00f9, 0x300a, 0x00f9, EVR_LO, "AccessoryCode", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x00fa, 0x300a, 0x00fa, EVR_CS, "BlockDivergence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x00fb, 0x300a, 0x00fb, EVR_CS, "BlockMountingPosition", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x00fc, 0x300a, 0x00fc, EVR_IS, "BlockNumber", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x00fe, 0x300a, 0x00fe, EVR_LO, "BlockName", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0100, 0x300a, 0x0100, EVR_DS, "BlockThickness", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0102, 0x300a, 0x0102, EVR_DS, "BlockTransmission", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0104, 0x300a, 0x0104, EVR_IS, "BlockNumberOfPoints", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0106, 0x300a, 0x0106, EVR_DS, "BlockData", 2, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0107, 0x300a, 0x0107, EVR_SQ, "ApplicatorSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0108, 0x300a, 0x0108, EVR_SH, "ApplicatorID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0109, 0x300a, 0x0109, EVR_CS, "ApplicatorType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x010a, 0x300a, 0x010a, EVR_LO, "ApplicatorDescription", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x010c, 0x300a, 0x010c, EVR_DS, "CumulativeDoseReferenceCoefficient", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x010e, 0x300a, 0x010e, EVR_DS, "FinalCumulativeMetersetWeight", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0110, 0x300a, 0x0110, EVR_IS, "NumberOfControlPoints", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0111, 0x300a, 0x0111, EVR_SQ, "ControlPointSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0112, 0x300a, 0x0112, EVR_IS, "ControlPointIndex", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0114, 0x300a, 0x0114, EVR_DS, "NominalBeamEnergy", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0115, 0x300a, 0x0115, EVR_DS, "DoseRateSet", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0116, 0x300a, 0x0116, EVR_SQ, "WedgePositionSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0118, 0x300a, 0x0118, EVR_CS, "WedgePosition", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x011a, 0x300a, 0x011a, EVR_SQ, "BeamLimitingDevicePositionSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x011c, 0x300a, 0x011c, EVR_DS, "LeafJawPositions", 2, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x011e, 0x300a, 0x011e, EVR_DS, "GantryAngle", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x011f, 0x300a, 0x011f, EVR_CS, "GantryRotationDirection", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0120, 0x300a, 0x0120, EVR_DS, "BeamLimitingDeviceAngle", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0121, 0x300a, 0x0121, EVR_CS, "BeamLimitingDeviceRotationDirection", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0122, 0x300a, 0x0122, EVR_DS, "PatientSupportAngle", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0123, 0x300a, 0x0123, EVR_CS, "PatientSupportRotationDirection", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0124, 0x300a, 0x0124, EVR_DS, "TableTopEccentricAxisDistance", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0125, 0x300a, 0x0125, EVR_DS, "TableTopEccentricAngle", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0126, 0x300a, 0x0126, EVR_CS, "TableTopEccentricRotationDirection", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0128, 0x300a, 0x0128, EVR_DS, "TableTopVerticalPosition", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0129, 0x300a, 0x0129, EVR_DS, "TableTopLongitudinalPosition", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x012a, 0x300a, 0x012a, EVR_DS, "TableTopLateralPosition", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x012c, 0x300a, 0x012c, EVR_DS, "IsocenterPosition", 3, 3, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x012e, 0x300a, 0x012e, EVR_DS, "SurfaceEntryPoint", 3, 3, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0130, 0x300a, 0x0130, EVR_DS, "SourceToSurfaceDistance", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0134, 0x300a, 0x0134, EVR_DS, "CumulativeMetersetWeight", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0140, 0x300a, 0x0140, EVR_FL, "TableTopPitchAngle", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0142, 0x300a, 0x0142, EVR_CS, "TableTopPitchRotationDirection", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0144, 0x300a, 0x0144, EVR_FL, "TableTopRollAngle", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0146, 0x300a, 0x0146, EVR_CS, "TableTopRollRotationDirection", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0148, 0x300a, 0x0148, EVR_FL, "HeadFixationAngle", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x014a, 0x300a, 0x014a, EVR_FL, "GantryPitchAngle", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x014c, 0x300a, 0x014c, EVR_CS, "GantryPitchRotationDirection", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x014e, 0x300a, 0x014e, EVR_FL, "GantryPitchAngleTolerance", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0180, 0x300a, 0x0180, EVR_SQ, "PatientSetupSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0182, 0x300a, 0x0182, EVR_IS, "PatientSetupNumber", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0183, 0x300a, 0x0183, EVR_LO, "PatientSetupLabel", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0184, 0x300a, 0x0184, EVR_LO, "PatientAdditionalPosition", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0190, 0x300a, 0x0190, EVR_SQ, "FixationDeviceSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0192, 0x300a, 0x0192, EVR_CS, "FixationDeviceType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0194, 0x300a, 0x0194, EVR_SH, "FixationDeviceLabel", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0196, 0x300a, 0x0196, EVR_ST, "FixationDeviceDescription", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0198, 0x300a, 0x0198, EVR_SH, "FixationDevicePosition", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0199, 0x300a, 0x0199, EVR_FL, "FixationDevicePitchAngle", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x019a, 0x300a, 0x019a, EVR_FL, "FixationDeviceRollAngle", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x01a0, 0x300a, 0x01a0, EVR_SQ, "ShieldingDeviceSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x01a2, 0x300a, 0x01a2, EVR_CS, "ShieldingDeviceType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x01a4, 0x300a, 0x01a4, EVR_SH, "ShieldingDeviceLabel", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x01a6, 0x300a, 0x01a6, EVR_ST, "ShieldingDeviceDescription", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x01a8, 0x300a, 0x01a8, EVR_SH, "ShieldingDevicePosition", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x01b0, 0x300a, 0x01b0, EVR_CS, "SetupTechnique", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x01b2, 0x300a, 0x01b2, EVR_ST, "SetupTechniqueDescription", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x01b4, 0x300a, 0x01b4, EVR_SQ, "SetupDeviceSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x01b6, 0x300a, 0x01b6, EVR_CS, "SetupDeviceType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x01b8, 0x300a, 0x01b8, EVR_SH, "SetupDeviceLabel", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x01ba, 0x300a, 0x01ba, EVR_ST, "SetupDeviceDescription", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x01bc, 0x300a, 0x01bc, EVR_DS, "SetupDeviceParameter", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x01d0, 0x300a, 0x01d0, EVR_ST, "SetupReferenceDescription", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x01d2, 0x300a, 0x01d2, EVR_DS, "TableTopVerticalSetupDisplacement", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x01d4, 0x300a, 0x01d4, EVR_DS, "TableTopLongitudinalSetupDisplacement", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x01d6, 0x300a, 0x01d6, EVR_DS, "TableTopLateralSetupDisplacement", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0200, 0x300a, 0x0200, EVR_CS, "BrachyTreatmentTechnique", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0202, 0x300a, 0x0202, EVR_CS, "BrachyTreatmentType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0206, 0x300a, 0x0206, EVR_SQ, "TreatmentMachineSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0210, 0x300a, 0x0210, EVR_SQ, "SourceSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0212, 0x300a, 0x0212, EVR_IS, "SourceNumber", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0214, 0x300a, 0x0214, EVR_CS, "SourceType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0216, 0x300a, 0x0216, EVR_LO, "SourceManufacturer", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0218, 0x300a, 0x0218, EVR_DS, "ActiveSourceDiameter", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x021a, 0x300a, 0x021a, EVR_DS, "ActiveSourceLength", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0222, 0x300a, 0x0222, EVR_DS, "SourceEncapsulationNominalThickness", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0224, 0x300a, 0x0224, EVR_DS, "SourceEncapsulationNominalTransmission", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0226, 0x300a, 0x0226, EVR_LO, "SourceIsotopeName", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0228, 0x300a, 0x0228, EVR_DS, "SourceIsotopeHalfLife", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0229, 0x300a, 0x0229, EVR_CS, "SourceStrengthUnits", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x022a, 0x300a, 0x022a, EVR_DS, "ReferenceAirKermaRate", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x022b, 0x300a, 0x022b, EVR_DS, "SourceStrength", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x022c, 0x300a, 0x022c, EVR_DA, "SourceStrengthReferenceDate", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x022e, 0x300a, 0x022e, EVR_TM, "SourceStrengthReferenceTime", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0230, 0x300a, 0x0230, EVR_SQ, "ApplicationSetupSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0232, 0x300a, 0x0232, EVR_CS, "ApplicationSetupType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0234, 0x300a, 0x0234, EVR_IS, "ApplicationSetupNumber", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0236, 0x300a, 0x0236, EVR_LO, "ApplicationSetupName", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0238, 0x300a, 0x0238, EVR_LO, "ApplicationSetupManufacturer", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0240, 0x300a, 0x0240, EVR_IS, "TemplateNumber", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0242, 0x300a, 0x0242, EVR_SH, "TemplateType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0244, 0x300a, 0x0244, EVR_LO, "TemplateName", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0250, 0x300a, 0x0250, EVR_DS, "TotalReferenceAirKerma", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0260, 0x300a, 0x0260, EVR_SQ, "BrachyAccessoryDeviceSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0262, 0x300a, 0x0262, EVR_IS, "BrachyAccessoryDeviceNumber", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0263, 0x300a, 0x0263, EVR_SH, "BrachyAccessoryDeviceID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0264, 0x300a, 0x0264, EVR_CS, "BrachyAccessoryDeviceType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0266, 0x300a, 0x0266, EVR_LO, "BrachyAccessoryDeviceName", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x026a, 0x300a, 0x026a, EVR_DS, "BrachyAccessoryDeviceNominalThickness", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x026c, 0x300a, 0x026c, EVR_DS, "BrachyAccessoryDeviceNominalTransmission", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0280, 0x300a, 0x0280, EVR_SQ, "ChannelSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0282, 0x300a, 0x0282, EVR_IS, "ChannelNumber", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0284, 0x300a, 0x0284, EVR_DS, "ChannelLength", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0286, 0x300a, 0x0286, EVR_DS, "ChannelTotalTime", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0288, 0x300a, 0x0288, EVR_CS, "SourceMovementType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x028a, 0x300a, 0x028a, EVR_IS, "NumberOfPulses", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x028c, 0x300a, 0x028c, EVR_DS, "PulseRepetitionInterval", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0290, 0x300a, 0x0290, EVR_IS, "SourceApplicatorNumber", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0291, 0x300a, 0x0291, EVR_SH, "SourceApplicatorID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0292, 0x300a, 0x0292, EVR_CS, "SourceApplicatorType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0294, 0x300a, 0x0294, EVR_LO, "SourceApplicatorName", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0296, 0x300a, 0x0296, EVR_DS, "SourceApplicatorLength", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0298, 0x300a, 0x0298, EVR_LO, "SourceApplicatorManufacturer", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x029c, 0x300a, 0x029c, EVR_DS, "SourceApplicatorWallNominalThickness", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x029e, 0x300a, 0x029e, EVR_DS, "SourceApplicatorWallNominalTransmission", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x02a0, 0x300a, 0x02a0, EVR_DS, "SourceApplicatorStepSize", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x02a2, 0x300a, 0x02a2, EVR_IS, "TransferTubeNumber", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x02a4, 0x300a, 0x02a4, EVR_DS, "TransferTubeLength", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x02b0, 0x300a, 0x02b0, EVR_SQ, "ChannelShieldSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x02b2, 0x300a, 0x02b2, EVR_IS, "ChannelShieldNumber", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x02b3, 0x300a, 0x02b3, EVR_SH, "ChannelShieldID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x02b4, 0x300a, 0x02b4, EVR_LO, "ChannelShieldName", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x02b8, 0x300a, 0x02b8, EVR_DS, "ChannelShieldNominalThickness", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x02ba, 0x300a, 0x02ba, EVR_DS, "ChannelShieldNominalTransmission", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x02c8, 0x300a, 0x02c8, EVR_DS, "FinalCumulativeTimeWeight", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x02d0, 0x300a, 0x02d0, EVR_SQ, "BrachyControlPointSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x02d2, 0x300a, 0x02d2, EVR_DS, "ControlPointRelativePosition", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x02d4, 0x300a, 0x02d4, EVR_DS, "ControlPoint3DPosition", 3, 3, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x02d6, 0x300a, 0x02d6, EVR_DS, "CumulativeTimeWeight", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x02e0, 0x300a, 0x02e0, EVR_CS, "CompensatorDivergence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x02e1, 0x300a, 0x02e1, EVR_CS, "CompensatorMountingPosition", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x02e2, 0x300a, 0x02e2, EVR_DS, "SourceToCompensatorDistance", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x02e3, 0x300a, 0x02e3, EVR_FL, "TotalCompensatorTrayWaterEquivalentThickness", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x02e4, 0x300a, 0x02e4, EVR_FL, "IsocenterToCompensatorTrayDistance", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x02e5, 0x300a, 0x02e5, EVR_FL, "CompensatorColumnOffset", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x02e6, 0x300a, 0x02e6, EVR_FL, "IsocenterToCompensatorDistances", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x02e7, 0x300a, 0x02e7, EVR_FL, "CompensatorRelativeStoppingPowerRatio", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x02e8, 0x300a, 0x02e8, EVR_FL, "CompensatorMillingToolDiameter", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x02ea, 0x300a, 0x02ea, EVR_SQ, "IonRangeCompensatorSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x02eb, 0x300a, 0x02eb, EVR_LT, "CompensatorDescription", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0302, 0x300a, 0x0302, EVR_IS, "RadiationMassNumber", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0304, 0x300a, 0x0304, EVR_IS, "RadiationAtomicNumber", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0306, 0x300a, 0x0306, EVR_SS, "RadiationChargeState", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0308, 0x300a, 0x0308, EVR_CS, "ScanMode", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x030a, 0x300a, 0x030a, EVR_FL, "VirtualSourceAxisDistances", 2, 2, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x030c, 0x300a, 0x030c, EVR_SQ, "SnoutSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x030d, 0x300a, 0x030d, EVR_FL, "SnoutPosition", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x030f, 0x300a, 0x030f, EVR_SH, "SnoutID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0312, 0x300a, 0x0312, EVR_IS, "NumberOfRangeShifters", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0314, 0x300a, 0x0314, EVR_SQ, "RangeShifterSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0316, 0x300a, 0x0316, EVR_IS, "RangeShifterNumber", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0318, 0x300a, 0x0318, EVR_SH, "RangeShifterID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0320, 0x300a, 0x0320, EVR_CS, "RangeShifterType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0322, 0x300a, 0x0322, EVR_LO, "RangeShifterDescription", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0330, 0x300a, 0x0330, EVR_IS, "NumberOfLateralSpreadingDevices", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0332, 0x300a, 0x0332, EVR_SQ, "LateralSpreadingDeviceSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0334, 0x300a, 0x0334, EVR_IS, "LateralSpreadingDeviceNumber", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0336, 0x300a, 0x0336, EVR_SH, "LateralSpreadingDeviceID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0338, 0x300a, 0x0338, EVR_CS, "LateralSpreadingDeviceType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x033a, 0x300a, 0x033a, EVR_LO, "LateralSpreadingDeviceDescription", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x033c, 0x300a, 0x033c, EVR_FL, "LateralSpreadingDeviceWaterEquivalentThickness", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0340, 0x300a, 0x0340, EVR_IS, "NumberOfRangeModulators", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0342, 0x300a, 0x0342, EVR_SQ, "RangeModulatorSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0344, 0x300a, 0x0344, EVR_IS, "RangeModulatorNumber", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0346, 0x300a, 0x0346, EVR_SH, "RangeModulatorID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0348, 0x300a, 0x0348, EVR_CS, "RangeModulatorType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x034a, 0x300a, 0x034a, EVR_LO, "RangeModulatorDescription", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x034c, 0x300a, 0x034c, EVR_SH, "BeamCurrentModulationID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0350, 0x300a, 0x0350, EVR_CS, "PatientSupportType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0352, 0x300a, 0x0352, EVR_SH, "PatientSupportID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0354, 0x300a, 0x0354, EVR_LO, "PatientSupportAccessoryCode", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0356, 0x300a, 0x0356, EVR_FL, "FixationLightAzimuthalAngle", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0358, 0x300a, 0x0358, EVR_FL, "FixationLightPolarAngle", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x035a, 0x300a, 0x035a, EVR_FL, "MetersetRate", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0360, 0x300a, 0x0360, EVR_SQ, "RangeShifterSettingsSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0362, 0x300a, 0x0362, EVR_LO, "RangeShifterSetting", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0364, 0x300a, 0x0364, EVR_FL, "IsocenterToRangeShifterDistance", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0366, 0x300a, 0x0366, EVR_FL, "RangeShifterWaterEquivalentThickness", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0370, 0x300a, 0x0370, EVR_SQ, "LateralSpreadingDeviceSettingsSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0372, 0x300a, 0x0372, EVR_LO, "LateralSpreadingDeviceSetting", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0374, 0x300a, 0x0374, EVR_FL, "IsocenterToLateralSpreadingDeviceDistance", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0380, 0x300a, 0x0380, EVR_SQ, "RangeModulatorSettingsSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0382, 0x300a, 0x0382, EVR_FL, "RangeModulatorGatingStartValue", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0384, 0x300a, 0x0384, EVR_FL, "RangeModulatorGatingStopValue", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0386, 0x300a, 0x0386, EVR_FL, "RangeModulatorGatingStartWaterEquivalentThickness", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0388, 0x300a, 0x0388, EVR_FL, "RangeModulatorGatingStopWaterEquivalentThickness", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x038a, 0x300a, 0x038a, EVR_FL, "IsocenterToRangeModulatorDistance", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0390, 0x300a, 0x0390, EVR_SH, "ScanSpotTuneID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0392, 0x300a, 0x0392, EVR_IS, "NumberOfScanSpotPositions", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0394, 0x300a, 0x0394, EVR_FL, "ScanSpotPositionMap", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0396, 0x300a, 0x0396, EVR_FL, "ScanSpotMetersetWeights", 1, -1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0398, 0x300a, 0x0398, EVR_FL, "ScanningSpotSize", 2, 2, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x039a, 0x300a, 0x039a, EVR_IS, "NumberOfPaintings", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x03a0, 0x300a, 0x03a0, EVR_SQ, "IonToleranceTableSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x03a2, 0x300a, 0x03a2, EVR_SQ, "IonBeamSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x03a4, 0x300a, 0x03a4, EVR_SQ, "IonBeamLimitingDeviceSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x03a6, 0x300a, 0x03a6, EVR_SQ, "IonBlockSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x03a8, 0x300a, 0x03a8, EVR_SQ, "IonControlPointSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x03aa, 0x300a, 0x03aa, EVR_SQ, "IonWedgeSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x03ac, 0x300a, 0x03ac, EVR_SQ, "IonWedgePositionSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0401, 0x300a, 0x0401, EVR_SQ, "ReferencedSetupImageSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0402, 0x300a, 0x0402, EVR_ST, "SetupImageComment", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0410, 0x300a, 0x0410, EVR_SQ, "MotionSynchronizationSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0412, 0x300a, 0x0412, EVR_FL, "ControlPointOrientation", 3, 3, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0420, 0x300a, 0x0420, EVR_SQ, "GeneralAccessorySequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0421, 0x300a, 0x0421, EVR_SH, "GeneralAccessoryID", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0422, 0x300a, 0x0422, EVR_ST, "GeneralAccessoryDescription", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0423, 0x300a, 0x0423, EVR_CS, "GeneralAccessoryType", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0424, 0x300a, 0x0424, EVR_IS, "GeneralAccessoryNumber", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0431, 0x300a, 0x0431, EVR_SQ, "ApplicatorGeometrySequence", 1, 1, "CP_1010", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0432, 0x300a, 0x0432, EVR_CS, "ApplicatorApertureShape", 1, 1, "CP_1010", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0433, 0x300a, 0x0433, EVR_FL, "ApplicatorOpening", 1, 1, "CP_1010", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0434, 0x300a, 0x0434, EVR_FL, "ApplicatorOpeningX", 1, 1, "CP_1010", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0435, 0x300a, 0x0435, EVR_FL, "ApplicatorOpeningY", 1, 1, "CP_1010", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300a, 0x0436, 0x300a, 0x0436, EVR_FL, "SourceToApplicatorMountingPositionDistance", 1, 1, "CP_1010", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300c, 0x0002, 0x300c, 0x0002, EVR_SQ, "ReferencedRTPlanSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300c, 0x0004, 0x300c, 0x0004, EVR_SQ, "ReferencedBeamSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300c, 0x0006, 0x300c, 0x0006, EVR_IS, "ReferencedBeamNumber", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300c, 0x0007, 0x300c, 0x0007, EVR_IS, "ReferencedReferenceImageNumber", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300c, 0x0008, 0x300c, 0x0008, EVR_DS, "StartCumulativeMetersetWeight", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300c, 0x0009, 0x300c, 0x0009, EVR_DS, "EndCumulativeMetersetWeight", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300c, 0x000a, 0x300c, 0x000a, EVR_SQ, "ReferencedBrachyApplicationSetupSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300c, 0x000c, 0x300c, 0x000c, EVR_IS, "ReferencedBrachyApplicationSetupNumber", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300c, 0x000e, 0x300c, 0x000e, EVR_IS, "ReferencedSourceNumber", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300c, 0x0020, 0x300c, 0x0020, EVR_SQ, "ReferencedFractionGroupSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300c, 0x0022, 0x300c, 0x0022, EVR_IS, "ReferencedFractionGroupNumber", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300c, 0x0040, 0x300c, 0x0040, EVR_SQ, "ReferencedVerificationImageSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300c, 0x0042, 0x300c, 0x0042, EVR_SQ, "ReferencedReferenceImageSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300c, 0x0050, 0x300c, 0x0050, EVR_SQ, "ReferencedDoseReferenceSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300c, 0x0051, 0x300c, 0x0051, EVR_IS, "ReferencedDoseReferenceNumber", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300c, 0x0055, 0x300c, 0x0055, EVR_SQ, "BrachyReferencedDoseReferenceSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300c, 0x0060, 0x300c, 0x0060, EVR_SQ, "ReferencedStructureSetSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300c, 0x006a, 0x300c, 0x006a, EVR_IS, "ReferencedPatientSetupNumber", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300c, 0x0080, 0x300c, 0x0080, EVR_SQ, "ReferencedDoseSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300c, 0x00a0, 0x300c, 0x00a0, EVR_IS, "ReferencedToleranceTableNumber", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300c, 0x00b0, 0x300c, 0x00b0, EVR_SQ, "ReferencedBolusSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300c, 0x00c0, 0x300c, 0x00c0, EVR_IS, "ReferencedWedgeNumber", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300c, 0x00d0, 0x300c, 0x00d0, EVR_IS, "ReferencedCompensatorNumber", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300c, 0x00e0, 0x300c, 0x00e0, EVR_IS, "ReferencedBlockNumber", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300c, 0x00f0, 0x300c, 0x00f0, EVR_IS, "ReferencedControlPointIndex", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300c, 0x00f2, 0x300c, 0x00f2, EVR_SQ, "ReferencedControlPointSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300c, 0x00f4, 0x300c, 0x00f4, EVR_IS, "ReferencedStartControlPointIndex", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300c, 0x00f6, 0x300c, 0x00f6, EVR_IS, "ReferencedStopControlPointIndex", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300c, 0x0100, 0x300c, 0x0100, EVR_IS, "ReferencedRangeShifterNumber", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300c, 0x0102, 0x300c, 0x0102, EVR_IS, "ReferencedLateralSpreadingDeviceNumber", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300c, 0x0104, 0x300c, 0x0104, EVR_IS, "ReferencedRangeModulatorNumber", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300e, 0x0002, 0x300e, 0x0002, EVR_CS, "ApprovalStatus", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300e, 0x0004, 0x300e, 0x0004, EVR_DA, "ReviewDate", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300e, 0x0005, 0x300e, 0x0005, EVR_TM, "ReviewTime", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x300e, 0x0008, 0x300e, 0x0008, EVR_PN, "ReviewerName", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } #ifdef WITH_PRIVATE_TAGS , { 0x3f01, 0x0001, 0x3f01, 0x0001, EVR_LO, "InstitutionCode", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "INTELERAD MEDICAL SYSTEMS" } , { 0x3f01, 0x0002, 0x3f01, 0x0002, EVR_LO, "RoutedTransferAE", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "INTELERAD MEDICAL SYSTEMS" } , { 0x3f01, 0x0003, 0x3f01, 0x0003, EVR_LO, "SourceAE", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "INTELERAD MEDICAL SYSTEMS" } , { 0x3f01, 0x0004, 0x3f01, 0x0004, EVR_SH, "DeferredValidation", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "INTELERAD MEDICAL SYSTEMS" } , { 0x3f01, 0x0005, 0x3f01, 0x0005, EVR_LO, "SeriesOwner", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "INTELERAD MEDICAL SYSTEMS" } , { 0x3f01, 0x0006, 0x3f01, 0x0006, EVR_LO, "OrderGroupNumber", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "INTELERAD MEDICAL SYSTEMS" } , { 0x3f01, 0x0007, 0x3f01, 0x0007, EVR_SH, "StrippedPixelData", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "INTELERAD MEDICAL SYSTEMS" } , { 0x3f01, 0x0008, 0x3f01, 0x0008, EVR_SH, "PendingMoveRequest", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "INTELERAD MEDICAL SYSTEMS" } #endif , { 0x4000, 0x0000, 0x4000, 0x0000, EVR_UL, "ACR_NEMA_TextGroupLength", 1, 1, "ACR/NEMA2", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x4000, 0x0010, 0x4000, 0x0010, EVR_LT, "ACR_NEMA_TextArbitrary", 1, -1, "ACR/NEMA2", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x4000, 0x4000, 0x4000, 0x4000, EVR_LT, "ACR_NEMA_TextComments", 1, -1, "ACR/NEMA2", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x4008, 0x0040, 0x4008, 0x0040, EVR_SH, "RETIRED_ResultsID", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x4008, 0x0042, 0x4008, 0x0042, EVR_LO, "RETIRED_ResultsIDIssuer", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x4008, 0x0050, 0x4008, 0x0050, EVR_SQ, "RETIRED_ReferencedInterpretationSequence", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x4008, 0x0100, 0x4008, 0x0100, EVR_DA, "RETIRED_InterpretationRecordedDate", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x4008, 0x0101, 0x4008, 0x0101, EVR_TM, "RETIRED_InterpretationRecordedTime", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x4008, 0x0102, 0x4008, 0x0102, EVR_PN, "RETIRED_InterpretationRecorder", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x4008, 0x0103, 0x4008, 0x0103, EVR_LO, "RETIRED_ReferenceToRecordedSound", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x4008, 0x0108, 0x4008, 0x0108, EVR_DA, "RETIRED_InterpretationTranscriptionDate", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x4008, 0x0109, 0x4008, 0x0109, EVR_TM, "RETIRED_InterpretationTranscriptionTime", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x4008, 0x010a, 0x4008, 0x010a, EVR_PN, "RETIRED_InterpretationTranscriber", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x4008, 0x010b, 0x4008, 0x010b, EVR_ST, "RETIRED_InterpretationText", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x4008, 0x010c, 0x4008, 0x010c, EVR_PN, "RETIRED_InterpretationAuthor", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x4008, 0x0111, 0x4008, 0x0111, EVR_SQ, "RETIRED_InterpretationApproverSequence", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x4008, 0x0112, 0x4008, 0x0112, EVR_DA, "RETIRED_InterpretationApprovalDate", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x4008, 0x0113, 0x4008, 0x0113, EVR_TM, "RETIRED_InterpretationApprovalTime", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x4008, 0x0114, 0x4008, 0x0114, EVR_PN, "RETIRED_PhysicianApprovingInterpretation", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x4008, 0x0115, 0x4008, 0x0115, EVR_LT, "RETIRED_InterpretationDiagnosisDescription", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x4008, 0x0117, 0x4008, 0x0117, EVR_SQ, "RETIRED_InterpretationDiagnosisCodeSequence", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x4008, 0x0118, 0x4008, 0x0118, EVR_SQ, "RETIRED_ResultsDistributionListSequence", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x4008, 0x0119, 0x4008, 0x0119, EVR_PN, "RETIRED_DistributionName", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x4008, 0x011a, 0x4008, 0x011a, EVR_LO, "RETIRED_DistributionAddress", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x4008, 0x0200, 0x4008, 0x0200, EVR_SH, "RETIRED_InterpretationID", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x4008, 0x0202, 0x4008, 0x0202, EVR_LO, "RETIRED_InterpretationIDIssuer", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x4008, 0x0210, 0x4008, 0x0210, EVR_CS, "RETIRED_InterpretationTypeID", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x4008, 0x0212, 0x4008, 0x0212, EVR_CS, "RETIRED_InterpretationStatusID", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x4008, 0x0300, 0x4008, 0x0300, EVR_ST, "RETIRED_Impressions", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x4008, 0x4000, 0x4008, 0x4000, EVR_ST, "RETIRED_ResultsComments", 1, 1, "DICOM/retired", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } #ifdef WITH_PRIVATE_TAGS , { 0x4009, 0x0001, 0x4009, 0x0001, EVR_LT, "ReportID", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS ISI" } , { 0x4009, 0x0020, 0x4009, 0x0020, EVR_LT, "ReportStatus", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS ISI" } , { 0x4009, 0x0030, 0x4009, 0x0030, EVR_DA, "ReportCreationDate", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS ISI" } , { 0x4009, 0x0070, 0x4009, 0x0070, EVR_LT, "ReportApprovingPhysician", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS ISI" } , { 0x4009, 0x00e0, 0x4009, 0x00e0, EVR_LT, "ReportText", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS ISI" } , { 0x4009, 0x00e1, 0x4009, 0x00e1, EVR_LT, "ReportAuthor", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS ISI" } , { 0x4009, 0x00e3, 0x4009, 0x00e3, EVR_LT, "ReportingRadiologist", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS ISI" } #endif , { 0x4ffe, 0x0001, 0x4ffe, 0x0001, EVR_SQ, "MACParametersSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } #ifdef WITH_PRIVATE_TAGS , { 0x50f1, 0x0006, 0x50f1, 0x0006, EVR_CS, "EnergySubtractionParam", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x50f1, 0x0007, 0x50f1, 0x0007, EVR_CS, "SubtractionRegistrationResult", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x50f1, 0x0008, 0x50f1, 0x0008, EVR_CS, "EnergySubtractionParam2", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x50f1, 0x0009, 0x50f1, 0x0009, EVR_SL, "AfinConversionCoefficient", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x50f1, 0x0010, 0x50f1, 0x0010, EVR_CS, "FilmOutputFormat", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } , { 0x50f1, 0x0020, 0x50f1, 0x0020, EVR_CS, "ImageProcessingModificationFlag", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "FDMS 1.0" } #endif , { 0x5200, 0x9229, 0x5200, 0x9229, EVR_SQ, "SharedFunctionalGroupsSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x5200, 0x9230, 0x5200, 0x9230, EVR_SQ, "PerFrameFunctionalGroupsSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x5400, 0x0100, 0x5400, 0x0100, EVR_SQ, "WaveformSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x5400, 0x0110, 0x5400, 0x0110, EVR_ox, "ChannelMinimumValue", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x5400, 0x0112, 0x5400, 0x0112, EVR_ox, "ChannelMaximumValue", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x5400, 0x1004, 0x5400, 0x1004, EVR_US, "WaveformBitsAllocated", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x5400, 0x1006, 0x5400, 0x1006, EVR_CS, "WaveformSampleInterpretation", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x5400, 0x100a, 0x5400, 0x100a, EVR_ox, "WaveformPaddingValue", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x5400, 0x1010, 0x5400, 0x1010, EVR_ox, "WaveformData", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x5600, 0x0010, 0x5600, 0x0010, EVR_OF, "FirstOrderPhaseCorrectionAngle", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x5600, 0x0020, 0x5600, 0x0020, EVR_OF, "SpectroscopyData", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } #ifdef WITH_PRIVATE_TAGS , { 0x6001, 0x0000, 0x6001, 0x0000, EVR_LT, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "PHILIPS MR/LAST" } , { 0x6021, 0x0000, 0x6021, 0x0000, EVR_LT, "ImageGraphicsFormatCode", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CM VA0 CMS" } , { 0x6021, 0x0000, 0x6021, 0x0000, EVR_LT, "OsteoContourComment", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 OST" } , { 0x6021, 0x0010, 0x6021, 0x0010, EVR_LT, "ImageGraphics", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CM VA0 CMS" } , { 0x6021, 0x0010, 0x6021, 0x0010, EVR_US, "OsteoContourBuffer", 256, 256, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CT VA0 OST" } , { 0x7001, 0x0001, 0x7001, 0x0001, EVR_UI, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Picker NM Private Group" } , { 0x7001, 0x0002, 0x7001, 0x0002, EVR_OB, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "Picker NM Private Group" } , { 0x7001, 0x0010, 0x7001, 0x0010, EVR_LT, "Dummy", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MED" } , { 0x7003, 0x0010, 0x7003, 0x0010, EVR_LT, "Header", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MED" } , { 0x7005, 0x0010, 0x7005, 0x0010, EVR_LT, "Dummy", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS MED" } #endif , { 0x7fe0, 0x0010, 0x7fe0, 0x0010, EVR_ox, "PixelData", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x7fe0, 0x0020, 0x7fe0, 0x0020, EVR_OW, "ACR_NEMA_2C_CoefficientsSDVN", 1, -1, "ACR/NEMA2C", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x7fe0, 0x0030, 0x7fe0, 0x0030, EVR_OW, "ACR_NEMA_2C_CoefficientsSDHN", 1, -1, "ACR/NEMA2C", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x7fe0, 0x0040, 0x7fe0, 0x0040, EVR_OW, "ACR_NEMA_2C_CoefficientsSDDN", 1, -1, "ACR/NEMA2C", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } #ifdef WITH_PRIVATE_TAGS , { 0x7fe1, 0x0000, 0x7fe1, 0x0000, EVR_OB, "BinaryData", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CM VA0 CMS" } , { 0x7fe1, 0x0010, 0x7fe1, 0x0010, EVR_OB, "CSAData", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS CSA NON-IMAGE" } , { 0x7fe1, 0x0010, 0x7fe1, 0x0010, EVR_ox, "PixelData", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SPI-P Release 1" } , { 0x7fe3, 0x0000, 0x7fe3, 0x0000, EVR_LT, "ImageGraphicsFormatCode", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS NUMARIS II" } , { 0x7fe3, 0x0010, 0x7fe3, 0x0010, EVR_OB, "ImageGraphics", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS NUMARIS II" } , { 0x7fe3, 0x0020, 0x7fe3, 0x0020, EVR_OB, "ImageGraphicsDummy", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "SIEMENS NUMARIS II" } , { 0x7ff1, 0x0001, 0x7ff1, 0x0001, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "TOSHIBA_MEC_1.0" } , { 0x7ff1, 0x0001, 0x7ff1, 0x0001, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "TOSHIBA_MEC_CT_1.0" } , { 0x7ff1, 0x0002, 0x7ff1, 0x0002, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "TOSHIBA_MEC_1.0" } , { 0x7ff1, 0x0002, 0x7ff1, 0x0002, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "TOSHIBA_MEC_CT_1.0" } , { 0x7ff1, 0x0003, 0x7ff1, 0x0003, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "TOSHIBA_MEC_1.0" } , { 0x7ff1, 0x0003, 0x7ff1, 0x0003, EVR_IS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "TOSHIBA_MEC_CT_1.0" } , { 0x7ff1, 0x0004, 0x7ff1, 0x0004, EVR_IS, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "TOSHIBA_MEC_CT_1.0" } , { 0x7ff1, 0x0005, 0x7ff1, 0x0005, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "TOSHIBA_MEC_CT_1.0" } , { 0x7ff1, 0x0007, 0x7ff1, 0x0007, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "TOSHIBA_MEC_CT_1.0" } , { 0x7ff1, 0x0008, 0x7ff1, 0x0008, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "TOSHIBA_MEC_CT_1.0" } , { 0x7ff1, 0x0009, 0x7ff1, 0x0009, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "TOSHIBA_MEC_CT_1.0" } , { 0x7ff1, 0x000a, 0x7ff1, 0x000a, EVR_LT, "Unknown", 1, 1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "TOSHIBA_MEC_CT_1.0" } , { 0x7ff1, 0x000b, 0x7ff1, 0x000b, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "TOSHIBA_MEC_CT_1.0" } , { 0x7ff1, 0x000c, 0x7ff1, 0x000c, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "TOSHIBA_MEC_CT_1.0" } , { 0x7ff1, 0x000d, 0x7ff1, 0x000d, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "TOSHIBA_MEC_CT_1.0" } , { 0x7ff1, 0x0010, 0x7ff1, 0x0010, EVR_US, "Unknown", 1, -1, "DICOM", DcmDictRange_Unspecified, DcmDictRange_Unspecified, "TOSHIBA_MEC_1.0" } #endif , { 0xfffa, 0xfffa, 0xfffa, 0xfffa, EVR_SQ, "DigitalSignaturesSequence", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0xfffc, 0xfffc, 0xfffc, 0xfffc, EVR_OB, "DataSetTrailingPadding", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0xfffe, 0xe000, 0xfffe, 0xe000, EVR_na, "Item", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0xfffe, 0xe00d, 0xfffe, 0xe00d, EVR_na, "ItemDelimitationItem", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0xfffe, 0xe0dd, 0xfffe, 0xe0dd, EVR_na, "SequenceDelimitationItem", 1, 1, "DICOM_2009", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x6000, 0x0010, 0x60ff, 0x0010, EVR_US, "OverlayRows", 1, 1, "DICOM_2009", DcmDictRange_Even, DcmDictRange_Unspecified, NULL } , { 0x6000, 0x0011, 0x60ff, 0x0011, EVR_US, "OverlayColumns", 1, 1, "DICOM_2009", DcmDictRange_Even, DcmDictRange_Unspecified, NULL } , { 0x6000, 0x0015, 0x60ff, 0x0015, EVR_IS, "NumberOfFramesInOverlay", 1, 1, "DICOM_2009", DcmDictRange_Even, DcmDictRange_Unspecified, NULL } , { 0x6000, 0x0022, 0x60ff, 0x0022, EVR_LO, "OverlayDescription", 1, 1, "DICOM_2009", DcmDictRange_Even, DcmDictRange_Unspecified, NULL } , { 0x6000, 0x0040, 0x60ff, 0x0040, EVR_CS, "OverlayType", 1, 1, "DICOM_2009", DcmDictRange_Even, DcmDictRange_Unspecified, NULL } , { 0x6000, 0x0045, 0x60ff, 0x0045, EVR_LO, "OverlaySubtype", 1, 1, "DICOM_2009", DcmDictRange_Even, DcmDictRange_Unspecified, NULL } , { 0x6000, 0x0050, 0x60ff, 0x0050, EVR_SS, "OverlayOrigin", 2, 2, "DICOM_2009", DcmDictRange_Even, DcmDictRange_Unspecified, NULL } , { 0x6000, 0x0051, 0x60ff, 0x0051, EVR_US, "ImageFrameOrigin", 1, 1, "DICOM_2009", DcmDictRange_Even, DcmDictRange_Unspecified, NULL } , { 0x6000, 0x0100, 0x60ff, 0x0100, EVR_US, "OverlayBitsAllocated", 1, 1, "DICOM_2009", DcmDictRange_Even, DcmDictRange_Unspecified, NULL } , { 0x6000, 0x0102, 0x60ff, 0x0102, EVR_US, "OverlayBitPosition", 1, 1, "DICOM_2009", DcmDictRange_Even, DcmDictRange_Unspecified, NULL } , { 0x6000, 0x1001, 0x60ff, 0x1001, EVR_CS, "OverlayActivationLayer", 1, 1, "DICOM_2009", DcmDictRange_Even, DcmDictRange_Unspecified, NULL } , { 0x6000, 0x1301, 0x60ff, 0x1301, EVR_IS, "ROIArea", 1, 1, "DICOM_2009", DcmDictRange_Even, DcmDictRange_Unspecified, NULL } , { 0x6000, 0x1302, 0x60ff, 0x1302, EVR_DS, "ROIMean", 1, 1, "DICOM_2009", DcmDictRange_Even, DcmDictRange_Unspecified, NULL } , { 0x6000, 0x1303, 0x60ff, 0x1303, EVR_DS, "ROIStandardDeviation", 1, 1, "DICOM_2009", DcmDictRange_Even, DcmDictRange_Unspecified, NULL } , { 0x6000, 0x1500, 0x60ff, 0x1500, EVR_LO, "OverlayLabel", 1, 1, "DICOM_2009", DcmDictRange_Even, DcmDictRange_Unspecified, NULL } , { 0x6000, 0x3000, 0x60ff, 0x3000, EVR_ox, "OverlayData", 1, 1, "DICOM_2009", DcmDictRange_Even, DcmDictRange_Unspecified, NULL } , { 0x7f00, 0x0000, 0x7fff, 0x0000, EVR_UL, "ACR_NEMA_2C_VariablePixelDataGroupLength", 1, 1, "ACR/NEMA2C", DcmDictRange_Even, DcmDictRange_Unspecified, NULL } , { 0x0009, 0x0000, 0xffff, 0x0000, EVR_UL, "PrivateGroupLength", 1, 1, "PRIVATE", DcmDictRange_Odd, DcmDictRange_Unspecified, NULL } , { 0x5000, 0x0010, 0x50ff, 0x0010, EVR_US, "RETIRED_NumberOfPoints", 1, 1, "DICOM/retired", DcmDictRange_Even, DcmDictRange_Unspecified, NULL } , { 0x5000, 0x0020, 0x50ff, 0x0020, EVR_CS, "RETIRED_TypeOfData", 1, 1, "DICOM/retired", DcmDictRange_Even, DcmDictRange_Unspecified, NULL } , { 0x5000, 0x0022, 0x50ff, 0x0022, EVR_LO, "RETIRED_CurveDescription", 1, 1, "DICOM/retired", DcmDictRange_Even, DcmDictRange_Unspecified, NULL } , { 0x5000, 0x0030, 0x50ff, 0x0030, EVR_SH, "RETIRED_AxisUnits", 1, -1, "DICOM/retired", DcmDictRange_Even, DcmDictRange_Unspecified, NULL } , { 0x5000, 0x0040, 0x50ff, 0x0040, EVR_SH, "RETIRED_AxisLabels", 1, -1, "DICOM/retired", DcmDictRange_Even, DcmDictRange_Unspecified, NULL } , { 0x6000, 0x0012, 0x60ff, 0x0012, EVR_US, "RETIRED_OverlayPlanes", 1, 1, "DICOM/retired", DcmDictRange_Even, DcmDictRange_Unspecified, NULL } , { 0x6000, 0x0052, 0x60ff, 0x0052, EVR_US, "RETIRED_OverlayPlaneOrigin", 1, 1, "DICOM/retired", DcmDictRange_Even, DcmDictRange_Unspecified, NULL } , { 0x6000, 0x0060, 0x60ff, 0x0060, EVR_CS, "ACR_NEMA_2C_OverlayCompressionCode", 1, 1, "ACR/NEMA2C", DcmDictRange_Even, DcmDictRange_Unspecified, NULL } , { 0x6000, 0x0061, 0x60ff, 0x0061, EVR_SH, "ACR_NEMA_2C_OverlayCompressionOriginator", 1, 1, "ACR/NEMA2C", DcmDictRange_Even, DcmDictRange_Unspecified, NULL } , { 0x6000, 0x0062, 0x60ff, 0x0062, EVR_SH, "ACR_NEMA_2C_OverlayCompressionLabel", 1, 1, "ACR/NEMA2C", DcmDictRange_Even, DcmDictRange_Unspecified, NULL } , { 0x6000, 0x0063, 0x60ff, 0x0063, EVR_SH, "ACR_NEMA_2C_OverlayCompressionDescription", 1, 1, "ACR/NEMA2C", DcmDictRange_Even, DcmDictRange_Unspecified, NULL } , { 0x6000, 0x0066, 0x60ff, 0x0066, EVR_AT, "ACR_NEMA_2C_OverlayCompressionStepPointers", 1, -1, "ACR/NEMA2C", DcmDictRange_Even, DcmDictRange_Unspecified, NULL } , { 0x6000, 0x0068, 0x60ff, 0x0068, EVR_US, "ACR_NEMA_2C_OverlayRepeatInterval", 1, 1, "ACR/NEMA2C", DcmDictRange_Even, DcmDictRange_Unspecified, NULL } , { 0x6000, 0x0069, 0x60ff, 0x0069, EVR_US, "ACR_NEMA_2C_OverlayBitsGrouped", 1, 1, "ACR/NEMA2C", DcmDictRange_Even, DcmDictRange_Unspecified, NULL } , { 0x7f00, 0x0010, 0x7fff, 0x0010, EVR_ox, "ACR_NEMA_2C_VariablePixelData", 1, 1, "ACR/NEMA2C", DcmDictRange_Even, DcmDictRange_Unspecified, NULL } , { 0x7f00, 0x0011, 0x7fff, 0x0011, EVR_AT, "ACR_NEMA_2C_VariableNextDataGroup", 1, 1, "ACR/NEMA2C", DcmDictRange_Even, DcmDictRange_Unspecified, NULL } , { 0x7f00, 0x0020, 0x7fff, 0x0020, EVR_OW, "ACR_NEMA_2C_VariableCoefficientsSDVN", 1, -1, "ACR/NEMA2C", DcmDictRange_Even, DcmDictRange_Unspecified, NULL } , { 0x7f00, 0x0030, 0x7fff, 0x0030, EVR_OW, "ACR_NEMA_2C_VariableCoefficientsSDHN", 1, -1, "ACR/NEMA2C", DcmDictRange_Even, DcmDictRange_Unspecified, NULL } , { 0x7f00, 0x0040, 0x7fff, 0x0040, EVR_OW, "ACR_NEMA_2C_VariableCoefficientsSDDN", 1, -1, "ACR/NEMA2C", DcmDictRange_Even, DcmDictRange_Unspecified, NULL } , { 0x0009, 0x0010, 0xffff, 0x00ff, EVR_LO, "PrivateCreator", 1, 1, "PRIVATE", DcmDictRange_Odd, DcmDictRange_Unspecified, NULL } , { 0x0001, 0x0000, 0x0007, 0x0000, EVR_UL, "IllegalGroupLength", 1, 1, "ILLEGAL", DcmDictRange_Odd, DcmDictRange_Unspecified, NULL } , { 0x0001, 0x0010, 0x0007, 0x00ff, EVR_LO, "IllegalPrivateCreator", 1, 1, "ILLEGAL", DcmDictRange_Odd, DcmDictRange_Unspecified, NULL } , { 0x0000, 0x0000, 0xffff, 0x0000, EVR_UL, "GenericGroupLength", 1, 1, "GENERIC", DcmDictRange_Unspecified, DcmDictRange_Unspecified, NULL } , { 0x0020, 0x3100, 0x0020, 0x31ff, EVR_LO, "ACR_NEMA_SourceImageID", 1, -1, "ACR/NEMA2", DcmDictRange_Unspecified, DcmDictRange_Even, NULL } , { 0x5000, 0x0005, 0x50ff, 0x0005, EVR_US, "RETIRED_CurveDimensions", 1, 1, "DICOM/retired", DcmDictRange_Even, DcmDictRange_Unspecified, NULL } , { 0x5000, 0x0103, 0x50ff, 0x0103, EVR_US, "RETIRED_DataValueRepresentation", 1, 1, "DICOM/retired", DcmDictRange_Even, DcmDictRange_Unspecified, NULL } , { 0x5000, 0x0104, 0x50ff, 0x0104, EVR_US, "RETIRED_MinimumCoordinateValue", 1, -1, "DICOM/retired", DcmDictRange_Even, DcmDictRange_Unspecified, NULL } , { 0x5000, 0x0105, 0x50ff, 0x0105, EVR_US, "RETIRED_MaximumCoordinateValue", 1, -1, "DICOM/retired", DcmDictRange_Even, DcmDictRange_Unspecified, NULL } , { 0x5000, 0x0106, 0x50ff, 0x0106, EVR_SH, "RETIRED_CurveRange", 1, -1, "DICOM/retired", DcmDictRange_Even, DcmDictRange_Unspecified, NULL } , { 0x5000, 0x0110, 0x50ff, 0x0110, EVR_US, "RETIRED_CurveDataDescriptor", 1, -1, "DICOM/retired", DcmDictRange_Even, DcmDictRange_Unspecified, NULL } , { 0x5000, 0x0112, 0x50ff, 0x0112, EVR_US, "RETIRED_CoordinateStartValue", 1, -1, "DICOM/retired", DcmDictRange_Even, DcmDictRange_Unspecified, NULL } , { 0x5000, 0x0114, 0x50ff, 0x0114, EVR_US, "RETIRED_CoordinateStepValue", 1, -1, "DICOM/retired", DcmDictRange_Even, DcmDictRange_Unspecified, NULL } , { 0x5000, 0x1001, 0x50ff, 0x1001, EVR_CS, "RETIRED_CurveActivationLayer", 1, 1, "DICOM/retired", DcmDictRange_Even, DcmDictRange_Unspecified, NULL } , { 0x5000, 0x2000, 0x50ff, 0x2000, EVR_US, "RETIRED_AudioType", 1, 1, "DICOM/retired", DcmDictRange_Even, DcmDictRange_Unspecified, NULL } , { 0x5000, 0x2002, 0x50ff, 0x2002, EVR_US, "RETIRED_AudioSampleFormat", 1, 1, "DICOM/retired", DcmDictRange_Even, DcmDictRange_Unspecified, NULL } , { 0x5000, 0x2004, 0x50ff, 0x2004, EVR_US, "RETIRED_NumberOfChannels", 1, 1, "DICOM/retired", DcmDictRange_Even, DcmDictRange_Unspecified, NULL } , { 0x5000, 0x2006, 0x50ff, 0x2006, EVR_UL, "RETIRED_NumberOfSamples", 1, 1, "DICOM/retired", DcmDictRange_Even, DcmDictRange_Unspecified, NULL } , { 0x5000, 0x2008, 0x50ff, 0x2008, EVR_UL, "RETIRED_SampleRate", 1, 1, "DICOM/retired", DcmDictRange_Even, DcmDictRange_Unspecified, NULL } , { 0x5000, 0x200a, 0x50ff, 0x200a, EVR_UL, "RETIRED_TotalTime", 1, 1, "DICOM/retired", DcmDictRange_Even, DcmDictRange_Unspecified, NULL } , { 0x5000, 0x200c, 0x50ff, 0x200c, EVR_ox, "RETIRED_AudioSampleData", 1, 1, "DICOM/retired", DcmDictRange_Even, DcmDictRange_Unspecified, NULL } , { 0x5000, 0x200e, 0x50ff, 0x200e, EVR_LT, "RETIRED_AudioComments", 1, 1, "DICOM/retired", DcmDictRange_Even, DcmDictRange_Unspecified, NULL } , { 0x5000, 0x2500, 0x50ff, 0x2500, EVR_LO, "RETIRED_CurveLabel", 1, 1, "DICOM/retired", DcmDictRange_Even, DcmDictRange_Unspecified, NULL } , { 0x5000, 0x2600, 0x50ff, 0x2600, EVR_SQ, "RETIRED_CurveReferencedOverlaySequence", 1, 1, "DICOM/retired", DcmDictRange_Even, DcmDictRange_Unspecified, NULL } , { 0x5000, 0x2610, 0x50ff, 0x2610, EVR_US, "RETIRED_CurveReferencedOverlayGroup", 1, 1, "DICOM/retired", DcmDictRange_Even, DcmDictRange_Unspecified, NULL } , { 0x5000, 0x3000, 0x50ff, 0x3000, EVR_ox, "RETIRED_CurveData", 1, 1, "DICOM/retired", DcmDictRange_Even, DcmDictRange_Unspecified, NULL } , { 0x6000, 0x0110, 0x60ff, 0x0110, EVR_CS, "ACR_NEMA_OverlayFormat", 1, 1, "ACR/NEMA2", DcmDictRange_Even, DcmDictRange_Unspecified, NULL } , { 0x6000, 0x0200, 0x60ff, 0x0200, EVR_US, "ACR_NEMA_OverlayLocation", 1, 1, "ACR/NEMA2", DcmDictRange_Even, DcmDictRange_Unspecified, NULL } , { 0x6000, 0x0800, 0x60ff, 0x0800, EVR_CS, "ACR_NEMA_2C_OverlayCodeLabel", 1, -1, "ACR/NEMA2C", DcmDictRange_Even, DcmDictRange_Unspecified, NULL } , { 0x6000, 0x0802, 0x60ff, 0x0802, EVR_US, "ACR_NEMA_2C_OverlayNumberOfTables", 1, 1, "ACR/NEMA2C", DcmDictRange_Even, DcmDictRange_Unspecified, NULL } , { 0x6000, 0x0803, 0x60ff, 0x0803, EVR_AT, "ACR_NEMA_2C_OverlayCodeTableLocation", 1, -1, "ACR/NEMA2C", DcmDictRange_Even, DcmDictRange_Unspecified, NULL } , { 0x6000, 0x0804, 0x60ff, 0x0804, EVR_US, "ACR_NEMA_2C_OverlayBitsForCodeWord", 1, 1, "ACR/NEMA2C", DcmDictRange_Even, DcmDictRange_Unspecified, NULL } , { 0x6000, 0x1100, 0x60ff, 0x1100, EVR_US, "RETIRED_OverlayDescriptorGray", 1, 1, "DICOM/retired", DcmDictRange_Even, DcmDictRange_Unspecified, NULL } , { 0x6000, 0x1101, 0x60ff, 0x1101, EVR_US, "RETIRED_OverlayDescriptorRed", 1, 1, "DICOM/retired", DcmDictRange_Even, DcmDictRange_Unspecified, NULL } , { 0x6000, 0x1102, 0x60ff, 0x1102, EVR_US, "RETIRED_OverlayDescriptorGreen", 1, 1, "DICOM/retired", DcmDictRange_Even, DcmDictRange_Unspecified, NULL } , { 0x6000, 0x1103, 0x60ff, 0x1103, EVR_US, "RETIRED_OverlayDescriptorBlue", 1, 1, "DICOM/retired", DcmDictRange_Even, DcmDictRange_Unspecified, NULL } , { 0x6000, 0x1200, 0x60ff, 0x1200, EVR_US, "RETIRED_OverlaysGray", 1, -1, "DICOM/retired", DcmDictRange_Even, DcmDictRange_Unspecified, NULL } , { 0x6000, 0x1201, 0x60ff, 0x1201, EVR_US, "RETIRED_OverlaysRed", 1, -1, "DICOM/retired", DcmDictRange_Even, DcmDictRange_Unspecified, NULL } , { 0x6000, 0x1202, 0x60ff, 0x1202, EVR_US, "RETIRED_OverlaysGreen", 1, -1, "DICOM/retired", DcmDictRange_Even, DcmDictRange_Unspecified, NULL } , { 0x6000, 0x1203, 0x60ff, 0x1203, EVR_US, "RETIRED_OverlaysBlue", 1, -1, "DICOM/retired", DcmDictRange_Even, DcmDictRange_Unspecified, NULL } , { 0x6000, 0x4000, 0x60ff, 0x4000, EVR_LT, "ACR_NEMA_OverlayComments", 1, -1, "ACR/NEMA2", DcmDictRange_Even, DcmDictRange_Unspecified, NULL } #ifdef WITH_PRIVATE_TAGS , { 0x7001, 0x0004, 0x70ff, 0x0004, EVR_ST, "TextAnnotation", 1, 1, "DICOM", DcmDictRange_Odd, DcmDictRange_Unspecified, "DLX_ANNOT_01" } , { 0x7001, 0x0005, 0x70ff, 0x0005, EVR_IS, "Box", 2, 2, "DICOM", DcmDictRange_Odd, DcmDictRange_Unspecified, "DLX_ANNOT_01" } , { 0x7001, 0x0007, 0x70ff, 0x0007, EVR_IS, "ArrowEnd", 2, 2, "DICOM", DcmDictRange_Odd, DcmDictRange_Unspecified, "DLX_ANNOT_01" } , { 0x6001, 0x0001, 0x60ff, 0x0001, EVR_US, "GrayPaletteColorLookupTableDescriptor", 3, 3, "DICOM", DcmDictRange_Odd, DcmDictRange_Unspecified, "DLX_LKUP_01" } , { 0x6001, 0x0002, 0x60ff, 0x0002, EVR_US, "GrayPaletteColorLookupTableData", 1, 1, "DICOM", DcmDictRange_Odd, DcmDictRange_Unspecified, "DLX_LKUP_01" } , { 0x6001, 0x0000, 0x60ff, 0x0000, EVR_IS, "OverlayID", 1, 1, "DICOM", DcmDictRange_Odd, DcmDictRange_Unspecified, "PAPYRUS 3.0" } , { 0x6001, 0x0001, 0x60ff, 0x0001, EVR_LT, "LinkedOverlays", 1, -1, "DICOM", DcmDictRange_Odd, DcmDictRange_Unspecified, "PAPYRUS 3.0" } , { 0x6001, 0x0010, 0x60ff, 0x0010, EVR_US, "OverlayRows", 1, 1, "DICOM", DcmDictRange_Odd, DcmDictRange_Unspecified, "PAPYRUS 3.0" } , { 0x6001, 0x0011, 0x60ff, 0x0011, EVR_US, "OverlayColumns", 1, 1, "DICOM", DcmDictRange_Odd, DcmDictRange_Unspecified, "PAPYRUS 3.0" } , { 0x6001, 0x0040, 0x60ff, 0x0040, EVR_LO, "OverlayType", 1, 1, "DICOM", DcmDictRange_Odd, DcmDictRange_Unspecified, "PAPYRUS 3.0" } , { 0x6001, 0x0050, 0x60ff, 0x0050, EVR_US, "OverlayOrigin", 1, -1, "DICOM", DcmDictRange_Odd, DcmDictRange_Unspecified, "PAPYRUS 3.0" } , { 0x6001, 0x0060, 0x60ff, 0x0060, EVR_LO, "Editable", 1, 1, "DICOM", DcmDictRange_Odd, DcmDictRange_Unspecified, "PAPYRUS 3.0" } , { 0x6001, 0x0070, 0x60ff, 0x0070, EVR_LO, "OverlayFont", 1, 1, "DICOM", DcmDictRange_Odd, DcmDictRange_Unspecified, "PAPYRUS 3.0" } , { 0x6001, 0x0072, 0x60ff, 0x0072, EVR_LO, "OverlayStyle", 1, 1, "DICOM", DcmDictRange_Odd, DcmDictRange_Unspecified, "PAPYRUS 3.0" } , { 0x6001, 0x0074, 0x60ff, 0x0074, EVR_US, "OverlayFontSize", 1, 1, "DICOM", DcmDictRange_Odd, DcmDictRange_Unspecified, "PAPYRUS 3.0" } , { 0x6001, 0x0076, 0x60ff, 0x0076, EVR_LO, "OverlayColor", 1, 1, "DICOM", DcmDictRange_Odd, DcmDictRange_Unspecified, "PAPYRUS 3.0" } , { 0x6001, 0x0078, 0x60ff, 0x0078, EVR_US, "ShadowSize", 1, 1, "DICOM", DcmDictRange_Odd, DcmDictRange_Unspecified, "PAPYRUS 3.0" } , { 0x6001, 0x0080, 0x60ff, 0x0080, EVR_LO, "FillPattern", 1, 1, "DICOM", DcmDictRange_Odd, DcmDictRange_Unspecified, "PAPYRUS 3.0" } , { 0x6001, 0x0082, 0x60ff, 0x0082, EVR_US, "OverlayPenSize", 1, 1, "DICOM", DcmDictRange_Odd, DcmDictRange_Unspecified, "PAPYRUS 3.0" } , { 0x6001, 0x00a0, 0x60ff, 0x00a0, EVR_LO, "Label", 1, 1, "DICOM", DcmDictRange_Odd, DcmDictRange_Unspecified, "PAPYRUS 3.0" } , { 0x6001, 0x00a2, 0x60ff, 0x00a2, EVR_LT, "PostItText", 1, 1, "DICOM", DcmDictRange_Odd, DcmDictRange_Unspecified, "PAPYRUS 3.0" } , { 0x6001, 0x00a4, 0x60ff, 0x00a4, EVR_US, "AnchorPoint", 2, 2, "DICOM", DcmDictRange_Odd, DcmDictRange_Unspecified, "PAPYRUS 3.0" } , { 0x6001, 0x00b0, 0x60ff, 0x00b0, EVR_LO, "ROIType", 1, 1, "DICOM", DcmDictRange_Odd, DcmDictRange_Unspecified, "PAPYRUS 3.0" } , { 0x6001, 0x00b2, 0x60ff, 0x00b2, EVR_LT, "AttachedAnnotation", 1, 1, "DICOM", DcmDictRange_Odd, DcmDictRange_Unspecified, "PAPYRUS 3.0" } , { 0x6001, 0x00ba, 0x60ff, 0x00ba, EVR_US, "ContourPoints", 1, -1, "DICOM", DcmDictRange_Odd, DcmDictRange_Unspecified, "PAPYRUS 3.0" } , { 0x6001, 0x00bc, 0x60ff, 0x00bc, EVR_US, "MaskData", 1, -1, "DICOM", DcmDictRange_Odd, DcmDictRange_Unspecified, "PAPYRUS 3.0" } , { 0x6001, 0x00c0, 0x60ff, 0x00c0, EVR_SQ, "UINOverlaySequence", 1, 1, "DICOM", DcmDictRange_Odd, DcmDictRange_Unspecified, "PAPYRUS 3.0" } #endif }; static const int simpleBuiltinDict_count = sizeof(simpleBuiltinDict)/sizeof(DBI_SimpleEntry); void DcmDataDictionary::loadBuiltinDictionary() { DcmDictEntry* e = NULL; const DBI_SimpleEntry *b = simpleBuiltinDict; for (int i=0; igroup, b->element, b->upperGroup, b->upperElement, b->evr, b->tagName, b->vmMin, b->vmMax, b->standardVersion, OFFalse, b->privateCreator); e->setGroupRangeRestriction(b->groupRestriction); e->setElementRangeRestriction(b->elementRestriction); addEntry(e); } } dcmtk-3.6.0/docs/0000755000310500011400000000000011511320700012755 5ustar joergrdicom3dcmtk-3.6.0/docs/CHANGES.3530000644000310500011400000055720710055607231014312 0ustar joergrdicom3 Release 3.5.3 (Public Release - 2004-05-27) - Updated version name and implementation name to reflect release 3.5.3. Affects: dcmdata/include/dcuid.h - Updated announcement file Affects: ANNOUNCE.353 **** Changes from 2004.05.27 (riesmeier) - Updated man pages. Affects: doxygen/manpages/man1/dbregimg.1 doxygen/manpages/man1/dcm2pnm.1 doxygen/manpages/man1/dcm2xml.1 doxygen/manpages/man1/dcmcjpeg.1 doxygen/manpages/man1/dcmconv.1 doxygen/manpages/man1/dcmcrle.1 doxygen/manpages/man1/dcmdjpeg.1 doxygen/manpages/man1/dcmdrle.1 doxygen/manpages/man1/dcmdspfn.1 doxygen/manpages/man1/dcmdump.1 doxygen/manpages/man1/dcmftest.1 doxygen/manpages/man1/dcmgpdir.1 doxygen/manpages/man1/dcmj2pnm.1 doxygen/manpages/man1/dcmmkcrv.1 doxygen/manpages/man1/dcmmkdir.1 doxygen/manpages/man1/dcmmklut.1 doxygen/manpages/man1/dcmodify.1 doxygen/manpages/man1/dcmp2pgm.1 doxygen/manpages/man1/dcmprscp.1 doxygen/manpages/man1/dcmprscu.1 doxygen/manpages/man1/dcmpschk.1 doxygen/manpages/man1/dcmpsmk.1 doxygen/manpages/man1/dcmpsprt.1 doxygen/manpages/man1/dcmpsrcv.1 doxygen/manpages/man1/dcmpssnd.1 doxygen/manpages/man1/dcmquant.1 doxygen/manpages/man1/dcmscale.1 doxygen/manpages/man1/dcmsign.1 doxygen/manpages/man1/dcod2lum.1 doxygen/manpages/man1/dconvlum.1 doxygen/manpages/man1/dsr2html.1 doxygen/manpages/man1/dsr2xml.1 doxygen/manpages/man1/dsrdump.1 doxygen/manpages/man1/dump2dcm.1 doxygen/manpages/man1/echoscu.1 doxygen/manpages/man1/findscu.1 doxygen/manpages/man1/imagectn.1 doxygen/manpages/man1/movescu.1 doxygen/manpages/man1/storescp.1 doxygen/manpages/man1/storescu.1 doxygen/manpages/man1/ti.1 doxygen/manpages/man1/wlmscpfs.1 doxygen/manpages/man1/xml2dcm.1 doxygen/manpages/man1/xml2dsr.1 - Link additional libraries to avoid problems with shared object compilation. Affects: dcmpstat/apps/Makefile.in dcmpstat/tests/Makefile.in dcmwlm/tests/Makefile.in imagectn/apps/Makefile.in **** Changes from 2004.05.26 (riesmeier) - Added preliminary announcement file. Added: ANNOUNCE.353 - Fixed typo in URL. Affects: INSTALL **** Changes from 2004.05.26 (eichelberg) - Completed isinf() workaround for MacOS X Affects: ofstd/libsrc/ofstd.cc - Updated notes on TCP wrappers and libtiff. Affects: INSTALL - Fixed minor bug in worklist server regarding failed read locks. Thanks to Pere Rodriguez Rodriguez for the bug report and fix. Affects: dcmwlm/include/wldsfs.h dcmwlm/libsrc/wldsfs.cc **** Changes from 2004.05.25 (riesmeier) - Minor changes (e.g. updated platform notes). Affects: INSTALL **** Changes from 2004.05.19 (riesmeier) - Updated list of supported systems. Affects: INSTALL **** Changes from 2004.05.17 (wilkens) - Fixed problem reported by valgrind: passing uninitialized variable sockarg. Affects: dcmnet/libsrc/dul.cc **** Changes from 2004.05.14 (onken) - Additional documentation added. Affects: dcmdata/apps/mdfdsman.cc dcmdata/apps/mdfdsman.h - Added documentation concerning metaheader. Affects: dcmdata/docs/dcmodify.man **** Changes from 2004.05.14 (riesmeier) - Fixed bug in "install-bin" target. Added new "install-all" target. Affects: Makefile config/rootconf - Added missing "install-etc" target. Affects: config/Makefile.in - Added another step to CMake instructions and other minor corrections. Affects: INSTALL - Minor corrections. Affects: dcmdata/docs/dcmodify.man **** Changes from 2004.05.12 (riesmeier) - Updated FAQ file to reflect the changes in the installation instructions. Updated FAQ entry "Where is rest of the documentation?". Affects: FAQ **** Changes from 2004.05.11 (riesmeier) - Fixed typo. Affects: dcmdata/docs/dcmdump.man - Updated installation instructions (not yet completed). Affects: INSTALL **** Changes from 2004.05.10 (riesmeier) - Renamed test.cfg to dcmpstat.cfg. Added: dcmpstat/etc/dcmpstat.cfg Removed: dcmpstat/etc/test.cfg Affects: dcmpstat/docs/dcmp2pgm.man dcmpstat/docs/dcmprscp.man dcmpstat/docs/dcmprscu.man dcmpstat/docs/dcmpsprt.man dcmpstat/docs/dcmpsrcv.man dcmpstat/docs/dcmpssnd.man dcmpstat/etc/Makefile.in - Fixed bug that prevented the proper rotation of color images. Thanks to Maryam Zibaeifard for the bug report. Affects: dcmimage/libsrc/dicoimg.cc - Removed unused template instantiations (flipping class for signed images). Affects: dcmimage/libsrc/dicoimg.cc - Added missing project file for MSVC (created by CMake 1.8.3). Added: ALL_BUILD_force_1.rule - Updated Makefile. Affects: Makefile - Replaced $(DISTTRASH) by $(TRASH) in distclean target to avoid removal of top-level Makefile. Affects: Makefile config/rootconf **** Changes from 2004.05.07 (riesmeier) - Removed redundant header file include statement. Affects: dcmpstat/tests/Makefile.in **** Changes from 2004.05.07 (eichelberg) - Added explicit typecast to volatile variables, needed for MSVC Affects: dcmjpeg/libsrc/djdijg12.cc dcmjpeg/libsrc/djdijg16.cc dcmjpeg/libsrc/djdijg8.cc - Removed unneeded semicolon, reported by gcc 3.4 Affects: ofstd/include/ofstdinc.h ofstd/include/ofstream.h - Updated configure script to work on platforms where requires inclusion of Affects: config/configure.in config/configure - Added workaround for MacOS X where isinf() and isnan() are defined in but not in . Affects: ofstd/libsrc/ofstd.cc **** Changes from 2004.05.06 (riesmeier) - Do not remove toplevel configure and Makefile with "make distclean". Affects: config/rootconf - Added typecasts to keep Sun CC 2.0.1 quiet. Affects: dcmdata/apps/dcmgpdir.cc dcmnet/libsrc/dccfenmp.cc dcmnet/libsrc/dccfpcmp.cc dcmnet/libsrc/dccfprmp.cc dcmnet/libsrc/dccfrsmp.cc dcmnet/libsrc/dccftsmp.cc **** Changes from 2004.05.05 (riesmeier) - Removed inclusion of ${libdir} and ${includedir} since this was never really used but causes problems on systems where an older release of the toolkit is installed in the same directory. Thanks to Alexander Haderer for the report. Affects: ofstd/tests/Makefile.in dcmdata/apps/Makefile.in dcmdata/libsrc/Makefile.in dcmimage/apps/Makefile.in dcmimage/libsrc/Makefile.in dcmimgle/apps/Makefile.in dcmimgle/libsrc/Makefile.in dcmjpeg/apps/Makefile.in dcmjpeg/libsrc/Makefile.in dcmjpeg/libijg12/Makefile.in dcmjpeg/libijg16/Makefile.in dcmjpeg/libijg8/Makefile.in dcmnet/apps/Makefile.in dcmnet/libsrc/Makefile.in dcmpstat/apps/Makefile.in dcmpstat/jni/Makefile.in dcmpstat/libsrc/Makefile.in dcmpstat/tests/Makefile.in dcmsign/apps/Makefile.in dcmsign/libsrc/Makefile.in dcmsr/apps/Makefile.in dcmsr/libsrc/Makefile.in dcmtls/libsrc/Makefile.in dcmwlm/apps/Makefile.in dcmwlm/libsrc/Makefile.in dcmwlm/tests/Makefile.in dcmwlm/wwwapps/Makefile.in imagectn/apps/Makefile.in imagectn/libsrc/Makefile.i - Fixed small inconsistencies. Affects: ofstd/Makefile.in ofstd/docs/Makefile.in ofstd/etc/Makefile.in ofstd/include/Makefile.in ofstd/libsrc/Makefile.in dcmdata/Makefile.in dcmdata/docs/Makefile.in dcmdata/etc/Makefile.in dcmimage/docs/Makefile.in dcmimage/etc/Makefile.in dcmimage/include/Makefile.in dcmimage/tests/Makefile.in dcmimgle/docs/Makefile.in dcmimgle/etc/Makefile.in dcmimgle/include/Makefile.in dcmimgle/tests/Makefile.in dcmtk/dcmjpeg/Makefile.in dcmjpeg/docs/Makefile.in dcmjpeg/etc/Makefile.in dcmjpeg/tests/Makefile.in dcmnet/Makefile.in dcmnet/docs/Makefile.in dcmnet/etc/Makefile.in dcmnet/include/Makefile.in dcmnet/tests/Makefile.in dcmpstat/docs/Makefile.in dcmpstat/etc/Makefile.in dcmsign/Makefile.in dcmsign/docs/Makefile.in dcmsign/etc/Makefile.in dcmsign/tests/Makefile.in dcmsr/Makefile.in dcmsr/docs/Makefile.in dcmsr/etc/Makefile.in dcmtls/Makefile.in dcmtls/apps/Makefile.in dcmtls/docs/Makefile.in dcmtls/etc/Makefile.in dcmwlm/Makefile.in dcmwlm/docs/Makefile.in dcmwlm/etc/Makefile.in imagectn/Makefile.in imagectn/docs/Makefile.in imagectn/etc/Makefile.in imagectn/tests/Makefile.in - Added explicit typecast to volatile variables to compile with gcc 3.2. Affects: dcmjpeg/libsrc/djdijg12.cc dcmjpeg/libsrc/djdijg16.cc dcmjpeg/libsrc/djdijg8.cc - Added default configure script and makefile. Added: configure Makefile **** Changes from 2004.05.05 (eichelberg) - Declared a few local variables as volatile that might otherwise be clobbered by longjmp. Affects: dcmjpeg/libsrc/djdijg12.cc dcmjpeg/libsrc/djdijg16.cc dcmjpeg/libsrc/djdijg8.cc - Simplified template class DcmSimpleMap, needed for Sun CC 2.0.1 Affects: dcmnet/include/dcmsmap.h dcmnet/libsrc/dccfenmp.cc dcmnet/libsrc/dccfpcmp.cc dcmnet/libsrc/dccfprmp.cc dcmnet/libsrc/dccfrsmp.cc dcmnet/libsrc/dccftsmp.cc - Updated dcmpstat Makefile, needed for MinGW Affects: dcmpstat/apps/Makefile.in **** Changes from 2004.05.04 (eichelberg) - Updated Makefile.in to correctly work on systems where libxml depends on zlib. Affects: dcmdata/apps/Makefile.in - Added FAQ entry for systems where libtiff is compiled with JPEG support Affects: FAQ **** Changes from 2004.04.30 (eichelberg) - Added configure tests for finite, isinf and isnan Affects: config/configure config/configure.in config/include/cfunix.h.in config/include/cfwin32.h - my_isinf() now also works on systems where finite() or isinf() are defined but not properly declared in or . Affects: ofstd/libsrc/ofstd.cc **** Changes from 2004.04.29 (wilkens) - Updated MSVC 6 project files (generated by CMake 1.8.3). Affects: ALL_BUILD.dsp dcmtk.dsw dcmtk_all.dsw dcmdata/apps/dcm2xml.dsp dcmdata/apps/dcmconv.dsp dcmdata/apps/dcmcrle.dsp dcmdata/apps/dcmdrle.dsp dcmdata/apps/dcmdump.dsp dcmdata/apps/dcmftest.dsp dcmdata/apps/dcmgpdir.dsp dcmdata/apps/dcmodify.dsp dcmdata/apps/dump2dcm.dsp dcmdata/apps/xml2dcm.dsp dcmdata/libsrc/dcmdata.dsp dcmimage/apps/dcm2pnm.dsp dcmimage/apps/dcmquant.dsp dcmimage/apps/dcmscale.dsp dcmimage/libsrc/dcmimage.dsp dcmimgle/apps/dcmdspfn.dsp dcmimgle/apps/dcod2lum.dsp dcmimgle/apps/dconvlum.dsp dcmimgle/libsrc/dcmimgle.dsp dcmjpeg/apps/dcmcjpeg.dsp dcmjpeg/apps/dcmdjpeg.dsp dcmjpeg/apps/dcmj2pnm.dsp dcmjpeg/apps/dcmmkdir.dsp dcmjpeg/libijg12/ijg12.dsp dcmjpeg/libijg16/ijg16.dsp dcmjpeg/libijg8/ijg8.dsp dcmjpeg/libsrc/dcmjpeg.dsp dcmnet/apps/echoscu.dsp dcmnet/apps/findscu.dsp dcmnet/apps/movescu.dsp dcmnet/apps/storescp.dsp dcmnet/apps/storescu.dsp dcmnet/libsrc/dcmnet.dsp dcmpstat/apps/dcmmkcrv.dsp dcmpstat/apps/dcmmklut.dsp dcmpstat/apps/dcmp2pgm.dsp dcmpstat/apps/dcmprscp.dsp dcmpstat/apps/dcmprscu.dsp dcmpstat/apps/dcmpschk.dsp dcmpstat/apps/dcmpsmk.dsp dcmpstat/apps/dcmpsprt.dsp dcmpstat/apps/dcmpsrcv.dsp dcmpstat/apps/dcmpssnd.dsp dcmpstat/libsrc/dcmpstat.dsp dcmsign/apps/dcmsign.dsp dcmsign/libsrc/dcmdsig.dsp dcmsr/apps/dsr2html.dsp dcmsr/apps/dsr2xml.dsp dcmsr/apps/dsrdump.dsp dcmsr/apps/xml2dsr.dsp dcmsr/libsrc/dcmsr.dsp dcmsr/tests/mkreport.dsp dcmtls/libsrc/dcmtls.dsp dcmwlm/apps/wlmscpfs.dsp dcmwlm/libsrc/dcmwlm.dsp imagectn/apps/dbregimg.dsp imagectn/apps/imagectn.dsp imagectn/apps/ti.dsp imagectn/libsrc/imagedb.dsp ofstd/libsrc/ofstd.dsp **** Changes from 2004.04.27 (wilkens) - Fixed a bug in dcelem.cc which occurs when one is serializing a dataset (containing a final attribute whose length value is coded with 2 bytes) into a given buffer. Although the number of available bytes in the buffer was sufficient, the dataset->write(...) method would always return EC_StreamNotifyClient to indicate that there are not sufficient bytes available in the buffer. This code modification fixes the problem. Affects: dcmdata/include/dcobject.h dcmdata/libsrc/dcelem.cc dcmdata/libsrc/dcobject.cc dcmdata/libsrc/dcsequen.cc **** Changes from 2004.04.22 (riesmeier) - Changed typecast from OFreinterpret_cast to OFstatic_cast to avoid compilation error on Solaris with gcc 3.x. Thanks to Markus Mertens for the report. Affects: ofstd/libsrc/ofthread.cc **** Changes from 2004.04.21 (riesmeier) - Included "dcompat" header file required for definition of bzero() on IRIX 5. Thanks to Andreas Barth for the report. Affects: dcmpstat/tests/msgserv.cc **** Changes from 2004.04.21 (eichelberg) - Minor modifications for compilation with gcc 3.4.0 Affects: dcmimage/include/diargpxt.h dcmimage/include/dicmypxt.h dcmimage/include/dicocpt.h dcmimage/include/dicoflt.h dcmimage/include/dicomot.h dcmimage/include/dicorot.h dcmimage/include/dicosct.h dcmimage/include/dihsvpxt.h dcmimage/include/dipalpxt.h dcmimage/include/diqtcmap.h dcmimage/include/dirgbpxt.h dcmimage/include/diybrpxt.h dcmimage/include/diyf2pxt.h dcmimage/include/diyp2pxt.h dcmimgle/include/diflipt.h dcmimgle/include/diinpxt.h dcmimgle/include/dimocpt.h dcmimgle/include/dimoflt.h dcmimgle/include/dimoipxt.h dcmimgle/include/dimorot.h dcmimgle/include/dimosct.h dcmimgle/include/dirotat.h dcmimgle/include/discalet.h ofstd/include/ofoset.h **** Changes from 2004.04.20 (riesmeier) - Added explicit type cast to return value of OFStandard::atof() to avoid warnings reported by Visual Studio 7. Affects: dcmsr/libsrc/dsrscogr.cc **** Changes from 2004.04.18 (onken) - Restructured code to avoid default parameter values for "complex types" like OFString. Required for Sun CC 2.0.1. Affects: dcmdata/apps/mdfconen.cc dcmdata/apps/mdfconen.h dcmdata/apps/mdfdsman.cc dcmdata/apps/mdfdsman.h **** Changes from 2004.04.16 (riesmeier) - Added missing comma separator to UIDNameMap. Thanks to Andreas Barth for the triggering report. Affects: dcmdata/libsrc/dcuid.cc - Restructured code to avoid default parameter values for "complex types" like OFString. Required for Sun CC 2.0.1. Affects: ofstd/include/ofdatime.h ofstd/include/ofstd.h ofstd/libsrc/ofdatime.cc dcmdata/include/dcvrdt.h dcmdata/libsrc/dcvrdt.cc dcmsr/include/dsrdoc.h dcmsr/libsrc/dsrdoc.cc - Renamed local function "isinf" to "my_isinf" to avoid possible conflicts. Affects: ofstd/libsrc/ofstd.cc - Minor modifications to keep Sun CC 2.0.1 happy. Affects: dcmdata/libsrc/dcddirif.cc - Added explicit typecast to result of dereferencing operator to keep Sun CC 2.0.1 happy. Affects: dcmsr/libsrc/dsrsoprf.cc **** Changes from 2004.04.16 (eichelberg) - Configure now correctly finds libwrap on systems where requires and libxml2 when compiled with zlib support. Affects: config/configure config/configure.in **** Changes from 2004.04.15 (eichelberg) - Fixed syntax error in Makefile Affects: dcmwlm/tests/Makefile.in - dbregimg must not be linked against the TCP wrapper library Affects: imagectn/apps/Makefile.in - Configure now stores additional include paths in CPPFLAGS, needed for preprocessor based tests within the configure script. Affects: config/configure config/configure.in **** Changes from 2004.04.14 (eichelberg) - Updated CMake project file Affects: dcmpstat/apps/CMakeLists.txt CMakeLists.txt **** Changes from 2004.04.14 (riesmeier) - Replaced non-Unix newline characters. Affects: dcmdata/include/dcuid.h ofstd/include/oflist.h - Added const qualifier to parameter to keep Sun CC 2.0.1 quiet. Affects: dcmdata/include/dcstack.h - Changed type of integer variable to keep Sun CC 2.0.1 quiet. Affects: dcmdata/libsrc/dcddirif.cc dcmimgle/libsrc/dicielut.cc dcmimgle/libsrc/digsdlut.cc - Added explicit type cast to keep Sun CC 2.0.1 quiet. Affects: dcmdata/libsrc/dcddirif.cc dcmnet/libsrc/dccfenmp.cc - Introduced default case to switch statement to keep Sun CC 2.0.1 quiet. Affects: dcmdata/libsrc/dcddirif.cc - Made makefile consistent with other makefiles. Affects: dcmnet/docs/Makefile.in dcmnet/etc/Makefile.in **** Changes from 2004.04.07 (eichelberg) - Updated sorting and command execution code in storescp to use OFString and OFList. This will hopefully fix the remaining memory leaks. Affects: dcmnet/apps/storescp.cc - Removed call to system() and execl to /bin/false which does not exist on some BSD platforms. Affects: dcmnet/apps/storescp.cc - Added presentation contexts for new SOP classes and transfer syntax Affects: dcmnet/etc/storescp.cfg dcmnet/etc/storescu.cfg - Added optional parameter to ASC_initializeNetwork that allows to pass the DUL_FULLDOMAINNAME option to the DUL layer Affects: dcmnet/include/assoc.h dcmnet/libsrc/assoc.cc - Compressed image datasets containing uncompressed icon images are now correctly handled by the parser. Affects: dcmdata/include/dcpixel.h dcmdata/libsrc/dcpixel.cc - Added OFconst_cast, required on Win32 Affects: dcmnet/apps/storescp.cc **** Changes from 2004.04.07 (riesmeier) - Added new makefile target "dcmtk-install-doc" which copies the COPYRIGHT, FAQ and HISTORY file to $(docdir). Also invoked with "make install". Affects: config/rootconf - Added missing member variables to constructor's member initialization list to avoid warnings reported by gcc. Affects: dcmsr/include/dsrcsidl.h - Adapted code to avoid warnings reported by gcc when compiling without libxml support. Affects: dcmsr/libsrc/dsrxmld.cc - Removed comma at end of enumerator list. Affects: dcmimage/include/dipipng.h - Additional modifications for new-style type casts. Affects: dcmdata/apps/dcmconv.cc dcmimage/libsrc/dipipng.cc - Adapted type casts to new-style typecast operators defined in ofcast.h. Affects: dcmdata/libsrc/dcistrmz.cc dcmdata/libsrc/dcostrmz.cc - Changed type of integer variables to unsigned to avoid compiler warnings reported by gcc. Affects: dcmdata/apps/mdfdsman.cc **** Changes from 2004.04.06 (riesmeier) - Updated data dictionary, UIDs and transfer syntaxes for the latest Final Text Supplements (42 and 47) and Correction Proposals (CP 25). Affects: dcmdata/include/dcuid.h dcmdata/include/dcxfer.h dcmdata/libsrc/dcdictzz.cc dcmdata/libsrc/dcuid.cc dcmdata/libsrc/dcxfer.cc dcmdata/libsrc/dicom.dic dcmnet/docs/movescu.man dcmnet/docs/storescp.man dcmnet/docs/storescu.man dcmwlm/include/wlds.h dcmwlm/libsrc/wlds.cc doxygen/manpages/man1/imagectn.1 doxygen/manpages/man1/movescu.1 doxygen/manpages/man1/storescp.1 doxygen/manpages/man1/storescu.1 imagectn/docs/imagectn.man - Added missing suffix "TransferSyntax" to some transfer syntax constants. Affects: dcmdata/include/dcuid.h dcmdata/libsrc/dcddirif.cc dcmdata/libsrc/dcuid.cc dcmdata/libsrc/dcxfer.cc dcmnet/apps/echoscu.cc dcmnet/apps/movescu.cc dcmnet/apps/storescp.cc - Added six more transfer syntaxes to the --propose-ts option. Affects: dcmnet/apps/echoscu.cc dcmnet/docs/echoscu.man doxygen/manpages/man1/echoscu.1 - Updated copyright date. Replaced "@" sign in email addresses by "(at)". Affects: COPYRIGHT **** Changes from 2004.03.29 (riesmeier) - Removed reference to non-existing DICOM conformance statement. Affects: doxygen/manpages/man1/imagectn.1 doxygen/manpages/man1/ti.1 imagectn/docs/imagectn.man imagectn/docs/ti.man - Introduced separate subsections for SCU and SCP conformance. Affects: dcmnet/docs/movescu.man doxygen/manpages/man1/movescu.1 **** Changes from 2004.03.25 (riesmeier) - Solved issue with function pointer to std::fprintf or fprintf, respectively. Affects: dcmtk/dcmdata/apps/xml2dcm.cc dcmsr/libsrc/dsrxmld.cc - Replaced configure test for a std::fprintf prototype by std::vfprintf. Affects: config/configure config/configure.in config/include/cfunix.h.in config/include/cfwin32.h - Uncommented definition of HAVE_PROTOTYPE_STD__VFPRINTF. Required for MSVC 6. Affects: config/include/cfwin32.h **** Changes from 2004.03.25 (wilkens) - Updated file which can be used as a builtin dictionary. Affects: dcmdata/libsrc/dcdictzz.cc - Corrected private tags (Philips Integris System). Affects: dcmdata/libsrc/private.dic - Added comment. Affects: dcmdata/libsrc/private.dic - Modified one private tag (Philips Integris System). Affects: dcmdata/libsrc/private.dic **** Changes from 2004.03.24 (wilkens) - Added some private tags (Philips Integris System). Affects: dcmdata/libsrc/private.dic **** Changes from 2004.03.22 (riesmeier) - Added package information obtained during configure process. Affects: config/Makefile.def.in - Replaced tabs by spaces. Affects: dcmdata/apps/xml2dcm.cc **** Changes from 2004.03.18 (eichelberg) - Configure now checks for presence of xml2-config in current path and adds result of xml2-config --cflags to include flags, needed for some installations of libxml2. Affects: config/configure config/configure.in **** Changes from 2004.03.16 (riesmeier) - Added support for non-standard encoding of pixel data (OB with BitsAllocated > 8 and <= 16). Thanks to Markus Mertens for the sample data. Affects: dcmimgle/libsrc/diimage.cc - Renamed UID_BasicDirectoryStorageSOPClass to UID_MediaStorageDirectoryStorage. Affects: dcmdata/include/dcuid.h dcmdata/libsrc/dcuid.cc dcmdata/libsrc/dcdicdir.cc - Updated comment. Affects: dcmdata/libsrc/dcuid.cc **** Changes from 2004.03.10 (riesmeier) - Translated remaining German comments. Thanks to Yannick for the report. Affects: dcmdata/libsrc/dcitem.cc **** Changes from 2004.03.09 (riesmeier) - Updated makefile for new DICOMscope 3.6.x. Affects: dcmpstat/jni/Makefile.in - Rebuilt makefile dependencies. Affects: dcmpstat/jni/Makefile.dep **** Changes from 2004.03.05 (riesmeier) - Avoid wrong warning for LUTData (0028,3006) having a VR of US or SS. Affects: dcmdata/apps/dump2dcm.cc - Added initial "hooks" for (compressed) pixel items. Affects: dcmdata/apps/dump2dcm.cc - Added "ignore errors" option (similar to dcmdump). Affects: dcmdata/apps/dump2dcm.cc dcmdata/docs/dump2dcm.man - Added "see also" reference to dcmconv. Affects: dcmdata/docs/dcm2xml.man - Updated documentation (added comment to --fragment-size option). Affects: dcmdata/docs/dcmcrle.man - Fixed typo. Affects: dcmdata/docs/xml2dcm.man dcmsr/docs/xml2dsr.man - Removed dependency of target "clean" from "distclean". Affects: dcmwlm/tests/Makefile.in - Updated modified man pages. Affects: doxygen/manpages/man1/dcm2xml.1 doxygen/manpages/man1/dcmcrle.1 doxygen/manpages/man1/dump2dcm.1 doxygen/manpages/man1/findscu.1 doxygen/manpages/man1/wlmscpfs.1 doxygen/manpages/man1/xml2dcm.1 doxygen/manpages/man1/xml2dsr.1 **** Changes from 2004.02.27 (eichelberg) - Path separator is now correctly defined on MinGW. Thanks to Dimitri Papadopoulos-Orfanos for the bug report Affects: config/configure.in config/include/cfunix.h.in - Added --cancel option to findscu, similar to the option available in movescu. Affects: dcmnet/apps/findscu.cc dcmnet/docs/findscu.man - Imagectn now refuses find/get/move operations on SERIES or IMAGE level when the Patient/Study Only Q/R model is used and identifier checking is enabled (--check-find or --check-move options). Thanks to Tony C. Pan for the bug report. Affects: imagectn/libsrc/dbfind.cc imagectn/libsrc/dbmove.cc **** Changes from 2004.02.26 (eichelberg) - Fixed minor memory leak in findscu Thanks to Dr. Michael Heber for the bug report Affects: dcmnet/apps/findscu.cc **** Changes from 2004.02.25 (eichelberg) - Added a few dummy macros allowing for future private extensions Affects: dcmnet/apps/echoscu.cc dcmnet/apps/storescp.cc - Added global option flag for compatibility with very old DCMTK releases in the DICOM upper layer and ACSE code. Default is automatic handling, which should work in most cases. Affects: dcmnet/include/assoc.h dcmnet/include/dul.h dcmnet/libsrc/assoc.cc dcmnet/libsrc/dul.cc dcmnet/libsrc/dulconst.cc dcmnet/libsrc/dulfsm.cc dcmnet/libsrc/dulpriv.h dcmnet/libsrc/dulstruc.h - Fixed minor bug in libtiff detection routine Affects: config/configure.in config/configure - Marked option --fragment-size as non-standard since it violates a rule defined in DICOM Part 5 A.4.2: "Each frame shall be encoded in one and only one fragment". Affects: dcmdata/apps/dcmcrle.cc **** Changes from 2004.02.23 (eichelberg) - Added max-associations command line option, changed default to 50. Affects: dcmwlm/apps/wlcefs.cc dcmwlm/docs/wlmscpfs.man - Fixed resource leak due to sockets remaining in CLOSE_WAIT state. Thanks to Anibal Jodorcovsky for the bug report and fix. Affects: dcmwlm/libsrc/wlmactmg.cc - Fixed infinite loop in DUL_AbortAssociation that could occur on Win2K systems. Affects: dcmnet/libsrc/dul.cc **** Changes from 2004.02.20 (riesmeier) - Completed Doxygen module description. Affects: config/docs/config.dox imagectn/docs/imagectn.dox - Made formatting consistent with other text files. Affects: config/docs/config.txt config/docs/envvars.txt config/docs/macros.txt config/docs/modules.txt - Added support for private tags used by Intelerad's Image Server. Thanks to Anibal Jodorcovsky for providing this information. Affects: dcmdata/libsrc/private.dic dcmdata/libsrc/dcdictzz.cc - Removed superfluous dependency of target "clean" from "distclean". Affects: dcmsr/apps/Makefile.in dcmsr/libsrc/Makefile.in dcmtls/libsrc/Makefile.in ofstd/tests/Makefile.in - Avoid wrong warning for LUTData (0028,3006) having a VR of US or SS. Affects: dcmdata/apps/xml2dcm.cc - Added optional attribute "xmlns" to element "file-format". Affects: dcmdata/apps/dcm2xml.dtd **** Changes from 2004.02.13 (riesmeier) - Added support for configure's "Fine tuning of the installation directories". Affects: config/Makefile.def.in - Moved "data" and "doc" installation directories into "share". Affects: config/Makefile.def.in dcmdata/docs/*.man dcmimage/docs/*.man dcmimgle/docs/*.man dcmjpeg/docs/*.man dcmnet/docs/*.man dcmpstat/docs/*.man dcmsign/docs/*.man dcmsr/docs/*.man dcmwlm/docs/*.man imagectn/docs/*.man doxygen/manpages/man1/*.1 - Updated configuration files for Doxygen 1.3.6. Affects: doxygen/htmldocs.cfg doxygen/manpages.cfg - Re-generated include file with DICOM tags. Affects: dcmdata/include/dcdeftag.h - Re-generated built-in DICOM dictionary. Affects: dcmdata/libsrc/dcdictzz.cc - Corrected order of UIDs, modified comments and other minor corrections. Affects: dcmdata/include/dcuid.h dcmdata/libsrc/dcuid.cc - Replaced non-Unix newline characters. Affects: dcmdata/include/dcuid.h dcmdata/libsrc/dcuid.cc - Changed filename prefix for some storage SOP classes (array "modalities"). Affects: dcmdata/libsrc/dcuid.cc - Adapted code for changed tag names (e.g. PresentationLabel -> ContentLabel). Affects: dcmdata/libsrc/dcddirif.cc dcmpstat/libsrc/dcmpstat.cc dcmpstat/libsrc/dviface.cc imagectn/libsrc/dbindex.cc imagectn/libsrc/dbstore.cc - Changed order of local libraries to solve a linker problem with egcs-2.91. Affects: dcmpstat/apps/Makefile.in - Updated copyright header. Affects: dcmdata/libsrc/dcdictbi.nul dcmdata/libsrc/dcdictbi.cc - Added "#include " to compile with gcc 2.95.x on Linux 2.2.x. Affects: dcmpstat/tests/msgserv.cc - Added support for new directory records REGISTRATION and FIDUCIAL introduced with supplement 73 (Spatial Registration Storage SOP Classes). Affects: dcmdata/include/dcdirrec.h dcmdata/include/dcddirif.h dcmdata/libsrc/dcdirrec.cc dcmdata/libsrc/dcddirif.cc - Added support for Procedure Log Storage SOP class (supplement 66). Affects: dcmdata/libsrc/dcddirif.cc - Fixed wrong spelling of "SpatialFiducialsStorage". Affects: dcmdata/include/dcuid.h dcmdata/libsrc/dcuid.cc dcmnet/docs/movescu.man dcmnet/docs/storescp.man dcmnet/docs/storescu.man imagectn/docs/imagectn.man doxygen/manpages/man1/imagectn.1 doxygen/manpages/man1/movescu.1 doxygen/manpages/man1/storescp.1 doxygen/manpages/man1/storescu.1 - Removed acknowledgements with e-mail addresses from CVS log. Affects: dcmnet/apps/storescp.cc - Added text about new "etc" directory. Affects: README doxygen/htmldocs.dox - Added support for new directory records RAW DATA and SPECTROSCOPY introduced with CP 343. Affects: dcmdata/include/dcdirrec.h dcmdata/include/dcddirif.h dcmdata/libsrc/dcdirrec.cc dcmdata/libsrc/dcddirif.cc **** Changes from 2004.02.12 (wilkens) - Corrected bug in storescp that options "-xcr" and "+B" (or "--ignore") could not be used together. Now they can. Thanks to Philippe Puech for the bug report. Affects: dcmnet/apps/storescp.cc dcmnet/docs/storescp.man **** Changes from 2004.02.11 (wilkens) - Updated header. Affects: dcmdata/libsrc/dicom.dic - Updated attribute and UID specification (update before dcmtk 3.5.3 release). Affects: dcmdata/libsrc/dicom.dic dcmdata/include/dcuid.h dcmdata/libsrc/dcuid.cc imagectn/docs/imagectn.man dcmnet/docs/movescu.man dcmnet/docs/storescp.man dcmnet/docs/storescu.man **** Changes from 2004.02.11 (riesmeier) - Fixed usage output formatting. Affects: dcmwlm/tests/wltest.cc - Modified comment on option "--pattern". Affects: dcmdata/docs/dcmgpdir.man dcmjpeg/docs/dcmmkdir.man doxygen/manpages/man1/dcmgpdir.1 doxygen/manpages/man1/dcmmkdir.1 - Made "libXXX" text bold (\b) instead of italics (\e). Affects: dcmimage/docs/dcm2pnm.man dcmjpeg/docs/dcmj2pnm.man doxygen/manpages/man1/dcm2pnm.1 doxygen/manpages/man1/dcmj2pnm.1 - Added support for converting the man pages to plain text using "make text". Affects: doxygen/Makefile.in - Renamed UID_ProcedureLog to UID_ProcedureLogStorage. Affects: dcmsr/libsrc/dsrtypes.cc - Added backslash to escape "<" and ">" characters. Affects: imagectn/docs/ti.man doxygen/manpages/man1/ti.1 **** Changes from 2004.02.10 (riesmeier) - Revised man pages: removed small inconsistencies, fixed issues with current Doxygen release (version 1.3.5), etc. Affects: dcmdata/docs/dcm2xml.man dcmdata/docs/dcmconv.man dcmdata/docs/dcmcrle.man dcmdata/docs/dcmdrle.man dcmdata/docs/dcmdump.man dcmdata/docs/dcmftest.man dcmdata/docs/dcmgpdir.man dcmdata/docs/dcmodify.man dcmdata/docs/dump2dcm.man dcmdata/docs/xml2dcm.man dcmimage/docs/dcm2pnm.man dcmimage/docs/dcmquant.man dcmimage/docs/dcmscale.man dcmimgle/docs/dcmdspfn.man dcmimgle/docs/dcod2lum.man dcmimgle/docs/dconvlum.man dcmjpeg/docs/dcmcjpeg.man dcmjpeg/docs/dcmdjpeg.man dcmjpeg/docs/dcmj2pnm.man dcmjpeg/docs/dcmmkdir.man dcmnet/docs/echoscu.man dcmnet/docs/findscu.man dcmnet/docs/movescu.man dcmnet/docs/storescp.man dcmnet/docs/storescu.man dcmpstat/docs/dcmmkcrv.man dcmpstat/docs/dcmmklut.man dcmpstat/docs/dcmp2pgm.man dcmpstat/docs/dcmprscp.man dcmpstat/docs/dcmprscu.man dcmpstat/docs/dcmpschk.man dcmpstat/docs/dcmpsmk.man dcmpstat/docs/dcmpsprt.man dcmpstat/docs/dcmpsrcv.man dcmpstat/docs/dcmpssnd.man dcmsign/docs/dcmsign.man dcmsr/docs/dsr2html.man dcmsr/docs/dsr2xml.man dcmsr/docs/dsrdump.man dcmsr/docs/xml2dsr.man dcmwlm/docs/wlmscpfs.man imagectn/docs/dbregimg.man imagectn/docs/imagectn.man imagectn/docs/ti.man - Added initial version of man pages for all command line tools. Added: doxygen/manpages/man1/dbregimg.1 doxygen/manpages/man1/dcm2pnm.1 doxygen/manpages/man1/dcm2xml.1 doxygen/manpages/man1/dcmcjpeg.1 doxygen/manpages/man1/dcmconv.1 doxygen/manpages/man1/dcmcrle.1 doxygen/manpages/man1/dcmdjpeg.1 doxygen/manpages/man1/dcmdrle.1 doxygen/manpages/man1/dcmdspfn.1 doxygen/manpages/man1/dcmdump.1 doxygen/manpages/man1/dcmftest.1 doxygen/manpages/man1/dcmgpdir.1 doxygen/manpages/man1/dcmj2pnm.1 doxygen/manpages/man1/dcmmkcrv.1 doxygen/manpages/man1/dcmmkdir.1 doxygen/manpages/man1/dcmmklut.1 doxygen/manpages/man1/dcmodify.1 doxygen/manpages/man1/dcmp2pgm.1 doxygen/manpages/man1/dcmprscp.1 doxygen/manpages/man1/dcmprscu.1 doxygen/manpages/man1/dcmpschk.1 doxygen/manpages/man1/dcmpsmk.1 doxygen/manpages/man1/dcmpsprt.1 doxygen/manpages/man1/dcmpsrcv.1 doxygen/manpages/man1/dcmpssnd.1 doxygen/manpages/man1/dcmquant.1 doxygen/manpages/man1/dcmscale.1 doxygen/manpages/man1/dcmsign.1 doxygen/manpages/man1/dcod2lum.1 doxygen/manpages/man1/dconvlum.1 doxygen/manpages/man1/dsr2html.1 doxygen/manpages/man1/dsr2xml.1 doxygen/manpages/man1/dsrdump.1 doxygen/manpages/man1/dump2dcm.1 doxygen/manpages/man1/echoscu.1 doxygen/manpages/man1/findscu.1 doxygen/manpages/man1/imagectn.1 doxygen/manpages/man1/movescu.1 doxygen/manpages/man1/storescp.1 doxygen/manpages/man1/storescu.1 doxygen/manpages/man1/ti.1 doxygen/manpages/man1/wlmscpfs.1 doxygen/manpages/man1/xml2dcm.1 doxygen/manpages/man1/xml2dsr.1 - Moved dbregimg from folder "tests" to "apps". Added: imagectn/apps/dbregimg.cc imagectn/apps/dbregimg.dsp Removed: imagectn/tests/dbregimg.cc imagectn/tests/dbregimg.dsp imagectn/tests/CMakeLists.txt imagectn/tests/Makefile.dep Affects: dcmtk.dsw dcmtk_all.dsw imagectn/CMakeLists.txt imagectn/Makefile.in imagectn/apps/CMakeLists.txt imagectn/apps/Makefile.dep imagectn/apps/Makefile.in imagectn/tests/Makefile.in - Introduced new "etc" folder for configuration files. Added: dcmdata/etc/Makefile.in dcmimage/etc/Makefile.in dcmimgle/etc/Makefile.in dcmjpeg/etc/Makefile.in dcmnet/etc/Makefile.in dcmnet/etc/storescp.cfg dcmnet/etc/storescu.cfg dcmpstat/etc/Makefile.in dcmpstat/etc/printers.cfg dcmpstat/etc/test.cfg dcmsign/etc/Makefile.in dcmsr/etc/Makefile.in dcmtls/etc/Makefile.in dcmwlm/etc/Makefile.in imagectn/etc/Makefile.in imagectn/etc/imagectn.cfg Removed: dcmnet/docs/storescp.cfg dcmnet/docs/storescu.cfg dcmpstat/tests/printers.cfg dcmpstat/tests/test.cfg imagectn/docs/configrc Affects: config/rootconf config/docs/dirstruc.txt config/templates/Makefile.mod - Renamed configuration file from "configrc" to "imagectn.cfg". Added: imagectn/etc/imagectn.cfg Removed: imagectn/docs/configrc Affects: imagectn/apps/imagectn.cc imagectn/apps/ti.cc imagectn/docs/imagectn.txt imagectn/docs/ti.txt - Renamed and moved sample presentation LUT. Added: dcmpstat/tests/philips.lut Removed: dcmpstat/apps/pms_plut.txt - Renamed documentation files. Added: imagectn/docs/ctnconf.txt imagectn/docs/ctnsetup.txt Removed: imagectn/docs/configrc.txt imagectn/docs/setup.txt - Reworked makefiles: fixed small inconsistencies, added new install targets. Affects: INSTALL config/rootconf config/templates/Makefile.mod dcmdata/Makefile.in dcmdata/apps/Makefile.in dcmdata/docs/Makefile.in dcmdata/include/Makefile.in dcmdata/libsrc/Makefile.in dcmdata/tests/Makefile.in dcmimage/Makefile.in dcmimage/apps/Makefile.in dcmimage/docs/Makefile.in dcmimage/include/Makefile.in dcmimage/libsrc/Makefile.in dcmimage/tests/Makefile.in dcmimgle/Makefile.in dcmimgle/apps/Makefile.in dcmimgle/docs/Makefile.in dcmimgle/libsrc/Makefile.in dcmimgle/tests/Makefile.in dcmjpeg/Makefile.in dcmjpeg/apps/Makefile.in dcmjpeg/docs/Makefile.in dcmjpeg/include/Makefile.in dcmjpeg/libijg12/Makefile.in dcmjpeg/libijg16/Makefile.in dcmjpeg/libijg8/Makefile.in dcmjpeg/libsrc/Makefile.in dcmnet/Makefile.in dcmnet/apps/Makefile.in dcmnet/docs/Makefile.in dcmnet/include/Makefile.in dcmpstat/Makefile.in dcmpstat/apps/Makefile.in dcmpstat/docs/Makefile.in dcmpstat/include/Makefile.in dcmpstat/jni/Makefile.in dcmpstat/libsrc/Makefile.in dcmpstat/tests/Makefile.in dcmsign/Makefile.in dcmsign/apps/Makefile.in dcmsign/docs/Makefile.in dcmsign/include/Makefile.in dcmsr/Makefile.in dcmsr/apps/Makefile.in dcmsr/docs/Makefile.in dcmsr/include/Makefile.in dcmsr/libsrc/Makefile.in dcmsr/tests/Makefile.in dcmtls/Makefile.in dcmtls/apps/Makefile.in dcmtls/include/Makefile.in dcmtls/libsrc/Makefile.in dcmtls/tests/Makefile.in dcmwlm/Makefile.in dcmwlm/apps/Makefile.in dcmwlm/docs/Makefile.in dcmwlm/include/Makefile.in dcmwlm/libsrc/Makefile.in dcmwlm/tests/Makefile.in dcmwlm/wwwapps/Makefile.in imagectn/Makefile.in imagectn/apps/Makefile.in imagectn/docs/Makefile.in imagectn/include/Makefile.in imagectn/libsrc/Makefile.in imagectn/tests/Makefile.in ofstd/docs/Makefile.in ofstd/include/Makefile.in ofstd/libsrc/Makefile.in ofstd/tests/Makefile.in - Replaced Makefile by Makefile.in (using configure mechanism). Added: doxygen/configure doxygen/Makefile.in Removed: doxygen/Makefile - Added comment on issues with Doxygen 1.3.5. Affects: doxygen/patchman.sh - Rebuilt makefile dependencies. Affects: dcmdata/apps/Makefile.dep dcmdata/libsrc/Makefile.dep dcmdata/tests/Makefile.dep dcmsr/libsrc/Makefile.dep imagectn/libsrc/Makefile.dep ofstd/libsrc/Makefile.dep ofstd/tests/Makefile.dep - Added "tests" folder. Added: dcmjpeg/tests/Makefile.in dcmnet/tests/Makefile.in dcmsign/tests/Makefile.in - Updated copyright header. Affects: dcmsign/apps/dcmsign.cc - Removed man page. Removed: dcmwlm/docs/wwwapp.man - Create HTML documentation if required when "make install-html" is called. Affects: doxygen/Makefile.in - Added text on how to create and install the Unix man pages for all command line tools. Affects: INSTALL - Fixed minor layout issue in man pages. Affects: dcmnet/docs/movescu.man dcmnet/docs/storescp.man dcmwlm/docs/wlmscpfs.man imagectn/docs/imagectn.man doxygen/manpages/man1/imagectn.1 doxygen/manpages/man1/movescu.1 doxygen/manpages/man1/wlmscpfs.1 - Removed old text documentation files (replaced by man and HTML pages). Removed: dcmdata/docs/dcm2xml.txt dcmdata/docs/dcmconv.txt dcmdata/docs/dcmcrle.txt dcmdata/docs/dcmdrle.txt dcmdata/docs/dcmdump.txt dcmdata/docs/dcmftest.txt dcmdata/docs/dcmgpdir.txt dcmdata/docs/dcmodify.txt dcmdata/docs/dump2dcm.txt dcmdata/docs/xml2dcm.txt dcmimage/docs/dcm2pnm.txt dcmimage/docs/dcmquant.txt dcmimage/docs/dcmscale.txt dcmimgle/docs/dcmdspfn.txt dcmimgle/docs/dcod2lum.txt dcmimgle/docs/dconvlum.txt dcmjpeg/docs/dcmcjpeg.txt dcmjpeg/docs/dcmdjpeg.txt dcmjpeg/docs/dcmj2pnm.txt dcmjpeg/docs/dcmmkdir.txt dcmnet/docs/echoscu.txt dcmnet/docs/findscu.txt dcmnet/docs/movescu.txt dcmnet/docs/storescp.txt dcmnet/docs/storescu.txt dcmpstat/docs/dcmmkcrv.txt dcmpstat/docs/dcmprscp.txt dcmpstat/docs/dcmpsmk.txt dcmpstat/docs/dcmpssnd.txt dcmpstat/docs/dcmmklut.txt dcmpstat/docs/dcmprscu.txt dcmpstat/docs/dcmpsprt.txt dcmpstat/docs/dcmp2pgm.txt dcmpstat/docs/dcmpschk.txt dcmpstat/docs/dcmpsrcv.txt dcmsign/docs/dcmsign.txt dcmsr/docs/dsr2html.txt dcmsr/docs/dsr2xml.txt dcmsr/docs/dsrdump.txt dcmsr/docs/xml2dsr.txt dcmwlm/docs/wlmscpfs.txt imagectn/docs/dbregimg.txt imagectn/docs/imagectn.txt imagectn/docs/ti.txt - Removed superfluous sample LUT. Removed: dcmpstat/tests/sample.lut **** Changes from 2004.02.06 (riesmeier) - Distinguish more clearly between const and non-const access to pixel data. Affects: dcmimage/include/dicocpt.h dcmimage/include/dicoflt.h dcmimage/include/dicoimg.h dcmimage/include/dicomot.h dcmimage/include/dicoopx.h dcmimage/include/dicoopxt.h dcmimage/include/dicopxt.h dcmimage/include/dicorot.h dcmimage/include/dicosct.h dcmimage/libsrc/dicoimg.cc dcmimage/libsrc/dipipng.cc dcmimage/libsrc/dipitiff.cc dcmimgle/include/diflipt.h dcmimgle/include/diimage.h dcmimgle/include/diinpx.h dcmimgle/include/diinpxt.h dcmimgle/include/dimo1img.h dcmimgle/include/dimo2img.h dcmimgle/include/dimoimg.h dcmimgle/include/dimoipxt.h dcmimgle/include/dimoopx.h dcmimgle/include/dimoopxt.h dcmimgle/include/dimopx.h dcmimgle/include/dimopxt.h dcmimgle/include/dipixel.h dcmimgle/include/dirotat.h dcmimgle/libsrc/dimo1img.cc dcmimgle/libsrc/dimo2img.cc dcmimgle/libsrc/dimoimg.cc dcmimgle/libsrc/dimopx.cc dcmjpeg/libsrc/dipijpeg.cc - Fixed inconsistency in re-calculation of PixelSpacing and ImagerPixelSpacing when scaling images. Affects: dcmimgle/libsrc/diimage.cc - Added typecast to array indexes to avoid warning messages on MacOS X 10.3 with gcc 3.3. Affects: dcmimage/include/diybrpxt.h **** Changes from 2004.02.04 (riesmeier) - Removed acknowledgements with e-mail addresses from CVS log. Affects: dcmdata/libsrc/dcbytstr.cc dcmdata/libsrc/dcdatset.cc dcmdata/libsrc/dcdicdir.cc dcmdata/libsrc/dcdict.cc dcmdata/libsrc/dcfilefo.cc dcmdata/libsrc/dcitem.cc dcmdata/libsrc/dcmetinf.cc dcmdata/libsrc/dcobject.cc dcmdata/libsrc/dcpcache.cc dcmdata/libsrc/dcpixseq.cc dcmdata/libsrc/dcpxitem.cc dcmdata/libsrc/dcstack.cc dcmdata/libsrc/dctag.cc dcmdata/libsrc/dcuid.cc dcmdata/libsrc/dcvr.cc dcmdata/libsrc/dcvrat.cc dcmdata/libsrc/dcvrfd.cc dcmdata/libsrc/dcvrfl.cc dcmdata/libsrc/dcvrobow.cc dcmdata/libsrc/dcvrsl.cc dcmdata/libsrc/dcvrss.cc dcmdata/libsrc/dcvrul.cc dcmdata/libsrc/dcvrus.cc dcmdata/tests/tvrdatim.cc dcmnet/libsrc/cond.cc dcmnet/libsrc/dimse.cc dcmnet/libsrc/dulfsm.cc dcmnet/libsrc/dulparse.cc dcmnet/libsrc/extneg.cc dcmpstat/apps/dcmmkcrv.cc dcmpstat/apps/dcmmklut.cc dcmpstat/apps/dcmp2pgm.cc dcmpstat/apps/dcmprscp.cc dcmpstat/apps/dcmprscu.cc dcmpstat/apps/dcmpschk.cc dcmpstat/apps/dcmpsprt.cc dcmpstat/apps/dcmpsrcv.cc dcmpstat/apps/dcmpssnd.cc dcmpstat/include/dviface.h dcmpstat/include/dvpsprt.h dcmpstat/include/dvpssp.h dcmpstat/include/dvsighdl.h dcmpstat/libsrc/dcmpstat.cc dcmpstat/libsrc/dviface.cc dcmpstat/libsrc/dvpsabl.cc dcmpstat/libsrc/dvpsall.cc dcmpstat/libsrc/dvpscul.cc dcmpstat/libsrc/dvpsdal.cc dcmpstat/libsrc/dvpsgal.cc dcmpstat/libsrc/dvpsgll.cc dcmpstat/libsrc/dvpsgrl.cc dcmpstat/libsrc/dvpsibl.cc dcmpstat/libsrc/dvpsovl.cc dcmpstat/libsrc/dvpspl.cc dcmpstat/libsrc/dvpspll.cc dcmpstat/libsrc/dvpsprt.cc dcmpstat/libsrc/dvpsril.cc dcmpstat/libsrc/dvpsrsl.cc dcmpstat/libsrc/dvpsspl.cc dcmpstat/libsrc/dvpssvl.cc dcmpstat/libsrc/dvpstat.cc dcmpstat/libsrc/dvpstxl.cc dcmpstat/libsrc/dvpsvll.cc dcmpstat/libsrc/dvpsvwl.cc dcmpstat/libsrc/dvsighdl.cc imagectn/apps/cnfpriv.cc imagectn/apps/tiquery.cc imagectn/libsrc/dbutils.cc - Removed leading underscore characters from preprocessor symbols (reserved symbols). Affects: dcmpstat/include/dvpsprt.h dcmpstat/include/dvpssp.h dcmpstat/include/dvsighdl.h - Replaced tabs by spaces. Affects: dcmnet/libsrc/dulfsm.cc - Added CVS log entry at the end of the file. Affects: dcmdata/include/dcrledrg.h - Removed pointer declaration from parameter "resultStack" in method findAndGetElements(). Affects: dcmdata/apps/mdfdsman.cc dcmdata/include/dcitem.h dcmdata/libsrc/dcitem.cc - Adapted type casts to new-style typecast operators defined in ofcast.h. Affects: dcmdata/libsrc/dcbytstr.cc dcmdata/libsrc/dccodec.cc dcmdata/libsrc/dcdatset.cc dcmdata/libsrc/dcdicdir.cc dcmdata/libsrc/dcdicent.cc dcmdata/libsrc/dcdict.cc dcmdata/libsrc/dcelem.cc dcmdata/libsrc/dcfilefo.cc dcmdata/libsrc/dchashdi.cc dcmdata/libsrc/dcistrmb.cc dcmdata/libsrc/dcistrmf.cc dcmdata/libsrc/dcmetinf.cc dcmdata/libsrc/dcobject.cc dcmdata/libsrc/dcostrmb.cc dcmdata/libsrc/dcostrmf.cc dcmdata/libsrc/dcpcache.cc dcmdata/libsrc/dcpixseq.cc dcmdata/libsrc/dcpxitem.cc dcmdata/libsrc/dcrlecce.cc dcmdata/libsrc/dcstack.cc dcmdata/libsrc/dcswap.cc dcmdata/libsrc/dctag.cc dcmdata/libsrc/dctagkey.cc dcmdata/libsrc/dcuid.cc dcmdata/libsrc/dcvr.cc dcmdata/libsrc/dcvrat.cc dcmdata/libsrc/dcvrfd.cc dcmdata/libsrc/dcvrfl.cc dcmdata/libsrc/dcvrobow.cc dcmdata/libsrc/dcvrpobw.cc dcmdata/libsrc/dcvrsl.cc dcmdata/libsrc/dcvrss.cc dcmdata/libsrc/dcvrul.cc dcmdata/libsrc/dcvrus.cc - Translated remaining German comments. Affects: dcmdata/libsrc/dcdicdir.cc - Updated copyright header. Affects: dcmdata/libsrc/dcdictbi.cc **** Changes from 2004.01.27 (onken) - Minor corrections to manpages. Affects: dcmpstat/docs/dcmpschk.man dcmwlm/docs/wlmscpfs.man **** Changes from 2004.01.26 (onken) - Initial checkin of wlmscpfs manpage Added: dcmwlm/docs/wlmscpfs.man dcmwlm/docs/wwwapp.man - Initial checkin of imagectn manpages Added: imagectn/docs/dbregimg.man imagectn/docs/imagectn.man imagectn/docs/ti.man **** Changes from 2004.01.21 (eichelberg) - The DUL FSM did not read the complete A-ASSOCIATE-RELEASE-RSP PDU from the socket before closing the transport connection, possibly causing an error message at the remote SCP site. Fixed. Thanks to Andreas Heiduk for the bug report. Affects: dcmnet/libsrc/dulfsm.cc - StoreSCU with --no-halt option now also continues if errors other than a missing presentation context occur, e.g. attempt to load non-DICOM file. Thanks to Jessica Brandt for the suggestion. Affects: dcmnet/apps/storescu.cc - Added configure test for an mkstemp() prototype. Needed on Solaris 2.5.1 where mkstemp() is present in libc but no prototype is defined. Affects: config/configure config/configure.in config/include/cfunix.h.in config/include/cfwin32.h - Added special handling for platforms where mkstemp() exists but no prototype is defined. Affects: dcmdata/libsrc/dcdicdir.cc - Fixed DOS CR/LF in preprocessor directives Affects: ofstd/include/ofconsol.h - Fixed AC_CHECK_PROTOTYPE autoconf macro to support names containing space or colon characters. Affects: config/aclocal.m4 - Added configure test for a std::fprintf prototype in or . Needed for dcmsr module with Borland Builder. Affects: config/configure config/configure.in config/include/cfunix.h.in config/include/cfwin32.h - Using std::fprintf instead of fprintf as function pointer if configure symbol HAVE_PROTOTYPE_STD__FPRINTF is defined, needed on Borland Builder. Affects: dcmsr/libsrc/dsrxmld.cc - Added configure test that checks if the libpng header file is to be included as or . Affects: config/configure config/configure.in config/include/cfunix.h.in config/include/cfwin32.h - Adapted PNG export plugin to new configure test, fixed issue with local variable that could be clobbered by longjmp(). Affects: dcmimage/libsrc/dipipng.cc - Added OFconst_cast, needed for Visual C++ 6 Affects: dcmimage/include/dicopxt.h **** Changes from 2004.01.20 (riesmeier) - Added new command line option which allows to write the item identifier "id" (XML attribute) even if it is not required (because the item is not referenced by any other item). Useful for debugging purposes. Affects: dcmsr/apps/dsr2xml.cc dcmsr/docs/dsr2xml.man dcmsr/docs/dsr2xml.txt dcmsr/include/dsrtypes.h dcmsr/libsrc/dsrdoctn.cc dcmsr/libsrc/dsrtypes.cc - Fixed typo. Affects: dcmsr/apps/dsr2xml.cc **** Changes from 2004.01.20 (eichelberg) - Added dummy friend class to avoid warning on certain gcc releases Affects: dcmdata/include/dcrledrg.h dcmdata/include/dcrleerg.h **** Changes from 2004.01.16 (onken) - Initial checkin of dcmpstat manpages. Added: dcmpstat/docs/dcmmkcrv.man dcmpstat/docs/dcmmklut.man dcmpstat/docs/dcmp2pgm.man dcmpstat/docs/dcmprscp.man dcmpstat/docs/dcmprscu.man dcmpstat/docs/dcmpschk.man dcmpstat/docs/dcmpsmk.man dcmpstat/docs/dcmpsprt.man dcmpstat/docs/dcmpsrcv.man dcmpstat/docs/dcmpssnd.man - Initial checkin of dcmsign manpage. Added: dcmsign/docs/dcmsign.man **** Changes from 2004.01.16 (riesmeier) - Adapted XML output format of Date, Time and Datetime to XML Schema (ISO 8601) requirements. Affects: dcmsr/apps/dsr2xml.xsd dcmsr/include/dsrdattn.h dcmsr/include/dsrdtitn.h dcmsr/include/dsrtimtn.h dcmsr/libsrc/Makefile.dep dcmsr/libsrc/dsrdoc.cc dcmsr/libsrc/dsrdattn.cc dcmsr/libsrc/dsrdoctn.cc dcmsr/libsrc/dsrdtitn.cc dcmsr/libsrc/dsrtimtn.cc - Made readXML() more robust with regard to expected XML structure. Affects: dcmsr/libsrc/dsrdoc.cc dcmsr/libsrc/dsrimgvl.cc - Added clear() method to struct ItemStruct. Affects: dcmsr/include/dsrcsidl.h - Report more warnings when reading from XML document. Affects: dcmsr/libsrc/dsrcsidl.cc - Only write XML element value when presentation state is valid. Affects: dcmsr/libsrc/dsrimgvl.cc - Added comment regarding ISO datetime format. Affects: dcmsr/libsrc/dsrtcovl.cc - Replaced OFString::resize() by ..reserve() in convertToPrintString(). Affects: dcmsr/libsrc/dsrtypes.cc - Added setISOFormattedXXX() methods for Date, Time and DateTime. Affects: ofstd/include/ofdate.h ofstd/include/ofdatime.h ofstd/include/oftime.h ofstd/libsrc/ofdate.cc ofstd/libsrc/ofdatime.cc ofstd/libsrc/oftime.cc ofstd/tests/tofdatim.cc - Removed acknowledgements with e-mail addresses from CVS log. Affects: dcmdata/apps/dcmdump.cc dcmdata/apps/dcmgpdir.cc dcmdata/apps/dump2dcm.cc dcmdata/include/dcdebug.h dcmdata/include/dcdicent.h dcmdata/include/dcdict.h dcmdata/include/dcpixel.h dcmdata/include/dcrleenc.h dcmdata/include/dctagkey.h dcmdata/libsrc/cmdlnarg.cc dcmdata/libsrc/dcdirrec.cc dcmdata/libsrc/dclist.cc dcmdata/libsrc/dcpixel.cc dcmdata/libsrc/dcsequen.cc dcmdata/libsrc/dcvrds.cc dcmdata/libsrc/dcvrlt.cc dcmdata/libsrc/dcvrst.cc dcmdata/libsrc/dcvrut.cc dcmdata/libsrc/dcvrulup.cc ofstd/include/ofconapp.h ofstd/include/ofconsol.h ofstd/include/oflogfil.h ofstd/include/ofstream.h ofstd/include/ofstring.h ofstd/libsrc/ofconsol.cc ofstd/tests/tofdatim.cc ofstd/tests/tlist.cc ofstd/tests/tofstd.cc ofstd/tests/tstlist.cc ofstd/tests/tststack.cc ofstd/tests/tstthred.cc - Replaced OFString::resize() by ..reserve() in convertToMarkupString() because of STL problems with Metrowerks CodeWarrior 8.3 compiler. Thanks to Arnaud Masson for the bug report and fix. Affects: ofstd/libsrc/ofstd.cc - Adapted type casts to new-style typecast operators defined in ofcast.h. Affects: dcmdata/apps/dcmconv.cc dcmdata/apps/dcmcrle.cc dcmdata/apps/dcmdrle.cc dcmdata/apps/dcmdump.cc dcmdata/apps/dump2dcm.cc dcmdata/apps/mdfdsman.cc dcmdata/apps/xml2dcm.cc dcmdata/libsrc/dcxfer.cc dcmdata/libsrc/dcvrtm.cc dcmdata/libsrc/dcvrui.cc dcmdata/libsrc/dcxfer.cc - Added missing #include "osconfig.h". Affects: dcmdata/libsrc/Makefile.dep dcmdata/libsrc/dcvrst.cc - Introduced new parameter "dateTimeSeparator" in getISOFormattedXXX() methods to support ISO 8601 format as required by XML Schema type "dateTime". Affects: dcmdata/include/dcvrdt.h dcmdata/libsrc/dcvrdt.cc - Minor corrections and enhancements. Affects: dcmjpeg/docs/dcmcjpeg.man dcmjpeg/docs/dcmdjpeg.man dcmjpeg/docs/dcmj2pnm.man dcmjpeg/docs/dcmmkdir.man - Updated copyright header. Affects: dcmjpeg/apps/dcmcjpeg.cc dcmjpeg/apps/dcmdjpeg.cc dcmjpeg/apps/dcmj2pnm.cc dcmjpeg/apps/dcmmkdir.cc - Added new compatibility flag that allows to ignore the third value of LUT descriptors and to determine the bits per table entry automatically. Affects: dcmjpeg/docs/dcmj2pnm.txt **** Changes from 2004.01.15 (wilkens) - Added function to Worklist Management Data Source Base Class. This function is needed in the private part of this toolkit. Affects: dcmwlm/include/wlds.h **** Changes from 2004.01.15 (onken) - Initial checkin of dcmjpeg manpages Added: dcmjpeg/docs/dcmcjpeg.man dcmjpeg/docs/dcmdjpeg.man dcmjpeg/docs/dcmj2pnm.man dcmjpeg/docs/dcmmkdir.man - Initial checkin of dcmnet manpages Added: dcmnet/docs/echoscu.man dcmnet/docs/findscu.man dcmnet/docs/movescu.man dcmnet/docs/storescp.man dcmnet/docs/storescu.man **** Changes from 2004.01.08 (wilkens) - Added list of supported matching and return keys into documentation for wlmscpfs. Affects: dcmwlm/docs/wlmscpfs.txt **** Changes from 2004.01.07 (wilkens) - Fixed typo in comment. Affects: dcmwlm/include/wlds.h - Added new sequence type return key attributes to wlmscpfs. Fixed bug that for equally named attributes in sequences always the same value will be returned. Added functionality that also more than one item will be returned in sequence type return key attributes. Affects: dcmwlm/include/wlds.h dcmwlm/include/wldsfs.h dcmwlm/include/wlfsim.h dcmwlm/include/wltypdef.h dcmwlm/libsrc/wlds.cc dcmwlm/libsrc/wldsfs.cc dcmwlm/libsrc/wlfsim.cc **** Changes from 2004.01.05 (riesmeier) - Renamed XML attribute "ref_id" to "ref". Affects: dcmsr/apps/dsr2xml.xsd dcmsr/include/dsrxmld.h dcmsr/libsrc/dsrreftn.cc dcmsr/libsrc/dsrxmld.cc - Removed acknowledgements with e-mail addresses from CVS log. Affects: dcmimage/apps/dcm2pnm.cc dcmimgle/apps/dconvlum.cc dcmimgle/include/diimage.h dcmimgle/include/diinpxt.h dcmimgle/include/dimoipxt.h dcmimgle/include/dimoopx.h dcmimgle/include/dimopxt.h dcmimgle/include/diovpln.h dcmimgle/include/discalet.h dcmimgle/libsrc/diciefn.cc dcmimgle/libsrc/didispfn.cc dcmimgle/libsrc/digsdfn.cc dcmimgle/libsrc/diutils.cc dcmsr/apps/dsr2html.cc dcmsr/apps/dsr2xml.cc dcmsr/apps/dsrdump.cc dcmsr/include/dsrdoc.h dcmsr/include/dsrtypes.h dcmsr/libsrc/dsrdoc.cc dcmsr/libsrc/dsrdoctn.cc dcmsr/libsrc/dsrtextn.cc dcmsr/libsrc/dsrtypes.cc dcmsr/tests/mkreport.cc - Adapted type casts to new-style typecast operators defined in ofcast.h. Affects: dcmimage/apps/dcm2pnm.cc **** Changes from 2004.01.02 (wilkens) - Integrated new return key attributes into wlmscpfs and updated function that checks integrity of matching key attribute values (added support for new VR). Affects: dcmwlm/include/wlds.h dcmwlm/libsrc/wlds.cc **** Changes from 2003.12.23 (riesmeier) - Added missing API documentation. Affects: dcmimage/include/dicomot.h dcmimage/include/dicoopx.h dcmimage/include/dicoopxt.h dcmimage/include/dicopxt.h dcmimage/include/diregist.h dcmimage/include/diyf2pxt.h dcmimage/include/diyp2pxt.h - Updated documentation to get rid of doxygen warnings. Affects: dcmimgle/include/dimoimg.h dcmimgle/include/dimoopxt.h dcmimage/include/dipipng.h - Adapted type casts to new-style typecast operators defined in ofcast.h. Affects: dcmimage/include/diargpxt.h dcmimage/include/dicmypxt.h dcmimage/include/dicocpt.h dcmimage/include/dicoflt.h dcmimage/include/dicomot.h dcmimage/include/dicoopxt.h dcmimage/include/dicopxt.h dcmimage/include/dicorot.h dcmimage/include/dicosct.h dcmimage/include/dihsvpxt.h dcmimage/include/dipalpxt.h dcmimage/include/diqtcmap.h dcmimage/include/diqtctab.h dcmimage/include/diqtfs.h dcmimage/include/diqtpix.h dcmimage/include/diqtstab.h dcmimage/include/dirgbpxt.h dcmimage/include/diybrpxt.h dcmimage/include/diybrpxt.h dcmimage/include/diyf2pxt.h dcmimage/include/diyp2pxt.h - Updated copyright header. Affects: dcmimage/include/diargpxt.h dcmimage/include/dicmypxt.h dcmimage/include/dicocpt.h dcmimage/include/dicoflt.h dcmimage/include/dicomot.h dcmimage/include/dicoopxt.h dcmimage/include/dicopxt.h dcmimage/include/dicorot.h dcmimage/include/dicosct.h dcmimage/include/dihsvpxt.h dcmimage/include/dipalpxt.h dcmimage/include/diqtcmap.h dcmimage/include/diqtctab.h dcmimage/include/diqtfs.h dcmimage/include/diqthash.h dcmimage/include/diqthitm.h dcmimage/include/diqtid.h dcmimage/include/diqtpbox.h dcmimage/include/diqtpix.h dcmimage/include/diqtstab.h dcmimage/include/diqttype.h dcmimage/include/diquant.h dcmimage/include/dirgbpxt.h dcmimage/include/diybrpxt.h dcmimage/include/diybrpxt.h dcmimage/include/diyf2pxt.h dcmimage/include/diyp2pxt.h dcmimage/libsrc/dicoopx.cc dcmimage/libsrc/dicopx.cc dcmimage/libsrc/diregist.cc dcmimage/libsrc/diyf2img.cc dcmimage/libsrc/diyp2img.cc - Removed leading underscore characters from preprocessor symbols (reserved symbols). Affects: dcmimage/include/diargpxt.h dcmimage/include/dicmypxt.h dcmimage/include/dicocpt.h dcmimage/include/dicoflt.h dcmimage/include/dicomot.h dcmimage/include/dicoopxt.h dcmimage/include/dicopxt.h dcmimage/include/dicorot.h dcmimage/include/dicosct.h dcmimage/include/dihsvpxt.h dcmimage/include/dipalpxt.h dcmimage/include/dirgbpxt.h dcmimage/include/diybrpxt.h dcmimage/include/diybrpxt.h dcmimage/include/diyf2pxt.h dcmimage/include/diyp2pxt.h - Rebuilt makefile dependencies. Affects: dcmimage/apps/Makefile.dep dcmimage/libsrc/Makefile.dep - Replaced post-increment/decrement operators by pre-increment/decrement operators where appropriate (e.g. 'i++' by '++i'). Affects: dcmimage/include/diargpxt.h dcmimage/include/dicmypxt.h dcmimage/include/dicoopxt.h dcmimage/include/dicopxt.h dcmimage/include/dihsvpxt.h dcmimage/include/dipalpxt.h dcmimage/include/dirgbpxt.h dcmimage/include/diybrpxt.h dcmimage/include/diyf2pxt.h dcmimage/include/diyp2pxt.h dcmimgle/apps/dcmdspfn.cc dcmimgle/apps/dcod2lum.cc dcmimgle/apps/dconvlum.cc dcmimgle/include/dicrvfit.h dcmimgle/include/diflipt.h dcmimgle/include/diinpxt.h dcmimgle/include/dimoipxt.h dcmimgle/include/dimoopxt.h dcmimgle/include/dimopxt.h dcmimgle/include/diobjcou.h dcmimgle/include/dirotat.h dcmimgle/include/discalet.h dcmimgle/include/displint.h dcmimgle/include/ditranst.h dcmimgle/include/diutils.h dcmimgle/libsrc/dcmimage.cc dcmimgle/libsrc/dibaslut.cc dcmimgle/libsrc/dicielut.cc dcmimgle/libsrc/didispfn.cc dcmimgle/libsrc/digsdfn.cc dcmimgle/libsrc/digsdlut.cc dcmimgle/libsrc/diimage.cc dcmimgle/libsrc/diluptab.cc dcmimgle/libsrc/dimoimg.cc dcmimgle/libsrc/diovdat.cc dcmimgle/libsrc/diovlay.cc dcmimgle/libsrc/diovlimg.cc dcmimgle/libsrc/diovpln.cc - Updated "HTML documentation" section. Affects: INSTALL **** Changes from 2003.12.23 (wilkens) - Integrated new matching key attributes into wlmscpfs. Affects: dcmwlm/include/wlds.h dcmwlm/include/wlfsim.h dcmwlm/include/wltypdef.h dcmwlm/libsrc/wlds.cc dcmwlm/libsrc/wlfsim.cc - Updated matching algorithm in wlmscpfs so that universal matching key attributes will also lead to a match in case the corresponding attribute does does exist in the dataset. Affects: dcmwlm/libsrc/wlfsim.cc - Updated dsp-files in module dcmpstat. Affects: dcmpstat/apps/dcmmkcrv.dsp dcmpstat/apps/dcmmklut.dsp dcmpstat/apps/dcmp2pgm.dsp dcmpstat/apps/dcmprscp.dsp dcmpstat/apps/dcmprscu.dsp dcmpstat/apps/dcmpschk.dsp dcmpstat/apps/dcmpsmk.dsp dcmpstat/apps/dcmpsprt.dsp dcmpstat/apps/dcmpsrcv.dsp dcmpstat/apps/dcmpssnd.dsp dcmpstat/libsrc/dcmpstat.dsp **** Changes from 2003.12.19 (eichelberg) - DVInterface::terminatePrintServer now also correctly terminates TLS-based print server processes. Affects: dcmpstat/CMakeLists.txt dcmpstat/libsrc/Makefile.in dcmpstat/libsrc/dviface.cc - Completed support for terminating TLS-based print server processes Affects: dcmpstat/apps/CMakeLists.txt dcmpstat/apps/Makefile.in dcmpstat/libsrc/dviface.cc **** Changes from 2003.12.18 (eichelberg) - During creation of default presentation state from image the Modality LUT is now ignored for XA, RF and XA Biplane SOP instances Affects: dcmpstat/libsrc/dcmpstat.cc - Fixed print preview for MONOCHROME1 images with IDENTITY P-LUT shape Affects: dcmpstat/libsrc/dvpspl2.cc - Added standard includes needed by Borland Builder Thanks to Gordon Klos for the suggestion. Affects: dcmtls/libsrc/tlslayer.cc **** Changes from 2003.12.18 (riesmeier) - Updated TCL script to reflect changes in dcmdump output. Affects: dcmdata/tests/dcmpsdmp.tcl - Fixed bug in timezone calculation (difference of local time from UTC). Thanks to Anibal Jodorcovsky for the report. Affects: ofstd/libsrc/oftime.cc **** Changes from 2003.12.17 (onken) - MdfDatasetManager now remembers loaded filename. Additional save function added. Affects: dcmdata/apps/mdfdsman.cc dcmdata/apps/mdfdsman.h **** Changes from 2003.12.17 (eichelberg) - Removed unused macros Thanks to Michael Doppler for the suggestion. Affects: dcmnet/include/dcompat.h - Added configure test that checks if libtiff supports LZW compression Affects: config/aclocal.m4 config/configure config/configure.in config/include/cfunix.h.in config/include/cfwin32.h - Command line options for and defaults for TIFF export now depend on whether or not libtiff supports LZW compression Affects: dcmimage/apps/dcm2pnm.cc - Changed definition of COUT and CERR macros to allow redirection to file. Thanks to Markus Sabin for the suggestion. Affects: ofstd/include/ofconsol.h - Changed order of inheritance to avoid internal compiler error on Borland Builder. Thanks to Gordon Klos for the suggestion. Affects: dcmsr/include/dsrtree.h **** Changes from 2003.12.17 (riesmeier) - Fixed bug/inconsistency in comparison operators of class OFTime. Now the "time overflow" is handled correctly. Thanks to Anibal Jodorcovsky for the report. Affects: ofstd/include/oftime.h ofstd/libsrc/oftime.cc - Added note to the comparison operators that the "day overflow" is not yet handled correctly. Affects: ofstd/include/ofdatime.h ofstd/libsrc/ofdatime.cc - Added test cases for comparing both time and date/time values. Affects: ofstd/tests/tofdatim.cc - Added new compatibility flag that allows to ignore the third value of LUT descriptors and to determine the bits per table entry automatically. Affects: dcmimage/apps/dcm2pnm.cc dcmimage/docs/dcm2pnm.man dcmimage/docs/dcm2pnm.txt dcmimage/libsrc/diargimg.cc dcmimage/libsrc/dipalimg.cc dcmimgle/include/dcmimage.h dcmimgle/include/diluptab.h dcmimgle/include/dimoimg.h dcmimgle/include/diutils.h dcmimgle/libsrc/diluptab.cc dcmimgle/libsrc/dimoimg.cc dcmimgle/libsrc/dimomod.cc - Adapted type casts to new-style typecast operators defined in ofcast.h. Affects: dcmimage/libsrc/diargimg.cc dcmimage/libsrc/dicmyimg.cc dcmimage/libsrc/dicoimg.cc dcmimage/libsrc/dihsvimg.cc dcmimage/libsrc/dipalimg.cc dcmimage/libsrc/dipipng.cc dcmimage/libsrc/dipitiff.cc dcmimage/libsrc/diqtctab.cc dcmimage/libsrc/diqtfs.cc dcmimage/libsrc/diqthash.cc dcmimage/libsrc/diqtpbox.cc dcmimage/libsrc/diquant.cc dcmimage/libsrc/dirgbimg.cc dcmimage/libsrc/diybrimg.cc - Renamed parameters/variables "list" to avoid name clash with STL class. Affects: dcmimage/include/diqthitl.h dcmimage/libsrc/diqthitl.cc - Added missing filename entry to MSVC project file (dsrprocc.cxx). Affects: dcmsr/libsrc/dcmsr.dsp - Removed leading underscore characters from preprocessor symbols (reserved symbols). Affects: dcmimage/include/diargimg.h dcmimage/include/dicmyimg.h dcmimage/include/dicoimg.h dcmimage/include/dicoopx.h dcmimage/include/dicopx.h dcmimage/include/dihsvimg.h dcmimage/include/dipalimg.h dcmimage/include/dipipng.h dcmimage/include/dipitiff.h dcmimage/include/diregist.h dcmimage/include/dirgbimg.h dcmimage/include/diybrimg.h dcmimage/include/diyf2img.h dcmimage/include/diyp2img.h **** Changes from 2003.12.16 (riesmeier) - Added note on coding scheme identification and private coding schemes. Affects: dcmsr/include/dsrcodvl.h dcmsr/include/dsrcsidl.h - Added note that the condition for the Content Template Sequence is currently not checked. Affects: dcmsr/include/dsrcitem.h dcmsr/include/dsrdoctn.h **** Changes from 2003.12.11 (riesmeier) - Added initial version of man pages for dcmimage command line tools. Added: dcmimage/docs/dcm2pnm.man dcmimage/docs/dcmquant.man dcmimage/docs/dcmscale.man - Made usage output consistent with other tools. Affects: dcmimage/apps/dcm2pnm.cc dcmimage/apps/dcmscale.cc - Made command line options section consistent with the corresponding tool. Affects: dcmimage/docs/dcmscale.txt - Removed reference to non-existing command line tool "dcmjscal". Affects: dcmimage/docs/dcmscale.txt - Made documentation consistent with other tools. Affects: dcmdata/docs/dcm2xml.man dcmdata/docs/dcmcrle.man - Adapted documentation of print() method to new output format of CodingScheme Version (square brackets instead of comma to separate from CodingScheme). Affects: dcmsr/include/dsrcodvl.h - Added comment to getOutputData/Plane() methods that the rendered pixel data is always unsigned. Affects: dcmimgle/include/dcmimage.h **** Changes from 2003.12.11 (wilkens) - Updated dox file for module dcmwlm. Affects: dcmwlm/docs/dcmwlm.dox **** Changes from 2003.12.11 (eichelberg) - Synchronized Win32 configuration header with Autoconf 2.5x version Affects: config/include/cfwin32.h - Updated configure support files from Autoconf 2.58 Affects: config/config.guess config/config.sub config/install-sh config/mkinstalldirs - Added configure tests for and std::nothrow Affects: config/aclocal.m4 config/configure config/configure.in config/include/cfunix.h.in config/include/cfwin32.h - Added support for including or Affects: ofstd/include/ofstdinc.h - newValueField() now uses std::nothrow new if available Affects: dcmdata/libsrc/dcelem.cc dcmdata/libsrc/dcbytstr.cc **** Changes from 2003.12.11 (wilkens) - Added function to Worklist Management Data Source Base Class. This function is needed in the private part of this toolkit. Affects: dcmwlm/include/wlds.h **** Changes from 2003.12.10 (onken) - Changed API of MdfDatasetManager, so that its transparent for user, whether he wants to modify itemtags or tags at 1. level Affects: dcmdata/apps/mdfdsman.cc dcmdata/apps/mdfdsman.h - Complete rewrite of MdfConsoleEngine. It doesn't support a batchfile any more, but now a user can give different modify-options at the same time on commandline. Other purifications and simplifications were made. Affects: dcmdata/apps/mdfconen.cc dcmdata/apps/mdfconen.h - Changed documentation according to dcmodify modifications. Affects: dcmdata/docs/dcmodify.man dcmdata/docs/dcmodify.txt **** Changes from 2003.12.10 (eichelberg) - Re-worked configure scripts for Autoconf 2.5x Presence of external library is now checked automatically. Affects: config/Makefile.in config/aclocal.m4 config/configure config/configure.in config/confmod config/include/cfunix.h.in Removed: config/acconfig.h **** Changes from 2003.12.09 (riesmeier) - Added initial version of man pages for dcmimgle command line tools. Added: dcmimgle/docs/dcmdspfn.man dcmimgle/docs/dcod2lum.man dcmimgle/docs/dconvlum.man - Adapted module's description to new module titles. Affects: dcmimage/docs/dcmimage.dox dcmimgle/docs/dcmimgle.dox - Added missing command line section. Affects: dcmdata/docs/xml2dcm.man - Adapted type casts to new-style typecast operators defined in ofcast.h. Affects: dcmimgle/include/dimoopxt.h dcmimgle/include/dimopxt.h dcmimgle/include/dimosct.h dcmimgle/include/diovpln.h dcmimgle/include/dirotat.h dcmimgle/include/discalet.h - Updated copyright header. Affects: dcmimgle/include/dimoopxt.h dcmimgle/include/dimopxt.h dcmimgle/include/dimosct.h dcmimgle/include/diovdat.h dcmimgle/include/diovlimg.h dcmimgle/include/diovpln.h dcmimgle/include/dipixel.h dcmimgle/include/dirotat.h dcmimgle/include/discalet.h - Removed leading underscore characters from preprocessor symbols (reserved symbols). Affects: dcmimgle/include/dimoopxt.h dcmimgle/include/dimopxt.h dcmimgle/include/dimosct.h dcmimgle/include/diovdat.h dcmimgle/include/diovlimg.h dcmimgle/include/diovpln.h dcmimgle/include/dipixel.h dcmimgle/include/dirotat.h dcmimgle/include/discalet.h - Renamed macros. Affects: dcmimgle/include/discalet.h - Rebuilt makefile dependencies. Affects: dcmimgle/apps/Makefile.dep dcmimgle/libsrc/Makefile.dep - Added define/symbol "MANPAGES" to ENABLED_SECTIONS to distinguish between creation of manpages and HTML documentation. Affects: doxygen/manpages.cfg - Reworked title/label approach for referenced sections/documents. Affects: config/docs/config.dox dcmdata/docs/dcm2xml.man dcmdata/docs/dcmconv.man dcmdata/docs/dcmcrle.man dcmdata/docs/dcmdata.dox dcmdata/docs/dcmdrle.man dcmdata/docs/dcmdump.man dcmdata/docs/dcmftest.man dcmdata/docs/dcmgpdir.man dcmdata/docs/dcmodify.man dcmdata/docs/dump2dcm.man dcmdata/docs/xml2dcm.man dcmimage/docs/dcmimage.dox dcmimgle/docs/dcmdspfn.man dcmimgle/docs/dcmimgle.dox dcmimgle/docs/dcod2lum.man dcmimgle/docs/dconvlum.man dcmjpeg/docs/dcmjpeg.dox dcmnet/docs/dcmnet.dox dcmpstat/docs/dcmpstat.dox dcmsign/docs/dcmsign.dox dcmsr/docs/dcmsr.dox dcmsr/docs/dsr2html.man dcmsr/docs/dsr2xml.man dcmsr/docs/dsrdump.man dcmsr/docs/xml2dsr.man dcmtls/docs/dcmtls.dox dcmwlm/docs/dcmwlm.dox imagectn/docs/imagectn.dox ofstd/docs/ofstd.dox doxygen/htmldocs.dox - Fixed tiny bug that was buried in the source code since version 3.4.1 and which affected the output of signed 8 bit pixel data with modality LUT. Affects: dcmimgle/libsrc/dimoimg.cc **** Changes from 2003.12.09 (eichelberg) - Removed unused debug output Affects: dcmnet/libsrc/dul.cc **** Changes from 2003.12.08 (riesmeier) - Return more appropriate error codes in getAndCheckXXX() routines. Affects: dcmsr/libsrc/dsrtypes.cc - Added initial version of man pages for dcmsr command line tools. Added: dcmsr/docs/dsr2html.man dcmsr/docs/dsr2xml.man dcmsr/docs/dsrdump.man dcmsr/docs/xml2dsr.man - Added preliminary version of Doxygen file for module "config". Added config/docs/config.dox doxygen/htmldocs.cfg - Updated configuration file for Doxygen 1.3.5. Affects: doxygen/htmldocs.cfg doxygen/manpages.cfg - Revised main page of the toolkit's Doxygen documentation. Solved issue with label duplicate. Affects: doxygen/htmldocs.dox - Replaced \defgroup by \page to avoid the creation of a separate Module page. Affects: dcmdata/docs/dcmdata.dox dcmimage/docs/dcmimage.dox dcmimgle/docs/dcmimgle.dox dcmjpeg/docs/dcmjpeg.dox dcmnet/docs/dcmnet.dox dcmpstat/docs/dcmpstat.dox dcmsign/docs/dcmsign.dox dcmtls/docs/dcmtls.dox dcmwlm/docs/dcmwlm.dox imagectn/docs/imagectn.dox ofstd/docs/ofstd.dox - Improved module's documentation. Affects: dcmdata/docs/dcmdata.dox dcmsr/docs/dcmsr.dox - Added missing line breaks. Affects: dcmdata/docs/dcmgpdir.man dcmnet/docs/dcmnet.dox - Adapted type casts to new-style typecast operators defined in ofcast.h. Affects: dcmimgle/apps/dcmdspfn.cc dcmimgle/include/dibaslut.h dcmimgle/include/dicrvfit.h dcmimgle/include/diflipt.h dcmimgle/include/diinpxt.h dcmimgle/include/dcmimage.h dcmimgle/include/dimocpt.h dcmimgle/include/dimoflt.h dcmimgle/include/dimomod.h dcmimgle/include/dimoimg.h dcmimgle/include/dimoipxt.h dcmimgle/include/dimopx.h dcmimgle/include/dimorot.h dcmimgle/include/diovlay.h dcmimgle/include/displint.h dcmimgle/include/ditranst.h dcmimgle/include/diutils.h dcmimgle/libsrc/dcmimage.cc dcmimgle/libsrc/dicielut.cc dcmimgle/libsrc/didispfn.cc dcmimgle/libsrc/didocu.cc dcmimgle/libsrc/digsdfn.cc dcmimgle/libsrc/digsdlut.cc dcmimgle/libsrc/diimage.cc dcmimgle/libsrc/diluptab.cc dcmimgle/libsrc/dimo1img.cc dcmimgle/libsrc/dimo2img.cc dcmimgle/libsrc/dimoimg.cc dcmimgle/libsrc/dimomod.cc dcmimgle/libsrc/dimoopx.cc dcmimgle/libsrc/diovlay.cc dcmimgle/libsrc/diovlimg.cc dcmimgle/libsrc/diovpln.cc - Added heuristics to determine the bit depth of a lookup table in case the stored value is out of the expected range. Affects: dcmimgle/libsrc/diluptab.cc - Updated CVS header. Affects: dcmimgle/apps/dcmdspfn.cc dcmimgle/include/dibaslut.h dcmimgle/include/dicielut.h dcmimgle/include/dcmimage.h dcmimgle/include/didispfn.h dcmimgle/include/didocu.h dcmimgle/include/digsdfn.h dcmimgle/include/digsdlut.h dcmimgle/include/diimage.h dcmimgle/include/diluptab.h dcmimgle/include/dimo1img.h dcmimgle/include/dimo2img.h dcmimgle/include/dimoimg.h dcmimgle/include/dimoipxt.h dcmimgle/include/diovlay.h dcmimgle/include/diregbas.h dcmimgle/libsrc/diciefn.cc dcmimgle/libsrc/dicielut.cc dcmimgle/libsrc/digsdfn.cc dcmimgle/libsrc/digsdlut.cc dcmimgle/libsrc/dimo1img.cc dcmimgle/libsrc/dimo2img.cc dcmimgle/libsrc/dimomod.cc dcmimgle/libsrc/diovlimg.cc - Updated copyright header. Affects: dcmimgle/apps/dcod2lum.cc dcmimgle/apps/dconvlum.cc dcmimgle/include/diciefn.h dcmimgle/include/dicrvfit.h dcmimgle/include/didislut.h dcmimgle/include/diflipt.h dcmimgle/include/diinpx.h dcmimgle/include/diinpxt.h dcmimgle/include/dimocpt.h dcmimgle/include/dimoflt.h dcmimgle/include/dimomod.h dcmimgle/include/dimoopx.h dcmimgle/include/dimopx.h dcmimgle/include/dimorot.h dcmimgle/include/diobjcou.h dcmimgle/include/diplugin.h dcmimgle/include/dipxrept.h dcmimgle/include/diregbas.h dcmimgle/include/displint.h dcmimgle/include/ditranst.h dcmimgle/include/diutils.h dcmimgle/libsrc/dibaslut.cc dcmimgle/libsrc/didislut.cc dcmimgle/libsrc/diinpx.cc dcmimgle/libsrc/dimoimg3.cc dcmimgle/libsrc/dimoimg4.cc dcmimgle/libsrc/dimoimg5.cc dcmimgle/libsrc/dimopx.cc dcmimgle/libsrc/diovdat.cc dcmimgle/libsrc/diutils.cc - Removed leading underscore characters from preprocessor symbols (reserved symbols). Affects: dcmimgle/include/dibaslut.h dcmimgle/include/diciefn.h dcmimgle/include/dicielut.h dcmimgle/include/dicrvfit.h dcmimgle/include/dcmimage.h dcmimgle/include/didislut.h dcmimgle/include/didispfn.h dcmimgle/include/didocu.h dcmimgle/include/diflipt.h dcmimgle/include/digsdfn.h dcmimgle/include/digsdlut.h dcmimgle/include/diimage.h dcmimgle/include/diinpx.h dcmimgle/include/diinpxt.h dcmimgle/include/diluptab.h dcmimgle/include/dimo1img.h dcmimgle/include/dimo2img.h dcmimgle/include/dimocpt.h dcmimgle/include/dimoflt.h dcmimgle/include/dimomod.h dcmimgle/include/dimoimg.h dcmimgle/include/dimoipxt.h dcmimgle/include/dimoopx.h dcmimgle/include/dimopx.h dcmimgle/include/dimorot.h dcmimgle/include/diobjcou.h dcmimgle/include/diovlay.h dcmimgle/include/diplugin.h dcmimgle/include/dipxrept.h dcmimgle/include/diregbas.h dcmimgle/include/displint.h dcmimgle/include/ditranst.h dcmimgle/include/diutils.h - Added comment that class DiDocument is meant for internal purposes only. Affects: dcmimgle/include/didocu.h - Added note that certain color models have been retired from the standard. Affects: dcmimgle/include/diutils.h **** Changes from 2003.12.05 (eichelberg) - Added module documentation and sample code. Affects: dcmsign/docs/dcmsign.dox dcmjpeg/docs/dcmjpeg.dox dcmtls/docs/dcmtls.dox dcmnet/docs/dcmnet.dox dcmpstat/docs/dcmpstat.dox **** Changes from 2003.12.05 (riesmeier) - Added support for iterating over command line arguments and options. Afefcts: ofstd/include/ofcmdln.h ofstd/libsrc/ofcmdln.cc - Removed leading underscore characters from preprocessor symbols (reserved symbols). Updated copyright date where appropriate. Affects: dcmjpeg/include/dipijpeg.h dcmnet/include/dcmlayer.h dcmnet/include/dcmtrans.h dcmtls/include/tlslayer.h dcmtls/include/tlstrans.h imagectn/include/dbstore.h ofstd/include/ofcmdln.h ofstd/include/ofbmanip.h ofstd/include/ofconapp.h ofstd/include/ofcond.h ofstd/include/ofconsol.h ofstd/include/ofcrc32.h ofstd/include/offname.h ofstd/include/ofglobal.h ofstd/include/oflogfil.h ofstd/include/ofstd.h ofstd/include/ofstream.h ofstd/include/ofthread.h ofstd/include/oftimer.h - Adapted type casts to new-style typecast operators defined in ofcast.h. Affects: dcmimage/apps/dcm2pnm.cc dcmimage/apps/dcmquant.cc dcmimage/apps/dcmscale.cc - Fixed bug in 8-bit PGM/PPM export (missing "break" in "switch" statement). Affects: dcmimage/apps/dcm2pnm.cc - Fixed problem with retrieving option values using the new iteration feature. Affects: ofstd/include/ofcmdln.h ofstd/libsrc/ofcmdln.cc - Only report warning on incorrect template identifier when actually expecting one (i.e. only for particular SOP classes). Affects: dcmsr/libsrc/dsrdoctn.cc **** Changes from 2003.12.02 (riesmeier) - Replaced wrong newline character sequence. Affects: dcmsr/libsrc/dsrscogr.cc dcmsr/libsrc/dsrwavch.cc **** Changes from 2003.12.02 (eichelberg) - Changed a few typecasts for static to reinterpret, required for NetBSD and OpenBSD Affects: ofstd/libsrc/ofthread.cc - Removed linkage against unused libraries Affects: dcmpstat/apps/Makefile.in - Introduced special handling of compiler flags on OpenBSD Affects: config/configure config/configure.in **** Changes from 2003.12.01 (eichelberg) - Fixed handling of LIN OD LUT Shape Affects: dcmpstat/apps/dcmpsprt.cc **** Changes from 2003.12.01 (riesmeier) - Changed XML encoding of by-reference relationships if flag XF_valueTypeAsAttribute is set. Affects: dcmsr/include/dsrtypes.h dcmsr/include/dsrxmld.h dcmsr/libsrc/dsrdoctn.cc dcmsr/libsrc/dsrreftn.cc dcmsr/libsrc/dsrtypes.cc dcmsr/libsrc/dsrxmld.cc - Added text that SOP classes from supplement 66 are also supported. Affects: dcmsr/docs/dsr2html.txt dcmsr/docs/dsr2xml.txt dcmsr/docs/dsrdump.txt dcmsr/docs/xml2dsr.txt **** Changes from 2003.11.28 (riesmeier) - Changed output format of CodingSchemeVersion in print() and renderHTML(). Now using square brackets instead of comma to separate from CodingScheme. Affects: dcmsr/libsrc/dsrcodvl.cc dcmsr/libsrc/dsrdoc.cc **** Changes from 2003.11.28 (onken) - removed wrong manpage modifications from last commit Affects: dcmdata/docs/dcmgpdir.txt **** Changes from 2003.11.13 (eichelberg) - Fixed definition of DCM_UndefinedTagKey Thanks to Stefan Allers for the bug report. Affects: dcmdata/include/dctagkey.h **** Changes from 2003.11.13 (riesmeier) - Revised description section. Other minor modifications. Affects: dcmdata/docs/dcmodify.man - Made help text consistent with revised man page. Affects: dcmdata/apps/dcmftest.cc dcmdata/apps/mdfconen.cc - Fixed wrong class name in code example. Affects: dcmsr/docs/dcmsr.dox - Added files section. Adjusted XML dump formatting. Affects: dcmdata/docs/dcm2xml.man dcmdata/docs/xml2dcm.man - Corrected copyright date. Minor formatting issues. Affects: dcmdata/docs/dcmcrle.man dcmdata/docs/dcmdrle.man dcmdata/docs/dcmdump.man dcmdata/docs/dcmftest.man dcmdata/docs/dcmgpdir.man dcmdata/docs/dump2dcm.man - Replaced tabs by spaces. Affects: dcmdata/apps/dcmftest.cc - Added shell script that fixes a doxygen layout problem (justified text). Added: doxygen/patchman.sh Affects: doxygen/Makefile - Separate parameters by an empty line. Affects: dcmdata/docs/dcm2xml.man dcmdata/docs/dcmconv.man dcmdata/docs/dcmcrle.man dcmdata/docs/dcmdrle.man dcmdata/docs/dump2dcm.man dcmdata/docs/xml2dcm.man **** Changes from 2003.11.12 (riesmeier) - Added module documentation. Added: dcmimgle/docs/dcmimgle.dox dcmimage/docs/dcmimgle.dox dcmsr/docs/dcmsr.dox ofstd/docs/ofstd.dox - Made documentation consistent with other modules. Affects: dcmdata/docs/dcmdata.dox - Renamed links to external documentation files. Affects: doxygen/htmldocs.dox - Reworked man page files (layout, missing sections, etc.) Affects: dcmdata/docs/dcm2xml.man dcmdata/docs/dcmconv.man dcmdata/docs/dcmcrle.man dcmdata/docs/dcmdrle.man dcmdata/docs/dcmdump.man dcmdata/docs/dcmftest.man dcmdata/docs/dcmgpdir.man dcmdata/docs/dcmodify.man dcmdata/docs/dump2dcm.man dcmdata/docs/xml2dcm.man - Added WITH_xxx preprocessor defines to include conditional classes into the documentation. Affects: doxygen/htmdocs.cfg - Replaced \addtogroup by \defgroup to enforce unique labels. Affects: dcmdata/docs/dcmdata.dox dcmimgle/docs/dcmimgle.dox dcmimage/docs/dcmimage.dox dcmsr/docs/dcmsr.dox ofstd/docs/ofstd.dox - Added missing module documentation (preliminary version only). Added: dcmjpeg/docs/dcmjpeg.dox dcmnet/docs/dcmnet.dox dcmpstat/docs/dcmpstat.dox dcmsign/docs/dcmsign.dox dcmtls/docs/dcmtls.dox dcmwlm/docs/dcmwlm.dox imagectn/docs/imagectn.dox **** Changes from 2003.11.11 (onken) - debug mechanism doesn't use debug(..) any more. comments purified. adjusted headers to debug modifications. Affects: dcmdata/mdfconen.cc dcmdata/mdfconen.h dcmdata/mdfdsman.cc dcmdata/mdfdsman.h **** Changes from 2003.11.10 (riesmeier) - Enhanced detection of invalid filenames: forbid leading path separator, i.e. absolute pathnames. Affects: dcmdata/libsrc/dcddirif.cc **** Changes from 2003.11.07 (onken) - initial checkin of manpages dump2dcm and xml2dcm Affects: dcmdata/docs/dump2dcm.man dcmdata/docs/xml2dcm.man - minor corrections Affects: dcmdata/docs/dcmgpdir.man - removed DOS 's xml2dcm.txt Affects: dcmdata/docs/xml2dcm.txt **** Changes from 2003.11.07 (eichelberg) - Updated version name to reflect interim release 3.5.2a Affects: dcmdata/include/dcuid.h - Added configure test for mkstemp Affects: config/configure config/configure.in config/include/cfunix.h.in config/include/cfwin32.h - Added constructor taking an open FILE* instead of a file name string Affects: dcmdata/include/dcostrmf.h dcmdata/libsrc/dcostrmf.cc - Now using mkstemp instead of mktemp if available Affects: dcmdata/libsrc/dcdicdir.cc **** Changes from 2003.11.06 (onken) - Initial checkin of manpages: dcmcrle.man dcmdrle.man dcmftest.man dcmgpdir.man Added: dcmdata/docs/dcmcrle.man dcmdata/docs/dcmdrle.man dcmdata/docs/dcmftest.man dcmdata/docs/dcmgpdir.man - removed dos 's dcmgpdir.txt Affects: dcmdata/docs/dcmgpdir.txt **** Changes from 2003.11.06 (riesmeier) - Added missing line break in XML output. Affects: dcmsr/libsrc/dsrpnmtn.cc **** Changes from 2003.11.05 (eichelberg) - Added declaration of operator<< for DcmTagKeys. Fixes compilation issue on Visual C++ 6.0 SP 0. Affects: dcmdata/include/dctagkey.h - Fixed "--remote" command line option which can be specified multiple times Affects: imagectn/apps/ti.cc - Removed useless "--write-xfer-same" command line option Affects: dcmdata/apps/dump2dcm.cc dcmdata/docs/dump2dcm.txt **** Changes from 2003.11.05 (onken) - initial checkin of some manpages (dcmodify, dcm2xml, dcmconv). Affects: dcmdata/docs/dcmodify.man dcmdata/docs/dcm2xml.man dcmdata/docs/dcmconv.man **** Changes from 2003.11.05 (riesmeier) - Replaced \section and \subsection labels. Affects: dcmdata/docs/dcmdump.man - Fixed bug that prevented the addition of DICOM files missing the "sort key" (e.g. InstanceNumber). Affects: dcmdata/libsrc/dcddirif.cc - Output generated man pages to directory "doxygen/manpages/man1" instead of "doxygen/manpages/man/man1". Affects: doxygen/Makefile doxygen/manpages.cfg **** Changes from 2003.11.03 (riesmeier) - Modified static type casts on DVPSLogMessageLevel variables to compile with gcc 2.95. Affects: dcmpstat/libsrc/dviface.cc - Added examples section to module's documentation. Affects: dcmdata/docs/dcmdata.dox **** Changes from 2003.10.31 (onken) - Note about deleting whole sequences and items with dcmodify Affects: dcmdata/docs/dcmodify.txt **** Changes from 2003.10.31 (riesmeier) - Disabled SHOW_INCLUDE_FILES entry. Affects: doxygen/htmldocs.cfg - Replaced static release date, program name and version by special commands. Affects: doxygen/footer.html - Added all remaining command line programs of this module. Affects: dcmdata/docs/dcmdata.dox - Changed behaviour: do not output empty list of predecessor or identical documents in XML format unless flag XF_writeEmptyTags is set. Affects: dcmsr/libsrc/dsrdoc.cc - Added command line option +Ea (--attr-all), a shortcut for +Ec, +Er and +Er. Affects: dcmsr/apps/dsr2xml.cc dcmsr/docs/dsr2xml.txt **** Changes from 2003.10.30 (riesmeier) - Removed remaining "htmldocs" folder. Removed: dcmsign/htmldocs/* - Added full support for the ContentTemplateSequence (read/write, get/set template identification). Template constraints are not checked yet. Affects: dcmsr/include/dsrcitem.h dcmsr/include/dsrdoc.h dcmsr/include/dsrdoctn.h dcmsr/include/dsrreftn.h dcmsr/libsrc/dsrdoctn.cc dcmsr/libsrc/dsrcitem.cc dcmsr/libsrc/dsrdoctr.cc dcmsr/libsrc/dsrreftn.cc - Added new command line option which allows to print the template identification of a content item. Affects: dcmsr/apps/dsrdump.cc dcmsr/docs/dsrdump.txt dcmsr/include/dsrtypes.h dcmsr/libsrc/dsrtypes.cc - Added new command line option which allows to write the template identification of a content item in XML format. Affects: dcmsr/apps/dsr2xml.cc dcmsr/docs/dsr2xml.txt dcmsr/include/dsrtypes.h dcmsr/libsrc/dsrtypes.cc - Fixed bug in setConceptName() that caused to return EC_IllegalParameter even for valid parameters. Affects: dcmsr/libsrc/dsrdoctn.cc - Added copyright note. Affects: dcmdata/apps/dcm2xml.dtd - Slightly modified main page of the HTML documentation. Affects: doxygen/htmldocs.dox - Added user defined footer to HTML pages. Added: doxygen/footer.html Affects: doxygen/htmldocs.cfg - Added "$(TRASH)" to "make clean". Affects: doxygen/Makefile **** Changes from 2003.10.27 (riesmeier) - Made text of a warning message consistent with other messages in this module (always begin with an upper-case character). Affects: dcmsr/libsrc/dsrdoc.cc **** Changes from 2003.10.22 (eichelberg) - Added configure tests for and isinf(), needed on Solaris 2.5.1 Affects: config/configure config/configure.in config/include/cfunix.h.in config/include/cfwin32.h - Added private implementation of isinf on platforms that have finite() and isnan() but not isinf(), such as Solaris 2.5.1. Affects: ofstd/libsrc/ofstd.cc - Added two pragmas to the Borland specific configuration in order to suppress warnings that we consider not too useful. Affects: config/include/cfwin32.h - Fixed double deletion of command set if parsing of command set fails. Thanks to David Clunie for the bug report. Affects: dcmnet/libsrc/dimse.cc - Fixed formatting of DICOM tag in error messages Affects: dcmnet/libsrc/dimcmd.cc **** Changes from 2003.10.17 (riesmeier) - Fixed wrong wording in a warning message ("too less" -> "too few"). Affects: dcmsr/libsrc/dsrscovl.cc **** Changes from 2003.10.15 (eichelberg) - Updated error messages for parse errors Affects: dcmdata/libsrc/dcdict.cc dcmdata/libsrc/dcelem.cc dcmdata/libsrc/dcitem.cc dcmdata/libsrc/dcmetinf.cc dcmdata/libsrc/dcsequen.cc - Updated error messages generated while parsing presentation states dcmpstat/libsrc/dvpsri.cc dcmpstat/libsrc/dvpsril.cc dcmpstat/libsrc/dvpsrsl.cc **** Changes from 2003.10.14 (riesmeier) - Added generation of compressed Windows HTML file "dcmtk353.chm". Affects: INSTALL doxygen/htmldocs.cfg - Uncommented name of unused parameter to get rid of a warning reported by Borland C++ 5.5. Affects: dcmsr/libsrc/dsrcsidl.cc - Moved declaration of loop variable 'i' into the header of the for loop to get rid of warnings reported by Borland C++ 5.5. Affects: dcmsr/libsrc/dsrdoc.cc **** Changes from 2003.10.14 (eichelberg) - Explicitly spelled out constructor parameters in const instance declaration. Avoids incompatibility between gcc 3.2 and Borland C++. Affects: dcmsr/libsrc/dsrscogr.cc dcmsr/libsrc/dsrwavch.cc **** Changes from 2003.10.13 (onken) - startModify(...) simplified (uses only putString to put element values), this also allows now inserting and modifying of elements with VRM>1. Method getDataset() added. Affects: dcmdata/apps/mdfdsman.cc dcmdata/apps/mdfdsman.h - improved backup-strategy Affects: dcmdata/apps/mdfconen.cc - error-message adapted to mdfconen.cc Affects: dcmdata/apps/dcmodify.cc - description for VRM>1 and for longer tag-path added, correction of batch- mode description Affects: dcmdata/docs/dcmodify.txt **** Changes from 2003.10.13 (eichelberg) - Added Borland C++ 5.5 specific settings Affects: config/include/cfwin32.h - Activated Borland stdlib workaround for compiler versions other than 4. Affects: ofstd/include/ofstdinc.h - Changed order of include files, as a workaround for problem in Borland C++. Affects: ofstd/libsrc/ofthread.cc - Added workaround for name clash of typedef "boolean" in the IJG header files and the standard headers for Borland C++. Affects: dcmjpeg/libsrc/dipijpeg.cc dcmjpeg/libsrc/djdijg12.cc dcmjpeg/libsrc/djdijg16.cc dcmjpeg/libsrc/djdijg8.cc dcmjpeg/libsrc/djeijg12.cc dcmjpeg/libsrc/djeijg16.cc dcmjpeg/libsrc/djeijg8.cc - Minor code purifications, needed for Borland C++ Affects: dcmdata/apps/mdfconen.cc dcmwlm/libsrc/wlfsim.cc - Added code for explicit template specialization, needed for Borland C++ Affects: dcmsr/libsrc/dsrscogr.cc dcmsr/libsrc/dsrwavch.cc - Added missing filename entry to CMake build system Affects: dcmsr/libsrc/CMakeLists.txt - Disabled setvbuf calls on stdout/stderr on Win32/Borland C++. Affects: dcmdata/libsrc/cmdlnarg.cc **** Changes from 2003.10.09 (riesmeier) - Added support for SOP Class "Procedure Log" (Supplement 66). Affects: dcmdata/include/dcuid.h dcmdata/libsrc/dcuid.cc dcmnet/docs/movescu.txt dcmnet/docs/storescp.txt dcmnet/docs/storescu.txt imagectn/docs/imagectn.txt - Added support for Procedure Log. Added: dcmsr/include/dsrprocc.h dcmsr/libsrc/dsrprocc.cc Affects: dcmsr/docs/dsr2html.txt dcmsr/docs/dsr2xml.txt dcmsr/docs/dsrdump.txt dcmsr/docs/xml2dsr.txt dcmsr/include/dsrtypes.h dcmsr/libsrc/Makefile.dep dcmsr/libsrc/Makefile.in dcmsr/libsrc/dsrtypes.cc - Added check for root template identifier when reading an SR document. Affects: dcmsr/include/dsrbascc.h dcmsr/include/dsrchecc.h dcmsr/include/dsrcomcc.h dcmsr/include/dsrenhcc.h dcmsr/include/dsriodcc.h dcmsr/include/dsrkeycc.h dcmsr/include/dsrmamcc.h dcmsr/libsrc/dsrbascc.cc dcmsr/libsrc/dsrchecc.cc dcmsr/libsrc/dsrcomcc.cc dcmsr/libsrc/dsrdoctn.cc dcmsr/libsrc/dsrenhcc.cc dcmsr/libsrc/dsriodcc.cc dcmsr/libsrc/dsrkeycc.cc dcmsr/libsrc/dsrmamcc.cc - Added text from Supplement 66 to getCurrentRequestedProcedureEvidence() API comment. Affects: dcmsr/include/dsrdoc.h - Fixed issue with the order of group and element number in print method. Affects: dcmdata/libsrc/dcvrat.cc - Changed message type for incorrect/missing TemplateIdentifier from error to warning. Affects: dcmsr/libsrc/dsrdoctn.cc - Replaced wrong newline character sequence. Affects: dcmsr/libsrc/dsrwavch.h - Added identification information on UCUM coding scheme (see CP 372). Affects: dcmsr/tests/mkreport.cc - Renamed OFFIS_PRIVATE_CODING_xxx macros to OFFIS_CODING_xxx. Affects: dcmdata/include/dcuid.h dcmsr/libsrc/dsrcsidl.cc - Slightly modified warning message text in readDocumentRelationshipMacro(). Affects: dcmsr/libsrc/dsrdoctn.cc **** Changes from 2003.10.08 (riesmeier) - Added support for AT, OB, OF, OW, SL, SS, UL, US to putAndInsertString(). Affects: dcmdata/include/dcitem.h dcmdata/libsrc/dcitem.cc - Added preliminary XML Schema used by dsr2xml and xml2dsr. Please note that the Schema support of "libxml" is currently still somewhat incomplete. Added: dcmsr/apps/dsr2xml.xsd - Fixed incorrect output format in writeXML(). Affects: dcmsr/libsrc/dsrtcovl.cc **** Changes from 2003.10.07 (riesmeier) - Added preliminary support for creating man pages for each command line tool. Affects: config/rootconf doxygen/Makefile - Enhanced generation of HTML documentation. Added: dcmdata/docs/dcmdata.dox dcmdata/docs/dcmdump.man doxygen/htmldocs.dox Affects: INSTALL - Replaced doxygen configuration file by htmldocs.cfg and manpages.cfg. Added: doxygen/htmldocs.cfg doxygen/manpages.cfg Removed: doxygen/doxygen.cfg - Updated doxygen configuration files to version 1.3.4 format. Affects: doxygen/htmldocs.cfg doxygen/manpages.cfg - Removed superfluous *.man.1 files in doxygen/manpages/man/man1. Affects: doxygen/Makefile **** Changes from 2003.10.06 (eichelberg) - Fixed issue with window center/width selection in JPEG encoder that prevented "windowed" compression of images containing an Icon Image SQ. Thanks for Gilles Mevel for the bug report. Affects: dcmjpeg/libsrc/djcodece.cc **** Changes from 2003.10.06 (riesmeier) - Added new flag which allows to ignore content item errors when reading an SR document (e.g. missing value type specific attributes). Affects: dcmsr/apps/dsr2html.cc dcmsr/apps/dsrdump.cc dcmsr/docs/dsr2html.txt dcmsr/docs/dsrdump.txt dcmsr/include/dsrdoctn.h dcmsr/include/dsrtypes.h dcmsr/libsrc/dsrdoctn.cc dcmsr/libsrc/dsrtypes.cc - Replaced wrong newline character sequence. Affects: dcmsr/include/dsrxmlc.h - Added comment that the optional IconImageSequence is not yet supported. Affects: dcmsr/include/dsrimgvl.h - Corrected source code formatting. Affects: dcmsr/libsrc/dsrchecc.cc **** Changes from 2003.10.01 (onken) - Corrected description of Environment Affects: dcmdata/docs/dcmodify.txt - Corrected doxygen information in header files Affects: dcmdata/apps/mdfconen.h dcmdata/apps/mdfdsman.h - Bug fixed, that excluded pixel data when saving a file loaded into a MdfDataSetManager Affects: dcmdata/apps/mdfdsman.cc **** Changes from 2003.09.22 (wilkens) - Modified main CMakeLists.txt file to get rid of compiler option /Zm. Affects: CMakeLists.txt dcmdata/apps/dcm2xml.dsp dcmdata/apps/dcmconv.dsp dcmdata/apps/dcmcrle.dsp dcmdata/apps/dcmdrle.dsp dcmdata/apps/dcmdump.dsp dcmdata/apps/dcmftest.dsp dcmdata/apps/dcmgpdir.dsp dcmdata/apps/dcmodify.dsp dcmdata/apps/dump2dcm.dsp dcmdata/apps/xml2dcm.dsp dcmdata/libsrc/dcmdata.dsp dcmimage/apps/dcm2pnm.dsp dcmimage/apps/dcmquant.dsp dcmimage/apps/dcmscale.dsp dcmimage/libsrc/dcmimage.dsp dcmimgle/apps/dcmdspfn.dsp dcmimgle/apps/dcod2lum.dsp dcmimgle/apps/dconvlum.dsp dcmimgle/libsrc/dcmimgle.dsp dcmjpeg/apps/dcmcjpeg.dsp dcmjpeg/apps/dcmdjpeg.dsp dcmjpeg/apps/dcmj2pnm.dsp dcmjpeg/apps/dcmmkdir.dsp dcmjpeg/libijg12/ijg12.dsp dcmjpeg/libijg16/ijg16.dsp dcmjpeg/libijg8/ijg8.dsp dcmjpeg/libsrc/dcmjpeg.dsp dcmnet/apps/echoscu.dsp dcmnet/apps/findscu.dsp dcmnet/apps/movescu.dsp dcmnet/apps/storescp.dsp dcmnet/apps/storescu.dsp dcmnet/libsrc/dcmnet.dsp dcmpstat/apps/dcmmkcrv.dsp dcmpstat/apps/dcmmklut.dsp dcmpstat/apps/dcmp2pgm.dsp dcmpstat/apps/dcmprscp.dsp dcmpstat/apps/dcmprscu.dsp dcmpstat/apps/dcmpschk.dsp dcmpstat/apps/dcmpsmk.dsp dcmpstat/apps/dcmpsprt.dsp dcmpstat/apps/dcmpsrcv.dsp dcmpstat/apps/dcmpssnd.dsp dcmpstat/libsrc/dcmpstat.dsp dcmsign/apps/dcmsign.dsp dcmsign/libsrc/dcmdsig.dsp dcmsr/apps/dsr2html.dsp dcmsr/apps/dsr2xml.dsp dcmsr/apps/dsrdump.dsp dcmsr/apps/xml2dsr.dsp dcmsr/libsrc/dcmsr.dsp dcmsr/tests/mkreport.dsp dcmtls/libsrc/dcmtls.dsp dcmwlm/apps/wlmscpfs.dsp dcmwlm/libsrc/dcmwlm.dsp imagectn/apps/imagectn.dsp imagectn/apps/ti.dsp imagectn/libsrc/imagedb.dsp imagectn/tests/dbregimg.dsp ofstd/libsrc/ofstd.dsp **** Changes from 2003.09.19 (onken) - return value is now only zero, if no error occurred Affects: dcmodify.cc - major bugfixes, new code structure, better error handling, corrections for "dcmtk coding style", Handling of VR's corrected Affects: dcmdata/apps/mdfdsman.cc dcmdata/apps/mdfdsman.h - major bugfixes, corrections for "dcmtk coding style", better error handling Affects: dcmdata/apps/mdfconen.cc dcmdata/apps/mdfconen.h **** Changes from 2003.09.18 (riesmeier) - Call addPrivateDcmtkCodingScheme() when saving a structured report. Affects: dcmpstat/libsrc/dviface.cc - Fixed wrong "assert" (pointer check) statement in saveStructuredReport(). Affects: dcmpstat/libsrc/dviface.cc - Adapted type casts to new-style typecast operators defined in ofcast.h. Affects: dcmpstat/libsrc/dviface.cc **** Changes from 2003.09.17 (riesmeier) - Implemented CP 359, i.e. forbid HAS CONCEPT MOD relationship by-reference. Affects: dcmsr/libsrc/dsrcomcc.cc - Renamed variable "string" to avoid name clash with STL class. Affects: ofstd/libsrc/oftime.cc ofstd/tests/tofdatim.cc ofstd/tests/tofstd.cc **** Changes from 2003.09.15 (riesmeier) - Made comparison operators const. Affects: ofstd/include/ofdate.h ofstd/include/ofdatime.h ofstd/include/oftime.h ofstd/libsrc/ofdate.cc ofstd/libsrc/ofdatime.cc ofstd/libsrc/oftime.cc - Fixed incorrect/improper comments of the comparison operators. Enhanced comment of the default constructor. Affects: ofstd/include/ofdate.h ofstd/include/ofdatime.h ofstd/include/oftime.h - Introduced new class to facilitate checking of SR IOD relationship content constraints. Replaced old implementation distributed over numerous classes. Added: dcmsr/include/dsrbascc.h dcmsr/include/dsrcomcc.h dcmsr/include/dsrenhcc.h dcmsr/include/dsriodcc.h dcmsr/include/dsrkeycc.h dcmsr/libsrc/dsrbascc.cc dcmsr/libsrc/dsrcomcc.cc dcmsr/libsrc/dsrenhcc.cc dcmsr/libsrc/dsriodcc.cc dcmsr/libsrc/dsrkeycc.cc Affects: dcmsr/include/dsrcodtn.h dcmsr/include/dsrcomtn.h dcmsr/include/dsrcontn.h dcmsr/include/dsrdattn.h dcmsr/include/dsrdoctn.h dcmsr/include/dsrdoctr.h dcmsr/include/dsrdtitn.h dcmsr/include/dsrimgtn.h dcmsr/include/dsrnumtn.h dcmsr/include/dsrpnmtn.h dcmsr/include/dsrreftn.h dcmsr/include/dsrscotn.h dcmsr/include/dsrtcotn.h dcmsr/include/dsrtextn.h dcmsr/include/dsrtimtn.h dcmsr/include/dsrtypes.h dcmsr/include/dsruidtn.h dcmsr/include/dsrwavtn.h dcmsr/libsrc/CMakeLists.txt dcmsr/libsrc/Makefile.dep dcmsr/libsrc/Makefile.in dcmsr/libsrc/dcmsr.dsp dcmsr/libsrc/dsrcodtn.cc dcmsr/libsrc/dsrcomtn.cc dcmsr/libsrc/dsrcontn.cc dcmsr/libsrc/dsrdattn.cc dcmsr/libsrc/dsrdoctn.cc dcmsr/libsrc/dsrdoctr.cc dcmsr/libsrc/dsrdtitn.cc dcmsr/libsrc/dsrimgtn.cc dcmsr/libsrc/dsrnumtn.cc dcmsr/libsrc/dsrpnmtn.cc dcmsr/libsrc/dsrreftn.cc dcmsr/libsrc/dsrscotn.cc dcmsr/libsrc/dsrtcotn.cc dcmsr/libsrc/dsrtextn.cc dcmsr/libsrc/dsrtimtn.cc dcmsr/libsrc/dsrtypes.cc dcmsr/libsrc/dsruidtn.cc dcmsr/libsrc/dsrwavtn.cc - Added content relationship constraint checking support for Mammography CAD SR and Chest CAD SR. Added: dcmsr/include/dsrchecc.h dcmsr/include/dsrmamcc.h dcmsr/libsrc/dsrchecc.cc dcmsr/libsrc/dsrmamcc.cc Affects: dcmsr/libsrc/CMakeLists.txt dcmsr/libsrc/Makefile.dep dcmsr/libsrc/Makefile.in dcmsr/libsrc/dcmsr.dsp - Made XML output more consistent: changed XML tag name from "identifier" to "id". Affects: dcmsr/libsrc/dsrcsidl.cc **** Changes from 2003.09.11 (wilkens) - Modified cfwin32.h so that WITH_LIBTIFF, WITH_LIBPNG, WITH_ZLIB and WITH_LIBPNG are no longer defined. On Windows platforms, we will in the future use the CMake generated dsp and dsw files which implicitely define which external libraries are used. Affects: config/include/cfwin32.h - Added new CMake-generated dsp and dsw files. After having generated these files with CMake they were cleaned from CMake-dependencies using the perl script "config/cleandsp.pl". Added: dcmtk.dsw ALL_BUILD.dsp dcmdata/apps/dcmdrle.dsp dcmdata/apps/dcmconv.dsp dcmdata/apps/xml2dcm.dsp dcmdata/apps/dcmcrle.dsp dcmdata/apps/dump2dcm.dsp dcmdata/apps/dcmdump.dsp dcmdata/apps/dcmodify.dsp dcmdata/apps/dcmgpdir.dsp dcmdata/apps/dcmftest.dsp dcmdata/apps/dcm2xml.dsp dcmdata/libsrc/dcmdata.dsp dcmjpeg/apps/dcmcjpeg.dsp dcmjpeg/apps/dcmj2pnm.dsp dcmjpeg/apps/dcmdjpeg.dsp dcmjpeg/apps/dcmmkdir.dsp dcmjpeg/libijg8/ijg8.dsp dcmjpeg/libsrc/dcmjpeg.dsp dcmjpeg/libijg12/ijg12.dsp dcmjpeg/libijg16/ijg16.dsp dcmsign/apps/dcmsign.dsp dcmsign/libsrc/dcmdsig.dsp dcmsr/apps/xml2dsr.dsp dcmsr/apps/dsrdump.dsp dcmsr/apps/dsr2html.dsp dcmsr/apps/dsr2xml.dsp dcmsr/tests/mkreport.dsp dcmsr/libsrc/dcmsr.dsp ofstd/libsrc/ofstd.dsp dcmimage/apps/dcmscale.dsp dcmimage/apps/dcm2pnm.dsp dcmimage/apps/dcmquant.dsp dcmimage/libsrc/dcmimage.dsp dcmimgle/apps/dcod2lum.dsp dcmimgle/apps/dcmdspfn.dsp dcmimgle/apps/dconvlum.dsp dcmimgle/libsrc/dcmimgle.dsp dcmpstat/apps/dcmp2pgm.dsp dcmpstat/apps/dcmprscp.dsp dcmpstat/apps/dcmprscu.dsp dcmpstat/apps/dcmmklut.dsp dcmpstat/apps/dcmpschk.dsp dcmpstat/apps/dcmpsmk.dsp dcmpstat/apps/dcmpsprt.dsp dcmpstat/apps/dcmpsrcv.dsp dcmpstat/apps/dcmpssnd.dsp dcmpstat/apps/dcmmkcrv.dsp dcmpstat/libsrc/dcmpstat.dsp dcmnet/apps/storescp.dsp dcmnet/apps/storescu.dsp dcmnet/apps/movescu.dsp dcmnet/apps/echoscu.dsp dcmnet/apps/findscu.dsp dcmnet/libsrc/dcmnet.dsp dcmtls/libsrc/dcmtls.dsp dcmwlm/apps/wlmscpfs.dsp dcmwlm/libsrc/dcmwlm.dsp imagectn/apps/ti.dsp imagectn/apps/imagectn.dsp imagectn/tests/dbregimg.dsp imagectn/libsrc/imagedb.dsp - Removed old dsp and dsw files. These files will soon be replaced by new CMake- generated dsp and dsw files. Removed: dcmtk.dsw dcmdata/dcmdata.dsp dcmdata/apps/dcm2xml.dsp dcmdata/apps/dcmconv.dsp dcmdata/apps/dcmcrle.dsp dcmdata/apps/dcmdrle.dsp dcmdata/apps/dcmdump.dsp dcmdata/apps/dcmftest.dsp dcmdata/apps/dcmgpdir.dsp dcmdata/apps/dcmodify.dsp dcmdata/apps/dump2dcm.dsp dcmdata/apps/xml2dcm.dsp dcmimage/dcmimage.dsp dcmimage/apps/dcm2pnm.dsp dcmimage/apps/dcmquant.dsp dcmimage/apps/dcmscale.dsp dcmimgle/dcmimgle.dsp dcmimgle/apps/dcmdspfn.dsp dcmimgle/apps/dcod2lum.dsp dcmimgle/apps/dconvlum.dsp dcmjpeg/dcmjpeg.dsp dcmjpeg/apps/dcmcjpeg.dsp dcmjpeg/apps/dcmdjpeg.dsp dcmjpeg/apps/dcmj2pnm.dsp dcmjpeg/apps/dcmmkdir.dsp dcmjpeg/libijg12/ijg12.dsp dcmjpeg/libijg16/ijg16.dsp dcmjpeg/libijg8/ijg8.dsp dcmnet/dcmnet.dsp dcmnet/apps/echoscu.dsp dcmnet/apps/findscu.dsp dcmnet/apps/movescu.dsp dcmnet/apps/storescp.dsp dcmnet/apps/storescu.dsp dcmpstat/dcmpstat.dsp dcmpstat/apps/dcmmkcrv.dsp dcmpstat/apps/dcmmklut.dsp dcmpstat/apps/dcmp2pgm.dsp dcmpstat/apps/dcmprscp.dsp dcmpstat/apps/dcmprscu.dsp dcmpstat/apps/dcmpschk.dsp dcmpstat/apps/dcmpsmk.dsp dcmpstat/apps/dcmpsprt.dsp dcmpstat/apps/dcmpsrcv.dsp dcmpstat/apps/dcmpssnd.dsp dcmsign/dcmsign.dsp dcmsign/apps/dcmsign_app.dsp dcmsr/dcmsr.dsp dcmsr/apps/dsr2html.dsp dcmsr/apps/dsr2xml.dsp dcmsr/apps/dsrdump.dsp dcmsr/apps/xml2dsr.dsp dcmsr/tests/mkreport.dsp dcmtls/dcmtls.dsp dcmwlm/dcmwlm.dsp dcmwlm/apps/wlmscpfs.dsp imagectn/imagectn.dsp imagectn/apps/imagectn_app.dsp imagectn/apps/ti.dsp imagectn/tests/dbregimg.dsp ofstd/ofstd.dsp **** Changes from 2003.09.10 (eichelberg) - Initial release of Perl script "cleandsp.pl" which cleans up the Visual C++ project files (.dsp files) generated by CMake by exchanging absolute paths by relative paths and removing the custom build section that CMake creates for it's own makefiles. The script has been tested on Unix as well as on Win32 platforms (using ActivePerl 5.6). Added: config/cleandsp.pl **** Changes from 2003.09.10 (riesmeier) - Replaced PrivateCodingSchemeUID by new CodingSchemeIdenticationSequence as required by CP 324. Added: dcmsr/include/dsrcsidl.h dcmsr/libsrc/dsrcsidl.cc Affects: dcmsr/dcmsr.dsp dcmsr/apps/Makefile.dep dcmsr/include/dsrcodvl.h dcmsr/include/dsrdoc.h dcmsr/include/dsrtypes.h dcmsr/libsrc/CMakeLists.txt dcmsr/libsrc/Makefile.dep dcmsr/libsrc/Makefile.in dcmsr/libsrc/dsrcodvl.cc dcmsr/libsrc/dsrdoc.cc dcmsr/libsrc/dsrdoctn.cc dcmsr/libsrc/dsrtypes.cc dcmsr/tests/Makefile.dep dcmsr/tests/mkreport.cc - Modified DTD: allow "vr" attribute to contain other values than SQ as required for the pixel sequence. Affects: dcmdata/apps/dcm2xml.dtd **** Changes from 2003.09.09 (wilkens) - Found and implemented an easier way to prevent incremental binding. Affects: CMakeLists.txt dcmdata/apps/CMakeLists.txt dcmnet/apps/CMakeLists.txt imagectn/apps/CMakeLists.txt imagectn/tests/CMakeLists.txt dcmimage/apps/CMakeLists.txt dcmimgle/apps/CMakeLists.txt dcmjpeg/apps/CMakeLists.txt dcmpstat/apps/CMakeLists.txt dcmsign/apps/CMakeLists.txt dcmsr/apps/CMakeLists.txt dcmsr/tests/CMakeLists.txt dcmwlm/apps/CMakeLists.txt **** Changes from 2003.09.08 (wilkens) - Updated CMakeLists.txt files in order to prevent incremental binding. Affects: dcmdata/apps/CMakeLists.txt dcmnet/apps/CMakeLists.txt imagectn/apps/CMakeLists.txt imagectn/tests/CMakeLists.txt dcmimage/apps/CMakeLists.txt dcmimgle/apps/CMakeLists.txt dcmjpeg/apps/CMakeLists.txt dcmpstat/apps/CMakeLists.txt dcmsign/apps/CMakeLists.txt dcmsr/apps/CMakeLists.txt dcmsr/tests/CMakeLists.txt dcmwlm/apps/CMakeLists.txt - Added _REENTRANT flag definition to main CMakeLists.txt file. Affects: CMakeLists.txt **** Changes from 2003.09.08 (eichelberg) - Updated attribute names that have changed in DICOM 2003 Affects: dcmsr/libsrc/dsrcodvl.cc - Updated data dictionary for 2003 edition of the DICOM standard Affects: dcmdata/include/dcdeftag.h dcmdata/libsrc/dcdictzz.cc dcmdata/libsrc/dicom.dic **** Changes from 2003.09.08 (wilkens) - Modified CMakeLists.txt files to get rid of name clash between imagectn lib and app and between dcmsign lib and app. The imagectn lib is now called imagedb, the dcmsign lib is now called dcmdsig. Affects: dcmpstat/apps/CMakeLists.txt imagectn/apps/CMakeLists.txt imagectn/libsrc/CMakeLists.txt imagectn/tests/CMakeLists.txt dcmsign/apps/CMakeLists.txt dcmsign/libsrc/CMakeLists.txt - Modified Makefiles to get rid of name clash between dcmsign lib and app. The dcmsign lib is now called dcmdsig. Affects: dcmpstat/apps/Makefile.in dcmpstat/jni/Makefile.in dcmsign/apps/Makefile.in dcmsign/libsrc/Makefile.in **** Changes from 2003.09.05 (riesmeier) - Added library "ssleay32" to compile targets dcmprscu and dcmprscp. Required in order to get new TLS support working. Affects: dcmpstat/apps/CMakeLists.txt **** Changes from 2003.09.05 (eichelberg) - Added file with sample printer configurations for various printers. Added: dcmpstat/tests/printers.cfg - Updated configuration file and added entries for TLS print server processes. Restored both IHE pseudo-printers as defined in earlier DICOMscope releases. Affects: dcmpstat/tests/test.cfg - Introduced new API methods that allow Displayed Areas to be queried and set either relative to the image (ignoring rotation and flip) or in absolute values as defined in the standard. Rotate and flip methods now adjust displayed areas in the presentation state. Affects: dcmpstat/apps/dcmp2pgm.cc dcmpstat/include/dvpsda.h dcmpstat/include/dvpsdal.h dcmpstat/include/dvpstat.h dcmpstat/libsrc/dcmpstat.cc dcmpstat/libsrc/dvpsda.cc dcmpstat/libsrc/dvpsdal.cc dcmpstat/libsrc/dvpstat.cc - Print SCU now supports TLS connections. Affects: dcmpstat/apps/Makefile.in dcmpstat/apps/dcmprscu.cc dcmpstat/include/dvpspr.h dcmpstat/libsrc/dvpspr.cc - Print SCP now supports TLS connections and the Verification Service Class. Affects: dcmpstat/apps/Makefile.in dcmpstat/apps/dcmprscp.cc dcmpstat/include/dvpsprt.h dcmpstat/libsrc/dvpsprt.cc - Minor code purifications Affects: dcmpstat/apps/dcmp2pgm.cc - Modified code to use class DcmPresentationState instead of DVPresentationState. Affects: dcmpstat/apps/Makefile.dep dcmpstat/apps/Makefile.in dcmpstat/apps/dcmpsmk.cc dcmpstat/apps/dcmpsrcv.cc - Updated presentation state checker to use class DcmPresentationState instead of DVPresentationState. Imported updated VR checking code from module dcmcheck. Affects: dcmpstat/apps/Makefile.dep dcmpstat/apps/Makefile.in dcmpstat/apps/dcmpschk.cc dcmpstat/apps/vrscan.cc dcmpstat/apps/vrscan.h - Fixed minor issue that caused certain error messages during the parse process on a GSPS object to be "swallowed". Affects: dcmpstat/libsrc/dcmpstat.cc dcmpstat/libsrc/dvpsall.cc dcmpstat/libsrc/dvpscul.cc dcmpstat/libsrc/dvpsdal.cc dcmpstat/libsrc/dvpsgal.cc dcmpstat/libsrc/dvpsgll.cc dcmpstat/libsrc/dvpsgrl.cc dcmpstat/libsrc/dvpsovl.cc dcmpstat/libsrc/dvpsril.cc dcmpstat/libsrc/dvpsrsl.cc dcmpstat/libsrc/dvpsvll.cc dcmpstat/libsrc/dvpsvwl.cc **** Changes from 2003.09.04 (wilkens) - Updated the main CMakeLists.txt file so that libpng, libtiff and zlib support are turned on as a default. Affects: CMakeLists.txt - Updated INSTALL file. Added specifications for use of CMake on Win32 platforms. Affects: INSTALL **** Changes from 2003.09.04 (riesmeier) - Fixed wrong use of OFBool/bool variable. Affects: dcmnet/apps/movescu.cc dcmpstat/apps/dcmprscp.cc dcmpstat/apps/dcmprscu.cc imagectn/apps/scemove.cc - Replaced wrong call of OFCommandLine::getValueAndCheckMin() by OFCommandLine::getValueAndCheckMinMax(). Affects: imagectn/apps/ti.cc - Converted variable opt_verbose from int into OFBool to fix warnings reported by MSVC6. Affects: dcmpstat/apps/dcmpsrcv.cc - Combined two #include "ofstdinc.h" statements. Affects: dcmsr/include/dsrxmlc.h **** Changes from 2003.09.03 (eichelberg) - Added standard includes needed on Win32 Affects: dcmsr/include/dsrxmlc.h dcmsr/libsrc/dsrwavch.cc - Fixed bug in command line evaluation Affects: dcmpstat/apps/dcmmklut.cc **** Changes from 2003.09.01 (riesmeier) - Updated "DICOM bugs" e-mail address. Affects: dcmwlm/docs/wwwapp.doc dcmwlm/docs/wwwapp.txt **** Changes from 2003.09.01 (wilkens) - Inserted CMakeLists.txt files for use of CMake on Win32 platforms. Added: CMakeLists.txt dcmdata/CMakeLists.txt dcmdata/apps/CMakeLists.txt dcmdata/libsrc/CMakeLists.txt dcmimage/CMakeLists.txt dcmimage/apps/CMakeLists.txt dcmimage/libsrc/CMakeLists.txt dcmimgle/CMakeLists.txt dcmimgle/apps/CMakeLists.txt dcmimgle/libsrc/CMakeLists.txt dcmjpeg/CMakeLists.txt dcmjpeg/apps/CMakeLists.txt dcmjpeg/libijg12/CMakeLists.txt dcmjpeg/libijg16/CMakeLists.txt dcmjpeg/libijg8/CMakeLists.txt dcmjpeg/libsrc/CMakeLists.txt dcmnet/CMakeLists.txt dcmnet/apps/CMakeLists.txt dcmnet/libsrc/CMakeLists.txt dcmpstat/CMakeLists.txt dcmpstat/apps/CMakeLists.txt dcmpstat/libsrc/CMakeLists.txt dcmsign/CMakeLists.txt dcmsign/apps/CMakeLists.txt dcmsign/libsrc/CMakeLists.txt dcmsr/CMakeLists.txt dcmsr/apps/CMakeLists.txt dcmsr/libsrc/CMakeLists.txt dcmsr/tests/CMakeLists.txt dcmtls/CMakeLists.txt dcmtls/libsrc/CMakeLists.txt dcmwlm/CMakeLists.txt dcmwlm/apps/CMakeLists.txt dcmwlm/libsrc/CMakeLists.txt imagectn/CMakeLists.txt imagectn/apps/CMakeLists.txt imagectn/libsrc/CMakeLists.txt imagectn/tests/CMakeLists.txt ofstd/CMakeLists.txt ofstd/libsrc/CMakeLists.txt - Updated dsp file to include new cxx-files in dcmpstat/libsrc. Affects: dcmpstat/dcmpstat.dsp - Added #include to file to be able to compile again under Win32. Affects: dcmpstat/apps/dcmpschk.cc **** Changes from 2003.08.29 (riesmeier) - Modified function zeroMem() to compile with MSVC again where bzero() is not available. Affects: ofstd/include/ofbmanip.h - Replaced wrong getValueAndCheckMin() by getValueAndCheckMinMax(). Affects: dcmpstat/apps/dcmmkcrv.cc - Adapted type casts to new-style typecast operators defined in ofcast.h. Affects: dcmpstat/apps/dcmmkcrv.cc - Replaced inclusion of unistd.h by cstddef/stddef.h to compile under Windows with libxml support (required for definition of NULL). Affects: dcmsr/include/dsrxmlc.h **** Changes from 2003.08.27 (eichelberg) - Changed anonymous struct typedefs into struct declarations Affects: dcmnet/include/dimse.h - Splitted class DVPresentationState into a base class DcmPresentationState that does not depend on module dcmimgle and current derived class with public API identical to the previous version. Affects: dcmpstat/include/dvpstat.h dcmpstat/libsrc/dvpstat.cc dcmpstat/libsrc/Makefile.in Added: dcmpstat/libsrc/dcmpstat.cc dcmpstat/include/dcmpstat.h - Moved all methods of class DVPSPresentationLUT that depend on module dcmimgle into a separate implementation file Affects: dcmpstat/libsrc/dvpspl.cc dcmpstat/include/dvpspl.h dcmpstat/libsrc/Makefile.in Added: dcmpstat/libsrc/dvpspl2.cc - Changed API of class DVPSOverlay to avoid dependency on module dcmimgle Affects: dcmpstat/include/dvpsov.h dcmpstat/libsrc/dvpsov.cc dcmpstat/libsrc/dvpstat.cc - Rebuilt Makefile dependencies for module dcmpstat Affects: dcmpstat/apps/Makefile.dep dcmpstat/libsrc/Makefile.dep **** Changes from 2003.08.21 (wilkens) - Got rid of memory leak in function FindCallback(). Thanks to Asger Halkier for the bug report and fix. Affects: dcmwlm/libsrc/wlmactmg.cc - Got rid of some unnecessary if-statements in function FindCallback(). Affects: dcmwlm/libsrc/wlmactmg.cc - Function NextFindResponse() will not any longer return an empty dataset when status WLM_SUCCESS is reached. Affects: dcmwlm/libsrc/wldsfs.cc - Moved declaration and initialization of member variables matchingDatasets and numOfMatchingDatasets to base class. Affects: dcmwlm/include/wlds.h dcmwlm/include/wldsfs.h dcmwlm/libsrc/wlds.cc dcmwlm/libsrc/wldsfs.cc - Got rid of superfluous member variable objlist and of superfluous function ClearObjList(). Affects: dcmwlm/include/wlds.h dcmwlm/libsrc/wlds.cc **** Changes from 2003.08.20 (wilkens) - Added new class OFSetIterator, an iterator class for OFxxxSet data structures. Added: ofstd/include/ofsetit.h Affects: dcmwlm/libsrc/wlfsim.cc **** Changes from 2003.08.14 (riesmeier) - Removed libxml dependencies. Affects: dcmdata/apps/Makefile.dep **** Changes from 2003.08.14 (eichelberg) - OFStack now explicitly defined as std::stack if compiling with HAVE_STL Affects: ofstd/include/ofstack.h - Adapted type casts to new-style typecast operators defined in ofcast.h Affects: dcmdata/include/dcdicdir.h dcmdata/include/dcdicent.h dcmdata/include/dcrledec.h dcmdata/include/dcrleenc.h dcmdata/include/dctag.h dcmdata/libsrc/dcrleccd.cc dcmdata/libsrc/dcrlecce.cc dcmnet/include/dul.h ofstd/include/ofbmanip.h ofstd/libsrc/ofthread.cc ofstd/tests/tlist.cc ofstd/tests/tofstd.cc ofstd/tests/tstthred.cc - Minor code modifications to avoid warnings about unused code on MinGW Affects: imagectn/apps/imagectn.cc - Added documentation for association negotiation profiles as well as sample configuration files for storescu and storescp. Added: dcmnet/docs/asconfig.txt dcmnet/docs/storescp.cfg dcmnet/docs/storescu.cfg - Added check if association configuration profile is valid for SCP use Affects: dcmnet/apps/storescp.cc dcmnet/include/dcasccfg.h dcmnet/libsrc/dcasccfg.cc **** Changes from 2003.08.12 (riesmeier) - Added new interface class for simplified creation of a DICOMDIR. Completely reworked implementation. Still requires intensive testing! Added: dcmdata/include/dcddirif.h dcmdata/libsrc/dcddirif.cc Affects: dcmdata/dcmdata.dsp dcmdata/libsrc/Makefile.in - Adapted implementation to use new DICOMDIR class. Added new command line options (e.g. --input-directory or --pattern). Affects: dcmdata/apps/Makefile.dep dcmdata/apps/dcmgpdir.cc dcmdata/docs/dcmgpdir.txt dcmjpeg/docs/dcmmkdir.txt - Added plugable image support for the new DICOMDIR class. Added: dcmjpeg/include/ddpimpl.h dcmjpeg/libsrc/ddpimpl.cc Affects: dcmjpeg/dcmjpeg.dsp dcmjpeg/libsrc/Makefile.dep dcmjpeg/libsrc/Makefile.in - Added "COMMAND LINE" section and enhanced "ENVIRONMENT" section. Affects: dcmdata/docs/dcmgpdir.txt dcmjpeg/docs/dcmmkdir.txt - Improved implementation of normalizeDirName(). Affects: ofstd/include/ofstd.h ofstd/libsrc/ofstd.cc ofstd/tests/tofstd.c - Replaced call of OFCommandLine::getValueAndCheckMin() by OFCommandLine:: getValueAndCheckMinMax() - warning reported by MSVC 5. Affects: dcmdata/apps/dcmgpdir.cc - Added libxml und iconv libraries. Required when compiled with WITH_LIBXML. Affects: dcmsr/apps/dsr2html.dsp dcmsr/apps/dsr2xml.dsp dcmsr/apps/dsrdump.dsp dcmpstat/apps/dcmp2pgm.dsp dcmpstat/apps/dcmprscp.dsp dcmpstat/apps/dcmprscu.dsp dcmpstat/apps/dcmpsprt.dsp - Removed description of USE__FINDFIRST. Affects: config/docs/macros.txt **** Changes from 2003.08.11 (riesmeier) - Included "ctype" header file required for gcc 3.2.3 on Debian Linux. Affects: dcmnet/apps/storescp.cc dcmnet/apps/storescu.cc dcmnet/libsrc/dcasccff.cc - Included "stdio" header file required for gcc 3.2.3 on Debian Linux. Affects: dcmsr/libsrc/dsrtcosp.cc **** Changes from 2003.08.08 (riesmeier) - Made DcmListNode::value() inline. Affects: dcmdata/include/dclist.h dcmdata/libsrc/dclist.cc - Renamed member variable "actualNode" to "currentNode". Affects: dcmdata/include/dclist.h dcmdata/libsrc/dclist.cc - Translated remaining German comments. Affects: dcmdata/include/dcdirrec.h dcmdata/libsrc/dclist.cc dcmdata/libsrc/dcdirrec.cc dcmdata/libsrc/dcsequen.cc - Removed needless type casts (e.g. on the NULL constant). Affects: dcmdata/libsrc/dclist.cc - Adapted type casts to new-style typecast operators defined in ofcast.h. Affects: dcmdata/include/dclist.h dcmdata/libsrc/dcdirrec.cc dcmdata/libsrc/dcsequen.cc - Added new method insertAtCurrentPos() which allows for a much more efficient insertion (avoids re-searching for the correct position). Affects: dcmdata/include/dcsequen.h dcmdata/libsrc/dcsequen.cc - Added two new methods insertSubAtCurrentPos() and nextSub() which allow for a much more efficient insertion (avoids re-searching for correct position). Affects: dcmdata/include/dcdirrec.h dcmdata/libsrc/dcdirrec.cc - Made libxml output consistent with new xml2dsr command line tool. Affects: dcmdata/libsrc/xml2dcm.cc - Re-added xml2dcm to the makefile. Affects: dcmdata/apps/Makefile.in **** Changes from 2003.08.07 (riesmeier) - Improved implementation of combineDirAndFilename(). Affects: ofstd/libsrc/ofstd.cc - Slightly modified header comments to conform to doxygen syntax. Affects: ofstd/include/oflist.h ofstd/include/ofstring.h - Added new command line tool xml2dsr (convert XML document to DICOM SR file). Added: dcmsr/apps/xml2dsr.cc dcmsr/docs/xml2dsr.txt Affects: dcmsr/apps/Makefile.dep dcmsr/apps/Makefile.in - Added readXML functionality. Affects: dcmsr/include/dsrcodtn.h dcmsr/include/dsrcodvl.h dcmsr/include/dsrcomtn.h dcmsr/include/dsrcomvl.h dcmsr/include/dsrcontn.h dcmsr/include/dsrdattn.h dcmsr/include/dsrdoc.h dcmsr/include/dsrdoctn.h dcmsr/include/dsrdoctr.h dcmsr/include/dsrdtitn.h dcmsr/include/dsrimgtn.h dcmsr/include/dsrimgvl.h dcmsr/include/dsrnumtn.h dcmsr/include/dsrnumvl.h dcmsr/include/dsrpnmtn.h dcmsr/include/dsrreftn.h dcmsr/include/dsrscotn.h dcmsr/include/dsrscovl.h dcmsr/include/dsrsoprf.h dcmsr/include/dsrstrvl.h dcmsr/include/dsrtcotn.h dcmsr/include/dsrtcovl.h dcmsr/include/dsrtextn.h dcmsr/include/dsrtimtn.h dcmsr/include/dsrtypes.h dcmsr/include/dsruidtn.h dcmsr/include/dsrwavtn.h dcmsr/include/dsrwavvl.h dcmsr/libsrc/dsrcodtn.cc dcmsr/libsrc/dsrcodvl.cc dcmsr/libsrc/dsrcomtn.cc dcmsr/libsrc/dsrcomvl.cc dcmsr/libsrc/dsrcontn.cc dcmsr/libsrc/dsrdattn.cc dcmsr/libsrc/dsrdoc.cc dcmsr/libsrc/dsrdoctn.cc dcmsr/libsrc/dsrdoctr.cc dcmsr/libsrc/dsrdtitn.cc dcmsr/libsrc/dsrimgtn.cc dcmsr/libsrc/dsrimgvl.cc dcmsr/libsrc/dsrnumtn.cc dcmsr/libsrc/dsrnumvl.cc dcmsr/libsrc/dsrpnmtn.cc dcmsr/libsrc/dsrreftn.cc dcmsr/libsrc/dsrscotn.cc dcmsr/libsrc/dsrscovl.cc dcmsr/libsrc/dsrsoprf.cc dcmsr/libsrc/dsrstrvl.cc dcmsr/libsrc/dsrtcotn.cc dcmsr/libsrc/dsrtcovl.cc dcmsr/libsrc/dsrtextn.cc dcmsr/libsrc/dsrtimtn.cc dcmsr/libsrc/dsrtypes.cc dcmsr/libsrc/dsruidtn.cc dcmsr/libsrc/dsrwavtn.cc dcmsr/libsrc/dsrwavvl.cc - Added interface classes hiding the access to libxml (document and cursor class). Added: dcmsr/include/dsrxmlc.h dcmsr/include/dsrxmld.h dcmsr/libsrc/dsrxmlc.cc dcmsr/libsrc/dsrxmld.cc Affects: dcmsr/dcmsr.dsp dcmsr/libsrc/Makefile.dep dcmsr/libsrc/Makefile.in dcmsr/tests/Makefile.dep dcmsr/tests/Makefile.in dcmpstat/apps/Makefile.in - Added new option --add-schema-reference to command line tool dsr2xml. XML Schema not yet completed! Affects: dcmsr/apps/dsr2xml.cc dcmsr/docs/dsr2xml.txt dcmsr/include/dsrtypes.h dcmsr/libsrc/dsrdoc.cc dcmsr/libsrc/dsrtypes.cc - Added support for Chest CAD SR. Affects: dcmsr/docs/dsr2xml.txt dcmsr/include/dsrcodtn.h dcmsr/include/dsrcomtn.h dcmsr/include/dsrcontn.h dcmsr/include/dsrdattn.h dcmsr/include/dsrdoctn.h dcmsr/include/dsrdoctr.h dcmsr/include/dsrdtitn.h dcmsr/include/dsrimgtn.h dcmsr/include/dsrnumtn.h dcmsr/include/dsrpnmtn.h dcmsr/include/dsrscotn.h dcmsr/include/dsrtcotn.h dcmsr/include/dsrtextn.h dcmsr/include/dsrtimtn.h dcmsr/include/dsrtypes.h dcmsr/include/dsruidtn.h dcmsr/include/dsrwavtn.h dcmsr/libsrc/dsrtypes.cc - Added "COMMAND LINE" section and enhanced "ENVIRONMENT" section. Affects: dcmsr/docs/dsr2xml.txt - Updated documentation to get rid of doxygen warnings. Affects: dcmsr/include/dsrcitem.h dcmsr/include/dsrcomtn.h dcmsr/include/dsrcontn.h dcmsr/include/dsrdoc.h dcmsr/include/dsrdoctn.h dcmsr/include/dsrdoctr.h dcmsr/include/dsrtlist.h dcmsr/include/dsrtncsr.h dcmsr/include/dsrtree.h - Made method isFinalized() const. Affects: dcmsr/include/dsrdoc.h dcmsr/libsrc/dsrdoc.cc - Added new option to createRevisedVersion() which allows to keep the current list of predecessor documents. Affects: dcmsr/include/dsrdoc.h dcmsr/libsrc/dsrdoc.cc - Changed interface to access the list of predecessor documents. Now using the existing class DSRSOPInstanceReferenceList. Affects: dcmsr/include/dsrdoc.h dcmsr/libsrc/dsrdoc.cc - Added preliminary support for the Identical Documents Sequence. Affects: dcmsr/include/dsrdoc.h dcmsr/libsrc/dsrdoc.cc - Renamed parameters/variables "string" to avoid name clash with STL class. Affects: dcmsr/include/dsrdoc.h dcmsr/include/dsrsoprf.h dcmsr/include/dsrtypes.h dcmsr/libsrc/dsrdoc.cc dcmsr/libsrc/dsrdoctr.cc dcmsr/libsrc/dsrimgvl.cc dcmsr/libsrc/dsrpnmtn.cc dcmsr/libsrc/dsrscovl.cc dcmsr/libsrc/dsrsoprf.cc dcmsr/libsrc/dsrtcodt.cc dcmsr/libsrc/dsrtcoto.cc dcmsr/libsrc/dsrtcovl.cc dcmsr/libsrc/dsrtncsr.cc dcmsr/libsrc/dsrtypes.cc dcmsr/libsrc/dsrwavvl.cc - Added new putString() method. Affects: dcmsr/include/dsrimgfr.h dcmsr/include/dsrscogr.h dcmsr/include/dsrtcodt.h dcmsr/include/dsrtcosp.h dcmsr/include/dsrtcoto.h dcmsr/include/dsrwavch.h dcmsr/libsrc/dsrimgfr.cc dcmsr/libsrc/dsrscogr.cc dcmsr/libsrc/dsrtcodt.cc dcmsr/libsrc/dsrtcosp.cc dcmsr/libsrc/dsrtcoto.cc dcmsr/libsrc/dsrwavch.cc - Enhanced class DSRSOPInstanceReferenceList: empty/incomplete items (e.g. series with no instances or studies with no series) are automatically removed from the list and "degenerated" (i.e. not stricly hierarchical) sequence structures are now also supported. Affects: dcmsr/include/dsrsoprf.h dcmsr/libsrc/dsrsoprf.cc - Adapted type casts to new-style typecast operators defined in ofcast.h. Affects: dcmsr/libsrc/dsrcitem.cc dcmsr/libsrc/dsrdoctn.cc dcmsr/libsrc/dsrdoctr.cc dcmsr/libsrc/dsrsoprf.cc dcmsr/libsrc/dsrtypes.cc - Follow more strictly the rules for Key Object Selection Documents (e.g. there is a special Key Object Document Series Module). Affects: dcmsr/libsrc/dsrdoc.cc - Distinguish more strictly between OFBool and int (required when HAVE_CXX_BOOL is defined). Affects: dcmsr/libsrc/dsrdoc.cc dcmsr/libsrc/dsrdoctn.cc dcmsr/libsrc/dsrdtitn.cc dcmsr/libsrc/dsrscovl.cc dcmsr/libsrc/dsrstrvl.cc dcmsr/libsrc/dsrtextn.cc dcmsr/libsrc/dsrtimtn.cc dcmsr/libsrc/dsruidtn.cc - Adapted for use of OFListConstIterator, needed for compiling with HAVE_STL. Affects: dcmsr/libsrc/dsrimgfr.cc dcmsr/libsrc/dsrscogr.cc dcmsr/libsrc/dsrsoprf.cc dcmsr/libsrc/dsrtcodt.cc dcmsr/libsrc/dsrtcosp.cc dcmsr/libsrc/dsrtcoto.cc dcmsr/libsrc/dsrtncsr.cc dcmsr/libsrc/dsrwavch.cc dcmsr/tests/mkreport.cc - Modified writeXML() output (introduced new "..." element). Affects: dcmsr/libsrc/dsrcomtn.cc dcmsr/libsrc/dsrimgtn.cc dcmsr/libsrc/dsrwavtn.cc - Added comment. Affects: dcmsr/libsrc/dsrtree.cc - Added xml2dsr to MSVC project files (Windows). Added: dcmsr/apps/xml2dsr.dsp Affects: dcmtk.dsw - Added brackets around "bitwise and" operator/operands to avoid warnings reported by MSVC5. Affects: dcmsr/libsrc/dsrcodvl.cc dcmsr/libsrc/dsrdattn.cc dcmsr/libsrc/dsrdoc.cc dcmsr/libsrc/dsrdoctn.cc dcmsr/libsrc/dsrdtitn.cc dcmsr/libsrc/dsrnumvl.cc dcmsr/libsrc/dsrpnmtn.cc dcmsr/libsrc/dsrscovl.cc dcmsr/libsrc/dsrsoprf.cc dcmsr/libsrc/dsrstrvl.cc dcmsr/libsrc/dsrtextn.cc dcmsr/libsrc/dsrtimtn.cc dcmsr/libsrc/dsruidtn.cc dcmsr/libsrc/dsrxmld.cc - Removed libxml dependency from header files. Simplifies linking (MSVC). Affects: dcmsr/apps/Makefile.dep dcmsr/include/dsrcodvl.h dcmsr/include/dsrcomvl.h dcmsr/include/dsrdoc.h dcmsr/include/dsrdoctn.h dcmsr/include/dsrimgvl.h dcmsr/include/dsrscovl.h dcmsr/include/dsrsoprf.h dcmsr/include/dsrstrvl.h dcmsr/include/dsrtcovl.h dcmsr/include/dsrtypes.h dcmsr/include/dsrwavvl.h dcmsr/include/dsrxmld.h dcmsr/libsrc/Makefile.dep dcmsr/libsrc/dsrcodtn.cc dcmsr/libsrc/dsrcodvl.cc dcmsr/libsrc/dsrcomtn.cc dcmsr/libsrc/dsrcontn.cc dcmsr/libsrc/dsrdattn.cc dcmsr/libsrc/dsrdoc.cc dcmsr/libsrc/dsrdoctn.cc dcmsr/libsrc/dsrdoctr.cc dcmsr/libsrc/dsrdtitn.cc dcmsr/libsrc/dsrimgtn.cc dcmsr/libsrc/dsrnumtn.cc dcmsr/libsrc/dsrnumvl.cc dcmsr/libsrc/dsrpnmtn.cc dcmsr/libsrc/dsrreftn.cc dcmsr/libsrc/dsrscotn.cc dcmsr/libsrc/dsrtcotn.cc dcmsr/libsrc/dsrtextn.cc dcmsr/libsrc/dsrtimtn.cc dcmsr/libsrc/dsruidtn.cc dcmsr/libsrc/dsrwavch.cc dcmsr/libsrc/dsrwavtn.cc dcmsr/tests/Makefile.dep **** Changes from 2003.07.17 (riesmeier) - Added new function searchDirectoryRecursively(). Affects: ofstd/include/ofstd.h - Added "#include " required for ::sleep() on Linux 2.4.x. Affects: ofstd/include/ofstd.h - Updated documentation to get rid of doxygen warnings. Affects: ofstd/include/ofstd.h - Added test for "fnmatch.h" header file. Affects: config/configure config/configure.in config/include/cfunix.h.in config/include/cfwin32.h **** Changes from 2003.07.16 (riesmeier) - Added new function findAndGetSequence(). Affects: dcmdata/include/dcitem.h - Adapted type casts to new-style typecast operators defined in ofcast.h. Affects: dcmdata/include/dcitem.h dcmdata/libsrc/dcitem.cc **** Changes from 2003.07.11 (riesmeier) - Added workaround to get rid of "implicit typename" warnings on gcc 3.x (introduced macro OFLIST_TYPENAME). Affects: ofstd/include/oflist.h dcmnet/include/dcmsmap.h dcmsr/include/dsrtlist.h - Renamed member variable. Affects: dcmsr/include/dsrtlist.h dcmsr/libsrc/dsrimgfr.cc dcmsr/libsrc/dsrscogr.cc dcmsr/libsrc/dsrtcodt.cc dcmsr/libsrc/dsrtcosp.cc dcmsr/libsrc/dsrtcoto.cc dcmsr/libsrc/dsrwavch.cc **** Changes from 2003.07.09 (eichelberg) - Included dcmodify in MSVC build system, updated headers Affects: dcmtk.dsw dcmdata/apps/dcmodify.cc dcmdata/apps/mdfconen.cc dcmdata/apps/mdfconen.h dcmdata/apps/mdfdsman.cc dcmdata/apps/mdfdsman.h dcmdata/include/dcvrobow.h Added: dcmdata/apps/dcmodify.dsp - Added FAQ entry about filename extensions ".cc" and ".cxx" Affects: FAQ - Added configure test for new-style cast operators such as static_cast<> and const_cast<>. Affects: config/acconfig.h config/aclocal.m4 config/configure config/configure.in config/include/cfunix.h.in config/include/cfwin32.h - Added new header file ofcast.h which defines portable macros for new-style typecast operators Added: ofstd/include/ofcast.h - Adapted type casts to new-style typecast operators defined in ofcast.h Affects: ofstd/include/ofcond.h ofstd/include/oflist.h ofstd/include/ofstack.h ofstd/include/ofstring.h ofstd/include/oftimer.h ofstd/libsrc/ofcmdln.cc ofstd/libsrc/ofconfig.cc ofstd/libsrc/ofcrc32.cc ofstd/libsrc/offname.cc ofstd/libsrc/oflogfil.cc ofstd/libsrc/ofstd.cc ofstd/libsrc/ofstring.cc ofstd/libsrc/oftime.cc - Removed unused variable Affects: dcmsign/libsrc/dcsignat.cc - Removed unused debug output Affects: dcmnet/libsrc/dul.cc **** Changes from 2003.07.08 (eichelberg) - Configure now correctly handles the ".exe" file extension on MinGW. Affects: config/configure config/configure.in - Fixed bug in OFStandard::ftoa that could cause a segmentation fault if the number to be converted was NAN or infinity. Thanks to Michael Doppler for the bug report and fix. Affects: ofstd/libsrc/ofstd.cc **** Changes from 2003.07.04 (eichelberg) - Fixed issues with compiling with HAVE_STD_STRING Affects: ofstd/include/ofcond.h ofstd/include/ofstd.h ofstd/include/ofstring.h ofstd/libsrc/ofstring.cc ofstd/tests/tstring.cc - Replaced forward declarations for OFString with explicit includes, needed when compiling with HAVE_STD_STRING Affects: dcmdata/include/dcbytstr.h dcmdata/include/dcelem.h dcmimage/include/diqtctab.h dcmimage/include/diquant.h dcmimgle/include/didocu.h dcmjpeg/include/djcodecd.h dcmjpeg/include/djcodece.h dcmpstat/include/dvpsmsg.h dcmsign/include/sicert.h ofstd/include/ofconapp.h ofstd/include/ofthread.h - Added include for ofstream.h, to make sure ofstream is correctly defined Affects: dcmnet/include/dcmtrans.h dcmtls/include/tlslayer.h dcmtls/include/tlstrans.h ofstd/include/ofdate.h **** Changes from 2003.07.03 (eichelberg) - Renamed type INT32 to IJG_INT32 to avoid name clash on MinGW Affects: dcmjpeg/libijg12/jaricom.c dcmjpeg/libijg12/jccolor.c dcmjpeg/libijg12/jcdctmgr.c dcmjpeg/libijg12/jchuff.c dcmjpeg/libijg12/jclhuff.c dcmjpeg/libijg12/jcphuff.c dcmjpeg/libijg12/jcsample.c dcmjpeg/libijg12/jcshuff.c dcmjpeg/libijg12/jdcoefct.c dcmjpeg/libijg12/jdcolor.c dcmjpeg/libijg12/jdct12.h dcmjpeg/libijg12/jddctmgr.c dcmjpeg/libijg12/jdhuff.c dcmjpeg/libijg12/jdhuff12.h dcmjpeg/libijg12/jdmarker.c dcmjpeg/libijg12/jdmerge.c dcmjpeg/libijg12/jdsample.c dcmjpeg/libijg12/jfdctfst.c dcmjpeg/libijg12/jfdctint.c dcmjpeg/libijg12/jidctflt.c dcmjpeg/libijg12/jidctfst.c dcmjpeg/libijg12/jidctint.c dcmjpeg/libijg12/jidctred.c dcmjpeg/libijg12/jlossls12.h dcmjpeg/libijg12/jmorecfg12.h dcmjpeg/libijg12/jpegint12.h dcmjpeg/libijg12/jquant1.c dcmjpeg/libijg12/jquant2.c dcmjpeg/libijg16/jaricom.c dcmjpeg/libijg16/jccolor.c dcmjpeg/libijg16/jcdctmgr.c dcmjpeg/libijg16/jchuff.c dcmjpeg/libijg16/jclhuff.c dcmjpeg/libijg16/jcphuff.c dcmjpeg/libijg16/jcsample.c dcmjpeg/libijg16/jcshuff.c dcmjpeg/libijg16/jdcoefct.c dcmjpeg/libijg16/jdcolor.c dcmjpeg/libijg16/jdct16.h dcmjpeg/libijg16/jddctmgr.c dcmjpeg/libijg16/jdhuff.c dcmjpeg/libijg16/jdhuff16.h dcmjpeg/libijg16/jdmarker.c dcmjpeg/libijg16/jdmerge.c dcmjpeg/libijg16/jdsample.c dcmjpeg/libijg16/jfdctfst.c dcmjpeg/libijg16/jfdctint.c dcmjpeg/libijg16/jidctflt.c dcmjpeg/libijg16/jidctfst.c dcmjpeg/libijg16/jidctint.c dcmjpeg/libijg16/jidctred.c dcmjpeg/libijg16/jlossls16.h dcmjpeg/libijg16/jmorecfg16.h dcmjpeg/libijg16/jpegint16.h dcmjpeg/libijg16/jquant1.c dcmjpeg/libijg16/jquant2.c dcmjpeg/libijg8/jaricom.c dcmjpeg/libijg8/jccolor.c dcmjpeg/libijg8/jcdctmgr.c dcmjpeg/libijg8/jchuff.c dcmjpeg/libijg8/jclhuff.c dcmjpeg/libijg8/jcphuff.c dcmjpeg/libijg8/jcsample.c dcmjpeg/libijg8/jcshuff.c dcmjpeg/libijg8/jdcoefct.c dcmjpeg/libijg8/jdcolor.c dcmjpeg/libijg8/jdct8.h dcmjpeg/libijg8/jddctmgr.c dcmjpeg/libijg8/jdhuff.c dcmjpeg/libijg8/jdhuff8.h dcmjpeg/libijg8/jdmarker.c dcmjpeg/libijg8/jdmerge.c dcmjpeg/libijg8/jdsample.c dcmjpeg/libijg8/jfdctfst.c dcmjpeg/libijg8/jfdctint.c dcmjpeg/libijg8/jidctflt.c dcmjpeg/libijg8/jidctfst.c dcmjpeg/libijg8/jidctint.c dcmjpeg/libijg8/jidctred.c dcmjpeg/libijg8/jlossls8.h dcmjpeg/libijg8/jmorecfg8.h dcmjpeg/libijg8/jpegint8.h dcmjpeg/libijg8/jquant1.c dcmjpeg/libijg8/jquant2.c - Added special handling for FD_SET() on MinGW, which expects an unsigned first argument. Affects: dcmnet/libsrc/assoc.cc dcmnet/libsrc/dcmtrans.cc dcmnet/libsrc/dul.cc dcmnet/libsrc/dulextra.cc dcmnet/libsrc/dulfsm.cc - Added special handling for MinGW where getMacAddress() cannot be compiled because the header file is not (yet) available. Affects: dcmdata/libsrc/dcuid.cc - Minor changes to make OFStandard::sleep compile on MinGW Affects: ofstd/include/ofstd.h ofstd/libsrc/ofstd.cc - When compiling on MinGW, only issues "die" command since the flock family of functions is not available on this platform and, therefore, preplock cannot be made to work. Affects: dcmwlm/wwwapps/preplock.cc - Fixed AC_CHECK_DECLARATION macro. Header files are now only included during the test if the presence of the header file has been checked with AC_CHECK_HEADERS before. Affects: config/aclocal.m4 - Added special handling for MinGW platform Affects: config/acconfig.h config/configure config/configure.in config/include/cfunix.h.in config/include/cfwin32.h - Added configure test for "typename" C++ keyword Affects: config/acconfig.h config/aclocal.m4 config/configure config/configure.in config/include/cfunix.h.in config/include/cfwin32.h - Introduced DcmDictEntryListConstIterator, needed for compiling with HAVE_STL. Affects: dcmdata/include/dchashdi.h dcmdata/libsrc/dcdict.cc - Adapted for use of OFListConstIterator, needed for compiling with HAVE_STL. Affects: dcmnet/apps/storescu.cc dcmnet/libsrc/dcasccfg.cc - Fixed problems with iterators, included zlib.h if needed Affects: dcmdata/apps/mdfconen.cc - Introduced workaround for "implicit typename" warning on gcc 3.x when compiling with HAVE_STL. Affects: dcmnet/include/dcmsmap.h **** Changes from 2003.07.02 (riesmeier) - Added Makefile support for Doxygen. Added: doxygen/Makefile Affects: INSTALL config/rootconf - Slightly modified Doxygen configuration (e.g. use 3 columns instead of 5 in the alphabetical class index). Affects: doxygen/doxygen.cfg - Removed support for DOC++. Removed: dcmdata/htmldocs dcmimage/htmldocs/* dcmimgle/htmldocs/* dcmjpeg/htmldocs/* dcmpstat/htmldocs/* dcmsr/htmldocs/* dcmtls/htmldocs/* dcmwlm/htmldocs/* ofstd/htmldocs/* Affects: INSTALL README config/docs/dirstruc.txt dcmdata/Makefile.in dcmimage/Makefile.in dcmimgle/Makefile.in dcmjpeg/Makefile.in dcmpstat/Makefile.in dcmsr/Makefile.in dcmtls/Makefile.in dcmwlm/Makefile.in ofstd/Makefile.in - Changed main development system from Solaris 7 / GNU C++ 2.95 to Linux 2.4 / GNU C++ 3.2. Affects: INSTALL - Renamed Doxygen output directory from "html" to "htmldocs". Affects: doxygen/doxygen.cfg doxygen/Makefile **** Changes from 2003.07.02 (wilkens) - Updated documentation to get rid of doxygen warnings. Affects: dcmwlm/include/wltypdef.h dcmwlm/include/wlmactmg.h dcmwlm/include/wlds.h dcmwlm/include/wldsfs.h dcmwlm/include/wlfsim.h dcmwlm/apps/wlcefs.h **** Changes from 2003.06.26 (onken) - Added commandline application dcmodify. Added: dcmdata/apps/dcmodify.cc dcmdata/apps/mdfconen.cc dcmdata/apps/mdfdsman.cc dcmdata/apps/mdfconen.h dcmdata/apps/mdfdsman.h dcmdata/docs/dcmodify.txt Affects: dcmdata/apps/Makefile.in dcmdata/apps/Makefile.dep dcmdata/include/dcitem.h dcmdata/libsrc/dcitem.cc **** Changes from 2003.06.18 (eichelberg) - Updated MSVC project file Affects: dcmnet/dcmnet.dsp - Added comparison operators to keep MSVC5 compiler happy Affects: dcmnet/include/dccfenmp.h dcmnet/include/dccfpcmp.h dcmnet/include/dccfprmp.h dcmnet/include/dccfrsmp.h dcmnet/include/dcmsmap.h dcmnet/libsrc/dccfenmp.cc - Fixed bug in association configuration file parser Affects: dcmnet/libsrc/dcascff.cc **** Changes from 2003.06.17 (riesmeier) - Added support for libxml to MSVC project files (Windows). Added: dcmdata/apps/xml2dcm.dsp Affects: INSTALL dcmtk.dsw config/include/cfwin32.h - Distinguish more strictly between OFBool and int (required when HAVE_CXX_BOOL is defined). Affects: dcmdata/apps/xml2dcm.cc **** Changes from 2003.06.12 (riesmeier) - Added support for Doxygen hypertext documentation. Added: doxygen/doxygen.cfg Affects: INSTALL - Fixed inconsistent API documentation reported by Doxygen. Affects: ofstd/include/ofconapp.h ofstd/include/ofcond.h ofstd/include/ofconfig.h ofstd/include/offname.h ofstd/include/oflogfil.h ofstd/include/ofstring.h dcmdata/include/dcbytstr.h dcmdata/include/dccodec.h dcmdata/include/dchashdi.h dcmdata/include/dcistrmb.h dcmdata/include/dcitem.h dcmdata/include/dcobject.h dcmdata/include/dcpixel.h dcmdata/include/dcrleenc.h dcmdata/include/dcvr.h dcmdata/include/dcvrat.h dcmdata/include/dcvrobow.h dcmdata/include/dcvrsl.h dcmimgle/include/dcmimage.h dcmimgle/include/dibaslut.h dcmimgle/include/didocu.h dcmimgle/include/digsdlut.h dcmimgle/include/diimage.h dcmimgle/include/diluptab.h dcmimgle/include/dimo1img.h dcmimgle/include/dimo2img.h dcmimgle/include/dimoimg.h dcmimgle/include/dimoipxt.h dcmimgle/include/dimoopxt.h dcmimgle/include/diovlay.h dcmimgle/include/diovpln.h dcmimage/include/dicoimg.h dcmimage/include/diqtctab.h dcmnet/include/dcmlayer.h - Added static function checkVR(). Affects: dcmdata/include/dcvrcs.h dcmdata/libsrc/dcvrcs.cc - Added support for so-called command files ("@filename") which can be used to summarize command line options and parameters. Added: dcmdata/apps/dumppat.txt Affects: dcmdata/docs/dcmdump.txt ofstd/include/ofcmdln.h ofstd/libsrc/ofcmdln.cc - Enhanced method printWarning(). Added method quietMode(). Affects: ofstd/include/ofconapp.h ofstd/libsrc/ofconapp.cc - Introduced macro OFListConstIterator() to support STL const_iterators. Affects: ofstd/include/oflist.h ofstd/libsrc/ofcmdln.cc - Slightly modified macro definitions to avoid potential parser errors (added space character after '<' and before '>'). Affects: ofstd/include/oflist.h - Modified code to use const_iterators where appropriate (required for STL). Thanks to Henning Meyer for the report. Affects: dcmdata/include/dcpixel.h dcmdata/include/dcrleenc.h dcmdata/libsrc/dcpcache.cc dcmdata/libsrc/dcpixel.cc dcmdata/libsrc/dcpxitem.cc dcmnet/libsrc/extneg.cc dcmpstat/libsrc/dvpsabl.cc dcmpstat/libsrc/dvpsall.cc dcmpstat/libsrc/dvpscul.cc dcmpstat/libsrc/dvpsdal.cc dcmpstat/libsrc/dvpsgal.cc dcmpstat/libsrc/dvpsgll.cc dcmpstat/libsrc/dvpsgrl.cc dcmpstat/libsrc/dvpsibl.cc dcmpstat/libsrc/dvpsovl.cc dcmpstat/libsrc/dvpspll.cc dcmpstat/libsrc/dvpsril.cc dcmpstat/libsrc/dvpsrsl.cc dcmpstat/libsrc/dvpsspl.cc dcmpstat/libsrc/dvpssvl.cc dcmpstat/libsrc/dvpstxl.cc dcmpstat/libsrc/dvpsvll.cc dcmpstat/libsrc/dvpsvwl.cc **** Changes from 2003.06.11 (eichelberg) - Updated MSVC5 project files Affects: ofstd/ofstd.dsp dcmtk.dsw - Cleaned up usage of boolean constants Affects: dcmimage/apps/dcm2pnm.cc ofstd/include/oflogfil.h - Fixed configure test for std::ios_base::openmode Affects: config/acconfig.h config/configure config/configure.in config/include/cfunix.h.in config/include/cfwin32.h ofstd/libsrc/oflogfil.cc - Added support for configuration file based association negotiation profiles Affects: dcmnet/apps/Makefile.dep dcmnet/apps/storescp.cc dcmnet/apps/storescu.cc dcmnet/docs/storescp.txt dcmnet/docs/storescu.txt - Extended documentation, fixed typos Affects: dcmnet/apps/storescu.cc dcmnet/docs/storescu.txt **** Changes from 2003.06.10 (eichelberg) - Added configure test for TCP wrapper library (libwrap) Affects: config/Makefile.def.in config/acconfig.h config/configure config/configure.in config/include/cfunix.h.in config/include/cfwin32.h INSTALL - Updated Makefiles for linking against the TCP wrapper library Affects: dcmnet/apps/Makefile.in dcmpstat/apps/Makefile.in dcmwlm/apps/Makefile.in imagectn/apps/Makefile.in - Added support for TCP wrappers in DICOM network layer Affects: dcmnet/include/dul.h dcmnet/include/cond.h dcmnet/libsrc/dul.cc - Replaced unnamed C style structs by C++ declarations Affects: dcmnet/include/assoc.h - Added support for TCP wrappers based host access control Affects: dcmnet/apps/movescu.cc dcmnet/apps/storescp.cc dcmnet/docs/movescu.txt dcmnet/docs/storescp.txt dcmwlm/apps/wlcefs.cc dcmwlm/docs/wlcefs.txt imagectn/apps/imagectn.cc imagectn/docs/imagectn.txt - Added option to create unique filenames, even if receiving the same SOP instance multiple times. Exec options now allow to pass the calling and called aetitle on the command line. Affects: dcmnet/apps/storescp.cc - Initial release of class DcmAssociationConfiguration and support classes. This class maintains a list of association negotiation profiles that can be addressed by symbolic keys. The profiles may be read from a configuration file. Affects: dcmnet/libsrc/Makefile.in dcmnet/libsrc/Makefile.dep Added: dcmnet/include/dcasccff.h dcmnet/include/dcasccfg.h dcmnet/include/dccfenmp.h dcmnet/include/dccfpcmp.h dcmnet/include/dccfprmp.h dcmnet/include/dccfrsmp.h dcmnet/include/dccftsmp.h dcmnet/include/dccfuidh.h dcmnet/include/dcmsmap.h dcmnet/libsrc/dcasccff.cc dcmnet/libsrc/dcasccfg.cc dcmnet/libsrc/dccfenmp.cc dcmnet/libsrc/dccfpcmp.cc dcmnet/libsrc/dccfprmp.cc dcmnet/libsrc/dccfrsmp.cc dcmnet/libsrc/dccftsmp.cc dcmnet/libsrc/dccfuidh.cc **** Changes from 2003.06.06 (eichelberg) - Introduced global flag dcmExternalSocketHandle which allows to pass an already opened socket file descriptor to dcmnet. Thanks to Markus Sabin for the suggestion. Affects: dcmnet/include/dul.h dcmnet/libsrc/dul.cc - Added configure tests for bool and volatile keywords Affects: config/acconfig.h config/aclocal.m4 config/configure config/configure.in config/confmod config/include/cfunix.h.in config/include/cfwin32.h - Added volatile keyword to data pointers in multi-thread wrapper classes Affects: ofstd/include/ofthread.h - Added static sleep function in class OFStandard. This replaces the various calls to sleep(), Sleep() and usleep() throughout the toolkit. Affects: dcmnet/apps/movescu.cc dcmnet/apps/storescp.cc dcmnet/include/dcompat.h dcmpstat/apps/dcmprscu.cc dcmwlm/libsrc/wlmactmg.cc ofstd/include/ofstd.h ofstd/libsrc/ofstd.cc ofstd/tests/tstthred.cc **** Changes from 2003.06.04 (eichelberg) - Added dummy comparison operators, needed by MSVC5 with STL Affects: ofstd/include/ofconfig.h - Added comparison operators, needed by MSVC5 with STL Affects: dcmsr/include/dsrscogr.h dcmsr/include/dsrwavch.h - Added various includes needed by MSVC5 with STL Affects: dcmpstat/libsrc/dviface.cc dcmpstat/libsrc/dvpsall.cc dcmpstat/libsrc/dvpsda.cc dcmpstat/libsrc/dvpsdal.cc dcmpstat/libsrc/dvpsfs.cc dcmpstat/libsrc/dvpsga.cc dcmpstat/libsrc/dvpsgal.cc dcmpstat/libsrc/dvpsgll.cc dcmpstat/libsrc/dvpsib.cc dcmpstat/libsrc/dvpspll.cc dcmpstat/libsrc/dvpsprt.cc dcmpstat/libsrc/dvpsril.cc dcmpstat/libsrc/dvpsrs.cc dcmpstat/libsrc/dvpsrsl.cc dcmpstat/libsrc/dvpssp.cc dcmpstat/libsrc/dvpsspl.cc dcmpstat/libsrc/dvpssv.cc dcmpstat/libsrc/dvpssvl.cc dcmpstat/libsrc/dvpstat.cc dcmpstat/libsrc/dvpsvl.cc dcmwlm/libsrc/wlds.cc dcmwlm/libsrc/wlmactmg.cc - Fixed incorrect include Affects: dcmimgle/libsrc/dcmimage.cc - Replaced private inheritance from template with aggregation Affects: dcmpstat/include/dvpsabl.h dcmpstat/include/dvpsall.h dcmpstat/include/dvpscul.h dcmpstat/include/dvpsdal.h dcmpstat/include/dvpsgal.h dcmpstat/include/dvpsgll.h dcmpstat/include/dvpsgrl.h dcmpstat/include/dvpsibl.h dcmpstat/include/dvpsovl.h dcmpstat/include/dvpspll.h dcmpstat/include/dvpsril.h dcmpstat/include/dvpsrsl.h dcmpstat/include/dvpsspl.h dcmpstat/include/dvpssvl.h dcmpstat/include/dvpstxl.h dcmpstat/include/dvpsvll.h dcmpstat/include/dvpsvwl.h dcmpstat/libsrc/dvpsabl.cc dcmpstat/libsrc/dvpsall.cc dcmpstat/libsrc/dvpscul.cc dcmpstat/libsrc/dvpsdal.cc dcmpstat/libsrc/dvpsgal.cc dcmpstat/libsrc/dvpsgll.cc dcmpstat/libsrc/dvpsgrl.cc dcmpstat/libsrc/dvpsibl.cc dcmpstat/libsrc/dvpsovl.cc dcmpstat/libsrc/dvpspll.cc dcmpstat/libsrc/dvpsril.cc dcmpstat/libsrc/dvpsrsl.cc dcmpstat/libsrc/dvpsspl.cc dcmpstat/libsrc/dvpssvl.cc dcmpstat/libsrc/dvpstxl.cc dcmpstat/libsrc/dvpsvll.cc dcmpstat/libsrc/dvpsvwl.cc - Replaced protected inheritance from OFList with protected aggregation Affects: dcmsr/include/dsrtlist.h dcmsr/libsrc/dsrimgfr.cc dcmsr/libsrc/dsrscogr.cc dcmsr/libsrc/dsrtcodt.cc dcmsr/libsrc/dsrtcosp.cc dcmsr/libsrc/dsrtcoto.cc dcmsr/libsrc/dsrwavch.cc - Cleaned up usage of boolean constants Affects: dcmdata/libsrc/dcvr.cc dcmnet/libsrc/dimse.cc dcmnet/libsrc/dulfsm.cc - Simplified include structure to avoid preprocessor limitation (max 32 #if levels) on MSVC5 with STL. Affects: dcmsign/include/dcsignat.h dcmsign/include/sialgo.h dcmsign/include/siautopr.h dcmsign/include/sibrsapr.h dcmsign/include/sicert.h dcmsign/include/sicertvf.h dcmsign/include/sicreapr.h dcmsign/include/sidsa.h dcmsign/include/simac.h dcmsign/include/simaccon.h dcmsign/include/simd5.h dcmsign/include/sinullpr.h dcmsign/include/siprivat.h dcmsign/include/siripemd.h dcmsign/include/sirsa.h dcmsign/include/sisha1.h dcmsign/include/sisprof.h dcmsign/include/sitstamp.h dcmsr/libsrc/dsrcodtn.cc dcmsr/libsrc/dsrcodvl.cc dcmsr/libsrc/dsrcomtn.cc dcmsr/libsrc/dsrcomvl.cc dcmsr/libsrc/dsrcontn.cc dcmsr/libsrc/dsrdattn.cc dcmsr/libsrc/dsrdtitn.cc dcmsr/libsrc/dsrimgfr.cc dcmsr/libsrc/dsrimgtn.cc dcmsr/libsrc/dsrnumtn.cc dcmsr/libsrc/dsrpnmtn.cc dcmsr/libsrc/dsrreftn.cc dcmsr/libsrc/dsrscogr.cc dcmsr/libsrc/dsrscotn.cc dcmsr/libsrc/dsrtcodt.cc dcmsr/libsrc/dsrtcosp.cc dcmsr/libsrc/dsrtcotn.cc dcmsr/libsrc/dsrtcoto.cc dcmsr/libsrc/dsrtextn.cc dcmsr/libsrc/dsrtimtn.cc dcmsr/libsrc/dsruidtn.cc dcmsr/libsrc/dsrwavch.cc dcmsr/libsrc/dsrwavtn.cc - Updated MSVC project files Affects: dcmpstat/dcmpstat.dsp - Updated flex++ skeleton files to avoid warnings on gcc 3.x Affects: dcmpstat/apps/vrscan.cc dcmpstat/apps/vrscan.h **** Changes from 2003.06.03 (eichelberg) - Added include for dcdicent.h, needed by MSVC5 with STL Affects: dcmimgle/libsrc/dcmimage.cc - Renamed local variables to avoid name clashes with STL Affects: dcmdata/include/dchashdi.h dcmsr/include/dsrimgfr.h dcmsr/include/dsrscogr.h dcmsr/include/dsrtcodt.h dcmsr/include/dsrtcosp.h dcmsr/include/dsrtcoto.h dcmsr/include/dsrtlist.h dcmsr/include/dsrwavch.h dcmsr/libsrc/dsrimgfr.cc dcmsr/libsrc/dsrscogr.cc dcmsr/libsrc/dsrtcodt.cc dcmsr/libsrc/dsrtcosp.cc dcmsr/libsrc/dsrtcoto.cc dcmsr/libsrc/dsrwavch.cc imagectn/libsrc/dbutils.cc - OFList now explicitly defined as std::list if std namespace present Affects: ofstd/include/oflist.h **** Changes from 2003.06.02 (riesmeier) - Fixed bug in optimization criterion which caused dcmimgle to ignore the "start frame" parameter in the DicomImage constructors under certain circumstances. Thanks to Herve Baekeland for the bug report. Affects: dcmimgle/include/dimoipxt.h - Added include statement for "diutils.h". Affects: dcmimgle/include/ditranst.h - Added $(TIFFLIBS) and $(PNGLIBS) to LOCALLIBS to avoid problems with shared object compilation. Thanks to Markus Mertens for the bug report. Affects: dcmimage/apps/Makefile.in dcmjpeg/apps/Makefile.in - Added new helper function DcmItem::findAndCopyElement(). Affects: dcmdata/include/dcitem.h dcmdata/libsrc/dcitem.cc - Fixed bug in findAndDelete() implementation. Affects: dcmdata/libsrc/dcitem.cc - Added explicit support for class DcmPixelData to putAndInsertUintXXArray(). Affects: dcmdata/libsrc/dcitem.cc - Changed implementation of findAndGetXXXArray() to avoid problems with MSVC5. Affects: dcmdata/libsrc/dcitem.cc **** Changes from 2003.06.02 (eichelberg) - Updated MSVC project files Affects: dcmdata/dcmdata.dsp - Renamed local variables to avoid name clashes with STL Affects: dcmdata/include/dcitem.h dcmdata/libsrc/dchashdi.cc dcmnet/apps/storescu.cc dcmnet/include/dul.h dcmnet/include/extneg.h dcmnet/include/lst.h dcmnet/libsrc/assoc.cc dcmnet/libsrc/dimcmd.cc dcmnet/libsrc/dimse.cc dcmnet/libsrc/dul.cc dcmnet/libsrc/dulconst.cc dcmnet/libsrc/dulfsm.cc dcmnet/libsrc/extneg.cc dcmnet/libsrc/lst.cc - Cleaned up implementation of DcmStack, added doc++ comments Affects: dcmdata/include/dcstack.h dcmdata/libsrc/dcstack.cc - Cleaned up implementation of DcmRepresentationEntry, added doc++ comments Affects: dcmdata/include/dcpixel.h dcmdata/libsrc/dcpixel.cc - Added typedef needed by MSVC5 when compiling with STL support Affects: dcmdata/include/dchashdi.h **** Changes from 2003.05.20 (riesmeier) - Renamed parameters/variables "string" to avoid name clash with STL class. Affects: ofstd/include/ofcmdln.h ofstd/libsrc/ofcmdln.cc - Enhanced use of OFString routines. Affects: ofstd/libsrc/ofcmdln.cc - Added support for SOP Class "Chest CAD SR" (Supplement 65). Affects: dcmdata/apps/dcmgpdir.cc dcmdata/include/dcuid.h dcmdata/libsrc/dcuid.cc dcmnet/docs/movescu.txt dcmnet/docs/storescp.txt dcmnet/docs/storescu.txt imagectn/docs/imagectn.txt - Minor code corrections. Affects: dcmdata/apps/xml2dcm.cc - Added methods and static functions to compose a DICOM Person Name from five name components. Affects: dcmdata/include/dcvrpn.h dcmdata/libsrc/dcvrpn.cc - Added new helper methods: findAndGetElement(), findAndGetUint32Array(), findAndGetSint32Array(), findAndGetFloat64Array(), findAndDeleteElement(). Affects: dcmdata/include/dcitem.h dcmdata/libsrc/dcitem.cc - Enhanced findAndGetSequenceItem() and findOrCreateSequenceItem() by checking the return value of ident() - avoids crashes when applied to non-sequence elements. Affects: dcmdata/include/dcitem.h dcmdata/libsrc/dcitem.cc - Removed unused helper functions. Affects: dcmdata/libsrc/Makefile.dep dcmdata/libsrc/Makefile.in dcmimage/apps/Makefile.dep dcmimage/apps/dcm2pnm.cc dcmimage/apps/dcmquant.cc dcmjpeg/apps/Makefile.dep Removed: dcmdata/include/dcutils.h dcmdata/libsrc/dcutils.cc - Added new configuration/compatibility flag that allows to ignore the modality transform stored in the dataset. Affects: dcmimgle/include/diutils.h dcmimgle/libsrc/dimomod.cc dcmimage/apps/dcm2pnm.cc dcmimage/docs/dcm2pnm.txt dcmjpeg/docs/dcmj2pnm.txt - Added method returning the number of bytes required to store a single rendered frame: getOutputDataSize(). Affects: dcmimgle/include/dcmimage.h dcmimgle/include/diimage.h dcmimgle/include/dimoimg.h dcmimgle/libsrc/dimoimg dcmimage/include/dicoimg.h dcmimage/libsrc/dicoimg.cc **** Changes from 2003.05.14 (riesmeier) - Fixed bug in OFString::find_first_of(). Affects: ofstd/libsrc/ofstring.cc **** Changes from 2003.05.13 (eichelberg) - Fixed minor issue in AC_CHECK_INTP_SELECT configure macro Affects: config/aclocal.m4 config/configure config/configure.in **** Changes from 2003.05.12 (eichelberg) - Fixed off-by-one bug in for loop Affects: ofstd/libsrc/ofconfig.cc - Added systems to private dictionary: Swissvision TR4000, Philips Digital Diagnost 1.3, Fuji CR console, 3rd release Affects: dcmdata/libsrc/private.dic - Fixed formatting bug in dumpExtNegList() Affects: dcmnet/libsrc/dul.cc **** Changes from 2003.04.29 (eichelberg) - Moved configuration file parser from module dcmpstat to ofstd and renamed class to OFConfigFile. Cleaned up implementation (no more friend declarations). Affects: dcmpstat/apps/Makefile.dep dcmpstat/include/dviface.h dcmpstat/include/dvpscf.h dcmpstat/libsrc/Makefile.dep dcmpstat/libsrc/Makefile.in dcmpstat/libsrc/dviface.cc dcmpstat/libsrc/dvpscf.cc ofstd/libsrc/Makefile.dep ofstd/libsrc/Makefile.in ofstd/tests/Makefile.dep Added: ofstd/include/ofconfig.h ofstd/libsrc/ofconfig.cc Removed: dcmpstat/libsrc/include/dvpsconf.h dcmpstat/libsrc/libsrc/dvpsconf.cc **** Changes from 2003.04.25 (riesmeier) - Fixed inconsistency regarding the default option for frame selection. Affects: dcmimage/apps/dcmquant.cc dcmimage/docs/dcmquant.txt - Minor correction: explicitly specify query information model in the example. Affects: dcmnet/docs/findscu.txt - Added missing command line option --no-sq-expansion (-nse). Affects: dcmwlm/docs/wlmscpfs.txt - Reformatted text (replaced tabs by spaces, etc.) and fixed typos. Affects: imagectn/docs/configrc.txt - Fixed memory leak in readPeerList(). Corrected debug output of parse routines. Thanks to Stefan Vogel for the bug report and fix. Affects: imagectn/apps/cnfpriv.cc **** Changes from 2003.04.22 (eichelberg) - Updated FAQ Affects: FAQ **** Changes from 2003.04.22 (riesmeier) - Adapted code to also compile trouble-free without libxml support (report a message that libxml library is required). Affects: dcmdata/apps/xml2dcm.cc - Added new command line option which allows to embed the content of the DTD instead of referencing the DTD file. Affects: dcmdata/apps/dcm2xml.cc dcmdata/docs/dcm2xml.txt dcmdata/include/dctypes.h dcmdata/libsrc/dctypes.cc - Rebuilt makefile dependencies. Affects: dcmdata/apps/Makefile.dep **** Changes from 2003.04.17 (riesmeier) - Replace LF and CR by and in XML mode instead of ¶ (para). Affects: ofstd/include/ofstd.h ofstd/libsrc/ofstd.cc dcmsr/include/dsrtypes.h - Enhanced performance of base64 encoder and decoder routines. Affects: ofstd/libsrc/ofstd.cc - Enhanced performance of find routines. Affects: ofstd/libsrc/ofstring.cc - Corrected API documentation of createUint8/16Array() methods. Affects: dcmdata/include/dcpixel.h - Use method OFString::c_str() instead of OFString::operator[] to avoid range checking (which implies an "expensive" strlen() call). Affects: dcmdata/libsrc/dcvrobow.cc - Added new command line tool that allows to convert an XML document to DICOM file or dataset. Affects: dcmdata/apps/Makefile.in Added: dcmdata/apps/xml2dcm.cc dcmdata/docs/xml2dcm.txt - Modified DTD: use #PCDATA instead of CDATA for element "element". Affects: dcmdata/apps/dcm2xml.dtd - Added support for libxml. Affects: INSTALL config/Makefile.def.in config/acconfig.h config/configure config/configure.in config/include/cfunix.h.in config/include/cfwin32.h **** Changes from 2003.04.14 (eichelberg) - Added explicit typecasts in calls to pow(). Needed by Visual C++ .NET 2003. Thanks to Peter Klotz for the bug report and fix. Affects: dcmimgle/libsrc/didispfn.cc dcmimgle/libsrc/digsdfn.cc dcmimgle/libsrc/dimoimg.cc dcmpstat/apps/dcmmklut.cc dcmpstat/libsrc/dvpssp.cc dcmpstat/libsrc/dvpstat.cc **** Changes from 2003.04.03 (riesmeier) - Fixed bug introduced in the context of the new createUint8/16Array() methods. Affects: dcmdata/libsrc/dcpixel.cc **** Changes from 2003.04.01 (riesmeier) - Added implementation of createUint8/16Array() methods to DcmPixelData. Required to work properly with chooseRepresentation() for pixel compression. Thanks to Rick H. for the original problem report. Affects: dcmdata/include/dcpixel.h dcmdata/libsrc/dcpixel.cc - Added support for XML namespaces. Affects: dcmdata/apps/dcm2xml.cc dcmdata/docs/dcm2xml.txt dcmdata/include/dctypes.h dcmdata/libsrc/dcdatset.cc dcmdata/libsrc/dcfilefo.cc dcmdata/libsrc/dctypes.cc dcmsr/apps/dsr2xml.cc dcmsr/docs/dsr2xml.txt dcmsr/include/dsrtypes.h dcmsr/libsrc/dsrdoc.cc dcmsr/libsrc/dsrtypes.cc **** Changes from 2003.03.25 (riesmeier) - Fixed bug in print method: wrong position of setw() operators. Thanks to Syam Gadde for the bug report and fix. Affects: dcmdata/libsrc/dcvrat.cc **** Changes from 2003.03.21 (eichelberg) - Minor code purifications for warnings reported by MSVC in Level 4 Affects: dcmdata/include/dcdatset.h dcmdata/include/dchashdi.h dcmdata/include/dcmetinf.h dcmdata/include/dcrleccd.h dcmdata/include/dcrlecce.h dcmdata/include/dcrledec.h dcmdata/include/dcrledrg.h dcmdata/include/dcrleenc.h dcmdata/include/dcrleerg.h dcmdata/include/dcvr.h dcmdata/libsrc/dcdict.cc dcmdata/libsrc/dcdirrec.cc dcmdata/libsrc/dcelem.cc dcmdata/libsrc/dcfilefo.cc dcmdata/libsrc/dchashdi.cc dcmdata/libsrc/dcitem.cc dcmdata/libsrc/dcpixel.cc dcmdata/libsrc/dcpixseq.cc dcmdata/libsrc/dcrleccd.cc dcmdata/libsrc/dcrlecce.cc dcmdata/libsrc/dctag.cc dcmdata/libsrc/dcuid.cc dcmdata/libsrc/dcvr.cc ofstd/libsrc/ofstd.cc **** Changes from 2003.03.14 (eichelberg) - Enabled TLS network connections in findscu Affects: dcmnet/apps/Makefile.dep dcmnet/apps/Makefile.in dcmnet/apps/findscu.cc dcmnet/apps/findscu.dsp dcmnet/docs/findscu.txt dcmtk.dsw **** Changes from 2003.03.12 (eichelberg) - Updated DcmObject::print() flags Affects: dcmdata/apps/dcmgpdir.cc dcmnet/libsrc/dimdump.cc dcmpstat/apps/dcmpschk.cc dcmpstat/libsrc/dvpsfs.cc dcmpstat/libsrc/dvpsib.cc dcmpstat/libsrc/dvpspl.cc dcmpstat/libsrc/dvpssp.cc **** Changes from 2003.03.12 (riesmeier) - Fixed bug in GSDF calibration routines. Ambient light value was added twice in case of OD input data (i.e. for hardcopy devices). Thanks to Gilles Mevel for the bug report. Affects: dcmimgle/libsrc/digsdfn.cc - Removed default value from parameter "useAmb" in method convertODtoLumTable. Affects: dcmimgle/include/didispfn.h - Added apostrophe (') to the list of characters to be replaced by the corresponding HTML/XML mnenonic. Affects: ofstd/include/ofstd.h ofstd/libsrc/ofstd.cc **** Changes from 2003.02.17 (wilkens) - Made some minor modifications to be able to modify a special variant of the worklist SCP implementation (wlmscpki). Affects: dcmwlm/apps/wlcefs.cc dcmwlm/include/wlds.h dcmwlm/libsrc/wlds.cc dcmwlm/libsrc/wldsfs.cc **** Changes from 2003.02.12 (riesmeier) - Added Dmin/max support to CIELAB calibration routines. Affects: dcmimgle/apps/dcmdspfn.cc dcmimgle/docs/dcmdspfn.txt dcmimgle/include/dicielut.h dcmimgle/include/didispfn.h dcmimgle/include/digsdfn.h dcmimgle/libsrc/diciefn.cc dcmimgle/libsrc/dicielut.cc dcmimgle/libsrc/didispfn.cc dcmimgle/libsrc/digsdfn.cc dcmimgle/libsrc/digsdlut.cc - Defined default file extension for PNG image format. Affects: dcmimage/apps/dcm2pnm.cc - Introduced "enum" for output file type. Affects: dcmimage/apps/dcm2pnm.cc **** Changes from 2003.02.11 (eichelberg) - Fixed overwrite problem caused by last commit. Affects: dcmimage/apps/dcm2pnm.cc dcmimage/docs/dcm2pnm.txt dcmjpeg/docs/dcmj2pnm.txt - Updated MSVC project files for OpenSSL 0.9.6h. Affects: dcmnet/apps/echoscu.dsp dcmnet/apps/storescp.dsp dcmnet/apps/storescu.dsp dcmpstat/dcmpstat.dsp dcmpstat/apps/dcmp2pgm.dsp dcmpstat/apps/dcmprscp.dsp dcmpstat/apps/dcmprscu.dsp dcmpstat/apps/dcmpsprt.dsp dcmpstat/apps/dcmpsrcv.dsp dcmpstat/apps/dcmpssnd.dsp dcmsign/dcmsign.dsp dcmsign/apps/dcmsign_app.dsp dcmtls/dcmtls.dsp - Added libpng support to MSVC project files. Affects: dcmimage/dcmimage.dsp dcmimage/apps/dcm2pnm.dsp dcmjpeg/apps/dcmj2pnm.dsp - Added PNG export option to dcm2pnm and dcmj2pnm. Thanks to Alexander Haderer for the contribution. Affects: dcmimage/apps/Makefile.in dcmimage/apps/dcm2pnm.cc dcmimage/docs/dcm2pnm.txt dcmimage/libsrc/Makefile.in dcmjpeg/apps/Makefile.in dcmjpeg/docs/dcmj2pnm.txt Added: dcmimage/include/dipipng.h dcmimage/libsrc/dipipng.cc - Added --with-libpng flag to configure system. Thanks to Alexander Haderer for the contribution. Affects: config/Makefile.def.in config/acconfig.h config/configure config/configure.in config/include/cfunix.h.in config/include/cfwin32.h INSTALL **** Changes from 2003.02.11 (riesmeier) - Added support for Dmin/max to calibration routines (required for printers). Affects: dcmimgle/apps/dcmdspfn.cc dcmimgle/docs/dcmdspfn.txt dcmimgle/include/didispfn.h dcmimgle/include/digsdfn.h dcmimgle/include/digsdlut.h dcmimgle/libsrc/didispfn.cc dcmimgle/libsrc/digsdfn.cc dcmimgle/libsrc/digsdlut.cc dcmimage/apps/dcm2pnm.cc dcmimage/docs/dcm2pnm.txt dcmjpeg/docs/dcmj2pnm.txt - Added two new functions to determine the luminance/OD value of a particular DDL according to the device's characteristic curve and vice versa. Affects: dcmimgle/apps/dcmdspfn.cc dcmimgle/include/didispfn.h dcmimgle/libsrc/didispfn.cc - Removed debug/test code. Affects: dcmimgle/apps/dcmdspfn.cc - Added note on --write-png option. Affects: dcmjpeg/docs/dcmj2pnm.txt **** Changes from 2003.01.31 (wilkens) - Fixed bug in ti application (option named "--config" and "--config-file"). Thanks to Eike Rietzel for the bug report. Affects: imagectn/apps/ti.cc **** Changes from 2003.01.23 (wilkens) - Fixed inconsistencies in comments. Affects: dcmdata/libsrc/dicom.dic **** Changes from 2003.01.08 (riesmeier) - Fixed typo (missing closing bracket). Affects: dcmdata/apps/dcmconv.cc dcmdata/docs/dcmconv.txt **** Changes from 2003.01.06 (riesmeier) - Moved old announcement and change log for release 3.5.2 to docs. Removed: ANNOUNCE.352 CHANGES.352 Added: docs/ANNOUNCE.352 docs/CHANGES.352 - Created new change log. Added: CHANGES.353 - Performed minor text corrections to get a more consistent print() output. Affects: dcmdata/libsrc/dcpixseq.cc dcmdata/libsrc/dcsequen.cc - Updated URL to dcmtk homepage. Affects: dcmsr/libsrc/dsrdoc.cc - Updated URL to OFFIS DICOM homepage. Affects: HISTORY dcmtk-3.6.0/docs/DCMIMAGE.11X0000644000310500011400000010110307307355565014443 0ustar joergrdicom3 Changes between releases are documented here. **** Changes from 2000.12.13 (eichelberg) - Introduced configure test for -lm which is not present on all platforms but required on some. Affects: dcmimage/apps/Makefile.in **** Changes from 2000.12.08 (riesmeier) - Added new checking routines to avoid crashes when processing corrupted image data. Affects: dcmimage/include/dicocpt.h dcmimage/include/dicoflt.h dcmimage/include/dicorot.h dcmimage/include/dicosct.h - Rebuilt makefile dependencies. Affects: dcmimage/libsrc/Makefile.dep **** Changes from 2000.07.06 (riesmeier) - Added support for LIN OD presentation LUT shape. Affects: dcmimage/apps/dcm2pnm.cc dcmimage/docs/dcm2pnm.txt **** Changes from 2000.06.09 (riesmeier) - Updated dcm2pnm documentation. Affects: dcmimage/docs/dcm2pnm.txt **** Changes from 2000.06.07 (riesmeier) - Added new command line option to change the polarity. Affects: dcmimage/apps/dcm2pnm.cc - Rebuilt makefile dependencies. Affects: dcmimage/apps/Makefile.dep dcmimage/libsrc/Makefile.dep **** Changes from 2000.04.28 (riesmeier) - DebugLevel - global for the module - now derived from OFGlobal (MT-safe). Affects: dcmimage/apps/dcm2pnm.cc dcmimage/include/dihsvpxt.h dcmimage/include/diyf2pxt.h dcmimage/include/diyp2pxt.h dcmimage/libsrc/diargimg.cc dcmimage/libsrc/dicoimg.cc dcmimage/libsrc/dicopx.cc dcmimage/libsrc/dipalimg.cc **** Changes from 2000.04.27 (riesmeier) - Dcmimage library code now consistently uses ofConsole for error output. Affects: dcmimage/include/diargpxt.h dcmimage/include/dicmypxt.h dcmimage/include/dihsvpxt.h dcmimage/include/dipalpxt.h dcmimage/include/dirgbpxt.h dcmimage/include/diybrpxt.h dcmimage/include/diyf2img.h dcmimage/include/diyf2pxt.h dcmimage/include/diyp2pxt.h dcmimage/libsrc/diargimg.cc dcmimage/libsrc/dicoimg.cc dcmimage/libsrc/dicopx.cc dcmimage/libsrc/dipalimg.cc - Adapted output method to new behaviour of dcmimgle library supporting the specification of a start frame and the number of frames to be converted. Affects: dcmimage/apps/dcm2pnm.cc **** Changes from 2000.04.14 (eichelberg) - Adapted to changed parameter list for command line class Affects: dcmimage/apps/dcm2pnm.cc **** Changes from 2000.03.30 (riesmeier) - Corrected wrong bit expansion of output pixel data (left shift is not correct). Affects: dcmimage/include/dicoopxt.h dcmimage/libsrc/dicoimg.cc +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ Release 1.1.1 (Release date - 2000-03-10) - Changed Release version and date. Affects: dcmimage/include/diregist.h **** Changes from 2000.03.08 (eichelberg) - Updated copyright header. Affects: dcmimage/*/*.cc dcmimage/*/*.h **** Changes from 2000.03.07 (riesmeier) - Added type cast to make Sun CC 2.0.1 happy. Affects: dcmimage/apps/dcm2pnm.cc **** Changes from 2000.03.03 (eichelberg) - Implemented library support for redirecting error messages into memory instead of printing them to stdout/stderr for GUI applications. See ofstd/include/ofconsol for a description of this feature. Thanks to Markus Mertens for this contribution. Affects: dcmimage/apps/Makefile.dep dcmimage/apps/dcm2pnm.cc dcmimage/include/dihsvpxt.h dcmimage/include/diyf2img.h dcmimage/include/diyf2pxt.h dcmimage/include/diyp2pxt.h dcmimage/libsrc/Makefile.dep dcmimage/libsrc/diargimg.cc dcmimage/libsrc/dicoimg.cc dcmimage/libsrc/dicopx.cc dcmimage/libsrc/dipalimg.cc dcmimage/tests/test.cc **** Changes from 2000.02.29 (eichelberg) - Removed support for VS value representation. This was proposed in CP 101 but never became part of the standard. Affects: dcmimage/apps/Makefile.dep dcmimage/libsrc/Makefile.dep **** Changes from 2000.02.23 (eichelberg) - Corrected macro for Borland C++ Builder 4 workaround. Affects: dcmimage/include/dicoopx.h **** Changes from 2000.02.02 (riesmeier) - Removed space characters before preprocessor directives. Affects: dcmimage/apps/dcm2pnm.cc **** Changes from 2000.02.01 (eichelberg) - Avoiding to include as extern "C" on Borland C++ Builder 4, workaround for bug in compiler header files. Affects: dcmimage/include/dicoopx.h **** Changes from 1999.10.20 (riesmeier) - Added missing generic makefile. Added: dcmimage/docs/Makefile.in **** Changes from 1999.10.08 (riesmeier) - Corrected typo. Handled 'quiet' mode more restrictive. Affects: dcmimage/apps/dcm2pnm.cc **** Changes from 1999.09.30 (riesmeier) - Added missing directory entries to make file. Affects: dcmimage/Makefile.in **** Changes from 1999.09.17 (riesmeier) - Enhanced efficiency of some "for" loops. Affects: dcmimage/include/dicmypxt.h dcmimage/include/dicomot.h dcmimage/include/dicoopxt.h dcmimage/include/dicopxt.h dcmimage/include/dihsvpxt.h dcmimage/include/dipalpxt.h dcmimage/include/dirgbpxt.h dcmimage/include/diybrpxt.h dcmimage/include/diyf2pxt.h dcmimage/include/diyp2pxt.h - Added "htmldocs" directory and an option to the make file to delete all HTML related files ('make distclean'). Added: dcmimage/htmldocs dcmimage/htmldocs/Makefile.in Affects: dcmimage/Makefile.in - Corrected typos and formatting. Affects: dcmimage/apps/dcm2pnm.cc - Rebuild makefile dependencies. Affects: dcmimage/apps/Makefile.dep dcmimage/libsrc/Makefile.dep **** Changes from 1999.09.13 (riesmeier) - Changed (almost) all output commands from C to C++ style (using string streams). Advantage: C++ output routines are type safe and using the same output streams (in this case 'cerr'). Introduced (more or less) consistent format for output messages. Enhanced quiet mode (also warning and error messages are suppressed). Corrected some typos in usage output / changed names of some options. Affects: dcmimage/apps/dcm2pnm.cc **** Changes from 1999.09.10 (riesmeier) - Added support for CIELAB display function. Affects: dcmimage/apps/Makefile.dep dcmimage/apps/dcm2pnm.cc dcmimage/libsrc/Makefile.dep - Added check whether display filename is specified or not to avoid unnecessary warning messages. Affects: dcmimage/apps/dcm2pnm.cc **** Changes from 1999.08.25 (riesmeier) - Added new feature: Allow clipping region to be outside the image (overlapping). Affects: dcmimage/apps/dcm2pnm.cc dcmimage/include/dicoimg.h dcmimage/include/dicosct.h dcmimage/libsrc/dicoimg.cc **** Changes from 1999.08.17 (riesmeier) - Commented unused parameter name to avoid compiler warnings. Affects: dcmimage/include/dicoopxt.h - Removed unused parameter. Affects: dcmimage/include/dicoopxt.h dcmimage/libsrc/dicoimg.cc **** Changes from 1999.07.23 (riesmeier) - Added new interpolation algorithm for scaling. Affects: dcmimage/apps/dcm2pnm.cc - Added command line option '--quiet'. Affects: dcmimage/apps/dcm2pnm.cc - Added support for frame selection. Affects: dcmimage/apps/dcm2pnm.cc - Added support for 2..32 bit pnm/pgm export Affects: dcmimage/apps/dcm2pnm.cc - Enhanced handling of corrupted pixel data (wrong length). Affects: dcmimage/libsrc/dicoimg.cc dcmimage/libsrc/dicoopx.cc dcmimage/include/dicoopx.h dcmimage/include/dicoopxt.h - Removed inline method 'removeSign'which is no longer needed. Affects: dcmimage/include/dicopxt.h +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ Release 1.1.0 (Release date - 1999-05-31) - Changed Release version and date. Affects: dcmimage/include/diregist.h - Modified some command line options. Affects: dcmimage/apps/dcm2pnm.cc - Corrected bug concerning the conversion of color images to grayscale. Affects: dcmimage/include/dicomot.h dcmimage/libsrc/diregist.cc **** Changes from 1999.05.10 (riesmeier) - Moved dcm2pnm version definition from module dcmimgle to dcmimage. Affects: dcmimage/apps/dcm2pnm.cc dcmimage/include/diregist.h **** Changes from 1999.05.03 (riesmeier) - Minor code purifications to keep Sun CC 2.0.1 quiet. Affects: dcmimage/include/dipalpxt.h dcmimage/libsrc/dicoimg.cc **** Changes from 1999.04.30 (eichelberg) - Minor code purifications to keep IBM xlC quiet Affects: dcmimage/include/dicoopxt.h **** Changes from 1999.04.29 (eichelberg) - Linking all tools that use dcmimgle with -lm, required on OSF1. Affects: dcmimage/apps/Makefile.in **** Changes from 1999.04.29 (riesmeier) - Moved color related image files back to non-public part. Affects: dcmimage/libsrc/Makefile.dep dcmimage/libsrc/Makefile.in Added: dcmimage/include/dicoopx.h dcmimage/include/dicoopxt.h dcmimage/include/dicopx.h dcmimage/libsrc/dicoopx.cc **** Changes from 1999.04.28 (riesmeier) - Merged change log for module dcmimgle into main change log. Removed entries from change file for module dcmimage. Affects: dcmimage/CHANGES - Introduced new scheme for the debug level variable: now each level can be set separately (there is no "include" relationship). Affects: dcmimage/include/dihsvpxt.h dcmimage/include/diyf2pxt.h dcmimage/include/diyp2pxt.h dcmimage/libsrc/diargimg.cc dcmimage/libsrc/dicoimg.cc dcmimage/libsrc/dicopx.cc dcmimage/libsrc/dipalimg.cc - Corrected some typos, comments and formatting. Affects: dcmimage/include/diargimg.h dcmimage/include/diargpxt.h dcmimage/include/dicmyimg.h dcmimage/include/dicmypxt.h dcmimage/include/dicocpt.h dcmimage/include/dicoflt.h dcmimage/include/dicoimg.h dcmimage/include/dicomot.h dcmimage/include/dicopxt.h dcmimage/include/dicorot.h dcmimage/include/dicosct.h dcmimage/include/dihsvimg.h dcmimage/include/dipalimg.h dcmimage/include/dipalpxt.h dcmimage/include/dirgbimg.h dcmimage/include/dirgbpxt.h dcmimage/include/diybrimg.h dcmimage/include/diybrpxt.h dcmimage/include/diyf2img.h dcmimage/include/diyp2img.h dcmimage/libsrc/dicmyimg.cc dcmimage/libsrc/dihsvimg.cc dcmimage/libsrc/dirgbimg.cc dcmimage/libsrc/diyf2img.cc dcmimage/libsrc/diyp2img.cc - Moved files to dcmimgle module to support new pastel color output format. Affects: dcmimage/libsrc/Makefile.in Removed: dcmimage/include/dicoopx.h dcmimage/include/dicoopxt.h dcmimage/include/dicopx.h dcmimage/libsrc/dicoopx.cc - Rebuilt Makefile dependencies. Affects: dcmimage/apps/Makefile.dep dcmimage/libsrc/Makefile.dep - Added some checks to avoid dereferencing null pointers. Affects: dcmimage/libsrc/diregist.cc - Added experimental support to create grayscale images with more than 256 shades of gray to be displayed on a consumer monitor (use pastel colors). Affects: dcmimage/libsrc/dcm2pnm.cc - Modified some command line options (not yet finished). Affects: dcmimage/libsrc/dcm2pnm.cc - Adapted console application to new OFCommandline and OFConsoleApplication features. Affects: dcmimage/libsrc/dcm2pnm.cc - Added dcmimgle module to DOC++ search path to create a common HTML document. Affects: dcmimage/Makefile.in **** Changes from 1999.03.24 (riesmeier) - Changed optional integer parameter in method findOption to enum type. Affects: dcmimage/apps/dcm2pnm.cc - Removed debug code. Affects: dcmimage/apps/dcm2pnm.cc - Added/Modified comments and formatting. Affects: dcmimage/libsrc/diregist.cc **** Changes from 1999.03.22 (riesmeier) - Rebuilt Makefile dependencies. Affects: dcmimage/apps/Makefile.dep dcmimage/libsrc/Makefile.dep **** Changes from 1999.02.23 (riesmeier) - Corrected some typos and formatting. Affects: dcmimage/apps/Makefile.in **** Changes from 1999.02.11 (riesmeier) - Rebuilt Makefile dependencies. Affects: dcmimage/apps/Makefile.dep dcmimage/libsrc/Makefile.dep - Added testing routine for new isOutputValueUnused() method. Affects: dcmimage/apps/dcm2pnm.cc **** Changes from 1999.02.08 (riesmeier) - Rebuilt Makefile dependencies. Affects: dcmimage/apps/Makefile.dep - Moved output/checking functionality to new OFConsoleApplication class. Affects: dcmimage/apps/dcm2pnm.cc **** Changes from 1999.02.03 (riesmeier) - Rebuilt Makefile dependencies. Affects: dcmimage/apps/Makefile.dep dcmimage/libsrc/Makefile.dep - Moved global functions maxval() and determineRepresentation() to class DicomImageClass (as static methods). Affects: dcmimage/include/diargpxt.h dcmimage/include/dicmypxt.h dcmimage/include/dihsvpxt.h dcmimage/include/dirgbpxt.h dcmimage/include/diybrpxt.h dcmimage/include/diyf2pxt.h dcmimage/include/diyp2pxt.h dcmimage/libsrc/dicoimg.cc - Added new option to select a display file (for calibration). Affects: dcmimage/apps/dcm2pnm.cc - Added BEGIN_EXTERN_C and END_EXTERN_C to some C includes. Affects: dcmimage/include/dicoopx.h **** Changes from 1999.01.20 (riesmeier) - Rebuilt Makefile dependencies. Affects: dcmimage/apps/Makefile.dep dcmimage/libsrc/Makefile.dep - Added debug code to measure time of some routines. Affects: dcmimage/apps/dcm2pnm.cc - Changed default value for compatibility flag. Affects: dcmimage/apps/dcm2pnm.cc - Replaced invocation of getCount() by member variable Count where possible. Affects: dcmimage/include/diargpxt.h dcmimage/include/dicmypxt.h dcmimage/include/dicomot.h dcmimage/include/dicoopx.h dcmimage/include/dicoopxt.h dcmimage/include/dihsvpxt.h dcmimage/include/dipalpxt.h dcmimage/include/dirgbpxt.h dcmimage/include/diybrpxt.h dcmimage/include/diyf2pxt.h dcmimage/include/diyp2pxt.h dcmimage/libsrc/dicoopx.cc - Corrected some typos and formatting. Affects: dcmimage/include/dicocpt.h dcmimage/include/dicopx.h dcmimage/include/dicopxt.h - Added new output method to fill external memory buffer with rendered pixel data. Affects: dcmimage/include/dicoimg.h dcmimage/include/dicoopxt.h dcmimage/libsrc/dicoimg.cc **** Changes from 1998.12.22 (riesmeier) - Corrected spelling of option used for scaling without interpolation. Use presentation LUT shape only when set explicitly. Affects: dcmimage/apps/dcm2pnm.cc - Added comments that the routines for expanding pixel's depth have to be enhanced in the future (replicate bit pattern instead of shifting). Same question for reducing depth. Affects: dcmimage/include/dicoopxt.h **** Changes from 1998.12.16 (riesmeier) - Rebuilt Makefile dependencies. Affects: dcmimage/apps/Makefile.dep dcmimage/libsrc/Makefile.dep - Added (debug) code to test new explanation strings and export of overlay planes. Affects: dcmimage/apps/dcm2pnm.cc **** Changes from 1998.12.14 (riesmeier) - Rebuilt Makefile dependencies. Affects: dcmimage/apps/Makefile.dep dcmimage/libsrc/Makefile.dep - Changed behaviour of debug and verbose mode. Affects: dcmimage/apps/dcm2pnm.cc - Added support for presentation shapes. Affects: dcmimage/apps/dcm2pnm.cc - Added support for signed values as second entry in look-up tables (= first value mapped). Affects: dcmimage/include/diargpxt.h dcmimage/include/dipalpxt.h dcmimage/libsrc/diargimg.cc dcmimage/libsrc/dipalimg.cc - Added implementation of method to create rotated color images. Affects: dcmimage/libsrc/dicoimg.cc **** Changes from 1998.11.30 (riesmeier) - Inserted newlines in the description of command line arguments to avoid ugly line breaks. Affects: dcmimage/apps/dcm2pnm.cc **** Changes from 1998.11.27 (riesmeier) - Splitted module into two parts: dcmimgle (light edition) for monochrome images and dcmimage (including dcm2pnm) for color images. Added registration class to allow easy combination of both modules. Affects: dcmimage/apps/Makefile.dep dcmimage/apps/Makefile.in dcmimage/apps/dcm2pnm.cc dcmimage/libsrc/Makefile.dep dcmimage/libsrc/Makefile.in modules/modules Added: dcmimage/include/diregist.h dcmimage/libsrc/diregist.cc Removed: dcmimage/include/dcmimage.h dcmimage/include/diclipt.h dcmimage/include/dicoclt.h dcmimage/include/didocu.h dcmimage/include/diimage.h dcmimage/include/diinpx.h dcmimage/include/diluptab.h dcmimage/include/dimo1img.h dcmimage/include/dimo2img.h dcmimage/include/dimoimg.h dcmimage/include/dimoipxt.h dcmimage/include/dimomod.h dcmimage/include/dimoopx.h dcmimage/include/dimoopxt.h dcmimage/include/dimopx.h dcmimage/include/dimopxt.h dcmimage/include/dimosct.h dcmimage/include/diobjcou.h dcmimage/include/diovlay.h dcmimage/include/diovlimg.h dcmimage/include/diovpln.h dcmimage/include/dipxrept.h dcmimage/include/discalet.h dcmimage/include/ditranst.h dcmimage/include/diutils.h dcmimage/libsrc/dcmimage.cc dcmimage/libsrc/didocu.cc dcmimage/libsrc/diimage.cc dcmimage/libsrc/diinpx.cc dcmimage/libsrc/diluptab.cc dcmimage/libsrc/dimo1img.cc dcmimage/libsrc/dimo2img.cc dcmimage/libsrc/dimoimg.cc dcmimage/libsrc/dimomod.cc dcmimage/libsrc/dimoopx.cc dcmimage/libsrc/dimopx.cc dcmimage/libsrc/diovlay.cc dcmimage/libsrc/diovlimg.cc dcmimage/libsrc/diovpln.cc dcmimage/libsrc/diutils.cc - Added copyright message to all source files. Started with documentation in Doc++ notation. Affects: dcmimage/apps/dcm2pnm.cc dcmimage/include/*.h dcmimage/libsrc/*.cc - Added 'make html' to automatically create a HTML documentation using Doc++. Affects: dcmimage/Makefile.in - Modified tool dcm2pnm to use new command line class. New dcmimage methods supported (flipping, rotating etc.). Affects: dcmimage/apps/dcm2pnm.cc dcmimage/apps/Makefile.dep - Added methods and constructors for flipping and rotating, changed for scaling and clipping. Affects: dcmimage/include/dicoimg.h dcmimage/include/dicoflt.h dcmimage/include/dicorot.h - Replaced delete by delete[] for array types. Affects: dcmimage/include/dicoopxt.h dcmimage/include/dicopxt.h - Added method to directly create java AWT bitmaps. Affects: dcmimage/include/dicopx.h - Added method to give direct (non-const) access to internal data buffer. Affects: dcmimage/include/dicopxt.h - Introduced global debug level for dcmimage module to control error output. Affects: dcmimage/apps/dcm2pnm.cc dcmimage/include/diyf2pxt.h dcmimage/include/diyp2pxt.h dcmimage/libsrc/diargimg.cc dcmimage/libsrc/dicopx.cc dcmimage/libsrc/dipalimg.cc - Renamed variable 'Status' to 'ImageStatus' because of possible conflicts with X windows systems. Affects: dcmimage/libsrc/diargimg.cc dcmimage/libsrc/dicmyimg.cc dcmimage/libsrc/dihsvimg.cc dcmimage/libsrc/dipalimg.cc dcmimage/libsrc/dirgbimg.cc dcmimage/libsrc/diybrimg.cc dcmimage/libsrc/diyf2img.cc dcmimage/libsrc/diyp2img.cc - Added method to detach pixel data if it is no longer needed. Affects: dcmimage/libsrc/dicoimg.cc - Introduced new method and corresponding classes to create a copy of a dcmimage object (optional parameters: frame start and count). Added: dcmimage/include/dicocpt.h - Introduced new pixel base class. Affects: dcmimage/include/dicopx.h dcmimage/libsrc/dicopx.cc - Combined clipping and scaling methods. Affects: dcmimage/include/dicosct.h **** Changes from 1998.07.24 (eichelberg) - Introduced a Makefile variable $(LIBEXT) which defines the file name extension used for libraries ("a" or "so"). Affects: dcmimage/libsrc/Makefile.in **** Changes from 1998.07.01 (riesmeier) - Minor changes to avoid compiler warnings (gcc 2.8.1 with additional options), e.g. add copy constructors. Affects: dcmimage/apps/dcm2pnm.cc dcmimage/libsrc/dcmimage.cc dcmimage/libsrc/diargimg.cc dcmimage/libsrc/didocu.cc dcmimage/libsrc/dipalimg.cc dcmimage/include/dcmimage.h dcmimage/include/diargpxt.h dcmimage/include/dicoimg.h dcmimage/include/dicoopxt.h dcmimage/include/didocu.h dcmimage/include/diimage.h dcmimage/include/diinpxt.h dcmimage/include/diluptab.h dcmimage/include/dimoimg.h dcmimage/include/dimoipxt.h dcmimage/include/dimomod.h dcmimage/include/dimoopxt.h dcmimage/include/dimopx.h dcmimage/include/dimopxt.h dcmimage/include/diovlay.h dcmimage/include/diovpln.h dcmimage/include/dipalpxt.h **** Changes from 1998.06.29 (eichelberg) - Rebuilt Makefile dependencies. Affects: dcmimage/libsrc/Makefile.dep **** Changes from 1998.06.25 (riesmeier) - Minor changes to syntax description of dcm2pnm. Affects: dcmimage/apps/dcm2pnm.cc - Added description of new compatibility options. Affects: dcmimage/docs/dcm2pnm.txt **** Changes from 1998.06.23 (riesmeier) - Print 'maximum/minimum pixel value' (verbose mode) only for monochrome images. Affects: dcmimage/apps/dcm2pnm.cc - Added compatibility mode to support ACR-NEMA images and wrong palette attribute tags. Affects: dcmimage/apps/dcm2pnm.cc dcmimage/libsrc/dcmimage.cc dcmimage/libsrc/didocu.cc dcmimage/libsrc/dipalimg.cc dcmimage/include/dcmimage.h dcmimage/include/didocu.h dcmimage/include/diutils.h **** Changes from 1998.05.11 (riesmeier) - Minor changes to some comments. Affects: dcmimage/Makefile.in dcmimage/apps/dcm2pnm.cc **** Changes from 1998.04.23 (riesmeier) - Added CVS/RCS header to each file. Affects: dcmimage/libsrc/*.cc dcmimage/include/*.h **** Changes from 1998.04.01 (riesmeier) - Added support for new color models YBR_FULL, YBR_FULL_422 and YBR_PARTIAL_422. Affects: dcmimage/libsrc/Makefile.in dcmimage/libsrc/Makefile.dep dcmimage/apps/Makefile.dep dcmimage/include/dcmimage.h dcmimage/libsrc/dcmimage.cc Added: dcmimage/include/diybrimg.h dcmimage/include/diybrpxt.h dcmimage/libsrc/diybrimg.cc dcmimage/include/diyf2img.h dcmimage/include/diyf2pxt.h dcmimage/libsrc/diyf2img.cc dcmimage/include/diyp2img.h dcmimage/include/diyp2pxt.h dcmimage/libsrc/diyp2img.cc - Added another case called "simple mask" to decode input data. Affects: dcmimage/include/diinpxt.h - Added Test: Value of 'OverlayBitsAllocated' should correspond to value of 'BitsAllocated' (see Correction Prosposal 87). Affects: dcmimage/libsrc/diovlay.cc - Renamed test.cxx to test.cc. Affects: dcmimage/tests/test.cxx - Replaced all tab characters by spaces to avoid different representations. Affects: dcmimage/include/*.h dcmimage/libsrc/*.cc **** Changes from 1998.03.09 (riesmeier) - Added type cast to avoid warnings with MSVC. Affects: dcmimage/include/dimoopxt.h **** Changes from 1998.03.09 (riesmeier) - Made 'return' last statement in some non-void functions. Affects: dcmimage/apps/dcm2pnm.cc dcmimage/include/dimopxt.h dcmimage/include/diovpln.h dcmimage/libsrc/diutils.cc **** Changes from 1998.03.05 (riesmeier) - Removed meaningless type qualifier 'const' on some cast types. Affects: dcmimage/include/diargpxt.h dcmimage/include/dicmypxt.h dcmimage/include/dihsvpxt.h dcmimage/include/dimoipxt.h dcmimage/include/dimoopxt.h dcmimage/include/dimopxt.h dcmimage/include/dirgbpxt.h dcmimage/libsrc/dimo1img.cc dcmimage/libsrc/dimo2img.cc - Removed meaningless type qualifier 'const' in some declarations. Affects: dcmimage/include/diovpln.h - Made 'return' last statement in some non-void functions. Affects: dcmimage/include/dicoopxt.h dcmimage/include/dicopxt.h **** Changes from 1998.03.03 (riesmeier) - Removed some name clashes reported by Sun CC4. Affects: dcmimage/include/diclipt.h dcmimage/include/dicosct.h dcmimage/include/dicoclt.h dcmimage/include/dimosct.h dcmimage/include/dimoclt.h dcmimage/include/dimoimg.h dcmimage/include/discalet.h dcmimage/libsrc/dimo1img.cc dcmimage/libsrc/dimo2img.cc dcmimage/libsrc/dimoimg.cc dcmimage/libsrc/diovlay.cc **** Changes from 1998.02.17 (eichelberg) - Updated dcmimage version number to 1.0.2 to reflect version compatible with dcmtk 3.3.1 Affects: dcmimage/include/dcmimage.h - Added license info to usage string. Affects: dcmimage/apps/dcm2pnm.cc **** Changes from 1998.02.07 (eichelberg) - Removed many name clashes reported by Sun CC4. Affects: dcmimage/include/discalet.h dcmimage/libsrc/diimage.cc **** Changes from 1997.10.01 (eichelberg) - Introduced separate version number and date for dcmimage. OFFIS_DCMIMAGE_VERSION and OFFIS_DCMIMAGE_RELEASEDATE are declared in dcmimage.h. Affects: dcmimage/include/dcmimage.h dcmimage/apps/dcm2pnm.cc - Corrected declaration of expandSign() for Sint8 values. Affects: dcmimage/include/diinpxt.h - Removed -DREVERSE_OVERLAY_ORIGIN_ORDER from default compile options. Affects: dcmimage/libsrc/Makefile.in **** Changes from 1997.09.18 (eichelberg) - Minor type conflicts (e.g. long passed as int) solved. Affects: dcmimage/apps/dcm2pnm.cc - Removed CR characters from some files. Affects: dcmimage/include/dicopxt.h dcmimage/include/diimage.h dcmimage/include/diinpxt.h dcmimage/include/dimoimg.h dcmimage/include/dimoipxt.h dcmimage/include/dimomod.h dcmimage/include/dimopxt.h dcmimage/libsrc/diimage.cc dcmimage/libsrc/dimoimg.cc dcmimage/libsrc/dimomod.cc dcmimage/libsrc/diovpln.cc dcmimage/tests/test.cxx **** Changes from 1997.09.12 (eichelberg) - dcxfer.h now included in dcmimage.h (as should be). Affects: dcmimage/include/dcmimage.h **** Changes from 1997.07.28 (barth) - Support for pixel representations (class DcmPixelData) Affects: dcmimage/apps/dcm2pnm.cc dcmimage/include/dcmimage.h dcmimage/include/didocu.h dcmimage/include/diimage.h dcmimage/include/diinpxt.h dcmimage/libsrc/Makefile.dep dcmimage/libsrc/dcmimage.cc dcmimage/libsrc/didocu.cc dcmimage/libsrc/diimage.cc - Additional search routine using a DcmStack Affects: dcmimage/include/didocu.h dcmimage/libsrc/didocu.cc - Surround read method call with calls to transferInit() and transferEnd() Affects: dcmimage/libsrc/didocu.cc **** Changes from 1997.07.21 (barth) - new PixelData and OverlayData classes Affects: dcmimage/apps/Makefile.dep dcmimage/libsrc/Makefile.dep - Replace all boolean types (BOOLEAN, CTNBOOLEAN, DICOM_BOOL, BOOL) with one unique boolean type OFBool. Affects: dcmimage/apps/Makefile.dep dcmimage/apps/Makefile.in dcmimage/libsrc/Makefile.dep dcmimage/libsrc/Makefile.in **** Changes from 1997.06.17 (eichelberg) - all debug messages now go to stderr (instead of stdout). Affects: dcmimage/include/diinpxt.h **** Changes from 1997.06.01 (riesmeier) - cleaned up setWindow() methods. Only one with default parameters remains. - Added overlay mode EMO_Default. This is identical to EMO_Replace for "G" (graphical) overlays and to EMO_RegionOfInterest for "R" (ROI) overlays. - Fixed bug leading to incorrect images when sign-extended pixel data was "normalized" without any VOI transformation. Affects: dcmimage/include/diutils.h dcmimage/include/diovlpln.h dcmimage/include/dimoopxt.h dcmimage/include/dcmimage.h dcmimage/libsrc/diovlpln.cc **** Changes from 1997.05.29 (eichelberg) - All dcmtk applications now contain a version string which is displayed with the command line options ("usage" message) and which can be queried in the binary with the "ident" command. Affects: dcmimage/apps/dcm2pnm.cc **** Changes from 1997.05.28 (eichelberg) - Changed dcm2pnm options for MinMax VOI window computation to match functionality of the toolkit. Default mode for overlays is now Replace for Graphic overlays and ROI for ROI overlays. Updated documentation. Affects: dcmimage/apps/dcm2pnm.cc dcmimage/docs/dcm2pnm.txt **** Changes from 1997.05.26 (riesmeier) - new method DicomImage::setWindow() allows to disable VOI windowing - new method DiDocument::getVM() - default mode for grayscale images changed from "setMinMaxWindow(0)" to "no VOI windowing". - new class DiOverlayData introduced to solve a problem occuring when images containing overlay planes were copied/scaled/clipped and the originals deleted before the copy. - removed workaround in dcm2pnm for the bug mentioned above. Affects: dcmimage/apps/Makefile.dep dcmimage/apps/dcm2pnm.cc dcmimage/include/dcmimage.h dcmimage/include/didocu.h dcmimage/include/diobjcou.h dcmimage/include/diovlay.h dcmimage/libsrc/Makefile.dep dcmimage/libsrc/dcmimage.cc dcmimage/libsrc/didocu.cc dcmimage/libsrc/dimoimg.cc dcmimage/libsrc/diovlay.cc **** Changes from 1997.05.23 (eichelberg) - Corrected typo introduced by last update causing a parse error in dcmimage.cc Affects: dcmimage/libsrc/dcmimage.cc **** Changes from 1997.05.22 (hewett) - Modified the test for presence of a data dictionary to use the method DcmDataDictionary::isDictionaryLoaded(). Affects: dcmimage/apps/dcm2pnm.cc dcmimage/libsrc/dcmimage.cc **** Changes from 1997.05.16 (barth) - Revised handling of GroupLength elements and support of DataSetTrailingPadding elements. The enumeratio E_GrpLenEncoding got additional enumeration values (for a description see dctypes.h). addGroupLength and removeGroupLength methods are replaced by computeGroupLengthAndPadding. To support Padding, the parameters of element and sequence write functions changed. Affects: dcmimage/apps/dcm2pnm.cc **** Changes from 1997.05.13 (eichelberg) - Added new application dcm2pnm. dcm2pnm allows to convert DICOM images to the widely used PPM/PGM general purpose image format. dcm2pnm gives access to most functionality offered by the dcmimage library. It replaces the older (and far less powerful) applications di2mono, di2ppm, diclip, discale and disize. Affects: dcmimage/apps/Makefile.dep dcmimage/apps/Makefile.in Added: dcmimage/apps/dcm2pnm.cc Removed: dcmimage/apps/di2mono.cc dcmimage/apps/di2ppm.cc dcmimage/apps/diclip.cc dcmimage/apps/discale.cc dcmimage/apps/disize.cc - Added function DicomImage::writeRawPPM() which takes an open stream instead of a file name as first argument. Affects: dcmimage/include/dcmimage.h dcmimage/libsrc/dcmimage.cc **** Changes from 1997.05.12 (barth) - Include function getFloat64 into DcmDecimalString and getSint32 into DcmIntegerString. Remove derived classes for this purpose in the dcmimage module. Removed: dcmimage/include/didecstr.h dcmimage/include/diintstr.h Affects: dcmimage/libsrc/didocu.cc **** Changes from 1997.05.06 (eichelberg) - Removed files contained both in libsrc/ and apps/. Removed: dcmimage/libsrc/dcm2mono.cc dcmimage/libsrc/dcm2ppm.cc dcmimage/libsrc/dcmclip.cc dcmimage/libsrc/dcmscale.cc dcmimage/libsrc/dcmsize.cc Affects: dcmimage/libsrc/Makefile.dep - Added CHANGES file for dcmimage module. ------------------------------------------------------------------- 30 April 1997 (riesmeier) - Initial Release dcmtk-3.6.0/docs/CHANGES.3100000644000310500011400000000170307220077532014271 0ustar joergrdicom3Release 3.1.0 (Public Release - 1996.09.01) dcmdata package: - Corrected bug whereby the search stack would be invalid if nothing was found. Added capability to print the contents of a dataset to any stream (was previously only stderr). The dcmdump now accepts additional parameters to test the new print capabilities. Affects: dcmdata/... dcmnet package: - Added automatic tests in the DIMSE level network code to check that a data dictionary is loaded. Calls to DIMSE routines will now fail if no data dictionary is loaded. Previously, the lack of a loaded data dictionary would cause obscure errors. Affects: dcmnet/libsrc/dimse.cc - When requesting an association, added check that presentation contexts have been defined. Affects: dcmnet/libsrc/assoc.h wlistctn package: - Added example worklist database (directory wlistdb) - Optimized perl script to only call sub-programs if necessary. Affects: wlistctn/perl/worklist.pl dcmtk-3.6.0/docs/CHANGES.3500000644000310500011400000004064007314134642014300 0ustar joergrdicom3 Release 3.5.0 (Public Release - 2001-06-14) - Updated Version Number and Implementation Version Name to reflect the current public release (3.5.0) Affects: dcmdata/include/dcuid.h - Updated documentation to reflect changes in 3.5.0 Affects: INSTALL Added: ANNOUNCE.350 **** Changes from 2001.06.14 (riesmeier) - Updated makefile and makefile dependencies. Affects: dcmpstat/jni/Makefile.dep dcmpstat/jni/Makefile.in - Updated readme file. Affects: README **** Changes from 2001.06.13 (riesmeier) - Added SpecificCharacterSet attribute to report "05". Thanks to Merlijn van Minderhout for the validation report of our SR sample documents. Affects: dcmsr/tests/mkreport.cc - Added "tests" application(s) to module's make file. Affects: dcmsr/Makefile.in - Added check for data dictionary to command line tool. Affects: dcmsr/tests/mkreport.cc **** Changes from 2001.06.07 (riesmeier) - Removed unused variable (reported by gcc 2.5.8 on NeXTSTEP). Affects: dcmpstat/apps/dcmmkcrv.cc dcmpstat/apps/dcmmklut.cc dcmpstat/apps/dcmp2pgm.cc dcmpstat/apps/dcmpsprt.cc dcmpstat/apps/dcmpsrcv.cc dcmpstat/apps/dcmpssnd.cc dcmpstat/libsrc/dvpsab.cc dcmpstat/libsrc/dvpsib.cc dcmpstat/libsrc/dvpssp.cc dcmsr/libsrc/dsrdoctr.cc - Updated description on toolkit history. Affects: HISTORY **** Changes from 2001.06.06 (riesmeier) - Added module dcmimage to public part of the toolkit. See docs/DCMIMAGE.11X for previous changes. Affects: config/modules Removed: dcmimage/CHANGES Added: docs/DCMIMAGE.11X - Updated MSVC5 project files and documentation. Affects: config/systems/win32/msvc5.zip config/systems/win32/README **** Changes from 2001.06.01 (riesmeier) - Added modules dcmsign and dcmsr. Affects: config/modules - Minor code purifications to keep Sun CC 2.0.1 quiet. Affects: ctndisp/libsrc/dispuser.cc dcmdata/apps/dcmgpdir.cc dcmnet/libsrc/dulparse.cc - Replaced some #ifdef _WIN32 statements by #ifdef HAVE_WINDOWS_H or #ifdef __CYGWIN__ respectively to reflect the fact that the latest Cygwin/gcc version does not define _WIN32 any more. Affects: dcmdata/libsrc/dcuid.cc dcmnet/libsrc/dcompat.cc dcmpstat/libsrc/dviface.cc dcmpstat/libsrc/dvpsmsg.cc dcmpstat/libsrc/dvsighdl.cc dcmtls/libsrc/tlslayer.cc dcmtls/libsrc/tlstrans.cc ofstd/tests/tstthred.cc - Rebuilt makefile dependencies. Affects: dcmpstat/apps/Makefile.dep dcmpstat/libsrc/Makefile.dep **** Changes from 2001.06.01 (riesmeier) - Removed sample image/pstate files. Removed: dcmsr/tests/image06.dcm dcmsr/tests/image07.dcm dcmsr/tests/pstate07.dcm **** Changes from 2001.06.01 (eichelberg) - Implemented global flag and command line option to disable reverse DNS hostname lookup using gethostbyaddr when accepting associations. Affects: dcmnet/apps/movescu.cc dcmnet/apps/storescp.cc dcmnet/include/dul.h dcmnet/libsrc/dul.cc dcmpstat/apps/dcmprscp.cc dcmpstat/apps/dcmpsrcv.cc imagectn/libsrc/imagectn.cc wlistctn/libsrc/wlistctn.cc - Updated documentation for new command line options and UID list Affects: dcmnet/docs/movescu.txt dcmnet/docs/storescp.txt dcmnet/docs/storescu.txt dcmpstat/docs/dcmpsrcv.txt dcmnet/tests/dcmtk_ca.pl imagectn/docs/imagectn.txt wlistctn/docs/wlistctn.txt - Fixed bug in CA perl script. mkcert -days option now works. Affects: dcmtls/tests/dcmtk_ca.pl - Updated dcmpstat sample configuration file. Affects: dcmpstat/tests/test.cfg - Updated copyright header Affects: */*/* **** Changes from 2001.05.25 (eichelberg) - Updated data dictionary and UID list (again). Affects: dcmdata/include/dcdeftag.h dcmdata/include/dcuid.h dcmdata/libsrc/dcdictzz.cc dcmdata/libsrc/dcuid.cc dcmdata/libsrc/dicom.dic - Modified DcmCodec::decode() interface, required for future dcmjpeg module. Affects: dcmdata/include/dccodec.h dcmdata/libsrc/dcpixel.cc - Modified dcmpstat signature handler to also compile without OpenSSL. Affects: dcmpstat/include/dvsighdl.h dcmdata/libsrc/dvsighdl.cc - Corrected some DIMSE error status codes for Print SCP. Affects: dcmdata/libsrc/dvpsfs.cc dcmdata/libsrc/dvpsib.cc dcmdata/libsrc/dvpspl.cc dcmdata/libsrc/dvpsprt.cc dcmdata/libsrc/dvpssp.cc dcmdata/libsrc/dvpsspl.cc - Added warning to dcmsign application that current version is incompatible to final text of Supplement 41. Affects: dcmsign/apps/dcmsign.cc **** Changes from 2001.05.22 (riesmeier) - Clear unsupported type 2 sequences before writing them to a dataset. Affects: dcmsr/libsrc/dsrdoc.cc - Enhanced checking routines for corrupt overlay data (e.g. invalid value for OverlayBitsAllocated). Affects: dcmimgle/include/diovpln.h dcmimgle/libsrc/diovlay.cc dcmimgle/libsrc/diovpln.cc **** Changes from 2001.05.14 (riesmeier) - Added support for "1 bit output" of overlay planes; useful to extract overlay planes from the pixel data and store them separately in the dataset. Affects: dcmimgle/include/dcmimage.h dcmimgle/include/dimoimg.h dcmimgle/include/diovlay.h dcmimgle/libsrc/dimoimg.cc dcmimgle/libsrc/diovlay.cc dcmimgle/libsrc/diovpln.cc **** Changes from 2001.05.10 (riesmeier) - Added dcmsr as a standard library to dcmpstat (removed preprocessor #ifdef). Affects: dcmpstat/apps/Makefile.in dcmpstat/libsrc/dviface.cc - Enhanced comments of some overlay related methods. Affects: dcmimgle/include/dcmimage.h **** Changes from 2001.05.10 (eichelberg) - Updated data dictionary and UID list Affects: dcmdata/include/dcdeftag.h dcmdata/include/dcuid.h dcmdata/libsrc/dcdictzz.cc dcmdata/libsrc/dcuid.cc dcmdata/libsrc/dicom.dic - Fixed memory leak that occured when parsing of a sequence failed. Thanks to Harald Breitner for the bug report and fix. Affects: dcmdata/libsrc/dcsequen.cc - Fixed minor bug in DcmMetaInfo::transferEnd() Thanks to Harald Breitner for the bug report and fix. Affects: dcmdata/libsrc/dcmetinf.cc - Added protected createEmptyValue() method in class DcmElement. Affects: dcmdata/include/dcelem.h dcmdata/libsrc/dcelem.cc - Added public createUint16Array() method in class DcmPolymorphOBOW. Affects: dcmdata/include/dcvrpobw.h dcmdata/libsrc/dcvrpobw.cc **** Changes from 2001.05.07 (riesmeier) - Updated documentation of command line programs. Affects: dcmsr/docs/dsr2html.txt dcmsr/docs/dsr2xml.txt dcmsr/docs/dsrdump.txt - Adapted read SR method call to new parameter scheme (integer flag instead of boolean mode). Affects: dcmpstat/libsrc/dviface.cc - Added support for VR=IS to method findIntegerNumber(). Affects: dcmdata/libsrc/dcitem.cc - Rebuilt makefile dependencies (removed 'dcm2raw.o'). Affects: dcmdata/apps/Makefile.dep - Corrected typo. Affects: dcmdata/apps/Makefile.in - Updated CVS header. Affects: dcmsr/apps/dsr2xml.cc dcmsr/include/dsrcitem.h dcmsr/include/dsrscogr.h dcmsr/include/dsrtlist.h dcmsr/include/dsrwavch.h dcmsr/libsrc/dsrcitem.cc dcmsr/libsrc/dsrcodtn.cc dcmsr/libsrc/dsrcomtn.cc dcmsr/libsrc/dsrcontn.cc dcmsr/libsrc/dsrdattn.cc dcmsr/libsrc/dsrdtitn.cc dcmsr/libsrc/dsrimgtn.cc dcmsr/libsrc/dsrimgvl.cc dcmsr/libsrc/dsrnumtn.cc dcmsr/libsrc/dsrpnmtn.cc dcmsr/libsrc/dsrscotn.cc dcmsr/libsrc/dsrscovl.cc dcmsr/libsrc/dsrtcotn.cc dcmsr/libsrc/dsrtextn.cc dcmsr/libsrc/dsrtimtn.cc dcmsr/libsrc/dsruidtn.cc dcmsr/libsrc/dsrwavtn.cc dcmsr/libsrc/dsrwavvl.cc **** Changes from 2001.05.03 (eichelberg) - Fixed bug in dcmdata sequence handling code that could lead to application failure in rare cases during parsing of a correct DICOM dataset. Thanks to Gilles Mevel for the bug report and fix. Affects: dcmdata/libsrc/dcdatset.cc dcmdata/libsrc/dcitem.cc dcmdata/libsrc/dcmetinf.cc dcmdata/libsrc/dcsequen.cc **** Changes from 2001.04.03 (riesmeier) - Added new command line option: ignore relationship content constraints specified for each SR document class. Affects: dcmsr/apps/dsrdump.cc dcmsr/apps/dsr2html.cc dcmsr/include/dsrtypes.h dcmsr/include/dsrdoctr.h dcmsr/include/dsrdoctn.h dcmsr/include/dsrdoc.h dcmsr/libsrc/dsrtypes.cc dcmsr/libsrc/dsrdoctr.cc dcmsr/libsrc/dsrdoctn.cc dcmsr/libsrc/dsrdoc.cc **** Changes from 2001.03.28 (eichelberg) - Fixed memory leak: a DcmTransportLayer instance was not deallocated upon destruction of a DUL_NETWORKKEY if the network was declared as DICOM_APPLICATION_REQUESTOR. Thanks to Harald Breitner for the bug report. Affects: dcmnet/libsrc/dul.cc - Fixed memory leak: for each accepted connection, an A-ASSOCIATE PDU could remain in memory under certain circumstances. Thanks to David Lappen for the bug report. Affects: dcmnet/libsrc/dulfsm.cc - Fixed memory leak: for each terminated connection, an empty DcmDataset remained in memory. Affects: dcmnet/libsrc/dimse.cc **** Changes from 2001.03.28 (riesmeier) - Added new sample report (valid structured report with cycle/loop). Affects: dcmsr/tests/mkreport.cc - Fixed bug in cycle/loop detection "algorithm". Affects: dcmsr/include/dsrtncsr.h dcmsr/libsrc/dsrtree.cc dcmsr/libsrc/dsrtncsr.cc **** Changes from 2001.03.22 (eichelberg) - Fixed problem with syntax highlighting of AT attributes in Tcl/Tk script Affects: dcmdata/tests/dcmpsdmp.tcl **** Changes from 2001.02.23 (riesmeier) - Changed behaviour of method verifyAndSignStructuredReport() with 'finalize'. Now the entire document is always signed independently from the tree items marked. Affects: dcmpstat/include/dviface.h dcmpstat/libsrc/dviface.cc - Added new GUI entry "WarnUnsignedObjectsInSR". Affects: dcmpstat/tests/test.cfg - Update signature status when signing a structured report (not only when saving/storing the report). Affects: dcmpstat/libsrc/dviface.cc **** Changes from 2001.02.20 (riesmeier) - Added detection of signed instances to DB_storeRequest(). This mechanism is used to add a short note to the instance description (in the index file) that an instance is digitally signed - database index file format has _not_ changed. Affects: imagectn/libsrc/dbstore.cc **** Changes from 2001.02.16 (riesmeier) - Fixed another small bug in method removeNode(). Affects: dcmsr/libsrc/dsrtree.cc **** Changes from 2001.02.13 (riesmeier) - Minor purifications in "signature validation overview" HTML page. Affects: dcmpstat/libsrc/dvsighdl.cc - Allow newline characters (encoded as ¶) in XML documents. Affects: dcmsr/include/dsrtypes.h dcmsr/libsrc/dsrtypes.cc - Minor corrections in XML output (newlines, etc.). Affects: dcmsr/libsrc/dsrimgvl.cc dcmsr/libsrc/dsrscovl.cc dcmsr/libsrc/dsrwavvl.cc - Corrected wrong implementation of getLevel() - started from 0 instead of 1. Affects: dcmsr/libsrc/dsrdoctr.cc dcmsr/libsrc/dsrtncsr.cc **** Changes from 2001.02.02 (riesmeier) - Added new option to dsr2xml allowing to specify whether value and/or relationship type are to be encoded as XML attributes or elements. Affects: dcmsr/apps/dsr2xml.cc dcmsr/include/dsrdoctn.h dcmsr/include/dsrtypes.h dcmsr/libsrc/dsrwavtn.cc dcmsr/libsrc/dsruidtn.cc dcmsr/libsrc/dsrtimtn.cc dcmsr/libsrc/dsrtypes.cc dcmsr/libsrc/dsrtextn.cc dcmsr/libsrc/dsrtcotn.cc dcmsr/libsrc/dsrscotn.cc dcmsr/libsrc/dsrpnmtn.cc dcmsr/libsrc/dsrnumtn.cc dcmsr/libsrc/dsrimgtn.cc dcmsr/libsrc/dsrdtitn.cc dcmsr/libsrc/dsrdoctn.cc dcmsr/libsrc/dsrdattn.cc dcmsr/libsrc/dsrcontn.cc dcmsr/libsrc/dsrcomtn.cc dcmsr/libsrc/dsrcodtn.cc **** Changes from 2001.01.29 (riesmeier) - Added method to verify and digitally sign structured reports. Affects: dcmpstat/include/dviface.h dcmpstat/include/dvpstyp.h dcmpstat/libsrc/dviface.cc - Fixed bug in createSignature method. Affects: dcmpstat/libsrc/dvsighdl.cc - Added methods to support a new state of finalized and unfinalized documents. Affects: dcmsr/include/dsrdoc.h dcmsr/libsrc/dsrdoc.cc **** Changes from 2001.01.29 (eichelberg) - Added new methods for creating signatures and checking the signature status in module dcmpstat. Affects: dcmpstat/include/dviface.h dcmpstat/include/dvsighdl.h dcmpstat/libsrc/dviface.cc dcmpstat/libsrc/dvsighdl.cc **** Changes from 2001.01.26 (eichelberg) - Introduced additional (fourth) status flag for signature validation describing signatures that are valid but untrustworthy (unknown CA). Affects: dcmpstat/include/dvpstyp.h dcmpstat/libsrc/dvsighdl.cc **** Changes from 2001.01.25 (eichelberg) - Added initial support for verification of digital signatures in presentation states, images and structured reports to module dcmpstat. Affects: dcmpstat/apps/Makefile.in dcmpstat/include/dviface.h dcmpstat/include/dvpstyp.h dcmpstat/libsrc/Makefile.dep dcmpstat/libsrc/Makefile.in dcmpstat/libsrc/dviface.cc Added: dcmpstat/include/dvsighdl.h dcmpstat/libsrc/dvsighdl.cc - Fixed problem with undefined copy constructor Affects: dcmpstat/include/dvsighdl.h - Added class SiCertificateVerifier in dcmsign which allows to check whether a certificate from a digital signature is trusted, i.e. issued by a known CA and not contained in a CRL. Affects: dcmsign/include/sitypes.h dcmsign/libsrc/Makefile.dep dcmsign/libsrc/Makefile.in dcmsign/libsrc/sicert.cc dcmsign/libsrc/sitypes.cc Added: dcmsign/include/sicertvf.h dcmsign/libsrc/sicertvf.cc **** Changes from 2001.01.25 (riesmeier) - Added method to insert item into a list. Affects: dcmsr/include/dsrtlist.h - Always remove signature sequences from certain dataset sequences (e.g. VerifyingObserver or PredecessorDocuments). Affects: dcmsr/include/dsrtypes.h dcmsr/libsrc/dsrdoc.cc dcmsr/libsrc/dsrtypes.cc - Corrected typos / enhanced comments. Affects: dcmsr/include/dsrdoc.h dcmsr/include/dsrdoctr.h dcmsr/include/dsrscogr.h dcmsr/include/dsrwavch.h - Allow invalid continuity of content flag when reading SR datasets. Affects: dcmsr/libsrc/dsrcontn.cc - Fixed bug in method removeNode(). Affects: dcmsr/libsrc/dsrtree.cc **** Changes from 2001.01.18 (riesmeier) - Added support for digital signatures. Affects: dcmsr/include/dsrcitem.h dcmsr/include/dsrdoc.h dcmsr/include/dsrdoctn.h dcmsr/include/dsrdoctr.h dcmsr/libsrc/dsrcitem.cc dcmsr/libsrc/dsrdoc.cc dcmsr/libsrc/dsrdoctn.cc dcmsr/libsrc/dsrdoctr.cc - Encode PN components in separate XML tags. Affects: dcmsr/include/dsrtypes.h dcmsr/libsrc/dsrdoc.cc dcmsr/libsrc/dsrpnmtn.cc dcmsr/libsrc/dsrtypes.cc **** Changes from 2001.01.17 (eichelberg) - Fixed problem that leaded to compile errors if compiled on Windows without multi-thread support. Affects: ofstd/libsrc/ofthread.cc - Added toolkit support for JPEG-LS transfer syntaxes Affects: dcmdata/libsrc/dcxfer.cc dcmdata/include/dcxfer.h - Fixed typo in description of JPEG-Lossless SV1 transfer syntax. Thanks to Joerg Weimer for the bug report. Affects: dcmdata/libsrc/dcxfer.cc - Moved old announcement and change log for release 3.4.2 to docs Removed: ANNOUNCE.342 CHANGES.342 Added: docs/ANNOUNCE.342 docs/CHANGES.342 - Created new change log Added: CHANGES.350 dcmtk-3.6.0/docs/ANNOUNCE.3120000644000310500011400000000203607220101044014413 0ustar joergrdicom3ANNOUNCEMENT The DICOM server software used during the June CAR'96 DICOM Demonstration is now publically available from: ftp://ftp.offis.uni-oldenburg.de/pub/dicom/offis/software/ The CAR'96 DICOM demonstration featured Modality Worklist Management and Image Storage/Query/Retrieval. The available software includes source code and documentation for the worklist management and image storage/query/retrieve server applications, a number of test applications, and the necessary libraries. This software package has been renamed DCMTK (DiCoM ToolKit). It contains a number of improvements over the software previously available from OFFIS/Oldenburg University, the most important being: - configuration using GNU-Configure - a modality worklist SCP and SCU - a new C++ encoding/decoding library - support for offline media - support for explicit VR transfer syntaxes - a user-extensible data dictionary - support for all balloted image SOP classes - numerous bug fixes The software is now being maintained by OFFIS, a non-profit R&D institute. dcmtk-3.6.0/docs/CHANGES.3210000644000310500011400000000151307220077534014274 0ustar joergrdicom3Release 3.2.1 (Public Release - 1997.06.09) - Updated Version Number and Implementation Version Name to reflect the current public release (3.2.1) Affects: dcmdata/include/dcuid.h **** Changes from 97.06.09 (barth) - Correct detection of Windows 95/NT Affects: config/include/osconfig.h **** Changes from 97.06.06 (barth) - corrected error: canWriteXfer returns false if the old transfer syntax was unknown, which causes several applications to prohibit the writing of a dataset. Affects: dcmdata/libsrc/dcitem.cc dcmdata/libsrc/dcsequen.cc dcmdata/libsrc/dcpixseq.cc dcmdata/libsrc/dcdatset.cc **** Changes from 97.06.05 (hewett) - Added Papyrus 3.1 data dictionary attributes. Affects: dcmdata/libsrc/dicom.dic dcmdata/include/dcdeftag.h dcmdata/libsrc/dcdictzz.cc dcmtk-3.6.0/docs/ANNOUNCE.3200000644000310500011400000000247607220101045014423 0ustar joergrdicom3ANNOUNCEMENT Version 3.2 of the OFFIS DCMTK (DICOM ToolKit) software is now available for public release. This release includes the following main changes over the previous release (Version 3.1.2): - dcmgpdir - an application to build a DICOMDIR according to the specifications of Supplement 19: General Purpose CD-R Image Interchange Profile. - Support for additional Storage SOP Classes (e.g. PET, Visible Light, Print Storage). - Basic toolkit support (data dictionary and UID tables) for Queue Management, Performed Procedure Step, User Preference LUT. - Support for Supplement 14: Unknown VR. - More than 80 bug fixes and improvements (see CHANGES file for details). The Image CTN and Worklist CTN servers from DCMTK Version 3.2 (imagectn and wlistctn) will be used during the DICOM Network Interoperability Demonstration as part of the Industrial Exhibition at CAR'97 in Berlin, Germany (June 26-27). DCMTK Version 3.2 was also used to assist production of the CAR'97 DICOM Demonstration CD. In particular, the dcmgpdir application was used to build the DICOMDIR (Medical Directory) found on the CD. The DCMTK software can be downloaded via: http://www.offis.uni-oldenburg.de/projekte/dicom/dicom_software_e.html --- Andrew Hewett, Marco Eichelberg, Andreas Barth, Sandra von Gehlen Oldenburg, 30 May, 1997 dcmtk-3.6.0/docs/CHANGES.3120000644000310500011400000001155307220077533014300 0ustar joergrdicom3Release 3.1.2 (Public Release - 1997.02.06) - Updated Implementation Version Name and Implementation Class UID to reflect the new version 3.1.2 Affects: dcmdata/include/dcuid.h - Added code in imagectn to print the time when an association request is received. Affects: imagectn/apps/imagectn.cc - Added capability for a DcmDirectoryRecord to record its position in the DICOMDIR file when being read. Previously this information was only computed when a DICOMDIR was being written. Affects: dcmdata/libsrc/dcdirrec.cc - Updated preliminary Apple Macintosh support for the Metrowerks CodeWarrior version 11 compiler and environment. Either the GUSI library or a WinSock library are needed (both are on the CodeWarrior CD but GUSI comes with source code and seems more stable). Corrected for incompatibilities in the timeval structure between unix.h and winsock.h Problems remain with the network interactions when used when other TCP/IP applications are active (this may be a MacOS/OpenTransport problem). Affects: config/include/cfmwerks.h dcmdata/apps/dcmdump.cc dcmdata/libsrc/dcdicdir.cc dcmdata/libsrc/dcdirrec.cc dcmnet/include/dcompat.h dcmnet/include/dicom.h dcmnet/libsrc/dcompat.cc dcmnet/libsrc/dimcond.cc dcmnet/libsrc/dimse.cc dcmnet/libsrc/diutil.cc - Fixed bug when creating unique identifers. No check was made to ensure that negative numbers never appeared in a UID. Also added an implementation of a simple gethostid() function for systems which lack this function (e.g. Mac & Windows). The implementation requires TCP/IP to be available. Affects: dcmdata/libsrc/dcuid.cc - Fixed crashing bug in the worklist database search routines. A badly formed date or time matching key was not being caught. Also added some preliminary error checking of maching keys prior to database search. Malformed keys will be noted as offending elements and the database search routines will return an error. Affects: wlistctn/libsrc/wkrlstdb.cc wlistctn/libsrc/wkrlstdb.h - Corrected usage message for the worklist database test program wltest. Affects: wlistctn/tests/wltest.cc - Corrected some entries in the example worklist database which used an incorrect character as value multiplicity deliminator. Affects: wlistctn/wlistdb/OFFIS/wklist1.dump wlistctn/wlistdb/OFFIS/wklist3.dump wlistctn/wlistdb/OFFIS/wklist5.dump wlistctn/wlistdb/OFFIS/wklist6.dump wlistctn/wlistdb/OFFIS/wklist8.dump - Added some simple documentation for the movescu utility program. Added: dcmnet/docs/movescu.txt - Modifed the incoming association negotiation behaviour of movescu so that the Storage SCP code now will accept any presentation context for a Storage SOP Class based on the table of Storage SOP Classes exported in dcuid.h Affects: dcmnet/apps/movescu.cc - Added a set of example modality worklist queries. Added: wlistctn/wlistqry wlistctn/wlistqry/README wlistctn/wlistqry/wlistqry0.dump wlistctn/wlistqry/wlistqry1.dump wlistctn/wlistqry/wlistqry2.dump wlistctn/wlistqry/wlistqry3.dump wlistctn/wlistqry/wlistqry4.dump wlistctn/wlistqry/wlistqry5.dump wlistctn/wlistqry/wlistqry6.dump wlistctn/wlistqry/wlistqry7.dump wlistctn/wlistqry/wlistqry8.dump wlistctn/wlistqry/wlistqry9.dump wlistctn/wlistqry/wlistqry10.dump wlistctn/wlistqry/wlistqry11.dump wlistctn/wlistqry/wlistqry12.dump - Added bugfix for WINSOCK support. The required WINSOCK version number was being incorrectly set to version 0.1. The fixed WINSOCK initialisation now uses the MAKEWORD macro to correctly set the required version number. This bugfix was contributed by Dr. Yongjian Bao of Innomed GmbH, Germany. Affects: dcmnet/apps/echoscu.cc dcmnet/apps/findscu.cc dcmnet/apps/movescu.cc dcmnet/apps/storescu.cc dcmnet/apps/storescp.cc - Added support for SGI IRIX systems using GCC 2.7.x Irix declares bzero() in bstring.h which is included from libc.h Configure now also looks for a bzero() prototype in libc.h if available. Affects: config/configure config/configure.in - Added support for HP-UX 9.05 systems using GCC 2.7.2.1 HP-UX 9.05 declares the select() system call unusually: Declaration is in and args 2-4 are int* instead of struct fd_set *. This requires an extra check in the config modules. Affects: config/acconfig.h config/aclocal.m4 config/configure config/configure.in config/include/config.h.in dcmnet/libsrc/assoc.cc dcmnet/libsrc/dul.cc dcmnet/libsrc/dulextra.cc dcmnet/libsrc/dulfsm.cc dcmtk-3.6.0/docs/ANNOUNCE.3100000644000310500011400000000203507220101042014406 0ustar joergrdicom3ANNOUNCEMENT The DICOM server software used during the June CAR'96 DICOM Demonstration is now publically available from: ftp://ftp.offis.uni-oldenburg.de/pub/dicom/offis/software/ The CAR'96 DICOM demonstration featured Modality Worklist Management and Image Storage/Query/Retrieval. The available software includes source code and documentation for the worklist management and image storage/query/retrieve server applications, a number of test applications, and the necessary libraries. This software package as been renamed DCMTK (DiCoM ToolKit). It contains a number of improvements over the software previously available from OFFIS/Oldenburg University, the most important being: - configuration using GNU-Configure - a modality worklist SCP and SCU - a new C++ encoding/decoding library - support for offline media - support for explicit VR transfer syntaxes - a user-extensible data dictionary - support for all balloted image SOP classes - numerous bug fixes The software is now being maintained by OFFIS, a non-profit R&D institute. dcmtk-3.6.0/docs/ANNOUNCE.3300000644000310500011400000000243507220101046014420 0ustar joergrdicom3ANNOUNCEMENT Version 3.3 of the OFFIS DCMTK (DICOM ToolKit) software is now available for public release. This release includes the following main changes over the previous version (Version 3.2.1): - Improved support for Windows95/NT with project makefiles for Microsoft Visual C++ 4.0 - Fixes several problems related to opening files and networking under Windows95/NT. - Fixes several problems related to incorrect encoding of group length attributes, sequences and item lengths. - Improved data dictionary support. The data dictionary is now implemented as a hash table with an optimised hash function. Loading a data dictionary is now 4 times faster. - Provides a new framework for pixel data codecs (e.g. the JPEG processes). This includes the new classes DcmPixelData, DcmCodec and supporters but does not yet include any specific compression codec code. - Provides an emulation of ANSI-C++ string, list and stack classes. - Various bug-fixes detected during and after the CAR'97 DICOM Demonstration. See the dcmtk/CHANGES file for more details. The DCMTK software can be downloaded via: http://www.offis.uni-oldenburg.de/projekte/dicom/dicom_software_e.html --- Andrew Hewett, Marco Eichelberg, Andreas Barth, Sandra von Gehlen 7 October 1997, Oldenburg, Germany dcmtk-3.6.0/docs/CHANGES.3010000644000310500011400000000331307220077531014267 0ustar joergrdicom3Release 3.0.1 wlistctn package: - Corrected processing of sequences in query identifiers. Any and every sequence was being treated (and matched) as if it were a ScheduledProcedureStepSequence. e.g. trying to retreive the (unsupported) RequestedProcedureCodeSequence was returning attributes of the ScheduledProcedureStepSequence. Affects: dcmtk/wlistctn/libsrc/wrklstdb.cc - wlistctn now checks that the called AE Title corresponds to a Worklist database directory. If no such directory exists then the association is rejected due to an unknown AE Title. Affects: dcmtk/wlistctn/apps/wlistctn.cc - Added various utility programs used by the Worklist WWW Server. New: dcmtk/wlistctn/wwwapps/* dcmtk/wlistctn/perl/* imagectn package: - Added command line argument (-DD) to imagectn to explicitly disable communication with ctndisp and override the configuration file. Affects: dcmtk/imagectn/libsrc/imagectn.cc - Added command line argument (-DD) to ti to explicitly disable communication with ctndisp and override the configuration file. Affects: dcmtk/imagectn/libsrc/ti.cc - Modified the definition of a static array of structs which was causing problems for some C++ compilers. Affects: dcmtk/imagectn/libsrc/dbpriv.h dcmtk/imagectn/libsrc/dbutils.cc ctndisp package: - The library routines for communicating with the ctndisp program now automatically disable communication if ctndisp cannot be detected. Affects: dcmtk/ctndisp/libsrc/dispuser.cc dcmdata package: - Updated ImplementationVersionName string constant for release 3.0.1 Affects: dcmtk/dcmdata/include/dcuid.h - Only trailing padding characters are now stripped from string-like value representations. dcmtk-3.6.0/docs/ANNOUNCE.3540000644000310500011400000001337310520345033014434 0ustar joergrdicom3 ANNOUNCEMENT Version 3.5.4 of the OFFIS DCMTK (DICOM ToolKit) software is now available for public release. This release includes the following main changes over the previous version (Version 3.5.3): - DCMTK 3.5.4 builds correctly with GNU gcc 4.0 and Visual Studio 2005. - Newly supported platforms: - Linux on x86_64 - FreeBSD 5.x, 6.x on x86 - Solaris 10 on x86 - QNX 6.2.1 on x86 - The use of CMake to generate project files on Windows is now required. - New schema for include files. All includes files are now included as #include "dcmtk/module/file.h", e.g. #include "dcmtk/dcmdata/dctk.h". This allows the DCMTK header files to be installed in a public directory such as /usr/local/include and eliminates the risk of name clashes. - New tool pdf2dcm allows to convert PDF files to DICOM Encapsulated PDF Storage SOP instances. - The former "imagectn" tool has been renamed to "dcmqrscp" (Q/R SCP) and has been refactored into a simple class structure that offers a clean API for exchanging the index file back-end. Minimal support for compressed transfer syntaxes has been added. The tool can now also be started by root and change privileges to a different user and group specified in the config file. - New lossless JPEG encoder that guarantees "true lossless" compression in contrast to the old implementation which could cause rounding errors in certain cases. - StoreSCP now supports multi-process mode both on Posix and Win32 platforms where a separate client process is forked for each incoming association. On Posix platforms, the tool can also be started from inetd. - DcmFileFormat::loadFile can now be prevented from attempting to load non-part 10 files as DICOM datasets. Many tools support a corresponding command line option "--read-file-only". - Many tools support a new command line option that ignores the transfer syntax specified in the meta header and tries to detect the transfer syntax automatically from the dataset. - Added support for X-Ray Radiation Dose SR and Procedure Log SR documents in dcmsr module. - TLS module now supports AES ciphersuites if compiled with OpenSSL 0.9.7 or newer. All TLS-enabled tools now support the "AES TLS Secure Transport Connection Profile". - Changed names of OpenSSL DLLs for Win32 release build - there are just too many tools that install "their" version of libeay32.dll and ssleay32.dll in c:\windows\system32 and cause DLL conflicts. We now call our versions of the OpenSSL DLLs dcmtkssl.dll and dcmtkeay.dll. - Added command line options for separate DIMSE and ACSE timeouts to many tools. - The dcmdata module now supports an automatic re-conversion of defined length UN elements read in an explicit VR transfer syntax, if the real VR is defined in the data dictionary. A corresponding command line option "--convert-un" is available in dcmdump and dcmconv. - Compilation with OpenSSL 0.9.8, which introduces an incompatible API change, is now supported. - Network tools support transmission and receipt of JPEG 2000 transfer syntaxes. - DICOMDIR tools and classes now support Encapsulated Document, Real World Value Mapping, Hanging Protocol and Color Presentation State objects. - The toolkit can now read DICOM files in which the meta header group length attribute (0002,0000) is absent, based on a heuristic that checks for group 0002 attribute tags. - Added option --read-dataset to dcmdjpeg that allows to decompress JPEG compressed DICOM objects that have been stored as dataset without meta-header. - Added support for reading UN elements with undefined length according to CP 246. A flag allows to revert to the prior behaviour in which UN elements with undefined length were parsed like a normal explicit VR SQ element. - Added support for new Media Storage Application Profiles according to DICOM PS 3.12-2004. Removed support for non-standard conformant "No profile". - The DICOM data dictionary has been re-worked based on the latest supplements and correction proposals, as usual. - Many bug fixes and minor improvements as usual - see the CHANGES.354 file for more details. Many people have contributed to this new release of DCMTK, appearing here in alphabetical order. Thank you very much for your support! Michael Albert Stefan Allers Dennis Ballance Jesper Bojesen Sean Chen Andre M. Descombes Michael Doppler Alexander Fedotov Attila Gelle Indrajit Ghosh Firas Haj-Husein Michael Heber Andrew Hewett Anibal Jodorcovsky Alexander Karaivanov Karl Kiniger Bernd Kuemmerlen Mitchell Laks John A. Meinel Markus Mertens Heiko Muench Clay Nordquist Igor Okulist Daniel Patel A. M. Raportirenko Alain Runa Markus Sabin Juergen Salk Erik Sanner Kent Tse OFFIS staff who have worked on this release are: Marco Eichelberg Joerg Riesmeier Thomas Wilkens Michael Onken The DCMTK software can be downloaded via: http://dicom.offis.de/dcmtk Kuratorium OFFIS e.V., Oldenburg, Germany, 2005-12-20 dcmtk-3.6.0/docs/CHANGES.3310000644000310500011400000002447407220077535014311 0ustar joergrdicom3Release 3.3.1 (Public Release - 1998.02.17) - Updated Version Number and Implementation Version Name to reflect the current public release (3.3.1) Affects: dcmdata/include/dcuid.h - Updated documentation to reflect changes in 3.3.1 Affects: ANNOUNCE COPYRIGHT INSTALL **** Changes from 1998.02.17 (eichelberg) - Linking dcmftest with -ldcmdata and -lofstd again (warning on IRIX, but required by OSF/1..) Affects: dcmdata/apps/Makefile.in **** Changes from 1998.02.11 (eichelberg) - Synchronized Win32 configuration file cfwin32.h with the current Unix config.h.in. Updated Win32 Makefile. Affects: config/include/cfwin32.h config/systems/win32/msvc4.mak - Removed superfluous libraries in linker calls for some applications. Affects: ctndisp/apps/Makefile.in dcmdata/apps/Makefile.in wlistctn/tests/Makefile.in wlistctn/wwwapps/Makefile.in **** Changes from 1998.02.07 (eichelberg) - Updated test procedure for memcpy/bcopy etc., required for NeXT. Affects: config/configure config/configure.in config/include/config.h.in dcmdata/include/dcdefine.h **** Changes from 1998.02.06 (eichelberg) - Removed many minor problems (name clashes, unreached code) reported by Sun CC4 with "+w" or Sun CC2. Affects: ctndisp/apps/ctndsupp.cc dcmdata/apps/dcmgpdir.cc dcmdata/libsrc/dcdict.cc dcmdata/libsrc/dcdirrec.cc dcmnet/apps/movescu.cc dcmnet/apps/storescp.cc imagectn/apps/imagectn.cc imagectn/apps/ti.cc ofstd/include/oflist.h ofstd/include/ofstack.h ofstd/libsrc/oflist.cc wlistctn/apps/wlistctn.cc wlistctn/libsrc/wrklstdb.cc **** Changes from 1998.02.06 (hewett) - Updated support for Supplements 15 (Visible Light), 16 (Postscript Print Management), 17 (Modality Performed Procedure Step), 22 (Presentation Look Up Table (LUT)), 23 (Structured Reporting), 24 (Stored Print), 30 (Waveform Interchange). Affects: dcmdata/libsrc/dicom.dic dcmdata/include/dcuid.h dcmdata/libsrc/dcuid.cc dcmnet/libsrc/diutil.cc dcmnet/docs/storescu.txt dcmnet/docs/storescp.txt dcmnet/docs/movescu.txt imagectn/docs/imagectn.txt imagectn/docs/ti.txt Rebuilt: dcmdata/include/dcdeftag.h dcmdata/libsrc/dcdictzz.cc **** Changes from 1998.02.05 (eichelberg) - Corrected ofstd Makefile. "make install" does not install libraries and headers any more, but "make install-lib" does. Affects: ofstd/Makefile.in - Introduced new #define in config.h: DCMTK_PREFIX contains the dcmtk default path (e.g. the --prefix argument used during configure or "/usr/local/dicom".) Affects: config/acconfig.h config/configure config/configure.in config/include/config.h.in - Synchronized Win32 configuration file cfwin32.h with the current Unix config.h.in. Affects: config/include/cfwin32.h - Removed meaningless const qualifiers from functions returning integers or enums by value (many warnings on IRIX). Thanks to Andreas Barth for the report. Affects: dcmdata/include/dcstack.h dcmdata/include/dcswap.h dcmdata/include/dcvr.h dcmdata/include/dcxfer.h dcmdata/libsrc/dcstack.cc dcmdata/libsrc/dcswap.cc dcmdata/libsrc/dcvr.cc **** Changes from 1998.02.05 (hewett) - Added code to explicitly handle IP addresses in the DUL code. It seems that under Windows95 (but not WindowsNT) the gethostbyname() function will not accept a string representation of an IP address. Thanks to for the bug report. Affects: dcmnet/libsrc/dulfsm.cc - Added check for to configure system. Affects: config/configure.in Rebuilt: config/configure config/include/config.h.in **** Changes from 1998.01.28 (eichelberg) - Removed minor bug from DICOM Upper Layer / DIMSE modules. For each PDV received, an error condition was pushed on the error stack and then again pulled from it. If a callback function was registered with the condition stack, it was flooded with error messages. The old behaviour can be restored by compiling with the symbol PUT_DUL_NOPDVS_ON_CONDITION_STACK defined. Thanks to Gilles Mevel for the bug report. Affects: dcmnet/libsrc/dul.cc dcmnet/libsrc/dimse.cc **** Changes from 1998.01.27 (eichelberg) - Added FAQ entries related to IRIX 6.x and a shell script allowing to build DCMTK on IRIX 6 machines with an IRIX 5.x gcc. Added: config/mvldflags Affects: FAQ - Minor bug corrections (string too short, incorrect return value). Thanks to Andreas Barth for the report. dcmdata/apps/dcmgpdir.cc dcmdata/libsrc/dcsequen.cc imagectn/libsrc/dbutils.cc wlistctn/wwwapps/writwlst.cc - Removed some unused variables, meaningless const modifiers and unreached statements. Affects: ctndisp/apps/ctndsupp.cc dcmdata/apps/dcmconv.cc dcmdata/apps/dump2dcm.cc dcmdata/libsrc/dcdicdir.cc dcmdata/libsrc/dcdict.cc dcmdata/libsrc/dcdirrec.cc dcmnet/libsrc/dimfind.cc dcmnet/libsrc/dimmove.cc dcmnet/libsrc/dimse.cc imagectn/apps/tiui.cc wlistctn/apps/sce.cc **** Changes from 1998.01.14 (hewett) - Added command line option (-ti) to restrict association negotiation to only propose the default Little Endian Implicit VR Transfer Syntax. Affects: dcmdata/dcmnet/storescu.cc - Modified existing -u command line option to also disable generation of UT and VS (previously just disabled generation of UN). Affects: dcmdata/apps/dcmconv.cc dcmdata/docs/dcmconv.txt dcmdata/apps/dcmgpdir.cc dcmdata/docs/dcmgpdir.txt dcmdata/apps/dump2dcm.cc dcmdata/docs/dump2dcm.txt dcmnet/apps/findscu.cc dcmnet/docs/findscu.txt dcmnet/apps/movescu.cc dcmnet/docs/movescu.txt dcmnet/apps/storescu.cc dcmnet/docs/storescu.txt dcmnet/apps/storescp.cc dcmnet/docs/storescp.txt imagectn/apps/imagectn.cc imagectn/docs/imagectn.txt imagectn/apps/ti.cc imagectn/docs/ti.txt wlistctn/apps/wlistctn.cc wlistctn/docs/wlistctn.txt - Added basic support for the Structured Reporting (SR) SOP Classes. Affects: dcmdata/include/dcuid.h dcmdata/include/dcdeftag.h dcmdata/libsrc/dcuid.cc dcmdata/libsrc/dicom.dic dcmdata/libsrc/dcdictzz.cc dcmnet/include/diutil.h dcmnet/libsrc/diutil.cc imagectn/apps/scestore.cc imagectn/doc/imagectn.txt - Added support for the VRs UT (Unlimited Text) and VS (Virtual String). Support can be disabled by setting the global flags dcmEnableUnlimitedTextVRGeneration and dcmEnableVirtualStringVRGeneration to OFFalse. Extreme caution should be excercised when using these VRs since at the time of writing they have _not_ been formally adopted and may dissapear at any time. The VRs should be used for experimental purposes only. Affects: dcmdata/include/dcvr.h dcmdata/libsrc/dcvr.cc dcmdata/include/dctk.h dcmdata/libsrc/dcitem.cc dcmdata/libsrc/dcobject.cc dcmdata/libsrc/dcxfer.cc dcmdata/libsrc/Makefile.in wlistctn/apps/wrklstdb.cc Added: dcmdata/include/dcvrut.h dcmdata/include/dcvrvs.h dcmdata/libsrc/dcvrut.cc dcmdata/libsrc/dcvrvs.cc - Added enquiry method to determine if VR is a String (isaString) or if it requires an extended length encoded. Replaced some switch constructs to use to isaString method. Affects: dcmdata/include/dcobject.h dcmdata/include/dcvr.h dcmdata/libsrc/dcvr.cc dcmdata/libsrc/dcelem.cc dcmdata/apps/dcmgpdir.cc wlistctn/wwwapps/readoviw.cc wlistctn/wwwapps/readwlst.cc **** Changes from 1998.01.14 (eichelberg) - Improved algorithm for auto-detection of transfer syntax used when opening a DICOM file without metaheader. Big endian datasets are now detected much more reliably. Affects: dcmdata/libsrc/dcitem.cc - Corrected bug: Overlay Data elements in the groups 6002-601f were handled by DcmOtherByteOtherWord instead of the "polymorphous" DcmOverlayData class. Affects: dcmdata/libsrc/dcitem.cc **** Changes from 1997.11.10 (eichelberg) - Corrected bug possibly causing a memory leak in OFList. Added virtual destructors to classes OFListLinkBase and OFListLink. Affects: ofstd/include/oflist.h **** Changes from 1997.11.10 (hewett) - Corrected bug preventing parsing of data encoded using the RLELossless transfer syntax. Simple added appropriate transfer syntax table entries. Affects: dcmdata/include/dcxfer.h dcmdata/libsrc/dcxfer.cc **** Changes from 1997.11.07 (eichelberg) - Corrected bug in the dcmdata read routines which caused incorrect reading of datasets containing attributes with value representation "ox" (= OB or OW) in the dicom dictionary other than PixelData and OverlayData. (thanks to Gilles Mevel for the bug report and sample data set). Affects: dcmdata/libsrc/dcitem.cc **** Changes from 1997.10.13 (eichelberg) - Corrected check for presence of shared memory system calls in ctndisp. Needed for AIX 3.2 (IBM xlC 1.0) where shmctl and shmdt are present, but shmat is not. Affects: ctndisp/apps/ctndisp.cc **** Changes from 1997.10.13 (hewett) - Fixed bug in DcmByteString::getOFString due to inverse logic causing a string to be retrieved for all illegal values of pos while the errorFlag was set to EC_IllegalCall for all legal values of pos (thanks to Phil Liao for suggesting the bugfix). Affects: dcmdata/include/dcbytstr.cc - Changed ENVIRONMENT_PATH_SEPARATOR from ':' to ';' for Windows (thanks to Phil Liao for suggesting the bugfix). Affects: config/include/cfwin32.h **** Changes from 1997.10.09 (hewett) - Fixed dcmgpdir bug related to unlinking a DICOMDIR backup file (thanks to Lars Larsson for reporting this). Affects: dcmdata7apps/dcmgpdir.cc dcmtk-3.6.0/docs/CHANGES.3020000644000310500011400000000335207220077532014274 0ustar joergrdicom3Release 3.0.2 imagectn package: - Corrected error producing core dump with incorrect configrc file. imagectn tried to unlock an unsuccessfully allocated lockfile. Affects: dcmtk/imagectn/libsrc/dbutils.cc wlistctn package: - Worklist WWW-Server perl script performance enhancements. Simplified configuration. Added support for public area (without password). Added support for new modalities RF, XA (Supplement 4) and XC, EM, GM, SM (Supplement 15). Affects: dcmtk/wlistctn/perl/* Affects: dcmtk/wlistctn/wwwapps/* ctndisp package: - Corrected typos in error statements. Affects: dcmtk/ctndisp/libsrc/snq.cc config package: - The configure script will now only use the GNU-C compiler -pedantic flag if running on a Solaris-2 system. The -pedantic flag cannot be used on systems whose system include files incorrectly declare function prototypes without arguments (e.g. SunOS 4.1.3). Removed check for correct inline functions (needed for SUN CC 2.0.1). Affects: dcmtk/config/configure.in dcmtk/config/configure dcmdata package: - Corrected problem with parsing sequences when data provided in blocks (e.g. via network) and the sequences was larger than a block. Affects: dcmtk/dcmdata/libsrc/dcsequen.cc dcmnet package: - Added the program movescu which implements an SCU for the C-MOVE operation of the Query/Reqtrieve Service Class. Affects: dcmtk/dcmnet/apps/Makefile.in New: dcmtk/dcmnet/apps/movescu.cc - Corrected compilation problem when including on DEC Alpha OSF/1. Affects: dcmtk/dcmnet/include/dcompat.h - Removed inclusion of system header already included by dcompat.h and made sure that dcompat.h is always included (via dicom.h). Affects: dcmtk/dcmnet/libsrc/*.cc dcmtk-3.6.0/docs/CHANGES.3110000644000310500011400000001342707220077532014300 0ustar joergrdicom3Release 3.1.1 (Public Release - 1996.09.27) - Added preliminary support for the Win32 environment (WINSOCK library). Replaced the mscw31.h config include with cfwin32.h. The dcmnet library now uses appropriate WINSOCK socket calls (send instead of write, recv instead of read, closesocket instead of close). Added: config/include/cfwin32.h Removed: config/include/mscw31.h Affects: config/include/osconfig.h dcmnet/libsrc/dul.cc dcmnet/libsrc/dulfsm.cc dcmnet/include/dcompat.h dcmnet/apps/*.cc - Preliminary support for IBM AIX systems using the IBM C Set++ compiler. It is necessary to indicate that some system include files have C linkage. Moved the BEGIN_EXTERN_C and END_EXTERN_C defines from dcmnet/include/dcmnet.h to config/include/osconfig.h so that they are always available. Some of the most affected files have been modified to use BEGIN_EXTERN_C/END_EXTERN_C but many more need changing. Affects: config/configure.in config/include/osconfig.h dcmnet/include/dcompat.h imagectn/libsrc/dbindex.cc imagectn/libsrc/dbstore.cc imagectn/libsrc/dbutils.cc imagectn/apps/imagectn.cc imagectn/apps/scemove.cc imagectn/apps/scestore.cc imagectn/apps/ti.cc imagectn/apps/tinet.cc imagectn/apps/tiui.cc dcmnet/apps/findscu.cc dcmnet/apps/storescu.cc - Preliminary support for IBM AIX systems using the IBM C Set++ compiler. Corrected various small syntax errors and warnings not noticed by other compilers (e.g. mismatch between method definition in .h and .cc files, used before set warnings, const to non-const assignment). Changed flock_t to struct flock. Renamed the support program wlistctn/wwwapps/preplock.c to preplock.cc to avoid a compiler crash. Affects: dcmdata/libsrc/dcdicdir.cc dcmdata/libsrc/dcdirrec.cc dcmnet/libsrc/assoc.cc dcmnet/libsrc/dcompat.cc wlistctn/libsrc/wrklstdb.cc Removed: wlistctn/wwwapps/preplock.c Added: wlistctn/wwwapps/preplock.cc - Added a pre-generated version of a builtin data dictionary. This file can be included in a library instead of dcdictbi.cc and was generated via the mkdictbi program (in dcmdata/libsrc). Currently a builtin data dictionary is not used per default. It has been found useful for systems which do not support environment variables making it more difficult to find a data dictionary to load (e.g. Macintosh). Added: dcmdata/libsrc/dcdictzz.cc - Removed the versions of cmdlnarg.cc and cmdlnarg.h found in dcmdata/apps and dcmnet/apps and added one single version to dcmdata/include and dcmdata/libsrc (now part of the dcmdata library). Removed: dcmdata/apps/cmdlnarg.h dcmdata/apps/cmdlnarg.cc dcmnet/apps/cmdlnarg.h dcmnet/apps/cmdlnarg.cc Added: dcmdata/include/cmdlnarg.h dcmdata/libsrc/cmdlnarg.cc Affects: dcmdata/apps/Makefile.in dcmnet/apps/Makefile.in dcmdata/libsrc/Makefile.in - Added preliminary support for the Macintosh environment (GUSI library). Affects: dcmdata/libsrc/mkdeftag.cc dcmdata/libsrc/mkdictbi.cc dcmdata/apps/*.cc dcmnet/include/dcompat.h dcmnet/libsrc/dul.cc dcmnet/libsrc/dulfsm.cc dcmnet/apps/*.cc config/include/cfmwerks.h config/configure.in - Added a separate table of Storage SOP Class UIDs (useful during association negotiation). Affects: dcmdata/libsrc/dcuid.cc dcmdata/include/dcuid.h dcmnet/apps/storescu.cc dcmnet/apps/storescp.cc imagectn/apps/imagectn.cc imagectn/apps/imagectn.h imagectn/apps/scemove.cc - Added SOP Class UIDs for Radiotherapy Objects. Affects: dcmdata/libsrc/dcuid.cc dcmdata/include/dcuid.h dcmnet/libsrc/diutil.cc - Added data dictionary tags for Radiotherapy Objects. Affects: dcmdata/libsrc/dicom.dic dcmdata/include/dcdeftag.h - Corrected erroneous setting of an error flag when inserting an attribute into an Item (via Item::insert(...)) and the attribute was already present. Now the error flag is only set if replaceOld is FALSE and an attribute already exists. Affects: dcmdata/libsrc/dcitem.cc - Eliminated lingering reference to a G++ lib_error_handler. The dcmdata library should now be independent of libg++. Affects: dcmdata/libsrc/dcentset.cc - Added optional code to the dcmdump program to restrict its output to specified named tags. Based on a suggestion from Larry V. Streepy, Jr. (mailto:streepy@healthcare.com). Affects: dcmdata/apps/dcmdump.cc dcmdata/docs/dcmdump.txt - Added capability to search data dictionary by tag name. The source code for these changes was contributed by Larry V. Streepy, Jr., Chief Technical Officer, Healthcare Communications, Inc., (mailto:streepy@healthcare.com). Affects: dcmdata/include/dcdicent.h dcmdata/include/dcdict.h dcmdata/include/dcentbst.h dcmdata/include/dcentdef.h dcmdata/libsrc/dcdict.cc dcmdata/libsrc/dcentbst.cc - Removed code which generated an error if DcmFileStream::Tell(void) was called when the stream was in write mode. This behaviour was causing DcmDicomDir::write(...) to always fail. In particular, this error was causing the program mknldir to write a DICOMDIR file containing only a meta-header. Affects: dcmdata/libsrc/dcstream.cc - Corrected missing () when calling function stack.card() used in nextObject(...). GNU C++ did not detect this error, it was discovered when compiling under MetroWerks C++ on a Power Mac. Affects: dcmdata/libsrc/dcitem.cc dcmdata/libsrc/dcsequen.cc dcmtk-3.6.0/docs/ANNOUNCE.3310000644000310500011400000000274507220101047014426 0ustar joergrdicom3ANNOUNCEMENT Version 3.3.1 of the OFFIS DCMTK (DICOM ToolKit) software is now available for public release. This release includes the following main changes over the previous version (Version 3.3.0): - Added support for experimental use of the proposed new DICOM Value Representations UT (Unlimited Text) and VS (Virtual String). - Added basic support for the Structured Reporting (SR) SOP Classes. - Updated support for Supplements 15 (Visible Light), 16 (Postscript Print Management), 17 (Modality Performed Procedure Step), 22 (Presentation Look Up Table (LUT)), 23 (Structured Reporting), 24 (Stored Print), 30 (Waveform Interchange). - Improved auto-detection of transfer syntax (used when opening a DICOM file without metaheader). - Added IRIX related information to FAQ. - Fixed problem on Windows 95 (not NT) preventing the use of explicit IP addresses instead of DNS/hostnames in configuration files and command line switches. - Fixed problem related to incorrect decoding of data containing Curve Data repeating groups. - Fixed problem related to incorrect parsing of data encoded using the RLELossless transfer syntax. - Various bug-fixes detected after the release of version 3.3.0. See the dcmtk/CHANGES file for more details. The DCMTK software can be downloaded via: http://www.offis.uni-oldenburg.de/projekte/dicom/dicom_software_e.html --- Andrew Hewett, Marco Eichelberg, Andreas Barth, Sandra von Gehlen 17 February 1998, Oldenburg, Germany dcmtk-3.6.0/docs/CHANGES.3540000644000310500011400000023323510520345055014303 0ustar joergrdicom3 Release 3.5.4 (Public Release - 2005-12-20) - Updated version name and implementation name to reflect release 3.5.4. Affects: dcmdata/include/dcmtk/dcmdata/dcuid.h - Created announcement file Added: ANNOUNCE.354 **** Changes from 2005.12.20 (eichelberg) - Added various typecasts needed to avoid warnings on MinGW. Affects: dcmnet/libsrc/dul.cc - Removed duplicate parameter Affects: dcmqrdb/include/dcmtk/dcmqrdb/dcmqrcbm.h dcmqrdb/libsrc/dcmqrcbm.cc - Updated Makefile dependencies Affects: dcmpstat/apps/Makefile.dep dcmpstat/tests/Makefile.dep dcmqrdb/libsrc/Makefile.dep dcmwlm/tests/Makefile.dep - Updated man pages Removed: doxygen/manpages/man1/dbregimg.1 doxygen/manpages/man1/imagectn.1 doxygen/manpages/man1/ti.1 Added: doxygen/manpages/man1/dcmqridx.1 doxygen/manpages/man1/dcmqrscp.1 doxygen/manpages/man1/dcmqrti.1 doxygen/manpages/man1/pdf2dcm.1 doxygen/manpages/man1/termscu.1 Affects: doxygen/manpages/man1/dcm2pnm.1 doxygen/manpages/man1/dcm2xml.1 doxygen/manpages/man1/dcmcjpeg.1 doxygen/manpages/man1/dcmconv.1 doxygen/manpages/man1/dcmcrle.1 doxygen/manpages/man1/dcmdjpeg.1 doxygen/manpages/man1/dcmdrle.1 doxygen/manpages/man1/dcmdspfn.1 doxygen/manpages/man1/dcmdump.1 doxygen/manpages/man1/dcmftest.1 doxygen/manpages/man1/dcmgpdir.1 doxygen/manpages/man1/dcmj2pnm.1 doxygen/manpages/man1/dcmmkcrv.1 doxygen/manpages/man1/dcmmkdir.1 doxygen/manpages/man1/dcmmklut.1 doxygen/manpages/man1/dcmodify.1 doxygen/manpages/man1/dcmp2pgm.1 doxygen/manpages/man1/dcmprscp.1 doxygen/manpages/man1/dcmprscu.1 doxygen/manpages/man1/dcmpschk.1 doxygen/manpages/man1/dcmpsmk.1 doxygen/manpages/man1/dcmpsprt.1 doxygen/manpages/man1/dcmpsrcv.1 doxygen/manpages/man1/dcmpssnd.1 doxygen/manpages/man1/dcmquant.1 doxygen/manpages/man1/dcmscale.1 doxygen/manpages/man1/dcmsign.1 doxygen/manpages/man1/dcod2lum.1 doxygen/manpages/man1/dconvlum.1 doxygen/manpages/man1/dsr2html.1 doxygen/manpages/man1/dsr2xml.1 doxygen/manpages/man1/dsrdump.1 doxygen/manpages/man1/dump2dcm.1 doxygen/manpages/man1/echoscu.1 doxygen/manpages/man1/findscu.1 doxygen/manpages/man1/movescu.1 doxygen/manpages/man1/storescp.1 doxygen/manpages/man1/storescu.1 doxygen/manpages/man1/wlmscpfs.1 doxygen/manpages/man1/xml2dcm.1 doxygen/manpages/man1/xml2dsr.1 - Updated installation instructions Affects: INSTALL **** Changes from 2005.12.19 (riesmeier) - Changed include path to new directory schema. Affects: config/Makefile.in - Changed printf() type for return value of getpid() to "%ld" and added explicit typecast, needed for Solaris. Affects: dcmnet/apps/storescp.cc **** Changes from 2005.12.16 (eichelberg) - Added typecasts to avoid warnings on VS2005 Affects: dcmjpeg/libsrc/djcodece.cc - Changed type to size_t to make code safe on 64bit platforms Affects: dcmdata/apps/mdfconen.cc dcmnet/apps/storescp.cc - Added type safety code for 64bit platforms Affects: dcmqrdb/libsrc/dcmqrcnf.cc - Simplified overly clever code producing undefined behaviour Affects: dcmqrdb/libsrc/dcmqrtis.cc - Simplified code to avoid warning on Fedora Core 4 Affects: dcmsign/apps/dcmsign.cc - Declared libxml2 callback functions as extern "C" Affects: dcmdata/apps/xml2dcm.cc dcmsr/libsrc/dsrxmld.cc **** Changes from 2005.12.16 (riesmeier) - Renamed file to avoid naming conflicts when linking on SunOS 5.5.1 with Sun CC 2.0.1. Added: dcmqrdb/include/dcmtk/dcmqrdb/dcmqrsrv.h dcmqrdb/libsrc/dcmqrsrv.cc Removed: dcmqrdb/include/dcmtk/dcmqrdb/dcmqrscp.h dcmqrdb/libsrc/dcmqrscp.cc Affects: dcmqrdb/apps/Makefile.dep dcmqrdb/apps/dcmqrscp.cc dcmqrdb/libsrc/CMakeLists.txt dcmqrdb/libsrc/Makefile.dep dcmqrdb/libsrc/Makefile.in **** Changes from 2005.12.16 (onken) - Added virtual (dummy) destructor to avoid compiler warnings Affects: dcmdata/include/dcmtk/dcmdata/dcrleenc.h dcmqrdb/include/dcmtk/dcmqrdb/dcmqrdba.h - Added variable initializations to avoid compiler warnings Affects: dcmdata/apps/dump2dcm.cc dcmdata/apps/mdfdsman.cc dcmqrdb/libsrc/dcmqrdbi.cc - Removed doubled assignment (typo?) to avoid compiler warning Affects: dcmsign/apps/dcmsign.cc **** Changes from 2005.12.15 (riesmeier) - Fixed issue with initialization of array member variables, reported by egcs on Solaris. Fixed missing/wrong initialization of member variables. Affects: dcmqrdb/include/dcmtk/dcmqrdb/dcmqrcbg.h dcmqrdb/include/dcmtk/dcmqrdb/dcmqrcbm.h - Replaced "true" by "OFTrue" and "false" by "OFFalse". Affects: dcmdata/apps/mdfdsman.cc - Added explicit type cast, required for Sun CC 4.2 on Solaris. Affects: dcmnet/libsrc/dul.cc - Removed naming conflicts. Affects: dcmqrdb/include/dcmtk/dcmqrdb/dcmqrcbs.h dcmqrdb/libsrc/dcmqrcbs.cc - Removed unsused parameter. Affects: dcmdata/include/dcmtk/dcmdata/dcddirif.h dcmdata/libsrc/dcddirif.cc - Added char* parameter cast to bzero() call. Affects: dcmqrdb/libsrc/dcmqrtis.cc - Added explicit type cast, required for Sun CC 2.0.1 on Solaris. Affects: dcmsr/libsrc/dsrsoprf.cc dcmjpeg/libsrc/djcodece.cc - Changed type of local variable, reported by Sun CC 2.0.1 on Solaris. Affects: dcmimage/apps/dcmscale.cc - Removed unused variables on non-Windows systems, reported by Sun CC 2.0.1. Affects: dcmnet/libsrc/dul.cc **** Changes from 2005.12.14 (riesmeier) - Added missing header file "fcntl.h", needed for Solaris. Affects: dcmnet/apps/storescp.cc - Replaced "string::npos" by "OFString_npos". Affects: dcmnet/apps/storescp.cc - Changed printf() type for return value of getpid() to "%d". Affects: dcmnet/apps/storescp.cc - Including ctype if present, needed for Solaris. Affects: dcmqrdb/libsrc/dcmqrcnf.cc dcmqrdb/libsrc/dcmqrdbi.cc **** Changes from 2005.12.14 (eichelberg) - Added configure test that checks for the presence of libjpeg. Both libjpeg and libz are added to TIFFLIBS if present, because libtiff has dependencies on both on some plat forms. Affects: config/configure config/configure.in - Including csignal if present, needed on Solaris. Affects: dcmnet/apps/storescp.cc - Added code needed for compilation with TCP wrappers on OpenBSD Affects: dcmqrdb/apps/dcmqridx.cc - Changed order of include files to avoid warning on FreeBSD Affects: dcmqrdb/libsrc/dcmqrdbi.cc - Changed CFLAGS/CXXFLAGS for compilation on FreeBSD 5 and 6 and NetBSD 2.x Affects: config/configure config/configure.in - Removed naming conflict Affects: dcmqrdb/libsrc/dcmqrtis.cc - Adapted code for compilation with TCP wrappers to NetBSD Affects: dcmpstat/apps/dcmpschk.cc dcmpstat/apps/dcmpsmk.cc dcmpstat/tests/msgserv.cc dcmqrdb/apps/dcmqridx.cc dcmwlm/tests/wltest.cc **** Changes from 2005.12.12 (eichelberg) - Added explicit references to parent template class, needed for gcc 3.4.2 (MinGW port) Affects: ofstd/include/dcmtk/ofstd/ofuoset.h - Update for new include file structure Affects: dcmdata/libsrc/dcdictbi.nul - Removed DOS carriage returns, needed for BSD make Affects: dcmqrdb/libsrc/Makefile.in - Added code needed for compilation with TCP wrappers on OpenBSD Affects: dcmpstat/apps/dcmpschk.cc dcmpstat/apps/dcmpsmk.cc dcmpstat/tests/msgserv.cc dcmwlm/tests/wltest.cc - Added missing include dependency Affects: dcmnet/include/dcmtk/dcmnet/dul.h **** Changes from 2005.12.09 (eichelberg) - Added missing include for dcdebug.h Affects: dcmdata/apps/xml2dcm.cc - Added missing virtual destructors. Thanks to John A Meinel for the report and patch Affects: dcmdata/include/dcmtk/dcmdata/dccodec.h dcmimgle/include/dcmtk/dcmimgle/dipxrept.h dcmnet/include/dcmtk/dcmnet/dul.h dcmpstat/include/dcmtk/dcmpstat/dvpspr.h - Updated build system for dcdeftag/dcdictzz to reflect new directory structure Affects: dcmdata/libsrc/Makefile.in dcmdata/libsrc/mkdeftag.cc dcmdata/libsrc/mkdictbi.cc **** Changes from 2005.12.08 (eichelberg) - Changed include path schema for all DCMTK header files. Files are now always included as "dcmtk/module/file.h", reducing the risk of file name collisions. Removed: */include/*.h Added: */include/dcmtk/*/*.h Affects: */apps/*.cc */apps/*.h */libsrc/*.cc */tests/*.cc dcmjpeg/libijg12/*.h dcmjpeg/libijg16/*.h dcmjpeg/libijg8/*.h dcmnet/libsrc/*.h - Updated Makefile dependencies Affects: */*/Makefile.dep - Updated Makefiles to correctly install header files Affects: */include/Makefile.in config/Makefile.in - Updated configure system to reflect new header file structure Affects: config/configure config/configure.in - Updated CMake project files Removed: */include/CMakeLists.txt Added: */include/dcmtk/*/CMakeLists.txt Affects: */CMakeLists.txt **** Changes from 2005.12.08 (riesmeier) - Fixed wrong figure in man page. Affects: dcmdata/docs/dcm2xml.man dcmdata/docs/dcmdump.man - Fixed problem with CMAKE_INSTALL_PREFIX. Affects: CMakeLists.txt **** Changes from 2005.12.07 (onken) - Changed default and minimum value of --max-read-length to 4 KB Affects: dcmdata/apps/dcmdump.cc dcmdata/apps/dcm2xml.cc dcmdata/docs/dcmdump.man dcmdata/docs/dcm2xml.man **** Changes from 2005.12.06 (riesmeier) - Updated version number. Affects: doxygen/htmldocs.cfg doxygen/manpages.cfg - Prepended escape character '\' to '@' sign in order to avoid a Doxygen error message. Affects: dcmjpeg/docs/dcmmkdir.man **** Changes from 2005.12.05 (riesmeier) - Removed option WITH_SHARED_LIBS. Affects: CMakeLists.txt **** Changes from 2005.12.02 (riesmeier) - Removed superfluous local variable. Changed type of variable "maxReadLength". Affects: dcmdata/apps/dcmdump.cc dcmdata/apps/dcm2xml.cc - Made description of option --max-read-length more consistent with the other command line tools. Affects: dcmdata/apps/dcmdump.cc dcmdata/apps/dcm2xml.cc dcmdata/docs/dcm2xml.man dcmdata/docs/dcmdump.man - Changed macro NO_XFER_DETECTION_FOR_DATASETS into a global option that can be enabled and disabled at runtime. Affects: config/docs/macros.txt dcmdata/apps/dcm2xml.cc dcmdata/include/dcobject.h dcmdata/libsrc/dcdatset.cc dcmdata/libsrc/dcobject.cc - Added new file read mode that makes it possible to distinguish between DICOM files, datasets and other non-DICOM files. For this reason, the last parameter of method loadFile() changed from OFBool to E_FileReadMode. Affects: dcmdata/include/dcfilefo.h dcmdata/include/dctypes.h dcmdata/libsrc/dcfilefo.cc dcmdata/apps/mdfdsman.cc dcmdata/apps/mdfdsman.h dcmpstat/apps/dcmpschk.cc - Added new command line option that ignores the transfer syntax specified in the meta header and tries to detect the transfer syntax automatically from the dataset. Affects: dcmdata/apps/dcm2xml.cc dcmdata/apps/dcmconv.cc dcmdata/apps/dcmcrle.cc dcmdata/apps/dcmdrle.cc dcmdata/apps/dcmdump.cc dcmdata/apps/mdfconen.cc dcmdata/docs/dcm2xml.man dcmdata/docs/dcmconv.man dcmdata/docs/dcmcrle.man dcmdata/docs/dcmdump.man dcmdata/docs/dcmodify.man dcmimage/apps/dcm2pnm.cc dcmimage/apps/dcmquant.cc dcmimage/apps/dcmscale.cc dcmimage/docs/dcm2pnm.man dcmimage/docs/dcmquant.man dcmimage/docs/dcmscale.man dcmjpeg/apps/dcmcjpeg.cc dcmjpeg/docs/dcmcjpeg.man dcmjpeg/docs/dcmj2pnm.man dcmpstat/apps/dcmpsmk.cc dcmpstat/docs/dcmpsmk.man dcmsign/apps/dcmsign.cc dcmsign/docs/dcmsign.man dcmsr/apps/dsr2html.cc dcmsr/apps/dsr2xml.cc dcmsr/apps/dsrdump.cc dcmsr/docs/dsr2html.man dcmsr/docs/dsr2xml.man dcmsr/docs/dsrdump.man - Added new command line option that checks whether a given file starts with a valid DICOM meta header. Affects: dcmdata/apps/dcm2xml.cc dcmdata/apps/dcmconv.cc dcmdata/apps/dcmcrle.cc dcmdata/apps/dcmdump.cc dcmdata/apps/mdfconen.cc dcmdata/apps/mdfconen.h dcmdata/docs/dcm2xml.man dcmdata/docs/dcmconv.man dcmdata/docs/dcmcrle.man dcmdata/docs/dcmdrle.man dcmdata/docs/dcmdump.man dcmdata/docs/dcmodify.man dcmimage/apps/dcm2pnm.cc dcmimage/apps/dcmquant.cc dcmimage/apps/dcmscale.cc dcmimage/docs/dcm2pnm.man dcmimage/docs/dcmquant.man dcmimage/docs/dcmscale.man dcmjpeg/apps/dcmcjpeg.cc dcmjpeg/apps/dcmdjpeg.cc dcmjpeg/docs/dcmcjpeg.man dcmjpeg/docs/dcmdjpeg.man dcmjpeg/docs/dcmj2pnm.man dcmpstat/apps/dcmpsmk.cc dcmpstat/docs/dcmpsmk.man dcmsign/apps/dcmsign.cc dcmsign/docs/dcmsign.man dcmsr/apps/dsr2html.cc dcmsr/apps/dsr2xml.cc dcmsr/apps/dsrdump.cc dcmsr/docs/dsr2html.man dcmsr/docs/dsr2xml.man dcmsr/docs/dsrdump.man - Added experimental support for a "quiet" mode. Affects: dcmdata/apps/dcmdump.cc - Fixed minor layout and formatting issues. Affects: dcmpstat/docs/dcmprscu.man - Fixed minor bug. Affects: dcmdata/libsrc/dcfilefo.cc **** Changes from 2005.12.01 (riesmeier) - Fixed bug in method matchUID (formerly known as DB_MatchUID). Thanks to Erik Sanner for the bug report and fix. Affects: dcmqrdb/libsrc/dcmqrdbi.cc - Added heuristics for images where the value of HighBit is 0. Thanks to Michael Doppler for the suggestion and code. Affects: dcmimgle/libsrc/diimage.cc - Added support for DICOM objects where the dataset is stored with a different transfer syntax than specified in the meta header. The new behaviour can be disabled by compiling with the macro NO_XFER_DETECTION_FOR_DATASETS defined. Thanks to Michael Doppler for the suggestion and code. Affects: config/docs/macros.txt dcmdata/libsrc/dcdatset.cc **** Changes from 2005.11.30 (onken) - Added check to decline automatic IJG color space conversion of signed pixel data, because IJG lib only handles unsigned input for conversions. Affects: dcmjpeg/include/djdecabs.h dcmjpeg/include/djdijg8.h dcmjpeg/include/djdijg12.h dcmjpeg/include/djdijg16.h dcmjpeg/libsrc/djdijg8.cc dcmjpeg/libsrc/djdijg12.cc dcmjpeg/libsrc/djdijg16.cc dcmjpeg/include/djutils.h dcmjpeg/libsrc/djutils.cc dcmjpeg/libsrc/djcodecd.cc - Added hint concerning --convert-never option when color conversion fails Affects: dcmjpeg/apps/dcmdjpeg.cc - Added standard parameter values for MdfDatasetManager::saveFile() Affects: dcmdata/apps/mdfdsman.h **** Changes from 2005.11.30 (riesmeier) - Added support for X-Ray Radiation Dose SR documents. Added: dcmsr/include/dsrxrdcc.h dcmsr/libsrc/dsrxrdcc.cc Affects: dcmsr/apps/dsr2xml.xsd dcmsr/docs/dsr2html.man dcmsr/docs/dsr2xml.man dcmsr/docs/dsrdump.man dcmsr/docs/xml2dsr.man dcmsr/include/dsrdoc.h dcmsr/include/dsrtypes.h dcmsr/libsrc/CMakeLists.txt dcmsr/libsrc/Makefile.dep dcmsr/libsrc/Makefile.in dcmsr/libsrc/dsrtypes.cc - Added missing header file "dcdebug.h". Affects: dcmdata/apps/xml2dcm.cc **** Changes from 2005.11.30 (eichelberg) - Removed references to OpenSSL header files from Makefile dependencies Affects: dcmnet/apps/Makefile.dep dcmpstat/apps/Makefile.dep dcmpstat/libsrc/Makefile.dep dcmqrdb/libsrc/Makefile.dep dcmsign/apps/Makefile.dep dcmsign/libsrc/Makefile.dep dcmtls/libsrc/Makefile.dep - Fixed bug in dcmjpeg module that caused the new lossless compressor to be used for lossy processes Affects: dcmjpeg/libsrc/djcodece.cc - Fixed typo Affects: dcmjpeg/docs/dcmcjpeg.man **** Changes from 2005.11.29 (onken) - Added commandline options --accept-acr-nema and --accept-palettes (same as in dcm2pnm) to dcmcjpeg and extended dcmjpeg to support these options. Thanks to Gilles Mevel for suggestion. Affects: dcmjpeg/include/djcparam.h dcmjpeg/include/djencode.h dcmjpeg/libsrc/djcparam.cc dcmjpeg/libsrc/djencode.cc dcmjpeg/libsrc/djcodece.cc dcmjpeg/apps/dcmcjpeg.cc dcmjpeg/docs/dcmcjpeg.man **** Changes from 2005.11.29 (eichelberg) - Added minimal support for compressed transfer syntaxes to dcmqrscp. No on-the-fly decompression is performed, but compressed images can be stored and retrieved. Thanks to A. M. Raportirenko for the submission. Affects: dcmqrdb/apps/dcmqrscp.cc dcmqrdb/docs/dcmqrscp.man dcmqrdb/include/dcmqropt.h dcmqrdb/libsrc/dcmqrcbm.cc dcmqrdb/libsrc/dcmqropt.cc dcmqrdb/libsrc/dcmqrptb.cc dcmqrdb/libsrc/dcmqrscp.cc - Added new flag keepDBHandleDuringAssociation_ which allows to determine whether a DB handle is kept open for a complete association or a single DIMSE message only. Also improved error handling of file locking. Affects: dcmqrdb/include/dcmqropt.h dcmqrdb/libsrc/dcmqropt.cc dcmqrdb/libsrc/dcmqrscp.cc **** Changes from 2005.11.29 (onken) - Added support for "true" lossless compression in dcmjpeg, that doesn't use dcmimage classes, but compresses raw pixel data (8 and 16 bit) to avoid losses in quality caused by color space conversions or modality transformations etc. Affects: dcmjpeg/include/djcodece.h dcmjpeg/include/djcparam.h dcmjpeg/include/djencode.h dcmjpeg/libsrc/djcodece.cc dcmjpeg/libsrc/djcparam.cc dcmjpeg/libsrc/djencode.cc - Corresponding commandline option in dcmcjpeg (new default) Affects: dcmjpeg/apps/dcmcjpeg.cc dcmjpeg/docs/dcmcjpeg.man **** Changes from 2005.11.28 (eichelberg) - Updated Makefile dependencies Affects: */*/Makefile.dep - File dcdebug.h is not included by any other header file in the toolkit anymore, to minimize the risk of name clashes of macro debug(). Affects: dcmdata/apps/dcm2xml.cc dcmdata/apps/dcmgpdir.cc dcmdata/apps/pdf2dcm.cc dcmdata/include/dctk.h dcmpstat/apps/dcmmkcrv.cc dcmpstat/apps/dcmmklut.cc dcmpstat/apps/dcmp2pgm.cc dcmpstat/apps/dcmprscp.cc dcmpstat/apps/dcmprscu.cc dcmpstat/apps/dcmpschk.cc dcmpstat/apps/dcmpsprt.cc dcmpstat/apps/dcmpsrcv.cc dcmpstat/apps/dcmpssnd.cc - Renamed macros in dcdebug.h Affects: dcmdata/include/dcdebug.h dcmdata/libsrc/dcbytstr.cc dcmdata/libsrc/dcdatset.cc dcmdata/libsrc/dcdebug.cc dcmdata/libsrc/dcdicdir.cc dcmdata/libsrc/dcdirrec.cc dcmdata/libsrc/dcfilefo.cc dcmdata/libsrc/dcitem.cc dcmdata/libsrc/dcmetinf.cc dcmdata/libsrc/dcpixseq.cc dcmdata/libsrc/dcsequen.cc - Minor adaptations needed for Borland Builder 6 Affects: config/include/cfwin32.h dcmdata/libsrc/dcdict.cc - Fixed resource leak in Win32 command execution. Added option --exec-sync that causes synchronous command execution on Windows. Thanks to DCMTK forum user "eludias" for the patch. Affects: dcmnet/apps/storescp.cc dcmnet/docs/storescp.man - Updated documentation Affects: dcmdata/docs/datadict.txt - Fixed bug affecting JPEG compression with 12 or 16 bits/pixel, where Huffman table optimization is required but was not always enabled. Thanks to Dennis Ballance for the bug report. Affects: dcmjpeg/libsrc/djeijg12.cc dcmjpeg/libsrc/djeijg16.cc **** Changes from 2005.11.25 (eichelberg) - StoreSCP now supports multi-process mode both on Posix and Win32 platforms where a separate client process is forked for each incoming association. Thanks to Heiko Muench for the implementation and to Alain Runa for the submission. Affects: dcmnet/apps/storescp.cc dcmnet/docs/storescp.man dcmnet/include/cond.h dcmnet/include/dul.h dcmnet/libsrc/assoc.cc dcmnet/libsrc/dul.cc **** Changes from 2005.11.24 (eichelberg) - Fixed bug in code that prepares a byte stream that is fed into the MAC algorithm when creating or verifying a digital signature. The previous implementation was non-conformant when signatures included compressed (encapsulated) pixel data because the item length was included in the byte stream, while it should not. The global variable dcmEnableOldSignatureFormat and a corresponding command line option in dcmsign allow to re-enable the old implementation. Thanks to "Firas Haj-Husein" for the bug report. Affects: dcmdata/include/dcobject.h dcmdata/include/dcpxitem.h dcmdata/libsrc/dcobject.cc dcmdata/libsrc/dcpxitem.cc dcmsign/apps/dcmsign.cc dcmsign/docs/dcmsign.man **** Changes from 2005.11.23 (eichelberg) - Added support for AES ciphersuites in TLS module. All TLS-enabled tools now support the "AES TLS Secure Transport Connection Profile". Affects: dcmnet/apps/echoscu.cc dcmnet/apps/findscu.cc dcmnet/apps/storescp.cc dcmnet/apps/storescu.cc dcmpstat/apps/dcmprscp.cc dcmpstat/apps/dcmprscu.cc dcmpstat/apps/dcmpsrcv.cc dcmpstat/apps/dcmpssnd.cc dcmpstat/libsrc/dviface.cc dcmtls/docs/ciphers.txt dcmtls/libsrc/tlslayer.cc - Changed names of OpenSSL DLLs for Win32 release build - there are just too many tools that install "their" version of libeay32.dll and ssleay32.dll in c:\windows\system32 and cause DLL conflicts. We now call our versions of the OpenSSL DLLs dcmtkssl.dll and dcmtkeay.dll. Affects: CMakeLists.txt dcmnet/apps/CMakeLists.txt **** Changes from 2005.11.22 (eichelberg) - Added option to movescu that allows graceful handling of Move SCPs that send illegal datasets following pending C-MOVE-RSP messages. Affects: dcmnet/apps/movescu.cc dcmnet/docs/movescu.man dcmnet/include/dimse.h dcmnet/libsrc/dimmove.cc **** Changes from 2005.11.17 (eichelberg) - When locating DICOM tags by name in DcmDataDictionary::findEntry, public tags are now preferred over private tags of the same name. Thanks to Bernd Kuemmerlen for the suggestion and the code. Affects: dcmdata/libsrc/dcdict.cc - Disabled warning C4996 ("function was declared deprecated") on VS2005 Affects: config/include/cfwin32.h - Added command line options for DIMSE and ACSE timeouts Affects: dcmnet/apps/echoscu.cc dcmnet/apps/findscu.cc dcmnet/apps/movescu.cc dcmnet/apps/storescp.cc dcmnet/apps/storescu.cc dcmnet/docs/echoscu.man dcmnet/docs/findscu.man dcmnet/docs/movescu.man dcmnet/docs/storescp.man dcmnet/docs/storescu.man dcmqrdb/apps/dcmqrscp.cc dcmqrdb/apps/dcmqrti.cc dcmqrdb/docs/dcmqrscp.man dcmqrdb/docs/dcmqrti.man dcmqrdb/include/dcmqropt.h dcmqrdb/include/dcmqrtis.h dcmqrdb/libsrc/dcmqrcbg.cc dcmqrdb/libsrc/dcmqrcbm.cc dcmqrdb/libsrc/dcmqropt.cc dcmqrdb/libsrc/dcmqrscp.cc dcmqrdb/libsrc/dcmqrtis.cc dcmwlm/apps/wlcefs.cc dcmwlm/apps/wlcefs.h dcmwlm/docs/wlmscpfs.man dcmwlm/include/wlmactmg.h dcmwlm/libsrc/wlmactmg.cc - Fixed warnings reported by VS2005 Affects: dcmdata/libsrc/dcuid.cc **** Changes from 2005.11.17 (onken) - Option --max-read-length now uses OFCommandLine to check, whether option value is in range Affects: dcmdata/apps/dcmdump.cc dcmdata/apps/dcm2xml.cc **** Changes from 2005.11.16 (riesmeier) - Added support for Procedure Log SR documents. Affects: dcmsr/apps/dsr2xml.xsd - Added support for X-Ray Radiation Dose SR SOP class. Affects: dcmdata/include/dcuid.h dcmdata/libsrc/dcuid.cc dcmnet/docs/movescu.man dcmnet/docs/storescp.man dcmnet/docs/storescu.man dcmnet/etc/storescp.cfg dcmnet/etc/storescu.cfg dcmqrdb/docs/dcmqrscp.man - Synchronized list of supported SOP classes in source code and documentation. Affects: dcmdata/libsrc/dcuid.cc dcmnet/docs/movescu.man dcmnet/docs/storescp.man dcmnet/docs/storescu.man dcmqrdb/docs/dcmqrscp.man dcmqrdb/docs/dcmqrti.man - Revised list of presentation contexts. Affects: dcmnet/etc/storescp.cfg dcmnet/etc/storescu.cfg - Fixed some layout and formatting issues. Affects: dcmnet/docs/storescp.man dcmnet/docs/termscu.man dcmqrdb/docs/dcmqrscp.man dcmqrdb/docs/dcmqrti.man **** Changes from 2005.11.16 (wilkens) - The main CMakeLists.txt file now distinguishes between different Microsoft C/C++ compilers when setting compiler options. Affects: CMakeLists.txt **** Changes from 2005.11.16 (eichelberg) - Set association timeout in ASC_initializeNetwork to 30 seconds. This improves the responsiveness of the tools if the peer blocks during assoc negotiation. Affects: dcmnet/apps/echoscu.cc dcmnet/apps/findscu.cc dcmnet/apps/movescu.cc dcmnet/apps/storescp.cc dcmnet/apps/storescu.cc dcmnet/apps/termscu.cc dcmpstat/apps/dcmprscp.cc dcmpstat/apps/dcmpsrcv.cc dcmpstat/apps/dcmpssnd.cc dcmpstat/libsrc/dviface.cc dcmpstat/libsrc/dvpspr.cc dcmqrdb/apps/dcmqrscp.cc dcmqrdb/apps/dcmqrti.cc dcmwlm/libsrc/wlmactmg.cc - Fixed bug in requestAssociationTCP that could result in association request failures on systems with high CPU load if an association timout was specified in dcmConnectionTimeout, because in this case the socket was not always correctly reset to blocking mode. Thanks to Kent Tse for the bug report and bug fix. Affects: dcmnet/libsrc/dulfsm.cc **** Changes from 2005.11.16 (onken) - Added "--max-read-length" option to dcmdump and dcm2xml to override DCMTK-internal threshold (4096K) for long attribute values. Affects: dcmdata/apps/dcmdump.cc dcmdata/apps/dcm2xml.cc dcmdata/docs/dcmdump.man dcmdata/docs/dcm2xml.man **** Changes from 2005.11.15 (eichelberg) - Clarified description of PDU size reported by dump_pdu(). Affects: dcmnet/libsrc/dulfsm.cc - Added new pseudo VR type EVR_lt that is used for LUT Data when read in implicit VR, which may be US, SS or OW. DCMTK always treats EVR_lt like OW. Affects: dcmdata/include/dcvr.h dcmdata/libsrc/dcdictzz.cc dcmdata/libsrc/dcitem.cc dcmdata/libsrc/dcvr.cc dcmdata/libsrc/dcvrobow.cc dcmdata/libsrc/dcvrpobw.cc dcmdata/libsrc/dicom.dic - Added new global flag dcmEnableUnknownVRConversion that enables the automatic re-conversion of defined length UN elements read in an explicit VR transfer syntax, if the real VR is defined in the data dictionary. Default is OFFalse, i.e. to retain the previous behavior. Affects: dcmdata/include/dcitem.h dcmdata/include/dcvr.h dcmdata/libsrc/dcitem.cc dcmdata/libsrc/dcsequen.cc dcmdata/libsrc/dcvr.cc - Added new command line option --convert-un that enables the re-conversion of defined length UN elements. Affects: dcmdata/apps/dcmconv.cc dcmdata/apps/dcmdump.cc dcmdata/docs/dcmconv.man dcmdata/docs/dcmdump.man **** Changes from 2005.11.15 (wilkens) - Modified main CMakeLists.txt file to contain paths to new support libraries. Affects: CMakeLists.txt **** Changes from 2005.11.14 (eichelberg) - Now checking OpenSSL version number to allow compilation both with old and new versions due to incompatible API change in OpenSSL 0.9.8. Affects: dcmsign/libsrc/sicert.cc - Added configure tests for int64_t, uint64_t and stdint.h. Tests for longlong and ulonglong now use AC_CHECK_TYPES. Affects: config/configure config/configure.in config/include/cfunix.h.in config/include/cfwin32.h - Changed some function return types from int to ijg_boolean, to avoid compilation errors if the ijg_boolean type is ever changed. Suggested by Igor Okulist Affects: dcmjpeg/libsrc/djdijg12.cc dcmjpeg/libsrc/djdijg16.cc dcmjpeg/libsrc/djdijg8.cc dcmjpeg/libsrc/djeijg12.cc dcmjpeg/libsrc/djeijg16.cc dcmjpeg/libsrc/djeijg8.cc - Configure test AC_CHECK_INTP_SELECT now only includes header files that have been successfully tested for presence before. Affects: config/aclocal.m4 config/configure - Included cstdlib, needed on HP/UX 10. Affects: dcmpstat/tests/msgserv.cc **** Changes from 2005.11.14 (riesmeier) - Made method getFilename() const. Affects: dcmdata/apps/mdfdsman.cc dcmdata/apps/mdfdsman.h **** Changes from 2005.11.14 (onken) - Added data dictionary name support for "--key" option. Affects: dcmnet/apps/findscu.cc dcmnet/apps/movescu.cc dcmnet/docs/findscu.man dcmnet/docs/movescu.man **** Changes from 2005.11.11 (onken) - Added options for JPEG2000 support (lossy and lossless). Affects: dcmnet/apps/storescp.cc dcmnet/apps/storescu.cc dcmnet/apps/movescu.cc dcmnet/docs/storescp.man dcmnet/docs/storescu.man dcmnet/docs/movescu.man **** Changes from 2005.11.11 (wilkens) - Removed superfluous compiler option /GR- in CMakeLists.txt file to keep MS Visual Studio 2003 compiler quiet. Affects: CMakeLists.txt **** Changes from 2005.11.11 (eichelberg) - Added explicit DcmDataset::clear() implementation. Affects: dcmdata/include/dcdatset.h dcmdata/libsrc/dcdatset.cc - Newer OpenSSL versions must be linked against libdl. Added configure test to check for presence of this library, which is then added to OPENSSLLIBS in config/Makefile.def by configure. Affects: config/configure config/configure.in - Changed parameter to const to allow compilation with OpenSSL 0.9.8 Affects: dcmsign/libsrc/sicert.cc **** Changes from 2005.11.10 (onken) - Added option "--timenames" to support filenames based on timestamps. Thanks to Dr. Michael Heber for suggested code. Affects: dcmnet/apps/storescp.cc dcmnet/apps/storescp.man - Added option "--file-extension", that allows to append a suffix to each filename. Affects: dcmnet/apps/storescp.cc dcmnet/docs/storescp.man **** Changes from 2005.11.09 (riesmeier) - Updated script for new command line tool "dcmqrscq". Fixed wrong path for tool "dcmmkdir". Affects: config/changext **** Changes from 2005.11.09 (wilkens) - Changed typedefs for longlong and ulonglong to use __int64 instead of long long. Affects: config/include/cfwin32.h - Added #ifdef environments around longlong/ulonglong typedefs. Affects: config/include/cfwin32.h **** Changes from 2005.11.08 (wilkens) - Deleted superfluous CMake rule file. Removed: ALL_BUILD_force_1.rule - Updated class WlmDataSourceFileSystem: function StartFindRequest will return an error in case SetReadlock returns an error. Affects: dcmwlm/libsrc/wldsfs.cc **** Changes from 2005.11.07 (eichelberg) - Implemented DcmFileFormat::clear(). Now the loadFile methods in class DcmFileFormat and class DcmDataset both make sure that clear() is called before new data is read, allowing for a re-use of the object. Affects: dcmdata/libsrc/dcdatset.cc dcmdata/libsrc/dcfilefo.cc - All tools that both read and write a DICOM file now call loadAllDataIntoMemory() to make sure they do not destroy a file when output = input. Affects: dcmdata/apps/dcmcrle.cc dcmdata/apps/dcmdrle.cc dcmjpeg/apps/dcmcjpeg.cc dcmjpeg/apps/dcmdjpeg.cc dcmsign/apps/dcmsign.cc - Cleaned up some copy constructors in the DcmObject hierarchy. Affects: dcmdata/include/dcdicdir.h dcmdata/include/dcmetinf.h dcmdata/libsrc/dcdicdir.cc dcmdata/libsrc/dcdirrec.cc dcmdata/libsrc/dcitem.cc dcmdata/libsrc/dcmetinf.cc dcmdata/libsrc/dcsequen.cc - Replaced old AC_CHECK_TYPE macros by newly developed AC_TYPDEF macro. Missing types are now declared by type definition and not as macros anymore. Affects: config/aclocal.m4 config/configure config/configure.in config/include/cfunix.h.in config/include/cfwin32.h - Removed MSVC6 project files from CVS repository. These need to be generated through CMake in the future. Removed: */*/*.dsp dcmtk.dsw **** Changes from 2005.11.04 (eichelberg) - Updated data dictionary for CP Pack 33 (final text) Affects: dcmdata/include/dcdeftag.h dcmdata/libsrc/dcdictzz.cc dcmdata/libsrc/dicom.dic **** Changes from 2005.11.03 (eichelberg) - The movescu tool does not open any listen port by default anymore. Affects: dcmnet/apps/movescu.cc dcmnet/docs/movescu.man dcmnet/libsrc/dul.cc - Added transfer syntax selection options to findscu. Affects: dcmnet/apps/findscu.cc dcmnet/docs/findscu.man **** Changes from 2005.10.27 (riesmeier) - Added support for Encapsulated Document, Real World Value Mapping and Hanging Protocol objects to DICOMDIR tools. Affects: dcmdata/include/dcddirif.h dcmdata/include/dcdirrec.h dcmdata/libsrc/dcddirif.cc dcmdata/libsrc/dcdirrec.cc - Added support for new Color Presentation State objects to DICOMDIR tools. Affects: dcmdata/libsrc/dcddirif.cc - Minor code changes, e.g. reworked handling of type 2 attributes. Affects: dcmdata/libsrc/dcddirif.cc **** Changes from 2005.10.26 (riesmeier) - Slightly modified code to use more of the "new" helper functions. Affects: dcmdata/apps/pdf2dcm.cc **** Changes from 2005.10.25 (eichelberg) - Added new tool pdf2dcm that allows to convert PDF files to DICOM Encapsulated PDF Storage SOP instances. Added: dcmdata/apps/pdf2dcm.cc dcmdata/docs/pdf2dcm.man Affects: dcmdata/apps/CMakeLists.txt dcmdata/apps/Makefile.dep dcmdata/apps/Makefile.in - Updated list of UIDs and added support for new transfer syntaxes and storage SOP classes. Affects: dcmdata/include/dcuid.h dcmdata/include/dcxfer.h dcmdata/libsrc/dcddirif.cc dcmdata/libsrc/dcuid.cc dcmdata/libsrc/dcxfer.cc dcmnet/apps/echoscu.cc dcmnet/apps/movescu.cc dcmnet/apps/storescp.cc dcmnet/apps/storescu.cc dcmnet/libsrc/dimse.cc dcmpstat/apps/dcmpsrcv.cc dcmpstat/apps/dcmpssnd.cc dcmqrdb/libsrc/dcmqrcbm.cc dcmqrdb/libsrc/dcmqrptb.cc dcmqrdb/libsrc/dcmqrscp.cc dcmqrdb/libsrc/dcmqrtis.cc **** Changes from 2005.10.24 (eichelberg) - Updated data dictionary. Affects: dcmdata/include/dcdeftag.h dcmdata/libsrc/dcdictzz.cc dcmdata/libsrc/dicom.dic - Added private tags for Philips Intera Achieva Affects: dcmdata/libsrc/private.dic **** Changes from 2005.09.23 (wilkens) - Added attribute PatientsBirthDate as a matching key attribute to wlmscpfs. Thanks to Andre M. Descombes for the code template. Affects: dcmwlm/include/wltypdef.h dcmwlm/include/wlfsim.h dcmwlm/include/wlds.h dcmwlm/libsrc/wlds.cc dcmwlm/libsrc/wlfsim.cc dcmwlm/docs/wlmscpfs.man **** Changes from 2005.09.15 (riesmeier) - Completely reworked CMake project files. Added: config/CMakeLists.txt config/include/CMakeLists.txt dcmdata/docs/CMakeLists.txt dcmdata/include/CMakeLists.txt dcmimage/include/CMakeLists.txt dcmimgle/include/CMakeLists.txt dcmimgle/tests/CMakeLists.txt dcmjpeg/include/CMakeLists.txt dcmjpeg/libijg12/CMakeLists.txt dcmjpeg/libijg16/CMakeLists.txt dcmjpeg/libijg8/CMakeLists.txt dcmnet/docs/CMakeLists.txt dcmnet/etc/CMakeLists.txt dcmnet/include/CMakeLists.txt dcmpstat/etc/CMakeLists.txt dcmpstat/include/CMakeLists.txt dcmpstat/tests/CMakeLists.txt dcmqrdb/docs/CMakeLists.txt dcmqrdb/etc/CMakeLists.txt dcmqrdb/include/CMakeLists.txt dcmsign/include/CMakeLists.txt dcmsr/include/CMakeLists.txt dcmtls/docs/CMakeLists.txt dcmtls/include/CMakeLists.txt dcmwlm/docs/CMakeLists.txt dcmwlm/include/CMakeLists.txt ofstd/include/CMakeLists.txt doxygen/CMakeLists.txt Affects: CMakeLists.txt dcmdata/CMakeLists.txt dcmdata/apps/CMakeLists.txt dcmdata/libsrc/CMakeLists.txt dcmimage/CMakeLists.txt dcmimage/apps/CMakeLists.txt dcmimage/libsrc/CMakeLists.txt dcmimgle/CMakeLists.txt dcmimgle/apps/CMakeLists.txt dcmimgle/libsrc/CMakeLists.txt dcmjpeg/CMakeLists.txt dcmjpeg/apps/CMakeLists.txt dcmjpeg/libsrc/CMakeLists.txt dcmnet/CMakeLists.txt dcmnet/apps/CMakeLists.txt dcmnet/libsrc/CMakeLists.txt dcmpstat/CMakeLists.txt dcmpstat/apps/CMakeLists.txt dcmpstat/libsrc/CMakeLists.txt dcmqrdb/CMakeLists.txt dcmqrdb/apps/CMakeLists.txt dcmqrdb/libsrc/CMakeLists.txt dcmsign/CMakeLists.txt dcmsign/apps/CMakeLists.txt dcmsign/libsrc/CMakeLists.txt dcmsr/CMakeLists.txt dcmsr/apps/CMakeLists.txt dcmsr/libsrc/CMakeLists.txt dcmsr/tests/CMakeLists.txt dcmtls/CMakeLists.txt dcmtls/libsrc/CMakeLists.txt dcmwlm/CMakeLists.txt dcmwlm/apps/CMakeLists.txt dcmwlm/libsrc/CMakeLists.txt ofstd/CMakeLists.txt ofstd/libsrc/CMakeLists.txt - Fixed wrong value for LONGCOL. Affects: dcmnet/apps/termscu.cc - Removed outdated MSVC workspace file. Removed: dcmtk_all.dsw **** Changes from 2005.09.12 (wilkens) - Added command line tool termscu in dcmnet; this tool can be used to shutdown DCMTK server applications which support negotiating the private Shutdown SOP Class in DCMTK. Added: dcmnet/apps/termscu.cc dcmnet/docs/termscu.man Affects: dcmnet/apps/CMakeLists.txt dcmnet/apps/Makefile.dep dcmnet/apps/Makefile.in dcmnet/docs/dcmnet.dox **** Changes from 2005.08.30 (eichelberg) - Added command line option --inetd, which allows storescp to run from inetd. Thanks to Karl Kiniger for the inetd code. Affects: dcmnet/apps/storescp.cc dcmnet/docs/storescp.man dcmnet/libsrc/dul.cc - Added Verification SOP Class to sample configuration file Affects: dcmnet/etc/storescp.cfg - Fixed syntax error reported by Visual Studio 2003 Affects: dcmqrdb/libsrc/dcmqrcbm.cc - The worklist SCP now rejects an association when no presentation context was accepted while processing the association request. Needed for some SCUs which become confused otherwise. Affects: dcmwlm/libsrc/wlmactmg.cc **** Changes from 2005.07.27 (riesmeier) - Fixed bug in getOFStringArray() which prevented the result string from being cleared under certain circumstances. Thanks to Alexander Fedotov for the bug report. Affects: dcmdata/libsrc/dcelem.cc - Added methods that allow to go to a named node, i.e. using a given concept name. Affects: dcmsr/include/dsrdoctr.h dcmsr/libsrc/dsrdoctr.cc - Added flag to iterate() method indicating whether to perform a "deep search". Affects: dcmsr/include/dsrtncsr.h dcmsr/libsrc/dsrtncsr.cc - Added method that allows to add a DICOM dataset to the list of references. Affects: dcmsr/include/dsrsoprf.h dcmsr/libsrc/dsrsoprf.cc - Added workaround to allow by-reference relationships as needed for some Mammography CAD SR templates. Affects: dcmsr/libsrc/dsrmamcc.cc - Added provisional support for CP571, i.e. allow certain relationships needed for TID 5203 (Echo Measurement). Affects: dcmsr/libsrc/dsrcomcc.cc dcmsr/libsrc/dsrenhcc.cc - Replaced "cd ; " by "cd && " in order to make sure that the is only executed if the exists. Thanks to Juergen Salk for the suggestion. Affects: configure config/rootconf Makefile - Updated reference to DICOM standard edition. Affects: dcmsr/include/dsrdoc.h - Fixed minor layout issues. Affects: dcmdata/docs/dcmconv.man - Fixed problem with pthread_t type cast and gcc 4.0. Affects: ofstd/libsrc/ofthread.cc - Added reference to public discussion forum. Affects: README **** Changes from 2005.07.26 (riesmeier) - Added new command line option that allows to clip a rectangular image region (combination with scaling not yet fully implemented in corresponding classes) Affects: dcmimage/apps/dcmscale.cc dcmimage/docs/dcmscale.man - Update ImageType, add DerivationDescription and SourceImageSequence. Affects: dcmimage/apps/dcmscale.cc - Cleaned up use of CERR and COUT. Affects: dcmimage/apps/dcmscale.cc **** Changes from 2005.07.26 (eichelberg) - Added option to RLE decoder that allows to correctly decode images with incorrect byte order of byte segments (LSB instead of MSB). Affects: dcmdata/apps/dcmdrle.cc dcmdata/docs/dcmdrle.man dcmdata/include/dcrlecp.h dcmdata/include/dcrledrg.h dcmdata/libsrc/dcrleccd.cc dcmdata/libsrc/dcrlecp.cc dcmdata/libsrc/dcrledrg.cc **** Changes from 2005.07.01 (wilkens) - Modified a couple of "delete" statements to "delete[]" in order to get rid of valgrind's "Mismatched free() / delete / delete []" error messages. Affects: ofstd/include/ofset.h dcmwlm/libsrc/wlds.cc dcmwlm/libsrc/wldsfs.cc dcmwlm/libsrc/wlfsim.cc **** Changes from 2005.06.24 (riesmeier) - Fixed problem in constructor which uses a linear characteristic curve. Affects: dcmimgle/libsrc/didispfn.cc - Added support for internal VR "xs" to putAndInsertXXX() helper methods. Affects: dcmdata/include/dcitem.h dcmdata/libsrc/dcitem.cc - Check dependence between command line options --write-binary-data and --encode-base64. Affects: dcmdata/apps/dcm2xml.cc **** Changes from 2005.06.16 (eichelberg) - Added system include files needed on Solaris Affects: dcmqrdb/libsrc/dcmqrcbg.cc dcmqrdb/libsrc/dcmqrcbm.cc dcmqrdb/libsrc/dcmqrtis.cc - Fixed typo in method name Affects: dcmqrdb/libsrc/dcmqrtis.h dcmqrdb/apps/dcmqrti.cc - Removed redundant class name, needed for gcc 3.4 Affects: dcmwlm/include/wlfsim.h - Fixed Makefile Affects: dcmqrdb/etc/Makefile.in **** Changes from 2005.06.15 (riesmeier) - Fixed bug which prevented rotateTopDown() from rotating multi-frame images correctly (only the first frame was actually rotated). Thanks to Indrajit Ghosh for the bug report and suggested fix. Affects: dcmimgle/include/dirotat.h - Fixed bug which prevented flipHorzVert() from flipping multi-frame images correctly (only the first frame was actually flipped). Affects: dcmimgle/include/diflipt.h **** Changes from 2005.06.13 (riesmeier) - Added new options to disable check on pixel encoding and transfer syntax. Affects: dcmdata/apps/dcmgpdir.cc dcmdata/include/dcddirif.h dcmdata/libsrc/dcddirif.cc dcmjpeg/docs/dcmmkdir.man - Fixed bug: Images with non-standard spatial resolution were rejected even if "Resolution Check" was disabled. Affects: dcmdata/libsrc/dcddirif.cc - Fixed typo in copyright note. Affects: dcmdata/apps/dcm2xml.dtd **** Changes from 2005.05.27 (eichelberg) - Fixed bug that caused incorrect sequence and item lengths to be computed for compressed pixel data embedded in a sequence such as the IconImageSequence. Thanks to Kent Tse for the bug report and fix. Affects: dcmdata/libsrc/dcpixseq.cc **** Changes from 2005.05.26 (eichelberg) - Renamed isIconImage flag to alwaysUnencapsulated to clarify meaning. Added public method DcmPixelData::setNonEncapsulationFlag() that allows DcmCodec instances to enable the flag. Improved documentation. Affects: dcmdata/include/dcpixel.h dcmdata/libsrc/dcpixel.cc - Now reading DICOM files in which the meta header group length attribute (0002,0000) is absent, based on a heuristic that checks for group 0002 attribute tags. New behaviour can be disabled by compiling with the macro REJECT_FILE_IF_META_GROUP_LENGTH_ABSENT defined. Thanks to Michael Doppler for the patch. Affects: config/docs/macros.txt dcmdata/libsrc/dcmetinf.cc - Added option --read-dataset to dcmdjpeg that allows to decompress JPEG compressed DICOM objects that have been stored as dataset without meta-header. Such a thing should not exist since the transfer syntax cannot be reliably determined without meta-header, but unfortunately it does. Thanks to Anibal Jodorcovsky for the suggestion and a (slightly different) implementation. Affects: dcmjpeg/apps/dcmdjpeg.cc dcmjpeg/docs/dcmdjpeg.man - Added option --read-dataset to dcmdrle that allows to decompress RLE compressed DICOM objects that have been stored as dataset without meta-header. Such a thing should not exist since the transfer syntax cannot be reliably determined without meta-header, but unfortunately it does. Affects: dcmdata/apps/dcmdrle.cc dcmdata/docs/dcmdrle.man **** Changes from 2005.05.10 (eichelberg) - Added support for reading UN elements with undefined length according to CP 246. The global flag dcmEnableCP246Support allows to revert to the prior behaviour in which UN elements with undefined length were parsed like a normal explicit VR SQ element. Affects: dcmdata/apps/dcmconv.cc dcmdata/docs/dcmconv.man dcmdata/include/dcobject.h dcmdata/include/dcsequen.h dcmdata/libsrc/dcitem.cc dcmdata/libsrc/dcobject.cc dcmdata/libsrc/dcsequen.cc - Updated config.guess and config.sub by newer versions timestamped 2005-04-22 Affects: config/config.guess config/config.sub - Updated configure script to define CXXFLAGS as needed for MacOS X 10.4 (Tiger) which is recognised as darwin8.0.0 by configure (config.guess) Affects: config/configure.in config/configure **** Changes from 2005.05.04 (wilkens) - Modified handling of the attributes ScheduledProcedureStepDescription/ ScheduledProtocolCodeSequence and RequestedProcedureDescription/ RequestedProcedureCodeSequence in wlmscpfs: in case one of the two attributes does not contain any information in a C-Find RSP message which is about to be sent to an SCU, the empty attribute will be removed from the C-Find RSP message before the message is sent, in order not to send an invalid RSP message. Affects: dcmwlm/libsrc/wldsfs.cc dcmwlm/include/wldsfs.h - Added two command line options --enable-file-reject (default) and --disable-file-reject to wlmscpfs: these options can be used to enable or disable a file rejection mechanism which makes sure only complete worklist files will be used during the matching process. A worklist file is considered to be complete if it contains all necessary type 1 information which the SCP might have to return to an SCU in a C-Find response message. Affects: dcmwlm/libsrc/wldsfs.cc dcmwlm/libsrc/wlfsim.cc dcmwlm/apps/wlcefs.h dcmwlm/apps/wlcefs.cc dcmwlm/include/wlds.h dcmwlm/include/wldsfs.h dcmwlm/include/wlfsim.h dcmwlm/docs/wlmscpfs.man **** Changes from 2005.04.22 (eichelberg) - Passing calling aetitle to DcmQueryRetrieveDatabaseHandleFactory::create DBHandle to allow configuration retrieval based on calling aetitle. Affects: dcmqrdb/include/dcmqrdba.h dcmqrdb/include/dcmqrdbi.h dcmqrdb/libsrc/dcmqrdbi.cc dcmqrdb/libsrc/dcmqrscp.cc - Minor update to avoid warning on Win32 Affects: dcmqrdb/apps/dcmqrscp.cc **** Changes from 2005.04.07 (riesmeier) - Added support for UTF-8 character set to XML Schema. Affects: dcmsr/apps/dsr2xml.xsd - Initialize member variables for user and group name. Affects: dcmqrdb/libsrc/dcmqrcnf.cc - Fixed minor layout and formatting issues. Affects: dcmqrdb/docs/dcmqrcnf.txt dcmqrdb/docs/dcmqrset.txt - Replaced text "wlistctn" by "wlmscpfs". Affects: INSTALL - Replaced text "imagectn" by "dcmqrdb". Added hyperlink to discussion forum. Affects: doxygen/htmldocs.dox **** Changes from 2005.04.04 (eichelberg) - Fixed warning on Win32 platform Affects: dcmqrdb/libsrc/dcmqrcbm.cc - Fixed typo Affects: dcmpstat/CMakeLists.txt - Updated INSTALL file to reflect module dcmqrdb Affects: INSTALL - Updated documentation of macros to reflect module dcmqrdb Affects: config/docs/macros.txt - Updated configuration file to use dcmqrscp instead of imagectn Affects: dcmpstat/etc/dcmpstat.cfg - Renamed application "dcmqrdb" into "dcmqrscp" to avoid name clash with dcmqrdb library, which confuses the MSVC build system. Removed: dcmqrdb/apps/dcmqrdb.cc dcmqrdb/docs/dcmqrdb.man dcmqrdb/etc/dcmqrdb.cfg Added: dcmqrdb/apps/dcmqrscp.cc dcmqrdb/docs/dcmqrscp.man dcmqrdb/etc/dcmqrscp.cfg Affects: dcmqrdb/apps/CMakeLists.txt dcmqrdb/apps/Makefile.dep dcmqrdb/apps/Makefile.in dcmqrdb/docs/dcmqrcnf.txt dcmqrdb/docs/dcmqrdb.dox dcmqrdb/docs/dcmqridx.man dcmqrdb/docs/dcmqrset.txt dcmqrdb/docs/dcmqrti.man dcmqrdb/docs/Makefile.in dcmqrdb/libsrc/dcmqrcbg.cc dcmqrdb/libsrc/dcmqrdbi.cc dcmqrdb/libsrc/dcmqrtis.cc - Added configure tests for the getpwnam/getgrnam system functions and the and header files. Based on the Debian Linux port provided by Juergen Salk Affects: config/configure config/configure.in config/include/cfunix.h.in config/include/cfwin32.h - Added username/groupname configuration option that allows to start the image database as root and let it call setuid/setgid to execute under an unprivileged account once the listen socket has been opened. Based on the Debian Linux port provided by Juergen Salk Affects: dcmqrdb/apps/dcmqrdb.cc dcmqrdb/docs/dcmqrcnf.txt dcmqrdb/include/dcmqrcnf.h dcmqrdb/libsrc/dcmqrcnf.cc - Fixed typo Affects: dcmqrdb/docs/dcmqrti.man - Removed module imactn which is replaced with new module dcmqrdb Removed: imagectn/*/* - Replaced module imagectn with module dcmqrdb in root Makefile Affects: CMakeLists.txt Makefile config/modules - Module dcmpstat now uses the dcmqrdb API instead of imagectn for maintaining the index database Affects: dcmpstat/apps/Makefile.dep dcmpstat/apps/Makefile.in dcmpstat/apps/dcmprscp.cc dcmpstat/apps/dcmpsrcv.cc dcmpstat/apps/dcmpssnd.cc dcmpstat/include/dvcache.h dcmpstat/include/dviface.h dcmpstat/libsrc/Makefile.dep dcmpstat/libsrc/Makefile.in dcmpstat/libsrc/dviface.cc dcmpstat/tests/Makefile.dep dcmpstat/tests/Makefile.in dcmpstat/apps/CMakeLists.txt dcmpstat/CMakeLists.txt dcmpstat/jni/Makefile.dep dcmpstat/jni/Makefile.in README - Minor corrections for use with external DB interface Affects: dcmqrdb/apps/dcmqrdb.cc - Added public declarations for index file functions that are used from module dcmpstat Affects: dcmqrdb/include/dcmqrdbi.h dcmqrdb/libsrc/dcmqrdbi.cc **** Changes from 2005.03.30 (eichelberg) - Initial release of module dcmqrdb that will replace module imagectn. It provides a clear interface between the Q/R DICOM front-end and the database back-end. The imagectn code has been re-factored into a minimal class structure. Added: dcmqrdb/CMakeLists.txt dcmqrdb/Makefile.in dcmqrdb/configure dcmqrdb/apps/CMakeLists.txt dcmqrdb/apps/Makefile.dep dcmqrdb/apps/Makefile.in dcmqrdb/apps/dcmqrdb.cc dcmqrdb/apps/dcmqridx.cc dcmqrdb/apps/dcmqrti.cc dcmqrdb/docs/Makefile.in dcmqrdb/docs/dcmqrcnf.txt dcmqrdb/docs/dcmqrdb.dox dcmqrdb/docs/dcmqrdb.man dcmqrdb/docs/dcmqridx.man dcmqrdb/docs/dcmqrset.txt dcmqrdb/docs/dcmqrti.man dcmqrdb/etc/Makefile.in dcmqrdb/etc/dcmqrdb.cfg dcmqrdb/include/Makefile.in dcmqrdb/include/dcmqrcbf.h dcmqrdb/include/dcmqrcbg.h dcmqrdb/include/dcmqrcbm.h dcmqrdb/include/dcmqrcbs.h dcmqrdb/include/dcmqrcnf.h dcmqrdb/include/dcmqrdba.h dcmqrdb/include/dcmqrdbi.h dcmqrdb/include/dcmqrdbs.h dcmqrdb/include/dcmqridx.h dcmqrdb/include/dcmqropt.h dcmqrdb/include/dcmqrptb.h dcmqrdb/include/dcmqrscp.h dcmqrdb/include/dcmqrtis.h dcmqrdb/libsrc/CMakeLists.txt dcmqrdb/libsrc/Makefile.dep dcmqrdb/libsrc/Makefile.in dcmqrdb/libsrc/dcmqrcbf.cc dcmqrdb/libsrc/dcmqrcbg.cc dcmqrdb/libsrc/dcmqrcbm.cc dcmqrdb/libsrc/dcmqrcbs.cc dcmqrdb/libsrc/dcmqrcnf.cc dcmqrdb/libsrc/dcmqrdbi.cc dcmqrdb/libsrc/dcmqrdbs.cc dcmqrdb/libsrc/dcmqropt.cc dcmqrdb/libsrc/dcmqrptb.cc dcmqrdb/libsrc/dcmqrscp.cc dcmqrdb/libsrc/dcmqrtis.cc dcmqrdb/tests/Makefile.dep dcmqrdb/tests/Makefile.in **** Changes from 2005.03.22 (riesmeier) - Minor code corrections, e.g. write pixel data if no scaling factor is given. Affects: dcmimage/apps/dcmscale.cc - Fixed minor layout and formatting issues. Affects: dcmimage/docs/dcmscale.man - Added call of macro LIBXML_TEST_VERSION. Affects: dcmdata/apps/xml2dcm.cc dcmsr/apps/xml2dsr.cc **** Changes from 2005.03.17 (eichelberg) - Fixed bug in the network module, which refused transmission in JPEG-LS or JPEG 2000 transfer syntaxes even if an appropriate configuration file was used with storescu and storescp. Thanks to Clay Nordquist for the bug report. Affects: dcmnet/libsrc/dimse.cc - Updated storescu/storescp config files for VideoMicroscopicImageStorage Affects: dcmnet/etc/storescp.cfg dcmnet/etc/storescu.cfg - Changed CR/LF to LF Affects: dcmdata/include/dcuid.h **** Changes from 2005.03.09 (riesmeier) - Added support for new Media Storage Application Profiles according to DICOM PS 3.12-2004. Removed support for non-standard conformant "No profile". Affects: dcmdata/apps/dcmgpdir.cc dcmdata/include/dcddirif.h dcmdata/libsrc/dcddirif.cc dcmjpeg/docs/dcmmkdir.man - Added support for UTF-8 for the contents of the fileset descriptor file. Affects: dcmdata/include/dcddirif.h dcmdata/libsrc/dcddirif.cc - Added mode to writeImageToDataset() which allows the value of BitsStored to be determined either from 'used' or from 'possible' pixel values. Affects: dcmimage/include/dicoimg.h dcmimage/libsrc/dicoimg.cc dcmimgle/include/dcmimage.h dcmimgle/include/diimage.h dcmimgle/include/dimoimg.h dcmimgle/libsrc/dimoimg.cc - Fixed problem with wrong value for BitsStored in writeImageToDataset(). Thanks to Michael Doppler for the bug report. Affects: dcmimgle/libsrc/dimoimg.cc - Do not remove separate overlay planes in writeImageToDataset(). Thanks to Michael Doppler for the suggestion and code. Affects: dcmimgle/libsrc/dimoimg.cc - Fixed bug in calculation of bits stored value after modality transformation. Affects: dcmimgle/libsrc/dimomod.cc - Added heuristics for images where the attribute HighBit is missing. Thanks to Michael Doppler for the suggestion and code. Affects: dcmimgle/libsrc/diimage.cc - Fixed possibly uninitialized variable when determining the pixel height. Thanks to Michael Doppler for the bug report and fix. Affects: dcmimgle/libsrc/diimage.cc - Added support for new overlay mode "invert bitmap". Affects: dcmimage/apps/dcm2pnm.cc dcmimage/docs/dcm2pnm.man dcmimgle/include/dimoopxt.h dcmimgle/include/diutils.h dcmjpeg/docs/dcmj2pnm.man - Added new helper function rangeToBits(). Affects: dcmimgle/include/diutils.h dcmimgle/libsrc/diutils.cc - Replaced "," between two delete statements by ";" since this confuses some compilers. Affects: dcmdata/apps/mdfconen.cc - Fixed minor layout and formatting issues. Affects: dcmdata/docs/dcmgpdir.man imagectn/docs/ti.man - Added missing assignment of ARCH environment variable. Affects: dcmnet/Makefile.in - Removed "wwwapps-install" from "install-bin" target. Affects: dcmwlm/Makefile.in - Fixed spelling error. Affects: dcmpstat/apps/dcmpschk.cc dcmwlm/wwwapps/writwlst.cc - Fixed minor issues in XML Schema. Affects: dcmsr/apps/dsr2xml.xsd **** Changes from 2005.02.28 (riesmeier) - Fixed bug in function errmsg() that could cause a segmentation fault. Thanks to Markus Mertens for the bug report. Affects: imagectn/apps/ti.cc **** Changes from 2005.02.22 (eichelberg) - Fixed two bugs in "bit-preserving" Store SCP code. Errors while creating or writing the DICOM file (e.g. file system full) now result in a DIMSE error response (out of resources) being sent back to the SCU. Thanks to Stefan Allers for the bug report and fix. Affects: dcmnet/apps/storescp.cc dcmnet/include/dimse.h dcmnet/libsrc/dimse.cc dcmnet/libsrc/dimstore.cc **** Changes from 2005.02.17 (riesmeier) - Renamed "MicroscopicImageStorage" to "VideoMicroscopicImageStorage". Affects: dcmdata/libsrc/dcuid.cc dcmdata/include/dcuid.h dcmnet/docs/movescu.man dcmnet/docs/storescp.man dcmnet/docs/storescu.man **** Changes from 2004.11.29 (riesmeier) - Introduced new integer type MAX_BITS_TYPE for internal use. Affects: dcmimgle/include/diutils.h - Removed email address from CVS log. Affects: dcmimgle/include/diutils.h - Added support for UTF-8 character set. Affects: dcmdata/apps/dcm2xml.cc dcmdata/apps/xml2dcm.cc dcmdata/docs/dcm2xml.man dcmdata/docs/xml2dcm.man dcmsr/include/dsrtypes.h dcmsr/libsrc/dsrdoc.cc dcmsr/libsrc/dsrtypes.cc - Added warning message when character set is unknown, unsupported or cannot be mapped to the output format. Affects: dcmdata/apps/dcm2xml.cc dcmsr/include/dsrtypes.h dcmsr/libsrc/dsrdoc.cc dcmsr/libsrc/dsrtypes.cc - Fixed minor formatting issues. Affects: dcmsr/apps/dsr2xml.cc - Updated reference to current edition of the DICOM standard (2004). Affects: dcmsr/docs/dsr2html.man dcmsr/docs/dsr2xml.man dcmsr/docs/dsrdump.man dcmsr/docs/xml2dsr.man **** Changes from 2004.11.25 (eichelberg) - Fixed bug in DicomImageClass::maxval affecting 64-bit platforms. Thanks to Daniel Patel for the bug report and fix. Affects: dcmimgle/include/diutils.h **** Changes from 2004.11.22 (eichelberg) - Now checking whether extended characters are present in a DICOM SR document, preventing generation of incorrect HTML if undeclared extended charset used. Affects: dcmsr/apps/dsr2html.cc dcmsr/docs/dsr2html.man - Removed command line option for Thai and Katakana character sets which cannot currently be converted to XML Affects: dcmsr/apps/dsr2xml.cc dcmsr/docs/dsr2xml.man - Now checking whether extended characters are present in a DICOM SR document, preventing generation of incorrect XML if undeclared extended charset used. Affects: dcmsr/apps/dsr2xml.cc dcmsr/docs/dsr2xml.man - Added method that checks if the SR document contains non-ASCII characters in any of the strings affected by SpecificCharacterSet. Affects: dcmsr/include/dsrcodtn.h dcmsr/include/dsrcodvl.h dcmsr/include/dsrcsidl.h dcmsr/include/dsrdoc.h dcmsr/include/dsrdoctn.h dcmsr/include/dsrdoctr.h dcmsr/include/dsrnumtn.h dcmsr/include/dsrnumvl.h dcmsr/include/dsrpnmtn.h dcmsr/include/dsrsoprf.h dcmsr/include/dsrstrvl.h dcmsr/include/dsrtextn.h dcmsr/libsrc/dsrcodtn.cc dcmsr/libsrc/dsrcodvl.cc dcmsr/libsrc/dsrcsidl.cc dcmsr/libsrc/dsrdoc.cc dcmsr/libsrc/dsrdoctn.cc dcmsr/libsrc/dsrdoctr.cc dcmsr/libsrc/dsrnumtn.cc dcmsr/libsrc/dsrnumvl.cc dcmsr/libsrc/dsrpnmtn.cc dcmsr/libsrc/dsrsoprf.cc dcmsr/libsrc/dsrstrvl.cc dcmsr/libsrc/dsrtextn.cc - Added helper methods to check strings and DICOM elements for presence of extended (non-ASCII) characters Affects: dcmsr/include/dsrtypes.h dcmsr/libsrc/dsrtypes.cc - Now checking whether extended characters are present in a DICOM dataset, preventing generation of incorrect XML if undeclared extended charset used. Affects: dcmdata/apps/dcm2xml.cc dcmdata/docs/dcm2xml.man **** Changes from 2004.11.18 (riesmeier) - Added workaround to fix issue with inconsistent definitions in DICOM part 3 and part 16 regarding Mammography CAD SR. Thanks to Attila Gelle and Andrew Hewett for providing appropriate test documents. Affects: dcmsr/libsrc/dsrmamcc.cc - Enhanced warning message for invalid by-reference relationships by adding the relevant item identifiers. Affects: dcmsr/libsrc/dsrdoctr.cc **** Changes from 2004.11.16 (eichelberg) - Updated documentation and sample config files for new list of Storage SOP Classes. Affects: dcmnet/docs/movescu.man dcmnet/docs/storescp.man dcmnet/docs/storescu.man dcmnet/etc/storescp.cfg dcmnet/etc/storescu.cfg imagectn/docs/imagectn.man - Modified some ACR/NEMA and private tag VRs. Affects: dcmdata/include/dcdeftag.h dcmdata/libsrc/dcdictzz.cc dcmdata/libsrc/dicom.dic dcmdata/libsrc/private.dic **** Changes from 2004.11.12 (riesmeier) - Added support for "make install DESTDIR=" which makes DCMTK more package friendly. Thanks to Juergen Salk for the tip. Affects: INSTALL Makefile config/rootconf config/Makefile.def.in - Do not create additional index files for Windows help by default (see switch GENERATE_HTMLHELP). Affects: doxygen/htmldocs.cfg **** Changes from 2004.11.11 (eichelberg) - Fixed function level linking option for Visual C++. Affects: CMakeLists.txt **** Changes from 2004.11.10 (riesmeier) - Added link to online FAQ. Affects: FAQ doxygen/htmldocs.dox **** Changes from 2004.11.10 (eichelberg) - Added support for the LossyImageCompressionMethod attribute introduced in DICOM 2004. Affects: dcmjpeg/libsrc/djcodece.cc - Updated data dictionary for 2004 DICOM edition. Affects: dcmdata/include/dcdeftag.h dcmdata/libsrc/dcdictzz.cc dcmdata/libsrc/dicom.dic - Updated directory of UIDs for 2004 DICOM edition. Removed all standalone and most retired storage SOP classes from list of storage SOP classes for storescu, storescp, imagectn etc. to keep list shorter than 64 entries. Affects: dcmdata/include/dcuid.h dcmdata/libsrc/dcuid.cc **** Changes from 2004.10.29 (riesmeier) - Added new FAQ entry on the usage of class DicomImage. Affects: FAQ **** Changes from 2004.10.22 (onken) - Added documentations for new features. Some clarifications. Affects: dcmdata/docs/dcmodify.man **** Changes from 2004.10.22 (onken) - Fixed ignore-errors-options. major enhancements for supporting private tags. removed '0 Errors' output. modifications to groups 0000,0001,0002,0003,0005 and 0007 are blocked, removing tags with group 0001,0003,0005 and 0007 is still possible. UID options: - Generate new study, series and instance UIDs - When changing UIDs in dataset, related metaheader tags are updated automatically Other minor code enhancements. Affects: dcmdata/apps/mdfdsman.cc dcmdata/apps/mdfdsman.h dcmdata/apps/mdfconen.cc dcmdata/apps/mdfconen.h **** Changes from 2004.10.20 (riesmeier) - Added optional section for new module "dcmjp2k". Affects: doxygen/htmldocs.cfg doxygen/htmldocs.dox - Updated project version number. Do not hide undocumented classes. Affects: doxygen/htmldocs.cfg **** Changes from 2004.10.20 (eichelberg) - Added configure tests for and a number of C typedefs, needed for JasPer support. Affects: config/aclocal.m4 config/configure config/configure.in config/include/cfunix.h.in config/include/cfwin32.h - Updated copyright file to include JasPer copyright Affects: COPYRIGHT - Changed private inheritance from OFList to class member, needed for compilation with HAVE_STL. Affects: dcmdata/include/dcpcache.h dcmdata/libsrc/dcpcache.cc - Updated install file for QNX support. Affects: INSTALL **** Changes from 2004.10.19 (riesmeier) - Fixed wrong warning message about length of pixel data. Affects: dcmimage/libsrc/dicoimg.cc - Enhanced API documentation. Affects: dcmimage/include/dicopx.h dcmimage/include/dicopxt.h dcmimgle/include/dimopxt.h dcmimgle/include/dipixel.h **** Changes from 2004.09.24 (riesmeier) - Replaced "delete" statement by "delete[]" (object created with "new[]"). Thanks to Jesper Bojesen for the report. Affects: dcmdata/libsrc/dcdicdir.cc **** Changes from 2004.09.22 (riesmeier) - Fixed wrong warning message about length of pixel data. Affects: dcmimgle/libsrc/dimoimg.cc - Introduced new member variable "TotalNumberOfFrames". Affects: dcmimgle/include/diimage.h dcmimgle/libsrc/diimage.cc **** Changes from 2004.09.09 (riesmeier) - Added support for optional template identification to XML Schema. Fixed another problem with regular expressions reported by Apache Xerces. Affects: dcmsr/apps/dsr2xml.xsd - Added option to control the way the template identification is encoded for the XML output ("inside" or "outside" of the content items). Affects: dcmsr/apps/dsr2xml.cc dcmsr/apps/xml2dsr.cc dcmsr/docs/dsr2xml.man dcmsr/docs/xml2dsr.man doxygen/manpages/man1/xml2dsr.1 doxygen/manpages/man1/dsr2xml.1 - Added flags to control the way the template identification is encoded in writeXML() and expected in readXML(). Affects: dcmsr/include/dsrtypes.h dcmsr/libsrc/dsrdoctn.cc dcmsr/libsrc/dsrdoctr.cc dcmsr/libsrc/dsrtypes.cc **** Changes from 2004.09.03 (riesmeier) - Fixed inconsistency in readXML() method that prevented support for empty MeasuredValueSequence. Thanks to Attila Gelle and Andrew Hewett for the report. Affects: dcmsr/libsrc/dsrnumvl.cc - Fixed inconsistencies in XML Schema: introduced "NumericGroup", modified regular expressions rejected by XMLSpy. Thanks to Attila Gelle and Andrew Hewett for the report. Affects: dcmsr/apps/dsr2xml.xsd - Removed output of empty measurement unit in writeXML() by default. Added output of empty value qualifier in writeXML() if flag is set accordingly. Affects: dcmsr/libsrc/dsrnumvl.cc - Added check for conflicting command line options. Affects: dcmsr/apps/dsr2xml.cc dcmsr/docs/dsr2xml.man - Replaced tabs by spaces. Affects: dcmsr/libsrc/dsrxmld.cc **** Changes from 2004.08.24 (eichelberg) - Updated compression helper methods. Image type is not set to SECONDARY any more, support for the purpose of reference code sequence added. Affects: dcmdata/include/dccodec.h dcmdata/libsrc/dccodec.cc dcmdata/libsrc/dcrleccd.cc dcmdata/libsrc/dcrlecce.cc dcmjpeg/include/djcodecd.h dcmjpeg/libsrc/djcodecd.cc dcmjpeg/libsrc/djcodece.cc - Added module number for future dcmjp2k module. Affects: dcmdata/include/dcerror.h - Removed duplicate code. Affects: dcmimage/apps/dcmquant.cc dcmimage/include/diquant.h dcmimage/libsrc/diquant.cc - Added experimental support for Borland bcc32 to CMake build system. Affects: CMakeLists.txt **** Changes from 2004.08.04 (eichelberg) - Fixed configure test that checks if pthread_t is a pointer type to correctly work on compilers such as gcc 2.95 where assignment from int to void pointer does not cause a compiler error. Affects: config/aclocal.m4 config/configure **** Changes from 2004.08.04 (riesmeier) - Updated configuration files for Doxygen 1.3.8. Affects: doxygen/htmldocs.cfg doxygen/manpages.cfg - Removed workaround for previous Doxygen versions (wrong fill mode after pre-formatted text in man pages). Affects: dcmdata/docs/dcm2xml.man dcmdata/docs/dcmodify.man dcmdata/docs/xml2dcm.man dcmnet/docs/echoscu.man dcmnet/docs/findscu.man dcmnet/docs/movescu.man dcmnet/docs/storescp.man dcmnet/docs/storescu.man dcmsign/docs/dcmsign.man dcmwlm/docs/wlmscpfs.man imagectn/docs/imagectn.man imagectn/docs/ti.man - Fixed wrong line break. Affects: dcmdata/docs/dcmdump.man - Disabled support for XML Schema if not compiled into libxml2 library. Thanks to Sean Chen for the report. Affects: dcmsr/apps/xml2dsr.cc dcmsr/libsrc/dsrxmld.cc - Replaced non-Unix newline characters. Affects: ofstd/libsrc/ofstd.cc - Updated list of contributors. Affects: docs/ANNOUNCE.353 **** Changes from 2004.08.03 (eichelberg) - Added configure test that checks if needs to be treated as a C++ header, i.e. included without extern "C". Needed for QNX. Affects: config/aclocal.m4 config/configure config/configure.in config/include/cfunix.h.in config/include/cfwin32.h - Added macros INCLUDE_LIBC and INCLUDE_UNISTD that correctly include libc.h and unistd.h if available. Affects: ofstd/include/ofstdinc.h - Headers libc.h and unistd.h are now included via ofstdinc.h. Affects: dcmdata/apps/dcmftest.cc dcmdata/include/dcuid.h dcmdata/libsrc/dcdicdir.cc dcmdata/libsrc/dcdirrec.cc dcmdata/libsrc/dcfilefo.cc dcmdata/libsrc/dcuid.cc dcmdata/libsrc/mkdeftag.cc dcmdata/libsrc/mkdictbi.cc dcmimgle/include/diutils.h dcmnet/include/dcmlayer.h dcmnet/include/dcmtrans.h dcmnet/include/dcompat.h dcmnet/include/dicom.h dcmnet/libsrc/dcompat.cc dcmnet/libsrc/dimse.cc dcmnet/libsrc/dulfsm.cc dcmpstat/libsrc/dcmpstat.cc dcmpstat/libsrc/dviface.cc dcmpstat/libsrc/dvpstat.cc dcmwlm/tests/wltest.cc imagectn/apps/imagectn.cc imagectn/include/imagedb.h imagectn/libsrc/dbindex.cc imagectn/libsrc/dbutils.cc ofstd/include/ofstd.h ofstd/include/ofstring.h ofstd/libsrc/ofstd.cc - Fixed typo in documentation. Affects: dcmpstat/docs/dcmpsprt.man - Added configure test to check if pthread_t is a pointer type. Affects: config/aclocal.m4 config/configure config/configure.in config/include/cfunix.h.in config/include/cfwin32.h - Updated code to correctly handle pthread_t both as an integral integer type (e.g. Linux, Solaris) and as a pointer type (e.g. BSD, OSF/1). Affects: ofstd/include/ofthread.h ofstd/libsrc/ofthread.cc - Minor changes for platforms on which strchr/strrchr return a const pointer. Affects: dcmdata/libsrc/dcdict.cc dcmnet/apps/storescp.cc **** Changes from 2004.08.03 (riesmeier) - Added new option that allows to ignore the file meta information. Affects: dcmdata/apps/xml2dcm.cc dcmdata/docs/xml2dcm.man **** Changes from 2004.07.28 (eichelberg) - Fixed bug in DUL that could cause an application to block when waiting for an association if a select() was interrupted by a signal. Thanks to Alexander Karaivanov for the bug report and fix. Affects: dcmnet/libsrc/dul.cc **** Changes from 2004.07.23 (eichelberg) - Updated shell script for changing the file extension. Affects: config/changext **** Changes from 2004.07.20 (riesmeier) - Added API method to "officially" access the internal intermediate pixel data representation (e.g. to get Hounsfield Units for CT images). Affects: dcmimage/include/dicoimg.h dcmimgle/include/dcmimage.h dcmimgle/include/diimage.h dcmimgle/include/dimoimg.h **** Changes from 2004.07.15 (eichelberg) - Added optional timeout parameter to ASC_dropSCPAssociation(). Affects: dcmnet/include/assoc.h dcmnet/libsrc/assoc.cc **** Changes from 2004.07.13 (eichelberg) - Fixed memory leak occuring when raw data is read from file. Thanks to Michael Albert for the bug report. Affects: dcmdata/apps/dump2dcm.cc **** Changes from 2004.07.07 (riesmeier) - Added backslash to escape special characters. Affects: dcmdata/docs/dump2dcm.man **** Changes from 2004.07.01 (eichelberg) - Introduced virtual clone method for DcmObject and derived classes. Affects: dcmdata/include/dcbytstr.h dcmdata/include/dcchrstr.h dcmdata/include/dcdatset.h dcmdata/include/dcdirrec.h dcmdata/include/dcelem.h dcmdata/include/dcfilefo.h dcmdata/include/dcitem.h dcmdata/include/dcmetinf.h dcmdata/include/dcobject.h dcmdata/include/dcovlay.h dcmdata/include/dcpixel.h dcmdata/include/dcpixseq.h dcmdata/include/dcpxitem.h dcmdata/include/dcsequen.h dcmdata/include/dcvrae.h dcmdata/include/dcvras.h dcmdata/include/dcvrat.h dcmdata/include/dcvrcs.h dcmdata/include/dcvrda.h dcmdata/include/dcvrds.h dcmdata/include/dcvrdt.h dcmdata/include/dcvrfd.h dcmdata/include/dcvrfl.h dcmdata/include/dcvris.h dcmdata/include/dcvrlo.h dcmdata/include/dcvrlt.h dcmdata/include/dcvrobow.h dcmdata/include/dcvrof.h dcmdata/include/dcvrpn.h dcmdata/include/dcvrpobw.h dcmdata/include/dcvrsh.h dcmdata/include/dcvrsl.h dcmdata/include/dcvrss.h dcmdata/include/dcvrst.h dcmdata/include/dcvrtm.h dcmdata/include/dcvrui.h dcmdata/include/dcvrul.h dcmdata/include/dcvrulup.h dcmdata/include/dcvrus.h dcmdata/include/dcvrut.h dcmdata/libsrc/dcitem.cc - Fixed copy constructor for class DcmPixelData which did not work correctly under certain circumstances due to an uninitialized attribute. Thanks to Markus Sabin for the bug report. Affects: dcmdata/libsrc/dcpixel.cc **** Changes from 2004.06.16 (eichelberg) - Fixed minor bug in DUL backward compatibility code. Affects: dcmnet/libsrc/dulconst.cc **** Changes from 2004.06.03 (riesmeier) - Changed error message on unexpected attribute PlanarConfiguration into a warning message. Affects: dcmimage/libsrc/dicopx.cc **** Changes from 2004.06.01 (riesmeier) - Fixed typo in code example. Thanks to Mitchell Laks for the triggering report. Affects: dcmdata/docs/dcmdata.dox - Replaced "doc++" by "Doxygen". Affects: FAQ - Exclude directories "docs" and "config/include". Affects: doxygen/htmldocs.cfg **** Changes from 2004.05.28 (riesmeier) - Moved old announcement and change log for release 3.5.3 to docs. Removed: ANNOUNCE.353 CHANGES.353 Added: docs/ANNOUNCE.353 docs/CHANGES.353 - Created new change log. Added: CHANGES.354 dcmtk-3.6.0/docs/CHANGES.3200000644000310500011400000006743607220077533014312 0ustar joergrdicom3Release 3.2 (Public Release - 1997.06.02) - Updated Version Number and Implementation Version Name to reflect the current public release (3.2) Affects: dcmdata/include/dcuid.h **** Changes from 97.05.30 (eichelberg) - added space characters around comments and simplified some inlining code (needed for SunCC 2.0.1). Affects: dcmnet/apps/findscu.cc dcmnet/apps/movescu.cc imagectn/apps/tinet.cc imagectn/apps/tiui.cc imagectn/apps/tiquery.cc wlistctn/apps/scefind.cc wlistctn/wwwapps/writwlst.cc **** Changes from 97.05.30 (barth) - include version number in every usage string Affects: ctndisp/apps/ctndisp.cc - ctndsupp.cc now includes if available. This prevents a warning about no prototype for fork. Affects: ctndisp/apps/ctndsupp.cc - fixed scanf format problem leading to warnings on 64 bit machines. Affects: dcmdata/apps/dcmconv.cc dcmdata/apps/dump2dcm.cc dcmdata/libsrc/dcvris.cc - fixed problem of inconsistent interfaces and implementation that the syntax check of GNU C++ does not find. Affects: dcmdata/include/dcitem.h dcmdata/libsrc/dcsequen.cc - corrected warning for unused variable if compiled without DEBUG Affects: imagectn/tests/dbregimg.cc **** Changes from 97.05.29 (eichelberg) - dcmftest.cc now includes if available. Needed for SunOS. Affects: dcmdata/apps/dcmftest.cc - fixed printf format problem leading to a warning on 64bit machines. Affects: dcmnet/tests/assctest.cc - added constant for dcmtk release date in dcuid.h. All dcmtk applications now contain a version string which is displayed with the command line options ("usage" message) and which can be queried in the binary with the "ident" command. Affects: dcmdata/include/dcuid.h dcmdata/apps/dcmconv.cc dcmdata/apps/dcmdump.cc dcmdata/apps/dcmftest.cc dcmdata/apps/dcmgpdir.cc dcmdata/apps/dump2dcm.cc dcmnet/apps/echoscu.cc dcmnet/apps/findscu.cc dcmnet/apps/movescu.cc dcmnet/apps/storescp.cc dcmnet/apps/storescu.cc dcmnet/tests/assctest.cc ctndisp/apps/ctndisp.cc ctndisp/apps/killassc.cc ctndisp/apps/sendimg.cc imagectn/apps/imagectn.cc imagectn/apps/ti.cc imagectn/tests/dbregimg.cc wlistctn/apps/wlistctn.cc wlistctn/tests/wltest.cc wlistctn/wwwapps/readoviw.cc wlistctn/wwwapps/readwlst.cc wlistctn/wwwapps/writwlst.cc **** Changes from 97.05.29 (hewett) - added explicit unsigned->int casts to avoid some CC compiler warnings under Nextstep. Affects: dcmdata/libsrc/dcvr.cc imagectn/libsrc/dbfind.cc - added explicit cast of third argument for fcntl(). Avoids a GCC compiler warning under Nextstep. Affects: wlistctn/libsrc/wrklstdb.cc - added declaration of getcwd() and getwd() prototypes if functions are available without prototypes. Avoids a GCC compiler warning under Nextstep. Affects: ctndisp/apps/sendimg.cc - added configuration checks for prototypes of getcwd() and getwd(). Affects: config/configure.in config/acconfig.h config/configure config/include/config.h.in **** Changes from 97.05.28 (barth) - deleted unused variable lastDirIndex Affects: dcmdata/libsrc/dcdicdir.cc **** Changes from 97.05.28 (eichelberg) - DIMSE_sendMessage() now checks whether the dataset to be sent can be converted to the requested transfer syntax prior to transmitting the message and dataset. If the test fails, DIMSE_SENDFAILED is returned. Affects: dcmnet/libsrc/dimse.cc **** Changes from 97.05.27 (eichelberg) - Corrected typos in storescp and storescu help messages Affects: dcmnet/apps/storescp.cc dcmnet/apps/storescu.cc dcmnet/docs/storescp.cc **** Changes from 97.05.27 (barth) - Corrected usage string in dcmdump Affects: dcmdata/apps/dcmdump.cc - Add method canWriteXfer to class DcmObject and all derived classes. This method checks whether it is possible to convert the original transfer syntax to an new transfer syntax. The check is used in the dcmconv utility to prohibit the change of a compressed transfer syntax to a uncompressed. Affects: dcmdata/apps/dcmconv.cc dcmdata/include/dcdatset.h dcmdata/include/dcelem.h dcmdata/include/dcfilefo.h dcmdata/include/dcitem.h dcmdata/include/dcobject.h dcmdata/include/dcpixseq.h dcmdata/include/dcsequen.h dcmdata/include/dcvrobow.h dcmdata/libsrc/Makefile.dep dcmdata/libsrc/dcdatset.cc dcmdata/libsrc/dcelem.cc dcmdata/libsrc/dcfilefo.cc dcmdata/libsrc/dcitem.cc dcmdata/libsrc/dcpixseq.cc dcmdata/libsrc/dcsequen.cc dcmdata/libsrc/dcvrobow.cc **** Changes from 97.05.26 (barth) - Corrected typos in ::write method Affects: dcmdata/dcpixseq.cc - Change testing of different compiler environments to support configure if it exists in non-Unix environments. Affects: config/include/osconfig.h **** Changes from 97.05.23 (eichelberg) - Fixed a bug in storescu application: -u option did not work correctly. Affects: dcmnet/apps/storescu.cc - Major rewrite of storescp application. New features: - network transfer syntax negotiation behaviour can be controlled - files can be written with or without Metaheader - file encoding (transfer syntax, group lengths etc.) can be controlled - bypass mode implemented which writes data directly to file as a "snapshot" of the network data stream. This prevents dcmdata from changing the dataset i.e. by recomputing group lengths. Changes required to interfaces of some DIMSE functions. Affects: dcmdata/include/dcuid.h dcmnet/docs/storescp.txt dcmnet/libsrc/dimse.cc dcmnet/libsrc/dimstore.cc dcmnet/libsrc/Makefile.dep dcmnet/include/dimse.h dcmnet/apps/movescu.cc dcmnet/apps/storescp.cc dcmnet/apps/Makefile.dep imagectn/apps/scestore.cc **** Changes from 97.05.22 (barth) - Changed default options and documentation for dcmdump. Affects: dcmdata/apps/dcmdump.cc dcmdata/docs/dcmdump.txt - Corrected wrong output length in print routine Affects: dcmdata/libsrc/dcvrobow.h - Added new error code EC_NotImplemented Affects: dcmdata/include/dcerror.h dcmdata/libsrc/dcerror.h - Corrected errors for writing of pixel sequences for encapsulated transfer syntaxes. Affects: dcmdata/include/dcobject.h dcmdata/include/dcpixseq.h dcmdata/include/dcpxitem.h dcmdata/libsrc/dcpixseq.cc dcmdata/libsrc/dcpxitem.cc dcmdata/libsrc/dcvr.cc **** Changes from 97.05.22 (hewett) - Added FAQ entry about LD_LIBRARY_PATH problem. Affects: FAQ - Modified the test for presence of a data dictionary to use the method DcmDataDictionary::isDictionaryLoaded(). Affects: dcmdata/apps/dcmconv.cc dcmdata/apps/dcmdump.cc dcmdata/apps/dcmgpdir.cc dcmdata/apps/dump2dcm.cc dcmnet/apps/echoscu.cc dcmnet/apps/findscu.cc dcmnet/apps/movescu.cc dcmnet/apps/storescp.cc dcmnet/apps/storescu.cc dcmnet/libsrc/dimse.cc dcmnet/tests/assctest.cc imagectn/apps/imagectn.cc imagectn/apps/ti.cc imagectn/tests/dbregimg.cc wlistctn/apps/wlistctn.cc wlistctn/libsrc/wrklstdb.cc wlistctn/tests/wltest.cc wlistctn/wwwapps/readoviw.cc wlistctn/wwwapps/readwlst.cc wlistctn/wwwapps/writwlst.cc ctndisp/apps/ctnddico.cc ctndisp/apps/ctndisp.cc - Added method DcmDataDictionary::isDictionaryLoaded() to ask if a full data dictionary has been loaded. This method should be used in tests rather that querying the number of entries (a sekelton dictionary is now always present). Affects: dcmdata/include/dcdict.h dcmdata/libsrc/dcdict.cc **** Changes from 97.05.20 (eichelberg) - Fixed bug in storescu which caused a segmentation fault when transmission of a non-image IOD (i.e. visit IOD) was attempted. Affects: dcmnet/apps/storescu.cc **** Changes from 97.05.20 (barth) - Removed obsolete applications file2ds and ds2file. The functionality of these applications is now peformed by dcmconv. Unified calling parameters are implemented in dump2dcm, dcmdump and dcmconv. Affects: dcmdata/apps/dcmconv.cc dcmdata/apps/dcmdump.cc dcmdata/apps/dump2dcm.cc dcmdata/apps/Makefile.in dcmdata/apps/Makefile.dep dcmdata/docs/dcmconv.txt dcmdata/docs/dcmdump.txt dcmdata/docs/dump2dcm.txt Removed: dcmdata/apps/file2ds.cc dcmdata/apps/ds2file.cc dcmdata/docs/file2ds.txt dcmdata/docs/ds2file.txt **** Changes from 97.05.16 (barth) - Removed unusable test programms and directory dcmdata/tests/data Deleted: dcmdata/tests/* Affects: dcmdata/Makefile.in - Reactivate addUL in dimcmd.cc to add group length attribute explicit to command dataset. Affects: dcmnet/libsrc/dimcmd.cc - Revised handling of GroupLength elements and support of DataSetTrailingPadding elements. The enumeratio E_GrpLenEncoding got additional enumeration values (for a description see dctypes.h). addGroupLength and removeGroupLength methods are replaced by computeGroupLengthAndPadding. To support Padding, the parameters of element and sequence write functions changed. Affects: ctndisp/apps/ctnddico.cc dcmdata/apps/dcmconv.cc dcmdata/apps/dcmdump.cc dcmdata/apps/dcmgpdir.cc dcmdata/apps/ds2file.cc dcmdata/apps/dump2dcm.cc dcmdata/apps/file2ds.cc dcmdata/docs/dcmconv.txt dcmdata/docs/ds2file.txt dcmdata/docs/dump2dcm.txt dcmdata/docs/file2ds.txt dcmdata/include/dcbytstr.h dcmdata/include/dcdatset.h dcmdata/include/dcdicdir.h dcmdata/include/dcdirrec.h dcmdata/include/dcelem.h dcmdata/include/dcfilefo.h dcmdata/include/dcitem.h dcmdata/include/dcmetinf.h dcmdata/include/dcobject.h dcmdata/include/dcsequen.h dcmdata/include/dctypes.h dcmdata/include/dcvrobow.h dcmdata/libsrc/dcbytstr.cc dcmdata/libsrc/dcdatset.cc dcmdata/libsrc/dcdicdir.cc dcmdata/libsrc/dcdirrec.cc dcmdata/libsrc/dcelem.cc dcmdata/libsrc/dcfilefo.cc dcmdata/libsrc/dcitem.cc dcmdata/libsrc/dcmetinf.cc dcmdata/libsrc/dcsequen.cc dcmdata/libsrc/dcvrobow.cc dcmnet/apps/movescu.cc dcmnet/apps/storescp.cc dcmnet/libsrc/dimse.cc dcmnet/libsrc/diutil.cc imagectn/apps/scestore.cc wlistctn/libsrc/wrklstdb.cc wlistctn/wwwapps/readoviw.cc wlistctn/wwwapps/readwlst.cc - Added a new method calcElementLength to calculate the length of an element, item or sequence. For elements it returns the length of tag, length field, vr field, and value length, for item and sequences it returns the length of the whole item. sequence including the Delimitation tag (if appropriate). It can never return UndefinedLength. Affects: dcmdata/include/dcdatset.h dcmdata/include/dcelem.h dcmdata/include/dcfilefo.h dcmdata/include/dcitem.h dcmdata/include/dcmetinf.h dcmdata/include/dcobject.h dcmdata/include/dcsequen.h dcmdata/libsrc/dcdatset.cc dcmdata/libsrc/dcelem.cc dcmdata/libsrc/dcfilefo.cc dcmdata/libsrc/dcitem.cc dcmdata/libsrc/dcmetinf.cc dcmdata/libsrc/dcsequen.cc - Deleted obsolete method DcmItem::calcHeaderLength because the samce functionality is performed by DcmXfer::sizeofTagHeader Affects: dcmdata/include/dcitem.h dcmdata/libsrc/dcdirrec.cc dcmdata/libsrc/dcitem.cc **** Changes from 97.05.15 (barth) - Bug fix for changing binary element values. If a binary existing element value changed, byte order was somtimes wrong. Affects: dcmdata/libsrc/dcelem.cc **** Changes from 97.05.13 (hewett) - Updated data dictionary for Final Text versions of Supplements 4 (X-Ray Angio), 6 (X-Ray Radiofluoroscopy) and 11 (Radiotherapy). Added UIDs and data dictionary attributes for the draft supplements 12 (PET), 13 (Queue Management), 15 (Visible Light), 17 (Modality Performed Procedure Step), 22 (User Preference LUT) and 24 (Print Storage). Updated UID tables so that recompiled Storage SCP/SCU's will handle the new SOPs. Affects: dcmdata/include/dcdeftag.h dcmdata/libsrc/dicom.dic dcmdata/libsrc/dcdictzz.cc dcmdata/include/dcuid.h dcmdata/libsrc/dcuid.cc dcmnet/libsrc/diutil.cc dcmnet/tests/assctest.cc - Modified the data dictionary parse code so that it can handle VM descriptions of the form "2-2n" (as used in some supplements). Currently, a VM of "2-2n" will be represented internally as "2-n". Also added preload of a few essential attribute descriptions into the data dictionary (e.g. Item and ItemDelimitation tags). Affects: dcmdata/libsrc/dcdict.cc dcmdata/include/dcdict.h **** Changes from 97.05.12 (Barth) - new get-Methods for DcmDecimalString: getFloat64 and DcmIntegerString: getSint32 Affects: dcmdata/include/dcvris.h dcmdata/include/dcvrds.h dcmdata/libsrc/dcvris.cc dcmdata/libsrc/dcvrds.cc **** Changes from 97.05.09 (hewett) - Added improved error/warning messages and backup of existing DICOMDIR file (the backup file has the suffix .BAK and is removed if the new DICOMDIR file is sucessfully created). Affects: dcmdata/apps/dcmgpdir.cc - Fixed bug related to renaming of temporary files accross file system boundaries (the rename() system call fails). The temporary file used diring creation of a DICOMDIR is now created in the same file system directory as the DICOMDIR. Affects: dcmdata/libsrc/dcdicdir.cc - Added a member variable and associated get/set methods to DcmDirectoryRecord to allow the origin of a directory record to be noted. Affects: dcmdata/include/dcdirrec.h dcmdata/libsrc/dcdirrec.cc **** Changes from 97.05.07 (barth) - Corrected error reading ItemDelimitationItem using explicit transfer syntaxes Affects: dcmdata/libsrc/dcitem.cc **** Changes from 97.05.05 (hewett) - Added program (dcmftest) to test if a file uses the DICOM Part 10 Format. The program terminates with exit code 0 if file looks Part 10 conform. This program is useful in Unix shell scripts. Added: dcmdata/apps/dcmftest.cc - Added several new capabilities to the dcmgpdir program: 1. the +r option now enables resursion of a directory tree searching for image files to add to the directory. 2. the +m option allows lowercase filenames and filenames with trailing point ('.') to used. References within the DICOMDIR will be converted to uppercase and the trailing point removed. This allows images to be read directly from ISO9660 file-systems under Solaris (and probably other OS's which automatically convert filenames on ISO9660 file-systems). 3. the +I option allows values for missing attributes to be invented. Some type 1 attributes in the DICOMDIR are only type 2 in images. See the documentation for more details. 4. Series, Image, Curve, Overlay, ModalityLUT and VOILUT records are now inserted into the DICOMDIR based on the ordering defined by the *Number (e.g. ImageNumber) attributes (if present). - Deleted (unreleased) trivial image checking program dcmchk. Its capabilities have been merged with the comprehensive image validation package dcmcheck. The dcmcheck package is not distributed as part of the public release. It must be obtained separately. Deleted: dcmdata/apps/dcmchk.cc - Deleted the programs which attempted convertion from DICOM images to PPM images and vice versa. These programs were very restricted in their capabilities. Equivalent, greatly extended, versions of these programs are now part of a separate DICOM image handling package (dcmimage). The dcmimage package can handle any type of DICOM image. The dcmimage package is not distributed as part of the public release. It must be obtained separately. Deleted: dcmdata/apps/ppm2dcm.cc dcmdata/apps/dcm2ppm.cc dcmdata/apps/dcimapix.h dcmdata/apps/dcimapix.cc - Deleted the obsolete program mknldir which created an empty DICOMDIR. This program has been superceeded by dcmgpdir which can generate a general purpose DICOMDIR. Deleted: dcmdata/apps/mknldir.cc - When trying to locate referenced files in a DICOMDIR a possible trailing point ('.') is now taken into account if the referenced file cannot be found. The DICOMDIR does not allow a trailing point in filenames but some ISO9660 file-system drivers automatically append a '.'. Affects: dcmdata/libsrc/dcdirrec.cc - Temporary DICOMDIR files are now located in the tmp directory using the tmpnam() function (if available). Previously, temporary files were being created in the current working directory. Affects: dcmdata/libsrc/dcdicdir.cc - The DcmTag::getVMMax() method now returns a maximum value if the attribute is unknown. This makes the default VM=1-n (before it was VM=1). Affects: dcmdata/include/dctag.h - The maximum length of the internal VR's for PixelSequences and PixelItems has been set to undefined (previously it was zero). Affects: dcmdata/libsrc/dcvr.cc - Added a "before" flag to the insertion of items into Directory Records and Pixel Sequences for compatibility with insertion in normal Sequences. Affects: dcmdata/include/dcdirrec.h dcmdata/include/dcpixseq.h **** Changes before 97.05.05 (hewett/eichelberg/barth) - Removed unused constant DICOM_MAXPRESENTATIONCONTEXTS. Affects: dcmnet/include/assoc.h - Fixed several bugs in the DICOM Upper Layer state machine, following a bug report from B. Gorissen (Philips Medical Systems). 1. A-ASSOCIATE PDUs were rejected when they were larger than the upper limit for P-DATA PDUs. 2. Buffer overruns in PDU decoding were never checked/detected. This could cause applications to fail when very large non-P-DATA PDUs were received. 3. A-ASSOCIATE PDUs were always read into an 8 KByte buffer, although no such limitation is defined in DICOM Part 8. Now the buffer is allocated dynamically. 4. A temporary buffer used for assembling the A-ASSOCIATE PDU was too small. Buffer overruns (causing a core dump) could happen for large A-ASSOCIATE PDUs. A test application tests/assctest.cc has been added. This is a modified echoscu which allows to propose a selectable number of SOP classes and transfer syntax during association negotiation. It can be used to track down limitations in the association negotiation code. The number of transfer syntaxes supported during association negotiation has been increased from 5 to 25. Affects: dcmnet/libsrc/dulfsm.cc dcmnet/include/assoc.h dcmnet/tests/Makefile.in dcmnet/tests/Makefile.dep Added: dcmnet/tests/assctest.cc - Corrected Bug for reading of encapsulated pixel sequences Affects: dcmdata/libsrc/dcitem.cc - Added extended error checking when parsing images prior to creating a DICOMDIR. Checks on allowed characters and lengths of file names. Affects: dcmdata/apps/dcmgpdir.cc - Fixed DICOMDIR generation bug affecting inclusion of Group Length attributes (file offsets were not being computed correctly). Affects: dcmdata/include/dcdicdir.h dcmdata/libsrc/dcdicdir.cc - Fixed DICOMDIR generation bug affecting ordering of patient/study/series/image records (item insertion into a sequence did produce the expected ordering). Affects: dcmdata/include/dcsequen.h dcmdata/libsrc/dcdicdir.cc dcmdata/libsrc/dclist.cc cmdata/libsrc/dcsequen.cc - Fixed DICOMDIR generation bug affecting the use of Unknown VR attributes (the file offsets were not being computed correctly). Affects: dcmdata/include/dcxfer.h dcmdata/libsrc/dcdicdir.cc dcmdata/libsrc/dcitem.cc dcmdata/libsrc/dcxfer.cc - Fixed attempt to print null pointer in debugging output. Affects: dcmdata/libsrc/dcdirrec.cc - Removed multiple occurrence of dcmutil.cc / dcmutil.h and add it named as dcutils.h dcutils.cc to the dcmdata library. Changed get function names. Adapted code using dcutils. Removed: dcmdata/apps/dcmutils.cc dcmdata/apps/dcmutils.h ctndisp/apps/dcmutils.cc ctndisp/apps/dcmutils.h Added: dcmdata/include/dcutils.h dcmdata/libsrc/dcutuils.h Affects: dcmdata/apps/Makefile.in dcmdata/apps/dcimapix.cc dcmdata/apps/dcm2ppm.cc dcmdata/apps/ppm2dcm.cc dcmdata/libsrc/Makefile.in ctndisp/apps/Makefile.in ctndisp/apps/ctnddico.cc - The put/get-methods for all VRs did not conform to the C++-Standard draft. Some Compilers (e.g. SUN-C++ Compiler, Metroworks CodeWarrier, etc.) create many warnings concerning the hiding of overloaded get methods in all derived classes of DcmElement. So the interface of all value representation classes in the library are changed rapidly, e.g. E_Condition get(Uint16 & value, const unsigned long pos); becomes E_Condition getUint16(Uint16 & value, const unsigned long pos); All (retired) "returntype get(...)" methods are deleted. For more information see dcmdata/include/dcelem.h Affects: dcmdata/apps/dcimapix.cc dcmdata/apps/dcmchk.cc dcmdata/apps/dcmgpdir.cc dcmdata/apps/dump2dcm.cc dcmdata/include/dcbytstr.h dcmdata/include/dcelem.h dcmdata/include/dcvrat.h dcmdata/include/dcvrfd.h dcmdata/include/dcvrfl.h dcmdata/include/dcvrobow.h dcmdata/include/dcvrsl.h dcmdata/include/dcvrss.h dcmdata/include/dcvrui.h dcmdata/include/dcvrul.h dcmdata/include/dcvrus.h dcmdata/libsrc/dcbytstr.cc dcmdata/libsrc/dcdicdir.cc dcmdata/libsrc/dcdirrec.cc dcmdata/libsrc/dcelem.cc dcmdata/libsrc/dcfilefo.cc dcmdata/libsrc/dcitem.cc dcmdata/libsrc/dcmetinf.cc dcmdata/libsrc/dcvrat.cc dcmdata/libsrc/dcvrfd.cc dcmdata/libsrc/dcvrfl.cc dcmdata/libsrc/dcvrobow.cc dcmdata/libsrc/dcvrsl.cc dcmdata/libsrc/dcvrss.cc dcmdata/libsrc/dcvrui.cc dcmdata/libsrc/dcvrul.cc dcmdata/libsrc/dcvrulup.cc dcmdata/libsrc/dcvrus.cc dcmdata/tests/bsplist.cc ctndisp/apps/ctnddico.cc dcmnet/apps/findscu.cc dcmnet/apps/movescu.cc dcmnet/libsrc/dimcmd.cc dcmnet/libsrc/diutil.cc imagectn/libsrc/dbfind.cc imagectn/libsrc/dbmove.cc wlistctn/include/wrklstdb.h wlistctn/libsrc/wrklstdb.cc wlistctn/tests/wltest.cc wlistctn/wwwapps/readoviw.cc wlistctn/wwwapps/readwlst.cc wlistctn/wwwapps/writwlst.cc - Removed double include of sys/select Affects: dcmnet/include/dcompat.h - Make the Declaration of DcmBuffer local to the DcmStream classes Affects: dcmdata/include/dcstream.h dcmdata/include/dctk.h dcmdata/libsrc/dcstream.cc - Corrected debugging code Affects: dcmdata/libsrc/dcitem.cc dcmdata/libsrc/dcobject.cc dcmdata/libsrc/dcsequen.cc dcmdata/libsrc/dcvrfd.cc dcmdata/libsrc/dcvrfl.cc dcmdata/libsrc/dcvrsl.cc dcmdata/libsrc/dcvrss.cc dcmdata/libsrc/dcvrus.cc - Minor corrections: correct some warnings of the SUN-C++ Compiler concerning the assignments of wrong types and inline compiler errors Affects: dcmdata/apps/dcmchk.cc dcmdata/apps/dcmdump.cc dcmdata/apps/dcmgpdir.cc dcmdata/apps/dump2dcm.cc dcmdata/include/dcdicent.h - Corrected data dictionary code bug whereby the even/odd range restrictions were not being taken into consideration when searching the dictionary. Affects: dcmdata/include/dcdicent.h - Corrected bug in data dictionary for PrivateCreator elements where the range of the element numbers was implicity restricted to be even. The range is now explicity unrestricted. Affects: dcmdata/libsrc/dicom.dic dcmdata/libsrc/dcdictzz.cc - The network function ASC_destroyAssociation now only destroys the association parameters if they are non-NULL. Affects: dcmnet/libsrc/assoc.cc - The include file cond.h now properly includes the required header file dicom.h. Affects: dcmnet/include/cond.h - Modified code which printed a message on stderr when creating a new DICOM to use the debug routines instead. Affects: dcmdata/libsrc/dcdicdir.cc - Updated Implementation Version Name and Implementation Class UID to reflect the new version 3.1.3 Affects: dcmdata/include/dcuid.h - Added command line switches to several consersion programs to allow generation of UN to be disabled (it is enabled by default). Affects: dcmdata/apps/dcmconv.cc dcmdata/apps/ds2file.cc dcmdata/apps/file2ds.cc dcmdata/apps/dcmgpdir.cc dcmnet/apps/storescu.cc dcmnet/apps/storescp.cc dcmnet/apps/findscu.cc dcmnet/apps/movescu.cc imagectn/apps/imagectn.cc imagectn/apps/ti.cc wlistctn/apps/wlistctn.cc - Added preliminary support for Unknown VR (UN) described in Supplement 14. Added a global switch dcmEnableUnknownVRGeneration which can be used to disable/enable the production of UN as a valid VR. Affects: dcmdata/include/dcvr.h dcmdata/libsrc/dcvr.cc dcmdata/libsrc/dcitem.cc dcmdata/libsrc/dcobject.cc dcmdata/libsrc/dcvrobow.cc - Fixed problem with config/install-sh script not being located from makefile in other parts of the source tree. Affects: config/configure.in config/configure - Added a program which builds a DICOMDIR file from a set of image files. The program is intended to correspond to the requirements of Supplement 19 General Purpose CD-R Image Interchange Profile. Added: dcmdata/apps/dcmgpdir.cc - Added very simple check program for dicom data. This program is missing tests for allowed characters and formats for VR. Added: dcmdata/apps/dcmchk.cc - Changed DCMTK's implementation version name to be consitent with VR=CS. Affects: dcmdata/include/dcuid.h - Added member function to obtain a DcmTag's data dictionary reference. Affects: dcmdata/include/dctag.h - Added global flag for disabling the automatic correction of small errors. Such behaviour is undesirable when performing data validation. Affects: dcmdata/include/dcobject.h dcmdata/libsrc/dcobject.cc dcmdata/libsrc/dcbytstr.cc dcmdata/libsrc/dcvrui.cc - Removed the DcmDirectoryRecord member function fillTypeElements since it did nothing useful. Affects: dcmdata/include/dcdirrec.h dcmdata/libsrc/dcdirrec.cc Deleted: dcmdata/libsrc/dcdirrcf.cc - Smoothed out some poor indentation Affects: dcmdata/include/dcdirrec.h dcmdata/libsrc/dcdirrec.cc dcmdata/libsrc/dcdicdir.cc - Added data dictionary changes from approved Correction Proposals (upto CP82) as of 97.03.26. Note that some CP's < 82 have not yet been approved (or are cancelled). Affects: dcmdata/libsrc/dicom.dic dcmdata/libsrc/dcdictzz.cc dcmdata/include/dcdeftag.h dcmtk-3.6.0/docs/ANNOUNCE.3520000644000310500011400000001214207606246424014442 0ustar joergrdicom3 ANNOUNCEMENT Version 3.5.2 of the OFFIS DCMTK (DICOM ToolKit) software is now available for public release. This release includes the following main changes over the previous version (Version 3.5.1): - Better ISO C++ compliance. If available, the standard header files such as and are used instead of the traditional and headers. Visual C++ users are strongly advised to read the platform notes in the INSTALL file concerning iostream issues. - DCMTK 3.5.2 builds correctly with GCC 3.2 and Visual C++ .NET - Various enhancements in the configure system which now works correctly without manual interaction on more platforms: Irix, HP/UX 10 and MacOS X 10.2 now build "out of the box". - Support for encoding/decoding RLE compressed DICOM images has been added. The new tools dcmcrle and dcmdrle allow to convert between uncompressed and RLE compressed transfer syntaxes. - Support for zlib compressed (deflated) DICOM objects has been added. Conversion between uncompressed and deflated transfer syntaxes is offered by dcmconv. - The new application dcmscale allows to scale DICOM images. - The new application dcm2xml converts DICOM objects to XML. - The new application dcmquant converts any DICOM color image into a palette color image. The underlying quantization classes are useful for creating palette color icons from color images. - The Worklist CTN has been replaced by a completely new implementation (module dcmwlm) that supports a larger set of keys, fixes various issues with the old implementation and has a well-defined backend that facilitates adaptation to databases etc. - Most command line tools now support a command line option "--version" which prints the host platform and the name and version number of external libraries. - Echoscu now supports C-ECHO over TLS (Security Enhancements One). - Added support for new value representation Other Float String (OF). - New layout for dcmdump tool, improves readability. - Conversion between floating point numbers and ASCII strings (e.g. in DICOM DS data elements) is now performed in a locale independent manner, making sure that DCMTK works correctly in a non-Posix locale. - Complete re-design of the DICOM I/O stream classes, required for zlib support. Critical API change. Programmers are advised to adapt their applications to the new DcmFileFormat loadFile() and saveFile() methods which encapsulate the new stream architecture. - Support for private tag data dictionaries has been added. This can be activated in configure using the --with-private-tags option. By default, no private tag dictionary is installed. - Unknown undefined length attributes are now converted into SQ instead of UN. - Improved behaviour when reading elements with illegal odd tag length. - Many network tools now have a command line option --timeout for controlling the connection request timeout. - A-ASSOCIATE user information sub items are now always sent in ascending order to avoid problems with certain other DICOM toolkits. - Added experimental "promiscuous" mode to storescp. In this mode, activated by the --promiscuous command line option, all presentation contexts not known not to be Storage SOP Classes are accepted. - Added --max-send-pdu option to storescu that allows to restrict the size of outgoing P-DATA PDUs. - Added support for the Numeric Value Qualifier Code Sequence (introduced with CP 260) to dcmsr module. - Added support for the Current Requested Procedure Evidence Sequence and the Pertinent Other Evidence Sequence to the dcmsr module. - Dcmmkdir tool supports more application profiles. - Algorithm for creation of unique identifiers has been improved on Win32 platforms where gethostid() is not available. - The DICOM data dictionary has been re-worked based on the latest supplements and correction proposals, as usual. - Many bug fixes and minor improvements as usual - See the CHANGES.352 file for more details. Many people have contributed to this new release of DCMTK, appearing here in alphabetical order. Thank you very much for your support! Stefan Allers Andreas Barth Judit Verestoy Jesper Bojesen Rada Hussein Bernd Kuemmerlen David Lappen Arnaud Masson Markus Mertens Gilles Mével Sebastian Meyer Dimitri Papadopoulos-Orfanos Tom Probasco Costea-B. Razvan Rainer Thieme Karl Tomaschek Ben Wright OFFIS staff who have worked on this release are: Marco Eichelberg Joerg Riesmeier Thomas Wilkens The DCMTK software can be downloaded via: http://dicom.offis.de/dcmtk/ Kuratorium OFFIS e.V., Oldenburg, Germany, 2002-12-23 dcmtk-3.6.0/docs/ANNOUNCE.3400000644000310500011400000000652007220101047014421 0ustar joergrdicom3 ANNOUNCEMENT Version 3.4.0 of the OFFIS DCMTK (DICOM ToolKit) software is now available for public release. This release includes the following main changes over the previous version (Version 3.3.1): - The DICOM data dictionary has been completely re-worked based on the 1998 edition of the DICOM standard and the latest supplements. - The new module dcmimgle ("dcmimage light edition") contains routines to efficiently render DICOM grayscale images. The library supports all DICOM grayscale transformations including the various look-up tables. It also supports rotating, scaling, and processing of overlay bitmaps. This module has been added to DCMTK to support the Grayscale Softcopy Presentation State demonstrator (DICOMscope) which has been shown at the European Congress of Radiology 1999. - The new module dcmpstat contains routines to read, manage and write DICOM Grayscale Softcopy Presentation State objects according to Supplement 33 (revised frozen draft for demonstration, Version 18). This module has also been added to DCMTK to support the Grayscale Softcopy Presentation State demonstrator (DICOMscope) which has been shown at the European Congress of Radiology 1999. - All applications in the dcmdata and dcmnet modules have been updated to use a new command line option scheme which makes calls more self-explaining as the tools get more and more options. - Experimental support for the network transmission of DICOM images in encapsulated transfer syntax (compressed) has been added to the dcmnet library and the storescu, storescp and movescu applications. - Experimental support for C-GET and extended SOP class negotiation has been added to the dcmnet library. - The Worklist CTN now supports all type 1 and 2 attributes as return keys and has also been ported to Windows. - New FAQ entries: Building DCMTK on HP-UX 10 or Unixware, Building the DCMTK libraries as shared objects on Unix platforms, Images received in /tmp when running imagectn as root. - Improved handling of unknown (or unsupported) VRs when reading or receiving explicit VR data. Allows to communicate with certain modalities using private VR names like "??" without extended length field. - Many bug fixes and minor improvements - See the dcmtk/CHANGES file for more details. Attention: The file format of the imagectn index file has changed with the new release. You need to rebuild index files when updating imagectn to DCMTK 3.4.0. Many people have contributed to this new release of DCMTK, appearing here in alphabetical order. Thank you very much for your support! Yongjian Bao Heinz Blendinger David Clunie Sacha Helbig Andy Hewett Markus Mertens Gilles Mevel Wolfgang Rapp Alexander Sahler Andreas Schroeter Lutz Vorwerk OFFIS staff who have worked on this release are: Marco Eichelberg Joerg Riesmeier The DCMTK software can be downloaded via: http://www.offis.uni-oldenburg.de/projekte/dicom/ Kuratorium OFFIS eV, Oldenburg, Germany, 1999-05-03 dcmtk-3.6.0/docs/ANNOUNCE.3500000644000310500011400000000435607314134641014441 0ustar joergrdicom3 ANNOUNCEMENT Version 3.5.0 of the OFFIS DCMTK (DICOM ToolKit) software is now available for public release. This release includes the following main changes over the previous version (Version 3.4.2): - The DICOM data dictionary has been re-worked based on the latest supplements and correction proposals, as usual. - A new module DCMIMAGE has been added that enhances the DCMIMGLE module with color capabilities (all uncompressed color models). - The new command line tool "dcm2pnm" converts a DICOM image to the general- purpose PGM/PPM format. Unlike "dcmp2pgm", it does not support presentation states, instead it handles color, overlays, multiframe and allows to rotate/flip/scale images upon conversion. - A new module DCMSIGN has been added that implements experimental support for DICOM Digital Signatures in conformance with Supplement 41. WARNING: This module currently implements working draft 09 of DICOM Supplement 41. Digital signatures generated with this version will be incompatible with the final text of Supplement 41! - A new module DCMSR has been added that implements high-level support for DICOM Structured Reporting (Basic Text SR, Enhanced SR, Comprehensive SR). Sample applications that convert SR documents into plain text, HTML and XML respectively, are provided. - Implemented a global flag in the DCMNET module and command line option to disable reverse DNS hostname lookup when accepting associations. - Many bug fixes and minor improvements as usual - See the dcmtk/CHANGES file for more details. Many people have contributed to this new release of DCMTK, appearing here in alphabetical order. Thank you very much for your support! Andreas Barth Harald Breitner Bernd Kuemmerlen David Lappen Gilles Mevel Sebastian Meyer Joerg Weimer OFFIS staff who have worked on this release are: Marco Eichelberg Joerg Riesmeier The DCMTK software can be downloaded via: http://www.offis.de/projekte/dicom/ Kuratorium OFFIS e.V., Oldenburg, Germany, 2001-06-14 dcmtk-3.6.0/docs/ANNOUNCE.3510000644000310500011400000000536707416541737014460 0ustar joergrdicom3 ANNOUNCEMENT Version 3.5.1 of the OFFIS DCMTK (DICOM ToolKit) software is now available for public release. This release includes the following main changes over the previous version (Version 3.5.0): - The DICOM data dictionary has been re-worked based on the 2001 edition of the DICOM standard and latest supplements and correction proposals, as usual. - A new module dcmjpeg has been added that enables JPEG compression and decompression of DICOM images. The supported lossy JPEG processes are: baseline, extended sequential, spectral selection and progressive. The lossless processes with selection value 1 and arbitrary selection values are also supported (with bits/pixel up to 16). The JPEG compression / decompression code is based on an adapted version of the Independent JPEG Group's JPEG library which is shipped with DCMTK. - The new utility dcmmkdir extends the existing tool dcmgpdir with the ability to create DICOMDIRs conforming to the Basic Cardiac X-Ray Angiography and 1024 X-Ray Angiography application profiles, including the required icons. - The new utility dcmj2pnm extends the existing tool dcm2pnm with the ability to convert JPEG-compressed images and to export JPEG. Both tools now support BMP and TIFF export (requires libtiff). - The digital signature module dcmsign has been adapted to the final text of supplement 41. - The storescp tool has received a number of additional options which allow to sort images and to execute user defined commands upon reception. - The old, Xlib-based database monitor tool "ctndisp" has been phased out and removed from the toolkit. - Under the hood: Most of the various condition enumerations and defines in the various DCMTK modules have been replaced by a unified condition class. Doc++ documentation for various classes has been added. - Many bug fixes and minor improvements as usual - See the dcmtk/CHANGES file for more details. Many people have contributed to this new release of DCMTK, appearing here in alphabetical order. Thank you very much for your support! Andreas Barth Alexander Blum Anders Gustafsson Ben Gilles Mevel Bernd Kuemmerlen Markus Mertens Merlijn van Minderhout Thomas Moeller OFFIS staff who have worked on this release are: Marco Eichelberg Joerg Riesmeier Thomas Wilkens The DCMTK software can be downloaded via: http://dicom.offis.de/dcmtk/ Kuratorium OFFIS e.V., Oldenburg, Germany, 2001-12-21 dcmtk-3.6.0/docs/CHANGES.3410000644000310500011400000023756607220077536014323 0ustar joergrdicom3 Release 3.4.1 (Public Release - 2000-03-10) - Updated Version Number and Implementation Version Name to reflect the current public release (3.4.1) Affects: dcmdata/include/dcuid.h - Updated documentation to reflect changes in 3.4.1 Affects: ANNOUNCE INSTALL **** Changes from 2000.03.10 (eichelberg) - Added special configure test for and , needed for IRIX 6. Affects: config/aclocal.m4 config/configure config/configure.in - Call to signal() now depending on SIGNAL_HANDLER_WITH_ELLIPSE compile time flag, required for Irix5. Affects: dcmnet/libsrc/dul.cc **** Changes from 2000.03.09 (riesmeier) - Updated project/make files for MSVC5. Affects: config/system/win32/msvc5.zip **** Changes from 2000.03.08 (riesmeier) - Added debug version of function 'parseDebug' to avoid compiler warnings (unused variable). Affects: dcmnet/libsrc/dulparse.cc **** Changes from 2000.03.08 (eichelberg) - Modified configure script to perform X11 tests with C++ instead of C. Helps to convince AIX that it really has a shmat() system call. Affects: config/configure.in config/configure - Added test for to configure. Needed for NeXT. Affects: config/configure.in config/configure config/include/config.h.in config/include/cfwin32.h - Now including netinet/in_systm.h and netinet/in.h wherever netinet/tcp.h is used. Required for NeXTStep 3.3. Affects: dcmnet/libsrc/dul.cc dcmnet/libsrc/dulfsm.cc - Updated documentation. Added: dcmpstat/docs/dcmprtsv.txt dcmpstat/docs/dcmpsprt.txt Affects: dcmpstat/docs/dcmpsmk.txt imagectn/docs/dbregimg.txt imagectn/docs/imagectn.txt imagectn/docs/setup.txt imagectn/docs/ti.txt wlistctn/docs/wlistctn.txt COPYRIGHT HISTORY README - Updated copyright header. Affects: dcmdata/*/*.cc dcmdata/*/*.h dcmdata/libsrc/dcdictbi.nul dcmdata/libsrc/dicom.dic dcmimgle/*/*.cc dcmimgle/*/*.h dcmnet/*/*.cc dcmnet/*/*.h dcmpstat/*/*.cc dcmpstat/*/*.h dcmpstat/libsrc/test.cfg ofstd/*/*.cc ofstd/*/*.h wlistctn/*/*.cc wlistctn/*/*.h wlistctn/*/*.pl wlistctn/*/*.ph **** Changes from 2000.03.07 (riesmeier) - Changed behaviour of class OFConsoleApplication to support automatic evaluation of "--help" option for command line application with no mandatory parameter. Affects: ofstd/include/ofcmdln.h ofstd/include/ofconapp.h ofstd/libsrc/ofconapp.cc - Added explicit type casts to make Sun CC 2.0.1 happy. Affects: dcmdata/libsrc/dcobject.cc dcmdata/libsrc/dcvrobow.cc dcmimgle/include/dimoopxt.h dcmimgle/include/discalet.h dcmimgle/libsrc/didispfn.cc dcmpstat/apps/dcmmklut.cc dcmpstat/libsrc/dvpssp.cc - Added include statement required for Sun CC 2.0.1. Affects: dcmnet/libsrc/cond.cc ctndisp/libsrc/snq.cc - Removed type specifier 'const' to make Sun CC 2.0.1 happy. Affects: dcmpstat/apps/dcmpsprt.cc dcmpstat/libsrc/dvpsibl.cc - Added brackets to case block within a switch statement (reported an error by Sun CC 2.0.1). Affects: dcmpstat/libsrc/dvpspr.cc **** Changes from 2000.03.06 (riesmeier) - Avoid empty statement in the body of if-statements (MSVC6 reports warnings). Affects: dcmdata/apps/dcmconv.cc dcmdata/apps/dcmdump.cc dcmdata/apps/dcmgpdir.cc dcmdata/apps/dump2dcm.cc dcmdata/libsrc/dcdicdir.cc dcmnet/libsrc/dulparse.cc dcmdata/apps/dcmmkcrv.cc dcmdata/apps/dcmmklut.cc dcmdata/apps/dcmp2pgm.cc dcmdata/apps/dcmprtsv.cc dcmdata/apps/dcmpsmk.cc dcmdata/apps/dcmpsprt.cc dcmdata/apps/dcmpsrcv.cc dcmdata/apps/dcmpssnd.cc - Renamed local variable hiding a member variable (reported by Sun CC 4.2). Affects: dcmdata/include/dcpixseq.h dcmdata/libsrc/dcpixseq.cc dcmpstat/libsrc/dvpsril.cc - Added missing include (reported by MSVC). Affects: dcmdata/libsrc/cmdlnarg.cc - Removed inline specifier from a 'large' method (reported by Sun CC 4.2). Affects: dcmimgle/include/dcmimage.h - Moved get-method to base class, renamed method and made method virtual to avoid hiding of methods (reported by Sun CC 4.2). Affects: dcmimgle/include/dibaslut.h dcmimgle/include/diciefn.h dcmimgle/include/didislut.h dcmimgle/include/didispfn.h dcmimgle/include/digsdfn.h dcmimgle/include/diluptab.h dcmimgle/include/dimoopxt.h dcmimgle/libsrc/diciefn.cc dcmimgle/libsrc/didispfn.cc dcmimgle/libsrc/digsdfn.cc dcmimgle/libsrc/diluptab.cc - Added const type specifier to derived method (reported by Sun CC 4.2). Affects: dcmpstat/include/dvpsovl.h - Replaced #ifdef statements (reported an error by Cygwin). Affects: dcmimage/apps/dcm2pnm.cc **** Changes from 2000.03.06 (eichelberg) - Introduced typecasts when printing enums to cout/cerr. Avoids warning on Linux 2.2.x with egcs 1.1.2 Affects: ctndisp/libsrc/dispuser.cc imagectn/libsrc/dbfind.cc - Fixed unassigned variable usage problem, reported by egcs 1.1.2 Affects: dcmpstat/libsrc/dvpsibl.cc - Changed static template functions to methods. Required for xlC 1.0 on AIX 3.2. Affects: dcmimgle/include/dicrvfit.h - Changed a couple of definitions that implied that Uint32 or size_t are long. Required for OSF/1 on Alpha. Affects: dcmdata/libsrc/dcvrobow.cc dcmpstat/libsrc/dvpscf.cc dcmpstat/libsrc/dvpsri.cc - Avoiding to include directly, using dcompat.h instead. is not protected against multiple inclusion on Ultrix. Affects: dcmnet/libsrc/dul.cc - Added constructor declarations needed by gcc 2.5.8. Affected: imagectn/include/dbpriv.h **** Changes from 2000.03.03 (riesmeier) - Corrected bug related to padding of file and item size. Affects: dcmdata/include/dcpixseq.h dcmdata/libsrc/dcitem.cc dcmdata/libsrc/dcpixseq.cc dcmdata/libsrc/dcsequen.cc **** Changes from 2000.03.03 (eichelberg) - Now using autoconf check AC_C_CHAR_UNSIGNED to find out whether char is unsigned and Uint8 must by typedef'd to signed char. Affects: config/configure config/configure.in config/include/config.h.in - Added warning that MacOS configuration header is outdated. Affects: config/include/cfmwerks.h - Updated Win32 configuration header for latest config.h.in Affects: config/include/cfwin32.h - Implemented library support for redirecting error messages into memory instead of printing them to stdout/stderr for GUI applications. See ofstd/include/ofconsol for a description of this feature. Thanks to Markus Mertens for this contribution. Added: ofstd/include/ofconsol.h ofstd/libsrc/ofconsol.cc Affects: ctndisp/apps/Makefile.dep ctndisp/apps/ctndisp.cc ctndisp/libsrc/Makefile.dep ctndisp/libsrc/Makefile.in ctndisp/libsrc/dispuser.cc ctndisp/libsrc/snq.cc dcmdata/apps/Makefile.dep dcmdata/apps/dcmconv.cc dcmdata/apps/dcmdump.cc dcmdata/apps/dcmftest.cc dcmdata/apps/dcmgpdir.cc dcmdata/apps/dump2dcm.cc dcmdata/include/dcbytstr.h dcmdata/include/dcdatset.h dcmdata/include/dcdebug.h dcmdata/include/dcdicdir.h dcmdata/include/dcdirrec.h dcmdata/include/dcfilefo.h dcmdata/include/dcitem.h dcmdata/include/dcmetinf.h dcmdata/include/dcobject.h dcmdata/include/dcpixel.h dcmdata/include/dcpixseq.h dcmdata/include/dcpxitem.h dcmdata/include/dcsequen.h dcmdata/include/dctypes.h dcmdata/include/dcvrat.h dcmdata/include/dcvrfd.h dcmdata/include/dcvrfl.h dcmdata/include/dcvrobow.h dcmdata/include/dcvrsl.h dcmdata/include/dcvrss.h dcmdata/include/dcvrui.h dcmdata/include/dcvrul.h dcmdata/include/dcvrulup.h dcmdata/include/dcvrus.h dcmdata/libsrc/Makefile.dep dcmdata/libsrc/cmdlnarg.cc dcmdata/libsrc/dcdebug.cc dcmdata/libsrc/dcdicdir.cc dcmdata/libsrc/dcdict.cc dcmdata/libsrc/dcdirrec.cc dcmdata/libsrc/dcelem.cc dcmdata/libsrc/dcfilefo.cc dcmdata/libsrc/dchashdi.cc dcmdata/libsrc/dcitem.cc dcmdata/libsrc/dcmetinf.cc dcmdata/libsrc/dcpxitem.cc dcmdata/libsrc/dcsequen.cc dcmdata/libsrc/dcstream.cc dcmdata/libsrc/dctag.cc dcmdata/libsrc/dcuid.cc dcmdata/libsrc/dcvr.cc dcmdata/libsrc/dcvrat.cc dcmdata/libsrc/dcvrfd.cc dcmdata/libsrc/dcvrfl.cc dcmdata/libsrc/dcvrobow.cc dcmdata/libsrc/dcvrsl.cc dcmdata/libsrc/dcvrss.cc dcmdata/libsrc/dcvrul.cc dcmdata/libsrc/dcvrulup.cc dcmdata/libsrc/dcvrus.cc dcmimgle/apps/Makefile.dep dcmimgle/apps/dcmdspfn.cc dcmimgle/apps/dconvlum.cc dcmimgle/include/diinpx.h dcmimgle/include/diinpxt.h dcmimgle/include/dimoipxt.h dcmimgle/include/dimoopxt.h dcmimgle/include/dimopxt.h dcmimgle/include/discalet.h dcmimgle/libsrc/Makefile.dep dcmimgle/libsrc/dcmimage.cc dcmimgle/libsrc/diciefn.cc dcmimgle/libsrc/dicielut.cc dcmimgle/libsrc/didispfn.cc dcmimgle/libsrc/didocu.cc dcmimgle/libsrc/digsdfn.cc dcmimgle/libsrc/digsdlut.cc dcmimgle/libsrc/diimage.cc dcmimgle/libsrc/diluptab.cc dcmimgle/libsrc/dimoimg.cc dcmimgle/libsrc/dimomod.cc dcmimgle/libsrc/diovlay.cc dcmimgle/libsrc/diovlimg.cc dcmimgle/libsrc/diovpln.cc dcmimgle/libsrc/diutils.cc dcmnet/apps/Makefile.dep dcmnet/apps/findscu.cc dcmnet/apps/storescu.cc dcmnet/libsrc/Makefile.dep dcmnet/libsrc/assoc.cc dcmnet/libsrc/cond.cc dcmnet/libsrc/dcompat.cc dcmnet/libsrc/dimse.cc dcmnet/libsrc/dul.cc dcmnet/libsrc/dulconst.cc dcmnet/libsrc/dulfsm.cc dcmnet/libsrc/dulparse.cc dcmnet/libsrc/dulpriv.h dcmpstat/apps/Makefile.dep dcmpstat/apps/dcmmkcrv.cc dcmpstat/apps/dcmmklut.cc dcmpstat/apps/dcmp2pgm.cc dcmpstat/apps/dcmprtsv.cc dcmpstat/apps/dcmpsmk.cc dcmpstat/apps/dcmpsprt.cc dcmpstat/apps/dcmpsrcv.cc dcmpstat/apps/dcmpssnd.cc dcmpstat/include/dviface.h dcmpstat/include/dvpssp.h dcmpstat/libsrc/Makefile.dep dcmpstat/libsrc/dvpsab.cc dcmpstat/libsrc/dvpsabl.cc dcmpstat/libsrc/dvpsal.cc dcmpstat/libsrc/dvpscf.cc dcmpstat/libsrc/dvpsda.cc dcmpstat/libsrc/dvpsga.cc dcmpstat/libsrc/dvpsgl.cc dcmpstat/libsrc/dvpsgr.cc dcmpstat/libsrc/dvpshlp.cc dcmpstat/libsrc/dvpsib.cc dcmpstat/libsrc/dvpsibl.cc dcmpstat/libsrc/dvpsov.cc dcmpstat/libsrc/dvpspl.cc dcmpstat/libsrc/dvpspll.cc dcmpstat/libsrc/dvpspr.cc dcmpstat/libsrc/dvpsri.cc dcmpstat/libsrc/dvpsril.cc dcmpstat/libsrc/dvpsrs.cc dcmpstat/libsrc/dvpsrsl.cc dcmpstat/libsrc/dvpssp.cc dcmpstat/libsrc/dvpssv.cc dcmpstat/libsrc/dvpstat.cc dcmpstat/libsrc/dvpstx.cc dcmpstat/tests/didb.cc imagectn/apps/Makefile.dep imagectn/libsrc/Makefile.dep imagectn/libsrc/dbfind.cc imagectn/libsrc/dbindex.cc imagectn/libsrc/dbmove.cc imagectn/libsrc/dbstore.cc imagectn/libsrc/dbutils.cc imagectn/tests/Makefile.dep ofstd/include/ofcmdln.h ofstd/libsrc/Makefile.dep ofstd/libsrc/Makefile.in ofstd/libsrc/ofcmdln.cc ofstd/libsrc/ofconapp.cc ofstd/tests/Makefile.dep ofstd/tests/tlist.cc ofstd/tests/tstcmdln.cc ofstd/tests/tstlist.cc ofstd/tests/tstring.cc ofstd/tests/tststack.cc wlistctn/apps/Makefile.dep wlistctn/apps/scefind.cc wlistctn/libsrc/Makefile.dep wlistctn/libsrc/wrklstdb.cc wlistctn/tests/Makefile.dep wlistctn/wwwapps/Makefile.dep wlistctn/wwwapps/writwlst.cc **** Changes from 2000.03.02 (riesmeier) - Fixed inconsistency: console applications with no or only optional parameters could not be started without any command line argument because this was always regarded identical with "--help" (print usage). Affects: ofstd/include/ofcmdln.h ofstd/libsrc/ofcmdln.cc ofstd/libsrc/ofconapp.cc - Added new class comprising all general purpose helper functions (first entry: strlcpy - a mixture of strcpy and strncpy). Added: ofstd/include/ofstd.h Affects: dcmnet/libsrc/Makefile.dep dcmnet/libstc/assoc.cc - Rewrote some memory related statements (memcpy, strcpy, etc.) to avoid warnings reported by BoundsChecker. Affects: dcmnet/libsrc/assoc.cc dcmnet/libsrc/dimstore dcmdata/libsrc/dcbuf.cc - Rewrote variable initialization in class contructors to avoid warnings reported on Irix. Affects: dcmimgle/include/diflipt.h dcmimgle/include/dirotat.h dcmimgle/include/ditranst.h - Fixed bug that caused imagectn to ignore the -F (write dataset) flag when +B (bit preserving) was set. Affects: imagectn/apps/scestore.cc **** Changes from 2000.02.29 (eichelberg) - Fixed bug in dcmdata that could cause the parser to return an EC_IllegalCall flag when parsing very small packets. Affects: dcmdata/libsrc/dcstream.cc - Dcmtk now supports transmission with very small max PDU size (less than 24 bytes). In this case dcmdata uses a larger block size than dcmnet because it requires at least 12 bytes of buffer space. Affects: dcmnet/libsrc/assoc.cc dcmnet/libsrc/dulfsm.cc - Fixed bug in dcmpstat library that caused Monochrome1 images to be printed inverse if a Presentation LUT was applied. Affects: dcmpstat/include/dvpspll.h dcmpstat/include/dvpssp.h dcmpstat/include/dvpstat.h dcmpstat/libsrc/dviface.cc dcmpstat/libsrc/dvpspll.cc dcmpstat/libsrc/dvpssp.cc - Removed support for VS value representation. This was proposed in CP 101 but never became part of the standard. Affects: ctndisp/apps/Makefile.dep dcmdata/apps/Makefile.dep dcmdata/apps/dcmconv.cc dcmdata/apps/dcmgpdir.cc dcmdata/apps/dump2dcm.cc dcmdata/libsrc/dcmconv.txt dcmdata/docs/dcmgpdir.txt dcmdata/docs/dump2dcm.txt dcmdata/include/dctk.h dcmdata/include/dcvr.h dcmdata/libsrc/Makefile.dep dcmdata/libsrc/Makefile.in dcmdata/libsrc/dcitem.cc dcmdata/libsrc/dcutils.cc dcmdata/libsrc/dcvr.cc dcmimgle/apps/Makefile.dep dcmimgle/libsrc/Makefile.dep dcmnet/apps/Makefile.dep dcmnet/apps/findscu.cc dcmnet/apps/movescu.cc dcmnet/apps/storescp.cc dcmnet/apps/storescu.cc dcmnet/docs/findscu.txt dcmnet/docs/movescu.txt dcmnet/docs/storescp.txt dcmnet/docs/storescu.txt dcmnet/libsrc/Makefile.dep dcmpstat/apps/Makefile.dep dcmpstat/apps/dcmprtsv.cc dcmpstat/apps/dcmpsrcv.cc dcmpstat/apps/dcmpssnd.cc dcmpstat/libsrc/Makefile.dep imagectn/apps/Makefile.dep imagectn/apps/imagectn.cc imagectn/apps/ti.cc imagectn/docs/imagectn.txt imagectn/docs/ti.txt imagectn/tests/Makefile.dep wlistctn/apps/Makefile.dep wlistctn/apps/wlistctn.cc wlistctn/docs/wlistctn.txt wlistctn/libsrc/Makefile.dep wlistctn/tests/Makefile.dep wlistctn/wwwapps/Makefile.dep Removed: dcmdata/include/dcvrvs.h dcmdata/libsrc/dcvrvs.cc **** Changes from 2000.02.24 (eichelberg) - Calls to accept() and getsockname() now use socklen_t * for the third parameter if this type is defined. Avoids warning on recent Linux distributions. Affects: dcmnet/libsrc/dul.cc config/acconfig.h config/configure config/configure.in config/include/config.h.in - Added new check that distinguishes NeXT's libtool from GNU libtool (which has a totally different purpose). Required because the old configure scheme failed if GNU libtool was found in the search path. Affects: config/aclocal.m4 config/configure config/configure.in config/include/config.h.in **** Changes from 2000.02.23 (eichelberg) - Added FAQ entry about gcc 'multiple common of `XXX type_info node' warning. Affects: FAQ - Corrected macro for Borland C++ Builder 4 workaround. Affects: ctndisp/apps/ctndisp.cc ctndisp/apps/ctndsupp.cc ctndisp/apps/sendimg.cc ctndisp/libsrc/dispuser.cc ctndisp/libsrc/snq.cc dcmdata/apps/dcmconv.cc dcmdata/apps/dcmdump.cc dcmdata/apps/dcmftest.cc dcmdata/apps/dcmgpdir.cc dcmdata/apps/dump2dcm.cc dcmdata/include/dclist.h dcmdata/include/dcswap.h dcmdata/include/dcuid.h dcmdata/include/dcvr.h dcmdata/libsrc/cmdlnarg.cc dcmdata/libsrc/dcbytstr.cc dcmdata/libsrc/dcdicdir.cc dcmdata/libsrc/dcdict.cc dcmdata/libsrc/dcdirrec.cc dcmdata/libsrc/dcelem.cc dcmdata/libsrc/dcerror.cc dcmdata/libsrc/dcfilefo.cc dcmdata/libsrc/dcitem.cc dcmdata/libsrc/dcmetinf.cc dcmdata/libsrc/dcpixseq.cc dcmdata/libsrc/dcpxitem.cc dcmdata/libsrc/dcsequen.cc dcmdata/libsrc/dcstack.cc dcmdata/libsrc/dcuid.cc dcmdata/libsrc/dcutils.cc dcmdata/libsrc/dcvrobow.cc dcmdata/libsrc/mkdeftag.cc dcmdata/libsrc/mkdictbi.cc dcmimgle/libsrc/dconvlum.cc dcmimgle/include/dimoopx.h dcmimgle/libsrc/diutils.h dcmnet/apps/echoscu.cc dcmnet/apps/findscu.cc dcmnet/apps/movescu.cc dcmnet/apps/storescp.cc dcmnet/apps/storescu.cc dcmnet/include/dcompat.h dcmnet/include/dicom.h dcmnet/libsrc/assoc.cc dcmnet/libsrc/dcompat.cc dcmnet/libsrc/dimcancl.cc dcmnet/libsrc/dimcmd.cc dcmnet/libsrc/dimdump.cc dcmnet/libsrc/dimecho.cc dcmnet/libsrc/dimfind.cc dcmnet/libsrc/dimget.cc dcmnet/libsrc/dimmove.cc dcmnet/libsrc/dimse.cc dcmnet/libsrc/dimstore.cc dcmnet/libsrc/diutil.cc dcmnet/libsrc/dul.cc dcmnet/libsrc/dulconst.cc dcmnet/libsrc/dulextra.cc dcmnet/libsrc/dulfsm.cc dcmnet/libsrc/dulparse.cc dcmnet/libsrc/dulpres.cc dcmnet/libsrc/lst.cc dcmpstat/apps/dcmpsmk.cc dcmpstat/libsrc/dvpstat.cc imagectn/apps/cnf.cc imagectn/apps/cnfexnt.cc imagectn/apps/cnfpriv.cc imagectn/apps/imagectn.cc imagectn/apps/sce.cc imagectn/apps/sceecho.cc imagectn/apps/scefind.cc imagectn/apps/sceget.cc imagectn/apps/scemove.cc imagectn/apps/scestore.cc imagectn/apps/ti.cc imagectn/apps/tinet.cc imagectn/apps/tiui.cc imagectn/include/dbstore.h imagectn/include/imagedb.h imagectn/libsrc/dbfind.cc imagectn/libsrc/dbindex.cc imagectn/libsrc/dbmove.cc imagectn/libsrc/dbstore.cc imagectn/libsrc/dbutils.cc imagectn/libsrc/dbregimg.cc ofstd/include/ofstring.h ofstd/libsrc/offname.cc wlistctn/apps/sce.cc wlistctn/apps/sceecho.cc wlistctn/apps/scefind.cc wlistctn/apps/wlistctn.cc wlistctn/libsrc/wrklstdb.cc wlistctn/tests/wltest.cc wlistctn/wwwapps/writwlst.cc **** Changes from 2000.02.10 (riesmeier) - Added new feature to dcmdump (enhanced print method of dcmdata): write pixel data/item value fields to raw files. Affects: dcmdata/apps/dcmdump.cc dcmdata/docs/dcmdump.txt dcmdata/include/dcbytstr.h dcmdata/include/dcdatset.h dcmdata/include/dcdicdir.h dcmdata/include/dcdirrec.h dcmdata/include/dcfilefo.h dcmdata/include/dcitem.h dcmdata/include/dcmetinf.h dcmdata/include/dcobject.h dcmdata/include/dcpixel.h dcmdata/include/dcpixseq.h dcmdata/include/dcpxitem.h dcmdata/include/dcsequen.h dcmdata/include/dcvrat.h dcmdata/include/dcvrfd.h dcmdata/include/dcvrfl.h dcmdata/include/dcvrobow.h dcmdata/include/dcvrsl.h dcmdata/include/dcvrss.h dcmdata/include/dcvrui.h dcmdata/include/dcvrul.h dcmdata/include/dcvrulup.h dcmdata/include/dcvrus.h dcmdata/libsrc/dcbytstr.cc dcmdata/libsrc/dcdatset.cc dcmdata/libsrc/dcdicdir.cc dcmdata/libsrc/dcdictbi.cc dcmdata/libsrc/dcdirrec.cc dcmdata/libsrc/dcfilefo.cc dcmdata/libsrc/dcitem.cc dcmdata/libsrc/dcmetinf.cc dcmdata/libsrc/dcobject.cc dcmdata/libsrc/dcpixel.cc dcmdata/libsrc/dcpixseq.cc dcmdata/libsrc/dcpxitem.cc dcmdata/libsrc/dcsequen.cc dcmdata/libsrc/dcvrat.cc dcmdata/libsrc/dcvrfd.cc dcmdata/libsrc/dcvrfl.cc dcmdata/libsrc/dcvrobow.cc dcmdata/libsrc/dcvrsl.cc dcmdata/libsrc/dcvrss.cc dcmdata/libsrc/dcvrui.cc dcmdata/libsrc/dcvrul.cc dcmdata/libsrc/dcvrulup.cc dcmdata/libsrc/dcvrus.cc - Fixed bug producing an error message when trying to create an empty PixelData element. Affects: dcmdata/libsrc/dcpixel.cc - Enhanced handling of PixelData/Item element. Externally stored raw data is now always imported as little endian and swapped if necessary. This change reflects the new 'export' feature of dcmdump. Affects: dcmdata/apps/dump2dcm.cc dcmdata/docs/dump2dcm.txt dcmdata/libsrc/dcvrobow.cc **** Changes from 2000.02.09 (eichelberg) - Corrected inconsistency in findscu documentation. Thanks to David Lappen for the report. Affects: dcmnet/docs/findscu.txt **** Changes from 2000.02.07 (eichelberg) - Significant speed improvement for network transmission. Now using a default socket buffer length of 32K and disabling the Nagle algorithm by default (TCP_NODELAY). Disabling of the Nagle algorithm can be switched off by compiling the toolkit with the symbol DONT_DISABLE_NAGLE_ALGORITHM defined, or by setting the environment variable TCP_NODELAY to the value "0". Contribution from Andy Hewett Affects: dcmnet/libsrc/dul.cc dcmnet/libsrc/dulfsm.cc - Added test for to configure script. Affects: config/configure config/configure.in config/confmod config/include/config.h.in - Removed const qualifier from DcmTagKey::toString(), avoids warning on Irix. Affects: dcmdata/include/dctagkey.h dcmdata/libsrc/dctagkey.cc - The typedef for Sint8 now defaults to char instead of signed char. This avoids warnings on certain c-front related compilers. The old behaviour can be restored by compiling with the symbol CHAR_IS_UNSIGNED defined. Affects: dcmdata/include/dctypes.h **** Changes from 2000.02.03 (riesmeier) - Fixed bug: encapsulated data (pixel items) have never been loaded using method 'loadAllDataIntoMemory'. Therefore, encapsulated pixel data was never printed with 'dcmdump'. Affects: dcmdata/include/dcpixel.h dcmdata/libsrc/dcpixel.cc dcmdata/libsrc/dcpxitem.cc dcmdata/libsrc/dcvr.cc - Corrected bug that caused wrong calculation of group length for sequence of items (e.g. encapsulated pixel data). Affects: dcmdata/libsrc/dcsequen.cc dcmdata/libsrc/dcpxitem.cc dcmdata/libsrc/dcvr.cc dcmdata/libsrc/dcvrobow.cc - Avoid EVR_pixelItem in comparisons (compare with != EVR_OW instead). Affects: dcmdata/libsrc/dcvrobow.cc **** Changes from 2000.02.03 (eichelberg) - Rebuilt data dictionary based on 1999 standard text, latest supplements and CP packet 6. Affects: dcmdata/include/dcdeftag.h dcmdata/include/dcuid.h dcmdata/libsrc/Makefile.in dcmdata/libsrc/dcdictzz.cc dcmdata/libsrc/dcuid.cc dcmdata/libsrc/dicom.dic dcmpstat/libsrc/dvpsib.cc - Moved UID related functions from dcmnet (diutil.h) to dcmdata (dcuid.h) where they belong. Renamed access functions to dcmSOPClassUIDToModality and dcmGuessModalityBytes. Affects: dcmdata/include/dcuid.h dcmdata/libsrc/dcuid.cc dcmnet/apps/movescu.cc dcmnet/apps/storescp.cc dcmnet/apps/storescu.cc dcmnet/include/diutil.h dcmnet/libsrc/dimstore.cc dcmnet/libsrc/diutil.cc imagectn/apps/sceget.cc imagectn/apps/scemove.cc imagectn/apps/tinet.cc imagectn/libsrc/dbutils.cc dcmpstat/apps/dcmpssnd.cc - Updated dcmgpdir to new directory record structure in letter ballot text of Structured Report. Affects: dcmdata/apps/dcmgpdir.cc dcmdata/libsrc/dcdirrec.cc **** Changes from 2000.02.02 (eichelberg) - Fixed bug in ACSE code that could cause data in memory to be overwritten if a client sent an A-ASSOCIATE request with a longer ImplementationClassUID or ImplementationVersionName than allowed. Thanks to Gilles Mevel for the report and bug fix. Affects: dcmnet/libsrc/assoc.cc - Replaced some #if statements by more robust #ifdef Affects: dcmdata/apps/dcmgpdir.cc dcmnet/apps/movescu.cc dcmnet/libsrc/dcompat.cc dcmpstat/apps/dcmprtsv.cc dcmpstat/apps/dcmpsrcv.cc dcmpstat/tests/didb.cc wlistctn/apps/wlistctn.cc wlistctn/include/wrklstdb.h **** Changes from 2000.02.02 (riesmeier) - Removed space characters before preprocessor directives. Affects: ofstd/include/ofbmanip.h ofstd/include/oftimer.h ofstd/libsrc/ofcmdln.cc dcmimgle/include/didocu.h dcmimgle/include/diimage.h dcmimgle/include/diovpln.h dcmimgle/include/dipxrept.h dcmimgle/libsrc/dcmimage.cc dcmimgle/libsrc/diciefn.cc dcmimgle/libsrc/didispfn.cc dcmimgle/libsrc/digsdfn.cc dcmpstat/apps/dcmmklut.cc dcmpstat/apps/dcmprtsv.cc - Added type cast to delete void pointer (reported by gcc 2.95). Affects: dcmimgle/libsrc/dimoimg.cc - Updated Readme file. Affects: README - Replaced 'delete' statements by 'delete[]' for objects created with 'new[]'. Affects: ofstd/libsrc/ofstring.cc dcmdata/include/dcbuf.h dcmdata/include/dcelem.h dcmdata/libsrc/dcbuf.cc dcmdata/libsrc/dcbytstr.cc dcmdata/libsrc/dcdicdir.cc dcmdata/libsrc/dcdicent.cc dcmdata/libsrc/dcdictbi.cc dcmdata/libsrc/dcdirrec.cc dcmdata/libsrc/dchashdi.cc dcmdata/libsrc/dcitem.cc dcmdata/libsrc/dcpixseq.cc dcmdata/libsrc/dcstream.cc dcmdata/libsrc/dcvrat.cc dcmdata/libsrc/dcvrfd.cc dcmdata/libsrc/dcvrfl.cc dcmdata/libsrc/dcvrsl.cc dcmdata/libsrc/dcvrss.cc dcmdata/libsrc/dcvrui.cc dcmdata/libsrc/dcvrul.cc dcmdata/libsrc/dcvrulup.cc dcmdata/libsrc/dcvrus.cc dcmimgle/include/displint.h dcmpstat/libsrc/dvpsconf.cc dcmnet/apps/storescu.cc wlistctn/libsrc/wrklstdb.cc wlistctn/wwwapps/writwlst.cc **** Changes from 2000.02.01 (eichelberg) - Adapted ctndisp to OFCommandLine class. Affects: ctndisp/apps/ctndisp.cc ctndisp/docs/ctndisp.txt - Fixed inconsistency in movescu documentation Affects: dcmnet/docs/movescu.txt - Avoiding to include as extern "C" on Borland C++ Builder 4, workaround for bug in compiler header files. Affects: ctndisp/apps/ctndisp.cc ctndisp/apps/ctndsupp.cc ctndisp/apps/killassc.cc ctndisp/apps/sendimg.cc ctndisp/libsrc/dispuser.cc ctndisp/libsrc/snq.cc dcmdata/apps/dcmconv.cc dcmdata/apps/dcmdump.cc dcmdata/apps/dcmftest.cc dcmdata/apps/dcmgpdir.cc dcmdata/apps/dump2dcm.cc dcmdata/include/dclist.h dcmdata/include/dcobject.h dcmdata/include/dcswap.h dcmdata/include/dcuid.h dcmdata/include/dcvr.h dcmdata/libsrc/cmdlnarg.cc dcmdata/libsrc/dcbytstr.cc dcmdata/libsrc/dcdicdir.cc dcmdata/libsrc/dcdict.cc dcmdata/libsrc/dcdirrec.cc dcmdata/libsrc/dcelem.cc dcmdata/libsrc/dcerror.cc dcmdata/libsrc/dcfilefo.cc dcmdata/libsrc/dcitem.cc dcmdata/libsrc/dcmetinf.cc dcmdata/libsrc/dcobject.cc dcmdata/libsrc/dcpixseq.cc dcmdata/libsrc/dcpxitem.cc dcmdata/libsrc/dcsequen.cc dcmdata/libsrc/dcstack.cc dcmdata/libsrc/dcuid.cc dcmdata/libsrc/dcutils.cc dcmdata/libsrc/dcvrobow.cc dcmdata/libsrc/mkdeftag.cc dcmdata/libsrc/mkdictbi.cc dcmimgle/libsrc/dconvlum.cc dcmimgle/libsrc/dimoopx.h dcmimgle/libsrc/dimoopxt.h dcmimgle/libsrc/diutils.h dcmnet/apps/echoscu.cc dcmnet/apps/findscu.cc dcmnet/apps/movescu.cc dcmnet/apps/storescp.cc dcmnet/apps/storescu.cc dcmnet/include/dcompat.h dcmnet/include/dicom.h dcmnet/libsrc/assoc.cc dcmnet/libsrc/dcompat.cc dcmnet/libsrc/dimcancl.cc dcmnet/libsrc/dimcmd.cc dcmnet/libsrc/dimdump.cc dcmnet/libsrc/dimecho.cc dcmnet/libsrc/dimfind.cc dcmnet/libsrc/dimget.cc dcmnet/libsrc/dimmove.cc dcmnet/libsrc/dimse.cc dcmnet/libsrc/dimstore.cc dcmnet/libsrc/diutil.cc dcmnet/libsrc/dul.cc dcmnet/libsrc/dulconst.cc dcmnet/libsrc/dulextra.cc dcmnet/libsrc/dulfsm.cc dcmnet/libsrc/dulparse.cc dcmnet/libsrc/dulpres.cc dcmnet/libsrc/lst.cc dcmpstat/apps/dcmpsmk.cc dcmpstat/apps/dcmpsprt.cc dcmpstat/libsrc/dvpstat.cc imagectn/apps/cnf.cc imagectn/apps/cnfexnt.cc imagectn/apps/cnfpriv.cc imagectn/apps/imagectn.cc imagectn/apps/sce.cc imagectn/apps/sceecho.cc imagectn/apps/scefind.cc imagectn/apps/sceget.cc imagectn/apps/scemove.cc imagectn/apps/scestore.cc imagectn/apps/ti.cc imagectn/apps/tinet.cc imagectn/apps/tiui.cc imagectn/include/dbstore.h imagectn/include/imagedb.h imagectn/libsrc/dbfind.cc imagectn/libsrc/dbindex.cc imagectn/libsrc/dbmove.cc imagectn/libsrc/dbstore.cc imagectn/libsrc/dbutils.cc imagectn/libsrc/dbregimg.cc ofstd/include/ofstring.h ofstd/libsrc/offname.cc wlistctn/apps/sce.cc wlistctn/apps/sceecho.cc wlistctn/apps/scefind.cc wlistctn/apps/wlistctn.cc wlistctn/libsrc/wrklstdb.cc wlistctn/tests/wltest.cc wlistctn/wwwapps/writwlst.cc **** Changes from 2000.01.31 (eichelberg) - Introduced new flag g_dimse_save_dimse_data. If enabled, all DIMSE messages and data sets sent or received are stored in files. This facilitates debugging of DIMSE problems. Affects: dcmnet/include/dimse.h dcmnet/libsrc/dimse.cc **** Changes from 1999.12.09 (riesmeier) - Split source file dimoimg.cc into 4 parts to avoid compiler problems with gcc and additional optimization options. Added: dcmimgle/libsrc/dimoimg3.cc dcmimgle/libsrc/dimoimg4.cc dcmimgle/libsrc/dimoimg5.cc Affects: dcmimgle/include/dimoimg.h dcmimgle/libsrc/Makefile.dep dcmimgle/libsrc/Makefile.in dcmimgle/libsrc/dimoimg.cc **** Changes from 1999.11.25 (riesmeier) - Changed config file entry "HighEndSystem" to "HighResolutionGraphics". Affects: dcmimgle/libsrc/dviface.cc dcmimgle/libsrc/dvpscf.cc **** Changes from 1999.11.24 (riesmeier) - Added method to mirror order of entries in look-up tables. Affects: dcmimgle/include/diluptab.h dcmimgle/libsrc/diluptab.cc - Enhanced comments for methods "inverting" the LUT values/entries. Affects: dcmimgle/include/diluptab.h - Replaced call of method invertTable() by mirrorTable() to invert a presentation LUT. Affects: dcmpstat/libsrc/dvpspl.cc - Fixed bug in method getData() occurred sometimes when inverting presentation LUTs. Affects: dcmimgle/libsrc/dimoimg.cc **** Changes from 1999.11.24 (eichelberg) - Fixed locking problem in dcmpssnd and dcmpsrcv on Win9x platforms. Affects: dcmpstat/apps/dcmpssnd.cc dcmpstat/apps/dcmpsrcv.cc **** Changes from 1999.11.19 (riesmeier) - Fixed bug in scaling method "reducePixel" (reported by gcc 2.7.2.1). Affects: dcmimgle/include/discalet.h - Added explicit type cast to avoid compiler warnings (reported by gcc 2.7.2.1 on Linux). Affects: dcmimgle/include/dcmimage.h - Updated sample configuration file (changed PreviewSize). Affects: dcmpstat/tests/test.cfg - Removed bugs: deactivating VOI and presentation LUTs should be done by decreasing the reference pointer not by deleting the storage area. Affects: dcmimgle/libsrc/dimoimg.cc **** Changes from 1999.11.19 (eichelberg) - Fixed bug in dcmpstat module that prevented printing of images with pixel aspect ratio. Affects: dcmpstat/libsrc/dvpssp.cc **** Changes from 1999.11.18 (eichelberg) - Corrected various memory leaks. DcmFileFormat can be instantiated with a DcmDataset* as a parameter, but in this case the dataset is copied and not taken over by the DcmFileFormat. The pointer must be freed explicitly by the caller. Affects: dcmpstat/libsrc/dviface.cc - Updated sample configuration file. Affects: dcmpstat/tests/test.cfg **** Changes from 1999.11.15 (riesmeier) - Changed behaviour of method getOverlayData(): parameter 'transp' replaced by 'fore' to specify the foreground color used for the overlay plane. Affects: dcmpstat/include/dvpstat.h dcmpstat/libsrc/dvpstat.cc - Fixed bug concerning the setting of window center and width for the preview image. Affects: dcmpstat/libsrc/dvpstat.cc **** Changes from 1999.11.12 (eichelberg) - Corrected file locking code that did not work correctly under Win95/98. Affects: dcmnet/include/dcompat.h dcmnet/libsrc/dcompat.cc imagectn/libsrc/dbstore.cc imagectn/libsrc/dbutils.cc wlistctn/libsrc/wrklstdb.cc - Corrected creation of circular shutters, X/Y coordinates were swapped. Affects: dcmpstat/libsrc/dvpstat.cc **** Changes from 1999.11.03 (eichelberg) - Added support for transmitting annotations in the film session label. Added support for dump tool launched from DVInterface. Affects: dcmpstat/apps/dcmprtsv.cc dcmpstat/include/dviface.h dcmpstat/include/dvpscf.h dcmpstat/libsrc/dviface.cc dcmpstat/libsrc/dvpscf.cc dcmpstat/tests/test.cfg **** Changes from 1999.10.28 (eichelberg) - Print client does not attempt any more to negotiate Presentation LUT or Annotation Box if config file says that the printer does not support them. Affects: dcmpstat/apps/dcmprtsv.cc dcmpstat/include/dvpspr.h dcmpstat/libsrc/dvpspr.cc - Added options for setting Max Density and Min Density from command line Affects: dcmpstat/apps/dcmpsprt.cc **** Changes from 1999.10.25 (riesmeier) - Fixed bug caused by the incorrect order of x/y coordinates for circular and polygonal shutters (the DICOM standard is somehow inconsistent in this respect). Affects: dcmpstat/libsrc/dvpstat.cc **** Changes from 1999.10.22 (eichelberg) - Added conditional define to prevent compiler warning Affects: dcmpstat/libsrc/dvpscf.cc - Print spooler now correctly dumping DIMSE communication to log file. Affects: dcmpstat/apps/dcmprtsv.cc **** Changes from 1999.10.22 (riesmeier) - Added validity check to methods setting pixel aspect ratio and pixel spacing (>0). Fixed problems with incorrect pixel spacing (0\0) stored in sample images. Affects: dcmpstat/libsrc/dvpsda.cc dcmpstat/libsrc/dvpstat.cc **** Changes from 1999.10.21 (riesmeier) - Renamed template type definition from 'T3' to '_T3' to avoid naming conflicts. Affects: dcmimgle/include/dicrvfit.h dcmimgle/include/displint.h - Replaced some tabs in the comment field by spaces. Affects: dcmimgle/tests/plan.dat - Fixed bug in method addToPrintHardcopyFromDB(). Affects: dcmpstat/libsrc/dviface.cc - Adapted command line tool "dbregimg" to OFCommandLine class (provides support for wildcard expansion under non-UNIX environments). Affects: imagectn/tests/dbregimg.cc - Corrected calculation of CIELAB display curve (thanks to Mr. Mertelmeier from Siemens). Affects: dcmimgle/libsrc/dicielut.cc - Added underflow check to ambient light value. Affects: dcmimgle/libsrc/didislut.cc **** Changes from 1999.10.20 (riesmeier) - Enhanced method getOverlayData to support 12 bit data for print. Affects: dcmimgle/include/dcmimage.h dcmimgle/include/dimoimg.h dcmimgle/include/diovlay.h dcmimgle/include/diovpln.h dcmimgle/libsrc/dimoimg.cc dcmimgle/libsrc/diovlay.cc dcmimgle/libsrc/diovpln.cc dcmpstat/include/dvpstat.h dcmpstat/libsrc/dvpstat.cc - Enhanced method invertTable to distinguish between copy of LUT data and original (referenced) LUT data. Affects: dcmimgle/include/dibaslut.h dcmimgle/include/diluptab.h dcmimgle/libsrc/dibaslut.cc dcmimgle/libsrc/diluptab.cc dcmpstat/libsrc/dvpspl.cc - Enhanced method convertPValueToDDL to support 12 bit data for print. Affects: dcmpstat/include/dvpstat.h dcmpstat/libsrc/dvpstat.cc - Added generic specification for template function convertValue to avoid compiler warnings reported by MSVC (with additional options?). Affects: dcmimgle/include/dicrvfit.h - Replaced option --no-output by an optional output parameter (filename). Minor corrections. Affects: dcmpstat/apps/dcmp2pgm.cc dcmpstat/docs/dcmp2pgm.txt - Added support for a down-scaled preview image of the current DICOM image (e.g. useful for online-windowing or print preview). Affects: dcmpstat/include/dviface.h dcmpstat/include/dvpscf.h dcmpstat/include/dvpstat.h dcmpstat/libsrc/dviface.cc dcmpstat/libsrc/dvpscf.cc dcmpstat/libsrc/dvpstat.cc dcmpstat/tests/test.cfg - Corrected bug concerning the minimum and maximum print bitmap size (first presentation state created in the constructor of DVInterface never used the correct values from the config file). Affects: dcmpstat/libsrc/dviface.cc - Always use the variable 'currentImageSelectedFrame' as the frame number, not 1. Affects: dcmpstat/libsrc/dvpstat.cc - Rebuilt makefile dependencies. Affects: dcmpstat/apps/Makefile.dep dcmpstat/libsrc/Makefile.dep - Added explicit type cast to make MSVC happy. Affects: dcmimgle/libsrc/diovpln.cc dcmpstat/libsrc/dvpstat.cc - Removed const from pointer declaration (problem reported by MSVC). Affects: dcmimgle/libsrc/diluptab.cc - Eliminated default values for template types since this features is not supported by SunCC 4.x (temporarily introduced '#define' instead). Affects: dcmimgle/include/dicrvfit.h dcmimgle/include/displint.h - Splitted CHANGES file into one file for each public release. Affects: CHANGES Added: CHANGES.301 CHANGES.302 CHANGES.310 CHANGES.311 CHANGES.312 CHANGES.320 CHANGES.321 CHANGES.330 CHANGES.331 CHANGES.340 **** Changes from 1999.10.19 (eichelberg) - dcmprtsv now correctly writes DIMSE dump to log file and deletes log file upon termination if no print job was processed. Affects: dcmpstat/apps/dcmprtsv.cc - added support for the Basic Annotation Box SOP Class as well as access methods for Max Density and Min Density. Affects: dcmpstat/apps/Makefile.dep dcmpstat/apps/dcmpsprt.cc dcmpstat/include/dviface.h dcmpstat/include/dvpscf.h dcmpstat/include/dvpsibl.h dcmpstat/include/dvpssp.h dcmpstat/libsrc/Makefile.dep dcmpstat/libsrc/Makefile.in dcmpstat/libsrc/dviface.cc dcmpstat/libsrc/dvpscf.cc dcmpstat/libsrc/dvpspll.cc dcmpstat/libsrc/dvpspr.cc dcmpstat/libsrc/dvpssp.cc dcmpstat/tests/test.cfg Added: dcmpstat/include/dvpsab.h dcmpstat/include/dvpsabl.h dcmpstat/libsrc/dvpsab.cc dcmpstat/libsrc/dvpsabl.cc - Corrected handling of MONOCHROME1 images when used with P-LUTs Affects: dcmpstat/include/dvpstat.h dcmpstat/libsrc/dviface.cc dcmpstat/libsrc/dvpstat.cc **** Changes from 1999.10.18 (riesmeier) - Use the current display shutter P-value for the border area of print bitmaps. Affects: dcmpstat/libsrc/dvpstat.cc - Switch off time consuming interpolation for implicite scaling of print bitmaps. Affects: dcmpstat/libsrc/dvpstat.cc - Enlarged string buffer for output text file header. Affects: dcmpstat/apps/dcmmklut.cc - Changed header of sample LUT definition file. Modified table data according to the new formula Renso Vonk gave us. Affects: dcmpstat/apps/pms_plut.txt - Moved min/max value determination to display function base class. Now the actual min/max values are also used for GSDFunction (instead of first and last luminance value). Affects: dcmimgle/include/diciefn.h dcmimgle/include/didispfn.h dcmimgle/libsrc/diciefn.cc dcmimgle/libsrc/didispfn.cc dcmimgle/libsrc/digsdfn.cc - Simplified calculation of CIELAB function (now fully percentage based). Affects: dcmimgle/libsrc/dicielut.cc - Fixed typos. Affects: dcmimgle/include/dicrvfit.h - Enhanced command line tool dcmdspfn (added new options). Affects: dcmimgle/apps/dcmdspfn.cc dcmimgle/docs/dcmdspfn.txt dcmimgle/include/diciefn.h dcmimgle/include/dicielut.h dcmimgle/include/didispfn.h dcmimgle/include/digsdfn.h dcmimgle/include/digsdlut.h dcmimgle/libsrc/diciefn.cc dcmimgle/libsrc/dicielut.cc dcmimgle/libsrc/didispfn.cc dcmimgle/libsrc/digsdfn.cc dcmimgle/libsrc/digsdlut.cc - Added explicit type cast to avoid compiler warnings reported by MSVC. Affects: dcmimgle/libsrc/didispfn.cc - Added missing variables in member initialization list (reported by egcs on Solaris with additional compiler options). Affects: dcmimgle/libsrc/digsdfn.cc **** Changes from 1999.10.15 (riesmeier) - Enhanced checking mechanism for input text files. Affects: dcmpstat/apps/dcmmklut.cc - Adapted documentation for dcmmklut command line tool. Affects: dcmpstat/docs/dcmmklut.txt - Added sample input text file defining the Philips standard display curve. Added: dcmpstat/apps/pms_plut.txt - Fixed typos. Affects: dcmimgle/include/dicrvfit.h dcmimgle/include/displint.h **** Changes from 1999.10.14 (riesmeier) - Added new template class that supports polynomial curve fitting algorithm. Added: dcmimgle/include/dicrvfit.h - Fixed typo. Affects: dcmimgle/include/displint.h - Rebuilt makefile dependencies. Affects: dcmimgle/libsrc/Makefile.dep dcmpstat/apps/Makefile.dep - Merged command line tool 'dconvmap' into 'dcmmklut' and enhanced its facilities (e.g. integrated new polynomial curve fitting algorithm). Removed: dcmpstat/apps/dconvmap.cc Affects: dcmpstat/apps/dcmmklut.cc dcmpstat/apps/Makefile.in - Fixed problems with MSVC. Affects: dcmpstat/apps/dcmmklut.cc **** Changes from 1999.10.13 (eichelberg) - Fixed bug in routine that renders P-LUTs into a print bitmap before sending an image to the printer Affects:dcmpstat/include/dvpssp.h dcmpstat/libsrc/dvpssp.cc - Added config file entries and access methods for user-defined VOI presets, log directory, verbatim logging and an explicit list of image display formats for each printer. Affects: dcmpstat/apps/dcmprtsv.cc dcmpstat/include/dvpscf.h dcmpstat/include/dvpstat.h dcmpstat/libsrc/dviface.cc dcmpstat/libsrc/dvpscf.cc dcmpstat/libsrc/dvpstat.cc dcmpstat/tests/test.cfg - Cleaned up Makefile Affects: dcmpstat/Makefile.in - Now negotiation Basic Annotation Box SOP Class Affects: dcmpstat/include/dvpspr.h dcmpstat/libsrc/dvpspr.cc **** Changes from 1999.10.13 (riesmeier) - Fixed bug in get/setAmbientLightValue(). Affects: dcmpstat/libsrc/dviface.cc **** Changes from 1999.10.11 (riesmeier) - Removed tabs within command line option string (caused errors for test #1000, #1002-1004). Affects: dcmimgle/tests/test.dat - Fixed bug in window() routine for cases where presentation LUT is active. Affects: dcmimgle/include/dimoopxt.h **** Changes from 1999.10.08 (riesmeier) - Merged 'dcmgsdf' and 'dccielab' into one application. Added: dcmimgle/apps/dcmdspfn.cc dcmimgle/docs/dcmdspfn.txt Removed: dcmimgle/apps/dccielab.cc dcmimgle/apps/dcmgsdf.cc dcmimgle/docs/dccielab.txt dcmimgle/docs/dcmgsdf.txt Affects: dcmimgle/apps/Makefile.dep dcmimgle/apps/Makefile.in - Modified "shortcuts" for command line options specifying the input format. Affects: dcmpstat/apps/dconvmap.cc **** Changes from 1999.10.07 (eichelberg) - Reworked management of Presentation LUTs in order to create tighter coupling between Softcopy and Print. Added: dcmpstat/include/dvpspll.h dcmpstat/libsrc/dvpspll.cc Affects: dcmpstat/apps/Makefile.dep dcmpstat/apps/dcmprtsv.cc dcmpstat/apps/dcmpsprt.cc dcmpstat/include/dviface.h dcmpstat/include/dvpscf.h dcmpstat/include/dvpsib.h dcmpstat/include/dvpsibl.h dcmpstat/include/dvpspl.h dcmpstat/include/dvpssp.h dcmpstat/include/dvpstat.h dcmpstat/libsrc/Makefile.dep dcmpstat/libsrc/Makefile.in dcmpstat/libsrc/dviface.cc dcmpstat/libsrc/dvpscf.cc dcmpstat/libsrc/dvpsib.cc dcmpstat/libsrc/dvpsibl.cc dcmpstat/libsrc/dvpspl.cc dcmpstat/libsrc/dvpssp.cc dcmpstat/libsrc/dvpstat.cc dcmpstat/tests/Makefile.dep dcmpstat/tests/test.cfg - Added option to write presentation LUT into existing dataset. Allowed presentation LUTs with 8 or 9 bit data (softcopy). Affects: dcmpstat/apps/dconvmap.cc - Corrected typo in storescp error message Affects: dcmnet/apps/storescp.cc - Corrected typo in dcmconv error message Affects: dcmdata/apps/dcmconv.cc **** Changes from 1999.10.06 (riesmeier) - Fixed bug in renderPixelData: images haven't been flipped correctly for PrintBitmap. Affects: dcmpstat/libsrc/dvpstat.cc - Corrected creation of PrintBitmap pixel data: VOI windows should be applied before clipping to avoid that the region outside the image (border) is also windowed (this requires a new method in dcmimgle to create a DicomImage with the grayscale transformations already applied). Affects: dcmimgle/include/dcmimage.h dcmimgle/include/diimage.h dcmimgle/include/dimo2img.h dcmimgle/include/dimoimg.h dcmimgle/include/dimopx.h dcmimgle/include/dimopxt.h dcmimgle/libsrc/dcmimage.cc dcmimgle/libsrc/diimage.cc dcmimgle/libsrc/dimo2img.cc dcmimgle/libsrc/dimoimg.cc dcmimgle/libsrc/dimopx.cc dcmpstat/libsrc/dvpstat.cc - Added Doc++ header comments. Affects: dcmimgle/include/dimomod.h - Added method to remove reference to (internally handled) pixel data. Affects: dcmimgle/include/dimoopx.h dcmimgle/include/dimoopxt.h - Enhanced 'dconvmap' to support the reading of simple text files (256 8bit entries). Affects: dcmpstat/apps/dconvmap.cc **** Changes from 1999.10.05 (riesmeier) - Fixed bug in DVPSSoftcopyVOI::setVOIWindow(). Window width = 1 was rejected. Affects: dcmpstat/libsrc/dvpssv.cc **** Changes from 1999.10.04 (riesmeier) - Fixed bug in wildcard expansion (concerning "direct option" feature). Affects: ofstd/include/ofcmdln.h ofstd/libsrc/ofcmdln.cc **** Changes from 1999.10.01 (riesmeier) - Enhanced template class for cubic spline interpolation to support non-floating point classes/types as y-coordinates. Affects: dcmimgle/include/displint.h - Added new option to config dcmnet/apps/AlwaysDeleteTerminateJobs. Affects: dcmpstat/apps/dcmprtsv.cc dcmpstat/include/dvpscf.h dcmpstat/libsrc/dvpscf.cc dcmpstat/tests/test.cfg - Added new command line option specifying the number of LUT entries to MAP file conversion tool. Affects: dcmpstat/apps/dconvmap.cc - Rebuilt makefile dependencies. Affects: dcmpstat/apps/Makefile.dep - Fixed type conversion problems reported by MSVC5. Affects: dcmpstat/apps/dconvmap.cc **** Changes from 1999.09.30 (riesmeier) - Added methods to compare two lookup tables. Affects: dcmimgle/include/dibaslut.h dcmimgle/include/diluptab.h dcmimgle/include/dibaslut.cc dcmimgle/include/diluptab.cc - Added new test images to regression test script. Affects: dcmimgle/tests/test.dat - Added missing directory entries to make file. Affects: dcmimgle/Makefile.in dcmpstat/Makefile.in - Added "htmldocs" directory and an option to the make file to delete all HTML related files ('make distclean'). Added: dcmpstat/htmldocs dcmpstat/htmldocs/Makefile.in Affects: dcmpstat/Makefile.in - Rebuilt makefile dependencies. Affects: dcmpstat/apps/Makefile.dep dcmpstat/libsrc/Makefile.dep dcmpstat/tests/Makefile.dep - Added missing object file to makefile. Affects: dcmpstat/tests/Makefile.in - Corrected typos and formatting; modified comments. Affects: dcmpstat/libsrc/dvpstat.cc **** Changes from 1999.09.27 (eichelberg) - Print interface now copies current printer name, avoids JNI problems. Affects: dcmpstat/include/dviface.h dcmpstat/libsrc/dviface.cc - Fixed index bug in getTargetPrinterConfigurationSetting. Affects: dcmpstat/libsrc/dvpscf.cc - Fixed index bug in getLUTID, always returned first index. Affects: dcmpstat/libsrc/dvpscf.cc **** Changes from 1999.09.24 (riesmeier) - Corrected bug writing inverse Presentation LUT Shape. Affects: dcmpstat/libsrc/dvpspl.cc **** Changes from 1999.09.24 (eichelberg) - Added support for CP 173 (Presentation LUT clarifications) Affects: dcmpstat/apps/dcmprtsv.cc dcmpstat/apps/dcmpsprt.cc dcmpstat/include/dviface.h dcmpstat/include/dvpscf.h dcmpstat/include/dvpssp.h dcmpstat/libsrc/dviface.cc dcmpstat/libsrc/dvpscf.cc dcmpstat/libsrc/dvpssp.cc dcmpstat/tests/test.cfg - Print spooler (dcmprtsv) now logs diagnostic messages in log files when operating in spool mode. Affects: dcmpstat/include/dvpsib.h dcmpstat/include/dvpsibl.h dcmpstat/include/dvpspl.h dcmpstat/include/dvpspr.h dcmpstat/libsrc/dvpsib.cc dcmpstat/libsrc/dvpsibl.cc dcmpstat/libsrc/dvpspl.cc dcmpstat/libsrc/dvpspr.cc - Fixed problems related to DcmElement::getOFString on empty strings. Affects: dcmpstat/libsrc/dvpshlp.cc dcmpstat/libsrc/dvpsrs.cc **** Changes from 1999.09.23 (eichelberg) - Added support for Basic Film Session options to dcmpstat print code. Affects: dcmpstat/apps/dcmprtsv.cc dcmpstat/apps/dcmpsprt.cc dcmpstat/include/dviface.h dcmpstat/include/dvpscf.h dcmpstat/libsrc/dviface.cc dcmpstat/libsrc/dvpscf.cc dcmpstat/libsrc/test.cfg - Updated JNI Makefiles for Linux Affects: dcmpstat/jni/Makefile.dep dcmpstat/jni/Makefile.in **** Changes from 1999.09.20 (riesmeier) - Corrected bug with clipping of rotated print bitmaps (removed inconsistency with 90 and 270 degree rotation). Affects: dcmpstat/libsrc/dvpstat.cc - Added Perl script to create hardcopy grayscale (and stored print) objects for all RSNA'99 test images using the dcmpsprt command line tool. Added: dcmpstat/tests/dcmpsprt.pl **** Changes from 1999.09.17 (eichelberg) - Moved static helper functions to new class DVPSHelper, removed some unused code. Added: dcmpstat/include/dvpshlp.h dcmpstat/libsrc/dvpshlp.cc Affects: dcmpstat/apps/Makefile.dep dcmpstat/apps/dcmpssnd.cc dcmpstat/libsrc/Makefile.dep dcmpstat/libsrc/Makefile.in dcmpstat/libsrc/dvpstat.cc Removed: dcmpstat/include/dvpshc.h dcmpstat/libsrc/dvpshc.cc - Completed print spool functionality including Supplement 22 support Affects: dcmpstat/apps/dcmprtsv.cc dcmpstat/include/dviface.h dcmpstat/include/dvpsib.h dcmpstat/include/dvpsibl.h dcmpstat/include/dvpspr.h dcmpstat/include/dvpssp.h dcmpstat/libsrc/dviface.cc dcmpstat/libsrc/dvpsib.cc dcmpstat/libsrc/dvpsibl.cc dcmpstat/libsrc/dvpspr.cc dcmpstat/libsrc/dvpssp.cc - Added Drystar 3000, AYCAN and DCMPRINT to sample config file Affects: dcmpstat/tests/test.cfg **** Changes from 1999.09.17 (riesmeier) - Enhanced efficiency of some "for" loops. Affects: ofstd/include/ofbmanip.h dcmimgle/include/diflipt.h dcmimgle/include/diinpxt.h dcmimgle/include/dimoipxt.h dcmimgle/include/dirotat.h dcmimgle/include/discalet.h dcmimgle/libsrc/dibaslut.cc dcmimgle/libsrc/dicielut.cc dcmimgle/libsrc/diciefn.cc dcmimgle/libsrc/digsdfn.cc dcmimgle/libsrc/digsdlut.cc dcmimgle/libsrc/diluptab.cc dcmimgle/libsrc/dimoimg.cc dcmimgle/libsrc/diovlay.cc - Added "htmldocs" directory and an option to the make file to delete all HTML related files ('make distclean'). Added: ofstd/htmldocs ofstd/htmldocs/Makefile.in dcmimgle/htmldocs dcmimgle/htmldocs/Makefile.in Affects: ofstd/Makefile.in dcmimgle/Makefile.in - Added "tests" directory and some Perl scripts (together with supporting files) to perform a kind of regression testing. Added: dcmimgle/tests dcmimgle/tests/Makefile.in dcmimgle/tests/check.pl dcmimgle/tests/check_usr.pl dcmimgle/tests/create.pl dcmimgle/tests/monitor.lut dcmimgle/tests/plan.dat dcmimgle/tests/test.dat Affects: dcmimgle/Makefile.in - Added missing object file. Affects: dcmimgle/apps/Makefile.in - Added/changed/completed DOC++ style comments in the header files. Affects: dcmimgle/include/dcmimage.h dcmimgle/include/dibaslut.h dcmimgle/include/diciefn.h dcmimgle/include/dicielut.h dcmimgle/include/didispfn.h dcmimgle/include/didislut.h dcmimgle/include/didocu.h dcmimgle/include/diflipt.h dcmimgle/include/digsdfn.h dcmimgle/include/digsdlut.h dcmimgle/include/diimage.h dcmimgle/include/diinpx.h dcmimgle/include/diinpxt.h dcmimgle/include/diluptab.h dcmimgle/include/dimo1img.h dcmimgle/include/dimo2img.h dcmimgle/include/dimocpt.h dcmimgle/include/dimoflt.h dcmimgle/include/dimoimg.h dcmimgle/include/dimoipxt.h dcmimgle/include/dimomod.h dcmimgle/include/dimoopx.h dcmimgle/include/dimoopxt.h dcmimgle/include/dimopx.h dcmimgle/include/dimopxt.h dcmimgle/include/dimorot.h dcmimgle/include/dimosct.h dcmimgle/include/diobjcou.h dcmimgle/include/diovlay.h dcmimgle/include/diovlimg.h dcmimgle/include/diovpln.h dcmimgle/include/dipixel.h dcmimgle/include/dipxrept.h dcmimgle/include/diregbas.h dcmimgle/include/dirotat.h dcmimgle/include/discalet.h dcmimgle/include/ditranst.h dcmimgle/include/diutils.h - Splitted file diovlay.h into two files (one for each class). Added: dcmimgle/include/diovdat.h dcmimgle/libsrc/diovdat.cc Affects: dcmimgle/include/diovlay.h dcmimgle/libsrc/Makefile.in dcmimgle/libsrc/diovlay.cc - Enhanced efficiency of the implementation to determine min/max values of the input pixels. Affects: dcmimgle/include/diinpxt.h dcmimgle/include/dimopxt.h - Added documentation for console applications. Added: dcmimgle/docs/dccielab.txt - Rebuild makefile dependencies. Affects: dcmimgle/libsrc/Makefile.dep - Corrected typos and formatting. Affects: dcmimgle/libsrc/diimage.cc - Removed bug: check pointer variable before dereferencing it. Affects: dcmimgle/libsrc/diluptab.cc - Modified error/warning messages for corrupt lookup table attributes. Changed integer type for loop variable to avoid compiler warnings reported by MSVC. Affects: dcmimgle/libsrc/diluptab.cc **** Changes from 1999.09.15 (eichelberg) - Implemented print job dispatcher code for dcmpstat, adapted dcmprtsv and dcmpsprt applications. Affects: dcmpstat/apps/dcmprtsv.cc dcmpstat/apps/dcmpsprt.cc dcmpstat/include/dviface.h dcmpstat/include/dvpscf.h dcmpstat/include/dvpsib.h dcmpstat/include/dvpsibl.h dcmpstat/include/dvpssp.h dcmpstat/libsrc/dviface.cc dcmpstat/libsrc/dvpscf.cc dcmpstat/libsrc/dvpsib.cc dcmpstat/libsrc/dvpsibl.cc dcmpstat/libsrc/dvpssp.cc dcmpstat/tests/test.cfg - Fixed imagectn DB problem resulting from an uninitialized structure. Affects: imagectn/libsrc/dbstore.cc **** Changes from 1999.09.14 (eichelberg) - Removed unneeded debug output from dcmpsprt Affects: dcmpstat/apps/dcmpsprt.cc - Fixed type in dcmpsmk doc file Affects: dcmpstat/docs/dcmpsmk.txt **** Changes from 1999.09.14 (riesmeier) - Added prelimenary version of DICOM print server application. Added: dcmpstat/apps/dcmprtsv.cc Affects: dcmpstat/apps/Makefile.dep dcmpstat/apps/Makefile.in **** Changes from 1999.09.13 (riesmeier) - Corrected bug in OFCommandLine::findOption() regarding the optional parameter 'pos' specifying a reference command line parameter. Affects: ofstd/include/ofcmdln.h ofstd/libsrc/ofcmdln.cc - Added methods for output of warning and other messages. Affects: ofstd/include/ofconapp.h ofstd/libsrc/ofconapp.cc - Added method to switch on/off all output messages (quiet mode). Affects: ofstd/include/ofconapp.h ofstd/libsrc/ofconapp.cc **** Changes from 1999.09.13 (eichelberg) - Added implementations for a number of further print API methods. Affects: dcmpstat/include/dviface.h dcmpstat/include/dvpscf.h dcmpstat/include/dvpssp.h dcmpstat/libsrc/dviface.cc dcmpstat/libsrc/dvpscf.cc dcmpstat/libsrc/dvpssp.cc - Adapted dcmpsprt to print API enhancements dcmpstat/apps/dcmpsprt.cc **** Changes from 1999.09.10 (eichelberg) - Added implementations for a number of print API methods. Affects: dcmpstat/include/dviface.h dcmpstat/include/dvpscf.h dcmpstat/include/dvpsib.h dcmpstat/include/dvpsibl.h dcmpstat/include/dvpssp.h dcmpstat/include/dvpstat.h dcmpstat/libsrc/dviface.cc dcmpstat/libsrc/dvpscf.cc dcmpstat/libsrc/dvpsib.cc dcmpstat/libsrc/dvpsibl.cc dcmpstat/libsrc/dvpssp.cc dcmpstat/libsrc/dvpstat.cc - Updated DICOMscope stub shell script Affects: dcmpstat/jni/make_stub.sh **** Changes from 1999.09.10 (riesmeier) - Added support for CIELAB display function. Restructured class hierarchy for display functions. Added: dcmimgle/apps/dccielab.cc dcmimgle/include/diciefn.h dcmimgle/include/dicielut.h dcmimgle/include/didislut.h dcmimgle/include/digsdfn.h dcmimgle/include/digsdlut.h dcmimgle/libsrc/diciefn.cc dcmimgle/libsrc/dicielut.cc dcmimgle/libsrc/didislut.cc dcmimgle/libsrc/digsdfn.cc dcmimgle/libsrc/digsdlut.cc Removed: dcmimgle/include/dibarlut.h dcmimgle/libsrc/dibarlut.cc Affects: dcmimgle/apps/Makefile.dep dcmimgle/apps/Makefile.in dcmimgle/apps/dcmgsdf.cc dcmimgle/include/dcmimage.h dcmimgle/include/didispfn.h dcmimgle/include/dimoimg.h dcmimgle/include/dimoopxt.h dcmimgle/libsrc/Makefile.dep dcmimgle/libsrc/Makefile.in dcmimgle/libsrc/didispfn.cc dcmimgle/libsrc/dimoimg.cc - Added support for CIELAB display function. New methods to handle display functions. Old methods are marked as retired and should be removed asap. Affects: dcmpstat/apps/Makefile.dep dcmpstat/include/dviface.h dcmpstat/include/dvpstat.h dcmpstat/include/dvpstyp.h dcmpstat/libsrc/Makefile.dep dcmpstat/libsrc/dviface.cc dcmpstat/libsrc/dvpstat.cc - Changed parameter type of copy constructor and assignment operator to avoid compiler warnings reported by gcc/ecgs on Solaris (with additional flags). Affects: dcmimgle/include/digsdfn.h **** Changes from 1999.09.10 (thiel) - Added Presentation LUT Shape LIN OD Affects: dcmpstat/libsrc/dvpspl.cc dcmpstat/libsrc/dvpssp.cc dcmpstat/libsrc/dvpstat.cc dcmpstat/include/dvpstyp.h **** Changes from 1999.09.09 (thiel) - Bug in OFString::rfind (pattern string greater than string) Affects: ofstd/libsrc/ofstring.cc - Added and realize API method for print spooler Affects: dcmpstat/libsrc/dvpsib.cc dcmpstat/libsrc/dvpssp.cc dcmpstat/include/dvpsib.h dcmpstat/include/dvpsibl.h dcmpstat/include/dvpssp.h **** Changes from 1999.09.09 (eichelberg) - Added print API method declarations and implementations (empty for now). Affects: dcmpstat/include/dviface.h dcmpstat/include/dvpssp.h dcmpstat/libsrc/dviface.cc dcmpstat/libsrc/dvpscf.cc dcmpstat/libsrc/dvpssp.cc **** Changes from 1999.09.08 (riesmeier) - Changed some integer types to avoid compiler warnings reported by MSVC. Affects: dcmimgle/libsrc/diluptab.cc - Added support for new instance types in database (grayscale hardcopy and stored print). Affects: dcmpstat/include/dvcache.h dcmpstat/include/dviface.h dcmpstat/libsrc/dviface.cc **** Changes from 1999.09.08 (eichelberg) - Moved configuration file evaluation to separate class. Added: dcmpstat/include/dvpscf.h dcmpstat/libsrc/dvpscf.cc Affects: dcmpstat/include/dviface.h dcmpstat/libsrc/dviface.cc - Added print API method declarations Affects: dcmpstat/apps/dcmpsprt.cc dcmpstat/include/dvpssp.h dcmpstat/libsrc/Makefile.dep dcmpstat/libsrc/Makefile.in dcmpstat/libsrc/dvpsib.cc dcmpstat/libsrc/dvpssp.cc dcmpstat/tests/test.cfg - Added sample application that converts PhotoImpact MAP files to DICOM Presentation LUTs. Added: dcmpstat/apps/dconvmap.cc Affects: dcmpstat/apps/Makefile.dep dcmpstat/apps/Makefile.in - Fixed sequence tag used for writing image box references in Stored Print objects. Affects: dcmpstat/libsrc/dvpsib.cc **** Changes from 1999.09.08 (riesmeier) - Completed implementation of setting inverse presentation LUT as needed e.g. for DICOM print (invert 8->12 bits PLUT). Affects: dcmimgle/include/dcmimage.h dcmimgle/include/dibaslut.h dcmimgle/include/diluptab.h dcmimgle/libsrc/dibaslut.cc dcmimgle/libsrc/diluptab.cc **** Changes from 1999.09.07 (riesmeier) - Completed support for getting a print bitmap out of a pstate object. Affects: dcmpstat/include/dvpstat.h dcmpstat/libsrc/dvpstat.cc - Removed register variable declaration to avoid compiler warnings. Affects: dcmimgle/include/dimosct.h **** Changes from 1999.09.06 (riesmeier) - Added support to method 'findOption()' to detect options which are 'direct' predecessors of an optionally specified reference parameter. Affects: ofstd/include/ofcmdln.h ofstd/libsrc/ofcmdln.cc **** Changes from 1999.09.06 (eichelberg) - Fixed bug in network module: Max receive PDU was used for max send PDU, under certain circumstances resulting in a very inefficient splitting of PDUs on the DUL level, severely decreasing network performance. Contribution from Andy Hewett Affects: dcmnet/libsrc/assoc.cc - Enhanced max receive PDU range to 4-128K. Contribution from Andy Hewett Affects: dcmnet/docs/echoscu.txt dcmnet/docs/findscu.txt dcmnet/docs/movescu.txt dcmnet/docs/storescp.txt dcmnet/docs/storescu.txt dcmnet/include/assoc.h dcmpstat/apps/dcmpsrcv.cc dcmpstat/apps/dcmpssnd.cc dcmpstat/tests/test.cfg imagectn/docs/imagectn.txt **** Changes from 1999.09.01 (eichelberg) - Fixed pixel aspect ratio computation in dcmp2pgm for rotated images. Affects: dcmpstat/apps/dcmp2pgm.cc - Completed printer characteristics dump routine Affects: dcmpstat/apps/dcmpsprt.cc - Added support for requested image size to print routines Affects: dcmpstat/include/dviface.h dcmpstat/include/dvpsib.h dcmpstat/include/dvpsibl.h dcmpstat/include/dvpssp.h dcmpstat/include/dvpstat.h dcmpstat/libsrc/dviface.cc dcmpstat/libsrc/dvpsib.cc dcmpstat/libsrc/dvpsibl.cc dcmpstat/libsrc/dvpssp.cc dcmpstat/libsrc/dvpstat.cc **** Changes from 1999.08.31 (eichelberg) - Introduced default constructors for some imagectn structs in order to passify some compiler warnings. Affects: imagectn/include/dbpriv.h imagectn/libsrc/dbutils.cc - Fixed print image crop boundary computation problem Affects: dcmpstat/libsrc/dvpstat.cc - Added print related config file methods Affects: dcmpstat/include/dviface.h dcmpstat/libsrc/dviface.cc dcmpstat/tests/test.cfg - Added get/set methods for stored print attributes Affects: dcmpstat/include/dvpsib.h dcmpstat/include/dvpsibl.h dcmpstat/include/dvpssp.h dcmpstat/include/dvpstyp.h dcmpstat/libsrc/dvpsib.cc dcmpstat/libsrc/dvpsibl.cc dcmpstat/libsrc/dvpssp.cc - Added new sample application that allows to create simple print jobs. Added: dcmpstat/apps/dcmpsprt.cc Affects: dcmpstat/apps/Makefile.in dcmpstat/include/dviface.h dcmpstat/libsrc/dviface.cc dcmpstat/libsrc/dvpssp.cc - Rebuilt Makefile dependencies Affects: dcmpstat/apps/Makefile.dep dcmpstat/libsrc/Makefile.dep **** Changes from 1999.08.27 (eichelberg) - Added methods for saving hardcopy images and stored print objects either in file or in the local database. Affects: dcmpstat/include/dviface.h dcmpstat/include/dvpsib.h dcmpstat/include/dvpsibl.h dcmpstat/include/dvpssp.h dcmpstat/include/dvpstat.h dcmpstat/libsrc/dviface.cc dcmpstat/libsrc/dvpsib.cc dcmpstat/libsrc/dvpsibl.cc dcmpstat/libsrc/dvpssp.cc dcmpstat/libsrc/dvpstat.cc **** Changes from 1999.08.26 (thiel) - Added new HardCopy classes and extend the stored print objects Added: dcmpstat/libsrc/dvpshc.cc dcmpstat/include/dvpshc.h Affects: dcmpstat/include/dvpsib.h dcmpstat/include/dvpsibl.h dcmpstat/include/dvpssp.h dcmpstat/libsrc/dvpsib.cc dcmpstat/libsrc/dvpsibl.cc dcmpstat/libsrc/dvpspr.cc dcmpstat/libsrc/dvpssp.cc **** Changes from 1999.08.25 (riesmeier) - Added new feature: Allow clipping region to be outside the image (overlapping). Affects: dcmimgle/include/dcmimage.h dcmimgle/include/diimage.h dcmimgle/include/dimo1img.h dcmimgle/include/dimo2img.h dcmimgle/include/dimoimg.h dcmimgle/include/dimoopxt.h dcmimgle/include/dimosct.h dcmimgle/include/diovlay.h dcmimgle/include/diovpln.h dcmimgle/include/discalet.h dcmimgle/include/ditranst.h dcmimgle/libsrc/dcmimage.cc dcmimgle/libsrc/dimo1img.cc dcmimgle/libsrc/dimo2img.cc dcmimgle/libsrc/dimoimg.cc dcmimgle/libsrc/diovlay.cc dcmimgle/libsrc/diovpln.cc - Enhanced efficiency of inner loops (count loop variable down). Affects: ofstd/include/ofbmanip.h - Moved method 'saveFileFormat()' to public part of the interface class. Affects: dcmpstat/include/dviface.h - Added minimal support to get a print bitmap out of a pstate object. Affects: dcmpstat/include/dvpstat.h dcmpstat/libsrc/dvpstat.cc - Added '#include ' to make MSVC happy. Affects: dcmpstat/libsrc/dvpssp.cc **** Changes from 1999.08.17 (riesmeier) - Corrected Doc++ comment. Affects: ofstd/include/ofconapp.h - Commented unused parameter names to avoid compiler warnings. Affects: dcmimgle/include/dimoopxt.h - Added Doc++ styled comments. Affects: dcmpstat/include/dvcache.h - Corrected wrong return type for method 'getImageSize()'. Affects: dcmpstat/include/dvcache.h **** Changes from 1999.07.30 (eichelberg) - Added new classes managing Stored Print objects Added: dcmpstat/include/dvpsib.h dcmpstat/include/dvpsibl.h dcmpstat/include/dvpspl.h dcmpstat/include/dvpspr.h dcmpstat/include/dvpssp.h dcmpstat/libsrc/dvpsib.cc dcmpstat/libsrc/dvpsibl.cc dcmpstat/libsrc/dvpspl.cc dcmpstat/libsrc/dvpspr.cc dcmpstat/libsrc/dvpssp.cc Affects: dcmpstat/include/dvpssvl.h dcmpstat/include/dvpstat.h dcmpstat/include/dvpsgll.h dcmpstat/libsrc/Makefile.in dcmpstat/libsrc/dvpsri.cc dcmpstat/libsrc/dvpstat.cc - Rebuilt makefile dependencies Affects: dcmpstat/apps/Makefile.dep dcmpstat/libsrc/Makefile.dep **** Changes from 1999.07.28 (eichelberg) - Minor correction for VC++ 5. Affects: dcmpstat/libsrc/dvpstat.cc - New options in dcmmklut: - creation of LUTs with 65536 entries - creation of LUT data with VR=OW, US or SS - creation of LUT descriptor with VR=US or SS Affects: dcmpstat/apps/dcmmklut.cc **** Changes from 1999.07.27 (eichelberg) - Adapted dcmpstat tools to supplement 33 letter ballot changes. Affects: dcmpstat/apps/dcmp2pgm.cc dcmpstat/apps/dcmpsmk.cc **** Changes from 1999.07.23 (riesmeier) - Modified error reporting while reading calibration file. Affects: dcmimgle/libsrc/didispfn.cc - Added support for attribute 'ImagerPixelSpacing'. Affects: dcmimgle/include/diimage.h dcmimgle/libsrc/diimage.cc - Added support for attribute 'RepresentativeFrameNumber'. Affects: dcmimgle/include/dcmimage.h dcmimgle/include/diimage.h dcmimgle/libsrc/diimage.cc - Reading of attribute 'PixelAspectRatio' and 'PixelSpacing' now depends on Flag 'CIF_UwePresentationState'. Affects: dcmimgle/libsrc/diimage.cc - Added methods to set 'PixelAspectRatio'. Affects: dcmimgle/include/dcmimage.h dcmimgle/include/diimage.h dcmimgle/libsrc/diimage.cc - Corrected bug occurred when reading corrupted LUT descriptors. Affects: dcmimgle/libsrc/diluptab.cc - Added dummy method (no implementation yet) to create inverse LUTs. Affects: dcmimgle/include/dcmimage.h dcmimgle/include/diluptab.h dcmimgle/include/dimoimg.h dcmimgle/libsrc/diluptab.cc dcmimgle/libsrc/dimoimg.cc - Changed implementation/interpretation of windows center/width (according to new letter ballot of supplement 33). Affects: dcmimgle/include/dimoopxt.h dcmimgle/libsrc/dimoimg.cc - Added method to create 12 bit packed bitmap data (used for grayscale print storage). Affects: dcmimgle/include/dcmimage.h dcmimgle/include/dimoimg.h dcmimgle/libsrc/dimoimg.cc - Enhanced handling of corrupted pixel data (wrong length). Affects: dcmimgle/include/dimoopx.h dcmimgle/include/dimoopxt.h dcmimgle/libsrc/dimoopx.cc - Enhanced robustness of reading the attribute 'OverlayOrigin'. Affects: dcmimgle/libsrc/diovpln.cc - Added method to return pointer to currently used display function. Affects: dcmimgle/include/dcmimage.h dcmimgle/include/dimoimg.h - Added new interpolation algorithm for scaling. Affects: dcmimgle/include/dcmimage.h dcmimgle/include/discalet.h - Changed comments/formatting. Affects: dcmimgle/include/dibaslut.h - Optimized memory usage for converting input pixel data (reference instead of copying where possible). Affects: dcmimgle/include/diinpx.h dcmimgle/include/diinpxt.h dcmimgle/include/dimoipxt.h - Added preliminary support for 2D bi-cubic spline interpolation (currently not used). Affects: dcmimgle/include/displint.h - Added flag to avoid color space conversion for color images (not yet implemented). Affects: dcmimgle/include/diutils.h - Corrected bug in method 'detachPixelData' (data has never really been removed from memory). Affects: dcmimgle/libsrc/diimage.cc **** Changes from 1999.07.22 (eichelberg) - Adapted dcmpstat data structures and API to supplement 33 letter ballot text. Affects: dcmpstat/include/dvpsga.h dcmpstat/include/dvpsgal.h dcmpstat/include/dvpsgl.h dcmpstat/include/dvpsgll.h dcmpstat/include/dvpsri.h dcmpstat/include/dvpsril.h dcmpstat/include/dvpsrs.h dcmpstat/include/dvpsrsl.h dcmpstat/include/dvpstat.h dcmpstat/include/dvpstx.h dcmpstat/include/dvpstyp.h dcmpstat/include/dvpsvl.h dcmpstat/libsrc/Makefile.dep dcmpstat/libsrc/Makefile.in dcmpstat/libsrc/dviface.cc dcmpstat/libsrc/dvpsga.cc dcmpstat/libsrc/dvpsgal.cc dcmpstat/libsrc/dvpsgl.cc dcmpstat/libsrc/dvpsgll.cc dcmpstat/libsrc/dvpsgr.cc dcmpstat/libsrc/dvpsri.cc dcmpstat/libsrc/dvpsril.cc dcmpstat/libsrc/dvpsrs.cc dcmpstat/libsrc/dvpsrsl.cc dcmpstat/libsrc/dvpstat.cc dcmpstat/libsrc/dvpstx.cc dcmpstat/libsrc/dvpsvl.cc Added: dcmpstat/include/dvpsda.h dcmpstat/include/dvpsdal.h dcmpstat/include/dvpssv.h dcmpstat/include/dvpssvl.h dcmpstat/libsrc/dvpsda.cc dcmpstat/libsrc/dvpsdal.cc dcmpstat/libsrc/dvpssv.cc dcmpstat/libsrc/dvpssvl.cc **** Changes from 1999.07.14 (eichelberg) - Updated data dictionary for supplement 29, 39, 33_lb, CP packet 4 and 5. Corrected dcmtk applications for changes in attribute name constants. Affects: dcmdata/apps/dcmgpdir.cc dcmdata/include/dcdeftag.h dcmdata/include/dcuid.h dcmdata/libsrc/dcdictzz.cc dcmdata/libsrc/dcuid.cc dcmdata/libsrc/dicom.dic dcmnet/apps/storescu.cc dcmnet/libsrc/diutil.cc dcmpstat/libsrc/dviface.cc dcmpstat/libsrc/dvpstat.cc imagectn/apps/tiquery.cc imagectn/include/dbpriv.h imagectn/libsrc/dbindex.cc imagectn/libsrc/dbutils.cc - Fixed Softcopy VOI LUT attribute number clash Affects: dcmdata/include/dcdeftag.h dcmdata/libsrc/dcdictzz.cc dcmdata/libsrc/dicom.dic **** Changes from 1999.06.10 (eichelberg) - Replaced some #if statements by more robust #ifdef Affects: dcmdata/include/dcswap.h dcmdata/include/dcvr.h wlistctn/include/wrklstdb.h - Adapted imagectn to new command line option scheme. Added support for Patient/Study Only Q/R model and C-GET (experimental). Contribution from Andy Hewett Affects: ctndisp/apps/ctndsupp.cc ctndisp/include/disppriv.h ctndisp/include/dispuser.h ctndisp/libsrc/dispuser.cc dcmnet/include/diutil.h dcmnet/libsrc/diutil.cc imagectn/apps/Makefile.dep imagectn/apps/Makefile.in imagectn/apps/cnf.cc imagectn/apps/cnf.h imagectn/apps/cnfexnt.cc imagectn/apps/cnfpriv.cc imagectn/apps/cnfpriv.h imagectn/apps/imagectn.cc imagectn/apps/imagectn.h imagectn/apps/sce.cc imagectn/apps/sce.h imagectn/apps/sceecho.cc imagectn/apps/sceecho.h imagectn/apps/scefind.cc imagectn/apps/scefind.h imagectn/apps/scemove.cc imagectn/apps/scemove.h imagectn/apps/scestore.cc imagectn/apps/scestore.h imagectn/apps/ti.cc imagectn/apps/ti.h imagectn/apps/tinet.cc imagectn/apps/tinet.h imagectn/apps/tiquery.cc imagectn/apps/tiquery.h imagectn/apps/tiui.cc imagectn/apps/tiui.h imagectn/docs/imagectn.txt imagectn/include/dbcond.h imagectn/include/dbpriv.h imagectn/include/imagedb.h imagectn/libsrc/Makefile.dep imagectn/libsrc/dbcond.cc imagectn/libsrc/dbfind.cc imagectn/libsrc/dbindex.cc imagectn/libsrc/dbmove.cc imagectn/libsrc/dbstore.cc imagectn/libsrc/dbutils.cc imagectn/libsrc/Makefile.dep imagectn/libsrc/dbregimg.cc Added: imagectn/apps/sceget.cc imagectn/apps/sceget.h **** Changes from 1999.05.31 (riesmeier) - Corrected bug concerning the conversion of color images to grayscale. Affects: dcmimgle/include/dimomod.h dcmimgle/include/dimopx.h dcmimgle/include/dimopxt.h dcmimgle/libsrc/dimomod.cc dcmimgle/libsrc/dimopx.cc **** Changes from 1999.05.10 (riesmeier) - Moved dcm2pnm version definition from module dcmimgle to dcmimage. Affects: dcmimgle/include/dcmimage.h dcmtk-3.6.0/docs/ANNOUNCE.3410000644000310500011400000000502607220101050014414 0ustar joergrdicom3 ANNOUNCEMENT Version 3.4.1 of the OFFIS DCMTK (DICOM ToolKit) software is now available for public release. This release includes the following main changes over the previous version (Version 3.4.0): - The DICOM data dictionary has been re-worked based on the 1999 edition of the DICOM standard, the latest supplements and correction proposals (CP package 6). - The speed of network transmission has increased significantly, in particular for small transfers like C-FIND. By default a 32K socket buffer is now used and the Nagle algorithm is switched off. - The grayscale calibration routines in the dcmimgle module have been extended to support both the DICOM Grayscale Standard Display Function and the CIE LAB display function. - The dcmpstat module has been reworked to implement the final version of the Grayscale Softcopy Presentation State Supplement. - An implementation of a DICOM Basic Grayscale Print Management SCU supporting the Presentation LUT SOP Class has been added to the dcmpstat module. - The imagectn and ctndisp applications have been adapted to the common command line scheme introduced in version 3.4.0. - Experimental library support for redirecting error messages into a memory stream instead of printing them to stdout/stderr has been implemented (for GUI applications). - Experimental support for the Patient/Study Only Query/Retrieve model has been added to the imagectn application. - Many bug fixes and minor improvements - See the dcmtk/CHANGES file for more details. This version of the OFFIS DCMTK contains the C++ source code that is required to compile the DICOMscope 2.0 software (as exhibited at RSNA InfoRAD 1999) from source. However, the Java2 source code, which is also required by DICOMscope 2.0, is distributed separately. Many people have contributed to this new release of DCMTK, appearing here in alphabetical order. Thank you very much for your support! Andreas Barth Andy Hewett David Lappen Markus Mertens Gilles Mevel Sebastian Meyer OFFIS staff who have worked on this release are: Marco Eichelberg Joerg Riesmeier Andreas Thiel The DCMTK software can be downloaded via: http://www.offis.uni-oldenburg.de/projekte/dicom/ Kuratorium OFFIS eV, Oldenburg, Germany, 2000-03-10 dcmtk-3.6.0/docs/ANNOUNCE.3110000644000310500011400000000203607220101043014411 0ustar joergrdicom3ANNOUNCEMENT The DICOM server software used during the June CAR'96 DICOM Demonstration is now publically available from: ftp://ftp.offis.uni-oldenburg.de/pub/dicom/offis/software/ The CAR'96 DICOM demonstration featured Modality Worklist Management and Image Storage/Query/Retrieval. The available software includes source code and documentation for the worklist management and image storage/query/retrieve server applications, a number of test applications, and the necessary libraries. This software package has been renamed DCMTK (DiCoM ToolKit). It contains a number of improvements over the software previously available from OFFIS/Oldenburg University, the most important being: - configuration using GNU-Configure - a modality worklist SCP and SCU - a new C++ encoding/decoding library - support for offline media - support for explicit VR transfer syntaxes - a user-extensible data dictionary - support for all balloted image SOP classes - numerous bug fixes The software is now being maintained by OFFIS, a non-profit R&D institute. dcmtk-3.6.0/docs/CHANGES.3400000644000310500011400000031113407220077535014301 0ustar joergrdicom3Release 3.4.0 (Public Release - 1999-05-06) - Updated Version Number and Implementation Version Name to reflect the current public release (3.4.0) Affects: dcmdata/include/dcuid.h - Updated documentation to reflect changes in 3.4.0 Affects: ANNOUNCE HISTORY INSTALL config/docs/dirstruc.txt **** Changes from 1999.05.05 (riesmeier) - Modified parameter of CreateProcess call to avoid creation of new command line window under Windows. Affects: dcmpstat/apps/dcmpsrcv.cc dcmpstat/libsrc/dviface.cc - Added optional parameter to method loadPState (from database) to change instance reviewed flag for pstate and image. Affects: dcmpstat/include/dviface.h dcmpstat/libsrc/dviface.cc **** Changes from 1999.05.04 (riesmeier) - Added DOC++ comments to header file. Affects: ofstd/include/ofcmdln.h - Minor changes to support Cygwin B20.1 (check __CYGWIN__ to distinguish from MSVC which also defines _WIN32). Affects: dcmdata/libsrc/cmdlnarg.cc dcmnet/include/dcompat.h dcmnet/libsrc/dcompat.cc - Added releaseDatabase to savePState to avoid deadlocks. Affects: dcmpstat/libsrc/dviface.cc - Change status of variable imageInDatabase in savePState to avoid unnecessary saving of (probabaly large) image files. Affects: dcmpstat/libsrc/dviface.cc **** Changes from 1999.05.04 (eichelberg) - Updated installation instructions Affects: INSTALL - Updated Windows 95/NT makefiles and make instructions. Affects: config/systems/win32/README Added: config/systems/win32/msvc5.zip Removed: config/systems/win32/msvc4.mak - Linking -lm to dcmimgle/apps, required on OSF1. Affects: dcmimgle/apps/Makefile.in - Minor code purifications to keep IBM xlC quiet Affects: dcmimgle/include/diinpxt.h - Added test for struct utimbuf declaration, absent on some platforms like NeXTStep 3.3 Affects: config/acconfig.h config/configure config/configure.in config/include/cfwin32.h config/include/config.h.in dcmpstat/libsrc/dviface.cc - Removed carriage returns Affects: dcmpstat/include/dvpstat.h - Including ofstring.h in ctndisp.cc to avoid prototype conflicts on HP-UX 9 with gcc. Affects: ctndisp/apps/ctndisp.cc - Minor code purifications to keep gcc on OSF1 quiet. Affects: dcmpstat/apps/dcmmklut.cc dcmpstat/libsrc/dvpsgl.cc dcmpstat/libsrc/dvpstat.cc - Corrected dcmpstat Makefile.in for make install. Affects: dcmpstat/Makefile.in **** Changes from 1999.05.03 (riesmeier) - Minor code purifications to keep Sun CC 2.0.1 quiet. Affects: ctndisp/libsrc/dispuser.cc dcmdata/apps/dump2dcm.cc dcmimgle/include/dcmimage.h dcmimgle/include/dibaslut.h dcmimgle/include/diflipt.h dcmimgle/include/diluptab.h dcmimgle/include/dimoipxt.h dcmimgle/include/dimoopxt.h dcmimgle/include/diovlay.h dcmimgle/include/diovpln.h dcmimgle/include/displint.h dcmimgle/include/ditranst.h dcmimgle/libsrc/dibarlut.cc dcmimgle/libsrc/didispfn.cc dcmimgle/libsrc/diluptab.cc dcmimgle/libsrc/dimoimg.cc dcmnet/apps/echoscu.cc dcmnet/libsrc/dul.cc dcmnet/libsrc/dulparse.cc dcmpstat/apps/dcmmkcrv.cc dcmpstat/apps/dcmmklut.cc dcmpstat/apps/dcmp2pgm.cc dcmpstat/apps/dcmpsrcv.cc dcmpstat/include/dvcache.h dcmpstat/libsrc/dviface.cc dcmpstat/libsrc/dvpsov.cc dcmpstat/libsrc/dvpstat.cc ofstd/libsrc/ofconapp.cc wlistctn/apps/scefind.cc wlistctn/libsrc/wlistctn.cc - Enhanced check in savePState() method whether image file is already stored in database. Affects: dcmpstat/libsrc/dviface.cc - Replaced method applyOptimizationLUT by its contents (method body) to avoid warnings (and possible errors) on Sun CC 2.0.1 :-/ Affects: dcmimgle/include/dimoipxt.h dcmimgle/include/dimoopxt.h **** Changes from 1999.04.30 (eichelberg) - Minor code purifications to keep IBM xlC quiet Affects: dcmimgle/include/diinpxt.h dcmimgle/include/dimoopxt.h dcmimgle/include/dimopxt.h - Minor code purifications to keep Sun CC 2.0.1 quiet Affects: dcmdata/apps/dcmgpdir.cc dcmnet/apps/findscu.cc dcmnet/apps/movescu.cc dcmnet/apps/storescu.cc dcmpstat/apps/dcmp2pgm.cc dcmpstat/include/dvpsconf.h dcmpstat/libsrc/dvpsconf.cc dcmpstat/libsrc/dvpsgal.cc dcmpstat/libsrc/dvpsgll.cc dcmpstat/libsrc/dvpsvwl.cc ofstd/libsrc/ofconapp.cc - Renamed all flock calls to dcmtk_flock to avoid name clash between flock() emulation based on fcntl() and a constructor for struct flock. Affects: dcmnet/include/dcompat.h dcmnet/libsrc/dcompat.cc dcmpstat/apps/dcmpsrcv.cc dcmpstat/apps/dcmpssnd.cc imagectn/apps/scemove.cc imagectn/apps/scestore.cc imagectn/apps/tinet.cc imagectn/libsrc/dbstore.cc imagectn/libsrc/dbutils.cc wlistctn/libsrc/wrklstdb.cc - Added provision for systems which have bzero() but no prototype, e.g. SunOS Affects: ofstd/include/ofbmanip.h - Now including stdio.h in diutils.h, required on SunOS Affects: dcmimgle/include/diutils.h **** Changes from 1999.04.29 (eichelberg) - Minor code purifications to keep DEC cxx 6 quiet. Affects: dcmimgle/include/dimoipxt.h dcmimgle/include/dimoopxt.h dcmimgle/include/diovlay.h dcmimgle/include/diovpln.h - Changed first parameter in bzero() call to char *, required on OSF1. Affects: ofstd/include/ofbmanip.h - Linking all tools that use dcmimgle with -lm, required on OSF1. Affects: dcmpstat/apps/Makefile.in **** Changes from 1999.04.29 (riesmeier) - Removed color related image files from public toolkit part. Affects: dcmimgle/include/dimoopxt.h dcmimgle/libsrc/Makefile.dep dcmimgle/libsrc/Makefile.in Removed: dcmimgle/include/dicoopx.h dcmimgle/include/dicoopxt.h dcmimgle/include/dicopx.h dcmimgle/libsrc/dicoopx.cc - Added DOC++ comments. Affects: ofstd/include/ofcmdln.h ofstd/include/oftimer.h - Added checks whether an option which should be added already exists. Affects: ofstd/libsrc/ofcmdln.cc - Renamed class CubicSpline to DiCubicSpline. Affects: dcmimgle/include/displint.h dcmimgle/libsrc/dibarlut.cc dcmimgle/libsrc/didispfn.cc - Removed debug code. Affects: ofstd/include/ofcmdln.h - Added PresentationLabel to index file. Affects: dcmpstat/include/dvicache.h dcmpstat/include/dviface.h dcmpstat/libsrc/dviface.cc imagectn/include/dbpriv.h imagectn/libsrc/dbindex.cc - Rebuild Makefile dependencies. Affects: dcmnet/apps/Makefile.dep **** Changes from 1999.04.28 (riesmeier) - Added item PresentationDescription to index record. Affects: imagectn/include/dbpriv.h imagectn/libsrc/dbindex.cc - Rebuild Makefile dependencies. Affects: dcmimage/libsrc/Makefile.dep imagectn/apps/Makefile.dep imagectn/libsrc/Makefile.dep imagectn/tests/Makefile.dep - Merged change log for module dcmimgle into main change log (there is still a separate change file for module dcmimage). Affects: CHANGES - Removed some '#ifdef DEBUG' statements from header files to avoid problems with inconsistent compilations. Affects: ofstd/include/ofcmdln.h ofstd/libsrc/ofcmdln.cc - Removed warning when adding optional parameter direct after another optional parameter. Affects: ofstd/libsrc/ofcmdln.cc - Changed comments/formatting. Affects: dcmimgle/apps/dcmgsdf.cc dcmimgle/include/dimocpt.h - Added newline to error output. Affects: dcmimgle/apps/dconvlum.cc - Added experimental support to use pastel colors (currently not public!). Affects: dcmimgle/include/dcmimage.h dcmimgle/include/diimage.h dcmimgle/include/dimoimg.h dcmimgle/include/dimoopxt.h dcmimgle/include/diutils.h dcmimgle/libsrc/dimoimg1.cc dcmimgle/libsrc/dimoimg2.cc dcmimgle/libsrc/dimoimg.cc - Removed debug code. Affects: dcmimgle/include/diflipt.h - Introduced new scheme for the debug level variable: now each level can be set separately (there is no "include" relationship). Affects: dcmimgle/include/diinpxt.h dcmimgle/include/dimoipxt.h dcmimgle/include/dimoopxt.h dcmimgle/include/dimopxt.h dcmimgle/include/discalet.h dcmimgle/libsrc/dcmimage.cc dcmimgle/libsrc/dibarlut.cc dcmimgle/libsrc/didispfn.cc dcmimgle/libsrc/didocu.cc dcmimgle/libsrc/diimage.cc dcmimgle/libsrc/diluptab.cc dcmimgle/libsrc/dimoimg.cc dcmimgle/libsrc/dimomod.cc dcmimgle/libsrc/diovlay.cc dcmimgle/libsrc/diovlimg.cc dcmimgle/libsrc/diovpln.cc dcmimgle/libsrc/diutils.cc - Added "template<>" to specialized template functions/methods to avoid compiler warnings reported by gcc version egcs-2.91.66 (conforms with new C++ standard). Affects: dcmimgle/include/dipxrept.h - Moved files from dcmimage module to dcmimgle to support new pastel color output format. Affects: dcmimgle/libsrc/Makefile.in Added: dcmimgle/include/dicoopx.h dcmimgle/include/dicoopxt.h dcmimgle/include/dicopx.h dcmimgle/libsrc/dicoopx.cc - Added modules dcmimgle and dcmpstat to the readme file. Affects: README - Added documentation for console applications. Added: dcmimgle/docs dcmimgle/docs/dconclum.txt dcmimgle/docs/dcmgsdf.txt dcmimgle/docs/Makefile.in - Removed additional declaration of local variable (hides first declaration) to avoid compiler warnings reported by gcc 2.7.2.1 (Linux). Affects: dcmpstat/libsrc/dviface.cc - Added type casts to NULL pointers returned as 'const char *' to avoid compiler warnings reported by gcc 2.7.2.1 (Linux). Affects: dcmimgle/include/dimoimg.h dcmimgle/include/dimomod.h dcmimgle/include/dimopx.h - Added test whether the compiler supports the new explicit template specialization syntax (see below). Affects: dcmimgle/include/dipxrept.h **** Changes from 1999.04.28 (eichelberg) - Added test whether the compiler supports the new explicit template specialization syntax, e.g. template<> int a_class::a_method() Affects: config/acconfig.h config/aclocal.m4 config/configure config/configure.in config/include/cfwin32.h config/include/config.h.in - Modules dcmpstat and dcmimgle now configured and compiled by default. Affects: config/modules - Merged change log for module dcmpstat into main change log. Affects: CHANGES Removed: dcmpstat/CHANGES - When creating a presentation state for an image, modality rescale/slope without rescale type is handled now in a more lenient way. Affects: dcmpstat/libsrc/dvpstat.cc - Cleaned up module dcmpstat apps, adapted to new command line class and added short documentation. Affects: dcmpstat/apps/Makefile.dep dcmpstat/apps/Makefile.in dcmpstat/apps/dcmmkcrv.cc dcmpstat/apps/dcmmklut.cc dcmpstat/apps/dcmp2pgm.cc dcmpstat/apps/dcmpsmk.cc dcmpstat/apps/dcmpsrcv.cc dcmpstat/apps/dcmpssnd.cc Added: dcmpstat/docs/dcmmkcrv.txt dcmpstat/docs/dcmmklut.txt dcmpstat/docs/dcmp2pgm.txt dcmpstat/docs/dcmpsmk.txt dcmpstat/docs/dcmpsrcv.txt dcmpstat/docs/dcmpssnd.txt Removed: dcmpstat/apps/dcmpsrw.cc dcmpstat/apps/dcmpstst.cc dcmpstat/apps/listdb.cc dcmpstat/apps/runsend.cc **** Changes from 1999.04.27 (riesmeier) - Added some useful debugging checks. Affects: ofstd/include/ofcmdln.h ofstd/libsrc/ofcmdln.cc - Introduced list of valid parameters used for syntax output and error checking. Affects: ofstd/include/ofcmdln.h ofstd/include/ofconapp.h ofstd/libsrc/ofcmdln.cc ofstd/libsrc/ofconapp.cc - Added method to check for conflicts between two options (incl. error output). Affects: ofstd/include/ofconapp.h ofstd/libsrc/ofconapp.cc - Added some comments (DOC++ style). Affects: ofstd/include/ofcmdln.h - Corrected bug: option '--help' could not be used when mandatory parameters were missing. Affects: ofstd/libsrc/ofcmdln.cc ofstd/libsrc/ofconapp.cc - Changed output of usage text (moved some newlines to support output when parameters and/or options are absent). Affects: ofstd/libsrc/ofconapp.cc - Adapted console applications to new OFCommandLine and OFConsoleApplication functionality. Affects: dcmdata/apps/dcmconv.cc dcmdata/apps/dcmdump.cc dcmdata/apps/dcmftest.cc dcmdata/apps/dcmgpdir.cc dcmdata/apps/dump2dcm.cc **** Changes from 1999.04.27 (eichelberg) - Adapted storescu to new command line option scheme. Added support for transmission of compressed images and on-the-fly creation of new UIDs for test scenarios. Contribution from Andy Hewett Affects: dcmnet/apps/storescu.cc - Adapted storescp to new command line option scheme. Added support for transmission of compressed images. Contribution from Andy Hewett Affects: dcmnet/apps/storescp.cc - Prevented dcmdata applications from opening a file with empty filename, leads to application crash on Win32. Affects: dcmdata/apps/dcmconv.cc dcmdata/apps/dcmftest.cc dcmdata/apps/dcmgpdir.cc dcmdata/apps/dump2dcm.cc - Updated echoscu copyright header Affects: dcmnet/apps/echoscu.cc - Updated storescu and storescp for minor changes is command line class. Affects: dcmnet/apps/storescu.cc dcmnet/apps/echoscu.cc **** Changes from 1999.04.26 (riesmeier) - Changed comments. Affects: ofstd/include/ofbmanip.h - Added support to define minimum width of short and long option columns. Affects: ofstd/include/ofcmdln.h ofstd/libsrc/ofcmdln.cc - Removed bug: empty parameters have always been interpreted as options. Affects: dcmdata/apps/dcmdump.cc ofstd/include/ofcmdln.h ofstd/libsrc/ofcmdln.cc - Enhanced support of wildcard expansion under Windows (now very similar to Unix shells). Affects: ofstd/include/ofcmdln.h ofstd/libsrc/ofcmdln.cc - Added support to check dependences between different options and report error messages if necessary. Affects: dcmdata/apps/dcmdump.cc ofstd/include/ofconapp.h ofstd/libsrc/ofconapp.cc **** Changes from 1999.04.26 (eichelberg) - Added new "transfer syntax aware" variant of the dcmnet function ASC_findAcceptedPresentationContextID. This variant tries to find an accepted presentation context that matches both abstract and transfer syntax. Affects: dcmnet/include/assoc.h dcmnet/libsrc/assoc.cc - Updated dcmdata docs for new command line options. Affects: dcmdata/docs/dcmconv.txt dcmdata/docs/dcmdump.txt dcmdata/docs/dcmgpdir.txt dcmdata/docs/dump2dcm.txt Added: dcmdata/docs/dcmftest.txt - Ported Worklist CTN to Win32 environment. Contribution from Andy Hewett Affects: wlistctn/apps/sce.cc wlistctn/apps/sceecho.cc wlistctn/apps/scefind.cc wlistctn/apps/wlistctn.cc wlistctn/apps/wlistctn.h wlistctn/include/wrklstdb.h wlistctn/libsrc/wrklstdb.cc wlistctn/libsrc/Makefile.in wlistctn/tests/Makefile.in - Updated copyright headers in module wlistctn and makefile dependencies. Affects: wlistctn/apps/Makefile.dep wlistctn/apps/sce.h wlistctn/apps/sceecho.h wlistctn/apps/scefind.h wlistctn/libsrc/Makefile.dep wlistctn/tests/Makefile.dep wlistctn/tests/wltest.cc wlistctn/wwwapps/Makefile.dep wlistctn/wwwapps/preplock.cc wlistctn/wwwapps/readoviw.cc wlistctn/wwwapps/readwlst.cc wlistctn/wwwapps/writwlst.cc **** Changes from 1999.04.22 (eichelberg) - Corrected bug (buffer overflow) in DICOM upper layer module causing application crash when large A-ASSOCIATE-RSP PDUs were assembled. Affects: dcmnet/libsrc/dulfsm.cc - Corrected Win32 API version of expandFileNames routine in dcmgpdir Affects: dcmdata/apps/dcmgpdir.cc - Corrected Win32 API version of flock emulation Affects: dcmnet/libsrc/dcompat.cc **** Changes from 1999.04.21 (eichelberg) - Added method OFConsoleApplication::checkParam() Affects: ofstd/include/ofconapp.h ofstd/libsrc/ofconapp.cc - Now always including instead of on Win32 platforms. This makes sure that is used if available. Affects: ofstd/include/oftimer.h dcmdata/libsrc/cmdlnarg.cc dcmdata/libsrc/dcuid.cc dcmdata/libsrc/mkdeftag.cc dcmdata/libsrc/mkdictbi.cc dcmnet/include/dcompat.h dcmnet/libsrc/dcompat.cc - Increased max. number of transfer syntaxes that can be managed in an A-ASSOCIATE packet from 25 to 50. Affects: dcmnet/include/assoc.h - Updated copyright file Affects: COPYRIGHT - Corrected a few typos in ctndisp Affects: ctndisp/libsrc/dispuser.cc - Fixed bug in DcmPixelData::findConformingEncapsulatedRepresentation leading to an assertion failure when working with compressed data. Bug reported by Andy Hewett Affects: dcmdata/libsrc/dcpixel.cc - Fixed use of OFBitmanipTemplate<>::zeroMem in sendAssociationRQTCP() Affects: dcmnet/libsrc/dulfsm.cc - Adapted echoscu command line options to new scheme. Merged assctest functionality into echoscu (--propose-ts and --propose-pc). Affects: dcmnet/apps/echoscu.cc dcmnet/Makefile.in Removed: dcmnet/tests/assctest.cc dcmnet/tests/Makefile.dep dcmnet/tests/Makefile.in **** Changes from 1999.04.19 (eichelberg) - Added new option to findscu which allows to extract all C-FIND-RSP messages to file as received over network. Contribution from Andy Hewett Affects: dcmnet/apps/findscu.cc - Implemented locking for Win95/98 and Win32s using LockFile() instead of LockFileEx() which is only supported on NT. Affects: dcmnet/libsrc/dcompat.cc - Added constants for access() on Win32. Contribution from Andy Hewett Affects: dcmnet/include/dcompat.h - Added experimental support for extended SOP class negotiation. Contribution from Andy Hewett Affects: dcmnet/apps/Makefile.dep dcmnet/include/assoc.h dcmnet/include/dul.h dcmnet/libsrc/Makefile.dep dcmnet/libsrc/Makefile.in dcmnet/libsrc/assoc.cc dcmnet/libsrc/dul.cc dcmnet/libsrc/dulconst.cc dcmnet/libsrc/dulfsm.cc dcmnet/libsrc/dulparse.cc dcmnet/libsrc/dulstruc.h dcmnet/tests/Makefile.dep Added: dcmnet/include/extneg.h dcmnet/libsrc/extneg.cc - Added experimental support for C-GET. Contribution from Andy Hewett Affects: dcmnet/include/dimse.h Added: dcmnet/libsrc/dimget.cc - Added support for C-FIND-CANCEL/C-MOVE-CANCEL in DIMSE_storeUser(). Contribution from Andy Hewett Affects: dcmnet/include/dimse.h dcmnet/libsrc/dimstore.cc - Added basic support for sending/receiving in encapsulated transfer syntaxes. Based on a contribution from Andy Hewett Affects: dcmnet/libsrc/dimse.cc - Fixed bug in getAndDeleteAttributeList() that caused problems when an N-GET-RQ with an empty attribute list was sent. Contribution from Andy Hewett Affects: dcmnet/libsrc/dimcmd.cc **** Changes from 1999.04.13 (eichelberg) - Fixed bug in DcmUnsignedLongOffset::print that caused an application crash when very large DICOMDIRs were printed (i.e. with dcmdump). Thanks to Andy Hewett for the bug report and fix. Affects: dcmdata/libsrc/dcvrulup.cc **** Changes from 1999.03.31 (eichelberg) - Updated copyright header in module dcmdata and makefile dependencies. Affects: dcmdata/*/* **** Changes from 1999.03.29 (eichelberg) - Adapted command line options of dcmdata applications to new scheme. Affects: dcmdata/apps/dcmconv.cc dcmdata/apps/dcmdump.cc dcmdata/apps/dcmftest.cc dcmdata/apps/dcmgpdir.cc dcmdata/apps/dump2dcm.cc dcmdata/apps/.cc - Corrected list of image SOP classes Affects: dcmdata/libsrc/dcuid.cc - Updated list of SOP class name prefixes and estimated sizes Affects: dcmnet/libsrc/diutil.cc - Cleaned up dcmnet code for char* to const char* assignments. Affects: dcmnet/apps/echoscu.cc dcmnet/apps/findscu.cc dcmnet/apps/movescu.cc dcmnet/apps/storescp.cc dcmnet/apps/storescu.cc dcmnet/include/dul.h dcmnet/include/lst.h dcmnet/libsrc/asccond.cc dcmnet/libsrc/asccond.h dcmnet/libsrc/assoc.cc dcmnet/libsrc/dimecho.cc dcmnet/libsrc/dul.cc dcmnet/libsrc/dulfsm.cc dcmnet/libsrc/dulfsm.h dcmnet/libsrc/dulparse.cc dcmnet/libsrc/dulpres.cc dcmnet/libsrc/lstcond.cc dcmnet/tests/assctest.cc **** Changes from 1999.03.27 (riesmeier) - Rebuild Makefile dependencies. Affects: dcmpstat/apps/Makefile.dep dcmpstat/libsrc/Makefile.dep - Added new entry to index file: Presentation Description. Affects: dcmpstat/apps/listdb.cc dcmpstat/include/dviface.h dcmpstat/libsrc/dviface.cc - Add remaining member variables to member initialization list to avoid compiler warnings. Affects: dcmpstat/include/dvcache.h - Enhanced savePState() method: now image file is also added to index file and stored in image directory (if not already there). Affects: dcmpstat/include/dviface.h dcmpstat/libsrc/dviface.cc - Added method to check whether current image is inverse or not. Affects: dcmpstat/include/dvpstat.h dcmpstat/libsrc/dvpstat.cc **** Changes from 1999.03.24 (riesmeier) - Added optional parameters to define minimum width of columns for short and long options in syntax output. Affects: ofstd/include/ofcmdln.h ofstd/libsrc/ofcmdln.cc - Changed optional integer parameter in method findOption to enum type. Affects: ofstd/include/ofcmdln.h ofstd/libsrc/ofcmdln.cc - Modified output of usage string: "[options]" are only printed if valid options exist. Affects: ofstd/include/ofcmdln.h ofstd/libsrc/ofconapp.cc - Removed debug code. Affects: dcmimgle/include/dirotat.h - Added/Modified comments and formatting. Affects: dcmimgle/include/dcmimage.h dcmimgle/include/dibarlut.h dcmimgle/include/dibaslut.h dcmimgle/include/didispfn.h dcmimgle/include/didocu.h dcmimgle/include/diflipt.h dcmimgle/include/diimage.h dcmimgle/include/diinpx.h dcmimgle/include/diinpxt.h dcmimgle/include/diluptab.h dcmimgle/include/dimo1img.h dcmimgle/include/dimo2img.h dcmimgle/include/dimocpt.h dcmimgle/include/dimoflt.h dcmimgle/include/dimoimg.h dcmimgle/include/dimoipxt.h dcmimgle/include/dimomod.h dcmimgle/include/dimoopx.h dcmimgle/include/dimoopxt.h dcmimgle/include/dimopx.h dcmimgle/include/dimopxt.h dcmimgle/include/dimorot.h dcmimgle/include/dimosct.h dcmimgle/include/diobjcou.h dcmimgle/include/diovlay.h dcmimgle/include/diovlimg.h dcmimgle/include/diovpln.h dcmimgle/include/dipixel.h dcmimgle/include/dipxrept.h dcmimgle/include/diregbas.h dcmimgle/include/dirotat.h dcmimgle/include/discalet.h dcmimgle/include/displint.h dcmimgle/include/ditranst.h dcmimgle/include/diutils.h dcmimgle/libsrc/dimoimg.cc - Added support for Barten transformation from 2 to 7 bits input (now: 2-16). Affects: dcmimgle/include/didispfn.h dcmimgle/libsrc/didispfn.cc - Removed bug in routines rotating and flipping overlay planes in clipped images. Affects: dcmimgle/libsrc/diovlay.cc dcmimgle/libsrc/diovpln.cc - Removed bug when scaling and clipping images where the clipping area exceeds the original images. Affects: dcmimgle/libsrc/dcmimage.cc **** Changes from 1999.03.22 (eichelberg) - Reworked data dictionary based on the 1998 DICOM edition and the latest supplement versions. Corrected dcmtk applications for minor changes in attribute name constants. Affects: ctndisp/apps/ctnddico.cc dcmdata/apps/dcmgpdir.cc dcmdata/include/dcdeftag.h dcmdata/libsrc/dcdicdir.cc dcmdata/libsrc/dcdictzz.cc dcmdata/libsrc/dcdirrec.cc dcmdata/libsrc/dicom.dic dcmdata/libsrc/dcdicdir.cc dcmimgle/libsrc/diovpln.cc dcmpstat/libsrc/dviface.cc dcmpstat/libsrc/dvpstat.cc imagectn/apps/tiquery.cc imagectn/libsrc/dbindex.cc imagectn/libsrc/dbutils.cc wlistctn/libsrc/wrklstdb.cc wlistctn/wwwapps/readoviw.cc wlistctn/wwwapps/readwlst.cc wlistctn/wwwapps/writwlst.cc - Reworked UID list based on the 1998 DICOM edition and the latest supplement versions. Affects: dcmdata/include/dcuid.h dcmdata/libsrc/dcuid.cc - Fixed bug in data dictionary causing a segmentation fault if dictionary was cleared and a smaller version reloaded. Affects: dcmdata/libsrc/dchashdi.cc - Added support for Structured Reports to dcmgpdir. Added preliminary support for including sequences into a DICOMDIR. Contribution from Andy Hewett Affects: dcmdata/apps/dcmgpdir.cc dcmdata/include/dcdirrec.h dcmdata/libsrc/dcdirrec.cc - Implemented getUserName() on Win32 using the NetWkstaUserGetInfo() API function. Contribution from Andy Hewett Affects: dcmdata/libsrc/mkdeftag.cc dcmdata/libsrc/mkdictbi.cc - Now printing explicit error message when DICOM file is too short. Contribution from Andy Hewett Affects: dcmdata/libsrc/dcelem.cc - Added -d flag to dcmdump. Contribution from Andy Hewett Affects: dcmdata/apps/dcmdump.cc - dump2dcm now allows to include the contents of binary files as OB/OW values while converting a dump to a DICOM file. Contribution from Andy Hewett Affects: dcmdata/apps/dump2dcm.cc dcmdata/docs/dump2dcm.txt - New handling of unknown (unsupported) VRs encountered when reading explicit VR data. If the VR string consists of uppercase letters, we assume a "future DICOM VR" and decode it expecting an extended length field (4 bytes). Otherwise, we assume an illegal VR string created by some old equipment (i.e.) "??" and decode without extended length (2 bytes). Affects: dcmdata/include/dcvr.h dcmdata/libsrc/dcitem.cc dcmdata/libsrc/dcvr.cc **** Changes from 1999.03.22 (riesmeier) - Added parameter to get value of (transparent) background color for method getOverlayData. Affects: dcmpstat/apps/dcmp2pgm.cc dcmpstat/include/dvpstat.h dcmpstat/libsrc/dvpstat.cc - Rebuild Makefile dependencies. Affects: dcmimgle/libsrc/Makefile.dep dcmpstat/apps/Makefile.dep dcmpstat/libsrc/Makefile.dep - Added/Changed comments. Affects: ofstd/include/ofconapp.h ofstd/include/offname.h dcmimgle/include/dcmimage.h dcmimgle/include/displint.h dcmimgle/libsrc/didispfn.cc - Added parameter to specify (transparent) background color for method getOverlayData(). Affects: dcmimgle/include/dcmimage.h dcmimgle/include/dimoimg.h dcmimgle/include/diovlay.h dcmimgle/include/diovpln.h dcmimgle/libsrc/dimoimg.cc dcmimgle/libsrc/diovlay.cc dcmimgle/libsrc/diovpln.cc - Removed bug concerning the rotation and flipping of additional overlay planes (NumberOfFrames has not always been determined correctly). Affects: dcmimgle/libsrc/diovlay.cc **** Changes from 1999.03.17 (eichelberg) - Updated Win32 config header: access() and getpid() exists. Contribution from Andy Hewett Affects: config/include/cfwin32.h - Added UIDs for Supplement 32 (DX) Contribution from Andy Hewett Affects: dcmdata/include/dcuid.h - Added method DcmTagKey::toString() Contribution from Andy Hewett Affects: dcmdata/include/dctagkey.h dcmdata/libsrc/dctagkey.cc - Added code to prepareCmdLineArgs() to redirect stderr, cout, cerr to stdout on Windows and make output unbuffered. This allows to redirect the output of DCMTK tools to file on Windows. Contribution from Andy Hewett Affects: dcmdata/libsrc/cmdlnarg.cc **** Changes from 1999.03.05 (eichelberg) - Added tests for and to configure. Affects: config/configure config/configure.in config/include/cfwin32.h config/include/config.h.in **** Changes from 1999.03.04 (riesmeier) - Barten LUT is now be re-created when ambient light value has changed. Affects: dcmimgle/include/dibarlut.h dcmimgle/libsrc/dibarlut.cc dcmimgle/libsrc/didispfn.cc - Removed const specifier (for pointer variable) to avoid warnings on SunCC. Affects: dcmimgle/libsrc/didispfn.cc **** Changes from 1999.03.03 (eichelberg) - Implemented new class for automatically creating filenames. Added: ofstd/include/offname.h ofstd/libsrc/offname.cc Affects: ofstd/libsrc/Makefile.in ofstd/libsrc/Makefile.dep - Changed imagectn database to use new code to create filenames instead of tempnam() which seems to be unreliable on Windows. Affects: imagectn/libsrc/dbutils.cc imagectn/libsrc/Makefile.dep **** Changes from 1999.03.03 (riesmeier) - Added support to specify ambient light value (re: Barten transformation). Affects: dcmimgle/apps/dconvlum.cc dcmimgle/include/dibarlut.h dcmimgle/include/didispfn.h dcmimgle/libsrc/dibarlut.cc dcmimgle/libsrc/didispfn.cc - Changed comments. Affects: dcmimgle/include/dcmimage.h dcmimgle/libsrc/dimoimg.cc - Added method to invert lookup table data (used for presentation state LUTs). Affects: dcmimgle/include/dibaslut.h dcmimgle/libsrc/dibaslut.cc **** Changes from 1999.03.02 (riesmeier) - Added methods to get and set ambient light value (re: Barten transformation). Affects: dcmpstat/include/dviface.h dcmpstat/libsrc/dviface.cc - Moved method 'isBartenTransformPossible()' from presentation state class to interface class. Affects: dcmpstat/include/dviface.h dcmpstat/include/dvpstat.h dcmpstat/libsrc/dviface.cc - Added method to invert an image by changing the presentation state LUT or shape. Affects: dcmpstat/include/dvpstat.h dcmpstat/libsrc/dvpstat.cc - Changed implementation of method 'getOverlayData()': now conversion from P-value to DDL is implictly performed and the correct P-value for the related layer is used. Affects: dcmpstat/libsrc/dvpstat.cc - Added parameter to selectPState() specifying whether to change the review status of the loaded presentation state. Affects: dcmpstat/include/dviface.h dcmpstat/libsrc/dviface.cc - Added method to presentation state class that checks whether Barten transformation is possible or not. Affects:dcmpstat/include/dvpstat.h - Corrected bug: when determine minimum and maximum pixel value (external) modality LUTs were ignored. Affects: dcmimgle/include/dimoipxt.h - Corrected bug in output routine of monochrome pixel data (wrong scaling when Barten transformation and windowing are active). Affects: dcmimgle/include/dimoopxt.h **** Changes from 1999.02.28 (riesmeier) - Corrected bug: the output bits for bitmaps shutters were inverted (this was done due to an error in the used test images). Affects: dcmimgle/include/dimoopxt.h - Corrected bug: the bit position for bitmap shutters was 1 instead of 0 (i.e. the first bit was always been skipped and the all following bits were wrong). Affects: dcmimgle/libsrc/diovpln.cc **** Changes from 1999.02.27 (riesmeier) - Changed implementation of deleteImageFile (imagectn method doesn't function under Window NT). Affects: dcmpstat/libsrc/dviface.cc - Removed bug in createPStateCache (cache was reported invalid on second call). Affects: dcmpstat/libsrc/dviface.cc - Modified method selectPState (image file is now implicitly loaded if necessary). Affects: dcmpstat/libsrc/dviface.cc **** Changes from 1999.02.25 (riesmeier) - Added debug code (explicitly delete data dictionary). Affects: dcmpstat/apps/dcmpssnd.cc dcmpstat/apps/dcmpsrcv.cc - Added setting of debug level in DicomImageClass (avoids compiler warnings). Affects: dcmpstat/apps/listdb.cc - Changed formatting of some comments. Affects: dcmpstat/apps/dcmp2pgm.cc - Added some comments. Affects: dcmpstat/include/dviface.h - Renamed methods enable/disablePState(). Affects: dcmpstat/include/dviface.h dcmpstat/libsrc/dviface.cc - Added method to fill pixel data into an externally handled storage area. Affects: dcmpstat/include/dvpstat.h dcmpstat/libsrc/dvpstat.cc - Added initialization of local variable to avoid compiler warnings (reported by gcc 2.7.2.1 on Linux). Affects: dcmpstat/libsrc/dvpstat.cc - Performed some modifications in the implementation of enable/disablePState() to avoid dmalloc warnings (not yet finished). Affects: dcmpstat/libsrc/dviface.cc - Rebuild Makefile dependencies. Affects: dcmpstat/apps/Makefile.dep dcmnet/libsrc/Makefile.dep - Initialize local variables to avoid compiler warnings (reported by gcc 2.7.2.1 on Linux). Affects: dcmimgle/include/displint.h **** Changes from 1999.02.24 (riesmeier) - Added support for presentation state caching (e.g. pstate description). Removed unused methods. Affects: dcmpstat/include/dvcache.h - Added methods to get a list of presentation states referencing the currently selected image. Added support for exchanging current presentation state (load from file) without deleting the current image. Affects: dcmpstat/include/dviface.h dcmpstat/libsrc/dviface.cc - Report an error when loading a presentation state and the referenced image file is absent. Affects: dcmpstat/libsrc/dviface.cc - Removed bug concerning newInstancesReceived (Windows NT behaves different to Unix when closing/unlocking a file). Affects: dcmpstat/libsrc/dviface.cc **** Changes from 1999.02.23 (riesmeier) - Added debug code (explicitly delete data dictionary). Affects: dcmpstat/apps/dcmp2pgm.cc - Added layer number to filename when extracting overlay planes. Affects: dcmpstat/apps/dcmp2pgm.cc - Added check whether new instances have been received before resetting database reference time (affects delete and instance reviewed methods). Affects: dcmpstat/libsrc/dviface.cc - Corrected bug: shutters were not saved correctly (sometimes even ignored). Affects: dcmpstat/libsrc/dvpstat.cc - Added tool to export display curves to a text file. Added: dcmimgle/apps/dcmgsdf.cc Affects: dcmimgle/apps/Makefile.in dcmimgle/include/dibarlut.h dcmimgle/include/didispfn.h dcmimgle/libsrc/dibarlut.cc dcmimgle/libsrc/didispfn.cc - Rebuilt Makefile dependencies. Affects: dcmimgle/apps/Makefile.dep - Corrected some typos and formatting. Affects: dcmimgle/apps/dconvlum.cc **** Changes from 1999.02.22 (riesmeier) - Added deletion of image files (depending on directory where the file is stored). Affects: dcmpstat/include/dviface.h dcmpstat/libsrc/dviface.cc - Modified comments for getGUIConfig... methods to indicate that the specified key must be upper case. Affects: dcmpstat/include/dviface.h - Reset reference time for file modification checking after the index file has been changed internally (delete and change status methods). Affects: dcmpstat/include/dviface.h dcmpstat/libsrc/dviface.cc - Removed debug messages when creating and clearing index cache. Affects: dcmpstat/libsrc/dviface.cc **** Changes from 1999.02.19 (riesmeier) - Added comments to new database routines and related member variables. Affects: dcmpstat/include/dviface.h - Changed some comments, corrected typos and formatting. Affects: dcmpstat/apps/listdb.cc dcmpstat/include/dvcache.h - Added method getFilename() to get filename of currently selected instance. Affects: dcmpstat/apps/listdb.cc dcmpstat/include/dviface.h dcmpstat/libsrc/dviface.cc - Modified implementation of instanceReviewed. Affects: dcmpstat/libsrc/dviface.cc - Added new methods to interate through Caches (getFirst/getNext) - needed for delete routines in Interface class. Affects: dcmpstat/include/dvcache.h - Added methods to disable and (re-)enable PresentationStates. Affects: dcmpstat/include/dviface.h dcmpstat/libsrc/dviface.cc - Added (private) helper methods to reduce redundant lines of code. Affects: dcmpstat/include/dviface.h dcmpstat/libsrc/dviface.cc - Removed bug concerning method newInstancesReceived (databaseFilename was never set). Affects: dcmpstat/libsrc/dviface.cc - Implemented main part of delete methods (image files are not yet deleted). Affects: dcmpstat/libsrc/dviface.cc - Removed implicit application of a shared lock to the database file when unlock an exclusive lock. Affects: dcmpstat/libsrc/dviface.cc **** Changes from 1999.02.18 (riesmeier) - Re-implemented methods to access index file (delete methods are still missing). Affects: dcmpstat/include/dviface.h dcmpstat/libsrc/dviface.cc Added: dcmpstat/include/dvcache.h - Removed parameter 'deletefile' from delete methods. This parameter is not necessary because the decision whether a images file is deleted only depends on the directory where the file is stored (see comments). Affects: dcmpstat/include/dviface.h dcmpstat/libsrc/dviface.cc - Rebuilt Makefile dependencies. Affects: dcmpstat/apps/Makefile.dep dcmpstat/libsrc/Makefile.dep **** Changes from 1999.02.18 (eichelberg) - Added new parameter explicitVR to interface methods savePState, saveDICOMImage. Allows to choose between explicit VR and implicit VR little endian format. Added new method saveCurrentImage that allows to save the current image to file. Affects: dcmpstat/include/dviface.h dcmpstat/libsrc/dviface.cc - Added new method convertPValueToDDL() to DVPresentationState that maps P-Values to DDLs. Affects: dcmpstat/include/dvpstat.h dcmpstat/libsrc/dvpstat.cc **** Changes from 1999.02.17 (vorwerk) - removed bug in strippidxarray() that occurs in certain entries in database Affects: dcmpstat/libsrc/dviface.cc **** Changes from 1999.02.17 (eichelberg) - Removed dcmdata debug level from sample apps Affects: dcmpstat/apps/dcmpsmk.cc dcmpstat/apps/dcmpstst.cc dcmpstat/apps/listdb.cc - Moved creation of Display Function object from DVPresentationState to DVInterface to avoid unnecessary re-reads. Affects: dcmpstat/include/dviface.h dcmpstat/include/dvpstat.h dcmpstat/libsrc/dviface.cc dcmpstat/libsrc/dvpstat.cc **** Changes from 1999.02.16 (eichelberg) - Added tests for and to configure script. Affects: config/acconfig.h config/configure config/configure.in config/include/cfwin32.h config/include/config.h.in - Added method newInstancesReceived() to DVInterface class. Affects: dcmpstat/include/dviface.h dcmpstat/libsrc/dviface.cc **** Changes from 1999.02.12 (riesmeier) - Rebuilt Makefile dependencies. Affects: dcmpstat/apps/Makefile.dep dcmpstat/libsrc/Makefile.dep **** Changes from 1999.02.12 (vorwerk) - Added Cache Affects: dcmpstat/include/dviface.h dcmpstat/libsrc/dviface.cc **** Changes from 1999.02.11 (riesmeier) - Rebuilt Makefile dependencies. Affects: dcmimgle/libsrc/Makefile.dep - Added routine to check whether particular grayscale values are unused in the output data. Affects: dcmimgle/include/dcmimage.h dcmimgle/include/dimoimg.h dcmimgle/include/dimoopx.h dcmimgle/include/dimoopxt.h dcmimgle/libsrc/dimoopx.cc - Removed unused parameter / member variable. Affects: dcmimgle/include/dibarlut.h dcmimgle/include/didispfn.h dcmimgle/libsrc/dibarlut.cc dcmimgle/libsrc/didispfn.cc dcmimgle/libsrc/dimoopx.cc - Removed unnecessary include statement. Affects: dcmimgle/include/dibaslut.h - Removed inline declarations from several methods. Affects: dcmimgle/include/diinpxt.h dcmimgle/include/dimoipxt.h dcmimgle/include/discalet.h - Corrected some typos and formatting. Affects: dcmimgle/include/dimocpt.h dcmimgle/include/dimoflt.h dcmimgle/include/dimorot.h dcmimgle/include/dimosct.h dcmimgle/include/dipxrept.h dcmimgle/include/ditranst.h - Renamed file to indicate the use of templates. Moved global functions for cubic spline interpolation to static methods of a separate template class. Removed: dcmimgle/include/displine.h Added: dcmimgle/include/displint.h Affects: dcmimgle/libsrc/dibarlut.cc dcmimgle/libsrc/didispfn.cc - Removed two small memory leaks reported by dmalloc library. Affects: dcmimgle/include/dimoopxt.h dcmimgle/libsrc/didispfn.cc - Added mode ios::nocreate when opening file streams for reading to avoid implicit creation of non-existing files. Affects: dcmimgle/apps/dconvlum.cc dcmimgle/libsrc/didispfn.cc - Changed method to check suitability of display function for a certain image. Affects: dcmimgle/libsrc/dimoimg.cc **** Changes from 1999.02.10 (eichelberg) - Added subdirectory dcmpstat/jni containing a makefile for the shared object required by the ECR '99 viewer when used on Unix platforms. Added: dcmpstat/jni/Makefile.dep dcmpstat/jni/Makefile.in dcmpstat/jni/make_stub.sh - Fixed memory leak in dviface.cc - Config file contents were never deleted. Affects: dcmpstat/libsrc/dviface.cc **** Changes from 1999.02.09 (eichelberg) - Changed some bool consts from true to OFTrue. Affects: dcmpstat/apps/dcmpsrcv.cc - Implemented methods that save images and presentation states in the database. Affects: dcmpstat/include/dviface.h dcmpstat/libsrc/dviface.cc - Implemented bitmap shutter activation and method for exchanging graphic layers. Affects: dcmpstat/include/dvpsgll.h dcmpstat/include/dvpsov.h dcmpstat/include/dvpstat.h dcmpstat/libsrc/dvpsgll.cc dcmpstat/libsrc/dvpsov.cc dcmpstat/libsrc/dvpstat.cc - Made signal handler function parameters compile flag dependent. Now passing (int) unless SIGNAL_HANDLER_WITH_ELLIPSE defined, in which case (...) is passed. Required to avoid conflict between Sun CC 4.2 on Solaris and SGI C++ 4.0 on IRIX. Affects: imagectn/apps/ti.cc - Corrected const signatures of some ctor declarations Affects: dcmimgle/include/dcmimage.h dcmimgle/libsrc/dimoimg.cc - Removed default parameters from template functions, required for Sun CC 4.2 Affects: dcmimgle/include/displine.h - Removed explicit template parameters from template function calls, required for Sun CC 4.2 Affects: dcmimgle/libsrc/dibarlut.cc dcmimgle/libsrc/didispfn.cc **** Changes from 1999.02.08 (riesmeier) - Removed '#include ' from ofcmdln.h. Affects: ofstd/include/ofcmdln.h - Rebuilt Makefile dependencies. Affects: ofstd/libsrc/Makefile.dep - Removed name of parameter 'flags' in method parseLine() depending on compilation platform (parameter is currently only used on Windows systems - where windows.h exist) to avoid compiler warnings. Affects: ofstd/libsrc/ofcmdln.cc - Added class to handle console applications (with or w/o command line arguments). Affects: ofstd/libsrc/Makefile.in Added: ofstd/include/ofconapp.h ofstd/libsrc/ofconapp.cc - Corrected some typos and formatting. Affects: dcmimgle/apps/dconvlum.cc dcmimgle/include/diovlay.h dcmimgle/libsrc/dibarlut.cc dcmimgle/libsrc/diovlay.cc - Changed implementation of removeAllOverlays(). Affects: dcmimgle/include/dcmimage.h dcmimgle/include/dimoimg.h dcmimgle/libsrc/dimoimg.cc - Added parameter 'idx' to some overlay methods to distinguish between built-in and additional overlay planes. Affects: dcmimgle/include/dcmimage.h dcmimgle/include/diimage.h - Added (debug) warning message when using invalid DISPLAY file names. Affects: dcmimgle/libsrc/didispfn.cc **** Changes from 1999.02.08 (eichelberg) - Updated documentation of dviface.h in Doc++ style. Removed dummy parameter from constructor. Affects: dcmpstat/include/dviface.h dcmpstat/libsrc/dviface.cc dcmpstat/apps/dcmp2pgm.cc dcmpstat/apps/dcmpsrcv.cc dcmpstat/apps/dcmpssnd.cc dcmpstat/apps/listdb.cc dcmpstat/apps/runsend.cc **** Changes from 1999.02.05 (eichelberg) - Added a call to shutdown() immediately before closesocket() on Win32. This causes any pending data to be sent before the socket is destroyed. Fixes a problem causing A-RELEASE-RSP messages to get lost under certain circumstances when the SCP runs on Win32. Thanks to Yongjian Bao for the proposal. Affects: dcmnet/libsrc/dul.cc dcmnet/libsrc/dulfsm.cc - Added config file entry for monitor characteristics file. Monitor characteristics are passed to dcmimage if present to activate Barten transform. Affects: dcmpstat/include/dviface.h dcmpstat/include/dvpstat.h dcmpstat/libsrc/dviface.cc dcmpstat/libsrc/dvpstat.cc dcmpstat/tests/test.cfg - Added sample monitor characteristic file. Added: dcmpstat/tests/sample.lut **** Changes from 1999.02.05 (riesmeier) - Corrected bug in wildcard expansion for Windows compilers. Affects: ofstd/libsrc/ofcmdln.cc - Added automatic wildcard expansion for Windows compilers. Affects: ofstd/include/ofcmdln.h ofstd/libsrc/ofcmdln.cc - Introduced new preprocessor definition HAVE_WINDOWS_H. Affects: config/include/cfwin32.h ofstd/include/oftimer.h ofstd/libsrc/ofcmdln.cc - Added conversion P-Value to DDL when display function is absent. Corrected calculation of DDL value for bitmaps shutters (overlays). Affects: dcmimgle/include/dimoopxt.h - Added console application to convert VeriLUM LUT files to dcmtk DISPLAY file used for Barten transformation. Affects: dcmimgle/Makefile.in Added: dcmimgle/apps/Makefile.dep dcmimgle/apps/Makefile.in dcmimgle/apps/dconvlum.cc - Added optional parameter to method convertPValueToDDL to specify width of output data (number of bits). Affects: dcmimgle/include/dcmimage.h dcmimgle/include/didispfn.h dcmimgle/include/dimoimg.h dcmimgle/libsrc/dimoimg.cc **** Changes from 1999.02.05 (vorwerk) - assigned listdb to dviface methods. Affects: dcmpstat/apps/tests/listdb.cc - corrected bugs in getNumberOf and select methods Affects: dcmpstat/include/dviface.h dcmpstat/libsrc/dviface.cc **** Changes from 1999.02.03 (riesmeier) - Rebuilt Makefile dependencies. Affects: dcmimgle/libsrc/Makefile.dep - Moved global functions maxval() and determineRepresentation() to class DicomImageClass (as static methods). Affects: dcmimgle/include/diinpxt.h dcmimgle/include/discalet.h dcmimgle/include/diutils.h dcmimgle/libsrc/diluptab.cc dcmimgle/libsrc/dimoimg.cc dcmimgle/libsrc/dimomod.cc dcmimgle/libsrc/diutils.cc - Added BEGIN_EXTERN_C and END_EXTERN_C to some C includes. Affects: dcmimgle/include/didocu.h dcmimgle/include/diimage.h dcmimgle/include/dimoopx.h dcmimgle/include/diovpln.h dcmimgle/include/diutils.h dcmimgle/libsrc/dcmimage.cc - Added support for calibration according to Barten transformation (incl. a DISPLAY file describing the monitor characteristic). Affects: dcmimgle/include/dcmimage.h dcmimgle/include/dimoimg.h dcmimgle/include/dimoopxt.h dcmimgle/include/diovlay.h dcmimgle/include/diovpln.h dcmimgle/libsrc/Makefile.in dcmimgle/libsrc/dimoimg.cc dcmimgle/libsrc/diovlay.cc dcmimgle/libsrc/diovpln.cc Added: dcmimgle/include/dibarlut.h dcmimgle/include/didispfn.h dcmimgle/include/displine.h dcmimgle/libsrc/dibarlut.cc dcmimgle/libsrc/didispfn.cc - Removed some debug code. Affects: dcmimgle/include/diflipt.h - Added member variable and related methods to store number of bits used for pixel data. Affects: dcmimgle/include/diinpx.h dcmimgle/include/dimomod.h dcmimgle/include/dimopx.h dcmimgle/include/diinpx.cc dcmimgle/libsrc/dimomod.cc - Added base class for look-up tables (moved main functionality of class DiLookupTable to DiBaseLUT). Affects: dcmimgle/include/diluptab.h dcmimgle/libsrc/Makefile.in dcmimgle/libsrc/diluptab.cc Added: dcmimgle/include/dibaslut.h dcmimgle/libsrc/dibaslut.cc - Added optimization LUT to transform pixel data. Affects: dcmimgle/include/dimoipxt.h dcmimgle/include/dimoopxt.h - Corrected some typos and formatting. Affects: dcmimgle/libsrc/diovlimg.cc **** Changes from 1999.01.29 (eichelberg) - Reworked index file handle acquisition and locking code. Affects: dcmpstat/include/dviface.h dcmpstat/libsrc/dviface.cc - Implemented small sample application that lists the contents of the database using DVInterface methods. Added: dcmpstat/apps/listdb.cc Affects: dcmpstat/apps/Makefile.in dcmpstat/apps/Makefile.dep - Simplified some index file related code in imagectn to ease maintenance. Affects: imagectn/libsrc/dbindex.cc imagectn/include/dbpriv.h **** Changes from 1999.01.28 (vorwerk) - Initialisation for all record members implemented. Affects: imagectn/libsrc/dbindex.cc - added shared or exclusive locking mechanism to all browser methods. Affects: dcmpstat/include/dviface.h dcmpstat/libsrc/dviface.cc **** Changes from 1999.01.27 (vorwerk) - implemented error handling for index files of length zero. Fixed bug in record deletion of an index file (see also dbstore) selectSeries, selectInstance, getAnInstance, getNumberOfStudies bugs fixed. error handling added. Affects: dcmpstat/include/dviface.h dcmpstat/libsrc/dviface.cc - Changes made in DB_MatchStudyUIDinStudyDesc to enable a search over the whole index file. Affects: imagectn/libsrc/dbstore.cc **** Changes from 1999.01.27 (eichelberg) - Implemented DICOM network receive application "dcmpsrcv" which receives images and presentation states and stores them in the local database. Presentation states are checked before they are accepted. Added: dcmpstat/apps/dcmpsrcv.cc Affects: dcmpstat/apps/runsend.cc dcmpstat/apps/Makefile.dep dcmpstat/apps/Makefile.in dcmpstat/include/dviface.h dcmpstat/libsrc/dviface.cc - Corrected locking behaviour of dcmpsrcv on Win32 platforms. Affects: dcmpstat/apps/dcmpsrcv.cc **** Changes from 1999.01.25 (eichelberg) - Defined private SOP class UID for network receiver shutdown function. Cleanup up some code. Affects: dcmpstat/include/dviface.h dcmpstat/libsrc/dviface.cc - Implemented DVInterface::startReceiver() and several config file related methods. Affects: dcmpstat/apps/dcmpssnd.cc dcmpstat/include/dviface.h dcmpstat/libsrc/dviface.cc dcmpstat/tests/test.cfg **** Changes from 1999.01.20 (eichelberg) - Implemented access methods for network communication related config file entries. Affects: dcmpstat/include/dviface.h dcmpstat/libsrc/dviface.cc dcmpstat/apps/dcmp2pgm.cc - Implemented sendIOD method which creates a separate process for transmitting images from the local database to a remote communication peer. Affects: dcmpstat/include/dviface.h dcmpstat/libsrc/dviface.cc dcmpstat/libsrc/Makefile.dep - Implemented DICOM network send application "dcmpssnd" which sends studies/series/images contained in the local database to a remote DICOM communication peer. Added: dcmpstat/apps/dcmpssnd.cc Affects: dcmpstat/apps/runsend.cc dcmpstat/apps/Makefile.dep dcmpstat/apps/Makefile.in dcmpstat/tests/test.cfg - Removed unneccessary unlock from DB_destroyHandle if compiling on Windows. Avoids unneccesary error message. Affects: imagectn/libsrc/dbutils.cc - Illegal/unsupported VRs are now decoded with 2 byte length fields instead of 4 byte length fields. Seems to improve connectivity to some buggy DICOM devices from a vendor to remain unmentioned here... Thanks to Gilles Mevel for the proposal. Affects: dcmdata/libsrc/dcvr.cc - Some code purifications in Win32 variant of flock() emulation. Affects: dcmnet/libsrc/dcompat.cc **** Changes from 1999.01.20 (riesmeier) - Added class for measurement of time. Added: ofstd/include/oftimer.h - Minor changes to avoid compiler warnings (gcc 2.8.1 with additional options). Affects: ofstd/include/oftimer.h - Rebuilt Makefile dependencies. Affects: dcmimgle/libsrc/Makefile.dep - Added debug code to measure time of some routines. Affects: dcmimgle/include/diflipt.h dcmimgle/include/dirotat.h - Changed default value for compatibility flag. Affects: dcmimgle/libsrc/dcmimage.cc - Replaced invocation of getCount() by member variable Count where possible. Affects: dcmimgle/include/diinpxt.h dcmimgle/include/dimoipxt.h dcmimgle/include/dimoopx.h dcmimgle/include/dimoopxt.h dcmimgle/include/dimopxt.h dcmimgle/include/dipixel.h dcmimgle/libsrc/dimoopx.cc dcmimgle/libsrc/dimopx.cc - Added new output method to fill external memory buffer with rendered pixel data. Affects: dcmimgle/include/dcmimage.h dcmimgle/include/diimage.h dcmimgle/include/dimo1img.h dcmimgle/include/dimo2img.h dcmimgle/include/dimoimg.h dcmimgle/include/dimoopxt.h dcmimgle/libsrc/dimo1img.cc dcmimgle/libsrc/dimo2img.cc dcmimgle/libsrc/dimoimg.cc - Added new overlay plane mode for bitmap shutters. Affects: dcmimgle/libsrc/diovpln.cc dcmimgle/include/dimoopxt.h dcmimgle/include/diutils.h - Added routine to calculate absolute range of pixel data. Affects: dcmimgle/include/diinpx.h - Added optimization to modality and VOI transformation (using additional LUTs). Affects: dcmimgle/include/dimoipxt.h dcmimgle/include/dimoopxt.h **** Changes from 1999.01.19 (vorwerk) - additional methods for attributes in the index file added. method getFilename implemented. Affects: dcmpstat/include/dviface.h dcmpstat/libsrc/dviface.cc **** Changes from 1999.01.18 (eichelberg) - minor syntax purifications to keep VC++ happy Affects: dcmpstat/libsrc/dviface.cc - Now preventing VOI Windows with a width <= 0.0. Presentation label and creator's name are now correctly set. Affects: dcmpstat/libsrc/dvpstat.cc **** Changes from 1999.01.15 (eichelberg) - added methods to DVPresentationState allowing to access the image references in the presentation state. Also added methods allowing to get the width and height of the attached image Affects: dcmpstat/include/dvpsri.h dcmpstat/include/dvpsril.h dcmpstat/include/dvpsrs.h dcmpstat/include/dvpsrsl.h dcmpstat/include/dvpstat.h dcmpstat/libsrc/dvpsri.cc dcmpstat/libsrc/dvpsril.cc dcmpstat/libsrc/dvpsrs.cc dcmpstat/libsrc/dvpsrsl.cc dcmpstat/libsrc/dvpstat.cc - added DVInterface method resetPresentationState() which allows to reset a presentation state to the initial state (after loading). Affects: dcmpstat/include/dviface.h dcmpstat/libsrc/dviface.cc - added configuration file facility (derived from dcmprint) and a sample config file. Added: dcmpstat/include/dvpsconf.h dcmpstat/libsrc/dvpsconf.cc dcmpstat/tests/test.cfg Affects: dcmpstat/include/dviface.h dcmpstat/libsrc/dviface.cc dcmpstat/libsrc/Makefile.dep dcmpstat/apps/dcmpstst.cc dcmpstat/apps/dcmp2pgm.cc **** Changes from 1999.01.14 (eichelberg) - added new method saveDICOMImage() to class DVInterface. Allows to store a bitmap as a DICOM image. Affects: dcmpstat/libsrc/dviface.cc dcmpstat/include/dviface.h - added new command line option --dicom to test application dcmp2pgm. This demonstrates DVInterface::saveDICOMImage(). Affects: dcmpstat/apps/dcmp2pgm.cc **** Changes from 1999.01.11 (eichelberg) - added new methods getImageAspectRatio, getImageMinMaxPixelRange and getImageMinMaxPixelValue to class DVPresentationState. Affects: dcmpstat/libsrc/dvpstat.cc dcmpstat/include/dvpstat.h **** Changes from 1999.01.11 (vorwerk) - added some explicit type conversions to avoid compiler warnings with VC++. Affects: dcmpstat/libsrc/dvpstx.cc - add error handling in getNumberOfStudies() and selectStudy() getSeriesDescription() implemented, isPresentationStateSeries() rewritten Affects: dcmpstat/libsrc/dviface.cc - Shared and exclusive locking mechanism for Windows with MS Visual C++ added. Affects: dcmnet/libsrc/dcompat.cc **** Changes from 1999.01.11 (riesmeier) - Added parameter to method 'getMinMaxValues()' to return absolute minimum and maximum values ('possible') in addition to actually 'used' pixel values. Affects: dcmimgle/include/dcmimage.h dcmimgle/include/dimoimg.h dcmimgle/libsrc/dimoimg.cc - Removed method 'getMinMaxValues()' in class 'DicomImage'. Affects: dcmimgle/include/diimage.h - Corrected bug in determing 'AbsMaximum' (removed '+ 1'). Affects: dcmimgle/include/diinpxt.h - Corrected some typos and formatting. Affects: dcmimgle/include/dimopx.h dcmimgle/include/dimopxt.h **** Changes from 1999.01.07 (eichelberg) - Changed sequence of include files in some dcmnet modules to keep the Unixware compiler happy. Based on a contribution by Wolfgang Rapp . Affects: dcmnet/libsrc/assoc.cc dcmnet/libsrc/dul.cc dcmnet/libsrc/dulextra.cc dcmnet/libsrc/dulfsm.cc - Corrected bug in dump2dcm that prevented the correct processing of dumps created with dcmdump if they contained the "internal" VR markers "xs" (US or SS) or "ox" (OB or OW). Based on a report from Heinz Blendinger . Affects: dcmdata/apps/dump2dcm.cc - Changed declaration order of some member variables in class DcmObject to workaround memory layout problems with the Borland C++ compiler. Based on a report by Markus Mertens . Affects: dcmdata/include/dcobject.h dcmdata/libsrc/dcobject.cc **** Changes from 1999.01.06 (vorwerk) - Exclusive lock mechanism for windows added. Affects: dcmnet/libsrc/dcompat.cc **** Changes from 1999.01.04 (vorwerk) - getSeriesPerformingPhysicainsName() changed in getSeriesPerformingPhysiciansName() Affects: dcmpstat/include/dviface.h dcmpstat/libsrc/dviface.cc **** Changes from 1998.12.23 (eichelberg) - Added tests for strcasecmp() and _stricmp() to configure. Affects: config/configure config/configure.in config/include/cfwin32.h config/include/config.h.in - Modified imagectn so that comparison of hostnames (i.e. hostnames reported by DNS and the hostnames in the imagectn config file) are case insensitive. Since DNS is case insensitive, this seems appropriate. Affects: imagectn/libsrc/cnf.cc imagectn/libsrc/cnfexnt.cc - Updated data dictionary for two Structured Reporting tags Affects: dcmdata/include/dcdeftag.h dcmdata/libsrc/dicom.dic dcmdata/libsrc/dcdictzz.cc **** Changes from 1998.12.23 (riesmeier) - Changed order of doc++ parameters used for 'make html'. Affects: ofstd/Makefile.in - Changed order of parameters for addOverlay() and getOverlayData(). Affects: dcmimgle/include/dcmimage.h dcmimgle/include/dimoimg.h dcmimgle/include/diovlay.h dcmimgle/include/diovpln.h dcmimgle/libsrc/dimoimg.cc dcmimgle/libsrc/diovlay.cc dcmimgle/libsrc/diovpln.cc - Modified (added/removed) comments. Corrected bug concerning additional overlay planes. Affects: dcmimgle/include/diovlay.h dcmimgle/libsrc/diovlay.cc - Introduced new overlay mode item EMO_Graphic (= EMO_Replace). Affects: dcmimgle/include/diutils.h dcmimgle/libsrc/diovpln.cc - Corrected bug concerning flipping and rotating overlay planes (same image object). Affects: dcmimgle/libsrc/diovpln.cc - Corrected some typos and formatting. Affects: dcmimgle/include/diimage.h dcmimgle/include/dimoimg.h - Changed behaviour of getLabel/Description/Explanation() methods: return NULL if string empty, no empty string "". Affects: dcmimgle/include/diluptab.h dcmimgle/include/diovpln.h - Removed unused parameter (BitsPerSample). Affects: dcmimgle/include/dimoopxt.h dcmimgle/libsrc/dimoimg.cc - Changed parameter type (long to int) to avoid warning reported by MSVC5. Affects: dcmimgle/include/ **** Changes from 1998.12.22 (eichelberg) - Updated for changed interfaces in dcmimage overlays. Fixed bug affecting overlay origin delivered to dcmimage. Affects: dcmpstat/libsrc/dvpsov.cc dcmpstat/libsrc/dcmpstat.cc - Implemented Presentation State interface for overlays, VOI LUTs, VOI windows, curves. Added test program that allows to add curve data to DICOM images. Added: dcmpstat/apps/dcmmkcrv.cc dcmpstat/include/dvpscu.h dcmpstat/include/dvpscul.h dcmpstat/include/dvpsvl.h dcmpstat/include/dvpsvll.h dcmpstat/include/dvpsvw.h dcmpstat/include/dvpsvwl.h dcmpstat/libsrc/dvpscu.cc dcmpstat/libsrc/dvpscul.cc dcmpstat/libsrc/dvpsvl.cc dcmpstat/libsrc/dvpsvll.cc dcmpstat/libsrc/dvpsvw.cc dcmpstat/libsrc/dvpsvwl.cc Affects: dcmpstat/apps/Makefile.dep dcmpstat/apps/Makefile.in dcmpstat/apps/dcmp2pgm.cc dcmpstat/include/dviface.h dcmpstat/include/dvpsall.h dcmpstat/include/dvpsov.h dcmpstat/include/dvpsovl.h dcmpstat/include/dvpstat.h dcmpstat/include/dvpstyp.h dcmpstat/libsrc/Makefile.dep dcmpstat/libsrc/Makefile.in dcmpstat/libsrc/dviface.cc dcmpstat/libsrc/dvpsall.cc dcmpstat/libsrc/dvpsgr.cc dcmpstat/libsrc/dvpsov.cc dcmpstat/libsrc/dvpsovl.cc dcmpstat/libsrc/dvpstat.cc dcmpstat/libsrc/dvpstx.cc **** Changes from 1998.12.22 (vorwerk) - constructor with parameter for directory of index.dat Changed const methods in non-const-methods Added methods for attributes of DICOM-documents Added private method for operations on index.dat Affects: dcmpstat/include/dviface.h - Browser methods implemented Affects: dcmpstat/libsrc/dviface.cc - New test program which shows contents of an imagectn index file using the dviface interface methods Added: dcmpstat/tests/show.cc - New test program which marks, selects and deletes Instances in the imagectn database using the dviface methods Added: dcmpstat/tests/didb.cc - Added output of DVIhierarchyStatus in DB_PrintIndexFile Affects: imagectn/libsrc/dbindex.cc - Added initialization of DVIhierarchyStatus in DB_storeRequest Affects: imagectn/libsrc/dbstore.cc - removed from libsrc and added in include. Added additional elements in IdxRecord Affects: imagectn/include/dbpriv.h - enum from dcmpstat/include/dviface.h removed and added here Affects: imagectn/include/imagedb.h - added for access of functions from imagectn/libsrc/dbstore.cc Affects: imagectn/include/dbstore.h - moved libsrc/dbcond.h to include/dbcond.h Affects: imagectn/include/dbcond.h **** Changes from 1998.12.22 (riesmeier) - Corrected some typos and formatting. Affects: dcmimgle/libsrc/dcmimage.cc dcmimgle/libsrc/dimopx.cc dcmimgle/include/dimopxt.h - Changed parameter type. Affects: dcmimgle/include/diluptab.h dcmimgle/libsrc/diluptab.cc - Added method getAbsMaxRange. Affects: dcmimgle/include/diluptab.h - Check descriptor value 'first input value mapped' for presentation LUTs (shall always be 0). Affects: dcmimgle/libsrc/dimoimg.cc - Added support for 'potentially' signed input ranges for different kinds of grayscale transformations (according to supplement 33 from Cor Loef). Affects: dcmimgle/libsrc/dimoimg.cc - Changed behaviour of getOverlayData() method (new parameter to choose overlay plane group: dataset, additional, overlap). Affects: dcmimgle/libsrc/dimoimg.cc - Changed calculation of AbsMinimum/Maximum. Removed member variable and method for isPotentiallySigned. Affects: dcmimgle/include/dimomod.h dcmimgle/libsrc/dimomod.cc - Added method to check whether plane is visible, to get plane mode and to remove all planes. Set 'value' used for getOverlay/PlaneData(). Changed meaning of return values (differentiate between different value for 'true'). Affects: dcmimgle/include/dcmimage.h dcmimgle/include/diovlay.h dcmimgle/include/diovpln.h dcmimgle/libsrc/diovlay.cc - Removed variable declaration to avoid compiler warnings (reported by MSVC5). Changed initialization of member variable 'DefaultMode'. Affects: dcmimgle/libsrc/diovpln.cc - Added index parameter to overlay methods (choose dataset or additional planes). Affects: dcmimgle/include/dcmimage.h - Changed parameter declaration to avoid compiler warnings (hide parameter name). Affects: dcmimgle/include/diimage.h - Added implementation of methods to return member variables AbsMinimum/ Maximum. Affects: dcmimgle/include/diinpx.h dcmimgle/include/dimopx.h - Added calculation of member variables AbsMinimum/AbsMaximum. Replaced method copyMem by for-loop copying each item. Removed some '#ifdef DEBUG'. Affects: dcmimgle/include/diinpxt.h - Added new parameters to method getOverlayData(). Affects: dcmimgle/include/dimoimg.h - Replaced method copyMem by for-loop copying each item. Renamed some variables Affects: dcmimgle/include/dimoipxt.h - Improved implementation of presentation LUT application (and other gray scale transformations). Tested with ECR test images from David Clunie. Affects: dcmimgle/include/dimoopxt.h **** Changes from 1998.12.16 (riesmeier) - Corrected bug in setMem routine (expected 'value' parameter for system function 'memset' is implicitely casted to 'unsigned char'). Affects: ofstd/include/ofbmanip.h - Rebuilt Makefile dependencies. Affects: dcmimgle/libsrc/Makefile.dep - Added explanation string to LUT class (retrieved from dataset). Affects: dcmimgle/include/dcmimage.h dcmimgle/include/diluptab.h dcmimgle/include/dimo2img.h dcmimgle/include/dimoimg.h dcmimgle/include/dimomod.h dcmimgle/include/dimopx.h dcmimgle/libsrc/diluptab.cc dcmimgle/libsrc/dimo2img.cc dcmimgle/libsrc/dimoimg.cc dcmimgle/libsrc/dimomod.cc - Added explanation string for VOI transformations. Affects: dcmimgle/include/dcmimage.h dcmimgle/include/dimoimg.h dcmimgle/libsrc/dimoimg.cc - Added method to export overlay planes (create 8-bit bitmap). Affects: dcmimgle/include/dcmimage.h dcmimgle/include/dimoimg.h dcmimgle/include/diovlay.h dcmimgle/include/diovpln.h dcmimgle/libsrc/dimoimg.cc dcmimgle/libsrc/diovlay.cc dcmimgle/libsrc/diovpln.cc - Implemented combined clipping and scaling for pixel replication and suppression. Affects: dcmimgle/include/discalet.h dcmimgle/libsrc/dcmimage.cc - Added methods to use getOFString from class DcmElement (incl. multi value fields). Affects: dcmimgle/include/didocu.h dcmimgle/libsrc/didocu.cc - Renamed 'setNoVoiLutTransformation' method ('Voi' instead of 'VOI'). Affects: dcmimgle/include/dcmimage.h dcmimgle/include/dimoimg.h dcmimgle/libsrc/dimoimg.cc - Implemented flipping and rotation of overlay planes. Affects: dcmimgle/include/diovlay.h dcmimgle/include/diovpln.h dcmimgle/libsrc/diovlay.cc dcmimgle/libsrc/diovpln.cc - Removed several methods used for monochrome images only in base class 'DiImage'. Introduced mechanism to use the methods directly. Affects: dcmimgle/include/dcmimage.h dcmimgle/include/diimage.h dcmimgle/include/dimoimg.h - Added additional case to copy pixels. Affects: dcmimgle/include/diflipt.h dcmimgle/include/dirotat.h - Added methods to determine absolute minimum and maximum value for given value representation. Affects: dcmimgle/include/diinpx.h dcmimgle/include/diinpxt.h dcmimgle/include/dipxrept.h - Removed methods getMinimum/Maximum(). Affects: dcmimgle/include/dipxrept.h - Added some preparation to enhance interpolated scaling (clipping and scaling) in the future. Affects: dcmimgle/include/discalet.h - Removed const declaration (as long as interpolated scaling isn't completed). Affects: dcmimgle/include/ditranst.h **** Changes from 1998.12.14 (eichelberg) - Implemented Presentation State interface for graphic layers, text and graphic annotations, presentation LUTs. Affects: dcmpstat/apps/Makefile.dep dcmpstat/apps/Makefile.in dcmpstat/apps/dcmp2pgm.cc dcmpstat/apps/dcmpstst.cc dcmpstat/include/dvpsall.h dcmpstat/include/dvpsga.h dcmpstat/include/dvpsgal.h dcmpstat/include/dvpsgl.h dcmpstat/include/dvpsgll.h dcmpstat/include/dvpsgr.h dcmpstat/include/dvpsgrl.h dcmpstat/include/dvpsov.h dcmpstat/include/dvpsovl.h dcmpstat/include/dvpsri.h dcmpstat/include/dvpsril.h dcmpstat/include/dvpsrs.h dcmpstat/include/dvpsrsl.h dcmpstat/include/dvpstat.h dcmpstat/include/dvpstx.h dcmpstat/include/dvpstxl.h dcmpstat/include/dvpstyp.h dcmpstat/libsrc/Makefile.dep dcmpstat/libsrc/dvpsall.cc dcmpstat/libsrc/dvpsga.cc dcmpstat/libsrc/dvpsgal.cc dcmpstat/libsrc/dvpsgl.cc dcmpstat/libsrc/dvpsgll.cc dcmpstat/libsrc/dvpsgr.cc dcmpstat/libsrc/dvpsgrl.cc dcmpstat/libsrc/dvpsov.cc dcmpstat/libsrc/dvpsovl.cc dcmpstat/libsrc/dvpsri.cc dcmpstat/libsrc/dvpsril.cc dcmpstat/libsrc/dvpsrs.cc dcmpstat/libsrc/dvpsrsl.cc dcmpstat/libsrc/dvpstat.cc dcmpstat/libsrc/dvpstx.cc dcmpstat/libsrc/dvpstxl.cc - Added sample application that creates Modality and VOI LUTs with gamma curve characteristics. Added: dcmpstat/apps/dcmmklut.cc **** Changes from 1998.12.14 (riesmeier) - Rebuilt Makefile dependencies. Affects: dcmimgle/libsrc/Makefile.dep - Added support for presentation shapes. Affects: dcmimgle/libsrc/dimo1img.cc dcmimgle/libsrc/dimo2img.cc dcmimgle/libsrc/dimoimg.cc - Added support for signed values as second entry in look-up tables (= first value mapped). Affects: dcmimgle/include/diluptab.h dcmimgle/include/dimoipxt.h dcmimgle/include/dimoopxt.h dcmimgle/libsrc/diluptab.cc - Added methods to add and remove additional overlay planes (still untested). Affects: dcmimgle/include/dcmimage.h dcmimgle/include/diimage.h dcmimgle/include/dimoimg.h dcmimgle/include/dimoopxt.h dcmimgle/include/diovlay.h dcmimgle/libsrc/dimoimg.cc dcmimgle/libsrc/diovlay.cc dcmimgle/libsrc/diovlimg.cc dcmimgle/libsrc/diovpln.cc - Added methods to support overlay labels and descriptions. Affects: dcmimgle/include/dcmimage.h dcmimgle/include/diovlay.h dcmimgle/include/diovpln.h dcmimgle/libsrc/diovpln.cc - Added (simplified) methods to return values of a given DcmElement object. Affects: dcmimgle/include/didocu.h dcmimgle/libsrc/didocu.cc - Added support for correct scaling of input/output values for grayscale transformations. Affects: dcmimgle/include/dimomod.h dcmimgle/include/dimoopxt.h dcmimgle/libsrc/dimomod.cc - Added (missing) implementation of methods to rotate images/frames without creating a new DicomImage. Affects: dcmimgle/include/dirotat.h - Added first implementation of method to export overlay plane bitmaps. Affects: dcmimgle/include/dcmimage.h dcmimgle/libsrc/dcmimage.cc **** Changes from 1998.12.02 (riesmeier) - Corrected bug in setMem routine (parameter 'value' was ignored). Affects: ofstd/include/ofbmanip.h - Added methods to convert parameters to signed/unsigned integers and floats. Changed return value of existing getParam() methods. Affects: ofstd/include/ofcmdln.h ofstd/libsrc/ofcmdln.cc - Introduced new enum type used to indicate the status when converting parameter values (similar to option values). Changed return value of getParam() methods to this type. Added corresponding getStatusString() method to convert status code to strings. Affects: ofstd/include/ofcmdln.h ofstd/libsrc/ofcmdln.cc - Introduced test whether added options are correct (starting with defined option character followed by a character which is no number). Changed parse routine to distinguish between options (normally starting mit - or +) and signed numbers which can be valid parameters. Affects: ofstd/include/ofcmdln.h ofstd/libsrc/ofcmdln.cc **** Changes from 1998.11.30 (riesmeier) - Introduced additional type definition to avoid errors with MSVC5 when using ListIterators of ListIterators (syntax problems?). Affects: ofstd/include/ofcmdln.h ofstd/libsrc/ofcmdln.cc - Use lists of pointers (!) to internal data structures to avoid errors with MSVC5 (operator '==' was not defined to compare structures). Affects: ofstd/include/ofcmdln.h ofstd/libsrc/ofcmdln.cc - Added module dcmpstat to CVS depot. Affects: modules/modules. - Added CVS/RCS log at end of file. Affects: dcmpstat/include/dviface.h - Added const type qualifier to some parameters to avoid errors with MSVC5 (couldn't create instance of abstract class). Affects: dcmimgle/include/diimage.h - Removed wrong 'inline' from method declaration (reported by MSVC5). Affects: dcmimgle/include/diovlay.h **** Changes from 1998.11.27 (riesmeier) - Added class for platform independant memory operations (copy/set/zeroMem). Added: ofstd/include/ofbmanip.h - Added class to handle command line arguments. Added: ofstd/include/ofcmdln.h ofstd/libsrc/ofcmdln.cc ofstd/tests/tstcmdln.cc Affects: ofstd/libsrc/Makefile.in ofstd/libsrc/Makefile.dep ofstd/tests/Makefile.in ofstd/tests/Makefile.dep - Added copyright message to source files and changed CVS header. Affects: ofstd/include/ofalgo.h ofstd/include/oflist.h ofstd/include/ofstack.h ofstd/include/ofstring.h ofstd/include/oftypes.h ofstd/libsrc/oflist.cc ofstd/libsrc/ofstring.cc ofstd/tests/tlist.cc ofstd/tests/tstlist.cc ofstd/tests/tstring.cc ofstd/tests/tststack.cc - Added 'make html' to automatically create a HTML documentation using Doc++. Affects: ofstd/Makefile.in - Splitted module into two parts: dcmimgle (light edition) for monochrome images and dcmimage (including dcm2pnm) for color images. Added registration class to allow easy combination of both modules. Affects: modules/modules Added: dcmimgle/include/dcmimage.h dcmimgle/include/didocu.h dcmimgle/include/diimage.h dcmimgle/include/diinpx.h dcmimgle/include/diluptab.h dcmimgle/include/dimo1img.h dcmimgle/include/dimo2img.h dcmimgle/include/dimoimg.h dcmimgle/include/dimoipxt.h dcmimgle/include/dimomod.h dcmimgle/include/dimoopx.h dcmimgle/include/dimoopxt.h dcmimgle/include/dimopx.h dcmimgle/include/dimopxt.h dcmimgle/include/dimosct.h dcmimgle/include/diobjcou.h dcmimgle/include/diovlay.h dcmimgle/include/diovlimg.h dcmimgle/include/diovpln.h dcmimgle/include/dipxrept.h dcmimgle/include/discalet.h dcmimgle/include/ditranst.h dcmimgle/include/diutils.h dcmimgle/include/diregbas.h dcmimgle/include/Makefile.in dcmimgle/libsrc/Makefile.in dcmimgle/libsrc/Makefile.dep dcmimgle/libsrc/dcmimage.cc dcmimgle/libsrc/didocu.cc dcmimgle/libsrc/diimage.cc dcmimgle/libsrc/diinpx.cc dcmimgle/libsrc/diluptab.cc dcmimgle/libsrc/dimo1img.cc dcmimgle/libsrc/dimo2img.cc dcmimgle/libsrc/dimoimg.cc dcmimgle/libsrc/dimomod.cc dcmimgle/libsrc/dimoopx.cc dcmimgle/libsrc/dimopx.cc dcmimgle/libsrc/diovlay.cc dcmimgle/libsrc/diovlimg.cc dcmimgle/libsrc/diovpln.cc dcmimgle/libsrc/diutils.cc dcmimgle/Makefile.in - Added module dcmimgle to CVS depot. Affects: modules/modules - Added copyright message to all source files. Started with documentation in Doc++ notation. Affects: dcmimgle/include/*.h dcmimgle/libsrc/*.cc - Added 'make html' to automatically create a HTML documentation using Doc++. Affects: dcmimgle/Makefile.in - Added methods and constructors for flipping and rotating, changed for scaling and clipping. Affects: dcmimgle/include/dcmimage.h dcmimgle/include/diflipt.h dcmimgle/include/diimage.h dcmimgle/include/dimoflt.h dcmimgle/include/dimo1img.h dcmimgle/include/dimo2img.h dcmimgle/include/dimoimg.h dcmimgle/include/dimorot.h dcmimgle/include/diovlay.h dcmimgle/include/diovpln.h dcmimgle/include/dirotat.h dcmimgle/libsrc/dcmimage.cc dcmimgle/libsrc/diimage.cc dcmimgle/libsrc/dimo1img.cc dcmimgle/libsrc/dimo2img.cc dcmimgle/libsrc/dimoimg.cc dcmimgle/libsrc/diovlay.cc dcmimgle/libsrc/diovpln.cc - Replaced delete by delete[] for array types. Affects: dcmimgle/include/dimoopxt.h dcmimgle/include/dimopxt.h dcmimgle/include/diovlay.h dcmimgle/libsrc/diovlay.cc - Added method to directly create java AWT bitmaps. Affects: dcmimgle/include/dcmimage.h dcmimgle/include/diimage.h dcmimgle/include/dimoimg.h dcmimgle/libsrc/dcmimage.cc dcmimgle/libsrc/diimage.cc dcmimgle/libsrc/dimoimg.cc - Added method to give direct (non-const) access to internal data buffer. Affects: dcmimgle/include/dimopxt.h - Introduced global debug level for dcmimage module to control error output. Affects: dcmimgle/include/diinpxt.h dcmimgle/include/dimoopxt.h dcmimgle/include/diutils.h dcmimgle/libsrc/dcmimage.cc dcmimgle/libsrc/diimage.cc dcmimgle/libsrc/dimoimg.cc dcmimgle/libsrc/dimomod.cc dcmimgle/libsrc/diovlay.cc dcmimgle/libsrc/diovlimg.cc dcmimgle/libsrc/diovpln.cc dcmimgle/libsrc/diutils.cc - Renamed variable 'Status' to 'ImageStatus' because of possible conflicts with X windows systems. Affects: dcmimgle/include/diimage.h dcmimgle/libsrc/diimage.cc dcmimgle/libsrc/dimoimg.cc dcmimgle/libsrc/diovlimg.cc - Added method to detach pixel data if it is no longer needed. Affects: dcmimgle/include/diimage.h dcmimgle/include/diovlay.h dcmimgle/include/diovpln.h dcmimgle/libsrc/diimage.cc dcmimgle/libsrc/diovlay.cc - Moved type definitions to diutils.h. Affects: dcmimgle/include/dcmimage.h dcmimgle/include/diutils.h - Added constructors to use external modality transformations. Affects: dcmimgle/include/dcmimage.h dcmimgle/include/diluptab.h dcmimgle/include/dimoimg.h dcmimgle/include/dimomod.h dcmimgle/libsrc/dcmimage.cc dcmimgle/libsrc/diluptab.cc dcmimgle/libsrc/dimoimg.cc dcmimgle/libsrc/dimomod.cc - Added methods to support presentation LUTs and shapes. Affects: dcmimgle/include/dcmimage.h dcmimgle/include/diimage.h dcmimgle/include/diluptab.h dcmimgle/include/dimoimg.h dcmimgle/include/diutils.h dcmimgle/libsrc/dcmimage.cc dcmimgle/libsrc/diluptab.cc dcmimgle/libsrc/dimoimg.cc - Added methods to convert module defined enum types to strings. Affects: dcmimgle/include/dcmimage.h dcmimgle/libsrc/dcmimage.cc - Added static methods to return the value of a given element. Affects: dcmimgle/include/didocu.h dcmimgle/libsrc/didocu.cc - Added support of frame start and count for future use (will be explained later if it is fully implemented). Affects: dcmimgle/include/dcmimage.h dcmimgle/include/didocu.h dcmimgle/libsrc/dcmimage.cc dcmimgle/libsrc/didocu.cc - Added support for new bit manipulation class. Affects: dcmimgle/include/diinpxt.h dcmimgle/include/dimoipxt.h dcmimgle/include/dimopxt.h dcmimgle/include/ditranst.h - Added support of object counter class. Affects: dcmimgle/include/diluptab.h - Introduced new method and corresponding classes to create a copy of a dcmimage object (optional parameters: frame start and count). Affects: dcmimgle/include/dcmimage.h dcmimgle/libsrc/dcmimage.cc Added: dcmimgle/include/dimocpt.h - Corrected bug in modality LUT transformation method. Affects: dcmimgle/include/dimoipxt.h - Added new cases to optimize rescaling. Affects: dcmimgle/include/dimoipxt.h - Changed behaviour: now window width of 0 is valid and negative width is invalid. Affects: dcmimgle/include/dcmimage.h dcmimgle/include/dimoopxt.h dcmimgle/libsrc/dimoimg.cc - Corrected bug in VOI LUT transformation method. Affects: dcmimgle/include/dimoopxt.h - Introduced new pixel base class. Affects: dcmimgle/include/dimopx.h dcmimgle/libsrc/dimopx.cc Added: dcmimgle/include/dipixel.h - Combined clipping and scaling methods. Affects: dcmimgle/include/dimosct.h dcmimgle/include/discalet.h dcmimgle/libsrc/dcmimage.cc - Introduced configuration flags to adjust behaviour in different cases. Affects: dcmimgle/include/dcmimage.h dcmimgle/include/diutils.h dcmimgle/libsrc/diutils.cc **** Changes from 1998.11.18 (eichelberg) - Updated data dictionary for version 18 of supplement 33. Affects: dcmdata/include/dcdeftag.h dcmdata/libsrc/dcdictzz.cc dcmdata/libsrc/dicom.dic - Initial Release of new module dcmpstat (Supplement 33 support) Added: dcmpstat/apps/Makefile.in dcmpstat/apps/Makefile.dep dcmpstat/apps/dcmp2pgm.cc dcmpstat/apps/dcmpstst.cc dcmpstat/apps/dcmpsrw.cc dcmpstat/apps/dcmpsmk.cc dcmpstat/docs/Makefile.in dcmpstat/include/Makefile.in dcmpstat/include/dvpstat.h dcmpstat/include/dvpsrsl.h dcmpstat/include/dviface.h dcmpstat/include/dvpstyp.h dcmpstat/include/dvpsov.h dcmpstat/include/dvpsovl.h dcmpstat/include/dvpsgl.h dcmpstat/include/dvpsgll.h dcmpstat/include/dvpsri.h dcmpstat/include/dvpsrs.h dcmpstat/include/dvpsril.h dcmpstat/include/dvpsal.h dcmpstat/include/dvpstx.h dcmpstat/include/dvpsgr.h dcmpstat/include/dvpsga.h dcmpstat/include/dvpstxl.h dcmpstat/include/dvpsgrl.h dcmpstat/include/dvpsall.h dcmpstat/include/dvpsgal.h dcmpstat/libsrc/Makefile.in dcmpstat/libsrc/Makefile.dep dcmpstat/libsrc/dvpstat.cc dcmpstat/libsrc/dviface.cc dcmpstat/libsrc/dvpsal.cc dcmpstat/libsrc/dvpsall.cc dcmpstat/libsrc/dvpsga.cc dcmpstat/libsrc/dvpsgal.cc dcmpstat/libsrc/dvpsgl.cc dcmpstat/libsrc/dvpsgr.cc dcmpstat/libsrc/dvpsgrl.cc dcmpstat/libsrc/dvpsgll.cc dcmpstat/libsrc/dvpsov.cc dcmpstat/libsrc/dvpsovl.cc dcmpstat/libsrc/dvpstx.cc dcmpstat/libsrc/dvpstxl.cc dcmpstat/libsrc/dvpsril.cc dcmpstat/libsrc/dvpsrsl.cc dcmpstat/libsrc/dvpsrs.cc dcmpstat/libsrc/dvpsri.cc dcmpstat/Makefile.in dcmpstat/configure dcmpstat/CHANGES **** Changes from 1998.11.11 (eichelberg) - Updated data dictionary for ECR demo after DICOM WG XI meeting. Affects: dcmdata/include/dcdeftag.h dcmdata/libsrc/dcdictzz.cc dcmdata/libsrc/dcvrpobw.cc dcmdata/libsrc/dicom.dic - Introduced new method DcmObject::setGTag that allows to change the group tag for an existing DcmObject. Useful for handling repeating group elements. Affects: dcmdata/include/dcobject.h - Implemented operator= for all classes derived from DcmObject. Affects: dcmdata/include/dcbytstr.h dcmdata/include/dcchrstr.h dcmdata/include/dcelem.h dcmdata/include/dcfilefo.h dcmdata/include/dclist.h dcmdata/include/dcobject.h dcmdata/include/dcovlay.h dcmdata/include/dcpixel.h dcmdata/include/dcpixseq.h dcmdata/include/dcpxitem.h dcmdata/include/dcsequen.h dcmdata/include/dcvrae.h dcmdata/include/dcvras.h dcmdata/include/dcvrat.h dcmdata/include/dcvrcs.h dcmdata/include/dcvrda.h dcmdata/include/dcvrds.h dcmdata/include/dcvrdt.h dcmdata/include/dcvrfd.h dcmdata/include/dcvrfl.h dcmdata/include/dcvris.h dcmdata/include/dcvrlo.h dcmdata/include/dcvrlt.h dcmdata/include/dcvrobow.h dcmdata/include/dcvrpn.h dcmdata/include/dcvrpobw.h dcmdata/include/dcvrsh.h dcmdata/include/dcvrsl.h dcmdata/include/dcvrss.h dcmdata/include/dcvrst.h dcmdata/include/dcvrtm.h dcmdata/include/dcvrui.h dcmdata/include/dcvrul.h dcmdata/include/dcvrus.h dcmdata/include/dcvrut.h dcmdata/include/dcvrvs.h dcmdata/libsrc/dcbytstr.cc dcmdata/libsrc/dcchrstr.cc dcmdata/libsrc/dcelem.cc dcmdata/libsrc/dclist.cc dcmdata/libsrc/dcobject.cc dcmdata/libsrc/dcpixel.cc dcmdata/libsrc/dcpixseq.cc dcmdata/libsrc/dcpxitem.cc dcmdata/libsrc/dcsequen.cc dcmdata/libsrc/dcvrae.cc dcmdata/libsrc/dcvras.cc dcmdata/libsrc/dcvrcs.cc dcmdata/libsrc/dcvrda.cc dcmdata/libsrc/dcvrds.cc dcmdata/libsrc/dcvrdt.cc dcmdata/libsrc/dcvris.cc dcmdata/libsrc/dcvrlo.cc dcmdata/libsrc/dcvrlt.cc dcmdata/libsrc/dcvrpn.cc dcmdata/libsrc/dcvrpobw.cc dcmdata/libsrc/dcvrsh.cc dcmdata/libsrc/dcvrst.cc dcmdata/libsrc/dcvrtm.cc dcmdata/libsrc/dcvrui.cc dcmdata/libsrc/dcvrut.cc dcmdata/libsrc/dcvrvs.cc - fixed incorrect return value in DcmPolymorphOBOW::operator=(). Affects: dcmdata/libsrc/dcvrpobw.cc **** Changes from 1998.10.26 (eichelberg) - Updated data dictionary and UIDs for Grayscale Softcopy Presentation State (Supplement 33 frozen draft). Affects: dcmdata/include/dcdeftag.h dcmdata/include/dcuid.h dcmdata/libsrc/dcdictzz.cc dcmdata/libsrc/dcuid.cc dcmdata/libsrc/dicom.dic - Added Grayscale Softcopy Presentation State to DIMSE helper functions. Affects: dcmnet/libsrc/diutil.cc - "ti" now negotiates for all known storage SOP classes. Affects: imagectn/apps/tinet.cc **** Changes from 1998.10.20 (eichelberg) - Added FAQ entry about DCMTK on Unixware. Based on a contribution by Wolfgang Rapp . Affects: FAQ - Closed some memory leaks in dcmdata and dcmnet libraries. Affects: dcmdata/libsrc/dcstream.cc dcmnet/libsrc/dimse.cc dcmnet/libsrc/dulfsm.cc dcmnet/apps/storescu.cc **** Changes from 1998.09.03 (eichelberg) - The Worklist SCP now supports all Type 1 and 2 attributes defined in the Modality Worklist Service Class as return keys. Contributed by Heinz Blendinger . Affects: wlistctn/libsrc/wrklstdb.cc - Introduced two new command line options in writwlst: +o overwrite dcmfile-out if existing (default) -o update dcmfile-out if existing With "-o", writwlst attempts to read an existing worklist file and only replaces the changed attributes and leaves all others unchanged. Contributed by Heinz Blendinger . Affects: wlistctn/wwwapps/writwlst.cc **** Changes from 1998.08.10 (eichelberg) - renamed member variable in DIMSE structures from "Status" to "DimseStatus". This is required if dcmnet is used together with where Status is #define'd as int. Affects: dcmnet/apps/findscu.cc dcmnet/apps/movescu.cc dcmnet/apps/storescp.cc dcmnet/include/dimse.h dcmnet/libsrc/ dcmnet/libsrc/dimcmd.cc dcmnet/libsrc/dimdump.cc dcmnet/libsrc/dimecho.cc dcmnet/libsrc/dimfind.cc dcmnet/libsrc/dimmove.cc dcmnet/libsrc/dimstore.cc imagectn/apps/scefind.cc imagectn/apps/scemove.cc imagectn/apps/scestore.cc imagectn/apps/tinet.cc imagectn/libsrc/dbindex.cc imagectn/libsrc/dbutils.cc wlistctn/apps/scefind.cc **** Changes from 1998.07.28 (eichelberg) - Modified two retired (ACR-NEMA) entries in the data dictionary, according to a posting in comp.protocol.dicom. Thanks to David Clunie and Sacha Helbig for the information. Affects: dcmdata/libsrc/dcdictzz.cc dcmdata/libsrc/dicom.dic dcmdata/include/dcdeftag.h **** Changes from 1998.07.28 (eichelberg) - Reworked the DICOM dictionary. The first part now reflects the 1996 DICOM publication. Updated all Supplements to reflect July 1998 state. Affects: dcmdata/libsrc/dcdictzz.cc dcmdata/libsrc/dicom.dic dcmdata/include/dcdeftag.h - Introduced new compilation flag PRINT_REPLACED_DICTIONARY_ENTRIES which causes the dictionary to display all duplicate entries. Affects: dcmdata/libsrc/dcdict.cc dcmdata/libsrc/dchashdi.cc - Corrected typo in mkdeftag. Affects: dcmdata/libsrc/mkdeftag.cc **** Changes from 1998.07.24 (eichelberg) - Added FAQ entry about imagectn storing all incoming images in /tmp instead of the directory specified in configrc. Affects: FAQ - Intoduced a Makefile variable $(LIBEXT) which defines the file name extension used for libraries ("a" or "so"). This allows to build DCMTK with shared libraries without changing all Makefiles. Added FAQ entry describing how to build shared objects with gcc. Affects: FAQ config/Makefile.def.in config/configure config/configure.in config/templates/Makefile.lib ctndisp/libsrc/Makefile.in dcmdata/libsrc/Makefile.in dcmnet/libsrc/Makefile.in imagectn/libsrc/Makefile.in ofstd/libsrc/Makefile.in wlistctn/libsrc/Makefile.in - Minor changes to avoid compiler warnings (gcc 2.8.1 with additional options), e.g. add copy constructors. Affects: wlistctn/apps/wlistctn.cc wlistctn/apps/wlistctn.h wlistctn/wwwapps/writwlst.cc - changed WorklistDB::nextFindResponse() parameters in order to avoid the use of an implicit assignment operator for class DcmDataset. Required for some IRIX and Unixware compilers. Affects: wlistctn/apps/scefind.cc wlistctn/include/wrklstdb.h wlistctn/libsrc/wrklstdb.cc wlistctn/tests/wltest.cc - changed ti's signal handler parameters from (int) to (...) to avoid a warning on IRIX 5.3 using SGI C++ 4.0. Affects: imagectn/apps/ti.cc **** Changes from 1998.07.15 (riesmeier) - Updated data dictionary: replaced 'ReportDetailSequence' by 'RequestDetailSequence'. Affects: dcmdata/libsrc/dicom.dic Rebuilt: dcmdata/include/dcdeftag.h dcmdata/libsrc/dcdictzz.cc - Including of to support getlogin() on NeXTSTEP. Replaced tabs by spaces. Added const to char pointer to avoid warnings (gcc 2.8.1 with additional options). Affects: dcmdata/libsrc/mkdeftag.cc - Including of to support getlogin() on NeXTSTEP. Replaced tabs by spaces. Affects: dcmdata/libsrc/mkdictbi.cc - Removed several compiler warnings reported by gcc 2.8.1 with additional options, e.g. missing copy constructors and assignment operators, initialization of member variables in the body of a constructor instead of the member initialization list, hiding of methods by use of identical names, uninitialized member variables, missing const declaration of char pointers. Replaced tabs by spaces. Affects: dcmdata/include/dcbuf.h dcmdata/include/dccodec.h dcmdata/include/dcdicdir.h dcmdata/include/dcdicent.h dcmdata/include/dcdict.h dcmdata/include/dcdirrec.h dcmdata/include/dcelem.h dcmdata/include/dchashdi.h dcmdata/include/dcitem.h dcmdata/include/dclist.h dcmdata/include/dcobject.h dcmdata/include/dcpixel.h dcmdata/include/dcpixseq.h dcmdata/include/dcsequen.h dcmdata/include/dcstack.h dcmdata/include/dcstream.h dcmdata/include/dctag.h dcmdata/include/dctagkey.h dcmdata/include/dcvr.h dcmdata/include/dcvrulup.h dcmdata/include/dcxfer.h dcmdata/libsrc/dcbuf.cc dcmdata/libsrc/dcbytstr.cc dcmdata/libsrc/dcdatset.cc dcmdata/libsrc/dcdicdir.cc dcmdata/libsrc/dcdicent.cc dcmdata/libsrc/dcdict.cc dcmdata/libsrc/dcdirrec.cc dcmdata/libsrc/dcelem.cc dcmdata/libsrc/dcfilefo.cc dcmdata/libsrc/dchashdi.cc dcmdata/libsrc/dcitem.cc dcmdata/libsrc/dclist.cc dcmdata/libsrc/dcmetinf.cc dcmdata/libsrc/dcobject.cc dcmdata/libsrc/dcpixel.cc dcmdata/libsrc/dcpixseq.cc dcmdata/libsrc/dcsequen.cc dcmdata/libsrc/dcstack.cc dcmdata/libsrc/dcstream.cc dcmdata/libsrc/dctag.cc dcmdata/libsrc/dcvr.cc dcmdata/libsrc/dcvrpobw.cc dcmdata/libsrc/dcvrulup.cc dcmdata/libsrc/dcxfer.cc - Removed compiler warnings reported by gcc 2.8.1 with additional options, e.g. missing const declaration of char pointers. Replaced tabs by spaces. Affects: dcmdata/apps/dcmgpdir.cc **** Changes from 1998.07.15 (eichelberg) - Fixed bug in DIMSE_sendMessage() that could result in an undefined error condition passed back to the caller when an attempt was made to send a DIMSE message without appropriate presentation context. Thanks to Gilles Mevel for the report. Affects: dcmnet/libsrc/dimse.cc **** Changes from 1998.07.02 (riesmeier) - Minor changes to avoid compiler warnings (gcc 2.8.1 with additional options), e.g. add copy constructors. Affects: ofstd/include/ofstack.h **** Changes from 1998.06.29 (eichelberg) - Some code purifications to avoid gcc 2.8.1 -Weffc++ warnings. Affects: ofstd/include/oflist.h ofstd/libsrc/oflist.cc **** Changes from 1998.06.29 (eichelberg) - Updated FAQ with information about how to compile DCMTK on HP-UX 10 with the HP C++ compiler. Affects: FAQ - Updated status of Supplement 15 (Visible Light) to reflect version 1.1a (Draft Standard for Trial Use). Thanks to Andrew Hewett for submitting the update. Affects: dcmdata/include/dcdeftag.h dcmdata/libsrc/dcdictzz.cc dcmdata/libsrc/dicom.dic - Removed some name clashes (e.g. local variable with same name as class member) to improve maintainability. Applied some code purifications proposed by the gcc 2.8.1 -Weffc++ option. Affects: ofstd/include/oflist.h ofstd/libsrc/ofstring.cc dcmnet/include/cond.h dcmnet/include/dimse.h dcmnet/include/dul.h dcmnet/libsrc/asccond.cc dcmnet/libsrc/assoc.cc dcmnet/libsrc/cond.cc dcmnet/libsrc/dimcond.cc dcmnet/libsrc/dimcond.h dcmnet/libsrc/dul.cc dcmnet/libsrc/dulcond.cc dcmnet/libsrc/dulfsm.cc dcmnet/libsrc/lstcond.cc dcmdata/libsrc/dcdicdir.cc dcmdata/libsrc/dcdirrec.cc dcmdata/libsrc/dchashdi.cc - Rebuilt Makefile dependencies. Affects: ctndisp/apps/Makefile.dep dcmdata/apps/Makefile.dep dcmdata/libsrc/Makefile.dep dcmnet/libsrc/Makefile.dep wlistctn/apps/Makefile.dep wlistctn/libsrc/Makefile.dep wlistctn/tests/Makefile.dep wlistctn/wwwapps/Makefile.dep **** Changes from 1998.05.22 (eichelberg) - Corrected two memory leaks in the ti application. Thanks to Alexander Sahler for the report. Affects: imagectn/apps/tiquery.cc **** Changes from 1998.05.14 (eichelberg) - Updated ofstd Makefile. "make install" without prior "make all" now works for the complete dcmtk. Affects: ofstd/Makefile.in **** Changes from 1998.04.02 (riesmeier) - Corrected bug in command line parser of storescu. Affects: dcmnet/apps/storescu.cc **** Changes from 1998.03.25 (eichelberg) - Corrected bug in DcmFileStream::UnsetPutbackMark. This bug caused dcmdata to choke on files with metaheader where the value of (0002,0010) TransferSyntaxUID was none of the supported UIDs, because interpretation of the dataset started in the wrong file position. Affects: dcmdata/libsrc/dcstream.cc **** Changes from 1998.02.27 (hewett) - Added missing attribute to data dictionary (DistanceSourceToEntrance from Supplement 17 Modality Performed Procedure Step). Affects: dcmdata/libsrc/dicom.dic Rebuilt: dcmdata/include/dcdeftag.h dcmdata/libsrc/dcdictzz.cc **** Changes from 1998.02.25 (hewett) - Updated documentation to reflect the new SOP Class UIDs and SOP Class Names defined by Supplement 24 (Stored Print Related SOP Classes). Affects: dcmnet/docs/storescu.txt dcmnet/docs/storescp.txt imagectn/docs/imagectn.txt - Updated status of supplements 17 & 22 to reflect their Final Text status Affects: dcmdata/libsrc/dicom.dic dcmdata/include/dcuid.h - Updated data dictionary and UID information to reflect changes in Supplement 24 (Stored Print Related SOP Classes). Some data dictionary attibutes and UIDs have changed between the Letter Ballot version and the Final Text version. Affects: dcmdata/libsrc/dicom.dic dcmdata/include/dcuid.h dcmdata/libsrc/dcuid.cc dcmnet/libsrc/diutil.cc Rebuilt: dcmdata/include/dcdeftag.h dcmdata/libsrc/dcdictzz.cc dcmtk-3.6.0/docs/ANNOUNCE.3420000644000310500011400000000461607231270711014436 0ustar joergrdicom3 ANNOUNCEMENT Version 3.4.2 of the OFFIS DCMTK (DICOM ToolKit) software is now available for public release. This release includes the following main changes over the previous version (Version 3.4.1): - The DICOM data dictionary has been re-worked based on the 2000 edition of the DICOM standard, the latest supplements and correction proposals. - Support for the "DICOM Security Enhancements One" has been implemented: The storescu and storescp tools now support DICOM network transmission "tunneled" through a secure TLSv1 transport connection. DCMTK relies on the OpenSSL toolkit (www.openssl.org) for the underlying cryptographic routines and the TLS protocol implementation. - An implementation of a DICOM Basic Grayscale Print Management SCP supporting the Presentation LUT SOP Class has been added to the dcmpstat module. The Print SCP stores incoming print jobs as a set of Stored Print and Hardcopy Grayscale Image objects. - A checking tool for Grayscale Softcopy Presentation States has been added. This tool allows to check presentation states for syntactical correctness and completeness. - Experimental support for multi-threaded applications has been added for the ofstd, dcmdata and dcmimgle modules (i.e. the class libraries that handle DICOM data in memory and on disk and the library that processes DICOM images.) - Extended logging routines for debugging A-ASSOCIATE PDUs and DIMSE command sets have been added to the dcmnet module. - DCMTK 3.4.2 compiles "out of the box" on FreeBSD 4.1.1. - Many bug fixes and minor improvements as usual - See the dcmtk/CHANGES file for more details. Many people have contributed to this new release of DCMTK, appearing here in alphabetical order. Thank you very much for your support! Andreas Barth Mohamed Ahmed Abd Elkader Alexander Haderer Bernd Kuemmerlen Gilles Mevel Sebastian Meyer Dimitri Papadopoulos-Orfanos Andreas Thiel OFFIS staff who have worked on this release are: Marco Eichelberg Joerg Riesmeier The DCMTK software can be downloaded via: http://www.offis.de/projekte/dicom/ Kuratorium OFFIS e.V., Oldenburg, Germany, 2000-12-20 dcmtk-3.6.0/docs/CHANGES.3420000644000310500011400000025361307231270712014304 0ustar joergrdicom3 Release 3.4.2 (Public Release - 2000-12-20) - Updated Version Number and Implementation Version Name to reflect the current public release (3.4.2) Affects: dcmdata/include/dcuid.h - Updated documentation to reflect changes in 3.4.2 Affects: INSTALL Added: ANNOUNCE.342 **** Changes from 2000.12.20 (riesmeier) - Updated documentation (minor changes). Affects: config/systems/win32/README ANNOUNCE.342 INSTALL FAQ **** Changes from 2000.12.20 (eichelberg) - Renamed CHANGES to CHANGES.342. Removed: CHANGES Added: CHANGES.342 - Updated README to mention dcmtls module. Affects: README - Updated documentation on TLS ciphers available in OpenSSL. Affects: dcmtls/docs/ciphers.txt - Updated ti documentation. Affects: imagectn/docs/ti.txt - Fixed remaining problems with configure on FreeBSD. Affects: config/aclocal.m4 config/configure - Moved old CHANGES and ANNOUNCE files to docs subdirectory. Added: docs/ANNOUNCE.310 docs/ANNOUNCE.311 docs/ANNOUNCE.312 docs/ANNOUNCE.320 docs/ANNOUNCE.321 docs/ANNOUNCE.330 docs/ANNOUNCE.331 docs/ANNOUNCE.340 docs/ANNOUNCE.341 docs/CHANGES.301 docs/CHANGES.302 docs/CHANGES.310 docs/CHANGES.311 docs/CHANGES.312 docs/CHANGES.320 docs/CHANGES.321 docs/CHANGES.330 docs/CHANGES.331 docs/CHANGES.340 docs/CHANGES.341 Removed: ANNOUNCE CHANGES.301 CHANGES.302 CHANGES.310 CHANGES.311 CHANGES.312 CHANGES.320 CHANGES.321 CHANGES.330 CHANGES.331 CHANGES.340 CHANGES.341 **** Changes from 2000.12.19 (riesmeier) - Added #include statement to keep gcc 2.5.8 (NeXTSTEP) quiet. Affects: dcmpstat/apps/Makefile.dep dcmpstat/libsrc/Makefile.dep dcmpstat/libsrc/dvpshlp.cc **** Changes from 2000.12.19 (eichelberg) - Renamed typedef T_UID which leads to name clash with system macro on OSF/1. Affects: dcmnet/libsrc/assoc.cc - Updated configure for the FreeBSD Posix implementation which requires a special gcc option -pthread to cause linking with libc_r instead of libc. Affects: config/acconfig.h config/aclocal.m4 config/configure config/configure.in config/include/cfwin32.h config/include/config.h.in - Added test for a strncasecmp prototype in , missing on Ultrix and SunOS 4.1.x. Affects: dcmpstat/libsrc/dvpscf.cc - Inclusion of TCP header files now protected by extern "C", needed on Ultrix. Affects: dcmpstat/libsrc/dvpsmsg.cc - Thread related classes now correctly disabled when configured with --disable-threads. Affects: ofstd/libsrc/ofthread.cc - Updated tlstrans for Irix 5 compatibility issues. Affects: dcmtls/libsrc/tlstrans.cc **** Changes from 2000.12.18 (riesmeier) - Updated Visual C++ project files. Affects: config/systems/win32/msvc5.zip **** Changes from 2000.12.15 (eichelberg) - Added two new FAQ entries Affects: FAQ - Updated installation instructions for OpenSSL support Affects: INSTALL - Updated root level configure to correctly display configure --help options. Affects: config/rootconf - Declared qsort() and signal() callback functions as extern "C", avoids warnings on Sun C++ 5.x compiler. Thanks to Dimitri Papadopoulos-Orfanos for the report. Affects: dcmnet/libsrc/dul.cc imagectn/apps/ti.cc imagectn/apps/tiquery.cc imagectn/include/dbpriv.h imagectn/libsrc/dbstore.cc imagectn/libsrc/dbutils.cc wlistctn/libsrc/wrklstdb.cc - Global flag to enable/disable workaround code for some buggy Store SCUs in DIMSE_storeProvider(). If enabled, an illegal space-padding in the Affected SOP Instance UID field of the C-STORE-RQ message is retained in the corresponding C-STORE-RSP message. Thanks to Gilles Mevel for the problem report and workaround suggestion. Affects: dcmnet/libsrc/storescp.cc dcmnet/include/dimse.h dcmnet/libsrc/dimcmd.cc dcmnet/libsrc/dimstore.cc - Rebuild Makefile dependencies Affects: */*/Makefile.dep - Updated Visual C++ project files Affects: config/systems/win32/msvc5.zip **** Changes from 2000.12.14 (riesmeier) - Updated SOP Class and Transfer Syntax UIDs for 2000 edition of the DICOM standard. Affects: dcmdata/include/dcuid.h dcmdata/libsrc/dcuid.cc dcmnet/docs/movescu.txt dcmnet/docs/storescp.txt dcmnet/docs/storescu.txt imagectn/docs/imagectn.txt - Updated for 2000 edition of the DICOM standard (added: SR, PR, WV, SP, RT). Affects: dcmdata/apps/dcmgpdir.cc dcmdata/docs/dcmgpdir.txt dcmdata/include/dcdirrec.h dcmdata/libsrc/dcdirrec.cc - Ignore modality LUT transform for XA and XRF images (report message on that in verbose mode). Affects: dcmimgle/libsrc/Makefile.dep dcmimgle/libsrc/dimomod.cc **** Changes from 2000.12.13 (riesmeier) - Added explicit typecast to keep gcc 2.5.8 (NeXTSTEP) quiet. Affects: dcmpstat/libsrc/dviface.cc - Introduced dummy parameter for "default" constructor of class OFConsole to "convince" linker of gcc 2.5.8 (NeXTSTEP) to allocate memory for global variable 'ofConsole'. Affects: ofstd/include/ofconsol.h ofstd/libsrc/ofconsol.cc **** Changes from 2000.12.13 (eichelberg) - Introduced configure test for -lm which is not present on all platforms but required on some. Affects: config/Makefile.def.in config/configure config/configure.in dcmimgle/apps/Makefile.in dcmpstat/apps/Makefile.in dcmtls/apps/Makefile.in - Including dcompat.h, needed on MacOS X Affects: dcmpstat/apps/dcmprscu.cc - Removed unused local variables Affects: dcmpstat/libsrc/dviface.cc **** Changes from 2000.12.12 (eichelberg) - Minor changes to keep gcc 2.7.x on SunOS 4.1.3 happy Affects: dcmnet/libsrc/dcmtrans.cc dcmnet/libsrc/dul.cc dcmnet/apps/dcmmklut.cc dcmnet/libsrc/dvpsmsg.cc dcmnet/tests/msgserv.cc dcmsign/libsrc/dcmsign.cc imagectn/apps/tiui.cc - Added documentation for Pseudo Random Number Generator Daemon (PRNGD) Affects: dcmtls/docs/randseed.txt **** Changes from 2000.12.12 (riesmeier) - Replaced #ifdef HAVE_WINDOWS_H by _WIN32 to allow Cygwin 1.1.x to compile with Posix threads. Affects: dcmdata/libsrc/dcuid.cc - Renamed method to avoid ambiguity reported by gcc 2.7. Affects: dcmsr/include/dsrtlist.h - Added explicit typecast to keep gcc 2.7 quiet. Affects: dcmsr/libsrc/dsrtypes.cc - Changed type of stream 'open_mode' from long to int to avoid compiler warnings reported by SunCC 2.0.1. Affects: ofstd/include/oflogfil.h ofstd/libsrc/oflogfil.cc - Added explicit typecast to keep SunCC 2.0.1 quiet. Affects: dcmsr/libsrc/dsrdoc.cc - Added '#include ' to avoid problems with gcc 2.5.8 on NeXTSTEP 3.x systems. Affects: imagectn/apps/imagectn.cc wlistctn/apps/wlistctn.cc **** Changes from 2000.12.11 (riesmeier) - Added explicit typecast to keep SunCC 2.0.1 quiet. Affects: imagectn/apps/imagectn.cc dcmpstat/apps/dcmmklut.cc - Added library 'ofstd' to link command line tools with SunCC 2.0.1. Affects: ctndisp/apps/Makefile.in - Removed name of (conditionally) unused method parameters to avoid compiler warnings (SunCC 2.0.1). Affects: dcmpstat/libsrc/dviface.cc **** Changes from 2000.12.08 (riesmeier) - Separated module dcmsr from dcmpstat (use #define WITH_DCMSR to re-include it - probably also requires modification of makefiles). Affects: dcmpstat/apps/Makefile.dep dcmpstat/apps/Makefile.in dcmpstat/libsrc/Makefile.dep dcmpstat/libsrc/dviface.cc config/modules - Renamed createNewSeries(studyUID) to createNewSeriesInStudy(studyUID). Affects: dcmsr/include/dsrdoc.h dcmsr/libsrc/dsrdoc.cc dcmsr/tests/mkreport.cc - Removed optional fractional second part from time value. Affects: dcmsr/include/dsrtypes.h dcmsr/libsrc/dsrtypes.cc - Reworked codes used for sample SR documents. Affects: dcmsr/tests/mkreport.cc - Rebuilt makefile dependencies. Affects: dcmimgle/libsrc/Makefile.dep - Replaced empty code lines (";") by empty command blocks ("{}") to avoid compiler warnings reported by MSVC6. Affects: dcmsr/apps/dsr2html.cc **** Changes from 2000.11.23 (riesmeier) - Added new command line option to dbregimg allowing to specify whether instance reviewed status of newly registered objects should be set to 'new' or 'not new'. Affects: imagectn/include/dbstore.h imagectn/include/imagedb.h imagectn/libsrc/dbstore.cc imagectn/tests/dbregimg.cc **** Changes from 2000.11.23 (eichelberg) - Silently correct negative pixel aspect ratio or pixel spacing values Affects: dcmpstat/libsrc/dvpsda.cc **** Changes from 2000.11.21 (riesmeier) - Added sample CSS file (W3C CSS version 1.0) to be used with dsr2html. Added: dcmsr/apps/report.css **** Changes from 2000.11.20 (riesmeier) - Fixed minor bugs (string related memory problems when used with JNI). Affects: dcmpstat/libsrc/dviface.cc dcmsr/libstc/dsrcitem.cc **** Changes from 2000.11.17 (riesmeier) - Added new sample reports. Create reports in the same study as the corresponding image (if applicable). Affects: dcmsr/tests/mkreport.cc **** Changes from 2000.11.16 (riesmeier) - Added definition of InstanceCreatorUID. Affects: dcmdata/include/dcuid.h - Corrected behaviour of updateDicomAttributes(). Affects: dcmsr/include/dsrdoc.h dcmsr/libsrc/dsrdoc.cc - Fixed bug in dicomToReadablePersonName(). Affects: dcmsr/libsrc/dsrtypes.cc **** Changes from 2000.11.16 (eichelberg) - Updated DICOMscope config file for RSNA 2000 scenario Affects: dcmpstat/tests/test.cfg **** Changes from 2000.11.14 (eichelberg) - Fixed two problems with dcmpsrcv which caused the application not to terminate if the IPC server could not be found or not to start another receiver when run on Win32 platforms. Affects: dcmpstat/apps/dcmpsrcv.cc - Imagectn was always invoked in debug mode from class DVInterface on Unix platforms. Fixed. Affects: dcmpstat/libsrc/dviface.cc - Fixed system include files for Linux. Affects: dcmpstat/libsrc/dvpsmsg.cc - Added Perl script that simplifies creation of a Certification Authority, private keys and X.509 certificates with OpenSSL for use with DCMTK. Added: dcmpstat/tests/dcmtk_ca.pl - Fixed make install for module dcmtls Affects: dcmpstat/apps/Makefile.in - Updated dcmpstat/jni Makefiles for Unix systems Affects: dcmpstat/jni/Makefile.in dcmpstat/jni/Makefile.dep - Renamed callback functions to avoid linker name clashes Affects: dcmtls/libsrc/tlslayer.cc dcmsign/libsrc/siprivat.cc **** Changes from 2000.11.14 (riesmeier) - Added output of optional observation datetime to rendered HTML page. Affects: dcmsr/libsrc/dsrdoctn.cc - Added study/series description to test reports. Affects: dcmsr/tests/mkreport.cc - Corrected behaviour of method createRevisedVersion(). Affects: dcmsr/include/dsrdoc.h dcmsr/libsrc/dsrdoc.cc - Added new sample report (taken from RSNA '95 demo). Affects: dcmsr/tests/mkreport.cc - Added creation of new UIDs and setting of content date/time when starting a new SR document from a "template". Affects: dcmpstat/include/dviface.h dcmpstat/libsrc/dviface.cc - Added methods to set the content date/time. Affects: dcmsr/include/dsrdoc.h dcmsr/libsrc/dsrdoc.cc - Added method to remove verification information. Affects: dcmsr/include/dsrdoc.h dcmsr/libsrc/dsrdoc.cc **** Changes from 2000.11.13 (eichelberg) - Added support for user logins and certificates. Affects: dcmpstat/apps/Makefile.dep dcmpstat/apps/Makefile.in dcmpstat/include/dviface.h dcmpstat/include/dvpscf.h dcmpstat/libsrc/dviface.cc dcmpstat/libsrc/dvpscf.cc dcmpstat/tests/test.cfg - Added dcmpstat support methods for creating image references in SR documents. Affects: dcmpstat/apps/dcmp2pgm.cc dcmpstat/apps/dcmpsmk.cc dcmpstat/include/dviface.h dcmpstat/include/dvpstat.h dcmpstat/libsrc/dviface.cc dcmpstat/libsrc/dvpstat.cc **** Changes from 2000.11.13 (riesmeier) - Added output of optional observation datetime to rendered HTML page. Affects: dcmsr/include/dsrdoc.h dcmsr/include/dsrdoctn.h dcmsr/libsrc/dsrdoc.cc dcmsr/libsrc/dsrdoctn.cc - Added support for Structured Reporting "templates". Affects: dcmpstat/include/dviface.h dcmpstat/include/dvpscf.h dcmpstat/include/dvpsdef.h dcmpstat/libsrc/dviface.cc dcmpstat/libsrc/dvpscf.cc dcmtk/dcmpstat/tests/test.cfg - Updated comments. Affects: dcmsr/include/dsrcitem.h dcmsr/include/dsrdoc.h dcmsr/libsrc/dsrdoc.cc dcmpstat/include/dvpscf.h - Added missing #include. Affects: dcmpstat/apps/dcmpsrcv.cc **** Changes from 2000.11.10 (riesmeier) - Added new methods to set the completion flag description, create new study/ series UIDs. Added missing type 2 sequence to dataset. Corrected wrong format of predecessor documents sequence. Changed behaviour of completion/verification flags. Improved HTML and print/dump output. Affects: dcmsr/include/dsrdoc.h dcmsr/libsrc/dsrdoc.cc - Added missing type 1 attribute. Affects: dcmsr/tests/pstate07.dcm - Enhanced instance description for structured reports. Affects: imagectn/libsrc/dbstore.cc - Corrected behaviour of createNewSOPInstance() and createRevisedDocument(). Affects: dcmsr/include/dsrdoc.h dcmsr/libsrc/dsrdoc.cc **** Changes from 2000.11.10 (eichelberg) - Fixed problem with DICOMscope being unable to shut down receiver processes that are operating with TLS encryption by adding a special shutdown mode to dcmpsrcv. Affects: dcmpstat/apps/dcmpsrcv.cc dcmpstat/libsrc/dviface.cc - Fixed problem with DIMSE routines which attempted to delete /dev/null under certain circumstances, which could lead to disastrous results if tools were run with root permissions (what they shouldn't). Affects: dcmnet/apps/movescu.cc dcmnet/apps/storescp.cc dcmnet/include/dcompat.h dcmnet/libsrc/dimstore.cc imagectn/apps/scestore.cc - Mixed up strcmp and strcpy - oops. Affects: dcmnet/apps/movescu.cc dcmnet/apps/storescp.cc dcmnet/libsrc/dimstore.cc - Fixed problem with imagectn running out of available file names after receipt of 1024 files with similar SOP instance UIDs. Affects: imagectn/libsrc/dbutils.cc **** Changes from 2000.11.09 (eichelberg) - Updated documentation. Affects: dcmnet/docs/storescp.txt dcmnet/docs/storescu.txt dcmpstat/docs/dcmmklut.txt dcmpstat/docs/dcmprscp.txt dcmpstat/docs/dcmprscu.txt Added: dcmtls/docs/randseed.txt **** Changes from 2000.11.09 (riesmeier) - Minor HTML code purifications. Affects: dcmsr/libsrc/dsrcontn.cc dcmsr/libsrc/dsrdoctn.cc dcmsr/libsrc/dsrtypes.cc - Reordered renderHTML flags (internal flags to the end). Affects: dcmsr/include/dsrtypes.h dcmsr/libsrc/dsrtypes.cc - Added documentation for new command line tools. Added: dcmsr/docs/dsr2html.txt dcmsr/docs/dsr2xml.txt dcmsr/docs/dsrdump.txt - Updated documentation. Affects: dcmimgle/docs/dconvlum.txt - Corrected typo. Affects: dcmsr/apps/dsr2xml.cc dcmsign/apps/dcmsign.cc - Added support for non-ASCII characters in HTML 3.2 (use numeric value). Affects: dcmsr/include/dsrcodvl.h dcmsr/include/dsrdoc.h dcmsr/include/dsrtncsr.h dcmsr/include/dsrtypes.h dcmsr/include/dsrcodtn.cc dcmsr/include/dsrcodvl.cc dcmsr/include/dsrcontn.cc dcmsr/include/dsrdoc.cc dcmsr/include/dsrdoctn.cc dcmsr/include/dsrnumvl.cc dcmsr/include/dsrpnmtn.cc dcmsr/include/dsrstrvl.cc dcmsr/include/dsrtextn.cc dcmsr/include/dsrtypes.cc - Added new command line options (document type and HTML version). Affects: dcmsr/apps/dsr2html.cc dcmsr/docs/dsr2html.txt - Added new sample reports (and supporting DICOM files). Added: dcmsr/tests/image06.dcm dcmsr/tests/image07.dcm dcmsr/tests/pstate07.dcm Affects: dcmsr/tests/mkreport.cc **** Changes from 2000.11.08 (eichelberg) - Fixed trailing garbage characters problem in extracting validity information from a X.509 certificate. Affects: dcmsign/libsrc/sicert.cc dcmtls/libsrc/tlslayer.cc - Fixed dcmsign command line options Affects: dcmsign/apps/dcmsign.cc - Updated dcmpstat IPC protocol for additional message parameters Affects: dcmpstat/apps/dcmpsrcv.cc dcmpstat/apps/dcmpssnd.cc dcmpstat/include/dvpsmsg.h dcmpstat/libsrc/dvpsmsg.cc dcmpstat/tests/msgserv.cc **** Changes from 2000.11.07 (riesmeier) - Minor code purifications to keep Sun CC 2.0.1 quiet. Affects: dcmsign/apps/dcmsign.cc dcmsign/libsrc/dcmsign.cc dcmsign/libsrc/siautopr.cc dcmsign/libsrc/sicreapr.cc dcmsign/libsrc/sidsa.cc dcmsign/libsrc/simaccon.cc dcmsign/libsrc/sirsa.cc - Moved #ifdef WITH_OPENSSL statement to avoid compiler errors. Affects: dcmsign/apps/dcmsign.cc - Added new command line option allowing to choose code value or meaning to be rendered as the numeric measurement unit. Affects: dcmsr/apps/dsr2html.cc dcmsr/include/dsrtypes.h dcmsr/libsrc/dsrtypes.cc - Enhanced support for by-reference relationships. Affects: dcmsr/include/dsrcitem.h dcmsr/include/dsrcodtn.h dcmsr/include/dsrcomtn.h dcmsr/include/dsrcontn.h dcmsr/include/dsrdattn.h dcmsr/include/dsrdoctn.h dcmsr/include/dsrdoctr.h dcmsr/include/dsrdtitn.h dcmsr/include/dsrimgtn.h dcmsr/include/dsrnumtn.h dcmsr/include/dsrpnmtn.h dcmsr/include/dsrreftn.h dcmsr/include/dsrscotn.h dcmsr/include/dsrtcotn.h dcmsr/include/dsrtextn.h dcmsr/include/dsrtimtn.h dcmsr/include/dsrtncsr.h dcmsr/include/dsruidtn.h dcmsr/include/dsrwavtn.h dcmsr/libsrc/Makefile.dep dcmsr/libsrc/dsrcitem.cc dcmsr/libsrc/dsrcodtn.cc dcmsr/libsrc/dsrcomtn.cc dcmsr/libsrc/dsrcontn.cc dcmsr/libsrc/dsrdattn.cc dcmsr/libsrc/dsrdoctn.cc dcmsr/libsrc/dsrdoctr.cc dcmsr/libsrc/dsrdtitn.cc dcmsr/libsrc/dsrimgtn.cc dcmsr/libsrc/dsrnumtn.cc dcmsr/libsrc/dsrnumvl.cc dcmsr/libsrc/dsrpnmtn.cc dcmsr/libsrc/dsrreftn.cc dcmsr/libsrc/dsrscotn.cc dcmsr/libsrc/dsrtcotn.cc dcmsr/libsrc/dsrtextn.cc dcmsr/libsrc/dsrtimtn.cc dcmsr/libsrc/dsrtree.cc dcmsr/libsrc/dsruidtn.cc dcmsr/libsrc/dsrwavtn.cc - Enhanced rendered HTML output of date, time, datetime and pname. Affects: dcmsr/include/dsrdoc.h dcmsr/libsrc/dsrtypes.cc dcmsr/libsrc/dsrdoc.cc dcmsr/libsrc/dsrdattn.cc dcmsr/libsrc/dsrdtitn.cc dcmsr/libsrc/dsrpnmtn.cc dcmsr/libsrc/dsrtimtn.cc dcmsr/libsrc/dsrtypes.cc dcmsr/tests/mkreport.cc - Moved some protected method to public part. Affects: dcmsr/libsrc/dsrtncsr.cc - Added useful code for debugging with dmalloc. Affects: dcmsr/apps/dsrdump.cc **** Changes from 2000.11.07 (eichelberg) - Updated DICOM dictionary for Draft 0.7 of Supplement 41 (Digital Signatures) Affects: dcmdata/include/dcdeftag.h dcmdata/libsrc/dcdictzz.cc dcmdata/libsrc/dicom.dic - Initial release of dcmsign module for DICOM Digital Signatures Affects: config/modules dcmdata/include/dcbytstr.h dcmdata/include/dcdatset.h dcmdata/include/dcelem.h dcmdata/include/dcitem.h dcmdata/include/dcobject.h dcmdata/include/dcpixel.h dcmdata/include/dcpixseq.h dcmdata/include/dcsequen.h dcmdata/include/dctagkey.h dcmdata/include/dcvrobow.h dcmdata/include/dcvrpobw.h dcmdata/libsrc/dcbytstr.cc dcmdata/libsrc/dcdatset.cc dcmdata/libsrc/dcelem.cc dcmdata/libsrc/dcitem.cc dcmdata/libsrc/dcpixel.cc dcmdata/libsrc/dcpixseq.cc dcmdata/libsrc/dcsequen.cc dcmdata/libsrc/dctagkey.cc dcmdata/libsrc/dcvrobow.cc dcmdata/libsrc/dcvrpobw.cc Added: dcmsign/apps/Makefile.in dcmsign/apps/configure dcmsign/apps/Makefile.dep dcmsign/apps/Makefile.in dcmsign/apps/dcmsign.cc dcmsign/docs/Makefile.in dcmsign/docs/dcmsign.txt dcmsign/htmldocs/Makefile.in dcmsign/include/Makefile.in dcmsign/include/dcmsign.h dcmsign/include/sialgo.h dcmsign/include/siautopr.h dcmsign/include/sicert.h dcmsign/include/sicreapr.h dcmsign/include/sidsa.h dcmsign/include/simac.h dcmsign/include/simaccon.h dcmsign/include/simd5.h dcmsign/include/sinullpr.h dcmsign/include/siprivat.h dcmsign/include/siripemd.h dcmsign/include/sirsa.h dcmsign/include/sisha1.h dcmsign/include/sisprof.h dcmsign/include/sitstamp.h dcmsign/include/sitypes.h dcmsign/libsrc/Makefile.dep dcmsign/libsrc/Makefile.in dcmsign/libsrc/dcmsign.cc dcmsign/libsrc/siautopr.cc dcmsign/libsrc/sicert.cc dcmsign/libsrc/sicreapr.cc dcmsign/libsrc/sidsa.cc dcmsign/libsrc/simaccon.cc dcmsign/libsrc/simd5.cc dcmsign/libsrc/sinullpr.cc dcmsign/libsrc/siprivat.cc dcmsign/libsrc/siripemd.cc dcmsign/libsrc/sirsa.cc dcmsign/libsrc/sisha1.cc dcmsign/libsrc/sisprof.cc dcmsign/libsrc/sitypes.cc **** Changes from 2000.11.06 (riesmeier) - Changes structure of HTML hyperlinks to composite objects (now using pseudo CGI script). Affects: dcmsr/include/dsrtypes.h dcmsr/libsrc/dsrcomvl.cc dcmsr/libsrc/dsrimgvl.cc dcmsr/libsrc/dsrwavvl.cc - Updated comments/formatting. Affects: dcmsr/include/dsrcodvl.h - Added parameter to print() method specifying the item separator character. Affects: dcmsr/include/dsrimgfr.h dcmsr/include/dsrscogr.h dcmsr/include/dsrtcodt.h dcmsr/include/dsrtcosp.h dcmsr/include/dsrtcoto.h dcmsr/include/dsrwavch.h dcmsr/libsrc/dsrimgfr.cc dcmsr/libsrc/dsrscogr.cc dcmsr/libsrc/dsrtcodt.cc dcmsr/libsrc/dsrtcosp.cc dcmsr/libsrc/dsrtcoto.cc dcmsr/libsrc/dsrwavch.cc - Moved some protected methods to public part. Affects: dcmsr/include/dsrimgvl.h dcmsr/include/dsrnumvl.h dcmsr/include/dsrscovl.h dcmsr/include/dsrstrvl.h dcmsr/include/dsrtcovl.h dcmsr/include/dsrwavvl.h - Removed additional check (according to CP). Affects: dcmsr/libsrc/dsrscovl.cc **** Changes from 2000.11.01 (riesmeier) - Added command line tool to convert DICOM SR documents to XML. Added: dcmsr/apps/dsr2xml.cc Affects: dcmsr/apps/Makefile.dep dcmsr/apps/Makefile.in - Added support for conversion to XML. Optimized HTML rendering. Affects: dcmsr/include/dsrcodtn.h dcmsr/include/dsrcodvl.h dcmsr/include/dsrcomtn.h dcmsr/include/dsrcomvl.h dcmsr/include/dsrcontn.h dcmsr/include/dsrdattn.h dcmsr/include/dsrdoc.h dcmsr/include/dsrdoctn.h dcmsr/include/dsrdoctr.h dcmsr/include/dsrdtitn.h dcmsr/include/dsrimgtn.h dcmsr/include/dsrimgvl.h dcmsr/include/dsrnumtn.h dcmsr/include/dsrnumvl.h dcmsr/include/dsrpnmtn.h dcmsr/include/dsrreftn.h dcmsr/include/dsrscotn.h dcmsr/include/dsrscovl.h dcmsr/include/dsrstrvl.h dcmsr/include/dsrtcotn.h dcmsr/include/dsrtcovl.h dcmsr/include/dsrtextn.h dcmsr/include/dsrtimtn.h dcmsr/include/dsrtypes.h dcmsr/include/dsruidtn.h dcmsr/include/dsrwavtn.h dcmsr/include/dsrwavvl.h dcmsr/libsrc/dsrcodtn.cc dcmsr/libsrc/dsrcodvl.cc dcmsr/libsrc/dsrcomtn.cc dcmsr/libsrc/dsrcomvl.cc dcmsr/libsrc/dsrcontn.cc dcmsr/libsrc/dsrdattn.cc dcmsr/libsrc/dsrdoc.cc dcmsr/libsrc/dsrdoctn.cc dcmsr/libsrc/dsrdoctr.cc dcmsr/libsrc/dsrdtitn.cc dcmsr/libsrc/dsrimgtn.cc dcmsr/libsrc/dsrimgvl.cc dcmsr/libsrc/dsrnumtn.cc dcmsr/libsrc/dsrnumvl.cc dcmsr/libsrc/dsrpnmtn.cc dcmsr/libsrc/dsrreftn.cc dcmsr/libsrc/dsrscotn.cc dcmsr/libsrc/dsrscovl.cc dcmsr/libsrc/dsrstrvl.cc dcmsr/libsrc/dsrtcotn.cc dcmsr/libsrc/dsrtcovl.cc dcmsr/libsrc/dsrtextn.cc dcmsr/libsrc/dsrtimtn.cc dcmsr/libsrc/dsrtypes.cc dcmsr/libsrc/dsruidtn.cc dcmsr/libsrc/dsrwavtn.cc dcmsr/libsrc/dsrwavvl.cc - Added support for Cascading Style Sheet (CSS) used optionally for HTML rendering. Optimized HTML rendering. Affects: dcmsr/apps/dsr2html.cc dcmsr/include/dsrdoc.h dcmsr/include/dsrtypes.h dcmsr/libsrc/dsrdoc.cc dcmsr/libsrc/dsrtypes.cc - Updated comments/formatting. Affects: dcmsr/apps/dsrdump.cc dcmsr/include/dsrimgfr.h dcmsr/include/dsrtcodt.h dcmsr/include/dsrtcoto.h dcmsr/include/dsrtcosp.h dcmsr/include/dsrscogr.h dcmsr/include/dsrwavch.h - Now derive "protected" from base class DSRTypes instead of "public". Affects: dcmsr/include/dsrcitem.h dcmsr/include/dsrdoc.h dcmsr/include/dsrtree.h - Enhanced support for specific character sets. Affects: dcmsr/include/dsrdoc.h dcmsr/include/dsrtypes.h dcmsr/libsrc/dsrcodvl.cc dcmsr/libsrc/dsrdoc.cc dcmsr/libsrc/dsrtypes.cc - Replaced tool to create sample reports. Added: dcmsr/tests/mkreport.cc Removed: dcmsr/tests/test.cc Affects: dcmsr/tests/Makefile.dep dcmsr/tests/Makefile.in **** Changes from 2000.10.26 (riesmeier) - Added support for "Comprehensive SR". Added: dcmsr/include/dsrreftn.h dcmsr/libsrc/dsrreftn.cc Affects: dcmsr/apps/Makefile.dep dcmsr/include/dsrcitem.h dcmsr/include/dsrdoc.h dcmsr/include/dsrdoctn.h dcmsr/include/dsrtypes.h dcmsr/libsrc/Makefile.dep dcmsr/libsrc/Makefile.in dcmsr/libsrc/dsrcitem.cc dcmsr/libsrc/dsrcodtn.cc dcmsr/libsrc/dsrcomtn.cc dcmsr/libsrc/dsrcontn.cc dcmsr/libsrc/dsrdattn.cc dcmsr/libsrc/dsrdoctn.cc dcmsr/libsrc/dsrdoctr.cc dcmsr/libsrc/dsrdtitn.cc dcmsr/libsrc/dsrimgtn.cc dcmsr/libsrc/dsrnumtn.cc dcmsr/libsrc/dsrpnmtn.cc dcmsr/libsrc/dsrscotn.cc dcmsr/libsrc/dsrtextn.cc dcmsr/libsrc/dsrtimtn.cc dcmsr/libsrc/dsrtypes.cc dcmsr/libsrc/dsruidtn.cc dcmsr/tests/Makefile.dep dcmsr/tests/test.cc dcmpstat/libsrc/Makefile.dep - Added support for TCOORD content item. Added: dcmsr/include/dsrtcodt.h dcmsr/include/dsrtcosp.h dcmsr/include/dsrtcotn.h dcmsr/include/dsrtcoto.h dcmsr/include/dsrtcovl.h dcmsr/libsrc/dsrtcodt.cc dcmsr/libsrc/dsrtcosp.cc dcmsr/libsrc/dsrtcotn.cc dcmsr/libsrc/dsrtcoto.cc dcmsr/libsrc/dsrtcovl.cc Affects: dcmsr/include/dsrcitem.h dcmsr/include/dsrtypes.h dcmsr/libsrc/Makefile.dep dcmsr/libsrc/Makefile.in dcmsr/libsrc/dsrcitem.cc dcmsr/libsrc/dsrtypes.cc dcmsr/tests/Makefile.dep dcmsr/tests/test.cc dcmpstat/libsrc/Makefile.dep - Added new flag specifying whether to add a "dcmtk" footnote to the rendered HTML document or not. Affects: dcmsr/apps/dsr2html.cc dcmsr/include/dsrtypes.h dcmsr/libsrc/dsrdoc.cc dcmsr/libsrc/dsrtypes.cc - Updated comments. Affects: dcmsr/include/dsrimgvl.h - Fixed bug: index in search routine was starting from 0 not 1. Affects: dcmsr/include/dsrtlist.h - Generalized routine to get and search for position strings ("1.2.3"). Affects: dcmsr/include/dsrtncsr.h dcmsr/libsrc/dsrtncsr.cc - Added check routine for valid UID strings. Affects: dcmsr/include/dsrtypes.h dcmsr/libsrc/dsrcomvl.cc dcmsr/libsrc/dsrtypes.cc - Use method isShort() to decide whether a content item can be rendered "inline" or not. Affects: dcmsr/libsrc/dsrimgtn.cc dcmsr/libsrc/dsrwavvl.cc - Reworked read() method. Affects: dcmsr/libsrc/dsrscogr.cc dcmsr/libsrc/dsrscovl.cc dcmsr/libsrc/dsrwavch.cc **** Changes from 2000.10.24 (riesmeier) - Changed HTML hyperlinks to referenced objects from "dicom://" to "file://" to facilitate access from Java. Affects: dcmsr/libsrc/dsrcomvl.cc dcmsr/libsrc/dsrdoc.cc dcmsr/libsrc/dsrimgvl.cc dcmsr/libsrc/dsrwavvl.cc **** Changes from 2000.10.23 (riesmeier) - Renamed class DSRReferenceValue to DSRCompositeReferenceValue. Affects: dcmpstat/libsrc/Makefile.dep - Replaced non-Unix style newline in preprocessor statement. Affects: dcmpstat/libsrc/dvpsmsg.cc - Added missing parameter to call of function handleClient (only appeared on systems not supporting 'fork' command). Affects: dcmpstat/apps/dcmpsrcv.cc - Added clear() method. Affects: dcmsr/include/dsrcodtn.h dcmsr/include/dsrdattn.h dcmsr/include/dsrdtitn.h dcmsr/include/dsrnumtn.h dcmsr/include/dsrpnmtn.h dcmsr/include/dsrtextn.h dcmsr/include/dsrtimtn.h dcmsr/include/dsruidtn.h dcmsr/libsrc/dsrcodtn.cc dcmsr/libsrc/dsrdattn.cc dcmsr/libsrc/dsrdtitn.cc dcmsr/libsrc/dsrnumtn.cc dcmsr/libsrc/dsrpnmtn.cc dcmsr/libsrc/dsrtextn.cc dcmsr/libsrc/dsrtimtn.cc dcmsr/libsrc/dsruidtn.cc - Added SOP class UID to hyperlink in method renderHTML(). Affects: dcmsr/libsrc/dsrwavvl.cc dcmsr/libsrc/dsrimgvl.cc dcmsr/libsrc/dsrcomvl.cc - Enhanced implementation of method isValid(). Affects: dcmsr/libsrc/dsrcontn.cc dcmsr/libsrc/dsrstrvl.cc - Allow to set empty concept name code (= clear). Affects: dcmsr/libsrc/dsrdoctn.cc - Added/updated doc++ comments. Affects: dcmsr/include/dsrcitem.h dcmsr/include/dsrcodtn.h dcmsr/include/dsrcodvl.h dcmsr/include/dsrcomtn.h dcmsr/include/dsrcontn.h dcmsr/include/dsrdattn.h dcmsr/include/dsrdoctn.h dcmsr/include/dsrdtitn.h dcmsr/include/dsrimgtn.h dcmsr/include/dsrnumtn.h dcmsr/include/dsrpnmtn.h dcmsr/include/dsrscotn.h dcmsr/include/dsrstrvl.h dcmsr/include/dsrtextn.h dcmsr/include/dsrtimtn.h dcmsr/include/dsruidtn.h dcmsr/include/dsrwavtn.h dcmsr/include/dsrwavvl.h **** Changes from 2000.10.20 (riesmeier) - Renamed class DSRReferenceValue to DSRCompositeReferenceValue. Removed: dcmsr/include/dsrrefvl.h dcmsr/libsrc/dsrrefvl.cc Added: dcmsr/include/dsrcomvl.h dcmsr/libsrc/dsrcomvl.cc Affects: dcmsr/apps/Makefile.dep dcmsr/include/dsrcitem.h dcmsr/include/dsrcomtn.h dcmsr/include/dsrimgvl.h dcmsr/include/dsrwavvl.h dcmsr/libsrc/Makefile.dep dcmsr/libsrc/Makefile.in dcmsr/libsrc/dsrcitem.cc dcmsr/libsrc/dsrcomtn.cc dcmsr/libsrc/dsrimgtn.cc dcmsr/libsrc/dsrimgvl.cc dcmsr/libsrc/dsrwavtn.cc dcmsr/libsrc/dsrwavvl.cc dcmsr/tests/Makefile.dep dcmtk/dcmsr/tests/test.cc **** Changes from 2000.10.19 (riesmeier) - Renamed some set methods. Affects: dcmsr/include/dsrcodvl.h dcmsr/include/dsrrefvl.h dcmsr/libsrc/dsrcodvl.cc dcmsr/libsrc/dsrimgvl.cc dcmsr/libsrc/dsrrefvl.cc dcmsr/libsrc/dsrwavvl.cc - Added optional module name to read method to provide more detailed warning messages. Affects: dcmsr/include/dsrcodvl.h dcmsr/libsrc/dsrcontn.cc dcmsr/libsrc/dsrcodvl.cc dcmsr/libsrc/dsrnumvl.cc dcmsr/libsrc/dsrrefvl.cc dcmsr/libsrc/dsrscogr.cc dcmsr/libsrc/dsrscovl.cc dcmsr/libsrc/dsrstrvl.cc dcmsr/libsrc/dsrwavch.cc **** Changes from 2000.10.19 (eichelberg) - Fixed dcmtls module so that openssl headers are includes only if the symbol WITH_OPENSSL is defined. Affects: dcmtls/libsrc/tlstrans.cc dcmtls/libsrc/tlslayer.cc **** Changes from 2000.10.18 (riesmeier) - Added new command line option --print-file-name. Affects: dcmsr/apps/dsrdump.cc - Added command line parameter -i to doc++ (don't show inherited members). Affects: dcmsr/Makefile.in - Added methods allowing direct access to certain content item values. Affects: dcmsr/include/dsrcitem.h dcmsr/include/dsrcodvl.h dcmsr/include/dsrdoctn.h dcmsr/include/dsrimgvl.h dcmsr/include/dsrnumvl.h dcmsr/include/dsrrefvl.h dcmsr/include/dsrwavvl.h dcmsr/libsrc/dsrcitem.cc - Added doc++ comments. Affects: dcmsr/include/dsrcodvl.h dcmsr/include/dsrdoctr.h dcmsr/include/dsrimgfr.h dcmsr/include/dsrimgvl.h dcmsr/include/dsrnumvl.h dcmsr/include/dsrrefvl.h dcmsr/include/dsrscogr.h dcmsr/include/dsrtlist.h dcmsr/include/dsrwavch.h dcmsr/include/dsrwavvl.h - Made some functions inline. Affects: dcmsr/include/dsrcontn.h dcmsr/include/dsrdoc.h dcmsr/include/dsrdoctn.h dcmsr/include/dsrimgvl.h dcmsr/include/dsrnumvl.h dcmsr/include/dsrrefvl.h dcmsr/include/dsrtncsr.h dcmsr/include/dsrtree.h dcmsr/include/dsrwavvl.h - Added read and write methods. Affects: dcmsr/include/dsrstrvl.h dcmsr/libsrc/dsrstrvl.cc - Moved read and write methods to base class. Affects: dcmsr/libsrc/dsrdattn.cc dcmsr/libsrc/dsrdtitn.cc dcmsr/libsrc/dsrpnmtn.cc dcmsr/libsrc/dsrtextn.cc dcmsr/libsrc/dsrtimtn.cc dcmsr/libsrc/dsruidtn.cc - Added new method allowing to get and check string values from dataset. Affects: dcmsr/include/dsrtypes.h dcmsr/libsrc/dsrtypes.cc - Added check for read methods (VM and type). Affects: dcmsr/libsrc/dsrcodtn.cc dcmsr/libsrc/dsrcodvl.cc dcmsr/libsrc/dsrcomtn.cc dcmsr/libsrc/dsrcontn.cc dcmsr/libsrc/dsrdoc.cc dcmsr/libsrc/dsrdoctn.cc dcmsr/libsrc/dsrdoctr.cc dcmsr/libsrc/dsrimgtn.cc dcmsr/libsrc/dsrimgvl.cc dcmsr/libsrc/dsrnumvl.cc dcmsr/libsrc/dsrrefvl.cc dcmsr/libsrc/dsrscovl.cc dcmsr/libsrc/dsrstrvl.cc dcmsr/libsrc/dsrwavtn.cc dcmsr/libsrc/dsrwavvl.cc - Added comments. Affects: dcmsr/libsrc/dsrimgfr.cc dcmsr/libsrc/dsrscogr.cc dcmsr/libsrc/dsrwavch.cc - Adapted tests. Affects: dcmsr/tests/test.cc **** Changes from 2000.10.17 (riesmeier) - Added methods to retrieve information on predecessor documents and verifying observers. Affects: dcmsr/include/dsrdoc.h dcmsr/libsrc/dsrdoc.cc - Added method checking content item for validity/completeness. Affects: dcmsr/include/dsrcitem.h dcmsr/libsrc/dsrcitem.cc - Renamed methods for composite objects. Affects: dcmsr/include/dsrcitem.h dcmsr/libsrc/dsrcitem.cc - Changed behaviour of createRevisedVersion(): replace all existing sequence items. Affects: dcmsr/libsrc/dsrdoc.cc **** Changes from 2000.10.16 (riesmeier) - Added check to avoid wrong warning messages when shutting down application externally. Affects: imagectn/apps/imagectn.cc dcmpstat/libsrc/dvpshlp.cc - Replaced presentation description by a more general instance description. Affects: imagectn/include/dbpriv.h imagectn/libsrc/dbindex.cc dcmtk/imagectn/libsrc/dbstore.cc - Added support for new structured reports. Affects: dcmpstat/apps/Makefile.dep dcmpstat/apps/Makefile.in dcmpstat/include/dviface.h dcmpstat/libsrc/Makefile.dep dcmpstat/libsrc/Makefile.in dcmpstat/libsrc/dviface.cc - Added method allowing to select an instance by instance UID and SOP class UID (without series and study UID). Required for composite references in DICOM SR. Affects: dcmpstat/include/dvcache.h dcmpstat/include/dviface.h dcmpstat/libsrc/dviface.cc - Added explicit typecast to avoid compiler warnings (Sun CC 2.0.1). Affects: dcmpstat/libsrc/dvpsmsg.cc - Removed test program. Removed: dcmpstat/tests/test.cc - Added new options: number nested items instead of indenting them, print SOP instance UID of referenced composite objects. Affects: dcmsr/apps/dsrdump.cc dcmsr/include/dsrtypes.h dcmsr/libsrc/dsrdoctr.cc dcmsr/libsrc/dsrimgvl.cc dcmsr/libsrc/dsrrefvl.cc dcmsr/libsrc/dsrtncsr.cc dcmsr/libsrc/dsrtypes.cc dcmsr/libsrc/dsrwavvl.cc - Added new method checking whether an image content item applies to a certain frame. Affects: dcmsr/include/dsrimgvl.h dcmsr/libsrc/dsrimgvl.cc - Added new method checking whether a waveform content item applies to a certain channel. Affects: dcmsr/include/dsrwavch.h dcmsr/include/dsrwavvl.h dcmsr/libsrc/dsrwavch.cc dcmsr/libsrc/dsrwavvl.cc - Added methods allowing direct access to certain content item values. Affects: dcmsr/include/dsrcitem.h dcmsr/include/dsrimgvl.h dcmsr/include/dsrrefvl.h dcmsr/include/dsrscovl.h dcmsr/include/dsrwavvl.h dcmsr/libsrc/dsrcitem.cc - Made method creating a new SOP instance public. Added check for correct SOP instance UID and SOP class UID to validity check. Affects: dcmsr/include/dsrdoc.h dcmsr/libsrc/dsrdoc.cc - Added doc++ comments. Affects: dcmsr/include/dsrcitem.h dcmsr/include/dsrtree.h dcmsr/include/dsrdoctr.h - Reformatted print output. Affects: dcmsr/libsrc/dsrcodtn.cc dcmsr/libsrc/dsrcomtn.cc dcmsr/libsrc/dsrcontn.cc dcmsr/libsrc/dsrdattn.cc dcmsr/libsrc/dsrdoctn.cc dcmsr/libsrc/dsrdtitn.cc dcmsr/libsrc/dsrimgtn.cc dcmsr/libsrc/dsrimgvl.cc dcmsr/libsrc/dsrnumtn.cc dcmsr/libsrc/dsrnumvl.cc dcmsr/libsrc/dsrpnmtn.cc dcmsr/libsrc/dsrrefvl.cc dcmsr/libsrc/dsrscotn.cc dcmsr/libsrc/dsrscovl.cc dcmsr/libsrc/dsrtextn.cc dcmsr/libsrc/dsrtimtn.cc dcmsr/libsrc/dsruidtn.cc dcmsr/libsrc/dsrwavtn.cc dcmsr/libsrc/dsrwavvl.cc - Added more tests. Affects: dcmsr/tests/test.cc - Added new feature: create inverse GSDF (useful for printer output). Affects: dcmpstat/apps/dcmmklut.cc - Moved incorrectly placed #endif statement to correct position. Affects: dcmpstat/apps/dcmpsrcv.cc - Added missing get/setSeriesDescription() methods. Affects: dcmsr/include/dsrdoc.h dcmsr/libsrc/dsrdoc.cc - Updated comments. Affects: dcmsr/include/dsrcitem.h dcmsr/include/dsrdoc.h dcmsr/include/dsrtncsr.h dcmsr/include/dsrtypes.h - Added const type specifier. Affects: dcmsr/libsrc/dsrdoctr.cc **** Changes from 2000.10.13 (riesmeier) - Added new module 'dcmsr' providing access to DICOM structured reporting documents (supplement 23). Doc++ documentation not yet completed. Affects: config/modules Added: dcmsr/configure dcmsr/Makefile.in dcmsr/apps/Makefile.in dcmsr/apps/Makefile.dep dcmsr/apps/dsr2html.cc dcmsr/apps/dsrdump.cc dcmsr/docs/Makefile.in dcmsr/htmldocs/Makefile.in dcmsr/include/Makefile.in dcmsr/include/dsrcitem.h dcmsr/include/dsrcodtn.h dcmsr/include/dsrcodvl.h dcmsr/include/dsrcomtn.h dcmsr/include/dsrcontn.h dcmsr/include/dsrdattn.h dcmsr/include/dsrdoc.h dcmsr/include/dsrdoctn.h dcmsr/include/dsrdoctr.h dcmsr/include/dsrdtitn.h dcmsr/include/dsrimgfr.h dcmsr/include/dsrimgtn.h dcmsr/include/dsrimgvl.h dcmsr/include/dsrnumtn.h dcmsr/include/dsrnumvl.h dcmsr/include/dsrpnmtn.h dcmsr/include/dsrrefvl.h dcmsr/include/dsrscogr.h dcmsr/include/dsrscotn.h dcmsr/include/dsrscovl.h dcmsr/include/dsrstrvl.h dcmsr/include/dsrtextn.h dcmsr/include/dsrtimtn.h dcmsr/include/dsrtlist.h dcmsr/include/dsrtncsr.h dcmsr/include/dsrtree.h dcmsr/include/dsrtypes.h dcmsr/include/dsruidtn.h dcmsr/include/dsrwavch.h dcmsr/include/dsrwavtn.h dcmsr/include/dsrwavvl.h dcmsr/libsrc/Makefile.dep dcmsr/libsrc/Makefile.in dcmsr/libsrc/dsrcitem.cc dcmsr/libsrc/dsrcodtn.cc dcmsr/libsrc/dsrcodvl.cc dcmsr/libsrc/dsrcomtn.cc dcmsr/libsrc/dsrcontn.cc dcmsr/libsrc/dsrdattn.cc dcmsr/libsrc/dsrdoc.cc dcmsr/libsrc/dsrdoctn.cc dcmsr/libsrc/dsrdoctr.cc dcmsr/libsrc/dsrdtitn.cc dcmsr/libsrc/dsrimgfr.cc dcmsr/libsrc/dsrimgtn.cc dcmsr/libsrc/dsrimgvl.cc dcmsr/libsrc/dsrnumtn.cc dcmsr/libsrc/dsrnumvl.cc dcmsr/libsrc/dsrpnmtn.cc dcmsr/libsrc/dsrrefvl.cc dcmsr/libsrc/dsrscogr.cc dcmsr/libsrc/dsrscotn.cc dcmsr/libsrc/dsrscovl.cc dcmsr/libsrc/dsrstrvl.cc dcmsr/libsrc/dsrtextn.cc dcmsr/libsrc/dsrtimtn.cc dcmsr/libsrc/dsrtncsr.cc dcmsr/libsrc/dsrtree.cc dcmsr/libsrc/dsrtypes.cc dcmsr/libsrc/dsruidtn.cc dcmsr/libsrc/dsrwavch.cc dcmsr/libsrc/dsrwavtn.cc dcmsr/libsrc/dsrwavvl.cc dcmsr/tests/Makefile.dep dcmsr/tests/Makefile.in dcmtk/dcmsr/tests/test.cc **** Changes from 2000.10.12 (eichelberg) - Updated data dictionary for 2000 edition of the DICOM standard Affects: dcmdata/apps/dcmgpdir.cc dcmdata/include/dcdeftag.h dcmdata/libsrc/dcdictzz.cc dcmdata/libsrc/dchashdi.cc dcmdata/libsrc/dicom.dic **** Changes from 2000.10.12 (riesmeier) - Added assignment operator to class OFStack. Declared (unimplemented) copy constructor and assignment operator in class OFStackLink to avoid compiler warnings (e.g. on Sun CC 2.0.1). Affects: ofstd/include/ofstack.h - Added explicit typecast to avoid compiler warnings. Affects: ofstd/libsrc/offname.cc - Updated data dictionary to reflect the changes made in supplement 23 (Structured Reporting) final text. Affects: dcmdata/include/dcdeftag.h dcmdata/include/dcuid.h dcmdata/libsrc/dcdictbi.cc dcmdata/libsrc/dcdictzz.cc dcmdata/libsrc/dicom.dic - Added private coding scheme creator UID for SR codes. Restructured scheme for site UIDs. Affects: dcmdata/include/dcuid.h **** Changes from 2000.10.11 (eichelberg) - Updated includes for Win32 environment Affects: dcmtls/libsrc/tlslayer.cc dcmtls/libsrc/tlstrans.cc dcmpstat/libsrc/dvpsmsg.cc - Fixed CreateProcess parameter list Affects: dcmpstat/apps/dcmpsrcv.cc **** Changes from 2000.10.10 (eichelberg) - Created/updated doc++ comments Affects: ofstd/include/ofcmdln.h ofstd/include/ofconapp.h ofstd/include/ofconsol.h ofstd/include/ofglobal.h ofstd/include/oflist.h ofstd/include/ofstack.h ofstd/include/oftypes.h - Implemented thread safe random number generator, needed on systems where threads but no Posix rand_r function are available. Affects: ofstd/include/offname.h ofstd/libsrc/offname.cc - Added version of function ASC_printRejectParameters that takes an ostream& instead of a FILE* Affects: dcmnet/include/assoc.h dcmnet/libsrc/assoc.cc - Modified COND_DumpConditions to take an optional ostream& parameter Affects: dcmnet/include/cond.h dcmnet/libsrc/cond.cc - Updated transport layer error codes and routines for printing connection parameters. Affects: dcmnet/include/dcmlayer.h dcmnet/include/dcmtrans.h dcmnet/include/dul.h dcmnet/libsrc/dcmtrans.cc dcmnet/libsrc/dul.cc - Added routines for printing certificates and connection parameters. Affects: dcmtls/include/tlslayer.h dcmtls/include/tlstrans.h dcmtls/libsrc/tlslayer.cc dcmtls/libsrc/tlstrans.cc - Added extensions for TLS encrypted communication Affects: dcmpstat/apps/Makefile.in dcmpstat/apps/Makefile.dep dcmpstat/apps/dcmpsrcv.cc dcmpstat/apps/dcmpssnd.cc dcmpstat/include/dviface.h dcmpstat/include/dvpscf.h dcmpstat/include/dvpstyp.h dcmpstat/tests/test.cfg - Added extensions for IPC message communication Added: dcmpstat/include/dvpsmsg.h dcmpstat/libsrc/dvpsmsg.cc Affects: dcmpstat/libsrc/Makefile.dep dcmpstat/libsrc/Makefile.in dcmpstat/libsrc/dviface.cc dcmpstat/libsrc/dvpscf.cc - Implemented test server for IPC message communication Added: dcmpstat/tests/msgserv.cc Affects: dcmpstat/tests/Makefile.dep dcmpstat/tests/Makefile.in **** Changes from 2000.09.27 (eichelberg) - Minor changes in DcmCodec interface, required for future dcmjpeg module. Affects: dcmdata/include/dccodec.h dcmdata/include/dcpixel.h dcmdata/libsrc/dccodec.cc dcmdata/libsrc/dcpixel.cc **** Changes from 2000.09.26 (eichelberg) - Simplified inline code in ofconsol.h, required by Sun CC 2.x Affects: ofstd/include/ofconsol.h **** Changes from 2000.09.12 (riesmeier) - Corrected bug: wrong parameter for attribute search routine led to crashes when multiple pixel data attributes were contained in the dataset (e.g. IconImageSequence). Added new checking routines to avoid crashes when processing corrupted image data. Affects: dcmimgle/include/didocu.h dcmimgle/include/diflipt.h dcmimgle/include/dimocpt.h dcmimgle/include/dimoflt.h dcmimgle/include/dimorot.h dcmimgle/include/dimosct.h dcmimgle/include/dirotat.h dcmimgle/libsrc/didocu.cc **** Changes from 2000.09.08 (eichelberg) - Added new options to configure: --enable-debug compile with debug code, don't optimize --disable-debug compile without debug code (default) --enable-threads=TYPE compile with MT support (posix/solaris/auto=default) --disable-threads compile without MT support --with-openssl include OpenSSL support --without-openssl don't include OpenSSL support (default) --with-opensslinc=DIR location of OpenSSL includes and libraries Added new configure test for int* vs size_t* parameter in accept() Affects: config/Makefile.def.in config/acconfig.h config/aclocal.m4 config/configure config/configure.in config/include/config.h.in config/include/cfwin32.h - Removed use of u_short and u_long types which are not defined in POSIX. Required when compiling on Solaris with Posix threads. Affects: dcmnet/libsrc/dul.cc dcmnet/libsrc/dulfsm.cc - Adapted calls to accept() to new flag HAVE_INTP_ACCEPT, required on OSF/1. Affects: dcmnet/libsrc/dul.cc **** Changes from 2000.09.06 (eichelberg) - Updated Print SCP to accept and silently ignore group length attributes. Affects: dcmpstat/libsrc/dvpsfs.cc dcmpstat/libsrc/dvpsib.cc dcmpstat/libsrc/dvpspl.cc dcmpstat/libsrc/dvpsprt.cc dcmpstat/libsrc/dvpssp.cc - Fixed minor bug: Print SCP accepted Presentation LUT N-CREATE even if this SOP class had not been negotiated. Affects: dcmpstat/libsrc/dvpsprt.cc **** Changes from 2000.09.05 (riesmeier) - Added new test checking for the presence of type ssize_t. Affects: config/acconfig.h config/aclocal.m4 config/configure config/configure.in config/include/cfwin32.h config/include/config.h.in - Adapted source code to compile on Windows (MSVC++ 5.0). Affects: dcmnet/libsrc/dcmtrans.cc **** Changes from 2000.08.31 (riesmeier) - Corrected bug: min and max value were reversed for images with negative rescale slope. Affects: dcmimgle/libsrc/dimomod.cc - Switched off interpolation for scaling of print preview images (this caused problems with "scrambled" presentation LUTs in stored print objects). Affects: dcmpstat/libsrc/dviface.cc - Correct bug: pixel aspect ratio and photometric interpretation were ignored for print preview. Affects: dcmpstat/libsrc/dviface.cc **** Changes from 2000.08.10 (eichelberg) - Added initial OpenSSL support. Support consists of a new module dcmtls which provides the "glue" between OpenSSL and DCMTK, the necessary changes in the dcmnet library and adapted versions of storescu and storescp which support TLS transmission if compiled with WITH_OPENSSL defined. Added: dcmnet/include/dcmlayer.h dcmnet/include/dcmtrans.h dcmnet/libsrc/dcmlayer.cc dcmnet/libsrc/dcmtrans.cc dcmtls/Makefile.in dcmtls/apps/Makefile.dep dcmtls/apps/Makefile.in dcmtls/configure dcmtls/docs/Makefile.in dcmtls/docs/ciphers.txt dcmtls/htmldocs/Makefile.in dcmtls/include/Makefile.in dcmtls/include/tlslayer.h dcmtls/include/tlstrans.h dcmtls/libsrc/Makefile.dep dcmtls/libsrc/Makefile.in dcmtls/libsrc/tlslayer.cc dcmtls/libsrc/tlstrans.cc dcmtls/tests/Makefile.in Affects: config/modules dcmnet/apps/Makefile.dep dcmnet/apps/Makefile.in dcmnet/apps/storescp.cc dcmnet/apps/storescu.cc dcmnet/include/assoc.h dcmnet/include/dicom.h dcmnet/include/dul.h dcmnet/libsrc/Makefile.dep dcmnet/libsrc/Makefile.in dcmnet/libsrc/assoc.cc dcmnet/libsrc/dul.cc dcmnet/libsrc/dulcond.cc dcmnet/libsrc/dulextra.cc dcmnet/libsrc/dulfsm.cc dcmnet/libsrc/dulstruc.h **** Changes from 2000.07.18 (riesmeier) - Moved method convertODtoLum/PValue from class DVInterface to DVPSStoredPrint and corrected implementation. Affects: dcmpstat/include/dviface.h dcmpstat/libsrc/dviface.cc dcmpstat/libsrc/dvpssp.cc - Changed behaviour of methods getMin/MaxDensityValue (return default value if attribute empty/absent). Affects: dcmpstat/include/dvpssp.h dcmpstat/libsrc/dviface.cc dcmpstat/libsrc/dvpssp.cc dcmpstat/libsrc/Makefile.dep **** Changes from 2000.07.17 (riesmeier) - Added methods to select objects from the database directly. Affects: dcmpstat/include/dviface.h dcmpstat/libsrc/dviface.cc - Corrected implementation of presentation LUT shape LIN OD. Affects: dcmimgle/libsrc/dimoimg.cc - Moved method getJNDIndex to public part of the interface. Affects: dcmimgle/include/digsdfn.h dcmimgle/libsrc/digsdfn.cc - Added support for presentation states referencing to hardcopy grayscale images. Affects: dcmpstat/libsrc/dviface.cc **** Changes from 2000.07.14 (riesmeier) - Fixed bug in getNumberOfPStates(study,series,instance) method. Affects: dcmpstat/libsrc/dviface.cc - Added changeStatus parameter to all methods loading instances from the database. Affects: dcmpstat/include/dviface.h dcmpstat/libsrc/dviface.cc **** Changes from 2000.07.12 (eichelberg) - Print SCP now writes PrinterCharacteristicsSequence when saving Stored Prints. Affects: dcmpstat/libsrc/dvpsprt.cc dcmpstat/libsrc/dvpssp.cc **** Changes from 2000.07.12 (riesmeier) - Correct bug in destructor of ObjectCounter class. Affects: dcmimgle/include/diobjcou.h - Added comment. Affects: dcmpstat/libsrc/dvpstat.cc - Fixed bug in loadPrintPreview routine. Affects: dcmpstat/libsrc/dviface.cc **** Changes from 2000.07.10 (riesmeier) - Corrected rendering of presentation LUT shape LIN OD. Affects: dcmpstat/libsrc/dvpspl.cc **** Changes from 2000.07.07 (riesmeier) - Removed unused enum type. Affects: dcmpstat/include/dvpstyp.h - Added support for LIN OD presentation LUT shape. Affects: dcmpstat/include/dvpssp.h dcmpstat/libsrc/dviface.cc dcmpstat/libsrc/dvpspl.cc dcmpstat/libsrc/dvpssp.cc dcmimgle/include/dcmimage.h dcmimgle/include/diluptab.h dcmimgle/include/dimoimg.h dcmimgle/include/diutils.h dcmimgle/libsrc/diluptab.cc dcmimgle/libsrc/dimoimg.cc - Corrected interpretation of presentation LUT shape. Affects: dcmimgle/libsrc/dimoimg.cc - Rebuilt makefile dependencies. Affects: dcmimgle/apps/Makefile.dep dcmimgle/libsrc/Makefile.dep **** Changes from 2000.07.06 (riesmeier) - Added flag to loadPrintPreview() method allowing to choose how to interpret the presentation LUT (hardcopy or softcopy definition). Affects: dcmpstat/include/dviface.h dcmpstat/libsrc/dviface.cc **** Changes from 2000.07.05 (riesmeier) - Added new log output messages. Affects: dcmpstat/libsrc/dviface.cc - Added check whether external processes were actually started before terminating them. Affects: dcmpstat/libsrc/dviface.cc - Fixed bug concerning the termination of external processes. Affects: dcmpstat/libsrc/dviface.cc - Corrected documentation of one method. Affects: dcmpstat/include/dvpssp.h - Changed port number of query/retrieve server. Affects: dcmpstat/tests/test.cfg **** Changes from 2000.07.04 (riesmeier) - Modified output of 'print index file' option. Affects: imagectn/libsrc/dbindex.cc - Added test whether database index file can be opened/created to avoid application crashes. Affects: imagectn/apps/dbregimg.cc - Added support for overriding the presentation LUT settings made for the image boxes. Affects: dcmpstat/include/dviface.h dcmpstat/include/dvpsib.h dcmpstat/include/dvpsibl.h dcmpstat/include/dvpssp.h dcmpstat/include/dvpstat.h dcmpstat/libsrc/dviface.cc dcmpstat/libsrc/dvpsib.cc dcmpstat/libsrc/dvpsibl.cc dcmpstat/libsrc/dvpssp.cc - Added new log output messages. Affects: dcmpstat/libsrc/dviface.cc - Added new option to command line tool allowing to specify the 'seed' value for the random-number generator. Affects: dcmpstat/apps/dcmmklut.cc dcmpstat/docs/dcmmklut.txt **** Changes from 2000.07.03 (riesmeier) - Fixed bug: VOI LUT transform defined per frame was not supported by the method renderPixelData(). Affects: dcmpstat/libsrc/dvpstat.cc **** Changes from 2000.06.30 (riesmeier) - Fixed bug in database cache routines (re. study status). Affects: dcmpstat/include/dvcache.h - Added make clean/distclean for htmldocs folder to makefile. Affects: dcmpstat/Makefile.in - Changed version of Tcl/Tk interpreter to to 8.3. Affects: dcmpstat/tests/test.cfg **** Changes from 2000.06.29 (riesmeier) - Removed old testing tools. Added new one. Added: dcmpstat/tests/test.cc Removed: dcmpstat/tests/didb.cc dcmpstat/tests/show.cc Affects: dcmpstat/tests/Makefile.dep dcmpstat/tests/Makefile.in - Added Tcl/Tk scripts for dcmpschk and dcmdump. Added: dcmpstat/tests/dcmpschk.tcl dcmdata/tests/dcmdump.tcl - Minor corrections in the config file. Affects: dcmpstat/tests/test.cfg - Fixed bug causing a non-terminating "while" loop. Affects: dcmpstat/libsrc/dvpsril.cc - Rebuilt makefile dependencies. Affects: dcmpstat/apps/Makefile.dep **** Changes from 2000.06.26 (riesmeier) - Replaced _WIN32 by HAVE_WINDOWS_H to avoid compiler errors using CygWin-32. Affects: ofstd/include/ofthread.h ofstd/libsrc/ofthread.cc **** Changes from 2000.06.22 (riesmeier) - Fixed bug creating config file for Q/R server when Q/R server name was not specified in application config file. Affects: dcmpstat/libsrc/dviface.cc **** Changes from 2000.06.22 (eichelberg) - Updated Makefile.in for Presentation State Checker. Affects: dcmpstat/apps/Makefile.in **** Changes from 2000.06.21 (eichelberg) - Added initial version of Presentation State Checker. Added: dcmpstat/apps/dcmpschk.cc dcmpstat/apps/vrscan.cc dcmpstat/apps/vrscan.h dcmpstat/docs/dcmpschk.txt Affects: dcmpstat/apps/Makefile.dep dcmpstat/apps/Makefile.in - Added DICOMscope support for calling the Presentation State Checker. Affects: dcmpstat/include/dviface.h dcmpstat/include/dvpscf.h dcmpstat/libsrc/dviface.cc dcmpstat/libsrc/dvpscf.cc dcmpstat/tests/test.cfg - Including stdlib.h, required for Sun CC 4.2 Affects: ofstd/include/ofconsol.h ofstd/include/oflogfil.h **** Changes from 2000.06.20 (eichelberg) - Added monochrome1 printing mode. Affects: dcmpstat/apps/dcmprscu.cc dcmpstat/include/dvpssp.h dcmpstat/libsrc/dvpssp.cc **** Changes from 2000.06.19 (eichelberg) - Added options for session printing and LIN OD to print tools, fixed pixel aspect ratio related bug. Affects: dcmpstat/apps/dcmprscu.cc dcmpstat/apps/dcmpsprt.cc dcmpstat/include/dvpssp.h dcmpstat/libsrc/dvpssp.cc - Added default Print SCP configurations to dcmpstat config file. Affects: dcmpstat/libsrc/test.cfg **** Changes from 2000.06.14 (riesmeier) - Corrected wrong filename creation for option +W. Affects: dcmdata/apps/dcmdump.cc - Added methods to access the attributes Polarity and Requested Image Size. Affects: dcmpstat/apps/dcmpsprt.cc dcmpstat/docs/dcmpsprt.txt dcmpstat/include/dvpsib.h dcmpstat/include/dvpsibl.h dcmpstat/include/dvpssp.h dcmpstat/libsrc/dvpsib.cc dcmpstat/libsrc/dvpsibl.cc - Added new command line option allowing to add a PBM file as an overlay to the hardcopy grayscale image (very preliminary support, only "P1" files without comments). Affects: dcmpstat/apps/dcmpsprt.cc dcmpstat/docs/dcmpsprt.txt **** Changes from 2000.06.09 (riesmeier) - Updated documentation of command line tools. Added: dcmpstat/docs/dcmprscp.txt dcmpstat/docs/dcmprscu.txt Removed: dcmpstat/docs/dcmprtsv.txt Affects: imagectn/docs/imagectn.txt dcmpstat/docs/dcmmklut.txt dcmpstat/docs/dcmp2pgm.txt dcmpstat/docs/dcmpsprt.txt - Added support for rendering inverse presentation LUT into print bitmaps. Affects: dcmpstat/apps/dcmpsprt.cc dcmpstat/include/dvpspl.h dcmpstat/include/dvpstat.h dcmpstat/libsrc/dvpspl.cc dcmpstat/libsrc/dvpstat.cc - Added method to get number of presentation states referencing an image (specified by the three UIDs). Affects: dcmpstat/include/dviface.h dcmpstat/libsrc/dviface.cc - Added new commandline option allowing to mix-up the LUT entries based on a random-number generator (useful to test correct implementation of LUTs). Affects: dcmpstat/apps/dcmmklut.cc - Rebuilt makefile dependencies. Affects: dcmpstat/apps/Makefile.dep **** Changes from 2000.06.08 (riesmeier) - Corrected bug and added log messages in addImageReferenceToPState(). Affects: dcmpstat/include/dvpstat.h dcmpstat/libsrc/dviface.cc dcmpstat/libsrc/dvpstat.cc - Added method convertODtoLum(). Affects: dcmpstat/include/dviface.h dcmpstat/libsrc/dviface.cc **** Changes from 2000.06.08 (eichelberg) - Renamed dcmprtsv to dcmprscu and adapted Makefile.in and Makefile.dep Added: dcmpstat/apps/dcmprscu.cc Removed: dcmpstat/apps/dcmprtsv.cc Affects: dcmpstat/apps/Makefile.dep dcmpstat/apps/Makefile.in dcmpstat/libsrc/Makefile.dep dcmpstat/tests/test.cfg - Implemented Referenced Presentation LUT Sequence on Basic Film Session level. Empty film boxes (pages) are not written to file anymore. Affects: dcmpstat/include/dvpsfs.h dcmpstat/include/dvpsib.h dcmpstat/include/dvpsibl.h dcmpstat/include/dvpssp.h dcmpstat/include/dvpsspl.h dcmpstat/libsrc/dvpsfs.cc dcmpstat/libsrc/dvpsib.cc dcmpstat/libsrc/dvpsibl.cc dcmpstat/libsrc/dvpspl.cc dcmpstat/libsrc/dvpsprt.cc dcmpstat/libsrc/dvpssp.cc dcmpstat/libsrc/dvpsspl.cc dcmpstat/libsrc/dvpstat.cc **** Changes from 2000.06.07 (riesmeier) - Added method to set the image polarity (normal, reverse). Affects: dcmimgle/include/dcmimage.h dcmimgle/include/dimoimg.h dcmimgle/include/diutils.h dcmimgle/libsrc/dimoimg.cc - Added configuration file entry "LogLevel" to filter log messages. Affects: dcmpstat/include/dviface.h dcmpstat/include/dvpscf.h dcmpstat/libsrc/dviface.cc dcmpstat/libsrc/dvpscf.cc dcmpstat/tests/test.cfg - Added flag to constructor specifying whether the general log file should be used (default: off). Affects: dcmpstat/include/dviface.h dcmpstat/libsrc/dviface.cc - Added methods to access the image polarity attribute. Affects: dcmpstat/include/dvpsib.h dcmpstat/include/dvpsibl.h dcmpstat/include/dvpssp.h dcmpstat/libsrc/dvpsib.cc dcmpstat/libsrc/dvpsibl.cc - Added support for rendering "hardcopy" and "softcopy" presentation LUTs. Affects: dcmpstat/include/dvpspl.h dcmpstat/libsrc/dvpspl.cc - Added missing transformations (polarity, GSDF, presentation LUT, aspect ratio) to print preview rendering. Affects: dcmpstat/include/dvpssp.h dcmpstat/libsrc/dviface.cc dcmpstat/libsrc/dvpssp.cc - Added log message output to I/O routines. Affects: dcmpstat/libsrc/dviface.cc - Rebuilt makefile dependencies. Affects: dcmpstat/apps/Makefile.dep **** Changes from 2000.06.07 (eichelberg) - dcmnet ACSE routines now allow to retrieve a binary copy of the A-ASSOCIATE RQ/AC/RJ PDUs, e.g. for logging purposes. Affects: dcmnet/include/assoc.h dcmnet/include/dul.h dcmnet/libsrc/assoc.cc dcmnet/libsrc/dul.cc dcmnet/libsrc/dulfsm.cc dcmnet/libsrc/dulstruc.h - dcmnet DIMSE routines now allow to retrieve raw command sets as DcmDataset objects, e.g. for logging purposes. Added enhanced message dump functions. Affects: dcmnet/include/dimse.h dcmnet/libsrc/dimdump.cc dcmnet/libsrc/dimse.cc - added optional paramter to DIMSE_storeUser that enables precise file size information inside the store user callback. Thanks to Mohamed Ahmed Abd Elkader for the bug report. Affects: dcmnet/apps/storescu.cc dcmnet/include/dimse.h dcmnet/libsrc/dimstore.cc - Output stream now passed as mandatory parameter to ASC_dumpParameters. Affects: dcmnet/apps/echoscu.cc dcmnet/apps/findscu.cc dcmnet/apps/movescu.cc dcmnet/apps/storescp.cc dcmnet/apps/storescu.cc dcmnet/include/assoc.h dcmnet/libsrc/assoc.cc imagectn/apps/imagectn.cc imagectn/apps/scemove.cc imagectn/apps/tinet.cc wlistctn/apps/wlistctn.cc - now using DIMSE status constants and log facilities defined in dcmnet Affects: dcmpstat/include/dvpsdef.h dcmpstat/libsrc/dvpsfs.cc dcmpstat/libsrc/dvpsib.cc dcmpstat/libsrc/dvpspl.cc dcmpstat/libsrc/dvpspll.cc dcmpstat/libsrc/dvpspr.cc dcmpstat/libsrc/dvpssp.cc dcmpstat/libsrc/dvpsspl.cc - added binary and textual log facilities to Print SCP. Affects: dcmpstat/apps/dcmprscp.cc dcmpstat/include/dvpscf.h dcmpstat/include/dvpsprt.h dcmpstat/include/dvpssp.h dcmpstat/libsrc/dviface.cc dcmpstat/libsrc/dvpscf.cc dcmpstat/libsrc/dvpsprt.cc dcmpstat/tests/test.cfg **** Changes from 2000.06.07 (riesmeier) - Moved configuration file entry "LogDirectory" from "[PRINT]" to new (more general) section "[APPLICATION]". Affects: dcmpstat/include/dvpscf.h dcmpstat/libsrc/dviface.cc dcmpstat/libsrc/dvpscf.cc dcmpstat/apps/dcmprscp.cc dcmpstat/apps/dcmprtsv.cc dcmpstat/tests/test.cfg **** Changes from 2000.06.05 (riesmeier) - Added new class for writing standardized status messages to a log file. Added: ofstd/include/oflogfil.h ofstd/libsrc/oflogfil.cc Affects: ofstd/libsrc/Makefile.dep ofstd/libsrc/Makefile.in - Implemented log message methods. Affects: dcmpstat/include/dviface.h dcmpstat/include/dvpscf.h dcmpstat/include/dvpstyp.h dcmpstat/libsrc/dviface.cc dcmpstat/libsrc/dvpscf.cc dcmpstat/tests/test.cfg - Added method allowing to specify the current presentation state to be used for resetting the pstate. Affects: dcmpstat/include/dviface.h dcmpstat/libsrc/dviface.cc - Rebuilt makefile dependencies. Affects: dcmpstat/apps/Makefile.dep dcmpstat/libsrc/Makefile.dep **** Changes from 2000.06.02 (eichelberg) - Adapted all dcmpstat classes to use OFConsole for log and error output Affects: dcmpstat/apps/dcmprscp.cc dcmpstat/apps/dcmprtsv.cc dcmpstat/include/dviface.h dcmpstat/include/dvpsab.h dcmpstat/include/dvpsabl.h dcmpstat/include/dvpsal.h dcmpstat/include/dvpsall.h dcmpstat/include/dvpscf.h dcmpstat/include/dvpscu.h dcmpstat/include/dvpscul.h dcmpstat/include/dvpsda.h dcmpstat/include/dvpsdal.h dcmpstat/include/dvpsdef.h dcmpstat/include/dvpsfs.h dcmpstat/include/dvpsga.h dcmpstat/include/dvpsgal.h dcmpstat/include/dvpsgl.h dcmpstat/include/dvpsgll.h dcmpstat/include/dvpsgr.h dcmpstat/include/dvpsgrl.h dcmpstat/include/dvpshlp.h dcmpstat/include/dvpsib.h dcmpstat/include/dvpsibl.h dcmpstat/include/dvpsov.h dcmpstat/include/dvpsovl.h dcmpstat/include/dvpspl.h dcmpstat/include/dvpspll.h dcmpstat/include/dvpspr.h dcmpstat/include/dvpsprt.h dcmpstat/include/dvpsri.h dcmpstat/include/dvpsril.h dcmpstat/include/dvpsrs.h dcmpstat/include/dvpsrsl.h dcmpstat/include/dvpssp.h dcmpstat/include/dvpsspl.h dcmpstat/include/dvpssv.h dcmpstat/include/dvpssvl.h dcmpstat/include/dvpstat.h dcmpstat/include/dvpstx.h dcmpstat/include/dvpstxl.h dcmpstat/include/dvpsvl.h dcmpstat/include/dvpsvll.h dcmpstat/include/dvpsvw.h dcmpstat/include/dvpsvwl.h dcmpstat/libsrc/dviface.cc dcmpstat/libsrc/dvpsab.cc dcmpstat/libsrc/dvpsabl.cc dcmpstat/libsrc/dvpsal.cc dcmpstat/libsrc/dvpsall.cc dcmpstat/libsrc/dvpscf.cc dcmpstat/libsrc/dvpscu.cc dcmpstat/libsrc/dvpscul.cc dcmpstat/libsrc/dvpsda.cc dcmpstat/libsrc/dvpsdal.cc dcmpstat/libsrc/dvpsfs.cc dcmpstat/libsrc/dvpsga.cc dcmpstat/libsrc/dvpsgal.cc dcmpstat/libsrc/dvpsgl.cc dcmpstat/libsrc/dvpsgll.cc dcmpstat/libsrc/dvpsgr.cc dcmpstat/libsrc/dvpsgrl.cc dcmpstat/libsrc/dvpshlp.cc dcmpstat/libsrc/dvpsib.cc dcmpstat/libsrc/dvpsibl.cc dcmpstat/libsrc/dvpsov.cc dcmpstat/libsrc/dvpsovl.cc dcmpstat/libsrc/dvpspl.cc dcmpstat/libsrc/dvpspll.cc dcmpstat/libsrc/dvpspr.cc dcmpstat/libsrc/dvpsprt.cc dcmpstat/libsrc/dvpsri.cc dcmpstat/libsrc/dvpsril.cc dcmpstat/libsrc/dvpsrs.cc dcmpstat/libsrc/dvpsrsl.cc dcmpstat/libsrc/dvpssp.cc dcmpstat/libsrc/dvpsspl.cc dcmpstat/libsrc/dvpssv.cc dcmpstat/libsrc/dvpssvl.cc dcmpstat/libsrc/dvpstat.cc dcmpstat/libsrc/dvpstx.cc dcmpstat/libsrc/dvpstxl.cc dcmpstat/libsrc/dvpsvl.cc dcmpstat/libsrc/dvpsvll.cc dcmpstat/libsrc/dvpsvw.cc dcmpstat/libsrc/dvpsvwl.cc **** Changes from 2000.05.31 (eichelberg) - Added initial Print SCP support Added: dcmpstat/apps/dcmprscp.cc dcmpstat/include/dvpsfs.h dcmpstat/include/dvpsprt.h dcmpstat/include/dvpsspl.h dcmpstat/libsrc/dvpsfs.cc dcmpstat/libsrc/dvpsprt.cc dcmpstat/libsrc/dvpsspl.cc Affects: dcmpstat/apps/Makefile.in dcmpstat/include/dviface.h dcmpstat/include/dvpscf.h dcmpstat/include/dvpsib.h dcmpstat/include/dvpsibl.h dcmpstat/include/dvpspl.h dcmpstat/include/dvpspll.h dcmpstat/include/dvpssp.h dcmpstat/include/dvpstyp.h dcmpstat/libsrc/Makefile.in dcmpstat/libsrc/dviface.cc dcmpstat/libsrc/dvpscf.cc dcmpstat/libsrc/dvpsib.cc dcmpstat/libsrc/dvpsibl.cc dcmpstat/libsrc/dvpspl.cc dcmpstat/libsrc/dvpspll.cc dcmpstat/libsrc/dvpssp.cc dcmpstat/tests/test.cfg - Moved dcmpstat macros and constants into a common header file Added: dcmpstat/include/dvpsdef.h Affects: dcmpstat/apps/dcmprtsv.cc dcmpstat/apps/dcmpsrcv.cc dcmpstat/apps/dcmpssnd.cc dcmpstat/libsrc/dvpsab.cc dcmpstat/libsrc/dvpsal.cc dcmpstat/libsrc/dvpsall.cc dcmpstat/libsrc/dvpsda.cc dcmpstat/libsrc/dvpsga.cc dcmpstat/libsrc/dvpsgl.cc dcmpstat/libsrc/dvpsgll.cc dcmpstat/libsrc/dvpsgr.cc dcmpstat/libsrc/dvpsov.cc dcmpstat/libsrc/dvpsri.cc dcmpstat/libsrc/dvpsrs.cc dcmpstat/libsrc/dvpssv.cc dcmpstat/libsrc/dvpssvl.cc dcmpstat/libsrc/dvpstat.cc dcmpstat/libsrc/dvpstx.cc dcmpstat/libsrc/dvpsvl.cc dcmpstat/libsrc/dvpsvwl.cc - Rebuilt makefile dependencies Affects: dcmpstat/apps/Makefile.dep dcmpstat/libsrc/Makefile.dep **** Changes from 2000.05.31 (riesmeier) - Added support for Stored Print attributes Originator and Destination application entity title. Affects: dcmpstat/include/dviface.h dcmpstat/include/dvpssp.h dcmpstat/libsrc/dviface.cc dcmpstat/libsrc/dvpssp.cc **** Changes from 2000.05.30 (eichelberg) - Added default constructor for Mutex to initializer list in OFGlobal. Affects: ofstd/include/ofglobal.h **** Changes from 2000.05.30 (riesmeier) - Adapted error output (avoid compiler warnings reported by gcc with additional flags). Affects: ofstd/libsrc/ofcmdln.cc - Added new private SOP class (UID definition) to allow external shutdown of console applications via negotiation of this special SOP class (currently used for imagectn and dcmpsrcv). Affects: dcmdata/include/dcuid.h dcmpstat/include/dviface.h dcmpstat/apps/dcmpsrcv.cc - Added a condition value to report the external request for a shutdown of the application (used for imagectn). Affects: dcmnet/include/assoc.h - Added support for external shutdown of the application (this feature is enabled via a command line option, default is disabled). Affects: imagectn/apps/imagectn.cc - Moved parts of unused code to avoid compiler warnings when compiling with #define NODISPLAY. Affects: imagectn/apps/imagectn.cc - Fixed bug in output message. Affects: imagectn/libsrc/dbindex.cc - Renamed GrayscaleHardcopy to HardcopyGrayscale (which is the correct term according to the DICOM standard). Affects: dcmpstat/include/dvcache.h dcmpstat/include/dviface.h dcmpstat/libsrc/dviface.cc dcmpstat/apps/dcmpsprt.cc - Added support for multi-frame images and multiple references from a single presentation to a number of images. Affects: dcmpstat/include/dviface.h dcmpstat/include/dvpstat.h dcmpstat/libsrc/dviface.cc - Removed methods which were already marked as "retired". Affects: dcmpstat/include/dviface.h dcmpstat/include/dvpscf.h dcmpstat/include/dvpstat.h dcmpstat/libsrc/dviface.cc dcmpstat/libsrc/dvpstat.cc - Added interface methods to support the following new features: - start/terminate query/retrieve server - load stored print objects - create print preview from hardcopy grayscale images - check DICOM IODs for correctness (not yet implemented) - set presentation LUT for film session (not yet implemented) - start/terminate print server (not yet implemented) - write/filter log messages (not yet implemented) Affects: dcmpstat/include/dviface.h dcmpstat/include/dvpstyp.h - Added support for the folowwing new features: - start/terminate query/retrieve server - load stored print objects - create print preview from hardcopy grayscale images Affects: dcmpstat/libsrc/dviface.cc - Added new section to the config file describing the query/retrieve server settings. Affects: dcmpstat/include/dvpscf.h dcmpstat/libsrc/dvpscf.cc dcmpstat/tests/test.cfg - Added methods to set, get and store the printer name in the stored print object (PrinterCharacteristicsSequence). Affects: dcmpstat/include/dvpssp.h dcmpstat/libsrc/dvpssp.cc - Added new function allowing to set a VOILUT created from a given gamma value. Affects: dcmpstat/include/dvpstat.h dcmpstat/libsrc/dvpstat.cc - Rebuilt makefile dependencies. Affects: dcmpstat/libsrc/Makefile.dep dcmpstat/apps/Makefile.dep - Corrected typo/formatting. Affects: dcmpstat/apps/dcmmklut.cc - Renamed some variables to avoid compiler warnings (reported by gcc 2.9x with additional compiler flags). Affects: dcmpstat/include/dvpstat.h dcmpstat/libsrc/dviface.cc dcmpstat/libsrc/dvpstat.cc - Changed #ifdef statement to ensure correct compilation under Windows. Affects: dcmdata/libsrc/dcuid.cc **** Changes from 2000.05.25 (riesmeier) - Added member variable to member initialization list (avoid compiler warnings). Affects: dcmimgle/include/diobjcou.h - Removed ununsed variable from parameter list (avoid compiler warnings). Affects: dcmimgle/libsrc/diimage.cc **** Changes from 2000.05.09 (riesmeier) - Rebuilt makefile dependencies (old version referenced .cxx file instead of .cc). Affects: dcmpstat/jni/Makefile.dep **** Changes from 2000.05.03 (eichelberg) - Added new class GlobalDcmDataDictionary which implements read/write lock semantics for safe access to the DICOM dictionary from multiple threads in parallel. The global dcmDataDict now uses this class. Affects: dcmdata/apps/dcmdump.cc dcmdata/include/dcdict.h dcmdata/include/dchashdi.h dcmdata/libsrc/dcdict.cc dcmdata/libsrc/dchashdi.cc dcmdata/libsrc/dctag.cc dcmdata/libsrc/mkdeftag.cc dcmdata/libsrc/mkdictbi.cc - Updated dcmpstat apps for changes in dcmimgle. Affects: dcmpstat/apps/dcmp2pgm.cc dcmpstat/apps/dcmprtsv.cc dcmpstat/apps/dcmpsprt.cc **** Changes from 2000.05.03 (riesmeier) - Removed most informational and some warning messages from release build (#ifndef DEBUG). Affects: dcmimgle/include/diinpxt.h dcmimgle/include/dimoipxt.h dcmimgle/include/dimoopxt.h dcmimgle/include/dimopxt.h dcmimgle/include/discalet.h dcmimgle/libsrc/dicielut.cc dcmimgle/libsrc/didispfn.cc dcmimgle/libsrc/digsdlut.cc dcmimgle/libsrc/diimage.cc dcmimgle/libsrc/diluptab.cc dcmimgle/libsrc/diutils.cc **** Changes from 2000.04.28 (riesmeier) - DebugLevel - global for the module - now derived from OFGlobal (MF-safe). Affects: dcmimgle/apps/dcmdspfn.cc dcmimgle/include/diinpxt.h dcmimgle/include/dimoipxt.h dcmimgle/include/dimoopxt.h dcmimgle/include/dimopxt.h dcmimgle/include/discalet.h dcmimgle/include/diutils.h dcmimgle/libsrc/dcmimage.cc dcmimgle/libsrc/diciefn.cc dcmimgle/libsrc/dicielut.cc dcmimgle/libsrc/didispfn.cc dcmimgle/libsrc/didocu.cc dcmimgle/libsrc/digsdfn.cc dcmimgle/libsrc/digsdlut.cc dcmimgle/libsrc/diimage.cc dcmimgle/libsrc/diluptab.cc dcmimgle/libsrc/dimoimg.cc dcmimgle/libsrc/dimomod.cc dcmimgle/libsrc/diovlay.cc dcmimgle/libsrc/diovlimg.cc dcmimgle/libsrc/diovpln.cc dcmimgle/libsrc/diutils.cc - ObjectCounter uses now class OFMutex to be MT-safe. Affects: dcmimgle/include/diobjcou.h **** Changes from 2000.04.27 (riesmeier) - Dcmimgle library code now consistently uses ofConsole for error output. Affects: dcmimgle/include/dcmimage.h dcmimgle/include/diinpx.h dcmimgle/include/diinpxt.h dcmimgle/include/dimoipxt.h dcmimgle/include/dimoopxt.h dcmimgle/include/dimopxt.h dcmimgle/include/discalet.h dcmimgle/libsrc/dcmimage.cc dcmimgle/libsrc/diciefn.cc dcmimgle/libsrc/dicielut.cc dcmimgle/libsrc/didispfn.cc dcmimgle/libsrc/didocu.cc dcmimgle/libsrc/digsdfn.cc dcmimgle/libsrc/digsdlut.cc dcmimgle/libsrc/diimage.cc dcmimgle/libsrc/diinpx.cc dcmimgle/libsrc/diluptab.cc dcmimgle/libsrc/dimoimg.cc dcmimgle/libsrc/dimomod.cc dcmimgle/libsrc/dimopx.cc dcmimgle/libsrc/diovlay.cc dcmimgle/libsrc/diovlimg.cc dcmimgle/libsrc/diovpln.cc dcmimgle/libsrc/diutils.cc **** Changes from 2000.04.14 (eichelberg) - Added new class OFConsole and global instance ofConsole which provide access to standard output and error streams in a way that allows multiple threads to safely create output concurrently. Affects: ofstd/include/ofconsol.h ofstd/libsrc/ofconsol.cc - Added unprotected get methods, required for the cmdata debug facility. Affects: ofstd/include/ofconsol.h - Adapted all ofstd library classes to consistently use ofConsole for output. Affects: ofstd/include/ofcmdln.h ofstd/include/ofconapp.h ofstd/libsrc/Makefile.dep ofstd/libsrc/ofcmdln.cc ofstd/libsrc/ofconapp.cc ofstd/libsrc/ofthread.cc ofstd/tests/Makefile.dep - Created new templace class OFGlobal which allows to easily implement mutex protected global flags. Added: ofstd/include/ofglobal.h - If compiled on Unix platforms with -D_REENTRANT, OFFilenameCreator uses the reentrant Posix routine rand_r instead of rand and srand. Affects: ofstd/libsrc/offname.cc - Minor change to make OFString thread safe. This completes the changes required to make the ofstd library safe for use in multithread applications. Affects: ofstd/libsrc/ofstring.cc - Removed default value from output stream passed to print() method. Required for use in multi-thread environments. Affects: dcmdata/include/dcbytstr.h dcmdata/include/dcdatset.h dcmdata/include/dcdicdir.h dcmdata/include/dcdirrec.h dcmdata/include/dcfilefo.h dcmdata/include/dcitem.h dcmdata/include/dcmetinf.h dcmdata/include/dcpixel.h dcmdata/include/dcpixseq.h dcmdata/include/dcpxitem.h dcmdata/include/dcsequen.h dcmdata/include/dcvrat.h dcmdata/include/dcvrfd.h dcmdata/include/dcvrfl.h dcmdata/include/dcvrobow.h dcmdata/include/dcvrsl.h dcmdata/include/dcvrss.h dcmdata/include/dcvrui.h dcmdata/include/dcvrul.h dcmdata/include/dcvrulup.h dcmdata/include/dcvrus.h dcmnet/apps/echoscu.cc dcmnet/apps/findscu.cc dcmnet/apps/movescu.cc dcmnet/apps/storescp.cc dcmnet/apps/storescu.cc dcmnet/libsrc/dimse.cc imagectn/apps/scefind.cc imagectn/apps/sceget.cc imagectn/apps/scemove.cc imagectn/apps/tinet.cc imagectn/apps/tiquery.cc imagectn/libsrc/dbfind.cc imagectn/libsrc/dbutils.cc wlistctn/apps/scefind.cc wlistctn/tests/wltest.cc - Global VR generation flags are now derived from OFGlobal and, thus, safe for use in multi-thread applications. Affects: dcmdata/apps/Makefile.dep dcmdata/apps/dcmconv.cc dcmdata/apps/dump2dcm.cc dcmdata/include/dcvr.h dcmdata/libsrc/Makefile.dep dcmdata/libsrc/dcvr.cc dcmpstat/apps/dcmprtsv.cc dcmpstat/apps/dcmpsrcv.cc dcmpstat/apps/dcmpssnd.cc imagectn/apps/imagectn.cc imagectn/apps/ti.cc wlistctn/apps/wlistctn.cc - Dcmdata debug facility now uses ofConsole for output. Affects: dcmdata/include/dcdebug.h dcmdata/libsrc/dcdebug.cc - Global flag dcmEnableAutomaticInputDataCorrection now derived from OFGlobal and, thus, safe for use in multi-thread applications. Affects: dcmdata/include/dcobject.h dcmdata/libsrc/dcbytstr.cc dcmdata/libsrc/dcobject.cc dcmdata/libsrc/dcvrui.cc - Dcmdata library code now consistently uses ofConsole for error output. Affects: dcmdata/libsrc/cmdlnarg.cc dcmdata/libsrc/dcdatset.cc dcmdata/libsrc/dcdicdir.cc dcmdata/libsrc/dcdict.cc dcmdata/libsrc/dcdirrec.cc dcmdata/libsrc/dcelem.cc dcmdata/libsrc/dcfilefo.cc dcmdata/libsrc/dchashdi.cc dcmdata/libsrc/dcitem.cc dcmdata/libsrc/dcmetinf.cc dcmdata/libsrc/dcpxitem.cc dcmdata/libsrc/dcsequen.cc dcmdata/libsrc/dcstream.cc dcmdata/libsrc/dcvrat.cc dcmdata/libsrc/dcvrfd.cc dcmdata/libsrc/dcvrfl.cc dcmdata/libsrc/dcvrobow.cc dcmdata/libsrc/dcvrsl.cc dcmdata/libsrc/dcvrss.cc dcmdata/libsrc/dcvrul.cc dcmdata/libsrc/dcvrulup.cc dcmdata/libsrc/dcvrus.cc - Restructured class DcmTag. Instances don't keep a permanent pointer to a data dictionary entry anymore. Required for MT applications. Affects: dcmdata/apps/dcmgpdir.cc dcmdata/include/dctag.h dcmdata/libsrc/dctag.cc - Made function dcmGenerateUniqueIdentifer thread safe by protecting the counter with a Mutex and using gethostbyname_r instead of gethostbyname on Posix platforms. dcmdata/include/dcuid.h dcmdata/libsrc/dcuid.cc - Made function DcmCodec and related functions thread safe. registerGlobalCodec() should not be called anymore from the constructor of global objects. Affects: dcmdata/include/dccodec.h dcmdata/libsrc/dccodec.cc dcmdata/libsrc/dcpixel.cc - Minor changes for thread safety. Affects: dcmdata/include/cmdlnarg.h dcmdata/include/dcxfer.h dcmdata/libsrc/dcxfer.cc dcmdata/libsrc/dcdictbi.cc dcmdata/libsrc/dcdictbi.nul dcmdata/libsrc/dcdictzz.cc dcmdata/libsrc/mkdeftag.cc dcmdata/libsrc/mkdictbi.cc - Adapted to changed parameter list for command line class Affects: dcmimgle/apps/dcmdspfn.cc **** Changes from 2000.04.12 (eichelberg) - Fixed bug in ti leading to segmentation fault if database index file was opened without write permission. Thanks to Sebastian Meyer for the bug report. Affects: imagectn/apps/tiui.cc **** Changes from 2000.03.29 (eichelberg) - Added new classes providing an operating system independent abstraction for threads, thread specific data, semaphores, mutexes and read/write locks. Added: ofstd/include/ofthread.h ofstd/libsrc/ofthread.cc ofstd/tests/tstthred.cc Affects: ofstd/libsrc/Makefile.dep ofstd/libsrc/Makefile.in ofstd/tests/Makefile.dep ofstd/tests/Makefile.in - Added tests to configure which look for Solaris and Posix thread libraries and set Makefile defaults appropriately. Affects: config/Makefile.def.in config/acconfig.h config/configure config/configure.in config/include/config.h.in config/include/cfwin32.h dcmtk-3.6.0/docs/CHANGES.3300000644000310500011400000010656407220077534014310 0ustar joergrdicom3Release 3.3 (Public Release - 1997.10.07) - Updated Version Number and Implementation Version Name to reflect the current public release (3.3) Affects: dcmdata/include/dcuid.h **** Changes from 97.10.07 (eichelberg) - Corrected table column name inconsistency in Worklist CTN. Based on a suggestion from Heinz Blendinger (mailto:Heinz.Blendinger@med.siemens.de). Affects: wlistctn/perl/worklist.pl - Corrected passing of pointer instead of reference. Affects: dcmdata/apps/dcmgpdir.cc - Updated VisualC++ 4.0 Makefile. Affects: config/systems/win32/msvc4.mak **** Changes from 97.10.01 (hewett) - Minor correction to imagectn's index file code to use the changed attribute names from dcdeftag.h Affects: imagectn/libsrc/dbindex.cc imagectn/libsrc/dbutils.cc - Corrections to mistyped attribute names in data dictionary (dicom.dic). Regenerated the tag definitions include file and the builtin data dictionary code. Affects: dcmdata/libsrc/dicom.dic dcmdata/include/dcdeftag.h dcmdata/libsrc/dcdictzz.cc - Fixed OFString::operator<< handling of leading whitespace. Leading whitespace is now skipped. Affects: ofstd/libsrc/ofstring.cc - Fixed segmentation fault for OFString's find_... methods when current string is empty. Affects: ofstd/libsrc/ofstring.h ofstd/libsrc/ofstring.cc **** Changes from 97.10.01 (eichelberg) - Added FAQ entry for compiling dcmtk on Solaris with the Sun Workshop 4.x compilers. Affects: FAQ - Prototype for wait3() now also searched in during configure process. Needed for NeXTStep. Affects: config/configure.in config/configure - Including if available in dcmdata/libsrc/dcerror.cc Needed on SunOS. Affects: dcmdata/libsrc/dcerror.cc **** Changes from 97.09.22 (hewett) - Modified dcmgpdir.cc to use the new attribute existance tests from DcmItem and the global list dcmImageSOPClassUIDs of SOP Classes which can be referenced from a DICOMDIR IMAGE record. Affects: dcmdata/apps/dcmgpdir.cc - Added a global list of Image SOP Classes UIDs (dcmImageSOPClassUIDs) which is used by dcmgpdir to identify SOP Classes which can be referenced from a DICOMDIR IMAGE record. Affects: dcmdata/include/dcuid.h dcmdata/libsrc/dcuid.cc - Added 2 simple methods to test for the existance of an attribute to DcmItem class (tagExists and tagExistsWithValue). This code was part of dcmgpdir.cc but is more generally useful. Affects: dcmdata/include/dcitem.h dcmdata/libsrc/dcitem.cc - Added 2 methods to find an attribute and retrieve numeric values to DcmItem class (findIntegerNumber and findRealNumber). The old method findLong is now marked as obsolete and reimplemented using findIntegerNumber. Affects: dcmdata/include/dcitem.h dcmdata/libsrc/dcitem.cc - Added a method to retrieve the original transfer syntax of a read meta-header (getOriginalXfer). This functionality is needed by the DCMCHECK package. Affects: dcmdata/include/dcmetinf.h **** Changes from 97.09.18 (eichelberg) - Missing operator= added to class DcmDictEntryListIterator Affects: dcmdata/include/dchashdi.h - Name clash for "changeVR" attribute/local variable removed. Affects: dcmdata/libsrc/dcvrpobw.cc - Overloading ambiguity removed. Affects systems on which NULL is defined as a (typeless) 0. OFString comparisons with a non-casted NULL will cause compile errors on such systems because 0 is a valid pointer and a valid char at the same time. Affects: dcmdata/apps/dcmgpdir.cc - Now also trying include file when looking for gethostid(). function prototype. Required for OSF/1. Affects: config/configure.in config/configure - Many minor type conflicts (e.g. long passed as int) solved. Affects: dcmdata/libsrc/dchashdi.cc dcmdata/libsrc/dcpixel.cc dcmnet/libsrc/assoc.cc dcmnet/libsrc/dimcmd.cc dcmnet/libsrc/dimmove.cc dcmnet/libsrc/dimse.cc dcmnet/libsrc/dulfsm.cc imagectn/apps/imagectn.cc imagectn/libsrc/dbfind.cc imagectn/libsrc/dbmove.cc imagectn/libsrc/dbstore.cc imagectn/libsrc/dbutils.cc wlistctn/apps/wlistctn.cc wlistctn/libsrc/wrklstdb.cc wlistctn/tests/wltest.cc - Removed unused (and undocumented) option -XF from wlistctn. Affects: wlistctn/apps/wlistctn.cc - Corrected forward and friend declarations (needed for DEC cxx) Affects: dcmdata/include/dchashdi.h - Some systems, e.g. NeXTStep, need the third argument for fcntl calls to be casted to int. Other systems, e.g. OSF1/Alpha, won't accept this because int and struct flock * have different sizes. The workaround used here is to use a typecast to int if sizeof(void *) == sizeof(int) and leave it away otherwise. Affects: config/configure config/configure.in config/include/config.h.in dcmnet/libsrc/dcompat.cc wlistctn/libsrc/wrklstdb.cc **** Changes from 97.09.12 (eichelberg) - Corrected bug in wlistctn perl scripts leading to incorrect accession numbers when application entity titles longer than 12 characters were used. Updated documentation to recommend AEtitles to be unique (significant) within the first eight letters. Based on a suggestion from Heinz Blendinger (mailto:Heinz.Blendinger@med.siemens.de). Affects: wlistctn/docs/wwwapp.doc wlistctn/docs/wwwapp.txt wlistctn/perl/workedit.pl wlistctn/perl/write.ph Removed: wlistctn/docs/wwwapp.ps - Command line option '-h' in storescp now works correctly. Affects: dcmnet/apps/storescp.cc - The algorithm introduced on 97.08.28 to detect incorrect odd-length value fields falsely reported undefined length sequences and items to be wrong. Corrected. Affects: dcmdata/libsrc/dcitem.cc dcmdata/libsrc/dcsequence.cc **** Changes from 97.09.12 (hewett) - Added FAQ entries and more detailed documentation about using built-in data dictionaries. Several people have complained that even small apps take too long to start. They don't have to and the dcmdata/docs/datadict.txt now explains have to avoid the start-up overhead of loading a data dictionary from a text file. Affects: FAQ dcmdata/docs/datadict.txt - Updated INSTALL instructions for Windows95/NT and current supported systems collection. Affects: INSTALL - Modified the dcmgpdir program to use the OFString and OFList classes. Deleted program specific String and StringList classes. Affects: dcmdata/apps/dcmgpdir.cc **** Changes from 97.09.11 (hewett) - Fixed OFString bug associated with the assign method when n == OFString_npos. Since OFString_npos is represented by -1 the assign method was reserving zero space for the string. This case is now explicitly handled. Affects: ofstd/libsrc/ofstring.cc - Corrected erroneous setting of the source filename when constructing a DcmDirrectoryRecord. This corrects a bug introduced by the changes from 97.07.21. Affects: dcmdata/libsrc/dcdirrec.cc - Added a putOFStringArray method Affects: dcmdata/include/dcbytstr.h dcmdata/libsrc/dcbytstr.cc dcmdata/include/dcelem.h dcmdata/libsrc/dcelem.cc - Modified getOFString method arguments by removing a default value for the pos argument. By requiring the pos argument to be provided ensures that callers realise getOFString only gets one component of a multi-valued string. Affects: dcmdata/include/dcelem.h dcmdata/include/dcbytstr.h dcmdata/include/dcvrae.h dcmdata/include/dcvrcs.h dcmdata/include/dcvrds.h dcmdata/include/dcvrdt.h dcmdata/include/dcvris.h dcmdata/include/dcvrlo.h dcmdata/include/dcvrlt.h dcmdata/include/dcvrpn.h dcmdata/include/dcvrsh.h dcmdata/include/dcvrst.h dcmdata/include/dcvrtm.h dcmdata/include/dcitem.h - Changed DcmDicomDir constructor to take const char* arguments. Affects: dcmdata/include/dcdicdir.h dcmdata/libsrc/dcdirdir.cc - Enhanced the configure macro AC_CHECK_PROTOTYPE to check the include files passed as aruments before searching for a prototype. This makes the configure.in file considerably simpler. The include files passed as arguments to the AC_CHECK_PROTOTYPE macro must have already been tested for using the AC_CHECK_HEADERS macro. If not, the include files are assumed not to exist. Affects: config/configure.in config/aclocal.m4 config/configure - Minor changes to eliminate warnings when compiled under the Cygnus GNU-Win32 development envionment. Changed order of initialisers for OFListLink and OFStackLink. Make ~OFLisBase and ~OFStackBase virtual destructors. Affects: ofstd/include/oflist.h ofstd/include/ofstack.h - DUL code now only tries to set the send/receive TCP buffer length socket options if the SO_SNDBUF and SO_RCVBUF preprocessor macros are defined. Attempts to set these socket options will generate an error message on stderr if unavailable. This modification was needed to compiled the dcmnet code under the Cygnus GNU-Win32 development environment. Affects: dcmnet/libsrc/dul.cc dcmnet/libsrc/dulfsm.cc - Conditionally included more standard header files into the the dcmnet compatibility header file to allow appropriate declarations to be picked up. For the Cygnus GNU-Win32 development environment. Affects: dcmnet/include/dcompat.h **** Changes from 97.08.29 (barth) - Adapted Win95 Makefile to support new data dictionary Affects: config/systems/win32/msvc4.mak - Corrected Bug in getOFStringArray Implementation Affects: dcmdata/include/dcbytstr.h dcmdata/libsrc/dcvrae.cc dcmdata/libsrc/dcvrcs.cc dcmdata/libsrc/dcvrds.cc dcmdata/libsrc/dcvrdt.cc dcmdata/libsrc/dcvris.cc dcmdata/libsrc/dcvrlo.cc dcmdata/libsrc/dcvrlt.cc dcmdata/libsrc/dcvrpn.cc dcmdata/libsrc/dcvrsh.cc dcmdata/libsrc/dcvrst.cc dcmdata/libsrc/dcvrtm.cc - Corrected copy constructor for DcmHashDictIterator Affects: dcmdata/include/dchashdi.h **** Changes from 97.08.28 (barth) - Added methods getOFString and getOFStringArray for all string VRs. These methods are able to normalise the value, i. e. to remove leading and trailing spaces. This will be done only if it is described in the standard that these spaces are not relevant. These methods do not test the strings for conformance, this means especially that they do not delete spaces where they are not allowed! getOFStringArray returns the string with all its parts separated by \ and getOFString returns only one value of the string. CAUTION: Currently getString returns a string with trailing spaces removed (if dcmEnableAutomaticInputDataCorrection == OFTrue) and truncates the original string (since it is not copied!). If you rely on this behaviour please change your application now. Future changes will ensure that getString returns the original string from the DICOM object (NULL terminated) inclusive padding. Currently, if you call getOF... before calling getString without normalisation, you can get the original string read from the DICOM object. Affects: dcmdata/include/dcbytstr.h dcmdata/include/dcelem.h dcmdata/include/dcitem.h dcmdata/include/dcvrae.h dcmdata/include/dcvrcs.h dcmdata/include/dcvrds.h dcmdata/include/dcvrdt.h dcmdata/include/dcvris.h dcmdata/include/dcvrlo.h dcmdata/include/dcvrlt.h dcmdata/include/dcvrpn.h dcmdata/include/dcvrsh.h dcmdata/include/dcvrst.h dcmdata/include/dcvrtm.h dcmdata/libsrc/Makefile.dep dcmdata/libsrc/dcbytstr.cc dcmdata/libsrc/dcelem.cc dcmdata/libsrc/dcitem.cc dcmdata/libsrc/dcutils.cc dcmdata/libsrc/dcvrae.cc dcmdata/libsrc/dcvrcs.cc dcmdata/libsrc/dcvrds.cc dcmdata/libsrc/dcvrdt.cc dcmdata/libsrc/dcvris.cc dcmdata/libsrc/dcvrlo.cc dcmdata/libsrc/dcvrlt.cc dcmdata/libsrc/dcvrpn.cc dcmdata/libsrc/dcvrsh.cc dcmdata/libsrc/dcvrst.cc dcmdata/libsrc/dcvrtm.cc - New error messages if length of an element is odd. Previously, no error was reported. But the length is corrected by the method newValueField and so it was impossible for a checking utility to find such an error in DICOM objects. Affects: dcmdata/libsrc/dcitem.cc dcmdata/libsrc/dcsequen.cc **** Changes from 97.08.26 (hewett) - Added +B command line option to imagectn application. Use of this option causes imagectn to bypass the dcmdata encode/decode routines when receiving images and write image data to disk exactly as received in a C-STORE command over the network. Inclusion of this option was suggested by David Clunie (david.clunie@med.ge.com) as being useful for testing. NOTE: This option does _not_ affect sending images. Affects: imagectn/apps/imagectn.cc imagectn/apps/imagectn.h imagectn/apps/scestore.cc - Fix incorrect computation of lengths (both Sequence/Item length and group lengths) for unknown attributes when writing using an explicit-vr transfer syntax. The method DcmXfer::sizeofTagHeader was not properly handling the (internal) EVR_UNKNOWN value representation which is converted to either EVR_UN or EVR_OB when writing out data. Affects: dcmdata/libsrc/dcxfer.cc - New data structures for data-dictionary. The main part of the data-dictionary is now stored in an hash table using an optimized hash function. This new data structure reduces data-dictionary load times by a factor of 4! The data-dictionary specific linked-list has been replaced by a linked list derived from OFList class (see ofstd/include/oflist.h). The only interface modifications are related to iterating over the entire data dictionary which should not be needed by "normal" applications. Affects: dcmdata/include/dcdict.h dcmdata/libsrc/dcdict.cc dcmdata/include/dcdicent.h dcmdata/libsrc/dcdicent.cc dcmdata/include/dctagkey.h dcmdata/include/dctk.h dcmdata/libsrc/mkdeftag.cc dcmdata/libsrc/mkdictbi.cc dcmdata/libsrc/Makefile.in */*/Makefile.dep Added: dcmdata/include/dchashdi.h dcmdata/libsrc/dchashdi.cc Removed: dcmdata/include/dcentlst.h dcmdata/libsrc/dcentlst.cc dcmdata/include/pix.h dcmdata/include/dcentdef.h dcmdata/include/dcentset.h dcmdata/libsrc/dcentset.cc dcmdata/include/dcentbst.h dcmdata/libsrc/dcentbst.cc **** Changes from 97.08.21 (barth) - Change configuration to support SUN CC 4.2 Affects: config/configure.in config/configure **** Changes from 97.08.06 (barth) - Updated Windows NT system dependent files to reflect the tested imagectn. Affects: config/systems/win32/README config/systems/win32/msvc4.mak - Using Windows NT with Visual C++ 4.x the standard open mode for files is TEXT with conversions. For binary files (image files, imagectn database index) this must be changed (e.g. fopen(filename, "...b"); or open(filename, ..... |O_BINARY);) Affects: dcmdata/apps/dcmftest.cc dcmdata/apps/dcmgpdir.cc dcmdata/libsrc/dcdirrec.cc dcmnet/libsrc/dimse.cc dcmnet/libsrc/dulfsm.cc imagectn/apps/scemove.cc imagectn/apps/scestore.cc imagectn/apps/tinet.cc imagectn/libsrc/dbstore.cc imagectn/libsrc/dbutils.cc - Undefine tempnam in Windows NT/95 configuration since the tempnam function of MS Visual C++ has a different semantics as the UNIX version. Affects: config/include/cfwin32.h **** Changes from 97.08.05 (barth) - Adopted Makefile and README for WINDOWS NT/95 Affects: config/systems/win32/README config/systems/win32/msvc4.mak - Corrected error in DUL finite state machine SCPs shall close sockets after the SCU have closed the socket in a normal association release. Therfore, an ARTIM timer is described in DICOM part 8 that is not implemented correctly in the DUL. Since the whole DUL finite state machine is affected, we decided to solve the proble outside the fsm. Now it is necessary to call the ASC_DropSCPAssociation() after the calling ASC_acknowledgeRelease(). Affects: dcmnet/apps/movescu.cc dcmnet/apps/storescp.cc dcmnet/include/assoc.h dcmnet/libsrc/assoc.cc dcmnet/libsrc/dul.cc imagectn/apps/sce.cc wlistctn/apps/sce.cc - Corrected error in DUL: The A-Release-RQ PDU was not read completely. The bytes 7-10 were left on the socket. This created no problems since it was the last read operation on the socket but no error checking was possible for this messages. Affects: dcmnet/libsrc/dulfsm.cc - Change definition of path to database index now using consistently the defines PATH_SEPARATOR and DBINDEXFILE Affects: dcmnet/libsrc/dcompat.cc imagectn/apps/tiquery.cc imagectn/include/imagedb.h imagectn/libsrc/dbutils.cc - Change needed version number of WINSOCK to 1.1 to support WINDOWS 95 Affects: dcmnet/apps/echoscu.cc dcmnet/apps/findscu.cc dcmnet/apps/movescu.cc dcmnet/apps/storescp.cc dcmnet/apps/storescu.cc dcmnet/tests/assctest.cc imagectn/apps/imagectn.cc imagectn/apps/ti.cc - Corrected Error handling of SQ in dump2dcm Affects: dcmdata/apps/dump2dcm.cc **** Changes from 97.07.31 (barth) - Added initialization of error code in DcmPixelData::removeOriginalRepresentation() Affects: dcmdata/libsrc/dcpixel.cc - Error correction and additonal functionality for DcmPolymorphOBOW to support getting and putting of Uint8 and Uint16 data independent of the VR. Affects: dcmdata/include/dcvrpobw.h dcmdata/libsrc/dcvrpobw.cc - new protected method swapValueField for DcmElement Affects: dcmdata/include/dcelem.h dcmdata/libsrc/dcelem.cc **** Changes from 97.07.31 (eichelberg) - New routine stripWhitespace() in dcdict.cc, much faster. Affects: dcmdata/libsrc/dcdict.cc - Created copy constructor for class DcmDictEntry, required by dcmcheck. Affects: dcmdata/include/dcdicent.h dcmdata/libsrc/dcdicent.cc **** Changes from 97.07.29 (barth) - Adaption of ctndisp to change representations if necessary Affects: ctndisp/apps/ctnddico.cc **** Changes from 97.07.24 (barth) - Adaption of Windows NT/95 project files to reflect the use of the OFFIS Standard Library Affects: config/include/cfwin32.h config/systems/win32/msvc4.mak - Adaption of ctndisp to use DcmPixelData Affects: ctndisp/apps/ctnddico.cc - Make DcmCodec:canChangeCoding abstract Affects: dcmdata/include/dccodec.h - Removed const for method DcmRepresentationParameter::copy Affects: dcmdata/include/dcpixel.h dcmdata/libsrc/dcpixel.cc - Removed Warnings from SUN CC 2.0.1 Affects: ctndisp/apps/ctnddico.cc ctndisp/apps/ctndisp.cc ctndisp/apps/ctndsupp.cc ctndisp/libsrc/dispuser.cc dcmdata/include/dcbuf.h dcmdata/libsrc/dcbuf.h dcmdata/libsrc/dcbytstr.cc dcmdata/libsrc/dcelem.cc dcmdata/libsrc/dcitem.cc dcmdata/libsrc/dcstream.cc dcmnet/apps/storescp.cc dcmnet/libsrc/assoc.cc dcmnet/libsrc/cond.cc dcmnet/libsrc/dul.cc dcmnet/libsrc/dulfsm.cc ofstd/include/oflist.h **** Changes from 97.07.21 (barth) - New copy constructor for class OFStack Affects: ofstd/include/ofstack.h ofstd/tests/tststack.cc - Corrected error in length computation of DcmItem for strings in items. Affects: dcmdata/libsrc/dcbytstr.cc - New method DcmElement::detachValueField to give control over the value field to the calling part (see dcelem.h) Affects: dcmdata/include/dcelem.h dcmdata/libsrc/dcelem.cc - Deleted support for DcmPixelItems and DcmPixelSequences in dump2dcm ToDo: New support should be added in the future compatible to the new DcmPixel class. Affects: dcmdata/apps/dump2dcm.cc - Corrected error in DcmDirectoryRecord::write since this routine can change the length of the record after this is calculated in the sequence. Affects: dcmdata/include/dcdirrec.h dcmdata/libsrc/dcdirrec.cc - DcmDirectoryRecord can be build with a referenced Name and a source filename. These name now can differ (lower case - upper case characters). Affects: dcmdata/apps/dcmgpdir.cc dcmdata/include/dcdirrec.h dcmdata/libsrc/dcdicdir.cc dcmdata/libsrc/dcdirrec.cc - With flag DEBUG dcmdump now tries to print the DICOM file even if an error in reading the file was detected. Affects: dcmdata/apps/dcmdump.cc - Support for CP 14. PixelData and OverlayData can have VR OW or OB (depending on the transfer syntax). New internal value representation (only for ident()) for OverlayData. Added: dcmdata/include/dcovlay.h dcmdata/include/dcvrpobw.h dcmdata/libsrc/dcvrpobw.cc Affects: dcmdata/apps/Makefile.dep dcmdata/include/dctk.h dcmdata/include/dcvr.h dcmdata/libsrc/Makefile.dep dcmdata/libsrc/Makefile.in dcmdata/libsrc/dcitem.cc dcmdata/libsrc/dcvrobow.cc - New environment for encapsulated pixel representations. DcmPixelData can contain different representations and uses codecs to convert between them. Codecs are derived from the DcmCodec class. New error codes are introduced for handling of representations. New internal value representation (only for ident()) for PixelData Added: dcmdata/include/dccodec.h dcmdata/include/dcpixel.h dcmdata/libsrc/dccodec.cc dcmdata/libsrc/dcpixel.cc Affects: dcmdata/apps/Makefile.dep dcmdata/apps/dcmconv.cc dcmdata/include/dcdatset.h dcmdata/include/dcerror.h dcmdata/include/dcfilefo.h dcmdata/include/dctk.h dcmdata/include/dcvr.h dcmdata/libsrc/Makefile.dep dcmdata/libsrc/Makefile.in dcmdata/libsrc/dcdatset.cc dcmdata/libsrc/dcerror.cc dcmdata/libsrc/dcitem.cc dcmdata/libsrc/dcobject.cc dcmdata/libsrc/dcpixseq.cc dcmdata/libsrc/dcvrobow.cc - new copy constructor for DcmStack Affects: dcmdata/libsrc/dcdatset.cc dcmdata/libsrc/dcstack.cc - Replace all boolean types (BOOLEAN, CTNBOOLEAN, DICOM_BOOL, BOOL) with one unique boolean type OFBool. Affects: ctndisp/apps/Makefile.dep ctndisp/apps/Makefile.in ctndisp/apps/ctnddico.cc dcmdata/apps/Makefile.dep dcmdata/apps/Makefile.in dcmdata/apps/dcmconv.cc dcmdata/apps/dcmdump.cc dcmdata/apps/dcmftest.cc dcmdata/apps/dcmgpdir.cc dcmdata/apps/dump2dcm.cc dcmdata/include/dcbuf.h dcmdata/libsrc/dcbuf.cc dcmdata/include/dcbytstr.h dcmdata/libsrc/dcbytstr.cc dcmdata/include/dcdatset.h dcmdata/libsrc/dcdatset.cc dcmdata/include/dcdebug.h dcmdata/include/dcdicdir.h dcmdata/libsrc/dcdicdir.cc dcmdata/include/dcdicent.h dcmdata/libsrc/dcdicent.cc dcmdata/include/dcdict.h dcmdata/libsrc/dcdict.cc dcmdata/include/dcdirrec.h dcmdata/libsrc/dcdirrec.cc dcmdata/include/dcelem.h dcmdata/libsrc/dcelem.cc dcmdata/include/dcfilefo.h dcmdata/libsrc/dcfilefo.cc dcmdata/include/dcitem.h dcmdata/libsrc/dcitem.cc dcmdata/include/dclist.h dcmdata/include/dcmetinf.h dcmdata/libsrc/dcmetinf.cc dcmdata/include/dcobject.h dcmdata/libsrc/dcobject.cc dcmdata/include/dcpixseq.h dcmdata/libsrc/dcpixseq.cc dcmdata/include/dcsequen.h dcmdata/libsrc/dcsequen.cc dcmdata/include/dcstack.h dcmdata/libsrc/dcstack.cc dcmdata/include/dcstream.h dcmdata/libsrc/dcstream.cc dcmdata/include/dctypes.h dcmdata/include/dcutils.h dcmdata/libsrc/dcutils.cc dcmdata/include/dcvr*.h dcmdata/libsrc/dcvr*.cc dcmdata/libsrc/Makefile.dep dcmdata/libsrc/Makefile.in dcmdata/libsrc/dcdictzz.cc dcmdata/libsrc/dcentlst.cc dcmdata/libsrc/mkdictbi.cc dcmnet/apps/Makefile.* dcmnet/apps/*.cc dcmnet/include/assoc.h dcmnet/include/cond.h dcmnet/include/di*.h dcmnet/include/dul.h dcmnet/libsrc/Makefile.* dcmnet/libsrc/assoc.cc dcmnet/libsrc/cond.cc dcmnet/libsrc/dimcmd.* dcmnet/libsrc/dimfind.cc dcmnet/libsrc/dimmove.cc dcmnet/libsrc/dimse.cc dcmnet/libsrc/diutil.cc dcmnet/libsrc/dul.cc dcmnet/libsrc/dulconst.cc dcmnet/libsrc/dulextra.cc dcmnet/libsrc/dulfsm.cc dcmnet/libsrc/dulparse.cc dcmnet/libsrc/dulpriv.h dcmnet/tests/Makefile.dep dcmnet/tests/Makefile.in dcmnet/tests/assctest.cc imagectn/apps/Makefile.* imagectn/apps/imagectn.* imagectn/apps/sce.cc imagectn/apps/scefind.cc imagectn/apps/scemove.cc imagectn/apps/scestore.cc imagectn/apps/ti.* imagectn/apps/tinet.* imagectn/apps/tiquery.* imagectn/apps/tiui.cc imagectn/include/imagedb.h imagectn/libsrc/Makefile.* imagectn/libsrc/dbfind.cc imagectn/libsrc/dbindex.cc imagectn/libsrc/dbmove.cc imagectn/libsrc/dbpriv.h imagectn/libsrc/dbstore.cc imagectn/libsrc/dbutils.cc imagectn/tests/Makefile.* imagectn/tests/dbregimg.cc wlistctn/apps/Makefile.* wlistctn/apps/sce.cc wlistctn/apps/scefind.cc wlistctn/apps/wlistctn.* wlistctn/include/wrklstdb.h wlistctn/libsrc/Makefile.* wlistctn/libsrc/wrklstdb.cc wlistctn/tests/Makefile.* wlistctn/tests/wltest.cc wlistctn/wwwapps/Makefile.* wlistctn/wwwapps/readoviw.cc wlistctn/wwwapps/readwlst.cc wlistctn/wwwapps/writwlst.cc **** Changes from 97.07.17 (barth) - Corrected error in swapping routine Affects: dcmdata/libsrc/dcswap.cc **** Changes from 97.07.16 (eichelberg) - Added test for presence of to configure. Needed for dcmcheck. Affects: config/configure.in config/configure config/include/config.h.in **** Changes from 97.07.07 (eichelberg) - Simplified OFString code to allow compilation with Sun CC 2.0.1 Affects: ofstd/include/ofstring.h **** Changes from 97.07.07 (hewett) - Added string class OFString to ofstd library. This class implements a subset of the ANSI C++ "string" class. Added: ofstd/include/ofstring.h ofstd/libsrc/ofstring.cc ofstd/tests/tstring.cc Affects: config/configure config/configure.in config/include/config.h.in ofstd/libsrc/Makefile.in ofstd/tests/Makefile.in **** Changes from 97.07.07 (barth) - Changed macros EXTRACT_LONG_BIG and EXTRACT_SHORT_BIG to avoid compiler warnings on SUN-CC and Windows NT/95 Affects: dcmnet/libsrc/dulstruc.h - Corrected destructor for OFListBase, now the dummy element is deleted. Affects: ofstd/include/oflist.h ofstd/libsrc/oflist.cc - Changed type for Tag attribute in DcmObject from prointer to value Affects: dcmdata/include/dcobject.h dcmdata/libsrc/dcitem.cc dcmdata/libsrc/dcobject.cc dcmdata/libsrc/dcpixseq.cc dcmdata/libsrc/dcpxitem.cc dcmdata/libsrc/dcvrobow.cc - Changed parameter type DcmTag & to DcmTagKey & in all search functions in DcmItem, DcmSequenceOfItems, DcmDirectoryRecord and DcmObject Affects: dcmdata/include/dcitem.h dcmdata/include/dcdirrec.h dcmdata/include/dcsequen.h dcmdata/libsrc/dcdirrec.cc dcmdata/libsrc/dcelem.cc dcmdata/libsrc/dcitem.cc dcmdata/libsrc/dcobject.cc dcmdata/libsrc/dcsequen.cc wlistctn/libsrc/wrklstdb.cc - Enhanced (faster) byte swapping routine. swapIfNecessary moved from a method in DcmObject to a general function. Affects: dcmdata/include/dcobject.h dcmdata/include/dcswap.h dcmdata/libsrc/Makefile.dep dcmdata/libsrc/dcelem.cc dcmdata/libsrc/dcitem.cc dcmdata/libsrc/dcobject.cc dcmdata/libsrc/dcpxitem.cc dcmdata/libsrc/dcsequen.cc dcmdata/libsrc/dcswap.cc - Corrected include for stdlib Affects: dcmdata/libsrc/dcstack.cc **** Changes from 97.07.04 (eichelberg) - configure now also tests if available when searching for a select() prototype. Updated files using select() to include and if available (needed for AIX). Affects: config/configure config/configure.in dcmnet/libsrc/assoc.cc dcmnet/libsrc/dul.cc dcmnet/libsrc/dulextra.cc dcmnet/libsrc/dulfsm.cc - Simplified some sizeof() constructs to avoid compiler warnings on the IBM xlC compiler (AIX 3.x). Affects: dcmnet/libsrc/dulconst.cc dcmnet/libsrc/dulfsm.cc dcmnet/libsrc/dulparse.cc dcmnet/libsrc/dulpres.cc imagectn/apps/imagectn.cc wlistctn/apps/wlistctn.cc - Now including in dcstream.cc, required for systems without . Affects: dcmdata/libsrc/dcstream.cc **** Changes from 97.07.03 (barth) - removed debugging functions Bdebug() and Edebug() since they write a static array and are not very useful at all. Cdebug and Vdebug are merged since they have the same semantics. The debugging functions in dcmdata changed their interfaces (see dcmdata/include/dcdebug.h) Affects: dcmdata/apps/dcmconv.cc dcmdata/apps/dcmdump.cc dcmdata/apps/dcmgpdir.cc dcmdata/apps/dump2dcm.cc dcmdata/include/dcdebug.h dcmdata/libsrc/dcbytstr.cc dcmdata/libsrc/dcdatset.cc dcmdata/libsrc/dcdebug.cc dcmdata/libsrc/dcdicdir.cc dcmdata/libsrc/dcdirrec.cc dcmdata/libsrc/dcelem.cc dcmdata/libsrc/dcfilefo.cc dcmdata/libsrc/dcitem.cc dcmdata/libsrc/dclist.cc dcmdata/libsrc/dcmetinf.cc dcmdata/libsrc/dcobject.cc dcmdata/libsrc/dcpixseq.cc dcmdata/libsrc/dcpxitem.cc dcmdata/libsrc/dcsequen.cc dcmdata/libsrc/dcstack.cc dcmdata/libsrc/dcswap.cc dcmdata/libsrc/dcutils.cc dcmdata/libsrc/dcvr??.cc dcmdata/libsrc/dcvrobow.cc dcmdata/libsrc/dcxfer.cc - corrected Bug in DcmDecimalString::getFloat64 (Thanks to Phil Liao ) Affects: dcmdata/libsrc/dcvrds.cc - Adapt the WINDOWS NT/95 project files to the preliminary release of the OFFIS Standard Library Affects: config/systems/win32/msvc4.mak config/include/cfwin32.h **** Changes from 97.07.03 (eichelberg) - Corrected typo in configure messages. Affects: */configure config/templates/configure.mod - Corrected bug in configure module - all tests trying to link or run a test program could fail (and, therefore, report an incorrect result) if libg++.a was not found in the default link path. Affects: config/aclocal.m4 config/configure - New shell script config/changext changes the file name extension for all C++ files from .cc to a different extension. This is useful for C++ compilers which do note recognise ".cc" as a valid extension for C++ code. Added: config/changext.sh **** Changes from 97.07.02 (barth) - Preliminary release of the OFFIS Standard Library. In the future this library shall contain a subset of the ANSI C++ Library (Version 3) that works on a lot of different compilers. Additionally this library shall include classes and functions that are often used. All classes and functions begin with OF... This library is independent of the DICOM development and shall contain no DICOM specific stuff. Added: ofstd directory with Makefiles, etc. ofstd/include/ofstack.h ofstd/include/oflist.h ofstd/include/oftypes.h ofstd/libsrc/oflist.cc ofstd/tests/tststack.cc ofstd/tests/tstlist.cc ofstd/tests/tstlist.out (output of tstlist program) ofstd/tests/tlist.cc ofstd/tests/tlist.out Affects: config/acconfig.h config/aclocal.m4 config/configure config/configure.in config/include/config.h.in config/modules config/include/cfwin32.h **** Changes from 97.07.01 (eichelberg) - Fixed bug in DICOM Upper Layer module - software interrupts (e.g. SIGUSR1) caused the upper layer to return error codes when a blocked read() or write() operation to a socket was interrupted. Affects: dcmnet/libsrc/dulfsm.cc **** Changes from 97.06.26 (eichelberg) - Fixed bug in DIMSE module - the mandatory tag (0000,0000) (command group length) was created only for DIMSE-RQ messages but not for DIMSE-RSP messages. Affects: dcmnet/libsrc/dimcmd.cc **** Changes from 97.06.26 (barth) - Added systems directory for support of systems that do not support the "configure" mechanism Added: config/systems Affects: config/docs/config.txt - Added configuration for Windows 95/NT Visual C++ 4.0 Added: config/systems/win32 config/systems/win32/README config/systems/win32/msvc4.mak - Added tests for header files io.h and _findfirst function (needed for Windows 95/NT) Affects: config/configure.in config/configure config/include/cfmwerks.h config/include/cfwin32.h config/include/config.h.in - Added function version expandFileNames for Windows NT/95 Affects: dcmdata/apps/dcmgpdir.cc - Changed names for enumeration values in DB_KEY_TYPE since the value OPTIONAL was predefined for Windows 95/NT Affects: imagectn/libsrc/dbfind.cc imagectn/libsrc/dbmove.cc imagectn/libsrc/dbpriv.h imagectn/libsrc/dbutils.cc - Include Additional headers (winsock.h, io.h) for Windows NT/95 Affects: dcmdata/libsrc/mkdeftag.cc dcmdata/libsrc/mkdictbi.cc dcmdata/apps/dcmgpdir.cc imagectn/apps/imagectn.cc imagectn/apps/scemove.cc imagectn/apps/scestore.cc imagectn/apps/tinet.cc imagectn/libsrc/dbpriv.h - Include tests for changing of user IDs and the using of fork in code since Windows NT/95 do not support this Affects: dcmnet/apps/movescu.cc imagectn/apps/imagectn.cc - Calling of signal function only for existing signals (Windows NT/95 do not have the same set of signals as UNIX). Affects: imagectn/apps/ti.cc - Corrected error interchanged parameters in a call Affects: dcmnet/apps/movescu.cc **** Changes from 97.06.13 (barth) - Corrected printing of OW values. The length of the output array was computed incorrectly. Affects: dcmdata/libsrc/dcvrobow.cc dcmtk-3.6.0/docs/ANNOUNCE.3530000644000310500011400000001173510104175061014433 0ustar joergrdicom3 ANNOUNCEMENT Version 3.5.3 of the OFFIS DCMTK (DICOM ToolKit) software is now available for public release. This release includes the following main changes over the previous version (Version 3.5.2): - DCMTK 3.5.3 builds correctly with GNU gcc 3.3 and 3.4. - Better ISO C++ and STL compliance. - Various enhancements in the configure system which now works correctly without manual interaction on more platforms, e.g. MinGW. External libraries are automatically detected if installed in the standard path. - Added CMake project files for improved configuration on Windows systems. MSVC 6.0 project files are still part of the source code package, though. - The new application dcmodify allows to modify DICOM files from the command line, i.e. replace, insert and remove particular tags. - The new application xml2dcm converts the XML output of dcm2xml back to DICOM format (uses libxml2). - The new application xml2dsr converts the XML output of dsr2xml back to DICOM format (uses libxml2). - Enhanced worklist SCP by supporting more optional matching and return keys. Improved handling of sequences with multiple items and nested sequences. - Findscu now supports C-FIND over TLS (Security Enhancements One). - Print SCU and SCP now support TLS connections. Print SCP now also supports the Verification Service Class. - Added support for configuration file based association negotiation profiles to network module. Currently used by storescp and storescu. - Added support for TCP wrappers based host access control (uses libwrap). Currently used by storescp, movescu, wlmscpfs and imagectn. - Introduced wrapper class for creating DICOMDIR files, used by dcmgpdir and dcmmkdir. Improved performance when adding a large number of DICOM files. - Enhanced Structured Reporting module: added support for the Identical Documents Sequence, the Content Template Sequence, the Coding Scheme Identification Sequence, new SOP classes, etc. - Added PNG export option to dcm2pnm and dcmj2pnm (uses libpng). - Added support for minimum and maximum density to calibration routines (required for printers). - Enhanced handling of Icon Image Sequence, e.g. uncompressed icon image in a compressed image dataset. - Added new helper methods to access and/or delete data elements. - Added support for so-called command files ("@filename") which can be used to summarize command line options and parameters. - Introduced new, more consistent and "standard" conformant directory structure for "make install". - Enhanced documentation: switched to Doxygen for generating HTML and CHM files as well as man pages for all command line tools; added simple code examples for typical use cases. - The DICOM data dictionary has been re-worked based on the latest supplements and correction proposals, as usual. - Many bug fixes and minor improvements as usual - see the CHANGES.353 file for more details. Many people have contributed to this new release of DCMTK, appearing here in alphabetical order. Thank you very much for your support! Stefan Allers Herve Baekeland Andreas Barth Jessica Brandt David Clunie Josh Coleman Diego Razvan Costea-Barlutiu Michael Doppler Syam Gadde Rick H. Alexander Haderer Asger Halkier Michael Heber Andreas Heiduk Anibal Jodorcovsky Gordon Klos Peter Klotz Bernd Kuemmerlen David Lappen Kenneth Manley Arnaud Masson Markus Mertens Gilles Mevel Henning Meyer Vladimir Milevski Michael Onken Igor Okulist Tony C. Pan Dimitri Papadopoulos-Orfanos Philippe Puech Eike Rietzel Pere Rodriguez Rodriguez Markus Sabin Stein Roger Skaflotten James Soutter Rainer Thieme Judit Verestoy Stefan Vogel Yannick Maryam Zibaeifard OFFIS staff who have worked on this release are: Marco Eichelberg Joerg Riesmeier Thomas Wilkens The DCMTK software can be downloaded via: http://dicom.offis.de/dcmtk Kuratorium OFFIS e.V., Oldenburg, Germany, 2004-05-27 dcmtk-3.6.0/docs/CHANGES.3510000644000310500011400000021442607416541737014320 0ustar joergrdicom3 Release 3.5.1 (Public Release - 2001-12-21) - Updated Version Number and Implementation Version Name to reflect the current public release (3.5.1) Affects: dcmdata/include/dcuid.h - Updated documentation to reflect changes in 3.5.1 Affects: FAQ INSTALL README Added: ANNOUNCE.351 **** Changes from 2001.12.20 (eichelberg) - Fixed integer overflow in rgb_ycc_start(). Affects: dcmjpeg/libijg16/jccolor.c - Fixed warnings reported by Sun CC 2.0.1 Affects: dcmimage/apps/dcm2pnm.cc dcmjpeg/apps/dcmcjpeg.cc dcmjpeg/libsrc/djcodecd.cc dcmjpeg/libsrc/djcodece.cc dcmjpeg/libsrc/djdijg12.cc dcmjpeg/libsrc/djdijg16.cc **** Changes from 2001.12.19 (eichelberg) - Restructured functions DIMSE_receiveDataSetInMemory and DIMSE_receiveDataSetInFile to avoid warnings on Sun CC 2.0.1 Affects: dcmnet/libsrc/dimse.cc - Restructured code (removed gotos) to avoid "sorry, not implemented" error on Sun CC 2.0.1 Affects: imagectn/apps/imagectn.cc wlistctn/apps/wlistctn.cc - Added configure test for a gettimeofday prototype, which is missing for example on Ultrix. Affects: config/acconfig.h config/configure config/configure.in config/confmod config/include/cfwin32.h config/include/config.h.in - Added prototype declaration for gettimeofday() for systems like Ultrix where the function is known but no prototype present in the system headers. Affects: dcmdata/libsrc/dcvrdt.cc dcmdata/libsrc/dcvrtm.cc dcmnet/apps/storescp.cc - Added include to avoid warning on Ultrix. Affects: dcmtls/libsrc/tlstrans.cc - Updated Visual C++ project files Affects: config/systems/win32/msvc5.zip - Linking dcmjpeg apps with MATHLIBS, required on OSF/1 Affects: dcmjpeg/apps/Makefile.in - Introduced function pointer typedef to avoid warning on Sun Workshop 6. Affects: dcmnet/libsrc/dul.cc **** Changes from 2001.12.18 (riesmeier) - Added helper method allowing to create and insert empty elements into an item/dataset. Affects: dcmdata/include/dcitem.h dcmdata/libsrc/dcitem.cc **** Changes from 2001.12.18 (eichelberg) - Modified configure test for "const" support of the C compiler in order to avoid a macro recursion error on Sun CC 2.0.1 Affects: config/acconfig.h config/aclocal.m4 config/configure config/confmod config/include/cfwin32.h config/include/config.h.in dcmjpeg/libijg12/jconfig12.h dcmjpeg/libijg16/jconfig16.h dcmjpeg/libijg8/jconfig8.h dcmjpeg/libsrc/dipijpeg.cc dcmjpeg/libsrc/djdijg12.cc dcmjpeg/libsrc/djdijg16.cc dcmjpeg/libsrc/djdijg8.cc dcmjpeg/libsrc/djeijg12.cc dcmjpeg/libsrc/djeijg16.cc dcmjpeg/libsrc/djeijg8.cc - Introduced typedef to avoid warning on Sun CC 2.0.1 Affects: dcmsr/include/dsrtncsr.h - Added missing initialization in copy constructor Affects: dcmjpeg/libsrc/djcparam.cc - Added typecast to avoid warning on Sun CC 2.0.1 Affects: imagectn/libsrc/dbstore.cc - Minor modifications to avoid warning on Sun CC 2.0.1 Affects: dcmpstat/libsrc/dvpsov.cc - Added typecasts to avoid warning on gcc 2.95.3 on OSF/1 (Alpha) Affects: dcmdata/libsrc/dcvrdt.cc dcmdata/libsrc/dcvrtm.cc **** Changes from 2001.12.14 (wilkens) - Fixed a bug in storescp that prevented the application from working correctly under Unix. Affects: dcmnet/apps/storescp.cc **** Changes from 2001.12.14 (riesmeier) - Modified use of time routines to keep gcc on Mac OS X happy. Affects: dcmnet/apps/storescp.cc - Re-structured test program to "co-operate" with gcc on Irix 5. Thanks to Andreas Barth for his support. Affects: dcmsr/tests/mkreport.cc **** Changes from 2001.12.11 (riesmeier) - Fixed bug in 'dump2dcm' parser causing AT attribute values to be ignored. Thanks to Anders Gustafsson for the bug report. Affects: dcmdata/apps/dump2dcm.cc dcmdata/docs/dump2dcm.txt - Replaced occurrences of strncpy by more secure strlcpy (see ofstd.h). Affects: dcmdata/apps/dump2dcm.cc dcmnet/apps/storescp.cc - Added type cast to keep old Sun compilers quiet. Affects: dcmnet/apps/storescp.cc dcmimgle/libsrc/dimoimg.cc dcmimage/include/dicopxt.h - Modified description of command line option -tos. Affects: dcmnet/apps/storescp.cc dcmnet/docs/storescp.txt - Fixed warning reported by cygwin gcc compiler. Affects: dcmnet/apps/storescp.cc **** Changes from 2001.12.10 (eichelberg) - Fixed warnings from Sun CC 4.2 Affects: dcmsign/apps/dcmsign.cc dcmsign/include/simaccon.h **** Changes from 2001.12.06 (riesmeier) - Updated documentation and made layout more consistent. Affects: dcmdata/docs/dcmconv.txt dcmdata/docs/dcmdump.txt dcmdata/docs/dcmftest.txt dcmdata/docs/dcmgpdir.txt dcmdata/docs/dump2dcm.txt dcmimgle/docs/dcmdspfn.txt dcmimgle/docs/dconvlum.txt dcmimage/docs/dcm2pnm.txt imagectn/docs/dbregimg.txt imagectn/docs/imagectn.txt imagectn/docs/ti.txt dcmnet/docs/echoscu.txt dcmnet/docs/findscu.txt dcmnet/docs/movescu.txt dcmnet/docs/storescp.txt dcmnet/docs/storescu.txt dcmsign/docs/dcmsign.txt wlistctn/docs/wlistctn.txt dcmsr/docs/dsr2html.txt dcmsr/docs/dsr2xml.txt dcmsr/docs/dsrdump.txt dcmjpeg/docs/dcmcjpeg.txt dcmjpeg/docs/dcmdjpeg.txt dcmjpeg/docs/dcmj2pnm.txt - Minor "stylistic" changes. Affects: dcmdata/apps/dcmgpdir.cc - Changed description of new command line option "--write-tiff". Affects: dcmimage/apps/dcm2pnm.cc - Made description and layout of command line options more consistent. Affects: dcmnet/apps/storescp.cc dcmnet/apps/storescu.cc **** Changes from 2001.12.06 (eichelberg) - changext now updates implementation includes in dcmj2pnm and dcmmkdir. Affects: config/changext - Fixed problem with configure --with-libtiff. Affects: config/configure config/configure.in - Removed references to tiffconf.h which does not exist on all installations. Affects: dcmimage/apps/dcm2pnm.cc dcmimage/include/dipitiff.h dcmimage/libsrc/dipitiff.cc **** Changes from 2001.12.04 (eichelberg) - Completed doc++ documentation, fixed bug in OFString::copy. Affects: ofstd/include/ofstring.h ofstd/libsrc/ofstring.cc - Added configure test for strlcpy and strlcat. Affects: config/configure config/configure.in config/include/cfwin32.h config/include/config.h.in - Implemented strlcpy and strlcat routines compatible with the corresponding BSD libc routines in class OFStandard Added: ofstd/libsrc/ofstd.cc Affects: ofstd/include/ofstd.h ofstd/libsrc/Makefile.dep ofstd/libsrc/Makefile.in dcmnet/libsrc/assoc.cc - Updated documentation for dcm2pnm and dcmj2pnm Affects: dcmimage/docs/dcm2pnm.txt dcmjpeg/docs/dcmj2pnm.txt - Fixed codec registration: flag registered was never set to true Affects: dcmjpeg/libsrc/djdecode.cc dcmjpeg/libsrc/djencode.cc - Adapted dcmpstat signature code to changed interface in dcmsign Affects: dcmpstat/libsrc/dvsighdl.cc - Updated DcmItem::insert() calls to always remove old element if present (which should never be the case anyway). Affects: dcmsign/libsrc/dcmsign.cc **** Changes from 2001.12.03 (eichelberg) - Completed doc++ documentation Affects: ofstd/include/ofstack.h **** Changes from 2001.11.30 (eichelberg) - Added new configure option --with-libtiff Affects: config/Makefile.def.in config/acconfig.h config/configure config/configure.in config/include/cfwin32.h config/include/config.h.in - Added TIFF export option to dcm2pnm and dcmj2pnm Added: dcmimage/include/dipitiff.h dcmimage/libsrc/dipitiff.cc Affects: dcmimage/apps/Makefile.dep dcmimage/apps/Makefile.in dcmimage/apps/dcm2pnm.cc dcmimage/libsrc/Makefile.dep dcmimage/libsrc/Makefile.in dcmjpeg/apps/Makefile.dep dcmjpeg/apps/Makefile.in **** Changes from 2001.11.30 (wilkens) - Changed description of command line options. Affects: dcmnet/apps/storescp.cc **** Changes from 2001.11.29 (riesmeier) - Fixed bug in dcmimgle that caused incorrect decoding of some JPEG compressed images (certain DICOM attributes, e.g. photometric interpretation, might change during decompression process). Affects: dcmimgle/include/didocu.h dcmimgle/libsrc/didocu.cc dcmimgle/libsrc/diimage.cc dcmimgle/libsrc/dimoimg.cc - Added output of transfer syntax to "--image-info" option. Affects: dcmimage/apps/dcm2pnm.cc - Set default quality for JPEG compression to 90% (now consistent with other dcmtk tools). Affects: dcmimage/apps/dcm2pnm.cc dcmjpeg/docs/dcmj2pnm.txt - Added new command line option to dcmmkdir that allows to ignore non-standard conformant spatial resolutions for images (e.g. images larger than 1024*1024 for the cardiac profiles). Affects: dcmdata/apps/dcmgpdir.cc dcmjpeg/docs/dcmmkdir.txt **** Changes from 2001.11.28 (wilkens) - Fixed a problem with storescp. Execution of batch-files through new options --exec-on-reception and --exec-on-eostudy is now possible also for optimized executable. Affects: dcmnet/apps/storescp.cc **** Changes from 2001.11.28 (riesmeier) - Fixed bug in dcmconv that caused problems in cases where the same filename was used for input and output (e.g. pixel data was removed without any warnings). Affects: dcmdata/apps/dcmconv.cc - Check return value of DcmItem::insert() statements where appropriate to avoid memory leaks when insert procedure fails. Affects: imagectn/libsrc/dbfind.cc wlistctn/apps/scefind.cc wlistctn/libsrc/wrklstdb.cc dcmjpeg/libsrc/djcodecd.cc dcmjpeg/libsrc/djcodece.cc dcmpstat/apps/dcmmklut.cc dcmpstat/include/dvpsdef.h dcmpstat/libsrc/dviface.cc dcmpstat/libsrc/dvpsabl.cc dcmpstat/libsrc/dvpsdal.cc dcmpstat/libsrc/dvpsfs.cc dcmpstat/libsrc/dvpsgal.cc dcmpstat/libsrc/dvpsgll.cc dcmpstat/libsrc/dvpsgrl.cc dcmpstat/libsrc/dvpshlp.cc dcmpstat/libsrc/dvpsib.cc dcmpstat/libsrc/dvpsibl.cc dcmpstat/libsrc/dvpspl.cc dcmpstat/libsrc/dvpspll.cc dcmpstat/libsrc/dvpsprt.cc dcmpstat/libsrc/dvpsril.cc dcmpstat/libsrc/dvpsrsl.cc dcmpstat/libsrc/dvpssp.cc dcmpstat/libsrc/dvpssv.cc dcmpstat/libsrc/dvpssvl.cc dcmpstat/libsrc/dvpstat.cc dcmpstat/libsrc/dvpstxl.cc **** Changes from 2001.11.27 (riesmeier) - Added support for plugable output formats in class DicomImage. First implementation is JPEG. Added: dcmimgle/include/diplugin.h dcmjpeg/include/dipijpeg.h dcmjpeg/libsrc/dipijpeg.cc Affects: dcmimgle/include/dcmimage.h dcmimgle/include/diimage.h dcmimgle/include/dimo1img.h dcmimgle/include/dimo2img.h dcmimgle/libsrc/dcmimage.cc dcmimgle/libsrc/diimage.cc dcmimage/include/dicoimg.h dcmimage/apps/dcm2pnm.cc dcmjpeg/docs/dcmj2pnm.txt dcmjpeg/libsrc/Makefile.in - Rebuilt makefile dependencies. Affects: dcmimgle/libsrc/Makefile.dep dcmjpeg/libsrc/Makefile.dep dcmjpeg/apps/Makefile.dep - Updated documentation. Affects: dcmimage/docs/dcm2pnm.txt **** Changes from 2001.11.27 (wilkens) - Updated storescp. 6 new options (--output-directory, --sort-conc-studies, --exec-on-reception, --exec-on-eostudy, --rename-on-eostudy, and --eostudy-timeout) implemented (requirements from GO-Kard). Affects: dcmnet/apps/storescp.cc dcmnet/include/assoc.h dcmnet/include/dul.h dcmnet/libsrc/assoc.cc dcmnet/libsrc/assoc.cc **** Changes from 2001.11.26 (riesmeier) - Fixed bug in OFString constructor. Affects: ofstd/libsrc/ofstring.cc **** Changes from 2001.11.19 (eichelberg) - Cleaned up signature code to avoid some gcc warnings. Affects: dcmdata/include/dcsequen.h dcmdata/include/dctag.h dcmdata/include/dctagkey.h dcmdata/libsrc/dctag.cc dcmdata/libsrc/dctagkey.cc dcmsign/libsrc/sisprof.cc - Introduced verbose mode in module dcmjpeg. If enabled, warning messages from the IJG library are printed on ofConsole, otherwise the library remains quiet. Affects: dcmjpeg/apps/dcmcjpeg.cc dcmjpeg/apps/dcmdjpeg.cc dcmjpeg/include/djcparam.h dcmjpeg/include/djdecode.h dcmjpeg/include/djdijg12.h dcmjpeg/include/djdijg16.h dcmjpeg/include/djdijg8.h dcmjpeg/include/djeijg12.h dcmjpeg/include/djeijg16.h dcmjpeg/include/djeijg8.h dcmjpeg/include/djencode.h dcmjpeg/libsrc/djcparam.cc dcmjpeg/libsrc/djdecode.cc dcmjpeg/libsrc/djdijg12.cc dcmjpeg/libsrc/djdijg16.cc dcmjpeg/libsrc/djdijg8.cc dcmjpeg/libsrc/djeijg12.cc dcmjpeg/libsrc/djeijg16.cc dcmjpeg/libsrc/djeijg8.cc dcmjpeg/libsrc/djencode.cc - Disabled JPEGMEM environment variable in dcmjpeg IJG code since it is not required and getenv() is thread unsafe on some systems. Affects: dcmjpeg/libigj12/jconfig12.h dcmjpeg/libigj16/jconfig16.h dcmjpeg/libigj8/jconfig8.h - Implemented performance optimization for the generation of icon images of compressed multi-frame images. Affects: dcmdata/apps/dcmgpdir.cc - Added support for new 'verbose mode' in module dcmjpeg. Affects: dcmimage/apps/dcm2pnm.cc **** Changes from 2001.11.19 (riesmeier) - Re-added dcmgpdir tool to dcmdata module. Added: dcmdata/apps/dcmgpdir.cc dcmdata/docs/dcmgpdir.txt Affects: dcmdata/apps/Makefile.dep dcmdata/apps/Makefile.in - Moved dcmmkdir tool to dcmjpeg module. Added: dcmjpeg/apps/dcmmkdir.cc dcmjpeg/docs/dcmmkdir.txt Removed: dcmimage/apps/dcmmkdir.cc dcmimage/docs/dcmmkdir.txt Affects: dcmimage/apps/Makefile.dep dcmimage/apps/Makefile.in dcmjpeg/apps/Makefile.dep dcmjpeg/apps/Makefile.in - Added dcmimage to list of modules. Affects: dcmdata/include/dcerror.h - Added parameter 'frame' to setRoiWindow(). Affects: dcmimgle/include/dcmimage.h dcmimgle/include/dimoimg.h dcmimgle/include/dimopx.h dcmimgle/include/dimopxt.h dcmimgle/libsrc/dimoimg.cc - Adapted code to support new dcmjpeg module and JPEG compressed images. Affects: dcmimgle/include/didocu.h dcmimgle/libsrc/didocu.cc dcmimgle/libsrc/diimage.cc - Added new tool dcmj2pnm which supports all features of dcm2pnm and in addition also JPEG compressed images. Added: dcmjpeg/apps/dcmj2pnm.cc dcmjpeg/docs/dcmj2pnm.txt Affects: dcmimage/apps/dcm2pnm.cc dcmimage/docs/dcm2pnm.txt dcmjpeg/apps/Makefile.dep dcmjpeg/apps/Makefile.in - Adapted implementation according to correction proposal 266. Affects: dcmsr/libsrc/dsrcodtn.cc dcmsr/libsrc/dsrnumtn.cc **** Changes from 2001.11.16 (eichelberg) - Adapted digital signature code to final text of supplement 41. Affects: dcmdata/include/dcitem.h dcmdata/include/dcobject.h dcmdata/include/dcpxitem.h dcmdata/include/dcsequen.h dcmdata/include/dctag.h dcmdata/include/dctagkey.h dcmdata/libsrc/dcelem.cc dcmdata/libsrc/dcitem.cc dcmdata/libsrc/dcobject.cc dcmdata/libsrc/dcpxitem.cc dcmdata/libsrc/dcsequen.cc dcmdata/libsrc/dctag.cc dcmsign/apps/Makefile.dep dcmsign/apps/dcmsign.cc dcmsign/docs/dcmsign.txt dcmsign/include/dcmsign.h dcmsign/include/siautopr.h dcmsign/include/sicreapr.h dcmsign/include/simaccon.h dcmsign/include/sisprof.h dcmsign/include/sitypes.h dcmsign/libsrc/Makefile.dep dcmsign/libsrc/Makefile.in dcmsign/libsrc/dcmsign.cc dcmsign/libsrc/siautopr.cc dcmsign/libsrc/sicert.cc dcmsign/libsrc/sicreapr.cc dcmsign/libsrc/simaccon.cc dcmsign/libsrc/sinullpr.cc dcmsign/libsrc/sisprof.cc Added: dcmsign/include/sibrsapr.h dcmsign/libsrc/sibrsapr.cc **** Changes from 2001.11.14 (eichelberg) - Updated Visual C++ project files for new module dcmjpeg Affects: config/systems/win32/README config/systems/win32/msvc5.zip - Minor modifications for Visual C++ Affects: dcmjpeg/libsrc/djcodece.cc **** Changes from 2001.11.13 (riesmeier) - Replaced utility dcmgpdir with dcmmkdir which supports other Media Storage Application Profiles in addition to the General Purpose one. Removed: dcmdata/apps/dcmgpdir.cc dcmdata/docs/dcmgpdir.txt Added: dcmimage/apps/dcmmkdir.cc dcmimage/docs/dcmmkdir.txt Affects: dcmdata/apps/Makefile.dep dcmdata/apps/Makefile.in dcmimage/apps/Makefile.dep dcmimage/apps/Makefile.in - Fixed bug occurring when processing monochrome images with an odd number of pixels. Affects: dcmimgle/include/diinpxt.h dcmimgle/include/dimoipxt.h - Fixed bug with incorrect calculation of min/max pixel values in images with modality LUTs where not all LUT entries are used (previous optimization rule was apparently too optimistic). Affects: dcmimgle/include/dimoipxt.h - Added type cast to delete a void pointer to keep gcc 2.95 compiler quiet. Affects: dcmimgle/libsrc/diimage.cc **** Changes from 2001.11.13 (eichelberg) - Initial release of module dcmjpeg Affects: COPYRIGHT config/modules Added: dcmjpeg/Makefile.in dcmjpeg/configure dcmjpeg/apps/Makefile.dep dcmjpeg/apps/Makefile.in dcmjpeg/apps/dcmcjpeg.cc dcmjpeg/apps/dcmdjpeg.cc dcmjpeg/docs/Makefile.in dcmjpeg/docs/dcmcjpeg.txt dcmjpeg/docs/dcmdjpeg.txt dcmjpeg/docs/ijg_filelist.txt dcmjpeg/docs/ijg_libjpeg.txt dcmjpeg/docs/ijg_readme.txt dcmjpeg/docs/ijg_structure.txt dcmjpeg/htmldocs/Makefile.in dcmjpeg/include/Makefile.in dcmjpeg/include/djcodecd.h dcmjpeg/include/djcodece.h dcmjpeg/include/djcparam.h dcmjpeg/include/djdecabs.h dcmjpeg/include/djdecbas.h dcmjpeg/include/djdecext.h dcmjpeg/include/djdeclol.h dcmjpeg/include/djdecode.h dcmjpeg/include/djdecpro.h dcmjpeg/include/djdecsps.h dcmjpeg/include/djdecsv1.h dcmjpeg/include/djdijg12.h dcmjpeg/include/djdijg16.h dcmjpeg/include/djdijg8.h dcmjpeg/include/djeijg12.h dcmjpeg/include/djeijg16.h dcmjpeg/include/djeijg8.h dcmjpeg/include/djencabs.h dcmjpeg/include/djencbas.h dcmjpeg/include/djencext.h dcmjpeg/include/djenclol.h dcmjpeg/include/djencode.h dcmjpeg/include/djencpro.h dcmjpeg/include/djencsps.h dcmjpeg/include/djencsv1.h dcmjpeg/include/djrplol.h dcmjpeg/include/djrploss.h dcmjpeg/include/djutils.h dcmjpeg/libijg12/Makefile.dep dcmjpeg/libijg12/Makefile.in dcmjpeg/libijg12/jaricom.c dcmjpeg/libijg12/jcapimin.c dcmjpeg/libijg12/jcapistd.c dcmjpeg/libijg12/jcarith.c dcmjpeg/libijg12/jccoefct.c dcmjpeg/libijg12/jccolor.c dcmjpeg/libijg12/jcdctmgr.c dcmjpeg/libijg12/jcdiffct.c dcmjpeg/libijg12/jchuff.c dcmjpeg/libijg12/jchuff12.h dcmjpeg/libijg12/jcinit.c dcmjpeg/libijg12/jclhuff.c dcmjpeg/libijg12/jclossls.c dcmjpeg/libijg12/jclossy.c dcmjpeg/libijg12/jcmainct.c dcmjpeg/libijg12/jcmarker.c dcmjpeg/libijg12/jcmaster.c dcmjpeg/libijg12/jcodec.c dcmjpeg/libijg12/jcomapi.c dcmjpeg/libijg12/jconfig12.h dcmjpeg/libijg12/jcparam.c dcmjpeg/libijg12/jcphuff.c dcmjpeg/libijg12/jcpred.c dcmjpeg/libijg12/jcprepct.c dcmjpeg/libijg12/jcsample.c dcmjpeg/libijg12/jcscale.c dcmjpeg/libijg12/jcshuff.c dcmjpeg/libijg12/jctrans.c dcmjpeg/libijg12/jdapimin.c dcmjpeg/libijg12/jdapistd.c dcmjpeg/libijg12/jdarith.c dcmjpeg/libijg12/jdatadst.c dcmjpeg/libijg12/jdatasrc.c dcmjpeg/libijg12/jdcoefct.c dcmjpeg/libijg12/jdcolor.c dcmjpeg/libijg12/jdct12.h dcmjpeg/libijg12/jddctmgr.c dcmjpeg/libijg12/jddiffct.c dcmjpeg/libijg12/jdhuff.c dcmjpeg/libijg12/jdhuff12.h dcmjpeg/libijg12/jdinput.c dcmjpeg/libijg12/jdlhuff.c dcmjpeg/libijg12/jdlossls.c dcmjpeg/libijg12/jdlossy.c dcmjpeg/libijg12/jdmainct.c dcmjpeg/libijg12/jdmarker.c dcmjpeg/libijg12/jdmaster.c dcmjpeg/libijg12/jdmerge.c dcmjpeg/libijg12/jdphuff.c dcmjpeg/libijg12/jdpostct.c dcmjpeg/libijg12/jdpred.c dcmjpeg/libijg12/jdsample.c dcmjpeg/libijg12/jdscale.c dcmjpeg/libijg12/jdshuff.c dcmjpeg/libijg12/jdtrans.c dcmjpeg/libijg12/jerror.c dcmjpeg/libijg12/jerror12.h dcmjpeg/libijg12/jfdctflt.c dcmjpeg/libijg12/jfdctfst.c dcmjpeg/libijg12/jfdctint.c dcmjpeg/libijg12/jidctflt.c dcmjpeg/libijg12/jidctfst.c dcmjpeg/libijg12/jidctint.c dcmjpeg/libijg12/jidctred.c dcmjpeg/libijg12/jinclude12.h dcmjpeg/libijg12/jlossls12.h dcmjpeg/libijg12/jlossy12.h dcmjpeg/libijg12/jmemmgr.c dcmjpeg/libijg12/jmemnobs.c dcmjpeg/libijg12/jmemsys12.h dcmjpeg/libijg12/jmorecfg12.h dcmjpeg/libijg12/jpegint12.h dcmjpeg/libijg12/jpeglib12.h dcmjpeg/libijg12/jquant1.c dcmjpeg/libijg12/jquant2.c dcmjpeg/libijg12/jutils.c dcmjpeg/libijg12/jversion12.h dcmjpeg/libijg16/Makefile.dep dcmjpeg/libijg16/Makefile.in dcmjpeg/libijg16/jaricom.c dcmjpeg/libijg16/jcapimin.c dcmjpeg/libijg16/jcapistd.c dcmjpeg/libijg16/jcarith.c dcmjpeg/libijg16/jccoefct.c dcmjpeg/libijg16/jccolor.c dcmjpeg/libijg16/jcdctmgr.c dcmjpeg/libijg16/jcdiffct.c dcmjpeg/libijg16/jchuff.c dcmjpeg/libijg16/jchuff16.h dcmjpeg/libijg16/jcinit.c dcmjpeg/libijg16/jclhuff.c dcmjpeg/libijg16/jclossls.c dcmjpeg/libijg16/jclossy.c dcmjpeg/libijg16/jcmainct.c dcmjpeg/libijg16/jcmarker.c dcmjpeg/libijg16/jcmaster.c dcmjpeg/libijg16/jcodec.c dcmjpeg/libijg16/jcomapi.c dcmjpeg/libijg16/jconfig16.h dcmjpeg/libijg16/jcparam.c dcmjpeg/libijg16/jcphuff.c dcmjpeg/libijg16/jcpred.c dcmjpeg/libijg16/jcprepct.c dcmjpeg/libijg16/jcsample.c dcmjpeg/libijg16/jcscale.c dcmjpeg/libijg16/jcshuff.c dcmjpeg/libijg16/jctrans.c dcmjpeg/libijg16/jdapimin.c dcmjpeg/libijg16/jdapistd.c dcmjpeg/libijg16/jdarith.c dcmjpeg/libijg16/jdatadst.c dcmjpeg/libijg16/jdatasrc.c dcmjpeg/libijg16/jdcoefct.c dcmjpeg/libijg16/jdcolor.c dcmjpeg/libijg16/jdct16.h dcmjpeg/libijg16/jddctmgr.c dcmjpeg/libijg16/jddiffct.c dcmjpeg/libijg16/jdhuff.c dcmjpeg/libijg16/jdhuff16.h dcmjpeg/libijg16/jdinput.c dcmjpeg/libijg16/jdlhuff.c dcmjpeg/libijg16/jdlossls.c dcmjpeg/libijg16/jdlossy.c dcmjpeg/libijg16/jdmainct.c dcmjpeg/libijg16/jdmarker.c dcmjpeg/libijg16/jdmaster.c dcmjpeg/libijg16/jdmerge.c dcmjpeg/libijg16/jdphuff.c dcmjpeg/libijg16/jdpostct.c dcmjpeg/libijg16/jdpred.c dcmjpeg/libijg16/jdsample.c dcmjpeg/libijg16/jdscale.c dcmjpeg/libijg16/jdshuff.c dcmjpeg/libijg16/jdtrans.c dcmjpeg/libijg16/jerror.c dcmjpeg/libijg16/jerror16.h dcmjpeg/libijg16/jfdctflt.c dcmjpeg/libijg16/jfdctfst.c dcmjpeg/libijg16/jfdctint.c dcmjpeg/libijg16/jidctflt.c dcmjpeg/libijg16/jidctfst.c dcmjpeg/libijg16/jidctint.c dcmjpeg/libijg16/jidctred.c dcmjpeg/libijg16/jinclude16.h dcmjpeg/libijg16/jlossls16.h dcmjpeg/libijg16/jlossy16.h dcmjpeg/libijg16/jmemmgr.c dcmjpeg/libijg16/jmemnobs.c dcmjpeg/libijg16/jmemsys16.h dcmjpeg/libijg16/jmorecfg16.h dcmjpeg/libijg16/jpegint16.h dcmjpeg/libijg16/jpeglib16.h dcmjpeg/libijg16/jquant1.c dcmjpeg/libijg16/jquant2.c dcmjpeg/libijg16/jutils.c dcmjpeg/libijg16/jversion16.h dcmjpeg/libijg8/Makefile.dep dcmjpeg/libijg8/Makefile.in dcmjpeg/libijg8/jaricom.c dcmjpeg/libijg8/jcapimin.c dcmjpeg/libijg8/jcapistd.c dcmjpeg/libijg8/jcarith.c dcmjpeg/libijg8/jccoefct.c dcmjpeg/libijg8/jccolor.c dcmjpeg/libijg8/jcdctmgr.c dcmjpeg/libijg8/jcdiffct.c dcmjpeg/libijg8/jchuff.c dcmjpeg/libijg8/jchuff8.h dcmjpeg/libijg8/jcinit.c dcmjpeg/libijg8/jclhuff.c dcmjpeg/libijg8/jclossls.c dcmjpeg/libijg8/jclossy.c dcmjpeg/libijg8/jcmainct.c dcmjpeg/libijg8/jcmarker.c dcmjpeg/libijg8/jcmaster.c dcmjpeg/libijg8/jcodec.c dcmjpeg/libijg8/jcomapi.c dcmjpeg/libijg8/jconfig8.h dcmjpeg/libijg8/jcparam.c dcmjpeg/libijg8/jcphuff.c dcmjpeg/libijg8/jcpred.c dcmjpeg/libijg8/jcprepct.c dcmjpeg/libijg8/jcsample.c dcmjpeg/libijg8/jcscale.c dcmjpeg/libijg8/jcshuff.c dcmjpeg/libijg8/jctrans.c dcmjpeg/libijg8/jdapimin.c dcmjpeg/libijg8/jdapistd.c dcmjpeg/libijg8/jdarith.c dcmjpeg/libijg8/jdatadst.c dcmjpeg/libijg8/jdatasrc.c dcmjpeg/libijg8/jdcoefct.c dcmjpeg/libijg8/jdcolor.c dcmjpeg/libijg8/jdct8.h dcmjpeg/libijg8/jddctmgr.c dcmjpeg/libijg8/jddiffct.c dcmjpeg/libijg8/jdhuff.c dcmjpeg/libijg8/jdhuff8.h dcmjpeg/libijg8/jdinput.c dcmjpeg/libijg8/jdlhuff.c dcmjpeg/libijg8/jdlossls.c dcmjpeg/libijg8/jdlossy.c dcmjpeg/libijg8/jdmainct.c dcmjpeg/libijg8/jdmarker.c dcmjpeg/libijg8/jdmaster.c dcmjpeg/libijg8/jdmerge.c dcmjpeg/libijg8/jdphuff.c dcmjpeg/libijg8/jdpostct.c dcmjpeg/libijg8/jdpred.c dcmjpeg/libijg8/jdsample.c dcmjpeg/libijg8/jdscale.c dcmjpeg/libijg8/jdshuff.c dcmjpeg/libijg8/jdtrans.c dcmjpeg/libijg8/jerror.c dcmjpeg/libijg8/jerror8.h dcmjpeg/libijg8/jfdctflt.c dcmjpeg/libijg8/jfdctfst.c dcmjpeg/libijg8/jfdctint.c dcmjpeg/libijg8/jidctflt.c dcmjpeg/libijg8/jidctfst.c dcmjpeg/libijg8/jidctint.c dcmjpeg/libijg8/jidctred.c dcmjpeg/libijg8/jinclude8.h dcmjpeg/libijg8/jlossls8.h dcmjpeg/libijg8/jlossy8.h dcmjpeg/libijg8/jmemmgr.c dcmjpeg/libijg8/jmemnobs.c dcmjpeg/libijg8/jmemsys8.h dcmjpeg/libijg8/jmorecfg8.h dcmjpeg/libijg8/jpegint8.h dcmjpeg/libijg8/jpeglib8.h dcmjpeg/libijg8/jquant1.c dcmjpeg/libijg8/jquant2.c dcmjpeg/libijg8/jutils.c dcmjpeg/libijg8/jversion8.h dcmjpeg/libsrc/Makefile.dep dcmjpeg/libsrc/Makefile.in dcmjpeg/libsrc/djcodecd.cc dcmjpeg/libsrc/djcodece.cc dcmjpeg/libsrc/djcparam.cc dcmjpeg/libsrc/djdecbas.cc dcmjpeg/libsrc/djdecext.cc dcmjpeg/libsrc/djdeclol.cc dcmjpeg/libsrc/djdecode.cc dcmjpeg/libsrc/djdecpro.cc dcmjpeg/libsrc/djdecsps.cc dcmjpeg/libsrc/djdecsv1.cc dcmjpeg/libsrc/djdijg12.cc dcmjpeg/libsrc/djdijg16.cc dcmjpeg/libsrc/djdijg8.cc dcmjpeg/libsrc/djeijg12.cc dcmjpeg/libsrc/djeijg16.cc dcmjpeg/libsrc/djeijg8.cc dcmjpeg/libsrc/djencbas.cc dcmjpeg/libsrc/djencext.cc dcmjpeg/libsrc/djenclol.cc dcmjpeg/libsrc/djencode.cc dcmjpeg/libsrc/djencpro.cc dcmjpeg/libsrc/djencsps.cc dcmjpeg/libsrc/djencsv1.cc dcmjpeg/libsrc/djrplol.cc dcmjpeg/libsrc/djrploss.cc dcmjpeg/libsrc/djutils.cc **** Changes from 2001.11.12 (eichelberg) - Removed all ctndisp related code from imagectn Affects: imagectn/apps/Makefile.dep imagectn/apps/Makefile.in imagectn/apps/cnf.cc imagectn/apps/cnf.h imagectn/apps/cnfpriv.cc imagectn/apps/cnfpriv.h imagectn/apps/imagectn.cc imagectn/apps/imagectn.h imagectn/apps/sce.cc imagectn/apps/scefind.cc imagectn/apps/sceget.cc imagectn/apps/scemove.cc imagectn/apps/scestore.cc imagectn/apps/ti.cc imagectn/apps/ti.h imagectn/apps/tinet.cc imagectn/apps/tinet.h imagectn/apps/tiui.cc imagectn/include/imagedb.h - Removed all ctndisp related code from wlistctn Affects: wlistctn/apps/Makefile.dep wlistctn/apps/Makefile.in wlistctn/apps/sce.cc wlistctn/apps/scefind.cc wlistctn/apps/wlistctn.cc wlistctn/apps/wlistctn.h - Removed ctndisp module Removed: ctndisp/Makefile.in ctndisp/configure ctndisp/apps/Makefile.dep ctndisp/apps/Makefile.in ctndisp/apps/cleanup.pl ctndisp/apps/ctndcons.h ctndisp/apps/ctnddico.cc ctndisp/apps/ctnddico.h ctndisp/apps/ctndisp.cc ctndisp/apps/ctndsupp.cc ctndisp/apps/ctndsupp.h ctndisp/apps/killassc.cc ctndisp/apps/sendimg.cc ctndisp/docs/ctndisp.txt ctndisp/include/Makefile.dep ctndisp/include/Makefile.in ctndisp/include/disppriv.h ctndisp/include/dispuser.h ctndisp/include/snq.h ctndisp/libsrc/Makefile.dep ctndisp/libsrc/Makefile.in ctndisp/libsrc/dispuser.cc ctndisp/libsrc/snq.cc - Removed configure tests needed for ctndisp only Affects: config/Makefile.in config/acconfig.h config/configure config/configure.in config/confmod config/confmod.in config/modules config/include/cfwin32.h config/include/config.h.in - Added dummy friend class declaration to singleton class DcmCodecList to keep gcc from squawking. Affects: dcmdata/include/dccodec.h **** Changes from 2001.11.09 (riesmeier) - Updated CVS modules file. Affects: modules/modules - Added new compilation target to the main make file ('make libsrc-all' builds the libraries of all modules). Affects: config/Makefile.in config/rootconf - Removed ";" from macro definition to avoid compiler warnings reported by Sun CC 2.0.1. Affects: ofstd/include/ofcond.h - Renamed some of the getValue/getParam methods to avoid ambiguities reported by certain compilers. Affects: ofstd/include/ofcmdln.h ofstd/libsrc/ofcmdln.cc dcmdata/apps/dcmconv.cc dcmdata/apps/dump2dcm.cc dcmnet/apps/echoscu.cc dcmnet/apps/findscu.cc dcmnet/apps/movescu.cc dcmnet/apps/storescp.cc dcmnet/apps/storescu.cc imagectn/apps/imagectn.cc ctndisp/apps/ctndisp.cc wlistctn/apps/wlistctn.cc dcmpstat/apps/dcmmkcrv.cc dcmpstat/apps/dcmmklut.cc dcmpstat/apps/dcmp2pgm.cc dcmpstat/apps/dcmprscu.cc dcmpstat/apps/dcmpsprt.cc dcmimgle/apps/dcmdspfn.cc dcmimage/apps/dcm2pnm.cc - Rebuilt makefile dependencies. Affects: ofstd/tests/Makefile.dep dcmdata/libsrc/Makefile.dep dcmimage/apps/Makefile.dep dcmimage/libsrc/Makefile.dep - Added new helper routines for managing sequences and items. Affects: dcmdata/include/dcitem.h dcmdata/libsrc/dcitem.cc - Added '#include ' to avoid compiler errors reported by Sun CC 2.0.1 (required before is included). Affects: dcmnet/libsrc/dul.cc dcmnet/libsrc/dulfsm.cc dcmnet/libsrc/dulparse.cc - Fixed small bug introduced during changeover to new OFCondition mechanism. Affects: dcmpstat/libsrc/dvpspr.cc - Changed type of variable to avoid compiler warnings (comparison of signed and unsigned data). Affects: dcmpstat/apps/dcmpschk.cc - Added new command line option allowing to encode codes as XML attributes (instead of tags). Affects: dcmsr/apps/dsr2xml.cc dcmsr/include/dsrtypes.h dcmsr/libsrc/dsrcodtn.cc dcmsr/libsrc/dsrcodvl.cc dcmsr/libsrc/dsrdoc.cc dcmsr/libsrc/dsrdoctn.cc dcmsr/libsrc/dsrnumvl.cc dcmsr/libsrc/dsrtypes.cc dcmsr/docs/dsr2xml.txt - Added preliminary support for Mammography CAD SR. Affects: dcmsr/include/dsrcodtn.h dcmsr/include/dsrcomtn.h dcmsr/include/dsrcontn.h dcmsr/include/dsrdattn.h dcmsr/include/dsrdoc.h dcmsr/include/dsrdoctn.h dcmsr/include/dsrdoctr.h dcmsr/include/dsrdtitn.h dcmsr/include/dsrimgtn.h dcmsr/include/dsrnumtn.h dcmsr/include/dsrpnmtn.h dcmsr/include/dsrscotn.h dcmsr/include/dsrtcotn.h dcmsr/include/dsrtextn.h dcmsr/include/dsrtimtn.h dcmsr/include/dsrtypes.h dcmsr/include/dsruidtn.h dcmsr/include/dsrwavtn.h dcmsr/libsrc/dsrcodtn.cc dcmsr/libsrc/dsrcomtn.cc dcmsr/libsrc/dsrcontn.cc dcmsr/libsrc/dsrdattn.cc dcmsr/libsrc/dsrdoctr.cc dcmsr/libsrc/dsrdtitn.cc dcmsr/libsrc/dsrimgtn.cc dcmsr/libsrc/dsrnumtn.cc dcmsr/libsrc/dsrpnmtn.cc dcmsr/libsrc/dsrscotn.cc dcmsr/libsrc/dsrtcotn.cc dcmsr/libsrc/dsrtextn.cc dcmsr/libsrc/dsrtimtn.cc dcmsr/libsrc/dsrtypes.cc dcmsr/libsrc/dsruidtn.cc dcmsr/libsrc/dsrwavtn.cc dcmsr/docs/dsr2xml.txt - Adjusted formatting in XML output. Affects: dcmsr/libsrc/dsrtcovl.cc - Added support for Windows BMP file format. Affects: dcmimgle/include/dcmimage.h dcmimgle/include/diutils.h dcmimgle/include/diimage.h dcmimgle/include/dimoimg.h dcmimgle/libsrc/dcmimage.cc dcmimgle/libsrc/diimage.cc dcmimage/apps/dcm2pnm.cc dcmimage/include/dicoimg.h dcmimage/libsrc/dicoimg.cc dcmimage/docs/dcm2pnm.txt - Enhanced and renamed createTrueColorDIB() method. Affects: dcmimgle/include/dcmimage.h dcmimgle/include/diimage.h dcmimgle/include/dimoimg.h dcmimgle/libsrc/dimoimg.cc dcmimage/include/dicoimg.h dcmimage/include/dicopx.h dcmimage/include/dicopxt.h dcmimage/libsrc/dicoimg.cc - Updated/Enhanced comments. Affects: dcmimgle/include/dimo1img.h dcmimage/include/dicoimg.h dcmimage/include/diargimg.h dcmimage/include/dicmyimg.h dcmimage/include/dicocpt.h dcmimage/include/dicoflt.h dcmimage/include/dicopx.h dcmimage/include/dicorot.h dcmimage/include/dicosct.h dcmimage/include/dihsvimg.h dcmimage/include/dipalimg.h dcmimage/include/dirgbimg.h dcmimage/include/diybrimg.h dcmimage/include/diyf2img.h dcmimage/include/diyp2img.h - Added support for the direct output of the converted PNM/PGM/BMP image to the 'stdout' stream (not yet tested under Windows). Affects: dcmimage/apps/dcm2pnm.cc dcmimage/docs/dcm2pnm.txt - Removed 'inline' specifier from certain methods. Affects: dcmimage/include/diargpxt.h dcmimage/include/dicmypxt.h dcmimage/include/dicoflt.h dcmimage/include/dicomot.h dcmimage/include/dicoopxt.h dcmimage/include/dihsvpxt.h dcmimage/include/dipalpxt.h dcmimage/include/dirgbpxt.h dcmimage/include/diybrpxt.h dcmimage/include/diyf2pxt.h dcmimage/include/diyp2pxt.h - Removed unused constructor. Affects: dcmimage/include/dicoimg.h dcmimage/libsrc/dicopx.cc - Added '#include ' to keep egcs-2.91.66 quiet. Affects: dcmprint/apps/psvauto.cc dcmprint/libgp/psvdeb2.cc dcmprint/libgp/psvstrng.cc **** Changes from 2001.11.08 (eichelberg) - Updated data dictionary, UIDs and transfer syntaxes for DICOM 2001 edition. Affects: dcmdata/include/dcdeftag.h dcmdata/include/dcuid.h dcmdata/include/dcxfer.h dcmdata/libsrc/dcdictzz.cc dcmdata/libsrc/dcuid.cc dcmdata/libsrc/dcxfer.cc dcmdata/libsrc/dicom.dic - Changed interface for codec registration. Now everything is thread-safe and multiple codecs can be registered for a single transfer syntax (e.g. one encoder and one decoder). Affects: dcmdata/include/dccodec.h dcmdata/libsrc/dccodec.cc dcmdata/libsrc/dcpixel.cc **** Changes from 2001.11.08 (wilkens) - Changed wlistctn tool so that it makes use of OFConsoleApplication and OFCommandLine. Affects: wlistctn/apps/wlistctn.cc wlistctn/apps/wlistctn.h - Fixed a bug in wlistctn: wrong argument passed to function ASC_acceptContextsWithPreferredTransferSyntaxes(...) lead to segmentation fault under certain circumstances. Affects: wlistctn/apps/wlistctn.cc **** Changes from 2001.11.06 (wilkens) - Added more comments. Affects: wlistctn/libsrc/wrklstdb.cc dcmnet/apps/echoscu.cc wlistctn/apps/scefind.cc **** Changes from 2001.11.02 (eichelberg) - Updated project files for Visual C++ 5 Affects: config/systems/win32/msvc5.zip - Removed character sequences that could be interpreted as ISO C++ trigraphs Affects: dcmdata/libsrc/dctagkey.cc dcmdata/libsrc/dcvr.cc ofstd/include/ofstring.h - Added new configure tests for std::_Ios_Openmode and ios::nocreate, required for gcc 3.0.x. Affects: config/acconfig.h config/aclocal.m4 config/configure config/configure.in config/include/cfwin32.h config/include/config.h.in ofstd/libsrc/oflogfil.cc - Including iomanip.h, required for gcc 3.0.x Affects: dcmnet/libsrc/dulparse.cc - Introduced DCMTK version number macro OFFIS_DCMTK_VERSION_NUMBER in dcuid.h Affects: dcmdata/include/dcuid.h **** Changes from 2001.11.01 (eichelberg) - Fixed bug in dcmdata affecting the creation of a temporary file for a DICOMDIR when an explicit path is given. Thanks to Alexander Blum for the bug report. Affects: dcmdata/libsrc/dcdicdir.cc - Including if present, needed on Linux. Affects: dcmdata/libsrc/dcvrdt.cc dcmdata/libsrc/dcvrtm.cc **** Changes from 2001.11.01 (wilkens) - Added lots of comments. Affects: dcmnet/apps/storescp.cc dcmnet/apps/storescu.cc dcmnet/apps/findscu.cc dcmnet/apps/echoscu.cc dcmnet/libsrc/dimse.cc dcmnet/libsrc/dimstore.cc dcmnet/libsrc/dimfind.cc dcmnet/libsrc/dimcmd.cc dcmnet/libsrc/dul.cc dcmnet/libsrc/dulfsm.cc dcmnet/libsrc/dulconst.cc dcmdata/include/dcswap.h dcmdata/libsrc/dcdatset.cc dcmdata/libsrc/dcitem.cc dcmdata/libsrc/dcpixel.cc dcmdata/libsrc/dcelem.cc dcmdata/libsrc/dcfilefo.cc dcmdata/libsrc/dcmetinf.cc dcmdata/libsrc/dcswap.cc dcmdata/libsrc/dcobject.cc wlistctn/apps/scefind.cc - Fixed a bug in DT_2_IndicatePData(...): return error if a received PDU does not contain any PDVs. Affects: dcmnet/libsrc/dulfsm.cc **** Changes from 2001.10.19 (riesmeier) - Fixed bug in DiMonoImage::setWindow(pos) - WindowCenterWidthExplanation was always cleared and never extracted from the dataset as actually intended. Affects: dcmimgle/libsrc/dimoimg.cc **** Changes from 2001.10.12 (eichelberg) - Introduced conditional define OFCONDITION_STRICT_MODE in which the compatibility options related to the transition to OFCondition are disabled: No OFCondition default constructor, no typedefs for E_Condition, CONDITION, no macros for SUCCESS and condition aliases. Affects: ofstd/include/ofcond.h dcmdata/include/dcerror.h dcmnet/include/cond.h - Re-implemented the LST module (double linked list functions) used in the dcmnet module from scratch based on OFList. Affects: dcmnet/include/lst.h dcmnet/libsrc/lst.cc - Replaced the CONDITION types, constants and functions in the dcmnet module by an OFCondition based implementation which eliminates the global condition stack. This is a major change, caveat emptor! Affects: dcmnet/apps/Makefile.dep dcmnet/apps/echoscu.cc dcmnet/apps/findscu.cc dcmnet/apps/movescu.cc dcmnet/apps/storescp.cc dcmnet/apps/storescu.cc dcmnet/include/assoc.h dcmnet/include/cond.h dcmnet/include/dicom.h dcmnet/include/dimse.h dcmnet/include/dul.h dcmnet/libsrc/Makefile.dep dcmnet/libsrc/Makefile.in dcmnet/libsrc/assoc.cc dcmnet/libsrc/cond.cc dcmnet/libsrc/dimcancl.cc dcmnet/libsrc/dimcmd.cc dcmnet/libsrc/dimcmd.h dcmnet/libsrc/dimecho.cc dcmnet/libsrc/dimfind.cc dcmnet/libsrc/dimget.cc dcmnet/libsrc/dimmove.cc dcmnet/libsrc/dimse.cc dcmnet/libsrc/dimstore.cc dcmnet/libsrc/dul.cc dcmnet/libsrc/dulconst.cc dcmnet/libsrc/dulextra.cc dcmnet/libsrc/dulfsm.cc dcmnet/libsrc/dulfsm.h dcmnet/libsrc/dulparse.cc dcmnet/libsrc/dulpres.cc dcmnet/libsrc/dulpriv.h dcmnet/libsrc/dulstruc.h Removed: dcmnet/libsrc/asccond.cc dcmnet/libsrc/asccond.h dcmnet/libsrc/dimcond.cc dcmnet/libsrc/dimcond.h dcmnet/libsrc/dulcond.cc dcmnet/libsrc/lstcond.cc dcmnet/libsrc/lstpriv.h - Adapted wlistctn to OFCondition based dcmnet module (supports strict mode). Affects: wlistctn/apps/Makefile.dep wlistctn/apps/sce.cc wlistctn/apps/sce.h wlistctn/apps/sceecho.cc wlistctn/apps/sceecho.h wlistctn/apps/scefind.cc wlistctn/apps/scefind.h wlistctn/apps/wlistctn.cc wlistctn/libsrc/Makefile.dep wlistctn/tests/Makefile.dep wlistctn/wwwapps/Makefile.dep - Adapted imagectn to OFCondition based dcmnet module (supports strict mode). Affects: imagectn/apps/Makefile.dep imagectn/apps/imagectn.cc imagectn/apps/imagectn.h imagectn/apps/sce.cc imagectn/apps/sce.h imagectn/apps/sceecho.cc imagectn/apps/sceecho.h imagectn/apps/scefind.cc imagectn/apps/scefind.h imagectn/apps/sceget.cc imagectn/apps/sceget.h imagectn/apps/scemove.cc imagectn/apps/scemove.h imagectn/apps/scestore.cc imagectn/apps/scestore.h imagectn/apps/ti.cc imagectn/apps/ti.h imagectn/apps/tinet.cc imagectn/apps/tiquery.cc imagectn/apps/tiui.cc imagectn/apps/dbcond.h imagectn/apps/dbpriv.h imagectn/apps/dbstore.h imagectn/apps/imagedb.h imagectn/apps/Makefile.dep imagectn/apps/dbcond.cc imagectn/apps/dbfind.cc imagectn/apps/dbindex.cc imagectn/apps/dbmove.cc imagectn/apps/dbstore.cc imagectn/apps/dbutils.cc imagectn/apps/Makefile.dep imagectn/apps/dbregimg.cc - Adapted dcmpstat to OFCondition based dcmnet module (supports strict mode). Affects: dcmpstat/apps/Makefile.dep dcmpstat/apps/dcmprscp.cc dcmpstat/apps/dcmprscu.cc dcmpstat/apps/dcmpsrcv.cc dcmpstat/apps/dcmpssnd.cc dcmpstat/include/dvpspr.h dcmpstat/include/dvpsprt.h dcmpstat/libsrc/Makefile.dep dcmpstat/libsrc/dviface.cc dcmpstat/libsrc/dvpspr.cc dcmpstat/libsrc/dvpsprt.cc dcmpstat/libsrc/dvpssp.cc **** Changes from 2001.10.10 (riesmeier) - Changed parameter DcmTagKey to DcmTag in DcmItem::putAndInsert... methods to support elements which are not in the data dictionary (e.g. private extensions). Affects: dcmdata/include/dcitem.h dcmdata/libsrc/dcitem.cc dcmsr/include/dsrtypes.h dcmsr/libsrc/dsrtypes.cc - Added new flag to date/time routines allowing to choose whether the old prior V3.0 format for the corresponding DICOM VRs is supported or not. Affects: dcmdata/include/dcvrda.h dcmdata/include/dcvrtm.h dcmdata/libsrc/dcvrda.cc dcmdata/libsrc/dcvrtm.cc dcmdata/libsrc/dcvrdt.cc - Updated comments. Affects: dcmdata/include/dcvrdt.h dcmdata/include/dcvrpn.h dcmdata/libsrc/dcvrpn.cc - Removed redundant variable declarations to avoid compiler warnings ("declaration of ... shadows previous local"). Affects: dcmimgle/include/diinpxt.h - Additonal adjustments for new OFCondition class. Affects: dcmsr/apps/dsr2html.cc dcmsr/apps/dsr2xml.cc dcmsr/apps/dsrdump.cc dcmsr/include/dsrtlist.h dcmsr/libsrc/dsrtypes.cc dcmsr/libsrc/dsrcodtn.cc dcmsr/libsrc/dsrcodvl.cc dcmsr/libsrc/dsrcomtn.cc dcmsr/libsrc/dsrcomvl.cc dcmsr/libsrc/dsrcontn.cc dcmsr/libsrc/dsrdattn.cc dcmsr/libsrc/dsrdoc.cc dcmsr/libsrc/dsrdoctn.cc dcmsr/libsrc/dsrdoctr.cc dcmsr/libsrc/dsrdtitn.cc dcmsr/libsrc/dsrimgfr.cc dcmsr/libsrc/dsrimgtn.cc dcmsr/libsrc/dsrimgvl.cc dcmsr/libsrc/dsrnumtn.cc dcmsr/libsrc/dsrnumvl.cc dcmsr/libsrc/dsrpnmtn.cc dcmsr/libsrc/dsrreftn.cc dcmsr/libsrc/dsrscogr.cc dcmsr/libsrc/dsrscotn.cc dcmsr/libsrc/dsrscovl.cc dcmsr/libsrc/dsrstrvl.cc dcmsr/libsrc/dsrtcodt.cc dcmsr/libsrc/dsrtcosp.cc dcmsr/libsrc/dsrtcotn.cc dcmsr/libsrc/dsrtcoto.cc dcmsr/libsrc/dsrtcovl.cc dcmsr/libsrc/dsrtextn.cc dcmsr/libsrc/dsrtimtn.cc dcmsr/libsrc/dsruidtn.cc dcmsr/libsrc/dsrwavch.cc dcmsr/libsrc/dsrwavtn.cc dcmsr/libsrc/dsrwavvl.cc dcmsr/tests/mkreport.cc **** Changes from 2001.10.04 (riesmeier) - Adapted new time/date routines to Windows systems. Affects: dcmdata/libsrc/dcvrda.cc dcmdata/libsrc/dcvrdt.cc dcmdata/libsrc/dcvrtm.cc - Added preliminary doc++ support to module dcmdata. Added: dcmdata/htmldocs/Makefile.in Affects: dcmdata/Makefile.in **** Changes from 2001.10.02 (riesmeier) - Added functions to get/put 8 bit values/arrays from/to an item/dataset. Affects: dcmdata/include/dcitem.h dcmdata/libsrc/dcitem.cc - Added getUint8/16 routines to class DcmOtherByteOtherWord. Affects: dcmdata/include/dcvrobow.h dcmdata/libsrc/dcvrobow.cc - Introduced new general purpose functions to get/put DICOM element values from/to an item/dataset - removed some old and rarely used functions. Affects: imagectn/libsrc/dbstore.cc dcmpstat/apps/dcmpschk.cc - Adapted module "dcmsr" to the new class OFCondition. Introduced module specific error codes. Affects: dcmsr/apps/dsr2html.cc dcmsr/apps/dsr2xml.cc dcmsr/apps/dsrdump.cc dcmsr/include/dsrtypes.h dcmsr/libsrc/dsrcodvl.cc dcmsr/libsrc/dsrcomvl.cc dcmsr/libsrc/dsrdoc.cc dcmsr/libsrc/dsrdoctn.cc dcmsr/libsrc/dsrdoctr.cc dcmsr/libsrc/dsrnumvl.cc dcmsr/libsrc/dsrreftn.cc dcmsr/libsrc/dsrtypes.cc **** Changes from 2001.10.01 (riesmeier) - Introduced new general purpose functions to get/set person names, date, time and date/time. Affects: dcmdata/include/dcvrda.h dcmdata/include/dcvrdt.h dcmdata/include/dcvrpn.h dcmdata/include/dcvrtm.h dcmdata/libsrc/dcvrda.cc dcmdata/libsrc/dcvrdt.cc dcmdata/libsrc/dcvrpn.cc dcmdata/libsrc/dcvrtm.cc dcmsr/include/dsrtypes.h - Introduced new general purpose functions to get/put DICOM element values from/to an item/dataset - removed some old and rarely used functions. Affects: dcmdata/apps/dcmgpdir.cc dcmdata/include/dcitem.h dcmdata/libsrc/dcitem.cc - Added "#include " to keep gcc 3.0 quiet. Affects: dcmdata/libsrc/dcitem.cc - Rebuilt makefile dependencies. Affects: dcmdata/libsrc/Makefile.dep **** Changes from 2001.09.28 (riesmeier) - Use typecast std::_Ios_Openmode when available (required for gcc 3.0). Affects: ofstd/libsrc/oflogfil.cc - Replaced "cerr" by "CERR". Affects: ofstd/tests/tstthred.cc dcmnet/apps/storescp.cc dcmnet/apps/storescu.cc dcmpstat/apps/dcmpsrcv.cc dcmpstat/apps/dcmpssnd.cc dcmsr/tests/mkreport.cc dcmdata/libsrc/dcvr.cc - Replaced "cout" by "COUT". Affects: dcmsign/apps/dcmsign.cc dcmsr/tests/mkreport.cc - Rebuilt makefile dependencies. Affects: dcmimgle/apps/Makefile.dep dcmimgle/libsrc/Makefile.dep - Added check whether ios::nocreate exists. Affects: dcmimgle/apps/dconvlum.cc dcmimgle/libsrc/didispfn.cc dcmcheck/apps/dcmcheck.cc dcmcheck/apps/oflice.cc dcmpstat/apps/dcmmklut.cc dcmpstat/apps/dcmp2pgm.cc dcmpstat/apps/dcmpsprt.cc dcmsr/libsrc/dsrdoc.cc - Changed default behaviour of setMinMaxWindow(). Affects: dcmimgle/include/dcmimage.h - Added routines to get the currently active Polarity and PresentationLUTShape. Affects: dcmimgle/include/dcmimage.h dcmimgle/include/dimoimg.h dcmimgle/libsrc/dimoimg.cc - Added method setRoiWindow() which automatically calculates a min-max VOI window for a specified rectangular region of the image. Affects: dcmimgle/include/dcmimage.h dcmimgle/include/dimoimg.h dcmimgle/include/dimopx.h dcmimgle/include/dimopxt.h dcmimgle/libsrc/dimoimg.cc dcmimage/apps/dcm2pnm.cc dcmimage/docs/dcm2pnm.txt - Added method to extract embedded overlay planes from pixel data and store them in group (6xxx,3000) format. Affects: dcmimgle/include/dcmimage.h dcmimgle/include/dimoimg.h dcmimgle/include/diovlay.h dcmimgle/include/diovpln.h dcmimgle/libsrc/dimoimg.cc dcmimgle/libsrc/diovlay.cc dcmimgle/libsrc/diovpln.cc - Added new flag (CIF_KeepYCbCrColorModel) which avoids conversion of YCbCr color models to RGB. Affects: dcmimgle/include/dcmimage.h dcmimgle/include/diutils.h dcmimage/include/dicoimg.h dcmimage/include/diybrpxt.h dcmimage/include/diyf2pxt.h dcmimage/libsrc/dicoimg.cc dcmimage/libsrc/diybrimg.cc dcmimage/libsrc/diyf2img.cc - Enhanced algorithm to determine the min and max value. Affects: dcmimgle/include/diinpx.h dcmimgle/include/diinpxt.h dcmimgle/libsrc/dimomod.cc - Added further robustness checks. Affects: dcmimgle/include/dimoipxt.h - Made min-max window calculation consistent with latest release of the DICOM standard (supplement 33). Affects: dcmimgle/include/dimopxt.h - Corrected wrong warning message regarding the optional RepresentativeFrame Number. Affects: dcmimgle/libsrc/diimage.cc - Added support for the optional PresentationLUTShape (e.g. in DX images). Affects: dcmimgle/libsrc/dimoimg.cc - Updated text. Affects: INSTALL - Added "#include " to keep gcc 3.0 quiet. Affects: dcmnet/libsrc/dul.cc dcmnet/libsrc/dulfsm.cc dcmpstat/apps/dcmpsrcv.cc dcmpstat/libsrc/dvpsprt.cc dcmpstat/libsrc/dvpstat.cc dcmdata/libsrc/dcfilefo.cc dcmdata/libsrc/dcsequen.cc - Removed forward declaration of "ostream" to keep gcc 3.0 quiet. Affects: dcmnet/include/assoc.h - Removed "#include " to keep gcc 3.0 quiet. Affects: dcmnet/libsrc/asccond.cc - Changed formatting. Affects: dcmpstat/libsrc/dvpssp.cc dcmdata/apps/dcmdump.cc - Corrected bug in DB_DeleteOldestStudy(). Affects: imagectn/libsrc/dbstore.cc - Added term "class" to friend declaration to keep gcc 3.0 quiet. Affects: dcmsr/include/dsrreftn.h - Check return value of DcmItem::insert() statements to avoid memory leaks when insert procedure failes. Affects: dcmsr/libsrc/dsrcodvl.cc dcmsr/libsrc/dsrcomvl.cc dcmsr/libsrc/dsrdoctn.cc dcmsr/libsrc/dsrnumvl.cc dcmdata/apps/dcmgpdir.cc - Added missing relationship/target content item to text tree node. Thanks to Gilles Mevel and his co-workers for the bug report. Affects: dcmsr/libsrc/dsrtextn.cc - Added type cast to sprintf() parameter to keep gcc 3.0 quiet. Affects: dcmprint/apps/psvtcpas.cc **** Changes from 2001.09.26 (eichelberg) - Implemented changes in dcmnet required by the adaptation of dcmdata to class OFCondition. Removed some unused code. Affects: dcmnet/apps/Makefile.dep dcmnet/apps/findscu.cc dcmnet/apps/movescu.cc dcmnet/apps/storescu.cc dcmnet/include/dicom.h dcmnet/include/dul.h dcmnet/libsrc/Makefile.dep dcmnet/libsrc/dimcmd.cc dcmnet/libsrc/dimse.cc dcmnet/libsrc/diutil.cc dcmnet/libsrc/dul.cc dcmnet/libsrc/dulcond.cc dcmnet/libsrc/dulfsm.cc dcmnet/libsrc/dulpriv.h - Adapted dcmsr to class OFCondition Affects: dcmsr/apps/Makefile.dep dcmsr/apps/dsr2html.cc dcmsr/apps/dsr2xml.cc dcmsr/apps/dsrdump.cc dcmsr/include/dsrcitem.h dcmsr/include/dsrcodtn.h dcmsr/include/dsrcodvl.h dcmsr/include/dsrcomtn.h dcmsr/include/dsrcomvl.h dcmsr/include/dsrcontn.h dcmsr/include/dsrdattn.h dcmsr/include/dsrdoc.h dcmsr/include/dsrdoctn.h dcmsr/include/dsrdoctr.h dcmsr/include/dsrdtitn.h dcmsr/include/dsrimgfr.h dcmsr/include/dsrimgtn.h dcmsr/include/dsrimgvl.h dcmsr/include/dsrnumtn.h dcmsr/include/dsrnumvl.h dcmsr/include/dsrpnmtn.h dcmsr/include/dsrreftn.h dcmsr/include/dsrscogr.h dcmsr/include/dsrscotn.h dcmsr/include/dsrscovl.h dcmsr/include/dsrstrvl.h dcmsr/include/dsrtcodt.h dcmsr/include/dsrtcosp.h dcmsr/include/dsrtcotn.h dcmsr/include/dsrtcoto.h dcmsr/include/dsrtcovl.h dcmsr/include/dsrtextn.h dcmsr/include/dsrtimtn.h dcmsr/include/dsrtlist.h dcmsr/include/dsrtypes.h dcmsr/include/dsruidtn.h dcmsr/include/dsrwavch.h dcmsr/include/dsrwavtn.h dcmsr/include/dsrwavvl.h dcmsr/libsrc/Makefile.dep dcmsr/libsrc/dsrcitem.cc dcmsr/libsrc/dsrcodtn.cc dcmsr/libsrc/dsrcodvl.cc dcmsr/libsrc/dsrcomtn.cc dcmsr/libsrc/dsrcomvl.cc dcmsr/libsrc/dsrcontn.cc dcmsr/libsrc/dsrdattn.cc dcmsr/libsrc/dsrdoc.cc dcmsr/libsrc/dsrdoctn.cc dcmsr/libsrc/dsrdoctr.cc dcmsr/libsrc/dsrdtitn.cc dcmsr/libsrc/dsrimgfr.cc dcmsr/libsrc/dsrimgtn.cc dcmsr/libsrc/dsrimgvl.cc dcmsr/libsrc/dsrnumtn.cc dcmsr/libsrc/dsrnumvl.cc dcmsr/libsrc/dsrpnmtn.cc dcmsr/libsrc/dsrreftn.cc dcmsr/libsrc/dsrscogr.cc dcmsr/libsrc/dsrscotn.cc dcmsr/libsrc/dsrscovl.cc dcmsr/libsrc/dsrstrvl.cc dcmsr/libsrc/dsrtcodt.cc dcmsr/libsrc/dsrtcosp.cc dcmsr/libsrc/dsrtcotn.cc dcmsr/libsrc/dsrtcoto.cc dcmsr/libsrc/dsrtcovl.cc dcmsr/libsrc/dsrtextn.cc dcmsr/libsrc/dsrtimtn.cc dcmsr/libsrc/dsrtypes.cc dcmsr/libsrc/dsruidtn.cc dcmsr/libsrc/dsrwavch.cc dcmsr/libsrc/dsrwavtn.cc dcmsr/libsrc/dsrwavvl.cc dcmsr/tests/Makefile.dep dcmsr/tests/mkreport.cc - Adapted dcmsign to class OFCondition Affects: dcmsign/apps/Makefile.dep dcmsign/apps/dcmsign.cc dcmsign/include/dcmsign.h dcmsign/include/sialgo.h dcmsign/include/sicert.h dcmsign/include/sicertvf.h dcmsign/include/sidsa.h dcmsign/include/simac.h dcmsign/include/simaccon.h dcmsign/include/simd5.h dcmsign/include/siprivat.h dcmsign/include/siripemd.h dcmsign/include/sirsa.h dcmsign/include/sisha1.h dcmsign/include/sisprof.h dcmsign/include/sitstamp.h dcmsign/include/sitypes.h dcmsign/libsrc/Makefile.dep dcmsign/libsrc/dcmsign.cc dcmsign/libsrc/sicert.cc dcmsign/libsrc/sicertvf.cc dcmsign/libsrc/sidsa.cc dcmsign/libsrc/simaccon.cc dcmsign/libsrc/simd5.cc dcmsign/libsrc/siprivat.cc dcmsign/libsrc/siripemd.cc dcmsign/libsrc/sirsa.cc dcmsign/libsrc/sisha1.cc dcmsign/libsrc/sisprof.cc dcmsign/libsrc/sitypes.cc - Adapted dcmpstat to class OFCondition Affects: dcmpstat/apps/Makefile.dep dcmpstat/apps/dcmmkcrv.cc dcmpstat/apps/dcmmklut.cc dcmpstat/apps/dcmp2pgm.cc dcmpstat/apps/dcmprscu.cc dcmpstat/apps/dcmpschk.cc dcmpstat/apps/dcmpsmk.cc dcmpstat/apps/dcmpsprt.cc dcmpstat/include/dviface.h dcmpstat/include/dvpsab.h dcmpstat/include/dvpsabl.h dcmpstat/include/dvpsal.h dcmpstat/include/dvpsall.h dcmpstat/include/dvpscu.h dcmpstat/include/dvpscul.h dcmpstat/include/dvpsda.h dcmpstat/include/dvpsdal.h dcmpstat/include/dvpsfs.h dcmpstat/include/dvpsga.h dcmpstat/include/dvpsgal.h dcmpstat/include/dvpsgl.h dcmpstat/include/dvpsgll.h dcmpstat/include/dvpsgr.h dcmpstat/include/dvpsgrl.h dcmpstat/include/dvpshlp.h dcmpstat/include/dvpsib.h dcmpstat/include/dvpsibl.h dcmpstat/include/dvpsov.h dcmpstat/include/dvpsovl.h dcmpstat/include/dvpspl.h dcmpstat/include/dvpspll.h dcmpstat/include/dvpsri.h dcmpstat/include/dvpsril.h dcmpstat/include/dvpsrs.h dcmpstat/include/dvpsrsl.h dcmpstat/include/dvpssp.h dcmpstat/include/dvpssv.h dcmpstat/include/dvpssvl.h dcmpstat/include/dvpstat.h dcmpstat/include/dvpstx.h dcmpstat/include/dvpstxl.h dcmpstat/include/dvpsvl.h dcmpstat/include/dvpsvll.h dcmpstat/include/dvpsvw.h dcmpstat/include/dvpsvwl.h dcmpstat/include/dvsighdl.h dcmpstat/libsrc/Makefile.dep dcmpstat/libsrc/dviface.cc dcmpstat/libsrc/dvpsab.cc dcmpstat/libsrc/dvpsabl.cc dcmpstat/libsrc/dvpsal.cc dcmpstat/libsrc/dvpsall.cc dcmpstat/libsrc/dvpscu.cc dcmpstat/libsrc/dvpscul.cc dcmpstat/libsrc/dvpsda.cc dcmpstat/libsrc/dvpsdal.cc dcmpstat/libsrc/dvpsfs.cc dcmpstat/libsrc/dvpsga.cc dcmpstat/libsrc/dvpsgal.cc dcmpstat/libsrc/dvpsgl.cc dcmpstat/libsrc/dvpsgll.cc dcmpstat/libsrc/dvpsgr.cc dcmpstat/libsrc/dvpsgrl.cc dcmpstat/libsrc/dvpshlp.cc dcmpstat/libsrc/dvpsib.cc dcmpstat/libsrc/dvpsibl.cc dcmpstat/libsrc/dvpsov.cc dcmpstat/libsrc/dvpsovl.cc dcmpstat/libsrc/dvpspl.cc dcmpstat/libsrc/dvpspll.cc dcmpstat/libsrc/dvpsprt.cc dcmpstat/libsrc/dvpsri.cc dcmpstat/libsrc/dvpsril.cc dcmpstat/libsrc/dvpsrs.cc dcmpstat/libsrc/dvpsrsl.cc dcmpstat/libsrc/dvpssp.cc dcmpstat/libsrc/dvpssv.cc dcmpstat/libsrc/dvpssvl.cc dcmpstat/libsrc/dvpstat.cc dcmpstat/libsrc/dvpstx.cc dcmpstat/libsrc/dvpstxl.cc dcmpstat/libsrc/dvpsvl.cc dcmpstat/libsrc/dvpsvll.cc dcmpstat/libsrc/dvpsvw.cc dcmpstat/libsrc/dvpsvwl.cc dcmpstat/libsrc/dvsighdl.cc - Modified debug messages, required by OFCondition Affects: dcmdata/libsrc/dcdatset.cc dcmdata/libsrc/dcmetinf.cc dcmdata/libsrc/dcsequen.cc - Renamed parameter in class DcmBuffer to avoid name clash with global function index() Affects: dcmdata/include/dcbuf.h - Adapted wlistctn to class OFCondition Affects: wlistctn/include/wrklstdb.h wlistctn/libsrc/wrklstdb.cc wlistctn/tests/wltest.cc wlistctn/wwwapps/readoviw.cc wlistctn/wwwapps/readwlst.cc wlistctn/wwwapps/writwlst.cc - Adapted imagectn to class OFCondition Affects: imagectn/apps/tiquery.cc imagectn/apps/libsrc/dbfind.cc imagectn/apps/libsrc/dbmove.cc imagectn/apps/libsrc/dbstore.cc - Adapted dcmimage to class OFCondition Affects: dcmimage/apps/dcm2pnm.cc - Adapted ctndisp to class OFCondition Affects: ctndisp/apps/ctnddico.cc **** Changes from 2001.09.25 (eichelberg) - Updated abstract class DcmRepresentationParameter for use with dcmjpeg Affects: dcmdata/include/dcpixel.h dcmdata/libsrc/dcpixel.cc - Updated abstract class DcmCodecParameter for use with dcmjpeg. Added new function deregisterGlobalCodec(). Affects: dcmdata/include/dccodec.h dcmdata/libsrc/dccodec.cc - Disabled implicit conversion to bool, added default constructor to class OFCondition. Affects: ofstd/include/ofcond.h ofstd/libsrc/ofcond.cc - Adapted dcmdata to class OFCondition Affects: dcmdata/apps/Makefile.dep dcmdata/apps/dcmconv.cc dcmdata/apps/dcmdump.cc dcmdata/apps/dcmgpdir.cc dcmdata/apps/dump2dcm.cc dcmdata/include/dcbytstr.h dcmdata/include/dccodec.h dcmdata/include/dcdatset.h dcmdata/include/dcdicdir.h dcmdata/include/dcdirrec.h dcmdata/include/dcelem.h dcmdata/include/dcerror.h dcmdata/include/dcfilefo.h dcmdata/include/dcitem.h dcmdata/include/dcmetinf.h dcmdata/include/dcobject.h dcmdata/include/dcpixel.h dcmdata/include/dcpixseq.h dcmdata/include/dcpxitem.h dcmdata/include/dcsequen.h dcmdata/include/dcstream.h dcmdata/include/dcswap.h dcmdata/include/dctag.h dcmdata/include/dcvrae.h dcmdata/include/dcvrat.h dcmdata/include/dcvrcs.h dcmdata/include/dcvrds.h dcmdata/include/dcvrdt.h dcmdata/include/dcvrfd.h dcmdata/include/dcvrfl.h dcmdata/include/dcvris.h dcmdata/include/dcvrlo.h dcmdata/include/dcvrlt.h dcmdata/include/dcvrobow.h dcmdata/include/dcvrpn.h dcmdata/include/dcvrpobw.h dcmdata/include/dcvrsh.h dcmdata/include/dcvrsl.h dcmdata/include/dcvrss.h dcmdata/include/dcvrst.h dcmdata/include/dcvrtm.h dcmdata/include/dcvrui.h dcmdata/include/dcvrul.h dcmdata/include/dcvrulup.h dcmdata/include/dcvrus.h dcmdata/include/dcvrut.h dcmdata/libsrc/Makefile.dep dcmdata/libsrc/dcbytstr.cc dcmdata/libsrc/dccodec.cc dcmdata/libsrc/dcdatset.cc dcmdata/libsrc/dcdicdir.cc dcmdata/libsrc/dcdirrec.cc dcmdata/libsrc/dcelem.cc dcmdata/libsrc/dcerror.cc dcmdata/libsrc/dcfilefo.cc dcmdata/libsrc/dcitem.cc dcmdata/libsrc/dcmetinf.cc dcmdata/libsrc/dcobject.cc dcmdata/libsrc/dcpixel.cc dcmdata/libsrc/dcpixseq.cc dcmdata/libsrc/dcpxitem.cc dcmdata/libsrc/dcsequen.cc dcmdata/libsrc/dcstream.cc dcmdata/libsrc/dcswap.cc dcmdata/libsrc/dcvrae.cc dcmdata/libsrc/dcvrat.cc dcmdata/libsrc/dcvrcs.cc dcmdata/libsrc/dcvrds.cc dcmdata/libsrc/dcvrdt.cc dcmdata/libsrc/dcvrfd.cc dcmdata/libsrc/dcvrfl.cc dcmdata/libsrc/dcvris.cc dcmdata/libsrc/dcvrlo.cc dcmdata/libsrc/dcvrlt.cc dcmdata/libsrc/dcvrobow.cc dcmdata/libsrc/dcvrpn.cc dcmdata/libsrc/dcvrpobw.cc dcmdata/libsrc/dcvrsh.cc dcmdata/libsrc/dcvrsl.cc dcmdata/libsrc/dcvrss.cc dcmdata/libsrc/dcvrst.cc dcmdata/libsrc/dcvrtm.cc dcmdata/libsrc/dcvrui.cc dcmdata/libsrc/dcvrul.cc dcmdata/libsrc/dcvrulup.cc dcmdata/libsrc/dcvrus.cc dcmdata/libsrc/dcvrut.cc - Enabled E_Condition and dcmErrorConditionToString() for backward compatibility with existing code. Affects: dcmdata/include/dcerror.h **** Changes from 2001.08.23 (eichelberg) - Added private undefined copy assignment operators to avoid gcc warnings Affects: ofstd/include/ofcmdln.h ofstd/include/oflist.h - Initial release of class OFCondition, a generic approach for condition codes Added: ofstd/include/ofcond.h ofstd/libsrc/ofcond.cc Affects: ofstd/libsrc/Makefile.dep ofstd/libsrc/Makefile.in - Added configure tests required by dcmjpeg module Affects: config/acconfig.h config/aclocal.m4 config/configure config/configure.in config/include/cfwin32.h config/include/config.h.in **** Changes from 2001.08.22 (eichelberg) - Fixed double deletion of association parameters in dcmpstat class DVPSPrintMessageHandler. Thanks to Ben for the problem report and bug fix. Affects: dcmpstat/libsrc/dvpspr.cc **** Changes from 2001.07.03 (eichelberg) - Fixed memory leak in ofstack.h Thanks to Thomas Moeller for the problem report and bug fix. Affects: ofstd/include/ofstack.h **** Changes from 2001.07.02 (riesmeier) - Replaced non-standard characters in report "05" and "15". Thanks to Merlijn van Minderhout for the validation report of our SR sample documents. Affects: dcmsr/tests/mkreport.cc - Fixed small bugs in dcmCopySequence() and addConceptModContentItems(). Affects: dcmdata/apps/dcmgpdir.cc **** Changes from 2001.06.21 (riesmeier) - Added two entries to the GUI section allowing to specify the font/size for the process log panel. Affects: dcmpstat/tests/test.cfg **** Changes from 2001.06.20 (riesmeier) - Moved old announcement and change log for release 3.5.0 to docs. Removed: ANNOUNCE.350 CHANGES.350 Added: docs/ANNOUNCE.350 docs/CHANGES.350 - Created new change log. Added: CHANGES.351 - Added support for new SOP class Key Object Selection Document (suppl. 59). Affects: dcmdata/apps/dcmgpdir.cc dcmdata/include/dcdirrec.h dcmdata/libsrc/dcdirrec.cc - Added minimal support for new SOP class Key Object Selection Document (suppl. 59). Affects: dcmsr/docs/dsr2html.txt dcmsr/docs/dsr2xml.txt dcmsr/docs/dsrdump.txt dcmsr/include/dsrtypes.h dcmsr/libsrc/dsrdoc.cc dcmsr/libsrc/dsrdoctn.cc dcmsr/libsrc/dsrdoctr.cc dcmsr/libsrc/dsrtypes.cc - Added new debugging features (additional flags) to examine "corrupted" SR documents. Affects: dcmsr/apps/dsr2html.cc dcmsr/apps/dsr2xml.cc dcmsr/apps/dsrdump.cc dcmsr/docs/dsr2html.txt dcmsr/docs/dsr2xml.txt dcmsr/docs/dsrdump.txt dcmsr/include/dsrtypes.h dcmsr/libsrc/dsrdoctn.cc dcmsr/libsrc/dsrtypes.cc - Enhanced multi-frame support for command line tool 'dcm2pnm': extract all or a range of frames with one call. Affects: dcmimage/apps/dcm2pnm.cc dcmimage/docs/dcm2pnm.txt dcmimgle/include/dcmimage.h dcmimgle/include/diimage.h - Removed old dcmimage license information. Affects: dcmimage/apps/dcm2pnm.cc dcmimage/include/diregist.h dcmtk-3.6.0/docs/ANNOUNCE.3210000644000310500011400000000247607220101045014424 0ustar joergrdicom3ANNOUNCEMENT Version 3.2 of the OFFIS DCMTK (DICOM ToolKit) software is now available for public release. This release includes the following main changes over the previous release (Version 3.1.2): - dcmgpdir - an application to build a DICOMDIR according to the specifications of Supplement 19: General Purpose CD-R Image Interchange Profile. - Support for additional Storage SOP Classes (e.g. PET, Visible Light, Print Storage). - Basic toolkit support (data dictionary and UID tables) for Queue Management, Performed Procedure Step, User Preference LUT. - Support for Supplement 14: Unknown VR. - More than 80 bug fixes and improvements (see CHANGES file for details). The Image CTN and Worklist CTN servers from DCMTK Version 3.2 (imagectn and wlistctn) will be used during the DICOM Network Interoperability Demonstration as part of the Industrial Exhibition at CAR'97 in Berlin, Germany (June 26-27). DCMTK Version 3.2 was also used to assist production of the CAR'97 DICOM Demonstration CD. In particular, the dcmgpdir application was used to build the DICOMDIR (Medical Directory) found on the CD. The DCMTK software can be downloaded via: http://www.offis.uni-oldenburg.de/projekte/dicom/dicom_software_e.html --- Andrew Hewett, Marco Eichelberg, Andreas Barth, Sandra von Gehlen Oldenburg, 30 May, 1997 dcmtk-3.6.0/docs/CHANGES.3520000644000310500011400000040345607607030563014314 0ustar joergrdicom3 Release 3.5.2 (Public Release - 2002-12-23) - Updated version name and implementation name to reflect release 3.5.2 Affects: dcmdata/include/dcuid.h - Updated documentation to reflect changes in 3.5.2 Affects: README Added: ANNOUNCE.352 **** Changes from 2002.12.23 (eichelberg) - Updated echoscu MSCV project file for OpenSSL support Affects: dcmnet/apps/echoscu.dsp - Updated list of supported platforms Affects: INSTALL - Updated copyright Affects: dcmdata/libsrc/dicom.dic **** Changes from 2002.12.20 (wilkens) - Modified name clash resulting in a compiler error on Solaris 2.5.1 using compiler SC 2.0.1. Affects: dcmpstat/libsrc/Makefile.dep dcmpstat/libsrc/dviface.cc dcmpstat/libsrc/dvsighdl.cc dcmsign/dcmsign.dsp dcmsign/apps/Makefile.dep dcmsign/apps/dcmsign.cc dcmsign/libsrc/Makefile.dep dcmsign/libsrc/Makefile.in Removed: dcmsign/include/dcmsign.h (is now called dcsignat.h) dcmsign/libsrc/dcmsign.cc (is now called dcsignat.cc) Added: dcmsign/include/dcsignat.h (used to be called dcmsign.h) dcmsign/libsrc/dcsignat.cc (used to be called dcmsign.cc) - Inserted three casts in order to get rid of compiler warning on Solaris 2.5.1 using compiler SC 2.0.1. Affects: dcmdata/libsrc/dcistrmz.cc dcmdata/libsrc/dcostrmz.cc **** Changes from 2002.12.18 (wilkens) - Had forgotten to delete some superfluous code. Did it now. Affects: ofstd/include/ofset.h **** Changes from 2002.12.17 (wilkens) - Adapted msvc project file for ofstd. Affects: ofstd/ofstd.dsp - Modified code again to keep Sun CC 2.0.1 happy on Solaris 2.5.1 (template errors). Affects: ofstd/include/ofset.h ofstd/include/ofoset.h **** Changes from 2002.12.16 (wilkens) - Removed superfluous implementation files and modified header and make files. Affects: ofstd/include/ofoset.h ofstd/include/ofset.h ofstd/include/ofuoset.h ofstd/libsrc/Makefile.dep ofstd/libsrc/Makefile.in Removed: ofstd/libsrc/ofoset.cc ofstd/libsrc/ofset.cc ofstd/libsrc/ofuoset.cc - Added missing #include "osconfig.h" to certain files. Affects: dcmwlm/apps/wlcefs.h dcmwlm/include/wlds.h dcmwlm/include/wldsfs.h dcmwlm/include/wlfsim.h dcmwlm/include/wlmactmg.h dcmwlm/include/wltypdef.h **** Changes from 2002.12.16 (eichelberg) - Added configure test that checks if signal handler functions require ellipse (...) parameters, for example on Irix5. Affects: config/acconfig.h config/aclocal.m4 config/configure config/configure.in config/include/cfunix.h.in config/include/cfwin32.h - Minor modification to shut up linker on MacOS X when compiling without OpenSSL support Affects: dcmimage/libsrc/dipitiff.cc dcmsign/libsrc/dcmsign.cc dcmsign/libsrc/siautopr.cc dcmsign/libsrc/sibrsapr.cc dcmsign/libsrc/sicert.cc dcmsign/libsrc/sicertvf.cc dcmsign/libsrc/sicreapr.cc dcmsign/libsrc/sidsa.cc dcmsign/libsrc/simaccon.cc dcmsign/libsrc/simd5.cc dcmsign/libsrc/sinullpr.cc dcmsign/libsrc/siprivat.cc dcmsign/libsrc/siripemd.cc dcmsign/libsrc/sirsa.cc dcmsign/libsrc/sisha1.cc dcmsign/libsrc/sisprof.cc dcmsign/libsrc/sitypes.cc - Updated installation instructions and FAQ Affects: INSTALL FAQ - Added configure test that checks if extern "C" inclusion of fails, e.g. on HP/UX 10 and WIN32 Affects: config/acconfig.h config/aclocal.m4 config/configure config/configure.in config/include/cfunix.h.in config/include/cfwin32.h ofstd/include/ofstdinc.h **** Changes from 2002.12.13 (eichelberg) - Fixed problem in dcmdump, --ignore-errors now works correctly again. Thanks to Sebastian Meyer for the bug report Affects: dcmdata/apps/dcmdump.cc - Removed unused code reported by the MIPSpro 7.3 optimizer Affects: dcmwlm/wwwapps/writwlst.cc imagectn/apps/sceget.cc imagectn/apps/scemove.cc imagectn/apps/scestore.cc imagectn/apps/tinet.cc imagectn/libsrc/dbstore.cc - Activated file padding options Affects: dcmimage/apps/dcmscale.cc - Removed const from decodeBase64() return code, needed on MIPSpro Affects: ofstd/include/ofstd.h ofstd/libsrc/ofstd.cc - configure now defines the correct CXXFLAGS for Irix 6. Affects: config/configure config/configure.in - Removed obsolete entry from FAQ Affects: FAQ - Enabled TLS network connections in echoscu Affects: dcmnet/apps/Makefile.dep dcmnet/apps/Makefile.in dcmnet/apps/echoscu.cc dcmnet/docs/echoscu.txt **** Changes from 2002.12.13 (wilkens) - Modified code to keep Sun CC 2.0.1 happy on Solaris 2.5.1 (unreachable statement warning). Affects: dcmwlm/libsrc/wlfsim.cc - Modified code to keep Sun CC 2.0.1 happy on Solaris 2.5.1 (template errors). Affects: ofstd/include/ofset.h ofstd/include/ofoset.h **** Changes from 2002.12.13 (riesmeier) - Added explicit type cast to pointer initialization to avoid warning reported by gcc 2.7.2.1. Affects: dcmimgle/libsrc/diimage.cc **** Changes from 2002.12.12 (wilkens) - Added some code to avoid compiler warning (unreachable code) on Sun CC 2.0.1. Affects: dcmwlm/libsrc/wlmactmg.cc dcmwlm/include/wlmactmg.h - Added some code to avoid compiler warning (unsigned long passed as unsigned int) on Sun CC 2.0.1. Affects: dcmwlm/libsrc/wlfsim.cc **** Changes from 2002.12.12 (riesmeier) - Added ZLIBLIBS to Makefile to avoid linker errors on IRIX 5. Affects: dcmdata/tests/Makefile.in **** Changes from 2002.12.11 (riesmeier) - Added const type specifier to a "char*" variable declaration to avoid compiler error on Sun CC 5.2. Affects: dcmwlm/libsrc/wlfsim.cc - Added extern "C" declaration to qsort functions to avoid warnings reported by Sun CC 5.2. Affects: dcmimage/libsrc/diqtctab.cc dcmimage/libsrc/diqtpbox.cc **** Changes from 2002.12.11 (eichelberg) - Added configure test for type of 5th parameter of getsockopt() Affects: config/acconfig.h config/aclocal.m4 config/configure config/configure.in config/include/cfunix.h.in config/include/cfwin32.h - Now correctly handling three variants of getsockopt(), where the fifth parameter can be a pointer to int, size_t or socklen_t. Affects: dcmnet/libsrc/dulfsm.cc - Minor code correction fixing a warning re setjmp and variable register allocation issued by gcc 3.2 -Wuninitialized Affects: dcmjpeg/libsrc/dipijpeg.cc - Further code correction to avoid warning on MSVC6. Affects: dcmjpeg/libsrc/dipijpeg.cc - Updated Makefiles to include MATHLIBS where needed, for OSF/1 Affects: dcmdata/apps/Makefile.in dcmdata/tests/Makefile.in dcmjpeg/apps/Makefile.in dcmnet/apps/Makefile.in dcmpstat/tests/Makefile.in dcmsign/apps/Makefile.in dcmsr/apps/Makefile.in dcmsr/tests/Makefile.in dcmwlm/apps/Makefile.in dcmwlm/tests/Makefile.in dcmwlm/wwwapps/Makefile.in imagectn/apps/Makefile.in imagectn/tests/Makefile.in ofstd/tests/Makefile.in - Added empty namespace std declaration, needed on MSVC. Affects: ofstd/include/ofstdinc.h ofstd/include/ofstream.h - Added typecasts to avoid warnings on OSF/1 Affects: dcmdata/libsrc/dcvrsl.cc dcmdata/libsrc/dcvrul.cc dcmwlm/libsrc/wlmactmg.cc - Enable ANSI standard C++ includes on Visual C++ 6 and newer Affects: config/include/cfwin32.h **** Changes from 2002.12.10 (riesmeier) - Added support for the Numeric Value Qualifier Code Sequence (introduced with CP 260). Affects: dcmsr/include/dsrnumvl.h dcmsr/libsrc/dsrnumvl.cc - Fixed bug that caused createAWTBitmap() to return always empty pixel data. Affects: dcmimgle/libsrc/dimoimg.cc - Fixed "cut and paste" error in assignment operator. Affects: dcmdata/libsrc/dcvrsl.cc dcmdata/libsrc/dcvrul.cc - Added curly brackets around debug() call to avoid compiler errors with gcc 2.95 in debug mode. Affects: dcmdata/libsrc/dcsequen.cc **** Changes from 2002.12.10 (eichelberg) - Modified DUL_InitializeNetwork to allow multiple network instances to be created. Affects: dcmnet/libsrc/dul.cc - Removed error code DUL_NETWORKINITIALIZED which is not used anymore Affects: dcmnet/include/cond.h dcmnet/libsrc/cond.cc - Fixed bug in DUL code that caused a hang in DUL_AbortAssociation when used on Windows 2000. Thanks to David Lappen for the bug report. Affects: dcmnet/libsrc/dul.cc - Added explicit type cast to avoid compilation error on gcc 3.2 Affects: dcmimage/include/dicopxt.h - Removed typedef to avoid warnings on various compilers Affects: dcmdata/include/dcbytstr.h **** Changes from 2002.12.10 (wilkens) - Updated the dictionary specification according to the final texts of the Supplements and Correction Proposals which were published after the 2001 DICOM standard was published. Affects: dcmdata/include/deftag.h dcmdata/libsrc/dcdictzz.cc dcmdata/libsrc/dicom.dic - Added a comment for clarifying how a specific character set attribute in C-Find requests is used in the worklist management implementation. Affects: dcmwlm/docs/wlmscpfs.txt **** Changes from 2002.12.09 (riesmeier) - Renamed parameter to avoid name clash with global function index(). Affects: ofstd/include/ofoset.h ofstd/include/ofset.h dcmwlm/include/wldsfs.h dcmwlm/include/wlfsim.h dcmwlm/libsrc/wldsfs.cc dcmwlm/libsrc/wlfsim.cc - Renamed parameter/local variable to avoid name clash with global function exp(). Affects: ofstd/libsrc/ofstd.cc - Renamed parameter/local variable to avoid name clashes with global declaration left and/or right (used for as iostream manipulators). Affects: dcmpstat/include/dvpstat.h dcmpstat/libsrc/dvpsov.cc dcmpstat/libsrc/dvpstat.cc dcmimgle/include/dcmimage.h dcmimgle/include/diimage.h dcmimgle/include/diluptab.h dcmimgle/include/dimo1img.h dcmimgle/include/dimo2img.h dcmimgle/include/dimoimg.h dcmimgle/include/dimoopxt.h dcmimgle/include/dimopx.h dcmimgle/include/dimopxt.h dcmimgle/include/dimosct.h dcmimgle/include/diovlay.h dcmimgle/include/diovpln.h dcmimgle/include/discalet.h dcmimgle/libsrc/dcmimage.cc dcmimgle/libsrc/diluptab.cc dcmimgle/libsrc/dimo1img.cc dcmimgle/libsrc/dimo2img.cc dcmimgle/libsrc/dimoimg.cc dcmimgle/libsrc/diovlay.cc dcmimgle/libsrc/diovpln.cc dcmimage/include/dicoimg.h dcmimage/include/dicosct.h dcmimage/libsrc/dicoimg.cc dcmjpeg/include/djcparam.h dcmjpeg/libsrc/djcodece.cc - Renamed local variable to avoid name clash with function parameter "buf". Affects: dcmnet/libsrc/dulparse.cc - Renamed local variable to avoid name clash with global declaration "skipws". Affects: dcmpstat/libsrc/dvpsconf.cc - Renamed local variable to avoid name clash with function parameter "sum". Affects: dcmimage/libsrc/diqtctab.cc - Initialize member variables in the member initialization list. Affects: ofstd/include/ofset.h - Replaced tab characters by spaces. Affects: ofstd/include/ofcmdln.h - Added private undefined copy constructor and/or assignment operator. Affects: ofstd/libsrc/ofstd.cc dcmimage/include/dicopxt.h dcmwlm/include/wlfsim.h - Added copy constructor and private undefined assignment operator. Affects: ofstd/tests/tstftoa.cc - Added new source file "dcvrof.cxx" to MSVC makefile. Affects: dcmdata/dcmdata.dsp - Fixed bug that caused method createAWTBitmap() to return always empty pixel data. Affects: dcmimage/include/dicopxt.h - Added dependency from module dcmimgle to project dcmdjpeg. Affects: dcmtk.dsw **** Changes from 2002.12.09 (eichelberg) - Updated list of UIDs Affects: dcmdata/include/dcuid.h dcmdata/libsrc/dcuid.cc dcmnet/docs/movescu.txt dcmnet/docs/storescp.txt dcmnet/docs/storescu.txt imagectn/docs/imagectn.txt **** Changes from 2002.12.09 (wilkens) - Modified/Added doc++ documentation. Affects: dcmdata/include/dcitem.h dcmdata/include/dcelem.h dcmdata/include/dcdatset.h dcmdata/include/dcpixel.h dcmdata/libsrc/dcitem.cc dcmdata/libsrc/dcelem.cc dcmdata/libsrc/dcdatset.cc dcmdata/libsrc/dcpixel.cc **** Changes from 2002.12.06 (riesmeier) - Added support for new value representation Other Float String (OF). Added: dcmdata/include/dcvrof.h dcmdata/libsrc/dcvrof.cc Affects: dcmdata/apps/Makefile.dep dcmdata/include/dctk.h dcmdata/include/dcvr.h dcmdata/libsrc/Makefile.dep dcmdata/libsrc/Makefile.in dcmdata/libsrc/dcvr.cc - Fixed bug in Unlimited Text (UT) class: the backslash character was treated as a component separator which is wrong according to the DICOM standard. Thanks to Razvan Costea-B. for the bug report. The same bug was found in class Long Text (LT) and Short Text (ST). Also changed the behaviour of the getVM() method; now returns 1 only in case of non-empty string values. Affects: dcmdata/libsrc/dcvrlt.cc dcmdata/libsrc/dcvrst.cc dcmdata/libsrc/dcvrut.cc - Enhanced "print()" function by re-working the implementation and replacing the boolean "showFullData" parameter by a more general integer flag. Affects: dcmdata/apps/dcmdump.cc dcmdata/include/dcbytstr.h dcmdata/include/dcchrstr.h dcmdata/include/dcdatset.h dcmdata/include/dcdicdir.h dcmdata/include/dcdirrec.h dcmdata/include/dcelem.h dcmdata/include/dcfilefo.h dcmdata/include/dcitem.h dcmdata/include/dcmetinf.h dcmdata/include/dcobject.h dcmdata/include/dcpixel.h dcmdata/include/dcpixseq.h dcmdata/include/dcpxitem.h dcmdata/include/dcsequen.h dcmdata/include/dctypes.h dcmdata/include/dcvrae.h dcmdata/include/dcvras.h dcmdata/include/dcvrat.h dcmdata/include/dcvrcs.h dcmdata/include/dcvrda.h dcmdata/include/dcvrds.h dcmdata/include/dcvrdt.h dcmdata/include/dcvrfd.h dcmdata/include/dcvrfl.h dcmdata/include/dcvris.h dcmdata/include/dcvrlo.h dcmdata/include/dcvrlt.h dcmdata/include/dcvrobow.h dcmdata/include/dcvrpn.h dcmdata/include/dcvrsh.h dcmdata/include/dcvrsl.h dcmdata/include/dcvrss.h dcmdata/include/dcvrst.h dcmdata/include/dcvrtm.h dcmdata/include/dcvrui.h dcmdata/include/dcvrul.h dcmdata/include/dcvrulup.h dcmdata/include/dcvrus.h dcmdata/include/dcvrut.h dcmdata/libsrc/dcbytstr.cc dcmdata/libsrc/dcdatset.cc dcmdata/libsrc/dcdirrec.cc dcmdata/libsrc/dcelem.cc dcmdata/libsrc/dcfilefo.cc dcmdata/libsrc/dcitem.cc dcmdata/libsrc/dcmetinf.cc dcmdata/libsrc/dcobject.cc dcmdata/libsrc/dcpixel.cc dcmdata/libsrc/dcpixseq.cc dcmdata/libsrc/dcpxitem.cc dcmdata/libsrc/dcsequen.cc dcmdata/libsrc/dctypes.cc dcmdata/libsrc/dcvrae.cc dcmdata/libsrc/dcvras.cc dcmdata/libsrc/dcvrat.cc dcmdata/libsrc/dcvrcs.cc dcmdata/libsrc/dcvrda.cc dcmdata/libsrc/dcvrds.cc dcmdata/libsrc/dcvrdt.cc dcmdata/libsrc/dcvrfd.cc dcmdata/libsrc/dcvrfl.cc dcmdata/libsrc/dcvris.cc dcmdata/libsrc/dcvrlo.cc dcmdata/libsrc/dcvrpn.cc dcmdata/libsrc/dcvrobow.cc dcmdata/libsrc/dcvrsh.cc dcmdata/libsrc/dcvrsl.cc dcmdata/libsrc/dcvrss.cc dcmdata/libsrc/dcvrtm.cc dcmdata/libsrc/dcvrui.cc dcmdata/libsrc/dcvrul.cc dcmdata/libsrc/dcvrulup.cc dcmdata/libsrc/dcvrus.cc - Added new error status "EC_ApplicationProfileViolated". Affects: dcmdata/include/dcerror.h dcmdata/libsrc/dcerror.cc - Added doc++ documentation. Affects: dcmdata/include/dcbytstr.h dcmdata/include/dcchrstr.h dcmdata/include/dcdatset.h dcmdata/include/dcdicdir.h dcmdata/include/dcdirrec.h dcmdata/include/dcelem.h dcmdata/include/dcfilefo.h dcmdata/include/dcitem.h dcmdata/include/dcmetinf.h dcmdata/include/dcobject.h dcmdata/include/dcpixel.h dcmdata/include/dcpixseq.h dcmdata/include/dcpxitem.h dcmdata/include/dcsequen.h dcmdata/include/dcvrae.h dcmdata/include/dcvras.h dcmdata/include/dcvrat.h dcmdata/include/dcvrcs.h dcmdata/include/dcvrda.h dcmdata/include/dcvrds.h dcmdata/include/dcvrdt.h dcmdata/include/dcvrfd.h dcmdata/include/dcvrfl.h dcmdata/include/dcvris.h dcmdata/include/dcvrlo.h dcmdata/include/dcvrlt.h dcmdata/include/dcvrobow.h dcmdata/include/dcvrpn.h dcmdata/include/dcvrsh.h dcmdata/include/dcvrsl.h dcmdata/include/dcvrss.h dcmdata/include/dcvrst.h dcmdata/include/dcvrtm.h dcmdata/include/dcvrui.h dcmdata/include/dcvrul.h dcmdata/include/dcvrulup.h dcmdata/include/dcvrus.h dcmdata/include/dcvrut.h - Made source code formatting more consistent with other modules/files. Affects: dcmdata/include/dcbytstr.h dcmdata/include/dcchrstr.h dcmdata/include/dcdatset.h dcmdata/include/dcdicdir.h dcmdata/include/dcdirrec.h dcmdata/include/dcelem.h dcmdata/include/dcfilefo.h dcmdata/include/dcitem.h dcmdata/include/dcmetinf.h dcmdata/include/dcobject.h dcmdata/include/dcpixel.h dcmdata/include/dcpixseq.h dcmdata/include/dcpxitem.h dcmdata/include/dcsequen.h dcmdata/include/dcvrae.h dcmdata/include/dcvras.h dcmdata/include/dcvrat.h dcmdata/include/dcvrcs.h dcmdata/include/dcvrda.h dcmdata/include/dcvrds.h dcmdata/include/dcvrdt.h dcmdata/include/dcvrfd.h dcmdata/include/dcvrfl.h dcmdata/include/dcvris.h dcmdata/include/dcvrlo.h dcmdata/include/dcvrlt.h dcmdata/include/dcvrobow.h dcmdata/include/dcvrpn.h dcmdata/include/dcvrsh.h dcmdata/include/dcvrsl.h dcmdata/include/dcvrss.h dcmdata/include/dcvrst.h dcmdata/include/dcvrtm.h dcmdata/include/dcvrui.h dcmdata/include/dcvrul.h dcmdata/include/dcvrulup.h dcmdata/include/dcvrus.h dcmdata/include/dcvrut.h dcmdata/libsrc/dcbytstr.cc dcmdata/libsrc/dcchrstr.cc dcmdata/libsrc/dcdatset.cc dcmdata/libsrc/dcdirrec.cc dcmdata/libsrc/dcelem.cc dcmdata/libsrc/dcfilefo.cc dcmdata/libsrc/dcitem.cc dcmdata/libsrc/dcmetinf.cc dcmdata/libsrc/dcobject.cc dcmdata/libsrc/dcpixel.cc dcmdata/libsrc/dcpixseq.cc dcmdata/libsrc/dcpxitem.cc dcmdata/libsrc/dcsequen.cc dcmdata/libsrc/dcvrae.cc dcmdata/libsrc/dcvras.cc dcmdata/libsrc/dcvrat.cc dcmdata/libsrc/dcvrcs.cc dcmdata/libsrc/dcvrda.cc dcmdata/libsrc/dcvrds.cc dcmdata/libsrc/dcvrdt.cc dcmdata/libsrc/dcvrfd.cc dcmdata/libsrc/dcvrfl.cc dcmdata/libsrc/dcvris.cc dcmdata/libsrc/dcvrlo.cc dcmdata/libsrc/dcvrlt.cc dcmdata/libsrc/dcvrobow.cc dcmdata/libsrc/dcvrpn.cc dcmdata/libsrc/dcvrsh.cc dcmdata/libsrc/dcvrsl.cc dcmdata/libsrc/dcvrss.cc dcmdata/libsrc/dcvrst.cc dcmdata/libsrc/dcvrtm.cc dcmdata/libsrc/dcvrui.cc dcmdata/libsrc/dcvrul.cc dcmdata/libsrc/dcvrulup.cc dcmdata/libsrc/dcvrus.cc dcmdata/libsrc/dcvrut.cc - Replaced some German comments by English translations. Affects: dcmdata/libsrc/dcdirrec.cc dcmdata/libsrc/dcitem.cc dcmdata/libsrc/dcmetinf.cc **** Changes from 2002.12.05 (riesmeier) - Replaced term "wlistctn" by "dcmwlm" or "wlmscpfs" respectively. Affects: INSTALL config/modules - Make sure that no warning on "unchecked command line options" is reported in debug mode when an exclusive option is used. Affects: ofstd/include/ofcmdln.h - Moved definition of ftoa() processing flags to implementation file to avoid compiler errors (e.g. on Sun CC 2.0.1). Affects: ofstd/include/ofstd.h ofstd/libsrc/ofstd.cc - Added further checks when reading SR documents (e.g. value of VerificationFlag, CompletionsFlag, ContinuityOfContent and SpecificCharacterSet). Affects: dcmsr/libsrc/dsrdoc.cc dcmsr/libsrc/dsrcontn.cc dcmsr/libsrc/dsrscovl.cc dcmsr/libsrc/dsrtcovl.cc - Added missing "processing ..." message for the root content item. Affects: dcmsr/libsrc/dsrdoctr.cc - Fixed typo. Affects: dcmdata/apps/dump2dcm.cc **** Changes from 2002.12.05 (eichelberg) - Modified code to avoid a "sorry, not implemented" error on Sun CC 2.0.1 Affects: ofstd/tests/tstftoa.cc **** Changes from 2002.12.04 (eichelberg) - Implemented a locale independent function OFStandard::ftoa() that converts double to string and offers all the flexibility of the sprintf family of functions. Affects: COPYRIGHT config/docs/macros.txt ofstd/include/ofstd.h ofstd/libsrc/ofstd.cc ofstd/tests/Makefile.dep ofstd/tests/Makefile.in Added: ofstd/tests/tstftoa.cc - Changed toolkit to use OFStandard::ftoa instead of sprintf for all double to string conversions that are supposed to be locale independent Affects: dcmdata/libsrc/Makefile.dep dcmdata/libsrc/dcrlecce.cc dcmdata/libsrc/dcvrfd.cc dcmdata/libsrc/dcvrfl.cc dcmimage/apps/Makefile.dep dcmimage/apps/dcm2pnm.cc dcmimgle/libsrc/Makefile.dep dcmimgle/libsrc/diimage.cc dcmjpeg/libsrc/Makefile.dep dcmjpeg/libsrc/djcodece.cc dcmpstat/apps/Makefile.dep dcmpstat/apps/dcmmklut.cc dcmpstat/libsrc/Makefile.dep dcmpstat/libsrc/dvpsda.cc dcmpstat/libsrc/dvpssv.cc dcmpstat/libsrc/dvpstat.cc dcmpstat/libsrc/dvpsvw.cc dcmsr/libsrc/Makefile.dep dcmsr/libsrc/dsrtcoto.cc ofstd/libsrc/Makefile.dep ofstd/libsrc/oftime.cc - Updated Visual C++ workspace file Affects: dcmtk.dsw **** Changes from 2002.12.03 (eichelberg) - Updated Visual C++ project files in dcmwlm module Affects: dcmwlm/dcmwlm.dsp dcmwlm/apps/wlmscpfs.dsp - Removed wlistctn module which has been superseded by the new dcmwlm module. Removed: wlistctn/Makefile.in wlistctn/configure wlistctn/wrklstdb.dsp wlistctn/apps/Makefile.dep wlistctn/apps/Makefile.in wlistctn/apps/sce.cc wlistctn/apps/sce.h wlistctn/apps/sceecho.cc wlistctn/apps/sceecho.h wlistctn/apps/scefind.cc wlistctn/apps/scefind.h wlistctn/apps/wlistctn.cc wlistctn/apps/wlistctn.dsp wlistctn/apps/wlistctn.h wlistctn/docs/Makefile.in wlistctn/docs/wlistctn.txt wlistctn/docs/wwwapp.doc wlistctn/docs/wwwapp.txt wlistctn/images/offis.gif wlistctn/include/Makefile.in wlistctn/include/wrklstdb.h wlistctn/libsrc/Makefile.dep wlistctn/libsrc/Makefile.in wlistctn/libsrc/wrklstdb.cc wlistctn/perl/changepw.pl wlistctn/perl/checkvr.ph wlistctn/perl/isocode.ph wlistctn/perl/layout.ph wlistctn/perl/lock.ph wlistctn/perl/log.ph wlistctn/perl/main.pl wlistctn/perl/password.ph wlistctn/perl/patidel.pl wlistctn/perl/patiedit.pl wlistctn/perl/patient.pl wlistctn/perl/prefs.ph wlistctn/perl/procdel.pl wlistctn/perl/procedit.pl wlistctn/perl/procedur.pl wlistctn/perl/procstep.pl wlistctn/perl/prstdel.pl wlistctn/perl/prstedit.pl wlistctn/perl/statdel.pl wlistctn/perl/statedit.pl wlistctn/perl/station.pl wlistctn/perl/urldecod.ph wlistctn/perl/workdel.pl wlistctn/perl/workedit.pl wlistctn/perl/worklist.pl wlistctn/perl/write.ph wlistctn/tests/Makefile.dep wlistctn/tests/Makefile.in wlistctn/tests/wltest.cc wlistctn/wlistdb/README wlistctn/wlistdb/OFFIS/lockfile wlistctn/wlistdb/OFFIS/wklist1.dump wlistctn/wlistdb/OFFIS/wklist10.dump wlistctn/wlistdb/OFFIS/wklist2.dump wlistctn/wlistdb/OFFIS/wklist3.dump wlistctn/wlistdb/OFFIS/wklist4.dump wlistctn/wlistdb/OFFIS/wklist5.dump wlistctn/wlistdb/OFFIS/wklist6.dump wlistctn/wlistdb/OFFIS/wklist7.dump wlistctn/wlistdb/OFFIS/wklist8.dump wlistctn/wlistdb/OFFIS/wklist9.dump wlistctn/wlistqry/README wlistctn/wlistqry/wlistqry0.dump wlistctn/wlistqry/wlistqry1.dump wlistctn/wlistqry/wlistqry10.dump wlistctn/wlistqry/wlistqry11.dump wlistctn/wlistqry/wlistqry12.dump wlistctn/wlistqry/wlistqry2.dump wlistctn/wlistqry/wlistqry3.dump wlistctn/wlistqry/wlistqry4.dump wlistctn/wlistqry/wlistqry5.dump wlistctn/wlistqry/wlistqry6.dump wlistctn/wlistqry/wlistqry7.dump wlistctn/wlistqry/wlistqry8.dump wlistctn/wlistqry/wlistqry9.dump wlistctn/wwwapps/Makefile.dep wlistctn/wwwapps/Makefile.in wlistctn/wwwapps/preplock.cc wlistctn/wwwapps/readoviw.cc wlistctn/wwwapps/readwlst.cc wlistctn/wwwapps/writwlst.cc **** Changes from 2002.12.03 (wilkens) - Added files und functionality from the dcmtk/wlistctn folder to dcmtk/dcmwlm so that dcmwlm can now completely replace wlistctn in the public domain part of dcmtk. Pertaining to this replacement requirement, another optional return key attribute was integrated into the wlm utilities. Affects: dcmwlm/Makefile.in dcmwlm/libsrc/wlds.cc dcmwlm/tests/Makefile.in Added: dcmwlm/docs/wwwapp.doc dcmwlm/docs/wwwapp.txt dcmwlm/images/ dcmwlm/images/offis.gif dcmwlm/perl/ dcmwlm/perl/changepw.pl dcmwlm/perl/checkvr.ph dcmwlm/perl/isocode.ph dcmwlm/perl/layout.ph dcmwlm/perl/lock.ph dcmwlm/perl/log.ph dcmwlm/perl/main.pl dcmwlm/perl/password.ph dcmwlm/perl/patidel.pl dcmwlm/perl/patiedit.pl dcmwlm/perl/patient.pl dcmwlm/perl/prefs.ph dcmwlm/perl/procdel.pl dcmwlm/perl/procedit.pl dcmwlm/perl/procedur.pl dcmwlm/perl/procstep.pl dcmwlm/perl/prstdel.pl dcmwlm/perl/prstedit.pl dcmwlm/perl/statdel.pl dcmwlm/perl/statedit.pl dcmwlm/perl/station.pl dcmwlm/perl/urldecod.ph dcmwlm/perl/workdel.pl dcmwlm/perl/workedit.pl dcmwlm/perl/worklist.pl dcmwlm/perl/write.ph dcmwlm/tests/Makefile.dep dcmwlm/tests/wltest.cc dcmwlm/wlistdb/ dcmwlm/wlistdb/README dcmwlm/wlistdb/OFFIS/ dcmwlm/wlistdb/OFFIS/ dcmwlm/wlistdb/OFFIS/lockfile dcmwlm/wlistdb/OFFIS/wklist1.dump dcmwlm/wlistdb/OFFIS/wklist10.dump dcmwlm/wlistdb/OFFIS/wklist2.dump dcmwlm/wlistdb/OFFIS/wklist3.dump dcmwlm/wlistdb/OFFIS/wklist4.dump dcmwlm/wlistdb/OFFIS/wklist5.dump dcmwlm/wlistdb/OFFIS/wklist6.dump dcmwlm/wlistdb/OFFIS/wklist7.dump dcmwlm/wlistdb/OFFIS/wklist8.dump dcmwlm/wlistdb/OFFIS/wklist9.dump dcmwlm/wlistqry/ dcmwlm/wlistqry/README/ dcmwlm/wlistqry/wlistqry0.dump dcmwlm/wlistqry/wlistqry1.dump dcmwlm/wlistqry/wlistqry10.dump dcmwlm/wlistqry/wlistqry11.dump dcmwlm/wlistqry/wlistqry12.dump dcmwlm/wlistqry/wlistqry2.dump dcmwlm/wlistqry/wlistqry3.dump dcmwlm/wlistqry/wlistqry4.dump dcmwlm/wlistqry/wlistqry5.dump dcmwlm/wlistqry/wlistqry6.dump dcmwlm/wlistqry/wlistqry7.dump dcmwlm/wlistqry/wlistqry8.dump dcmwlm/wlistqry/wlistqry9.dump dcmwlm/wwwapps/ dcmwlm/wwwapps/Makefile.dep dcmwlm/wwwapps/Makefile.in dcmwlm/wwwapps/preplock.cc dcmwlm/wwwapps/readoviw.cc dcmwlm/wwwapps/readwlst.cc dcmwlm/wwwapps/writwlst.cc **** Changes from 2002.11.29 (riesmeier) - Fixed doc++ warning about different number of opening and closing brackets. Affects: dcmdata/libsrc/dcxfer.cc - Replaced German comments by English translations. Affects: dcmdata/libsrc/dcxfer.cc **** Changes from 2002.11.29 (eichelberg) - Introduced new command line option --timeout for controlling the connection request timeout. Affects: dcmnet/apps/echoscu.cc dcmnet/apps/findscu.cc dcmnet/apps/movescu.cc dcmnet/apps/storescu.cc dcmnet/docs/echoscu.txt dcmnet/docs/findscu.txt dcmnet/docs/movescu.txt dcmnet/docs/storescu.txt dcmpstat/apps/dcmprscu.cc dcmpstat/apps/dcmpssnd.cc dcmpstat/include/dvpscf.h dcmpstat/libsrc/dviface.cc dcmpstat/libsrc/dvpscf.cc dcmpstat/tests/test.cfg imagectn/apps/imagectn.cc imagectn/apps/ti.cc imagectn/docs/imagectn.txt imagectn/docs/ti.txt **** Changes from 2002.11.29 (wilkens) - Modified call to getsockopt() in order to avoid compiler warning. Affects: dcmnet/libsrc/dul.cc - Modified variable initialization in order to avoid compiler warning. Affects: dcmnet/libsrc/dul.cc - Corrected dumping of hex values. Affects: dcmnet/libsrc/dul.cc dcmnet/libsrc/dulfsm.cc dcmnet/libsrc/dulparse.cc - Changed VR of PerformedProcedureStepID from CS to SH. Affects: dcmdata/libsrc/dcdictzz.cc dcmdata/libsrc/dicom.dic - Adapted ti utility to command line classes and added option '-xi'. Affects: imagectn/apps/cnf.cc imagectn/apps/cnf.h imagectn/apps/cnfexnt.cc imagectn/apps/cnfpriv.cc imagectn/apps/cnfpriv.h imagectn/apps/ti.cc imagectn/apps/ti.h imagectn/apps/tinet.cc imagectn/apps/tiquery.cc imagectn/apps/tiui.cc **** Changes from 2002.11.28 (riesmeier) - Removed explicit dependency from config.h. Affects: dcmwlm/apps/Makefile.in dcmwlm/libsrc/Makefile.in - Introduced variable extensions for binary files to support platforms like Cygwin (filename extension ".exe"). Affects: dcmwlm/apps/Makefile.in - Renamed config.h to cfunix.h to avoid name clashes with other packages. Affects: dcmwlm/apps/Makefile.dep **** Changes from 2002.11.28 (eichelberg) - Added global flag dcmConnectionTimeout that defines a timeout for outgoing association requests in the DICOM upper layer. Thanks to Stefan Allers for the contribution. Affects: dcmnet/include/dul.h dcmnet/libsrc/dul.cc dcmnet/libsrc/dulfsm.cc - Introduced new command line option --timeout for controlling the connection request timeout. Affects: dcmnet/apps/echoscu.cc - Fixed incorrect comment. Thanks to Stefan Allers for the report. Affects: dcmnet/libsrc/assoc.cc - Including without extern "C" on Win32 to avoid problem with MSVC5. Affects: ofstd/include/ofstdinc.h **** Changes from 2002.11.27 (eichelberg) - Fixed bug in ofstack inclusion code Affects: ofstd/include/ofstdinc.h - Now including even if is present. Affects: ofstd/include/ofstdinc.h - Added private tags for DCMTK anonymizer tool Affects: dcmdata/libsrc/private.dic - Added configure tests for a few ANSI C header files Affects: config/configure.in config/configure config/include/cfunix.h.in config/include/cfwin32.h - Added new file ofstdinc.h that encapsulates the inclusion of old style vs. ISO C++ standard header files. Added: ofstd/include/ofstdinc.h - Adapted module ofstd to use of new header file ofstdinc.h Affects: ofstd/include/ofbmanip.h ofstd/include/ofcmdln.h ofstd/include/ofconsol.h ofstd/include/oflist.h ofstd/include/oflogfil.h ofstd/include/ofstack.h ofstd/include/ofstd.h ofstd/include/ofstring.h ofstd/libsrc/Makefile.dep ofstd/libsrc/ofconsol.cc ofstd/libsrc/ofdate.cc ofstd/libsrc/ofdatime.cc ofstd/libsrc/offname.cc ofstd/libsrc/oflogfil.cc ofstd/libsrc/ofstd.cc ofstd/libsrc/ofstring.cc ofstd/libsrc/ofthread.cc ofstd/libsrc/oftime.cc ofstd/tests/Makefile.dep ofstd/tests/tlist.cc ofstd/tests/tstatof.cc - Adapted module dcmdata to use of new header file ofstdinc.h Affects: dcmdata/apps/Makefile.dep dcmdata/apps/dcmconv.cc dcmdata/apps/dcmcrle.cc dcmdata/apps/dcmdrle.cc dcmdata/apps/dcmdump.cc dcmdata/apps/dcmftest.cc dcmdata/apps/dcmgpdir.cc dcmdata/apps/dump2dcm.cc dcmdata/include/dcdefine.h dcmdata/include/dcdicent.h dcmdata/include/dcistrmf.h dcmdata/include/dclist.h dcmdata/include/dcostrmf.h dcmdata/include/dcrleenc.h dcmdata/include/dcswap.h dcmdata/include/dctypes.h dcmdata/include/dcuid.h dcmdata/include/dcvr.h dcmdata/libsrc/Makefile.dep dcmdata/libsrc/cmdlnarg.cc dcmdata/libsrc/dcbytstr.cc dcmdata/libsrc/dcdatset.cc dcmdata/libsrc/dcdebug.cc dcmdata/libsrc/dcdicdir.cc dcmdata/libsrc/dcdicent.cc dcmdata/libsrc/dcdict.cc dcmdata/libsrc/dcdictbi.cc dcmdata/libsrc/dcdirrec.cc dcmdata/libsrc/dcelem.cc dcmdata/libsrc/dcfilefo.cc dcmdata/libsrc/dchashdi.cc dcmdata/libsrc/dcistrmf.cc dcmdata/libsrc/dcitem.cc dcmdata/libsrc/dcmetinf.cc dcmdata/libsrc/dcobject.cc dcmdata/libsrc/dcostrmf.cc dcmdata/libsrc/dcpixseq.cc dcmdata/libsrc/dcpxitem.cc dcmdata/libsrc/dcrlecce.cc dcmdata/libsrc/dcsequen.cc dcmdata/libsrc/dcstack.cc dcmdata/libsrc/dctag.cc dcmdata/libsrc/dctagkey.cc dcmdata/libsrc/dcuid.cc dcmdata/libsrc/dcutils.cc dcmdata/libsrc/dcvm.cc dcmdata/libsrc/dcvr.cc dcmdata/libsrc/dcvrat.cc dcmdata/libsrc/dcvrda.cc dcmdata/libsrc/dcvrdt.cc dcmdata/libsrc/dcvrfd.cc dcmdata/libsrc/dcvrfl.cc dcmdata/libsrc/dcvris.cc dcmdata/libsrc/dcvrobow.cc dcmdata/libsrc/dcvrsl.cc dcmdata/libsrc/dcvrss.cc dcmdata/libsrc/dcvrtm.cc dcmdata/libsrc/dcvrui.cc dcmdata/libsrc/dcvrul.cc dcmdata/libsrc/dcvrulup.cc dcmdata/libsrc/dcvrus.cc dcmdata/libsrc/dcxfer.cc dcmdata/libsrc/mkdeftag.cc dcmdata/libsrc/mkdictbi.cc dcmdata/tests/Makefile.dep - Adapted module dcmtls to use of new header file ofstdinc.h Affects: dcmtls/libsrc/Makefile.dep dcmtls/libsrc/tlstrans.cc - Adapted module dcmnet to use of new header file ofstdinc.h Affects: dcmnet/apps/Makefile.dep dcmnet/apps/echoscu.cc dcmnet/apps/findscu.cc dcmnet/apps/movescu.cc dcmnet/apps/storescp.cc dcmnet/apps/storescu.cc dcmnet/include/dcompat.h dcmnet/include/dicom.h dcmnet/libsrc/Makefile.dep dcmnet/libsrc/assoc.cc dcmnet/libsrc/cond.cc dcmnet/libsrc/dcmtrans.cc dcmnet/libsrc/dcompat.cc dcmnet/libsrc/dimcancl.cc dcmnet/libsrc/dimcmd.cc dcmnet/libsrc/dimdump.cc dcmnet/libsrc/dimecho.cc dcmnet/libsrc/dimfind.cc dcmnet/libsrc/dimget.cc dcmnet/libsrc/dimmove.cc dcmnet/libsrc/dimse.cc dcmnet/libsrc/dimstore.cc dcmnet/libsrc/diutil.cc dcmnet/libsrc/dul.cc dcmnet/libsrc/dulconst.cc dcmnet/libsrc/dulextra.cc dcmnet/libsrc/dulfsm.cc dcmnet/libsrc/dulparse.cc dcmnet/libsrc/dulpres.cc - Adapted module imagectn to use of new header file ofstdinc.h Affects: imagectn/apps/Makefile.dep imagectn/apps/cnf.cc imagectn/apps/cnfexnt.cc imagectn/apps/cnfpriv.cc imagectn/apps/cnfpriv.h imagectn/apps/imagectn.cc imagectn/apps/sce.cc imagectn/apps/sceecho.cc imagectn/apps/scefind.cc imagectn/apps/sceget.cc imagectn/apps/scemove.cc imagectn/apps/scestore.cc imagectn/apps/ti.cc imagectn/apps/tinet.cc imagectn/apps/tiquery.cc imagectn/apps/tiui.cc imagectn/include/dbstore.h imagectn/include/imagedb.h imagectn/libsrc/Makefile.dep imagectn/libsrc/dbcond.cc imagectn/libsrc/dbfind.cc imagectn/libsrc/dbindex.cc imagectn/libsrc/dbmove.cc imagectn/libsrc/dbstore.cc imagectn/libsrc/dbutils.cc imagectn/tests/Makefile.dep imagectn/tests/dbregimg.cc - Adapted module wlistctn to use of new header file ofstdinc.h Affects: wlistctn/apps/Makefile.dep wlistctn/apps/sce.cc wlistctn/apps/sceecho.cc wlistctn/apps/scefind.cc wlistctn/apps/wlistctn.cc wlistctn/include/wrklstdb.h wlistctn/libsrc/Makefile.dep wlistctn/libsrc/wrklstdb.cc wlistctn/tests/Makefile.dep wlistctn/tests/wltest.cc wlistctn/wwwapps/Makefile.dep wlistctn/wwwapps/preplock.cc wlistctn/wwwapps/readoviw.cc wlistctn/wwwapps/readwlst.cc wlistctn/wwwapps/writwlst.cc - Adapted module dcmimgle to use of new header file ofstdinc.h Affects: dcmimgle/apps/Makefile.dep dcmimgle/apps/dcod2lum.cc dcmimgle/apps/dconvlum.cc dcmimgle/include/dicrvfit.h dcmimgle/include/didocu.h dcmimgle/include/diimage.h dcmimgle/include/dimoopx.h dcmimgle/include/dimoopxt.h dcmimgle/include/diovpln.h dcmimgle/include/diplugin.h dcmimgle/include/diutils.h dcmimgle/libsrc/Makefile.dep dcmimgle/libsrc/dcmimage.cc dcmimgle/libsrc/diciefn.cc dcmimgle/libsrc/dicielut.cc dcmimgle/libsrc/didispfn.cc dcmimgle/libsrc/digsdfn.cc dcmimgle/libsrc/digsdlut.cc dcmimgle/libsrc/dimoimg.cc - Adapted module dcmimage to use of new header file ofstdinc.h Affects: dcmimage/apps/Makefile.dep dcmimage/apps/dcm2pnm.cc dcmimage/apps/dcmquant.cc dcmimage/apps/dcmscale.cc dcmimage/include/dicoopx.h dcmimage/include/diqtpbox.h dcmimage/include/diqtstab.h dcmimage/libsrc/Makefile.dep dcmimage/libsrc/diqtctab.cc dcmimage/libsrc/diqtfs.cc - Adapted module dcmsr to use of new header file ofstdinc.h Affects: dcmsr/apps/Makefile.dep dcmsr/libsrc/Makefile.dep dcmsr/libsrc/dsrimgfr.cc dcmsr/libsrc/dsrtcoto.cc dcmsr/libsrc/dsrtypes.cc dcmsr/tests/Makefile.dep - Adapted module dcmpstat to use of new header file ofstdinc.h Affects: dcmpstat/apps/Makefile.dep dcmpstat/apps/dcmmklut.cc dcmpstat/apps/dcmprscu.cc dcmpstat/apps/dcmpschk.cc dcmpstat/apps/dcmpsmk.cc dcmpstat/apps/dcmpsprt.cc dcmpstat/include/dvpsconf.h dcmpstat/include/dvpstyp.h dcmpstat/libsrc/Makefile.dep dcmpstat/libsrc/dviface.cc dcmpstat/libsrc/dvpscf.cc dcmpstat/libsrc/dvpsconf.cc dcmpstat/libsrc/dvpsfs.cc dcmpstat/libsrc/dvpsgl.cc dcmpstat/libsrc/dvpshlp.cc dcmpstat/libsrc/dvpsri.cc dcmpstat/libsrc/dvpssp.cc dcmpstat/libsrc/dvpstat.cc dcmpstat/libsrc/dvpstx.cc dcmpstat/libsrc/dvpsvw.cc dcmpstat/tests/msgserv.cc - Adapted module dcmsign to use of new header file ofstdinc.h Affects: dcmsign/apps/Makefile.dep dcmsign/apps/dcmsign.cc dcmsign/include/dcmsign.h dcmsign/include/simaccon.h dcmsign/libsrc/Makefile.dep dcmsign/libsrc/simd5.cc dcmsign/libsrc/siripemd.cc dcmsign/libsrc/sisha1.cc - Adapted module dcmjpeg to use of new header file ofstdinc.h Affects: dcmjpeg/apps/Makefile.dep dcmjpeg/apps/dcmcjpeg.cc dcmjpeg/apps/dcmdjpeg.cc dcmjpeg/libsrc/Makefile.dep dcmjpeg/libsrc/dipijpeg.cc dcmjpeg/libsrc/djcodece.cc dcmjpeg/libsrc/djdijg12.cc dcmjpeg/libsrc/djdijg16.cc dcmjpeg/libsrc/djdijg8.cc dcmjpeg/libsrc/djeijg12.cc dcmjpeg/libsrc/djeijg16.cc dcmjpeg/libsrc/djeijg8.cc dcmjpeg/libsrc/djutils.cc - Adapted module dcmwlm to use of new header file ofstdinc.h Affects: dcmwlm/libsrc/Makefile.dep dcmwlm/libsrc/wlfsim.cc **** Changes from 2002.11.27 (riesmeier) - Removed incorrect line break in "install" section. Affects: dcmjpeg/apps/Makefile.in **** Changes from 2002.11.26 (riesmeier) - Changed syntax usage output for command line applications from stderr to stdout. Affects: ofstd/include/ofconapp.h ofstd/libsrc/ofconapp.cc - Removed support for Metrowerks compiler (Apple Macintosh). Removed: config/include/cfmwerks.h Affects: config/include/osconfig.h - Removed explicit dependency from config.h. Affects: config/templates/Makefile.lib config/templates/Makefile.src ofstd/libsrc/Makefile.in ofstd/tests/Makefile.in dcmdata/apps/Makefile.in dcmdata/libsrc/Makefile.in dcmdata/tests/Makefile.in dcmtls/libsrc/Makefile.in dcmnet/apps/Makefile.in dcmnet/libsrc/Makefile.in dcmsr/libsrc/Makefile.in dcmsr/tests/Makefile.in dcmsign/apps/Makefile.in dcmsign/libsrc/Makefile.in dcmimgle/apps/Makefile.in dcmimgle/libsrc/Makefile.in dcmimage/libsrc/Makefile.in dcmjpeg/apps/Makefile.in dcmjpeg/libsrc/Makefile.in dcmjpeg/libijg8/Makefile.in dcmjpeg/libijg12/Makefile.in dcmjpeg/libijg16/Makefile.in dcmpstat/apps/Makefile.in dcmpstat/jni/Makefile.in dcmpstat/libsrc/Makefile.in dcmpstat/tests/Makefile.in imagectn/apps/Makefile.in imagectn/libsrc/Makefile.in imagectn/tests/Makefile.in wlistctn/apps/Makefile.in wlistctn/libsrc/Makefile.in wlistctn/tests/Makefile.in wlistctn/wwwapps/Makefile.in - Introduced variable extensions for binary files to support platforms like Cygwin (filename extension ".exe"). Affects: config/Makefile.def.in config/configure config/configure.in config/templates/Makefile.src dcmdata/apps/Makefile.in dcmnet/apps/Makefile.in dcmsr/apps/Makefile.in dcmsign/apps/Makefile.in dcmimgle/apps/Makefile.in dcmimage/apps/Makefile.in dcmjpeg/apps/Makefile.in dcmpstat/apps/Makefile.in dcmpstat/jni/Makefile.in imagectn/apps/Makefile.in imagectn/tests/Makefile.in wlistctn/apps/Makefile.in wlistctn/tests/Makefile.in wlistctn/wwwapps/Makefile.in - Renamed config.h to cfunix.h to avoid name clashes with other packages. Added: config/include/cfunix.h.in Removed: config/include/config.h.in Affects: config/Makefile.in config/acconfig.h config/configure config/configure.in config/docs/config.txt config/docs/modules.txt config/include/osconfig.h ofstd/libsrc/Makefile.dep ofstd/tests/Makefile.dep dcmdata/apps/Makefile.dep dcmdata/tests/Makefile.dep dcmtls/libsrc/Makefile.dep dcmnet/apps/Makefile.dep dcmnet/libsrc/Makefile.dep dcmsr/apps/Makefile.dep dcmsr/libsrc/Makefile.dep dcmsr/tests/Makefile.dep dcmsign/apps/Makefile.dep dcmsign/libsrc/Makefile.dep dcmimgle/apps/Makefile.dep dcmimgle/libsrc/Makefile.dep dcmimage/apps/Makefile.dep dcmimage/libsrc/Makefile.dep dcmjpeg/apps/Makefile.dep dcmjpeg/libsrc/Makefile.dep dcmjpeg/libijg8/Makefile.dep dcmjpeg/libijg16/Makefile.dep dcmpstat/apps/Makefile.dep dcmpstat/libsrc/Makefile.dep dcmpstat/tests/Makefile.dep imagectn/apps/Makefile.dep imagectn/libsrc/Makefile.dep wlistctn/apps/Makefile.dep wlistctn/libsrc/Makefile.dep wlistctn/wwwapps/Makefile.dep - Numerous code purifications, e.g. made local functions "static". Affects: dcmdata/apps/dcmgpdir.cc - Added Smallest/LargestImagePixelValue to the list of attributes to be removed from a newly created dataset. Affects: dcmimgle/include/diimage.h dcmimgle/libsrc/diimage.cc - Added PaletteColorLookupTableUID to the list of attributes to be removed from a newly created dataset. Affects: dcmimage/libsrc/dicoimg.cc - Minor corrections (removed newlines, typos). Affects: config/templates/Makefile.mod config/templates/configure.mod - Replaced include for "math.h" with to avoid inclusion of math.h in the makefile dependencies. Affects: dcmimgle/include/dicrvfit.h **** Changes from 2002.11.26 (eichelberg) - configure script now assumes an ".exe" file name extension in make install on cygwin. Affects: config/configure config/configure.in - Changed DUL code to always send A-ASSOCIATE user information sub-items in ascending order. Affects: config/docs/macros.txt dcmnet/libsrc/dulconst.cc dcmnet/libsrc/dulpres.cc dcmnet/libsrc/dulstruc.h - Added documentation for compile time flags/macros and environment variables. Affects: INSTALL Added: config/docs/macros.txt config/docs/envvars.txt - Replaced all includes for "zlib.h" with to avoid inclusion of zlib.h in the makefile dependencies. Affects: dcmdata/apps/dcm2xml.cc dcmdata/apps/dcmconv.cc dcmdata/apps/dcmcrle.cc dcmdata/apps/dcmdrle.cc dcmdata/apps/dcmdump.cc dcmdata/apps/dcmgpdir.cc dcmdata/apps/dump2dcm.cc dcmimage/apps/dcm2pnm.cc dcmimage/apps/dcmquant.cc dcmimage/apps/dcmscale.cc dcmjpeg/apps/dcmcjpeg.cc dcmjpeg/apps/dcmdjpeg.cc dcmnet/apps/echoscu.cc dcmnet/apps/findscu.cc dcmnet/apps/movescu.cc dcmnet/apps/storescp.cc dcmnet/apps/storescu.cc dcmpstat/apps/dcmmkcrv.cc dcmpstat/apps/dcmmklut.cc dcmpstat/apps/dcmp2pgm.cc dcmpstat/apps/dcmprscp.cc dcmpstat/apps/dcmprscu.cc dcmpstat/apps/dcmpschk.cc dcmpstat/apps/dcmpsmk.cc dcmpstat/apps/dcmpsprt.cc dcmpstat/apps/dcmpsrcv.cc dcmpstat/apps/dcmpssnd.cc dcmsign/apps/dcmsign.cc dcmsr/apps/dsr2html.cc dcmsr/apps/dsr2xml.cc dcmsr/apps/dsrdump.cc dcmwlm/apps/wlcefs.cc imagectn/apps/imagectn.cc imagectn/tests/dbregimg.cc wlistctn/apps/wlistctn.cc **** Changes from 2002.11.25 (eichelberg) - Converted compile time option to leniently handle space padded UIDs in the Storage Service Class into command line / config file option. Affects: dcmnet/apps/movescu.cc dcmnet/apps/storescp.cc dcmnet/apps/storescu.cc dcmnet/docs/movescu.txt dcmnet/docs/storescp.txt dcmnet/docs/storescu.txt dcmnet/include/diutil.h dcmnet/libsrc/diutil.cc dcmpstat/apps/dcmpsrcv.cc dcmpstat/include/dvpscf.h dcmpstat/libsrc/dvpscf.cc dcmpstat/tests/test.cfg imagectn/apps/imagectn.cc imagectn/apps/sce.cc imagectn/apps/sce.h imagectn/apps/scestore.cc imagectn/apps/scestore.h imagectn/apps/imagectn.txt **** Changes from 2002.11.25 (riesmeier) - Used OFConsoleApplication::checkDependence() and checkConflict() routine wherever possible. Affects: dcmdata/apps/dcmconv.cc - Made declaration of compression level variable dependent on WITH_ZLIB define. Avoids warning about unused variable reported by gcc 2.95.3 on Cygwin. Affects: dcmdata/apps/dcmconv.cc - Adapted code according to CP 286, i.e. allow a COMPOSITE content item to be the target of a HAS OBS CONTEXT relationship with a CONTAINER item. Affects: dcmsr/libsrc/dsrcontn.cc **** Changes from 2002.11.04 (riesmeier) - Added new command line option preventing the creation of a backup of an existing DICOMDIR. Affects: dcmdata/apps/dcmgpdir.cc dcmdata/docs/dcmgpdir.txt dcmjpeg/docs/dcmmkdir.txt **** Changes from 2002.10.31 (eichelberg) - Added workaround for a bug in the Sparc optimizer in gcc 3.2 The bug is filed as gcc problem report 8396. Thanks to Dimitri Papadopoulos-Orfanos for the bug report and workaround. Affects: dcmimgle/include/dicrvfit.h **** Changes from 2002.10.23 (riesmeier) - Fixed bug in debug output of read() routines. Affects: dcmsr/libsrc/dsrdoctn.cc **** Changes from 2002.10.21 (riesmeier) - Corrected wrong calculation of min/max pixel value in cases where the stored pixel data exceeds the expected size. Thanks to Andreas Barth for the bug report. Affects: dcmimgle/include/diinpxt.h dcmimgle/include/dimoipxt.h dcmimgle/include/dimopxt.h - Slightly enhanced comments for getOutputData(). Affects: dcmimgle/include/dcmimage.h **** Changes from 2002.10.18 (eichelberg) - Fixed minor bug in presentation state code that caused error messages in the Softcopy VOI LUT module to be "swallowed" even if verbose mode was enabled. Affects: dcmpstat/libsrc/dvpssvl.cc **** Changes from 2002.10.10 (riesmeier) - Fixed bug that prevented old frozen draft SR documents from being recognized in DICOMDIR files. Thanks to Judit Verestoy for the bug report and fix. Affects: dcmdata/libsrc/dcdirrec.cc **** Changes from 2002.09.24 (riesmeier) - Optionally print command line application header with "host type" (as reported by 'config.guess'). Affects: ofstd/libsrc/ofconapp.cc **** Changes from 2002.09.24 (eichelberg) - Configure now attempts to identify the host system type and defines the macro CANONICAL_HOST_TYPE in config.h Affects: config/acconfig.h config/configure config/configure.in config/include/cfwin32.h config/include/config.h.in Added: config/config.guess config/config.sub **** Changes from 2002.09.23 (riesmeier) - Added new command line option "--version" which prints the name and version number of external libraries used (incl. preparation for future support of 'config.guess' host identifiers). Affects: dcmdata/apps/dcm2xml.cc dcmdata/apps/dcmconv.cc dcmdata/apps/dcmcrle.cc dcmdata/apps/dcmdrle.cc dcmdata/apps/dcmdump.cc dcmdata/apps/dcmgpdir.cc dcmdata/apps/dump2dcm.cc dcmdata/docs/dcm2xml.txt dcmdata/docs/dcmconv.txt dcmdata/docs/dcmcrle.txt dcmdata/docs/dcmdrle.txt dcmdata/docs/dcmdump.txt dcmdata/docs/dcmgpdir.txt dcmdata/docs/dump2dcm.txt dcmnet/apps/echoscu.cc dcmnet/apps/findscu.cc dcmnet/apps/movescu.cc dcmnet/apps/storescp.cc dcmnet/apps/storescu.cc dcmnet/docs/echoscu.txt dcmnet/docs/findscu.txt dcmnet/docs/movescu.txt dcmnet/docs/storescp.txt dcmnet/docs/storescu.txt dcmimage/apps/dcm2pnm.cc dcmimage/apps/dcmquant.cc dcmimage/apps/dcmscale.cc dcmimage/docs/dcm2pnm.txt dcmimage/docs/dcmquant.txt dcmimage/docs/dcmscale.txt imagectn/apps/imagectn.cc imagectn/docs/dbregimg.txt imagectn/docs/imagectn.txt imagectn/tests/dbregimg.cc wlistctn/apps/wlistctn.cc wlistctn/docs/wlistctn.txt dcmjpeg/apps/dcmcjpeg.cc dcmjpeg/apps/dcmdjpeg.cc dcmjpeg/docs/dcmcjpeg.txt dcmjpeg/docs/dcmdjpeg.txt dcmjpeg/docs/dcmj2pnm.txt dcmjpeg/docs/dcmmkdir.txt dcmsr/apps/dsr2html.cc dcmsr/apps/dsr2xml.cc dcmsr/apps/dsrdump.cc dcmsr/docs/dsr2html.txt dcmsr/docs/dsr2xml.txt dcmsr/docs/dsrdump.txt dcmsign/apps/dcmsign.cc dcmsign/docs/dcmsign.txt dcmpstat/apps/dcmmkcrv.cc dcmpstat/apps/dcmmklut.cc dcmpstat/apps/dcmp2pgm.cc dcmpstat/apps/dcmprscp.cc dcmpstat/apps/dcmprscu.cc dcmpstat/apps/dcmpschk.cc dcmpstat/apps/dcmpsmk.cc dcmpstat/apps/dcmpsprt.cc dcmpstat/docs/dcmpsrcv.txt dcmpstat/docs/dcmpssnd.txt dcmpstat/docs/dcmmkcrv.txt dcmpstat/docs/dcmmklut.txt dcmpstat/docs/dcmp2pgm.txt dcmpstat/docs/dcmprscp.txt dcmpstat/docs/dcmprscu.txt dcmpstat/docs/dcmpschk.txt dcmpstat/docs/dcmpsmk.txt dcmpstat/docs/dcmpsprt.txt dcmpstat/docs/dcmpsrcv.txt dcmpstat/docs/dcmpssnd.txt dcmwlm/apps/wlcefs.cc dcmwlm/docs/wlcefs.txt - Prepared code for future support of 'config.guess' host identifiers. Affects: ofstd/include/ofconapp.h ofstd/libsrc/ofconapp.cc - Removed reference to "math.h" (with absolute path name). Affects: dcmimgle/libsrc/Makefile.dep - Fixed typo in pre-processor directive. Affects: dcmsign/apps/dcmsign.cc dcmpstat/apps/dcmpsrcv.cc dcmpstat/apps/dcmpssnd.cc **** Changes from 2002.09.19 (riesmeier) - Added general support for "exclusive" command line options besides "--help", e.g. "--version". Affects: ofstd/include/ofcmdln.h ofstd/libsrc/ofcmdln.cc ofstd/libsrc/ofconapp.cc - Added static method getLibraryVersionString(). Affects: dcmimage/include/dipitiff.h dcmimage/libsrc/dipitiff.cc dcmjpeg/include/dipijpeg.h dcmjpeg/libsrc/dipijpeg.cc - Added explicit type casts to keep Sun CC 2.0.1 quiet. Affects: dcmdata/libsrc/dcostrmf.cc dcmdata/libsrc/dcostrmb.cc dcmdata/libsrc/dcistrmz.cc dcmdata/libsrc/dcistrmf.cc dcmdata/libsrc/dcistrmb.cc **** Changes from 2002.09.17 (eichelberg) - Fixed two bugs in class DcmPixelData. Thanks to Arnaud Masson for the bug report and fix. Affects: dcmdata/libsrc/dcpixel.cc - Improved one error code return Affects: dcmdata/libsrc/dcelem.cc - Fixed memory leak Thanks to Ben Wright for the bug report and fix. Affects: dcmpstat/libsrc/dcmpspr.cc - Updated documentation Affects: dcmdata/docs/dcmconv.txt dcmnet/docs/storescp.txt dcmnet/docs/storescu.txt **** Changes from 2002.09.12 (riesmeier) - Added method "createUint8Array" which works similar to the 16 bit variant. Affects: dcmdata/include/dcvrpobw.h dcmdata/libsrc/dcvrpobw.cc - Replaced "createPixelData" by "getPixelData" which uses a new dcmdata routine and is therefore more efficient. Affects: dcmimage/include/dicopx.h dcmimage/include/dicopxt.h dcmimage/libsrc/dicoimg.cc **** Changes from 2002.09.10 (eichelberg) - Added experimental "promiscuous" mode to storescp. In this mode, activated by the --promiscuous command line option, all presentation contexts not known not to be Storage SOP Classes are accepted. Affects: dcmnet/apps/storescp.cc - Added --max-send-pdu option that allows to restrict the size of outgoing P-DATA PDUs Affects: dcmnet/apps/storescu.cc - Fixed a few incorrect debug messages Affects: dcmnet/libsrc/dulfsm.cc - Added global flag dcmMaxOutgoingPDUSize that allows to restrict the maximum size of outgoiung P-DATA PDUs to a value less than the maximum supported by the remote application entity or this library. May be useful if there is an interaction between PDU size and other network layers, e. g. TLS, IP or below. Affects: dcmnet/include/dimse.h dcmnet/libsrc/dimse.cc - Fixed bug causing dcmnet to timeout on an incoming message when a PDU containing both a command PDV and a dataset PDV was received and dcmnet was operating in nonblocking mode. Thanks to Stefan Allers for the help in localizing the problem. Affects: dcmnet/libsrc/dimse.cc - Fixed two issues in parser. Dcmdata will now correctly parse compressed data sets containing uncompressed pixel data (e.g. icon images) and uncompressed data sets containing compressed pixel data (e.g. compressed file but meta-header missing). Note that write-back of such datasets will fail unless appropriate compression codecs are registered. Affects: dcmdata/libsrc/dcpixel.cc **** Changes from 2002.09.02 (eichelberg) - Added --prefer-deflated, --write-xfer-deflated and --compression-level options to storescp Affects: dcmnet/apps/storescp.cc **** Changes from 2002.08.30 (riesmeier) - Removed "friend" statements from class declaration and moved sub-classes to the "public" section (required for Sun CC 6). Affects: dcmsr/include/dsrsoprf.h **** Changes from 2002.08.29 (eichelberg) - Actived WITH_TIFF and WITH_ZLIB options in WIN32 compile system. The VC++ project files now require libtiff and zlib to compile. Affects: config/include/cfwin32.h - Added --propose-deflated and --compression-level options to storescu Affects: dcmnet/apps/storescu.cc - Fixed DiTIFFPlugin::write(): libtiff's TIFFFdOpen() expects a HANDLE instead of a file descriptor when compiled on WIN32. Affects: dcmimage/libsrc/dipitiff.cc - Updated zlib-related classes to correctly compile when WITH_ZLIB is undefined Affects: dcmdata/libsrc/dcistrmz.cc dcmdata/libsrc/dcostrmz.cc - Updated Visual C++ project files for new I/O stream classes and zlib support. Affects: dcmdata/dcmdata.dsp dcmdata/apps/dcm2xml.dsp dcmdata/apps/dcmconv.dsp dcmdata/apps/dcmcrle.dsp dcmdata/apps/dcmdrle.dsp dcmdata/apps/dcmdump.dsp dcmdata/apps/dcmftest.dsp dcmdata/apps/dcmgpdir.dsp dcmdata/apps/dump2dcm.dsp dcmimage/dcmimage.dsp dcmimage/apps/dcm2pnm.dsp dcmimage/apps/dcmquant.dsp dcmimage/apps/dcmscale.dsp dcmimgle/dcmimgle.dsp dcmimgle/apps/dcmdspfn.dsp dcmimgle/apps/dcod2lum.dsp dcmimgle/apps/dconvlum.dsp dcmjpeg/dcmjpeg.dsp dcmjpeg/apps/dcmcjpeg.dsp dcmjpeg/apps/dcmdjpeg.dsp dcmjpeg/apps/dcmj2pnm.dsp dcmjpeg/apps/dcmmkdir.dsp dcmnet/dcmnet.dsp dcmnet/apps/echoscu.dsp dcmnet/apps/findscu.dsp dcmnet/apps/movescu.dsp dcmnet/apps/storescp.dsp dcmnet/apps/storescu.dsp dcmpstat/dcmpstat.dsp dcmpstat/apps/dcmmkcrv.dsp dcmpstat/apps/dcmmklut.dsp dcmpstat/apps/dcmp2pgm.dsp dcmpstat/apps/dcmprscp.dsp dcmpstat/apps/dcmprscu.dsp dcmpstat/apps/dcmpschk.dsp dcmpstat/apps/dcmpsmk.dsp dcmpstat/apps/dcmpsprt.dsp dcmpstat/apps/dcmpsrcv.dsp dcmpstat/apps/dcmpssnd.dsp dcmsign/dcmsign.dsp dcmsign/apps/dcmsign_app.dsp dcmsr/dcmsr.dsp dcmsr/apps/dsr2html.dsp dcmsr/apps/dsr2xml.dsp dcmsr/apps/dsrdump.dsp dcmsr/tests/mkreport.dsp dcmtls/dcmtls.dsp dcmwlm/dcmwlm.dsp dcmwlm/apps/wlmscpfs.dsp imagectn/imagectn.dsp imagectn/apps/imagectn_app.dsp imagectn/apps/ti.dsp imagectn/tests/dbregimg.dsp wlistctn/wrklstdb.dsp wlistctn/apps/wlistctn.dsp **** Changes from 2002.08.29 (riesmeier) - Fixed bug in writeImageToDataset(): color images were encoded incorrectly in some cases. Affects: dcmimage/libsrc/dicoimg.cc - Added method that creates pixel data in DICOM format. Affects: dcmimage/include/dicopx.h dcmimage/include/dicopxt.h **** Changes from 2002.08.28 (eichelberg) - Initial release of new DICOM I/O stream classes that add support for stream compression (deflated little endian explicit VR transfer syntax) Affects: dcmwlm/apps/Makefile.dep dcmwlm/apps/Makefile.in dcmwlm/libimg/Makefile.dep **** Changes from 2002.08.27 (eichelberg) - Restricted list of storage SOP classes to less than 64 to prevent presentation context overflow in various tools Affects: dcmdata/libsrc/dcuid.cc - Added options --frame and --all-frames Affects: dcmimage/apps/dcmquant.cc dcmimage/docs/dcmquant.txt - Initial release of new DICOM I/O stream classes that add support for stream compression (deflated little endian explicit VR transfer syntax) Affects: dcmdata/apps/Makefile.dep dcmdata/apps/Makefile.in dcmdata/apps/dcmconv.cc dcmdata/apps/dcmdump.cc dcmdata/include/dcbytstr.h dcmdata/include/dcdatset.h dcmdata/include/dcdirrec.h dcmdata/include/dcelem.h dcmdata/include/dcerror.h dcmdata/include/dcfilefo.h dcmdata/include/dcitem.h dcmdata/include/dcmetinf.h dcmdata/include/dcobject.h dcmdata/include/dcpixel.h dcmdata/include/dcpixseq.h dcmdata/include/dcpxitem.h dcmdata/include/dcsequen.h dcmdata/include/dctk.h dcmdata/include/dcvrobow.h dcmdata/include/dcvrpobw.h dcmdata/include/dcxfer.h dcmdata/libsrc/Makefile.dep dcmdata/libsrc/Makefile.in dcmdata/libsrc/dcbytstr.cc dcmdata/libsrc/dcdatset.cc dcmdata/libsrc/dcdicdir.cc dcmdata/libsrc/dcdictbi.cc dcmdata/libsrc/dcdirrec.cc dcmdata/libsrc/dcelem.cc dcmdata/libsrc/dcerror.cc dcmdata/libsrc/dcfilefo.cc dcmdata/libsrc/dcitem.cc dcmdata/libsrc/dcmetinf.cc dcmdata/libsrc/dcobject.cc dcmdata/libsrc/dcpixel.cc dcmdata/libsrc/dcpixseq.cc dcmdata/libsrc/dcpxitem.cc dcmdata/libsrc/dcrlecce.cc dcmdata/libsrc/dcsequen.cc dcmdata/libsrc/dcutils.cc dcmdata/libsrc/dcvrda.cc dcmdata/libsrc/dcvrdt.cc dcmdata/libsrc/dcvris.cc dcmdata/libsrc/dcvrobow.cc dcmdata/libsrc/dcvrpobw.cc dcmdata/libsrc/dcvrtm.cc dcmdata/libsrc/dcxfer.cc dcmdata/tests/Makefile.dep dcmimage/apps/Makefile.dep dcmimage/apps/Makefile.in dcmimage/libsrc/Makefile.dep dcmimgle/apps/Makefile.dep dcmimgle/libsrc/Makefile.dep dcmjpeg/apps/Makefile.dep dcmjpeg/apps/Makefile.in dcmjpeg/libsrc/Makefile.dep dcmnet/apps/Makefile.dep dcmnet/apps/Makefile.in dcmnet/include/dimse.h dcmnet/libsrc/Makefile.dep dcmnet/libsrc/dimse.cc dcmnet/libsrc/dimstore.cc dcmpstat/apps/Makefile.dep dcmpstat/apps/Makefile.in dcmpstat/libsrcMakefile.dep dcmsign/apps/Makefile.dep dcmsign/apps/Makefile.in dcmsign/include/simaccon.h dcmsign/libsrc/Makefile.dep dcmsign/libsrc/dcmsign.cc dcmsign/libsrc/simaccon.cc dcmsr/apps/Makefile.dep dcmsr/apps/Makefile.in dcmsr/libsrc/Makefile.dep dcmsr/tests/Makefile.dep dcmsr/tests/Makefile.in imagectn/apps/Makefile.dep imagectn/apps/Makefile.in imagectn/libsrc/Makefile.dep imagectn/tests/Makefile.dep imagectn/tests/Makefile.in wlistctn/apps/Makefile.dep wlistctn/apps/Makefile.in wlistctn/libsrc/Makefile.dep wlistctn/tests/Makefile.dep wlistctn/tests/Makefile.in wlistctn/wwwapps/Makefile.dep wlistctn/wwwapps/Makefile.in Added: dcmdata/include/dcistrma.h dcmdata/include/dcistrmb.h dcmdata/include/dcistrmf.h dcmdata/include/dcistrmz.h dcmdata/include/dcostrma.h dcmdata/include/dcostrmb.h dcmdata/include/dcostrmf.h dcmdata/include/dcostrmz.h dcmdata/libsrc/dcistrma.cc dcmdata/libsrc/dcistrmb.cc dcmdata/libsrc/dcistrmf.cc dcmdata/libsrc/dcistrmz.cc dcmdata/libsrc/dcostrma.cc dcmdata/libsrc/dcostrmb.cc dcmdata/libsrc/dcostrmf.cc dcmdata/libsrc/dcostrmz.cc Removed: dcmdata/include/dcbuf.h dcmdata/include/dcstream.h dcmdata/libsrc/dcbuf.cc dcmdata/libsrc/dcstream.cc **** Changes from 2002.08.22 (eichelberg) - Adapted code to new loadFile and saveFile methods, thus removing direct use of the DICOM stream classes. Affects: dcmwlm/libsrc/wlfsim.cc **** Changes from 2002.08.21 (eichelberg) - Adapted code to new loadFile and saveFile methods, thus removing direct use of the DICOM stream classes. Affects: dcmdata/apps/dcm2xml.cc dcmdata/apps/dcmconv.cc dcmdata/apps/dcmcrle.cc dcmdata/apps/dcmdrle.cc dcmdata/apps/dcmgpdir.cc dcmdata/apps/dump2dcm.cc dcmdata/libsrc/dcdicdir.cc dcmdata/libsrc/dcdirrec.cc dcmnet/apps/movescu.cc dcmnet/apps/storescp.cc dcmnet/libsrc/dimse.cc - Fixed argument lists for loadFile and saveFile Affects: dcmimage/apps/dcmscale.cc - Removed DicomImage and DiDocument constructors that take a DcmStream parameter Affects: dcmimgle/include/dcmimage.h dcmimgle/include/didocu.h dcmimgle/libsrc/dcmimage.cc dcmimgle/libsrc/didocu.cc **** Changes from 2002.08.20 (eichelberg) - Added configure option --with-zlib which defines the C++ preprocessor symbol WITH_ZLIB and defines $(ZLIBLIBS) in Makefile.def Affects: config/acconfig.h config/configure config/configure.in config/include/cfwin32.h config/include/config.h.in config/Makefile.def.in - Added explicit includes for header files included implicitly via dcstream before. Affects: dcmpstat/libsrc/dvpsgl.cc dcmpstat/libsrc/dvpsri.cc dcmpstat/libsrc/dvpsvw.cc dcmsr/libsrc/dsrimgfr.cc dcmsr/libsrc/dsrtcoto.cc dcmsr/libsrc/dsrtypes.cc - Changed parameter list of loadFile and saveFile methods in class DcmFileFormat. Removed loadFile and saveFile from class DcmObject. Affects: dcmdata/include/dcfilefo.h dcmdata/include/dcobject.h dcmdata/libsrc/dcfilefo.cc dcmdata/libsrc/dcobject.cc - Adapted code to new loadFile and saveFile methods, thus removing direct use of the DICOM stream classes. Affects: dcmdata/apps/dcmdump.cc dcmimage/apps/dcm2pnm.cc dcmimage/apps/dcmquant.cc dcmimage/apps/dcmscale.cc dcmimage/libsrc/diqtctab.cc dcmjpeg/apps/dcmcjpeg.cc dcmjpeg/apps/dcmdjpeg.cc dcmnet/apps/findscu.cc dcmnet/apps/movescu.cc dcmnet/apps/storescu.cc dcmnet/libsrc/dimse.cc dcmnet/libsrc/diutil.cc dcmpstat/apps/dcmmkcrv.cc dcmpstat/apps/dcmmklut.cc dcmpstat/apps/dcmpschk.cc dcmpstat/apps/dcmpsmk.cc dcmpstat/apps/dcmpsrcv.cc dcmpstat/libsrc/dvpshlp.cc dcmsign/apps/dcmsign.cc dcmsign/libsrc/dcmsign.cc imagectn/apps/scestore.cc imagectn/apps/tiquery.cc imagectn/libsrc/dbstore.cc wlistctn/libsrc/wrklstdb.cc wlistctn/tests/wltest.cc wlistctn/wwwapps/readoviw.cc wlistctn/wwwapps/readwlst.cc wlistctn/wwwapps/writwlst.cc **** Changes from 2002.08.13 (riesmeier) - Added new profile (NONE) based on STD-GEN-xxxx which allows DICOM objects of any transfer syntax to be referenced from a DICOMDIR. NB: there's no equivalent application profile in the DICOM standard. Affects: dcmdata/apps/dcmgpdir.cc dcmjpeg/docs/dcmmkdir.txt **** Changes from 2002.08.12 (wilkens) - Added module number (for error codes) for new module dcmppswm. Affects: dcmdata/include/dcerror.h - Made some modifications in in order to be able to create a new application which contains both wlmscpdb and ppsscpdb and another application which contains both wlmscpfs and ppsscpfs. Affects: dcmwlm/apps/wlcefs.cc dcmwlm/apps/wlcefs.h dcmwlm/docs/wlmscpfs.txt dcmwlm/include/wlds.h dcmwlm/include/wldsfs.h dcmwlm/include/wlfsim.h dcmwlm/include/wltypdef.h dcmwlm/libsrc/wlds.cc dcmwlm/libsrc/wldsfs.cc dcmwlm/libsrc/wlfsim.cc dcmwlm/libsrc/wlmactmg.cc **** Changes from 2002.08.05 (riesmeier) - Corrected wrong spelling of new sub-project "dcmscale" in MSVC workspace file. Affects: dcmtk.dsw - Added new source file "dcpcache.cxx" to MSVC project file. Affects: dcmdata/dcmdata.dsp **** Changes from 2002.08.05 (wilkens) - Modfified the project's structure in order to be able to create a new application which contains both wlmscpdb and ppsscpdb. Added: dcmwlm/apps/wlcefs.h dcmwlm/apps/wlcefs.cc dcmwlm/include/wldsfs.h dcmwlm/include/wlfsim.h dcmwlm/libsrc/wldsfs.cc dcmwlm/libsrc/wlfsim.cc Removed: dcmwlm/apps/wldbim.cc dcmwlm/apps/wldbim.h dcmwlm/apps/wldsdb.cc dcmwlm/apps/wldsdb.h dcmwlm/apps/wldsfs.cc dcmwlm/apps/wldsfs.h dcmwlm/apps/wldspf.cc dcmwlm/apps/wldspf.h dcmwlm/apps/wlfsim.cc dcmwlm/apps/wlfsim.h dcmwlm/apps/wlmceng.cc dcmwlm/apps/wlmceng.h dcmwlm/apps/wlmscpdb.cc dcmwlm/apps/wlmscpdb.dsp dcmwlm/apps/wlmscpki.cc dcmwlm/apps/wlmscpki.dsp dcmwlm/apps/wlpfim.cc dcmwlm/apps/wlpfim.h dcmwlm/docs/wlmscpdb.txt dcmwlm/docs/wlmscpki.txt dcmwlm/tests/dcmTagsStmt.txt dcmwlm/tests/pki.txt dcmwlm/tests/searchStmt.txt Affects: dcmwlm/Makefile.in dcmwlm/configure dcmwlm/dcmwlm.dsp dcmwlm/apps/Makefile.dep dcmwlm/apps/Makefile.in dcmwlm/apps/wlmscpfs.cc dcmwlm/apps/wlmscpfs.dsp dcmwlm/apps/wlcefs.h dcmwlm/apps/wlcefs.cc dcmwlm/docs/Makefile.in dcmwlm/docs/wlmscpfs.txt dcmwlm/htmldocs/Makefile.in dcmwlm/include/Makefile.in dcmwlm/include/wlds.h dcmwlm/include/wlmactmg.h dcmwlm/include/wltypdef.h dcmwlm/include/wldsfs.h dcmwlm/include/wlfsim.h dcmwlm/libsrc/Makefile.dep dcmwlm/libsrc/Makefile.in dcmwlm/libsrc/wlds.cc dcmwlm/libsrc/wlmactmg.cc dcmwlm/libsrc/wldsfs.cc dcmwlm/libsrc/wlfsim.cc dcmwlm/tests/Makefile.in **** Changes from 2002.08.02 (eichelberg) - Fixed bug in mkdictbi which would cause the builtin dictionary to fail to compile if the last dictionary entry was a private tag. Affects: dcmdata/libsrc/dcdictzz.cc dcmdata/libsrc/mkdictbi.cc - Execute options in storescp now clean up zombie child processes as they should. Affects: dcmnet/apps/storescp.cc **** Changes from 2002.08.02 (riesmeier) - Fixed bug in dcmdump that was preventing the +p option from working. Thanks to Tom Probasco for the bug report and fix. Affects: dcmdata/apps/dcmdump.cc - Added optional 'pos' parameter to the putAndInsertXXX() methods. Affects: dcmdata/include/dcitem.h dcmdata/libsrc/dcitem.cc - Enhanced debug output of dcmsr command line tools (e.g. add position string of invalid content items to error messages). Affects: dcmsr/apps/dsr2html.cc dcmsr/apps/dsrdump.cc dcmsr/docs/dsr2html.txt dcmsr/docs/dsrdump.txt - Enhanced debug output of dcmsr::read() routines (e.g. add position string of invalid content items to error messages). Affects: dcmsr/include/dsrdoctn.h dcmsr/include/dsrtypes.h dcmsr/libsrc/dsrdoctn.cc dcmsr/libsrc/dsrtypes.cc - Enhanced writeFrameToDataset() routine (remove out-dated DICOM attributes from the dataset). Affects: dcmimgle/include/dcmimage.h dcmimgle/include/diimage.h dcmimgle/libsrc/diimage.cc - Added function to write the current image (not only a selected frame) to a DICOM dataset. Affects: dcmimgle/include/dcmimage.h dcmimgle/include/diimage.h dcmimgle/include/dimoimg.h dcmimgle/libsrc/dimoimg.cc dcmimage/include/dicoimg.h dcmimage/libsrc/dicoimg.cc - Added new command line program which allows to scale DICOM images. Affects: dcmtk/dcmtk.dsw dcmimage/apps/Makefile.dep dcmimage/apps/Makefile.in Added: dcmimage/apps/dcmscale.cc dcmimage/apps/dcmscale.dsp dcmimage/docs/dcmscale.txt - Re-compute Imager/Pixel Spacing and Pixel Aspect Ratio for scaled images. Affects: dcmimgle/libsrc/diimage.cc - Rebuilt dependencies file. Affects: dcmimage/libsrc/Makefile.dep dcmimgle/apps/Makefile.dep dcmimgle/libsrc/Makefile.dep dcmsr/apps/Makefile.dep dcmsr/libsrc/Makefile.dep dcmsr/tests/Makefile.dep - Fixed problems reported by Sun CC 2.0.1. Affects: dcmdata/libsrc/dcitem.cc dcmsr/libsrc/dsrdoctn.cc **** Changes from 2002.07.24 (eichelberg) - Replaced GNU make specific construct by bourne shell code Affects: dcmdata/libsrc/Makefile.in **** Changes from 2002.07.23 (eichelberg) - Added support for private tag data dictionaries to dcmdata. Affects: dcmdata/apps/Makefile.dep dcmdata/include/dcdicent.h dcmdata/include/dcdict.h dcmdata/include/dchashdi.h dcmdata/include/dcitem.h dcmdata/include/dctag.h dcmdata/libsrc/Makefile.dep dcmdata/libsrc/Makefile.in dcmdata/libsrc/dcdicent.cc dcmdata/libsrc/dcdict.cc dcmdata/libsrc/dcdictzz.cc dcmdata/libsrc/dchashdi.cc dcmdata/libsrc/dcitem.cc dcmdata/libsrc/dctag.cc dcmdata/libsrc/mkdeftag.cc dcmdata/libsrc/mkdictbi.cc Added: dcmdata/include/dcpcache.h dcmdata/libsrc/dcpcache.cc dcmdata/libsrc/private.dic **** Changes from 2002.07.22 (eichelberg) - Added configure option --with-private-tags which defines the C++ preprocessor symbol WITH_PRIVATE_TAGS. Affects: config/Makefile.def.in config/acconfig.h config/configure config/configure.in config/cfwin32.h config/config.h.in **** Changes from 2002.07.22 (riesmeier) - Added new command line option to suppress the output of general document information. Affects: dcmsr/apps/dsrdump.cc dcmsr/docs/dsrdump.txt - Added new print flag to suppress the output of general document information. Affects: dcmsr/include/dsrtypes.h dcmsr/libsrc/dsrdoc.cc dcmsr/libsrc/dsrtypes.cc - Removed unused variable. Affects: dcmsr/libsrc/dsrtcovl.cc **** Changes from 2002.07.19 (riesmeier) - Rebuilt makefile dependencies. Affects: dcmimgle/apps/Makefile.dep - Added missing doc++ comments. Affects: dcmimgle/include/dicrvfit.h - Enhanced/corrected comments. Affects: dcmimgle/include/dcmimage.h dcmimgle/include/diciefn.h dcmimgle/include/didispfn.h dcmimgle/include/digsdfn.h dcmimgle/libsrc/diciefn.cc dcmimgle/libsrc/digsdfn.cc - Enhanced handling of "inverse" calibration used for input devices. Affects: dcmimgle/libsrc/dicielut.cc dcmimgle/libsrc/digsdlut.cc - Fixed bug which occurred for very large number of DDLs only (65536). Affects: dcmimgle/libsrc/didispfn.cc **** Changes from 2002.07.18 (riesmeier) - Added support for hardcopy and softcopy input devices (camera and scanner). Affects: dcmimgle/apps/dcmdspfn.cc dcmimgle/docs/dcmdspfn.txt dcmimgle/include/diciefn.h dcmimgle/include/dicielut.h dcmimgle/include/didispfn.h dcmimgle/include/digsdfn.h dcmimgle/include/digsdlut.h dcmimgle/libsrc/diciefn.cc dcmimgle/libsrc/dicielut.cc dcmimgle/libsrc/didispfn.cc dcmimgle/libsrc/digsdfn.cc dcmimgle/libsrc/digsdlut.cc Added: dcmimgle/tests/camera.lut dcmimgle/tests/scanner.lut - Added polynomial curve fitting algorithm as an alternate interpolation method. Affects: dcmimgle/apps/dcmdspfn.cc dcmimgle/docs/dcmdspfn.txt dcmimgle/include/diciefn.h dcmimgle/include/didispfn.h dcmimgle/include/digsdfn.h dcmimgle/libsrc/diciefn.cc dcmimgle/libsrc/didispfn.cc dcmimgle/libsrc/digsdfn.cc dcmimgle/tests/printer.lut - Added command line tool to convert hardcopy to softcopy display files. Added: dcmimgle/apps/dcod2lum.cc dcmimgle/apps/dcod2lum.dsp dcmimgle/docs/dcod2lum.txt Affects: dcmimgle/apps/Makefile.in dcmtk.dsw - Adapted "usage" text to the dcmtk standard format. Affects: dcmimgle/apps/dconvlum.cc dcmimgle/docs/dconvlum.txt - Changed value of double constant to avoid compilation error (out of range) reported by Sun CC 2.0.1. Affects: ofstd/tests/tstatof.cc - Corrected typos. Affects: ofstd/libsrc/ofstd.cc ofstd/libsrc/oftime.cc dcmimgle/libsrc/diluptab.cc - Removed unused code. Affects: dcmimgle/include/displint.h - Added explicit type casts to keep Sun CC 2.0.1 quiet. Affects: dcmdata/libsrc/dcrleccd.cc dcmdata/libsrc/dcrlecce.cc dcmimage/libsrc/diqtpbox.cc dcmimgle/include/dicrvfit.h - Replaced return statement by break in a while loop of an inline function (not supported by Sun CC 2.0.1). Affects: dcmdata/include/dcrleenc.h - Further enhanced DTD (replaced #PCDATA by CDATA). Affects: dcmdata/apps/dcm2xml.dtd **** Changes from 2002.07.17 (wilkens) - Updated MSVC++ project file. Affects: dcmwlm/apps/wlmscpfs.dsp - Corrected some minor logical errors in the wlmscpdb sources and completely updated the wlmscpfs so that it does not use the original wlistctn sources any more but standard wlm sources which are now used by all three variants of wlmscps. Added: dcmwlm/apps/wlfsim.h dcmwlm/apps/wlfsim.cc Affects: dcmwlm/apps/Makefile.dep dcmwlm/apps/Makefile.in dcmwlm/apps/wldbim.cc dcmwlm/apps/wldbim.h dcmwlm/apps/wldsdb.cc dcmwlm/apps/wldsdb.h dcmwlm/apps/wldsfs.cc dcmwlm/apps/wldsfs.h dcmwlm/apps/wldspf.cc dcmwlm/apps/wldspf.h dcmwlm/apps/wlfsim.cc dcmwlm/apps/wlfsim.h dcmwlm/apps/wlmceng.cc dcmwlm/apps/wlmceng.h dcmwlm/apps/wlpfim.cc dcmwlm/apps/wlpfim.h dcmwlm/include/wlds.h dcmwlm/include/wlmactmg.h dcmwlm/include/wltypdef.h dcmwlm/libsrc/wlds.cc dcmwlm/libsrc/wlmactmg.cc **** Changes from 2002.07.16 (riesmeier) - Fixed bug in DcmTime::getOFTimeFromString() and DcmTime::getCurrentTime(). Affects: dcmdata/libsrc/dcvrtm.cc - Added test case. Affects: dcmdata/tests/tvrdatim.cc **** Changes from 2002.07.15 (riesmeier) - Added three new entries to the FAQ. Affects: FAQ **** Changes from 2002.07.11 (riesmeier) - Added support for CT/MR application profile. Added general support for monochrome icon images. Affects: dcmdata/apps/dcmgpdir.cc dcmjpeg/apps/dcmmkdir.dsp - Added new command line flags to handle inconsistant header information (patient ID and name). Affects: dcmdata/apps/dcmgpdir.cc dcmdata/docs/dcmgpdir.txt **** Changes from 2002.07.10 (eichelberg) - Replaced dcmnet specific definitions for implementation class UID and version name by the constants defined in dcmdata. Affects: dcmnet/include/assoc.h dcmnet/libsrc/assoc.cc - Moved definitions for Uint8, Sint8 ... Float64 from dcmdata to ofstd since these types are not DICOM specific Affects: ofstd/include/oftypes.h dcmdata/include/dctypes.h - Added workaround for memory leak in handling of compressed representations Conditional compilation with PIXELSTACK_MEMORY_LEAK_WORKAROUND #defined. Thanks to Tomaschek Karl for the contribution. Affects: dcmdata/libsrc/dcdatset.cc - Added vitual destructor to class OFStackLink Affects: ofstd/include/ofstack.h - Fixed memory leak that occured when compression of an image failed in a compression codec. Affects: dcmdata/libsrc/dcpixel.cc - Added comment about reserved range of error codes Affects: ofstd/libsrc/ofcond.cc - Fixed memory leak in command line applications Affects: dcmjpeg/apps/dcmcjpeg.cc dcmjpeg/apps/dcmdjpeg.cc **** Changes from 2002.07.09 (wilkens) - Added some more functionality. Affects: ofstd/include/ofoset.h ofstd/include/ofuoset.h ofstd/include/ofset.h - Added some new functions to set classes. Affects: ofstd/include/ofoset.h ofstd/include/ofuoset.h ofstd/include/ofset.h **** Changes from 2002.07.08 (eichelberg) - Unknown undefined length attributes are now converted into SQ instead of UN. Affects: dcmdata/libsrc/dcitem.cc - Fixed dcmjpeg encoder: non Image Pixel module attributes are now created on dataset level only, not inside sequence items (such as the Icon Image Sequence) Affects: dcmjpeg/libsrc/djcodece.cc - Improved dcmdata behaviour when reading odd tag length. Depending on the global boolean flag dcmAcceptOddAttributeLength, the parser now either accepts odd length attributes or implements the old behaviour, i.e. assumes a real length larger by one. In the new mode, odd length attributes are either padded _after_ successful read or kept unmodified, depending on the flag dcmEnableAutomaticInputDataCorrection. Affects: dcmdata/apps/dcmconv.cc dcmdata/apps/dcmdump.cc dcmdata/include/dcobject.h dcmdata/libsrc/dcbytstr.cc dcmdata/libsrc/dcelem.cc dcmdata/libsrc/dcitem.cc dcmdata/libsrc/dcobject.cc dcmdata/libsrc/dcsequen.cc dcmdata/libsrc/dcvrobow.cc - RLE codec now includes , needed for memcpy on Win32 Affects: dcmdata/include/dcrleenc.h - Fixed bug in network initialization code Affects: dcmnet/libsrc/dul.cc **** Changes from 2002.07.05 (riesmeier) - Added support for new printer characteristics file. Affects: dcmimgle/apps/dcm2pnm.cc dcmimgle/docs/dcm2pnm.txt dcmjpeg/docs/dcmj2pnm.txt - Modified description of command line options. Affects: dcmimgle/apps/dcmdspfn.cc dcmimgle/docs/dcmdspfn.txt - Added comments. Affects: dcmimgle/include/dcmimage.h - Fixed sign bug. Affects: dcmimgle/libsrc/digsdfn.cc **** Changes from 2002.07.04 (riesmeier) - Fixed inconsistent formatting of the print() output. Affects: dcmdata/libsrc/dcitem.cc **** Changes from 2002.07.03 (riesmeier) - Fixed inconsistencies regarding the handling of ambient light. Affects: dcmimgle/apps/dcmdspfn.cc dcmimgle/include/didispfn.h dcmimgle/libsrc/diciefn.cc dcmimgle/libsrc/dicielut.cc dcmimgle/libsrc/didispfn.cc dcmimgle/libsrc/digsdfn.cc dcmimgle/libsrc/digsdlut.cc - Replaced sample monitor characteristics file. Affects: dcmimgle/tests/monitor.lut **** Changes from 2002.07.02 (riesmeier) - Added support for ultrasound and waveform media storage application profiles. Affects: dcmdata/apps/dcmgpdir.cc dcmjpeg/docs/dcmmkdir.txt - Added Mammography CAD SR to the list of supported SOP classes. Affects: dcmdata/apps/dcmgpdir.cc - Explicitly list STD-GEN-DVD-RAM as one of the supported profiles. Affects: dcmdata/docs/dcmgpdir.txt dcmjpeg/docs/dcmmkdir.txt - Added support for hardcopy devices to the calibrated output routines. Added: dcmimgle/tests/printer.lut Affects: dcmimgle/apps/dcmdspfn.cc dcmimgle/docs/dcmdspfn.txt dcmimgle/include/diciefn.h dcmimgle/include/dicielut.h dcmimgle/include/didislut.h dcmimgle/include/didispfn.h dcmimgle/include/digsdfn.h dcmimgle/include/digsdlut.h dcmimgle/libsrc/diciefn.cc dcmimgle/libsrc/dicielut.cc dcmimgle/libsrc/didislut.cc dcmimgle/libsrc/didispfn.cc dcmimgle/libsrc/digsdfn.cc dcmimgle/libsrc/digsdlut.cc - Minor fixes to keep MSVC6 quiet. Affects: dcmdata/apps/dcmgpdir.cc dcmimgle/libsrc/didispfn.cc **** Changes from 2002.07.02 (wilkens) - Made some modifications to keep gcc version egcs-2.91.66 quiet. Affects: ofstd/include/ofoset.h - Added function OFStandard::stringMatchesCharacterSet(...) Affects: ofstd/include/ofstd.h ofstd/libsrc/ofstd.cc - Added container classes OFOrderedSet and OFUnorderedSet which are based on the new abstract class OFSet. Added: ofstd/include/ofset.h ofstd/include/ofoset.h ofstd/include/ofuoset.h ofstd/libsrc/ofset.h ofstd/libsrc/ofoset.h ofstd/libsrc/ofuoset.h **** Changes from 2002.07.01 (wilkens) - Some more corrections to get rid of msvc6's warnings. Affects: dcmwlm/include/wlds.h **** Changes from 2002.06.27 (eichelberg) - Modified RLE encoder to make it usable for other purposes than DICOM encoding as well (e.g. PostScript, TIFF) Affects: dcmdata/include/dcrleenc.h dcmdata/libsrc/dcrlecce.cc - Now adding empty Patient Orientation when converting to Secondary Capture. Affects: dcmdata/libsrc/dccodec.cc **** Changes from 2002.06.26 (riesmeier) - Added support for polymorp OB/OW value representation (e.g. pixel data) to putAndInsertUint8/16Array() methods. Affects: dcmdata/include/dcitem.h dcmdata/libsrc/dcitem.cc - Enhanced handling of corrupted pixel data and/or length. Affects: dcmimgle/include/diinpx.h dcmimgle/include/dimoipxt.h dcmimgle/include/dimopxt.h dcmimgle/include/dipixel.h dcmimgle/libsrc/diinpx.cc dcmimgle/libsrc/dimoimg.cc dcmimgle/libsrc/dimopx.cc dcmimage/include/diargpxt.h dcmimage/include/dicmypxt.h dcmimage/include/dicopxt.h dcmimage/include/dihsvpxt.h dcmimage/include/dipalpxt.h dcmimage/include/dirgbpxt.h dcmimage/include/diybrpxt.h dcmimage/include/diyf2pxt.h dcmimage/include/diyp2pxt.h dcmimage/libsrc/dicoimg.cc dcmimage/libsrc/dicopx.cc - Corrected decoding of multi-frame, planar images. Affects: dcmimage/include/diargpxt.h dcmimage/include/dicmypxt.h dcmimage/include/dihsvpxt.h dcmimage/include/dipalpxt.h dcmimage/include/dirgbpxt.h dcmimage/include/diybrpxt.h dcmimage/libsrc/diargimg.cc dcmimage/libsrc/dicmyimg.cc dcmimage/libsrc/dihsvimg.cc dcmimage/libsrc/dipalimg.cc dcmimage/libsrc/dirgbimg.cc dcmimage/libsrc/diybrimg.cc - Added support for polarity flag to color images. Affects: dcmimgle/include/dcmimage.h dcmimgle/include/diimage.h dcmimgle/include/dimoimg.h dcmimgle/libsrc/diimage.cc dcmimgle/libsrc/dimoimg.cc dcmimage/include/dicoopxt.h dcmimage/libsrc/dicoimg.cc - Added new method to write a selected frame to a DICOM dataset (incl. required attributes from the "Image Pixel Module"). Affects: dcmimgle/include/dcmimage.h dcmimgle/include/diimage.h dcmimgle/libsrc/Makefile.dep dcmimgle/libsrc/diimage.cc dcmimgle/apps/Makefile.dep dcmimage/libsrc/Makefile.dep dcmimage/apps/Makefile.dep - Added new methods to get the explanation string of stored VOI windows and LUTs (not only of the currently selected VOI transformation). Affects: dcmimgle/include/dcmimage.h dcmimgle/include/didocu.h dcmimgle/include/dimoimg.h dcmimgle/libsrc/didocu.cc dcmimgle/libsrc/diluptab.cc dcmimgle/libsrc/dimoimg.cc dcmimage/apps/dcm2pnm.cc - Added configuration flag that enables the DicomImage class to take the responsibility of an external DICOM dataset (i.e. delete it on destruction). Affects: dcmimgle/include/diutils.h dcmimgle/libsrc/didocu.cc dcmimage/apps/dcm2pnm.cc - Added support for RLE decompression. Affects: dcmimage/apps/dcm2pnm.cc dcmimage/docs/dcm2pnm.txt dcmjpeg/docs/dcmj2pnm.txt - Cleaned up "tests" folder. Removed: dcmimage/tests/all2ppm dcmimage/tests/convert dcmimage/tests/test.cc dcmimage/tests/testall dcmimgle/tests/check.pl dcmimgle/tests/check_usr.pl dcmimgle/tests/create.pl dcmimgle/tests/plan.dat dcmimgle/tests/test.dat - Added type cast to keep MSVC6 quiet. Affects: dcmdata/libsrc/dcvrfl.cc dcmimage/include/dicoopxt.h - Removed superfluous semicolon at very awkward positions (this is a bug fix!). Affects: dcmpstat/libsrc/dvpscf.cc - Removed superfluous "inline" method specifyer (MSVC6 linker reported an error). Affects: dcmimgle/include/dimoimg.h - Added missing dependence to sub-project "dconvlum". Affects: dcmtk.dsw **** Changes from 2002.06.20 (eichelberg) - Adapted toolkit to name changes in latest data dictionary Affects: dcmpstat/libsrc/dvpsib.cc dcmsr/libsrc/dsrdoc.cc - Implemented a locale independent function OFStandard::atof() that converts strings to double and optionally returns a status code Affects: ofstd/include/ofstd.h ofstd/libsrc/ofstd.cc - Created test application for OFStandard::atof() Affects: ofstd/tests/Makefile.dep ofstd/tests/Makefile.in Added: ofstd/tests/tstatof.cc - Changed toolkit to use OFStandard::atof instead of atof, strtod or sscanf for all string to double conversions that are supposed to be locale independent Affects: dcmdata/libsrc/dcvrds.cc dcmdata/libsrc/dcvrdt.cc dcmdata/libsrc/dcvrfd.cc dcmdata/libsrc/dcvrfl.cc dcmdata/libsrc/dcvrtm.cc dcmimgle/apps/dconvlum.cc dcmpstat/libsrc/dvpscf.cc imagectn/libsrc/dbutils.cc ofstd/libsrc/ofcmdln.cc ofstd/libsrc/tstring.cc **** Changes from 2002.06.19 (eichelberg) - Added typecasts to avoid ambiguity with built-in functions on gcc 3.2 Thanks to Andreas Barth for the contribution. Affects: dcmimgle/include/dimoopxt.h dcmimgle/libsrc/digsdfn.cc - Updated data dictionary, fixed various typos Affects: dcmdata/include/dcdeftag.h dcmdata/libsrc/dcdictzz.cc dcmdata/libsrc/dicom.dic - Updated list of SOP Class UIDs for Supplement 49 Affects: dcmdata/include/dcuid.h dcmdata/libsrc/dcuid.cc - Fixed typo in transfer syntax name Affects: dcmdata/libsrc/dcxfer.cc **** Changes from 2002.06.14 (eichelberg) - Fixed minor bug in DIMSE debug output Affects: dcmnet/libsrc/dimse.cc - Fixed bug in ofConsole join/split mutex locking behaviour Affects: ofstd/libsrc/ofconsol.cc - Adapted log file handling to ofConsole singleton Affects: dcmpstat/apps/dcmprscp.cc dcmpstat/apps/dcmprscu.cc dcmpstat/apps/dcmpschk.cc - Removed dependency from class DVInterface. Significantly reduces size of binary. Affects: dcmpstat/apps/dcmpsrcv.cc dcmpstat/apps/dcmpssnd.cc dcmpstat/apps/Makefile.dep **** Changes from 2002.06.12 (riesmeier) - Added test to "load data dictionary" routine checking whether given filename really points to a file and not to a directory or the like. Affects: dcmdata/libsrc/Makefile.dep dcmdata/libsrc/dcdict.cc **** Changes from 2002.06.10 (riesmeier) - Fixed inconsistency regarding spelling of the "file-format" element. Affects: dcmdata/apps/dcm2xml.cc dcmdata/docs/dcm2xml.txt **** Changes from 2002.06.10 (wilkens) - Some more corrections to keep gcc 2.95.3 quiet. Affects: dcmwlm/libsrc/wlds.cc - Made some corrections to keep gcc 2.95.3 quiet. Affects: dcmwlm/apps/wldsdb.h dcmwlm/apps/wldsfs.cc dcmwlm/apps/wldsfs.h dcmwlm/apps/wldspf.h dcmwlm/apps/wlmceng.cc dcmwlm/apps/wlmceng.h dcmwlm/apps/wlpfim.cc dcmwlm/apps/wlpfim.h dcmwlm/include/wlds.h dcmwlm/include/wlmactmg.h dcmwlm/libsrc/wlds.cc dcmwlm/libsrc/wlmactmg.cc **** Changes from 2002.06.06 (eichelberg) - Corrected code for inclusion of stdlib.h Affects: dcmdata/include/dctypes.h - Initial release of the new RLE codec classes and the dcmcrle/dcmdrle tools in module dcmdata Affects: dcmtk.dsw dcmdata/dcmdata.dsp dcmdata/apps/Makefile.dep dcmdata/apps/Makefile.in dcmdata/libsrc/Makefile.dep dcmdata/libsrc/Makefile.in Added: dcmdata/apps/dcmcrle.cc dcmdata/apps/dcmcrle.dsp dcmdata/apps/dcmdrle.cc dcmdata/apps/dcmdrle.dsp dcmdata/docs/dcmcrle.txt dcmdata/docs/dcmdrle.txt dcmdata/include/dcrleccd.h dcmdata/include/dcrlecce.h dcmdata/include/dcrlecp.h dcmdata/include/dcrledec.h dcmdata/include/dcrledrg.h dcmdata/include/dcrleenc.h dcmdata/include/dcrleerg.h dcmdata/include/dcrlerp.h dcmdata/libsrc/dcrleccd.cc dcmdata/libsrc/dcrlecce.cc dcmdata/libsrc/dcrlecp.cc dcmdata/libsrc/dcrledrg.cc dcmdata/libsrc/dcrleerg.cc dcmdata/libsrc/dcrlerp.cc **** Changes from 2002.06.05 (wilkens) - Changed call to readdir() so that readdir_r() is called instead. Affects: dcmwlm/apps/wldsfs.cc **** Changes from 2002.05.29 (eichelberg) - fixed follow-up problem in DcmItem caused by the modifications committed 2002-05-17. Affects: dcmdata/libsrc/dcitem.cc **** Changes from 2002.05.24 (eichelberg) - Fixed typecast problem reported by egcs and VC6 Affects: dcmnet/libsrc/dul.cc - Moved helper methods that are useful for different compression techniques from module dcmjpeg to module dcmdata Affects: dcmdata/include/dccodec.h dcmdata/include/dcpixseq.h dcmdata/include/dcpxitem.h dcmdata/libsrc/dccodec.cc dcmdata/libsrc/dcpixseq.cc dcmdata/libsrc/dcpxitem.cc dcmjpeg/include/djcodecd.h dcmjpeg/include/djcodece.h dcmjpeg/libsrc/djcodecd.cc dcmjpeg/libsrc/djcodece.cc Added: dcmdata/include/dcofsetl.h **** Changes from 2002.05.24 (riesmeier) - Renamed some parameters/variables to avoid ambiguities. Affects: ofstd/include/ofdate.h ofstd/include/ofdatime.h ofstd/include/oftime.h ofstd/libsrc/ofdate.cc ofstd/libsrc/ofdatime.cc ofstd/libsrc/oftime.cc ofstd/tests/tofdatim.cc dcmdata/include/dctag.h dcmdata/libsrc/dctag.cc dcmdata/tests/tvrdatim.cc dcmimage/apps/dcm2pnm.cc - Added "const" modifier to char pointer to avoid warnings reported by gcc 2.95.3 with additional options. Affects: ofstd/tests/tstring.cc - Added missing member variables to member initialization list (warnings reported by gcc 2.95.3 with additional options). Affects: dcmsr/libsrc/dsrsoprf.cc - Added missing #include "ofconsol.h". Affects: dcmimage/include/diyf2pxt.h **** Changes from 2002.05.17 (eichelberg) - fixed bug in DcmItem which caused the parser to fail if the same attribute tag appeared twice within one dataset (which is illegal in DICOM anyway). Added console warning if the attributes read are not in ascending order. Thanks to David Lappen and Rainer Thieme for the bug reports. Affects: dcmdata/include/dcitem.h dcmdata/libsrc/dcitem.cc **** Changes from 2002.05.16 (eichelberg) - changed return type of OFConsole::setCout() and OFConsole::setCerr() to pointer instead of reference. Affects: ofstd/include/ofconsol.h ofstd/libsrc/ofconsol.cc - Fixed problem with new UID creation routines on Visual C++ 5 where some type names and constants in are defined differently than on Visual C++ 6. Affects: dcmdata/libsrc/dcuid.cc - Minor fixes to make ofstd compile on NeXTStep 3.3 Affects: ofstd/include/oflogfil.h ofstd/libsrc/ofstd.cc - Changed ofConsole into singleton implementation that can safely be used prior to start of main, i.e. from global constructors Affects: ofstd/include/ofconsol.h ofstd/libsrc/ofconsol.cc **** Changes from 2002.05.15 (eichelberg) - Minor corrections to avoid warnings on Sun CC 2.0.1 Affects: dcmimage/include/diqtctab.h dcmimage/include/diqtfs.h dcmimage/libsrc/diqtctab.cc - Fixed problem with DICOM upper layer: If network initialization for an acceptor failed (e.g. because the listen port was already occupied), further calls to ASC_initializeNetwork() with different port numbers would also fail. Thanks to Jesper Bojesen for the bug report. Affects: dcmnet/libsrc/dul.cc - Added configure test for readdir_r conforming to Posix 1.c draft 6 Affects: config/acconfig.h config/aclocal.m4 config/configure config/configure.in config/include/config.h.in - Reworked wlistctn library to use readdir_r when compiled in reentrant mode. Both Posix 1.c and Posix 1.c draft 6 interfaces for readdir_r are supported. Affects: wlistctn/libsrc/wrklstdb.cc **** Changes from 2002.05.14 (riesmeier) - Added support for Base64 (MIME) encoding and decoding. Affects: ofstd/include/ofstd.h ofstd/libsrc/ofstd.cc ofstd/tests/tofstd.cc - Added support for Base64 (MIME) encoded binary data. Affects: dcmdata/apps/dcm2xml.cc dcmdata/apps/dcm2xml.dtd dcmdata/docs/dcm2xml.txt dcmdata/include/dctypes.h dcmdata/libsrc/dcpxitem.cc dcmdata/libsrc/dctypes.cc dcmdata/libsrc/dcvrobow.cc - Renamed some element names. Affects: dcmdata/apps/dcm2xml.dtd dcmdata/libsrc/dcdatset.cc dcmdata/libsrc/dcfilefo.cc - Added removeItem() methods. Affects: dcmsr/include/dsrsoprf.h dcmsr/libsrc/dsrsoprf.cc - Added new command line option to create "all" reports with one call. Affects: dcmsr/tests/mkreport.cc - Updated comments. Affects: ofstd/include/oflogfil.h dcmsr/include/dsrdoc.h dcmsr/include/dsrtypes.h **** Changes from 2002.05.08 (wilkens) - Added documentation files for wlmscpki, wlmscpfs and wlmscpdb. Added: dcmwlm/docs/wlmscpki.txt dcmwlm/docs/wlmscpfs.txt dcmwlm/docs/wlmscpdb.txt - Added new command line option -nse to wlmscpki and wlmscpdb. Affects: dcmwlm/apps/wldsdb.cc dcmwlm/apps/wldsdb.h dcmwlm/apps/wldspf.cc dcmwlm/apps/wldspf.h dcmwlm/apps/wlmceng.cc dcmwlm/apps/wlmceng.h dcmwlm/include/wlds.h **** Changes from 2002.05.07 (riesmeier) - Added support for the Current Requested Procedure Evidence Sequence and the Pertinent Other Evidence Sequence to the dcmsr module. Added: dcmsr/include/dsrsoprf.h dcmsr/libsrc/dsrsoprf.cc Affects: dcmsr/apps/Makefile.dep dcmsr/include/dsrdoc.h dcmsr/include/dsrtypes.h dcmsr/libsrc/Makefile.dep dcmsr/libsrc/Makefile.in dcmsr/libsrc/dcmsr.dsp dcmsr/libsrc/dsrdoc.cc dcmsr/libsrc/dsrtypes.cc dcmsr/tests/Makefile.dep dcmsr/tests/mkreport.cc - Fixed bug in an error message. Affects: dcmdata/apps/dcm2xml.cc dcmsr/apps/dsr2html.cc dcmsr/apps/dsr2xml.cc - Added output of SOP class name to XML documents. Affects: dcmsr/libsrc/dsrcomvl.cc dcmsr/libsrc/dsrdoc.cc - Added "friend" statements to class declaration (required for MSVC). Affects: dcmsr/include/dsrsoprf.h **** Changes from 2002.05.02 (riesmeier) - Added support for standard and non-standard string streams (which one is supported is detected automatically via the configure mechanism). Thanks again to Andreas Barth for his contribution. Affects: config/configure config/configure.in config/include/cfwin32.h config/include/config.h.in ofstd/include/ofconsol.h ofstd/include/ofstream.h ofstd/libsrc/ofconsol.cc dcmnet/libsrc/cond.cc dcmsr/include/dsrtypes.h dcmsr/libsrc/dsrdoc.cc dcmsr/libsrc/dsrdoctn.cc dcmsr/libsrc/dsrtypes.cc dcmimage/apps/dcm2pnm.cc dcmpstat/apps/dcmmklut.cc dcmpstat/apps/dcmpschk.cc dcmpstat/apps/dcmpsrcv.cc dcmpstat/apps/dcmpssnd.cc dcmpstat/libsrc/dvsighdl.cc **** Changes from 2002.04.30 (riesmeier) - Added static helper function to convert strings (tag names or group/element numbers) to DICOM tag objects. Affects: dcmdata/include/dctag.h dcmdata/libsrc/dctag.cc - Updated documentation. Affects: dcmdata/docs/dcm2xml.txt **** Changes from 2002.04.29 (riesmeier) - Updated FAQ file to reflect the latest changes regarding MSVC makefiles. Affects: FAQ **** Changes from 2002.04.25 (riesmeier) - Moved helper function which converts a conventional character string to an HTML/XML mnenonic string (e.g. using "<" instead of "<") from module dcmsr to ofstd. Affects: ofstd/include/ofstd.h ofstd/libsrc/ofstd.cc dcmsr/apps/Makefile.dep dcmsr/libsrc/dsrtypes.cc - Updated documentation. Affects: dcmsr/docs/dsr2html.txt dcmsr/docs/dsr2xml.txt dcmsr/docs/dsrdump.txt - Added getOFString() implementation. Affects: dcmdata/include/dcvrat.h dcmdata/include/dcvrfd.h dcmdata/include/dcvrfl.h dcmdata/include/dcvrsl.h dcmdata/include/dcvrss.h dcmdata/include/dcvrul.h dcmdata/include/dcvrus.h dcmdata/include/dcvrobow.h dcmdata/libsrc/dcvrat.cc dcmdata/libsrc/dcvrfd.cc dcmdata/libsrc/dcvrfl.cc dcmdata/libsrc/dcvrobow.cc dcmdata/libsrc/dcvrsl.cc dcmdata/libsrc/dcvrss.cc dcmdata/libsrc/dcvrul.cc dcmdata/libsrc/dcvrus.cc - Added/modified getOFStringArray() implementation. Affects: dcmdata/include/dcvrobow.h dcmdata/include/dcelem.h dcmdata/libsrc/dcelem.cc dcmdata/libsrc/dcvrlt.cc dcmdata/libsrc/dcvrobow.cc dcmdata/libsrc/dcvrst.cc dcmdata/libsrc/dcvrut.cc - Removed getOFStringArray() implementation. Affects: dcmdata/include/dcvrae.h dcmdata/include/dcvrcs.h dcmdata/include/dcvrds.h dcmdata/include/dcvrdt.h dcmdata/include/dcvris.h dcmdata/include/dcvrlo.h dcmdata/include/dcvrpn.h dcmdata/include/dcvrsh.h dcmdata/include/dcvrtm.h dcmdata/include/dcbytstr.h dcmdata/libsrc/dcbytstr.cc dcmdata/libsrc/dcvrae.cc dcmdata/libsrc/dcvrcs.cc dcmdata/libsrc/dcvrds.cc dcmdata/libsrc/dcvrdt.cc dcmdata/libsrc/dcvris.cc dcmdata/libsrc/dcvrlo.cc dcmdata/libsrc/dcvrpn.cc dcmdata/libsrc/dcvrsh.cc dcmdata/libsrc/dcvrtm.cc - Added support for XML output of DICOM objects. Added: dcmdata/libsrc/dctypes.cc Affects: dcmdata/dcmdata.dsp dcmdata/include/dcdatset.h dcmdata/include/dcelem.h dcmdata/include/dcfilefo.h dcmdata/include/dcitem.h dcmdata/include/dcmetinf.h dcmdata/include/dcobject.h dcmdata/include/dcpixel.h dcmdata/include/dcpxitem.h dcmdata/include/dcvrobow.h dcmdata/include/dctypes.h dcmdata/libsrc/Makefile.dep dcmdata/libsrc/Makefile.in dcmdata/libsrc/dcdatset.cc dcmdata/libsrc/dcelem.cc dcmdata/libsrc/dcfilefo.cc dcmdata/libsrc/dcitem.cc dcmdata/libsrc/dcmetinf.cc dcmdata/libsrc/dcobject.cc dcmdata/libsrc/dcpixel.cc dcmdata/libsrc/dcpxitem.cc dcmdata/libsrc/dcsequen.cc dcmdata/libsrc/dcvrobow.cc - Added new command line tool to convert DICOM files to XML. Added: dcmdata/apps/dcm2xml.cc dcmdata/apps/dcm2xml.dsp dcmdata/apps/dcm2xml.dtd dcmdata/docs/dcm2xml.txt Affects: dcmtk/dcmtk.dsw dcmdata/apps/Makefile.dep dcmdata/apps/Makefile.in - Made makeMachineByteString() virtual to avoid ambiguities. Affects: dcmdata/include/dcbytstr.h dcmdata/include/dcvrui.h - Removed unused function parameter to keep Sun CC 2.0.1 quiet. Affects: dcmdata/apps/dcm2xml.cc **** Changes from 2002.04.19 (riesmeier) - Added new helper routines to get the milli and micro seconds part as well as the integral value of seconds. Afefcts: ofstd/include/oftime.h ofstd/libsrc/ofdate.cc ofstd/tests/tofdatim.cc dcmnet/apps/storescp.cc **** Changes from 2002.04.19 (wilkens) - Added support for new functions in OFStandard. Affects: dcmwlm/apps/wldsfs.cc - Added folder htmldocs and file Makefile.in within this folder. Added: dcmwlm/htmldocs/ dcmwlm/htmldocs/Makefile.in - Added file wlmscpki.dsp to apps folder. File was missing. Added: dcmwlm/apps/wlmscpki.dsp - Updated dsp-files so that new structure in dcmwlm is supported. Affects: dcmwlm/dcmwlm.dsp dcmwlm/apps/wlmscpdb.dsp dcmwlm/apps/wlmscpfs.dsp **** Changes from 2002.04.18 (wilkens) - Inserted a new dcmtk module number for module mpps. Affects: dcmdata/include/dcerror.h - Modified Makefiles. Updated latest changes again. These are the latest sources. Added configure file. Affects: dcmwlm/Makefile.in dcmwlm/apps/Makefile.dep dcmwlm/apps/Makefile.in dcmwlm/apps/wldbim.cc dcmwlm/apps/wldbim.h dcmwlm/apps/wldsdb.cc dcmwlm/apps/wldsdb.h dcmwlm/apps/wldsfs.cc dcmwlm/apps/wldsfs.h dcmwlm/apps/wldspf.cc dcmwlm/apps/wldspf.h dcmwlm/apps/wlmceng.cc dcmwlm/apps/wlmceng.h dcmwlm/apps/wlmscpdb.cc dcmwlm/apps/wlmscpfs.cc dcmwlm/apps/wlmscpki.cc dcmwlm/apps/wlpfim.cc dcmwlm/apps/wlpfim.h dcmwlm/include/wlds.h dcmwlm/include/wlmactmg.h dcmwlm/include/wltypdef.h dcmwlm/libsrc/Makefile.dep dcmwlm/libsrc/Makefile.in dcmwlm/libsrc/wlds.cc dcmwlm/libsrc/wlmactmg.cc Added: dcmwlm/configure - Performed split between db-variant and pki-variant. Added: dcmwlm/apps/wldspf.cc dcmwlm/apps/wldspf.h dcmwlm/apps/wlpfim.cc dcmwlm/apps/wlpfim.h dcmwlm/apps/wlmscpki.cc Affects: dcmwlm/libsrc/wldbim.cc (changed and moved to apps folder) dcmwlm/libsrc/wldsdb.cc (changed and moved to apps folder) dcmwlm/libsrc/wldsfs.cc (changed and moved to apps folder) dcmwlm/include/wldbim.h (changed and moved to apps folder) dcmwlm/include/wldsdb.h (changed and moved to apps folder) dcmwlm/include/wldsfs.h (changed and moved to apps folder) - Corrected recognition of non-standard characters, added new supported return key attributes, updated checking the search mask. Affects: dcmwlm/libsrc/wldbim.cc dcmwlm/libsrc/wldsdb.cc dcmwlm/libsrc/wldsfs.cc dcmwlm/include/wldbim.h dcmwlm/include/wldsdb.h dcmwlm/include/wldsfs.h **** Changes from 2002.04.17 (riesmeier) - Extracted MSVC5 project files from central ZIP file "msvc5.zip" and updated them. Added: dcmtk.dsw ofstd/ofstd.dsp dcmdata/dcmdata.dsp dcmdata/apps/dcmconv.dsp dcmdata/apps/dcmdump.dsp dcmdata/apps/dcmftest.dsp dcmdata/apps/dcmgpdir.dsp dcmdata/apps/dump2dcm.dsp dcmnet/dcmnet.dsp dcmnet/apps/echoscu.dsp dcmnet/apps/findscu.dsp dcmnet/apps/movescu.dsp dcmnet/apps/storescp.dsp dcmnet/apps/storescu.dsp dcmimage/dcmimage.dsp dcmimage/apps/dcm2pnm.dsp dcmimage/apps/dcmquant.dsp dcmimgle/dcmimgle.dsp dcmimgle/apps/dcmdspfn.dsp dcmimgle/apps/dconvlum.dsp dcmjpeg/dcmjpeg.dsp dcmjpeg/apps/dcmcjpeg.dsp dcmjpeg/apps/dcmdjpeg.dsp dcmjpeg/apps/dcmj2pnm.dsp dcmjpeg/apps/dcmmkdir.dsp dcmjpeg/libijg12/ijg12.dsp dcmjpeg/libijg16/ijg16.dsp dcmjpeg/libijg8/ijg8.dsp dcmpstat/dcmpstat.dsp dcmpstat/apps/dcmmkcrv.dsp dcmpstat/apps/dcmmklut.dsp dcmpstat/apps/dcmp2pgm.dsp dcmpstat/apps/dcmprscp.dsp dcmpstat/apps/dcmprscu.dsp dcmpstat/apps/dcmpschk.dsp dcmpstat/apps/dcmpsmk.dsp dcmpstat/apps/dcmpsprt.dsp dcmpstat/apps/dcmpsrcv.dsp dcmpstat/apps/dcmpssnd.dsp dcmsign/dcmsign.dsp dcmsign/apps/dcmsign_app.dsp dcmsr/dcmsr.dsp dcmsr/apps/dsr2html.dsp dcmsr/apps/dsr2xml.dsp dcmsr/apps/dsrdump.dsp dcmsr/tests/mkreport.dsp dcmtls/dcmtls.dsp imagectn/imagectn.dsp imagectn/apps/imagectn_app.dsp imagectn/apps/ti.dsp imagectn/tests/dbregimg.dsp wlistctn/wrklstdb.dsp wlistctn/apps/wlistctn.dsp Removed: config/system/win32/README config/system/win32/msvc5.zip Affects: config/docs/dirstruc.txt INSTALL **** Changes from 2002.04.16 (riesmeier) - Added missing target "install-support" to make files. Affects: dcmimage/Makefile.in dcmimgle/Makefile.in dcmjpeg/Makefile.in dcmpstat/Makefile.in dcmsign/Makefile.in dcmsr/Makefile.in dcmtls/Makefile.in dcmwlm/Makefile.in - Added configurable support for C++ ANSI standard includes (e.g. streams). Thanks to Andreas Barth for his contribution. Added: ofstd/include/ofstream.h Affects: ofstd/include/ofconapp.h ofstd/include/ofconsol.h ofstd/include/oflogfil.h ofstd/include/ofstring.h ofstd/libsrc/Makefile.dep ofstd/libsrc/ofconsol.cc ofstd/tests/Makefile.dep ofstd/tests/tlist.cc ofstd/tests/tofdatim.cc ofstd/tests/tofstd.cc ofstd/tests/tstlist.cc ofstd/tests/tststack.cc ofstd/tests/tstthred.cc dcmdata/apps/Makefile.dep dcmdata/apps/dcmdump.cc dcmdata/apps/dcmgpdir.cc dcmdata/apps/dump2dcm.cc dcmdata/include/dcdebug.h dcmdata/include/dcdicent.h dcmdata/include/dctagkey.h dcmdata/libsrc/Makefile.dep dcmdata/libsrc/cmdlnarg.cc dcmdata/libsrc/dcbytstr.cc dcmdata/libsrc/dcdatset.cc dcmdata/libsrc/dcdicdir.cc dcmdata/libsrc/dcdirrec.cc dcmdata/libsrc/dcfilefo.cc dcmdata/libsrc/dcitem.cc dcmdata/libsrc/dclist.cc dcmdata/libsrc/dcmetinf.cc dcmdata/libsrc/dcobject.cc dcmdata/libsrc/dcpixseq.cc dcmdata/libsrc/dcpxitem.cc dcmdata/libsrc/dcsequen.cc dcmdata/libsrc/dcstack.cc dcmdata/libsrc/dcstream.cc dcmdata/libsrc/dctag.cc dcmdata/libsrc/dcuid.cc dcmdata/libsrc/dcvr.cc dcmdata/libsrc/dcvrat.cc dcmdata/libsrc/dcvrfd.cc dcmdata/libsrc/dcvrfl.cc dcmdata/libsrc/dcvrobow.cc dcmdata/libsrc/dcvrsl.cc dcmdata/libsrc/dcvrss.cc dcmdata/libsrc/dcvrul.cc dcmdata/libsrc/dcvrulup.cc dcmdata/libsrc/dcvrus.cc dcmdata/tests/Makefile.dep dcmdata/tests/tvrdatim.cc dcmtls/libsrc/Makefile.dep dcmsr/apps/Makefile.dep dcmsr/apps/dsr2html.cc dcmsr/apps/dsr2xml.cc dcmsr/apps/dsrdump.cc dcmsr/include/dsrdoc.h dcmsr/include/dsrtypes.h dcmsr/libsrc/Makefile.dep dcmsr/libsrc/dsrdoc.cc dcmsr/tests/Makefile.dep dcmsr/tests/mkreport.cc dcmimgle/apps/Makefile.dep dcmimgle/apps/dconvlum.cc dcmimgle/include/diimage.h dcmimgle/include/dimoopx.h dcmimgle/include/diovpln.h dcmimgle/include/discalet.h dcmimgle/libsrc/Makefile.dep dcmimgle/libsrc/diciefn.cc dcmimgle/libsrc/didispfn.cc dcmimgle/libsrc/digsdfn.cc dcmimgle/libsrc/diutils.cc dcmimage/apps/Makefile.dep dcmimage/apps/dcm2pnm.cc dcmimage/include/dicoopx.h dcmimage/libsrc/Makefile.dep dcmsign/apps/Makefile.dep dcmsign/libsrc/Makefile.dep imagectn/apps/Makefile.dep imagectn/libsrc/Makefile.dep imagectn/tests/Makefile.dep dcmnet/apps/Makefile.dep dcmnet/libsrc/Makefile.dep dcmnet/libsrc/cond.cc dcmnet/libsrc/dul.cc dcmnet/libsrc/dulfsm.cc dcmnet/libsrc/dulparse.cc dcmjpeg/apps/Makefile.dep dcmjpeg/libsrc/Makefile.dep wlistctn/apps/Makefile.dep wlistctn/libsrc/Makefile.dep wlistctn/tests/Makefile.dep wwwapps/Makefile.dep wwwapps/writwlst.cc dcmpstat/apps/Makefile.dep dcmpstat/apps/dcmmkcrv.cc dcmpstat/apps/dcmmklut.cc dcmpstat/apps/dcmp2pgm.cc dcmpstat/apps/dcmprscp.cc dcmpstat/apps/dcmprscu.cc dcmpstat/apps/dcmpschk.cc dcmpstat/apps/dcmpsprt.cc dcmpstat/apps/dcmpsrcv.cc dcmpstat/apps/dcmpssnd.cc dcmpstat/apps/vrscan.h dcmpstat/include/dviface.h dcmpstat/include/dvpsprt.h dcmpstat/include/dvpssp.h dcmpstat/include/dvsighdl.h dcmpstat/libsrc/Makefile.dep dcmpstat/libsrc/dviface.cc dcmpstat/libsrc/dvpsprt.cc dcmpstat/libsrc/dvpstat.cc dcmpstat/libsrc/dvsighdl.cc config/include/cfwin32.h config/include/config.h.in config/systems/win32/README config/acconfig.h config/aclocal.m4 config/configure config/configure.in dcmtk/FAQ **** Changes from 2002.04.15 (riesmeier) - Added "include " for struct time_t (required for MSVC). Affects: ofstd/include/ofdate.h ofstd/include/oftime.h - Removed "include " from implementation file. Affects: ofstd/libsrc/ofdate.cc ofstd/libsrc/oftime.cc - Added "include " for Windows systems. Affects: ofstd/libsrc/oftime.cc **** Changes from 2002.04.11 (riesmeier) - Added general purpose routines to check whether a file exists, a path points to a directory or a file, etc. Added: ofstd/tests/tofstd.cc Affects: ofstd/include/ofstd.h ofstd/libsrc/ofstd.cc ofstd/tests/Makefile.dep ofstd/tests/Makefile.in - Introduced new standard classes providing date and time functions. Added: ofstd/include/ofdate.h ofstd/include/ofdatime.h ofstd/include/oftime.h ofstd/libsrc/ofdate.cc ofstd/libsrc/ofdatime.cc ofstd/libsrc/oftime.cc ofstd/tests/tofdatim.cc Affects: ofstd/libsrc/Makefile.in ofstd/libsrc/Makefile.dep ofstd/libsrc/oflogfil.cc ofstd/tests/Makefile.dep ofstd/tests/Makefile.in - Removed test program for OFCommandLine class. Removed: ofstd/tests/tstcmdln.cc Affects: ofstd/tests/Makefile.in - Removed obsolete return statements to keep Sun CC 2.0.1 quiet. Affects: ofstd/tests/tstthred.cc - Added "tests" folder to "make all". Affects: ofstd/Makefile.in - Added new methods for loading and saving DICOM files. Affects: dcmdata/include/dcfilefo.h dcmdata/include/dcdatset.h dcmdata/include/dcobject.h dcmdata/libsrc/dcobject.cc dcmdata/libsrc/dcfilefo.cc dcmdata/libsrc/dcdatset.cc - Enhanced DICOM date, time and date/time classes. Added support for new standard date and time functions. Added: dcmdata/tests/Makefile.dep dcmdata/tests/Makefile.in dcmdata/tests/tvrdatim.cc Affects: dcmdata/Makefile.in dcmdata/include/dcvrda.h dcmdata/include/dcvrdt.h dcmdata/include/dcvrtm.h dcmdata/libsrc/Makefile.dep dcmdata/libsrc/dcvrda.cc dcmdata/libsrc/dcvrdt.cc dcmdata/libsrc/dcvrtm.cc - Enhanced documentation. Affects: dcmdata/libsrc/dcitem.cc dcmdata/libsrc/dcvrpn.cc - Added support for MT-safe system routines (cuserid, getlogin, readdir, ...). Affects: dcmdata/libsrc/mkdeftag.cc dcmdata/libsrc/mkdictbi.cc wlistctn/libsrc/wrklstdb.cc dcmwlm/libsrc/wldsfs.cc - Replaced direct call of system routines by new standard date and time functions. Affects: dcmdata/libsrc/mkdeftag.cc dcmdata/libsrc/mkdictbi.cc dcmdata/apps/Makefile.dep dcmdata/apps/dcmgpdir.cc dcmnet/apps/Makefile.dep dcmnet/apps/storescp.cc dcmnet/libsrc/Makefile.dep dcmsign/libsrc/Makefile.dep dcmsign/libsrc/dcmsign.cc dcmpstat/libsrc/Makefile.dep dcmpstat/libsrc/dviface.cc dcmpstat/libsrc/dvpshlp.cc dcmpstat/libsrc/dvpsprt.cc dcmpstat/apps/Makefile.dep dcmpstat/apps/dcmprscp.cc dcmpstat/apps/dcmprscu.cc - Use the new standard file system routines like fileExists() etc. Affects: dcmdata/apps/dcmgpdir.cc dcmnet/apps/storescp.cc wlistctn/apps/wlistctn.cc wlistctn/apps/Makefile.dep wlistctn/tests/wltest.cc wlistctn/tests/Makefile.dep dcmwlm/libsrc/wldsfs.cc - Use the new loadFile() and saveFile() routines from the dcmdata library. Affects: dcmimage/apps/dcm2pnm.cc dcmsr/apps/Makefile.dep dcmsr/apps/dsr2html.cc dcmsr/apps/dsr2xml.cc dcmsr/apps/dsrdump.cc dcmsr/tests/Makefile.dep dcmsr/tests/mkreport.cc - Adapted layout of command line help. Affects: dcmnet/apps/movescu.cc dcmnet/docs/movescu.txt - Corrected typo and/or enhanced documentation. Affects: dcmsr/include/dsrdoctr.h dcmsr/include/dsrtree.h dcmsr/include/dsrtypes.h **** Changes from 2002.04.10 (eichelberg) - Updated perl script to reflect language spec change in Perl 5.6.x Thanks to Rada Hussein for the bug report Affects: wlistctn/perl/write.ph **** Changes from 2002.03.15 (eichelberg) - Fixed incorrect debug message. Thanks to Gilles Mével for the bug report and fix. Affects: dcmdata/libsrc/dcsequen.cc **** Changes from 2002.02.27 (eichelberg) - Changed initialized() methods to const. Fixed some return values when compiled without thread support. Affects: ofstd/include/ofthread.h ofstd/libsrc/ofthread.cc - Declare dcmdata read/write locks only when compiled in multi-thread mode Affects: dcmdata/include/dccodec.h dcmdata/include/dcdict.h dcmdata/libsrc/dccodec.cc dcmdata/libsrc/dcdict.cc **** Changes from 2002.01.29 (riesmeier) - Added optional flag to the "Windows DIB" methods allowing to switch off the scanline padding. Affects: dcmimgle/include/dcmimage.h dcmimgle/include/diimage.h dcmimgle/include/dimoimg.h dcmimgle/libsrc/dimoimg.cc dcmimage/include/dicoimg.h dcmimage/include/dicopx.h dcmimage/include/dicopxt.h **** Changes from 2002.01.25 (riesmeier) - Fixed bug with unusual number of entries in the palette color look-up tables. Affects: dcmimage/libsrc/dipalimg.cc - Corrected wrong table spacing in the syntax output of the dcmquant tool. Affects: dcmimage/apps/dcmquant.cc dcmimage/docs/dcmquant.txt **** Changes from 2002.01.25 (eichelberg) - Initial release of new color quantization classes and the dcmquant tool in module dcmimage. Affects: dcmimage/apps/Makefile.dep dcmimage/apps/Makefile.in dcmimage/libsrc/Makefile.dep dcmimage/libsrc/Makefile.in Added: dcmimage/apps/dcmquant.cc dcmimage/docs/dcmquant.txt dcmimage/include/diqtcmap.h dcmimage/include/diqtctab.h dcmimage/include/diqtfs.h dcmimage/include/diqthash.h dcmimage/include/diqthitl.h dcmimage/include/diqthitm.h dcmimage/include/diqtid.h dcmimage/include/diqtpbox.h dcmimage/include/diqtpix.h dcmimage/include/diqtstab.h dcmimage/include/diqttype.h dcmimage/include/diquant.h dcmimage/libsrc/diqtctab.cc dcmimage/libsrc/diqtfs.cc dcmimage/libsrc/diqthash.cc dcmimage/libsrc/diqthitl.cc dcmimage/libsrc/diqtpbox.cc dcmimage/libsrc/diquant.cc - Added reference to Jef Poskanzer for the color quantization code in dcmimage Affects: COPYRIGHT - Fixed minor bug in code that converts a DICOM object to secondary capture Affects: dcmjpeg/libsrc/djcodece.cc **** Changes from 2002.01.11 (riesmeier) - Added new option to dcmdump tool which prints a header with the filename. Affects: dcmdata/apps/dcmdump.cc dcmdata/docs/dcmdump.txt - Made spelling of option --print-filename consistent with other tools. Affects: dcmsr/apps/dsrdump.cc dcmsr/docs/dsrdump.txt **** Changes from 2002.01.08 (riesmeier) - Added new module "dcmwlm" developed by Thomas Wilkens (initial release for Windows, dated 2001-12-20). Added: dcmwlm/Makefile.in dcmwlm/apps/Makefile.dep dcmwlm/apps/Makefile.in dcmwlm/apps/wlmceng.cc dcmwlm/apps/wlmceng.h dcmwlm/apps/wlmscpdb.cc dcmwlm/apps/wlmscpdb.dsp dcmwlm/apps/wlmscpfs.cc dcmwlm/apps/wlmscpfs.dsp dcmwlm/docs/Makefile.in dcmwlm/include/Makefile.in dcmwlm/include/wldbim.h dcmwlm/include/wlds.h dcmwlm/include/wldsdb.h dcmwlm/include/wldsfs.h dcmwlm/include/wlmactmg.h dcmwlm/include/wltypdef.h dcmwlm/libsrc/Makefile.dep dcmwlm/libsrc/Makefile.in dcmwlm/libsrc/wldbim.cc dcmwlm/libsrc/wlds.cc dcmwlm/libsrc/wldsdb.cc dcmwlm/libsrc/wldsfs.cc dcmwlm/libsrc/wlmactmg.cc dcmwlm/tests/Makefile.in - Added preliminary database support using OTL interface library (modified by MC/JR on 2001-12-21). Added: dcmwlm/tests/dcmTagsStmt.txt dcmwlm/tests/searchStmt.txt Affects: dcmwlm/dcmwlm.dsp dcmwlm/apps/wlmscpdb.dsp dcmwlm/include/wldsfs.h dcmwlm/include/wldsdb.h dcmwlm/include/wldsdb.h dcmwlm/include/wlds.h dcmwlm/include/wldbim.h dcmwlm/libsrc/wlmactmg.cc dcmwlm/libsrc/wldsfs.cc dcmwlm/libsrc/wldsdb.cc dcmwlm/libsrc/wldbim.cc - Reworked database support after trials at the hospital (modfied by MC/JR on 2002-01-08). Added: dcmwlm/tests/pki.txt Affects: dcmwlm/apps/wlmscpdb.dsp dcmwlm/apps/wlmceng.h dcmwlm/apps/wlmceng.cc dcmwlm/include/wlmactmg.h dcmwlm/include/wldsdb.h dcmwlm/include/wldbim.h dcmwlm/libsrc/wlmactmg.cc dcmwlm/libsrc/wldsdb.cc dcmwlm/tests/dcmTagsStmt.txt - Reformatted source files (replaced Windows newlines by Unix ones, replaced tabulator characters by spaces, etc.) Affects: dcmwlm/apps/wlmceng.cc dcmwlm/apps/wlmceng.h dcmwlm/apps/wlmscpdb.cc dcmwlm/apps/wlmscpfs.cc dcmwlm/include/wldbim.h dcmwlm/include/wlds.h dcmwlm/include/wldsdb.h dcmwlm/include/wldsfs.h dcmwlm/include/wlmactmg.h dcmwlm/include/wltypdef.h dcmwlm/libsrc/wldbim.cc dcmwlm/libsrc/wlds.cc dcmwlm/libsrc/wldsdb.cc dcmwlm/libsrc/wldsfs.cc dcmwlm/libsrc/wlmactmg.cc - Minor adaptations to keep the gcc compiler on Linux and Solaris happy. Currently only the "file version" of the worklist SCP is supported on Unix systems. Affects: dcmwlm/apps/Makefile.dep dcmwlm/apps/Makefile.in dcmwlm/include/wlmactmg.h dcmwlm/libsrc/Makefile.dep dcmwlm/libsrc/Makefile.in dcmwlm/libsrc/wldbim.cc dcmwlm/libsrc/wldsfs.cc dcmwlm/libsrc/wlmactmg.cc - Modified MSVC project files to work with current dcmtk version. Affects: dcmtk/dcmwlm/dcmwlm.dsp dcmwlm/apps/wlmscpdb.dsp dcmwlm/apps/wlmscpfs.dsp - Moved old announcement and change log for release 3.5.1 to docs. Removed: ANNOUNCE.351 CHANGES.351 Added: docs/ANNOUNCE.351 docs/CHANGES.351 - Created new change log. Added: CHANGES.352 - Corrected spelling of function dcmGenerateUniqueIdentifier(). Affects: dcmsr/libsrc/dsrdoc.cc dcmnet/apps/storescu.cc dcmsign/libsrc/dcmsign.cc dcmjpeg/libsrc/djcodecd.cc dcmjpeg/libsrc/djcodece.cc dcmpstat/apps/dcmpsrcv.cc dcmpstat/apps/dcmpssnd.cc dcmpstat/include/dvpsdef.h dcmpstat/libsrc/dviface.cc dcmpstat/libsrc/dvpsib.cc dcmpstat/libsrc/dvpsibl.cc dcmpstat/libsrc/dvpspll.cc dcmpstat/libsrc/dvpsprt.cc dcmpstat/libsrc/dvpssp.cc dcmpstat/libsrc/dvpstat.cc dcmdata/include/dcuid.h dcmdata/libsrc/dcfilefo.cc - Changed prefix of UIDs created for series and studies (now using constants SITE_SERIES_UID_ROOT and SITE_STUDY_UID_ROOT which are supposed to be used in these cases). Affects: dcmsr/libsrc/dsrdoc.cc dcmjpeg/libsrc/djcodece.cc dcmpstat/libsrc/dviface.cc dcmpstat/libsrc/dvpsprt.cc dcmpstat/libsrc/dvpssp.cc dcmpstat/libsrc/dvpstat.cc - Added general purpose class which computes a CRC32 checksum on arbitrary data. Added: ofstd/include/ofcrc32.h ofstd/libsrc/ofcrc32.cc Affects: ofstd/libsrc/Makefile.dep ofstd/libsrc/Makefile.in dcmdata/libsrc/Makefile.dep - Enhanced algorithm to create unique identifiers (i.e. a unique suffix for DICOM UIDs) on Windows systems where gethostid() is not available. Fixed some minor inconsistencies regarding the creation of unique identifiers. Affects: dcmdata/libsrc/dcuid.cc - Added comment about another reserved UID root (for OFFIS GO-Kard project). Affects: dcmdata/include/dcuid.h - Rebuilt makefile dependencies. Affects: dcmdata/apps/Makefile.dep - Added new module "dcmwlm". Affects: dcmdata/include/dcerror.h dcmtk-3.6.0/configure0000755000310500011400000000143411250154437013752 0ustar joergrdicom3#! /bin/sh if test -d config ; then if test -f config/modules ; then tmp=`cat config/modules` modules=`ls -d $tmp` else for dir in `ls`; do if test -d $dir ; then modules="$modules $dir" fi done fi modules=`echo $modules | sed -e "s/config//g" | sed -e "s/CVS//g"` modules="config $modules doxygen" else echo "Cannot find configure directory (config or ../config)" exit 1 fi if test "x--help" = "x$*"; then config/configure --help elif test "x--help=short" = "x$*"; then config/configure --help=short elif test "x--help=recursive" = "x$*"; then config/configure --help=recursive elif test "x--version" = "x$*"; then config/configure --version else for module in $modules ; do echo "Running configure for module $module." (cd $module && ./configure $* ) done fi dcmtk-3.6.0/dcmpstat/0000755000310500011400000000000011511320677013661 5ustar joergrdicom3dcmtk-3.6.0/dcmpstat/jni/0000755000310500011400000000000011511320677014441 5ustar joergrdicom3dcmtk-3.6.0/dcmpstat/jni/Makefile.in0000644000310500011400000000703610721574101016507 0ustar joergrdicom3# # Makefile for dcmpstat/jni # # This makefile requires changes specific for the operating system # and compiler that are not automatically adjusted by "configure". # # In addition, the CXXFLAGS in config/Makefile.def must be adjusted # _before_ compiling dcmtk to create position independent code # (e.g. -fPIC for gcc, -PIC for Sun CC) # @SET_MAKE@ SHELL = /bin/sh VPATH = @srcdir@:@top_srcdir@/include:@top_srcdir@/@configdir@/include srcdir = @srcdir@ top_srcdir = @top_srcdir@ configdir = @top_srcdir@/@configdir@ include $(configdir)/@common_makefile@ # # Settings for Solaris 2.x with Sun CC 4.2 compiler # javainc = -I/usr/java1.3/include -I/usr/java1.3/include/solaris soflags = -G solibs = -lC # # Settings for Linux (glibc) with gcc 2.95 (and above) compiler # # Include files for Sun J2SE 1.3, Blackdown JDK 1.2 or IBM JDK 1.3 # javainc = -I/usr/lib/SunJava2/include -I/usr/lib/SunJava2/include/linux # javainc = -I/usr/jdk1.2/include -I/usr/jdk1.2/include/linux # javainc = -I/opt/IBMJava2-13/include # soflags = -shared ofstddir = $(top_srcdir)/../ofstd ofstdinc = -I$(ofstddir)/include ofstdlibdir = -L$(ofstddir)/libsrc ofstdlib = -lofstd dcmdatadir = $(top_srcdir)/../dcmdata dcmdatainc = -I$(dcmdatadir)/include dcmdatalibdir = -L$(dcmdatadir)/libsrc dcmdatalib = -ldcmdata dcmnetdir = $(top_srcdir)/../dcmnet dcmnetinc = -I$(dcmnetdir)/include dcmnetlibdir = -L$(dcmnetdir)/libsrc dcmnetlib = -ldcmnet dcmimgledir = $(top_srcdir)/../dcmimgle dcmimgleinc = -I$(dcmimgledir)/include dcmimglelibdir = -L$(dcmimgledir)/libsrc dcmimglelib = -ldcmimgle dcmpstatdir = $(top_srcdir)/../dcmpstat dcmpstatinc = -I$(dcmpstatdir)/include dcmpstatlibdir = -L$(dcmpstatdir)/libsrc dcmpstatlib = -ldcmpstat dcmqrdbdir = $(top_srcdir)/../dcmqrdb dcmqrdbinc = -I$(dcmqrdbdir)/include dcmqrdblibdir = -L$(dcmqrdbdir)/libsrc dcmqrdblib = -ldcmqrdb dcmsigndir = $(top_srcdir)/../dcmsign dcmsigninc = -I$(dcmsigndir)/include dcmsignlibdir = -L$(dcmsigndir)/libsrc dcmsignlib = -ldcmdsig dcmsrdir = $(top_srcdir)/../dcmsr dcmsrinc = -I$(dcmsrdir)/include dcmsrlibdir = -L$(dcmsrdir)/libsrc dcmsrlib = -ldcmsr dcmjpegdir = $(top_srcdir)/../dcmjpeg dcmjpeginc = -I$(dcmjpegdir)/include dcmjpeglibdir = -L$(dcmjpegdir)/libsrc -L$(dcmjpegdir)/libijg8 -L$(dcmjpegdir)/libijg12 \ -L$(dcmjpegdir)/libijg16 dcmjpeglib = -ldcmjpeg -lijg8 -lijg12 -lijg16 LOCALINCLUDES = $(dcmpstatinc) $(ofstdinc) $(dcmnetinc) $(dcmdatainc) $(dcmimgleinc) \ $(dcmqrdbinc) $(dcmsigninc) $(dcmsrinc) $(dcmjpeginc) $(javainc) LIBDIRS = -L$(top_srcdir)/libsrc $(dcmpstatlibdir) $(dcmqrdblibdir) $(dcmnetlibdir) \ $(dcmdatalibdir) $(ofstdlibdir) $(dcmimglelibdir) $(dcmsignlibdir) $(dcmsrlibdir) \ $(dcmjpeglibdir) LOCALLIBS = $(dcmpstatlib) $(dcmsrlib) $(dcmsignlib) $(dcmjpeglib) $(dcmimglelib) \ $(dcmqrdblib) $(dcmnetlib) $(dcmdatalib) $(ofstdlib) $(OPENSSLLIBS) $(solibs) objs = DVInterface.o DVPSGraphicObject.o DVPresentationState.o DVPSCurve.o \ DVPSTextObject.o DVPSStoredPrint.o DSRCodeValue.o DSRCompositeValue.o \ DSRDocument.o DSRDocumentTree.o DSRImageValue.o DSRNumericValue.o \ DSRSCoordValue.o DSRTCoordValue.o DSRWaveformValue.o library = libjInterface.so all: $(library) $(library): $(objs) $(CXX) $(CXXFLAGS) $(LDFLAGS) $(LIBDIRS) $(soflags) -o $@ $(objs) $(LOCALLIBS) $(LIBS) install: all $(configdir)/mkinstalldirs $(DESTDIR)$(libdir) $(INSTALL_DATA) $(library) $(DESTDIR)$(libdir)/$(library) clean: rm -f $(objs) $(library) $(TRASH) distclean: rm -f $(objs) $(library) $(DISTTRASH) dependencies: $(CXX) -MM $(defines) $(includes) $(CPPFLAGS) $(CXXFLAGS) *.cc > $(DEP) include $(DEP) dcmtk-3.6.0/dcmpstat/jni/Makefile.dep0000644000310500011400000000000010224242256016632 0ustar joergrdicom3dcmtk-3.6.0/dcmpstat/jni/make_stub.sh0000755000310500011400000000027306766176765017003 0ustar joergrdicom3#!/bin/sh JAVA_HOME=/usr/java1.2 JAVA_JNI_LIB_DIR=. JAVA_MAINCLASS=DICOMscope OUTFILE=DICOMscope /usr/java1.2/bin/javald -H $JAVA_HOME -o $OUTFILE -R $JAVA_JNI_LIB_DIR $JAVA_MAINCLASS dcmtk-3.6.0/dcmpstat/docs/0000755000310500011400000000000011511320677014611 5ustar joergrdicom3dcmtk-3.6.0/dcmpstat/docs/dcmprscu.man0000644000310500011400000001672211412570104017126 0ustar joergrdicom3/*! \if MANPAGES \page dcmprscu Print spooler for presentation state viewer \else \page dcmprscu dcmprscu: Print spooler for presentation state viewer \endif \section synopsis SYNOPSIS \verbatim dcmprscu [options] [dcmfile-in...] \endverbatim \section description DESCRIPTION The \b dcmprscu utility implements the DICOM Basic Grayscale Print Management Service Class as SCU. It also supports the optional Basic Annotation Box and Presentation LUT SOP Classes. The utility is intended for use within the DICOMscope viewer. The \b dcmprscu utility takes complete print jobs consisting of a Stored Print object and one or more Hardcopy Grayscale objects and spools them to the printer. No attempt is made to check whether the attributes defined in the Stored Print object are supported by the Print SCP. However, the print spooler will not attempt to use the optional Annotation or Presentation LUT services if they are not successfully negotiated with the Print SCP. The \b dcmprscu utility reads the characteristics of the printer to communicate with from the configuration file. Depending on the printer's support for Presentation LUT, any Presentation LUT present in the print job will be rendered into the hardcopy images before they are spooled to the printer if necessary. If the printer does not support image transmission with 12 bits/pixel (as per the configuration file), the grayscale hardcopy images are down-sampled to 8 bits/pixel before transmission to the printer. The \b dcmprscu utility can be run either in "printer mode", in which case the file name of a Stored Print object must be passed, or in "spool mode", in which case commands are read periodically from a spool directory. \section parameters PARAMETERS \verbatim dcmfile-in stored print file(s) to be spooled \endverbatim \section options OPTIONS \subsection general_options general options \verbatim -h --help print this help text and exit --version print version information and exit --arguments print expanded command line arguments -q --quiet quiet mode, print no warnings and errors -v --verbose verbose mode, print processing details -d --debug debug mode, print debug information -ll --log-level [l]evel: string constant (fatal, error, warn, info, debug, trace) use level l for the logger -lc --log-config [f]ilename: string use config file f for the logger \endverbatim \subsection print_options print options \verbatim --noprint do not create print-out (no n-action-rq) --session-print send film session n-action-rq (instead of film box) --monochrome1 transmit basic grayscale images in MONOCHROME1 \endverbatim \subsection mode_options mode options \verbatim +p --print printer mode, print file(s) and terminate (default) +s --spool [n]ame: string spooler mode, use job prefix n \endverbatim \subsection processing_options processing options \verbatim -c --config [f]ilename: string process using settings from configuration file -p --printer [n]ame: string (default: 1st printer in cfg file) select printer with identifier n from cfg file +d --dump dump all DIMSE messages \endverbatim \subsection spooler_options spooler options (only with --spool) \verbatim --sleep [d]elay: integer (default: 1) sleep d seconds between spooler checks \endverbatim \subsection film_session_options basic film session options (not with --spool): \verbatim --copies [v]alue: integer (1..100, default: 1) set number of copies to v --medium-type [v]alue: string set medium type to v --destination [v]alue: string set film destination to v --label [v]alue: string set film session label to v --priority [v]alue: string set print priority to v --owner [v]alue: string set film session owner ID to v \endverbatim \section logging LOGGING The level of logging output of the various command line tools and underlying libraries can be specified by the user. By default, only errors and warnings are written to the standard error stream. Using option \e --verbose also informational messages like processing details are reported. Option \e --debug can be used to get more details on the internal activity, e.g. for debugging purposes. Other logging levels can be selected using option \e --log-level. In \e --quiet mode only fatal errors are reported. In such very severe error events, the application will usually terminate. For more details on the different logging levels, see documentation of module "oflog". In case the logging output should be written to file (optionally with logfile rotation), to syslog (Unix) or the event log (Windows) option \e --log-config can be used. This configuration file also allows for directing only certain messages to a particular output stream and for filtering certain messages based on the module or application where they are generated. An example configuration file is provided in \/logger.cfg). \section command_line COMMAND LINE All command line tools use the following notation for parameters: square brackets enclose optional values (0-1), three trailing dots indicate that multiple values are allowed (1-n), a combination of both means 0 to n values. Command line options are distinguished from parameters by a leading '+' or '-' sign, respectively. Usually, order and position of command line options are arbitrary (i.e. they can appear anywhere). However, if options are mutually exclusive the rightmost appearance is used. This behaviour conforms to the standard evaluation rules of common Unix shells. In addition, one or more command files can be specified using an '@' sign as a prefix to the filename (e.g. \@command.txt). Such a command argument is replaced by the content of the corresponding text file (multiple whitespaces are treated as a single separator unless they appear between two quotation marks) prior to any further evaluation. Please note that a command file cannot contain another command file. This simple but effective approach allows to summarize common combinations of options/parameters and avoids longish and confusing command lines (an example is provided in file \/dumppat.txt). \section environment ENVIRONMENT The \b dcmprscu utility will attempt to load DICOM data dictionaries specified in the \e DCMDICTPATH environment variable. By default, i.e. if the \e DCMDICTPATH environment variable is not set, the file \/dicom.dic will be loaded unless the dictionary is built into the application (default for Windows). The default behaviour should be preferred and the \e DCMDICTPATH environment variable only used when alternative data dictionaries are required. The \e DCMDICTPATH environment variable has the same format as the Unix shell \e PATH variable in that a colon (":") separates entries. On Windows systems, a semicolon (";") is used as a separator. The data dictionary code will attempt to load each file specified in the \e DCMDICTPATH environment variable. It is an error if no data dictionary can be loaded. \section files FILES \/dcmpstat.cfg, \/printers.cfg - sample configuration files \section see_also SEE ALSO dcmprscp(1) \section copyright COPYRIGHT Copyright (C) 1999-2010 by OFFIS e.V., Escherweg 2, 26121 Oldenburg, Germany. */ dcmtk-3.6.0/dcmpstat/docs/dcmpssnd.man0000644000310500011400000001304411455570725017133 0ustar joergrdicom3/*! \if MANPAGES \page dcmpssnd Network send for presentation state viewer \else \page dcmpssnd dcmpssnd: Network send for presentation state viewer \endif \section synopsis SYNOPSIS \verbatim dcmpssnd [options] config-file target study [series] [instance] \endverbatim \section description DESCRIPTION The \b dcmpssnd application is invoked by the Grayscale Softcopy Presentation State Viewer and is not intended to be invoked manually. The application reads the common configuration file which is shared between the different components of the viewer, attempts to establish a DICOM association with the selected target and, if successful, selects the required DICOM instances from the viewer's database and transmits them using the DICOM storage service class, which is supported as SCU. When transmission is finished (successfully or unsuccessfully), the application terminates. This application supports the same storage SOP classes as the \b storescu utility, but does not support encapsulated transfer syntaxes. See the full conformance statement for further details. \section parameters PARAMETERS \verbatim config-file configuration file to be read target symbolic identifier of send target in config file study study instance UID of study in database to be sent series series instance UID (default: send complete study) instance SOP instance UID (default: send complete series) \endverbatim \section options OPTIONS \subsection general_options general options \verbatim -h --help print this help text and exit --version print version information and exit --arguments print expanded command line arguments -q --quiet quiet mode, print no warnings and errors -v --verbose verbose mode, print processing details -d --debug debug mode, print debug information -ll --log-level [l]evel: string constant (fatal, error, warn, info, debug, trace) use level l for the logger -lc --log-config [f]ilename: string use config file f for the logger \endverbatim \section logging LOGGING The level of logging output of the various command line tools and underlying libraries can be specified by the user. By default, only errors and warnings are written to the standard error stream. Using option \e --verbose also informational messages like processing details are reported. Option \e --debug can be used to get more details on the internal activity, e.g. for debugging purposes. Other logging levels can be selected using option \e --log-level. In \e --quiet mode only fatal errors are reported. In such very severe error events, the application will usually terminate. For more details on the different logging levels, see documentation of module "oflog". In case the logging output should be written to file (optionally with logfile rotation), to syslog (Unix) or the event log (Windows) option \e --log-config can be used. This configuration file also allows for directing only certain messages to a particular output stream and for filtering certain messages based on the module or application where they are generated. An example configuration file is provided in \/logger.cfg). \section command_line COMMAND LINE All command line tools use the following notation for parameters: square brackets enclose optional values (0-1), three trailing dots indicate that multiple values are allowed (1-n), a combination of both means 0 to n values. Command line options are distinguished from parameters by a leading '+' or '-' sign, respectively. Usually, order and position of command line options are arbitrary (i.e. they can appear anywhere). However, if options are mutually exclusive the rightmost appearance is used. This behaviour conforms to the standard evaluation rules of common Unix shells. In addition, one or more command files can be specified using an '@' sign as a prefix to the filename (e.g. \@command.txt). Such a command argument is replaced by the content of the corresponding text file (multiple whitespaces are treated as a single separator unless they appear between two quotation marks) prior to any further evaluation. Please note that a command file cannot contain another command file. This simple but effective approach allows to summarize common combinations of options/parameters and avoids longish and confusing command lines (an example is provided in file \/dumppat.txt). \section environment ENVIRONMENT The \b dcmpssnd utility will attempt to load DICOM data dictionaries specified in the \e DCMDICTPATH environment variable. By default, i.e. if the \e DCMDICTPATH environment variable is not set, the file \/dicom.dic will be loaded unless the dictionary is built into the application (default for Windows). The default behaviour should be preferred and the \e DCMDICTPATH environment variable only used when alternative data dictionaries are required. The \e DCMDICTPATH environment variable has the same format as the Unix shell \e PATH variable in that a colon (":") separates entries. On Windows systems, a semicolon (";") is used as a separator. The data dictionary code will attempt to load each file specified in the \e DCMDICTPATH environment variable. It is an error if no data dictionary can be loaded. \section files FILES \/dcmpstat.cfg - sample configuration file \section see_also SEE ALSO dcmpsrcv(1), storescu(1) \section copyright COPYRIGHT Copyright (C) 1998-2010 by OFFIS e.V., Escherweg 2, 26121 Oldenburg, Germany. */ dcmtk-3.6.0/dcmpstat/docs/dcmpsprt.man0000644000310500011400000002335511464535564017164 0ustar joergrdicom3/*! \if MANPAGES \page dcmpsprt Read DICOM images and presentation states and render print job \else \page dcmpsprt dcmpsprt: Read DICOM images and presentation states and render print job \endif \section synopsis SYNOPSIS \verbatim dcmpsprt [options] dcmfile-in... \endverbatim \section description DESCRIPTION The \b dcmpsprt utility reads one or more DICOM images and presentation states and creates a print job. The print job consists of one Stored Print object and one or more Hardcopy Grayscale images and is written to the database specified in the configuration file. The print job can optionally be spooled to the printer. In this case, \b dcmpsprt calls the \b dcmprscu application which performs communication with the printer. \section parameters PARAMETERS \verbatim dcmfile-in DICOM image file(s) to be printed \endverbatim \section options OPTIONS \subsection general_options general options \verbatim -h --help print this help text and exit --version print version information and exit --arguments print expanded command line arguments -q --quiet quiet mode, print no warnings and errors -v --verbose verbose mode, print processing details -d --debug debug mode, print debug information -ll --log-level [l]evel: string constant (fatal, error, warn, info, debug, trace) use level l for the logger -lc --log-config [f]ilename: string use config file f for the logger \endverbatim \subsection processing_options processing options \verbatim +p --pstate [p]state file: string render the following image with presentation state p (this option can be specified multiple times) -c --config [f]ilename: string process using settings from configuration file f -p --printer [n]ame: string (default: 1st printer in cfg file) select printer with identifier n from cfg file \endverbatim \subsection spooling_options spooling options \verbatim -s --spool spool print job to DICOM printer --nospool do not spool print job to DICOM printer (default) \endverbatim \subsection film_orientation_options film orientation options \verbatim --portrait set portrait orientation --landscape set landscape orientation --default-orientation use printer default (default) \endverbatim \subsection trim_border_options trim (border) options \verbatim --trim set trim on --no-trim set trim off --default-trim use printer default (default) \endverbatim \subsection behaviour_options requested decimate/crop behaviour options \verbatim --request-decimate request decimate --request-crop request crop --request-fail request failure --default-request use printer default (default) \endverbatim \subsection print_presentation_LUT_options print presentation LUT options \verbatim --default-plut do not create presentation LUT (default) --identity set IDENTITY presentation LUT shape --plut [l]ut identifier: string add LUT l to print job --inverse-plut render the inverse presentation LUT into the bitmap of the hardcopy grayscale image --illumination [v]alue: integer (0..65535) set illumination to v (in cd/m^2) --reflection [v]alue: integer (0..65535) set reflected ambient light to v (in cd/m^2) \endverbatim \subsection film_options basic film session options (only with --spool) \verbatim --copies [v]alue: integer (1..100, default: 1) set number of copies to v --medium-type [v]alue: string set medium type to v --destination [v]alue: string set film destination to v --label [v]alue: string set film session label to v --priority [v]alue: string set print priority to v --owner [v]alue: string set film session owner ID to v \endverbatim \subsection annotation_options annotation options \verbatim --no-annotation do not create annotation (default) -a --annotation [t]ext: string create annotation with text t +pd --print-date prepend date/time to annotation (default) -pd --print-no-date do not prepend date/time to annotation +pn --print-name prepend printer name to annotation (default) -pn --print-no-name do not prepend printer name to annotation +pl --print-lighting prepend illumination to annotation (default) -pl --print-no-lighting do not prepend illumination to annotation \endverbatim \subsection overlay_options overlay options \verbatim +O --overlay [f]ilename: string, [x] [y]: integer load overlay data from PBM file f and display at position (x,y) +Og --ovl-graylevel [v]alue: integer (0..4095) use overlay gray level v (default: 4095 = white) \endverbatim \subsection other_print_options \verbatim -l --layout [c]olumns [r]ows: integer (default: 1 1) use 'STANDARD\c,r' image display format --filmsize [v]alue: string set film size ID to v --magnification [v]alue: string set magnification type to v --smoothing [v]alue: string set smoothing type to v --configinfo [v]alue: string set configuration information to v --resolution [v]alue: string set requested resolution ID to v --border [v]alue: string set border density to v --empty-image [v]alue: string set empty image density to v --max-density [v]alue: string set max density to v --min-density [v]alue: string set min density to v --img-polarity [v]alue: string set image box polarity to v (NORMAL or REVERSE) --img-request-size [v]alue: string set requested image size to v (width in mm) --img-magnification [v]alue: string set image box magnification type to v --img-smoothing [v]alue: string set image box smoothing type to v --img-configinfo [v]alue: string set image box configuration information to v \endverbatim \section logging LOGGING The level of logging output of the various command line tools and underlying libraries can be specified by the user. By default, only errors and warnings are written to the standard error stream. Using option \e --verbose also informational messages like processing details are reported. Option \e --debug can be used to get more details on the internal activity, e.g. for debugging purposes. Other logging levels can be selected using option \e --log-level. In \e --quiet mode only fatal errors are reported. In such very severe error events, the application will usually terminate. For more details on the different logging levels, see documentation of module "oflog". In case the logging output should be written to file (optionally with logfile rotation), to syslog (Unix) or the event log (Windows) option \e --log-config can be used. This configuration file also allows for directing only certain messages to a particular output stream and for filtering certain messages based on the module or application where they are generated. An example configuration file is provided in \/logger.cfg). \section command_line COMMAND LINE All command line tools use the following notation for parameters: square brackets enclose optional values (0-1), three trailing dots indicate that multiple values are allowed (1-n), a combination of both means 0 to n values. Command line options are distinguished from parameters by a leading '+' or '-' sign, respectively. Usually, order and position of command line options are arbitrary (i.e. they can appear anywhere). However, if options are mutually exclusive the rightmost appearance is used. This behaviour conforms to the standard evaluation rules of common Unix shells. In addition, one or more command files can be specified using an '@' sign as a prefix to the filename (e.g. \@command.txt). Such a command argument is replaced by the content of the corresponding text file (multiple whitespaces are treated as a single separator unless they appear between two quotation marks) prior to any further evaluation. Please note that a command file cannot contain another command file. This simple but effective approach allows to summarize common combinations of options/parameters and avoids longish and confusing command lines (an example is provided in file \/dumppat.txt). \section environment ENVIRONMENT The \b dcmpsprt utility will attempt to load DICOM data dictionaries specified in the \e DCMDICTPATH environment variable. By default, i.e. if the \e DCMDICTPATH environment variable is not set, the file \/dicom.dic will be loaded unless the dictionary is built into the application (default for Windows). The default behaviour should be preferred and the \e DCMDICTPATH environment variable only used when alternative data dictionaries are required. The \e DCMDICTPATH environment variable has the same format as the Unix shell \e PATH variable in that a colon (":") separates entries. On Windows systems, a semicolon (";") is used as a separator. The data dictionary code will attempt to load each file specified in the \e DCMDICTPATH environment variable. It is an error if no data dictionary can be loaded. \section files FILES \/dcmpstat.cfg, \/printers.cfg - sample configuration files \section see_also SEE ALSO dcmprscu(1) \section copyright COPYRIGHT Copyright (C) 1999-2010 by OFFIS e.V., Escherweg 2, 26121 Oldenburg, Germany. */ dcmtk-3.6.0/dcmpstat/docs/dcmpsrcv.man0000644000310500011400000001230411455570725017137 0ustar joergrdicom3/*! \if MANPAGES \page dcmpsrcv Network receive for presentation state viewer \else \page dcmpsrcv dcmpsrcv: Network receive for presentation state viewer \endif \section synopsis SYNOPSIS \verbatim dcmpsrcv [options] config-file \endverbatim \section description DESCRIPTION The \b dcmpsrcv application is invoked by the Grayscale Softcopy Presentation State Viewer and is not intended to be invoked manually. The application reads the common configuration file which is shared between the different components of the viewer and opens a TCP/IP socket on which incoming association requests are accepted. The application sparks a separate process for each DICOM connection. It supports the same storage SOP classes as the \b storescp utility as SCP, but does not support encapsulated transfer syntaxes. Incoming images are stored in the common viewer database. See the full conformance statement for further details. \section parameters PARAMETERS \verbatim config-file configuration file to be read \endverbatim \section options OPTIONS \subsection general_options general options \verbatim -h --help print this help text and exit --version print version information and exit --arguments print expanded command line arguments -q --quiet quiet mode, print no warnings and errors -v --verbose verbose mode, print processing details -d --debug debug mode, print debug information -ll --log-level [l]evel: string constant (fatal, error, warn, info, debug, trace) use level l for the logger -lc --log-config [f]ilename: string use config file f for the logger -t --terminate terminate all running receivers \endverbatim \section logging LOGGING The level of logging output of the various command line tools and underlying libraries can be specified by the user. By default, only errors and warnings are written to the standard error stream. Using option \e --verbose also informational messages like processing details are reported. Option \e --debug can be used to get more details on the internal activity, e.g. for debugging purposes. Other logging levels can be selected using option \e --log-level. In \e --quiet mode only fatal errors are reported. In such very severe error events, the application will usually terminate. For more details on the different logging levels, see documentation of module "oflog". In case the logging output should be written to file (optionally with logfile rotation), to syslog (Unix) or the event log (Windows) option \e --log-config can be used. This configuration file also allows for directing only certain messages to a particular output stream and for filtering certain messages based on the module or application where they are generated. An example configuration file is provided in \/logger.cfg). \section command_line COMMAND LINE All command line tools use the following notation for parameters: square brackets enclose optional values (0-1), three trailing dots indicate that multiple values are allowed (1-n), a combination of both means 0 to n values. Command line options are distinguished from parameters by a leading '+' or '-' sign, respectively. Usually, order and position of command line options are arbitrary (i.e. they can appear anywhere). However, if options are mutually exclusive the rightmost appearance is used. This behaviour conforms to the standard evaluation rules of common Unix shells. In addition, one or more command files can be specified using an '@' sign as a prefix to the filename (e.g. \@command.txt). Such a command argument is replaced by the content of the corresponding text file (multiple whitespaces are treated as a single separator unless they appear between two quotation marks) prior to any further evaluation. Please note that a command file cannot contain another command file. This simple but effective approach allows to summarize common combinations of options/parameters and avoids longish and confusing command lines (an example is provided in file \/dumppat.txt). \section environment ENVIRONMENT The \b dcmpsrcv utility will attempt to load DICOM data dictionaries specified in the \e DCMDICTPATH environment variable. By default, i.e. if the \e DCMDICTPATH environment variable is not set, the file \/dicom.dic will be loaded unless the dictionary is built into the application (default for Windows). The default behaviour should be preferred and the \e DCMDICTPATH environment variable only used when alternative data dictionaries are required. The \e DCMDICTPATH environment variable has the same format as the Unix shell \e PATH variable in that a colon (":") separates entries. On Windows systems, a semicolon (";") is used as a separator. The data dictionary code will attempt to load each file specified in the \e DCMDICTPATH environment variable. It is an error if no data dictionary can be loaded. \section files FILES \/dcmpstat.cfg - sample configuration file \section see_also SEE ALSO dcmpssnd(1), storescp(1) \section copyright COPYRIGHT Copyright (C) 1998-2010 by OFFIS e.V., Escherweg 2, 26121 Oldenburg, Germany. */ dcmtk-3.6.0/dcmpstat/docs/dcmpschk.man0000644000310500011400000001301111455570725017106 0ustar joergrdicom3/*! \if MANPAGES \page dcmpschk Checking tool for presentation states \else \page dcmpschk dcmpschk: Checking tool for presentation states \endif \section synopsis SYNOPSIS \verbatim dcmpschk [options] [dcmfile-in...] \endverbatim \section description DESCRIPTION The \b dcmpschk utility checks DICOM Grayscale Softcopy Presentation State objects for conformance with the standard. The test is performed in three phases: \li Phase 1 checks the Meta-header of the DICOM file. It is tested whether all required attributes are present, whether the SOP class and instance UIDs match the UIDs in the main object and whether the group length attribute contains a correct value. The Transfer Syntax of the Meta header is also checked. \li Phase 2 performs a syntactic check of the values, value representations and value multiplicities for each attribute in the object. The values present in the object under test are compared with the definitions of the DICOM data dictionary. \li Phase 3 performs a semantic check of the integrity of the Presentation State. This phase is omitted when objects of other SOP Classes are encountered. Phase 1 and 2 can also be applied to other DICOM objects of arbitrary SOP class. It should be noted that \b dcmpschk does not support Presentation States which contain the Mask Module. These will be rejected with a message that the Mask Module is not supported. \section parameters PARAMETERS \verbatim dcmfile-in presentation state file(s) to be checked \endverbatim \section options OPTIONS \subsection general_options general options \verbatim -h --help print this help text and exit --version print version information and exit --arguments print expanded command line arguments -q --quiet quiet mode, print no warnings and errors -v --verbose verbose mode, print processing details -d --debug debug mode, print debug information -ll --log-level [l]evel: string constant (fatal, error, warn, info, debug, trace) use level l for the logger -lc --log-config [f]ilename: string use config file f for the logger \endverbatim \section logging LOGGING The level of logging output of the various command line tools and underlying libraries can be specified by the user. By default, only errors and warnings are written to the standard error stream. Using option \e --verbose also informational messages like processing details are reported. Option \e --debug can be used to get more details on the internal activity, e.g. for debugging purposes. Other logging levels can be selected using option \e --log-level. In \e --quiet mode only fatal errors are reported. In such very severe error events, the application will usually terminate. For more details on the different logging levels, see documentation of module "oflog". In case the logging output should be written to file (optionally with logfile rotation), to syslog (Unix) or the event log (Windows) option \e --log-config can be used. This configuration file also allows for directing only certain messages to a particular output stream and for filtering certain messages based on the module or application where they are generated. An example configuration file is provided in \/logger.cfg). \section command_line COMMAND LINE All command line tools use the following notation for parameters: square brackets enclose optional values (0-1), three trailing dots indicate that multiple values are allowed (1-n), a combination of both means 0 to n values. Command line options are distinguished from parameters by a leading '+' or '-' sign, respectively. Usually, order and position of command line options are arbitrary (i.e. they can appear anywhere). However, if options are mutually exclusive the rightmost appearance is used. This behaviour conforms to the standard evaluation rules of common Unix shells. In addition, one or more command files can be specified using an '@' sign as a prefix to the filename (e.g. \@command.txt). Such a command argument is replaced by the content of the corresponding text file (multiple whitespaces are treated as a single separator unless they appear between two quotation marks) prior to any further evaluation. Please note that a command file cannot contain another command file. This simple but effective approach allows to summarize common combinations of options/parameters and avoids longish and confusing command lines (an example is provided in file \/dumppat.txt). \section environment ENVIRONMENT The \b dcmpschk utility will attempt to load DICOM data dictionaries specified in the \e DCMDICTPATH environment variable. By default, i.e. if the \e DCMDICTPATH environment variable is not set, the file \/dicom.dic will be loaded unless the dictionary is built into the application (default for Windows). The default behaviour should be preferred and the \e DCMDICTPATH environment variable only used when alternative data dictionaries are required. The \e DCMDICTPATH environment variable has the same format as the Unix shell \e PATH variable in that a colon (":") separates entries. On Windows systems, a semicolon (";") is used as a separator. The data dictionary code will attempt to load each file specified in the \e DCMDICTPATH environment variable. It is an error if no data dictionary can be loaded. \section copyright COPYRIGHT Copyright (C) 2000-2010 by OFFIS e.V., Escherweg 2, 26121 Oldenburg, Germany. */ dcmtk-3.6.0/dcmpstat/docs/Makefile.in0000644000310500011400000000040010721573465016657 0ustar joergrdicom3# # Makefile for dcmpstat/docs # @SET_MAKE@ SHELL = /bin/sh srcdir = @srcdir@ top_srcdir = @top_srcdir@ configdir = @top_srcdir@/@configdir@ include $(configdir)/@common_makefile@ all: install: clean: rm -f $(TRASH) distclean: rm -f $(DISTTRASH) dcmtk-3.6.0/dcmpstat/docs/dcmpstat.dox0000644000310500011400000000431011251200611017124 0ustar joergrdicom3/*! \page mod_dcmpstat dcmpstat: a presentation state library and utility apps This module contains classes that implement a high-level API for the DICOM Softcopy Grayscale Presentation State Storage SOP Class. It also contains various support classes that are used by DICOMscope, a free DICOM viewer that has been developed as a demonstrator for presentation states. See http://dicom.offis.de/dscope The main interface classes are: \li \b DVPresentationState \li \b DVInterface \li \b DVPSStoredPrint \section Tools This module contains the following command line tools: \li \ref dcmmkcrv \li \ref dcmmklut \li \ref dcmp2pgm \li \ref dcmprscp \li \ref dcmprscu \li \ref dcmpschk \li \ref dcmpsmk \li \ref dcmpsprt \li \ref dcmpsrcv \li \ref dcmpssnd \section Examples The following example shows how to create a default presentation state for a DICOM image: \code DcmFileFormat infile; DcmFileFormat outfile; if (infile.loadFile("image.dcm").good()) { DVPresentationState pstate; // presentation state handler if (pstate.createFromImage(*infile.getDataset()).good()) { // serialize presentation state into DICOM data set structure if (pstate.write(*outfile.getDataset(), OFFalse).good()) { // and write to file outfile.saveFile("gsps.dcm", EXS_LittleEndianExplicit); } } } \endcode The following example shows how to apply the grayscale transformation pipeline from a presentation state to a DICOM image: \code DcmFileFormat imagefile; DcmFileFormat gspsfile; if (imagefile.loadFile("image.dcm").good() && gspsfile.loadFile("gsps.dcm").good()) { DVPresentationState pstate; // presentation state handler if (pstate.read(*gspsfile.getDataset()).good()) // parse gsps object { // attach presentation state to image data if (pstate.attachImage(&imagefile, OFFalse).good()) { const void *pixel; // pointer to pixel data, one byte per pixel unsigned long width; // width of image bitmap unsigned long height; // height of image bitmap if (pstate.getPixelData(pixel, width, height).good()) { /* do something useful with the pixel data */ } pstate.detachImage(); // release connection between GSPS and image } } } \endcode */ dcmtk-3.6.0/dcmpstat/docs/dcmpsmk.man0000644000310500011400000001701411455570725016757 0ustar joergrdicom3/*! \if MANPAGES \page dcmpsmk Create DICOM grayscale softcopy presentation state \else \page dcmpsmk dcmpsmk: Create DICOM grayscale softcopy presentation state \endif \section synopsis SYNOPSIS \verbatim dcmpsmk [options] dcmfile-in dcmfile-out \endverbatim \section description DESCRIPTION The \b dcmpsmk utility reads a DICOM image file and creates a grayscale softcopy presentation state object according to Supplement 33. The presentation state object is written back to file. A number of command line options allow to specify how certain constructs that might be present in the image file should be referenced or activated in the presentation state. The newly created presentation state references the source image and contains values that should allow for a "reasonable" display of the image when rendered under control of the presentation state. \section parameters PARAMETERS \verbatim dcmfile-in DICOM image file to be read dcmfile-out DICOM presentation state file to be created \endverbatim \section options OPTIONS \subsection general_options general options \verbatim -h --help print this help text and exit --version print version information and exit --arguments print expanded command line arguments -q --quiet quiet mode, print no warnings and errors -v --verbose verbose mode, print processing details -d --debug debug mode, print debug information -ll --log-level [l]evel: string constant (fatal, error, warn, info, debug, trace) use level l for the logger -lc --log-config [f]ilename: string use config file f for the logger \endverbatim \subsection input_options input optons \verbatim input file format: +f --read-file read file format or data set (default) +fo --read-file-only read file format only -f --read-dataset read data set without file meta information input transfer syntax: -t= --read-xfer-auto use TS recognition (default) -td --read-xfer-detect ignore TS specified in the file meta header -te --read-xfer-little read with explicit VR little endian TS -tb --read-xfer-big read with explicit VR big endian TS -ti --read-xfer-implicit read with implicit VR little endian TS \endverbatim \subsection processing_options processing options \verbatim VOI transform handling: +Vl --voi-lut use first VOI LUT if present (default) +Vw --voi-window use first window center/width if present -V --voi-ignore ignore VOI LUT and window center/width curve handling: +c --curve-activate activate curve data if present (default) -c --curve-ignore ignore curve data overlay handling: +oc --overlay-copy copy overlays if not embedded, activate otherwise (default) +oa --overlay-activate activate overlays -o --overlay-ignore ignore overlays shutter handling: +s --shutter-activate use shutter if present in image (default) -s --shutter-ignore ignore shutter presentation LUT shape handling: +p --plut-activate use presentation LUT shape if present (default) -p --plut-ignore ignore presentation LUT shape layering: +l1 --layer-single all curves and overlays are in one layer +l2 --layer-double one layer for curves, one for overlays (default) +ls --layer-separate separate layers for each curve and overlay location of referenced image: -lx --location-none image reference without location (default) -ln --location-network [a]etitle: string image located at application entity a -lm --location-media [f]ilesetID, fileset[UID]: string image located on storage medium \endverbatim \subsection output_options output options \verbatim output transfer syntax: +t= --write-xfer-same write with same TS as image file (default) +te --write-xfer-little write with explicit VR little endian TS +tb --write-xfer-big write with explicit VR big endian TS +ti --write-xfer-implicit write with implicit VR little endian TS \endverbatim \section logging LOGGING The level of logging output of the various command line tools and underlying libraries can be specified by the user. By default, only errors and warnings are written to the standard error stream. Using option \e --verbose also informational messages like processing details are reported. Option \e --debug can be used to get more details on the internal activity, e.g. for debugging purposes. Other logging levels can be selected using option \e --log-level. In \e --quiet mode only fatal errors are reported. In such very severe error events, the application will usually terminate. For more details on the different logging levels, see documentation of module "oflog". In case the logging output should be written to file (optionally with logfile rotation), to syslog (Unix) or the event log (Windows) option \e --log-config can be used. This configuration file also allows for directing only certain messages to a particular output stream and for filtering certain messages based on the module or application where they are generated. An example configuration file is provided in \/logger.cfg). \section command_line COMMAND LINE All command line tools use the following notation for parameters: square brackets enclose optional values (0-1), three trailing dots indicate that multiple values are allowed (1-n), a combination of both means 0 to n values. Command line options are distinguished from parameters by a leading '+' or '-' sign, respectively. Usually, order and position of command line options are arbitrary (i.e. they can appear anywhere). However, if options are mutually exclusive the rightmost appearance is used. This behaviour conforms to the standard evaluation rules of common Unix shells. In addition, one or more command files can be specified using an '@' sign as a prefix to the filename (e.g. \@command.txt). Such a command argument is replaced by the content of the corresponding text file (multiple whitespaces are treated as a single separator unless they appear between two quotation marks) prior to any further evaluation. Please note that a command file cannot contain another command file. This simple but effective approach allows to summarize common combinations of options/parameters and avoids longish and confusing command lines (an example is provided in file \/dumppat.txt). \section environment ENVIRONMENT The \b dcmpsmk utility will attempt to load DICOM data dictionaries specified in the \e DCMDICTPATH environment variable. By default, i.e. if the \e DCMDICTPATH environment variable is not set, the file \/dicom.dic will be loaded unless the dictionary is built into the application (default for Windows). The default behaviour should be preferred and the \e DCMDICTPATH environment variable only used when alternative data dictionaries are required. The \e DCMDICTPATH environment variable has the same format as the Unix shell \e PATH variable in that a colon (":") separates entries. On Windows systems, a semicolon (";") is used as a separator. The data dictionary code will attempt to load each file specified in the \e DCMDICTPATH environment variable. It is an error if no data dictionary can be loaded. \section copyright COPYRIGHT Copyright (C) 1998-2010 by OFFIS e.V., Escherweg 2, 26121 Oldenburg, Germany. */ dcmtk-3.6.0/dcmpstat/docs/dcmprscp.man0000644000310500011400000001315011455570724017130 0ustar joergrdicom3/*! \if MANPAGES \page dcmprscp DICOM basic grayscale print management SCP \else \page dcmprscp dcmprscp: DICOM basic grayscale print management SCP \endif \section synopsis SYNOPSIS \verbatim dcmprscp [options] \endverbatim \section description DESCRIPTION The \b dcmprscp utility implements the DICOM Basic Grayscale Print Management Service Class as SCP. It also supports the optional Presentation LUT SOP Class. The utility is intended for use within the DICOMscope viewer. The \b dcmprscp utility accepts print jobs from a remote Print SCU. It does not create real hardcopies but stores print jobs in the local DICOMscope database as a set of Stored Print objects (one per page) and Hardcopy Grayscale images (one per film box N-SET). The DICOMscope application allows to load a Stored Print object created by \b dcmprscp and to render a screen preview of the hardcopy. The \b dcmprscp utility reads the characteristics of the printer to be emulated from the configuration file. \section options OPTIONS \subsection general_options general options \verbatim -h --help print this help text and exit --version print version information and exit --arguments print expanded command line arguments -q --quiet quiet mode, print no warnings and errors -v --verbose verbose mode, print processing details -d --debug debug mode, print debug information -ll --log-level [l]evel: string constant (fatal, error, warn, info, debug, trace) use level l for the logger -lc --log-config [f]ilename: string use config file f for the logger -l --logfile write a log file (not with --log-config) # this option is available for reasons of backward # compatibility only \endverbatim \subsection processing_options processing options \verbatim -c --config [f]ilename: string process using settings from configuration file -p --printer [n]ame: string (default: 1st printer in config file) select printer with identifier n from config file +d --dump dump all DIMSE messages \endverbatim \section logging LOGGING The level of logging output of the various command line tools and underlying libraries can be specified by the user. By default, only errors and warnings are written to the standard error stream. Using option \e --verbose also informational messages like processing details are reported. Option \e --debug can be used to get more details on the internal activity, e.g. for debugging purposes. Other logging levels can be selected using option \e --log-level. In \e --quiet mode only fatal errors are reported. In such very severe error events, the application will usually terminate. For more details on the different logging levels, see documentation of module "oflog". In case the logging output should be written to file (optionally with logfile rotation), to syslog (Unix) or the event log (Windows) option \e --log-config can be used. This configuration file also allows for directing only certain messages to a particular output stream and for filtering certain messages based on the module or application where they are generated. An example configuration file is provided in \/logger.cfg). \section command_line COMMAND LINE All command line tools use the following notation for parameters: square brackets enclose optional values (0-1), three trailing dots indicate that multiple values are allowed (1-n), a combination of both means 0 to n values. Command line options are distinguished from parameters by a leading '+' or '-' sign, respectively. Usually, order and position of command line options are arbitrary (i.e. they can appear anywhere). However, if options are mutually exclusive the rightmost appearance is used. This behaviour conforms to the standard evaluation rules of common Unix shells. In addition, one or more command files can be specified using an '@' sign as a prefix to the filename (e.g. \@command.txt). Such a command argument is replaced by the content of the corresponding text file (multiple whitespaces are treated as a single separator unless they appear between two quotation marks) prior to any further evaluation. Please note that a command file cannot contain another command file. This simple but effective approach allows to summarize common combinations of options/parameters and avoids longish and confusing command lines (an example is provided in file \/dumppat.txt). \section environment ENVIRONMENT The \b dcmprscp utility will attempt to load DICOM data dictionaries specified in the \e DCMDICTPATH environment variable. By default, i.e. if the \e DCMDICTPATH environment variable is not set, the file \/dicom.dic will be loaded unless the dictionary is built into the application (default for Windows). The default behaviour should be preferred and the \e DCMDICTPATH environment variable only used when alternative data dictionaries are required. The \e DCMDICTPATH environment variable has the same format as the Unix shell \e PATH variable in that a colon (":") separates entries. On Windows systems, a semicolon (";") is used as a separator. The data dictionary code will attempt to load each file specified in the \e DCMDICTPATH environment variable. It is an error if no data dictionary can be loaded. \section files FILES \/dcmpstat.cfg, \/printers.cfg - sample configuration files \section see_also SEE ALSO dcmprscu(1) \section copyright COPYRIGHT Copyright (C) 1999-2010 by OFFIS e.V., Escherweg 2, 26121 Oldenburg, Germany. */ dcmtk-3.6.0/dcmpstat/docs/dcmmklut.man0000644000310500011400000002075711455570724017150 0ustar joergrdicom3/*! \if MANPAGES \page dcmmklut Create DICOM look-up tables \else \page dcmmklut dcmmklut: Create DICOM look-up tables \endif \section synopsis SYNOPSIS \verbatim dcmmklut [options] dcmimg-out \endverbatim \section description DESCRIPTION The \b dcmmklut utility allows to create a variety of DICOM Modality, Presentation and VOI look-up tables (LUT) and is intended for the creation of test images. The utility is able to read an existing DICOM image file, create a look up table according to the command line options, and write the new object back to file. It is also possible to create a new object containing the specified LUT without reading an existing DICOM image file. This is e.g. useful to simply store different look-up tables in a DICOM-like structure. As a default the output file is encoded with the same transfer syntax used for the input file, but the transfer syntax can also be specified as a command line option. The LUT data can be derived from the shape of a gamma curve (default for the gamma factor is 1) or imported from a file (currently the MAP format from Ulead's PhotoImpact and a simple text format are supported). The input and output width of the LUT can also be specified in the range allowed by the DICOM standard. The interpolation of the input range is done by a polynomial curve fitting algorithm. In addition to the DICOM output file the LUT data can also be exported to a tabbed text file which allows the easy visualization of the curves with a common spread sheet application (e.g. Microsoft Excel). \section parameters PARAMETERS \verbatim dcmimg-out DICOM output filename \endverbatim \section options OPTIONS \subsection general_options general options \verbatim -h --help print this help text and exit --version print version information and exit --arguments print expanded command line arguments -q --quiet quiet mode, print no warnings and errors -v --verbose verbose mode, print processing details -d --debug debug mode, print debug information -ll --log-level [l]evel: string constant (fatal, error, warn, info, debug, trace) use level l for the logger -lc --log-config [f]ilename: string use config file f for the logger \endverbatim \subsection lut_creation_options LUT creation options \verbatim LUT type: +Tm --modality create as Modality LUT +Tp --presentation create as Presentation LUT +Tv --voi create as VOI LUT (default) LUT placement: +Pa --add add to existing transform (default for and only with --voi) +Pr --replace replace existing transform (default for --modality and --presentation) LUT content: +Cg --gamma [g]amma: float use gamma value (default: 1.0) +Cm --map-file [f]ilename: string read input data from MAP file +Ct --text-file [f]ilename: string read input data from text file LUT options: +Og --inverse-gsdf apply inverse GSDF (print presentation LUT in OD) --min-density [v]alue: integer (0..65535, default: 20) set min density to v (in hundreds of OD) --max-density [v]alue: integer (0..65535, default: 300) set max density to v (in hundreds of OD) +Oi --illumination [v]alue: integer (0..65535, default: 2000) set illumination to v (in cd/m^2) +Or --reflection [v]alue: integer (0..65535, default: 10) set reflected ambient light to v (in cd/m^2) LUT structure: -b --bits [n]umber: integer create LUT with n bit values (8..16, default: 16) -e --entries [n]umber: integer create LUT with n entries (1..65536, default: 256) -f --first-mapped [n]umber: integer first input value mapped (-31768..65535, default: 0) -r --random [n]umber: unsigned integer perform n randomly selected permutations on the LUT -rs --random-seed [n]umber: unsigned integer initialize the random-number generator with n (default: 0, for reproducible results) -o --order [n]umber: integer use polynomial curve fitting algorithm with order n (0..99, default: 5) -E --explanation [n]ame: string LUT explanation (default: automatically created) LUT data alignment: -a --byte-align create byte-aligned LUT (default for and only with 8 bit values) +a --word-align create word-aligned LUT (default for 9-16 bit values) LUT data VR: +Dw --data-ow write LUT Data as OW (default) +Du --data-us write LUT Data as US +Ds --data-ss write LUT Data as SS (minimal support) \endverbatim \subsection file_options file options \verbatim +Fi --dicom-input [f]ilename: string read dataset from DICOM file f +Fo --text-output [f]ilename: string write LUT data to tabbed text file f \endverbatim \section notes NOTES Please check the DICOM standard for further restrictions on the look-up table structure. Especially the number of bits per table entry might be restricted in particular IODs. \section logging LOGGING The level of logging output of the various command line tools and underlying libraries can be specified by the user. By default, only errors and warnings are written to the standard error stream. Using option \e --verbose also informational messages like processing details are reported. Option \e --debug can be used to get more details on the internal activity, e.g. for debugging purposes. Other logging levels can be selected using option \e --log-level. In \e --quiet mode only fatal errors are reported. In such very severe error events, the application will usually terminate. For more details on the different logging levels, see documentation of module "oflog". In case the logging output should be written to file (optionally with logfile rotation), to syslog (Unix) or the event log (Windows) option \e --log-config can be used. This configuration file also allows for directing only certain messages to a particular output stream and for filtering certain messages based on the module or application where they are generated. An example configuration file is provided in \/logger.cfg). \section command_line COMMAND LINE All command line tools use the following notation for parameters: square brackets enclose optional values (0-1), three trailing dots indicate that multiple values are allowed (1-n), a combination of both means 0 to n values. Command line options are distinguished from parameters by a leading '+' or '-' sign, respectively. Usually, order and position of command line options are arbitrary (i.e. they can appear anywhere). However, if options are mutually exclusive the rightmost appearance is used. This behaviour conforms to the standard evaluation rules of common Unix shells. In addition, one or more command files can be specified using an '@' sign as a prefix to the filename (e.g. \@command.txt). Such a command argument is replaced by the content of the corresponding text file (multiple whitespaces are treated as a single separator unless they appear between two quotation marks) prior to any further evaluation. Please note that a command file cannot contain another command file. This simple but effective approach allows to summarize common combinations of options/parameters and avoids longish and confusing command lines (an example is provided in file \/dumppat.txt). \section environment ENVIRONMENT The \b dcmmklut utility will attempt to load DICOM data dictionaries specified in the \e DCMDICTPATH environment variable. By default, i.e. if the \e DCMDICTPATH environment variable is not set, the file \/dicom.dic will be loaded unless the dictionary is built into the application (default for Windows). The default behaviour should be preferred and the \e DCMDICTPATH environment variable only used when alternative data dictionaries are required. The \e DCMDICTPATH environment variable has the same format as the Unix shell \e PATH variable in that a colon (":") separates entries. On Windows systems, a semicolon (";") is used as a separator. The data dictionary code will attempt to load each file specified in the \e DCMDICTPATH environment variable. It is an error if no data dictionary can be loaded. \section files FILES \/philips.lut - sample LUT in text format \section copyright COPYRIGHT Copyright (C) 1998-2010 by OFFIS e.V., Escherweg 2, 26121 Oldenburg, Germany. */ dcmtk-3.6.0/dcmpstat/docs/dcmmkcrv.man0000644000310500011400000001460011455570724017124 0ustar joergrdicom3/*! \if MANPAGES \page dcmmkcrv Add 2D curve data to image \else \page dcmmkcrv dcmmkcrv: Add 2D curve data to image \endif \section synopsis SYNOPSIS \verbatim dcmmkcrv [options] dcmfile-in curvedata-in dcmfile-out \endverbatim \section description DESCRIPTION The \b dcmmkcrv utility allows to create DICOM images containing curve data. Since curve data is hardly used by vendors today, this is intended as a means to test implementations that can read curve data. The utility reads an existing DICOM image and a text file containing the curve data in textual form. A DICOM curve data repeating group is created according to the options specified on the command line, added to the existing image and written back to file. The output file is encoded with the same transfer syntax used for the input file. This utility only supports the creation of two-dimensional curves. \section parameters PARAMETERS \verbatim dcmfile-in DICOM input image file curvedata-in curve data input file (text) dcmfile-out DICOM output filename \endverbatim \section options OPTIONS \subsection general_options general options \verbatim -h --help print this help text and exit --version print version information and exit --arguments print expanded command line arguments -q --quiet quiet mode, print no warnings and errors -v --verbose verbose mode, print processing details -d --debug debug mode, print debug information -ll --log-level [l]evel: string constant (fatal, error, warn, info, debug, trace) use level l for the logger -lc --log-config [f]ilename: string use config file f for the logger \endverbatim \subsection curve_creation_options curve creation options \verbatim curve type: -r --poly create as POLY curve (default) +r --roi create as ROI curve curve value representation: +v --data-vr [n]umber: integer 0..4 (default: 4) select curve data VR: 0=US, 1=SS, 2=FL, 3=FD, 4=SL -c --curve-vr [n]umber: integer 0..2 (default: 0) select VR with which the Curve Data element is written 0=VR according to --data-vr, 1=OB, 2=OW repeating group: -g --group [n]umber: integer 0..15 (default: 0) select repeating group: 0=0x5000, 1=0x5002 etc. curve description: -l --label s: string set Curve Label to s (default: absent) +d --description s: string set Curve Description to s (default: absent) -a --axis x: string, y: string set Axis Units to x\y (default: absent) \endverbatim \section notes NOTES \subsection syntax_data_file Syntax of the Curve Data File The curve data file is expected to be a plain ASCII text file containing numbers (integer or floating point) comprising the values of the point coordinates. Numbers must be separated by whitespace. No checking of the value range or value range conversion is performed. Example: \verbatim 256.451947 1.000000 477.689863 128.822080 128.822080 477.689863 35.310137 128.822080 256.451947 1.000000 \endverbatim \section logging LOGGING The level of logging output of the various command line tools and underlying libraries can be specified by the user. By default, only errors and warnings are written to the standard error stream. Using option \e --verbose also informational messages like processing details are reported. Option \e --debug can be used to get more details on the internal activity, e.g. for debugging purposes. Other logging levels can be selected using option \e --log-level. In \e --quiet mode only fatal errors are reported. In such very severe error events, the application will usually terminate. For more details on the different logging levels, see documentation of module "oflog". In case the logging output should be written to file (optionally with logfile rotation), to syslog (Unix) or the event log (Windows) option \e --log-config can be used. This configuration file also allows for directing only certain messages to a particular output stream and for filtering certain messages based on the module or application where they are generated. An example configuration file is provided in \/logger.cfg). \section command_line COMMAND LINE All command line tools use the following notation for parameters: square brackets enclose optional values (0-1), three trailing dots indicate that multiple values are allowed (1-n), a combination of both means 0 to n values. Command line options are distinguished from parameters by a leading '+' or '-' sign, respectively. Usually, order and position of command line options are arbitrary (i.e. they can appear anywhere). However, if options are mutually exclusive the rightmost appearance is used. This behaviour conforms to the standard evaluation rules of common Unix shells. In addition, one or more command files can be specified using an '@' sign as a prefix to the filename (e.g. \@command.txt). Such a command argument is replaced by the content of the corresponding text file (multiple whitespaces are treated as a single separator unless they appear between two quotation marks) prior to any further evaluation. Please note that a command file cannot contain another command file. This simple but effective approach allows to summarize common combinations of options/parameters and avoids longish and confusing command lines (an example is provided in file \/dumppat.txt). \section environment ENVIRONMENT The \b dcmmkcrv utility will attempt to load DICOM data dictionaries specified in the \e DCMDICTPATH environment variable. By default, i.e. if the \e DCMDICTPATH environment variable is not set, the file \/dicom.dic will be loaded unless the dictionary is built into the application (default for Windows). The default behaviour should be preferred and the \e DCMDICTPATH environment variable only used when alternative data dictionaries are required. The \e DCMDICTPATH environment variable has the same format as the Unix shell \e PATH variable in that a colon (":") separates entries. On Windows systems, a semicolon (";") is used as a separator. The data dictionary code will attempt to load each file specified in the \e DCMDICTPATH environment variable. It is an error if no data dictionary can be loaded. \section copyright COPYRIGHT Copyright (C) 1998-2010 by OFFIS e.V., Escherweg 2, 26121 Oldenburg, Germany. */ dcmtk-3.6.0/dcmpstat/docs/dcmp2pgm.man0000644000310500011400000001365111455570724017034 0ustar joergrdicom3/*! \if MANPAGES \page dcmp2pgm Read DICOM image and presentation state and render bitmap \else \page dcmp2pgm dcmp2pgm: Read DICOM image and presentation state and render bitmap \endif \section synopsis SYNOPSIS \verbatim dcmp2pgm [options] dcmimage-in [bitmap-out] \endverbatim \section description DESCRIPTION The \b dcmp2pgm utility renders a monochrome DICOM image under the control of a grayscale softcopy presentation state object into a monochrome bitmap with 8 bits/pixel. The bitmap is stored either as "Portable Gray Map" (PGM) or as a DICOM secondary capture image object. If no presentation state is read from file, a default presentation state is created. The utility allows to read a configuration file of the Softcopy Presentation State Viewer upon startup. In this case, the settings from the configuration file affecting the rendering of the presentation state are used, e.g. a correction of the gray scale range according to Barten's model (DICOM part 14) can be performed if the characteristic curve of the display system is available and defined in the configuration file. \section parameters PARAMETERS \verbatim dcmimage-in input DICOM image bitmap-out output DICOM image or PGM bitmap \endverbatim \section options OPTIONS \subsection general_options general options \verbatim -h --help print this help text and exit --version print version information and exit --arguments print expanded command line arguments -q --quiet quiet mode, print no warnings and errors -v --verbose verbose mode, print processing details -d --debug debug mode, print debug information -ll --log-level [l]evel: string constant (fatal, error, warn, info, debug, trace) use level l for the logger -lc --log-config [f]ilename: string use config file f for the logger \endverbatim \subsection processing_options processing options \verbatim -p --pstate [f]ilename: string process using presentation state file -c --config [f]ilename: string process using settings from configuration file -f --frame [f]rame: integer process using image frame f (default: 1) \endverbatim \subsection output_format output format \verbatim -D --pgm save image as PGM (default) +D --dicom save image as DICOM secondary capture \endverbatim \subsection output_options output options \verbatim +S --save-pstate [f]ilename: string save presentation state to file \endverbatim \section logging LOGGING The level of logging output of the various command line tools and underlying libraries can be specified by the user. By default, only errors and warnings are written to the standard error stream. Using option \e --verbose also informational messages like processing details are reported. Option \e --debug can be used to get more details on the internal activity, e.g. for debugging purposes. Other logging levels can be selected using option \e --log-level. In \e --quiet mode only fatal errors are reported. In such very severe error events, the application will usually terminate. For more details on the different logging levels, see documentation of module "oflog". In case the logging output should be written to file (optionally with logfile rotation), to syslog (Unix) or the event log (Windows) option \e --log-config can be used. This configuration file also allows for directing only certain messages to a particular output stream and for filtering certain messages based on the module or application where they are generated. An example configuration file is provided in \/logger.cfg). \section command_line COMMAND LINE All command line tools use the following notation for parameters: square brackets enclose optional values (0-1), three trailing dots indicate that multiple values are allowed (1-n), a combination of both means 0 to n values. Command line options are distinguished from parameters by a leading '+' or '-' sign, respectively. Usually, order and position of command line options are arbitrary (i.e. they can appear anywhere). However, if options are mutually exclusive the rightmost appearance is used. This behaviour conforms to the standard evaluation rules of common Unix shells. In addition, one or more command files can be specified using an '@' sign as a prefix to the filename (e.g. \@command.txt). Such a command argument is replaced by the content of the corresponding text file (multiple whitespaces are treated as a single separator unless they appear between two quotation marks) prior to any further evaluation. Please note that a command file cannot contain another command file. This simple but effective approach allows to summarize common combinations of options/parameters and avoids longish and confusing command lines (an example is provided in file \/dumppat.txt). \section environment ENVIRONMENT The \b dcmp2pgm utility will attempt to load DICOM data dictionaries specified in the \e DCMDICTPATH environment variable. By default, i.e. if the \e DCMDICTPATH environment variable is not set, the file \/dicom.dic will be loaded unless the dictionary is built into the application (default for Windows). The default behaviour should be preferred and the \e DCMDICTPATH environment variable only used when alternative data dictionaries are required. The \e DCMDICTPATH environment variable has the same format as the Unix shell \e PATH variable in that a colon (":") separates entries. On Windows systems, a semicolon (";") is used as a separator. The data dictionary code will attempt to load each file specified in the \e DCMDICTPATH environment variable. It is an error if no data dictionary can be loaded. \section files FILES \/dcmpstat.cfg - sample configuration file \section copyright COPYRIGHT Copyright (C) 1998-2010 by OFFIS e.V., Escherweg 2, 26121 Oldenburg, Germany. */ dcmtk-3.6.0/dcmpstat/configure0000755000310500011400000000216311402146324015564 0ustar joergrdicom3#! /bin/sh parentdir=`pwd` thisdir=$parentdir # The following test constructs relative path from the module # directory to the configuration directory. If you know this path # you can substitute this with # configdir= # It is very important that the configdir path is relative. configdir="configdir" while test "$parentdir" != "/" -a "$configdir" = "configdir"; do if test -d "$parentdir/config" ; then configdir=$parentdir/config else parentdir=`echo $parentdir | sed 's/\/[^\/]*$//'` fi done if test "$configdir" = "configdir" ; then echo "Cannot find configure directory" exit 1 fi if test $# != 0; then case $1 in -a) shift cd "$configdir" echo "running configure in config-directory" ./configure $* cd $thisdir echo "running configure for this module" sh "$configdir/confmod" --srcdir=. $* ;; -c) shift cd "$configdir" echo "running configure in config-directory" ./configure $* ;; *) echo "running configure for this module" sh "$configdir/confmod" --srcdir=. $* ;; esac else echo "running configure for this module" sh "$configdir/confmod" --srcdir=. $* fi dcmtk-3.6.0/dcmpstat/Makefile.in0000644000310500011400000000351310721575104015727 0ustar joergrdicom3# # Makefile for dcmpstat # @SET_MAKE@ SHELL = /bin/sh VPATH = @srcdir@:@top_srcdir@/include:@top_srcdir@/@configdir@/include srcdir = @srcdir@ top_srcdir = @top_srcdir@ configdir = @top_srcdir@/@configdir@ include $(configdir)/@common_makefile@ all: include-all libsrc-all apps-all tests-all install: install-bin install-doc install-support install-bin: apps-install install-doc: docs-install install-data: data-install install-etc: etc-install install-include: include-install install-lib: libsrc-install install-include install-support: install-data install-etc include-all: (cd include && $(MAKE) ARCH="$(ARCH)" all) libsrc-all: include-all (cd libsrc && $(MAKE) ARCH="$(ARCH)" all) apps-all: libsrc-all (cd apps && $(MAKE) ARCH="$(ARCH)" all) tests-all: (cd tests && $(MAKE) all) include-install: (cd include && $(MAKE) ARCH="$(ARCH)" install) libsrc-install: libsrc-all (cd libsrc && $(MAKE) ARCH="$(ARCH)" install) apps-install: apps-all (cd apps && $(MAKE) ARCH="$(ARCH)" install) docs-install: (cd docs && $(MAKE) install) data-install: (cd data && $(MAKE) install) etc-install: (cd etc && $(MAKE) install) clean: (cd include && $(MAKE) clean) (cd libsrc && $(MAKE) clean) (cd apps && $(MAKE) clean) (cd tests && $(MAKE) clean) (cd jni && $(MAKE) clean) (cd docs && $(MAKE) clean) (cd data && $(MAKE) clean) (cd etc && $(MAKE) clean) rm -f $(TRASH) distclean: (cd include && $(MAKE) distclean) (cd libsrc && $(MAKE) distclean) (cd apps && $(MAKE) distclean) (cd tests && $(MAKE) distclean) (cd jni && $(MAKE) distclean) (cd docs && $(MAKE) distclean) (cd data && $(MAKE) distclean) (cd etc && $(MAKE) distclean) rm -f $(DISTTRASH) dependencies: (cd libsrc && touch $(DEP) && $(MAKE) dependencies) (cd apps && touch $(DEP) && $(MAKE) dependencies) (cd tests && touch $(DEP) && $(MAKE) dependencies) dcmtk-3.6.0/dcmpstat/tests/0000755000310500011400000000000011511320677015023 5ustar joergrdicom3dcmtk-3.6.0/dcmpstat/tests/msgserv.cc0000644000310500011400000004052311464253107017024 0ustar joergrdicom3/* * * Copyright (C) 2000-2010, 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 * * Authors: Marco Eichelberg * * Purpose: Sample message server for class DVPSIPCClient * * Last Update: $Author: uli $ * Update Date: $Date: 2010-11-03 12:32:07 $ * CVS/RCS Revision: $Revision: 1.19 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #ifdef HAVE_GUSI_H #include #endif BEGIN_EXTERN_C #ifdef HAVE_SYS_TYPES_H #include /* we have to include this before sys/time.h on Solaris */ #endif #ifdef HAVE_SYS_TIME_H #include /* for struct timeval on Linux */ #endif #ifdef HAVE_SYS_SELECT_H #include #endif #ifdef HAVE_SYS_SOCKET_H #include #endif #ifdef HAVE_NETINET_IN_H #include #endif #ifdef HAVE_NETDB_H #include #endif END_EXTERN_C #define INCLUDE_CSTDLIB #define INCLUDE_CERRNO #define INCLUDE_CTIME #include "dcmtk/ofstd/ofstdinc.h" #include "dcmtk/dcmpstat/dvpsmsg.h" /* for class DVPSIPCMessage */ #include "dcmtk/dcmdata/cmdlnarg.h" /* for prepareCmdLineArgs */ #include "dcmtk/ofstd/ofconapp.h" /* for class OFConsoleApplication */ #include "dcmtk/dcmnet/dcmtrans.h" /* for class DcmTCPConnection */ #include "dcmtk/dcmdata/dcuid.h" #include "dcmtk/dcmnet/dcompat.h" /* compatability routines */ #include "dcmtk/dcmnet/dul.h" #define OFFIS_CONSOLE_APPLICATION "msgserv" static OFLogger msgservLogger = OFLog::getLogger("dcmtk.tests." OFFIS_CONSOLE_APPLICATION); static char rcsid[] = "$dcmtk: " OFFIS_CONSOLE_APPLICATION " v" OFFIS_DCMTK_VERSION " " OFFIS_DCMTK_RELEASEDATE " $"; static const char *statusString(Uint32 i) { if (i==DVPSIPCMessage::statusOK) return "OK"; if (i==DVPSIPCMessage::statusWarning) return "Warning"; if (i==DVPSIPCMessage::statusError) return "Error"; return "unknown status code"; } static const char *applicationType(Uint32 i) { if (i==DVPSIPCMessage::clientOther) return "unspecified"; if (i==DVPSIPCMessage::clientStoreSCP) return "Receiver (Store SCP)"; if (i==DVPSIPCMessage::clientStoreSCU) return "Sender (Store SCU)"; if (i==DVPSIPCMessage::clientPrintSCP) return "Printer (Print SCP)"; if (i==DVPSIPCMessage::clientPrintSCU) return "Print Client (Print SCU)"; if (i==DVPSIPCMessage::clientQRSCP) return "Database (Query/Retrieve SCP)"; return "unknown application type"; } #define SHORTCOL 3 #define LONGCOL 12 int main(int argc, char *argv[]) { #ifdef HAVE_GUSI_H GUSISetup(GUSIwithSIOUXSockets); GUSISetup(GUSIwithInternetSockets); #endif #ifdef WITH_TCPWRAPPER // this code makes sure that the linker cannot optimize away // the DUL part of the network module where the external flags // for libwrap are defined. Needed on OpenBSD. dcmTCPWrapperDaemonName.set(NULL); #endif #ifdef HAVE_WINSOCK_H WSAData winSockData; /* we need at least version 1.1 */ WORD winSockVersionNeeded = MAKEWORD( 1, 1 ); WSAStartup(winSockVersionNeeded, &winSockData); #endif OFCmdUnsignedInt opt_port = 0; /* listen port */ Uint32 clientID = 0; /* IDs assigned to connecting clients */ OFConsoleApplication app(OFFIS_CONSOLE_APPLICATION , "Sample message server for class DVPSIPCClient", rcsid); OFCommandLine cmd; cmd.setOptionColumns(LONGCOL, SHORTCOL); cmd.setParamColumn(LONGCOL + SHORTCOL + 2); cmd.addParam("port", "port number to listen at"); cmd.addGroup("general options:", LONGCOL, SHORTCOL); cmd.addOption("--help", "-h", "print this help text and exit", OFCommandLine::AF_Exclusive); OFLog::addOptions(cmd); /* evaluate command line */ prepareCmdLineArgs(argc, argv, OFFIS_CONSOLE_APPLICATION); if (app.parseCommandLine(cmd, argc, argv, OFCommandLine::PF_ExpandWildcards)) { cmd.getParam(1, opt_port); OFLog::configureFromCommandLine(cmd, app); } OFLOG_DEBUG(msgservLogger, rcsid << OFendl); unsigned short networkPort = (unsigned short) opt_port; if (networkPort==0) { OFLOG_FATAL(msgservLogger, "no or invalid port number"); return 10; } #ifdef HAVE_GETEUID /* if port is privileged we must be as well */ if ((networkPort < 1024)&&(geteuid() != 0)) { OFLOG_FATAL(msgservLogger, "cannot listen on port " << networkPort << ", insufficient privileges"); return 10; } #endif /* open listen socket */ int s = socket(AF_INET, SOCK_STREAM, 0); if (s < 0) { OFLOG_FATAL(msgservLogger, "failed to create socket"); return 10; } #ifdef HAVE_GUSI_H /* GUSI always returns an error for setsockopt(...) */ #else int reuse = 1; if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (char *) &reuse, sizeof(reuse)) < 0) { OFLOG_FATAL(msgservLogger, "failed to set socket options"); return 10; } #endif /* Name socket using wildcards */ struct sockaddr_in server; server.sin_family = AF_INET; server.sin_addr.s_addr = INADDR_ANY; server.sin_port = (unsigned short) htons(networkPort); if (bind(s, (struct sockaddr *) & server, sizeof(server))) { OFLOG_FATAL(msgservLogger, "failed to bind socket to port, already in use?"); return 10; } listen(s, 64); // accept max 64 pending TCP connections on this socket #if defined(HAVE_SETUID) && defined(HAVE_GETUID) /* return to normal uid so that we can't do too much damage in case * things go very wrong. Only relevant if the program is setuid root, * and run by another user. Running as root user may be * potentially disasterous if this program screws up badly. */ setuid(getuid()); #endif fd_set fdset; struct timeval t; int nfound; while (1) { // wait for next incoming connection FD_ZERO(&fdset); FD_SET(s, &fdset); t.tv_sec = 10; // 10 seconds timeout t.tv_usec = 0; #ifdef HAVE_INTP_SELECT nfound = select(s + 1, (int *)(&fdset), NULL, NULL, &t); #else nfound = select(s + 1, &fdset, NULL, NULL, &t); #endif if (nfound > 0) { // incoming connection detected int sock=0; struct sockaddr from; #ifdef HAVE_DECLARATION_SOCKLEN_T socklen_t len = sizeof(from); #elif !defined(HAVE_PROTOTYPE_ACCEPT) || defined(HAVE_INTP_ACCEPT) int len = sizeof(from); #else size_t len = sizeof(from); #endif do { sock = accept(s, &from, &len); } while ((sock == -1)&&(errno == EINTR)); if (sock < 0) { OFLOG_FATAL(msgservLogger, "unable to accept incoming connection"); return 10; } #ifdef HAVE_GUSI_H /* GUSI always returns an error for setsockopt(...) */ #else reuse = 1; if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char *) &reuse, sizeof(reuse)) < 0) { OFLOG_FATAL(msgservLogger, "failed to set socket options"); return 10; } #endif // now we can handle the incoming connection DcmTCPConnection connection(sock); DVPSIPCMessage msg; Uint32 i=0; Uint32 msgType=0; OFString str; OFBool finished = OFFalse; while (!finished) { while (! connection.networkDataAvailable(1)) { // waiting for network data to become available or connection to be closed } if (msg.receive(connection)) { OFOStringStream oss; // handle message msgType = msg.getMessageType(); if (msgType == DVPSIPCMessage::OK) { oss << "received 'OK' (should not happen)" << OFendl; } else if (msgType == DVPSIPCMessage::requestApplicationID) { oss << "New client requests application ID, assigning #" << clientID+1 << OFendl << "Application Type: "; if (msg.extractIntFromPayload(i)) oss << applicationType(i) << OFendl; else oss << "(none)" << OFendl; if (msg.extractStringFromPayload(str)) oss << str << OFendl; else oss << "No description (should not happen)." << OFendl; } else if (msgType == DVPSIPCMessage::assignApplicationID) { oss << "received 'AssignApplicationID' (should not happen)." << OFendl; } else if (msgType == DVPSIPCMessage::applicationTerminates) { if (msg.extractIntFromPayload(i)) oss << "#" << i << ": "; else oss << "unknown client: "; oss << "Application Terminates, status: "; if (msg.extractIntFromPayload(i)) oss << statusString(i) << OFendl; else oss << "(none)" << OFendl; } else if (msgType == DVPSIPCMessage::receivedUnencryptedDICOMConnection) { if (msg.extractIntFromPayload(i)) oss << "#" << i << ": "; else oss << "unknown client: "; oss << "Received Unencrypted DICOM Connection, status: "; if (msg.extractIntFromPayload(i)) oss << statusString(i) << OFendl; else oss << "(none)" << OFendl; if (msg.extractStringFromPayload(str)) oss << str << OFendl; else oss << "No description (should not happen)." << OFendl; } else if (msgType == DVPSIPCMessage::receivedEncryptedDICOMConnection) { if (msg.extractIntFromPayload(i)) oss << "#" << i << ": "; else oss << "unknown client: "; oss << "Received Encrypted DICOM Connection, status: "; if (msg.extractIntFromPayload(i)) oss << statusString(i) << OFendl; else oss << "(none)" << OFendl; if (msg.extractStringFromPayload(str)) oss << str << OFendl; else oss << "No description (should not happen)." << OFendl; } else if (msgType == DVPSIPCMessage::connectionClosed) { if (msg.extractIntFromPayload(i)) oss << "#" << i << ": "; else oss << "unknown client: "; oss << "Connection Closed, status: "; if (msg.extractIntFromPayload(i)) oss << statusString(i) << OFendl; else oss << "(none)" << OFendl; } else if (msgType == DVPSIPCMessage::connectionAborted) { if (msg.extractIntFromPayload(i)) oss << "#" << i << ": "; else oss << "unknown client: "; oss << "Connection Aborted, status: "; if (msg.extractIntFromPayload(i)) oss << statusString(i) << OFendl; else oss << "(none)" << OFendl; if (msg.extractStringFromPayload(str)) oss << str << OFendl; else oss << "No description (should not happen)." << OFendl; } else if (msgType == DVPSIPCMessage::requestedUnencryptedDICOMConnection) { if (msg.extractIntFromPayload(i)) oss << "#" << i << ": "; else oss << "unknown client: "; oss << "Requested Unencrypted DICOM Connection, status: "; if (msg.extractIntFromPayload(i)) oss << statusString(i) << OFendl; else oss << "(none)" << OFendl; if (msg.extractStringFromPayload(str)) oss << str << OFendl; else oss << "No description (should not happen)." << OFendl; } else if (msgType == DVPSIPCMessage::requestedEncryptedDICOMConnection) { if (msg.extractIntFromPayload(i)) oss << "#" << i << ": "; else oss << "unknown client: "; oss << "Requested Encrypted DICOM Connection, status: "; if (msg.extractIntFromPayload(i)) oss << statusString(i) << OFendl; else oss << "(none)" << OFendl; if (msg.extractStringFromPayload(str)) oss << str << OFendl; else oss << "No description (should not happen)." << OFendl; } else if (msgType == DVPSIPCMessage::receivedDICOMObject) { if (msg.extractIntFromPayload(i)) oss << "#" << i << ": "; else oss << "unknown client: "; oss << "Received DICOM Object, status: "; if (msg.extractIntFromPayload(i)) oss << statusString(i) << OFendl; else oss << "(none)" << OFendl; if (msg.extractStringFromPayload(str)) oss << str << OFendl; else oss << "No description (should not happen)." << OFendl; } else if (msgType == DVPSIPCMessage::sentDICOMObject) { if (msg.extractIntFromPayload(i)) oss << "#" << i << ": "; else oss << "unknown client: "; oss << "Sent DICOM Object, status: "; if (msg.extractIntFromPayload(i)) oss << statusString(i) << OFendl; else oss << "(none)" << OFendl; if (msg.extractStringFromPayload(str)) oss << str << OFendl; else oss << "No description (should not happen)." << OFendl; } else { if (msg.extractIntFromPayload(i)) oss << "#" << i << ": "; else oss << "unknown client: "; oss << "received unknown message type " << msg.getMessageType() << ", status: "; if (msg.extractIntFromPayload(i)) oss << statusString(i) << OFendl; else oss << "(none)" << OFendl; } oss << OFStringStream_ends; OFSTRINGSTREAM_GETSTR(oss, result); OFLOG_INFO(msgservLogger, result); OFSTRINGSTREAM_FREESTR(result); msg.erasePayload(); if (msg.getMessageType() == DVPSIPCMessage::requestApplicationID) { msg.setMessageType(DVPSIPCMessage::assignApplicationID); msg.addIntToPayload(++clientID); } else { msg.setMessageType(DVPSIPCMessage::OK); } if (! msg.send(connection)) { OFLOG_WARN(msgservLogger, "unable to send response message, closing connection"); finished = OFTrue; } } else finished = OFTrue; } // connection has been closed by the client or something has gone wrong. // clean up connection and wait for next client. connection.close(); } } #ifdef HAVE_WINSOCK_H WSACleanup(); #endif return 0; } /* * CVS/RCS Log: * $Log: msgserv.cc,v $ * Revision 1.19 2010-11-03 12:32:07 uli * Fixed some more warnings by gcc with by additional flags. * * Revision 1.18 2010-10-14 13:15:09 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.17 2010-06-02 12:31:12 joergr * Appended missing OFStringStream_ends to the end of output streams because * this is required when OFOStringStream is mapped to ostrstream. * * Revision 1.16 2010-04-29 10:44:56 joergr * Use printError() method for command line parsing errors only. In all other * cases use log output. Added flag for exclusive options to --help. * Fixed issue with syntax usage (e.g. layout and formatting). * * Revision 1.15 2009-11-24 14:12:59 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.14 2009-08-19 14:46:14 meichel * Added additional includes needed for Sun Studio 11 on Solaris. * * Revision 1.13 2006/08/15 16:57:02 meichel * Updated the code in module dcmpstat to correctly compile when * all standard C++ classes remain in namespace std. * * Revision 1.12 2006/07/27 14:42:59 joergr * Prepended prefix "PF_" to parseLine() flags. * * Revision 1.11 2005/12/14 17:43:42 meichel * Adapted code for compilation with TCP wrappers to NetBSD * * Revision 1.10 2005/12/12 15:14:34 meichel * Added code needed for compilation with TCP wrappers on OpenBSD * * Revision 1.9 2005/12/08 15:47:00 meichel * Changed include path schema for all DCMTK header files * * Revision 1.8 2005/11/14 18:07:38 meichel * Included cstdlib, needed on HP/UX 10. * * Revision 1.7 2004/04/21 17:15:45 joergr * Included "dcompat" header file required for definition of bzero() on IRIX 5. * * Revision 1.6 2004/02/13 14:02:08 joergr * Added "#include " to compile with gcc 2.95.x on Linux 2.2.x. * * Revision 1.5 2002/11/27 15:48:19 meichel * Adapted module dcmpstat to use of new header file ofstdinc.h * * Revision 1.4 2001/06/01 15:50:43 meichel * Updated copyright header * * Revision 1.3 2000/12/12 16:45:41 meichel * Minor changes to keep gcc 2.7.x on SunOS 4.1.3 happy * * Revision 1.2 2000/11/08 18:38:32 meichel * Updated dcmpstat IPC protocol for additional message parameters * * Revision 1.1 2000/10/10 12:24:13 meichel * Implemented test server for IPC message communication * */ dcmtk-3.6.0/dcmpstat/tests/Makefile.in0000644000310500011400000000307411274253135017074 0ustar joergrdicom3# # Makefile for dcmpstat/tests # @SET_MAKE@ SHELL = /bin/sh VPATH = @srcdir@:@top_srcdir@/include:@top_srcdir@/@configdir@/include srcdir = @srcdir@ top_srcdir = @top_srcdir@ configdir = @top_srcdir@/@configdir@ include $(configdir)/@common_makefile@ ofstddir = $(top_srcdir)/../ofstd oflogdir = $(top_srcdir)/../oflog dcmdatadir = $(top_srcdir)/../dcmdata dcmnetdir = $(top_srcdir)/../dcmnet dcmqrdbdir = $(top_srcdir)/../dcmqrdb dcmimgledir = $(top_srcdir)/../dcmimgle dcmsigndir = $(top_srcdir)/../dcmsign dcmtlsdir = $(top_srcdir)/../dcmtls dcmsrdir = $(top_srcdir)/../dcmsr LOCALINCLUDES = -I$(dcmnetdir)/include -I$(ofstddir)/include -I$(oflogdir)/include \ -I$(dcmdatadir)/include -I$(dcmsigndir)/include -I$(dcmtlsdir)/include \ -I$(dcmqrdbdir)/include -I$(dcmimgledir)/include -I$(dcmsrdir)/include LIBDIRS = -L$(top_srcdir)/libsrc -L$(dcmnetdir)/libsrc -L$(ofstddir)/libsrc \ -L$(oflogdir)/libsrc -L$(dcmdatadir)/libsrc -L$(dcmsigndir)/libsrc \ -L$(dcmtlsdir)/libsrc -L$(dcmqrdbdir)/libsrc -L$(dcmimgledir)/libsrc \ -L$(dcmsrdir)/libsrc LOCALLIBS = -ldcmpstat -ldcmdsig -ldcmimgle -ldcmsr -ldcmqrdb -ldcmnet -ldcmtls \ -ldcmdata -loflog -lofstd $(XMLLIBS) $(ZLIBLIBS) $(TCPWRAPPERLIBS) $(OPENSSLLIBS) objs = msgserv.o progs = msgserv all: $(progs) msgserv: msgserv.o $(CXX) $(CXXFLAGS) $(LDFLAGS) $(LIBDIRS) -o $@ msgserv.o $(LOCALLIBS) $(MATHLIBS) $(LIBS) install: all clean: rm -f $(objs) $(progs) $(TRASH) distclean: rm -f $(objs) $(progs) $(DISTTRASH) dependencies: $(CXX) -MM $(defines) $(includes) $(CPPFLAGS) $(CXXFLAGS) *.cc > $(DEP) include $(DEP) dcmtk-3.6.0/dcmpstat/tests/Makefile.dep0000644000310500011400000001050411465014457017236 0ustar joergrdicom3msgserv.o: msgserv.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmpstat/dvpsmsg.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmdata/include/dcmtk/dcmdata/cmdlnarg.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../dcmnet/include/dcmtk/dcmnet/dcmtrans.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../dcmnet/include/dcmtk/dcmnet/dcmlayer.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../dcmdata/include/dcmtk/dcmdata/dcuid.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../dcmnet/include/dcmtk/dcmnet/dcompat.h \ ../../ofstd/include/dcmtk/ofstd/ofbmanip.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h \ ../../dcmnet/include/dcmtk/dcmnet/dul.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../dcmnet/include/dcmtk/dcmnet/extneg.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../dcmnet/include/dcmtk/dcmnet/dicom.h \ ../../dcmnet/include/dcmtk/dcmnet/cond.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmnet/include/dcmtk/dcmnet/dcompat.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../dcmdata/include/dcmtk/dcmdata/dcuid.h \ ../../dcmnet/include/dcmtk/dcmnet/dcuserid.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h dcmtk-3.6.0/dcmpstat/tests/dcmpsprt.pl0000755000310500011400000000174006771433440017226 0ustar joergrdicom3#!/usr/local/bin/perl # $program='../apps/dcmpsprt'; # set '[Database] Directory = /data/dicom-images/rsna99/results' in test.cfg for better performance $options='-c test.cfg'; $source='/data/dicom-images/rsna99'; # this entry is only used for message output, see comment on test.cfg $destination='/data/dicom-images/rsna99/results'; $img_ext='.img'; $pst_ext='.pres'; printf("Create hardcopy objects from images in $source\nand store results in $destination\n\n"); # first, collect a list of all files in the archive printf("reading file list...\n"); @files = `find $source/*$img_ext -type f -print"`; # then create a list of all files $files_idx = 0; for (@files) { if ($_ =~ /.*\/files$/) { $files[$files_idx++] = $_; } } printf("creating hardcopy grayscale images...\n"); for (@files) { chop($_); if ($_ !~ /.*\/files$/) { ($basename) = ($_ =~ /$source(.*)$img_ext/); printf("processing: $_\n"); `$program $options -p $source$basename$pst_ext $_`; } } dcmtk-3.6.0/dcmpstat/tests/dcmpschk.tcl0000644000310500011400000001142207126652226017330 0ustar joergrdicom3#!/bin/sh # the next line restarts using wish \ exec wish4.2 "$0" "$@" # load text from file into window proc loadText {w name} { # $w configure -state normal set f [open $name] while {![eof $f]} { gets $f s if {[string first "-" $s] == 0 || [string first "=" $s] == 0} { $w insert end $s tag_emph } elseif {[string first "Testing: " $s] == 0} { $w insert end $s tag_emph } elseif {[string first "Pass " $s] == 0} { $w insert end $s tag_emph } elseif {[string first "Error: " $s] == 0} { $w insert end $s tag_err } elseif {[string first "Warning: " $s] == 0} { $w insert end $s tag_warn } elseif {[string first "Informational: " $s] == 0} { $w insert end $s tag_inf } elseif {[string first "Test passed" $s] == 0} { $w insert end $s tag_passed } elseif {[string first "Test failed" $s] == 0} { $w insert end $s tag_failed } else { $w insert end $s } $w insert end "\n" } close $f # $w configure -state disabled } # search string in text window and mark all positions with tag proc findText {w name tag} { $w tag remove $tag 1.0 end set hits 0 set pos -1 if {$name != ""} { set cur 1.0 while 1 { set cur [$w search -count length -- $name $cur end] if {$cur == ""} { break } if {$pos < 0} { set pos $cur } $w tag add $tag $cur "$cur + $length char" set cur [$w index "$cur + $length char"] incr hits } } if {$pos >= 0} { $w see $pos } return $hits } # search string in both text windows proc findTextCommand {name} { global hitsText set dh [findText .report.text $name tag_found] set hitsText [concat "Hits: " $dh] focus .find.entry .find.entry delete 0 end } # set up text window proc setupTextWindow {} { global findName global hitsText set hitsText "Hits: 0" frame .find button .find.button -text "Find" -command "findTextCommand \$findName" -width 4 -anchor w entry .find.entry -textvariable findName label .find.label -textvariable hitsText -width 13 pack .find.button -side left pack .find.label -side right pack .find.entry -fill x -expand yes -padx 5 frame .report text .report.text -height 1 -wrap none -background #fff7e9 -selectbackground lightgray -font -*-Courier-Medium-R-Normal--*-150-*-*-*-*-*-* -xscrollcommand ".report.xscroll set" -yscrollcommand ".report.yscroll set" scrollbar .report.xscroll -orient horizontal -command ".report.text xview" scrollbar .report.yscroll -orient vertical -command ".report.text yview" pack .report.xscroll -side bottom -fill x pack .report.yscroll -side right -fill y pack .report.text -expand yes -fill both .report.text tag configure tag_emph -foreground black -font -*-Courier-Bold-R-Normal--*-150-*-*-*-*-*-* .report.text tag configure tag_found -background lightgray -underline true .report.text tag configure tag_warn -background #ffff8c .report.text tag configure tag_err -background #ff8c8c .report.text tag configure tag_inf -background #aae6aa .report.text tag configure tag_passed -foreground white -background black -font -*-Courier-Bold-R-Normal--*-150-*-*-*-*-*-* .report.text tag configure tag_failed -foreground white -background black -font -*-Courier-Bold-R-Normal--*-150-*-*-*-*-*-* pack .find -side top -fill x pack .report -expand yes -fill both bind .find.entry "findTextCommand \$findName" bind .report.text {if {[.report.text tag nextrange sel 1.0] != ""} {findTextCommand [selection get]}} focus .find.entry } # main window catch {eval destroy [winfo child .]} errMsg if {$errMsg > 0} { exit 1 } # initialization set temp "/tmp" if [info exists env(TEMP)] { set temp $env(TEMP) } elseif [info exists env(TMP)] { set temp $env(TMP) } set checkReport [file join $temp dcmpschk.report] set checkApp "dcmpschk" # set up window wm iconname . "DICOM Checker" if {$tcl_platform(os) == "SunOS"} { wm geometry . 956x903 } else { wm geometry . [expr int([winfo screenwidth .] * 0.995)]x[expr int([winfo screenheight .] * 0.938)] } wm geometry . +0+0 wm minsize . 400 165 setupTextWindow # set up bindings bind all {destroy .} # start check process if {$argc > 0} { set fileName [lindex $argv 0] wm title . "Please wait ..." catch {exec $checkApp -v $fileName >& $checkReport} loadText .report.text $checkReport update wm title . [format "DICOM PState Checker - %s" $fileName] } else { wm title . [format "DICOM PState Checker - "] } dcmtk-3.6.0/dcmpstat/apps/0000755000310500011400000000000011511320677014624 5ustar joergrdicom3dcmtk-3.6.0/dcmpstat/apps/dcmprscu.cc0000644000310500011400000014352011455601011016747 0ustar joergrdicom3/* * Copyright (C) 1999-2010, 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: dcmprscu * * Authors: Andreas Thiel, Marco Eichelberg * * Purpose: Presentation State Viewer - Print Spooler * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:13:45 $ * CVS/RCS Revision: $Revision: 1.30 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmnet/dcompat.h" /* compatibility code, needs to be included before dirent.h */ #ifdef HAVE_GUSI_H #include #endif #define INCLUDE_CCTYPE #include "dcmtk/ofstd/ofstdinc.h" BEGIN_EXTERN_C /* This #if code is suggested by the gnu autoconf documentation */ #ifdef HAVE_DIRENT_H #include #define NAMLEN(dirent) strlen((dirent)->d_name) #else #define dirent direct #define NAMELEN(dirent) (dirent)->d_namlen #ifdef HAVE_SYS_NDIR_H #include #endif #ifdef HAVE_SYS_DIR_H #include #endif #ifdef HAVE_NDIR_H #include #endif #endif #ifdef HAVE_IO_H #include #endif #ifdef HAVE_FCNTL_H #include /* for O_RDONLY */ #endif END_EXTERN_C #include "dcmtk/ofstd/ofstream.h" #include "dcmtk/dcmpstat/dvpsdef.h" /* for constants */ #include "dcmtk/dcmpstat/dviface.h" /* for DVInterface */ #include "dcmtk/ofstd/ofstring.h" /* for OFString */ #include "dcmtk/ofstd/ofbmanip.h" /* for OFBitmanipTemplate */ #include "dcmtk/ofstd/ofdatime.h" /* for OFDateTime */ #include "dcmtk/dcmdata/dcuid.h" /* for dcmtk version name */ #include "dcmtk/dcmdata/cmdlnarg.h" /* for prepareCmdLineArgs */ #include "dcmtk/ofstd/ofconapp.h" /* for OFConsoleApplication */ #include "dcmtk/dcmimgle/dcmimage.h" #include "dcmtk/dcmpstat/dvpspr.h" #include "dcmtk/dcmpstat/dvpssp.h" #include "dcmtk/dcmpstat/dvpshlp.h" /* for class DVPSHelper */ #include "dcmtk/ofstd/ofstd.h" #ifdef WITH_OPENSSL #include "dcmtk/dcmtls/tlstrans.h" #include "dcmtk/dcmtls/tlslayer.h" #endif #ifdef WITH_ZLIB #include /* for zlibVersion() */ #endif #define OFFIS_CONSOLE_APPLICATION "dcmprscu" static OFLogger dcmprscuLogger = OFLog::getLogger("dcmtk.apps." OFFIS_CONSOLE_APPLICATION); static char rcsid[] = "$dcmtk: " OFFIS_CONSOLE_APPLICATION " v" OFFIS_DCMTK_VERSION " " OFFIS_DCMTK_RELEASEDATE " $"; /* command line options */ static OFBool opt_spoolMode = OFFalse; /* default: file print mode */ static OFBool opt_noPrint = OFFalse; static OFBool opt_sessionPrint = OFFalse; /* Basic Film Session N-ACTION? */ static OFBool opt_Monochrome1 = OFFalse; /* send images in MONOCHROME 1? */ static const char * opt_cfgName = NULL; /* config file name */ static const char * opt_printer = NULL; /* printer name */ static const char * opt_mediumtype = NULL; static const char * opt_destination = NULL; static const char * opt_sessionlabel = NULL; static const char * opt_priority = NULL; static const char * opt_ownerID = NULL; static const char * opt_spoolPrefix = NULL; static OFCmdUnsignedInt opt_sleep = (OFCmdUnsignedInt) 1; static OFCmdUnsignedInt opt_copies = (OFCmdUnsignedInt) 0; /* print target data, taken from configuration file */ static const char * targetHostname = NULL; static const char * targetDescription = NULL; static const char * targetAETitle = NULL; static unsigned short targetPort = 104; static unsigned long targetMaxPDU = ASC_DEFAULTMAXPDU; static OFBool targetImplicitOnly = OFFalse; static OFBool targetDisableNewVRs = OFFalse; static OFBool targetSupportsPLUT = OFTrue; static OFBool targetSupportsAnnotation = OFTrue; static OFBool targetSupports12bit = OFTrue; static OFBool targetPLUTinFilmSession = OFFalse; static OFBool targetRequiresMatchingLUT = OFTrue; static OFBool targetPreferSCPLUTRendering = OFFalse; static OFBool deletePrintJobs = OFFalse; static OFBool deleteTerminateJobs = OFFalse; static OFBool useTLS = OFFalse; /* helper class printJob */ class printJob { public: printJob(); printJob(const printJob& copy); ~printJob() { } OFString studyUID; OFString seriesUID; OFString instanceUID; OFString storedPrintFilename; OFString mediumType; OFString filmDestination; OFString filmSessionLabel; OFString printPriority; OFString ownerID; #ifdef ALLOW_ILLUMINATION_OVERRIDE unsigned long illumination; unsigned long reflectedAmbientLight; #endif unsigned long numberOfCopies; private: /* undefined */ printJob& operator=(const printJob& copy); }; printJob::printJob() : studyUID() , seriesUID() , instanceUID() , storedPrintFilename() , mediumType() , filmDestination() , filmSessionLabel() , printPriority() , ownerID() #ifdef ALLOW_ILLUMINATION_OVERRIDE , illumination((unsigned long)-1) , reflectedAmbientLight((unsigned long)-1) #endif , numberOfCopies(0) { } printJob::printJob(const printJob& copy) : studyUID(copy.studyUID) , seriesUID(copy.seriesUID) , instanceUID(copy.instanceUID) , storedPrintFilename(copy.storedPrintFilename) , mediumType(copy.mediumType) , filmDestination(copy.filmDestination) , filmSessionLabel(copy.filmSessionLabel) , printPriority(copy.printPriority) , ownerID(copy.ownerID) #ifdef ALLOW_ILLUMINATION_OVERRIDE , illumination(copy.illumination) , reflectedAmbientLight(copy.reflectedAmbientLight) #endif , numberOfCopies(copy.numberOfCopies) { } /* static helper functions */ static OFCondition spoolStoredPrintFile( const char *filename, DVInterface &dvi, DcmTransportLayer *tlayer) { DcmFileFormat *ffile = NULL; DcmDataset *dset = NULL; if (opt_spoolMode) { OFLOG_WARN(dcmprscuLogger, OFDateTime::getCurrentDateTime() << OFendl << "processing " << filename); } if (filename==NULL) return EC_IllegalCall; OFCondition result = DVPSHelper::loadFileFormat(filename, ffile); if (EC_Normal != result) { OFLOG_ERROR(dcmprscuLogger, "spooler: unable to load file '" << filename << "'"); } if (ffile) dset = ffile->getDataset(); DVPSStoredPrint& stprint = dvi.getPrintHandler(); if (EC_Normal == result) { if (dset) result = stprint.read(*dset); else result = EC_IllegalCall; } if (EC_Normal != result) { OFLOG_ERROR(dcmprscuLogger, "spooler: file '" << filename << "' is not a valid Stored Print object"); } delete ffile; if (EC_Normal == result) { // we have successfully read the Stored Print, now open connection to printer DVPSPrintMessageHandler printHandler; result = printHandler.negotiateAssociation( tlayer, dvi.getNetworkAETitle(), targetAETitle, targetHostname, targetPort, targetMaxPDU, targetSupportsPLUT, targetSupportsAnnotation, targetImplicitOnly); if (result.bad()) { OFString temp_str; OFLOG_ERROR(dcmprscuLogger, "spooler: connection setup with printer failed\n" << DimseCondition::dump(temp_str, result)); } else { if (EC_Normal != (result = stprint.printSCUgetPrinterInstance(printHandler))) { OFLOG_ERROR(dcmprscuLogger, "spooler: printer communication failed, unable to request printer settings"); } if (EC_Normal==result) if (EC_Normal != (result = stprint.printSCUpreparePresentationLUT( printHandler, targetRequiresMatchingLUT, targetPreferSCPLUTRendering, targetSupports12bit))) { OFLOG_ERROR(dcmprscuLogger, "spooler: printer communication failed, unable to create presentation LUT"); } if (EC_Normal==result) if (EC_Normal != (result = dvi.printSCUcreateBasicFilmSession(printHandler, targetPLUTinFilmSession))) { OFLOG_ERROR(dcmprscuLogger, "spooler: printer communication failed, unable to create basic film session"); } if (EC_Normal==result) if (EC_Normal != (result = stprint.printSCUcreateBasicFilmBox(printHandler, targetPLUTinFilmSession))) { OFLOG_ERROR(dcmprscuLogger, "spooler: printer communication failed, unable to create basic film box"); } // Process images size_t numberOfImages = stprint.getNumberOfImages(); const char *studyUID = NULL; const char *seriesUID = NULL; const char *instanceUID = NULL; const char *imagefile = NULL; OFString theFilename; DicomImage *dcmimage = NULL; for (size_t currentImage=0; currentImage 0) { dcmimage = new DicomImage(theFilename.c_str()); if (dcmimage && (EIS_Normal == dcmimage->getStatus())) { // N-SET basic image box if (EC_Normal != (result = stprint.printSCUsetBasicImageBox(printHandler, currentImage, *dcmimage, opt_Monochrome1))) { OFLOG_ERROR(dcmprscuLogger, "spooler: printer communication failed, unable to transmit basic grayscale image box"); } } else { result = EC_IllegalCall; OFLOG_ERROR(dcmprscuLogger, "spooler: unable to load image file '" << theFilename.c_str() << "'"); } delete dcmimage; } else { result = EC_IllegalCall; OFLOG_ERROR(dcmprscuLogger, "spooler: unable to locate image file in database"); } } else result = EC_IllegalCall; } size_t numberOfAnnotations = stprint.getNumberOfAnnotations(); for (size_t currentAnnotation=0; currentAnnotation&jobList, DVInterface &dvi, DcmTransportLayer *tlayer) { OFCondition result = EC_Normal; OFCondition result2 = EC_Normal; OFListIterator(printJob *) first = jobList.begin(); OFListIterator(printJob *) last = jobList.end(); printJob *currentJob = NULL; while (first != last) { currentJob = *first; first = jobList.erase(first); if (currentJob->storedPrintFilename.size() == 0) { const char *spfile = dvi.getFilename(currentJob->studyUID.c_str(), currentJob->seriesUID.c_str(), currentJob->instanceUID.c_str()); if (spfile) currentJob->storedPrintFilename = spfile; dvi.releaseDatabase(); // destroys the string spfile points to } if (currentJob->storedPrintFilename.size() > 0) { // initialize film session settings dvi.clearFilmSessionSettings(); if (currentJob->mediumType.size() > 0) dvi.setPrinterMediumType(currentJob->mediumType.c_str()); if (currentJob->filmDestination.size() > 0) dvi.setPrinterFilmDestination(currentJob->filmDestination.c_str()); if (currentJob->filmSessionLabel.size() > 0) dvi.setPrinterFilmSessionLabel(currentJob->filmSessionLabel.c_str()); if (currentJob->printPriority.size() > 0) dvi.setPrinterPriority(currentJob->printPriority.c_str()); if (currentJob->ownerID.size() > 0) dvi.setPrinterOwnerID(currentJob->ownerID.c_str()); if (currentJob->numberOfCopies > 0) dvi.setPrinterNumberOfCopies(currentJob->numberOfCopies); #ifdef ALLOW_ILLUMINATION_OVERRIDE if (currentJob->illumination != (unsigned long)-1) dvi.setPrintIllumination((Uint16)(currentJob->illumination)); if (currentJob->reflectedAmbientLight != (unsigned long)-1) dvi.setPrintReflectedAmbientLight((Uint16)(currentJob->reflectedAmbientLight)); #endif result2 = spoolStoredPrintFile(currentJob->storedPrintFilename.c_str(), dvi, tlayer); if (result2 != EC_Normal) { OFLOG_ERROR(dcmprscuLogger, "spooler: error occured during spooling of Stored Print object '" << currentJob->storedPrintFilename << "'"); } if (result == EC_Normal) result = result2; // forward error codes, but do not erase } else { OFLOG_ERROR(dcmprscuLogger, "spooler: unable to find Stored Print object for print job in database"); result = EC_IllegalCall; } delete currentJob; } return result; } /* reads a single line of text from an open input file. * the line must have the structure * Trailing whitespace is not removed. */ static OFBool readValuePair(FILE *infile, OFString& key, OFString& value) { int c; int mode = 0; key.clear(); value.clear(); key.reserve(32); // should be sufficient for most cases. value.reserve(256); OFBool finished = OFFalse; while (!finished) { c = fgetc(infile); if ((c==EOF)||(c==13)||(c==10)) finished = OFTrue; else if (isspace(c)) { if (mode==1) mode=2; else if (mode==3) value += (char)c; } else { if (mode < 2) { mode=1; key += (char)c; } else { mode=3; value += (char)c; } } } if (c==EOF) return OFTrue; else return OFFalse; } /* reads a complete "print job" file. * The file must either contain a complete UID specification (study/series/instance) * or it must contain the keyword "terminate" in which case everything else is ignored. * depending on the "deletePrintJob" flag, the job file is renamed to "outfile" * after reading or deleted. If renaming fails, the file is also deleted. */ static OFCondition readJobFile( const char *infile, const char *outfile, printJob& job, OFBool& terminateFlag) { if (infile==NULL) return EC_IllegalCall; FILE *inf = fopen(infile, "rb"); if (inf==NULL) return EC_IllegalCall; OFString key, value; OFBool eofFound = OFFalse; OFBool thisIsTerminate = OFFalse; OFCondition result = EC_Normal; while (!eofFound) { thisIsTerminate = OFFalse; eofFound = readValuePair(inf, key, value); if ((key.size()==0)||(key[0] == '#')) { /* ignore comments and empty lines */ } else if (key == "copies") { if (1 != sscanf(value.c_str(),"%lu", &job.numberOfCopies)) { OFLOG_ERROR(dcmprscuLogger, "spooler: parse error for 'copies' in job file '" << infile << "'"); result = EC_IllegalCall; } } #ifdef ALLOW_ILLUMINATION_OVERRIDE else if (key == "illumination") { if (1 != sscanf(value.c_str(),"%lu", &job.illumination)) { OFLOG_ERROR(dcmprscuLogger, "spooler: parse error for 'illumination' in job file '" << infile << "'"); result = EC_IllegalCall; } } else if (key == "reflection") { if (1 != sscanf(value.c_str(),"%lu", &job.reflectedAmbientLight)) { OFLOG_ERROR(dcmprscuLogger, "spooler: parse error for 'reflection' in job file '" << infile << "'"); result = EC_IllegalCall; } } #endif else if (key == "mediumtype") job.mediumType = value; else if (key == "destination") job.filmDestination = value; else if (key == "label") job.filmSessionLabel = value; else if (key == "priority") job.printPriority = value; else if (key == "owner_id") job.ownerID = value; else if (key == "study") job.studyUID = value; else if (key == "series") job.seriesUID = value; else if (key == "instance") job.instanceUID = value; else if (key == "terminate") { terminateFlag=OFTrue; thisIsTerminate = OFTrue; } else { OFLOG_ERROR(dcmprscuLogger, "spooler: unknown keyword '" << key.c_str() << "' in job file '" << infile << "'"); result = EC_IllegalCall; } } fclose(inf); if (deletePrintJobs || (deleteTerminateJobs && thisIsTerminate)) { if (0 != unlink(infile)) { OFLOG_ERROR(dcmprscuLogger, "spooler: unable to delete job file '" << infile << "'"); result = EC_IllegalCall; } } else { if ((outfile==NULL)||(0 != rename(infile, outfile))) { // if we can't rename, we delete to make sure we don't read the same file again next time. if (0 != unlink(infile)) { OFLOG_ERROR(dcmprscuLogger, "spooler: unable to delete job file '" << infile << "'"); result = EC_IllegalCall; } } } // make sure that either all mandatory parameters are set or "terminate" is defined. if ((EC_Normal==result)&&(! terminateFlag)&&((job.studyUID.size()==0)||(job.seriesUID.size()==0)||(job.instanceUID.size()==0))) { OFLOG_ERROR(dcmprscuLogger, "spooler: UIDs missing in job file '" << infile << "'"); result = EC_IllegalCall; } return result; } /* browses the spool directory for new print job files and reads/renames all of them. * The results are stored in the jobList but not processed (spooled). This avoids * the possibility of life-lock situations. * * Uses opendir() on Unix, FindFirstFile()/FindNextFile() on Win32 platforms */ static OFCondition updateJobList( OFList&jobList, DVInterface &dvi, OFBool& terminateFlag, const char *filenamePrefix) { if (filenamePrefix==NULL) return EC_IllegalCall; OFString prefix = filenamePrefix; OFString postfix = PRINTJOB_SUFFIX; size_t prefixSize = prefix.size(); size_t postfixSize = postfix.size(); OFString currentName; OFString jobName; OFString renameName; printJob *currentJob = NULL; OFBool currentTerminate = OFFalse; OFCondition result = EC_Normal; const char *spoolFolder = dvi.getSpoolFolder(); #ifdef HAVE_WINDOWS_H WIN32_FIND_DATA stWin32FindData; OFString currentdir = spoolFolder; currentdir += "\\*"; HANDLE hFile = FindFirstFile(currentdir.c_str(), &stWin32FindData); int ret = (hFile != INVALID_HANDLE_VALUE); while (ret) { currentName = stWin32FindData.cFileName; #else DIR *dirp = NULL; struct dirent *dp = NULL; if ((dirp = opendir(spoolFolder)) != NULL) { for (dp=readdir(dirp);((result == EC_Normal)&&(dp != NULL)); dp=readdir(dirp)) { currentName = dp->d_name; #endif if ((prefix == currentName.substr(0, prefixSize)) && (currentName.size() > postfixSize) && (postfix == currentName.substr(currentName.size()-postfixSize))) { // name matches pattern jobName = spoolFolder; jobName += PATH_SEPARATOR; jobName += currentName; renameName = jobName; renameName += PRINTJOB_DONE_SUFFIX; currentJob = new printJob(); if (currentJob) { currentTerminate = OFFalse; result = readJobFile(jobName.c_str(), renameName.c_str(), *currentJob, currentTerminate); if (currentTerminate) terminateFlag = OFTrue; if (EC_Normal == result) { // don't schedule "terminate" job if (!currentTerminate) jobList.push_back(currentJob); else delete currentJob; } else { delete currentJob; OFLOG_ERROR(dcmprscuLogger, "spooler: parsing of job file '" << jobName.c_str() << "' failed"); } } else result = EC_MemoryExhausted; } #ifdef HAVE_WINDOWS_H ret = FindNextFile(hFile, &stWin32FindData); } /* while */ if(hFile != INVALID_HANDLE_VALUE) { FindClose(hFile); #else } /* for */ closedir(dirp); #endif } else { OFLOG_ERROR(dcmprscuLogger, "unable to read spool directory '" << spoolFolder << "'"); result = EC_IllegalCall; } return result; } #define SHORTCOL 3 #define LONGCOL 15 int main(int argc, char *argv[]) { #ifdef HAVE_GUSI_H GUSISetup(GUSIwithSIOUXSockets); GUSISetup(GUSIwithInternetSockets); #endif #ifdef HAVE_WINSOCK_H WSAData winSockData; /* we need at least version 1.1 */ WORD winSockVersionNeeded = MAKEWORD( 1, 1 ); WSAStartup(winSockVersionNeeded, &winSockData); #endif OFConsoleApplication app(OFFIS_CONSOLE_APPLICATION , "Print spooler for presentation state viewer", rcsid); OFCommandLine cmd; cmd.setOptionColumns(LONGCOL, SHORTCOL); cmd.setParamColumn(LONGCOL + SHORTCOL + 2); cmd.addParam("dcmfile-in", "stored print file(s) to be spooled", OFCmdParam::PM_MultiOptional); cmd.addGroup("general options:"); cmd.addOption("--help", "-h", "print this help text and exit", OFCommandLine::AF_Exclusive); cmd.addOption("--version", "print version information and exit", OFCommandLine::AF_Exclusive); OFLog::addOptions(cmd); cmd.addGroup("print options:"); cmd.addOption("--noprint", "do not create print-out (no n-action-rq)"); cmd.addOption("--session-print", "send film session n-action-rq (instead of film box)"); cmd.addOption("--monochrome1", "transmit basic grayscale images in MONOCHROME1"); cmd.addGroup("mode options:"); cmd.addOption("--print", "+p", "printer mode, print file(s) and terminate (default)"); cmd.addOption("--spool", "+s", 1, "[n]ame: string", "spooler mode, use job prefix n"); cmd.addGroup("processing options:"); cmd.addOption("--config", "-c", 1, "[f]ilename: string", "process using settings from configuration file"); cmd.addOption("--printer", "-p", 1, "[n]ame: string (default: 1st printer in cfg file)", "select printer with identifier n from cfg file"); cmd.addOption("--dump", "+d", "dump all DIMSE messages"); cmd.addGroup("spooler options (only with --spool):"); cmd.addOption("--sleep", 1, "[d]elay: integer (default: 1)", "sleep d seconds between spooler checks"); cmd.addGroup("basic film session options (not with --spool):"); cmd.addOption("--copies", 1, "[v]alue: integer (1..100, default: 1)", "set number of copies to v"); cmd.addOption("--medium-type", 1, "[v]alue: string", "set medium type to v"); cmd.addOption("--destination", 1, "[v]alue: string", "set film destination to v"); cmd.addOption("--label", 1, "[v]alue: string", "set film session label to v"); cmd.addOption("--priority", 1, "[v]alue: string", "set print priority to v"); cmd.addOption("--owner", 1, "[v]alue: string", "set film session owner ID to v"); /* evaluate command line */ prepareCmdLineArgs(argc, argv, OFFIS_CONSOLE_APPLICATION); if (app.parseCommandLine(cmd, argc, argv, OFCommandLine::PF_ExpandWildcards)) { /* check exclusive options first */ if (cmd.hasExclusiveOption()) { if (cmd.findOption("--version")) { app.printHeader(OFTrue /*print host identifier*/); COUT << OFendl << "External libraries used:"; #if !defined(WITH_ZLIB) && !defined(WITH_OPENSSL) COUT << " none" << OFendl; #else COUT << OFendl; #endif #ifdef WITH_ZLIB COUT << "- ZLIB, Version " << zlibVersion() << OFendl; #endif #ifdef WITH_OPENSSL COUT << "- " << OPENSSL_VERSION_TEXT << OFendl; #endif return 0; } } /* options */ OFLog::configureFromCommandLine(cmd, app); if (cmd.findOption("--noprint")) opt_noPrint = OFTrue; if (cmd.findOption("--session-print")) opt_sessionPrint = OFTrue; if (cmd.findOption("--monochrome1")) opt_Monochrome1 = OFTrue; cmd.beginOptionBlock(); if (cmd.findOption("--print")) opt_spoolMode = OFFalse; if (cmd.findOption("--spool")) { opt_spoolMode=OFTrue; app.checkValue(cmd.getValue(opt_spoolPrefix)); } cmd.endOptionBlock(); if (cmd.findOption("--config")) app.checkValue(cmd.getValue(opt_cfgName)); if (cmd.findOption("--printer")) app.checkValue(cmd.getValue(opt_printer)); if (cmd.findOption("--dump")) { // Messages to the "dump" logger are always written with the debug log // level, thus enabling that logger for this level shows the dumps log4cplus::Logger log = log4cplus::Logger::getInstance("dcmtk.dcmpstat.dump"); log.setLogLevel(OFLogger::DEBUG_LOG_LEVEL); } if (cmd.findOption("--medium-type")) { app.checkConflict("--medium-type", "--spool", opt_spoolMode); app.checkValue(cmd.getValue(opt_mediumtype)); } if (cmd.findOption("--destination")) { app.checkConflict("--destination", "--spool", opt_spoolMode); app.checkValue(cmd.getValue(opt_destination)); } if (cmd.findOption("--label")) { app.checkConflict("--label", "--spool", opt_spoolMode); app.checkValue(cmd.getValue(opt_sessionlabel)); } if (cmd.findOption("--priority")) { app.checkConflict("--priority", "--spool", opt_spoolMode); app.checkValue(cmd.getValue(opt_priority)); } if (cmd.findOption("--owner")) { app.checkConflict("--owner", "--spool", opt_spoolMode); app.checkValue(cmd.getValue(opt_ownerID)); } if (cmd.findOption("--copies")) { app.checkConflict("--copies", "--spool", opt_spoolMode); app.checkValue(cmd.getValueAndCheckMinMax(opt_copies, 1, 100)); } if (cmd.findOption("--sleep")) { app.checkConflict("--sleep", "--print", (! opt_spoolMode)); app.checkValue(cmd.getValue(opt_sleep)); } } /* print resource identifier */ OFLOG_DEBUG(dcmprscuLogger, rcsid << OFendl); if (opt_cfgName) { FILE *cfgfile = fopen(opt_cfgName, "rb"); if (cfgfile) fclose(cfgfile); else { OFLOG_FATAL(dcmprscuLogger, "can't open configuration file '" << opt_cfgName << "'"); return 10; } } else { OFLOG_FATAL(dcmprscuLogger, "no configuration file specified"); return 10; } DVInterface dvi(opt_cfgName); if (opt_printer) { if (EC_Normal != dvi.setCurrentPrinter(opt_printer)) { OFLOG_FATAL(dcmprscuLogger, "unable to select printer '" << opt_printer << "'"); return 10; } } else { opt_printer = dvi.getCurrentPrinter(); // use default printer if (opt_printer==NULL) { OFLOG_FATAL(dcmprscuLogger, "no default printer available - no config file?"); return 10; } } /* make sure data dictionary is loaded */ if (!dcmDataDict.isDictionaryLoaded()) OFLOG_WARN(dcmprscuLogger, "no data dictionary loaded, check environment variable: " << DCM_DICT_ENVIRONMENT_VARIABLE); /* get print target from configuration file */ targetHostname = dvi.getTargetHostname(opt_printer); targetDescription = dvi.getTargetDescription(opt_printer); targetAETitle = dvi.getTargetAETitle(opt_printer); targetPort = dvi.getTargetPort(opt_printer); targetMaxPDU = dvi.getTargetMaxPDU(opt_printer); targetImplicitOnly = dvi.getTargetImplicitOnly(opt_printer); targetDisableNewVRs = dvi.getTargetDisableNewVRs(opt_printer); targetSupportsPLUT = dvi.getTargetPrinterSupportsPresentationLUT(opt_printer); targetSupportsAnnotation = dvi.getTargetPrinterSupportsAnnotationBoxSOPClass(opt_printer); targetSupports12bit = dvi.getTargetPrinterSupports12BitTransmission(opt_printer); targetPLUTinFilmSession = dvi.getTargetPrinterPresentationLUTinFilmSession(opt_printer); targetRequiresMatchingLUT = dvi.getTargetPrinterPresentationLUTMatchRequired(opt_printer); targetPreferSCPLUTRendering = dvi.getTargetPrinterPresentationLUTPreferSCPRendering(opt_printer); deletePrintJobs = dvi.getSpoolerDeletePrintJobs(); deleteTerminateJobs = dvi.getSpoolerAlwaysDeleteTerminateJobs(); useTLS = dvi.getTargetUseTLS(opt_printer); Sint32 timeout = dvi.getTargetTimeout(opt_printer); if (timeout > 0) dcmConnectionTimeout.set(timeout); #ifdef WITH_OPENSSL /* TLS directory */ const char *current = NULL; const char *tlsFolder = dvi.getTLSFolder(); if (tlsFolder==NULL) tlsFolder = "."; /* certificate file */ OFString tlsCertificateFile(tlsFolder); tlsCertificateFile += PATH_SEPARATOR; current = dvi.getTargetCertificate(opt_printer); if (current) tlsCertificateFile += current; else tlsCertificateFile.clear(); /* private key file */ OFString tlsPrivateKeyFile(tlsFolder); tlsPrivateKeyFile += PATH_SEPARATOR; current = dvi.getTargetPrivateKey(opt_printer); if (current) tlsPrivateKeyFile += current; else tlsPrivateKeyFile.clear(); /* private key password */ const char *tlsPrivateKeyPassword = dvi.getTargetPrivateKeyPassword(opt_printer); /* certificate verification */ DcmCertificateVerification tlsCertVerification = DCV_requireCertificate; switch (dvi.getTargetPeerAuthentication(opt_printer)) { case DVPSQ_require: tlsCertVerification = DCV_requireCertificate; break; case DVPSQ_verify: tlsCertVerification = DCV_checkCertificate; break; case DVPSQ_ignore: tlsCertVerification = DCV_ignoreCertificate; break; } /* DH parameter file */ OFString tlsDHParametersFile; current = dvi.getTargetDiffieHellmanParameters(opt_printer); if (current) { tlsDHParametersFile = tlsFolder; tlsDHParametersFile += PATH_SEPARATOR; tlsDHParametersFile += current; } /* random seed file */ OFString tlsRandomSeedFile(tlsFolder); tlsRandomSeedFile += PATH_SEPARATOR; current = dvi.getTargetRandomSeed(opt_printer); if (current) tlsRandomSeedFile += current; else tlsRandomSeedFile += "siteseed.bin"; /* CA certificate directory */ const char *tlsCACertificateFolder = dvi.getTLSCACertificateFolder(); if (tlsCACertificateFolder==NULL) tlsCACertificateFolder = "."; /* key file format */ int keyFileFormat = SSL_FILETYPE_PEM; if (! dvi.getTLSPEMFormat()) keyFileFormat = SSL_FILETYPE_ASN1; /* ciphersuites */ #if OPENSSL_VERSION_NUMBER >= 0x0090700fL OFString tlsCiphersuites(TLS1_TXT_RSA_WITH_AES_128_SHA ":" SSL3_TXT_RSA_DES_192_CBC3_SHA); #else OFString tlsCiphersuites(SSL3_TXT_RSA_DES_192_CBC3_SHA); #endif Uint32 tlsNumberOfCiphersuites = dvi.getTargetNumberOfCipherSuites(opt_printer); if (tlsNumberOfCiphersuites > 0) { tlsCiphersuites.clear(); OFString currentSuite; const char *currentOpenSSL; for (Uint32 ui=0; ui 0) tlsCiphersuites += ":"; tlsCiphersuites += currentOpenSSL; } } } DcmTLSTransportLayer *tLayer = NULL; if (useTLS) { tLayer = new DcmTLSTransportLayer(DICOM_APPLICATION_REQUESTOR, tlsRandomSeedFile.c_str()); if (tLayer == NULL) { OFLOG_FATAL(dcmprscuLogger, "unable to create TLS transport layer"); return 1; } if (tlsCACertificateFolder && (TCS_ok != tLayer->addTrustedCertificateDir(tlsCACertificateFolder, keyFileFormat))) { OFLOG_WARN(dcmprscuLogger, "unable to load certificates from directory '" << tlsCACertificateFolder << "', ignoring"); } if ((tlsDHParametersFile.size() > 0) && ! (tLayer->setTempDHParameters(tlsDHParametersFile.c_str()))) { OFLOG_WARN(dcmprscuLogger, "unable to load temporary DH parameter file '" << tlsDHParametersFile << "', ignoring"); } tLayer->setPrivateKeyPasswd(tlsPrivateKeyPassword); // never prompt on console if ((tlsPrivateKeyFile.length() > 0) && (tlsCertificateFile.length() > 0)) { if (TCS_ok != tLayer->setPrivateKeyFile(tlsPrivateKeyFile.c_str(), keyFileFormat)) { OFLOG_FATAL(dcmprscuLogger, "unable to load private TLS key from '" << tlsPrivateKeyFile<< "'"); return 1; } if (TCS_ok != tLayer->setCertificateFile(tlsCertificateFile.c_str(), keyFileFormat)) { OFLOG_FATAL(dcmprscuLogger, "unable to load certificate from '" << tlsCertificateFile << "'"); return 1; } if (! tLayer->checkPrivateKeyMatchesCertificate()) { OFLOG_FATAL(dcmprscuLogger, "private key '" << tlsPrivateKeyFile << "' and certificate '" << tlsCertificateFile << "' do not match"); return 1; } } if (TCS_ok != tLayer->setCipherSuites(tlsCiphersuites.c_str())) { OFLOG_FATAL(dcmprscuLogger, "unable to set selected cipher suites"); return 1; } tLayer->setCertificateVerification(tlsCertVerification); // a generated UID contains the process ID and current time. // Adding it to the PRNG seed guarantees that we have different seeds for different processes. char randomUID[65]; dcmGenerateUniqueIdentifier(randomUID); tLayer->addPRNGseed(randomUID, strlen(randomUID)); } #else DcmTransportLayer *tLayer = NULL; if (useTLS) { OFLOG_FATAL(dcmprscuLogger, "not compiled with OpenSSL, cannot use TLS"); return 10; } #endif if (targetHostname == NULL) { OFLOG_FATAL(dcmprscuLogger, "no hostname for print target '" << opt_printer << "' - no config file?"); return 10; } if (targetAETitle == NULL) { OFLOG_FATAL(dcmprscuLogger, "no aetitle for print target '" << opt_printer << "'"); return 10; } if (targetPort == 0) { OFLOG_FATAL(dcmprscuLogger, "no or invalid port number for print target '" << opt_printer << "'"); return 10; } if (targetMaxPDU == 0) targetMaxPDU = DEFAULT_MAXPDU; else if (targetMaxPDU > ASC_MAXIMUMPDUSIZE) { OFLOG_WARN(dcmprscuLogger, "max PDU size " << targetMaxPDU << " too big for print target '" << opt_printer << "', using default: " << DEFAULT_MAXPDU); targetMaxPDU = DEFAULT_MAXPDU; } if (targetDisableNewVRs) { dcmEnableUnknownVRGeneration.set(OFFalse); dcmEnableUnlimitedTextVRGeneration.set(OFFalse); } OFLOG_INFO(dcmprscuLogger, "Printer parameters for '" << opt_printer << "':"); OFLOG_INFO(dcmprscuLogger, " hostname : " << targetHostname); OFLOG_INFO(dcmprscuLogger, " port : " << targetPort); OFLOG_INFO(dcmprscuLogger, " description : " << (targetDescription ? targetDescription : "(none)")); OFLOG_INFO(dcmprscuLogger, " aetitle : " << targetAETitle); OFLOG_INFO(dcmprscuLogger, " max pdu : " << targetMaxPDU); OFLOG_INFO(dcmprscuLogger, " timeout : " << timeout); if (targetImplicitOnly && targetDisableNewVRs) OFLOG_INFO(dcmprscuLogger, " options : implicit xfer syntax only, disable post-1993 VRs"); else if (targetImplicitOnly) OFLOG_INFO(dcmprscuLogger, " options : implicit xfer syntax only"); else if (targetDisableNewVRs) OFLOG_INFO(dcmprscuLogger, " options : disable post-1993 VRs"); else OFLOG_INFO(dcmprscuLogger, " options : none"); OFLOG_INFO(dcmprscuLogger, " 12-bit xfer : " << (targetSupports12bit ? "supported" : "not supported")); OFLOG_INFO(dcmprscuLogger, " present.lut : " << (targetSupportsPLUT ? "supported" : "not supported")); OFLOG_INFO(dcmprscuLogger, " annotation : " << (targetSupportsAnnotation ? "supported" : "not supported")); OFLOG_INFO(dcmprscuLogger, "Spooler parameters:"); OFLOG_INFO(dcmprscuLogger, " mode : " << (opt_spoolMode ? "spooler mode" : "printer mode")); if (opt_spoolMode) { OFLOG_INFO(dcmprscuLogger, " sleep time : " << opt_sleep); } else { OFLOG_INFO(dcmprscuLogger, " copies : " << opt_copies); OFLOG_INFO(dcmprscuLogger, " medium : " << (opt_mediumtype ? opt_mediumtype : "printer default")); OFLOG_INFO(dcmprscuLogger, " destination : " << (opt_destination ? opt_destination : "printer default")); OFLOG_INFO(dcmprscuLogger, " label : " << (opt_sessionlabel ? opt_sessionlabel : "printer default")); OFLOG_INFO(dcmprscuLogger, " priority : " << (opt_priority ? opt_priority : "printer default")); OFLOG_INFO(dcmprscuLogger, " owner ID : " << (opt_ownerID ? opt_ownerID : "printer default")); } OFLOG_INFO(dcmprscuLogger, "transport layer security parameters:"); OFLOG_INFO(dcmprscuLogger, " TLS : " << (useTLS ? "enabled" : "disabled")); #ifdef WITH_OPENSSL if (useTLS) { OFLOG_INFO(dcmprscuLogger, " certificate : " << tlsCertificateFile); OFLOG_INFO(dcmprscuLogger, " key file : " << tlsPrivateKeyFile); OFLOG_INFO(dcmprscuLogger, " DH params : " << tlsDHParametersFile); OFLOG_INFO(dcmprscuLogger, " PRNG seed : " << tlsRandomSeedFile); OFLOG_INFO(dcmprscuLogger, " CA directory : " << tlsCACertificateFolder); OFLOG_INFO(dcmprscuLogger, " ciphersuites : " << tlsCiphersuites); OFLOG_INFO(dcmprscuLogger, " key format : " << (keyFileFormat == SSL_FILETYPE_PEM ? "PEM" : "DER")); const char *verification; switch (tlsCertVerification) { case DCV_checkCertificate: verification = "verify"; break; case DCV_ignoreCertificate: verification = "ignore"; break; default: verification = "require"; break; } OFLOG_INFO(dcmprscuLogger, " cert verify : " << verification);; } #endif int paramCount = cmd.getParamCount(); const char *currentParam = NULL; if (opt_spoolMode) { if (paramCount > 0) { OFLOG_WARN(dcmprscuLogger, "filenames specified on command line, will be ignored in spooler mode"); } OFString jobNamePrefix = opt_spoolPrefix; jobNamePrefix += "_"; jobNamePrefix += opt_printer; jobNamePrefix += "_"; OFList jobList; OFBool terminateFlag = OFFalse; do { OFStandard::sleep((unsigned int)opt_sleep); if (EC_Normal != updateJobList(jobList, dvi, terminateFlag, jobNamePrefix.c_str())) { OFLOG_FATAL(dcmprscuLogger, "spooler: non recoverable error occured, terminating"); return 10; } // static OFCondition updateJobList(jobList, dvi, terminateFlag, jobNamePrefix.c_str()); if (EC_Normal != spoolJobList(jobList, dvi, tLayer)) { /* ignore */ } } while (! terminateFlag); OFLOG_INFO(dcmprscuLogger, "spooler is terminating, goodbye!"); } else { // printer mode if (paramCount == 0) { OFLOG_WARN(dcmprscuLogger, "spooler: no stored print files specified - nothing to do"); } else { dvi.clearFilmSessionSettings(); if (opt_mediumtype) dvi.setPrinterMediumType(opt_mediumtype); if (opt_destination) dvi.setPrinterFilmDestination(opt_destination); if (opt_sessionlabel) dvi.setPrinterFilmSessionLabel(opt_sessionlabel); if (opt_priority) dvi.setPrinterPriority(opt_priority); if (opt_ownerID) dvi.setPrinterOwnerID(opt_ownerID); if (opt_copies > 0) dvi.setPrinterNumberOfCopies(opt_copies); for (int param=1; param <= paramCount; param++) { cmd.getParam(param, currentParam); if (currentParam) { OFLOG_INFO(dcmprscuLogger, "spooling file '" << currentParam << "'"); } if (currentParam) { if (EC_Normal != spoolStoredPrintFile(currentParam, dvi, tLayer)) { OFLOG_ERROR(dcmprscuLogger, "spooling of file '" << currentParam << "' failed"); } } else { OFLOG_ERROR(dcmprscuLogger, "empty file name"); } } } } #ifdef WITH_OPENSSL if (tLayer) { if (tLayer->canWriteRandomSeed()) { if (!tLayer->writeRandomSeed(tlsRandomSeedFile.c_str())) { OFLOG_ERROR(dcmprscuLogger, "cannot write back random seed file '" << tlsRandomSeedFile << "', ignoring"); } } else { OFLOG_WARN(dcmprscuLogger, "cannot write back random seed, ignoring"); } } delete tLayer; #endif #ifdef HAVE_WINSOCK_H WSACleanup(); #endif #ifdef DEBUG dcmDataDict.clear(); /* useful for debugging with dmalloc */ #endif return 0; } /* * CVS/RCS Log: * $Log: dcmprscu.cc,v $ * Revision 1.30 2010-10-14 13:13:45 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.29 2009-12-11 15:24:46 joergr * Moved command line option --dump to another section. * Changed description of command line option --dump. * * Revision 1.28 2009-11-27 10:51:39 joergr * Fixed various issues with syntax usage (e.g. layout and formatting). * Sightly modifed log messages. * * Revision 1.27 2009-11-24 14:12:56 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.26 2009-10-28 09:53:41 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.25 2008-09-25 16:30:24 joergr * Added support for printing the expanded command line arguments. * Always output the resource identifier of the command line tool in debug mode. * * Revision 1.24 2006/08/15 16:57:01 meichel * Updated the code in module dcmpstat to correctly compile when * all standard C++ classes remain in namespace std. * * Revision 1.23 2006/07/27 14:37:16 joergr * Changed parameter "exclusive" of method addOption() from type OFBool into an * integer parameter "flags". Prepended prefix "PF_" to parseLine() flags. * Option "--help" is no longer an exclusive option by default. * Made naming conventions for command line parameters more consistent, e.g. * used "dcmfile-in", "dcmfile-out" and "bitmap-out". * * Revision 1.22 2005/12/08 15:46:06 meichel * Changed include path schema for all DCMTK header files * * Revision 1.21 2005/11/28 15:29:05 meichel * File dcdebug.h is not included by any other header file in the toolkit * anymore, to minimize the risk of name clashes of macro debug(). * * Revision 1.20 2005/11/23 16:10:32 meichel * Added support for AES ciphersuites in TLS module. All TLS-enabled * tools now support the "AES TLS Secure Transport Connection Profile". * * Revision 1.19 2004/02/04 15:44:38 joergr * Removed acknowledgements with e-mail addresses from CVS log. * * Revision 1.18 2003/09/05 14:31:32 meichel * Print SCU now supports TLS connections. * * Revision 1.17 2003/09/04 10:09:16 joergr * Fixed wrong use of OFBool/bool variable. * * Revision 1.16 2003/06/06 09:45:23 meichel * Added static sleep function in class OFStandard. This replaces the various * calls to sleep(), Sleep() and usleep() throughout the toolkit. * * Revision 1.15 2002/11/29 13:16:27 meichel * Introduced new command line option --timeout for controlling the * connection request timeout. * * Revision 1.14 2002/11/27 15:47:50 meichel * Adapted module dcmpstat to use of new header file ofstdinc.h * * Revision 1.13 2002/11/26 08:44:26 meichel * Replaced all includes for "zlib.h" with * to avoid inclusion of zlib.h in the makefile dependencies. * * Revision 1.12 2002/09/23 18:26:06 joergr * Added new command line option "--version" which prints the name and version * number of external libraries used (incl. preparation for future support of * 'config.guess' host identifiers). * * Revision 1.11 2002/06/14 10:44:17 meichel * Adapted log file handling to ofConsole singleton * * Revision 1.10 2002/04/16 14:01:26 joergr * Added configurable support for C++ ANSI standard includes (e.g. streams). * * Revision 1.9 2002/04/11 13:15:38 joergr * Replaced direct call of system routines by new standard date and time * functions. * * Revision 1.8 2001/11/09 16:06:04 joergr * Renamed some of the getValue/getParam methods to avoid ambiguities reported * by certain compilers. * * Revision 1.7 2001/10/12 13:46:48 meichel * Adapted dcmpstat to OFCondition based dcmnet module (supports strict mode). * * Revision 1.6 2001/09/26 15:36:02 meichel * Adapted dcmpstat to class OFCondition * * Revision 1.5 2001/06/01 15:50:07 meichel * Updated copyright header * * Revision 1.4 2000/12/13 13:23:02 meichel * Including dcompat.h, needed on MacOS X * * Revision 1.3 2000/06/20 14:50:05 meichel * Added monochrome1 printing mode. * * Revision 1.2 2000/06/19 16:29:05 meichel * Added options for session printing and LIN OD to print tools, fixed * pixel aspect ratio related bug. * * Revision 1.1 2000/06/08 10:36:25 meichel * Renamed dcmprtsv to dcmprscu and adapted Makefile.in and Makefile.dep * * Revision 1.23 2000/06/06 09:44:07 joergr * Moved configuration file entry "LogDirectory" from "[PRINT]" to new * (more general) section "[APPLICATION]". * * Revision 1.22 2000/06/02 16:00:38 meichel * Adapted all dcmpstat classes to use OFConsole for log and error output * * Revision 1.21 2000/05/31 13:02:24 meichel * Moved dcmpstat macros and constants into a common header file * * Revision 1.20 2000/05/03 14:27:27 meichel * Updated dcmpstat apps for changes in dcmimgle. * * Revision 1.19 2000/04/14 16:34:37 meichel * Global VR generation flags are now derived from OFGlobal and, thus, * safe for use in multi-thread applications. * * Revision 1.18 2000/03/08 16:28:42 meichel * Updated copyright header. * * Revision 1.17 2000/03/06 18:21:45 joergr * Avoid empty statement in the body of if-statements (MSVC6 reports warnings). * * Revision 1.16 2000/03/03 14:13:26 meichel * Implemented library support for redirecting error messages into memory * instead of printing them to stdout/stderr for GUI applications. * * Revision 1.15 2000/02/29 12:13:43 meichel * Removed support for VS value representation. This was proposed in CP 101 * but never became part of the standard. * * Revision 1.14 2000/02/02 15:17:59 meichel * Replaced some #if statements by more robust #ifdef * * Revision 1.13 2000/02/02 14:38:25 joergr * Removed space characters before preprocessor directives. * * Revision 1.12 1999/11/03 13:05:27 meichel * Added support for transmitting annotations in the film session label. * Added support for dump tool launched from DVInterface. * * Revision 1.11 1999/10/28 08:18:54 meichel * Print client does not attempt any more to negotiate Presentation LUT or * Annotation Box if config file says that the printer does not support them. * * Revision 1.10 1999/10/22 13:05:48 meichel * Print spooler now correctly dumping DIMSE communication to log file. * * Revision 1.9 1999/10/19 14:44:27 meichel * dcmprscu now correctly writes DIMSE dump to log file * and deletes log file upon termination if no print job was processed. * * Revision 1.8 1999/10/13 14:11:53 meichel * Added config file entries and access methods * for user-defined VOI presets, log directory, verbatim logging * and an explicit list of image display formats for each printer. * * Revision 1.7 1999/10/07 17:21:41 meichel * Reworked management of Presentation LUTs in order to create tighter * coupling between Softcopy and Print. * * Revision 1.6 1999/10/01 13:29:48 joergr * Added new option to config file: AlwaysDeleteTerminateJobs. * * Revision 1.5 1999/09/24 15:24:24 meichel * Added support for CP 173 (Presentation LUT clarifications) * * Revision 1.4 1999/09/23 17:37:08 meichel * Added support for Basic Film Session options to dcmpstat print code. * * Revision 1.3 1999/09/17 14:33:45 meichel * Completed print spool functionality including Supplement 22 support * * Revision 1.2 1999/09/15 17:42:50 meichel * Implemented print job dispatcher code for dcmpstat, adapted dcmprscu * and dcmpsprt applications. * * */ dcmtk-3.6.0/dcmpstat/apps/dcmpschk.cc0000644000310500011400000011313311455601011016720 0ustar joergrdicom3/* * * Copyright (C) 2000-2010, 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: Andrew Hewett, Marco Eichelberg * * Purpose: * VR and IOD checker for Presentation States * * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:13:45 $ * CVS/RCS Revision: $Revision: 1.31 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #define INCLUDE_CSTDLIB #include "dcmtk/ofstd/ofstdinc.h" #ifdef HAVE_WINDOWS_H #include /* this includes either winsock.h or winsock2.h */ #endif #ifdef HAVE_GUSI_H #include /* needed for Macintosh */ #include #endif #include "dcmtk/ofstd/ofstream.h" #include "dcmtk/ofstd/ofstring.h" /* for class OFString */ #include "dcmtk/ofstd/ofconapp.h" /* for OFConsoleApplication */ #include "dcmtk/dcmdata/dctk.h" /* for class DcmDataset */ #include "dcmtk/dcmnet/dul.h" #include "dcmtk/dcmpstat/dcmpstat.h" /* for DcmPresentationState */ #ifdef WITH_ZLIB #include /* for zlibVersion() */ #endif #define OFFIS_CONSOLE_APPLICATION "dcmpschk" static OFLogger dcmpschkLogger = OFLog::getLogger("dcmtk.apps." OFFIS_CONSOLE_APPLICATION); static char rcsid[] = "$dcmtk: " OFFIS_CONSOLE_APPLICATION " v" OFFIS_DCMTK_VERSION " " OFFIS_DCMTK_RELEASEDATE " $"; /* command line options */ static const char *opt_filename = NULL; // ******************************************** enum ErrorMode { EM_ok, EM_informational, EM_warning, EM_error }; #define MSG_invalidVR "Error: Unsupported Value Representation." #define MSG_lengthtoolarge "Error: Value Length too large." #define MSG_lengthtoosmall "Error: Value Length too small." #define MSG_unexpectedVR "Error: Unexpected Value Representation." #define MSG_vmtoolarge "Error: Value Multiplicity too large." #define MSG_vmtoosmall "Error: Value Multiplicity too small." #define MSGe_mhxferError "Error: Meta-header encoded using invalid transfer syntax." #define MSGe_missingAtt "Error: Attribute is missing." #define MSGe_wrongAtt "Error: Attribute is incorrect." #define MSGe_wrongDType "Error: Attribute value does not conform to data type definition." #define MSGi_wrongDType "Informational: Attribute value does not conform to data type definition." #define MSGw_wrongDType "Warning: Attribute value uses retired form." #define MSGw_dubiousDate "Warning: Dubious date (year before 1850 or after 2050)." void printVRError( ErrorMode mode, const char *elementDescription, const DcmDictEntry* dictRef, const char *format) { OFOStringStream out; if (mode == EM_error) out << MSGe_wrongDType << OFendl; else if (mode == EM_warning) out << MSGw_wrongDType << OFendl; else if (mode == EM_informational) out << MSGi_wrongDType << OFendl; out << " Affected attribute: "; if (dictRef) { out << dictRef->getTagName(); out << " " << dictRef->getKey(); out << ", Type " << dictRef->getVR().getVRName() << OFendl; } else out << "(unnamed)" << OFendl; out << " Attribute value : "; if (elementDescription) out << "[" << elementDescription << "]" << OFendl; else out << "(empty)" << OFendl; if (mode == EM_error) { out << " Expected format for each value: "; if (format) { out << format << OFendl; } else out << "(undefined)" << OFendl; } out << OFStringStream_ends; OFSTRINGSTREAM_GETSTR(out, tmp) OFLOG_ERROR(dcmpschkLogger, tmp); OFSTRINGSTREAM_FREESTR(tmp) } void printResult( DcmStack& stack, OFBool showFullData) { unsigned long n = stack.card(); if (n == 0) { return; } OFString tmp; /* print the path leading up to the top stack elem */ for (unsigned long i=n-1; i>=1; i--) { DcmObject *dobj = stack.elem(i); /* do not print if a DCM_Item as this is not * very helpful to distinguish instances. */ if (dobj != NULL && dobj->getTag().getXTag() != DCM_Item) { char buf[128]; sprintf(buf, "(%04x,%04x).", (unsigned)dobj->getGTag(), (unsigned)dobj->getETag()); tmp += buf; } } /* print the tag and its value */ DcmObject *dobj = stack.top(); OFLOG_WARN(dcmpschkLogger, tmp << DcmObject::PrintHelper(*dobj, showFullData ? 0 : DCMTypes::PF_shortenLongTagValues)); } OFBool isaStringVR(DcmVR& vr) { OFBool isaString = OFFalse; switch(vr.getEVR()) { case EVR_AE: case EVR_AS: case EVR_CS: case EVR_DA: case EVR_DS: case EVR_DT: case EVR_IS: case EVR_LO: case EVR_LT: case EVR_PN: case EVR_SH: case EVR_ST: case EVR_TM: case EVR_UI: case EVR_UT: isaString = OFTrue; break; default: isaString = OFFalse; break; } return isaString; } const char* streamvm(const DcmDictEntry *e) { static char buf[256]; if (e->isFixedSingleVM()) { sprintf(buf, "%d", e->getVMMax()); } else if (e->isVariableRangeVM()) { sprintf(buf, "%d-n", e->getVMMin()); } else if (e->isFixedRangeVM()){ sprintf(buf, "%d-%d", e->getVMMin(), e->getVMMax()); } else { sprintf(buf, "?(%d-%d)?", e->getVMMin(), e->getVMMax()); } return buf; } const char* streamLengthOfValue(DcmVR& vr) { static char buf[256]; Uint32 min = vr.getMinValueLength(); Uint32 max = vr.getMaxValueLength(); Uint32 undefLen = DCM_UndefinedLength; if (min==max) { sprintf(buf, "%d bytes fixed length", (int)min); } else if (min==0) { if (max==undefLen) { sprintf(buf, "unrestricted length"); } else { sprintf(buf, "%d bytes maximum", (int)max); } } else { sprintf(buf, "range %d-%d bytes length", (int)min, (int)max); } return buf; } int splitFields( char* line, char* fields[], Uint32 maxFields, char splitChar) { char* p; Uint32 foundFields = 0; int len; do { p = strchr(line, splitChar); if (p == NULL) { len = strlen(line); } else { len = p - line; } fields[foundFields] = new char[len+1]; strncpy(fields[foundFields], line, len); fields[foundFields][len] = '\0'; foundFields++; line = p + 1; } while ((foundFields < maxFields) && (p != NULL)); return foundFields; } OFBool isaKnownPointer(DcmTag& t) { /* ** The DICOMDIR code automatically converts any pointers ** to have VR=up even if when the data has an explicit VR encoding. ** If this attribute is a known pointer then it is ok for it to ** have the internal VR=up. */ OFBool result = OFFalse; const DcmDataDictionary& globalDataDict = dcmDataDict.rdlock(); const DcmDictEntry *dictRef = globalDataDict.findEntry(t, NULL); if (dictRef && (t.getEVR() == EVR_up) && (t.getEVR() == dictRef->getEVR())) result = OFTrue; dcmDataDict.unlock(); return result; } int checkelem( DcmElement *elem, DcmXfer& oxfer, DcmStack& stack, OFBool showFullData, int& dderrors) { DcmVR vr(elem->getVR()); Uint32 len = elem->getLength(); DcmTag tag(elem->getTag()); Uint32 vm = elem->getVM(); const DcmDataDictionary& globalDataDict = dcmDataDict.rdlock(); const DcmDictEntry *dictRef = globalDataDict.findEntry(tag, NULL); int i = 0; /* ** if the data was encoded in explicit VR then check that the given VR matches ** the value in the data dictionary. */ if (oxfer.isExplicitVR()) { if (!vr.isStandard() && !isaKnownPointer(tag)) { OFLOG_WARN(dcmpschkLogger, MSG_invalidVR << OFendl << " Affected VR : [" << vr.getVRName() << "]" << (dictRef ? OFString(", should be [") + dictRef->getVR().getVRName() + "] according to data dictionary." : "") << OFendl << " Affected attribute: "); printResult(stack, showFullData); dderrors++; } else if (dictRef && !vr.isEquivalent(dictRef->getVR())) { OFLOG_WARN(dcmpschkLogger, MSG_unexpectedVR << OFendl << " Affected VR : [" << vr.getVRName() << "], should be [" << dictRef->getVR().getVRName() << "] according to data dictionary." << OFendl << " Affected attribute: "); printResult(stack, showFullData); dderrors++; } } if (len) /* type 2 attributes can be empty. */ { /* ** Check value multiplicity */ if ((dictRef)&&(vm < (Uint32)dictRef->getVMMin())) { OFLOG_WARN(dcmpschkLogger, MSG_vmtoosmall << OFendl << " Affected VM : " << vm << ", should be " << streamvm(dictRef) << " according to data dictionary." << OFendl << " Affected attribute: "); printResult(stack, showFullData); dderrors++; } if ((dictRef)&&(vm > (Uint32)dictRef->getVMMax())) { OFLOG_WARN(dcmpschkLogger, MSG_vmtoolarge << OFendl << " Affected VM : " << vm << ", should be " << streamvm(dictRef) << " according to data dictionary." << OFendl << " Affected attribute: "); printResult(stack, showFullData); dderrors++; } /* ** Check length of attribute */ /* Need to split the value into its components if VM>1 */ if (isaStringVR(vr)) { /* only strings have variable length components */ char* value = NULL; ((DcmByteString*)elem)->getString(value); char **fields = new char*[vm+1]; if (fields == NULL) { printResult(stack, showFullData); OFLOG_FATAL(dcmpschkLogger, "Internal error: out of memory (value multiplicity too large)"); } else { int nfields = splitFields(value, fields, vm, '\\'); if ((Uint32)nfields != vm) { printResult(stack, showFullData); OFLOG_FATAL(dcmpschkLogger, "Internal error: splitFields inconsistency (" << nfields << "!=" << vm << ")"); exit(1); } for (i=0; (Uint32)i vr.getMaxValueLength()) { OFLOG_WARN(dcmpschkLogger, MSG_lengthtoolarge << OFendl << " Affected length : " << slen << " bytes, should be " << streamLengthOfValue(vr) << " for " << vr.getVRName() << "."); if (vm > 1) OFLOG_WARN(dcmpschkLogger, " Affected value [" << i << "]: \"" << s << "\""); OFLOG_WARN(dcmpschkLogger, " Affected attribute: "); printResult(stack, showFullData); dderrors++; } if ((Uint32)slen < vr.getMinValueLength()) { OFLOG_WARN(dcmpschkLogger, MSG_lengthtoosmall << OFendl << " Affected length : " << slen << " bytes, should be " << streamLengthOfValue(vr) << " for " << vr.getVRName() << "."); if (vm > 1) OFLOG_WARN(dcmpschkLogger, " Affected value [" << i << "]: \"" << s << "\""); OFLOG_WARN(dcmpschkLogger, " Affected attribute: "); printResult(stack, showFullData); dderrors++; } delete[] fields[i]; fields[i] = NULL; } delete[] fields; } } else { Uint32 componentSize = len; /* vm is 0 if value field is too short, e.g. < 8 bytes for FD */ if (vm>0) componentSize = len/vm; if (componentSize > vr.getMaxValueLength()) { OFLOG_WARN(dcmpschkLogger, MSG_lengthtoolarge << OFendl << " Affected length : " << componentSize << " bytes, should be " << streamLengthOfValue(vr) << " for " << vr.getVRName() << "." << OFendl << " Affected attribute: "); printResult(stack, showFullData); dderrors++; } if (componentSize < vr.getMinValueLength()) { OFLOG_WARN(dcmpschkLogger, MSG_lengthtoosmall << OFendl << " Affected length : " << componentSize << " bytes, should be " << streamLengthOfValue(vr) << " for " << vr.getVRName() << "." << OFendl << " Affected attribute: "); printResult(stack, showFullData); dderrors++; } } /* ** check, wether the value of the element is suitable to the data type. */ /*** differenciate all value representations */ if (isaStringVR(vr)) { char* value = NULL; if (EC_Normal == ((DcmByteString*)elem)->getString(value) && value) switch (vr.getEVR()) { case EVR_AE: { const int realVR = DcmElement::scanValue(value, "ae"); if (realVR != 13) { printVRError(EM_error, value, dictRef, "all but control characters"); dderrors++; } } break; case EVR_AS: { const int realVR = DcmElement::scanValue(value, "as"); if (realVR != 1) { printVRError(EM_error, value, dictRef, "[0-9]{3}[DWMY]"); dderrors++; } } break; case EVR_CS: { const int realVR = DcmElement::scanValue(value, "cs"); if (realVR != 10) { printVRError(EM_error, value, dictRef, "[0-9A-Z _]+"); dderrors++; } } break; case EVR_DA: { const int realVR = DcmElement::scanValue(value, "da"); if (realVR != 2) { switch (realVR) { case 3: printVRError(EM_warning, value, dictRef, NULL); dderrors++; break; case 17: OFLOG_WARN(dcmpschkLogger, MSGw_dubiousDate); printVRError(EM_ok, value, dictRef, NULL); dderrors++; break; default: printVRError(EM_error, value, dictRef, "[0-9]{8} with valid values for year, month and day"); dderrors++; break; } } } break; case EVR_DS: { const int realVR = DcmElement::scanValue(value, "ds"); if (realVR != 6) { printVRError(EM_error, value, dictRef, "([\\-\\+]?[0-9]*[\\.]?[0-9]+)|([\\-\\+]?[0-9][\\.]?[0-9]+[Ee][\\+\\-][0-9]+)"); dderrors++; } } break; case EVR_DT: { const int realVR = DcmElement::scanValue(value, "dt"); if (realVR != 7) { if (realVR == 18) { OFLOG_WARN(dcmpschkLogger, MSGw_dubiousDate); printVRError(EM_ok, value, dictRef, NULL); dderrors++; } else { printVRError(EM_error, value, dictRef, "[0-9]{8}[0-9]{2}([0-9]{2}([0-9]{2}(\\.[0-9]{1,6})?)?)?([\\+\\-][0-9]{4})?"); dderrors++; } } } break; case EVR_IS: { const int realVR = DcmElement::scanValue(value, "is"); if (realVR != 8) { printVRError(EM_error, value, dictRef, "[\\+\\-]?[0-9]+ in the range -2^31 .. 2^31-1"); dderrors++; } } break; case EVR_SH: case EVR_LO: { const int realVR = DcmElement::scanValue(value, "lo"); if (realVR != 12) { printVRError(EM_error, value, dictRef, "all but '\\' and control characters"); dderrors++; } } break; case EVR_ST: case EVR_LT: case EVR_UT: { const int realVR = DcmElement::scanValue(value, "lt"); if (realVR != 14) { printVRError(EM_error, value, dictRef, "all"); dderrors++; } } break; case EVR_PN: { const int realVR = DcmElement::scanValue(value, "pn"); if (realVR != 11) { if (realVR == 15) /* OLD_PN */ { printVRError(EM_warning, value, dictRef, NULL); dderrors++; } else { printVRError(EM_error, value, dictRef, "{all}*([\\^]{all}*([\\^]{all}*([\\^]{all}*(\\^{all}*)?)?)?)?"); dderrors++; } } } break; case EVR_TM: { const int realVR = DcmElement::scanValue(value, "tm"); if (realVR != 4) { if (realVR == 5) { printVRError(EM_warning, value, dictRef, NULL); dderrors++; } else { printVRError(EM_error, value, dictRef, "[0-9]{2}([0-9]{2}([0-9]{2}(\\.[0-9]{1,6})?)?)? with valid values for hour, minute and second"); dderrors++; } } } break; case EVR_UI: { const int realVR = DcmElement::scanValue(value, "ui"); if (realVR != 9) { printVRError(EM_error, value, dictRef, "([0-9]+\\.)*[0-9]+ without any leading zeroes"); dderrors++; } } break; default: break; } } //end of if (isaStringVR(vr)) } dcmDataDict.unlock(); return 0; } int checkitem( DcmItem *item, DcmXfer& oxfer, DcmStack& stack, OFBool showFullData, int& dderrors) { if (item == NULL) { return 0; } /* ** Step through each attribute and check it. */ unsigned long count = item->card(); for (unsigned long i=0; igetElement(i); stack.push(elem); checkelem(elem, oxfer, stack, showFullData, dderrors); stack.pop(); if (elem->ident() == EVR_SQ) { DcmSequenceOfItems *seq = (DcmSequenceOfItems*)elem; unsigned long nitems = seq->card(); for (unsigned long j=0; jgetItem(j), oxfer, stack, showFullData, dderrors); stack.pop(); } } } return 0; } int dcmchk( const char* ifname, E_FileReadMode readMode, E_TransferSyntax xfer, OFBool showFullData, OFBool loadAllDataInMemory, int& dderrors) { DcmFileFormat *ds = new DcmFileFormat(); OFCondition cond = ds->loadFile(ifname, xfer, EGL_noChange, DCM_MaxReadLength, readMode); if (! cond.good()) { OFLOG_ERROR(dcmpschkLogger, cond.text() << " reading file: " << ifname); } if (loadAllDataInMemory) { ds->loadAllDataIntoMemory(); if (ds->error() != EC_Normal) { OFLOG_ERROR(dcmpschkLogger, ds->error().text() << " reading file: " << ifname); return 1; } } DcmStack stack; DcmXfer oxfer(META_HEADER_DEFAULT_TRANSFERSYNTAX); DcmMetaInfo *mi = ds->getMetaInfo(); if (mi->card() > 0) { // we only check the meta-header if there is something to check checkitem(mi, oxfer, stack, showFullData, dderrors); } oxfer = ds->getDataset()->getOriginalXfer(); checkitem(ds->getDataset(), oxfer, stack, showFullData, dderrors); delete ds; return 0; } //********************************************************* static OFString printAttribute( OFString &ret, DcmItem* dset, const DcmTagKey& key) { DcmElement *elem = NULL; DcmStack stack; OFCondition ec = EC_Normal; OFOStringStream str; ec = dset->search(key, stack, ESM_fromHere, OFFalse); elem = (DcmElement*) stack.top(); if (elem) elem->print(str, DCMTypes::PF_shortenLongTagValues); else str << ""; str << OFStringStream_ends; OFSTRINGSTREAM_GETSTR(str, tmp) ret = tmp; OFSTRINGSTREAM_FREESTR(tmp) return ret; } static OFBool chkType1AttributeExistance( DcmItem* dset, const DcmTagKey& key) { OFBool found = OFTrue; if (!dset->tagExistsWithValue(key)) { DcmTag t(key); OFLOG_WARN(dcmpschkLogger, MSGe_missingAtt << OFendl << " Affected attribute: " << t.getXTag() << " " << t.getTagName() << OFendl); found = OFFalse; } return found; } int dcmchkMetaHeader( DcmMetaInfo* meta, DcmDataset* dset) { if (meta == NULL || meta->card() == 0) { /* no meta-header so no errors */ return 0; } int nErrs = 0; OFString tmp_str; /* ** The meta-header should use the LittleEndianExplicit transfer syntax */ if (meta->getOriginalXfer() != EXS_LittleEndianExplicit) { DcmXfer used(meta->getOriginalXfer()); DcmXfer expected(EXS_LittleEndianExplicit); OFLOG_WARN(dcmpschkLogger, MSGe_mhxferError << OFendl << " Expected: " << expected.getXferName() << OFendl << " Used: " << used.getXferName() << OFendl); nErrs++; } /* ** Check the meta-header contents */ // examine the FileMetaInformationVersion DcmTagKey fmiv(DCM_FileMetaInformationVersion); if (chkType1AttributeExistance(meta, fmiv)) { Uint8 b0 = 0xff; Uint8 b1 = 0xff; // get bytes meta->findAndGetUint8(fmiv, b0, 0); meta->findAndGetUint8(fmiv, b1, 1); // we expect 0x00/0x01 for the version if ((b0 != 0x00) || (b1 != 0x01)) { OFLOG_WARN(dcmpschkLogger, MSGe_wrongAtt << OFendl << " Invalid FileMetaInformationVersion (expected: 00\\01)" << OFendl << " Affected attribute: " << OFendl << " " << printAttribute(tmp_str, meta, fmiv)); nErrs++; } } else { nErrs++; } // examine the MediaStorageSOPClassUID DcmTagKey msscuid(DCM_MediaStorageSOPClassUID); if (chkType1AttributeExistance(meta, msscuid)) { OFString metaHeaderClassUID; meta->findAndGetOFStringArray(msscuid, metaHeaderClassUID); // should be the same as SOPClassUID in the dataset if (dset && dset->tagExistsWithValue(DCM_SOPClassUID)) { OFString datasetClassUID; dset->findAndGetOFStringArray(DCM_SOPClassUID, datasetClassUID); if (metaHeaderClassUID != datasetClassUID) { OFLOG_WARN(dcmpschkLogger, MSGe_wrongAtt << OFendl << " Inconsistent SOP class information" << OFendl << " Affected attributes: " << OFendl << " " << printAttribute(tmp_str, meta, msscuid) << OFendl << " " << printAttribute(tmp_str, dset, DCM_SOPClassUID)); nErrs++; } } if (!dcmFindNameOfUID(metaHeaderClassUID.c_str())) { OFLOG_WARN(dcmpschkLogger, MSGe_wrongAtt << OFendl << " Unknown SOP Class" << OFendl << " Affected attribute: " << OFendl << " " << printAttribute(tmp_str, meta, msscuid)); nErrs++; } } else { nErrs++; } // Examine MediaStorageSOPInstanceUID DcmTagKey mssiuid(DCM_MediaStorageSOPInstanceUID); if (chkType1AttributeExistance(meta, mssiuid)) { OFString metaHeaderInstanceUID; meta->findAndGetOFStringArray(mssiuid, metaHeaderInstanceUID); // should be the same as SOPInstanceUID in the dataset if (dset && dset->tagExistsWithValue(DCM_SOPInstanceUID)) { OFString datasetInstanceUID; dset->findAndGetOFStringArray(DCM_SOPInstanceUID, datasetInstanceUID); if (metaHeaderInstanceUID != datasetInstanceUID) { OFLOG_WARN(dcmpschkLogger, MSGe_wrongAtt << OFendl << " Inconsistent SOP instance information" << OFendl << " Affected attributes: " << OFendl << " " << printAttribute(tmp_str, meta, mssiuid) << OFendl << " " << printAttribute(tmp_str, dset, DCM_SOPInstanceUID)); nErrs++; } } } else { nErrs++; } // examine the TransferSyntaxUID DcmTagKey tsuid(DCM_TransferSyntaxUID); if (chkType1AttributeExistance(meta, tsuid)) { OFString transferSyntaxUID; meta->findAndGetOFStringArray(tsuid, transferSyntaxUID); // is this transfer syntax known ? DcmXfer expected(transferSyntaxUID.c_str()); if (expected.getXfer() == EXS_Unknown) { OFLOG_WARN(dcmpschkLogger, MSGe_wrongAtt << OFendl << " Unknown Transfer Syntax" << OFendl << " Affected attribute: " << OFendl << " " << printAttribute(tmp_str, meta, tsuid)); nErrs++; } // should be the same as transfer syntax used to read the dataset if (dset && (dset->getOriginalXfer() != EXS_LittleEndianExplicit)) { DcmXfer used(dset->getOriginalXfer()); OFString usedTransferSyntaxUID(used.getXferID()); if (transferSyntaxUID != usedTransferSyntaxUID) { OFLOG_WARN(dcmpschkLogger, MSGe_wrongAtt << OFendl << " Dataset not encoded using specified transfer syntax" << OFendl << " Affected attribute: " << OFendl << " " << printAttribute(tmp_str, meta, tsuid)); OFLOG_WARN(dcmpschkLogger, " Dataset encoded using: " << used.getXferName()); nErrs++; } } } else { nErrs++; } // Check the group length information DcmTagKey gltag(DCM_FileMetaInformationGroupLength); if (chkType1AttributeExistance(meta, gltag)) { Uint32 len = 0; meta->findAndGetUint32(gltag, len, 0); // Compute how large the Meta-Header should be Uint32 expectedLength = meta->getLength(EXS_LittleEndianExplicit, EET_ExplicitLength); expectedLength -= 12; // less length of group length element itself if (len != expectedLength) { OFLOG_WARN(dcmpschkLogger, MSGe_wrongAtt << OFendl << " Invalid meta-header group length (expected: " << expectedLength << ")" << OFendl << " Affected attribute: " << OFendl << " " << printAttribute(tmp_str, meta, gltag)); nErrs++; } } else { nErrs++; } return nErrs; } int checkfile(const char *filename) { DcmFileFormat *dfile = new DcmFileFormat(); if (dfile == NULL) { OFLOG_ERROR(dcmpschkLogger, "out of memory."); return -1; } OFCondition cond = dfile->loadFile(filename); if (! cond.good()) { OFLOG_ERROR(dcmpschkLogger, cond.text() << " reading file: " << filename); delete dfile; return -1; } int numberOfErrors = 0; OFBool test_passed = OFTrue; DcmDataset *DataSet = dfile->getDataset(); DcmMetaInfo *MetaInfo = dfile->getMetaInfo(); OFLOG_INFO(dcmpschkLogger, "========================================================="); OFLOG_WARN(dcmpschkLogger, "Testing: " << filename); OFLOG_INFO(dcmpschkLogger, "========================================================="); if (MetaInfo) { OFLOG_INFO(dcmpschkLogger, "---------------------------------------------------------" << OFendl << "Pass 1 - Inconsistencies between Meta-header and Data Set" << OFendl << "---------------------------------------------------------"); numberOfErrors += dcmchkMetaHeader(MetaInfo, DataSet); } OFLOG_INFO(dcmpschkLogger, "-------------------------------------------------------------" << OFendl << "Pass 2 - Inconsistencies between Data Dictionary and Data Set" << OFendl << "-------------------------------------------------------------"); dcmchk(opt_filename, ERM_autoDetect, EXS_Unknown, OFFalse /* showFullData */, OFTrue /* loadAllDataInMemory */, numberOfErrors); OFLOG_INFO(dcmpschkLogger, "-------------------------------------------------------------" << OFendl << "Pass 3 - Semantic Check of Presentation State Object " << OFendl << "-------------------------------------------------------------"); DcmUniqueIdentifier sopclassuid(DCM_SOPClassUID); DcmStack stack; if (EC_Normal == DataSet->search(DCM_SOPClassUID, stack, ESM_fromHere, OFFalse)) { sopclassuid = *((DcmUniqueIdentifier *)(stack.top())); } OFString aString; sopclassuid.getOFString(aString,0); if (aString == UID_GrayscaleSoftcopyPresentationStateStorage) { DcmPresentationState pState; if (pState.read(*DataSet).bad()) { test_passed = OFFalse; } } else { OFLOG_INFO(dcmpschkLogger, "Not a Grayscale Softcopy Presentation State, skipping pass 3."); } if (numberOfErrors > 0) test_passed = OFFalse; if (test_passed) OFLOG_WARN(dcmpschkLogger, "Test passed."); else OFLOG_WARN(dcmpschkLogger, "Test failed - one or more errors."); if (dfile) delete dfile; return numberOfErrors; } #define SHORTCOL 3 #define LONGCOL 12 int main(int argc, char *argv[]) { #ifdef HAVE_GUSI_H GUSISetup(GUSIwithSIOUXSockets); GUSISetup(GUSIwithInternetSockets); #endif #ifdef WITH_TCPWRAPPER // this code makes sure that the linker cannot optimize away // the DUL part of the network module where the external flags // for libwrap are defined. Needed on OpenBSD. dcmTCPWrapperDaemonName.set(NULL); #endif #ifdef HAVE_WINSOCK_H WSAData winSockData; /* we need at least version 1.1 */ WORD winSockVersionNeeded = MAKEWORD( 1, 1 ); WSAStartup(winSockVersionNeeded, &winSockData); #endif OFConsoleApplication app(OFFIS_CONSOLE_APPLICATION , "Checking tool for presentation states", rcsid); OFCommandLine cmd; cmd.setOptionColumns(LONGCOL, SHORTCOL); cmd.setParamColumn(LONGCOL + SHORTCOL + 2); cmd.addParam("dcmfile-in", "presentation state file(s) to be checked", OFCmdParam::PM_MultiMandatory); cmd.addGroup("general options:"); cmd.addOption("--help", "-h", "print this help text and exit", OFCommandLine::AF_Exclusive); cmd.addOption("--version", "print version information and exit", OFCommandLine::AF_Exclusive); OFLog::addOptions(cmd); /* evaluate command line */ prepareCmdLineArgs(argc, argv, OFFIS_CONSOLE_APPLICATION); if (app.parseCommandLine(cmd, argc, argv, OFCommandLine::PF_ExpandWildcards)) { /* check exclusive options first */ if (cmd.hasExclusiveOption()) { if (cmd.findOption("--version")) { app.printHeader(OFTrue /*print host identifier*/); COUT << OFendl << "External libraries used:"; #ifdef WITH_ZLIB COUT << OFendl << "- ZLIB, Version " << zlibVersion() << OFendl; #else COUT << " none" << OFendl; #endif return 0; } } /* options */ OFLog::configureFromCommandLine(cmd, app); } /* print resource identifier */ OFLOG_DEBUG(dcmpschkLogger, rcsid << OFendl); int paramCount = cmd.getParamCount(); for (int param=1; param <= paramCount; param++) { cmd.getParam(param, opt_filename); checkfile(opt_filename); } #ifdef DEBUG dcmDataDict.clear(); /* useful for debugging with dmalloc */ #endif return 0; } /* * CVS/RCS Log: * $Log: dcmpschk.cc,v $ * Revision 1.31 2010-10-14 13:13:45 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.30 2009-11-27 10:51:16 joergr * Fixed various issues with syntax usage (e.g. layout and formatting). * * Revision 1.29 2009-11-24 14:12:56 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.28 2009-08-03 09:12:53 joergr * Added support for checking the data type UT (Unlimited Text). * Moved flex++ generated lexical scanner from module "dcmpstat" to "dcmdata". * * Revision 1.27 2009-07-28 14:17:55 joergr * Added support for dubious date checking (year before 1850 or after 2050). * * Revision 1.26 2008-09-25 16:30:24 joergr * Added support for printing the expanded command line arguments. * Always output the resource identifier of the command line tool in debug mode. * * Revision 1.25 2008-04-30 12:38:43 meichel * Fixed compile errors due to changes in attribute tag names * * Revision 1.24 2006/08/15 16:57:01 meichel * Updated the code in module dcmpstat to correctly compile when * all standard C++ classes remain in namespace std. * * Revision 1.23 2006/07/27 14:38:03 joergr * Changed parameter "exclusive" of method addOption() from type OFBool into an * integer parameter "flags". Prepended prefix "PF_" to parseLine() flags. * Option "--help" is no longer an exclusive option by default. * Made naming conventions for command line parameters more consistent, e.g. * used "dcmfile-in", "dcmfile-out" and "bitmap-out". * * Revision 1.22 2005/12/14 17:43:42 meichel * Adapted code for compilation with TCP wrappers to NetBSD * * Revision 1.21 2005/12/12 15:14:34 meichel * Added code needed for compilation with TCP wrappers on OpenBSD * * Revision 1.20 2005/12/08 15:46:07 meichel * Changed include path schema for all DCMTK header files * * Revision 1.19 2005/12/02 09:46:27 joergr * Added new file read mode that makes it possible to distinguish between DICOM * files, datasets and other non-DICOM files. For this reason, the last * parameter of method loadFile() changed from OFBool to E_FileReadMode. * * Revision 1.18 2005/11/28 15:29:05 meichel * File dcdebug.h is not included by any other header file in the toolkit * anymore, to minimize the risk of name clashes of macro debug(). * * Revision 1.17 2005/03/09 18:07:53 joergr * Fixed spelling error. * * Revision 1.16 2004/02/04 15:44:38 joergr * Removed acknowledgements with e-mail addresses from CVS log. * * Revision 1.15 2003/09/05 09:00:49 meichel * Updated presentation state checker to use class DcmPresentationState * instead of DVPresentationState. Imported updated VR checking code * from module dcmcheck. * * Revision 1.14 2003/09/01 12:58:58 wilkens * Added #include to file to be able to compile again under Win32. * * Revision 1.13 2003/03/12 17:34:20 meichel * Updated DcmObject::print() flags * * Revision 1.12 2002/11/27 15:47:52 meichel * Adapted module dcmpstat to use of new header file ofstdinc.h * * Revision 1.11 2002/11/26 08:44:27 meichel * Replaced all includes for "zlib.h" with * to avoid inclusion of zlib.h in the makefile dependencies. * * Revision 1.10 2002/09/23 18:26:07 joergr * Added new command line option "--version" which prints the name and version * number of external libraries used (incl. preparation for future support of * 'config.guess' host identifiers). * * Revision 1.9 2002/08/20 12:21:53 meichel * Adapted code to new loadFile and saveFile methods, thus removing direct * use of the DICOM stream classes. * * Revision 1.8 2002/06/14 10:44:18 meichel * Adapted log file handling to ofConsole singleton * * Revision 1.7 2002/05/02 14:10:04 joergr * Added support for standard and non-standard string streams (which one is * supported is detected automatically via the configure mechanism). * * Revision 1.6 2002/04/16 14:01:27 joergr * Added configurable support for C++ ANSI standard includes (e.g. streams). * * Revision 1.5 2001/11/09 16:04:51 joergr * Changed type of variable to avoid compiler warnings (comparison of signed * and unsigned data). * * Revision 1.4 2001/10/02 11:51:59 joergr * Introduced new general purpose functions to get/put DICOM element values * from/to an item/dataset - removed some old and rarely used functions. * * Revision 1.3 2001/09/26 15:36:02 meichel * Adapted dcmpstat to class OFCondition * * Revision 1.2 2001/06/01 15:50:08 meichel * Updated copyright header * * Revision 1.1 2000/06/21 15:40:32 meichel * Added initial version of Presentation State Checker. * * */ dcmtk-3.6.0/dcmpstat/apps/dcmpsrcv.cc0000644000310500011400000016753311455601011016762 0ustar joergrdicom3/* * * Copyright (C) 1999-2010, 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 * * Authors: Marco Eichelberg * * Purpose: Presentation State Viewer - Network Receive Component (Store SCP) * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:13:45 $ * CVS/RCS Revision: $Revision: 1.59 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #ifdef HAVE_GUSI_H #include #endif BEGIN_EXTERN_C #ifdef HAVE_FCNTL_H #include /* for O_RDONLY */ #endif #ifdef HAVE_SYS_TYPES_H #include /* required for sys/stat.h */ #endif #ifdef HAVE_SYS_STAT_H #include /* for stat, fstat */ #endif END_EXTERN_C #include "dcmtk/dcmpstat/dvpsdef.h" /* for constants */ #include "dcmtk/dcmpstat/dvpscf.h" /* for class DVConfiguration */ #include "dcmtk/ofstd/ofbmanip.h" /* for OFBitmanipTemplate */ #include "dcmtk/dcmdata/dcuid.h" /* for dcmtk version name */ #include "dcmtk/dcmnet/diutil.h" #include "dcmtk/dcmdata/cmdlnarg.h" #include "dcmtk/ofstd/ofconapp.h" #include "dcmtk/dcmqrdb/dcmqrdbi.h" /* for LOCK_IMAGE_FILES */ #include "dcmtk/dcmqrdb/dcmqrdbs.h" /* for DcmQueryRetrieveDatabaseStatus */ #include "dcmtk/dcmpstat/dvpsmsg.h" /* for class DVPSIPCClient */ #include "dcmtk/dcmnet/dcmlayer.h" #include "dcmtk/dcmdata/dcfilefo.h" #include "dcmtk/dcmpstat/dcmpstat.h" #ifdef WITH_OPENSSL #include "dcmtk/dcmtls/tlstrans.h" #include "dcmtk/dcmtls/tlslayer.h" #endif #include "dcmtk/ofstd/ofstream.h" #ifdef WITH_ZLIB #include /* for zlibVersion() */ #endif #define OFFIS_CONSOLE_APPLICATION "dcmpsrcv" static OFLogger dcmpsrcvLogger = OFLog::getLogger("dcmtk.apps." OFFIS_CONSOLE_APPLICATION); static char rcsid[] = "$dcmtk: " OFFIS_CONSOLE_APPLICATION " v" OFFIS_DCMTK_VERSION " " OFFIS_DCMTK_RELEASEDATE " $"; DVPSIPCClient *messageClient = NULL; // global pointer to IPC message client, if present enum associationType { assoc_success, assoc_error, assoc_terminate }; enum refuseReason { ref_TooManyAssociations, ref_CannotFork, ref_BadAppContext, ref_BadAEPeer, ref_BadAEService, ref_NoReason }; static int errorCond(OFCondition cond, const char *message) { int result = (cond.bad()); if (result) { OFString temp_str; OFLOG_ERROR(dcmpsrcvLogger, message << OFendl << DimseCondition::dump(temp_str, cond)); } return result; } static void cleanChildren() { #ifdef HAVE_WAITPID int stat_loc; #elif HAVE_WAIT3 struct rusage rusage; #if defined(__NeXT__) /* some systems need a union wait as argument to wait3 */ union wait status; #else int status; #endif #endif #if defined(HAVE_WAITPID) || defined(HAVE_WAIT3) int child = 1; int options = WNOHANG; while (child > 0) { #ifdef HAVE_WAITPID child = (int)(waitpid(-1, &stat_loc, options)); #elif defined(HAVE_WAIT3) child = wait3(&status, options, &rusage); #endif if (child < 0) { if (errno != ECHILD) { char buf[256]; OFLOG_ERROR(dcmpsrcvLogger, "wait for child failed: " << OFStandard::strerror(errno, buf, sizeof(buf))); } } } #endif } static void dropAssociation(T_ASC_Association **assoc) { if ((assoc == NULL)||(*assoc == NULL)) return; OFCondition cond = ASC_dropSCPAssociation(*assoc); errorCond(cond, "Cannot Drop Association:"); cond = ASC_destroyAssociation(assoc); errorCond(cond, "Cannot Destroy Association:"); *assoc = NULL; return; } static OFCondition refuseAssociation(T_ASC_Association *assoc, refuseReason reason) { T_ASC_RejectParameters rej; switch (reason) { case ref_TooManyAssociations: rej.result = ASC_RESULT_REJECTEDTRANSIENT; rej.source = ASC_SOURCE_SERVICEPROVIDER_PRESENTATION_RELATED; rej.reason = ASC_REASON_SP_PRES_LOCALLIMITEXCEEDED; break; case ref_CannotFork: rej.result = ASC_RESULT_REJECTEDPERMANENT; rej.source = ASC_SOURCE_SERVICEPROVIDER_PRESENTATION_RELATED; rej.reason = ASC_REASON_SP_PRES_TEMPORARYCONGESTION; break; case ref_BadAppContext: rej.result = ASC_RESULT_REJECTEDTRANSIENT; rej.source = ASC_SOURCE_SERVICEUSER; rej.reason = ASC_REASON_SU_APPCONTEXTNAMENOTSUPPORTED; break; case ref_BadAEPeer: rej.result = ASC_RESULT_REJECTEDPERMANENT; rej.source = ASC_SOURCE_SERVICEUSER; rej.reason = ASC_REASON_SU_CALLINGAETITLENOTRECOGNIZED; break; case ref_BadAEService: rej.result = ASC_RESULT_REJECTEDPERMANENT; rej.source = ASC_SOURCE_SERVICEUSER; rej.reason = ASC_REASON_SU_CALLEDAETITLENOTRECOGNIZED; break; case ref_NoReason: default: rej.result = ASC_RESULT_REJECTEDPERMANENT; rej.source = ASC_SOURCE_SERVICEUSER; rej.reason = ASC_REASON_SU_NOREASON; break; } OFCondition cond = ASC_rejectAssociation(assoc, &rej); errorCond(cond, "Association Reject Failed:"); return cond; } static associationType negotiateAssociation( T_ASC_Network *net, T_ASC_Association **assoc, const char *aetitle, unsigned long maxPDU, OFBool opt_networkImplicitVROnly, OFBool useTLS) { associationType result = assoc_success; char buf[BUFSIZ]; OFBool dropAssoc = OFFalse; OFCondition cond = ASC_receiveAssociation(net, assoc, maxPDU, NULL, NULL, useTLS); if (errorCond(cond, "Failed to receive association:")) { dropAssoc = OFTrue; result = assoc_error; if (messageClient) { // notify about failed association setup OFOStringStream out; out << "Unable to Receive DIMSE Association Request:" << OFendl << cond.text() << OFendl << OFStringStream_ends; OFSTRINGSTREAM_GETSTR(out, theString) if (useTLS) messageClient->notifyReceivedEncryptedDICOMConnection(DVPSIPCMessage::statusError, theString); else messageClient->notifyReceivedUnencryptedDICOMConnection(DVPSIPCMessage::statusError, theString); OFSTRINGSTREAM_FREESTR(theString) } } else { time_t t = time(NULL); OFLOG_INFO(dcmpsrcvLogger, "Association Received (" << (*assoc)->params->DULparams.callingPresentationAddress << ":" << (*assoc)->params->DULparams.callingAPTitle << " -> " << (*assoc)->params->DULparams.calledAPTitle << ") " << ctime(&t)); ASC_setAPTitles((*assoc)->params, NULL, NULL, aetitle); /* Application Context Name */ cond = ASC_getApplicationContextName((*assoc)->params, buf); if (cond.bad() || strcmp(buf, DICOM_STDAPPLICATIONCONTEXT) != 0) { /* reject: the application context name is not supported */ OFLOG_INFO(dcmpsrcvLogger, "Bad AppContextName: " << buf); cond = refuseAssociation(*assoc, ref_BadAppContext); if (messageClient) { // notify about rejected association OFOStringStream out; OFString temp_str; out << "DIMSE Association Rejected:" << OFendl << " reason: bad application context name '" << buf << "'" << OFendl << " calling presentation address: " << (*assoc)->params->DULparams.callingPresentationAddress << OFendl << " calling AE title: " << (*assoc)->params->DULparams.callingAPTitle << OFendl << " called AE title: " << (*assoc)->params->DULparams.calledAPTitle << OFendl; out << ASC_dumpConnectionParameters(temp_str, *assoc) << OFendl; out << OFStringStream_ends; OFSTRINGSTREAM_GETSTR(out, theString) if (useTLS) messageClient->notifyReceivedEncryptedDICOMConnection(DVPSIPCMessage::statusError, theString); else messageClient->notifyReceivedUnencryptedDICOMConnection(DVPSIPCMessage::statusError, theString); OFSTRINGSTREAM_FREESTR(theString) } dropAssoc = OFTrue; result = assoc_error; } else { const char *nonStorageSyntaxes[] = { UID_VerificationSOPClass, UID_PrivateShutdownSOPClass }; const char* transferSyntaxes[] = { NULL, NULL, NULL }; int numTransferSyntaxes = 0; if (opt_networkImplicitVROnly) { transferSyntaxes[0] = UID_LittleEndianImplicitTransferSyntax; numTransferSyntaxes = 1; } else { transferSyntaxes[2] = UID_LittleEndianImplicitTransferSyntax; numTransferSyntaxes = 3; if (gLocalByteOrder == EBO_LittleEndian) { /* we are on a little endian machine */ transferSyntaxes[0] = UID_LittleEndianExplicitTransferSyntax; transferSyntaxes[1] = UID_BigEndianExplicitTransferSyntax; } else { /* we are on a big endian machine */ transferSyntaxes[0] = UID_BigEndianExplicitTransferSyntax; transferSyntaxes[1] = UID_LittleEndianExplicitTransferSyntax; } } /* accept any of the non-storage syntaxes */ cond = ASC_acceptContextsWithPreferredTransferSyntaxes( (*assoc)->params, (const char**)nonStorageSyntaxes, DIM_OF(nonStorageSyntaxes), (const char**)transferSyntaxes, numTransferSyntaxes); errorCond(cond, "Cannot accept presentation contexts:"); /* accept any of the storage syntaxes */ cond = ASC_acceptContextsWithPreferredTransferSyntaxes( (*assoc)->params, dcmAllStorageSOPClassUIDs, numberOfAllDcmStorageSOPClassUIDs, (const char**)transferSyntaxes, numTransferSyntaxes); errorCond(cond, "Cannot accept presentation contexts:"); } /* check if we have negotiated the private "shutdown" SOP Class */ if (0 != ASC_findAcceptedPresentationContextID(*assoc, UID_PrivateShutdownSOPClass)) { // we don't notify the IPC server about this incoming connection cond = refuseAssociation(*assoc, ref_NoReason); dropAssoc = OFTrue; result = assoc_terminate; } } /* receiveAssociation successful */ if (dropAssoc) dropAssociation(assoc); return result; } class StoreContext { public: DcmQueryRetrieveIndexDatabaseHandle *dbHandle; DIC_US status; const char *fileName; DcmFileFormat *dcmff; OFBool opt_correctUIDPadding; StoreContext(DcmQueryRetrieveIndexDatabaseHandle *handle, DIC_US aStatus, const char *fname, DcmFileFormat *ff, OFBool correctUID) : dbHandle(handle) , status(aStatus) , fileName(fname) , dcmff(ff) , opt_correctUIDPadding(correctUID) {} ~StoreContext() {} private: /* unimplemented */ StoreContext(const StoreContext&); /* unimplemented */ StoreContext& operator=(const StoreContext&); }; static void checkRequestAgainstDataset( T_DIMSE_C_StoreRQ *req, /* original store request */ const char* fname, /* filename of dataset */ DcmDataset *dataSet, /* dataset to check */ T_DIMSE_C_StoreRSP *rsp, /* final store response */ OFBool opt_correctUIDPadding) { DcmFileFormat ff; if (dataSet == NULL) { /* load the data from file */ if (ff.loadFile(fname).bad()) { OFLOG_ERROR(dcmpsrcvLogger, "Cannot open file: " << fname); rsp->DimseStatus = STATUS_STORE_Refused_OutOfResources; return; } dataSet = ff.getDataset(); } /* which SOP class and SOP instance ? */ DIC_UI sopClass; DIC_UI sopInstance; if (!DU_findSOPClassAndInstanceInDataSet(dataSet, sopClass, sopInstance, opt_correctUIDPadding)) { OFLOG_ERROR(dcmpsrcvLogger, "Bad image file: " << fname); rsp->DimseStatus = STATUS_STORE_Error_CannotUnderstand; } else if (strcmp(sopClass, req->AffectedSOPClassUID) != 0) { rsp->DimseStatus = STATUS_STORE_Error_DataSetDoesNotMatchSOPClass; } else if (strcmp(sopInstance, req->AffectedSOPInstanceUID) != 0) { rsp->DimseStatus = STATUS_STORE_Error_DataSetDoesNotMatchSOPClass; } else if (strcmp(sopClass, UID_GrayscaleSoftcopyPresentationStateStorage) == 0) { /* we have received a presentation state. Check if we can parse it! */ DcmPresentationState pstate; if (EC_Normal != pstate.read(*dataSet)) { OFLOG_ERROR(dcmpsrcvLogger, "Grayscale softcopy presentation state object cannot be displayed - rejected"); rsp->DimseStatus = STATUS_STORE_Error_CannotUnderstand; } } return; } static void saveImageToDB( StoreContext *context, T_DIMSE_C_StoreRQ *req, /* original store request */ const char *imageFileName, /* out */ T_DIMSE_C_StoreRSP *rsp, /* final store response */ DcmDataset **statusDetail) { DcmQueryRetrieveDatabaseStatus dbStatus(STATUS_Success); /* Store image */ if (context->status == STATUS_Success) { if (context->dbHandle->storeRequest(req->AffectedSOPClassUID, req->AffectedSOPInstanceUID, imageFileName, &dbStatus).bad()) { OFLOG_ERROR(dcmpsrcvLogger, "storeSCP: Database: DB_storeRequest Failed (" << DU_cstoreStatusString(dbStatus.status()) << ")"); } context->status = dbStatus.status(); } rsp->DimseStatus = context->status; *statusDetail = dbStatus.extractStatusDetail(); return; } static void storeProgressCallback( /* in */ void *callbackData, T_DIMSE_StoreProgress *progress, /* progress state */ T_DIMSE_C_StoreRQ *req, /* original store request */ char *imageFileName, /* being received into */ DcmDataset **imageDataSet, /* being received into */ /* out */ T_DIMSE_C_StoreRSP *rsp, /* final store response */ DcmDataset **statusDetail) { if (progress->state == DIMSE_StoreEnd) { StoreContext *context = (StoreContext *)callbackData; if (rsp->DimseStatus == STATUS_Success) { if ((imageDataSet)&&(*imageDataSet)) { checkRequestAgainstDataset(req, NULL, *imageDataSet, rsp, context->opt_correctUIDPadding); } else { checkRequestAgainstDataset(req, imageFileName, NULL, rsp, context->opt_correctUIDPadding); } } if (rsp->DimseStatus == STATUS_Success) { if ((imageDataSet)&&(*imageDataSet)) { OFCondition cond = context->dcmff->saveFile(context->fileName, EXS_LittleEndianExplicit, EET_ExplicitLength, EGL_recalcGL); if (! cond.good()) { OFLOG_ERROR(dcmpsrcvLogger, "Cannot write image file: " << context->fileName); rsp->DimseStatus = STATUS_STORE_Refused_OutOfResources; } } saveImageToDB(context, req, context->fileName, rsp, statusDetail); } } } static OFCondition echoSCP(T_ASC_Association *assoc, T_DIMSE_C_EchoRQ *req, T_ASC_PresentationContextID presId) { OFLOG_INFO(dcmpsrcvLogger, "Received Echo SCP RQ: MsgID " << req->MessageID); OFCondition cond = DIMSE_sendEchoResponse(assoc, presId, req, STATUS_Success, NULL); errorCond(cond, "echoSCP: Echo Response Failed:"); return cond; } static OFCondition storeSCP( T_ASC_Association *assoc, T_DIMSE_C_StoreRQ *request, T_ASC_PresentationContextID presId, const char *dbfolder, OFBool opt_bitpreserving, OFBool opt_correctUIDPadding) { OFString str; OFLOG_INFO(dcmpsrcvLogger, "Received Store SCP:\n" << DIMSE_dumpMessage(str, *request, DIMSE_INCOMING)); OFCondition cond = EC_Normal; char imageFileName[MAXPATHLEN+1]; DcmFileFormat dcmff; // store SourceApplicationEntityTitle in metaheader if (assoc && assoc->params) { const char *aet = assoc->params->DULparams.callingAPTitle; if (aet) dcmff.getMetaInfo()->putAndInsertString(DCM_SourceApplicationEntityTitle, aet); } DcmDataset *dset = dcmff.getDataset(); DIC_US status = STATUS_Success; DcmQueryRetrieveIndexDatabaseHandle *dbhandle = NULL; if (!dcmIsaStorageSOPClassUID(request->AffectedSOPClassUID)) { /* callback will send back sop class not supported status */ status = STATUS_STORE_Refused_SOPClassNotSupported; /* must still receive data */ strcpy(imageFileName, NULL_DEVICE_NAME); } else { dbhandle = new DcmQueryRetrieveIndexDatabaseHandle(dbfolder, PSTAT_MAXSTUDYCOUNT, PSTAT_STUDYSIZE, cond); if (cond.bad()) { OFLOG_ERROR(dcmpsrcvLogger, "Unable to access database '" << dbfolder << "'"); /* must still receive data */ strcpy(imageFileName, NULL_DEVICE_NAME); /* callback will send back out of resources status */ status = STATUS_STORE_Refused_OutOfResources; dbhandle = NULL; } else { if (dbhandle->makeNewStoreFileName( request->AffectedSOPClassUID, request->AffectedSOPInstanceUID, imageFileName).bad()) { OFLOG_ERROR(dcmpsrcvLogger, "storeSCP: Database: DB_makeNewStoreFileName Failed"); /* must still receive data */ strcpy(imageFileName, NULL_DEVICE_NAME); /* callback will send back out of resources status */ status = STATUS_STORE_Refused_OutOfResources; } } } #ifdef LOCK_IMAGE_FILES /* exclusively lock image file, but only on Unix systems - * on Win32 we would prevent ourselves from writing the file! */ #ifdef O_BINARY int lockfd = open(imageFileName, (O_WRONLY | O_CREAT | O_TRUNC | O_BINARY), 0666); #else int lockfd = open(imageFileName, (O_WRONLY | O_CREAT | O_TRUNC), 0666); #endif dcmtk_flock(lockfd, LOCK_EX); #endif /* we must still retrieve the data set even if some error has occured */ StoreContext context(dbhandle, status, imageFileName, &dcmff, opt_correctUIDPadding); if (opt_bitpreserving) { cond = DIMSE_storeProvider(assoc, presId, request, imageFileName, 1, NULL, storeProgressCallback, (void*)&context, DIMSE_BLOCKING, 0); } else { cond = DIMSE_storeProvider(assoc, presId, request, (char *)NULL, 1, &dset, storeProgressCallback, (void*)&context, DIMSE_BLOCKING, 0); } errorCond(cond, "Store SCP Failed:"); if (cond.bad() || (context.status != STATUS_Success)) { /* remove file */ if (strcpy(imageFileName, NULL_DEVICE_NAME) != 0) { OFLOG_INFO(dcmpsrcvLogger, "Store SCP: Deleting Image File: " << imageFileName); unlink(imageFileName); } if (dbhandle) dbhandle->pruneInvalidRecords(); } #ifdef LOCK_IMAGE_FILES /* unlock image file */ dcmtk_flock(lockfd, LOCK_UN); close(lockfd); #endif /* free DB handle */ delete dbhandle; if (messageClient) { OFOStringStream out; Uint32 operationStatus = DVPSIPCMessage::statusError; if (cond.good()) { if (context.status == STATUS_Success) operationStatus = DVPSIPCMessage::statusOK; else operationStatus = DVPSIPCMessage::statusWarning; } const char *sopClassName = dcmFindNameOfUID(request->AffectedSOPClassUID); const char *successName = "failed"; if (operationStatus == DVPSIPCMessage::statusOK) successName = "successful"; if (sopClassName==NULL) sopClassName = request->AffectedSOPClassUID; out << "DICOM C-STORE receipt " << successName << ": " << OFendl << "\tSOP class UID : " << sopClassName << OFendl << "\tSOP instance UID : " << request->AffectedSOPInstanceUID << OFendl; if (operationStatus == DVPSIPCMessage::statusOK) { unsigned long fileSize = 0; struct stat fileStat; if (0 == stat(imageFileName, &fileStat)) fileSize = fileStat.st_size; out << "\tTarget file path : " << imageFileName << OFendl << "\tTarget file size (kB) : " << (fileSize+1023)/1024 << OFendl; } out << "\tDIMSE presentation ctx : " << (int)presId << OFendl << "\tDIMSE message ID : " << request->MessageID << OFendl << "\tDIMSE status : " << DU_cstoreStatusString(context.status) << OFendl << OFStringStream_ends; OFSTRINGSTREAM_GETSTR(out, theString) messageClient->notifyReceivedDICOMObject(operationStatus, theString); OFSTRINGSTREAM_FREESTR(theString) } return cond; } static void handleClient( T_ASC_Association **assoc, const char *dbfolder, OFBool opt_bitpreserving, OFBool useTLS, OFBool opt_correctUIDPadding) { OFCondition cond = ASC_acknowledgeAssociation(*assoc); if (! errorCond(cond, "Cannot acknowledge association:")) { OFLOG_INFO(dcmpsrcvLogger, "Association Acknowledged (Max Send PDV: " << (*assoc)->sendPDVLength << ")" << (ASC_countAcceptedPresentationContexts((*assoc)->params) == 0 ? " (but no valid presentation contexts)" : "")); if (messageClient) { // notify about successfully negotiated association OFOStringStream out; OFString temp_str; out << "DIMSE Association Acknowledged:" << OFendl << " calling presentation address: " << (*assoc)->params->DULparams.callingPresentationAddress << OFendl << " calling AE title: " << (*assoc)->params->DULparams.callingAPTitle << OFendl << " called AE title: " << (*assoc)->params->DULparams.calledAPTitle << OFendl << " max send PDV: " << (*assoc)->sendPDVLength << OFendl << " presentation contexts: " << ASC_countAcceptedPresentationContexts((*assoc)->params) << OFendl; out << ASC_dumpConnectionParameters(temp_str, *assoc) << OFendl; out << OFStringStream_ends; OFSTRINGSTREAM_GETSTR(out, theString) if (useTLS) messageClient->notifyReceivedEncryptedDICOMConnection(DVPSIPCMessage::statusOK, theString); else messageClient->notifyReceivedUnencryptedDICOMConnection(DVPSIPCMessage::statusOK, theString); OFSTRINGSTREAM_FREESTR(theString) } T_DIMSE_Message msg; T_ASC_PresentationContextID presID; cond = EC_Normal; /* do real work */ while (cond.good()) { cond = DIMSE_receiveCommand(*assoc, DIMSE_BLOCKING, 0, &presID, &msg, NULL); /* did peer release, abort, or do we have a valid message ? */ if (cond.good()) { /* process command */ switch (msg.CommandField) { case DIMSE_C_ECHO_RQ: cond = echoSCP(*assoc, &msg.msg.CEchoRQ, presID); break; case DIMSE_C_STORE_RQ: cond = storeSCP(*assoc, &msg.msg.CStoreRQ, presID, dbfolder, opt_bitpreserving, opt_correctUIDPadding); break; default: cond = DIMSE_BADCOMMANDTYPE; /* unsupported command */ OFLOG_ERROR(dcmpsrcvLogger, "Cannot handle command: 0x" << STD_NAMESPACE hex << (unsigned)msg.CommandField); break; } } else { /* finish processing loop */ } } /* while */ /* close association */ if (cond == DUL_PEERREQUESTEDRELEASE) { OFLOG_INFO(dcmpsrcvLogger, "Association Release"); cond = ASC_acknowledgeRelease(*assoc); errorCond(cond, "Cannot release association:"); if (messageClient) messageClient->notifyConnectionClosed(DVPSIPCMessage::statusOK); } else if (cond == DUL_PEERABORTEDASSOCIATION) { OFLOG_INFO(dcmpsrcvLogger, "Association Aborted"); if (messageClient) messageClient->notifyConnectionAborted(DVPSIPCMessage::statusWarning, "DIMSE association aborted by remote peer"); } else { errorCond(cond, "DIMSE Failure (aborting association):"); cond = ASC_abortAssociation(*assoc); errorCond(cond, "Cannot abort association:"); if (messageClient) messageClient->notifyConnectionAborted(DVPSIPCMessage::statusError, "DIMSE failure, aborting association"); } } dropAssociation(assoc); } static void terminateAllReceivers(DVConfiguration& dvi) { OFLOG_INFO(dcmpsrcvLogger, "Terminating all receivers"); const char *recID=NULL; const char *recAETitle=NULL; unsigned short recPort=0; OFBool recUseTLS=OFFalse; T_ASC_Network *net=NULL; T_ASC_Parameters *params=NULL; DIC_NODENAME localHost; DIC_NODENAME peerHost; T_ASC_Association *assoc=NULL; OFBool prepared = OFTrue; const char *xfer = UID_LittleEndianImplicitTransferSyntax; #ifdef WITH_OPENSSL /* TLS directory */ const char *current = NULL; const char *tlsFolder = dvi.getTLSFolder(); if (tlsFolder==NULL) tlsFolder = "."; /* key file format */ int keyFileFormat = SSL_FILETYPE_PEM; if (! dvi.getTLSPEMFormat()) keyFileFormat = SSL_FILETYPE_ASN1; #endif if ((ASC_initializeNetwork(NET_REQUESTOR, 0, 30, &net).bad())) return; Uint32 numReceivers = dvi.getNumberOfTargets(DVPSE_receiver); for (Uint32 i=0; i= 0x0090700fL OFString tlsCiphersuites(TLS1_TXT_RSA_WITH_AES_128_SHA ":" SSL3_TXT_RSA_DES_192_CBC3_SHA); #else OFString tlsCiphersuites(SSL3_TXT_RSA_DES_192_CBC3_SHA); #endif Uint32 tlsNumberOfCiphersuites = dvi.getTargetNumberOfCipherSuites(recID); if (tlsNumberOfCiphersuites > 0) { tlsCiphersuites.clear(); OFString currentSuite; const char *currentOpenSSL; for (Uint32 ui=0; ui 0) tlsCiphersuites += ":"; tlsCiphersuites += currentOpenSSL; } } } DcmTLSTransportLayer *tLayer = new DcmTLSTransportLayer(DICOM_APPLICATION_REQUESTOR, tlsRandomSeedFile.c_str()); if (tLayer) { if (tlsCACertificateFolder) tLayer->addTrustedCertificateDir(tlsCACertificateFolder, keyFileFormat); if (tlsDHParametersFile.size() > 0) tLayer->setTempDHParameters(tlsDHParametersFile.c_str()); tLayer->setPrivateKeyPasswd(tlsPrivateKeyPassword); // never prompt on console tLayer->setPrivateKeyFile(tlsPrivateKeyFile.c_str(), keyFileFormat); tLayer->setCertificateFile(tlsCertificateFile.c_str(), keyFileFormat); tLayer->setCipherSuites(tlsCiphersuites.c_str()); tLayer->setCertificateVerification(DCV_ignoreCertificate); ASC_setTransportLayer(net, tLayer, 1); } #else prepared = OFFalse; #endif } else { DcmTransportLayer *dLayer = new DcmTransportLayer(DICOM_APPLICATION_REQUESTOR); ASC_setTransportLayer(net, dLayer, 1); } if (prepared && recAETitle && (recPort > 0)) { if ((ASC_createAssociationParameters(¶ms, DEFAULT_MAXPDU)).good()) { ASC_setTransportLayerType(params, recUseTLS); ASC_setAPTitles(params, dvi.getNetworkAETitle(), recAETitle, NULL); gethostname(localHost, sizeof(localHost) - 1); sprintf(peerHost, "%s:%d", "localhost", (int)recPort); ASC_setPresentationAddresses(params, localHost, peerHost); // we propose only the "shutdown" SOP class in implicit VR ASC_addPresentationContext(params, 1, UID_PrivateShutdownSOPClass, &xfer, 1); // request shutdown association, abort if some strange peer accepts it if (ASC_requestAssociation(net, params, &assoc).good()) ASC_abortAssociation(assoc); ASC_dropAssociation(assoc); ASC_destroyAssociation(&assoc); } } } /* for loop */ ASC_dropNetwork(&net); #ifdef HAVE_WINSOCK_H WSACleanup(); #endif return; } // ******************************************** #define SHORTCOL 3 #define LONGCOL 12 int main(int argc, char *argv[]) { #ifdef HAVE_GUSI_H GUSISetup(GUSIwithSIOUXSockets); GUSISetup(GUSIwithInternetSockets); #endif #ifdef HAVE_WINSOCK_H WSAData winSockData; /* we need at least version 1.1 */ WORD winSockVersionNeeded = MAKEWORD( 1, 1 ); WSAStartup(winSockVersionNeeded, &winSockData); #endif int opt_terminate = 0; /* default: no terminate mode */ const char *opt_cfgName = NULL; /* config file name */ const char *opt_cfgID = NULL; /* name of entry in config file */ dcmDisableGethostbyaddr.set(OFTrue); // disable hostname lookup OFConsoleApplication app(OFFIS_CONSOLE_APPLICATION , "Network receive for presentation state viewer", rcsid); OFCommandLine cmd; cmd.setOptionColumns(LONGCOL, SHORTCOL); cmd.setParamColumn(LONGCOL + SHORTCOL + 2); cmd.addParam("config-file", "configuration file to be read"); cmd.addParam("receiver-id", "identifier of receiver in config file", OFCmdParam::PM_Optional); cmd.addGroup("general options:"); cmd.addOption("--help", "-h", "print this help text and exit", OFCommandLine::AF_Exclusive); cmd.addOption("--version", "print version information and exit", OFCommandLine::AF_Exclusive); OFLog::addOptions(cmd); cmd.addOption("--terminate", "-t", "terminate all running receivers"); /* evaluate command line */ prepareCmdLineArgs(argc, argv, OFFIS_CONSOLE_APPLICATION); if (app.parseCommandLine(cmd, argc, argv, OFCommandLine::PF_ExpandWildcards)) { /* check exclusive options first */ if (cmd.hasExclusiveOption()) { if (cmd.findOption("--version")) { app.printHeader(OFTrue /*print host identifier*/); COUT << OFendl << "External libraries used:"; #if !defined(WITH_ZLIB) && !defined(WITH_OPENSSL) COUT << " none" << OFendl; #else COUT << OFendl; #endif #ifdef WITH_ZLIB COUT << "- ZLIB, Version " << zlibVersion() << OFendl; #endif #ifdef WITH_OPENSSL COUT << "- " << OPENSSL_VERSION_TEXT << OFendl; #endif return 0; } } /* command line parameters and options */ cmd.getParam(1, opt_cfgName); if (cmd.getParamCount() >= 2) cmd.getParam(2, opt_cfgID); if (cmd.findOption("--terminate")) opt_terminate = 1; OFLog::configureFromCommandLine(cmd, app); } /* print resource identifier */ OFLOG_DEBUG(dcmpsrcvLogger, rcsid << OFendl); if ((opt_cfgID == 0)&&(! opt_terminate)) { OFLOG_FATAL(dcmpsrcvLogger, "paramter receiver-id required unless --terminate is specified"); return 10; } if (opt_cfgName) { FILE *cfgfile = fopen(opt_cfgName, "rb"); if (cfgfile) fclose(cfgfile); else { OFLOG_FATAL(dcmpsrcvLogger, "can't open configuration file '" << opt_cfgName << "'"); return 10; } } else { OFLOG_FATAL(dcmpsrcvLogger, "missing configuration file name"); return 10; } /* make sure data dictionary is loaded */ if (!dcmDataDict.isDictionaryLoaded()) { OFLOG_WARN(dcmpsrcvLogger, "no data dictionary loaded, check environment variable: " << DCM_DICT_ENVIRONMENT_VARIABLE); } DVConfiguration dvi(opt_cfgName); if (opt_terminate) { terminateAllReceivers(dvi); return 0; // application terminates here } /* get network configuration from configuration file */ OFBool networkImplicitVROnly = dvi.getTargetImplicitOnly(opt_cfgID); OFBool networkBitPreserving = dvi.getTargetBitPreservingMode(opt_cfgID); OFBool opt_correctUIDPadding = dvi.getTargetCorrectUIDPadding(opt_cfgID); OFBool networkDisableNewVRs = dvi.getTargetDisableNewVRs(opt_cfgID); unsigned short networkPort = dvi.getTargetPort(opt_cfgID); unsigned long networkMaxPDU = dvi.getTargetMaxPDU(opt_cfgID); const char *networkAETitle = dvi.getTargetAETitle(opt_cfgID); if (networkAETitle==NULL) networkAETitle = dvi.getNetworkAETitle(); unsigned short messagePort = dvi.getMessagePort(); /* port number for IPC */ OFBool keepMessagePortOpen = dvi.getMessagePortKeepOpen(); OFBool useTLS = dvi.getTargetUseTLS(opt_cfgID); OFBool notifyTermination = OFTrue; // notify IPC server of application termination #ifdef WITH_OPENSSL /* TLS directory */ const char *current = NULL; const char *tlsFolder = dvi.getTLSFolder(); if (tlsFolder==NULL) tlsFolder = "."; /* certificate file */ OFString tlsCertificateFile(tlsFolder); tlsCertificateFile += PATH_SEPARATOR; current = dvi.getTargetCertificate(opt_cfgID); if (current) tlsCertificateFile += current; else tlsCertificateFile += "sitecert.pem"; /* private key file */ OFString tlsPrivateKeyFile(tlsFolder); tlsPrivateKeyFile += PATH_SEPARATOR; current = dvi.getTargetPrivateKey(opt_cfgID); if (current) tlsPrivateKeyFile += current; else tlsPrivateKeyFile += "sitekey.pem"; /* private key password */ const char *tlsPrivateKeyPassword = dvi.getTargetPrivateKeyPassword(opt_cfgID); /* certificate verification */ DcmCertificateVerification tlsCertVerification = DCV_requireCertificate; switch (dvi.getTargetPeerAuthentication(opt_cfgID)) { case DVPSQ_require: tlsCertVerification = DCV_requireCertificate; break; case DVPSQ_verify: tlsCertVerification = DCV_checkCertificate; break; case DVPSQ_ignore: tlsCertVerification = DCV_ignoreCertificate; break; } /* DH parameter file */ OFString tlsDHParametersFile; current = dvi.getTargetDiffieHellmanParameters(opt_cfgID); if (current) { tlsDHParametersFile = tlsFolder; tlsDHParametersFile += PATH_SEPARATOR; tlsDHParametersFile += current; } /* random seed file */ OFString tlsRandomSeedFile(tlsFolder); tlsRandomSeedFile += PATH_SEPARATOR; current = dvi.getTargetRandomSeed(opt_cfgID); if (current) tlsRandomSeedFile += current; else tlsRandomSeedFile += "siteseed.bin"; /* CA certificate directory */ const char *tlsCACertificateFolder = dvi.getTLSCACertificateFolder(); if (tlsCACertificateFolder==NULL) tlsCACertificateFolder = "."; /* key file format */ int keyFileFormat = SSL_FILETYPE_PEM; if (! dvi.getTLSPEMFormat()) keyFileFormat = SSL_FILETYPE_ASN1; /* ciphersuites */ #if OPENSSL_VERSION_NUMBER >= 0x0090700fL OFString tlsCiphersuites(TLS1_TXT_RSA_WITH_AES_128_SHA ":" SSL3_TXT_RSA_DES_192_CBC3_SHA); #else OFString tlsCiphersuites(SSL3_TXT_RSA_DES_192_CBC3_SHA); #endif Uint32 tlsNumberOfCiphersuites = dvi.getTargetNumberOfCipherSuites(opt_cfgID); if (tlsNumberOfCiphersuites > 0) { tlsCiphersuites.clear(); OFString currentSuite; const char *currentOpenSSL; for (Uint32 ui=0; ui 0) tlsCiphersuites += ":"; tlsCiphersuites += currentOpenSSL; } } } #else if (useTLS) { OFLOG_FATAL(dcmpsrcvLogger, "not compiled with OpenSSL, cannot use TLS"); return 10; } #endif if (networkAETitle==NULL) { OFLOG_FATAL(dcmpsrcvLogger, "no application entity title"); return 10; } if (networkPort==0) { OFLOG_FATAL(dcmpsrcvLogger, "no or invalid port number"); return 10; } #ifdef HAVE_GETEUID /* if port is privileged we must be as well */ if ((networkPort < 1024)&&(geteuid() != 0)) { OFLOG_FATAL(dcmpsrcvLogger, "cannot listen on port " << networkPort << ", insufficient privileges"); return 10; } #endif if (networkMaxPDU==0) networkMaxPDU = DEFAULT_MAXPDU; else if (networkMaxPDU > ASC_MAXIMUMPDUSIZE) { OFLOG_FATAL(dcmpsrcvLogger, "max PDU size " << networkMaxPDU << " too big, using default: " << DEFAULT_MAXPDU); networkMaxPDU = DEFAULT_MAXPDU; } if (networkDisableNewVRs) { dcmEnableUnknownVRGeneration.set(OFFalse); dcmEnableUnlimitedTextVRGeneration.set(OFFalse); } OFOStringStream verboseParameters; OFBool comma=OFFalse; verboseParameters << "Network parameters:" << OFendl << " port : " << networkPort << OFendl << " aetitle : " << networkAETitle << OFendl << " max pdu : " << networkMaxPDU << OFendl << " options : "; if (networkImplicitVROnly) { if (comma) verboseParameters << ", "; else comma=OFTrue; verboseParameters << "implicit xfer syntax only"; } if (networkBitPreserving) { if (comma) verboseParameters << ", "; else comma=OFTrue; verboseParameters << "bit-preserving receive mode"; } if (networkDisableNewVRs) { if (comma) verboseParameters << ", "; else comma=OFTrue; verboseParameters << "disable post-1993 VRs"; } if (!comma) verboseParameters << "none"; verboseParameters << OFendl; verboseParameters << " TLS : "; if (useTLS) verboseParameters << "enabled" << OFendl; else verboseParameters << "disabled" << OFendl; #ifdef WITH_OPENSSL if (useTLS) { verboseParameters << " TLS certificate : " << tlsCertificateFile << OFendl << " TLS key file : " << tlsPrivateKeyFile << OFendl << " TLS DH params : " << tlsDHParametersFile << OFendl << " TLS PRNG seed : " << tlsRandomSeedFile << OFendl << " TLS CA directory: " << tlsCACertificateFolder << OFendl << " TLS ciphersuites: " << tlsCiphersuites << OFendl << " TLS key format : "; if (keyFileFormat == SSL_FILETYPE_PEM) verboseParameters << "PEM" << OFendl; else verboseParameters << "DER" << OFendl; verboseParameters << " TLS cert verify : "; switch (tlsCertVerification) { case DCV_checkCertificate: verboseParameters << "verify" << OFendl; break; case DCV_ignoreCertificate: verboseParameters << "ignore" << OFendl; break; default: verboseParameters << "require" << OFendl; break; } } #endif verboseParameters << OFStringStream_ends; OFSTRINGSTREAM_GETSTR(verboseParameters, verboseParametersString) OFLOG_INFO(dcmpsrcvLogger, verboseParametersString); /* check if we can get access to the database */ const char *dbfolder = dvi.getDatabaseFolder(); OFLOG_INFO(dcmpsrcvLogger, "Using database in directory '" << dbfolder << "'"); OFCondition cond2 = EC_Normal; DcmQueryRetrieveIndexDatabaseHandle *dbhandle = new DcmQueryRetrieveIndexDatabaseHandle(dbfolder, PSTAT_MAXSTUDYCOUNT, PSTAT_STUDYSIZE, cond2); delete dbhandle; if (cond2.bad()) { OFLOG_FATAL(dcmpsrcvLogger, "Unable to access database '" << dbfolder << "'"); return 1; } T_ASC_Network *net = NULL; /* the DICOM network and listen port */ T_ASC_Association *assoc = NULL; /* the DICOM association */ OFBool finished1 = OFFalse; OFBool finished2 = OFFalse; int connected = 0; OFCondition cond = EC_Normal; #ifdef WITH_OPENSSL DcmTLSTransportLayer *tLayer = NULL; if (useTLS) { tLayer = new DcmTLSTransportLayer(DICOM_APPLICATION_ACCEPTOR, tlsRandomSeedFile.c_str()); if (tLayer == NULL) { OFLOG_FATAL(dcmpsrcvLogger, "unable to create TLS transport layer"); return 1; } if (tlsCACertificateFolder && (TCS_ok != tLayer->addTrustedCertificateDir(tlsCACertificateFolder, keyFileFormat))) { OFLOG_WARN(dcmpsrcvLogger, "unable to load certificates from directory '" << tlsCACertificateFolder << "', ignoring"); } if ((tlsDHParametersFile.size() > 0) && ! (tLayer->setTempDHParameters(tlsDHParametersFile.c_str()))) { OFLOG_WARN(dcmpsrcvLogger, "unable to load temporary DH parameter file '" << tlsDHParametersFile << "', ignoring"); } tLayer->setPrivateKeyPasswd(tlsPrivateKeyPassword); // never prompt on console if (TCS_ok != tLayer->setPrivateKeyFile(tlsPrivateKeyFile.c_str(), keyFileFormat)) { OFLOG_FATAL(dcmpsrcvLogger, "unable to load private TLS key from '" << tlsPrivateKeyFile<< "'"); return 1; } if (TCS_ok != tLayer->setCertificateFile(tlsCertificateFile.c_str(), keyFileFormat)) { OFLOG_FATAL(dcmpsrcvLogger, "unable to load certificate from '" << tlsCertificateFile << "'"); return 1; } if (! tLayer->checkPrivateKeyMatchesCertificate()) { OFLOG_FATAL(dcmpsrcvLogger, "private key '" << tlsPrivateKeyFile << "' and certificate '" << tlsCertificateFile << "' do not match"); return 1; } if (TCS_ok != tLayer->setCipherSuites(tlsCiphersuites.c_str())) { OFLOG_FATAL(dcmpsrcvLogger, "unable to set selected cipher suites"); return 1; } tLayer->setCertificateVerification(tlsCertVerification); } #endif while (!finished1) { /* open listen socket */ cond = ASC_initializeNetwork(NET_ACCEPTOR, networkPort, 30, &net); if (errorCond(cond, "Error initialising network:")) { return 1; } #ifdef WITH_OPENSSL if (tLayer) { cond = ASC_setTransportLayer(net, tLayer, 0); if (cond.bad()) { OFString temp_str; OFLOG_FATAL(dcmpsrcvLogger, DimseCondition::dump(temp_str, cond)); return 1; } } #endif #if defined(HAVE_SETUID) && defined(HAVE_GETUID) /* return to normal uid so that we can't do too much damage in case * things go very wrong. Only relevant if the program is setuid root, * and run by another user. Running as root user may be * potentially disasterous if this program screws up badly. */ setuid(getuid()); #endif #ifdef HAVE_FORK int timeout=1; #else int timeout=1000; #endif while (!finished2) { /* now we connect to the IPC server and request an application ID */ if (messageClient) // on Unix, re-initialize for each connect which is later inherited by the forked child { delete messageClient; messageClient = NULL; } if (messagePort > 0) { messageClient = new DVPSIPCClient(DVPSIPCMessage::clientStoreSCP, verboseParametersString, messagePort, keepMessagePortOpen); if (! messageClient->isServerActive()) { OFLOG_WARN(dcmpsrcvLogger, "no IPC message server found at port " << messagePort << ", disabling IPC"); } } connected = 0; while (!connected) { connected = ASC_associationWaiting(net, timeout); if (!connected) cleanChildren(); } switch (negotiateAssociation(net, &assoc, networkAETitle, networkMaxPDU, networkImplicitVROnly, useTLS)) { case assoc_error: // association has already been deleted, we just wait for the next client to connect. break; case assoc_terminate: finished2=OFTrue; finished1=OFTrue; notifyTermination = OFFalse; // IPC server will probably already be down cond = ASC_dropNetwork(&net); if (errorCond(cond, "Error dropping network:")) return 1; break; case assoc_success: #ifdef HAVE_FORK // Unix version - call fork() int pid; pid = (int)(fork()); if (pid < 0) { char buf[256]; OFLOG_ERROR(dcmpsrcvLogger, "Cannot create association sub-process: " << OFStandard::strerror(errno, buf, sizeof(buf))); refuseAssociation(assoc, ref_CannotFork); if (messageClient) { // notify about rejected association OFOStringStream out; OFString temp_str; out << "DIMSE Association Rejected:" << OFendl << " reason: cannot create association sub-process: " << OFStandard::strerror(errno, buf, sizeof(buf)) << OFendl << " calling presentation address: " << assoc->params->DULparams.callingPresentationAddress << OFendl << " calling AE title: " << assoc->params->DULparams.callingAPTitle << OFendl << " called AE title: " << assoc->params->DULparams.calledAPTitle << OFendl; out << ASC_dumpConnectionParameters(temp_str, assoc) << OFendl; out << OFStringStream_ends; OFSTRINGSTREAM_GETSTR(out, theString) if (useTLS) messageClient->notifyReceivedEncryptedDICOMConnection(DVPSIPCMessage::statusError, theString); else messageClient->notifyReceivedUnencryptedDICOMConnection(DVPSIPCMessage::statusError, theString); OFSTRINGSTREAM_FREESTR(theString) } dropAssociation(&assoc); } else if (pid > 0) { /* parent process */ assoc = NULL; } else { /* child process */ #ifdef WITH_OPENSSL // a generated UID contains the process ID and current time. // Adding it to the PRNG seed guarantees that we have different seeds for // different child processes. char randomUID[65]; dcmGenerateUniqueIdentifier(randomUID); if (tLayer) tLayer->addPRNGseed(randomUID, strlen(randomUID)); #endif handleClient(&assoc, dbfolder, networkBitPreserving, useTLS, opt_correctUIDPadding); finished2=OFTrue; finished1=OFTrue; } #else // Windows version - call CreateProcess() finished2=OFTrue; cond = ASC_dropNetwork(&net); if (errorCond(cond, "Error dropping network:")) { if (messageClient) { messageClient->notifyApplicationTerminates(DVPSIPCMessage::statusError); delete messageClient; } return 1; } // initialize startup info const char *receiver_application = dvi.getReceiverName(); PROCESS_INFORMATION procinfo; STARTUPINFO sinfo; OFBitmanipTemplate::zeroMem((char *)&sinfo, sizeof(sinfo)); sinfo.cb = sizeof(sinfo); char commandline[4096]; sprintf(commandline, "%s %s %s", receiver_application, opt_cfgName, opt_cfgID); #ifdef DEBUG if (CreateProcess(NULL, commandline, NULL, NULL, 0, 0, NULL, NULL, &sinfo, &procinfo)) #else if (CreateProcess(NULL, commandline, NULL, NULL, 0, DETACHED_PROCESS, NULL, NULL, &sinfo, &procinfo)) #endif { #ifdef WITH_OPENSSL // a generated UID contains the process ID and current time. // Adding it to the PRNG seed guarantees that we have different seeds for // different child processes. char randomUID[65]; dcmGenerateUniqueIdentifier(randomUID); if (tLayer) tLayer->addPRNGseed(randomUID, strlen(randomUID)); #endif handleClient(&assoc, dbfolder, networkBitPreserving, useTLS, opt_correctUIDPadding); finished1=OFTrue; } else { OFLOG_ERROR(dcmpsrcvLogger, "Cannot execute command line: " << commandline); refuseAssociation(assoc, ref_CannotFork); if (messageClient) { // notify about rejected association OFOStringStream out; out << "DIMSE Association Rejected:" << OFendl << " reason: cannot execute command line: " << commandline << OFendl << " calling presentation address: " << assoc->params->DULparams.callingPresentationAddress << OFendl << " calling AE title: " << assoc->params->DULparams.callingAPTitle << OFendl << " called AE title: " << assoc->params->DULparams.calledAPTitle << OFendl; ASC_dumpConnectionParameters(assoc, out); out << OFStringStream_ends; OFSTRINGSTREAM_GETSTR(out, theString) if (useTLS) messageClient->notifyReceivedEncryptedDICOMConnection(DVPSIPCMessage::statusError, theString); else messageClient->notifyReceivedUnencryptedDICOMConnection(DVPSIPCMessage::statusError, theString); OFSTRINGSTREAM_FREESTR(theString) } dropAssociation(&assoc); } #endif break; } } // finished2 } // finished1 cleanChildren(); // tell the IPC server that we're going to terminate. // We need to do this before we shutdown WinSock. if (messageClient && notifyTermination) { messageClient->notifyApplicationTerminates(DVPSIPCMessage::statusOK); delete messageClient; } #ifdef HAVE_WINSOCK_H WSACleanup(); #endif #ifdef WITH_OPENSSL if (tLayer) { if (tLayer->canWriteRandomSeed()) { if (!tLayer->writeRandomSeed(tlsRandomSeedFile.c_str())) { OFLOG_WARN(dcmpsrcvLogger, "cannot write back random seed file '" << tlsRandomSeedFile << "', ignoring"); } } else { OFLOG_WARN(dcmpsrcvLogger, "cannot write back random seed, ignoring"); } } delete tLayer; #endif OFSTRINGSTREAM_FREESTR(verboseParametersString) #ifdef DEBUG dcmDataDict.clear(); /* useful for debugging with dmalloc */ #endif return 0; } /* * CVS/RCS Log: * $Log: dcmpsrcv.cc,v $ * Revision 1.59 2010-10-14 13:13:45 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.58 2010-06-03 10:32:58 joergr * Replaced calls to strerror() by new helper function OFStandard::strerror() * which results in using the thread safe version of strerror() if available. * * Revision 1.57 2009-11-27 10:50:57 joergr * Fixed various issues with syntax usage (e.g. layout and formatting). * Sightly modifed log messages. * * Revision 1.56 2009-11-24 14:12:56 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.55 2008-09-25 16:30:24 joergr * Added support for printing the expanded command line arguments. * Always output the resource identifier of the command line tool in debug mode. * * Revision 1.54 2006/08/15 16:57:01 meichel * Updated the code in module dcmpstat to correctly compile when * all standard C++ classes remain in namespace std. * * Revision 1.53 2006/07/27 14:41:35 joergr * Changed parameter "exclusive" of method addOption() from type OFBool into an * integer parameter "flags". Prepended prefix "PF_" to parseLine() flags. * Option "--help" is no longer an exclusive option by default. * * Revision 1.52 2006/06/23 10:24:43 meichel * All Store SCPs in DCMTK now store the source application entity title in the * metaheader, both in normal and in bit-preserving mode. * * Revision 1.51 2005/12/08 15:46:10 meichel * Changed include path schema for all DCMTK header files * * Revision 1.50 2005/11/28 15:29:05 meichel * File dcdebug.h is not included by any other header file in the toolkit * anymore, to minimize the risk of name clashes of macro debug(). * * Revision 1.49 2005/11/23 16:10:32 meichel * Added support for AES ciphersuites in TLS module. All TLS-enabled * tools now support the "AES TLS Secure Transport Connection Profile". * * Revision 1.48 2005/11/16 14:58:23 meichel * Set association timeout in ASC_initializeNetwork to 30 seconds. This improves * the responsiveness of the tools if the peer blocks during assoc negotiation. * * Revision 1.47 2005/10/25 08:55:59 meichel * Updated list of UIDs and added support for new transfer syntaxes * and storage SOP classes. * * Revision 1.46 2005/04/04 10:11:53 meichel * Module dcmpstat now uses the dcmqrdb API instead of imagectn for maintaining * the index database * * Revision 1.45 2004/02/04 15:44:38 joergr * Removed acknowledgements with e-mail addresses from CVS log. * * Revision 1.44 2003/09/05 09:27:05 meichel * Modified code to use class DcmPresentationState instead of DVPresentationState. * * Revision 1.43 2003/09/04 10:10:59 joergr * Converted variable opt_verbose from int into OFBool to fix warnings reported * by MSVC6. * * Revision 1.42 2002/11/26 08:44:28 meichel * Replaced all includes for "zlib.h" with * to avoid inclusion of zlib.h in the makefile dependencies. * * Revision 1.41 2002/11/25 18:27:34 meichel * Converted compile time option to leniently handle space padded UIDs * in the Storage Service Class into command line / config file option. * * Revision 1.40 2002/09/23 19:06:31 joergr * Fixed typo in pre-processor directive. * * Revision 1.39 2002/09/23 18:26:09 joergr * Added new command line option "--version" which prints the name and version * number of external libraries used (incl. preparation for future support of * 'config.guess' host identifiers). * * Revision 1.38 2002/08/20 12:21:54 meichel * Adapted code to new loadFile and saveFile methods, thus removing direct * use of the DICOM stream classes. * * Revision 1.37 2002/06/14 10:20:52 meichel * Removed dependency from class DVInterface. Significantly reduces * size of binary. * * Revision 1.36 2002/05/02 14:10:04 joergr * Added support for standard and non-standard string streams (which one is * supported is detected automatically via the configure mechanism). * * Revision 1.35 2002/04/16 14:01:28 joergr * Added configurable support for C++ ANSI standard includes (e.g. streams). * * Revision 1.34 2002/01/08 10:31:46 joergr * Corrected spelling of function dcmGenerateUniqueIdentifier(). * * Revision 1.33 2001/10/12 13:46:49 meichel * Adapted dcmpstat to OFCondition based dcmnet module (supports strict mode). * * Revision 1.32 2001/09/28 13:48:20 joergr * Replaced "cerr" by "CERR". * Added "#include " to keep gcc 3.0 quiet. * * Revision 1.31 2001/06/07 14:34:09 joergr * Removed comment. * * Revision 1.29 2001/06/01 15:50:09 meichel * Updated copyright header * * Revision 1.28 2001/06/01 11:02:06 meichel * Implemented global flag and command line option to disable reverse * DNS hostname lookup using gethostbyaddr when accepting associations. * * Revision 1.27 2000/11/14 13:24:34 meichel * Fixed two problems with dcmpsrcv which caused the application not to * terminate if the IPC server could not be found or not to start another * receiver when run on Win32 platforms. * * Revision 1.26 2000/11/13 14:20:31 joergr * Added missing #include. * * Revision 1.25 2000/11/10 16:21:13 meichel * Fixed problem with DICOMscope being unable to shut down receiver processes * that are operating with TLS encryption by adding a special shutdown mode to * dcmpsrcv. * * Revision 1.24 2000/11/08 18:38:03 meichel * Updated dcmpstat IPC protocol for additional message parameters * * Revision 1.23 2000/10/23 12:19:15 joergr * Added missing parameter to call of function handleClient (only appeared * on systems not supporting 'fork' command). * * Revision 1.22 2000/10/16 12:33:53 joergr * Moved incorrectly placed #endif statement to correct position. * * Revision 1.20 2000/10/10 12:23:45 meichel * Added extensions for TLS encrypted communication * * Revision 1.19 2000/05/31 13:02:24 meichel * Moved dcmpstat macros and constants into a common header file * * Revision 1.18 2000/05/30 14:03:29 joergr * Added new private SOP class (UID definition) to allow external shutdown * of console applications via negotiation of this special SOP class * (currently used for imagectn and dcmpsrcv). * * Revision 1.17 2000/04/14 16:34:37 meichel * Global VR generation flags are now derived from OFGlobal and, thus, * safe for use in multi-thread applications. * * Revision 1.16 2000/03/08 16:28:43 meichel * Updated copyright header. * * Revision 1.15 2000/03/06 18:21:46 joergr * Avoid empty statement in the body of if-statements (MSVC6 reports warnings). * * Revision 1.14 2000/03/03 14:13:27 meichel * Implemented library support for redirecting error messages into memory * instead of printing them to stdout/stderr for GUI applications. * * Revision 1.13 2000/02/29 12:13:43 meichel * Removed support for VS value representation. This was proposed in CP 101 * but never became part of the standard. * * Revision 1.12 2000/02/02 15:18:00 meichel * Replaced some #if statements by more robust #ifdef * * Revision 1.11 1999/11/24 10:21:55 meichel * Fixed locking problem in dcmpssnd and dcmpsrcv on Win9x platforms. * * Revision 1.10 1999/09/06 13:29:48 meichel * Enhanced max receive PDU range to 4-128K. * * Revision 1.9 1999/05/05 14:23:56 joergr * Modified parameter of CreateProcess call to avoid creation of new command * line window under Windows. * * Revision 1.8 1999/05/03 14:16:38 joergr * Minor code purifications to keep Sun CC 2.0.1 quiet. * * Revision 1.7 1999/04/30 16:36:56 meichel * Renamed all flock calls to dcmtk_flock to avoid name clash between flock() * emulation based on fcntl() and a constructor for struct flock. * * Revision 1.6 1999/04/28 15:45:07 meichel * Cleaned up module dcmpstat apps, adapted to new command line class * and added short documentation. * * Revision 1.5 1999/02/25 18:34:54 joergr * Added debug code (explicitly delete data dictionary). * * Revision 1.4 1999/02/09 14:33:01 meichel * Changed some bool consts from true to OFTrue. * * Revision 1.3 1999/02/08 12:52:17 meichel * Removed dummy parameter from DVInterface constructor. * * Revision 1.2 1999/01/27 15:58:57 meichel * Corrected locking behaviour of dcmpsrcv on Win32 platforms. * * Revision 1.1 1999/01/27 14:59:24 meichel * Implemented DICOM network receive application "dcmpsrcv" which receives * images and presentation states and stores them in the local database. * * */ dcmtk-3.6.0/dcmpstat/apps/Makefile.in0000644000310500011400000000777611265112555016712 0ustar joergrdicom3# # Makefile for dcmpstat/apps # @SET_MAKE@ SHELL = /bin/sh VPATH = @srcdir@:@top_srcdir@/include:@top_srcdir@/@configdir@/include srcdir = @srcdir@ top_srcdir = @top_srcdir@ configdir = @top_srcdir@/@configdir@ include $(configdir)/@common_makefile@ ofstddir = $(top_srcdir)/../ofstd ofstdinc = -I$(ofstddir)/include ofstdlibdir = -L$(ofstddir)/libsrc ofstdlib = -lofstd oflogdir = $(top_srcdir)/../oflog ofloginc = -I$(oflogdir)/include ofloglibdir = -L$(oflogdir)/libsrc ofloglib = -loflog dcmdatadir = $(top_srcdir)/../dcmdata dcmdatainc = -I$(dcmdatadir)/include dcmdatalibdir = -L$(dcmdatadir)/libsrc dcmdatalib = -ldcmdata dcmnetdir = $(top_srcdir)/../dcmnet dcmnetinc = -I$(dcmnetdir)/include dcmnetlibdir = -L$(dcmnetdir)/libsrc dcmnetlib = -ldcmnet dcmimgledir = $(top_srcdir)/../dcmimgle dcmimgleinc = -I$(dcmimgledir)/include dcmimglelibdir = -L$(dcmimgledir)/libsrc dcmimglelib = -ldcmimgle dcmpstatdir = $(top_srcdir)/../dcmpstat dcmpstatinc = -I$(dcmpstatdir)/include dcmpstatlibdir = -L$(dcmpstatdir)/libsrc dcmpstatlib = -ldcmpstat dcmqrdbdir = $(top_srcdir)/../dcmqrdb dcmqrdbinc = -I$(dcmqrdbdir)/include dcmqrdblibdir = -L$(dcmqrdbdir)/libsrc dcmqrdblib = -ldcmqrdb dcmtlsdir = $(top_srcdir)/../dcmtls dcmtlsinc = -I$(dcmtlsdir)/include dcmtlslibdir = -L$(dcmtlsdir)/libsrc dcmtlslib = -ldcmtls dcmsigndir = $(top_srcdir)/../dcmsign dcmsigninc = -I$(dcmsigndir)/include dcmsignlibdir = -L$(dcmsigndir)/libsrc dcmsignlib = -ldcmdsig dcmsrdir = $(top_srcdir)/../dcmsr dcmsrinc = -I$(dcmsrdir)/include dcmsrlibdir = -L$(dcmsrdir)/libsrc dcmsrlib = -ldcmsr LOCALINCLUDES = $(dcmpstatinc) $(ofstdinc) $(ofloginc) $(dcmnetinc) $(dcmdatainc) \ $(dcmimgleinc) $(dcmqrdbinc) $(dcmtlsinc) $(dcmsigninc) $(dcmsrinc) LIBDIRS = -L$(top_srcdir)/libsrc $(dcmpstatlibdir) $(dcmqrdblibdir) $(dcmnetlibdir) \ $(dcmtlslibdir) $(dcmsignlibdir) $(dcmsrlibdir) $(dcmdatalibdir) $(ofstdlibdir) \ $(ofloglibdir) $(dcmimglelibdir) LOCALLIBS = $(dcmpstatlib) $(dcmsignlib) $(dcmimglelib) $(dcmsrlib) $(dcmqrdblib) $(dcmnetlib) \ $(dcmtlslib) $(dcmdatalib) $(ofloglib) $(ofstdlib) $(XMLLIBS) $(ZLIBLIBS) $(TCPWRAPPERLIBS) $(OPENSSLLIBS) DCMMKLUT_LIBS = $(dcmimglelib) $(dcmdatalib) $(ofloglib) $(ofstdlib) $(XMLLIBS) $(ZLIBLIBS) DCMMKCRV_LIBS = $(dcmdatalib) $(ofloglib) $(ofstdlib) $(XMLLIBS) $(ZLIBLIBS) objs = dcmpsmk.o dcmp2pgm.o dcmmklut.o dcmmkcrv.o dcmpssnd.o dcmpsrcv.o dcmpsprt.o dcmprscu.o \ dcmprscp.o dcmpschk.o progs = dcmpsmk dcmp2pgm dcmmklut dcmmkcrv dcmpssnd dcmpsrcv dcmpsprt dcmprscu dcmprscp dcmpschk all: $(progs) dcmpsmk: dcmpsmk.o $(CXX) $(CXXFLAGS) $(LDFLAGS) $(LIBDIRS) -o $@ dcmpsmk.o $(LOCALLIBS) $(MATHLIBS) $(LIBS) dcmp2pgm: dcmp2pgm.o $(CXX) $(CXXFLAGS) $(LDFLAGS) $(LIBDIRS) -o $@ dcmp2pgm.o $(LOCALLIBS) $(MATHLIBS) $(LIBS) dcmmklut: dcmmklut.o $(CXX) $(CXXFLAGS) $(LDFLAGS) $(LIBDIRS) -o $@ dcmmklut.o $(DCMMKLUT_LIBS) $(MATHLIBS) $(LIBS) dcmmkcrv: dcmmkcrv.o $(CXX) $(CXXFLAGS) $(LDFLAGS) $(LIBDIRS) -o $@ dcmmkcrv.o $(DCMMKCRV_LIBS) $(MATHLIBS) $(LIBS) dcmpssnd: dcmpssnd.o $(CXX) $(CXXFLAGS) $(LDFLAGS) $(LIBDIRS) -o $@ dcmpssnd.o $(LOCALLIBS) $(MATHLIBS) $(LIBS) dcmpsrcv: dcmpsrcv.o $(CXX) $(CXXFLAGS) $(LDFLAGS) $(LIBDIRS) -o $@ dcmpsrcv.o $(LOCALLIBS) $(MATHLIBS) $(LIBS) dcmpsprt: dcmpsprt.o $(CXX) $(CXXFLAGS) $(LDFLAGS) $(LIBDIRS) -o $@ dcmpsprt.o $(LOCALLIBS) $(MATHLIBS) $(LIBS) dcmprscu: dcmprscu.o $(CXX) $(CXXFLAGS) $(LDFLAGS) $(LIBDIRS) -o $@ dcmprscu.o $(LOCALLIBS) $(MATHLIBS) $(LIBS) dcmprscp: dcmprscp.o $(CXX) $(CXXFLAGS) $(LDFLAGS) $(LIBDIRS) -o $@ dcmprscp.o $(LOCALLIBS) $(MATHLIBS) $(LIBS) dcmpschk: dcmpschk.o $(CXX) $(CXXFLAGS) $(LDFLAGS) $(LIBDIRS) -o $@ dcmpschk.o $(LOCALLIBS) $(MATHLIBS) $(LIBS) install: all $(configdir)/mkinstalldirs $(DESTDIR)$(bindir) for prog in $(progs); do \ $(INSTALL_PROGRAM) $$prog$(BINEXT) $(DESTDIR)$(bindir) && strip $(DESTDIR)$(bindir)/$$prog$(BINEXT) ;\ done clean: rm -f $(objs) $(progs) $(TRASH) distclean: rm -f $(objs) $(progs) $(DISTTRASH) dependencies: $(CXX) -MM $(defines) $(includes) $(CPPFLAGS) $(CXXFLAGS) *.cc > $(DEP) include $(DEP) dcmtk-3.6.0/dcmpstat/apps/Makefile.dep0000644000310500011400000027104411465014454017044 0ustar joergrdicom3dcmmkcrv.o: dcmmkcrv.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../dcmdata/include/dcmtk/dcmdata/dctk.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../dcmdata/include/dcmtk/dcmdata/dcswap.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dcxfer.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvr.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../dcmdata/include/dcmtk/dcmdata/dcistrma.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dcostrma.h \ ../../dcmdata/include/dcmtk/dcmdata/dcuid.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvm.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h \ ../../dcmdata/include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmdata/include/dcmtk/dcmdata/dctag.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdicent.h \ ../../dcmdata/include/dcmtk/dcmdata/dchashdi.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdict.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdeftag.h \ ../../dcmdata/include/dcmtk/dcmdata/dcobject.h \ ../../dcmdata/include/dcmtk/dcmdata/dcstack.h \ ../../dcmdata/include/dcmtk/dcmdata/dcelem.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../../dcmdata/include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpcache.h \ ../../dcmdata/include/dcmtk/dcmdata/dcmetinf.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdatset.h \ ../../dcmdata/include/dcmtk/dcmdata/dcsequen.h \ ../../dcmdata/include/dcmtk/dcmdata/dcfilefo.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdicdir.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdirrec.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrulup.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrul.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpixseq.h \ ../../dcmdata/include/dcmtk/dcmdata/dcofsetl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcbytstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrae.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvras.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrcs.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrda.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrds.h \ ../../ofstd/include/dcmtk/ofstd/ofvector.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrdt.h \ ../../ofstd/include/dcmtk/ofstd/ofdatime.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvris.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrtm.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrui.h \ ../../dcmdata/include/dcmtk/dcmdata/dcchrstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlo.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlt.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrpn.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsh.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrst.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrut.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrobow.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpixel.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrpobw.h \ ../../dcmdata/include/dcmtk/dcmdata/dcovlay.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrat.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrss.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrus.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrfl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrfd.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrof.h \ ../../dcmdata/include/dcmtk/dcmdata/cmdlnarg.h \ ../../dcmdata/include/dcmtk/dcmdata/cmdlnarg.h \ ../../dcmdata/include/dcmtk/dcmdata/dcuid.h dcmmklut.o: dcmmklut.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../dcmdata/include/dcmtk/dcmdata/dctk.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../dcmdata/include/dcmtk/dcmdata/dcswap.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dcxfer.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvr.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../dcmdata/include/dcmtk/dcmdata/dcistrma.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dcostrma.h \ ../../dcmdata/include/dcmtk/dcmdata/dcuid.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvm.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h \ ../../dcmdata/include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmdata/include/dcmtk/dcmdata/dctag.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdicent.h \ ../../dcmdata/include/dcmtk/dcmdata/dchashdi.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdict.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdeftag.h \ ../../dcmdata/include/dcmtk/dcmdata/dcobject.h \ ../../dcmdata/include/dcmtk/dcmdata/dcstack.h \ ../../dcmdata/include/dcmtk/dcmdata/dcelem.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../../dcmdata/include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpcache.h \ ../../dcmdata/include/dcmtk/dcmdata/dcmetinf.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdatset.h \ ../../dcmdata/include/dcmtk/dcmdata/dcsequen.h \ ../../dcmdata/include/dcmtk/dcmdata/dcfilefo.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdicdir.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdirrec.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrulup.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrul.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpixseq.h \ ../../dcmdata/include/dcmtk/dcmdata/dcofsetl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcbytstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrae.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvras.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrcs.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrda.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrds.h \ ../../ofstd/include/dcmtk/ofstd/ofvector.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrdt.h \ ../../ofstd/include/dcmtk/ofstd/ofdatime.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvris.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrtm.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrui.h \ ../../dcmdata/include/dcmtk/dcmdata/dcchrstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlo.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlt.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrpn.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsh.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrst.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrut.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrobow.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpixel.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrpobw.h \ ../../dcmdata/include/dcmtk/dcmdata/dcovlay.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrat.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrss.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrus.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrfl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrfd.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrof.h \ ../../dcmdata/include/dcmtk/dcmdata/cmdlnarg.h \ ../../dcmdata/include/dcmtk/dcmdata/cmdlnarg.h \ ../../dcmdata/include/dcmtk/dcmdata/dcuid.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmimgle/include/dcmtk/dcmimgle/dicrvfit.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../dcmimgle/include/dcmtk/dcmimgle/digsdfn.h \ ../../dcmimgle/include/dcmtk/dcmimgle/didispfn.h \ ../../dcmimgle/include/dcmtk/dcmimgle/diutils.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h dcmp2pgm.o: dcmp2pgm.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmpstat/dviface.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../include/dcmtk/dcmpstat/dvpscf.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmpstat/dvpstyp.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../include/dcmtk/dcmpstat/dvpstat.h \ ../include/dcmtk/dcmpstat/dcmpstat.h \ ../../dcmdata/include/dcmtk/dcmdata/dctk.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../dcmdata/include/dcmtk/dcmdata/dcswap.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dcxfer.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvr.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../dcmdata/include/dcmtk/dcmdata/dcistrma.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dcostrma.h \ ../../dcmdata/include/dcmtk/dcmdata/dcuid.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvm.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h \ ../../dcmdata/include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmdata/include/dcmtk/dcmdata/dctag.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdicent.h \ ../../dcmdata/include/dcmtk/dcmdata/dchashdi.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdict.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdeftag.h \ ../../dcmdata/include/dcmtk/dcmdata/dcobject.h \ ../../dcmdata/include/dcmtk/dcmdata/dcstack.h \ ../../dcmdata/include/dcmtk/dcmdata/dcelem.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../../dcmdata/include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpcache.h \ ../../dcmdata/include/dcmtk/dcmdata/dcmetinf.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdatset.h \ ../../dcmdata/include/dcmtk/dcmdata/dcsequen.h \ ../../dcmdata/include/dcmtk/dcmdata/dcfilefo.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdicdir.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdirrec.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrulup.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrul.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpixseq.h \ ../../dcmdata/include/dcmtk/dcmdata/dcofsetl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcbytstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrae.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvras.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrcs.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrda.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrds.h \ ../../ofstd/include/dcmtk/ofstd/ofvector.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrdt.h \ ../../ofstd/include/dcmtk/ofstd/ofdatime.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvris.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrtm.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrui.h \ ../../dcmdata/include/dcmtk/dcmdata/dcchrstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlo.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlt.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrpn.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsh.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrst.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrut.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrobow.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpixel.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrpobw.h \ ../../dcmdata/include/dcmtk/dcmdata/dcovlay.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrat.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrss.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrus.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrfl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrfd.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrof.h \ ../../dcmdata/include/dcmtk/dcmdata/cmdlnarg.h \ ../include/dcmtk/dcmpstat/dvpsovl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../include/dcmtk/dcmpstat/dvpsgll.h ../include/dcmtk/dcmpstat/dvpsrsl.h \ ../include/dcmtk/dcmpstat/dvpsall.h ../include/dcmtk/dcmpstat/dvpsgal.h \ ../include/dcmtk/dcmpstat/dvpscul.h ../include/dcmtk/dcmpstat/dvpsvll.h \ ../include/dcmtk/dcmpstat/dvpsvwl.h ../include/dcmtk/dcmpstat/dvpsdal.h \ ../include/dcmtk/dcmpstat/dvpssvl.h ../include/dcmtk/dcmpstat/dvpspl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrus.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrui.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlo.h \ ../../dcmqrdb/include/dcmtk/dcmqrdb/dcmqridx.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../dcmnet/include/dcmtk/dcmnet/dicom.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../dcmnet/include/dcmtk/dcmnet/cond.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../../dcmnet/include/dcmtk/dcmnet/dcompat.h \ ../../ofstd/include/dcmtk/ofstd/ofbmanip.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../dcmdata/include/dcmtk/dcmdata/dcuid.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdatset.h \ ../../dcmdata/include/dcmtk/dcmdata/dcuid.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdeftag.h \ ../../dcmqrdb/include/dcmtk/dcmqrdb/dcmqrdbi.h \ ../../dcmqrdb/include/dcmtk/dcmqrdb/dcmqrdba.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmnet/include/dcmtk/dcmnet/dimse.h \ ../../dcmnet/include/dcmtk/dcmnet/dicom.h \ ../../dcmnet/include/dcmtk/dcmnet/lst.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../dcmnet/include/dcmtk/dcmnet/dul.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../dcmnet/include/dcmtk/dcmnet/extneg.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmnet/include/dcmtk/dcmnet/dcuserid.h \ ../../dcmnet/include/dcmtk/dcmnet/assoc.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdatset.h \ ../../ofstd/include/dcmtk/ofstd/offname.h \ ../include/dcmtk/dcmpstat/dvcache.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../dcmqrdb/include/dcmtk/dcmqrdb/dcmqrdbi.h \ ../include/dcmtk/dcmpstat/dvpstx.h ../include/dcmtk/dcmpstat/dvpsgr.h \ ../include/dcmtk/dcmpstat/dvpscu.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../../dcmimgle/include/dcmtk/dcmimgle/dcmimage.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../dcmimgle/include/dcmtk/dcmimgle/dimoimg.h \ ../../dcmimgle/include/dcmtk/dcmimgle/diimage.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../../dcmdata/include/dcmtk/dcmdata/dcfcache.h \ ../../dcmimgle/include/dcmtk/dcmimgle/diovlay.h \ ../../dcmimgle/include/dcmtk/dcmimgle/diobjcou.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../dcmimgle/include/dcmtk/dcmimgle/diovdat.h \ ../../dcmimgle/include/dcmtk/dcmimgle/diovpln.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmimgle/include/dcmtk/dcmimgle/diutils.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../dcmimgle/include/dcmtk/dcmimgle/dimopx.h \ ../../dcmimgle/include/dcmtk/dcmimgle/dipixel.h \ ../../dcmimgle/include/dcmtk/dcmimgle/dimomod.h \ ../../dcmimgle/include/dcmtk/dcmimgle/diluptab.h \ ../../dcmdata/include/dcmtk/dcmdata/dctagkey.h \ ../../dcmimgle/include/dcmtk/dcmimgle/dibaslut.h \ ../../dcmimgle/include/dcmtk/dcmimgle/dimoopx.h \ ../../dcmimgle/include/dcmtk/dcmimgle/didispfn.h \ ../../dcmdata/include/dcmtk/dcmdata/cmdlnarg.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../dcmdata/include/dcmtk/dcmdata/dcuid.h dcmprscp.o: dcmprscp.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmpstat/dvpsdef.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../include/dcmtk/dcmpstat/dviface.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../include/dcmtk/dcmpstat/dvpscf.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmpstat/dvpstyp.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmpstat/dvpstat.h \ ../include/dcmtk/dcmpstat/dcmpstat.h \ ../../dcmdata/include/dcmtk/dcmdata/dctk.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../dcmdata/include/dcmtk/dcmdata/dcswap.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dcxfer.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvr.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../dcmdata/include/dcmtk/dcmdata/dcistrma.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dcostrma.h \ ../../dcmdata/include/dcmtk/dcmdata/dcuid.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvm.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h \ ../../dcmdata/include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmdata/include/dcmtk/dcmdata/dctag.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdicent.h \ ../../dcmdata/include/dcmtk/dcmdata/dchashdi.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdict.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdeftag.h \ ../../dcmdata/include/dcmtk/dcmdata/dcobject.h \ ../../dcmdata/include/dcmtk/dcmdata/dcstack.h \ ../../dcmdata/include/dcmtk/dcmdata/dcelem.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../../dcmdata/include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpcache.h \ ../../dcmdata/include/dcmtk/dcmdata/dcmetinf.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdatset.h \ ../../dcmdata/include/dcmtk/dcmdata/dcsequen.h \ ../../dcmdata/include/dcmtk/dcmdata/dcfilefo.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdicdir.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdirrec.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrulup.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrul.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpixseq.h \ ../../dcmdata/include/dcmtk/dcmdata/dcofsetl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcbytstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrae.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvras.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrcs.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrda.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrds.h \ ../../ofstd/include/dcmtk/ofstd/ofvector.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrdt.h \ ../../ofstd/include/dcmtk/ofstd/ofdatime.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvris.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrtm.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrui.h \ ../../dcmdata/include/dcmtk/dcmdata/dcchrstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlo.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlt.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrpn.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsh.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrst.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrut.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrobow.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpixel.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrpobw.h \ ../../dcmdata/include/dcmtk/dcmdata/dcovlay.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrat.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrss.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrus.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrfl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrfd.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrof.h \ ../../dcmdata/include/dcmtk/dcmdata/cmdlnarg.h \ ../include/dcmtk/dcmpstat/dvpsovl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../include/dcmtk/dcmpstat/dvpsgll.h ../include/dcmtk/dcmpstat/dvpsrsl.h \ ../include/dcmtk/dcmpstat/dvpsall.h ../include/dcmtk/dcmpstat/dvpsgal.h \ ../include/dcmtk/dcmpstat/dvpscul.h ../include/dcmtk/dcmpstat/dvpsvll.h \ ../include/dcmtk/dcmpstat/dvpsvwl.h ../include/dcmtk/dcmpstat/dvpsdal.h \ ../include/dcmtk/dcmpstat/dvpssvl.h ../include/dcmtk/dcmpstat/dvpspl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrus.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrui.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlo.h \ ../../dcmqrdb/include/dcmtk/dcmqrdb/dcmqridx.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../dcmnet/include/dcmtk/dcmnet/dicom.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../dcmnet/include/dcmtk/dcmnet/cond.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../../dcmnet/include/dcmtk/dcmnet/dcompat.h \ ../../ofstd/include/dcmtk/ofstd/ofbmanip.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../dcmdata/include/dcmtk/dcmdata/dcuid.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdatset.h \ ../../dcmdata/include/dcmtk/dcmdata/dcuid.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdeftag.h \ ../../dcmqrdb/include/dcmtk/dcmqrdb/dcmqrdbi.h \ ../../dcmqrdb/include/dcmtk/dcmqrdb/dcmqrdba.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmnet/include/dcmtk/dcmnet/dimse.h \ ../../dcmnet/include/dcmtk/dcmnet/dicom.h \ ../../dcmnet/include/dcmtk/dcmnet/lst.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../dcmnet/include/dcmtk/dcmnet/dul.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../dcmnet/include/dcmtk/dcmnet/extneg.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmnet/include/dcmtk/dcmnet/dcuserid.h \ ../../dcmnet/include/dcmtk/dcmnet/assoc.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdatset.h \ ../../ofstd/include/dcmtk/ofstd/offname.h \ ../include/dcmtk/dcmpstat/dvcache.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../dcmqrdb/include/dcmtk/dcmqrdb/dcmqrdbi.h \ ../../ofstd/include/dcmtk/ofstd/ofbmanip.h \ ../../ofstd/include/dcmtk/ofstd/ofdatime.h \ ../../dcmdata/include/dcmtk/dcmdata/dcuid.h \ ../../dcmnet/include/dcmtk/dcmnet/diutil.h \ ../../dcmnet/include/dcmtk/dcmnet/dimse.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../dcmdata/include/dcmtk/dcmdata/cmdlnarg.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../include/dcmtk/dcmpstat/dvpsprt.h ../include/dcmtk/dcmpstat/dvpspll.h \ ../../dcmnet/include/dcmtk/dcmnet/dimse.h \ ../include/dcmtk/dcmpstat/dvpsspl.h \ ../../dcmnet/include/dcmtk/dcmnet/assoc.h \ ../include/dcmtk/dcmpstat/dvpshlp.h \ ../../dcmdata/include/dcmtk/dcmdata/dcsequen.h \ ../../oflog/include/dcmtk/oflog/fileap.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/fstreams.h \ ../../dcmtls/include/dcmtk/dcmtls/tlstrans.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../dcmnet/include/dcmtk/dcmnet/dcmtrans.h \ ../../dcmnet/include/dcmtk/dcmnet/dcmlayer.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../dcmtls/include/dcmtk/dcmtls/tlslayer.h \ ../../dcmnet/include/dcmtk/dcmnet/dcmlayer.h \ ../../oflog/include/dcmtk/oflog/oflog.h dcmprscu.o: dcmprscu.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../../dcmnet/include/dcmtk/dcmnet/dcompat.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofbmanip.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../include/dcmtk/dcmpstat/dvpsdef.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../include/dcmtk/dcmpstat/dviface.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../include/dcmtk/dcmpstat/dvpscf.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmpstat/dvpstyp.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmpstat/dvpstat.h \ ../include/dcmtk/dcmpstat/dcmpstat.h \ ../../dcmdata/include/dcmtk/dcmdata/dctk.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../dcmdata/include/dcmtk/dcmdata/dcswap.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dcxfer.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvr.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../dcmdata/include/dcmtk/dcmdata/dcistrma.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dcostrma.h \ ../../dcmdata/include/dcmtk/dcmdata/dcuid.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvm.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h \ ../../dcmdata/include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmdata/include/dcmtk/dcmdata/dctag.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdicent.h \ ../../dcmdata/include/dcmtk/dcmdata/dchashdi.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdict.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdeftag.h \ ../../dcmdata/include/dcmtk/dcmdata/dcobject.h \ ../../dcmdata/include/dcmtk/dcmdata/dcstack.h \ ../../dcmdata/include/dcmtk/dcmdata/dcelem.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../../dcmdata/include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpcache.h \ ../../dcmdata/include/dcmtk/dcmdata/dcmetinf.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdatset.h \ ../../dcmdata/include/dcmtk/dcmdata/dcsequen.h \ ../../dcmdata/include/dcmtk/dcmdata/dcfilefo.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdicdir.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdirrec.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrulup.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrul.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpixseq.h \ ../../dcmdata/include/dcmtk/dcmdata/dcofsetl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcbytstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrae.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvras.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrcs.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrda.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrds.h \ ../../ofstd/include/dcmtk/ofstd/ofvector.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrdt.h \ ../../ofstd/include/dcmtk/ofstd/ofdatime.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvris.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrtm.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrui.h \ ../../dcmdata/include/dcmtk/dcmdata/dcchrstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlo.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlt.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrpn.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsh.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrst.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrut.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrobow.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpixel.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrpobw.h \ ../../dcmdata/include/dcmtk/dcmdata/dcovlay.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrat.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrss.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrus.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrfl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrfd.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrof.h \ ../../dcmdata/include/dcmtk/dcmdata/cmdlnarg.h \ ../include/dcmtk/dcmpstat/dvpsovl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../include/dcmtk/dcmpstat/dvpsgll.h ../include/dcmtk/dcmpstat/dvpsrsl.h \ ../include/dcmtk/dcmpstat/dvpsall.h ../include/dcmtk/dcmpstat/dvpsgal.h \ ../include/dcmtk/dcmpstat/dvpscul.h ../include/dcmtk/dcmpstat/dvpsvll.h \ ../include/dcmtk/dcmpstat/dvpsvwl.h ../include/dcmtk/dcmpstat/dvpsdal.h \ ../include/dcmtk/dcmpstat/dvpssvl.h ../include/dcmtk/dcmpstat/dvpspl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrus.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrui.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlo.h \ ../../dcmqrdb/include/dcmtk/dcmqrdb/dcmqridx.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../dcmnet/include/dcmtk/dcmnet/dicom.h \ ../../dcmnet/include/dcmtk/dcmnet/cond.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../../dcmnet/include/dcmtk/dcmnet/dcompat.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../dcmdata/include/dcmtk/dcmdata/dcuid.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdatset.h \ ../../dcmdata/include/dcmtk/dcmdata/dcuid.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdeftag.h \ ../../dcmqrdb/include/dcmtk/dcmqrdb/dcmqrdbi.h \ ../../dcmqrdb/include/dcmtk/dcmqrdb/dcmqrdba.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmnet/include/dcmtk/dcmnet/dimse.h \ ../../dcmnet/include/dcmtk/dcmnet/dicom.h \ ../../dcmnet/include/dcmtk/dcmnet/lst.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../dcmnet/include/dcmtk/dcmnet/dul.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../dcmnet/include/dcmtk/dcmnet/extneg.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmnet/include/dcmtk/dcmnet/dcuserid.h \ ../../dcmnet/include/dcmtk/dcmnet/assoc.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdatset.h \ ../../ofstd/include/dcmtk/ofstd/offname.h \ ../include/dcmtk/dcmpstat/dvcache.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../dcmqrdb/include/dcmtk/dcmqrdb/dcmqrdbi.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofbmanip.h \ ../../ofstd/include/dcmtk/ofstd/ofdatime.h \ ../../dcmdata/include/dcmtk/dcmdata/dcuid.h \ ../../dcmdata/include/dcmtk/dcmdata/cmdlnarg.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../dcmimgle/include/dcmtk/dcmimgle/dcmimage.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../dcmimgle/include/dcmtk/dcmimgle/dimoimg.h \ ../../dcmimgle/include/dcmtk/dcmimgle/diimage.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../../dcmdata/include/dcmtk/dcmdata/dcfcache.h \ ../../dcmimgle/include/dcmtk/dcmimgle/diovlay.h \ ../../dcmimgle/include/dcmtk/dcmimgle/diobjcou.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../dcmimgle/include/dcmtk/dcmimgle/diovdat.h \ ../../dcmimgle/include/dcmtk/dcmimgle/diovpln.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmimgle/include/dcmtk/dcmimgle/diutils.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../dcmimgle/include/dcmtk/dcmimgle/dimopx.h \ ../../dcmimgle/include/dcmtk/dcmimgle/dipixel.h \ ../../dcmimgle/include/dcmtk/dcmimgle/dimomod.h \ ../../dcmimgle/include/dcmtk/dcmimgle/diluptab.h \ ../../dcmdata/include/dcmtk/dcmdata/dctagkey.h \ ../../dcmimgle/include/dcmtk/dcmimgle/dibaslut.h \ ../../dcmimgle/include/dcmtk/dcmimgle/dimoopx.h \ ../../dcmimgle/include/dcmtk/dcmimgle/didispfn.h \ ../include/dcmtk/dcmpstat/dvpspr.h \ ../../dcmnet/include/dcmtk/dcmnet/dimse.h \ ../include/dcmtk/dcmpstat/dvpssp.h ../include/dcmtk/dcmpstat/dvpspll.h \ ../include/dcmtk/dcmpstat/dvpsibl.h ../include/dcmtk/dcmpstat/dvpsabl.h \ ../include/dcmtk/dcmpstat/dvpspr.h ../include/dcmtk/dcmpstat/dvpshlp.h \ ../../dcmdata/include/dcmtk/dcmdata/dcsequen.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../dcmtls/include/dcmtk/dcmtls/tlstrans.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../dcmnet/include/dcmtk/dcmnet/dcmtrans.h \ ../../dcmnet/include/dcmtk/dcmnet/dcmlayer.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../dcmtls/include/dcmtk/dcmtls/tlslayer.h \ ../../dcmnet/include/dcmtk/dcmnet/dcmlayer.h \ ../../oflog/include/dcmtk/oflog/oflog.h dcmpschk.o: dcmpschk.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../dcmdata/include/dcmtk/dcmdata/dctk.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../dcmdata/include/dcmtk/dcmdata/dcswap.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dcxfer.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvr.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../dcmdata/include/dcmtk/dcmdata/dcistrma.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dcostrma.h \ ../../dcmdata/include/dcmtk/dcmdata/dcuid.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvm.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h \ ../../dcmdata/include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmdata/include/dcmtk/dcmdata/dctag.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdicent.h \ ../../dcmdata/include/dcmtk/dcmdata/dchashdi.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdict.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdeftag.h \ ../../dcmdata/include/dcmtk/dcmdata/dcobject.h \ ../../dcmdata/include/dcmtk/dcmdata/dcstack.h \ ../../dcmdata/include/dcmtk/dcmdata/dcelem.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../../dcmdata/include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpcache.h \ ../../dcmdata/include/dcmtk/dcmdata/dcmetinf.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdatset.h \ ../../dcmdata/include/dcmtk/dcmdata/dcsequen.h \ ../../dcmdata/include/dcmtk/dcmdata/dcfilefo.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdicdir.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdirrec.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrulup.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrul.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpixseq.h \ ../../dcmdata/include/dcmtk/dcmdata/dcofsetl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcbytstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrae.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvras.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrcs.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrda.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrds.h \ ../../ofstd/include/dcmtk/ofstd/ofvector.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrdt.h \ ../../ofstd/include/dcmtk/ofstd/ofdatime.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvris.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrtm.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrui.h \ ../../dcmdata/include/dcmtk/dcmdata/dcchrstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlo.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlt.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrpn.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsh.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrst.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrut.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrobow.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpixel.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrpobw.h \ ../../dcmdata/include/dcmtk/dcmdata/dcovlay.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrat.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrss.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrus.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrfl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrfd.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrof.h \ ../../dcmdata/include/dcmtk/dcmdata/cmdlnarg.h \ ../../dcmnet/include/dcmtk/dcmnet/dul.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../dcmnet/include/dcmtk/dcmnet/extneg.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../dcmnet/include/dcmtk/dcmnet/dicom.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../dcmnet/include/dcmtk/dcmnet/cond.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../../dcmnet/include/dcmtk/dcmnet/dcompat.h \ ../../ofstd/include/dcmtk/ofstd/ofbmanip.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../dcmdata/include/dcmtk/dcmdata/dcuid.h \ ../../dcmnet/include/dcmtk/dcmnet/dcuserid.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmpstat/dcmpstat.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../dcmdata/include/dcmtk/dcmdata/dctk.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmpstat/dvpstyp.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmpstat/dvpsovl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../include/dcmtk/dcmpstat/dvpsgll.h ../include/dcmtk/dcmpstat/dvpsrsl.h \ ../include/dcmtk/dcmpstat/dvpsall.h ../include/dcmtk/dcmpstat/dvpsgal.h \ ../include/dcmtk/dcmpstat/dvpscul.h ../include/dcmtk/dcmpstat/dvpsvll.h \ ../include/dcmtk/dcmpstat/dvpsvwl.h ../include/dcmtk/dcmpstat/dvpsdal.h \ ../include/dcmtk/dcmpstat/dvpssvl.h ../include/dcmtk/dcmpstat/dvpspl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrus.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrui.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlo.h dcmpsmk.o: dcmpsmk.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../dcmdata/include/dcmtk/dcmdata/dctk.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../dcmdata/include/dcmtk/dcmdata/dcswap.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dcxfer.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvr.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../dcmdata/include/dcmtk/dcmdata/dcistrma.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dcostrma.h \ ../../dcmdata/include/dcmtk/dcmdata/dcuid.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvm.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h \ ../../dcmdata/include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmdata/include/dcmtk/dcmdata/dctag.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdicent.h \ ../../dcmdata/include/dcmtk/dcmdata/dchashdi.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdict.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdeftag.h \ ../../dcmdata/include/dcmtk/dcmdata/dcobject.h \ ../../dcmdata/include/dcmtk/dcmdata/dcstack.h \ ../../dcmdata/include/dcmtk/dcmdata/dcelem.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../../dcmdata/include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpcache.h \ ../../dcmdata/include/dcmtk/dcmdata/dcmetinf.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdatset.h \ ../../dcmdata/include/dcmtk/dcmdata/dcsequen.h \ ../../dcmdata/include/dcmtk/dcmdata/dcfilefo.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdicdir.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdirrec.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrulup.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrul.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpixseq.h \ ../../dcmdata/include/dcmtk/dcmdata/dcofsetl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcbytstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrae.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvras.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrcs.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrda.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrds.h \ ../../ofstd/include/dcmtk/ofstd/ofvector.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrdt.h \ ../../ofstd/include/dcmtk/ofstd/ofdatime.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvris.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrtm.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrui.h \ ../../dcmdata/include/dcmtk/dcmdata/dcchrstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlo.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlt.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrpn.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsh.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrst.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrut.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrobow.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpixel.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrpobw.h \ ../../dcmdata/include/dcmtk/dcmdata/dcovlay.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrat.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrss.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrus.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrfl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrfd.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrof.h \ ../../dcmdata/include/dcmtk/dcmdata/cmdlnarg.h \ ../../dcmdata/include/dcmtk/dcmdata/cmdlnarg.h \ ../../dcmdata/include/dcmtk/dcmdata/dcuid.h \ ../../dcmnet/include/dcmtk/dcmnet/dul.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../dcmnet/include/dcmtk/dcmnet/extneg.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../dcmnet/include/dcmtk/dcmnet/dicom.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../dcmnet/include/dcmtk/dcmnet/cond.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../../dcmnet/include/dcmtk/dcmnet/dcompat.h \ ../../ofstd/include/dcmtk/ofstd/ofbmanip.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../dcmdata/include/dcmtk/dcmdata/dcuid.h \ ../../dcmnet/include/dcmtk/dcmnet/dcuserid.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../include/dcmtk/dcmpstat/dcmpstat.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../dcmdata/include/dcmtk/dcmdata/dctk.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmpstat/dvpstyp.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmpstat/dvpsovl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../include/dcmtk/dcmpstat/dvpsgll.h ../include/dcmtk/dcmpstat/dvpsrsl.h \ ../include/dcmtk/dcmpstat/dvpsall.h ../include/dcmtk/dcmpstat/dvpsgal.h \ ../include/dcmtk/dcmpstat/dvpscul.h ../include/dcmtk/dcmpstat/dvpsvll.h \ ../include/dcmtk/dcmpstat/dvpsvwl.h ../include/dcmtk/dcmpstat/dvpsdal.h \ ../include/dcmtk/dcmpstat/dvpssvl.h ../include/dcmtk/dcmpstat/dvpspl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrus.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrui.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlo.h \ ../include/dcmtk/dcmpstat/dvpshlp.h \ ../../dcmdata/include/dcmtk/dcmdata/dcsequen.h dcmpsprt.o: dcmpsprt.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../include/dcmtk/dcmpstat/dviface.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../include/dcmtk/dcmpstat/dvpscf.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmpstat/dvpstyp.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../include/dcmtk/dcmpstat/dvpstat.h \ ../include/dcmtk/dcmpstat/dcmpstat.h \ ../../dcmdata/include/dcmtk/dcmdata/dctk.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../dcmdata/include/dcmtk/dcmdata/dcswap.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dcxfer.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvr.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../dcmdata/include/dcmtk/dcmdata/dcistrma.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dcostrma.h \ ../../dcmdata/include/dcmtk/dcmdata/dcuid.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvm.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h \ ../../dcmdata/include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmdata/include/dcmtk/dcmdata/dctag.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdicent.h \ ../../dcmdata/include/dcmtk/dcmdata/dchashdi.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdict.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdeftag.h \ ../../dcmdata/include/dcmtk/dcmdata/dcobject.h \ ../../dcmdata/include/dcmtk/dcmdata/dcstack.h \ ../../dcmdata/include/dcmtk/dcmdata/dcelem.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../../dcmdata/include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpcache.h \ ../../dcmdata/include/dcmtk/dcmdata/dcmetinf.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdatset.h \ ../../dcmdata/include/dcmtk/dcmdata/dcsequen.h \ ../../dcmdata/include/dcmtk/dcmdata/dcfilefo.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdicdir.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdirrec.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrulup.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrul.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpixseq.h \ ../../dcmdata/include/dcmtk/dcmdata/dcofsetl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcbytstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrae.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvras.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrcs.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrda.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrds.h \ ../../ofstd/include/dcmtk/ofstd/ofvector.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrdt.h \ ../../ofstd/include/dcmtk/ofstd/ofdatime.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvris.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrtm.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrui.h \ ../../dcmdata/include/dcmtk/dcmdata/dcchrstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlo.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlt.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrpn.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsh.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrst.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrut.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrobow.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpixel.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrpobw.h \ ../../dcmdata/include/dcmtk/dcmdata/dcovlay.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrat.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrss.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrus.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrfl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrfd.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrof.h \ ../../dcmdata/include/dcmtk/dcmdata/cmdlnarg.h \ ../include/dcmtk/dcmpstat/dvpsovl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../include/dcmtk/dcmpstat/dvpsgll.h ../include/dcmtk/dcmpstat/dvpsrsl.h \ ../include/dcmtk/dcmpstat/dvpsall.h ../include/dcmtk/dcmpstat/dvpsgal.h \ ../include/dcmtk/dcmpstat/dvpscul.h ../include/dcmtk/dcmpstat/dvpsvll.h \ ../include/dcmtk/dcmpstat/dvpsvwl.h ../include/dcmtk/dcmpstat/dvpsdal.h \ ../include/dcmtk/dcmpstat/dvpssvl.h ../include/dcmtk/dcmpstat/dvpspl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrus.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrui.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlo.h \ ../../dcmqrdb/include/dcmtk/dcmqrdb/dcmqridx.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../dcmnet/include/dcmtk/dcmnet/dicom.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../dcmnet/include/dcmtk/dcmnet/cond.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../../dcmnet/include/dcmtk/dcmnet/dcompat.h \ ../../ofstd/include/dcmtk/ofstd/ofbmanip.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../dcmdata/include/dcmtk/dcmdata/dcuid.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdatset.h \ ../../dcmdata/include/dcmtk/dcmdata/dcuid.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdeftag.h \ ../../dcmqrdb/include/dcmtk/dcmqrdb/dcmqrdbi.h \ ../../dcmqrdb/include/dcmtk/dcmqrdb/dcmqrdba.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmnet/include/dcmtk/dcmnet/dimse.h \ ../../dcmnet/include/dcmtk/dcmnet/dicom.h \ ../../dcmnet/include/dcmtk/dcmnet/lst.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../dcmnet/include/dcmtk/dcmnet/dul.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../dcmnet/include/dcmtk/dcmnet/extneg.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmnet/include/dcmtk/dcmnet/dcuserid.h \ ../../dcmnet/include/dcmtk/dcmnet/assoc.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdatset.h \ ../../ofstd/include/dcmtk/ofstd/offname.h \ ../include/dcmtk/dcmpstat/dvcache.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../dcmqrdb/include/dcmtk/dcmqrdb/dcmqrdbi.h \ ../include/dcmtk/dcmpstat/dvpssp.h ../include/dcmtk/dcmpstat/dvpspll.h \ ../../dcmnet/include/dcmtk/dcmnet/dimse.h \ ../include/dcmtk/dcmpstat/dvpsibl.h ../include/dcmtk/dcmpstat/dvpsabl.h \ ../include/dcmtk/dcmpstat/dvpspr.h \ ../../dcmimgle/include/dcmtk/dcmimgle/dcmimage.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../dcmimgle/include/dcmtk/dcmimgle/dimoimg.h \ ../../dcmimgle/include/dcmtk/dcmimgle/diimage.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../../dcmdata/include/dcmtk/dcmdata/dcfcache.h \ ../../dcmimgle/include/dcmtk/dcmimgle/diovlay.h \ ../../dcmimgle/include/dcmtk/dcmimgle/diobjcou.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../dcmimgle/include/dcmtk/dcmimgle/diovdat.h \ ../../dcmimgle/include/dcmtk/dcmimgle/diovpln.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmimgle/include/dcmtk/dcmimgle/diutils.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../dcmimgle/include/dcmtk/dcmimgle/dimopx.h \ ../../dcmimgle/include/dcmtk/dcmimgle/dipixel.h \ ../../dcmimgle/include/dcmtk/dcmimgle/dimomod.h \ ../../dcmimgle/include/dcmtk/dcmimgle/diluptab.h \ ../../dcmdata/include/dcmtk/dcmdata/dctagkey.h \ ../../dcmimgle/include/dcmtk/dcmimgle/dibaslut.h \ ../../dcmimgle/include/dcmtk/dcmimgle/dimoopx.h \ ../../dcmimgle/include/dcmtk/dcmimgle/didispfn.h \ ../../dcmdata/include/dcmtk/dcmdata/cmdlnarg.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../dcmdata/include/dcmtk/dcmdata/dcuid.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h dcmpsrcv.o: dcmpsrcv.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmpstat/dvpsdef.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../include/dcmtk/dcmpstat/dvpscf.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmpstat/dvpstyp.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofbmanip.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h \ ../../dcmdata/include/dcmtk/dcmdata/dcuid.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../dcmnet/include/dcmtk/dcmnet/diutil.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../dcmnet/include/dcmtk/dcmnet/dicom.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../dcmnet/include/dcmtk/dcmnet/cond.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmnet/include/dcmtk/dcmnet/dcompat.h \ ../../ofstd/include/dcmtk/ofstd/ofbmanip.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../dcmdata/include/dcmtk/dcmdata/dcuid.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdatset.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../dcmdata/include/dcmtk/dcmdata/dcobject.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../../dcmdata/include/dcmtk/dcmdata/dcxfer.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvr.h \ ../../dcmdata/include/dcmtk/dcmdata/dctag.h \ ../../dcmdata/include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmdata/include/dcmtk/dcmdata/dcstack.h \ ../../dcmdata/include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpcache.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../dcmnet/include/dcmtk/dcmnet/dimse.h \ ../../dcmnet/include/dcmtk/dcmnet/lst.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../dcmnet/include/dcmtk/dcmnet/dul.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../dcmnet/include/dcmtk/dcmnet/extneg.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmnet/include/dcmtk/dcmnet/dcuserid.h \ ../../dcmnet/include/dcmtk/dcmnet/assoc.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../dcmdata/include/dcmtk/dcmdata/cmdlnarg.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../dcmqrdb/include/dcmtk/dcmqrdb/dcmqrdbi.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../dcmqrdb/include/dcmtk/dcmqrdb/dcmqrdba.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmnet/include/dcmtk/dcmnet/dicom.h \ ../../dcmnet/include/dcmtk/dcmnet/dimse.h \ ../../ofstd/include/dcmtk/ofstd/offname.h \ ../../dcmqrdb/include/dcmtk/dcmqrdb/dcmqrdbs.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../include/dcmtk/dcmpstat/dvpsmsg.h \ ../../dcmnet/include/dcmtk/dcmnet/dcmlayer.h \ ../../dcmdata/include/dcmtk/dcmdata/dcfilefo.h \ ../../dcmdata/include/dcmtk/dcmdata/dcsequen.h \ ../../dcmdata/include/dcmtk/dcmdata/dcelem.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdatset.h \ ../include/dcmtk/dcmpstat/dcmpstat.h \ ../../dcmdata/include/dcmtk/dcmdata/dctk.h \ ../../dcmdata/include/dcmtk/dcmdata/dcswap.h \ ../../dcmdata/include/dcmtk/dcmdata/dcistrma.h \ ../../dcmdata/include/dcmtk/dcmdata/dcostrma.h \ ../../dcmdata/include/dcmtk/dcmdata/dcuid.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvm.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdicent.h \ ../../dcmdata/include/dcmtk/dcmdata/dchashdi.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdict.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdeftag.h \ ../../dcmdata/include/dcmtk/dcmdata/dcmetinf.h \ ../../dcmdata/include/dcmtk/dcmdata/dcfilefo.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdicdir.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdirrec.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrulup.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrul.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpixseq.h \ ../../dcmdata/include/dcmtk/dcmdata/dcofsetl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcbytstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrae.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvras.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrcs.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrda.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrds.h \ ../../ofstd/include/dcmtk/ofstd/ofvector.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrdt.h \ ../../ofstd/include/dcmtk/ofstd/ofdatime.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvris.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrtm.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrui.h \ ../../dcmdata/include/dcmtk/dcmdata/dcchrstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlo.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlt.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrpn.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsh.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrst.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrut.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrobow.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpixel.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrpobw.h \ ../../dcmdata/include/dcmtk/dcmdata/dcovlay.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrat.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrss.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrus.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrfl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrfd.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrof.h \ ../../dcmdata/include/dcmtk/dcmdata/cmdlnarg.h \ ../include/dcmtk/dcmpstat/dvpsovl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../include/dcmtk/dcmpstat/dvpsgll.h ../include/dcmtk/dcmpstat/dvpsrsl.h \ ../include/dcmtk/dcmpstat/dvpsall.h ../include/dcmtk/dcmpstat/dvpsgal.h \ ../include/dcmtk/dcmpstat/dvpscul.h ../include/dcmtk/dcmpstat/dvpsvll.h \ ../include/dcmtk/dcmpstat/dvpsvwl.h ../include/dcmtk/dcmpstat/dvpsdal.h \ ../include/dcmtk/dcmpstat/dvpssvl.h ../include/dcmtk/dcmpstat/dvpspl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrus.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrui.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlo.h \ ../../dcmtls/include/dcmtk/dcmtls/tlstrans.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../dcmnet/include/dcmtk/dcmnet/dcmtrans.h \ ../../dcmnet/include/dcmtk/dcmnet/dcmlayer.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../dcmtls/include/dcmtk/dcmtls/tlslayer.h \ ../../dcmnet/include/dcmtk/dcmnet/dcmlayer.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h dcmpssnd.o: dcmpssnd.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmpstat/dvpsdef.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../include/dcmtk/dcmpstat/dvpscf.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmpstat/dvpstyp.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofbmanip.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h \ ../../dcmdata/include/dcmtk/dcmdata/dcuid.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdeftag.h \ ../../dcmdata/include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdict.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../dcmdata/include/dcmtk/dcmdata/dchashdi.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../dcmnet/include/dcmtk/dcmnet/diutil.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../dcmnet/include/dcmtk/dcmnet/dicom.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../dcmnet/include/dcmtk/dcmnet/cond.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmnet/include/dcmtk/dcmnet/dcompat.h \ ../../ofstd/include/dcmtk/ofstd/ofbmanip.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../dcmdata/include/dcmtk/dcmdata/dcuid.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdatset.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../dcmdata/include/dcmtk/dcmdata/dcobject.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../../dcmdata/include/dcmtk/dcmdata/dcxfer.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvr.h \ ../../dcmdata/include/dcmtk/dcmdata/dctag.h \ ../../dcmdata/include/dcmtk/dcmdata/dcstack.h \ ../../dcmdata/include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpcache.h \ ../../dcmnet/include/dcmtk/dcmnet/dimse.h \ ../../dcmnet/include/dcmtk/dcmnet/lst.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../dcmnet/include/dcmtk/dcmnet/dul.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../dcmnet/include/dcmtk/dcmnet/extneg.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmnet/include/dcmtk/dcmnet/dcuserid.h \ ../../dcmnet/include/dcmtk/dcmnet/assoc.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../dcmdata/include/dcmtk/dcmdata/cmdlnarg.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../include/dcmtk/dcmpstat/dvpshlp.h \ ../../dcmdata/include/dcmtk/dcmdata/dcsequen.h \ ../../dcmdata/include/dcmtk/dcmdata/dcelem.h \ ../../dcmqrdb/include/dcmtk/dcmqrdb/dcmqrdbi.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../dcmqrdb/include/dcmtk/dcmqrdb/dcmqrdba.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmnet/include/dcmtk/dcmnet/dicom.h \ ../../dcmnet/include/dcmtk/dcmnet/dimse.h \ ../../ofstd/include/dcmtk/ofstd/offname.h \ ../../dcmqrdb/include/dcmtk/dcmqrdb/dcmqrdbs.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../include/dcmtk/dcmpstat/dvpsmsg.h \ ../../dcmtls/include/dcmtk/dcmtls/tlstrans.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../dcmnet/include/dcmtk/dcmnet/dcmtrans.h \ ../../dcmnet/include/dcmtk/dcmnet/dcmlayer.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../dcmtls/include/dcmtk/dcmtls/tlslayer.h \ ../../dcmnet/include/dcmtk/dcmnet/dcmlayer.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h dcmtk-3.6.0/dcmpstat/apps/dcmpsmk.cc0000644000310500011400000004713611455601011016573 0ustar joergrdicom3/* * * Copyright (C) 1998-2010, 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: * sample application that reads a DICOM image and creates * a matching presentation state. * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:13:45 $ * CVS/RCS Revision: $Revision: 1.29 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #define INCLUDE_CSTDLIB #define INCLUDE_CSTDIO #define INCLUDE_CSTRING #include "dcmtk/ofstd/ofstdinc.h" #ifdef HAVE_GUSI_H #include #endif #include "dcmtk/ofstd/ofconapp.h" #include "dcmtk/dcmdata/dctk.h" #include "dcmtk/dcmdata/cmdlnarg.h" #include "dcmtk/dcmdata/dcuid.h" /* for dcmtk version name */ #include "dcmtk/dcmnet/dul.h" #include "dcmtk/dcmpstat/dcmpstat.h" #include "dcmtk/dcmpstat/dvpshlp.h" #ifdef WITH_ZLIB #include /* for zlibVersion() */ #endif #define OFFIS_CONSOLE_APPLICATION "dcmpsmk" static OFLogger dcmpsmkLogger = OFLog::getLogger("dcmtk.apps." OFFIS_CONSOLE_APPLICATION); static char rcsid[] = "$dcmtk: " OFFIS_CONSOLE_APPLICATION " v" OFFIS_DCMTK_VERSION " " OFFIS_DCMTK_RELEASEDATE " $"; // ******************************************** #define SHORTCOL 3 #define LONGCOL 21 int main(int argc, char *argv[]) { #ifdef HAVE_GUSI_H GUSISetup(GUSIwithSIOUXSockets); GUSISetup(GUSIwithInternetSockets); #endif #ifdef WITH_TCPWRAPPER // this code makes sure that the linker cannot optimize away // the DUL part of the network module where the external flags // for libwrap are defined. Needed on OpenBSD. dcmTCPWrapperDaemonName.set(NULL); #endif // Variables for input parameters const char* opt_ifname = NULL; E_FileReadMode opt_readMode = ERM_autoDetect; E_TransferSyntax opt_ixfer = EXS_Unknown; // Variables for output parameters const char* opt_ofname = NULL; E_TransferSyntax opt_oxfer = EXS_Unknown; E_GrpLenEncoding oglenc = EGL_recalcGL; // currently not available as command line option E_EncodingType oenctype = EET_ExplicitLength; // currently not available as command line option E_PaddingEncoding opadenc = EPD_noChange; // currently not available as command line option Uint32 padlen = 0; // currently not available as command line option Uint32 subPadlen = 0; // currently not available as command line option // Variables for processing parameters DVPSoverlayActivation overlayActivation = DVPSO_copyOverlays; DVPSVOIActivation voiActivation = DVPSV_preferVOILUT; OFBool curveActivation = OFTrue; OFBool shutterActivation = OFTrue; OFBool presentationActivation = OFTrue; DVPSGraphicLayering layering = DVPSG_twoLayers; const char * opt_aetitle = NULL; const char * opt_filesetID = NULL; const char * opt_filesetUID = NULL; OFConsoleApplication app(OFFIS_CONSOLE_APPLICATION , "Create DICOM grayscale softcopy presentation state", rcsid); OFCommandLine cmd; cmd.setOptionColumns(LONGCOL, SHORTCOL); cmd.setParamColumn(LONGCOL + SHORTCOL + 4); cmd.addParam("dcmfile-in", "DICOM image file(s) to be read", OFCmdParam::PM_MultiMandatory); cmd.addParam("dcmfile-out", "DICOM presentation state file to be created"); cmd.addGroup("general options:", LONGCOL, SHORTCOL + 2); cmd.addOption("--help", "-h", "print this help text and exit", OFCommandLine::AF_Exclusive); cmd.addOption("--version", "print version information and exit", OFCommandLine::AF_Exclusive); OFLog::addOptions(cmd); cmd.addGroup("input options:"); cmd.addSubGroup("input file format:"); cmd.addOption("--read-file", "+f", "read file format or data set (default)"); cmd.addOption("--read-file-only", "+fo", "read file format only"); cmd.addOption("--read-dataset", "-f", "read data set without file meta information"); cmd.addSubGroup("input transfer syntax:", LONGCOL, SHORTCOL); cmd.addOption("--read-xfer-auto", "-t=", "use TS recognition (default)"); cmd.addOption("--read-xfer-detect", "-td", "ignore TS specified in the file meta header"); cmd.addOption("--read-xfer-little", "-te", "read with explicit VR little endian TS"); cmd.addOption("--read-xfer-big", "-tb", "read with explicit VR big endian TS"); cmd.addOption("--read-xfer-implicit", "-ti", "read with implicit VR little endian TS"); cmd.addGroup("processing options:"); cmd.addSubGroup("VOI transform handling:"); cmd.addOption("--voi-lut", "+Vl", "use first VOI LUT if present (default)"); cmd.addOption("--voi-window", "+Vw", "use first window center/width if present"); cmd.addOption("--voi-ignore", "-V", "ignore VOI LUT and window center/width"); cmd.addSubGroup("curve handling:"); cmd.addOption("--curve-activate", "+c", "activate curve data if present (default)"); cmd.addOption("--curve-ignore", "-c", "ignore curve data"); cmd.addSubGroup("overlay handling:"); cmd.addOption("--overlay-copy", "+oc", "copy overlays if not embedded,\nactivate otherwise (default)"); cmd.addOption("--overlay-activate", "+oa", "activate overlays"); cmd.addOption("--overlay-ignore", "-o", "ignore overlays"); cmd.addSubGroup("shutter handling:"); cmd.addOption("--shutter-activate", "+s", "use shutter if present in image (default)"); cmd.addOption("--shutter-ignore", "-s", "ignore shutter"); cmd.addSubGroup("presentation LUT shape handling:"); cmd.addOption("--plut-activate", "+p", "use presentation LUT shape if present (default)"); cmd.addOption("--plut-ignore", "-p", "ignore presentation LUT shape"); cmd.addSubGroup("layering:"); cmd.addOption("--layer-single", "+l1", "all curves and overlays are in one layer"); cmd.addOption("--layer-double", "+l2", "one layer for curves, one for overlays (default)"); cmd.addOption("--layer-separate", "+ls", "separate layers for each curve and overlay"); cmd.addSubGroup("location of referenced image:"); cmd.addOption("--location-none", "-lx", "image reference without location (default)"); cmd.addOption("--location-network", "-ln", 1, "[a]etitle: string", "image located at application entity a"); cmd.addOption("--location-media", "-lm", 2, "[f]ilesetID, fileset[UID]: string", "image located on storage medium"); cmd.addGroup("output options:"); cmd.addSubGroup("output transfer syntax:"); cmd.addOption("--write-xfer-same", "+t=", "write with same TS as image file (default)"); cmd.addOption("--write-xfer-little", "+te", "write with explicit VR little endian TS"); cmd.addOption("--write-xfer-big", "+tb", "write with explicit VR big endian TS"); cmd.addOption("--write-xfer-implicit", "+ti", "write with implicit VR little endian TS"); /* evaluate command line */ prepareCmdLineArgs(argc, argv, OFFIS_CONSOLE_APPLICATION); if (app.parseCommandLine(cmd, argc, argv, OFCommandLine::PF_ExpandWildcards)) { /* check exclusive options first */ if (cmd.hasExclusiveOption()) { if (cmd.findOption("--version")) { app.printHeader(OFTrue /*print host identifier*/); COUT << OFendl << "External libraries used:"; #ifdef WITH_ZLIB COUT << OFendl << "- ZLIB, Version " << zlibVersion() << OFendl; #else COUT << " none" << OFendl; #endif return 0; } } /* command line parameters and options */ cmd.getParam(1, opt_ifname); cmd.getParam(cmd.getParamCount(), opt_ofname); OFLog::configureFromCommandLine(cmd, app); cmd.beginOptionBlock(); if (cmd.findOption("--read-file")) opt_readMode = ERM_autoDetect; if (cmd.findOption("--read-file-only")) opt_readMode = ERM_fileOnly; if (cmd.findOption("--read-dataset")) opt_readMode = ERM_dataset; cmd.endOptionBlock(); cmd.beginOptionBlock(); if (cmd.findOption("--read-xfer-auto")) opt_ixfer = EXS_Unknown; if (cmd.findOption("--read-xfer-detect")) dcmAutoDetectDatasetXfer.set(OFTrue); if (cmd.findOption("--read-xfer-little")) { app.checkDependence("--read-xfer-little", "--read-dataset", opt_readMode == ERM_dataset); opt_ixfer = EXS_LittleEndianExplicit; } if (cmd.findOption("--read-xfer-big")) { app.checkDependence("--read-xfer-big", "--read-dataset", opt_readMode == ERM_dataset); opt_ixfer = EXS_BigEndianExplicit; } if (cmd.findOption("--read-xfer-implicit")) { app.checkDependence("--read-xfer-implicit", "--read-dataset", opt_readMode == ERM_dataset); opt_ixfer = EXS_LittleEndianImplicit; } cmd.endOptionBlock(); cmd.beginOptionBlock(); if (cmd.findOption("--voi-lut")) voiActivation = DVPSV_preferVOILUT; if (cmd.findOption("--voi-window")) voiActivation = DVPSV_preferVOIWindow; if (cmd.findOption("--voi-ignore")) voiActivation = DVPSV_ignoreVOI; cmd.endOptionBlock(); cmd.beginOptionBlock(); if (cmd.findOption("--curve-activate")) curveActivation = OFTrue; if (cmd.findOption("--curve-ignore")) curveActivation = OFFalse; cmd.endOptionBlock(); cmd.beginOptionBlock(); if (cmd.findOption("--overlay-copy")) overlayActivation = DVPSO_copyOverlays; if (cmd.findOption("--overlay-activate")) overlayActivation = DVPSO_referenceOverlays; if (cmd.findOption("--overlay-ignore")) overlayActivation = DVPSO_ignoreOverlays; cmd.endOptionBlock(); cmd.beginOptionBlock(); if (cmd.findOption("--shutter-activate")) shutterActivation = OFTrue; if (cmd.findOption("--shutter-ignore")) shutterActivation = OFFalse; cmd.endOptionBlock(); cmd.beginOptionBlock(); if (cmd.findOption("--plut-activate")) presentationActivation = OFTrue; if (cmd.findOption("--plut-ignore")) presentationActivation = OFFalse; cmd.endOptionBlock(); cmd.beginOptionBlock(); if (cmd.findOption("--layer-single")) layering = DVPSG_oneLayer; if (cmd.findOption("--layer-double")) layering = DVPSG_twoLayers; if (cmd.findOption("--layer-separate")) layering = DVPSG_separateLayers; cmd.endOptionBlock(); cmd.beginOptionBlock(); if (cmd.findOption("--location-none")) { /* nothing */ } if (cmd.findOption("--location-network")) app.checkValue(cmd.getValue(opt_aetitle)); if (cmd.findOption("--location-media")) { app.checkValue(cmd.getValue(opt_filesetID)); app.checkValue(cmd.getValue(opt_filesetUID)); } cmd.endOptionBlock(); cmd.beginOptionBlock(); if (cmd.findOption("--write-xfer-same")) opt_oxfer = EXS_Unknown; if (cmd.findOption("--write-xfer-little")) opt_oxfer = EXS_LittleEndianExplicit; if (cmd.findOption("--write-xfer-big")) opt_oxfer = EXS_BigEndianExplicit; if (cmd.findOption("--write-xfer-implicit")) opt_oxfer = EXS_LittleEndianImplicit; cmd.endOptionBlock(); cmd.endOptionBlock(); } /* print resource identifier */ OFLOG_DEBUG(dcmpsmkLogger, rcsid << OFendl); // additional checks if ((opt_ifname == NULL) || (strlen(opt_ifname) == 0)) { OFLOG_FATAL(dcmpsmkLogger, "invalid input filename: "); return 1; } if ((opt_ofname == NULL) || (strlen(opt_ofname) == 0)) { OFLOG_FATAL(dcmpsmkLogger, "invalid output filename: "); return 1; } /* make sure data dictionary is loaded */ if (!dcmDataDict.isDictionaryLoaded()) { OFLOG_WARN(dcmpsmkLogger, "no data dictionary loaded, " << "check environment variable: " << DCM_DICT_ENVIRONMENT_VARIABLE); } // open input file DcmFileFormat fileformat; OFLOG_INFO(dcmpsmkLogger, "read and interpret DICOM file " << opt_ifname); OFCondition error = fileformat.loadFile(opt_ifname, opt_ixfer, EGL_noChange, DCM_MaxReadLength, opt_readMode); if (error.bad()) { OFLOG_FATAL(dcmpsmkLogger, error.text() << ": reading file: " << opt_ifname); return 1; } DcmDataset *dataset = fileformat.getDataset(); /* create presentation state */ DcmPresentationState state; OFLOG_INFO(dcmpsmkLogger, "creating presentation state object"); error = state.createFromImage(*dataset, overlayActivation, voiActivation, curveActivation, shutterActivation, presentationActivation, layering, opt_aetitle, opt_filesetID, opt_filesetUID); if (error != EC_Normal) { OFLOG_FATAL(dcmpsmkLogger, error.text() << ": creating presentation state from image file: " << opt_ifname); return 1; } /* add additional image references to pstate */ if (cmd.getParamCount() > 2) { OFLOG_INFO(dcmpsmkLogger, "adding additonal image reference(s)"); const int count = cmd.getParamCount(); for (int i = 2; i < count; i++) { const char *fn = NULL; if (cmd.getParam(i, fn) == OFCommandLine::PVS_Normal) { DcmFileFormat *ff = NULL; if (DVPSHelper::loadFileFormat(fn, ff) == EC_Normal) { if (ff) { DcmDataset *dset = ff->getDataset(); if (dset) state.addImageReference(*dset); } } delete ff; } } } DcmFileFormat fileformat2; DcmDataset *dataset2 = fileformat2.getDataset(); error = state.write(*dataset2, OFTrue); if (error != EC_Normal) { OFLOG_FATAL(dcmpsmkLogger, error.text() << ": re-encoding presentation state : " << opt_ifname); return 1; } if (opt_oxfer == EXS_Unknown) { OFLOG_INFO(dcmpsmkLogger, "set output transfersyntax to input transfer syntax"); opt_oxfer = dataset->getOriginalXfer(); } OFLOG_INFO(dcmpsmkLogger, "Check if new output transfer syntax is possible"); DcmXfer oxferSyn(opt_oxfer); dataset2->chooseRepresentation(opt_oxfer, NULL); if (dataset2->canWriteXfer(opt_oxfer)) { OFLOG_INFO(dcmpsmkLogger, "Output transfer syntax " << oxferSyn.getXferName() << " can be written"); } else { OFLOG_FATAL(dcmpsmkLogger, "No conversion to transfer syntax " << oxferSyn.getXferName() << " possible!"); return 1; } OFLOG_INFO(dcmpsmkLogger, "write converted DICOM file"); error = fileformat2.saveFile(opt_ofname, opt_oxfer, oenctype, oglenc, opadenc, padlen, subPadlen); if (error.bad()) { OFLOG_FATAL(dcmpsmkLogger, error.text() << ": writing file: " << opt_ofname); return 1; } OFLOG_INFO(dcmpsmkLogger, "conversion successful"); return 0; } /* ** CVS/RCS Log: ** $Log: dcmpsmk.cc,v $ ** Revision 1.29 2010-10-14 13:13:45 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.28 2009-11-24 14:12:56 uli ** Switched to logging mechanism provided by the "new" oflog module. ** ** Revision 1.27 2009-08-21 09:48:48 joergr ** Removed unused option 'opt_oDataset'. ** ** Revision 1.26 2009-04-21 14:10:54 joergr ** Fixed minor inconsistencies in manpage / syntax usage. ** ** Revision 1.25 2008-09-25 16:30:24 joergr ** Added support for printing the expanded command line arguments. ** Always output the resource identifier of the command line tool in debug mode. ** ** Revision 1.24 2006/08/15 16:57:01 meichel ** Updated the code in module dcmpstat to correctly compile when ** all standard C++ classes remain in namespace std. ** ** Revision 1.23 2006/07/27 14:39:02 joergr ** Changed parameter "exclusive" of method addOption() from type OFBool into an ** integer parameter "flags". Prepended prefix "PF_" to parseLine() flags. ** Option "--help" is no longer an exclusive option by default. ** ** Revision 1.22 2005/12/14 17:43:42 meichel ** Adapted code for compilation with TCP wrappers to NetBSD ** ** Revision 1.21 2005/12/12 15:14:34 meichel ** Added code needed for compilation with TCP wrappers on OpenBSD ** ** Revision 1.20 2005/12/08 15:46:08 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.19 2005/12/02 09:47:30 joergr ** Added new command line option that ignores the transfer syntax specified in ** the meta header and tries to detect the transfer syntax automatically from ** the dataset. ** Added new command line option that checks whether a given file starts with a ** valid DICOM meta header. ** ** Revision 1.18 2003/09/05 09:27:05 meichel ** Modified code to use class DcmPresentationState instead of DVPresentationState. ** ** Revision 1.17 2002/11/27 15:47:53 meichel ** Adapted module dcmpstat to use of new header file ofstdinc.h ** ** Revision 1.16 2002/11/26 08:44:27 meichel ** Replaced all includes for "zlib.h" with ** to avoid inclusion of zlib.h in the makefile dependencies. ** ** Revision 1.15 2002/09/23 18:26:08 joergr ** Added new command line option "--version" which prints the name and version ** number of external libraries used (incl. preparation for future support of ** 'config.guess' host identifiers). ** ** Revision 1.14 2002/08/20 12:21:53 meichel ** Adapted code to new loadFile and saveFile methods, thus removing direct ** use of the DICOM stream classes. ** ** Revision 1.13 2001/09/26 15:36:03 meichel ** Adapted dcmpstat to class OFCondition ** ** Revision 1.12 2001/06/01 15:50:08 meichel ** Updated copyright header ** ** Revision 1.11 2000/11/13 15:50:39 meichel ** Added dcmpstat support methods for creating image references ** in SR documents. ** ** Revision 1.10 2000/06/02 12:49:51 joergr ** Added support for multiple image references. ** ** Revision 1.9 2000/03/08 16:28:42 meichel ** Updated copyright header. ** ** Revision 1.8 2000/03/06 18:21:46 joergr ** Avoid empty statement in the body of if-statements (MSVC6 reports warnings). ** ** Revision 1.7 2000/03/03 14:13:26 meichel ** Implemented library support for redirecting error messages into memory ** instead of printing them to stdout/stderr for GUI applications. ** ** Revision 1.6 2000/02/23 15:12:54 meichel ** Corrected macro for Borland C++ Builder 4 workaround. ** ** Revision 1.5 2000/02/01 11:54:35 meichel ** Avoiding to include as extern "C" on Borland C++ Builder 4, ** workaround for bug in compiler header files. ** ** Revision 1.4 1999/07/27 15:41:33 meichel ** Adapted dcmpstat tools to supplement 33 letter ballot changes. ** ** Revision 1.3 1999/04/28 15:45:07 meichel ** Cleaned up module dcmpstat apps, adapted to new command line class ** and added short documentation. ** ** Revision 1.2 1999/02/17 10:05:03 meichel ** Removed dcmdata debug level from sample apps ** ** Revision 1.1 1998/11/27 14:50:20 meichel ** Initial Release. ** */ dcmtk-3.6.0/dcmpstat/apps/dcmprscp.cc0000644000310500011400000005327711455601011016753 0ustar joergrdicom3/* * * Copyright (C) 2000-2010, 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 * * Authors: Marco Eichelberg * * Purpose: Presentation State Viewer - Print Server * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:13:45 $ * CVS/RCS Revision: $Revision: 1.32 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #ifdef HAVE_GUSI_H #include #endif BEGIN_EXTERN_C #ifdef HAVE_FCNTL_H #include /* for O_RDONLY */ #endif END_EXTERN_C #include "dcmtk/ofstd/ofstream.h" #include "dcmtk/dcmpstat/dvpsdef.h" /* for constants and macros */ #include "dcmtk/dcmpstat/dviface.h" #include "dcmtk/ofstd/ofbmanip.h" /* for OFBitmanipTemplate */ #include "dcmtk/ofstd/ofdatime.h" /* for OFDateTime */ #include "dcmtk/dcmdata/dcuid.h" /* for dcmtk version name */ #include "dcmtk/dcmnet/diutil.h" #include "dcmtk/dcmdata/cmdlnarg.h" #include "dcmtk/ofstd/ofconapp.h" #include "dcmtk/dcmpstat/dvpsprt.h" #include "dcmtk/dcmpstat/dvpshlp.h" #include "dcmtk/oflog/fileap.h" #ifdef WITH_OPENSSL #include "dcmtk/dcmtls/tlstrans.h" #include "dcmtk/dcmtls/tlslayer.h" #endif #ifdef WITH_ZLIB #include /* for zlibVersion() */ #endif #define OFFIS_CONSOLE_APPLICATION "dcmprscp" static OFLogger dcmprscpLogger = OFLog::getLogger("dcmtk.apps." OFFIS_CONSOLE_APPLICATION); static char rcsid[] = "$dcmtk: " OFFIS_CONSOLE_APPLICATION " v" OFFIS_DCMTK_VERSION " " OFFIS_DCMTK_RELEASEDATE " $"; /* command line options */ static OFBool opt_binaryLog = OFFalse; static OFBool opt_logFile = OFFalse; static const char *opt_cfgName = NULL; /* config file name */ static const char *opt_printer = NULL; /* printer name */ static void cleanChildren() { #ifdef HAVE_WAITPID int stat_loc; #elif HAVE_WAIT3 struct rusage rusage; #if defined(__NeXT__) /* some systems need a union wait as argument to wait3 */ union wait status; #else int status; #endif #endif #if defined(HAVE_WAITPID) || defined(HAVE_WAIT3) int child = 1; int options = WNOHANG; while (child > 0) { #ifdef HAVE_WAITPID child = (int)(waitpid(-1, &stat_loc, options)); #elif defined(HAVE_WAIT3) child = wait3(&status, options, &rusage); #endif if (child < 0) { if (errno != ECHILD) { char buf[256]; OFLOG_ERROR(dcmprscpLogger, "wait for child failed: " << OFStandard::strerror(errno, buf, sizeof(buf))); } } } #endif } #define SHORTCOL 3 #define LONGCOL 12 int main(int argc, char *argv[]) { #ifdef HAVE_GUSI_H GUSISetup(GUSIwithSIOUXSockets); GUSISetup(GUSIwithInternetSockets); #endif #ifdef HAVE_WINSOCK_H WSAData winSockData; /* we need at least version 1.1 */ WORD winSockVersionNeeded = MAKEWORD( 1, 1 ); WSAStartup(winSockVersionNeeded, &winSockData); #endif dcmDisableGethostbyaddr.set(OFTrue); // disable hostname lookup OFConsoleApplication app(OFFIS_CONSOLE_APPLICATION , "DICOM basic grayscale print management SCP", rcsid); OFCommandLine cmd; cmd.setOptionColumns(LONGCOL, SHORTCOL); cmd.setParamColumn(LONGCOL + SHORTCOL + 2); cmd.addGroup("general options:"); cmd.addOption("--help", "-h", "print this help text and exit", OFCommandLine::AF_Exclusive); cmd.addOption("--version", "print version information and exit", OFCommandLine::AF_Exclusive); OFLog::addOptions(cmd); cmd.addOption("--logfile", "-l", "write a log file (not with --log-config)"); cmd.addGroup("processing options:"); cmd.addOption("--config", "-c", 1, "[f]ilename: string", "process using settings from configuration file"); cmd.addOption("--printer", "-p", 1, "[n]ame: string (default: 1st printer in config file)", "select printer with identifier n from config file"); cmd.addOption("--dump", "+d", "dump all DIMSE messages"); /* evaluate command line */ prepareCmdLineArgs(argc, argv, OFFIS_CONSOLE_APPLICATION); if (app.parseCommandLine(cmd, argc, argv, OFCommandLine::PF_ExpandWildcards)) { /* check exclusive options first */ if (cmd.hasExclusiveOption()) { if (cmd.findOption("--version")) { app.printHeader(OFTrue /*print host identifier*/); COUT << OFendl << "External libraries used:"; #if !defined(WITH_ZLIB) && !defined(WITH_OPENSSL) COUT << " none" << OFendl; #else COUT << OFendl; #endif #ifdef WITH_ZLIB COUT << "- ZLIB, Version " << zlibVersion() << OFendl; #endif #ifdef WITH_OPENSSL COUT << "- " << OPENSSL_VERSION_TEXT << OFendl; #endif return 0; } } /* options */ if (cmd.findOption("--dump")) { // Messages to the "dump" logger are always written with the debug log // level, thus enabling that logger for this level shows the dumps log4cplus::Logger log = log4cplus::Logger::getInstance("dcmtk.dcmpstat.dump"); log.setLogLevel(OFLogger::DEBUG_LOG_LEVEL); } OFLog::configureFromCommandLine(cmd, app); if (cmd.findOption("--logfile")) { app.checkConflict("--logfile", "--log-config", cmd.findOption("--log-config")); opt_logFile = OFTrue; } if (cmd.findOption("--config")) app.checkValue(cmd.getValue(opt_cfgName)); if (cmd.findOption("--printer")) app.checkValue(cmd.getValue(opt_printer)); } /* print resource identifier */ OFLOG_DEBUG(dcmprscpLogger, rcsid << OFendl); if (opt_cfgName) { FILE *cfgfile = fopen(opt_cfgName, "rb"); if (cfgfile) fclose(cfgfile); else { OFLOG_FATAL(dcmprscpLogger, "can't open configuration file '" << opt_cfgName << "'"); return 10; } } else { OFLOG_FATAL(dcmprscpLogger, "no configuration file specified"); return 10; } DVInterface dvi(opt_cfgName); if (opt_printer) { if (DVPSE_printLocal != dvi.getTargetType(opt_printer)) { OFLOG_FATAL(dcmprscpLogger, "no print scp definition for '" << opt_printer << "' found in config file"); return 10; } } else { opt_printer = dvi.getTargetID(0, DVPSE_printLocal); // use default print scp if (opt_printer==NULL) { OFLOG_FATAL(dcmprscpLogger, "no default print scp available - no config file?"); return 10; } } opt_binaryLog = dvi.getBinaryLog(); OFString logfileprefix; OFString aString; unsigned long logcounter = 0; char logcounterbuf[20]; logfileprefix = dvi.getSpoolFolder(); logfileprefix += PATH_SEPARATOR; logfileprefix += "PrintSCP_"; logfileprefix += opt_printer; logfileprefix += "_"; DVPSHelper::currentDate(aString); logfileprefix += aString; logfileprefix += "_"; DVPSHelper::currentTime(aString); logfileprefix += aString; if (opt_logFile) { const char *pattern = "%m%n"; OFString logfilename = logfileprefix; logfilename += ".log"; OFauto_ptr layout(new log4cplus::PatternLayout(pattern)); log4cplus::SharedAppenderPtr logfile(new log4cplus::FileAppender(logfilename)); log4cplus::Logger log = log4cplus::Logger::getRoot(); logfile->setLayout(layout); log.removeAllAppenders(); log.addAppender(logfile); } OFLOG_WARN(dcmprscpLogger, rcsid << OFendl << OFDateTime::getCurrentDateTime() << OFendl << "started"); /* make sure data dictionary is loaded */ if (!dcmDataDict.isDictionaryLoaded()) OFLOG_WARN(dcmprscpLogger, "no data dictionary loaded, check environment variable: " << DCM_DICT_ENVIRONMENT_VARIABLE); /* check if we can get access to the database */ const char *dbfolder = dvi.getDatabaseFolder(); OFLOG_INFO(dcmprscpLogger, "Using database in directory '" << dbfolder << "'"); OFCondition cond2 = EC_Normal; DcmQueryRetrieveIndexDatabaseHandle *dbhandle = new DcmQueryRetrieveIndexDatabaseHandle(dbfolder, PSTAT_MAXSTUDYCOUNT, PSTAT_STUDYSIZE, cond2); delete dbhandle; if (cond2.bad()) { OFLOG_FATAL(dcmprscpLogger, "Unable to access database '" << dbfolder << "'"); return 10; } /* get print scp data from configuration file */ unsigned short targetPort = dvi.getTargetPort(opt_printer); OFBool targetDisableNewVRs = dvi.getTargetDisableNewVRs(opt_printer); OFBool targetUseTLS = dvi.getTargetUseTLS(opt_printer); if (targetPort == 0) { OFLOG_FATAL(dcmprscpLogger, "no or invalid port number for print scp '" << opt_printer << "'"); return 10; } if (targetDisableNewVRs) { dcmEnableUnknownVRGeneration.set(OFFalse); dcmEnableUnlimitedTextVRGeneration.set(OFFalse); } T_ASC_Network *net = NULL; /* the DICOM network and listen port */ OFBool finished = OFFalse; int connected = 0; #ifdef WITH_OPENSSL /* TLS directory */ const char *current = NULL; const char *tlsFolder = dvi.getTLSFolder(); if (tlsFolder==NULL) tlsFolder = "."; /* certificate file */ OFString tlsCertificateFile(tlsFolder); tlsCertificateFile += PATH_SEPARATOR; current = dvi.getTargetCertificate(opt_printer); if (current) tlsCertificateFile += current; else tlsCertificateFile += "sitecert.pem"; /* private key file */ OFString tlsPrivateKeyFile(tlsFolder); tlsPrivateKeyFile += PATH_SEPARATOR; current = dvi.getTargetPrivateKey(opt_printer); if (current) tlsPrivateKeyFile += current; else tlsPrivateKeyFile += "sitekey.pem"; /* private key password */ const char *tlsPrivateKeyPassword = dvi.getTargetPrivateKeyPassword(opt_printer); /* certificate verification */ DcmCertificateVerification tlsCertVerification = DCV_requireCertificate; switch (dvi.getTargetPeerAuthentication(opt_printer)) { case DVPSQ_require: tlsCertVerification = DCV_requireCertificate; break; case DVPSQ_verify: tlsCertVerification = DCV_checkCertificate; break; case DVPSQ_ignore: tlsCertVerification = DCV_ignoreCertificate; break; } /* DH parameter file */ OFString tlsDHParametersFile; current = dvi.getTargetDiffieHellmanParameters(opt_printer); if (current) { tlsDHParametersFile = tlsFolder; tlsDHParametersFile += PATH_SEPARATOR; tlsDHParametersFile += current; } /* random seed file */ OFString tlsRandomSeedFile(tlsFolder); tlsRandomSeedFile += PATH_SEPARATOR; current = dvi.getTargetRandomSeed(opt_printer); if (current) tlsRandomSeedFile += current; else tlsRandomSeedFile += "siteseed.bin"; /* CA certificate directory */ const char *tlsCACertificateFolder = dvi.getTLSCACertificateFolder(); if (tlsCACertificateFolder==NULL) tlsCACertificateFolder = "."; /* key file format */ int keyFileFormat = SSL_FILETYPE_PEM; if (! dvi.getTLSPEMFormat()) keyFileFormat = SSL_FILETYPE_ASN1; /* ciphersuites */ #if OPENSSL_VERSION_NUMBER >= 0x0090700fL OFString tlsCiphersuites(TLS1_TXT_RSA_WITH_AES_128_SHA ":" SSL3_TXT_RSA_DES_192_CBC3_SHA); #else OFString tlsCiphersuites(SSL3_TXT_RSA_DES_192_CBC3_SHA); #endif Uint32 tlsNumberOfCiphersuites = dvi.getTargetNumberOfCipherSuites(opt_printer); if (tlsNumberOfCiphersuites > 0) { tlsCiphersuites.clear(); OFString currentSuite; const char *currentOpenSSL; for (Uint32 ui=0; ui 0) tlsCiphersuites += ":"; tlsCiphersuites += currentOpenSSL; } } } DcmTLSTransportLayer *tLayer = NULL; if (targetUseTLS) { tLayer = new DcmTLSTransportLayer(DICOM_APPLICATION_ACCEPTOR, tlsRandomSeedFile.c_str()); if (tLayer == NULL) { OFLOG_FATAL(dcmprscpLogger, "unable to create TLS transport layer"); return 1; } if (tlsCACertificateFolder && (TCS_ok != tLayer->addTrustedCertificateDir(tlsCACertificateFolder, keyFileFormat))) { OFLOG_WARN(dcmprscpLogger, "unable to load certificates from directory '" << tlsCACertificateFolder << "', ignoring"); } if ((tlsDHParametersFile.size() > 0) && ! (tLayer->setTempDHParameters(tlsDHParametersFile.c_str()))) { OFLOG_WARN(dcmprscpLogger, "unable to load temporary DH parameter file '" << tlsDHParametersFile << "', ignoring"); } tLayer->setPrivateKeyPasswd(tlsPrivateKeyPassword); // never prompt on console if (TCS_ok != tLayer->setPrivateKeyFile(tlsPrivateKeyFile.c_str(), keyFileFormat)) { OFLOG_FATAL(dcmprscpLogger, "unable to load private TLS key from '" << tlsPrivateKeyFile<< "'"); return 1; } if (TCS_ok != tLayer->setCertificateFile(tlsCertificateFile.c_str(), keyFileFormat)) { OFLOG_FATAL(dcmprscpLogger, "unable to load certificate from '" << tlsCertificateFile << "'"); return 1; } if (! tLayer->checkPrivateKeyMatchesCertificate()) { OFLOG_FATAL(dcmprscpLogger, "private key '" << tlsPrivateKeyFile << "' and certificate '" << tlsCertificateFile << "' do not match"); return 1; } if (TCS_ok != tLayer->setCipherSuites(tlsCiphersuites.c_str())) { OFLOG_FATAL(dcmprscpLogger, "unable to set selected cipher suites"); return 1; } tLayer->setCertificateVerification(tlsCertVerification); } #else if (targetUseTLS) { OFLOG_FATAL(dcmprscpLogger, "not compiled with OpenSSL, cannot use TLS"); return 10; } #endif /* open listen socket */ OFCondition cond = ASC_initializeNetwork(NET_ACCEPTOR, targetPort, 30, &net); if (cond.bad()) { OFString temp_str; OFLOG_FATAL(dcmprscpLogger, "cannot initialise network:\n" << DimseCondition::dump(temp_str, cond)); return 1; } #ifdef WITH_OPENSSL if (tLayer) { cond = ASC_setTransportLayer(net, tLayer, 0); if (cond.bad()) { OFString temp_str; OFLOG_FATAL(dcmprscpLogger, DimseCondition::dump(temp_str, cond)); return 1; } } #endif #if defined(HAVE_SETUID) && defined(HAVE_GETUID) /* return to normal uid so that we can't do too much damage in case * things go very wrong. Only relevant if the program is setuid root, * and run by another user. Running as root user may be * potentially disasterous if this program screws up badly. */ setuid(getuid()); #endif #ifdef HAVE_FORK int timeout=1; #else int timeout=1000; #endif while (!finished) { DVPSPrintSCP printSCP(dvi, opt_printer); // use new print SCP object for each association if (opt_binaryLog) { aString = logfileprefix; aString += "_"; sprintf(logcounterbuf, "%04ld", ++logcounter); aString += logcounterbuf; aString += ".dcm"; printSCP.setDimseLogPath(aString.c_str()); } connected = 0; while (!connected) { connected = ASC_associationWaiting(net, timeout); if (!connected) cleanChildren(); } switch (printSCP.negotiateAssociation(*net)) { case DVPSJ_error: // association has already been deleted, we just wait for the next client to connect. break; case DVPSJ_terminate: finished=OFTrue; cond = ASC_dropNetwork(&net); if (cond.bad()) { OFString temp_str; OFLOG_FATAL(dcmprscpLogger, "cannot drop network:\n" << DimseCondition::dump(temp_str, cond)); return 10; } break; case DVPSJ_success: printSCP.handleClient(); break; } } // finished cleanChildren(); #ifdef HAVE_WINSOCK_H WSACleanup(); #endif #ifdef DEBUG dcmDataDict.clear(); /* useful for debugging with dmalloc */ #endif #ifdef WITH_OPENSSL if (tLayer) { if (tLayer->canWriteRandomSeed()) { if (!tLayer->writeRandomSeed(tlsRandomSeedFile.c_str())) { OFLOG_ERROR(dcmprscpLogger, "cannot write back random seed file '" << tlsRandomSeedFile << "', ignoring"); } } else { OFLOG_WARN(dcmprscpLogger, "cannot write back random seed, ignoring"); } } delete tLayer; #endif return 0; } /* * CVS/RCS Log: * $Log: dcmprscp.cc,v $ * Revision 1.32 2010-10-14 13:13:45 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.31 2010-06-03 10:32:58 joergr * Replaced calls to strerror() by new helper function OFStandard::strerror() * which results in using the thread safe version of strerror() if available. * * Revision 1.30 2010-04-29 10:36:52 joergr * Fixed typo in log message. * * Revision 1.29 2009-12-16 14:12:18 joergr * Slightly modified description of command line option --logfile. * * Revision 1.28 2009-12-15 14:50:49 uli * Fixes some issues with --logfile and the config's log options. * * Revision 1.27 2009-12-15 12:34:40 uli * Re-added and fixed the command line option --logfile. * * Revision 1.26 2009-12-11 15:23:25 joergr * Changed description of command line option --dump. * * Revision 1.25 2009-11-27 10:52:01 joergr * Fixed various issues with syntax usage (e.g. layout and formatting). * Sightly modifed log messages. * * Revision 1.24 2009-11-24 14:12:56 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.23 2008-09-25 16:30:24 joergr * Added support for printing the expanded command line arguments. * Always output the resource identifier of the command line tool in debug mode. * * Revision 1.22 2006/08/15 16:57:01 meichel * Updated the code in module dcmpstat to correctly compile when * all standard C++ classes remain in namespace std. * * Revision 1.21 2006/07/27 14:36:27 joergr * Changed parameter "exclusive" of method addOption() from type OFBool into an * integer parameter "flags". Prepended prefix "PF_" to parseLine() flags. * Option "--help" is no longer an exclusive option by default. * * Revision 1.20 2005/12/08 15:46:05 meichel * Changed include path schema for all DCMTK header files * * Revision 1.19 2005/11/28 15:29:05 meichel * File dcdebug.h is not included by any other header file in the toolkit * anymore, to minimize the risk of name clashes of macro debug(). * * Revision 1.18 2005/11/23 16:10:32 meichel * Added support for AES ciphersuites in TLS module. All TLS-enabled * tools now support the "AES TLS Secure Transport Connection Profile". * * Revision 1.17 2005/11/16 14:58:23 meichel * Set association timeout in ASC_initializeNetwork to 30 seconds. This improves * the responsiveness of the tools if the peer blocks during assoc negotiation. * * Revision 1.16 2005/04/04 10:11:53 meichel * Module dcmpstat now uses the dcmqrdb API instead of imagectn for maintaining * the index database * * Revision 1.15 2004/02/04 15:44:38 joergr * Removed acknowledgements with e-mail addresses from CVS log. * * Revision 1.14 2003/09/05 10:38:24 meichel * Print SCP now supports TLS connections and the Verification Service Class. * * Revision 1.13 2003/09/04 10:09:16 joergr * Fixed wrong use of OFBool/bool variable. * * Revision 1.12 2002/11/26 08:44:26 meichel * Replaced all includes for "zlib.h" with * to avoid inclusion of zlib.h in the makefile dependencies. * * Revision 1.11 2002/09/23 18:26:06 joergr * Added new command line option "--version" which prints the name and version * number of external libraries used (incl. preparation for future support of * 'config.guess' host identifiers). * * Revision 1.10 2002/06/14 10:44:17 meichel * Adapted log file handling to ofConsole singleton * * Revision 1.9 2002/04/16 14:01:26 joergr * Added configurable support for C++ ANSI standard includes (e.g. streams). * * Revision 1.8 2002/04/11 13:15:38 joergr * Replaced direct call of system routines by new standard date and time * functions. * * Revision 1.7 2001/10/12 13:46:48 meichel * Adapted dcmpstat to OFCondition based dcmnet module (supports strict mode). * * Revision 1.6 2001/06/01 15:50:07 meichel * Updated copyright header * * Revision 1.5 2001/06/01 11:02:05 meichel * Implemented global flag and command line option to disable reverse * DNS hostname lookup using gethostbyaddr when accepting associations. * * Revision 1.4 2000/06/07 13:17:42 meichel * added binary and textual log facilities to Print SCP. * * Revision 1.3 2000/06/06 09:44:07 joergr * Moved configuration file entry "LogDirectory" from "[PRINT]" to new * (more general) section "[APPLICATION]". * * Revision 1.2 2000/06/02 16:00:38 meichel * Adapted all dcmpstat classes to use OFConsole for log and error output * * Revision 1.1 2000/05/31 12:59:28 meichel * Added initial Print SCP support * * */ dcmtk-3.6.0/dcmpstat/apps/dcmpssnd.cc0000644000310500011400000012651511464253106016757 0ustar joergrdicom3/* * * Copyright (C) 1999-2010, 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 * * Authors: Marco Eichelberg * * Purpose: Presentation State Viewer - Network Send Component (Store SCU) * * Last Update: $Author: uli $ * Update Date: $Date: 2010-11-03 12:32:06 $ * CVS/RCS Revision: $Revision: 1.48 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #ifdef HAVE_GUSI_H #include #endif BEGIN_EXTERN_C #ifdef HAVE_FCNTL_H #include /* for O_RDONLY */ #endif #ifdef HAVE_SYS_TYPES_H #include /* required for sys/stat.h */ #endif #ifdef HAVE_SYS_STAT_H #include /* for stat, fstat */ #endif END_EXTERN_C #include "dcmtk/dcmpstat/dvpsdef.h" /* for constants */ #include "dcmtk/dcmpstat/dvpscf.h" /* for class DVConfiguration */ #include "dcmtk/ofstd/ofbmanip.h" /* for OFBitmanipTemplate */ #include "dcmtk/dcmdata/dcuid.h" /* for dcmtk version name */ #include "dcmtk/dcmdata/dcdeftag.h" #include "dcmtk/dcmdata/dcdict.h" #include "dcmtk/dcmnet/diutil.h" #include "dcmtk/dcmdata/cmdlnarg.h" #include "dcmtk/ofstd/ofconapp.h" #include "dcmtk/dcmpstat/dvpshlp.h" /* for class DVPSHelper */ #include "dcmtk/dcmqrdb/dcmqrdbi.h" /* for LOCK_IMAGE_FILES */ #include "dcmtk/dcmqrdb/dcmqrdbs.h" /* for DcmQueryRetrieveDatabaseStatus */ #include "dcmtk/dcmpstat/dvpsmsg.h" #ifdef WITH_OPENSSL #include "dcmtk/dcmtls/tlstrans.h" #include "dcmtk/dcmtls/tlslayer.h" #endif #ifdef WITH_ZLIB #include /* for zlibVersion() */ #endif #include "dcmtk/ofstd/ofstream.h" #define OFFIS_CONSOLE_APPLICATION "dcmpssnd" static OFLogger dcmpssndLogger = OFLog::getLogger("dcmtk.apps." OFFIS_CONSOLE_APPLICATION); static char rcsid[] = "$dcmtk: " OFFIS_CONSOLE_APPLICATION " v" OFFIS_DCMTK_VERSION " " OFFIS_DCMTK_RELEASEDATE " $"; DVPSIPCClient *messageClient = NULL; // global pointer to IPC message client, if present /** sends a single DICOM instance over an association which must be already established. * @param assoc DICOM network association * @param sopClass SOP Class UID of the image (used for the C-Store-RQ) * @param sopInstance SOP Instance UID of the image (used for the C-Store-RQ) * @param imgFile path to the image file to be transmitted * @return EC_Normal if successful, a different DIMSE code otherwise. */ static OFCondition sendImage(T_ASC_Association *assoc, const char *sopClass, const char *sopInstance, const char *imgFile) { DcmDataset *statusDetail = NULL; T_ASC_PresentationContextID presId=0; T_DIMSE_C_StoreRQ req; T_DIMSE_C_StoreRSP rsp; if (assoc == NULL) return DIMSE_NULLKEY; if ((sopClass == NULL)||(strlen(sopClass) == 0)) return DIMSE_NULLKEY; if ((sopInstance == NULL)||(strlen(sopInstance) == 0)) return DIMSE_NULLKEY; if ((imgFile == NULL)||(strlen(imgFile) == 0)) return DIMSE_NULLKEY; #ifdef LOCK_IMAGE_FILES /* shared lock image file */ #ifdef O_BINARY int lockfd = open(imgFile, O_RDONLY | O_BINARY, 0666); #else int lockfd = open(imgFile, O_RDONLY, 0666); #endif if (lockfd < 0) { OFLOG_INFO(dcmpssndLogger, "unable to lock image file '" << imgFile << "'"); return DIMSE_BADDATA; } dcmtk_flock(lockfd, LOCK_SH); #endif /* which presentation context should be used */ presId = ASC_findAcceptedPresentationContextID(assoc, sopClass); if (presId == 0) { OFLOG_INFO(dcmpssndLogger, "no presentation context for: (" << dcmSOPClassUIDToModality(sopClass, "OT") << ") " << sopClass); if (messageClient) { OFString buf("unable to send image: no presentation context for "); const char *sopClassName = dcmFindNameOfUID(sopClass); if (sopClassName == NULL) buf.append(sopClass); else buf.append(sopClassName); buf.append("\n"); messageClient->notifySentDICOMObject(DVPSIPCMessage::statusWarning, buf.c_str()); } return DIMSE_NOVALIDPRESENTATIONCONTEXTID; } /* start store */ OFBitmanipTemplate::zeroMem((char *)&req, sizeof(req)); req.MessageID = assoc->nextMsgID++; strcpy(req.AffectedSOPClassUID, sopClass); strcpy(req.AffectedSOPInstanceUID, sopInstance); req.DataSetType = DIMSE_DATASET_PRESENT; req.Priority = DIMSE_PRIORITY_MEDIUM; OFCondition cond = DIMSE_storeUser(assoc, presId, &req, imgFile, NULL, NULL, NULL, DIMSE_BLOCKING, 0, &rsp, &statusDetail); #ifdef LOCK_IMAGE_FILES /* unlock image file */ dcmtk_flock(lockfd, LOCK_UN); close(lockfd); #endif if (cond.good()) { OFLOG_INFO(dcmpssndLogger, "[MsgID " << req.MessageID << "] Complete [Status: " << DU_cstoreStatusString(rsp.DimseStatus) << "]"); } else { OFString temp_str; OFLOG_INFO(dcmpssndLogger, "[MsgID " << req.MessageID << "] Failed [Status: " << DU_cstoreStatusString(rsp.DimseStatus) << "]\n" << DimseCondition::dump(temp_str, cond)); } if (statusDetail) delete statusDetail; if (messageClient) { OFOStringStream out; Uint32 operationStatus = DVPSIPCMessage::statusError; if (cond.good()) { if (rsp.DimseStatus == STATUS_Success) operationStatus = DVPSIPCMessage::statusOK; else operationStatus = DVPSIPCMessage::statusWarning; } const char *sopClassName = dcmFindNameOfUID(sopClass); const char *successName = "failed"; if (operationStatus == DVPSIPCMessage::statusOK) successName = "successful"; if (sopClassName==NULL) sopClassName = sopClass; unsigned long fileSize = 0; struct stat fileStat; if (0 == stat(imgFile, &fileStat)) fileSize = fileStat.st_size; out << "DICOM C-STORE transmission " << successName << ": " << OFendl << "\tSOP class UID : " << sopClassName << OFendl << "\tSOP instance UID : " << sopInstance << OFendl << "\tSource file path : " << imgFile << OFendl << "\tSource file size (kB) : " << (fileSize+1023)/1024 << OFendl << "\tDIMSE presentation ctx : " << (int)presId << OFendl << "\tDIMSE message ID : " << req.MessageID << OFendl << "\tDIMSE status : " << DU_cstoreStatusString(rsp.DimseStatus) << OFendl << OFStringStream_ends; OFSTRINGSTREAM_GETSTR(out, theString) messageClient->notifySentDICOMObject(operationStatus, theString); OFSTRINGSTREAM_FREESTR(theString) } return cond; } /** sends a complete DICOM study, series or a single instance * over an association which must be already established. * The instances (files) to be transmitted are derived from the database. * @param handle open database handle * @param assoc DICOM network association * @param studyUID Study Instance UID of the study/series/image to be transmitted. * @param seriesUID Series Instance UID of the series/image to be transmitted. * If NULL, a complete study is transmitted. * @param instanceUID SOP Instance UID of the image to be transmitted. * If NULL, a complete series is transmitted. * @return EC_Normal if successful, a different DIMSE code otherwise. */ static OFCondition sendStudy( DcmQueryRetrieveIndexDatabaseHandle &handle, T_ASC_Association *assoc, const char *studyUID, const char *seriesUID, const char *instanceUID) { if ((assoc==NULL)||(studyUID==NULL)) return DIMSE_NULLKEY; /* build query */ DcmDataset query; OFCondition cond = DVPSHelper::putStringValue(&query, DCM_StudyInstanceUID, studyUID); if (cond.bad()) return cond; if (seriesUID && instanceUID) { cond = DVPSHelper::putStringValue(&query, DCM_QueryRetrieveLevel, "IMAGE"); if (cond.bad()) return cond; cond = DVPSHelper::putStringValue(&query, DCM_SeriesInstanceUID, seriesUID); if (cond.bad()) return cond; cond = DVPSHelper::putStringValue(&query, DCM_SOPInstanceUID, instanceUID); if (cond.bad()) return cond; OFLOG_INFO(dcmpssndLogger, "Sending at IMAGE level:" << OFendl << " Study Instance UID : " << studyUID << OFendl << " Series Instance UID: " << seriesUID << OFendl << " SOP Instance UID : " << instanceUID); } else if (seriesUID) { cond = DVPSHelper::putStringValue(&query, DCM_QueryRetrieveLevel, "SERIES"); if (cond.bad()) return cond; cond = DVPSHelper::putStringValue(&query, DCM_SeriesInstanceUID, seriesUID); if (cond.bad()) return cond; OFLOG_INFO(dcmpssndLogger, "Sending at SERIES level:" << OFendl << " Study Instance UID : " << studyUID << OFendl << " Series Instance UID: " << seriesUID); } else { cond = DVPSHelper::putStringValue(&query, DCM_QueryRetrieveLevel, "STUDY"); if (cond.bad()) return cond; OFLOG_INFO(dcmpssndLogger, "Sending at STUDY level:" << OFendl << " Study Instance UID : " << studyUID); } DcmQueryRetrieveDatabaseStatus dbStatus(STATUS_Pending); DIC_UI sopClass; DIC_UI sopInstance; char imgFile[MAXPATHLEN+1]; DIC_US nRemaining = 0; cond = handle.startMoveRequest(UID_MOVEStudyRootQueryRetrieveInformationModel, &query, &dbStatus); if (cond.bad()) return cond; while (dbStatus.status() == STATUS_Pending) { cond = handle.nextMoveResponse(sopClass, sopInstance, imgFile, &nRemaining, &dbStatus); if (cond.bad()) return cond; if (dbStatus.status() == STATUS_Pending) { cond = sendImage(assoc, sopClass, sopInstance, imgFile); if (cond.bad()) { handle.cancelMoveRequest(&dbStatus); return cond; } } } return cond; } /** adds presentation contexts for all storage SOP classes * to the association parameters. * If the opt_implicitOnly flag is set, only Implicit VR Little Endian * is offered as transfer syntax. Otherwise, three xfer syntaxes are offered: * first the explicit VR with local byte ordering, followed by explicit VR * with opposite byte ordering, followed by implicit VR little endian. * @param params parameter set to which presentation contexts are added * @param opt_implicitOnly flag defining whether only Implicit VR Little Endian * should be offered as xfer syntax. * @return EC_Normal upon success, an error code otherwise. */ static OFCondition addAllStoragePresentationContexts(T_ASC_Parameters *params, int opt_implicitOnly) { OFCondition cond = EC_Normal; int pid = 1; const char* transferSyntaxes[3]; int transferSyntaxCount = 0; if (opt_implicitOnly) { transferSyntaxes[0] = UID_LittleEndianImplicitTransferSyntax; transferSyntaxCount = 1; } else { /* gLocalByteOrder is defined in dcxfer.h */ if (gLocalByteOrder == EBO_LittleEndian) { /* we are on a little endian machine */ transferSyntaxes[0] = UID_LittleEndianExplicitTransferSyntax; transferSyntaxes[1] = UID_BigEndianExplicitTransferSyntax; } else { /* we are on a big endian machine */ transferSyntaxes[0] = UID_BigEndianExplicitTransferSyntax; transferSyntaxes[1] = UID_LittleEndianExplicitTransferSyntax; } transferSyntaxes[2] = UID_LittleEndianImplicitTransferSyntax; transferSyntaxCount = 3; } for (int i=0; i= 4) cmd.getParam(4, opt_seriesUID); if (cmd.getParamCount() >= 5) cmd.getParam(5, opt_instanceUID); OFLog::configureFromCommandLine(cmd, app); } /* print resource identifier */ OFLOG_DEBUG(dcmpssndLogger, rcsid << OFendl); if (opt_cfgName) { FILE *cfgfile = fopen(opt_cfgName, "rb"); if (cfgfile) fclose(cfgfile); else { OFLOG_FATAL(dcmpssndLogger, "can't open configuration file '" << opt_cfgName << "'"); return 10; } } else { OFLOG_FATAL(dcmpssndLogger, "missing configuration file name"); return 10; } /* make sure data dictionary is loaded */ if (!dcmDataDict.isDictionaryLoaded()) { OFLOG_WARN(dcmpssndLogger, "no data dictionary loaded, check environment variable: " << DCM_DICT_ENVIRONMENT_VARIABLE); } DVConfiguration dvi(opt_cfgName); /* get send target from configuration file */ const char *targetHostname = dvi.getTargetHostname(opt_target); const char *targetDescription = dvi.getTargetDescription(opt_target); const char *targetAETitle = dvi.getTargetAETitle(opt_target); unsigned short targetPort = dvi.getTargetPort(opt_target); unsigned long targetMaxPDU = dvi.getTargetMaxPDU(opt_target); OFBool targetImplicitOnly = dvi.getTargetImplicitOnly(opt_target); OFBool targetDisableNewVRs = dvi.getTargetDisableNewVRs(opt_target); unsigned short messagePort = dvi.getMessagePort(); /* port number for IPC */ OFBool keepMessagePortOpen = dvi.getMessagePortKeepOpen(); OFBool useTLS = dvi.getTargetUseTLS(opt_target); Sint32 timeout = dvi.getTargetTimeout(opt_target); if (timeout > 0) dcmConnectionTimeout.set(timeout); #ifdef WITH_OPENSSL /* TLS directory */ const char *current = NULL; const char *tlsFolder = dvi.getTLSFolder(); if (tlsFolder==NULL) tlsFolder = "."; /* certificate file */ OFString tlsCertificateFile(tlsFolder); tlsCertificateFile += PATH_SEPARATOR; current = dvi.getTargetCertificate(opt_target); if (current) tlsCertificateFile += current; else tlsCertificateFile.clear(); /* private key file */ OFString tlsPrivateKeyFile(tlsFolder); tlsPrivateKeyFile += PATH_SEPARATOR; current = dvi.getTargetPrivateKey(opt_target); if (current) tlsPrivateKeyFile += current; else tlsPrivateKeyFile.clear(); /* private key password */ const char *tlsPrivateKeyPassword = dvi.getTargetPrivateKeyPassword(opt_target); /* certificate verification */ DcmCertificateVerification tlsCertVerification = DCV_requireCertificate; switch (dvi.getTargetPeerAuthentication(opt_target)) { case DVPSQ_require: tlsCertVerification = DCV_requireCertificate; break; case DVPSQ_verify: tlsCertVerification = DCV_checkCertificate; break; case DVPSQ_ignore: tlsCertVerification = DCV_ignoreCertificate; break; } /* DH parameter file */ OFString tlsDHParametersFile; current = dvi.getTargetDiffieHellmanParameters(opt_target); if (current) { tlsDHParametersFile = tlsFolder; tlsDHParametersFile += PATH_SEPARATOR; tlsDHParametersFile += current; } /* random seed file */ OFString tlsRandomSeedFile(tlsFolder); tlsRandomSeedFile += PATH_SEPARATOR; current = dvi.getTargetRandomSeed(opt_target); if (current) tlsRandomSeedFile += current; else tlsRandomSeedFile += "siteseed.bin"; /* CA certificate directory */ const char *tlsCACertificateFolder = dvi.getTLSCACertificateFolder(); if (tlsCACertificateFolder==NULL) tlsCACertificateFolder = "."; /* key file format */ int keyFileFormat = SSL_FILETYPE_PEM; if (! dvi.getTLSPEMFormat()) keyFileFormat = SSL_FILETYPE_ASN1; /* ciphersuites */ #if OPENSSL_VERSION_NUMBER >= 0x0090700fL OFString tlsCiphersuites(TLS1_TXT_RSA_WITH_AES_128_SHA ":" SSL3_TXT_RSA_DES_192_CBC3_SHA); #else OFString tlsCiphersuites(SSL3_TXT_RSA_DES_192_CBC3_SHA); #endif Uint32 tlsNumberOfCiphersuites = dvi.getTargetNumberOfCipherSuites(opt_target); if (tlsNumberOfCiphersuites > 0) { tlsCiphersuites.clear(); OFString currentSuite; const char *currentOpenSSL; for (Uint32 ui=0; ui 0) tlsCiphersuites += ":"; tlsCiphersuites += currentOpenSSL; } } } #else if (useTLS) { OFLOG_FATAL(dcmpssndLogger, "not compiled with OpenSSL, cannot use TLS"); return 10; } #endif if (targetHostname==NULL) { OFLOG_FATAL(dcmpssndLogger, "no hostname for send target '" << opt_target << "'"); return 10; } if (targetAETitle==NULL) { OFLOG_FATAL(dcmpssndLogger, "no aetitle for send target '" << opt_target << "'"); return 10; } if (targetPort==0) { OFLOG_FATAL(dcmpssndLogger, "no or invalid port number for send target '" << opt_target << "'"); return 10; } if (targetMaxPDU==0) targetMaxPDU = DEFAULT_MAXPDU; else if (targetMaxPDU > ASC_MAXIMUMPDUSIZE) { OFLOG_WARN(dcmpssndLogger, "max PDU size " << targetMaxPDU << " too big for send target '" << opt_target << "', using default: " << DEFAULT_MAXPDU); targetMaxPDU = DEFAULT_MAXPDU; } if (targetDisableNewVRs) { dcmEnableUnknownVRGeneration.set(OFFalse); dcmEnableUnlimitedTextVRGeneration.set(OFFalse); } OFOStringStream verboseParameters; verboseParameters << "Send target parameters:" << OFendl << "\thostname : " << targetHostname << OFendl << "\tport : " << targetPort << OFendl << "\tdescription : "; if (targetDescription) verboseParameters << targetDescription; else verboseParameters << "(none)"; verboseParameters << OFendl << "\taetitle : " << targetAETitle << OFendl << "\tmax pdu : " << targetMaxPDU << OFendl << "\ttimeout : " << timeout << OFendl << "\toptions : "; if (targetImplicitOnly && targetDisableNewVRs) verboseParameters << "implicit xfer syntax only, disable post-1993 VRs"; else if (targetImplicitOnly) verboseParameters << "implicit xfer syntax only"; else if (targetDisableNewVRs) verboseParameters << "disable post-1993 VRs"; else verboseParameters << "none"; verboseParameters << OFendl; verboseParameters << "\tTLS : "; if (useTLS) verboseParameters << "enabled" << OFendl; else verboseParameters << "disabled" << OFendl; #ifdef WITH_OPENSSL if (useTLS) { verboseParameters << "\tTLS certificate : " << tlsCertificateFile << OFendl << "\tTLS key file : " << tlsPrivateKeyFile << OFendl << "\tTLS DH params : " << tlsDHParametersFile << OFendl << "\tTLS PRNG seed : " << tlsRandomSeedFile << OFendl << "\tTLS CA directory: " << tlsCACertificateFolder << OFendl << "\tTLS ciphersuites: " << tlsCiphersuites << OFendl << "\tTLS key format : "; if (keyFileFormat == SSL_FILETYPE_PEM) verboseParameters << "PEM" << OFendl; else verboseParameters << "DER" << OFendl; verboseParameters << "\tTLS cert verify : "; switch (tlsCertVerification) { case DCV_checkCertificate: verboseParameters << "verify" << OFendl; break; case DCV_ignoreCertificate: verboseParameters << "ignore" << OFendl; break; default: verboseParameters << "require" << OFendl; break; } } #endif verboseParameters << OFStringStream_ends; OFSTRINGSTREAM_GETOFSTRING(verboseParameters, verboseParametersString) OFLOG_INFO(dcmpssndLogger, verboseParametersString); /* open database */ const char *dbfolder = dvi.getDatabaseFolder(); OFLOG_INFO(dcmpssndLogger, "Opening database in directory '" << dbfolder << "'"); OFCondition result; DcmQueryRetrieveIndexDatabaseHandle dbhandle(dbfolder, PSTAT_MAXSTUDYCOUNT, PSTAT_STUDYSIZE, result); if (result.bad()) { OFLOG_FATAL(dcmpssndLogger, "Unable to access database '" << dbfolder << "'"); return 1; } #ifdef WITH_OPENSSL DcmTLSTransportLayer *tLayer = NULL; if (useTLS) { tLayer = new DcmTLSTransportLayer(DICOM_APPLICATION_REQUESTOR, tlsRandomSeedFile.c_str()); if (tLayer == NULL) { OFLOG_FATAL(dcmpssndLogger, "unable to create TLS transport layer"); return 1; } if (tlsCACertificateFolder && (TCS_ok != tLayer->addTrustedCertificateDir(tlsCACertificateFolder, keyFileFormat))) { OFLOG_WARN(dcmpssndLogger, "unable to load certificates from directory '" << tlsCACertificateFolder << "', ignoring"); } if ((tlsDHParametersFile.size() > 0) && ! (tLayer->setTempDHParameters(tlsDHParametersFile.c_str()))) { OFLOG_WARN(dcmpssndLogger, "unable to load temporary DH parameter file '" << tlsDHParametersFile << "', ignoring"); } tLayer->setPrivateKeyPasswd(tlsPrivateKeyPassword); // never prompt on console if ((tlsPrivateKeyFile.length() > 0) && (tlsCertificateFile.length() > 0)) { if (TCS_ok != tLayer->setPrivateKeyFile(tlsPrivateKeyFile.c_str(), keyFileFormat)) { OFLOG_FATAL(dcmpssndLogger, "unable to load private TLS key from '" << tlsPrivateKeyFile<< "'"); return 1; } if (TCS_ok != tLayer->setCertificateFile(tlsCertificateFile.c_str(), keyFileFormat)) { OFLOG_FATAL(dcmpssndLogger, "unable to load certificate from '" << tlsCertificateFile << "'"); return 1; } if (! tLayer->checkPrivateKeyMatchesCertificate()) { OFLOG_FATAL(dcmpssndLogger, "private key '" << tlsPrivateKeyFile << "' and certificate '" << tlsCertificateFile << "' do not match"); return 1; } } if (TCS_ok != tLayer->setCipherSuites(tlsCiphersuites.c_str())) { OFLOG_FATAL(dcmpssndLogger, "unable to set selected cipher suites"); return 1; } tLayer->setCertificateVerification(tlsCertVerification); // a generated UID contains the process ID and current time. // Adding it to the PRNG seed guarantees that we have different seeds for different processes. char randomUID[65]; dcmGenerateUniqueIdentifier(randomUID); tLayer->addPRNGseed(randomUID, strlen(randomUID)); } #endif /* open network connection */ T_ASC_Network *net=NULL; T_ASC_Parameters *params=NULL; DIC_NODENAME localHost; DIC_NODENAME peerHost; T_ASC_Association *assoc=NULL; OFCondition cond = ASC_initializeNetwork(NET_REQUESTOR, 0, 30, &net); if (cond.bad()) { OFLOG_FATAL(dcmpssndLogger, DimseCondition::dump(temp_str, cond)); return 1; } #ifdef WITH_OPENSSL if (tLayer) { cond = ASC_setTransportLayer(net, tLayer, 0); if (cond.bad()) { OFLOG_FATAL(dcmpssndLogger, DimseCondition::dump(temp_str, cond)); return 1; } } #endif cond = ASC_createAssociationParameters(¶ms, targetMaxPDU); if (cond.bad()) { OFLOG_FATAL(dcmpssndLogger, DimseCondition::dump(temp_str, cond)); return 1; } cond = ASC_setTransportLayerType(params, useTLS); if (cond.bad()) { OFLOG_FATAL(dcmpssndLogger, DimseCondition::dump(temp_str, cond)); return 1; } ASC_setAPTitles(params, dvi.getNetworkAETitle(), targetAETitle, NULL); gethostname(localHost, sizeof(localHost) - 1); sprintf(peerHost, "%s:%d", targetHostname, (int)targetPort); ASC_setPresentationAddresses(params, localHost, peerHost); cond = addAllStoragePresentationContexts(params, targetImplicitOnly); if (cond.bad()) { OFLOG_FATAL(dcmpssndLogger, DimseCondition::dump(temp_str, cond)); return 1; } if (messagePort > 0) { messageClient = new DVPSIPCClient(DVPSIPCMessage::clientStoreSCU, verboseParametersString.c_str(), messagePort, keepMessagePortOpen); if (! messageClient->isServerActive()) { OFLOG_WARN(dcmpssndLogger, "no IPC message server found at port " << messagePort << ", disabling IPC"); } } /* create association */ OFLOG_INFO(dcmpssndLogger, "Requesting Association"); cond = ASC_requestAssociation(net, params, &assoc); if (cond.bad()) { if (cond == DUL_ASSOCIATIONREJECTED) { T_ASC_RejectParameters rej; ASC_getRejectParameters(params, &rej); OFLOG_ERROR(dcmpssndLogger, "Association Rejected" << OFendl << ASC_printRejectParameters(temp_str, &rej)); if (messageClient) { // notify about rejected association OFOStringStream out; out << "DIMSE Association Rejected:" << OFendl << "\t" << ASC_printRejectParameters(temp_str, &rej) << OFendl; out << "\tcalled presentation address: " << assoc->params->DULparams.calledPresentationAddress << OFendl << "\tcalling AE title: " << assoc->params->DULparams.callingAPTitle << OFendl << "\tcalled AE title: " << assoc->params->DULparams.calledAPTitle << OFendl; out << ASC_dumpConnectionParameters(temp_str, assoc) << OFendl; out << OFStringStream_ends; OFSTRINGSTREAM_GETSTR(out, theString) if (useTLS) messageClient->notifyRequestedEncryptedDICOMConnection(DVPSIPCMessage::statusError, theString); else messageClient->notifyRequestedUnencryptedDICOMConnection(DVPSIPCMessage::statusError, theString); messageClient->notifyApplicationTerminates(DVPSIPCMessage::statusError); OFSTRINGSTREAM_FREESTR(theString) delete messageClient; } return 1; } else { OFLOG_ERROR(dcmpssndLogger, "Association Request Failed " << DimseCondition::dump(temp_str, cond)); if (messageClient) { // notify about rejected association OFOStringStream out; out << "DIMSE Association Request Failed:" << OFendl << "\tcalled presentation address: " << assoc->params->DULparams.calledPresentationAddress << OFendl << "\tcalling AE title: " << assoc->params->DULparams.callingAPTitle << OFendl << "\tcalled AE title: " << assoc->params->DULparams.calledAPTitle << OFendl << ASC_dumpConnectionParameters(temp_str, assoc) << OFendl << cond.text() << OFendl << OFStringStream_ends; OFSTRINGSTREAM_GETSTR(out, theString) if (useTLS) messageClient->notifyRequestedEncryptedDICOMConnection(DVPSIPCMessage::statusError, theString); else messageClient->notifyRequestedUnencryptedDICOMConnection(DVPSIPCMessage::statusError, theString); messageClient->notifyApplicationTerminates(DVPSIPCMessage::statusError); OFSTRINGSTREAM_FREESTR(theString) delete messageClient; } return 1; } } if (ASC_countAcceptedPresentationContexts(params) == 0) { OFLOG_ERROR(dcmpssndLogger, "No Acceptable Presentation Contexts"); cond = ASC_abortAssociation(assoc); if (cond.bad()) { OFLOG_ERROR(dcmpssndLogger, "Association Abort Failed\n" << DimseCondition::dump(temp_str, cond)); } if (messageClient) { // notify about rejected association OFOStringStream out; out << "DIMSE association accepted, but no acceptable presentation contexts - aborting" << OFendl << "\tcalled presentation address: " << assoc->params->DULparams.calledPresentationAddress << OFendl << "\tcalling AE title: " << assoc->params->DULparams.callingAPTitle << OFendl << "\tcalled AE title: " << assoc->params->DULparams.calledAPTitle << OFendl << ASC_dumpConnectionParameters(temp_str, assoc) << OFendl << OFStringStream_ends; OFSTRINGSTREAM_GETSTR(out, theString) if (useTLS) messageClient->notifyRequestedEncryptedDICOMConnection(DVPSIPCMessage::statusError, theString); else messageClient->notifyRequestedUnencryptedDICOMConnection(DVPSIPCMessage::statusError, theString); messageClient->notifyApplicationTerminates(DVPSIPCMessage::statusError); OFSTRINGSTREAM_FREESTR(theString) delete messageClient; } return 1; } OFLOG_INFO(dcmpssndLogger, "Association accepted (Max Send PDV: " << assoc->sendPDVLength << ")"); if (messageClient) { // notify about successfully negotiated association OFOStringStream out; out << "DIMSE Association Accepted:" << OFendl << "\tcalled presentation address: " << assoc->params->DULparams.calledPresentationAddress << OFendl << "\tcalling AE title: " << assoc->params->DULparams.callingAPTitle << OFendl << "\tcalled AE title: " << assoc->params->DULparams.calledAPTitle << OFendl << "\tmax send PDV: " << assoc->sendPDVLength << OFendl << "\tpresentation contexts: " << ASC_countAcceptedPresentationContexts(assoc->params) << OFendl; out << ASC_dumpConnectionParameters(temp_str, assoc) << OFendl; out << OFStringStream_ends; OFSTRINGSTREAM_GETSTR(out, theString) if (useTLS) messageClient->notifyRequestedEncryptedDICOMConnection(DVPSIPCMessage::statusOK, theString); else messageClient->notifyRequestedUnencryptedDICOMConnection(DVPSIPCMessage::statusOK, theString); OFSTRINGSTREAM_FREESTR(theString) } /* do the real work */ cond = sendStudy(dbhandle, assoc, opt_studyUID, opt_seriesUID, opt_instanceUID); /* tear down association */ if (cond.good()) { /* release association */ OFLOG_INFO(dcmpssndLogger, "Releasing Association"); cond = ASC_releaseAssociation(assoc); if (cond.bad()) { OFLOG_ERROR(dcmpssndLogger, "Association Release Failed\n" << DimseCondition::dump(temp_str, cond)); if (messageClient) { messageClient->notifyApplicationTerminates(DVPSIPCMessage::statusError); delete messageClient; } return 1; } if (messageClient) messageClient->notifyConnectionClosed(DVPSIPCMessage::statusOK); } else if (cond == DUL_PEERREQUESTEDRELEASE) { OFLOG_ERROR(dcmpssndLogger, "Protocol Error: peer requested release (Aborting)"); OFLOG_INFO(dcmpssndLogger, "Aborting Association"); cond = ASC_abortAssociation(assoc); if (cond.bad()) { OFLOG_ERROR(dcmpssndLogger, "Association Abort Failed" << DimseCondition::dump(temp_str, cond)); if (messageClient) { messageClient->notifyApplicationTerminates(DVPSIPCMessage::statusError); delete messageClient; } return 1; } if (messageClient) messageClient->notifyConnectionAborted(DVPSIPCMessage::statusError, "Protocol error: peer requested release, aborting association"); } else if (cond == DUL_PEERABORTEDASSOCIATION) { OFLOG_INFO(dcmpssndLogger, "Peer Aborted Association"); if (messageClient) messageClient->notifyConnectionAborted(DVPSIPCMessage::statusError, "Peer aborted association"); } else { OFLOG_ERROR(dcmpssndLogger, "SCU Failed" << DimseCondition::dump(temp_str, cond)); OFLOG_INFO(dcmpssndLogger, "Aborting Association"); cond = ASC_abortAssociation(assoc); if (cond.bad()) { OFLOG_ERROR(dcmpssndLogger, "Association Abort Failed" << DimseCondition::dump(temp_str, cond)); if (messageClient) { messageClient->notifyApplicationTerminates(DVPSIPCMessage::statusError); delete messageClient; } return 1; } if (messageClient) messageClient->notifyConnectionAborted(DVPSIPCMessage::statusError, "Storage SCU failed, aborting association"); } cond = ASC_destroyAssociation(&assoc); if (cond.bad()) { OFLOG_ERROR(dcmpssndLogger, DimseCondition::dump(temp_str, cond)); if (messageClient) { messageClient->notifyApplicationTerminates(DVPSIPCMessage::statusError); delete messageClient; } return 1; } cond = ASC_dropNetwork(&net); if (cond.bad()) { OFLOG_ERROR(dcmpssndLogger, DimseCondition::dump(temp_str, cond)); if (messageClient) { messageClient->notifyApplicationTerminates(DVPSIPCMessage::statusError); delete messageClient; } return 1; } // tell the IPC server that we're going to terminate. // We need to do this before we shutdown WinSock. if (messageClient) { messageClient->notifyApplicationTerminates(DVPSIPCMessage::statusOK); delete messageClient; } #ifdef HAVE_WINSOCK_H WSACleanup(); #endif #ifdef WITH_OPENSSL if (tLayer) { if (tLayer->canWriteRandomSeed()) { if (!tLayer->writeRandomSeed(tlsRandomSeedFile.c_str())) { OFLOG_WARN(dcmpssndLogger, "cannot write back random seed file '" << tlsRandomSeedFile << "', ignoring"); } } else { OFLOG_WARN(dcmpssndLogger, "cannot write back random seed, ignoring"); } } delete tLayer; #endif #ifdef DEBUG dcmDataDict.clear(); /* useful for debugging with dmalloc */ #endif return 0; } /* * CVS/RCS Log: * $Log: dcmpssnd.cc,v $ * Revision 1.48 2010-11-03 12:32:06 uli * Fixed some more warnings by gcc with by additional flags. * * Revision 1.47 2010-10-14 13:13:45 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.46 2009-12-02 16:15:10 joergr * Make sure that dcmSOPClassUIDToModality() never returns NULL when passed to * the log stream in order to avoid an application crash. * * Revision 1.45 2009-11-27 10:50:32 joergr * Replaced remaining tabs by spaces. * * Revision 1.44 2009-11-27 10:47:24 joergr * Fixed various issues with syntax usage (e.g. layout and formatting). * Sightly modifed log messages. * * Revision 1.43 2009-11-24 14:12:56 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.42 2009-09-30 10:42:37 uli * Make dcmpstat's include headers self-sufficient by including all * needed headers directly and stop using dctk.h * * Revision 1.41 2008-09-25 16:30:24 joergr * Added support for printing the expanded command line arguments. * Always output the resource identifier of the command line tool in debug mode. * * Revision 1.40 2006/08/15 16:57:01 meichel * Updated the code in module dcmpstat to correctly compile when * all standard C++ classes remain in namespace std. * * Revision 1.39 2006/07/27 14:41:35 joergr * Changed parameter "exclusive" of method addOption() from type OFBool into an * integer parameter "flags". Prepended prefix "PF_" to parseLine() flags. * Option "--help" is no longer an exclusive option by default. * * Revision 1.38 2005/12/08 15:46:11 meichel * Changed include path schema for all DCMTK header files * * Revision 1.37 2005/11/28 15:29:05 meichel * File dcdebug.h is not included by any other header file in the toolkit * anymore, to minimize the risk of name clashes of macro debug(). * * Revision 1.36 2005/11/23 16:10:32 meichel * Added support for AES ciphersuites in TLS module. All TLS-enabled * tools now support the "AES TLS Secure Transport Connection Profile". * * Revision 1.35 2005/11/16 14:58:23 meichel * Set association timeout in ASC_initializeNetwork to 30 seconds. This improves * the responsiveness of the tools if the peer blocks during assoc negotiation. * * Revision 1.34 2005/10/25 08:55:59 meichel * Updated list of UIDs and added support for new transfer syntaxes * and storage SOP classes. * * Revision 1.33 2005/04/04 10:11:53 meichel * Module dcmpstat now uses the dcmqrdb API instead of imagectn for maintaining * the index database * * Revision 1.32 2004/02/04 15:44:38 joergr * Removed acknowledgements with e-mail addresses from CVS log. * * Revision 1.31 2002/11/29 13:16:28 meichel * Introduced new command line option --timeout for controlling the * connection request timeout. * * Revision 1.30 2002/11/26 08:44:29 meichel * Replaced all includes for "zlib.h" with * to avoid inclusion of zlib.h in the makefile dependencies. * * Revision 1.29 2002/09/23 19:06:32 joergr * Fixed typo in pre-processor directive. * * Revision 1.28 2002/09/23 18:26:09 joergr * Added new command line option "--version" which prints the name and version * number of external libraries used (incl. preparation for future support of * 'config.guess' host identifiers). * * Revision 1.27 2002/06/14 10:20:53 meichel * Removed dependency from class DVInterface. Significantly reduces * size of binary. * * Revision 1.26 2002/05/02 14:10:05 joergr * Added support for standard and non-standard string streams (which one is * supported is detected automatically via the configure mechanism). * * Revision 1.25 2002/04/16 14:01:28 joergr * Added configurable support for C++ ANSI standard includes (e.g. streams). * * Revision 1.24 2002/01/08 10:31:47 joergr * Corrected spelling of function dcmGenerateUniqueIdentifier(). * * Revision 1.23 2001/10/12 13:46:49 meichel * Adapted dcmpstat to OFCondition based dcmnet module (supports strict mode). * * Revision 1.22 2001/09/28 13:48:43 joergr * Replaced "cerr" by "CERR". * * Revision 1.21 2001/06/07 14:34:09 joergr * Removed comment. * * Revision 1.19 2001/06/01 15:50:10 meichel * Updated copyright header * * Revision 1.18 2000/11/08 18:38:04 meichel * Updated dcmpstat IPC protocol for additional message parameters * * Revision 1.17 2000/10/10 12:23:45 meichel * Added extensions for TLS encrypted communication * * Revision 1.16 2000/05/31 13:02:25 meichel * Moved dcmpstat macros and constants into a common header file * * Revision 1.15 2000/04/14 16:34:38 meichel * Global VR generation flags are now derived from OFGlobal and, thus, * safe for use in multi-thread applications. * * Revision 1.14 2000/03/08 16:28:43 meichel * Updated copyright header. * * Revision 1.13 2000/03/06 18:21:47 joergr * Avoid empty statement in the body of if-statements (MSVC6 reports warnings). * * Revision 1.12 2000/03/03 14:13:28 meichel * Implemented library support for redirecting error messages into memory * instead of printing them to stdout/stderr for GUI applications. * * Revision 1.11 2000/02/29 12:13:44 meichel * Removed support for VS value representation. This was proposed in CP 101 * but never became part of the standard. * * Revision 1.10 2000/02/03 11:50:45 meichel * Moved UID related functions from dcmnet (diutil.h) to dcmdata (dcuid.h) * where they belong. Renamed access functions to dcmSOPClassUIDToModality * and dcmGuessModalityBytes. * * Revision 1.9 1999/11/24 10:21:56 meichel * Fixed locking problem in dcmpssnd and dcmpsrcv on Win9x platforms. * * Revision 1.8 1999/09/17 14:29:07 meichel * Moved static helper functions to new class DVPSHelper, removed some unused code. * * Revision 1.7 1999/09/06 13:29:48 meichel * Enhanced max receive PDU range to 4-128K. * * Revision 1.6 1999/04/30 16:36:56 meichel * Renamed all flock calls to dcmtk_flock to avoid name clash between flock() * emulation based on fcntl() and a constructor for struct flock. * * Revision 1.5 1999/04/28 15:45:09 meichel * Cleaned up module dcmpstat apps, adapted to new command line class * and added short documentation. * * Revision 1.4 1999/02/25 18:34:25 joergr * Added debug code (explicitly delete data dictionary). * * Revision 1.3 1999/02/08 12:52:17 meichel * Removed dummy parameter from DVInterface constructor. * * Revision 1.2 1999/01/25 13:05:47 meichel * Implemented DVInterface::startReceiver() * and several config file related methods. * * Revision 1.1 1999/01/20 19:26:17 meichel * Implemented DICOM network send application "dcmpssnd" which sends studies/ * series/images contained in the local database to a remote DICOM * communication peer. * * */ dcmtk-3.6.0/dcmpstat/apps/dcmpsprt.cc0000644000310500011400000012004611464535642017001 0ustar joergrdicom3/* * * Copyright (C) 1999-2010, 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 * * Authors: Marco Eichelberg * * Purpose * sample application that reads multiple images and (optionally) * presentation states and creates a print job consisting of * stored print and hardcopy grayscale images. * Non-grayscale transformations in the presentation state are ignored. * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-11-04 13:56:50 $ * CVS/RCS Revision: $Revision: 1.46 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #define INCLUDE_CCTYPE #include "dcmtk/ofstd/ofstdinc.h" #ifdef HAVE_GUSI_H #include #endif #include "dcmtk/ofstd/ofstream.h" #include "dcmtk/dcmpstat/dviface.h" #include "dcmtk/dcmpstat/dvpssp.h" #include "dcmtk/dcmimgle/dcmimage.h" #include "dcmtk/dcmdata/cmdlnarg.h" #include "dcmtk/ofstd/ofcmdln.h" #include "dcmtk/ofstd/ofconapp.h" #include "dcmtk/dcmdata/dcuid.h" /* for dcmtk version name */ #include "dcmtk/ofstd/oflist.h" #ifdef WITH_ZLIB #include /* for zlibVersion() */ #endif #define OFFIS_CONSOLE_APPLICATION "dcmpsprt" static OFLogger dcmpsprtLogger = OFLog::getLogger("dcmtk.apps." OFFIS_CONSOLE_APPLICATION); static char rcsid[] = "$dcmtk: " OFFIS_CONSOLE_APPLICATION " v" OFFIS_DCMTK_VERSION " " OFFIS_DCMTK_RELEASEDATE " $"; int addOverlay(const char *filename, unsigned long xpos, unsigned long ypos, Uint16 *pixel, unsigned long width, unsigned long height, unsigned int gray) { if ((filename != NULL) && (pixel != NULL)) { #ifdef HAVE_IOS_NOCREATE STD_NAMESPACE ifstream input(filename, STD_NAMESPACE ios::in | STD_NAMESPACE ios::nocreate); #else STD_NAMESPACE ifstream input(filename); #endif if (input) { char c; unsigned int xsize, ysize; if (input.get(c) && (c == 'P') && input.get(c) && (c == '1')) { /* still need to add code for skipping comments in PBM file */ input >> xsize; input >> ysize; if ((xpos + xsize <= width) && (ypos + ysize <= height)) { unsigned int value; Uint16 *p = pixel + (ypos * width) + xpos; for (unsigned long ys = 0; ys < ysize; ys++) { for (unsigned long xs = 0; xs < xsize; xs++) { while (input.get(c) && !isdigit(OFstatic_cast(unsigned char, c))); // skip non-numeric chars input.putback(c); input >> value; if (value) *p = gray; p++; } p += (width - xsize); } return 1; } else OFLOG_ERROR(dcmpsprtLogger, "invalid position for overlay PBM file '" << filename); } else OFLOG_ERROR(dcmpsprtLogger, "overlay PBM file '" << filename << "' has no magic number P1"); } else OFLOG_ERROR(dcmpsprtLogger, "can't open overlay PBM file '" << filename << "'"); } return 0; } #define SHORTCOL 2 #define LONGCOL 21 int main(int argc, char *argv[]) { const char * opt_printerID = NULL; /* printer ID */ const char * opt_cfgName = NULL; /* config read file name */ DVPSFilmOrientation opt_filmorientation = DVPSF_default; DVPSTrimMode opt_trim = DVPSH_default; DVPSDecimateCropBehaviour opt_decimate = DVPSI_default; OFCmdUnsignedInt opt_columns = 1; OFCmdUnsignedInt opt_rows = 1; OFCmdUnsignedInt opt_copies = 0; OFCmdUnsignedInt opt_ovl_graylevel = 4095; const char * opt_filmsize = NULL; const char * opt_magnification = NULL; const char * opt_smoothing = NULL; const char * opt_configuration = NULL; const char * opt_img_polarity = NULL; const char * opt_img_request_size = NULL; const char * opt_img_magnification = NULL; const char * opt_img_smoothing = NULL; const char * opt_img_configuration = NULL; const char * opt_resolution = NULL; const char * opt_border = NULL; const char * opt_emptyimage = NULL; const char * opt_maxdensity = NULL; const char * opt_mindensity = NULL; const char * opt_plutname = NULL; OFList opt_filenames; int opt_LUTshape = 0; // 0=use SCP default, 1=IDENTITY, 2=LIN OD. OFBool opt_inverse_plut = OFFalse; OFBool opt_spool = OFFalse; const char * opt_mediumtype = NULL; const char * opt_destination = NULL; const char * opt_sessionlabel = NULL; const char * opt_priority = NULL; const char * opt_ownerID = NULL; OFBool opt_annotation = OFFalse; OFBool opt_annotationDatetime = OFTrue; OFBool opt_annotationPrinter = OFTrue; OFBool opt_annotationIllumination = OFTrue; const char * opt_annotationString = NULL; OFCmdUnsignedInt opt_illumination = (OFCmdUnsignedInt)-1; OFCmdUnsignedInt opt_reflection = (OFCmdUnsignedInt)-1; OFConsoleApplication app(OFFIS_CONSOLE_APPLICATION , "Read DICOM images and presentation states and render print job", rcsid); OFCommandLine cmd; cmd.setOptionColumns(LONGCOL, SHORTCOL + 2); cmd.setParamColumn(LONGCOL + SHORTCOL + 4); cmd.addParam("dcmfile-in", "DICOM image file(s) to be printed", OFCmdParam::PM_MultiMandatory); cmd.addGroup("general options:"); cmd.addOption("--help", "-h", "print this help text and exit", OFCommandLine::AF_Exclusive); cmd.addOption("--version", "print version information and exit", OFCommandLine::AF_Exclusive); OFLog::addOptions(cmd); cmd.addGroup("processing options:"); cmd.addOption("--pstate", "+p", 1, "[p]state file: string", "render the following image with pres. state p\n(this option can be specified multiple times)", OFCommandLine::AF_NoWarning); cmd.addOption("--config", "-c", 1, "[f]ilename: string", "process using settings from configuration file f"); cmd.addOption("--printer", "-p", 1, "[n]ame: string (default: 1st printer in cfg file)", "select printer with identifier n from cfg file"); cmd.addGroup("spooling options:"); cmd.addOption("--spool", "-s", "spool print job to DICOM printer"); cmd.addOption("--nospool", "do not spool print job to DICOM printer (default)"); cmd.addGroup("film orientation options:"); cmd.addOption("--portrait", "set portrait orientation"); cmd.addOption("--landscape", "set landscape orientation"); cmd.addOption("--default-orientation", "use printer default (default)"); cmd.addGroup("trim (border) options:"); cmd.addOption("--trim", "set trim on"); cmd.addOption("--no-trim", "set trim off"); cmd.addOption("--default-trim", "use printer default (default)"); cmd.addGroup("requested decimate/crop behaviour options:"); cmd.addOption("--request-decimate", "request decimate"); cmd.addOption("--request-crop", "request crop"); cmd.addOption("--request-fail", "request failure"); cmd.addOption("--default-request", "use printer default (default)"); cmd.addGroup("print presentation LUT options:"); cmd.addOption("--default-plut", "do not create presentation LUT (default)"); cmd.addOption("--identity", "set IDENTITY presentation LUT shape"); cmd.addOption("--lin-od", "set LIN OD presentation LUT shape"); cmd.addOption("--plut", 1, "[l]ut identifier: string", "add LUT [l] to print job"); cmd.addOption("--inverse-plut", "render the inverse presentation LUT into the\nbitmap of the hardcopy grayscale image"); cmd.addOption("--illumination", 1, "[v]alue: integer (0..65535)", "set illumination to v (in cd/m^2)"); cmd.addOption("--reflection", 1, "[v]alue: integer (0..65535)", "set reflected ambient light to v (in cd/m^2)"); cmd.addGroup("basic film session options (only with --spool):"); cmd.addOption("--copies", 1, "[v]alue: integer (1..100, default: 1)", "set number of copies to v"); cmd.addOption("--medium-type", 1, "[v]alue: string", "set medium type to v"); cmd.addOption("--destination", 1, "[v]alue: string", "set film destination to v"); cmd.addOption("--label", 1, "[v]alue: string", "set film session label to v"); cmd.addOption("--priority", 1, "[v]alue: string", "set print priority to v"); cmd.addOption("--owner", 1, "[v]alue: string", "set film session owner ID to v"); cmd.addGroup("annotation options:"); cmd.addOption("--no-annotation", "do not create annotation (default)"); cmd.addOption("--annotation", "-a", 1, "[t]ext: string", "create annotation with text t"); cmd.addOption("--print-date", "+pd", "prepend date/time to annotation (default)"); cmd.addOption("--print-no-date", "-pd", "do not prepend date/time to annotation"); cmd.addOption("--print-name", "+pn", "prepend printer name to annotation (default)"); cmd.addOption("--print-no-name", "-pn", "do not prepend printer name to annotation"); cmd.addOption("--print-lighting", "+pl", "prepend illumination to annotation (default)"); cmd.addOption("--print-no-lighting", "-pl", "do not prepend illumination to annotation"); cmd.addGroup("overlay options:"); cmd.addOption("--overlay", "+O" , 3, "[f]ilename: string, [x] [y]: integer", "load overlay data from PBM file f and\ndisplay at position (x,y)"); cmd.addOption("--ovl-graylevel", "+Og", 1, "[v]alue: integer (0..4095)", "use overlay gray level v (default: 4095 = white)"); cmd.addGroup("other print options:"); cmd.addOption("--layout", "-l", 2, "[c]olumns [r]ows: integer (default: 1 1)", "use 'STANDARD\\c,r' image display format"); cmd.addOption("--filmsize", 1, "[v]alue: string", "set film size ID to v"); cmd.addOption("--magnification", 1, "[v]alue: string", "set magnification type to v"); cmd.addOption("--smoothing", 1, "[v]alue: string", "set smoothing type to v"); cmd.addOption("--configinfo", 1, "[v]alue: string", "set configuration information to v"); cmd.addOption("--resolution", 1, "[v]alue: string", "set requested resolution ID to v"); cmd.addOption("--border", 1, "[v]alue: string", "set border density to v"); cmd.addOption("--empty-image", 1, "[v]alue: string", "set empty image density to v"); cmd.addOption("--max-density", 1, "[v]alue: string", "set max density to v"); cmd.addOption("--min-density", 1, "[v]alue: string", "set min density to v"); cmd.addOption("--img-polarity", 1, "[v]alue: string", "set image box polarity to v (NORMAL or REVERSE)"); cmd.addOption("--img-request-size", 1, "[v]alue: string", "set requested image size to v (width in mm)"); cmd.addOption("--img-magnification", 1, "[v]alue: string", "set image box magnification type to v"); cmd.addOption("--img-smoothing", 1, "[v]alue: string", "set image box smoothing type to v"); cmd.addOption("--img-configinfo", 1, "[v]alue: string", "set image box configuration information to v"); /* evaluate command line */ prepareCmdLineArgs(argc, argv, OFFIS_CONSOLE_APPLICATION); if (app.parseCommandLine(cmd, argc, argv, OFCommandLine::PF_ExpandWildcards)) { /* check exclusive options first */ if (cmd.hasExclusiveOption()) { if (cmd.findOption("--version")) { app.printHeader(OFTrue /*print host identifier*/); COUT << OFendl << "External libraries used:"; #ifdef WITH_ZLIB COUT << OFendl << "- ZLIB, Version " << zlibVersion() << OFendl; #else COUT << " none" << OFendl; #endif return 0; } } /* options */ OFLog::configureFromCommandLine(cmd, app); cmd.beginOptionBlock(); if (cmd.findOption("--portrait")) opt_filmorientation = DVPSF_portrait; if (cmd.findOption("--landscape")) opt_filmorientation = DVPSF_landscape; if (cmd.findOption("--default-orientation")) opt_filmorientation = DVPSF_default; cmd.endOptionBlock(); cmd.beginOptionBlock(); if (cmd.findOption("--trim")) opt_trim = DVPSH_trim_on; if (cmd.findOption("--no-trim")) opt_trim = DVPSH_trim_off; if (cmd.findOption("--default-trim")) opt_trim = DVPSH_default; cmd.endOptionBlock(); cmd.beginOptionBlock(); if (cmd.findOption("--request-decimate")) opt_decimate = DVPSI_decimate; if (cmd.findOption("--request-crop")) opt_decimate = DVPSI_crop; if (cmd.findOption("--request-fail")) opt_decimate = DVPSI_fail; if (cmd.findOption("--default-request")) opt_decimate = DVPSI_default; cmd.endOptionBlock(); cmd.beginOptionBlock(); if (cmd.findOption("--default-plut")) opt_LUTshape = 0; if (cmd.findOption("--identity")) opt_LUTshape = 1; if (cmd.findOption("--lin-od")) opt_LUTshape = 2; if (cmd.findOption("--plut")) app.checkValue(cmd.getValue(opt_plutname)); cmd.endOptionBlock(); if (cmd.findOption("--inverse-plut")) opt_inverse_plut = OFTrue; cmd.beginOptionBlock(); if (cmd.findOption("--spool")) opt_spool = OFTrue; if (cmd.findOption("--nospool")) opt_spool = OFFalse; cmd.endOptionBlock(); cmd.beginOptionBlock(); if (cmd.findOption("--no-annotation")) opt_annotation = OFFalse; if (cmd.findOption("--annotation")) { opt_annotation = OFTrue; app.checkValue(cmd.getValue(opt_annotationString)); } cmd.endOptionBlock(); cmd.findOption("--overlay", 0, OFCommandLine::FOM_First); /* check at least once to avoid warnings */ if (cmd.findOption("--ovl-graylevel")) app.checkValue(cmd.getValueAndCheckMinMax(opt_ovl_graylevel, 0, 4095)); cmd.beginOptionBlock(); if (cmd.findOption("--print-date")) opt_annotationDatetime = OFTrue; if (cmd.findOption("--print-no-date")) opt_annotationDatetime = OFFalse; cmd.endOptionBlock(); cmd.beginOptionBlock(); if (cmd.findOption("--print-name")) opt_annotationPrinter = OFTrue; if (cmd.findOption("--print-no-name")) opt_annotationPrinter = OFFalse; cmd.endOptionBlock(); cmd.beginOptionBlock(); if (cmd.findOption("--print-lighting")) opt_annotationIllumination = OFTrue; if (cmd.findOption("--print-no-lighting")) opt_annotationIllumination = OFFalse; cmd.endOptionBlock(); if (cmd.findOption("--filmsize")) app.checkValue(cmd.getValue(opt_filmsize)); if (cmd.findOption("--magnification")) app.checkValue(cmd.getValue(opt_magnification)); if (cmd.findOption("--smoothing")) app.checkValue(cmd.getValue(opt_smoothing)); if (cmd.findOption("--configinfo")) app.checkValue(cmd.getValue(opt_configuration)); if (cmd.findOption("--resolution")) app.checkValue(cmd.getValue(opt_resolution)); if (cmd.findOption("--border")) app.checkValue(cmd.getValue(opt_border)); if (cmd.findOption("--empty-image")) app.checkValue(cmd.getValue(opt_emptyimage)); if (cmd.findOption("--max-density")) app.checkValue(cmd.getValue(opt_maxdensity)); if (cmd.findOption("--min-density")) app.checkValue(cmd.getValue(opt_mindensity)); if (cmd.findOption("--config")) app.checkValue(cmd.getValue(opt_cfgName)); if (cmd.findOption("--printer")) app.checkValue(cmd.getValue(opt_printerID)); if (cmd.findOption("--img-polarity")) app.checkValue(cmd.getValue(opt_img_polarity)); if (cmd.findOption("--img-request-size")) app.checkValue(cmd.getValue(opt_img_request_size)); if (cmd.findOption("--img-magnification")) app.checkValue(cmd.getValue(opt_img_magnification)); if (cmd.findOption("--img-smoothing")) app.checkValue(cmd.getValue(opt_img_smoothing)); if (cmd.findOption("--img-configinfo")) app.checkValue(cmd.getValue(opt_img_configuration)); /* film session options */ if (cmd.findOption("--medium-type")) { app.checkConflict("--medium-type", "--nospool", (! opt_spool)); app.checkValue(cmd.getValue(opt_mediumtype)); } if (cmd.findOption("--illumination")) { app.checkValue(cmd.getValueAndCheckMinMax(opt_illumination, 0, 65535)); } if (cmd.findOption("--reflection")) { app.checkValue(cmd.getValueAndCheckMinMax(opt_reflection, 0, 65535)); } if (cmd.findOption("--destination")) { app.checkConflict("--destination", "--nospool", (! opt_spool)); app.checkValue(cmd.getValue(opt_destination)); } if (cmd.findOption("--label")) { app.checkConflict("--label", "--nospool", (! opt_spool)); app.checkValue(cmd.getValue(opt_sessionlabel)); } if (cmd.findOption("--priority")) { app.checkConflict("--priority", "--nospool", (! opt_spool)); app.checkValue(cmd.getValue(opt_priority)); } if (cmd.findOption("--owner")) { app.checkConflict("--owner", "--nospool", (! opt_spool)); app.checkValue(cmd.getValue(opt_ownerID)); } if (cmd.findOption("--copies")) { app.checkConflict("--copies", "--nospool", (! opt_spool)); app.checkValue(cmd.getValueAndCheckMinMax(opt_copies, 1, 100)); } if (cmd.findOption("--layout")) { app.checkValue(cmd.getValueAndCheckMin(opt_columns, 1)); app.checkValue(cmd.getValueAndCheckMin(opt_rows, 1)); } const char *imageFile = NULL; const char *pstateFile = NULL; int paramCount = cmd.getParamCount(); for (int param = 1; param <= paramCount; param++) { cmd.getParam(param, imageFile); pstateFile = NULL; if (cmd.findOption("--pstate", -param)) app.checkValue(cmd.getValue(pstateFile)); opt_filenames.push_back(imageFile); opt_filenames.push_back(pstateFile); } } /* print resource identifier */ OFLOG_DEBUG(dcmpsprtLogger, rcsid << OFendl); if (opt_cfgName) { FILE *cfgfile = fopen(opt_cfgName, "rb"); if (cfgfile) fclose(cfgfile); else { OFLOG_FATAL(dcmpsprtLogger, "can't open configuration file '" << opt_cfgName << "'"); return 10; } } DVInterface dvi(opt_cfgName); if (opt_printerID && (EC_Normal != dvi.setCurrentPrinter(opt_printerID))) OFLOG_WARN(dcmpsprtLogger, "unable to select printer '" << opt_printerID << "', ignoring."); /* dump printer characteristics if requested */ const char *currentPrinter = dvi.getCurrentPrinter(); if ((opt_img_request_size) && (!dvi.getTargetPrinterSupportsRequestedImageSize(opt_printerID))) OFLOG_WARN(dcmpsprtLogger, "printer does not support requested image size"); if (EC_Normal != dvi.getPrintHandler().setImageDisplayFormat(opt_columns, opt_rows)) OFLOG_WARN(dcmpsprtLogger, "cannot set image display format to columns=" << opt_columns << ", rows=" << opt_rows << ", ignoring."); if ((opt_filmsize)&&(EC_Normal != dvi.getPrintHandler().setFilmSizeID(opt_filmsize))) OFLOG_WARN(dcmpsprtLogger, "cannot set film size ID to '" << opt_filmsize << "', ignoring."); if ((opt_magnification)&&(EC_Normal != dvi.getPrintHandler().setMagnificationType(opt_magnification))) OFLOG_WARN(dcmpsprtLogger, "cannot set magnification type to '" << opt_magnification << "', ignoring."); if ((opt_smoothing)&&(EC_Normal != dvi.getPrintHandler().setSmoothingType(opt_smoothing))) OFLOG_WARN(dcmpsprtLogger, "cannot set smoothing type to '" << opt_smoothing << "', ignoring."); if ((opt_configuration)&&(EC_Normal != dvi.getPrintHandler().setConfigurationInformation(opt_configuration))) OFLOG_WARN(dcmpsprtLogger, "cannot set configuration information to '" << opt_configuration << "', ignoring."); if ((opt_resolution)&&(EC_Normal != dvi.getPrintHandler().setResolutionID(opt_resolution))) OFLOG_WARN(dcmpsprtLogger, "cannot set requested resolution ID to '" << opt_resolution << "', ignoring."); if ((opt_border)&&(EC_Normal != dvi.getPrintHandler().setBorderDensity(opt_border))) OFLOG_WARN(dcmpsprtLogger, "cannot set border density to '" << opt_border << "', ignoring."); if ((opt_emptyimage)&&(EC_Normal != dvi.getPrintHandler().setEmtpyImageDensity(opt_emptyimage))) OFLOG_WARN(dcmpsprtLogger, "cannot set empty image density to '" << opt_emptyimage << "', ignoring."); if ((opt_maxdensity)&&(EC_Normal != dvi.getPrintHandler().setMaxDensity(opt_maxdensity))) OFLOG_WARN(dcmpsprtLogger, "cannot set max density to '" << opt_maxdensity << "', ignoring."); if ((opt_mindensity)&&(EC_Normal != dvi.getPrintHandler().setMinDensity(opt_mindensity))) OFLOG_WARN(dcmpsprtLogger, "cannot set min density to '" << opt_mindensity << "', ignoring."); if (EC_Normal != dvi.getPrintHandler().setFilmOrientation(opt_filmorientation)) OFLOG_WARN(dcmpsprtLogger, "cannot set film orientation, ignoring."); if (EC_Normal != dvi.getPrintHandler().setTrim(opt_trim)) OFLOG_WARN(dcmpsprtLogger, "cannot set trim, ignoring."); if (EC_Normal != dvi.getPrintHandler().setRequestedDecimateCropBehaviour(opt_decimate)) OFLOG_WARN(dcmpsprtLogger, "cannot set requested decimate/crop behaviour, ignoring."); if ((opt_illumination != (OFCmdUnsignedInt)-1)&&(EC_Normal != dvi.getPrintHandler().setPrintIllumination((Uint16)opt_illumination))) OFLOG_WARN(dcmpsprtLogger, "cannot set illumination to '" << opt_illumination << "', ignoring."); if ((opt_reflection != (OFCmdUnsignedInt)-1)&&(EC_Normal != dvi.getPrintHandler().setPrintReflectedAmbientLight((Uint16)opt_reflection))) OFLOG_WARN(dcmpsprtLogger, "cannot set reflected ambient light to '" << opt_reflection << "', ignoring."); if ((opt_copies > 0)&&(EC_Normal != dvi.setPrinterNumberOfCopies(opt_copies))) OFLOG_WARN(dcmpsprtLogger, "cannot set film session number of copies to '" << opt_copies << "', ignoring."); if ((opt_mediumtype)&&(EC_Normal != dvi.setPrinterMediumType(opt_mediumtype))) OFLOG_WARN(dcmpsprtLogger, "cannot set film session medium type to '" << opt_mediumtype << "', ignoring."); if ((opt_destination)&&(EC_Normal != dvi.setPrinterFilmDestination(opt_destination))) OFLOG_WARN(dcmpsprtLogger, "cannot set film destination to '" << opt_destination << "', ignoring."); if ((opt_sessionlabel)&&(EC_Normal != dvi.setPrinterFilmSessionLabel(opt_sessionlabel))) OFLOG_WARN(dcmpsprtLogger, "cannot set film session label to '" << opt_sessionlabel << "', ignoring."); if ((opt_priority)&&(EC_Normal != dvi.setPrinterPriority(opt_priority))) OFLOG_WARN(dcmpsprtLogger, "cannot set film session print priority to '" << opt_priority << "', ignoring."); if ((opt_ownerID)&&(EC_Normal != dvi.setPrinterOwnerID(opt_ownerID))) OFLOG_WARN(dcmpsprtLogger, "cannot set film session owner ID to '" << opt_ownerID << "', ignoring."); if ((opt_spool)&&(EC_Normal != dvi.startPrintSpooler())) OFLOG_WARN(dcmpsprtLogger, "unable to start print spooler, ignoring."); OFListIterator(const char *) first = opt_filenames.begin(); OFListIterator(const char *) last = opt_filenames.end(); const char *currentImage = NULL; const char *currentPState = NULL; OFCondition status = EC_Normal; void *pixelData = NULL; unsigned long width = 0; unsigned long height = 0; unsigned long bitmapSize = 0; double pixelAspectRatio; while ((EC_Normal == status) && (first != last)) { currentImage = *first; ++first; if (first != last) { currentPState = *first; ++first; if (currentPState) { OFLOG_INFO(dcmpsprtLogger, "loading image file '" << currentImage << "' with presentation state '" << currentPState << "'"); status = dvi.loadPState(currentPState, currentImage); if (EC_Normal != status) { OFLOG_FATAL(dcmpsprtLogger, "loading image file '" << currentImage << "' with presentation state '" << currentPState << "' failed."); return 10; } } else { OFLOG_INFO(dcmpsprtLogger, "loading image file '" << currentImage << "'"); status = dvi.loadImage(currentImage); if (EC_Normal != status) { OFLOG_FATAL(dcmpsprtLogger, "loading image file '" << currentImage << "' failed."); return 10; } } if (opt_plutname) { if (EC_Normal != dvi.selectDisplayPresentationLUT(opt_plutname)) OFLOG_WARN(dcmpsprtLogger, "cannot set requested presentation LUT '" << opt_plutname << "', ignoring."); } else { // in the case of a Presentation LUT Shape, we set the shape inside // the GSPS object to default (corresponding to IDENTITY for MONOCHROME2 // and INVERSE for MONOCHROME1). This will leave our image data unaltered. // The LIN OD shape is only activated in the print handler, not the GSPS. if ((opt_LUTshape == 1) || (opt_LUTshape == 2)) { if (dvi.getCurrentPState().setDefaultPresentationLUTShape().bad()) OFLOG_WARN(dcmpsprtLogger, "cannot set presentation LUT shape, ignoring."); if (opt_LUTshape == 2) { if (dvi.getPrintHandler().setPresentationLUTShape(DVPSP_lin_od).bad()) OFLOG_WARN(dcmpsprtLogger, "cannot set LIN OD presentation LUT shape, ignoring."); } } } // save grayscale hardcopy image. bitmapSize = dvi.getCurrentPState().getPrintBitmapSize(); pixelData = new char[bitmapSize]; if (pixelData) { if (EC_Normal != dvi.getCurrentPState().getPrintBitmapWidthHeight(width, height)) { OFLOG_FATAL(dcmpsprtLogger, "can't determine bitmap size"); return 10; } if (EC_Normal != dvi.getCurrentPState().getPrintBitmap(pixelData, bitmapSize, opt_inverse_plut)) { OFLOG_FATAL(dcmpsprtLogger, "can't create print bitmap"); return 10; } pixelAspectRatio = dvi.getCurrentPState().getPrintBitmapPixelAspectRatio(); if (cmd.findOption("--overlay", 0, OFCommandLine::FOM_First)) { do { const char *fn = NULL; OFCmdUnsignedInt x, y; app.checkValue(cmd.getValue(fn)); app.checkValue(cmd.getValue(x)); app.checkValue(cmd.getValue(y)); if (fn != NULL) addOverlay(fn, x, y, OFstatic_cast(Uint16 *, pixelData), width, height, OFstatic_cast(unsigned int, opt_ovl_graylevel)); } while (cmd.findOption("--overlay", 0, OFCommandLine::FOM_Next)); } OFLOG_INFO(dcmpsprtLogger, "writing DICOM grayscale hardcopy image to database."); if (EC_Normal != dvi.saveHardcopyGrayscaleImage(pixelData, width, height, pixelAspectRatio)) { OFLOG_FATAL(dcmpsprtLogger, "error during creation of DICOM grayscale hardcopy image file"); return 10; } delete[] OFstatic_cast(char *, pixelData); } else { OFLOG_FATAL(dcmpsprtLogger, "out of memory error: cannot allocate print bitmap"); return 10; } } else { OFLOG_FATAL(dcmpsprtLogger, "internal error - odd number of filenames"); return 10; } } // set annotations if (status == EC_Normal) { if (opt_annotation) { if (dvi.getTargetPrinterSupportsAnnotation(currentPrinter)) { dvi.setActiveAnnotation(OFTrue); dvi.setPrependDateTime(opt_annotationDatetime); dvi.setPrependPrinterName(opt_annotationPrinter); dvi.setPrependLighting(opt_annotationIllumination); dvi.setAnnotationText(opt_annotationString); } else { OFLOG_WARN(dcmpsprtLogger, "printer '" << currentPrinter << "' does not support annotations, ignoring."); dvi.setActiveAnnotation(OFFalse); } } else { dvi.setActiveAnnotation(OFFalse); } } if (status == EC_Normal) { size_t numImages = dvi.getPrintHandler().getNumberOfImages(); for (size_t i=0; i 0)&&(! opt_spool)) { // no need to do this manually if we are spooling - spoolPrintJob() will do this anyway. OFLOG_WARN(dcmpsprtLogger, "writing DICOM stored print object to database."); if (EC_Normal != dvi.saveStoredPrint(dvi.getTargetPrinterSupportsRequestedImageSize(opt_printerID))) { OFLOG_ERROR(dcmpsprtLogger, "error during creation of DICOM stored print object"); } } } if ((status == EC_Normal) && opt_spool) { if (currentPrinter) { OFLOG_INFO(dcmpsprtLogger, "spooling print job to printer '" << currentPrinter << "'"); if (EC_Normal != dvi.spoolPrintJob()) OFLOG_WARN(dcmpsprtLogger, "unable to spool print job to printer '" << currentPrinter << "', ignoring."); } else { OFLOG_WARN(dcmpsprtLogger, "no printer (undefined in config file?), cannot spool print job."); } } if ((opt_spool)&&(EC_Normal != dvi.terminatePrintSpooler())) OFLOG_WARN(dcmpsprtLogger, "unable to stop print spooler, ignoring."); #ifdef DEBUG dcmDataDict.clear(); /* useful for debugging with dmalloc */ #endif return (status != EC_Normal); } /* * CVS/RCS Log: * $Log: dcmpsprt.cc,v $ * Revision 1.46 2010-11-04 13:56:50 joergr * Changed mode of parameter dcmfile-in from multi-optional to multi-mandatory. * Use type cast macros (e.g. OFstatic_cast) where appropriate. * * Revision 1.45 2010-10-20 07:41:36 uli * Made sure isalpha() & friends are only called with valid arguments. * * Revision 1.44 2010-10-14 13:13:45 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.43 2009-11-24 14:12:56 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.42 2009-10-28 09:53:41 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.41 2009-06-04 09:55:51 joergr * Added note on --pstate that this option can be specified multiple times. * Added new flag that can be used to avoid wrong warning messages (in debug * mode) that an option has possibly never been checked. * * Revision 1.40 2009-04-21 14:10:54 joergr * Fixed minor inconsistencies in manpage / syntax usage. * * Revision 1.39 2008-09-25 16:30:24 joergr * Added support for printing the expanded command line arguments. * Always output the resource identifier of the command line tool in debug mode. * * Revision 1.38 2006/08/15 16:57:01 meichel * Updated the code in module dcmpstat to correctly compile when * all standard C++ classes remain in namespace std. * * Revision 1.37 2006/07/27 14:40:06 joergr * Changed parameter "exclusive" of method addOption() from type OFBool into an * integer parameter "flags". Prepended prefix "PF_" to parseLine() flags. * Option "--help" is no longer an exclusive option by default. * Made naming conventions for command line parameters more consistent, e.g. * used "dcmfile-in", "dcmfile-out" and "bitmap-out". * * Revision 1.36 2005/12/08 15:46:09 meichel * Changed include path schema for all DCMTK header files * * Revision 1.35 2005/11/28 15:29:05 meichel * File dcdebug.h is not included by any other header file in the toolkit * anymore, to minimize the risk of name clashes of macro debug(). * * Revision 1.34 2004/02/04 15:44:38 joergr * Removed acknowledgements with e-mail addresses from CVS log. * * Revision 1.33 2003/12/01 16:54:44 meichel * Fixed handling of LIN OD LUT Shape * * Revision 1.32 2002/11/27 15:47:54 meichel * Adapted module dcmpstat to use of new header file ofstdinc.h * * Revision 1.31 2002/11/26 08:44:28 meichel * Replaced all includes for "zlib.h" with * to avoid inclusion of zlib.h in the makefile dependencies. * * Revision 1.30 2002/09/23 18:26:08 joergr * Added new command line option "--version" which prints the name and version * number of external libraries used (incl. preparation for future support of * 'config.guess' host identifiers). * * Revision 1.29 2002/04/16 14:01:27 joergr * Added configurable support for C++ ANSI standard includes (e.g. streams). * * Revision 1.28 2001/11/09 16:06:05 joergr * Renamed some of the getValue/getParam methods to avoid ambiguities reported * by certain compilers. * * Revision 1.27 2001/09/28 13:47:38 joergr * Added check whether ios::nocreate exists. * * Revision 1.26 2001/09/26 15:36:03 meichel * Adapted dcmpstat to class OFCondition * * Revision 1.25 2001/06/07 14:34:09 joergr * Removed comment. * * Revision 1.23 2001/06/01 15:50:09 meichel * Updated copyright header * * Revision 1.22 2000/06/19 16:29:05 meichel * Added options for session printing and LIN OD to print tools, fixed * pixel aspect ratio related bug. * * Revision 1.21 2000/06/14 14:24:39 joergr * Added new command line option allowing to add a PBM file as an overlay to * the hardcopy grayscale image (very preliminary support, only "P1" files * without comments). * * Revision 1.20 2000/06/14 11:30:15 joergr * Added methods to access the attributes Polarity and Requested Image Size. * * Revision 1.19 2000/06/09 10:19:56 joergr * Added support for rendering inverse presentation LUT into print bitmaps. * * Revision 1.18 2000/05/30 14:01:59 joergr * Renamed GrayscaleHardcopy to HardcopyGrayscale (which is the correct term * according to the DICOM standard). * * Revision 1.17 2000/05/03 14:27:27 meichel * Updated dcmpstat apps for changes in dcmimgle. * * Revision 1.16 2000/03/08 16:28:42 meichel * Updated copyright header. * * Revision 1.15 2000/03/07 16:18:10 joergr * Removed type specifier 'const' to make Sun CC 2.0.1 happy. * * Revision 1.14 2000/03/06 18:21:46 joergr * Avoid empty statement in the body of if-statements (MSVC6 reports warnings). * * Revision 1.13 2000/03/03 14:13:27 meichel * Implemented library support for redirecting error messages into memory * instead of printing them to stdout/stderr for GUI applications. * * Revision 1.12 2000/02/01 11:54:36 meichel * Avoiding to include as extern "C" on Borland C++ Builder 4, * workaround for bug in compiler header files. * * Revision 1.11 1999/10/28 08:18:32 meichel * Added options for setting Max Density and Min Density from command line * * Revision 1.10 1999/10/19 14:45:27 meichel * added support for the Basic Annotation Box SOP Class * as well as access methods for Max Density and Min Density. * * Revision 1.9 1999/10/07 17:21:42 meichel * Reworked management of Presentation LUTs in order to create tighter * coupling between Softcopy and Print. * * Revision 1.8 1999/09/24 15:24:25 meichel * Added support for CP 173 (Presentation LUT clarifications) * * Revision 1.7 1999/09/23 17:37:09 meichel * Added support for Basic Film Session options to dcmpstat print code. * * Revision 1.6 1999/09/15 17:42:56 meichel * Implemented print job dispatcher code for dcmpstat, adapted dcmprtsv * and dcmpsprt applications. * * Revision 1.5 1999/09/14 18:12:29 meichel * Removed unneeded debug output from dcmpsprt * * Revision 1.4 1999/09/13 15:18:45 meichel * Adapted dcmpsprt to print API enhancements * * Revision 1.3 1999/09/08 16:49:22 meichel * Added print API method declarations * * Revision 1.2 1999/09/01 16:14:11 meichel * Completed printer characteristics dump routine * * Revision 1.1 1999/08/31 16:54:40 meichel * Added new sample application that allows to create simple print jobs. * * */ dcmtk-3.6.0/dcmpstat/apps/dcmp2pgm.cc0000644000310500011400000006730611455601010016646 0ustar joergrdicom3/* * * Copyright (C) 1998-2010, 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 * * Authors: Joerg Riesmeier, Marco Eichelberg * * Purpose * sample application that reads a DICOM image and (optionally) * a presentation state and creates a PGM bitmap using the settings * of the presentation state. Non-grayscale transformations are * ignored. If no presentation state is loaded, a default is created. * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:13:44 $ * CVS/RCS Revision: $Revision: 1.43 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #ifdef HAVE_GUSI_H #include #endif #include "dcmtk/ofstd/ofstream.h" #include "dcmtk/dcmpstat/dviface.h" #include "dcmtk/dcmpstat/dvpstx.h" /* for DVPSTextObject */ #include "dcmtk/dcmpstat/dvpsgr.h" /* for DVPSGraphicObject */ #include "dcmtk/dcmpstat/dvpscu.h" /* for DVPSCurve */ #include "dcmtk/dcmimgle/dcmimage.h" #include "dcmtk/dcmdata/cmdlnarg.h" #include "dcmtk/ofstd/ofcmdln.h" #include "dcmtk/ofstd/ofconapp.h" #include "dcmtk/dcmdata/dcuid.h" /* for dcmtk version name */ #ifdef WITH_ZLIB #include /* for zlibVersion() */ #endif #define OFFIS_CONSOLE_APPLICATION "dcmp2pgm" static OFLogger dcmp2pgmLogger = OFLog::getLogger("dcmtk.apps." OFFIS_CONSOLE_APPLICATION); static char rcsid[] = "$dcmtk: " OFFIS_CONSOLE_APPLICATION " v" OFFIS_DCMTK_VERSION " " OFFIS_DCMTK_RELEASEDATE " $"; void dumpPresentationState(DVPresentationState &ps) { size_t i, j, max; const char *c; OFOStringStream oss; oss << "DUMPING PRESENTATION STATE" << OFendl << "--------------------------" << OFendl << OFendl; c = ps.getPresentationLabel(); oss << "Presentation Label: "; if (c) oss << c << OFendl; else oss << "none" << OFendl; c = ps.getPresentationDescription(); oss << "Presentation Description: "; if (c) oss << c << OFendl; else oss << "none" << OFendl; c = ps.getPresentationCreatorsName(); oss << "Presentation Creator's Name: "; if (c) oss << c << OFendl; else oss << "none" << OFendl; oss << "VOI transformation: "; if (ps.haveActiveVOIWindow()) { double width=0.0, center=0.0; ps.getCurrentWindowWidth(width); ps.getCurrentWindowCenter(center); oss << "window center=" << center << " width=" << width << " description=\""; c = ps.getCurrentVOIDescription(); if (c) oss << c << "\"" << OFendl; else oss << "(none)\"" << OFendl; } else if (ps.haveActiveVOILUT()) { oss << "lut description=\""; c = ps.getCurrentVOIDescription(); if (c) oss << c << "\"" << OFendl; else oss << "(none)\"" << OFendl; } else oss << "none" << OFendl; oss << "Rotation: "; switch (ps.getRotation()) { case DVPSR_0_deg: oss << "none"; break; case DVPSR_90_deg: oss << "90 degrees"; break; case DVPSR_180_deg: oss << "180 degrees"; break; case DVPSR_270_deg: oss << "270 degrees"; break; } oss << OFendl; oss << "Flip: "; if (ps.getFlip()) oss << "yes" << OFendl; else oss << "no" << OFendl; Sint32 tlhcX=0; Sint32 tlhcY=0; Sint32 brhcX=0; Sint32 brhcY=0; oss << "Displayed area:" << OFendl; DVPSPresentationSizeMode sizemode = ps.getDisplayedAreaPresentationSizeMode(); double factor=1.0; switch (sizemode) { case DVPSD_scaleToFit: oss << " presentation size mode: SCALE TO FIT" << OFendl; break; case DVPSD_trueSize: oss << " presentation size mode: TRUE SIZE" << OFendl; break; case DVPSD_magnify: ps.getDisplayedAreaPresentationPixelMagnificationRatio(factor); oss << " presentation size mode: MAGNIFY factor=" << factor << OFendl; break; } ps.getStandardDisplayedArea(tlhcX, tlhcY, brhcX, brhcY); oss << " displayed area TLHC=" << tlhcX << "\\" << tlhcY << " BRHC=" << brhcX << "\\" << brhcY << OFendl; double x, y; if (EC_Normal == ps.getDisplayedAreaPresentationPixelSpacing(x,y)) { oss << " presentation pixel spacing: X=" << x << "mm Y=" << y << " mm" << OFendl; } else { oss << " presentation pixel aspect ratio: " << ps.getDisplayedAreaPresentationPixelAspectRatio() << OFendl; } oss << "Rectangular shutter: "; if (ps.haveShutter(DVPSU_rectangular)) { oss << "LV=" << ps.getRectShutterLV() << " RV=" << ps.getRectShutterRV() << " UH=" << ps.getRectShutterUH() << " LH=" << ps.getRectShutterLH() << OFendl; } else oss << "none" << OFendl; oss << "Circular shutter: "; if (ps.haveShutter(DVPSU_circular)) { oss << "center=" << ps.getCenterOfCircularShutter_x() << "\\" << ps.getCenterOfCircularShutter_y() << " radius=" << ps.getRadiusOfCircularShutter() << OFendl; } else oss << "none" << OFendl; oss << "Polygonal shutter: "; if (ps.haveShutter(DVPSU_polygonal)) { oss << "points=" << ps.getNumberOfPolyShutterVertices() << " coordinates="; j = ps.getNumberOfPolyShutterVertices(); Sint32 polyX, polyY; for (i=0; igetText() << "\"" << OFendl; oss << " anchor point: "; if (ptext->haveAnchorPoint()) { oss << ptext->getAnchorPoint_x() << "\\" << ptext->getAnchorPoint_y() << " units="; if (ptext->getAnchorPointAnnotationUnits()==DVPSA_display) oss << "display"; else oss << "pixel"; oss << " visible="; if (ptext->anchorPointIsVisible()) oss << "yes"; else oss << "no"; oss << OFendl; } else oss << "none" << OFendl; oss << " bounding box: "; if (ptext->haveBoundingBox()) { oss << "TLHC="; oss << ptext->getBoundingBoxTLHC_x() << "\\" << ptext->getBoundingBoxTLHC_y() << " BRHC=" << ptext->getBoundingBoxBRHC_x() << "\\" << ptext->getBoundingBoxBRHC_y() << " units="; if (ptext->getBoundingBoxAnnotationUnits()==DVPSA_display) oss << "display"; else oss << "pixel"; DVPSTextJustification justification = ptext->getBoundingBoxHorizontalJustification(); oss << " justification="; switch (justification) { case DVPSX_left: oss << "left"; break; case DVPSX_right: oss << "right"; break; case DVPSX_center: oss << "center"; break; } oss << OFendl; } else oss << "none" << OFendl; } } // graphic objects max = ps.getNumberOfGraphicObjects(layer); oss << " Number of graphic objects: " << max << OFendl; DVPSGraphicObject *pgraphic = NULL; for (size_t graphicidx=0; graphicidxgetNumberOfPoints(); Float32 fx=0.0, fy=0.0; for (i=0; igetPoint(i,fx,fy)) { oss << fx << "\\" << fy << ", "; } else oss << "???\\???, "; } oss << OFendl; } } // curve objects max = ps.getNumberOfCurves(layer); oss << " Number of activated curves: " << max << OFendl; DVPSCurve *pcurve = NULL; for (size_t curveidx=0; curveidxgetCurveAxisUnitsY(); if (c && (strlen(c)>0)) oss << c << OFendl; else oss << "(none)" << OFendl; oss << " label="; c = pcurve->getCurveLabel(); if (c && (strlen(c)>0)) oss << c << " description="; else oss << "(none) description="; c = pcurve->getCurveDescription(); if (c && (strlen(c)>0)) oss << c << OFendl; else oss << "(none)" << OFendl; oss << " coordinates: "; j = pcurve->getNumberOfPoints(); double dx=0.0, dy=0.0; for (i=0; igetPoint(i,dx,dy)) { oss << dx << "\\" << dy << ", "; } else oss << "???\\???, "; } oss << OFendl; } else oss << " curve " << curveidx+1 << " not present in image." << OFendl; } // overlay objects const void *overlayData=NULL; unsigned int overlayWidth=0, overlayHeight=0, overlayLeft=0, overlayTop=0; OFBool overlayROI=OFFalse; Uint16 overlayTransp=0; char overlayfile[100]; FILE *ofile=NULL; max = ps.getNumberOfActiveOverlays(layer); oss << " Number of activated overlays: " << max << OFendl; for (size_t ovlidx=0; ovlidx 1) cmd.getParam(2, opt_pgmName); OFLog::configureFromCommandLine(cmd, app); opt_dump_pstate = dcmp2pgmLogger.isEnabledFor(OFLogger::INFO_LOG_LEVEL); if (cmd.findOption("--pstate")) app.checkValue(cmd.getValue(opt_pstName)); if (cmd.findOption("--config")) app.checkValue(cmd.getValue(opt_cfgName)); if (cmd.findOption("--frame")) app.checkValue(cmd.getValueAndCheckMin(opt_frame, 1)); if (cmd.findOption("--pgm")) opt_dicom_mode = OFFalse; if (cmd.findOption("--dicom")) opt_dicom_mode = OFTrue; if (cmd.findOption("--save-pstate")) app.checkValue(cmd.getValue(opt_savName)); } /* print resource identifier */ OFLOG_DEBUG(dcmp2pgmLogger, rcsid << OFendl); if (opt_cfgName) { FILE *cfgfile = fopen(opt_cfgName, "rb"); if (cfgfile) fclose(cfgfile); else { OFLOG_FATAL(dcmp2pgmLogger, "can't open configuration file '" << opt_cfgName << "'"); return 10; } } DVInterface dvi(opt_cfgName); OFCondition status = EC_Normal; if (opt_pstName == NULL) { OFLOG_DEBUG(dcmp2pgmLogger, "reading DICOM image file: " << opt_imgName); status = dvi.loadImage(opt_imgName); } else { OFLOG_DEBUG(dcmp2pgmLogger, "reading DICOM pstate file: " << opt_pstName); OFLOG_DEBUG(dcmp2pgmLogger, "reading DICOM image file: " << opt_imgName); status = dvi.loadPState(opt_pstName, opt_imgName); } if (status == EC_Normal) { if (opt_dump_pstate) dumpPresentationState(dvi.getCurrentPState()); if (opt_pgmName != NULL) { const void *pixelData = NULL; unsigned long width = 0; unsigned long height = 0; OFLOG_DEBUG(dcmp2pgmLogger, "creating pixel data"); if ((opt_frame > 0) && (dvi.getCurrentPState().selectImageFrameNumber(opt_frame) != EC_Normal)) OFLOG_ERROR(dcmp2pgmLogger, "cannot select frame " << opt_frame); if ((dvi.getCurrentPState().getPixelData(pixelData, width, height) == EC_Normal) && (pixelData != NULL)) { if (opt_dicom_mode) { double pixelAspectRatio = dvi.getCurrentPState().getPrintBitmapPixelAspectRatio(); // works for rotated images OFLOG_DEBUG(dcmp2pgmLogger, "writing DICOM SC file: " << opt_pgmName); if (EC_Normal != dvi.saveDICOMImage(opt_pgmName, pixelData, width, height, pixelAspectRatio)) { OFLOG_ERROR(dcmp2pgmLogger, "error during creation of DICOM file"); } } else { FILE *outfile = fopen(opt_pgmName, "wb"); if (outfile) { OFLOG_DEBUG(dcmp2pgmLogger, "writing PGM file: " << opt_pgmName); fprintf(outfile, "P5\n%ld %ld 255\n", width, height); fwrite(pixelData, (size_t)width, (size_t)height, outfile); fclose(outfile); } else { OFLOG_FATAL(dcmp2pgmLogger, "Can't create output file."); return 10; } } } else { OFLOG_FATAL(dcmp2pgmLogger, "Can't create output data."); return 10; } } if (opt_savName != NULL) { OFLOG_DEBUG(dcmp2pgmLogger, "writing pstate file: " << opt_savName); if (dvi.savePState(opt_savName, OFFalse) != EC_Normal) { OFLOG_FATAL(dcmp2pgmLogger, "Can't write pstate file."); return 10; } } } else { OFLOG_FATAL(dcmp2pgmLogger, "Can't open input file(s)."); return 10; } #ifdef DEBUG dcmDataDict.clear(); /* useful for debugging with dmalloc */ #endif return (status != EC_Normal); } /* * CVS/RCS Log: * $Log: dcmp2pgm.cc,v $ * Revision 1.43 2010-10-14 13:13:44 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.42 2009-11-27 10:52:54 joergr * Fixed various issues with syntax usage (e.g. layout and formatting). * Replaced remaining tabs by spaces. * * Revision 1.41 2009-11-24 14:12:56 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.40 2009-10-28 09:53:41 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.39 2008-09-25 16:30:24 joergr * Added support for printing the expanded command line arguments. * Always output the resource identifier of the command line tool in debug mode. * * Revision 1.38 2006/08/15 16:57:01 meichel * Updated the code in module dcmpstat to correctly compile when * all standard C++ classes remain in namespace std. * * Revision 1.37 2006/07/27 14:35:25 joergr * Changed parameter "exclusive" of method addOption() from type OFBool into an * integer parameter "flags". Prepended prefix "PF_" to parseLine() flags. * Option "--help" is no longer an exclusive option by default. * Made naming conventions for command line parameters more consistent, e.g. * used "dcmfile-in", "dcmfile-out" and "bitmap-out". * * Revision 1.36 2005/12/08 15:46:04 meichel * Changed include path schema for all DCMTK header files * * Revision 1.35 2005/11/28 15:29:05 meichel * File dcdebug.h is not included by any other header file in the toolkit * anymore, to minimize the risk of name clashes of macro debug(). * * Revision 1.34 2004/02/04 15:44:38 joergr * Removed acknowledgements with e-mail addresses from CVS log. * * Revision 1.33 2003/09/05 14:30:08 meichel * Introduced new API methods that allow Displayed Areas to be queried * and set either relative to the image (ignoring rotation and flip) or * in absolute values as defined in the standard. Rotate and flip methods * now adjust displayed areas in the presentation state. * * Revision 1.32 2003/09/05 09:26:54 meichel * Minor code purifications * * Revision 1.31 2002/11/26 08:44:25 meichel * Replaced all includes for "zlib.h" with * to avoid inclusion of zlib.h in the makefile dependencies. * * Revision 1.30 2002/09/23 18:26:06 joergr * Added new command line option "--version" which prints the name and version * number of external libraries used (incl. preparation for future support of * 'config.guess' host identifiers). * * Revision 1.29 2002/04/16 14:01:25 joergr * Added configurable support for C++ ANSI standard includes (e.g. streams). * * Revision 1.28 2001/11/09 16:06:04 joergr * Renamed some of the getValue/getParam methods to avoid ambiguities reported * by certain compilers. * * Revision 1.27 2001/09/28 13:47:38 joergr * Added check whether ios::nocreate exists. * * Revision 1.26 2001/09/26 15:36:01 meichel * Adapted dcmpstat to class OFCondition * * Revision 1.25 2001/06/07 14:29:54 joergr * Removed unused variable (reported by gcc 2.5.8 on NeXTSTEP). * * Revision 1.24 2001/06/01 15:50:07 meichel * Updated copyright header * * Revision 1.23 2000/11/13 15:50:39 meichel * Added dcmpstat support methods for creating image references * in SR documents. * * Revision 1.22 2000/06/02 12:49:03 joergr * Added frame selection option to support multi-frame images. * * Revision 1.21 2000/05/03 14:27:26 meichel * Updated dcmpstat apps for changes in dcmimgle. * * Revision 1.20 2000/03/08 16:28:41 meichel * Updated copyright header. * * Revision 1.19 2000/03/06 18:21:45 joergr * Avoid empty statement in the body of if-statements (MSVC6 reports warnings). * * Revision 1.18 2000/03/03 14:13:25 meichel * Implemented library support for redirecting error messages into memory * instead of printing them to stdout/stderr for GUI applications. * * Revision 1.17 1999/10/20 10:44:51 joergr * Replaced option --no-output by an optional output parameter (filename). * Minor corrections. * * Revision 1.16 1999/09/01 16:13:53 meichel * Fixed pixel aspect ratio computation in dcmp2pgm for rotated images. * * Revision 1.15 1999/07/27 15:41:32 meichel * Adapted dcmpstat tools to supplement 33 letter ballot changes. * * Revision 1.14 1999/05/03 14:16:37 joergr * Minor code purifications to keep Sun CC 2.0.1 quiet. * * Revision 1.13 1999/04/30 16:40:45 meichel * Minor code purifications to keep Sun CC 2.0.1 quiet * * Revision 1.12 1999/04/28 15:45:06 meichel * Cleaned up module dcmpstat apps, adapted to new command line class * and added short documentation. * * Revision 1.11 1999/04/27 10:57:13 joergr * Added new entry to index file: Presentation Description. * * Revision 1.10 1999/03/22 09:04:57 joergr * Added parameter to get value of (transparent) background color for method * getOverlayData. * * Revision 1.9 1999/02/25 18:37:15 joergr * Changed formatting of some comments. * * Revision 1.8 1999/02/23 11:42:08 joergr * Added debug code (exclitly delete data dictionary). * Added layer number to filename when extracting overlay planes. * * Revision 1.7 1999/02/08 12:52:16 meichel * Removed dummy parameter from DVInterface constructor. * * Revision 1.6 1999/01/20 19:24:42 meichel * Implemented access methods for network communication * related config file entries. * * Revision 1.5 1999/01/15 17:36:03 meichel * added configuration file facility (derived from dcmprint) * and a sample config file. * * Revision 1.4 1999/01/14 17:50:55 meichel * added new command line option --dicom to test application * dcmp2pgm. This demonstrates DVInterface::saveDICOMImage(). * * Revision 1.3 1998/12/22 17:57:02 meichel * Implemented Presentation State interface for overlays, * VOI LUTs, VOI windows, curves. Added test program that * allows to add curve data to DICOM images. * * Revision 1.2 1998/12/14 16:10:24 meichel * Implemented Presentation State interface for graphic layers, * text and graphic annotations, presentation LUTs. * * Revision 1.1 1998/11/27 14:50:19 meichel * Initial Release. * */ dcmtk-3.6.0/dcmpstat/apps/CMakeLists.txt0000644000310500011400000000276211410146071017363 0ustar joergrdicom3# declare additional include directories INCLUDE_DIRECTORIES(${dcmtls_SOURCE_DIR}/include ${LIBXML_INCDIR}) # declare directories containing used libraries LINK_DIRECTORIES(${dcmpstat_BINARY_DIR} ${ofstd_BINARY_DIR} ${oflog_BINARY_DIR} ${dcmdata_BINARY_DIR} ${dcmtls_BINARY_DIR} ${dcmnet_BINARY_DIR} ${dcmqrdb_BINARY_DIR} ${dcmimgle_BINARY_DIR} ${dcmsr_BINARY_DIR} ${dcmsign_BINARY_DIR} ${ZLIB_LIBDIR} ${LIBXML_LIBDIR} ${OPENSSL_LIBDIR}) # declare executables FOREACH(PROGRAM dcmmkcrv dcmmklut dcmp2pgm dcmprscp dcmprscu dcmpsmk dcmpsprt dcmpsrcv dcmpssnd) ADD_EXECUTABLE(${PROGRAM} ${PROGRAM}) ENDFOREACH(PROGRAM) ADD_EXECUTABLE(dcmpschk dcmpschk) # declare installation files FOREACH(PROGRAM dcmmkcrv dcmmklut dcmp2pgm dcmprscp dcmprscu dcmpschk dcmpsmk dcmpsprt dcmpsrcv dcmpssnd) INSTALL_TARGETS(${INSTALL_BINDIR} ${PROGRAM}) ENDFOREACH(PROGRAM) # make sure executables are linked to the corresponding libraries FOREACH(PROGRAM dcmmkcrv dcmmklut dcmp2pgm dcmprscp dcmprscu dcmpsmk dcmpschk dcmpsprt dcmpsrcv dcmpssnd) TARGET_LINK_LIBRARIES(${PROGRAM} dcmpstat dcmimgle dcmqrdb dcmnet dcmdata oflog ofstd ${ZLIB_LIBS} ${WIN32_STD_LIBRARIES} ${THREAD_LIBS}) ENDFOREACH(PROGRAM) FOREACH(PROGRAM dcmmklut dcmp2pgm dcmprscp dcmprscu dcmpschk dcmpsmk dcmpsprt dcmpsrcv dcmpssnd) TARGET_LINK_LIBRARIES(${PROGRAM} dcmsr) ENDFOREACH(PROGRAM) FOREACH(PROGRAM dcmp2pgm dcmprscp dcmprscu dcmpsprt dcmpsrcv dcmpssnd) TARGET_LINK_LIBRARIES(${PROGRAM} dcmtls dcmdsig ${LIBXML_LIBS} ${OPENSSL_LIBS}) ENDFOREACH(PROGRAM) dcmtk-3.6.0/dcmpstat/apps/dcmmkcrv.cc0000644000310500011400000004657011455601010016743 0ustar joergrdicom3/* * * Copyright (C) 1998-2010, 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 * * Authors: Marco Eichelberg * * Purpose: This application reads a DICOM image, adds a Curve and writes it back. * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:13:44 $ * CVS/RCS Revision: $Revision: 1.25 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #ifdef HAVE_GUSI_H #include #endif #include "dcmtk/ofstd/ofstream.h" #include "dcmtk/ofstd/ofconapp.h" #include "dcmtk/ofstd/ofcast.h" #include "dcmtk/dcmdata/dctk.h" #include "dcmtk/dcmdata/cmdlnarg.h" #include "dcmtk/dcmdata/dcuid.h" /* for dcmtk version name */ #ifdef WITH_ZLIB #include /* for zlibVersion() */ #endif #define OFFIS_CONSOLE_APPLICATION "dcmmkcrv" static OFLogger dcmmkcrvLogger = OFLog::getLogger("dcmtk.apps." OFFIS_CONSOLE_APPLICATION); static char rcsid[] = "$dcmtk: " OFFIS_CONSOLE_APPLICATION " v" OFFIS_DCMTK_VERSION " " OFFIS_DCMTK_RELEASEDATE " $"; #define MAX_POINTS 65535 // ******************************************** #define SHORTCOL 3 #define LONGCOL 13 int main(int argc, char *argv[]) { const char *opt_inName = NULL; /* in file name */ const char *opt_outName = NULL; /* out file name */ const char *opt_curveName = NULL; /* curve file name */ OFCmdUnsignedInt opt_data_vr = 4; OFCmdUnsignedInt opt_group = 0; OFBool opt_poly = OFTrue; const char *opt_label = NULL; const char *opt_description = NULL; const char *opt_axis_x = NULL; const char *opt_axis_y = NULL; OFCmdUnsignedInt opt_curve_vr = 0; OFConsoleApplication app(OFFIS_CONSOLE_APPLICATION , "Add 2D curve data to image", rcsid); OFCommandLine cmd; cmd.setOptionColumns(LONGCOL, SHORTCOL); cmd.setParamColumn(LONGCOL + SHORTCOL + 4); cmd.addParam("dcmfile-in", "DICOM input image file"); cmd.addParam("curvedata-in", "curve data input file (text)"); cmd.addParam("dcmfile-out", "DICOM output filename"); cmd.addGroup("general options:", LONGCOL, SHORTCOL + 2); cmd.addOption("--help", "-h", "print this help text and exit", OFCommandLine::AF_Exclusive); cmd.addOption("--version", "print version information and exit", OFCommandLine::AF_Exclusive); OFLog::addOptions(cmd); cmd.addGroup("curve creation options:"); cmd.addSubGroup("curve type:"); cmd.addOption("--poly", "-r", "create as POLY curve (default)"); cmd.addOption("--roi", "+r", "create as ROI curve"); cmd.addSubGroup("curve value representation:"); cmd.addOption("--data-vr", "+v", 1, "[n]umber: integer 0..4 (default: 4)", "select curve data VR: 0=US, 1=SS, 2=FL, 3=FD, 4=SL"); cmd.addOption("--curve-vr", "-c", 1, "[n]umber: integer 0..2 (default: 0)", "select VR with which the Curve Data element is written\n" "0=VR according to --data-vr, 1=OB, 2=OW"); cmd.addSubGroup("repeating group:"); cmd.addOption("--group", "-g", 1, "[n]umber: integer 0..15 (default: 0)", "select repeating group: 0=0x5000, 1=0x5002 etc."); cmd.addSubGroup("curve description:"); cmd.addOption("--label", "-l", 1, "s: string", "set Curve Label to s (default: absent)"); cmd.addOption("--description", "+d", 1, "s: string", "set Curve Description to s (default: absent)"); cmd.addOption("--axis", "-a", 2, "x: string, y: string", "set Axis Units to x\\y (default: absent)"); /* evaluate command line */ prepareCmdLineArgs(argc, argv, OFFIS_CONSOLE_APPLICATION); if (app.parseCommandLine(cmd, argc, argv, OFCommandLine::PF_ExpandWildcards)) { /* check exclusive options first */ if (cmd.hasExclusiveOption()) { if (cmd.findOption("--version")) { app.printHeader(OFTrue /*print host identifier*/); COUT << OFendl << "External libraries used:"; #ifdef WITH_ZLIB COUT << OFendl << "- ZLIB, Version " << zlibVersion() << OFendl; #else COUT << " none" << OFendl; #endif return 0; } } /* command line parameters */ cmd.getParam(1, opt_inName); cmd.getParam(2, opt_curveName); cmd.getParam(3, opt_outName); OFLog::configureFromCommandLine(cmd, app); cmd.beginOptionBlock(); if (cmd.findOption("--roi")) opt_poly = OFFalse; if (cmd.findOption("--poly")) opt_poly = OFTrue; cmd.endOptionBlock(); if (cmd.findOption("--data-vr")) app.checkValue(cmd.getValueAndCheckMinMax(opt_data_vr, 0, 4)); if (cmd.findOption("--curve-vr")) app.checkValue(cmd.getValueAndCheckMinMax(opt_curve_vr, 0, 2)); if (cmd.findOption("--group")) app.checkValue(cmd.getValueAndCheckMinMax(opt_group, 0, 15)); if (cmd.findOption("--label")) app.checkValue(cmd.getValue(opt_label)); if (cmd.findOption("--description")) app.checkValue(cmd.getValue(opt_description)); if (cmd.findOption("--axis")) { app.checkValue(cmd.getValue(opt_axis_x)); app.checkValue(cmd.getValue(opt_axis_y)); } } /* print resource identifier */ OFLOG_DEBUG(dcmmkcrvLogger, rcsid << OFendl); /* make sure data dictionary is loaded */ if (!dcmDataDict.isDictionaryLoaded()) { OFLOG_WARN(dcmmkcrvLogger, "no data dictionary loaded, " << "check environment variable: " << DCM_DICT_ENVIRONMENT_VARIABLE); } DcmFileFormat *fileformat = new DcmFileFormat; if (!fileformat) { OFLOG_FATAL(dcmmkcrvLogger, "memory exhausted"); return 1; } OFCondition error = fileformat->loadFile(opt_inName); if (! error.good()) { OFLOG_FATAL(dcmmkcrvLogger, error.text() << ": reading file: " << opt_inName); return 1; } DcmDataset *dataset = fileformat->getDataset(); /* read curve data */ STD_NAMESPACE ifstream curvefile(opt_curveName); if (!curvefile) { OFLOG_FATAL(dcmmkcrvLogger, "cannot open curve file: " << opt_curveName); return 1; } double *array = new double[MAX_POINTS*2]; if (array==NULL) { OFLOG_FATAL(dcmmkcrvLogger, "out of memory"); return 1; } size_t idx=0; double d; OFBool done = OFFalse; while ((curvefile.good())&&(!done)) { curvefile >> d; if (idx == MAX_POINTS*2) { OFLOG_WARN(dcmmkcrvLogger, "too many curve points, can only handle " << MAX_POINTS << "."); done = OFTrue; } else { if (curvefile.good()) array[idx++] = d; } } /* create curve description data */ DcmUnsignedShort *curveDimensions = new DcmUnsignedShort(DCM_RETIRED_CurveDimensions); DcmUnsignedShort *numberOfPoints = new DcmUnsignedShort(DCM_RETIRED_NumberOfPoints); DcmCodeString *typeOfData = new DcmCodeString(DCM_RETIRED_TypeOfData); DcmUnsignedShort *dataValueRepresentation = new DcmUnsignedShort(DCM_RETIRED_DataValueRepresentation); DcmLongString *curveDescription = new DcmLongString(DCM_RETIRED_CurveDescription); DcmShortString *axisUnits = new DcmShortString(DCM_RETIRED_AxisUnits); DcmLongString *curveLabel = new DcmLongString(DCM_RETIRED_CurveLabel); if ((!curveDimensions)||(!numberOfPoints)||(!typeOfData)||(!dataValueRepresentation) ||(!curveDescription)||(!axisUnits)||(!curveLabel)) { OFLOG_FATAL(dcmmkcrvLogger, "out of memory"); return 1; } curveDimensions->setGTag(OFstatic_cast(Uint16,0x5000+2*opt_group)); curveDimensions->putUint16(2,0); dataset->insert(curveDimensions, OFTrue); numberOfPoints->setGTag(OFstatic_cast(Uint16,0x5000+2*opt_group)); numberOfPoints->putUint16(OFstatic_cast(Uint16,idx/2),0); dataset->insert(numberOfPoints, OFTrue); typeOfData->setGTag(OFstatic_cast(Uint16,0x5000+2*opt_group)); if (opt_poly) typeOfData->putString("POLY"); else typeOfData->putString("ROI"); dataset->insert(typeOfData, OFTrue); dataValueRepresentation->setGTag(OFstatic_cast(Uint16,0x5000+2*opt_group)); dataValueRepresentation->putUint16(OFstatic_cast(Uint16,opt_data_vr),0); dataset->insert(dataValueRepresentation, OFTrue); if (opt_description) { curveDescription->setGTag(OFstatic_cast(Uint16,0x5000+2*opt_group)); curveDescription->putString(opt_description); dataset->insert(curveDescription, OFTrue); } if (opt_label) { curveLabel->setGTag(OFstatic_cast(Uint16,0x5000+2*opt_group)); curveLabel->putString(opt_label); dataset->insert(curveLabel, OFTrue); } if (opt_axis_x && opt_axis_y) { OFString aString(opt_axis_x); aString += "\\"; aString += opt_axis_y; axisUnits->setGTag(OFstatic_cast(Uint16,0x5000+2*opt_group)); axisUnits->putString(aString.c_str()); dataset->insert(axisUnits, OFTrue); } /* now create the curve itself */ void *rawData; size_t i; size_t byteLength = 0; size_t align=0; switch (opt_data_vr) { case 0: // US OFLOG_INFO(dcmmkcrvLogger, "creating curve, VR=US, points=" << idx/2); rawData = new Uint16[idx]; if (rawData==NULL) { OFLOG_FATAL(dcmmkcrvLogger, "out of memory"); return 1; } byteLength = sizeof(Uint16)*idx; for (i=0; iputUint16Array(OFstatic_cast(Uint16 *,rawData), byteLength/sizeof(Uint16)); break; case 1: // SS OFLOG_INFO(dcmmkcrvLogger, "encoding curve data element as VR=SS"); element = new DcmSignedShort(DcmTag(DCM_RETIRED_CurveData, EVR_SS)); if (element==NULL) { OFLOG_FATAL(dcmmkcrvLogger, "out of memory"); return 1; } element->putSint16Array(OFstatic_cast(Sint16 *,rawData), byteLength/sizeof(Sint16)); break; case 2: // FL OFLOG_INFO(dcmmkcrvLogger, "encoding curve data element as VR=FL"); element = new DcmFloatingPointSingle(DcmTag(DCM_RETIRED_CurveData, EVR_FL)); if (element==NULL) { OFLOG_FATAL(dcmmkcrvLogger, "out of memory"); return 1; } element->putFloat32Array(OFstatic_cast(Float32 *,rawData), byteLength/sizeof(Float32)); break; case 3: // FD OFLOG_INFO(dcmmkcrvLogger, "encoding curve data element as VR=FD"); element = new DcmFloatingPointDouble(DcmTag(DCM_RETIRED_CurveData, EVR_FD)); if (element==NULL) { OFLOG_FATAL(dcmmkcrvLogger, "out of memory"); return 1; } element->putFloat64Array(OFstatic_cast(Float64 *,rawData), byteLength/sizeof(Float64)); break; case 4: // SL OFLOG_INFO(dcmmkcrvLogger, "encoding curve data element as VR=SL"); element = new DcmSignedLong(DcmTag(DCM_RETIRED_CurveData, EVR_SL)); if (element==NULL) { OFLOG_FATAL(dcmmkcrvLogger, "out of memory"); return 1; } element->putSint32Array(OFstatic_cast(Sint32 *,rawData), byteLength/sizeof(Sint32)); break; default: OFLOG_FATAL(dcmmkcrvLogger, "unknown data VR, bailing out"); return 1; } element->setGTag(OFstatic_cast(Uint16,0x5000+2*opt_group)); dataset->insert(element, OFTrue); break; case 1: // OB // create little endian byte order OFLOG_INFO(dcmmkcrvLogger, "encoding curve data element as VR=OB"); swapIfNecessary(EBO_LittleEndian, gLocalByteOrder, rawData, byteLength, align); element = new DcmOtherByteOtherWord(DCM_RETIRED_CurveData); if (element==NULL) { OFLOG_FATAL(dcmmkcrvLogger, "out of memory"); return 1; } element->setGTag(OFstatic_cast(Uint16,0x5000+2*opt_group)); element->setVR(EVR_OB); element->putUint8Array(OFstatic_cast(Uint8 *,rawData), byteLength); dataset->insert(element, OFTrue); break; case 2: // OW // create little endian byte order OFLOG_INFO(dcmmkcrvLogger, "encoding curve data element as VR=OW"); if (align != sizeof(Uint16)) { swapIfNecessary(EBO_LittleEndian, gLocalByteOrder, rawData, byteLength, align); swapIfNecessary(gLocalByteOrder, EBO_LittleEndian, rawData, byteLength, sizeof(Uint16)); } element = new DcmOtherByteOtherWord(DCM_RETIRED_CurveData); if (element==NULL) { OFLOG_FATAL(dcmmkcrvLogger, "out of memory"); return 1; } element->setGTag(OFstatic_cast(Uint16,0x5000+2*opt_group)); element->setVR(EVR_OW); element->putUint16Array(OFstatic_cast(Uint16 *,rawData), byteLength/sizeof(Uint16)); dataset->insert(element, OFTrue); break; default: OFLOG_FATAL(dcmmkcrvLogger, "unsupported VR, bailing out"); return 1; } /* write back */ error = fileformat->saveFile(opt_outName, dataset->getOriginalXfer()); if (error != EC_Normal) { OFLOG_FATAL(dcmmkcrvLogger, error.text() << ": writing file: " << opt_outName); return 1; } return 0; } /* ** CVS/RCS Log: ** $Log: dcmmkcrv.cc,v $ ** Revision 1.25 2010-10-14 13:13:44 joergr ** Updated copyright header. Added reference to COPYRIGHT file. ** ** Revision 1.24 2009-11-24 14:12:56 uli ** Switched to logging mechanism provided by the "new" oflog module. ** ** Revision 1.23 2008-09-25 16:30:24 joergr ** Added support for printing the expanded command line arguments. ** Always output the resource identifier of the command line tool in debug mode. ** ** Revision 1.22 2008-04-30 12:38:42 meichel ** Fixed compile errors due to changes in attribute tag names ** ** Revision 1.21 2006/08/15 16:57:01 meichel ** Updated the code in module dcmpstat to correctly compile when ** all standard C++ classes remain in namespace std. ** ** Revision 1.20 2006/07/27 14:33:49 joergr ** Changed parameter "exclusive" of method addOption() from type OFBool into an ** integer parameter "flags". Prepended prefix "PF_" to parseLine() flags. ** Option "--help" is no longer an exclusive option by default. ** Made naming conventions for command line parameters more consistent, e.g. ** used "dcmfile-in", "dcmfile-out" and "bitmap-out". ** ** Revision 1.19 2005/12/08 15:46:02 meichel ** Changed include path schema for all DCMTK header files ** ** Revision 1.18 2005/11/28 15:29:05 meichel ** File dcdebug.h is not included by any other header file in the toolkit ** anymore, to minimize the risk of name clashes of macro debug(). ** ** Revision 1.17 2004/02/04 15:44:38 joergr ** Removed acknowledgements with e-mail addresses from CVS log. ** ** Revision 1.16 2003/08/29 08:41:17 joergr ** Replaced wrong getValueAndCheckMin() by getValueAndCheckMinMax(). ** Adapted type casts to new-style typecast operators defined in ofcast.h. ** ** Revision 1.15 2002/11/26 08:44:24 meichel ** Replaced all includes for "zlib.h" with ** to avoid inclusion of zlib.h in the makefile dependencies. ** ** Revision 1.14 2002/09/23 18:26:04 joergr ** Added new command line option "--version" which prints the name and version ** number of external libraries used (incl. preparation for future support of ** 'config.guess' host identifiers). ** ** Revision 1.13 2002/08/20 12:21:52 meichel ** Adapted code to new loadFile and saveFile methods, thus removing direct ** use of the DICOM stream classes. ** ** Revision 1.12 2002/04/16 14:01:24 joergr ** Added configurable support for C++ ANSI standard includes (e.g. streams). ** ** Revision 1.11 2001/11/09 16:06:02 joergr ** Renamed some of the getValue/getParam methods to avoid ambiguities reported ** by certain compilers. ** ** Revision 1.10 2001/09/26 15:36:00 meichel ** Adapted dcmpstat to class OFCondition ** ** Revision 1.9 2001/06/07 14:34:08 joergr ** Removed comment. ** ** Revision 1.7 2001/06/01 15:50:06 meichel ** Updated copyright header ** ** Revision 1.6 2000/03/08 16:28:40 meichel ** Updated copyright header. ** ** Revision 1.5 2000/03/06 18:21:44 joergr ** Avoid empty statement in the body of if-statements (MSVC6 reports warnings). ** ** Revision 1.4 2000/03/03 14:13:24 meichel ** Implemented library support for redirecting error messages into memory ** instead of printing them to stdout/stderr for GUI applications. ** ** Revision 1.3 1999/05/03 14:16:36 joergr ** Minor code purifications to keep Sun CC 2.0.1 quiet. ** ** Revision 1.2 1999/04/28 15:45:05 meichel ** Cleaned up module dcmpstat apps, adapted to new command line class ** and added short documentation. ** ** Revision 1.1 1998/12/22 17:57:02 meichel ** Implemented Presentation State interface for overlays, ** VOI LUTs, VOI windows, curves. Added test program that ** allows to add curve data to DICOM images. ** */ dcmtk-3.6.0/dcmpstat/apps/dcmmklut.cc0000644000310500011400000014463411502172352016762 0ustar joergrdicom3/* * * Copyright (C) 1998-2010, 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 * * Authors: Marco Eichelberg, Joerg Riesmeier * * Purpose: This application reads a DICOM image, adds a Modality LUT, * a VOI LUT or a Presentation LUT to the image and writes it back. * The LUT has a gamma curve shape or can be imported from an external * file. * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-12-15 17:03:38 $ * CVS/RCS Revision: $Revision: 1.47 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #ifdef HAVE_GUSI_H #include #endif #include "dcmtk/ofstd/ofstream.h" #include "dcmtk/dcmdata/dctk.h" #include "dcmtk/dcmdata/cmdlnarg.h" #include "dcmtk/dcmdata/dcuid.h" /* for dcmtk version name */ #include "dcmtk/ofstd/ofconapp.h" #include "dcmtk/ofstd/ofstring.h" #include "dcmtk/dcmimgle/dicrvfit.h" #include "dcmtk/dcmimgle/digsdfn.h" #include "dcmtk/dcmimgle/diutils.h" #include "dcmtk/ofstd/ofstream.h" #include "dcmtk/ofstd/ofstd.h" #define INCLUDE_CSTDLIB #define INCLUDE_CSTDIO #define INCLUDE_CMATH #define INCLUDE_CCTYPE #include "dcmtk/ofstd/ofstdinc.h" #ifdef WITH_ZLIB #include /* for zlibVersion() */ #endif #define OFFIS_CONSOLE_APPLICATION "dcmmklut" static OFLogger dcmmklutLogger = OFLog::getLogger("dcmtk.apps." OFFIS_CONSOLE_APPLICATION); static char rcsid[] = "$dcmtk: " OFFIS_CONSOLE_APPLICATION " v" OFFIS_DCMTK_VERSION " " OFFIS_DCMTK_RELEASEDATE " $"; // ******************************************** enum LUT_Type { LUT_Modality, LUT_Presentation, LUT_VOI }; OFCondition readMapFile(const char *filename, double *&inputXData, double *&inputYData, unsigned long &inputEntries, double &inputXMax, double &inputYMax) { OFCondition result = EC_IllegalCall; if ((filename != NULL) && (strlen(filename) > 0)) { OFLOG_INFO(dcmmklutLogger, "reading map file ..."); unsigned char buffer[1000]; FILE *inf = fopen(filename, "rb"); if (inf != NULL) { if (fread(buffer, 1, 264, inf) == 264) { if (fread(buffer + 264, 1, 1, inf) == 0) { if ((buffer[0] == 0x8a) && (buffer[1] == 0x3f) && (buffer[2] == 0x0) && (buffer[3] == 0x0)) { inputEntries = 256; inputXMax = 255; inputYMax = 255; inputXData = new double[inputEntries]; inputYData = new double[inputEntries]; if ((inputXData != NULL) && (inputYData != NULL)) { for (unsigned long i = 0; i < inputEntries; i++) { inputXData[i] = i; inputYData[i] = (double)buffer[i + 8]; } result = EC_Normal; } } else OFLOG_WARN(dcmmklutLogger, "magic word wrong, not a map file ... ignoring !"); } else OFLOG_WARN(dcmmklutLogger, "file too large, not a map file ... ignoring !"); } else OFLOG_WARN(dcmmklutLogger, "read error in map file ... ignoring !"); fclose(inf); } else OFLOG_WARN(dcmmklutLogger, "cannot open map file ... ignoring !"); } return result; } OFCondition readTextFile(const char *filename, double *&inputXData, double *&inputYData, unsigned long &inputEntries, double &inputXMax, double &inputYMax) { if ((filename != NULL) && (strlen(filename) > 0)) { OFLOG_INFO(dcmmklutLogger, "reading text file ..."); #ifdef HAVE_IOS_NOCREATE STD_NAMESPACE ifstream file(filename, STD_NAMESPACE ios::in | STD_NAMESPACE ios::nocreate); #else STD_NAMESPACE ifstream file(filename, STD_NAMESPACE ios::in); #endif if (file) { inputEntries = 0; inputXMax = 0; inputYMax = 0; unsigned long count = 0; double xmax = 0; double ymax = 0; char c; while (file.get(c)) { if (c == '#') // comment character { while (file.get(c) && (c != '\n') && (c != '\r')); // skip comments } else if (!isspace(OFstatic_cast(unsigned char, c))) // skip whitespaces { file.putback(c); if (inputEntries == 0) // read number of entries { char str[6]; file.get(str, sizeof(str)); if (strcmp(str, "count") == 0) // check for key word: count { file >> inputEntries; if (inputEntries > 0) { inputXData = new double[inputEntries]; inputYData = new double[inputEntries]; if ((inputXData == NULL) || (inputYData == NULL)) return EC_IllegalCall; } else { OFLOG_ERROR(dcmmklutLogger, "invalid or missing value for number of entries in text file ... ignoring !"); return EC_IllegalCall; // abort } } else { OFLOG_ERROR(dcmmklutLogger, "missing keyword 'count' for number of entries in text file ... ignoring !"); return EC_IllegalCall; // abort } } else if ((inputXMax == 0.0) && (c == 'x')) // read x maxvalue (optional) { char str[5]; file.get(str, sizeof(str)); if (strcmp(str, "xMax") == 0) // check for key word: xMax { file >> inputXMax; if (inputXMax <= 0) { OFLOG_DEBUG(dcmmklutLogger, "invalid value for xMax in text file ...ignoring !"); } } else { OFLOG_ERROR(dcmmklutLogger, "invalid text file ... ignoring !"); return EC_IllegalCall; // abort } } else if ((inputYMax == 0.0) && (c == 'y')) // read y maxvalue (optional) { char str[5]; file.get(str, sizeof(str)); if (strcmp(str, "yMax") == 0) // check for key word: yMax { file >> inputYMax; if (inputYMax <= 0) { OFLOG_DEBUG(dcmmklutLogger, "invalid value for yMax in text file ...ignoring !"); } } else { OFLOG_ERROR(dcmmklutLogger, "invalid text file ... ignoring !"); return EC_IllegalCall; // abort } } else { if (count < inputEntries) { file >> inputXData[count]; // read x value file >> inputYData[count]; // read y value if (file.fail()) { OFLOG_DEBUG(dcmmklutLogger, "missing y value in text file ... ignoring last entry !"); } else { if ((count > 0) && (inputXData[count] <= xmax)) { OFLOG_DEBUG(dcmmklutLogger, "x values in text file not strictly monotonous ... ignoring entry #" << (count + 1) << " !"); } else { xmax = inputXData[count]; if (inputYData[count] > ymax) ymax = inputYData[count]; if ((inputXMax != 0) && (inputXData[count] > inputXMax)) { OFLOG_DEBUG(dcmmklutLogger, "x value (" << inputXData[count] << ") exceeds maximum value (" << inputXMax << ") in text file ..." << OFendl << " ... ignoring value !"); } else if ((inputYMax != 0) && (inputYData[count] > inputYMax)) { OFLOG_DEBUG(dcmmklutLogger, "y value (" << inputYData[count] << ") exceeds maximum value (" << inputYMax << ") in text file ..." << OFendl << " ... ignoring value !"); } else count++; } } } else { OFLOG_DEBUG(dcmmklutLogger, "too many values in text file ... ignoring last line(s) !"); break; } } } } if (count < inputEntries) { inputEntries = count; OFLOG_DEBUG(dcmmklutLogger, "automatically setting number of entries in text file to " << inputEntries << " !"); } if (inputXMax == 0) // automatic calculation inputXMax = xmax; if (inputYMax == 0) inputYMax = ymax; if (/*(inputXMax > 0) && (inputYMax > 0) &&*/ (inputEntries > 0) && (inputXData != NULL) && (inputYData != NULL)) return EC_Normal; else OFLOG_WARN(dcmmklutLogger, "invalid text file ... ignoring !"); } else OFLOG_WARN(dcmmklutLogger, "can't open text file ... ignoring !"); } return EC_IllegalCall; } OFCondition writeTextOutput(const char *filename, const unsigned long numberOfEntries, const signed long firstMapped, const Uint16 *outputData, const OFString &header) { OFCondition result = EC_IllegalCall; if ((filename != NULL) && (strlen(filename) > 0)) { if ((outputData != NULL) && (numberOfEntries > 0)) { OFLOG_INFO(dcmmklutLogger, "writing text file ..."); STD_NAMESPACE ofstream file(filename); if (file) { file << header << OFendl; for (unsigned long i = 0; i < numberOfEntries; i++) file << (firstMapped + (signed long)i) << "\t" << outputData[i] << OFendl; } else OFLOG_WARN(dcmmklutLogger, "can't create output text file ... ignoring !"); } } return result; } OFCondition convertInputLUT(const unsigned int numberOfBits, const unsigned long numberOfEntries, const signed long firstMapped, double *inputXData, double *inputYData, const unsigned long inputEntries, const double inputXMax, const double inputYMax, const unsigned int order, Uint16 *outputData, OFString &header, char *explanation) { OFCondition result = EC_IllegalCall; if ((inputXData != NULL) && (inputYData != NULL) && (inputEntries > 0) && (inputYMax > 0) && (outputData != NULL)) { OFOStringStream oss; if (explanation !=NULL) { if (strlen(explanation) == 0) { sprintf(explanation, "LUT created from %u->%u bit data, descriptor %u/%ld/%u", DicomImageClass::tobits((int)inputXMax), DicomImageClass::tobits((int)inputYMax), (numberOfEntries < 65536) ? (Uint16)numberOfEntries : 0, firstMapped, numberOfBits); } oss << "# " << explanation << OFendl; } const double factor = (double)(DicomImageClass::maxval(numberOfBits)) / inputYMax; if (factor != 1.0) { OFLOG_INFO(dcmmklutLogger, "multiplying input values by " << STD_NAMESPACE ios::fixed << factor << " ..."); for (unsigned long i = 0; i < inputEntries; i++) inputYData[i] *= factor; } if (numberOfEntries == inputEntries) { OFLOG_INFO(dcmmklutLogger, "importing LUT data directly ..."); for (unsigned long i = 0; i < numberOfEntries; i++) outputData[i] = (Uint16)inputYData[i]; result = EC_Normal; } else { OFLOG_INFO(dcmmklutLogger, "using polynomial curve fitting algorithm ..."); double *coeff = new double[order + 1]; if (DiCurveFitting::calculateCoefficients(inputXData, inputYData, (unsigned int)inputEntries, order, coeff)) { if (DiCurveFitting::calculateValues(0, inputXMax, outputData, (unsigned int)numberOfEntries, order, coeff)) { oss << "# using polynomial curve fitting algorithm (order = " << order << ")" << OFendl; oss << "# equation: y = C0 + C1*x + C2*x^2 + C3*x^3 + ... + Cn*x^n" << OFendl; oss << "# where: "; for (unsigned int i = 0; i <= order; i++) { oss << "C" << i << " = "; oss.setf(STD_NAMESPACE ios::fixed, STD_NAMESPACE ios::floatfield); //oss.setf(ios::showpos); oss.precision(5); oss.width(10); oss << coeff[i] << OFendl; if (i < order) { oss << "# "; if (i < 9) oss << " "; } } result = EC_Normal; } } delete[] coeff; } if (result == EC_Normal) { oss << OFStringStream_ends; OFSTRINGSTREAM_GETSTR(oss, tmpString) header += tmpString; OFSTRINGSTREAM_FREESTR(tmpString) } else OFLOG_WARN(dcmmklutLogger, "can't create lookup table from text file ... ignoring !"); } return result; } void gammaLUT(const unsigned int numberOfBits, const unsigned long numberOfEntries, const signed long firstMapped, const OFBool byteAlign, const double gammaValue, Uint16 *outputData, OFString &header, char *explanation) { if (outputData != NULL) { OFLOG_INFO(dcmmklutLogger, "computing gamma function ..."); OFOStringStream oss; if (explanation != NULL) { if (strlen(explanation) == 0) { char gammabuf[16]; OFStandard::ftoa(gammabuf, sizeof(gammabuf), gammaValue, OFStandard::ftoa_format_f, 3, 1); sprintf(explanation, "LUT with gamma %s, descriptor %u/%ld/%u", gammabuf, (numberOfEntries < 65536) ? (Uint16)numberOfEntries : 0, firstMapped, numberOfBits); } oss << "# " << explanation << OFendl; } Uint16 maxValue = 0xFFFF >> (16 - numberOfBits); double step = (double)maxValue / ((double)numberOfEntries - 1.0); double gammaExp = 1.0 / gammaValue; double factor = (double)maxValue / pow((double)maxValue, gammaExp); double val; unsigned long i = 0; if (byteAlign) { Uint8 *data8 = (Uint8 *)outputData; for (i = 0; i < numberOfEntries; i++) { val = factor * pow(i * step, gammaExp); data8[i] = (Uint8)val; } data8[numberOfEntries]=0; //create padding value } else { for (i = 0; i < numberOfEntries; i++) { val = factor * pow(i * step, gammaExp); outputData[i]= (Uint16)val; } } oss << OFStringStream_ends; OFSTRINGSTREAM_GETSTR(oss, tmpString) header += tmpString; OFSTRINGSTREAM_FREESTR(tmpString) } } void applyInverseGSDF(const unsigned int numberOfBits, const unsigned long numberOfEntries, const OFBool byteAlign, const unsigned int minDensity, const unsigned int maxDensity, const unsigned int illumination, const unsigned int reflection, Uint16 *outputData, OFString &header, char *explanation) { if (outputData != NULL) { OFLOG_INFO(dcmmklutLogger, "applying inverse GSDF ..."); OFOStringStream oss; if ((explanation != NULL) && (strlen(explanation) > 0)) strcat(explanation, ", inverse GSDF"); const double l0 = (double)illumination; const double la = (double)reflection; const double dmin = (double)minDensity / 100; const double dmax = (double)maxDensity / 100; const double lmin = la + l0 * pow((double)10, -dmax); const double lmax = la + l0 * pow((double)10, -dmin); const double jmin = DiGSDFunction::getJNDIndex(lmin); const double jmax = DiGSDFunction::getJNDIndex(lmax); const double factor = (double)DicomImageClass::maxval(numberOfBits) / (jmax - jmin); const double density = (dmax - dmin) / (double)DicomImageClass::maxval(numberOfBits); unsigned long i; if (byteAlign) { Uint8 *data8 = (Uint8 *)outputData; for (i = 0; i < numberOfEntries; i++) data8[i] = (Uint8)((DiGSDFunction::getJNDIndex(la + l0 * pow((double)10, -(dmin + (double)data8[i] * density))) - jmin) * factor); } else { for (i = 0; i < numberOfEntries; i++) outputData[i] = (Uint16)((DiGSDFunction::getJNDIndex(la + l0 * pow((double)10, -(dmin + (double)outputData[i] * density))) - jmin) * factor); } oss << "# applied inverse GSDF with Dmin/max = " << minDensity << "/" << maxDensity << ", L0/La = " << illumination << "/" << reflection << OFendl; oss << OFStringStream_ends; OFSTRINGSTREAM_GETSTR(oss, tmpString) header += tmpString; OFSTRINGSTREAM_FREESTR(tmpString) } } #ifndef RAND_MAX /* some brain-dead systems such as SunOS 4.1.3 do not define any constant * for the upper limit of rand() calls. We hope that such systems at least * keep within the SysV specs and return values up to 2^15-1. */ #define RAND_MAX 32767 #endif void mixingUpLUT(const unsigned long numberOfEntries, const OFBool byteAlign, const unsigned long randomCount, const unsigned int randomSeed, Uint16 *outputData, char *explanation) { if (outputData != NULL) { OFLOG_INFO(dcmmklutLogger, "mixing up LUT entries ..."); if ((explanation != NULL) && (strlen(explanation) > 0)) strcat(explanation, ", mixed-up entries"); srand(randomSeed); unsigned long i, i1, i2; const double factor = (double)(numberOfEntries - 1) / RAND_MAX; if (byteAlign) { Uint8 temp; Uint8 *data8 = (Uint8 *)outputData; for (i = 0; i < randomCount; i++) { i1 = (unsigned long)(rand() * factor); i2 = (unsigned long)(rand() * factor); if (i1 != i2) { temp = data8[i1]; data8[i1] = data8[i2]; data8[i2] = temp; } } } else { Uint16 temp; for (i = 0; i < randomCount; i++) { i1 = (unsigned long)(rand() * factor); i2 = (unsigned long)(rand() * factor); if (i1 != i2) { temp = outputData[i1]; outputData[i1] = outputData[i2]; outputData[i2] = temp; } } } } } OFCondition createLUT(const unsigned int numberOfBits, const unsigned long numberOfEntries, const signed long firstMapped, const OFBool byteAlign, DcmEVR lutVR, DcmItem &item, Uint16 *data, const char *explanation = NULL) { OFCondition result = EC_Normal; Uint16 numEntries16 = 0; if (numberOfEntries == 0) OFLOG_WARN(dcmmklutLogger, "creating LUT without LUT data"); if (numberOfEntries > 65536) { OFLOG_ERROR(dcmmklutLogger, "cannot create LUT with more than 65536 entries"); return EC_IllegalCall; } if (numberOfEntries < 65536) numEntries16 = (Uint16)numberOfEntries; if ((numberOfBits < 8) || (numberOfBits > 16)) { OFLOG_ERROR(dcmmklutLogger, "cannot create LUT with " << numberOfBits << " bit entries, only 8..16"); return EC_IllegalCall; } DcmElement *descriptor = NULL; if (firstMapped < 0) { // LUT Descriptor is SS if (firstMapped < -32768) { OFLOG_ERROR(dcmmklutLogger, "cannot create LUT - first value mapped < -32768"); return EC_IllegalCall; } descriptor = new DcmSignedShort(DcmTag(DCM_LUTDescriptor, EVR_SS)); if (descriptor) { if (EC_Normal==result) result = descriptor->putSint16((Sint16)numEntries16, 0); if (EC_Normal==result) result = descriptor->putSint16((Sint16)firstMapped, 1); if (EC_Normal==result) result = descriptor->putSint16((Sint16)numberOfBits, 2); if (EC_Normal==result) result = item.insert(descriptor, OFTrue /*replaceOld*/); } else return EC_MemoryExhausted; } else { // LUT Descriptor is US if (firstMapped > 0xFFFF) { OFLOG_ERROR(dcmmklutLogger, "cannot create LUT - first value mapped > 65535"); return EC_IllegalCall; } descriptor = new DcmUnsignedShort(DcmTag(DCM_LUTDescriptor, EVR_US)); if (descriptor) { if (EC_Normal==result) result = descriptor->putUint16(numEntries16, 0); if (EC_Normal==result) result = descriptor->putUint16((Uint16)firstMapped, 1); if (EC_Normal==result) result = descriptor->putUint16(numberOfBits, 2); if (EC_Normal==result) result = item.insert(descriptor, OFTrue /*replaceOld*/); } else return EC_MemoryExhausted; } unsigned long wordsToWrite = 0; if (byteAlign) { // the array is now in little endian byte order. Swap to local byte order if neccessary. swapIfNecessary(gLocalByteOrder, EBO_LittleEndian, (Uint8 *)data, numberOfEntries + 1, sizeof(Uint16)); wordsToWrite = (numberOfEntries + 1) / 2; } else wordsToWrite = numberOfEntries; if ((wordsToWrite > 32767) && (lutVR != EVR_OW)) { OFLOG_WARN(dcmmklutLogger, "LUT data >= 64K, writing as OW"); lutVR = EVR_OW; } // write LUT Data as OW, US, or SS DcmElement *lutdata = NULL; switch (lutVR) { case EVR_US: lutdata = new DcmUnsignedShort(DcmTag(DCM_LUTData, EVR_US)); if (lutdata) { if (EC_Normal==result) result = lutdata->putUint16Array(data, wordsToWrite); if (EC_Normal==result) result = item.insert(lutdata, OFTrue /*replaceOld*/); } else return EC_MemoryExhausted; break; case EVR_OW: lutdata = new DcmOtherByteOtherWord(DcmTag(DCM_LUTData, EVR_OW)); if (lutdata) { if (EC_Normal==result) result = lutdata->putUint16Array(data, wordsToWrite); if (EC_Normal==result) result = item.insert(lutdata, OFTrue /*replaceOld*/); } else return EC_MemoryExhausted; break; case EVR_SS: lutdata = new DcmSignedShort(DcmTag(DCM_LUTData, EVR_SS)); if (lutdata) { if (EC_Normal==result) result = lutdata->putSint16Array((Sint16 *)data, wordsToWrite); if (EC_Normal==result) result = item.insert(lutdata, OFTrue /*replaceOld*/); } else return EC_MemoryExhausted; break; default: OFLOG_ERROR(dcmmklutLogger, "unsupported VR for LUT Data"); return EC_IllegalCall; /* break; */ } // create LUT explanation if (explanation != NULL) { DcmElement *explItem = new DcmLongString(DCM_LUTExplanation); if (explItem) { if (result == EC_Normal) result = explItem->putString(explanation); if (EC_Normal == result) result = item.insert(explItem, OFTrue /*replaceOld*/); } else return EC_MemoryExhausted; } return result; } // ******************************************** #define SHORTCOL 3 #define LONGCOL 14 int main(int argc, char *argv[]) { const char *opt_inName = NULL; /* in file name */ const char *opt_outName = NULL; /* out file name */ const char *opt_outText = NULL; const char *opt_mapName = NULL; const char *opt_textName = NULL; const char *opt_explanation = NULL; OFCmdFloat opt_gammaValue = 1.0; OFCmdUnsignedInt opt_bits = 16; OFCmdUnsignedInt opt_entries = 256; OFCmdSignedInt opt_firstMapped = 0; OFCmdUnsignedInt opt_randomCount = 0; OFCmdUnsignedInt opt_randomSeed = 0; /* default: for reproduceable results */ OFCmdUnsignedInt opt_order = 5; OFCmdUnsignedInt opt_minDensity = 20; OFCmdUnsignedInt opt_maxDensity = 300; OFCmdUnsignedInt opt_illumination = 2000; OFCmdUnsignedInt opt_reflection = 10; LUT_Type opt_lutType = LUT_VOI; OFBool opt_inverseGSDF = OFFalse; OFBool opt_byteAlign = OFFalse; OFBool opt_replaceMode = OFTrue; DcmEVR opt_lutVR = EVR_OW; OFCommandLine cmd; OFConsoleApplication app(OFFIS_CONSOLE_APPLICATION , "Create DICOM look-up tables", rcsid); cmd.setOptionColumns(LONGCOL, SHORTCOL); cmd.setParamColumn(LONGCOL + SHORTCOL + 4); cmd.addParam("dcmimg-out", "DICOM output filename"); cmd.addGroup("general options:", LONGCOL, SHORTCOL + 2); cmd.addOption("--help", "-h", "print this help text and exit", OFCommandLine::AF_Exclusive); cmd.addOption("--version", "print version information and exit", OFCommandLine::AF_Exclusive); OFLog::addOptions(cmd); cmd.addGroup("LUT creation options:"); cmd.addSubGroup("LUT type:"); cmd.addOption("--modality", "+Tm", "create as Modality LUT"); cmd.addOption("--presentation", "+Tp", "create as Presentation LUT"); cmd.addOption("--voi", "+Tv", "create as VOI LUT (default)"); cmd.addSubGroup("LUT placement:"); cmd.addOption("--add", "+Pa", "add to existing transform\n(default for and only with --voi)"); cmd.addOption("--replace", "+Pr", "replace existing transform\n(default for --modality and --presentation)"); cmd.addSubGroup("LUT content:"); cmd.addOption("--gamma", "+Cg", 1, "[g]amma: float", "use gamma value (default: 1.0)"); cmd.addOption("--map-file", "+Cm", 1, "[f]ilename: string", "read input data from MAP file"); cmd.addOption("--text-file", "+Ct", 1, "[f]ilename: string", "read input data from text file"); cmd.addSubGroup("LUT options:"); cmd.addOption("--inverse-gsdf", "+Og", "apply inverse GSDF (print presentation LUT in OD)"); cmd.addOption("--min-density", 1, "[v]alue: integer (0..65535, default: 20)", "set min density to v (in hundreds of OD)"); cmd.addOption("--max-density", 1, "[v]alue: integer (0..65535, default: 300)", "set max density to v (in hundreds of OD)"); cmd.addOption("--illumination", "+Oi", 1, "[v]alue: integer (0..65535, default: 2000)", "set illumination to v (in cd/m^2)"); cmd.addOption("--reflection", "+Or", 1, "[v]alue: integer (0..65535, default: 10)", "set reflected ambient light to v (in cd/m^2)"); cmd.addSubGroup("LUT structure:"); cmd.addOption("--bits", "-b", 1, "[n]umber: integer", "create LUT with n bit values (8..16, default: 16)"); cmd.addOption("--entries", "-e", 1, "[n]umber: integer", "create LUT with n entries (1..65536, default: 256)"); cmd.addOption("--first-mapped", "-f", 1, "[n]umber: integer", "first input value mapped (-31768..65535, default: 0)"); cmd.addOption("--random", "-r", 1, "[n]umber: unsigned integer", "perform n randomly selected permutations on the LUT"); cmd.addOption("--random-seed", "-rs", 1, "[n]umber: unsigned integer", "initialize the random-number generator with n\n(default: 0, for reproducible results)"); cmd.addOption("--order", "-o", 1, "[n]umber: integer", "use polynomial curve fitting algorithm with order n\n(0..99, default: 5)"); cmd.addOption("--explanation", "-E", 1, "[n]ame: string", "LUT explanation (default: automatically created)"); cmd.addSubGroup("LUT data alignment:"); cmd.addOption("--byte-align", "-a", "create byte-aligned LUT\n(default for and only with 8 bit values)"); cmd.addOption("--word-align", "+a", "create word-aligned LUT\n(default for 9-16 bit values)"); cmd.addSubGroup("LUT data VR:"); cmd.addOption("--data-ow", "+Dw", "write LUT Data as OW (default)"); cmd.addOption("--data-us", "+Du", "write LUT Data as US"); cmd.addOption("--data-ss", "+Ds", "write LUT Data as SS (minimal support)"); cmd.addGroup("file options:", LONGCOL, SHORTCOL + 2); cmd.addOption("--dicom-input", "+Fi", 1, "[f]ilename: string", "read dataset from DICOM file f"); cmd.addOption("--text-output", "+Fo", 1, "[f]ilename: string", "write LUT data to tabbed text file f"); /* evaluate command line */ prepareCmdLineArgs(argc, argv, OFFIS_CONSOLE_APPLICATION); if (app.parseCommandLine(cmd, argc, argv, OFCommandLine::PF_ExpandWildcards)) { /* check exclusive options first */ if (cmd.hasExclusiveOption()) { if (cmd.findOption("--version")) { app.printHeader(OFTrue /*print host identifier*/); COUT << OFendl << "External libraries used:"; #ifdef WITH_ZLIB COUT << OFendl << "- ZLIB, Version " << zlibVersion() << OFendl; #else COUT << " none" << OFendl; #endif return 0; } } /* command line parameters */ cmd.getParam(1, opt_outName); OFLog::configureFromCommandLine(cmd, app); cmd.beginOptionBlock(); if (cmd.findOption("--modality")) opt_lutType = LUT_Modality; if (cmd.findOption("--presentation")) opt_lutType = LUT_Presentation; if (cmd.findOption("--voi")) opt_lutType = LUT_VOI; cmd.endOptionBlock(); if ((opt_lutType == LUT_Modality) || (opt_lutType == LUT_Presentation)) opt_replaceMode = OFTrue; else opt_replaceMode = OFFalse; cmd.beginOptionBlock(); if (cmd.findOption("--add")) { app.checkConflict("--add","--modality", (opt_lutType == LUT_Modality)); app.checkConflict("--add","--presentation", (opt_lutType == LUT_Presentation)); opt_replaceMode = OFFalse; } if (cmd.findOption("--replace")) opt_replaceMode = OFTrue; cmd.endOptionBlock(); cmd.beginOptionBlock(); if (cmd.findOption("--gamma")) app.checkValue(cmd.getValue(opt_gammaValue)); if (cmd.findOption("--map-file")) app.checkValue(cmd.getValue(opt_mapName)); if (cmd.findOption("--text-file")) app.checkValue(cmd.getValue(opt_textName)); cmd.endOptionBlock(); if (cmd.findOption("--inverse-gsdf")) opt_inverseGSDF = OFTrue; if (cmd.findOption("--min-density")) app.checkValue(cmd.getValue(opt_minDensity)); if (cmd.findOption("--max-density")) app.checkValue(cmd.getValue(opt_maxDensity)); if (cmd.findOption("--illumination")) app.checkValue(cmd.getValue(opt_illumination)); if (cmd.findOption("--reflection")) app.checkValue(cmd.getValue(opt_reflection)); if (cmd.findOption("--bits")) { app.checkValue(cmd.getValueAndCheckMinMax(opt_bits, 8, 16)); opt_byteAlign = (opt_bits == 8); /* default */ } if (cmd.findOption("--entries")) app.checkValue(cmd.getValueAndCheckMinMax(opt_entries, 1, 65536)); if (cmd.findOption("--first-mapped")) app.checkValue(cmd.getValueAndCheckMinMax(opt_firstMapped, -32768, 65535)); if (cmd.findOption("--explanation")) app.checkValue(cmd.getValue(opt_explanation)); if (cmd.findOption("--random")) app.checkValue(cmd.getValueAndCheckMinMax(opt_randomCount, 1, 99999)); if (cmd.findOption("--random-seed")) app.checkValue(cmd.getValue(opt_randomSeed)); if (cmd.findOption("--order")) app.checkValue(cmd.getValueAndCheckMinMax(opt_order, 0, 99)); cmd.beginOptionBlock(); if (cmd.findOption("--byte-align")) opt_byteAlign = OFTrue; if (cmd.findOption("--word-align")) opt_byteAlign = OFFalse; cmd.endOptionBlock(); cmd.beginOptionBlock(); if (cmd.findOption("--data-ow")) opt_lutVR = EVR_OW; if (cmd.findOption("--data-us")) opt_lutVR = EVR_US; if (cmd.findOption("--data-ss")) opt_lutVR = EVR_SS; cmd.endOptionBlock(); if (cmd.findOption("--dicom-input")) app.checkValue(cmd.getValue(opt_inName)); if (cmd.findOption("--text-output")) app.checkValue(cmd.getValue(opt_outText)); } /* print resource identifier */ OFLOG_DEBUG(dcmmklutLogger, rcsid << OFendl); if ((opt_lutType == LUT_Modality) && (opt_bits != 8) && (opt_bits != 16)) { OFLOG_FATAL(dcmmklutLogger, "--modality cannot be used with --bits other than 8 or 16"); return 1; } if ((opt_bits != 8) && opt_byteAlign) { OFLOG_FATAL(dcmmklutLogger, "--byte-align cannot be used with --bits other than 8"); return 1; } /* make sure data dictionary is loaded */ if (!dcmDataDict.isDictionaryLoaded()) OFLOG_WARN(dcmmklutLogger, "no data dictionary loaded, check environment variable: " << DCM_DICT_ENVIRONMENT_VARIABLE); E_TransferSyntax Xfer= EXS_LittleEndianExplicit; OFCondition result = EC_Normal; DcmFileFormat *fileformat = new DcmFileFormat(); if (!fileformat) { OFLOG_FATAL(dcmmklutLogger, "memory exhausted"); return 1; } DcmDataset *dataset = fileformat->getDataset(); if (opt_inName != NULL) { OFCondition cond = fileformat->loadFile(opt_inName); if (! cond.good()) { OFLOG_FATAL(dcmmklutLogger, "cannot open file: " << opt_inName); return 1; } Xfer = dataset->getOriginalXfer(); } /* create Item with LUT */ DcmItem *ditem = new DcmItem(); if (ditem) { Uint16 *outputData = new Uint16[opt_entries]; if (outputData == NULL) result = EC_MemoryExhausted; else { char explStr[1024]; if (opt_explanation != NULL) strcpy(explStr, opt_explanation); else explStr[0] = 0; OFString headerStr; double *inputXData = NULL; double *inputYData = NULL; unsigned long inputEntries = 0; double inputXMax = 0; double inputYMax = 0; if (readMapFile(opt_mapName, inputXData, inputYData, inputEntries, inputXMax, inputYMax) == EC_Normal) { result = convertInputLUT((unsigned int)opt_bits, opt_entries, opt_firstMapped, inputXData, inputYData, inputEntries, inputXMax, inputYMax, (unsigned int)opt_order, outputData, headerStr, explStr); } else if (readTextFile(opt_textName, inputXData, inputYData, inputEntries, inputXMax, inputYMax) == EC_Normal) { result = convertInputLUT((unsigned int)opt_bits, opt_entries, opt_firstMapped, inputXData, inputYData, inputEntries, inputXMax, inputYMax, (unsigned int)opt_order, outputData, headerStr, explStr); } else { gammaLUT((unsigned int)opt_bits, opt_entries, opt_firstMapped, opt_byteAlign, opt_gammaValue, outputData, headerStr, explStr); } if (result == EC_Normal) { if (opt_inverseGSDF) applyInverseGSDF((unsigned int)opt_bits, opt_entries, opt_byteAlign, (unsigned int)opt_minDensity, (unsigned int)opt_maxDensity, (unsigned int)opt_illumination, (unsigned int)opt_reflection, outputData, headerStr, explStr); if (opt_randomCount > 0) mixingUpLUT(opt_entries, opt_byteAlign, opt_randomCount, (unsigned int)opt_randomSeed, outputData, explStr); result = createLUT((unsigned int)opt_bits, opt_entries, opt_firstMapped, opt_byteAlign, opt_lutVR, *ditem, outputData, explStr); } delete[] inputXData; delete[] inputYData; writeTextOutput(opt_outText, opt_entries, opt_firstMapped, outputData, headerStr); } delete[] outputData; if (EC_Normal != result) { OFLOG_FATAL(dcmmklutLogger, "could not create LUT, bailing out."); return 1; } } else result = EC_MemoryExhausted; if (opt_outName != NULL) { DcmSequenceOfItems *dseq = NULL; if (EC_Normal==result) { switch (opt_lutType) { case LUT_Modality: { DcmLongString modalityLUTType(DCM_ModalityLUTType); modalityLUTType.putString("US"); // unspecified Modality LUT DcmElement *delem = new DcmLongString(modalityLUTType); if (delem) { ditem->insert(delem, OFTrue /*replaceOld*/); dseq = new DcmSequenceOfItems(DCM_ModalityLUTSequence); if (dseq) { dataset->insert(dseq, OFTrue); dseq->insert(ditem); } else result = EC_MemoryExhausted; delete dataset->remove(DCM_RescaleIntercept); delete dataset->remove(DCM_RescaleSlope); delete dataset->remove(DCM_RescaleType); } else result = EC_MemoryExhausted; } break; case LUT_Presentation: if (!opt_replaceMode) { // search existing sequence DcmStack stack; if (EC_Normal == dataset->search(DCM_PresentationLUTSequence, stack, ESM_fromHere, OFFalse)) dseq=(DcmSequenceOfItems *)stack.top(); } if (dseq == NULL) { dseq = new DcmSequenceOfItems(DCM_PresentationLUTSequence); if (dseq) dataset->insert(dseq, OFTrue); else result = EC_MemoryExhausted; } if (dseq) dseq->insert(ditem); if (opt_replaceMode) delete dataset->remove(DCM_PresentationLUTShape); break; case LUT_VOI: if (!opt_replaceMode) { // search existing sequence DcmStack stack; if (EC_Normal == dataset->search(DCM_VOILUTSequence, stack, ESM_fromHere, OFFalse)) dseq=(DcmSequenceOfItems *)stack.top(); } if (dseq == NULL) { dseq = new DcmSequenceOfItems(DCM_VOILUTSequence); if (dseq) dataset->insert(dseq, OFTrue); else result = EC_MemoryExhausted; } if (dseq) dseq->insert(ditem); if (opt_replaceMode) { delete dataset->remove(DCM_WindowCenter); delete dataset->remove(DCM_WindowWidth); delete dataset->remove(DCM_WindowCenterWidthExplanation); } break; } } if (result != EC_Normal) { OFLOG_FATAL(dcmmklutLogger, "Error while adding LUT to image dataset. Bailing out."); return 1; } OFLOG_INFO(dcmmklutLogger, "writing DICOM file ..."); result = fileformat->saveFile(opt_outName, Xfer); if (result.bad()) { OFLOG_FATAL(dcmmklutLogger, result.text() << ": writing file: " << opt_outName); return 1; } } return 0; } /* * CVS/RCS Log: * $Log: dcmmklut.cc,v $ * Revision 1.47 2010-12-15 17:03:38 joergr * Added missing prefix "ios::" to I/O manipulator "fixed" (reported on HP-UX). * * Revision 1.46 2010-10-20 07:41:36 uli * Made sure isalpha() & friends are only called with valid arguments. * * Revision 1.45 2010-10-14 13:13:44 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.44 2009-11-24 14:12:56 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.43 2009-02-27 11:46:11 joergr * Added new command line option --word-align which was previously the default * for all bit values. * Changed behavior of option --byte-align which previously implied --bits 8. * Instead, --bits 8 now implies --byte-align (if not specified manually). * * Revision 1.42 2008-09-25 16:30:24 joergr * Added support for printing the expanded command line arguments. * Always output the resource identifier of the command line tool in debug mode. * * Revision 1.41 2006/08/15 16:57:01 meichel * Updated the code in module dcmpstat to correctly compile when * all standard C++ classes remain in namespace std. * * Revision 1.40 2006/07/27 14:34:40 joergr * Changed parameter "exclusive" of method addOption() from type OFBool into an * integer parameter "flags". Prepended prefix "PF_" to parseLine() flags. * Option "--help" is no longer an exclusive option by default. * * Revision 1.39 2005/12/08 15:46:03 meichel * Changed include path schema for all DCMTK header files * * Revision 1.38 2005/11/28 15:29:05 meichel * File dcdebug.h is not included by any other header file in the toolkit * anymore, to minimize the risk of name clashes of macro debug(). * * Revision 1.37 2004/02/04 15:44:38 joergr * Removed acknowledgements with e-mail addresses from CVS log. * * Revision 1.36 2003/09/03 16:01:01 meichel * Fixed bug in command line evaluation * * Revision 1.35 2003/04/14 14:28:02 meichel * Added explicit typecasts in calls to pow(). Needed by Visual C++ .NET 2003. * * Revision 1.34 2002/12/04 10:41:33 meichel * Changed toolkit to use OFStandard::ftoa instead of sprintf for all * double to string conversions that are supposed to be locale independent * * Revision 1.33 2002/11/27 15:47:48 meichel * Adapted module dcmpstat to use of new header file ofstdinc.h * * Revision 1.32 2002/11/26 08:44:25 meichel * Replaced all includes for "zlib.h" with * to avoid inclusion of zlib.h in the makefile dependencies. * * Revision 1.31 2002/09/23 18:26:05 joergr * Added new command line option "--version" which prints the name and version * number of external libraries used (incl. preparation for future support of * 'config.guess' host identifiers). * * Revision 1.30 2002/08/20 12:21:52 meichel * Adapted code to new loadFile and saveFile methods, thus removing direct * use of the DICOM stream classes. * * Revision 1.29 2002/05/02 14:10:03 joergr * Added support for standard and non-standard string streams (which one is * supported is detected automatically via the configure mechanism). * * Revision 1.28 2002/04/16 14:01:25 joergr * Added configurable support for C++ ANSI standard includes (e.g. streams). * * Revision 1.27 2001/11/28 13:58:42 joergr * Check return value of DcmItem::insert() statements where appropriate to * avoid memory leaks when insert procedure fails. * * Revision 1.26 2001/11/09 16:06:03 joergr * Renamed some of the getValue/getParam methods to avoid ambiguities reported * by certain compilers. * * Revision 1.25 2001/09/28 13:47:36 joergr * Added check whether ios::nocreate exists. * * Revision 1.24 2001/09/26 15:36:00 meichel * Adapted dcmpstat to class OFCondition * * Revision 1.23 2001/06/07 14:34:08 joergr * Removed comment. * * Revision 1.21 2001/06/01 15:50:06 meichel * Updated copyright header * * Revision 1.20 2000/12/12 16:45:35 meichel * Minor changes to keep gcc 2.7.x on SunOS 4.1.3 happy * * Revision 1.19 2000/12/11 18:18:09 joergr * Added explicit typecast to keep SunCC 2.0.1 quiet. * * Revision 1.18 2000/10/16 12:26:05 joergr * Added new feature: create inverse GSDF (useful for printer output). * * Revision 1.17 2000/07/04 16:09:22 joergr * Added new option to command line tool allowing to specify the 'seed' value * for the random-number generator. * * Revision 1.16 2000/06/09 10:22:25 joergr * Added new commandline option allowing to mix-up the LUT entries based on * a random-number generator (useful to test correct implementation of LUTs). * * Revision 1.15 2000/05/30 14:02:43 joergr * Corrected typo/formatting. * * Revision 1.14 2000/03/08 16:28:41 meichel * Updated copyright header. * * Revision 1.13 2000/03/07 16:17:11 joergr * Added explicit type casts to make Sun CC 2.0.1 happy. * * Revision 1.12 2000/03/06 18:21:44 joergr * Avoid empty statement in the body of if-statements (MSVC6 reports warnings). * * Revision 1.11 2000/03/03 14:13:24 meichel * Implemented library support for redirecting error messages into memory * instead of printing them to stdout/stderr for GUI applications. * * Revision 1.10 2000/02/02 14:38:24 joergr * Removed space characters before preprocessor directives. * * Revision 1.9 1999/10/18 10:21:31 joergr * Enlarged string buffer for output text file header. * * Revision 1.8 1999/10/15 09:35:05 joergr * Enhanced checking mechanism for input text files. * * Revision 1.7 1999/10/14 20:21:29 joergr * Fixed problems with MSVC. * * Revision 1.6 1999/10/14 19:08:48 joergr * Merged command line tool 'dconvmap' into 'dcmmklut' and enhanced its * facilities (e.g. integrated new polynomial curve fitting algorithm). * * Revision 1.5 1999/07/28 11:21:07 meichel * New options in dcmmklut: * - creation of LUTs with 65536 entries * - creation of LUT data with VR=OW, US or SS * - creation of LUT descriptor with VR=US or SS * * Revision 1.4 1999/05/04 15:27:22 meichel * Minor code purifications to keep gcc on OSF1 quiet. * * Revision 1.3 1999/05/03 14:16:37 joergr * Minor code purifications to keep Sun CC 2.0.1 quiet. * * Revision 1.2 1999/04/28 15:45:05 meichel * Cleaned up module dcmpstat apps, adapted to new command line class * and added short documentation. * * Revision 1.1 1998/12/14 16:05:48 meichel * Added sample application that creates Modality and VOI LUTs * with gamma curve characteristics. * * Revision 1.1 1998/11/27 14:50:19 meichel * Initial Release. * */ dcmtk-3.6.0/dcmpstat/data/0000755000310500011400000000000011511320677014572 5ustar joergrdicom3dcmtk-3.6.0/dcmpstat/data/Makefile.in0000644000310500011400000000071210721573751016644 0ustar joergrdicom3# # Makefile for dcmpstat/data # @SET_MAKE@ SHELL = /bin/sh srcdir = @srcdir@ top_srcdir = @top_srcdir@ configdir = @top_srcdir@/@configdir@ include $(configdir)/@common_makefile@ files = philips.lut all: install: $(configdir)/mkinstalldirs $(DESTDIR)$(datadir) for file in $(files); do \ $(INSTALL_DATA) $$file $(DESTDIR)$(datadir) ;\ done clean: rm -f $(objs) $(progs) $(TRASH) distclean: rm -f $(objs) $(progs) $(DISTTRASH) dependencies: dcmtk-3.6.0/dcmpstat/data/philips.lut0000644000310500011400000001024110721573751016773 0ustar joergrdicom3# Philips Medical Systems Presentation LUT # Difference between GSDF and Philips Standard Display Curve # y = 523.31018 * (1 - exp(-x * 0.0026257106)), with x = 0..255 # number of entries (x,y) count 256 # maximum x value (optional) #xMax 255 # maximum y value (optional) #yMax 255 # table data # x y 0 0 1 1.372258721 2 2.740919014 3 4.105990316 4 5.467482036 5 6.825403563 6 8.179764257 7 9.530573457 8 10.87784048 9 12.2215746 10 13.5617851 11 14.8984812 12 16.23167214 13 17.56136709 14 18.88757523 15 20.21030569 16 21.52956761 17 22.84537007 18 24.15772214 19 25.46663288 20 26.7721113 21 28.07416642 22 29.37280719 23 30.66804259 24 31.95988153 25 33.24833293 26 34.53340566 27 35.81510859 28 37.09345055 29 38.36844037 30 39.64008681 31 40.90839867 32 42.17338467 33 43.43505354 34 44.69341397 35 45.94847466 36 47.20024423 37 48.44873134 38 49.69394458 39 50.93589254 40 52.17458378 41 53.41002684 42 54.64223024 43 55.87120247 44 57.09695201 45 58.31948731 46 59.5388168 47 60.75494888 48 61.96789194 49 63.17765434 50 64.38424442 51 65.58767049 52 66.78794087 53 67.98506381 54 69.17904758 55 70.36990041 56 71.5576305 57 72.74224605 58 73.92375522 59 75.10216616 60 76.27748699 61 77.44972582 62 78.61889072 63 79.78498977 64 80.94803099 65 82.1080224 66 83.26497201 67 84.41888779 68 85.5697777 69 86.71764966 70 87.8625116 71 89.00437141 72 90.14323695 73 91.27911609 74 92.41201665 75 93.54194644 76 94.66891326 77 95.79292486 78 96.91398901 79 98.03211343 80 99.14730583 81 100.2595739 82 101.3689253 83 102.4753677 84 103.5789087 85 104.6795559 86 105.777317 87 106.8721994 88 107.9642107 89 109.0533585 90 110.1396503 91 111.2230935 92 112.3036956 93 113.3814641 94 114.4564064 95 115.52853 96 116.5978421 97 117.6643502 98 118.7280617 99 119.7889838 100 120.8471239 101 121.9024892 102 122.9550871 103 124.0049249 104 125.0520096 105 126.0963487 106 127.1379492 107 128.1768183 108 129.2129633 109 130.2463912 110 131.2771091 111 132.3051243 112 133.3304437 113 134.3530745 114 135.3730237 115 136.3902983 116 137.4049053 117 138.4168517 118 139.4261446 119 140.4327908 120 141.4367973 121 142.4381711 122 143.436919 123 144.4330479 124 145.4265647 125 146.4174762 126 147.4057893 127 148.3915107 128 149.3746474 129 150.355206 130 151.3331933 131 152.3086161 132 153.281481 133 154.2517949 134 155.2195643 135 156.1847959 136 157.1474965 137 158.1076726 138 159.0653309 139 160.0204779 140 160.9731203 141 161.9232646 142 162.8709174 143 163.8160852 144 164.7587745 145 165.6989918 146 166.6367436 147 167.5720364 148 168.5048766 149 169.4352707 150 170.363225 151 171.2887459 152 172.2118399 153 173.1325133 154 174.0507724 155 174.9666237 156 175.8800733 157 176.7911276 158 177.6997929 159 178.6060754 160 179.5099814 161 180.4115171 162 181.3106888 163 182.2075025 164 183.1019647 165 183.9940812 166 184.8838585 167 185.7713024 168 186.6564193 169 187.5392152 170 188.4196961 171 189.2978682 172 190.1737374 173 191.04731 174 191.9185917 175 192.7875888 176 193.6543071 177 194.5187526 178 195.3809313 179 196.2408492 180 197.0985121 181 197.953926 182 198.8070968 183 199.6580304 184 200.5067325 185 201.3532092 186 202.1974661 187 203.0395092 188 203.8793443 189 204.716977 190 205.5524133 191 206.3856588 192 207.2167193 193 208.0456006 194 208.8723083 195 209.6968482 196 210.5192259 197 211.3394471 198 212.1575175 199 212.9734427 200 213.7872283 201 214.59888 202 215.4084032 203 216.2158037 204 217.021087 205 217.8242586 206 218.6253241 207 219.424289 208 220.2211588 209 221.0159389 210 221.808635 211 222.5992523 212 223.3877965 213 224.1742729 214 224.958687 215 225.7410441 216 226.5213496 217 227.299609 218 228.0758276 219 228.8500107 220 229.6221638 221 230.392292 222 231.1604007 223 231.9264953 224 232.6905809 225 233.452663 226 234.2127466 227 234.9708371 228 235.7269397 229 236.4810596 230 237.2332019 231 237.983372 232 238.7315749 233 239.4778158 234 240.2220999 235 240.9644323 236 241.7048181 237 242.4432624 238 243.1797702 239 243.9143468 240 244.6469971 241 245.3777262 242 246.1065392 243 246.833441 244 247.5584367 245 248.2815312 246 249.0027296 247 249.7220368 248 250.4394578 249 251.1549976 250 251.868661 251 252.580453 252 253.2903784 253 253.9984423 254 254.7046494 255 255.4090047 # eofdcmtk-3.6.0/dcmpstat/data/CMakeLists.txt0000644000310500011400000000012010722574354017331 0ustar joergrdicom3# declare installation files INSTALL_FILES(${INSTALL_DATDIR} FILES philips.lut) dcmtk-3.6.0/dcmpstat/etc/0000755000310500011400000000000011511320677014434 5ustar joergrdicom3dcmtk-3.6.0/dcmpstat/etc/printers.cfg0000644000310500011400000003710611455576275017010 0ustar joergrdicom3# # Copyright (C) 1998-2010, 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 et al. # # Purpose: This file contains sample configurations for the DICOMscope # Print SCP. Some of the sample configurations attempt to "emulate" # as good as possible the capabilities of existing DICOM printers # such as AGFA Drystar 3000, Kodak/Imation 8700/9410 etc. # The configurations can also be used for the DICOMscope Print SCU. # # This is not a complete configuration file; use the template from # dcmpstat.cfg (DICOMscope.cfg in the DICOMscope release) and copy/ # paste individual printer configurations into that template. # # Last Update: $Author: joergr $ # Update Date: $Date: 2010-10-14 12:51:09 $ # CVS/RCS Revision: $Revision: 1.3 $ # Status: $State: Exp $ # # ---------------------------------------------------------------------------- # Print SCP that supports most options of the DICOM Print protocol and # the IHE technical framework requirements for Print Server actors: # - supports Presentation LUT and 12-bit image transmission # - layouts: 1x1, 1x2, 2x2, 2x3, 3x3, 3x4, 3x5, 4x4, 4x5 # - supports typical defined terms for empty image density, film # destination, film size ID, magnification type, medium type, resolution # ID, requested decimate/crop behaviour, image size and trim. # ---------------------------------------------------------------------------- [IHEFULL] Aetitle = IHEFULL Description = IHE Full Print SCP Hostname = localhost Port = 10005 Type = LOCALPRINTER BorderDensity = 150\20\BLACK\WHITE DisableNewVRs = false DisplayFormat=1,1\1,2\2,2\2,3\3,3\3,4\3,5\4,4\4,5 EmptyImageDensity = 20\BLACK\WHITE FilmDestination = MAGAZINE\PROCESSOR\BIN_1\BIN_2 FilmSizeID = 8INX10IN\10INX12IN\10INX14IN\11INX14IN\14INX14IN\14INX17IN\24CMX24CM\24CMX30CM ImplicitOnly = false MagnificationType = REPLICATE\BILINEAR\CUBIC\NONE MaxDensity = 320 MaxPDU = 32768 MediumType = PAPER\CLEAR FILM\BLUE FILM MinDensity = 20 OmitSOPClassUIDFromCreateResponse = false PresentationLUTMatchRequired = false PresentationLUTinFilmSession = false ResolutionID = STANDARD\HIGH SmoothingType = NONE Supports12Bit = true SupportsDecimateCrop = true SupportsImageSize = true SupportsPresentationLUT = true SupportsTrim = true # ---------------------------------------------------------------------------- # Print SCP that only supports the absolute minimum that is required by # the IHE technical framework for Print Server actors: # - supports Presentation LUT and 12-bit image transmission # - supports STANDARD\1,1 layout only # ---------------------------------------------------------------------------- [IHERESTRICTED] Aetitle = IHERESTRICTED Description = IHE Restricted Print SCP Hostname = localhost Port = 10006 Type = LOCALPRINTER DisableNewVRs = true DisplayFormat=1,1 FilmDestination = STOREDPRINT FilmSizeID = 8INX10IN\11INX14IN\14INX17IN ImplicitOnly = true MagnificationType = REPLICATE\BILINEAR\CUBIC\NONE MaxDensity = 320 MaxPDU = 16384 MediumType = STOREDPRINT OmitSOPClassUIDFromCreateResponse = true PresentationLUTMatchRequired = true PresentationLUTinFilmSession = false Supports12Bit = true SupportsPresentationLUT = true # ---------------------------------------------------------------------------- # Print SCP that emulates (as good as possible) an AGFA Drystar 3000 # with Presentation LUT support # as shown at the RSNA InfoRAD 1999 DICOM Display Consistency Demo # ---------------------------------------------------------------------------- [AGFA] hostname = localhost type = LOCALPRINTER description = AGFA Drystar 3000 # The original AGFA Drystar 3000 accepts associations on Port 104, # but we use something different for the simulation. port = 10008 # This is the AETITLE Agfa uses aetitle = AGFA_DI3000 # Setting probably doesn't matter anyway DisableNewVRs = true # The standard Drystar 3000 (as of 1999) does not support Presentation LUT; # however, we're working with a non-standard model (as shown at RSNA 1999) # that does support Presentation LUT. This model, however, requires # the Presentation LUT to be referenced on Film Session level instead of # Film Box level. SupportsPresentationLUT = true PresentationLUTinFilmSession = true PresentationLUTMatchRequired = true # not properly documented in conformance statement, but seems to work SupportsImageSize = true Supports12Bit = true SupportsDecimateCrop = false SupportsTrim = true # valid image display formats for 14INX17IN DisplayFormat=1,1\2,1\1,2\2,2\3,2\2,3\3,3\4,3\5,3\3,4\4,4\5,4\6,4\3,5\4,5\5,5\6,5\4,6\5,6 # depending on dispenser contents FilmSizeID = 8INX10IN\11INX14IN\14INX14IN\14INX17IN MediumType = PAPER\CLEAR FILM\BLUE FILM MagnificationType = REPLICATE\BILINEAR\CUBIC # The Drystar accepts any value between 0 and 140 for smoothing type, # but our emulation only supports "0" and "140" # "0" - Unsharp smoothing # "140" - Sharp (Hi-resolution) smoothing SmoothingType = 0\140 # The Drystar accepts all OD values for density, # but our emulation only supports the following choice BorderDensity = BLACK\WHITE\150 EmptyImageDensity = BLACK\WHITE\150 MaxDensity = 320\310\300\290\280\270 MinDensity = 20\25\30\35\40\45\50 # The Drystar supports annotation, but only prints the first 32 characters # of the annotation text. THE SCP EMULATION DOES NOT SUPPORT ANNOTATION! Annotation = 2\ANNOTATION # AGFA uses lots of configuration information strings... # Multiple values can be sent, separated by '\'. # These ones select a "Perception LUT" - nice for printers that don't support Presentation LUT. Configuration_1 = PERCEPTION_LUT=LINEAR Configuration_2 = PERCEPTION_LUT=KANAMORI # Both Annotation and File can range [1..6] # Allows to print a TIFF image that must be pre-loaded in the printer # into one of six pre-defined locations. Configuration_3 = ANNOTATION1=FILE1 # Same as above, but the Patient ID is printed. The Drystar 3000 allows # (0010,0020) PatientID to be present in Basic Grayscale Image Box N-SETs Configuration_4 = ANNOTATION1=PATID # allows to define a VOI Window for Basic Print (whatever that is good for...) # Window width and center must be "in range", whatever that means. Configuration_5 = WINDOW_WIDTH=256\WINDOW_CENTER=128 # ---------------------------------------------------------------------------- # Print SCP that emulates (as good as possible) a Kodak Imation 8700/9410 # with Presentation LUT support # as shown at the RSNA InfoRAD 1999 DICOM Display Consistency Demo # ---------------------------------------------------------------------------- [KODAK] hostname = localhost type = LOCALPRINTER description = Kodak 8700/9410 # The original printer accepted associations on Port 1024, # but we use something different for the simulation. port = 10009 aetitle = IMN_9410 # Setting probably doesn't matter anyway DisableNewVRs = true # The standard Kodak 8700/9410 (as of 1999) does not support Presentation LUT; # however, we're working with a non-standard model (as shown at RSNA 1999) # that does support Presentation LUT. SupportsPresentationLUT = true PresentationLUTinFilmSession = false PresentationLUTMatchRequired = true Supports12Bit = true SupportsImageSize = true SupportsDecimateCrop = false SupportsTrim = true # This list of values is incomplete but should do for testing purposes DisplayFormat=1,1\1,2\2,2\2,3\3,3\3,4\3,5\4,4\4,5 FilmSizeID = 8INX10IN\11INX14IN\14INX17IN\CURRENT MediumType = CLEAR FILM\BLUE FILM\CURRENT MagnificationType = REPLICATE\BILINEAR\CUBIC\NONE SmoothingType = 0\1\2\3\4\5\6\7\8\9\10\11\12\13\14\15 BorderDensity = BLACK\WHITE MaxDensity = 320\310\300\290\280\270 MinDensity = 20\25\30\35\40\45\50 # The Kodak printer supports annotation. THE SCP EMULATION DOES NOT! Annotation = 0\LABEL # Configuration Information can be used to select a # Perception LUT Curve Shape 0..15 Configuration_1 = CS000 Configuration_2 = CS001 Configuration_3 = CS002 Configuration_4 = CS003 Configuration_5 = CS004 Configuration_6 = CS005 Configuration_7 = CS006 Configuration_8 = CS007 Configuration_9 = CS008 Configuration_10= CS009 Configuration_11= CS010 Configuration_12= CS011 Configuration_13= CS012 Configuration_14= CS013 Configuration_15= CS014 Configuration_16= CS015 # ---------------------------------------------------------------------------- # Print SCP that emulates (as good as possible) a Merge APS with # Presentation LUT support and attached Fuji camera # as shown at the RSNA InfoRAD 1999 DICOM Display Consistency Demo # ---------------------------------------------------------------------------- [MERGE_APS] hostname = localhost type = LOCALPRINTER description = MERGE_APS # The original printer accepted associations on Port 1114, # but we use something different for the simulation. port = 10010 aetitle = MERGE_APS Supports12Bit = true # Setting probably doesn't matter anyway DisableNewVRs = true # The standard Merge APS (as of 1999) does not support Presentation LUT; # however, we're working with a non-standard model (as shown at RSNA 1999) # that does support Presentation LUT. SupportsPresentationLUT = true # This list of values is incomplete but should do for testing purposes DisplayFormat=1,1\1,2\2,2\2,3\3,3\3,4\3,5\4,4\4,5 # ---------------------------------------------------------------------------- # Print SCP that emulates (as good as possible) an AYCAN DICOM paper printer # with limited presentation LUT support (IDENTITY only) # as shown at the RSNA InfoRAD 1999 DICOM Display Consistency Demo # ---------------------------------------------------------------------------- [AYCAN] hostname = localhost type = LOCALPRINTER description = Aycan DICOM Print Server # The original printer accepted associations on Port 2137, # (a value that is configurable anyway) # but we use something different for the simulation. port = 10011 aetitle = AYCAN # Setting probably doesn't matter anyway DisableNewVRs = true # we're working with a non-standard model that supports P-LUT. # The standard AYCAN DICOM paper printer (as of 1999) does not support # Presentation LUT; however, we're working with a non-standard model # (as shown at RSNA 1999) that does support Presentation LUT. SupportsPresentationLUT = true PresentationLUTinFilmSession = false PresentationLUTMatchRequired = true Supports12Bit = true SupportsImageSize = false SupportsDecimateCrop = false SupportsTrim = false # The Aycan printer supports all layouts with rows <= 10 and columns <= 10 # We define only the most reasonable combinations DisplayFormat=1,1\1,2\2,2\2,3\3,3\3,4\3,5\4,4\4,5\5,6\8,10\10,10 FilmSizeID = 8INX10IN\10INX12IN MediumType = PAPER MagnificationType = REPLICATE BorderDensity = WHITE EmptyImageDensity = WHITE # The Aycan printer uses the film session label for annotation SessionLabelAnnotation = true # the config info string must begin with "aycan print" followed by one or more # settings separated by space characters. No space characters in strings allowed, use '_' # "G=" gamma correction, value must be [0..2] # "Ix=" print string (max 64 chars) in 1st/2nd/3rd line on top left corner # "Dx=" print string (max 64 chars) in 1st/2nd/3rd line on top right corner # "C=" PostScript compression; 0 = no compression, 1 = level 1 compression (default) # "TI=" select input papertray; 99=manual feed; default: 0 # "TO=" select input papertray; default: 0 # "AYCAN=" is used for communication with aycan DICOM package. Configuration_1 = aycan print I1=RSNA_1999_Display_Consistency_Demo I2=DICOMscope_2.0 Configuration_2 = aycan print G=0.5 Configuration_3 = aycan print G=2.0 Configuration_4 = aycan print TI=99 # ---------------------------------------------------------------------------- # Print SCP that supports most options of the DICOM Print protocol and # the IHE technical framework requirements for Print Server actors: # - supports Presentation LUT and 12-bit image transmission # - layouts: 1x1, 1x2, 2x2, 2x3, 3x3, 3x4, 3x5, 4x4, 4x5 # - supports typical defined terms for empty image density, film # destination, film size ID, magnification type, medium type, resolution # ID, requested decimate/crop behaviour, image size and trim. # This Print SCP communicates over TLS and requires peer authentication. # ---------------------------------------------------------------------------- [IHEFULL_TLS] Aetitle = IHEFULL_TLS Description = IHE Full Print SCP Hostname = localhost # in the IHE Year 2 MESA release, this printer listened on port 10005 Port = 10012 Type = LOCALPRINTER BorderDensity = 150\20\BLACK\WHITE DisableNewVRs = false DisplayFormat=1,1\1,2\2,2\2,3\3,3\3,4\3,5\4,4\4,5 EmptyImageDensity = 20\BLACK\WHITE FilmDestination = MAGAZINE\PROCESSOR\BIN_1\BIN_2 FilmSizeID = 8INX10IN\10INX12IN\10INX14IN\11INX14IN\14INX14IN\14INX17IN\24CMX24CM\24CMX30CM ImplicitOnly = false MagnificationType = REPLICATE\BILINEAR\CUBIC\NONE MaxDensity = 320 MaxPDU = 32768 MediumType = PAPER\CLEAR FILM\BLUE FILM MinDensity = 20 OmitSOPClassUIDFromCreateResponse = false PresentationLUTMatchRequired = false PresentationLUTinFilmSession = false ResolutionID = STANDARD\HIGH SmoothingType = NONE Supports12Bit = true SupportsDecimateCrop = true SupportsImageSize = true SupportsPresentationLUT = true SupportsTrim = true # TLS settings UseTLS = true CipherSuites = TLS_RSA_WITH_3DES_EDE_CBC_SHA\TLS_RSA_WITH_NULL_SHA RandomSeed = iheprt1.rnd PeerAuthentication = REQUIRE Certificate = sitecert.pem PrivateKey = sitekey.pem # ---------------------------------------------------------------------------- # Print SCP that only supports the absolute minimum that is required by # the IHE technical framework for Print Server actors: # - supports Presentation LUT and 12-bit image transmission # - supports STANDARD\1,1 layout only # This Print SCP communicates over TLS and requires peer authentication. # ---------------------------------------------------------------------------- [IHERESTRICT_TLS] Aetitle = IHERESTRICT_TLS Description = IHE Restricted Print SCP Hostname = localhost Port = 10013 Type = LOCALPRINTER DisableNewVRs = true DisplayFormat=1,1 FilmDestination = STOREDPRINT FilmSizeID = 8INX10IN\11INX14IN\14INX17IN ImplicitOnly = true MagnificationType = REPLICATE\BILINEAR\CUBIC\NONE MaxDensity = 320 MaxPDU = 16384 MediumType = STOREDPRINT OmitSOPClassUIDFromCreateResponse = true PresentationLUTMatchRequired = true PresentationLUTinFilmSession = false Supports12Bit = true SupportsPresentationLUT = true # TLS settings UseTLS = true CipherSuites = TLS_RSA_WITH_3DES_EDE_CBC_SHA\TLS_RSA_WITH_NULL_SHA RandomSeed = iheprt2.rnd PeerAuthentication = REQUIRE Certificate = sitecert.pem PrivateKey = sitekey.pem # ---------------------------------------------------------------------------- # Print SCU configuration for communication with OFFIS DCMPRINT print server # as of 2003-08-27 (3.5.2 plus extensions) # ---------------------------------------------------------------------------- [DCMPRINT] Aetitle = PS Print Server Description = DCMPRINT Print SCP at localhost Hostname = localhost Port = 3100 Type = PRINTER DisableNewVRs = false ImplicitOnly = false FilmDestination = MAGAZINE MagnificationType = BILINEAR MediumType = PAPER # DCMPRINT supports any format, this is just an arbitrary choice DisplayFormat=1,1\1,2\2,2\2,3\3,3\3,4\3,5\4,4\4,5 # film sizes can be configured in DCMPRINT FilmSizeID = A4\8INX10IN\11INX14IN\14INX17IN # max density depends on the characteristic curve of the printer # which can be configured in DCMPRINT MaxDensity = 300 MaxPDU = 32768 PresentationLUTMatchRequired = true PresentationLUTPreferSCPRendering = true PresentationLUTinFilmSession = false Supports12Bit = true SupportsPresentationLUT = true dcmtk-3.6.0/dcmpstat/etc/Makefile.in0000644000310500011400000000064410721573433016507 0ustar joergrdicom3# # Makefile for dcmpstat/etc # @SET_MAKE@ SHELL = /bin/sh srcdir = @srcdir@ top_srcdir = @top_srcdir@ configdir = @top_srcdir@/@configdir@ include $(configdir)/@common_makefile@ files = dcmpstat.cfg printers.cfg all: install: $(configdir)/mkinstalldirs $(DESTDIR)$(etcdir) for file in $(files); do \ $(INSTALL_DATA) $$file $(DESTDIR)$(etcdir) ;\ done clean: rm -f $(TRASH) distclean: rm -f $(DISTTRASH) dcmtk-3.6.0/dcmpstat/etc/CMakeLists.txt0000644000310500011400000000010310312227050017153 0ustar joergrdicom3# declare installation files INSTALL_FILES(${INSTALL_ETCDIR} .cfg) dcmtk-3.6.0/dcmpstat/etc/dcmpstat.cfg0000644000310500011400000015063411455576275016763 0ustar joergrdicom3# # Copyright (C) 1998-2010, 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 et al. # # Purpose: Sample configuration file for DCMTK "dcmpstat" tools and the # DICOMscope application # # Last Update: $Author: joergr $ # Update Date: $Date: 2010-10-14 12:51:09 $ # CVS/RCS Revision: $Revision: 1.4 $ # Status: $State: Exp $ # # ============================================================================ # General settings for the viewer applications [[GENERAL]] # ============================================================================ # ---------------------------------------------------------------------------- # General application settings in this section. [APPLICATION] # ---------------------------------------------------------------------------- # Directory in which log files are stored. # Default: application root directory, for print: same as spool directory. LogDirectory = log # Name of the file where the general log messages are stored. # Default: no log file, i.e. do not write any log messages. LogFile = general.log # Filter for the general log messages: # ERROR = only error messages # WARN = also warning messages (includes ERROR) # INFO = also informational messages (includes WARN) # DEBUG = also debug messages (includes INFO) # Default: no general log messages at all. LogLevel = INFO # Port on which the GUI application accepts notification messages from # the network processes. Default: 0 (no notifications sent) MessagePort = 11000 # Indicates whether client processes are allowed to keep their notification # message port open during the lifetime of the process. Default: false KeepMessagePortOpen = false # ---------------------------------------------------------------------------- # Monitor calibration settings in this section. [MONITOR] # ---------------------------------------------------------------------------- # Settings for Clinton Medical monitor with SXGA 1152x864 # monitor description file for software based correction (GSDF etc.) #Characteristics = monitor.lut # screen resolution in pixels, width\height Resolution = 1152\864 # size of the visible screen area in mm, width\height Screensize = 400\300 # preview size in pixels, width\height PreviewSize = 256\256 # Settings for Siemens Monitor with Dome Board # # screen resolution in pixels, width\height #Resolution = 2048\2560 # # size of the visible screen area in mm, width\height #ScreenSize = 280\367 # # preview size in pixels, width\height #PreviewSize = 512\512 # ---------------------------------------------------------------------------- # General print settings in this section. [PRINT] # ---------------------------------------------------------------------------- # Path to the DICOM print spooler (Print Management SCU) application to be used Spooler = dcmprscu # Path to the DICOM print server (Print Management SCP) application to be used Server = dcmprscp # Directory in which spooled print jobs reside Directory = spool # Log complete DICOM protocol (--dump --verbose) in print spooler/server. # Default: false DetailedLog = true # Log complete ACSE and DIMSE protocol in binary form (as DICOM file). # This setting is independent from the DetailedLog setting and currently # only implemented by the print server. Default: false BinaryLog = false # Time (in seconds) the print spooler should wait before polling (again) # the spool directory. Default: use spooler default. Sleep = 5 # Minimum resolution for a print bitmap (width\height in pixel). If a # bitmap to be printed is smaller than this, it is scaled up by an # appropriate integer factor before burning in graphical annotations. This # allows to have acceptable annotation visibility on low resolution # bitmaps. # Default: No lower limit for the print bitmap resolution. MinPrintResolution = 1024\1024 # Maximum resolution for a print bitmap (width\height in pixel). If a # bitmap to be printed is larger than this, it is scaled down by an # appropriate integer factor before sent to the printer. This allows to # reduce the amount of pixel data to be transfered. # Default: No upper limit for the print bitmap resolution. MaxPrintResolution = 8192\8192 # Specifies the default value for the Illumination to be transmitted to the # printer when using the Presentation LUT SOP Class. Default: 2000 DefaultIllumination = 2000 # Specifies the default value for the Reflected Ambient Light to be transmitted # to the printer when using the Presentation LUT SOP Class. Default: 10 DefaultReflection = 10 # Delete print job files from spool directory after processing. # If false, spool jobs are renamed instead. Default is false. DeletePrintJobs = true # Always delete terminate job files from spool directory (these special print job files # are created to inform the spool processes that the application has been terminated). # If false, terminate jobs are handled like normal print jobs (see DeletePrintJobs). # Default is false. AlwaysDeleteTerminateJobs = true # ---------------------------------------------------------------------------- # Database settings in this section. [DATABASE] # ---------------------------------------------------------------------------- # directory in which DICOM images and index.dat reside Directory = database # Path to the dump tool used to display the contents of DICOM files located # in the database Dump = c:\program files\tcl\bin\wish83 dcmpsdmp.tcl # Path to the check tool used to evaluate the contents of DICOM files located # in the database Check = c:\program files\tcl\bin\wish83 dcmpschk.tcl # ---------------------------------------------------------------------------- # General Presentation LUT settings in this section. [LUT] # ---------------------------------------------------------------------------- # directory in which LUT files reside Directory = lut # ---------------------------------------------------------------------------- # General Structured Reporting (SR) settings in this section. [REPORT] # ---------------------------------------------------------------------------- # directory in which SR "template" files reside Directory = reports # ---------------------------------------------------------------------------- # This section contains the settings for network communication. [NETWORK] # ---------------------------------------------------------------------------- # Path to the DICOM sender (Store SCU) application to be used Sender = dcmpssnd # Path to the DICOM receiver (Store SCP) application to be used Receiver = dcmpsrcv # Application entity title sender processes use to identify themselves. # Also used as default application entity title for the [[communication]] # section. aetitle = DCMPSTATE # ---------------------------------------------------------------------------- # This section contains the settings for secure TLS (Transport Layer # Security) communication. [TLS] # ---------------------------------------------------------------------------- # directory in which TLS related files (certificates, keys, random data, # Diffie-Hellman parameters etc.) are located. The content of this directory # should be kept confidential because it may help an attacker to break # the security of the TLS transmission. # TLSDirectory = tls # directory in which certificates of the trusted Certification Authorities # are located. During negotiation of a secure TLS connection, the remote # site's certificate may be verified, depending on the settings for the # sender or receiver process in [[communication]]. Verification checks # if the certificate has been issued by one of the CAs located in this # directory. This means that the content of this directory defines a simple # means of access control for TLS communication. # # File names of certificates in this directory must have # names derived from a hash key of the certificate DN, see -hash # option of openssl x509 command. # CACertificateDirectory = cacerts # directory in which certificates and encrypted private keys of the known # users are located. User certificates and keys are used for the # verification of DICOM Structured Reports and for the creation of digital # signatures. # UserKeyDirectory = usrcerts # DICOMscope allows to have certificates, keys and Diffie-Hellman parameters # either in PEM ("privacy enhanced mail") format or in DER ("distinguished # encoding rules") format. However, all files within one DICOMscope # installation must use the same format, which is defined by this setting. # True => PEM format, false => DER format. Default is PEM. # UsePEMFormat = true # ---------------------------------------------------------------------------- # This section contains the settings for the query/retrieve server. [QUERY_RETRIEVE] # ---------------------------------------------------------------------------- # Specifies whether the configuration file for the query/retrieve server is # created automatically from the data contained in this file each time the # server is started. Default is true. AutoCreateConfigFile = true # Path to the DICOM query/retrieve server (Q/R SCP) to be used. # The configuration filename is created from this entry by adding the file # extension ".cfg". Server = dcmqrscp # IP Port number on which the server listens for new connections. # On Unix platforms, the receiver must be started with setuid root # if port numbers < 1024 (i.e. the standard DICOM port number 104) # should be used. Port = 10003 # Maximum PDU (protocol data unit) size to use when negotiating # incoming connections. Must be between 4096 and 131072. # Default is 16384. MaxPDU = 32768 # Application entity title dcmqrscp will use to identify itself. AETitle = DCMQRSCP # Maximum number of associations the server can handle at the same time. # This is only applicable on Unix platforms, since Windows does not support # the fork() command which is used for this purpose. MaxAssociations = 16 # Timeout (in seconds) for outgoing connection requests, must be larger # than zero. Optional setting, default is Unlimited (wait for TCP/IP timeout). # Timeout = 5 # ---------------------------------------------------------------------------- # This section contains the settings for the graphical user interface (GUI). [GUI] # ---------------------------------------------------------------------------- # If this setting is true, we assume a system with very high resolution # (2 x 2.5K) and a graphics board that performs calibration according to the # DICOM GSDF in hardware. Therefore, we display much larger icons and # disable rendering of the GSDF in software. This setting requires that # a static 256 grayscale color palette is used by the operating system # to access the graphics board. HighResolutionGraphics = false #Starts the update thread for the study browser. #Defaults is true AutoUpdateStudyBrowser = true #Sets the background color of the study manager as rgb color #Default: If HighResolutionGraphics, the default is 0\0\0 otherwise 255\255\255 #BackgroundColor = 255\255\255 # Sets the size of the fonts used in all GUI components # Default: If HighResolutionGraphics, the default is 30 otherwise 12 #FontSize = 30 # Sets the name of the fonts uesed in all GUI components # Default value: SansSerif #FontName = SansSerif # Sets the size of the fonts used for textual annotations # Default: If HighResolutionGraphics, the default is 48 otherwise 16 #FontSizeText = 16 # Sets the name of the fonts used for textual annotations # Default value: SansSerif #FontNameText = SansSerif # Sets the size of the fonts used for the process log # Default: If HighResolutionGraphics, the default is 30 otherwise 12 #FontSizeLog = 30 # Sets the name of the fonts uesed for the process log # Default value: Monospaced #FontNameLog = Monospaced # Sets the placement of the main tab in the GUI. # Valid values are: North, South, East, West. Default is North. #TabPlacement = North # Sets the placement of the image processing panel in the viewer. # Valid values are: North, South, East, West, None. # Default: If HighResolutionGraphics, the default is East otherwise South #FunctionPanelPlacement = East # Sets the placement of the paint functio panel in the viewer. # Valid values are: North, South, East, West, None, Toolbar, Integrated # Default value: Integrated #PaintPanelPlacement = Integrated # Checks if the presentation state information panel should be visible # Valid values are: true, false. Default value: false PSPanelOn = true # Displays a warning message if an unsigned instance (report, presentation # state, image) referenced from the current report is opened # Valid values are: true, false. Default value: true WarnUnsignedObjectsInSR = true # ============================================================================ # Storage and Print applications are configured in the following section. [[COMMUNICATION]] # ============================================================================ # ---------------------------------------------------------------------------- # The following text documents all settings defined for a local or remote # storage or print application. Each application or communication target # requires one section with a unique section title. # # [COMMUNICATION_PEER_1] # ---------------------------------------------------------------------------- # # The following entry defines which DICOM services are offered by the # application described in this section. Four types are supported: # # STORAGE - a remote DICOM Storage Service Class SCP. Entries of this type are # shown as "send targets" in the DICOMscope browser GUI. An entry of this # type is also required for each system that wants to download objects # from the DICOMscope database using Query/Retrieve. The settings from # this section are used to resolve an application entity title into the # target hostname and IP port number. # # RECEIVER - a local DICOM Storage Service Class SCP which accepts incoming # images and stores them in the local database. # # PRINTER - a remote DICOM Print Management Service Class SCP. # For each entry of this type, a separate Print SCU ("spooler process") # is started together with DICOMscope. # Entries of this type are shown as printers in the DICOMscope # print preview GUI. # # LOCALPRINTER - a DICOM Print Management SCP that is running as part of # the DICOMscope software on the local system. For each entry of this # type both a DICOM Print SCP and a Print SCU (spooler) are started # together with DICOMscope. This allows DICOMscope to print "to itself". # # Default value for this setting is: STORAGE. # # type = LOCALPRINTER # # ---------------------------------------------------------------------------- # # Hostname: The IP number or domain name of the communication partner in # conventional TCP/IP notation. For entries of type LOCALPRINTER this setting # must have the value "localhost". This setting is mandatory, no default. # # hostname = localhost # # ---------------------------------------------------------------------------- # # IP port number under which the application or remote peer receives DICOM # associations. # # port = 104 # # ---------------------------------------------------------------------------- # # Human readable description of the communication partner. Used in the GUI to # present the communication partner to the application user in selection boxes. # # description = Local DICOM Print SCP # # ---------------------------------------------------------------------------- # # For outgoing connections (STORAGE, PRINTER) this setting contains the # called application entity title of the communication partner. # For incoming connections (RECEIVER, LOCALPRINTER) this setting contains # the responding application entity used during association negotiation. # # aetitle = DICOM_PRINTER # # ---------------------------------------------------------------------------- # # Only negotiate the default Implicit VR Little Endian transfer syntax for # all abstract syntaxes. This setting is useful if we're communicating with # very old DICOM software which claims to support Explicit VR communication # but fails to do so... Optional setting, default is: false. # # ImplicitOnly = false # # ---------------------------------------------------------------------------- # # Do not create data types (VRs) that were defined in post-1993 editions # of the DICOM standard when converting implicit VR files to explicit VR # network transmission. Maybe necessary for old DICOM Store SCPs. # Optional setting, default is: false. # # DisableNewVRs = false # # ---------------------------------------------------------------------------- # # Maximum PDU (protocol data unit) size to negotiate for incoming PDUs. # Value must be between 4096 and 131072. Default is 16384. # # MaxPDU = 32768 # # ---------------------------------------------------------------------------- # # Timeout (in seconds) for outgoing connection requests, must be larger # than zero. Optional setting, default is Unlimited (wait for TCP/IP timeout). # # Timeout = 5 # # ---------------------------------------------------------------------------- # # Use the Transport Layer Security (TLS) protocol for image transmission # in accordance with the DICOM Security Enhancements One (Supplement 31). # Optional setting, default is: false. # # UseTLS = false # # ---------------------------------------------------------------------------- # # Filename of the X.509 certificate to be used for TLS authentication. # The file should be located in the directory specified by # GENERAL/TLS/TLSDIRECTORY. # # SCP usage: The TLS protocol requires that a TLS server # must have a certificate. Therefore, this parameter is mandatory. # If absent, the certificate file is loaded from "sitecert.pem" in the # TLS directory. # # SCU usage: For a TLS client the certificate is optional. # Therefore, this setting is optional for Store SCUs. If absent, no # TLS authentication is performed for the client. Warning: Anonymous TLS # may be susceptible to man-in-the-middle attacks. # # Certificate = cert.pem # # ---------------------------------------------------------------------------- # # Filename of the private key "matching" the certificate, # to be used for TLS authentication. The file should be located in the # directory specified by GENERAL/TLS/TLSDIRECTORY. # # SCP usage: The TLS protocol requires that a TLS server # must have a certificate. Therefore, this parameter is mandatory. # If absent, the certificate file is loaded from "sitekey.pem" in the # TLS directory. # # SCU usage: For a TLS client the certificate is optional. # Therefore, this setting is optional for Store SCUs. If absent, no # TLS authentication is performed for the client. Warning: Anonymous TLS # may be susceptible to man-in-the-middle attacks. # # PrivateKey = pkey.pem # # ---------------------------------------------------------------------------- # # Private keys may be stored in encrypted form (e.g. 3DES), # protected with a password. Since the DICOMscope Store SCU/SCP processes # do not have any interaction with the user, they cannot request a password # from the command line. Two options are available to the user: # - the private key can be unencrypted. In this case this setting should # be absent from the config file. Users should carefully adjust file system # access rights to the private key file to make sure that the private key # is not compromised (e.g. copied by an unauthorized used). # - the private key can be encrypted, with the password in clear text in this # configuration file. In this case, the DICOMscope configuration file must # be protected from read access by unauthorized users, otherwise the private # key may be compromised as well. # A real secure approach would be to keep the private key in a safe place, # e.g. in a microprocessor card, but this is not yet supported. # # PrivateKeyPassword = Should_be_kept_secret # # ---------------------------------------------------------------------------- # # Negotiate the following TLS ciphersuites when using TLS transmission. # Ciphersuite names should have the format as defined in RFC 2246, e. g.: # TLS_RSA_WITH_RC4_128_SHA # TLS_RSA_WITH_IDEA_CBC_SHA # TLS_RSA_WITH_DES_CBC_SHA # TLS_RSA_WITH_3DES_EDE_CBC_SHA # See the DCMTK documentation dcmtls/docs/ciphers.txt for a complete list of # supported terms. Multiple terms should be separated by backslash characters. # Optional setting, default is: TLS_RSA_WITH_3DES_EDE_CBC_SHA. # # CipherSuites = TLS_RSA_WITH_IDEA_CBC_SHA\TLS_RSA_WITH_3DES_EDE_CBC_SHA # # ---------------------------------------------------------------------------- # # This setting defines the policy for handling the remote peer's TLS # certificate. Known terms are: # REQUIRE: verify peer certificate, refuse transmission if absent # VERIFY: verify peer certificate if present # IGNORE: don't verify peer certificate # Optional setting, default is: REQUIRE. # # PeerAuthentication = REQUIRE # # ---------------------------------------------------------------------------- # # File containing a set of random-generated Diffie-Hellman parameters # as required for DH/DSS ciphersuites (but not for RSA ciphersuites). # File should be located in the directory specified by GENERAL/TLS/TLSDIRECTORY # in the format specified by GENERAL/TLS/USEPEMFORMAT. # Optional setting, default is: no Diffie-Hellman parameters (which will cause # TLS connection setup for DH/DSS ciphersuites to fail). # # DiffieHellmanParameters = dhparams.pem # # ---------------------------------------------------------------------------- # # File containing random data which is used to initialize the pseudo-random # generator. After transmission, a modified file is written back. # The random seed file should be different for each send/receive # target - see DCMTK documentation on random data for details. # The file should be located in the directory specified by # GENERAL/TLS/TLSDIRECTORY. # Optional setting, default is: no random data (which may cause TLS connection # setup to fail). # # RandomSeed = random.dat # # # ============================================================================ # The next two settings described below are only used with entries of type # STORAGE and RECEIVER and have no meaning for PRINTER or LOCALPRINTER. # ============================================================================ # # Receive data in "bit preserving mode". In this mode, data is stored # to file directly as read from network. Transfer syntax in file is # identical to transfer syntax used for network transmission. # If this mode is switched off (default), images are converted to explicit VR # Little Endian format before storing in file, which makes it easier # to burn images on CD-R in "General Purpose Image Exchange Profile" format. # Optional entry, default is: false # # BitPreservingMode = false # # ---------------------------------------------------------------------------- # # Silently ignore space padded SOP Class and SOP Instance UIDs in incoming # images. Optional setting, default is: false. # # CorrectUIDPadding = false # # # ============================================================================ # The remaining settings described below are only used with entries of type # PRINTER and LOCALPRINTER and have no meaning for STORAGE or RECEIVER. # ============================================================================ # # Print SCU usage: assume that the Print SCP supports transmission of image # pixel data with 12 bits/pixel in the Basic Grayscale Image Box SOP Class. # Print SCP usage: accept image pixel data with 12 bits/pixel. # Optional setting, default is: true. Not used for Storage type entries. # # Supports12Bit = true # # ---------------------------------------------------------------------------- # # Print SCU usage: assume that the Print SCP supports the Presentation LUT # SOP Class (Supplement 22) and attempt to negotiate it during association # negotiation. # Print SCP usage: activate support for the Presentation LUT SOP Class. # Optional setting, default is: false. Not used for Storage type entries. # # SupportsPresentationLUT = true # # ---------------------------------------------------------------------------- # # The 1999 edition of the DICOM standard contains an inconsistency in the # definition of the Presentation LUT SOP class. The attributes # "Referenced Presentation LUT", "Illumination" and "Reflected Ambient Light" # can either be part of the Basic Film Session or be part of the Basic Film # Box. DICOM Correction Proposal CP 173 defines that these attributes # have to be specified on Basic Film Box level. However, not all existing # Print SCPs supporting the Presentation LUT SOP Class are implemented # in accordance with CP 173. Both Print SCU and Print SCP can, therefore, # be configured to use either Film Session or Film Box (but never both). # # Print SCU usage: If flag is true, transmit attributes in the Basic Film # session instead of the Basic Film Box. # Print SCP usage: If flag is true, attributes are accepted and returned # in Basic Film Session instead of Basic Film Box. # Optional setting, default is: false (which means that behaviour will be # consistent with CP 173.) Not used for Storage type entries. # # PresentationLUTinFilmSession = false # # ---------------------------------------------------------------------------- # # Some Print SCPs which support Presentation LUTs require that the number # of entries in a Presentation LUT matches the bit depth of the image pixel # data (4096 entries for 12 bit pixel data, 256 entries for 8 bit pixel # data). # # Print SCU usage: If flag is true, assume that Print SCP requires match # between Presentation LUT and image data. If for a given print job this # match cannot be guaranteed, perform rendering of the Presentation LUT in # the Print SCU and use an IDENTITY Presentation LUT shape in the Print SCP. # Print SCP usage: If flag is true, enforce a matching rule as described # above. All Presentation LUT N-CREATE or Basic Grayscale Image Box N-SET # operations that would violate the rule will be refused. # Optional setting, default is: true. Not used for Storage type entries. # # PresentationLUTMatchRequired = true # # ---------------------------------------------------------------------------- # # Print SCU usage: if the printer supports 12-bit image transmission and the # film is to be printed with a Presentation LUT that could be rendered either # in the print client or in the printer without loss of precision, # prefer rendering in the printer. # Print SCP usage: flag is ignored. # Optional setting, default is: false. Not used for Storage type entries. # # PresentationLUTPreferSCPRendering = false # # ---------------------------------------------------------------------------- # # Some Print SCPs do not support the optional "Requested Image Size" # attribute in Basic Grayscale Image Box N-SET operations. # # Print SCU usage: If flag is false, assume that the printer does not support # requested image size, never send this attribute. # Print SCP usage: If flag is true, support requested image size. Otherwise # refuse N-SET operations containing a requested image size attribute. # Optional setting, default is: false. Not used for Storage type entries. # # SupportsImageSize = false # # ---------------------------------------------------------------------------- # # Some Print SCPs do not support the optional "Requested Decimate/Crop Behaviour" # attribute defined in Supplement 37 in Basic Grayscale Image Box N-SET # operations. # # Print SCU usage: If flag is false, assume that the printer does not support # requested decimate/crop behaviour, never send this attribute. # Print SCP usage: If flag is true, support requested decimate/crop behaviour. # Otherwise refuse N-SET operations containing this attribute. # Optional setting, default is: false. Not used for Storage type entries. # # SupportsDecimateCrop = false # # ---------------------------------------------------------------------------- # # Some Print SCPs do not support the optional "Trim" attribute # in Basic Film Box N-CREATE or N-SET operations. # # Print SCU usage: If flag is false, assume that the printer does not support # trim, never send this attribute. # Print SCP usage: If flag is true, support trim. # Otherwise refuse N-CREATE or N-SET operations containing this attribute. # Optional setting, default is: false. Not used for Storage type entries. # # SupportsTrim = true # # ---------------------------------------------------------------------------- # # Print SCU usage: this entry contains a list of all STANDARD\C,R column, row # combinations supported as Image Display Format by the Print SCP # for portrait orientation. Landscape image display formats are derived # automatically by exchanging column and row for each format. # Print SCP usage: this entry specifies all STANDARD\C,R image display formats # accepted by the Print SCP for portrait orientation. Landscape image display # formats are also derived automatically. # This is a mandatory entry, no default. # # DisplayFormat=1,1\1,2\2,2\2,3\3,3\3,4\3,5\4,4\4,5 # # ---------------------------------------------------------------------------- # # Film Size ID identifiers supported by the printer for the Basic Film Box. # Multiple values can be specified, must be separated by '\' characters. # # Print SCU usage: Optional setting, default: don't specify film size ID, # use printer default. # Print SCP usage: The first specified value is used as the default. This # is a mandatory setting for entries of type LOCALPRINTER. # # FilmSizeID = 8INX10IN\10INX12IN\10INX14IN\11INX14IN\14INX14IN\14INX17IN\24CMX24CM\24CMX30CM # # ---------------------------------------------------------------------------- # # Medium Type identifiers supported by the printer for the Basic Film Session. # Multiple values can be specified, must be separated by '\' characters. # # Print SCU usage: Optional setting, default: don't specify medium type, # use printer default. # Print SCP usage: The first specified value is used as the default. This # is a mandatory entry. # # MediumType = PAPER\CLEAR FILM\BLUE FILM # # ---------------------------------------------------------------------------- # # Requested Resolution ID identifiers supported by the printer # for the Basic Film Box (optional attribute defined in Supplement 37). # Multiple values can be specified, must be separated by '\' characters. # # Print SCU usage: Optional setting, default: don't specify resolution ID, # use printer default. # Print SCP usage: The first specified value is used as the default. This # is an optional entry. If omitted, the Print SCP does not support the # attribute and rejects N-CREATE or N-SET requests containing the attribtute. # # ResolutionID = STANDARD\HIGH # # ---------------------------------------------------------------------------- # # Magnification Type identifiers supported by the printer for the Basic # Film Box or Basic Grayscale Image Box. Multiple values can be specified, # must be separated by '\' characters. # # Print SCU usage: Optional setting, default: don't specify magnification type, # use printer default. # Print SCP usage: The first specified value is used as the default. This # is a mandatory entry. # # MagnificationType = REPLICATE\BILINEAR\CUBIC\NONE # # ---------------------------------------------------------------------------- # # Smoothing Type identifiers supported by the printer for the Basic Film # Box or Image Box. Multiple values can be specified, must be separated by # '\' characters. # # Print SCU usage: Optional setting, default: don't specify smoothing type, # use printer default. # Print SCP usage: The first specified value is used as the default. This # is an optional entry. If omitted, the Print SCP does not support the # attribute and rejects N-CREATE or N-SET requests containing the attribtute. # # SmoothingType = NONE # # ---------------------------------------------------------------------------- # # Border Density identifiers supported by the printer for the Basic Film # Box. Multiple values can be specified, must be separated by '\' # characters. # # Print SCU usage: Optional setting, default: don't specify border density, # use printer default. # Print SCP usage: If any of the identifiers is numeric, then all numbers # are accepted. The first specified value is used as the default. This is # an optional entry. If omitted, the Print SCP does not support the # attribute and rejects N-CREATE or N-SET requests containing the # attribtute. # # BorderDensity = BLACK\WHITE\150 # # ---------------------------------------------------------------------------- # # Empty Image Density identifiers supported by the printer for the Basic # Film Box. Multiple values can be specified, must be separated by '\' # characters. # # Print SCU usage: Optional setting, default: don't specify empty image # density, use printer default. # Print SCP usage: If any of the identifiers is numeric, then all numbers # are accepted. The first specified value is used as the default. This is # an optional entry. If omitted, the Print SCP does not support the # attribute and rejects N-CREATE or N-SET requests containing the # attribtute. # # EmptyImageDensity = BLACK\WHITE\150 # # ---------------------------------------------------------------------------- # # Print SCU usage: Max Density values supported by the printer for the # Basic Film Box. Multiple values can be specified, must be separated by # '\' characters. Optional setting, default: don't specify max density # density, use printer default. # Print SCP usage: only the first value is read and defines the default max # density that is used when the Print SCU does not specify max density. # This is a mandatory entry. # # MaxDensity = 320\310\300\290\280\270 # # ---------------------------------------------------------------------------- # # Print SCU usage: Min Density values supported by the printer for the # Basic Film Box. Multiple values can be specified, must be separated by # '\' characters. Optional setting, default: don't specify min density # density, use printer default. # Print SCP usage: only the first value is read and defines the default min # density that is used when the Print SCU does not specify min density. # This is an optional entry. If omitted, the Print SCP does not support the # attribute and rejects N-CREATE or N-SET requests containing the # attribtute. # # MinDensity = 20\25\30\35\40\45\50 # # ---------------------------------------------------------------------------- # # The DICOMscope application provides limited support for the Basic # Annotation Box SOP Class. When printing on printers supporting # Annotation, a single annotation can be specified for each print job. This # setting defines the annotation display format ID and annotation position # that are used when creating the annotation. # # Print SCU usage: Two values must be specified: First the Annotation # Position, then the Annotation Display Format ID, separated by '\'. This # is an optional setting, default is not to use Basic Annotation Box. # Print SCP usage: The Print SCP component does not support the Basic # Annotation Box SOP Class. This setting should be omitted for all entries # of type LOCALPRINTER. # # Annotation = 1\ANNOTATION # # ---------------------------------------------------------------------------- # # Some printers use the Film Session Label as a replacement for annotations. # # Print SCU usage: If flag is true, any annotation defined in the user # interface is replicated in the Film Session Label attribute of the Basic # Film Session. This is an optional setting, default is: false. # Print SCP usage: Ignored. This setting should be omitted for all entries # of type LOCALPRINTER. # # SessionLabelAnnotation = false # # ---------------------------------------------------------------------------- # # Configuration Information that can be sent to the printer for the Basic # Film Box or Image Box. Only a single value per entry can be specified # because values may contain backslash characters. (VR=ST). Keywords are # "Configuration_1", "Configuration_2", etc., without leading zeroes. # # Print SCU usage: These are optional settings, default is not to use # configuration information. # Print SCP usage: These are optional settings. If omitted, the Print # SCP does not support the attribute and rejects N-CREATE or N-SET requests # containing the attribtute. The Print SCP default for Configuration # Information is always an empty string. # # Configuration_1 = Configuration Value 1 # Configuration_2 = Configuration Value 2 # # ---------------------------------------------------------------------------- # # Film Destination identifiers supported by the Print SCP for the Basic # Film Session. Multiple values can be specified, must be separated by '\' # characters. # # Print SCU usage: ignored. # Print SCP usage: The first specified value is used as the default. This # is a mandatory entry. # # FilmDestination = MAGAZINE\PROCESSOR\BIN_1\BIN_2 # # ---------------------------------------------------------------------------- # # The Affected SOP Class UID attribute is optional in DIMSE N-CREATE-RSP # messages but some clients rely on its presence. This setting can be used # to test client behaviour. # # Print SCU usage: ignored. # Print SCP usage: Defines whether the Print SCP should include Affected SOP # Class UID in DIMSE N-CREATE-RSP messages. This is an optional setting, # default is false. # # OmitSOPClassUIDFromCreateResponse = false # # ---------------------------------------------------------------------------- # ---------------------------------------------------------------------------- # # We define three send targets: # One is a standard Store SCP which accepts conventional # DICOM associations on port 10004, the others accept TLS secured DICOM # associations on port 10007, with different ciphersuites. # # # ---------------------------------------------------------------------------- # ---------------------------------------------------------------------------- [STORE_1] # ---------------------------------------------------------------------------- Type = STORAGE Aetitle = STORESCP Description = Hostname, unsecure transmission Hostname = Hostname MaxPDU = 32768 Port = 10004 ImplicitOnly = false DisableNewVRs = false # ---------------------------------------------------------------------------- [STORE_2] # ---------------------------------------------------------------------------- Type = STORAGE Aetitle = STORESCP Description = Hostname, TLS transmission, no encryption Hostname = Hostname MaxPDU = 32768 Port = 10007 ImplicitOnly = false DisableNewVRs = false UseTLS = true CipherSuites = TLS_RSA_WITH_NULL_SHA RandomSeed = store2.rnd PeerAuthentication = REQUIRE Certificate = sitecert.pem PrivateKey = sitekey.pem # ---------------------------------------------------------------------------- [STORE_3] # ---------------------------------------------------------------------------- Type = STORAGE Aetitle = STORESCP Description = Hostname, TLS transmission, 3DES encryption Hostname = Hostname MaxPDU = 32768 Port = 10007 ImplicitOnly = false DisableNewVRs = false UseTLS = true CipherSuites = TLS_RSA_WITH_3DES_EDE_CBC_SHA RandomSeed = store3.rnd PeerAuthentication = REQUIRE Certificate = sitecert.pem PrivateKey = sitekey.pem # ---------------------------------------------------------------------------- # # We support two types of receivers: # One is a standard Store SCP which accepts conventional # DICOM associations on port 10004, the other one accepts TLS secured DICOM # associations on port 10007. # # ---------------------------------------------------------------------------- # ---------------------------------------------------------------------------- [RECEIVE_1] # ---------------------------------------------------------------------------- Type = RECEIVER Aetitle = STORESCP1 Description = Standard receiver at port 10004 Hostname = localhost MaxPDU = 32768 Port = 10004 ImplicitOnly = false DisableNewVRs = false BitPreservingMode = false # ---------------------------------------------------------------------------- [RECEIVE_2] # We accept TLS_RSA_WITH_3DES_EDE_CBC_SHA and TLS_RSA_WITH_NULL_SHA # connections, default is 3DES. We require that the client authenticates # with a certificate issued by a Certification Authority that we trust. # ---------------------------------------------------------------------------- Type = RECEIVER Aetitle = STORESCP2 Description = Secure TLS receiver at port 10007 Hostname = localhost MaxPDU = 32768 Port = 10007 ImplicitOnly = false DisableNewVRs = false BitPreservingMode = false UseTLS = true CipherSuites = TLS_RSA_WITH_3DES_EDE_CBC_SHA\TLS_RSA_WITH_NULL_SHA RandomSeed = receiver.rnd PeerAuthentication = REQUIRE Certificate = sitecert.pem PrivateKey = sitekey.pem # ---------------------------------------------------------------------------- # Print SCP that supports most options of the DICOM Print protocol and # the IHE technical framework requirements for Print Server actors: # - supports Presentation LUT and 12-bit image transmission # - layouts: 1x1, 1x2, 2x2, 2x3, 3x3, 3x4, 3x5, 4x4, 4x5 # - supports typical defined terms for empty image density, film # destination, film size ID, magnification type, medium type, resolution # ID, requested decimate/crop behaviour, image size and trim. # ---------------------------------------------------------------------------- [IHEFULL] Aetitle = IHEFULL Description = IHE Full Print SCP Hostname = localhost Port = 10005 Type = LOCALPRINTER BorderDensity = 150\20\BLACK\WHITE DisableNewVRs = false DisplayFormat=1,1\1,2\2,2\2,3\3,3\3,4\3,5\4,4\4,5 EmptyImageDensity = 20\BLACK\WHITE FilmDestination = MAGAZINE\PROCESSOR\BIN_1\BIN_2 FilmSizeID = 8INX10IN\10INX12IN\10INX14IN\11INX14IN\14INX14IN\14INX17IN\24CMX24CM\24CMX30CM ImplicitOnly = false MagnificationType = REPLICATE\BILINEAR\CUBIC\NONE MaxDensity = 320 MaxPDU = 32768 MediumType = PAPER\CLEAR FILM\BLUE FILM MinDensity = 20 OmitSOPClassUIDFromCreateResponse = false PresentationLUTMatchRequired = false PresentationLUTinFilmSession = false ResolutionID = STANDARD\HIGH SmoothingType = NONE Supports12Bit = true SupportsDecimateCrop = true SupportsImageSize = true SupportsPresentationLUT = true SupportsTrim = true # ---------------------------------------------------------------------------- # Print SCP that only supports the absolute minimum that is required by # the IHE technical framework for Print Server actors: # - supports Presentation LUT and 12-bit image transmission # - supports STANDARD\1,1 layout only # ---------------------------------------------------------------------------- [IHERESTRICTED] Aetitle = IHERESTRICTED Description = IHE Restricted Print SCP Hostname = localhost Port = 10006 Type = LOCALPRINTER DisableNewVRs = true DisplayFormat=1,1 FilmDestination = STOREDPRINT FilmSizeID = 8INX10IN\11INX14IN\14INX17IN ImplicitOnly = true MagnificationType = REPLICATE\BILINEAR\CUBIC\NONE MaxDensity = 320 MaxPDU = 16384 MediumType = STOREDPRINT OmitSOPClassUIDFromCreateResponse = true PresentationLUTMatchRequired = true PresentationLUTinFilmSession = false Supports12Bit = true SupportsPresentationLUT = true # ---------------------------------------------------------------------------- # Print SCP that supports most options of the DICOM Print protocol and # the IHE technical framework requirements for Print Server actors: # - supports Presentation LUT and 12-bit image transmission # - layouts: 1x1, 1x2, 2x2, 2x3, 3x3, 3x4, 3x5, 4x4, 4x5 # - supports typical defined terms for empty image density, film # destination, film size ID, magnification type, medium type, resolution # ID, requested decimate/crop behaviour, image size and trim. # This Print SCP communicates over TLS and requires peer authentication. # ---------------------------------------------------------------------------- [IHEFULL_TLS] Aetitle = IHEFULL_TLS Description = IHE Full Print SCP Hostname = localhost # in the IHE Year 2 MESA release, this printer listened on port 10005 Port = 10012 Type = LOCALPRINTER BorderDensity = 150\20\BLACK\WHITE DisableNewVRs = false DisplayFormat=1,1\1,2\2,2\2,3\3,3\3,4\3,5\4,4\4,5 EmptyImageDensity = 20\BLACK\WHITE FilmDestination = MAGAZINE\PROCESSOR\BIN_1\BIN_2 FilmSizeID = 8INX10IN\10INX12IN\10INX14IN\11INX14IN\14INX14IN\14INX17IN\24CMX24CM\24CMX30CM ImplicitOnly = false MagnificationType = REPLICATE\BILINEAR\CUBIC\NONE MaxDensity = 320 MaxPDU = 32768 MediumType = PAPER\CLEAR FILM\BLUE FILM MinDensity = 20 OmitSOPClassUIDFromCreateResponse = false PresentationLUTMatchRequired = false PresentationLUTinFilmSession = false ResolutionID = STANDARD\HIGH SmoothingType = NONE Supports12Bit = true SupportsDecimateCrop = true SupportsImageSize = true SupportsPresentationLUT = true SupportsTrim = true # TLS settings UseTLS = true CipherSuites = TLS_RSA_WITH_3DES_EDE_CBC_SHA\TLS_RSA_WITH_NULL_SHA RandomSeed = iheprt1.rnd PeerAuthentication = REQUIRE Certificate = sitecert.pem PrivateKey = sitekey.pem # ---------------------------------------------------------------------------- # Print SCP that only supports the absolute minimum that is required by # the IHE technical framework for Print Server actors: # - supports Presentation LUT and 12-bit image transmission # - supports STANDARD\1,1 layout only # This Print SCP communicates over TLS and requires peer authentication. # ---------------------------------------------------------------------------- [IHERESTRICT_TLS] Aetitle = IHERESTRICT_TLS Description = IHE Restricted Print SCP Hostname = localhost Port = 10013 Type = LOCALPRINTER DisableNewVRs = true DisplayFormat=1,1 FilmDestination = STOREDPRINT FilmSizeID = 8INX10IN\11INX14IN\14INX17IN ImplicitOnly = true MagnificationType = REPLICATE\BILINEAR\CUBIC\NONE MaxDensity = 320 MaxPDU = 16384 MediumType = STOREDPRINT OmitSOPClassUIDFromCreateResponse = true PresentationLUTMatchRequired = true PresentationLUTinFilmSession = false Supports12Bit = true SupportsPresentationLUT = true # TLS settings UseTLS = true CipherSuites = TLS_RSA_WITH_3DES_EDE_CBC_SHA\TLS_RSA_WITH_NULL_SHA RandomSeed = iheprt2.rnd PeerAuthentication = REQUIRE Certificate = sitecert.pem PrivateKey = sitekey.pem # ============================================================================ # Logins and Certificates for Digital Signature purposes # are defined in the following section. [[USERS]] # ============================================================================ # ---------------------------------------------------------------------------- # The following text documents all settings defined for a user. # Each user requires one section with a unique section title. # # [USER_1] # ---------------------------------------------------------------------------- # # Login of user, must be unique. Required entry. # # Login = name # # ---------------------------------------------------------------------------- # # Name of user in human readable form, must be unique (e.g. might be # presented in combo box GUI). # Required entry. # # Name = name # # ---------------------------------------------------------------------------- # # Name of user in DICOM Person Name (PN) format. Used when creating a # Verifying Observer Sequence in a DICOM SR document. # Required entry. # # DicomName = name # # ---------------------------------------------------------------------------- # # Name of Organization for which this user is acting, in DICOM Long String (LO) # format (i.e. max 64 characters). Used when creating a # Verifying Observer Sequence in a DICOM SR document. # Required entry. # # Organization = name # # ---------------------------------------------------------------------------- # # Code for identifying the user, with the entries required for the DICOM # Code Sequence Macro (DICOM Part 3, Table 8.8-1). This is an optional entry # that is used when creating a Verifying Observer Sequence in a DICOM SR # document. If present, it must consist of four parts separated by backslash # characters: # - coding scheme designator, DICOM SH format (max. 16 characters) # - coding scheme version (may be empty), DICOM SH format # - code value, DICOM SH format # - code meaning, DICOM LO format (max. 64 characters) # # Code = Coding_Scheme_Designator\Coding_Scheme_Version\Code_Value\Code_Meaning # # ---------------------------------------------------------------------------- # # File containing the user's X.509 certificate for digital signature purposes. # # The certificate file must be located in directory defined in # GENERAL/TLS/USERKEYDIRECTORY. The file format is defined in # GENERAL/TLS/USEPEMFORMAT. This is a mandatory entry. # # Certificate = filename # # ---------------------------------------------------------------------------- # # File containing the user's private key. The key is used during creation # of digital signatures. The password with which the key is protected # (when stored in PEM format) is also used to authenticate a user when # a DICOM Structured Report is to be verified by a "Verifying Observer". # # The key file must be located in directory defined in # GENERAL/TLS/USERKEYDIRECTORY. The file format is defined in # GENERAL/TLS/USEPEMFORMAT. It is strongly recommended to keep the files # in PEM format which (unlike DER) allows 3DES encryption of private keys! # This is a mandatory entry. # # PrivateKey = filename # # ---------------------------------------------------------------------------- [USER_1] Login = default Name = Default User DicomName = User^Default^^^ Organization = OFFIS e.V. Code = 99_OFFIS_DCMTK\\USR.000001\DICOMscope 3.6.0 Default User Certificate = usercert.pem PrivateKey = userkey.pem # ============================================================================ # Print Presentation LUT files are defined in the following section. [[LUT]] # ============================================================================ # ---------------------------------------------------------------------------- # Assign a unique name to each LUT and put this into the section name. [LINEAR] # ---------------------------------------------------------------------------- # Description of the LUT. Used in the GUI to present the selectable LUTs # to the application user. description = Linear LUT (256 Entries) # Filename of the LUT file, should reside in LUT directory (see above). filename = linear256us.lut [LIGHTEN] description = Lighten Image (256 Entries) filename = lighten256us.lut [DARKEN] description = Darken Image (256 Entries) filename = darken256us.lut [MIDTONE] description = Enhance Midtone (256 Entries) filename = midtone256us.lut [PHILIPS] description = Philips Standard (256 Entries) filename = philips256us.lut [LINEAR12] description = Linear LUT (4096 Entries) filename = linear4096us.lut [LIGHTEN12] description = Lighten Image (4096 Entries) filename = lighten4096us.lut [DARKEN12] description = Darken Image (4096 Entries) filename = darken4096us.lut [MIDTONE12] description = Enhance Midtone (4096 Entries) filename = midtone4096us.lut [PHILIPS12] description = Philips Standard (4096 Entries) filename = philips4096us.lut # ============================================================================ # VOI Window Level/Width Preset Definitions [[VOI]] # ============================================================================ # ---------------------------------------------------------------------------- # Assign a unique name to each preset and put this into the section name. [CT_ABDOMEN] # ---------------------------------------------------------------------------- # Description of the preset. Used in the GUI to present the selectable VOIs description = Abdomen # Modality to which this preset applies. Must be one of the DICOM defined # terms for element (0008,0060) Modality, see PS3.3 C.7.3.1.1.1 modality = CT # Window center center = 45 # Window width width = 250 [CT_BONE] description = Bone modality = CT center = 500 width = 4000 [CT_CRANE] description = Crane modality = CT center = 35 width = 100 [CT_LUNG] description = Lung modality = CT center = -500 width = 2000 [CT_MEDIASTINUM] description = Mediastinum modality = CT center = 45 width = 440 [CT_PELVIS] description = Pelvis modality = CT center = 45 width = 300 # ============================================================================ # Structured Reporting (SR) "templates" are defined in the following section. [[REPORT]] # ============================================================================ # ---------------------------------------------------------------------------- # Assign a unique name to each "template" and put this into the section name. [KEY_IMAGE] # ---------------------------------------------------------------------------- # Description of the report. Used in the GUI to present the selectable SR # "template" to the application user. description = Key Image Note (IHE Y2) # Filename of the SR "template" file, should reside in REPORT directory # (see above). filename = reportki.dcm [SIMPLE_IMAGE] description = Simple Image Report (IHE Y2) filename = reportsi.dcm dcmtk-3.6.0/dcmpstat/CMakeLists.txt0000644000310500011400000000102511410146067016414 0ustar joergrdicom3# declare project PROJECT(dcmpstat) # declare include directories which hold for all subdirectories INCLUDE_DIRECTORIES(${dcmpstat_SOURCE_DIR}/include ${ofstd_SOURCE_DIR}/include ${oflog_SOURCE_DIR}/include ${dcmdata_SOURCE_DIR}/include ${dcmnet_SOURCE_DIR}/include ${dcmimgle_SOURCE_DIR}/include ${dcmqrdb_SOURCE_DIR}/include ${dcmsr_SOURCE_DIR}/include ${dcmsign_SOURCE_DIR}/include ${dcmtls_SOURCE_DIR}/include ${ZLIB_INCDIR} ${OPENSSL_INCDIR}) # recurse into subdirectories SUBDIRS(libsrc apps include/dcmtk/dcmpstat data etc) dcmtk-3.6.0/dcmpstat/include/0000755000310500011400000000000011511320677015304 5ustar joergrdicom3dcmtk-3.6.0/dcmpstat/include/Makefile.in0000644000310500011400000000067010721573526017361 0ustar joergrdicom3# # Makefile for dcmpstat/include # @SET_MAKE@ SHELL = /bin/sh srcdir = @srcdir@ top_srcdir = @top_srcdir@ configdir = @top_srcdir@/@configdir@ include $(configdir)/@common_makefile@ all: install: $(configdir)/mkinstalldirs $(DESTDIR)$(includedir)/dcmtk/dcmpstat for file in dcmtk/dcmpstat/*.h ; do \ $(INSTALL_DATA) $$file $(DESTDIR)$(includedir)/dcmtk/dcmpstat ;\ done clean: rm -f $(TRASH) distclean: rm -f $(DISTTRASH) dcmtk-3.6.0/dcmpstat/include/dcmtk/0000755000310500011400000000000011511320677016406 5ustar joergrdicom3dcmtk-3.6.0/dcmpstat/include/dcmtk/dcmpstat/0000755000310500011400000000000011511320677020225 5ustar joergrdicom3dcmtk-3.6.0/dcmpstat/include/dcmtk/dcmpstat/dvpscf.h0000644000310500011400000015262611455601264021700 0ustar joergrdicom3/* * * Copyright (C) 1998-2010, 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, Joerg Riesmeier * * Purpose: * classes: DVConfiguration * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:16:36 $ * CVS/RCS Revision: $Revision: 1.34 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DVPSCF_H #define DVPSCF_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/ofstd/ofstring.h" /* for class OFString */ #include "dcmtk/dcmdata/dctypes.h" /* for Uint32 */ #include "dcmtk/dcmpstat/dvpstyp.h" /* for DVPS enums */ #include "dcmtk/oflog/oflog.h" /* for OFLogger::LogLevel */ class OFConfigFile; /** Configuration class for the Softcopy Presentation State viewer. * This class manages the configuration file content used by the * presentation state viewer. */ class DVConfiguration { public: /** constructor. * @param config_file filename (path) of the config file to be used. * The caller should make sure that the config file * really exists because the constructor cannot return an error status. * If a non-existing filename (or NULL) is passed, an empty configuration file * is assumed. */ DVConfiguration(const char *config_file=NULL); /** destructor. */ virtual ~DVConfiguration(); /* access to communication partner data */ /** returns the number of communication partners (send targets) * in the configuration file. * @param peerType defines a filter for the peer service type. Default: handle only storage peers. * @return number of communication partners */ Uint32 getNumberOfTargets(DVPSPeerType peerType=DVPSE_storage); /** returns the target identifier of the communication partner * with the given index. The target identifier is unique within the configuration file * @param idx index, must be < getNumberOfTargets() * @param peerType defines a filter for the peer service type. Default: handle only storage peers. * @return target identifier if found, NULL otherwise. */ const char *getTargetID(Uint32 idx, DVPSPeerType peerType=DVPSE_storage); /** returns the DESCRIPTION entry for the communication partner with the given * target ID from the configuration file. * @param targetID communication target ID, must be one of the target * identifiers returned by getTargetID(). * @return entry if present in the config file, NULL otherwise. */ const char *getTargetDescription(const char *targetID); /** returns the HOSTNAME entry for the communication partner with the given * target ID from the configuration file. * @param targetID communication target ID, must be one of the target * identifiers returned by getTargetID(). * @return entry if present in the config file, NULL otherwise. */ const char *getTargetHostname(const char *targetID); /** returns the PORT entry for the communication partner with the given * target ID from the configuration file. * @param targetID communication target ID, must be one of the target * identifiers returned by getTargetID(). * @return entry if present and parsable in the config file, 0 otherwise. */ unsigned short getTargetPort(const char *targetID); /** returns the TYPE entry for the communication partner with the given * target ID from the configuration file. * @param targetID communication target ID, must be one of the target * identifiers returned by getTargetID(). * @return entry if present and parsable in the config file, DVPSE_storage otherwise. */ DVPSPeerType getTargetType(const char *targetID); /** returns the AETITLE entry for the communication partner with the given * target ID from the configuration file. * @param targetID communication target ID, must be one of the target * identifiers returned by getTargetID(). * @return entry if present in the config file, NULL otherwise. */ const char *getTargetAETitle(const char *targetID); /** returns the MAXPDU entry for the communication partner with the given * target ID from the configuration file. * @param targetID communication target ID, must be one of the target * identifiers returned by getTargetID(). * @return entry if present and parsable in the config file, 0 otherwise. */ unsigned long getTargetMaxPDU(const char *targetID); /** returns the TIMEOUT entry for the communication partner with the given * target ID from the configuration file. * @param targetID communication target ID, must be one of the target * identifiers returned by getTargetID(). * @return entry if present and parsable in the config file, -1 otherwise. */ Sint32 getTargetTimeout(const char *targetID); /** returns the IMPLICITONLY entry for the communication partner with the given * target ID from the configuration file. * @param targetID communication target ID, must be one of the target * identifiers returned by getTargetID(). * @return entry if present in the config file, OFFalse otherwise. */ OFBool getTargetImplicitOnly(const char *targetID); /** returns the DISABLENEWVRS entry for the communication partner with the given * target ID from the configuration file. * @param targetID communication target ID, must be one of the target * identifiers returned by getTargetID(). * @return entry if present in the config file, OFFalse otherwise. */ OFBool getTargetDisableNewVRs(const char *targetID); /** returns the BITPRESERVINGMODE entry for the storage peer with the given * target ID from the configuration file. * @param targetID communication target ID, must be one of the target * identifiers returned by getTargetID(). * @return entry if present in the config file, OFFalse otherwise. */ OFBool getTargetBitPreservingMode(const char *targetID); /** returns the CORRECTUIDPADDING entry for the storage peer with the given * target ID from the configuration file. * @param targetID communication target ID, must be one of the target * identifiers returned by getTargetID(). * @return entry if present in the config file, OFFalse otherwise. */ OFBool getTargetCorrectUIDPadding(const char *targetID); /** returns the USETLS entry for the storage peer with the given * target ID from the configuration file. * @param targetID communication target ID, must be one of the target * identifiers returned by getTargetID(). * @return entry if present in the config file, OFFalse otherwise. */ OFBool getTargetUseTLS(const char *targetID); /** returns the CERTIFICATE entry for the storage peer with the given * target ID from the configuration file. * @param targetID communication target ID, must be one of the target * identifiers returned by getTargetID(). * @return entry if present in the config file, NULL otherwise. */ const char *getTargetCertificate(const char *targetID); /** returns the PRIVATEKEY entry for the storage peer with the given * target ID from the configuration file. * @param targetID communication target ID, must be one of the target * identifiers returned by getTargetID(). * @return entry if present in the config file, NULL otherwise. */ const char *getTargetPrivateKey(const char *targetID); /** returns the PRIVATEKEYPASSWORD entry for the storage peer with the given * target ID from the configuration file. * @param targetID communication target ID, must be one of the target * identifiers returned by getTargetID(). * @return entry if present in the config file, NULL otherwise. */ const char *getTargetPrivateKeyPassword(const char *targetID); /** returns the number of distinct values (separated by backslash characters) * in the CIPHERSUITES entry for the storage peer with the given * target ID from the configuration file. * @param targetID communication target ID, must be one of the target * identifiers returned by getTargetID(). * @return number of values if entry present in the config file, 0 otherwise. */ Uint32 getTargetNumberOfCipherSuites(const char *targetID); /** returns one value from the CIPHERSUITES entry for the storage peer * with the given target ID from the configuration file. * @param targetID communication target ID, must be one of the target * identifiers returned by getTargetID(). * @param idx index of the value, must be < getTargetNumberOfCipherSuites(targetID) * @param value the result is both stored in this object and returned as return value. * @return value if present, NULL otherwise. */ const char *getTargetCipherSuite(const char *targetID, Uint32 idx, OFString& value); /** returns the PEERAUTHENTICATION entry for the communication partner with the given * target ID from the configuration file. * @param targetID communication target ID, must be one of the target * identifiers returned by getTargetID(). * @return entry if present and parsable in the config file, DVPSQ_require otherwise. */ DVPSCertificateVerificationType getTargetPeerAuthentication(const char *targetID); /** returns the DIFFIEHELLMANPARAMETERS entry for the storage peer with the given * target ID from the configuration file. * @param targetID communication target ID, must be one of the target * identifiers returned by getTargetID(). * @return entry if present in the config file, NULL otherwise. */ const char *getTargetDiffieHellmanParameters(const char *targetID); /** returns the RANDOMSEED entry for the storage peer with the given * target ID from the configuration file. * @param targetID communication target ID, must be one of the target * identifiers returned by getTargetID(). * @return entry if present in the config file, NULL otherwise. */ const char *getTargetRandomSeed(const char *targetID); /** returns the SUPPORTSPRESENTATIONLUT entry for the printer with the given * target ID from the configuration file. * @param targetID communication target ID, must be one of the target * identifiers returned by getTargetID() for peer type DVPSE_printerAny. * @return entry if present in the config file, OFFalse otherwise. */ OFBool getTargetPrinterSupportsPresentationLUT(const char *targetID); /** returns the PRESENTATIONLUTMATCHREQUIRED entry for the printer with the given * target ID from the configuration file. * @param targetID communication target ID, must be one of the target * identifiers returned by getTargetID() for peer type DVPSE_printerAny. * @return entry if present in the config file, OFTrue otherwise. */ OFBool getTargetPrinterPresentationLUTMatchRequired(const char *targetID); /** returns the PRESENTATIONLUTPREFERSCPRENDERING entry for the printer with the given * target ID from the configuration file. * @param targetID communication target ID, must be one of the target * identifiers returned by getTargetID() for peer type DVPSE_printerAny. * @return entry if present in the config file, OFFalse otherwise. */ OFBool getTargetPrinterPresentationLUTPreferSCPRendering(const char *targetID); /** returns the PRESENTATIONLUTINFILMSESSION entry for the printer with the given * target ID from the configuration file. * @param targetID communication target ID, must be one of the target * identifiers returned by getTargetID() for peer type DVPSE_printerAny. * @return entry if present in the config file, OFFalse otherwise. */ OFBool getTargetPrinterPresentationLUTinFilmSession(const char *targetID); /** returns the SUPPORTS12BIT entry for the printer with the given * target ID from the configuration file. * @param targetID communication target ID, must be one of the target * identifiers returned by getTargetID() for peer type DVPSE_printerAny. * @return entry if present in the config file, OFTrue otherwise * (default is 12 bit supported). */ OFBool getTargetPrinterSupports12BitTransmission(const char *targetID); /** returns the SUPPORTSIMAGESIZE entry for the printer with the given * target ID from the configuration file. * @param targetID communication target ID, must be one of the target * identifiers returned by getTargetID() for peer type DVPSE_printerAny. * @return entry if present in the config file, OFFalse otherwise. */ OFBool getTargetPrinterSupportsRequestedImageSize(const char *targetID); /** returns the SUPPORTSDECIMATECROP entry for the printer with the given * target ID from the configuration file. * @param targetID communication target ID, must be one of the target * identifiers returned by getTargetID() for peer type DVPSE_printerAny. * @return entry if present in the config file, OFFalse otherwise. */ OFBool getTargetPrinterSupportsDecimateCrop(const char *targetID); /** returns the SUPPORTSTRIM entry for the printer with the given * target ID from the configuration file. * @param targetID communication target ID, must be one of the target * identifiers returned by getTargetID() for peer type DVPSE_printerAny. * @return entry if present in the config file, OFFalse otherwise. */ OFBool getTargetPrinterSupportsTrim(const char *targetID); /** returns the number of distinct values (separated by backslash characters) * in the BORDERDENSITY entry for the printer with the given * target ID from the configuration file. * @param targetID communication target ID, must be one of the target * identifiers returned by getTargetID() for peer type DVPSE_printerAny. * @return number of values if entry present in the config file, 0 otherwise. */ Uint32 getTargetPrinterNumberOfBorderDensities(const char *targetID); /** returns one value from the BORDERDENSITY entry for the printer * with the given target ID from the configuration file. * @param targetID communication target ID, must be one of the target * identifiers returned by getTargetID() for peer type DVPSE_printerAny. * @param idx index of the value, must be < getTargetPrinterNumberOfBorderDensities(targetID) * @param value the result is both stored in this object and returned as return value. * @return value if present, NULL otherwise. */ const char *getTargetPrinterBorderDensity(const char *targetID, Uint32 idx, OFString& value); /** returns the number of distinct values (separated by backslash characters) * in the MAXDENSITY entry for the printer with the given * target ID from the configuration file. * @param targetID communication target ID, must be one of the target * identifiers returned by getTargetID() for peer type DVPSE_printerAny. * @return number of values if entry present in the config file, 0 otherwise. */ Uint32 getTargetPrinterNumberOfMaxDensities(const char *targetID); /** returns one value from the MAXDENSITY entry for the printer * with the given target ID from the configuration file. * @param targetID communication target ID, must be one of the target * identifiers returned by getTargetID() for peer type DVPSE_printerAny. * @param idx index of the value, must be < getTargetPrinterNumberOfMaxDensities(targetID) * @param value the result is both stored in this object and returned as return value. * @return value if present, NULL otherwise. */ const char *getTargetPrinterMaxDensity(const char *targetID, Uint32 idx, OFString& value); /** returns the number of distinct values (separated by backslash characters) * in the MINDENSITY entry for the printer with the given * target ID from the configuration file. * @param targetID communication target ID, must be one of the target * identifiers returned by getTargetID() for peer type DVPSE_printerAny. * @return number of values if entry present in the config file, 0 otherwise. */ Uint32 getTargetPrinterNumberOfMinDensities(const char *targetID); /** returns one value from the MINDENSITY entry for the printer * with the given target ID from the configuration file. * @param targetID communication target ID, must be one of the target * identifiers returned by getTargetID() for peer type DVPSE_printerAny. * @param idx index of the value, must be < getTargetPrinterNumberOfMinDensities(targetID) * @param value the result is both stored in this object and returned as return value. * @return value if present, NULL otherwise. */ const char *getTargetPrinterMinDensity(const char *targetID, Uint32 idx, OFString& value); /** returns the number of distinct values (separated by backslash characters) * in the DISPLAYFORMAT entry for the printer with the given * target ID from the configuration file. * @param targetID communication target ID, must be one of the target * identifiers returned by getTargetID() for peer type DVPSE_printerAny. * @return number of values if entry present in the config file, 0 otherwise. */ Uint32 getTargetPrinterNumberOfPortraitDisplayFormats(const char *targetID); /** returns one row value from the DISPLAYFORMAT entry for the printer * with the given target ID from the configuration file. * @param targetID communication target ID, must be one of the target * identifiers returned by getTargetID() for peer type DVPSE_printerAny. * @param idx index of the value, must be < getTargetPrinterNumberOfPortraitDisplayFormats(targetID) * @return number of rows for this display format if present, 0 otherwise */ Uint32 getTargetPrinterPortraitDisplayFormatRows(const char *targetID, Uint32 idx); /** returns one columns value from the DISPLAYFORMAT entry for the printer * with the given target ID from the configuration file. * @param targetID communication target ID, must be one of the target * identifiers returned by getTargetID() for peer type DVPSE_printerAny. * @param idx index of the value, must be < getTargetPrinterNumberOfPortraitDisplayFormats(targetID) * @return number of columns for this display format if present, 0 otherwise */ Uint32 getTargetPrinterPortraitDisplayFormatColumns(const char *targetID, Uint32 idx); /** returns OFTrue if an ANNOTATION entry for the printer with the given * target ID from the configuration file exists or if the * SESSIONLABELANNOTATION flag is true for the printer. * @param targetID communication target ID, must be one of the target * identifiers returned by getTargetID() for peer type DVPSE_printerAny. * @return OFTrue if printer supports annotation, OFFalse otherwise. */ OFBool getTargetPrinterSupportsAnnotation(const char *targetID); /** returns OFTrue if an ANNOTATION entry for the printer with the given * target ID from the configuration file exists. * @param targetID communication target ID, must be one of the target * identifiers returned by getTargetID() for peer type DVPSE_printerAny. * @return OFTrue if printer supports annotation, OFFalse otherwise. */ OFBool getTargetPrinterSupportsAnnotationBoxSOPClass(const char *targetID); /** returns OFTrue if an SESSIONLABELANNOTATION entry for the printer * with the given target ID from the configuration file exists and is true. * @param targetID communication target ID, must be one of the target * identifiers returned by getTargetID() for peer type DVPSE_printerAny. * @return OFTrue if printer supports annotations in film session label, OFFalse otherwise. */ OFBool getTargetPrinterSessionLabelAnnotation(const char *targetID); /** returns the second value from the ANNOTATION entry for the printer * with the given target ID from the configuration file. * @param targetID communication target ID, must be one of the target * identifiers returned by getTargetID() for peer type DVPSE_printerAny. * @param value the result is both stored in this object and returned as return value. * @return value if present, NULL otherwise. */ const char *getTargetPrinterAnnotationDisplayFormatID(const char *targetID, OFString& value); /** returns the first value from the ANNOTATION entry for the printer * with the given target ID from the configuration file. * @param targetID communication target ID, must be one of the target * identifiers returned by getTargetID() for peer type DVPSE_printerAny. * @return value if present, 0 otherwise. */ Uint16 getTargetPrinterAnnotationPosition(const char *targetID); /** returns the number of distinct values (separated by backslash characters) * in the FILMSIZEID entry for the printer with the given * target ID from the configuration file. * @param targetID communication target ID, must be one of the target * identifiers returned by getTargetID() for peer type DVPSE_printerAny. * @return number of values if entry present in the config file, 0 otherwise. */ Uint32 getTargetPrinterNumberOfFilmSizeIDs(const char *targetID); /** returns one value from the FILMSIZEID entry for the printer * with the given target ID from the configuration file. * @param targetID communication target ID, must be one of the target * identifiers returned by getTargetID() for peer type DVPSE_printerAny. * @param idx index of the value, must be < getTargetPrinterNumberOfFilmSizeIDs(targetID) * @param value the result is both stored in this object and returned as return value. * @return value if present, NULL otherwise. */ const char *getTargetPrinterFilmSizeID(const char *targetID, Uint32 idx, OFString& value); /** returns the number of distinct values (separated by backslash characters) * in the MEDIUMTYPE entry for the printer with the given * target ID from the configuration file. * @param targetID communication target ID, must be one of the target * identifiers returned by getTargetID() for peer type DVPSE_printerAny. * @return number of values if entry present in the config file, 0 otherwise. */ Uint32 getTargetPrinterNumberOfMediumTypes(const char *targetID); /** returns one value from the MEDIUMTYPE entry for the printer * with the given target ID from the configuration file. * @param targetID communication target ID, must be one of the target * identifiers returned by getTargetID() for peer type DVPSE_printerAny. * @param idx index of the value, must be < getTargetPrinterNumberOfMediumTypes(targetID) * @param value the result is both stored in this object and returned as return value. * @return value if present, NULL otherwise. */ const char *getTargetPrinterMediumType(const char *targetID, Uint32 idx, OFString& value); /** returns the number of distinct values (separated by backslash characters) * in the FILMDESTINATION entry for the printer with the given * target ID from the configuration file. * @param targetID communication target ID, must be one of the target * identifiers returned by getTargetID() for peer type DVPSE_printerAny. * @return number of values if entry present in the config file, 0 otherwise. */ Uint32 getTargetPrinterNumberOfFilmDestinations(const char *targetID); /** returns one value from the FILMDESTINATION entry for the printer * with the given target ID from the configuration file. * @param targetID communication target ID, must be one of the target * identifiers returned by getTargetID() for peer type DVPSE_printerAny. * @param idx index of the value, must be < getTargetPrinterNumberOfFilmDestinations(targetID) * @param value the result is both stored in this object and returned as return value. * @return value if present, NULL otherwise. */ const char *getTargetPrinterFilmDestination(const char *targetID, Uint32 idx, OFString& value); /** returns the number of distinct values (separated by backslash characters) * in the RESOLUTIONID entry for the printer with the given * target ID from the configuration file. * @param targetID communication target ID, must be one of the target * identifiers returned by getTargetID() for peer type DVPSE_printerAny. * @return number of values if entry present in the config file, 0 otherwise. */ Uint32 getTargetPrinterNumberOfPrinterResolutionIDs(const char *targetID); /** returns one value from the RESOLUTIONID entry for the printer * with the given target ID from the configuration file. * @param targetID communication target ID, must be one of the target * identifiers returned by getTargetID() for peer type DVPSE_printerAny. * @param idx index of the value, must be < getTargetPrinterNumberOfPrinterResolutionIDs(targetID) * @param value the result is both stored in this object and returned as return value. * @return value if present, NULL otherwise. */ const char *getTargetPrinterResolutionID(const char *targetID, Uint32 idx, OFString& value); /** returns the number of distinct values (separated by backslash characters) * in the MAGNIFICATIONTYPE entry for the printer with the given * target ID from the configuration file. * @param targetID communication target ID, must be one of the target * identifiers returned by getTargetID() for peer type DVPSE_printerAny. * @return number of values if entry present in the config file, 0 otherwise. */ Uint32 getTargetPrinterNumberOfMagnificationTypes(const char *targetID); /** returns one value from the MAGNIFICATIONTYPE entry for the printer * with the given target ID from the configuration file. * @param targetID communication target ID, must be one of the target * identifiers returned by getTargetID() for peer type DVPSE_printerAny. * @param idx index of the value, must be < getTargetPrinterNumberOfMagnificationTypes(targetID) * @param value the result is both stored in this object and returned as return value. * @return value if present, NULL otherwise. */ const char *getTargetPrinterMagnificationType(const char *targetID, Uint32 idx, OFString& value); /** returns the number of distinct values (separated by backslash characters) * in the SMOOTHINGTYPE entry for the printer with the given * target ID from the configuration file. * @param targetID communication target ID, must be one of the target * identifiers returned by getTargetID() for peer type DVPSE_printerAny. * @return number of values if entry present in the config file, 0 otherwise. */ Uint32 getTargetPrinterNumberOfSmoothingTypes(const char *targetID); /** returns one value from the SMOOTHINGTYPE entry for the printer * with the given target ID from the configuration file. * @param targetID communication target ID, must be one of the target * identifiers returned by getTargetID() for peer type DVPSE_printerAny. * @param idx index of the value, must be < getTargetPrinterNumberOfSmoothingTypes(targetID) * @param value the result is both stored in this object and returned as return value. * @return value if present, NULL otherwise. */ const char *getTargetPrinterSmoothingType(const char *targetID, Uint32 idx, OFString& value); /** returns the number of distinct values in the CONFIGURATION_x entries * for the printer with the given target ID from the configuration file. * @param targetID communication target ID, must be one of the target * identifiers returned by getTargetID() for peer type DVPSE_printerAny. * @return number of values if entry present in the config file, 0 otherwise. */ Uint32 getTargetPrinterNumberOfConfigurationSettings(const char *targetID); /** returns the value from one of the CONFIGURATION_x entries for the printer * with the given target ID from the configuration file. * @param targetID communication target ID, must be one of the target * identifiers returned by getTargetID() for peer type DVPSE_printerAny. * @param idx index of the value, must be < getTargetPrinterNumberOfConfigurationSettings(targetID) * @return value if present, NULL otherwise. */ const char *getTargetPrinterConfigurationSetting(const char *targetID, Uint32 idx); /** returns the number of distinct values (separated by backslash characters) * in the EMPTYIMAGEDENSITY entry for the printer with the given * target ID from the configuration file. * @param targetID communication target ID, must be one of the target * identifiers returned by getTargetID() for peer type DVPSE_printerAny. * @return number of values if entry present in the config file, 0 otherwise. */ Uint32 getTargetPrinterNumberOfEmptyImageDensities(const char *targetID); /** returns one value from the EMPTYIMAGEDENSITY entry for the printer * with the given target ID from the configuration file. * @param targetID communication target ID, must be one of the target * identifiers returned by getTargetID() for peer type DVPSE_printerAny. * @param idx index of the value, must be < getTargetPrinterNumberOfEmptyImageDensities(targetID) * @param value the result is both stored in this object and returned as return value. * @return value if present, NULL otherwise. */ const char *getTargetPrinterEmptyImageDensity(const char *targetID, Uint32 idx, OFString& value); /** returns the OMITSOPCLASSUIDFROMCREATERESPONSE entry for the printer with the given * target ID from the configuration file. * @param targetID communication target ID, must be one of the target * identifiers returned by getTargetID() for peer type DVPSE_printerAny. * @return entry if present in the config file, OFFalse otherwise. */ OFBool getTargetPrintSCPOmitSOPClassUIDFromCreateResponse(const char *targetID); /* general settings */ /** returns the directory used to store log files. * Value is taken from the section GENERAL/APPLICATION/LOGDIRECTORY * in the config file. * @return log directory path, NULL if absent. */ const char *getLogFolder(); /** returns the name of the log file to be used for general application messages. * Value is taken from the section GENERAL/APPLICATION/LOGFILE * in the config file. * @return name of the log file, NULL if absent. */ const char *getLogFile(); /** returns the log level / filter to be used for general application messages. * Value is taken from the section GENERAL/APPLICATION/LOGLEVEL * in the config file. * @return log level, default: OFLogger::FATAL_LOG_LEVEL */ OFLogger::LogLevel getLogLevel(); /** returns the port on which the GUI application accepts notification * messages from the network processes. * Value is taken from the section GENERAL/APPLICATION/MESSAGEPORT * in the config file. * @return message port, default: 0 (no message exchange). */ unsigned short getMessagePort(); /** Indicates whether client processes are allowed to keep their notification * message port open during the lifetime of the process. * Value is taken from the section GENERAL/APPLICATION/KEEPMESSAGEPORTOPEN * in the config file. * @return message port open flag, default: false */ OFBool getMessagePortKeepOpen(); /** returns the AETitle with which this application should identify itself. * The AETitle is taken from the section GENERAL/NETWORK in the * config file. If absent, a default value is returned. * @return AETitle for this application. Never returns NULL. */ const char *getNetworkAETitle(); /** returns the AUTOCREATECONFIGFILE entry for the query/retrieve server * from the section GENERAL/QUERY_RETRIEVE in the config file. * @return entry if present in the config file, OFFalse otherwise. */ OFBool getQueryRetrieveAutoCreateConfigFile(); /** returns the AETitle with which the Q/R server should identify itself. * The AETitle is taken from the section GENERAL/QUERY_RETRIEVE in the * config file. If absent, a default value is returned. * @return AETitle for the Q/R server. Never returns NULL. */ const char *getQueryRetrieveAETitle(); /** returns the PORT entry for the Q/R server * from the section GENERAL/QUERY_RETRIEVE in the config file. * @return entry if present and parsable in the config file, 0 otherwise. */ unsigned short getQueryRetrievePort(); /** returns the MAXPDU entry for the Q/R server * from the section GENERAL/QUERY_RETRIEVE in the config file. * @return entry if present and parsable in the config file, 0 otherwise. */ unsigned long getQueryRetrieveMaxPDU(); /** returns the TIMEOUT entry for the the Q/R server * from the section GENERAL/QUERY_RETRIEVE in the config file. * @return entry if present and parsable in the config file, -1 otherwise. */ Sint32 getQueryRetrieveTimeout(); /** returns the MaxAssociations entry for the Q/R server * from the section GENERAL/QUERY_RETRIEVE in the config file. * @return entry if present and parsable in the config file, 0 otherwise. */ unsigned long getQueryRetrieveMaxAssociations(); /** returns the database folder to be used for sending/receiving/browsing. * Value is taken from the section GENERAL/DATABASE/DIRECTORY * in the config file. If absent, a default value is returned. * @return database folder path. Never returns NULL. */ const char *getDatabaseFolder(); /** returns the spool folder to be used for print jobs. * Value is taken from the section GENERAL/PRINT/DIRECTORY * in the config file. If absent, a default value is returned. * @return spool folder path. Never returns NULL. */ const char *getSpoolFolder(); /** returns the DETAILEDLOG entry * from the section GENERAL/PRINT in the config file. * @return entry if present in the config file, OFFalse otherwise. */ OFBool getDetailedLog(); /** returns the BINARYLOG entry * from the section GENERAL/PRINT in the config file. * @return entry if present in the config file, OFFalse otherwise. */ OFBool getBinaryLog(); /** returns the filename (path) of the DICOM Store SCU application used * for sending images, as configured in section * GENERAL/NETWORK/SENDER in the config file. * @return send application path name or NULL if absent. */ const char *getSenderName(); /** returns the filename (path) of the DICOM Store SCP application used * for receiving images, as configured in section * GENERAL/NETWORK/RECEIVER in the config file. * @return receive application path name or NULL if absent. */ const char *getReceiverName(); /** returns the filename (path) of the DICOM Query/Retrieve SCP application, * as configured in section GENERAL/QUERY_RETRIEVE/SERVER in the config file. * @return send application path name or NULL if absent. */ const char *getQueryRetrieveServerName(); /** returns the filename (path) of the DICOM Print SCU application used * for printing images, as configured in section * GENERAL/PRINT/SPOOLER in the config file. * @return receive application path name or NULL if absent. */ const char *getSpoolerName(); /** returns the filename (path) of the DICOM Print SCU application used * for printing images, as configured in section * GENERAL/PRINT/Server in the config file. * @return receive application path name or NULL if absent. */ const char *getPrintServerName(); /** returns the filename (path) of the application used * for dumping DICOM objects, as configured in section * GENERAL/DATABASE/DUMP in the config file. * @return dump application path name or NULL if absent. */ const char *getDumpToolName(); /** returns the filename (path) of the application used * for dumping DICOM objects, as configured in section * GENERAL/DATABASE/CHECK in the config file. * @return check application path name or NULL if absent. */ const char *getCheckToolName(); /** returns the sleep delay for the print spooler in seconds, * as configured in section GENERAL/PRINT/SLEEP in the config file. * @return sleep delay, 0 if absent. */ unsigned long getSpoolerSleep(); /** returns the DELETEPRINTJOBS entry for the print spooler * from the section GENERAL/PRINT in the config file. * @return entry if present in the config file, OFFalse otherwise. */ OFBool getSpoolerDeletePrintJobs(); /** returns the ALWAYSDELETETERMINATEJOBS entry for the print spooler * from the section GENERAL/PRINT in the config file. * @return entry if present in the config file, OFFalse otherwise. */ OFBool getSpoolerAlwaysDeleteTerminateJobs(); /** returns the filename (path) of the monitor characteristics file * used to implement that Barten transform, as configured in section * GENERAL/MONITOR/CHARACTERISTICS in the config file. * @return monitor characteristics path name or NULL if absent. */ const char *getMonitorCharacteristicsFile(); /** returns the width (in mm) of one pixel on the current monitor * @return pixel width, 0 if unknown */ double getMonitorPixelWidth(); /** returns the height (in mm) of one pixel on the current monitor * @return pixel height, 0 if unknown */ double getMonitorPixelHeight(); /** returns the maximum horizontal preview image resolution, from * GENERAL/MONITOR/PREVIEW in the config file. Default: 0. * @return maximum horizontal preview resolution */ Uint32 getMaxPreviewResolutionX(); /** returns the maximum vertical preview image resolution, from * GENERAL/MONITOR/PREVIEW in the config file. Default: 0. * @return maximum vertical preview resolution */ Uint32 getMaxPreviewResolutionY(); /** returns the value of configuration file entry key=value * in the section GENERAL/GUI of the config file. * Specified key must be upper case. * If the entry is absent, NULL is returned. * @param key the entry key * @return entry value or NULL. */ const char *getGUIConfigEntry(const char *key); /** returns the value of configuration file entry key=value * in the section GENERAL/GUI of the config file. * Specified key must be upper case. * If the entry is absent or cannot be parsed, the default dfl * is returned. * @param key the entry key * @param dfl the default to be used if the value is absent or incorrect * @return entry value or default. */ OFBool getGUIConfigEntryBool(const char *key, OFBool dfl); /** returns the folder to be used for Print Presentation LUTs. * Value is taken from the section GENERAL/LUT/DIRECTORY * in the config file. If absent, a default value is returned. * @return LUT folder path. Never returns NULL. */ const char *getLUTFolder(); /** returns the folder to be used for Structured Reporting "templates". * Value is taken from the section GENERAL/REPORT/DIRECTORY * in the config file. If absent, a default value is returned. * @return report folder path. Never returns NULL. */ const char *getReportFolder(); /* Presentation Look Up Tables (LUTs) */ /** returns the number of Presentation LUTs in the configuration file. * @return number of LUTs */ Uint32 getNumberOfLUTs(); /** returns the identifier of the Presentation LUT * with the given index. The identifier is unique within the configuration file * @param idx index, must be < getNumberOfLUTs() * @return identifier if found, NULL otherwise. */ const char *getLUTID(Uint32 idx); /** returns the DESCRIPTION entry for the LUT with the given * ID from the configuration file. * @param lutID LUT ID, must be one of the identifiers returned by getLUTID(). * @return entry if present in the config file, NULL otherwise. */ const char *getLUTDescription(const char *lutID); /** returns the FILENAME entry for the LUT with the given * ID from the configuration file. * @param lutID LUT ID, must be one of the identifiers returned by getLUTID(). * @return entry if present in the config file, NULL otherwise. */ const char *getLUTFilename(const char *lutID); /* Structured Reporting (SR) "templates" */ /** returns the number of SR "templates" in the configuration file. * @return number of SR "templates" */ Uint32 getNumberOfReports(); /** returns the identifier of the SR "template" * with the given index. The identifier is unique within the configuration file * @param idx index, must be < getNumberOfReports() * @return identifier if found, NULL otherwise. */ const char *getReportID(Uint32 idx); /** returns the DESCRIPTION entry for the SR "template" with the given * ID from the configuration file. * @param reportID SR "template" ID, must be one of the identifiers returned by * getReportID(). * @return entry if present in the config file, NULL otherwise. */ const char *getReportDescription(const char *reportID); /** returns the FILENAME entry for the SR "template" with the given * ID from the configuration file. * @param reportID SR "template" ID, must be one of the identifiers returned by * getReportID(). * @return entry if present in the config file, NULL otherwise. */ const char *getReportFilename(const char *reportID); /* general print settings */ /** returns the minimum horizontal bitmap resolution for print, from * GENERAL/PRINT/MINPRINTRESOLUTION in the config file. Default: 0. * @return minimum horizontal bitmap resolution */ Uint32 getMinPrintResolutionX(); /** returns the minimum vertical bitmap resolution for print, from * GENERAL/PRINT/MINPRINTRESOLUTION in the config file. Default: 0. * @return minimum vertical bitmap resolution */ Uint32 getMinPrintResolutionY(); /** returns the maximum horizontal bitmap resolution for print, from * GENERAL/PRINT/MAXPRINTRESOLUTION in the config file. Default: 0. * @return maximum horizontal bitmap resolution */ Uint32 getMaxPrintResolutionX(); /** returns the maximum vertical bitmap resolution for print, from * GENERAL/PRINT/MAXPRINTRESOLUTION in the config file. Default: 0. * @return maximum vertical bitmap resolution */ Uint32 getMaxPrintResolutionY(); /** returns the default illumination for print, from * GENERAL/PRINT/DEFAULTILLUMINATION in the config file. Default: 2000. * @return default illumination for print */ Uint16 getDefaultPrintIllumination(); /** returns the default reflection for print, from * GENERAL/PRINT/DEFAULTREFLECTION in the config file. Default: 10. * @return default reflection for print */ Uint16 getDefaultPrintReflection(); /* VOI settings */ /** returns the number of VOI Presets defined for the given modality * @param modality Modality, e.g. "CT", "MR", "DX" etc. * @return number of VOI Presets */ Uint32 getNumberOfVOIPresets(const char *modality); /** returns the description string for the given VOI Preset * @param modality Modality, e.g. "CT", "MR", "DX" etc. * @param idx index of the value, must be < getNumberOfVOIPresets(modality) * @return description if present, NULL otherwise. */ const char *getVOIPresetDescription(const char *modality, Uint32 idx); /** returns the window center for the given VOI Preset * @param modality Modality, e.g. "CT", "MR", "DX" etc. * @param idx index of the value, must be < getNumberOfVOIPresets(modality) * @return window center if present, 0.0 otherwise. */ double getVOIPresetWindowCenter(const char *modality, Uint32 idx); /** returns the window width for the given VOI Preset * @param modality Modality, e.g. "CT", "MR", "DX" etc. * @param idx index of the value, must be < getNumberOfVOIPresets(modality) * @return window width if present, 1.0 otherwise. */ double getVOIPresetWindowWidth(const char *modality, Uint32 idx); /* TLS settings */ /** returns the directory in which TLS related files (certificates, keys, * random data, Diffie-Hellman parameters etc.) are located. * @return TLS directory path, NULL if absent. */ const char *getTLSFolder(); /** returns the directory in which certificates of the trusted * Certification Authorities are located. * @return TLS CA Certificate directory path, NULL if absent. */ const char *getTLSCACertificateFolder(); /** returns the file format used for certificates, keys and Diffie-Hellman * parameters. OFTrue for PEM ("privacy enhanced mail") format, OFFalse for * DER ("distinguished encoding rules") format. * @return OFTrue for PEM (default), OFFalse for DER. */ OFBool getTLSPEMFormat(); /* User login settings */ /** returns the directory in which user certificates and keys * are located. * @return User key/certificate directory path, NULL if absent. */ const char *getUserCertificateFolder(); /** returns the number of configured users in the USERS section. * @return number of configured users */ Uint32 getNumberOfUsers(); /** returns the symbolic identifier of the user with the given index. * The symbolic identifier is unique within the configuration file. * @param idx index, must be < getNumberOfUsers() * @return identifier if found, NULL otherwise. */ const char *getUserID(Uint32 idx); /** returns the login for the given user. If absent in the config file, * returns NULL. * @param userID user ID as returned by getUserID() * @return login for the given user */ const char *getUserLogin(const char *userID); /** returns the human readable name for the given user. * If absent in the config file, returns NULL. * @param userID user ID as returned by getUserID() * @return name for the given user */ const char *getUserName(const char *userID); /** returns the name for the given user in DICOM Person Name (PN) format. * If absent in the config file, returns NULL. * @param userID user ID as returned by getUserID() * @return DICOM PN name for the given user */ const char *getUserDICOMName(const char *userID); /** returns the organization for the given user. * If absent in the config file, returns NULL. * @param userID user ID as returned by getUserID() * @return organization for the given user */ const char *getUserOrganization(const char *userID); /** returns the coding scheme designator of the user code for the given user if present. * @param userID user ID as returned by getUserID() * @param value the result is both stored in this object and returned as return value. * @return value if present, NULL otherwise. */ const char *getUserCodingSchemeDesignator(const char *userID, OFString& value); /** returns the coding scheme version of the user code for the given user if present. * @param userID user ID as returned by getUserID() * @param value the result is both stored in this object and returned as return value. * @return value if present, NULL otherwise. */ const char *getUserCodingSchemeVersion(const char *userID, OFString& value); /** returns the code value of the user code for the given user if present. * @param userID user ID as returned by getUserID() * @param value the result is both stored in this object and returned as return value. * @return value if present, NULL otherwise. */ const char *getUserCodeValue(const char *userID, OFString& value); /** returns the code meaning of the user code for the given user if present. * @param userID user ID as returned by getUserID() * @param value the result is both stored in this object and returned as return value. * @return value if present, NULL otherwise. */ const char *getUserCodeMeaning(const char *userID, OFString& value); /** returns the certificate file name for the given user. * If absent in the config file, returns NULL. * @param userID user ID as returned by getUserID() * @return certificate file for the given user */ const char *getUserCertificate(const char *userID); /** returns the private key file name for the given user. * If absent in the config file, returns NULL. * @param userID user ID as returned by getUserID() * @return key file for the given user */ const char *getUserPrivateKey(const char *userID); private: /** private undefined copy constructor */ DVConfiguration(const DVConfiguration&); /** private undefined assignment operator */ DVConfiguration& operator=(const DVConfiguration&); /** returns the entry with the given keys. * @param l2_key level 2 key * @param l1_key level 1 key * @param l0_key level 0 key (entry name) * @return value assigned to the key if present, NULL otherwise. */ const char *getConfigEntry(const char *l2_key, const char *l1_key, const char *l0_key); /** returns the entry with the given keys as bool. * @param l2_key level 2 key * @param l1_key level 1 key * @param l0_key level 0 key (entry name) * @param deflt default to be returned if entry is not present or syntax error. * @return value assigned to the key if present, default otherwise. */ OFBool getConfigBoolEntry(const char *l2_key, const char *l1_key, const char *l0_key, OFBool deflt); /* member variables */ /** pointer to the configuration file data if the configuration file was found. * NULL otherwise. */ OFConfigFile *pConfig; }; #endif /* * CVS/RCS Log: * $Log: dvpscf.h,v $ * Revision 1.34 2010-10-14 13:16:36 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.33 2009-11-24 14:12:57 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.32 2005-12-08 16:03:36 meichel * Changed include path schema for all DCMTK header files * * Revision 1.31 2003/04/29 10:13:56 meichel * Moved configuration file parser from module dcmpstat to ofstd and renamed * class to OFConfigFile. Cleaned up implementation (no more friend declarations). * * Revision 1.30 2002/11/29 13:16:31 meichel * Introduced new command line option --timeout for controlling the * connection request timeout. * * Revision 1.29 2002/11/25 18:27:39 meichel * Converted compile time option to leniently handle space padded UIDs * in the Storage Service Class into command line / config file option. * * Revision 1.28 2001/06/01 15:50:12 meichel * Updated copyright header * * Revision 1.27 2000/11/13 14:20:54 joergr * Updated comments. * * Revision 1.26 2000/11/13 11:52:41 meichel * Added support for user logins and certificates. * * Revision 1.25 2000/11/13 10:42:39 joergr * Added support for Structured Reporting "templates". * * Revision 1.24 2000/10/10 12:23:40 meichel * Added extensions for TLS encrypted communication * * Revision 1.23 2000/06/21 15:40:57 meichel * Added DICOMscope support for calling the Presentation State Checker. * * Revision 1.22 2000/06/07 14:16:21 joergr * Added configuration file entry "LogLevel" to filter log messages. * * Revision 1.21 2000/06/07 13:17:45 meichel * added binary and textual log facilities to Print SCP. * * Revision 1.20 2000/06/06 09:42:48 joergr * Moved configuration file entry "LogDirectory" from "[PRINT]" to new * (more general) section "[APPLICATION]". * * Revision 1.19 2000/06/05 16:22:27 joergr * Implemented log message methods. * * Revision 1.18 2000/06/02 16:00:43 meichel * Adapted all dcmpstat classes to use OFConsole for log and error output * * Revision 1.17 2000/06/02 13:53:54 joergr * Implemented start/terminatePrintServer methods. * * Revision 1.16 2000/06/02 12:41:51 joergr * Corrected wrong interface descriptions. * * Revision 1.15 2000/05/31 12:56:37 meichel * Added initial Print SCP support * * Revision 1.14 2000/05/30 13:40:02 joergr * Removed methods which were already marked as "retired". * Added new section to the config file describing the query/retrieve server * settings. * * Revision 1.13 2000/03/08 16:28:49 meichel * Updated copyright header. * * Revision 1.12 1999/11/03 13:05:32 meichel * Added support for transmitting annotations in the film session label. * Added support for dump tool launched from DVInterface. * * Revision 1.11 1999/10/20 10:47:14 joergr * Added support for a down-scaled preview image of the current DICOM image * (e.g. useful for online-windowing or print preview). * * Revision 1.10 1999/10/19 14:46:02 meichel * added support for the Basic Annotation Box SOP Class * as well as access methods for Max Density and Min Density. * * Revision 1.9 1999/10/13 14:11:56 meichel * Added config file entries and access methods * for user-defined VOI presets, log directory, verbatim logging * and an explicit list of image display formats for each printer. * * Revision 1.8 1999/10/07 17:21:46 meichel * Reworked management of Presentation LUTs in order to create tighter * coupling between Softcopy and Print. * * Revision 1.7 1999/10/01 13:32:36 joergr * Added new option to config file: AlwaysDeleteTerminateJobs. * * Revision 1.6 1999/09/24 15:24:29 meichel * Added support for CP 173 (Presentation LUT clarifications) * * Revision 1.5 1999/09/23 17:37:13 meichel * Added support for Basic Film Session options to dcmpstat print code. * * Revision 1.4 1999/09/15 17:43:26 meichel * Implemented print job dispatcher code for dcmpstat, adapted dcmprtsv * and dcmpsprt applications. * * Revision 1.3 1999/09/13 15:19:09 meichel * Added implementations for a number of further print API methods. * * Revision 1.2 1999/09/10 12:46:45 meichel * Added implementations for a number of print API methods. * * Revision 1.1 1999/09/08 16:42:02 meichel * Moved configuration file evaluation to separate class. * * */ dcmtk-3.6.0/dcmpstat/include/dcmtk/dcmpstat/dvpsrsl.h0000644000310500011400000002206411455601264022100 0ustar joergrdicom3/* * * Copyright (C) 1998-2010, 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: DVPSReferencedSeries_PList * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:16:36 $ * CVS/RCS Revision: $Revision: 1.14 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DVPSRSL_H #define DVPSRSL_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcitem.h" class DVPSReferencedSeries; class DVPSReferencedImage; /** the list of referenced series contained in a presentation state (internal use only). * This class manages the data structures comprising the complete * Referenced Series Sequence in a Presentation State object. */ class DVPSReferencedSeries_PList { public: /// default constructor DVPSReferencedSeries_PList(); /// copy constructor DVPSReferencedSeries_PList(const DVPSReferencedSeries_PList& copy); /** clone method. * @return a pointer to a new DVPSReferencedSeries_PList object containing * a deep copy of this object. */ DVPSReferencedSeries_PList *clone() { return new DVPSReferencedSeries_PList(*this); } /// destructor virtual ~DVPSReferencedSeries_PList(); /** reads a list of series references (ReferencedSeriesSequence) from a DICOM dataset. * The DICOM elements of the image references item are copied from the dataset to this object. * The completeness of all items (presence of all required elements, * value multiplicity) is checked. * If this method returns an error code, the object is in undefined state afterwards. * @param dset the DICOM dataset from which the sequence is to be read * @return EC_Normal if successful, an error code otherwise. */ OFCondition read(DcmItem &dset); /** writes the list of series references managed by this object to a DICOM dataset. * Copies of the DICOM element managed by this object are inserted into * the DICOM dataset. * @param dset the DICOM dataset to which the ReferencedSeriesSequence is written * @return EC_Normal if successful, an error code otherwise. */ OFCondition write(DcmItem &dset); /** reset the object to initial state. * After this call, the object is in the same state as after * creation with the default constructor. */ void clear(); /** checks whether at least one series is referenced, whether all referenced * series contain image references and whether all references images use the same * SOP class. */ OFBool isValid(); /** checks whether all images referenced in this series use the passed SOP class UID. * @param uid the SOP class UID to be checked * @return result of the test */ OFBool checkSOPClass(const char *uid); /** find series reference in this list. * This method checks if a series reference with the given Series Instance UID exists * in this ReferencedSeriesSequence. * @param seriesUID the Series Instance UID of the searched series reference * @return a pointer to the matching DVPSReferencedSeries if found, NULL otherwise. */ DVPSReferencedSeries *findSeriesReference(const char *seriesUID); /** find image reference in this list. * This method checks if an image reference with the given Series Instance UID and * SOP instance UID exists in this ReferencedImageSequence. * @param seriesUID the Series Instance UID of the searched image reference * @param instanceUID the SOP Instance UID of the searched image reference * @return a pointer to the matching DVPSReferencedImage if found, NULL otherwise. */ DVPSReferencedImage *findImageReference(const char *seriesUID, const char *instanceUID); /** removes series reference. * This method checks if an series reference with the given Series Instance UID exists * in this ReferencedSeriesSequence and deletes it (including its image references). * @param seriesUID the Series Instance UID of the series reference to be removed. */ void removeSeriesReference(const char *seriesUID); /** removes image reference. * This method checks if an image reference with the given SOP instance UID exists * in the series with the given Series Instance UID and deletes it. * @param seriesUID the Series Instance UID of the image reference to be removed. * @param instanceUID the SOP instance UID of the image reference to be removed. */ void removeImageReference(const char *seriesUID, const char *instanceUID); /** add new image reference. * This method checks if the given SOP class matches the SOP class of all * other existing image references and whether the image reference exists. * In this case an error code is returned. Otherwise a new image reference * (in a new series if necessary) is created. * @param seriesUID the Series Instance UID of the image reference to be added. * @param sopclassUID the SOP class UID of the image reference to be added. * @param instanceUID the SOP instance UID of the image reference to be added. * @param frames a list of frame numbers in DICOM IS format * (integer numbers separated by '\' characters). Default: frame numbers absent. * The frame numbers are required if the referenced image is a multiframe image. * @param aetitle the series retrieveAETitle. Default: value absent. * @param filesetID the series storageMediaFileSetID. Default: value absent. * @param filesetUID the series storageMediaFileSetUID. Default: value absent. * @return EC_Normal if successful, an error code otherwise. */ OFCondition addImageReference( const char *seriesUID, const char *sopclassUID, const char *instanceUID, const char *frames=NULL, const char *aetitle=NULL, const char *filesetID=NULL, const char *filesetUID=NULL); /** gets the number of image references in all series managed by this list. * @return number of image references */ size_t numberOfImageReferences(); /** gets an image reference with the given index. * @param idx index, must be < numberOfImageReferences(). * @param seriesUID the Series Instance UID is returned in this string * @param sopclassUID the SOP Class UID is returned in this string * @param instanceUID the SOP Instance UID is returned in this string * @param frames the list of frames is returned in this string * @param aetitle the series retrieveAETitle is returned in this string * @param filesetID the series storageMediaFileSetID is returned in this string * @param filesetUID the series storageMediaFileSetUID is returned in this string * @return EC_Normal if successful, an error code otherwise. */ OFCondition getImageReference( size_t idx, OFString& seriesUID, OFString& sopclassUID, OFString& instanceUID, OFString& frames, OFString& aetitle, OFString& filesetID, OFString& filesetUID); private: /// private undefined assignment operator DVPSReferencedSeries_PList& operator=(const DVPSReferencedSeries_PList&); /** the list maintained by this object */ OFList list_; }; #endif /* * $Log: dvpsrsl.h,v $ * Revision 1.14 2010-10-14 13:16:36 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.13 2010-10-07 14:31:36 joergr * Removed leading underscore characters from preprocessor symbols (reserved). * * Revision 1.12 2009-11-24 14:12:57 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.11 2009-09-30 10:42:38 uli * Make dcmpstat's include headers self-sufficient by including all * needed headers directly and stop using dctk.h * * Revision 1.10 2005-12-08 16:04:02 meichel * Changed include path schema for all DCMTK header files * * Revision 1.9 2003/06/04 10:18:06 meichel * Replaced private inheritance from template with aggregation * * Revision 1.8 2001/09/26 15:36:15 meichel * Adapted dcmpstat to class OFCondition * * Revision 1.7 2001/06/01 15:50:21 meichel * Updated copyright header * * Revision 1.6 2000/06/02 16:00:51 meichel * Adapted all dcmpstat classes to use OFConsole for log and error output * * Revision 1.5 2000/03/08 16:28:56 meichel * Updated copyright header. * * Revision 1.4 1999/07/22 16:39:11 meichel * Adapted dcmpstat data structures and API to supplement 33 letter ballot text. * * Revision 1.3 1999/01/15 17:33:04 meichel * added methods to DVPresentationState allowing to access the image * references in the presentation state. Also added methods allowing to * get the width and height of the attached image. * * Revision 1.2 1998/12/14 16:10:34 meichel * Implemented Presentation State interface for graphic layers, * text and graphic annotations, presentation LUTs. * * Revision 1.1 1998/11/27 14:50:33 meichel * Initial Release. * * */ dcmtk-3.6.0/dcmpstat/include/dcmtk/dcmpstat/dvpsga.h0000644000310500011400000002016311455601264021665 0ustar joergrdicom3/* * * Copyright (C) 1998-2010, 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: DVPSGraphicAnnotation * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:16:36 $ * CVS/RCS Revision: $Revision: 1.12 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DVPSGA_H #define DVPSGA_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcvrcs.h" /* for DcmCodeString */ #include "dcmtk/dcmpstat/dvpstxl.h" /* for DVPSTextObject_PList */ #include "dcmtk/dcmpstat/dvpsgrl.h" /* for DVPSGraphicObject_PList */ #include "dcmtk/dcmpstat/dvpsril.h" /* for DVPSReferencedImage_PList */ #include "dcmtk/dcmpstat/dvpstyp.h" /* for enum types */ /** an item of the graphic annotation sequence in a presentation state (internal use only). * This class manages the data structures comprising one item * of the Graphic Annotation Sequence in a Presentation State object. */ class DVPSGraphicAnnotation { public: /// default constructor DVPSGraphicAnnotation(); /// copy constructor DVPSGraphicAnnotation(const DVPSGraphicAnnotation& copy); /** clone method. * @return a pointer to a new DVPSGraphicAnnotation object containing * a deep copy of this object. */ DVPSGraphicAnnotation *clone() { return new DVPSGraphicAnnotation(*this); } /// destructor virtual ~DVPSGraphicAnnotation(); /** reads a graphic annotation from a DICOM dataset. * The DICOM elements of the Graphic Annotation item are copied * from the dataset to this object. * The completeness of the item (presence of all required elements, * value multiplicity) is checked. * If this method returns an error code, the object is in undefined state afterwards. * @param dset the item of the GraphicAnnotationSequence from which the data is to be read * @return EC_Normal if successful, an error code otherwise. */ OFCondition read(DcmItem &dset); /** writes the graphic annotation managed by this object to a DICOM dataset. * Copies of the DICOM element managed by this object are inserted into * the DICOM dataset. * @param dset the the item of the GraphicAnnotationSequence to which the data is written * @return EC_Normal if successful, an error code otherwise. */ OFCondition write(DcmItem &dset); /** get annotation layer name. * @return a pointer to the annotation layer name */ const char *getAnnotationLayer(); /** set annotation layer name of this annotation. * @param aLayer a pointer to the annotation layer name, which is copied into this object. */ void setAnnotationLayer(const char *aLayer); /** add a new image reference. * Checks if the referenced SOP instance UID already exists in this sequence. * If it exists, an error code is returned. Otherwise a new image reference * is created and added to the ReferencedImageSequence. * @param sopclassUID the SOP class UID of the image reference to be added. * @param instanceUID the SOP instance UID of the image reference to be added. * @param frame the frame number of the image reference (current image) to be added. * @param applicability the applicability of the image reference (DVPSB_currentFrame or DVPSX_currentImage) * @return EC_Normal if successful, an error code otherwise. */ OFCondition addImageReference( const char *sopclassUID, const char *instanceUID, unsigned long frame, DVPSObjectApplicability applicability); /** checks if this annotation layer is empty. * An annotation layer is empty when it contains no text object and no graphic object. * @return OFTrue if empty. */ OFBool isEmpty(); /** checks if this annotation layer is applicable to the given image and frame. * @param instanceUID SOP instance UID of the current image * @param frame number of the current frame * @param applicability the required (minimum) applicability of the reference. Default: * annotation layer applies to the current frame of the current image. * @return OFTrue if applicable. */ OFBool isApplicable( const char *instanceUID, unsigned long frame, DVPSObjectApplicability applicability=DVPSB_currentFrame); /** returns the number of text objects in this annotation. * @return number of text objects */ size_t getNumberOfTextObjects(); /** returns the number of graphic objects in this annotation. * @return number of graphic objects */ size_t getNumberOfGraphicObjects(); /** returns a pointer to the text object with the given * index or NULL if it does not exist. * @param idx index, must be < getNumberOfTextObjects() * @return pointer to text object or NULL */ DVPSTextObject *getTextObject(size_t idx); /** returns a pointer to the graphic object with the given * index or NULL if it does not exist. * @param idx index, must be < getNumberOfGraphicObjects() * @return pointer to graphic object or NULL */ DVPSGraphicObject *getGraphicObject(size_t idx); /** adds the given text object to * the list of text objects managed by this object. * @param text text object to be inserted. */ void addTextObject(DVPSTextObject *text); /** adds the given graphic object to * the list of graphic objects managed by this object. * @param text graphic object to be inserted. */ void addGraphicObject(DVPSGraphicObject *graphic); /** returns a pointer to the text object with the given * index (or NULL if it does not exist) and removes it from the list. * @param idx index, must be < getNumberOfTextObjects() * @return pointer to text object or NULL */ DVPSTextObject *removeTextObject(size_t idx); /** returns a pointer to the graphic object with the given * index (or NULL if it does not exist) and removes it from the list. * @param idx index, must be < getNumberOfGraphicObjects() * @return pointer to graphic object or NULL */ DVPSGraphicObject *removeGraphicObject(size_t idx); private: /// private undefined assignment operator DVPSGraphicAnnotation& operator=(const DVPSGraphicAnnotation&); /// ReferencedImageSequence, Type 1c DVPSReferencedImage_PList referencedImageList; /// VR=CS, VM=1, Type 1 DcmCodeString graphicAnnotationLayer; /// TextObjectSequence, Type 1c DVPSTextObject_PList textObjectList; /// GraphicObjectSequence, Type 1c DVPSGraphicObject_PList graphicObjectList; }; #endif /* * $Log: dvpsga.h,v $ * Revision 1.12 2010-10-14 13:16:36 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.11 2010-10-07 14:31:35 joergr * Removed leading underscore characters from preprocessor symbols (reserved). * * Revision 1.10 2009-11-24 14:12:57 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.9 2009-09-30 10:42:38 uli * Make dcmpstat's include headers self-sufficient by including all * needed headers directly and stop using dctk.h * * Revision 1.8 2005-12-08 16:03:43 meichel * Changed include path schema for all DCMTK header files * * Revision 1.7 2001/09/26 15:36:10 meichel * Adapted dcmpstat to class OFCondition * * Revision 1.6 2001/06/01 15:50:15 meichel * Updated copyright header * * Revision 1.5 2000/06/02 16:00:45 meichel * Adapted all dcmpstat classes to use OFConsole for log and error output * * Revision 1.4 2000/03/08 16:28:51 meichel * Updated copyright header. * * Revision 1.3 1999/07/22 16:39:06 meichel * Adapted dcmpstat data structures and API to supplement 33 letter ballot text. * * Revision 1.2 1998/12/14 16:10:27 meichel * Implemented Presentation State interface for graphic layers, * text and graphic annotations, presentation LUTs. * * Revision 1.1 1998/11/27 14:50:26 meichel * Initial Release. * * */ dcmtk-3.6.0/dcmpstat/include/dcmtk/dcmpstat/dvpsspl.h0000644000310500011400000002176311455601264022103 0ustar joergrdicom3/* * * Copyright (C) 1998-2010, 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: DVPSStoredPrint_PList * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:16:36 $ * CVS/RCS Revision: $Revision: 1.11 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DVPSSPL_H #define DVPSSPL_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/ofstd/oflist.h" #include "dcmtk/dcmdata/dcvrus.h" #include "dcmtk/dcmdata/dcvrui.h" #include "dcmtk/dcmnet/dimse.h" #include "dcmtk/dcmpstat/dvpstyp.h" class DVInterface; class DVPSStoredPrint; class DVConfiguration; class DVPSPresentationLUT_PList; /** a list of stored print objects, each of which manages a single Basic * Film Box in a Print SCP. */ class DVPSStoredPrint_PList { public: /// default constructor DVPSStoredPrint_PList(); /// copy constructor DVPSStoredPrint_PList(const DVPSStoredPrint_PList& copy); /** clone method. * @return a pointer to a new DVPSStoredPrint_PList object containing * a deep copy of this object. */ DVPSStoredPrint_PList *clone() { return new DVPSStoredPrint_PList(*this); } /// destructor virtual ~DVPSStoredPrint_PList(); /** reset the object to initial state. * After this call, the object is in the same state as after * creation with the default constructor. */ void clear(); /** get number of stored print objects in this list. * @return the number of stored print objects. */ size_t size() const { return list_.size(); } /** adds a Stored Print object to the list of managed objects. The stored * print object becomes owned by this object and is destroyed upon * destruction of the list. * @param newSP Stored Print object to be added. */ void insert(DVPSStoredPrint *newSP) { if (newSP) list_.push_back(newSP); } /** performs a Print SCP Basic Film Box N-SET operation. * The results of the N-SET operation are stored in the * objects passed as rsp and rspDataset. * @param cfg config file facility * @param cfgname symbolic printer name in config file * @param rq N-SET request message * @param rqDataset N-SET request dataset * @param rsp N-SET response message * @param rspDataset N-SET response dataset passed back in this parameter * @param presentationLUTnegotiated * OFTrue if support for the Presentation LUT SOP class * has been negotiated at association negotiation * @param globalPresentationLUTList * list of presentation LUTs managed by the Print SCP */ void printSCPBasicFilmBoxSet( DVConfiguration& cfg, const char *cfgname, T_DIMSE_Message& rq, DcmDataset *rqDataset, T_DIMSE_Message& rsp, DcmDataset *& rspDataset, OFBool presentationLUTnegotiated, DVPSPresentationLUT_PList& globalPresentationLUTList); /** performs a Print SCP Basic Grayscale Image Box N-SET operation. * The results of the N-SET operation are stored in the * objects passed as rsp and rspDataset. * If successful, a Hardcopy Grayscale Image object containing * the image data of the N-SET request is created in the database. * @param cfg config file facility * @param cfgname symbolic printer name in config file * @param rq N-SET request message * @param rqDataset N-SET request dataset * @param rsp N-SET response message * @param rspDataset N-SET response dataset passed back in this parameter * @param presentationLUTnegotiated * OFTrue if support for the Presentation LUT SOP class * has been negotiated at association negotiation */ void printSCPBasicGrayscaleImageBoxSet( DVInterface& cfg, const char *cfgname, T_DIMSE_Message& rq, DcmDataset *rqDataset, T_DIMSE_Message& rsp, DcmDataset *& rspDataset, OFBool presentationLUTnegotiated); /** performs a Print SCP Basic Film Box N-ACTION operation. * The results of the N-ACTION operation are stored in the * object passed as rsp. * If successful, a Stored Print object containing the film box * hierarchy is created in the database. * @param cfg config file facility * @param cfgname symbolic printer name in config file * @param rq N-ACTION request message * @param rsp N-ACTION response message * @param globalPresentationLUTList list of presentation LUTs managed by the Print SCP */ void printSCPBasicFilmBoxAction( DVInterface& cfg, const char *cfgname, T_DIMSE_Message& rq, T_DIMSE_Message& rsp, DVPSPresentationLUT_PList& globalPresentationLUTList); /** performs a Print SCP Basic Film Session N-ACTION operation. * The results of the N-ACTION operation are stored in the * object passed as rsp. * If successful, one Stored Print object for each film box * in the film session is created in the database. * @param cfg config file facility * @param cfgname symbolic printer name in config file * @param rsp N-ACTION response message * @param globalPresentationLUTList list of presentation LUTs managed by the Print SCP */ void printSCPBasicFilmSessionAction( DVInterface& cfg, const char *cfgname, T_DIMSE_Message& rsp, DVPSPresentationLUT_PList& globalPresentationLUTList); /** performs a Print SCP basic film box N-DELETE operation. * The results of the N-DELETE operation are stored in the object passed as rsp. * @param rq N-DELETE request message * @param rsp N-DELETE response message */ void printSCPBasicFilmBoxDelete(T_DIMSE_Message& rq, T_DIMSE_Message& rsp); /** checks whether a film box object with the given SOP instance UID * already exists. * @param uid uid to be checked * @return OFTrue if found, OFFalse otherwise */ OFBool haveFilmBoxInstance(const char *uid); /** checks whether the Presentation LUT with the given UID * is referenced by any Stored Print object in this list * on the film box level. * @param uid uid to be compared * @return OFTrue if equal, OFFalse otherwise */ OFBool usesPresentationLUT(const char *uid); /** checks whether the given Presentation LUT type could be used together * with all image boxes in all film boxes on a Print SCP that requires a matching * alignment between a Presentation LUT and the image pixel data. * @param align LUT alignment type * @return OFTrue if matching, OFFalse otherwise */ OFBool matchesPresentationLUT(DVPSPrintPresentationLUTAlignment align) const; /** replaces the settings for illumination, reflected ambient light and * referenced Presentation LUT in all film boxes in this list. * Used by a Print SCP if Presentation LUT is implemented on Film Session * level. * @param newIllumination new value for illumination * @param newReflectedAmbientLight new value for reflectedAmbientLight * @param newReferencedPLUT new value for referenced presentation LUT instance UID * @param newAlignment new alignment type of active presentation LUT */ void overridePresentationLUTSettings( DcmUnsignedShort& newIllumination, DcmUnsignedShort& newReflectedAmbientLight, DcmUniqueIdentifier& newReferencedPLUT, DVPSPrintPresentationLUTAlignment newAlignment); private: /// private undefined assignment operator DVPSStoredPrint_PList& operator=(const DVPSStoredPrint_PList&); /** the list maintained by this object */ OFList list_; }; #endif /* * $Log: dvpsspl.h,v $ * Revision 1.11 2010-10-14 13:16:36 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.10 2010-10-07 14:31:36 joergr * Removed leading underscore characters from preprocessor symbols (reserved). * * Revision 1.9 2010-03-01 09:08:49 uli * Removed some unnecessary include directives in the headers. * * Revision 1.8 2009-11-24 14:12:57 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.7 2009-09-30 10:42:38 uli * Make dcmpstat's include headers self-sufficient by including all * needed headers directly and stop using dctk.h * * Revision 1.6 2005-12-08 16:04:04 meichel * Changed include path schema for all DCMTK header files * * Revision 1.5 2003/06/04 10:18:06 meichel * Replaced private inheritance from template with aggregation * * Revision 1.4 2001/06/01 15:50:22 meichel * Updated copyright header * * Revision 1.3 2000/06/08 10:44:30 meichel * Implemented Referenced Presentation LUT Sequence on Basic Film Session level. * Empty film boxes (pages) are not written to file anymore. * * Revision 1.2 2000/06/02 16:00:52 meichel * Adapted all dcmpstat classes to use OFConsole for log and error output * * Revision 1.1 2000/05/31 12:56:36 meichel * Added initial Print SCP support * * */ dcmtk-3.6.0/dcmpstat/include/dcmtk/dcmpstat/dvpstat.h0000644000310500011400000022115311455601265022071 0ustar joergrdicom3/* * * Copyright (C) 1998-2010, 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: DVPresentationState * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:16:37 $ * CVS/RCS Revision: $Revision: 1.47 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DVPSTAT_H #define DVPSTAT_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmpstat/dcmpstat.h" class DicomImage; class DiDisplayFunction; /** a Grayscale Softcopy Presentation State. * This class manages the data structures comprising a Presentation State object. * Presentation states can be created, read, written, and modified. */ class DVPresentationState: public DcmPresentationState { public: /** default constructor * @param dispFunction list of objects describing the display * characteristics of the monitor. Used to implement the standard display function. * The parameter should be an array with DVPSD_max entries (see DVInterface). * If absent, no display transform is performed. * @param minPrintBitmapX default value for minimum print bitmap size X * @param minPrintBitmapY default value for minimum print bitmap size Y * @param maxPrintBitmapX default value for maximum print bitmap size X * @param maxPrintBitmapY default value for maximum print bitmap size Y * @param maxPreviewImageX default value for maximum preview image size X * @param maxPreviewImageY default value for maximum preview image size Y */ DVPresentationState( DiDisplayFunction **dispFunction=NULL, unsigned long minPrintBitmapX=0, unsigned long minPrintBitmapY=0, unsigned long maxPrintBitmapX=0, unsigned long maxPrintBitmapY=0, unsigned long maxPreviewImageX=0, unsigned long maxPreviewImageY=0); /// destructor virtual ~DVPresentationState(); /** resets the object to initial state. * After this call, the object is in the same state as after * creation with the default constructor. */ void clear(); /** reads a presentation state from a DICOM dataset. * The DICOM elements of the presentation state are copied * from the dataset to this object. * The completeness and correctness of the * presentation state (presence of all required elements, * value multiplicity) is checked. * If this method returns an error code, the object is in undefined state afterwards. * @param dset the dataset from which the presentation state is to be read * @return EC_Normal if successful, an error code otherwise. */ OFCondition read(DcmItem &dset); /** creates a default presentation state for a DICOM image. * A number of flags specify how curves, overlays, VOI transformations, * a display shutter and a presentation LUT shape * should be treated when found in the image IOD. * If this method returns an error code, the object is in undefined state afterwards. * @param dset the DICOM dataset containing the image IOD * @param overlayActivation flag defining how overlays should be handled * (copied, activated or ignored). Default: Copy overlays. * @param voiActivation flag defining how VOI LUTs or VOI window width/center should * be handled. Default: Use VOI and prefer VOI LUT from VOI window. * @param curveActivation flag defining whether curves in the image should * be activated. Default: Activate curves. * @param shutterActivation flag defining whether a shutter (not bitmap shutter) * should be copied to the presentation state when found in the image. * Default: Copy shutter. * @param presentationActivation flag defining whether a presentation LUT shape * should be copied to the presentation state when found in the image. * Default: Copy presentation LUT shape. * @param layering flag defining how graphic layers should be created for * activated overlays and curves. Default: Create one layer for all overlays * and another layer for all curves. * @param aetitle the series retrieveAETitle. Must be a valid DICOM 'AE' value. Default: value absent. * @param filesetID the series storageMediaFileSetID. Must be a valid DICOM 'SH' value. Default: value absent. * @param filesetUID the series storageMediaFileSetUID. Must be a valid DICOM UID. Default: value absent. * @return EC_Normal upon success, an error code otherwise. */ OFCondition createFromImage(DcmItem &dset, DVPSoverlayActivation overlayActivation = DVPSO_copyOverlays, DVPSVOIActivation voiActivation = DVPSV_preferVOILUT, OFBool curveActivation = OFTrue, OFBool shutterActivation = OFTrue, OFBool presentationActivation = OFTrue, DVPSGraphicLayering layering = DVPSG_twoLayers, const char * aetitle = NULL, const char * filesetID = NULL, const char * filesetUID = NULL); /** adds a reference to the currently attached image to this * presentation state. This method checks if the given image * is not yet referenced and if its Study UID and SOP class * match for this presentation state and returns an error code otherwise. * @param aetitle the series retrieveAETitle. Must be a valid DICOM 'AE' value. Default: value absent. * @param filesetID the series storageMediaFileSetID. Must be a valid DICOM 'SH' value. Default: value absent. * @param filesetUID the series storageMediaFileSetUID. Must be a valid DICOM UID. Default: value absent. * @return EC_Normal if successful, an error code otherwise. */ OFCondition addImageReferenceAttached( const char *aetitle=NULL, const char *filesetID=NULL, const char *filesetUID=NULL); /** removes a reference to the currently attached image from this presentation state. * @return EC_Normal if successful, an error code otherwise. */ OFCondition removeImageReferenceAttached(); /** sets the current Presentation LUT type. * DVPSP_table can only be used if the presentation state * contains a lookup table, i.e. if havePresentationLookupTable() returns OFTrue. * @param newType the new presentation LUT type. * @return EC_Normal if successful, an error code otherwise. */ OFCondition setCurrentPresentationLUT(DVPSPresentationLUTType newType); /** resets the Presentation LUT to the default LUT shape * which is DVPSP_identity for MONOCHROME2 images and DVPSP_inverse for MONOCHROME1. * DVPSP_table can only be used if the presentation state * contains a lookup table, i.e. if havePresentationLookupTable() returns OFTrue. * @return EC_Normal if successful, an error code otherwise. */ OFCondition setDefaultPresentationLUTShape(); /** stores a presentation lookup table in the presentation state. * This method stores a presentation lookup table in the * presentation state and activates it. The LUT is copied to * the presentation state. If the method returns EC_Normal, * any old presentation LUT in the presentation state is overwritten. * This method keeps the inverse/not inverse status intact, * i.e. inverses the LUT if necessary. * @param lutDescriptor the LUT Descriptor in DICOM format (VM=3) * @param lutData the LUT Data in DICOM format * @param lutExplanation the LUT Explanation in DICOM format, may be empty. * @return EC_Normal if successful, an error code otherwise. */ OFCondition setPresentationLookupTable( DcmUnsignedShort& lutDescriptor, DcmUnsignedShort& lutData, DcmLongString& lutExplanation); /** stores a presentation lookup table in the presentation state. * This method stores a presentation lookup table in the * presentation state and activates it. The LUT is copied to * the presentation state. Overwrites old LUT. If unsuccessful, * LUT is set to DVPSP_identity. * This method keeps the inverse/not inverse status intact, * i.e. inverses the LUT if necessary. * @param dset dataset from which the Presentation LUT SQ or Shape is read. * @return EC_Normal if successful, an error code otherwise. */ OFCondition setPresentationLookupTable(DcmItem &dset); /** writes the current Presentation LUT to a DICOM dataset. * Copies of the DICOM element managed by this object are inserted into * the DICOM dataset. In the case of a MONOCHROME1 image an inverted * LUT is written to dataset because the print bitmap is always MONOCHROME2. * @param dset the dataset to which the Presentation LUT SQ/Shape is written * @return EC_Normal if successful, an error code otherwise. */ OFCondition writePresentationLUTforPrint(DcmItem &dset); /** checks whether the attached image is MONOCHROME1. In this case, the * presentation LUT must be reversed when applied to the print bitmap * which is always MONOCHROME2. * @return OFTrue if attached image is MONOCHROME1, OFFalse otherwise. */ OFBool isMonochrome1Image() { return currentImageMonochrome1; } /** check if a VOI window is currently active * @return OFTrue if a VOI window is active */ OFBool haveActiveVOIWindow(); /** check if a VOI LUT is currently active * @return OFTrue if a VOI LUT is active */ OFBool haveActiveVOILUT(); /** returns a description string for a currently active VOI transform. * If no description is available, NULL is returned. * @return a pointer to a string or NULL. */ const char *getCurrentVOIDescription(); /** gets the width of the current VOI window. * May only be called if haveActiveVOIWindow() is OFTrue. * @param w the window width is returned in this parameter * @return EC_Normal upon success, an error code otherwise. */ OFCondition getCurrentWindowWidth(double &w); /** get the center of the current VOI window. * May only be called if haveActiveVOIWindow() is OFTrue. * @param c the window center is returned in this parameter * @return EC_Normal upon success, an error code otherwise. */ OFCondition getCurrentWindowCenter(double &c); /** gets the number of VOI LUTs available in the attached image. */ size_t getNumberOfVOILUTsInImage(); /** gets the number of VOI Windows available in the attached image. */ size_t getNumberOfVOIWindowsInImage(); /** returns a description string for the given VOI LUT in the attached * image. * If no description for the given index is available, NULL is returned. * @param idx index, must be < getNumberOfVOILUTsInImage() * @return a pointer to a string or NULL. */ const char *getDescriptionOfVOILUTsInImage(size_t idx); /** returns a description string for the given VOI Window * in the attached image. * If no description for the given index is available, NULL is returned. * @param idx index, must be < getNumberOfVOIWindowsInImage() * @return a pointer to a string or NULL. */ const char *getDescriptionOfVOIWindowsInImage(size_t idx); /** activates one of the VOI LUTs from the attached image. * The applicability of the activation is controlled by the applicability parameter. * @param idx index of the VOI transform, must be < getNumberOfVOILUTsInImage(). * @param applicability defines the applicability of the new VOI transform. * @return EC_Normal upon success, an error code otherwise. */ OFCondition setVOILUTFromImage(size_t idx, DVPSObjectApplicability applicability=DVPSB_currentImage); /** activates one of the VOI Windows from the attached image. * The applicability of the activation is controlled by the applicability parameter. * @param idx index of the VOI transform, must be < getNumberOfVOIWindowsInImage(). * @param applicability defines the applicability of the new VOI transform. * @return EC_Normal upon success, an error code otherwise. */ OFCondition setVOIWindowFromImage(size_t idx, DVPSObjectApplicability applicability=DVPSB_currentImage); /** sets a user defined VOI window center and width. * The applicability of the VOI window is controlled by the applicability parameter. * @param wCenter the window center * @param wWidth the window width * @param description an optional description. Default: absent. * @param applicability defines the applicability of the new VOI transform. * @return EC_Normal upon success, an error code otherwise. */ OFCondition setVOIWindow(double wCenter, double wWidth, const char *description=NULL, DVPSObjectApplicability applicability=DVPSB_currentImage); /** stores a VOI lookup table in the presentation state. * This method stores a VOI lookup table in the * presentation state and activates it. The LUT is copied to * the presentation state. * If the method returns an error code, an old LUT is left unchanged. * The applicability of the VOI LUT is controlled by the applicability parameter. * @param lutDescriptor the LUT Descriptor in DICOM format (VM=3) * @param lutData the LUT Data in DICOM format * @param lutExplanation the LUT Explanation in DICOM format, may be empty. * @param applicability defines the applicability of the new VOI transform. * @return EC_Normal if successful, an error code otherwise. */ OFCondition setVOILUT( DcmUnsignedShort& lutDescriptor, DcmUnsignedShort& lutData, DcmLongString& lutExplanation, DVPSObjectApplicability applicability=DVPSB_currentImage); /** deactivates the current VOI transformation. * The applicability of the deactivation is controlled by the applicability parameter. * After a call to this method, no VOI transform is active for the current image and frame. * @param applicability defines the applicability of the new VOI transform. */ void deactivateVOI(DVPSObjectApplicability applicability=DVPSB_currentImage); /** stores VOI lookup table with a gamma curve shape in the presentation state. * If a VOI window is currently active the center and width values are used to specify * the number of LUT entries and the first value mapped, otherwise the full pixel range * is used. The output range of the LUT is always 16 bit (data is stored as OW). * This method stores a VOI lookup table in the presentation state and activates it. * The LUT is copied to the presentation state. * If the method returns an error code, an old LUT is left unchanged. * The applicability of the VOI LUT is controlled by the applicability parameter. * @param gammaValue gamma value used to create the VOI LUT data * @param applicability defines the applicability of the new VOI transform. * @return EC_Normal if successful, an error code otherwise. */ OFCondition setGammaVOILUT(double gammaValue, DVPSObjectApplicability applicability=DVPSB_currentImage); /** gets the presentation size mode for the current image and frame. * This method may only be called when an image is attached to the presentation state. * @return presentation size mode */ DVPSPresentationSizeMode getDisplayedAreaPresentationSizeMode(); /** gets the presentation pixel aspect ratio for for the current image and frame. * Pixel aspect ratio is defined here as the width of a pixel divided * by the height of a pixel (x/y). * This method may only be called when an image is attached to the presentation state. * @return pixel aspect ratio */ double getDisplayedAreaPresentationPixelAspectRatio(); /** gets the displayed area top lefthand corner and * bottom righthand corner for the current potentially rotated and flipped image and frame. * This method may only be called when an image is attached to the presentation state. * @param tlhcX the displayed area top lefthand corner X value is returned in this parameter * @param tlhcY the displayed area top lefthand corner Y value is returned in this parameter * @param brhcX the displayed area bottom righthand corner X value is returned in this parameter * @param brhcY the displayed area bottom righthand corner Y value is returned in this parameter * @return EC_Normal if successful, an error code otherwise. */ OFCondition getStandardDisplayedArea(Sint32& tlhcX, Sint32& tlhcY, Sint32& brhcX, Sint32& brhcY); /** gets the displayed area top lefthand corner and * bottom righthand corner for the current image and frame, as if the image was unrotated * This method may only be called when an image is attached to the presentation state. * @param tlhcX the displayed area top lefthand corner X value is returned in this parameter * @param tlhcY the displayed area top lefthand corner Y value is returned in this parameter * @param brhcX the displayed area bottom righthand corner X value is returned in this parameter * @param brhcY the displayed area bottom righthand corner Y value is returned in this parameter * @return EC_Normal if successful, an error code otherwise. */ OFCondition getImageRelativeDisplayedArea(Sint32& tlhcX, Sint32& tlhcY, Sint32& brhcX, Sint32& brhcY); /** gets the presentation pixel spacing for the current image and frame if it is known. * @param x the horizontal pixel spacing (mm) is returned in this parameter upon success * @param y the vertical pixel spacing (mm) is returned in this parameter upon success * @return EC_Normal if successful, an error code if no presentation pixel spacing is available. */ OFCondition getDisplayedAreaPresentationPixelSpacing(double& x, double& y); /** gets the presentation pixel magnification ratio for the current image and frame if it is present. * @param magnification the magnification ratio is returned in this parameter upon success * @return EC_Normal if successful, an error code if no magnification ratio is available. */ OFCondition getDisplayedAreaPresentationPixelMagnificationRatio(double& magnification); /** checks if "TRUE SIZE" can be used as presentation size mode for the current image and frame * (i.e. pixel spacing is known). * @return OFTrue if TRUE SIZE mode is available, OFFalse otherwise. */ OFBool canUseDisplayedAreaTrueSize(); /** sets the displayed area and size mode (for the current frame, the current image * or all images referenced by the presentation state object). * @param sizeMode presentation size mode. * @param tlhcX displayed area top lefthand corner X * @param tlhcY displayed area top lefthand corner Y * @param brhcX displayed area bottom righthand corner X * @param brhcY displayed area bottom righthand corner Y * @param magnification magnification factor - ignored unless sizeMode==DVPSD_magnify. * @param applicability defines the applicability of the new displayed area definition. * Possible choices are: DVPSB_currentFrame - current frame only, * DVPSB_currentImage - all frames of current image (default), * and DVPSB_allImages - all images referenced by this presentation state. * The last choice should be used with care * because it will also cause the pixel spacing or pixel aspect ratio of the current image * to be applied to all images referenced by the presentation state. * @return EC_Normal if successful, an error code otherwise. */ OFCondition setStandardDisplayedArea( DVPSPresentationSizeMode sizeMode, Sint32 tlhcX, Sint32 tlhcY, Sint32 brhcX, Sint32 brhcY, double magnification=1.0, DVPSObjectApplicability applicability=DVPSB_currentImage); /** sets the displayed area and size mode (for the current frame, the current image * or all images referenced by the presentation state object). * Treats the image as if it was neither rotated nor flipped. * @param sizeMode presentation size mode. * @param tlhcX displayed area top lefthand corner X * @param tlhcY displayed area top lefthand corner Y * @param brhcX displayed area bottom righthand corner X * @param brhcY displayed area bottom righthand corner Y * @param magnification magnification factor - ignored unless sizeMode==DVPSD_magnify. * @param applicability defines the applicability of the new displayed area definition. * Possible choices are: DVPSB_currentFrame - current frame only, * DVPSB_currentImage - all frames of current image (default), * and DVPSB_allImages - all images referenced by this presentation state. * The last choice should be used with care * because it will also cause the pixel spacing or pixel aspect ratio of the current image * to be applied to all images referenced by the presentation state. * @return EC_Normal if successful, an error code otherwise. */ OFCondition setImageRelativeDisplayedArea( DVPSPresentationSizeMode sizeMode, Sint32 tlhcX, Sint32 tlhcY, Sint32 brhcX, Sint32 brhcY, double magnification=1.0, DVPSObjectApplicability applicability=DVPSB_currentImage); /** deactivates display shutter of given type. * After a call to this method haveShutter(type) will return OFFalse. * @param type the shutter type */ void removeShutter(DVPSShutterType type); /** sets and activates rectangular display shutter. * If a bitmap shutter is exists, it is deactivated if this * method returns successfully. If no shutter display value exists, * a default of 0 (black) is set. * @param lv the left vertical edge * @param rv the right vertical edge * @param uh the upper horizontal edge * @param lh the lower horizontal edge * @return EC_Normal upon success, an error code otherwise. */ OFCondition setRectShutter(Sint32 lv, Sint32 rv, Sint32 uh, Sint32 lh); /** sets and activates circular display shutter. * If a bitmap shutter is exists, it is deactivated if this * method returns successfully. If no shutter display value exists, * a default of 0 (black) is set. * @param centerX the X component of the shutter center * @param centerY the Y component of the shutter center * @param radius the (horizontal) radius of the shutter * @return EC_Normal upon success, an error code otherwise. */ OFCondition setCircularShutter(Sint32 centerX, Sint32 centerY, Sint32 radius); /** sets polygonal display shutter point. * This method adds a point to the polygonal display shutter, * which must already have at least an origin. * If the point set with this method is identical to the * origin of the shutter, the shutter is activated and * a possible bitmap shutter is deactivated. If no shutter display value exists, * a default of 0 (black) is set. * @param x the x component of the shutter origin * @param y the x component of the shutter origin * @return EC_Normal upon success, an error code otherwise. */ OFCondition addPolyShutterVertex(Sint32 x, Sint32 y); /** removes and deletes a graphic layer. All text, graphic, curve * and overlay objects on this graphic layer are also deleted or deactivated, respectively. * @param idx index of the graphic layer, must be < getNumberOfGraphicLayers() * @return EC_Normal upon success, an error code otherwise */ OFCondition removeGraphicLayer(size_t idx); /** returns the number of text objects for the given * graphic layer. * Only the objects that are applicable to the current (attached) image * and the selected frame number are used by this method. * @param layer index of the graphic layer, must be < getNumberOfGraphicLayers() * @return number of text objects */ size_t getNumberOfTextObjects(size_t layer); /** gets the text object with the given index * on the given layer. If the text object or the graphic layer does * not exist, NULL is returned. * Only the objects that are applicable to the current (attached) image * and the selected frame number are used by this method. * @param layer index of the graphic layer, must be < getNumberOfGraphicLayers() * @param idx index of the text object, must be < getNumberOfTextObjects(layer) * @return a pointer to the text object */ DVPSTextObject *getTextObject(size_t layer, size_t idx); /** creates a new text object on the given layer. * Returns a pointer to the new text object. * If the creation of the text object fails or if the graphic layer * does not exist, NULL is returned. * @param layer index of the graphic layer, must be < getNumberOfGraphicLayers() * @param applicability defines to which images/frames the new object applies. * Default: all images referenced by the presentation state. * @return a pointer to the new text object */ DVPSTextObject *addTextObject(size_t layer, DVPSObjectApplicability applicability=DVPSB_allImages); /** deletes the text object with the given index * on the given layer. * Only the objects that are applicable to the current (attached) image * and the selected frame number are used by this method. * @param layer index of the graphic layer, must be < getNumberOfGraphicLayers() * @param idx index of the text object, must be < getNumberOfTextObjects(layer) * @return EC_Normal upon success, an error code otherwise */ OFCondition removeTextObject(size_t layer, size_t idx); /** moves the text object with the given index on the given * layer to a different layer. * Only the objects that are applicable to the current (attached) image * and the selected frame number are used by this method. * @param old_layer index of the graphic layer on which the text object is, * must be < getNumberOfGraphicLayers() * @param idx index of the text object, must be < getNumberOfTextObjects(layer) * @param new_layer index of the graphic layer to which the text object is moved, * must be < getNumberOfGraphicLayers() * @param applicability defines to which images/frames the new object applies from now on. * Default: all images referenced by the presentation state. * @return EC_Normal upon success, an error code otherwise */ OFCondition moveTextObject(size_t old_layer, size_t idx, size_t new_layer, DVPSObjectApplicability applicability=DVPSB_allImages); /** returns the number of graphic objects for the given * graphic layer. * Only the objects that are applicable to the current (attached) image * and the selected frame number are used by this method. * @param layer index of the graphic layer, must be < getNumberOfGraphicLayers() * @return number of graphic objects */ size_t getNumberOfGraphicObjects(size_t layer); /** gets the graphic object with the given index * on the given layer. If the graphic object or the graphic layer does * not exist, NULL is returned. * Only the objects that are applicable to the current (attached) image * and the selected frame number are used by this method. * @param layer index of the graphic layer, must be < getNumberOfGraphicLayers() * @param idx index of the graphic object, must be < getNumberOfGraphicObjects(layer) * @return a pointer to the graphic object */ DVPSGraphicObject *getGraphicObject(size_t layer, size_t idx); /** creates a new graphic object on the given layer. * Returns a pointer to the new graphic object. * If the creation of the graphic object fails or if the graphic layer * does not exist, NULL is returned. * @param layer index of the graphic layer, must be < getNumberOfGraphicLayers() * @param applicability defines to which images/frames the new object applies. * Default: all images referenced by the presentation state. * @return a pointer to the new graphic object */ DVPSGraphicObject *addGraphicObject(size_t layer, DVPSObjectApplicability applicability=DVPSB_allImages); /** deletes the graphic object with the given index * on the given layer. * Only the objects that are applicable to the current (attached) image * and the selected frame number are used by this method. * @param layer index of the graphic layer, must be < getNumberOfGraphicLayers() * @param idx index of the graphic object, must be < getNumberOfGraphicObjects(layer) * @return EC_Normal upon success, an error code otherwise */ OFCondition removeGraphicObject(size_t layer, size_t idx); /** moves the graphic object with the given index on the given * layer to a different layer. * Only the objects that are applicable to the current (attached) image * and the selected frame number are used by this method. * @param old_layer index of the graphic layer on which the graphic object is, * must be < getNumberOfGraphicLayers() * @param idx index of the graphic object, must be < getNumberOfGraphicObjects(layer) * @param new_layer index of the graphic layer to which the graphic object is moved, * must be < getNumberOfGraphicLayers() * @param applicability defines to which images/frames the new object applies from now on. * Default: all images referenced by the presentation state. * @return EC_Normal upon success, an error code otherwise */ OFCondition moveGraphicObject(size_t old_layer, size_t idx, size_t new_layer, DVPSObjectApplicability applicability=DVPSB_allImages); /** gets the curve with the given index * on the given layer. If the curve or the graphic layer does * not exist, NULL is returned. * @param layer index of the graphic layer, must be < getNumberOfGraphicLayers() * @param idx index of the curve, must be < getNumberOfCurves(layer) * @return a pointer to the curve */ DVPSCurve *getCurve(size_t layer, size_t idx); /** returns the number of curves in the attached image * that could be activated in the presentation state. * @return number of available curves */ size_t getNumberOfCurvesInImage(); /** gets the curve with the given index * from the attached image. If the curve does * not exist, NULL is returned. * @param idx index of the curve, must be < getNumberOfCurvesInImage() * @return a pointer to the curve */ DVPSCurve *getCurveInImage(size_t idx); /** activates curve in presentation state. * This method adds an activation for the given curve from the * attached image to the given graphic layer in the presentation state. * @param layer index of the graphic layer, must be < getNumberOfGraphicLayers() * @param curveidxinimage index of the curve in the attached image, * must be < getNumberOfCurvesInImage() * @return EC_Normal upon success, an error code otherwise */ OFCondition addCurve(size_t layer, size_t curveidxinimage); /** gets the overlay label of the given activated overlay. * @param layer index of the graphic layer, must be < getNumberOfGraphicLayers() * @param idx index of the overlay, must be < getNumberOfActiveOverlays(). * @return label string if it exists, NULL otherwise. */ const char *getActiveOverlayLabel(size_t layer, size_t idx); /** gets the overlay description of the given activated overlay. * @param layer index of the graphic layer, must be < getNumberOfGraphicLayers() * @param idx index of the overlay, must be < getNumberOfActiveOverlays(). * @return description string if it exists, NULL otherwise. */ const char *getActiveOverlayDescription(size_t layer, size_t idx); /** checks whether the given activated overlay is a ROI * (region of interest) overlay. * @param layer index of the graphic layer, must be < getNumberOfGraphicLayers() * @param idx index of the overlay, must be < getNumberOfActiveOverlays(). * @return OFTrue if overlay exists and is ROI, OFFalse otherwise. */ OFBool activeOverlayIsROI(size_t layer, size_t idx); /** gets one overlay bitmap. * @param layer index of the graphic layer on which this overlay is * activated, must be < getNumberOfGraphicLayers(). * @param idx index of the overlay activation on the given layer, * must be < getNumberOfActiveOverlays(layer). * @param overlayData upon success a pointer to the overlay plane is passed back * in this parameter. The overlay plane is organized as one byte or one word per pixel. * The byte/word values are already transformed from pvalues to DDLs. * @param width upon success the width of the overlay bitmap in pixels is returned in this parameter. * @param height upon success the height of the overlay bitmap in pixels is returned in this parameter. * @param left_pos upon success the horizontal position of the overlay relative to the image * is returned. 0 means that the overlay is left aligned with the image. * Since the overlay is cropped at the borders of the image, values < 0 are impossible. * @param top_pos upon success the vertical position of the overlay relative to the image * is returned. * @param isROI returns OFTrue if the overlay is ROI, OFFalse if the overlay is Graphic. * @param fore returns value of foreground color (pvalue), all other values are transparent * @param bits number of bits used for overlayData (valid: 8 or 12, default: 8). If bits is less than or * equal to 8 the resulting overlayData is an array of 8 bit values, an array 16 bit values otherwise. * @return EC_Normal upon success, an error code otherwise. */ OFCondition getOverlayData( size_t layer, size_t idx, const void *&overlayData, unsigned int &width, unsigned int &height, unsigned int &left_pos, unsigned int &top_pos, OFBool &isROI, Uint16 &fore, unsigned int bits = 8); /** gets the number of overlays which are embedded in the * image currently attached to the presentation state. Overlays in the image are counted only * if they are not shadowed by overlays that are embedded in the presentation state * and use the same repeating group number. * @return number of overlays in attached image */ size_t getNumberOfOverlaysInImage(); /** gets the repeating group number of the given overlay in the attached image. * @param idx index of the overlay, must be < getNumberOfOverlaysInImage(). * @return repeating group number if found, 0 otherwise. */ Uint16 getOverlayInImageGroup(size_t idx); /** gets the overlay label of the given overlay in the attached image. * @param idx index of the overlay, must be < getNumberOfOverlaysInImage(). * @return label string if it exists, NULL otherwise. */ const char *getOverlayInImageLabel(size_t idx); /** gets the overlay description of the given overlay in the attached image. * @param idx index of the overlay, must be < getNumberOfOverlaysInImage(). * @return description string if it exists, NULL otherwise. */ const char *getOverlayInImageDescription(size_t idx); /** gets the index of the activation layer on which the given * overlay from the attached image is activated. * @param idx index of the overlay, must be < getNumberOfOverlaysInImage(). * @return layer index (which is < getNumberOfGraphicLayers()) if overlay exists * and is activated, DVPS_IDX_NONE otherwise. */ size_t getOverlayInImageActivationLayer(size_t idx); /** checks whether the given overlay in the attached image is a ROI * (region of interest) overlay. * @param idx index of the overlay, must be < getNumberOfOverlaysInImage(). * @return OFTrue if overlay exists and is ROI, OFFalse otherwise. */ OFBool overlayInImageIsROI(size_t idx); /** removes an overlay from the presentation state. * If the overlay is activated, the activation is also removed. * Since overlays in the presentation state can shadow overlays in the attached image, * execution of this method may change the number of overlays reported in the attached image. * @param idx index of the overlay, must be < getNumberOfOverlaysInPresentationState(). * @return EC_Normal upon success, an error code otherwise. */ OFCondition removeOverlayFromPresentationState(size_t idx); /** changes the repeating group used for an overlay in the presentation state. * Since overlays in the presentation state can shadow overlays in the attached image, * execution of this method may change the number of overlays reported in the attached image. * @param idx index of the overlay, must be < getNumberOfOverlaysInPresentationState(). * @param newGroup new repeating group number 0x6000-0x601F (even). If this optional parameter is omitted, * the method attemps to automatically determine a new group number so that no overlay in the * attached image is shadowed any more. If this is impossible, the method fails and leaves * the overlay repeating group unchanged. * @return EC_Normal upon success, an error code otherwise. */ OFCondition changeOverlayGroupInPresentationState(size_t idx, Uint16 newGroup=0); /** adds a new overlay bitmap to the presentation state. * The overlay is read from a DICOM dataset which must contain the * attributes required for a graphic or ROI overlay, see class DVPSOverlay. * The dataset can be an image or standalone overlay IOD. * The overlay data is copied into the presentation state, i.e. the DICOM dataset * can be deleted after execution of this method. * @param overlayIOD the DICOM dataset from which the overlay is to be read * @param groupInItem the repeating group 0x6000..0x61F (even) of the overlay to be read * @param newGroup repeating group number 0x6000-0x601F (even) to be used for * the overlay in the presentation state. If this optional parameter is omitted, * the method attemps to automatically determine a new group number so that no overlay in the * attached image is shadowed any more. If this is impossible, a group number so far unused * in the presentation state is taken. * @return EC_Normal upon success, an error code otherwise. */ OFCondition addOverlayToPresentationState(DcmItem& overlayIOD, Uint16 groupInItem, Uint16 newGroup=0); /** checks if an overlay from the presentation state is suitable * for use as a bitmap shutter. An overlay is suitable if it is a graphic overlay * with the same size as the attached image and with the origin 1\1. * This method does not check wether the overlay is already activated as overlay * or bitmap shutter. * @param idx index of the overlay, must be < getNumberOfOverlaysInPresentationState(). * @return OFTrue if overlay can be used as display shutter. */ OFBool overlayIsSuitableAsBitmapShutter(size_t idx); /** activates the given overlay from the attached image * on the given graphic layer. * If the overlay is already activated (i.e. * getOverlayInImageActivationLayer(idx) != DVPS_IDX_NONE) this method fails. * @param layer index of the graphic layer, must be < getNumberOfGraphicLayers() * @param idx index of the overlay, must be < getNumberOfOverlaysInImage(). * @return EC_Normal upon success, an error code otherwise. */ OFCondition activateOverlayInImage(size_t layer, size_t idx); /** activates the given overlay from the presentation state * on the given graphic layer. * If the overlay is already activated or used as a bitmap overlay (i.e. * getOverlayInPresentationStateActivationLayer(idx) != DVPS_IDX_NONE or * overlayIsBitmapShutter(idx) == OFTrue) this method fails. * @param layer index of the graphic layer, must be < getNumberOfGraphicLayers() * @param idx index of the overlay, must be < getNumberOfOverlaysInPresentationState(). * @return EC_Normal upon success, an error code otherwise. */ OFCondition activateOverlayInPresentationState(size_t layer, size_t idx); /** activates an overlay as bitmap shutter. * The overlay must not be activated on a graphic layer (i.e. * getOverlayInPresentationStateActivationLayer(idx) != DVPS_IDX_NONE, * otherwise this method fails. * @param idx index of the overlay, must be < getNumberOfOverlaysInPresentationState(). * @return EC_Normal upon success, an error code otherwise. */ OFCondition activateOverlayAsBitmapShutter(size_t idx); /** removes activation for an overlay which may be * embedded in the attached image or part of the presentation state. * @param layer index of the graphic layer on which this overlay is * activated, must be < getNumberOfGraphicLayers(). * @param idx index of the overlay activation on the given layer, * must be < getNumberOfActiveOverlays(layer). * @return EC_Normal upon success, an error code otherwise. */ OFCondition deactivateOverlay(size_t layer, size_t idx); /** attaches an image to the presentation state. * If an image is already attached to the presentation state, * the old image is detached (and freed if necessary) and the new image is attached. * A preview image is created automatically (if values for preview resolution are valid). * @param dataset pointer to the DICOM image as DcmDataset. * @param transferOwnership if true, the presentation state assumes ownership * of the passed DcmDataset, which is freed when a different image is attached * or the presentation state is deleted. * @return EC_Normal if successful, an error code otherwise. If an error code * is returned, the presentation state has the same state as before the call * to this method. */ OFCondition attachImage(DcmDataset *dataset, OFBool transferOwnership); /** attaches an image to the presentation state. * If an image is already attached to the presentation state, * the old image is detached (and freed if necessary) and the new image is attached. * A preview image is created automatically (if values for preview resolution are valid). * @param fileformat pointer to the DICOM image as DcmFileFormat. * @param transferOwnership if true, the presentation state assumes ownership * of the passed DcmFileFormat, which is freed when a different image is attached * or the presentation state is deleted. * @return EC_Normal if successful, an error code otherwise. If an error code * is returned, the presentation state has the same state as before the call * to this method. */ OFCondition attachImage(DcmFileFormat *fileformat, OFBool transferOwnership); /** detaches and frees the image (incl. preview) attached to the presentation state. */ void detachImage(); /** checks whether image is inverse (shape, plut or mono1). * @return OFTrue if image is inverse, OFFalse otherwise. */ OFBool isInverse(); /** inverts image by changing presentation state LUT or presentation state LUT shape. * Pixel data has to be re-get after this transformation. * @return EC_Normal upon success, an error code otherwise. */ OFCondition invertImage(); /** applies presentation state to attached image and returns image bitmap. * This method sets all parameter required to correctly render the pixel data * in the image attached to the presentation state and then creates the * required pixel data which contains all grayscale transformations but none * of the none-grayscale transformations of the presentation state "burned in" * into the pixel data. The pixel data returned is already corrected by a * display transform for the current display device and can be mapped directly * to digital driving levels of the graphics board. The pointer to the pixel * data remains valid until the next call to this function, or until the * image is detached or the presentation state is deleted. * @param pixelData in this parameter a pointer to the pixel data is returned * (array of 8 bit values). The storage area allocated for this pointer must * not be freed by the caller. If the return value is an error code, * no valid pixel data pointer may be assumed. * @param width returns the width of the bitmap in pixels * @param height returns the height of the bitmap in pixels * @return EC_Normal upon success, an error code otherwise. */ OFCondition getPixelData( const void *&pixelData, unsigned long &width, unsigned long &height); /** same as method above apart from the fact that the storage area is handled * externally. * @param pixelData pointer to storage area where the pixel data is copied to * (array of 8 bit values). The storage area must be allocated and deleted * from the calling method. * @param size specifies size of the storage area in bytes. * @return EC_Normal upon success, an error code otherwise. */ OFCondition getPixelData( void *pixelData, unsigned long size); /** returns the SOP Class UID of the currently attached image. * @return SOP class UID of current image, NULL if absent */ const char *getAttachedImageSOPClassUID(); /** returns the SOP Instance UID of the currently attached image. * @return SOP instance UID of current image, NULL if absent */ const char *getAttachedImageSOPInstanceUID(); /** gets the width of the attached image. * The rotation status of the presentation state is not taken * into account, i.e. the width of an unrotated image is returned. * This method may only be called when an image is attached to the * presentation state. * @param width upon success, the image width (pixels) is returned in this parameter. * @return EC_Normal upon success, an error code otherwise */ OFCondition getImageWidth(unsigned long &width); /** gets the height of the attached image. * The rotation status of the presentation state is not taken * into account, i.e. the height of an unrotated image is returned. * This method may only be called when an image is attached to the * presentation state. * @param height upon success, the image height (pixels) is returned in this parameter. * @return EC_Normal upon success, an error code otherwise */ OFCondition getImageHeight(unsigned long &height); /** gets number of bytes used for the print bitmap. * (depends on width, height and depth) * @return number of bytes used for the print bitmap */ unsigned long getPrintBitmapSize(); /** sets the minimum print bitmap width and height. * Smaller images are scaled up by an appropriate integer factor. Both maximum * values need to be twice greater than the maximum of the minimum values. * @param width minimum width of print bitmap (in pixels) * @param height minimum height of print bitmap (in pixels) * @return EC_Normal upon success, an error code otherwise */ OFCondition setMinimumPrintBitmapWidthHeight(unsigned long width, unsigned long height); /** sets the maximum print bitmap width and height. * Larger images are scaled down by an appropriate integer factor. Both maximum * values need to be twice greater than the maximum of the minimum values. * @param width maximum width of print bitmap (in pixels) * @param height maximum height of print bitmap (in pixels) * @return EC_Normal upon success, an error code otherwise */ OFCondition setMaximumPrintBitmapWidthHeight(unsigned long width, unsigned long height); /** gets width and height of print bitmap. * Bitmap size depends on implicit scaling, a heuristic is used for very small images. * The return values depend on the current minimum/maximum print bitmap width/height values! * @param width upon success, the bitmap width (in pixels) is returned in this parameter * @param height upon success, the bitmap height (in pixels) is returned in this parameter * @return EC_Normal upon success, an error code otherwise */ OFCondition getPrintBitmapWidthHeight(unsigned long &width, unsigned long &height); /** gets width of print bitmap. * Bitmap size depends on implicit scaling, a heuristic is used for very small images. * The return value depends on the current minimum/maximum print bitmaps width/height values! * @param width upon success, the image width (in pixels) is returned in this parameter * @return EC_Normal upon success, an error code otherwise */ OFCondition getPrintBitmapWidth(unsigned long &width); /** gets height of print bitmap. * bitmap size depends on implicit scaling, a heuristic is used for very small images * The return value depends on the current minimum/maximum print bitmaps width/height values! * @param height upon success, the image height (in pixels) is returned in this parameter * @return EC_Normal upon success, an error code otherwise */ OFCondition getPrintBitmapHeight(unsigned long &height); /** gets the presentation pixel aspect ratio for the print bitmap. * Pixel aspect ratio is defined here as the width of a pixel divided * by the height of a pixel (x/y). The related image is already rotated and flipped! * @return pixel aspect ratio */ double getPrintBitmapPixelAspectRatio(); /** gets requested image size for print bitmap. * If the presentation state mode is DVPSD_trueSize, this method computes * the true physical width (in mm) of the print image (under consideration of the * rotation status) and writes it to the requestedImageSize string. * @param requestedImageSize requested image size is written to this parameter upon * successful return. Otherwise string is empty upon return. * @return EC_Normal upon success, an error code otherwise */ OFCondition getPrintBitmapRequestedImageSize(OFString& requestedImageSize); /** writes the bitmap data into the given buffer. * The bitmap has the format: 12 bits stored and 16 bits allocated. This method is used * to create the preformatted bitmap where the annotations are later burned in. * Implicit scaling is performed if the bitmap is too small (see minimum bitmap size). * The storage area must be allocated and deleted from the calling method. * @param bitmap pointer to storage area where the pixel data is copied to. * @param size specifies size of the storage area in bytes * @param inversePLUT render inverse PLUT into bitmap if OFTrue (optional) * @return EC_Normal upon success, an error code otherwise */ OFCondition getPrintBitmap(void *bitmap, unsigned long size, OFBool inversePLUT = OFFalse); /** creates a new preview image based on the current image and pstate. * The maximum size of this image is specified by the two parameters maxWidth and maxHeight. * The actual size should be determined using one of the following appropriate methods (e.g. * getPreviewImageWidthHeight) since the original pixel aspect ratio is alsways considered. * The preview image includes all grayscale and spatial transformations performed on the * current image so far. The method renderPixelData also renders the preview image (if existing). * Therefore the preview image is always held consistent with the current image. * Overlays, bitmapped shutters and any other annotations are not rendered into the preview image. * @param maxWidth the maximum width used to create the preview image * @param maxHeight the maximum height used to create the preview image * @param clipMode specifies whether to clip the preview image to the displayed area (not implemented!) * @return EC_Normal upon success, an error code otherwise */ OFCondition createPreviewImage(unsigned long maxWidth, unsigned long maxHeight, OFBool clipMode = OFFalse); /** deletes and disables the current preview image. */ void deletePreviewImage(); /** gets number of bytes used for the preview image bitmap. * (depends on width and height) * @return number of bytes used for the preview image bitmap */ unsigned long getPreviewImageSize(); /** gets current width and height of the preview image. * @param width upon success, the image width (in pixels) is returned in this parameter * @param height upon success, the image height (in pixels) is returned in this parameter * @return EC_Normal upon success, an error code otherwise */ OFCondition getPreviewImageWidthHeight(unsigned long &width, unsigned long &height); /** gets current width of the preview image. * @param width upon success, the image width (in pixels) is returned in this parameter * @return EC_Normal upon success, an error code otherwise */ OFCondition getPreviewImageWidth(unsigned long &width); /** gets current height of the preview image. * @param height upon success, the image height (in pixels) is returned in this parameter * @return EC_Normal upon success, an error code otherwise */ OFCondition getPreviewImageHeight(unsigned long &height); /** writes the bitmap data of the preview image into the given buffer. * The storage area must be allocated and deleted from the calling method. * @param bitmap pointer to storage area where the pixel data is copied to (array of 8 bit values) * @param size specifies size of the storage area in bytes * @return EC_Normal upon success, an error code otherwise */ OFCondition getPreviewImageBitmap(void *bitmap, unsigned long size); /** gets smallest and biggest possible pixel value in the attached image. * These values are defined as the smallest and biggest number that * could possibly be contained in the image after application of the Modality transform, * but before any VOI, Presentation or display transform. * This method may only be called when an image is attached to the * presentation state. * @param minValue upon success, the smallest value is returned in this parameter. * @param maxValue upon success, the biggest value is returned in this parameter. * @return EC_Normal upon success, an error code otherwise */ OFCondition getImageMinMaxPixelRange(double &minValue, double& maxValue); /** gets smallest and biggest occuring pixel value in the attached image. * These values are defined as the smallest and biggest number that * are actually contained in the image after application of the Modality transform, * but before any VOI, Presentation or display transform. * This method may only be called when an image is attached to the * presentation state. * @param minValue upon success, the smallest value is returned in this parameter. * @param maxValue upon success, the biggest value is returned in this parameter. * @return EC_Normal upon success, an error code otherwise */ OFCondition getImageMinMaxPixelValue(double &minValue, double& maxValue); /** gets the number of frames of the current (attached) image. * This method may only be called when an image is attached to the * presentation state. * @param frames upon success, the number of frames is returned in this parameter. * @return EC_Normal upon success, an error code otherwise */ OFCondition getImageNumberOfFrames(unsigned long &frames); /** selects one frame of a multiframe image. This affects the image bitmap * that is rendered, the overlay bitmaps and the visibility of graphic and text objects. * This method may only be called when an image is attached to the * presentation state. * @param frame frame number in the range [1..getImageNumberOfFrames()] * @return EC_Normal upon success, an error code otherwise */ OFCondition selectImageFrameNumber(unsigned long frame); /** gets the index of the currently selected frame in a multi-frame image. * @return index of the currently selected frame, 0 if an error occurred */ unsigned long getSelectedImageFrameNumber(); /** gets the currently selected display transform. * Display transform will only be performed if switched on _and_ * a valid monitor characteristics description exists. * Default after creation of a presentation state is "on". * @return current display transform if on, DVPSD_none if off. */ DVPSDisplayTransform getDisplayTransform() { return displayTransform; } /** activates or deactivates display correction. * Display transform will only be performed if switched on * _and_ a valid display function object exists. * @param transform display transform to be set, DVPSD_none to switch off. */ void setDisplayTransform(DVPSDisplayTransform transform) { displayTransform = transform; } /** converts a 16-bit P-Value to an 8-bit DDL value for on-sceen display. * If a display function is set and enabled (see setDisplayTransform()), * the DDL is corrected for the nonlinearity of the display, otherwise * a simple linear mapping is performed. For 12-bit DDL values (hardcopy) * the display function is automatically disabled. * @param pvalue P-Value 0..0xFFFF * @param bits number of bits used for the output DDL value (8 = softcopy, 12 = hardcopy) * @return display driving level (DDL), 0..0xFF (8 bit) / 0..0xFFF (12 bit) */ Uint16 convertPValueToDDL(Uint16 pvalue, unsigned int bits = 8); /** writes the patient module attributes and a source image sequence * for a grayscale hardcopy image. * Copies of the DICOM elements managed by this object are inserted into * the DICOM dataset. * @param dset the dataset to which the data is written * @return EC_Normal if successful, an error code otherwise. */ OFCondition writeHardcopyImageAttributes(DcmItem &dset); /** gets the modality of the attached image. * @return modality string if it exists, NULL or empty string otherwise. */ const char *getCurrentImageModality(); /** tries to find an overlay repeating group that is not used in the * presentation state or the attached image. If that does not exist, * it returns a group number that is unused in the presentation state * but used in the image. * @param currentGroup the current group number of the overlay * to be changed (if any) * @return group number 0x6000..0x601F if found, 0 otherwise. */ Uint16 findOverlayGroup(Uint16 currentGroup=0); /** prepares pixel data for image and overlays for access. * This method is called internally before any image pixel data * or overlay bitmaps is created. It makes sure that the following settings * of the presentation state are reflected in the dcmimage-based * image processing routines: VOI transformation, Presentation LUT, * rotation, flip, overlay activation. * @param display use current display function if OFTrue, don't use otherwise */ void renderPixelData(OFBool display = OFTrue); /** attempts to find the displayed area selection for the * current image and frame. If not found, creates a default. * @return displayed area selection item. If creation of a default failed * or no image is attached to the presentation state, returns NULL. */ DVPSDisplayedArea *getDisplayedAreaSelection(); /** attempts to find the Softcopy VOI LUT item for the * current image and frame. If not found, returns NULL. * @return softcopy VOI LUT item for current image and frame if found, NULL otherwise */ DVPSSoftcopyVOI *getCurrentSoftcopyVOI(); private: /** helper method that activates the given overlay in the given image * @param ovl overlay to activate * @param image image to be rendered * @param asShutter true if overlay should be used as bitmap shutter * @param pvalue pvalue for overlay foreground * @return EC_Normal if successful, an error code otherwise */ static OFCondition activateOverlayHelper( DVPSOverlay& ovl, DicomImage &image, OFBool asShutter = OFFalse, Uint16 pvalue = 0); /* connection with dcmimage */ /** a pointer to the DICOM dataset comprising the image * to which the presentation state is currently applied */ DcmDataset *currentImageDataset; /** a pointer to the fileformat (if it exists) of the * DICOM dataset comprising the image to which the * presentation state is currently applied */ DcmFileFormat *currentImageFileformat; /** a pointer to the dcmimage representation of the * image to which the presentation state is currently applied */ DicomImage *currentImage; /** a pointer to the dcmimage representation of the (smaller) preview * image to which the presentation state is currently applied */ DicomImage *previewImage; /** contains the width of the attached image without consideration of rotation. */ unsigned long currentImageWidth; /** contains the height of the attached image without consideration of rotation. */ unsigned long currentImageHeight; /** contains the width of the attached image after pixel data have been rendered (w/o clipping). */ unsigned long renderedImageWidth; /** contains the height of the attached image after pixel data have been rendered (w/o clipping). */ unsigned long renderedImageHeight; /** contains the top hand corner of the attached image after pixel data have been rendered. */ signed long renderedImageTop; /** contains the left hand corner of the attached image after pixel data have been rendered. * (the following equation is always true: renderedImageTop <= renderedImageBottom) */ signed long renderedImageLeft; /** contains the bottom hand corner of the attached image after pixel data have been rendered. * (the following equation is always true: renderedImageLeft <= renderedImageRight) */ signed long renderedImageBottom; /** contains the right hand corner of the attached image after pixel data have been rendered. */ signed long renderedImageRight; /** contains the SOP Class UID of the attached image */ char *currentImageSOPClassUID; /** contains the SOP Instance UID of the attached image */ char *currentImageSOPInstanceUID; /** contains the current selected frame number of the attached image. * Frame numbers are counted from 1 (like in DICOM, unlike dcmimgle). */ unsigned long currentImageSelectedFrame; /** a flag describing whether the presentation state is owner of * the DICOM dataset in currentImageDataset/currentImageFileformat. * If the presentation state is owner, it will delete the dataset * upon its own destruction or attachment of a different image. */ OFBool currentImageOwned; /** a flag describing whether the VOI settings in currentImage * match the ones in the presentation state. */ OFBool currentImageVOIValid; /** a flag describing whether the presentation LUT settings * in currentImage match the ones in the presentation state. */ OFBool currentImagePLUTValid; /** a flag describing whether currentImage has been flipped */ OFBool currentImageFlip; /** a flag describing the current rotation angle of currentImage */ DVPSRotationType currentImageRotation; /** a flag describing whether the Overlay settings in * currentImage match the ones in the presentation state. * values: 0=invalid, 1=invalid, but no external overlay added, 2=valid */ int currentImageOverlaysValid; /** list of curves of the currently attached image */ DVPSCurve_PList currentImageCurveList; /** list of VOI LUTs of the currently attached image */ DVPSVOILUT_PList currentImageVOILUTList; /** list of VOI Windows of the currently attached image */ DVPSVOIWindow_PList currentImageVOIWindowList; /** modality of currently attached image (if any) */ DcmCodeString currentImageModality; /** true if attached image is MONOCHROME1 */ OFBool currentImageMonochrome1; /** flag indicating the currently selected display transform * DVPSD_none if switched off */ DVPSDisplayTransform displayTransform; /** a flag describing whether current image is inverse */ OFBool imageInverse; /** reference to list of display functions if existing */ DiDisplayFunction **displayFunction; /** minimum width of print bitmap (used for implicit scaling) */ unsigned long minimumPrintBitmapWidth; /** minimum height of print bitmap (used for implicit scaling) */ unsigned long minimumPrintBitmapHeight; /** maximum width of print bitmap (used for implicit scaling) */ unsigned long maximumPrintBitmapWidth; /** maximum height of print bitmap (used for implicit scaling) */ unsigned long maximumPrintBitmapHeight; /** maximum width of (optional) preview image */ unsigned long maximumPreviewImageWidth; /** maximum height of (optional) preview image */ unsigned long maximumPreviewImageHeight; }; #endif /* * $Log: dvpstat.h,v $ * Revision 1.47 2010-10-14 13:16:37 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.46 2009-11-24 14:12:58 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.45 2009-05-28 10:55:38 joergr * Fixed various Doxygen API documentation issues. * * Revision 1.44 2005/12/08 16:04:07 meichel * Changed include path schema for all DCMTK header files * * Revision 1.43 2003/09/05 14:30:06 meichel * Introduced new API methods that allow Displayed Areas to be queried * and set either relative to the image (ignoring rotation and flip) or * in absolute values as defined in the standard. Rotate and flip methods * now adjust displayed areas in the presentation state. * * Revision 1.42 2003/08/27 14:57:19 meichel * Splitted class DVPresentationState into a base class DcmPresentationState * that does not depend on module dcmimgle and current derived class with * public API identical to the previous version. * * Revision 1.41 2002/12/09 13:29:49 joergr * Renamed parameter/local variable to avoid name clashes with global * declaration left and/or right (used for as iostream manipulators). * * Revision 1.40 2001/09/26 15:36:17 meichel * Adapted dcmpstat to class OFCondition * * Revision 1.39 2001/06/01 15:50:23 meichel * Updated copyright header * * Revision 1.38 2000/11/13 15:50:43 meichel * Added dcmpstat support methods for creating image references * in SR documents. * * Revision 1.37 2000/07/04 15:58:03 joergr * Added support for overriding the presentation LUT settings made for the * image boxes. * * Revision 1.36 2000/06/09 10:14:12 joergr * Added support for rendering inverse presentation LUT into print bitmaps. * * Revision 1.35 2000/06/08 17:36:51 joergr * Corrected bug in addImageReferenceToPState(). * * Revision 1.34 2000/06/02 16:00:53 meichel * Adapted all dcmpstat classes to use OFConsole for log and error output * * Revision 1.33 2000/05/30 14:21:24 joergr * Renamed some variables to avoid compiler warnings (reported by gcc 2.9x with * additional compiler flags). * * Revision 1.32 2000/05/30 13:47:03 joergr * Added support for multi-frame images and multiple references from a single * presentation to a number of images. * Removed methods which were already marked as "retired". * Added new function allowing to set a VOILUT created from a given gamma * value. * * Revision 1.31 2000/03/08 16:28:57 meichel * Updated copyright header. * * Revision 1.30 2000/02/29 12:16:16 meichel * Fixed bug in dcmpstat library that caused Monochrome1 images * to be printed inverse if a Presentation LUT was applied. * * Revision 1.29 1999/11/15 19:02:16 joergr * Changed behaviour of method getOverlayData(): parameter 'transp' replaced by * 'fore' to specify the foreground color used for the overlay plane. * * Revision 1.28 1999/11/03 10:36:32 joergr * Enhanced comments for methods dealing with arrays of pixel data. * * Revision 1.27 1999/10/20 10:49:20 joergr * Enhanced method getOverlayData to support 12 bit data for print. * Enhanced method convertPValueToDDL to support 12 bit data for print. * Added support for a down-scaled preview image of the current DICOM image * (e.g. useful for online-windowing or print preview). * * Revision 1.26 1999/10/19 16:24:50 meichel * Corrected handling of MONOCHROME1 images when used with P-LUTs * * Revision 1.25 1999/10/13 14:11:57 meichel * Added config file entries and access methods * for user-defined VOI presets, log directory, verbatim logging * and an explicit list of image display formats for each printer. * * Revision 1.24 1999/10/07 17:21:51 meichel * Reworked management of Presentation LUTs in order to create tighter * coupling between Softcopy and Print. * * Revision 1.23 1999/09/10 12:46:48 meichel * Added implementations for a number of print API methods. * * Revision 1.22 1999/09/10 09:02:32 joergr * Added support for CIELAB display function. New methods to handle display * functions. Old methods are marked as retired and should be removed asap. * * Revision 1.21 1999/09/07 09:04:37 joergr * Completed support for getting a print bitmap out of a pstate object. * * Revision 1.20 1999/09/01 16:14:42 meichel * Added support for requested image size to print routines * * Revision 1.19 1999/08/27 15:57:58 meichel * Added methods for saving hardcopy images and stored print objects * either in file or in the local database. * * Revision 1.18 1999/08/25 16:48:01 joergr * Added minimal support to get a print bitmap out of a pstate object. * * Revision 1.17 1999/07/30 13:34:51 meichel * Added new classes managing Stored Print objects * * Revision 1.16 1999/07/22 16:39:13 meichel * Adapted dcmpstat data structures and API to supplement 33 letter ballot text. * * Revision 1.15 1999/05/04 12:28:11 meichel * Removed carriage returns * * Revision 1.14 1999/04/27 11:23:57 joergr * Added method to check whether current image is inverse or not. * * Revision 1.13 1999/03/22 09:05:35 joergr * Added parameter to get value of (transparent) background color for method * getOverlayData. * * Revision 1.12 1999/03/03 13:26:06 joergr * Added method to invert an image by changing the presentation state LUT or * shape. * Moved method 'isBartenTransformPossible()' from presentation state class to * interface class. * * Revision 1.11 1999/03/02 13:01:02 joergr * Added method to presentation state class that checks whether Barten * transformation is possible or not. * * Revision 1.10 1999/02/25 18:40:08 joergr * Added method to fill pixel data into an externally handled storage area. * * Revision 1.9 1999/02/18 11:36:38 meichel * Added new method convertPValueToDDL() to DVPresentationState * that maps P-Values to DDLs. * * Revision 1.8 1999/02/17 10:05:32 meichel * Moved creation of Display Function object from DVPresentationState to * DVInterface to avoid unnecessary re-reads. * * Revision 1.7 1999/02/09 15:58:57 meichel * Implemented bitmap shutter activation amd method for * exchanging graphic layers. * * Revision 1.6 1999/02/05 17:45:36 meichel * Added config file entry for monitor characteristics file. Monitor charac- * teristics are passed to dcmimage if present to activate Barten transform. * * Revision 1.5 1999/01/15 17:33:05 meichel * added methods to DVPresentationState allowing to access the image * references in the presentation state. Also added methods allowing to * get the width and height of the attached image. * * Revision 1.4 1999/01/11 13:35:49 meichel * added new methods getImageAspectRatio, getImageMinMaxPixelRange and * getImageMinMaxPixelValue to class DVPresentationState. * * Revision 1.3 1998/12/22 17:57:07 meichel * Implemented Presentation State interface for overlays, * VOI LUTs, VOI windows, curves. Added test program that * allows to add curve data to DICOM images. * * Revision 1.2 1998/12/14 16:10:35 meichel * Implemented Presentation State interface for graphic layers, * text and graphic annotations, presentation LUTs. * * Revision 1.1 1998/11/27 14:50:34 meichel * Initial Release. * * */ dcmtk-3.6.0/dcmpstat/include/dcmtk/dcmpstat/dvpsgal.h0000644000310500011400000003041311455601264022040 0ustar joergrdicom3/* * * Copyright (C) 1998-2010, 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: DVPSGraphicAnnotation_PList * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:16:36 $ * CVS/RCS Revision: $Revision: 1.13 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DVPSGAL_H #define DVPSGAL_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcitem.h" #include "dcmtk/dcmpstat/dvpstyp.h" /* for enum types */ class DVPSGraphicAnnotation; class DVPSTextObject; class DVPSGraphicObject; /** the list of graphic annotations contained in a presentation state (internal use only). * This class manages the data structures comprising the complete * Graphic Annotation Sequence in a Presentation State object. */ class DVPSGraphicAnnotation_PList { public: /// default constructor DVPSGraphicAnnotation_PList(); /// copy constructor DVPSGraphicAnnotation_PList(const DVPSGraphicAnnotation_PList& copy); /** clone method. * @return a pointer to a new DVPSGraphicAnnotation_PList object containing * a deep copy of this object. */ DVPSGraphicAnnotation_PList *clone() { return new DVPSGraphicAnnotation_PList(*this); } /// destructor virtual ~DVPSGraphicAnnotation_PList(); /** reads a list of graphic annotations from a DICOM dataset. * The DICOM elements of the Graphic Annotation Sequence are copied * from the dataset to this object. * The completeness of the item (presence of all required elements, * value multiplicity) is checked. * If this method returns an error code, the object is in undefined state afterwards. * @param dset the dataset from which the GraphicAnnotationSequence is to be read * @return EC_Normal if successful, an error code otherwise. */ OFCondition read(DcmItem &dset); /** writes the list of graphic annotations managed by this object to a DICOM dataset. * Copies of the DICOM elements managed by this object are inserted into * the DICOM dataset. * @param dset the dataset to which the GraphicAnnotationSequence is written * @return EC_Normal if successful, an error code otherwise. */ OFCondition write(DcmItem &dset); /** reset the object to initial state. * After this call, the object is in the same state as after * creation with the default constructor. */ void clear(); /** renames the graphic annotation layer name in all activations * with a matching old graphic annotation layer name. * Required to keep the presentation consistent when a * graphic layer is renamed. * @param oldName the old graphic annotation layer name * @param newName the new graphic annotation layer name */ void renameLayer(const char *oldName, const char *newName); /** deletes all graphic annotation layers belonging to the given * graphic annotation layer name. * @param name name of the graphic annotation layers to be deleted */ void removeLayer(const char *name); /** deletes all graphic annotation sequence items containing * no text and no graphic object. Called before writing a presentation state. */ void cleanupLayers(); /** checks if the given layer name is used for any of the * graphic annotation layers managed by this object. * @param name name of the layer * @return OFTrue if name is used */ OFBool usesLayerName(const char *name); /** returns the number of text objects for the given graphic layer * that apply to the given image and frame. * @param layer name of the graphic layer * @param instanceUID SOP instance UID of the current image * @param frame number of the current frame * @return number of text objects */ size_t getNumberOfTextObjects(const char *layer, const char *instanceUID, unsigned long frame); /** gets the text object (applicable to the current image and frame) * with the given index on the given layer. * If the text object or the graphic layer does not exist, NULL is returned. * @param layer name of the graphic layer * @param instanceUID SOP instance UID of the current image * @param frame number of the current frame * @param idx index of the text object, must be < getNumberOfTextObjects(layer) * @return a pointer to the text object */ DVPSTextObject *getTextObject(const char *layer, const char *instanceUID, unsigned long frame, size_t idx); /** creates a new text object on the given layer. * Returns a pointer to the new text object. * If no graphic layer with appropriate applicability exists, it is created. * If the creation of the layer or text object fails, NULL is returned. * @param layer name of the graphic layer * @param sopclassUID SOP class UID of the current image * @param instanceUID SOP instance UID of the current image * @param frame number of the current frame * @param applicability applicability of the new text object * @param text the text object to be inserted. If NULL, a new text object * is created. If a pointer to an object is passed in this parameter, * it gets owned by this graphic annotation object and will be deleted * upon destruction of the annotation or if this method fails (returns NULL). * @return a pointer to the new text object */ DVPSTextObject *addTextObject( const char *layer, const char *sopclassUID, const char *instanceUID, unsigned long frame, DVPSObjectApplicability applicability, DVPSTextObject *text=NULL); /** deletes the text object (applicable to the current image and frame) with the given index * on the given layer. * @param layer name of the graphic layer * @param instanceUID SOP instance UID of the current image * @param frame number of the current frame * @param idx index of the text object, must be < getNumberOfTextObjects(layer) * @return EC_Normal upon success, an error code otherwise */ OFCondition removeTextObject(const char *layer, const char *instanceUID, unsigned long frame, size_t idx); /** moves the text object (applicable to the current image and frame) with the given index * on the given layer to a different layer. * @param old_layer name of the graphic layer on which the text object is * @param sopclassUID SOP class UID of the current image * @param instanceUID SOP instance UID of the current image * @param frame number of the current frame * @param idx index of the text object, must be < getNumberOfTextObjects(layer) * @param applicability new applicability of the text object * @param new_layer name of the graphic layer to which the text object is moved * @return EC_Normal upon success, an error code otherwise */ OFCondition moveTextObject( const char *old_layer, const char *sopclassUID, const char *instanceUID, unsigned long frame, size_t idx, DVPSObjectApplicability applicability, const char *new_layer); /** returns the number of graphic objects for the given * graphic layer. * @param layer name of the graphic layer * @param instanceUID SOP instance UID of the current image * @param frame number of the current frame * @return number of graphic objects */ size_t getNumberOfGraphicObjects(const char *layer, const char *instanceUID, unsigned long frame); /** gets the graphic object with the given index * on the given layer. If the graphic object or the graphic layer does * not exist, NULL is returned. * @param layer name of the graphic layer * @param instanceUID SOP instance UID of the current image * @param frame number of the current frame * @param idx index of the graphic object, must be < getNumberOfGraphicObjects(layer) * @return a pointer to the graphic object */ DVPSGraphicObject *getGraphicObject(const char *layer, const char *instanceUID, unsigned long frame, size_t idx); /** creates a new graphic object on the given layer. * Returns a pointer to the new graphic object. If the graphic layer * does not exist or if the creation of the graphic object fails, NULL is returned. * @param layer name of the graphic layer * @param sopclassUID SOP class UID of the current image * @param instanceUID SOP instance UID of the current image * @param frame number of the current frame * @param applicability applicability of the new text object * @param graphic the graphic object to be inserted. If NULL, a new graphic object * is created. If a pointer to an object is passed in this parameter, * it gets owned by this graphic annotation object and will be deleted * upon destruction of the annotation or if this method fails (returns NULL). * @return a pointer to the new graphic object */ DVPSGraphicObject *addGraphicObject( const char *layer, const char *sopclassUID, const char *instanceUID, unsigned long frame, DVPSObjectApplicability applicability, DVPSGraphicObject *graphic=NULL); /** deletes the graphic object with the given index * on the given layer. * @param layer name of the graphic layer * @param instanceUID SOP instance UID of the current image * @param frame number of the current frame * @param idx index of the graphic object, must be < getNumberOfGraphicObjects(layer) * @return EC_Normal upon success, an error code otherwise */ OFCondition removeGraphicObject(const char *layer, const char *instanceUID, unsigned long frame, size_t idx); /** moves the graphic object with the given index on the given * layer to a different layer. * @param old_layer name of the graphic layer on which the graphic object is * @param sopclassUID SOP class UID of the current image * @param instanceUID SOP instance UID of the current image * @param frame number of the current frame * @param idx index of the graphic object, must be < getNumberOfGraphicObjects(layer) * @param applicability new applicability of the graphic object * @param new_layer name of the graphic layer to which the graphic object is moved * @return EC_Normal upon success, an error code otherwise */ OFCondition moveGraphicObject( const char *old_layer, const char *sopclassUID, const char *instanceUID, unsigned long frame, size_t idx, DVPSObjectApplicability applicability, const char *new_layer); private: /// private undefined assignment operator DVPSGraphicAnnotation_PList& operator=(const DVPSGraphicAnnotation_PList&); /** the list maintained by this object */ OFList list_; }; #endif /* * $Log: dvpsgal.h,v $ * Revision 1.13 2010-10-14 13:16:36 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.12 2010-10-07 14:31:35 joergr * Removed leading underscore characters from preprocessor symbols (reserved). * * Revision 1.11 2009-11-24 14:12:57 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.10 2009-09-30 10:42:38 uli * Make dcmpstat's include headers self-sufficient by including all * needed headers directly and stop using dctk.h * * Revision 1.9 2005-12-08 16:03:44 meichel * Changed include path schema for all DCMTK header files * * Revision 1.8 2003/06/04 10:18:06 meichel * Replaced private inheritance from template with aggregation * * Revision 1.7 2001/09/26 15:36:10 meichel * Adapted dcmpstat to class OFCondition * * Revision 1.6 2001/06/01 15:50:15 meichel * Updated copyright header * * Revision 1.5 2000/06/02 16:00:46 meichel * Adapted all dcmpstat classes to use OFConsole for log and error output * * Revision 1.4 2000/03/08 16:28:51 meichel * Updated copyright header. * * Revision 1.3 1999/07/22 16:39:07 meichel * Adapted dcmpstat data structures and API to supplement 33 letter ballot text. * * Revision 1.2 1998/12/14 16:10:28 meichel * Implemented Presentation State interface for graphic layers, * text and graphic annotations, presentation LUTs. * * Revision 1.1 1998/11/27 14:50:26 meichel * Initial Release. * * */ dcmtk-3.6.0/dcmpstat/include/dcmtk/dcmpstat/dvpsmsg.h0000644000310500011400000002315511455601264022070 0ustar joergrdicom3/* * * Copyright (C) 1998-2010, 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: DVPSIPCMessage * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:16:36 $ * CVS/RCS Revision: $Revision: 1.7 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DVPSMSG_H #define DVPSMSG_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dctypes.h" /* for Uint32 */ #include "dcmtk/ofstd/ofstring.h" /* for class OFString */ class DcmTransportConnection; /** class for IPC message exchange between different processes of the * DICOMscope application */ class DVPSIPCMessage { public: /// default constructor DVPSIPCMessage(); /// copy constructor DVPSIPCMessage(const DVPSIPCMessage& copy); /// destructor virtual ~DVPSIPCMessage(); /// copy assignment operator DVPSIPCMessage& operator=(const DVPSIPCMessage&); /** sets the message type * @param msgtype new message type */ void setMessageType(Uint32 msgtype) { messageType = msgtype; } /** returns the message type * @return message type */ Uint32 getMessageType() { return messageType; } /** adds a character string into the message payload. * @param str zero terminated string, may be NULL (in which case an empty string is added) */ void addStringToPayload(const char *str); /** adds an integer into the message payload. * @param value to write */ void addIntToPayload(Uint32 i); /** extracts a string from the message payload * and copies it into the given str object. * @param str string is written into this parameter * @return OFTrue if successful, OFFalse otherwise */ OFBool extractStringFromPayload(OFString& str); /** extracts an integer from the message payload. * @param i integer is written into this parameter * @return OFTrue if successful, OFFalse otherwise */ OFBool extractIntFromPayload(Uint32& i); /** rewinds the read offset to the beginning of the message payload */ void rewindPayload(); /** removes all payload */ void erasePayload(); /** sends the current message over the given transport connection. * @param connection transport connection to be used * @return OFTrue if successful, OFFalse otherwise. */ OFBool send(DcmTransportConnection &connection); /** receives a messages from the given transport connection * and stores it in the current object, replacing any existing * payload. * @param connection transport connection to be used * @return OFTrue if successful, OFFalse otherwise. */ OFBool receive(DcmTransportConnection &connection); // constants for message type static const Uint32 OK; static const Uint32 requestApplicationID; static const Uint32 assignApplicationID; static const Uint32 applicationTerminates; static const Uint32 receivedUnencryptedDICOMConnection; static const Uint32 receivedEncryptedDICOMConnection; static const Uint32 connectionClosed; static const Uint32 connectionAborted; static const Uint32 requestedUnencryptedDICOMConnection; static const Uint32 requestedEncryptedDICOMConnection; static const Uint32 receivedDICOMObject; static const Uint32 sentDICOMObject; // message status constants static const Uint32 statusOK; // OK static const Uint32 statusWarning; // warning static const Uint32 statusError; // error // client type constants static const Uint32 clientOther; // client is of unspecified type static const Uint32 clientStoreSCP; // client is Store SCP static const Uint32 clientStoreSCU; // client is Store SCU static const Uint32 clientPrintSCP; // client is Print SCP static const Uint32 clientPrintSCU; // client is Print SCU static const Uint32 clientQRSCP; // client is Query/Retrieve (Find/Move/Get) SCP private: /** resize payload if necessary such that at least i bytes can be written * @param i number of bytes required in buffer */ void resizePayload(Uint32 i); /// type of message Uint32 messageType; /// number of bytes actually used in payload Uint32 payloadUsed; /// number of bytes allocated in payload Uint32 payloadAllocated; /// read offset into payload in bytes Uint32 payloadReadOffset; /// pointer to raw payload data in big endian byte order unsigned char *payload; }; /** a client for IPC message exchange between different processes of the * DICOMscope application */ class DVPSIPCClient { public: /** constructor * @param clientType type of client application, see constants defined in DVPSIPCMessage * @param txt textual description of client application * @param thePort TCP/IP port on which the server is listening * @param keepOpen flag indicating whether the connection should be kept * open all the time or should be opened/closed for each transaction. */ DVPSIPCClient(Uint32 clientType, const char *txt, int thePort, OFBool keepOpen); /// destructor virtual ~DVPSIPCClient(); /** sends ApplicationTerminates notification to server. * @param Uint32 message status, see constants defined in DVPSIPCMessage */ void notifyApplicationTerminates(Uint32 status); /** sends ReceivedUnencryptedDICOMConnection notification to server. * @param Uint32 message status, see constants defined in DVPSIPCMessage * @param txt textual description of notification for server */ void notifyReceivedUnencryptedDICOMConnection(Uint32 status, const char *txt); /** sends ReceivedEncryptedDICOMConnection notification to server. * @param Uint32 message status, see constants defined in DVPSIPCMessage * @param txt textual description of notification for server */ void notifyReceivedEncryptedDICOMConnection(Uint32 status, const char *txt); /** sends ConnectionClosed notification to server. * @param Uint32 message status, see constants defined in DVPSIPCMessage */ void notifyConnectionClosed(Uint32 status); /** sends ConnectionAborted notification to server. * @param Uint32 message status, see constants defined in DVPSIPCMessage * @param txt textual description of notification for server */ void notifyConnectionAborted(Uint32 status, const char *txt); /** sends RequestedUnencryptedDICOMConnection notification to server. * @param Uint32 message status, see constants defined in DVPSIPCMessage * @param txt textual description of notification for server */ void notifyRequestedUnencryptedDICOMConnection(Uint32 status, const char *txt); /** sends RequestedEncryptedDICOMConnection notification to server. * @param Uint32 message status, see constants defined in DVPSIPCMessage * @param txt textual description of notification for server */ void notifyRequestedEncryptedDICOMConnection(Uint32 status, const char *txt); /** sends ReceivedDICOMObject notification to server. * @param Uint32 message status, see constants defined in DVPSIPCMessage * @param txt textual description of DICOM object */ void notifyReceivedDICOMObject(Uint32 status, const char *txt); /** sends SentDICOMObject notification to server. * @param Uint32 message status, see constants defined in DVPSIPCMessage * @param txt textual description of DICOM object */ void notifySentDICOMObject(Uint32 status, const char *txt); /** checks whether the message server has been found active * upon creation of this object. * @return OFTrue if server is active, OFFalse otherwise. */ OFBool isServerActive() { return serverActive; } private: /// private undefined copy constructor DVPSIPCClient(const DVPSIPCClient& copy); /// private undefined copy assignment operator DVPSIPCClient& operator=(const DVPSIPCClient&); /** request connection to server, store in 'connection' if successful. */ void requestConnection(); /** perform message transaction with server. If serverActive is false, * no connection attempt is performed. * @param msg contains message to be sent, overwritten with message * received from server if successful * @return OFTrue if successful, OFFalse otherwise */ OFBool performTransaction(DVPSIPCMessage& msg); /// TCP/IP port number on which the server is listening int port; /// true if the first connection attempt has succeeded, false otherwise OFBool serverActive; /// application ID assigned by the server Uint32 applicationID; /// flag indicating whether we want to keep the connection open OFBool keepConnectionOpen; /// current transport connection DcmTransportConnection *connection; }; #endif /* * $Log: dvpsmsg.h,v $ * Revision 1.7 2010-10-14 13:16:36 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.6 2010-10-07 14:31:36 joergr * Removed leading underscore characters from preprocessor symbols (reserved). * * Revision 1.5 2005/12/08 16:03:52 meichel * Changed include path schema for all DCMTK header files * * Revision 1.4 2003/07/04 13:27:38 meichel * Replaced forward declarations for OFString with explicit includes, * needed when compiling with HAVE_STD_STRING * * Revision 1.3 2001/06/01 15:50:18 meichel * Updated copyright header * * Revision 1.2 2000/11/08 18:38:15 meichel * Updated dcmpstat IPC protocol for additional message parameters * * Revision 1.1 2000/10/10 12:24:36 meichel * Added extensions for IPC message communication * * */ dcmtk-3.6.0/dcmpstat/include/dcmtk/dcmpstat/dvpsfs.h0000644000310500011400000001635711455601264021720 0ustar joergrdicom3/* * * Copyright (C) 1998-2010, 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: DVPSFilmSession * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:16:36 $ * CVS/RCS Revision: $Revision: 1.9 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DVPSFS_H #define DVPSFS_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dctk.h" #include "dcmtk/dcmpstat/dvpstyp.h" #include "dcmtk/dcmnet/dimse.h" class DVConfiguration; class DVPSPresentationLUT_PList; class DVPSStoredPrint_PList; class DVPSStoredPrint; /** a basic film session object managed by a Print SCP. */ class DVPSFilmSession { public: /** constructor * @param illumin default Illumination setting * @param reflection default Reflected Ambient Light setting */ DVPSFilmSession(Uint16 illumin, Uint16 reflection); /// copy constructor DVPSFilmSession(const DVPSFilmSession& copy); /** clone method. * @return a pointer to a new DVPSFilmSession object containing * a copy of this object. */ DVPSFilmSession *clone() { return new DVPSFilmSession(*this); } /// destructor virtual ~DVPSFilmSession(); /** performs a Print SCP Basic Film Session N-CREATE operation on a newly * created instance of this class. The results of the operation are * stored in the objects passed as rsp and rspDataset. * @param cfg config file facility * @param cfgname symbolic printer name in config file * @param rqDataset N-CREATE request dataset, may be NULL * @param rsp N-CREATE response message * @param rspDataset N-CREATE response dataset passed back in this parameter * @param peerae application entity title of the print SCU we're * communicating with. Used to create default values for ownerID * and filmSessionLabel. * @param presentationLUTnegotiated * OFTrue if support for the Presentation LUT SOP class * has been negotiated at association negotiation and is supported on * Basic Film Session level * @param globalPresentationLUTList * list of presentation LUTs managed by the Print SCP * @return OFTrue if N-CREATE was successful, OFFalse otherwise. */ OFBool printSCPCreate( DVConfiguration& cfg, const char *cfgname, DcmDataset *rqDataset, T_DIMSE_Message& rsp, DcmDataset *& rspDataset, const char *peerae, OFBool presentationLUTnegotiated, DVPSPresentationLUT_PList& globalPresentationLUTList); /** performs a Print SCP Basic Film Session N-SET operation on an instance * of this class. The results of the N-SET operation are stored in the * objects passed as rsp and rspDataset. * @param cfg config file facility * @param cfgname symbolic printer name in config file * @param rqDataset N-SET request dataset * @param rsp N-SET response message * @param rspDataset N-SET response dataset passed back in this parameter * @param presentationLUTnegotiated * OFTrue if support for the Presentation LUT SOP class * has been negotiated at association negotiation and is supported on * Basic Film Session level * @param globalPresentationLUTList * list of presentation LUTs managed by the Print SCP * @param basicFilmBoxList list of basic film boxes. Presentation LUT * settings are copied to all film boxes. * @return OFTrue if N-SET was successful, OFFalse otherwise. */ OFBool printSCPSet( DVConfiguration& cfg, const char *cfgname, DcmDataset *rqDataset, T_DIMSE_Message& rsp, DcmDataset *& rspDataset, OFBool presentationLUTnegotiated, DVPSPresentationLUT_PList& globalPresentationLUTList, DVPSStoredPrint_PList& basicFilmBoxList); /** compares the SOP instance UID with the given UID string. * @return OFTrue if UIDs are equal, OFFalse otherwise. */ OFBool isInstance(const char *uid); /** returns the SOP instance UID of the basic film session. * @return SOP instance UID */ const char *getUID() { return sopInstanceUID.c_str(); } /** copies the film box Presentation LUT settings into the * stored print object passed by reference. * @param sp stored print object */ void copyPresentationLUTSettings(DVPSStoredPrint& sp); private: /// private undefined assignment operator DVPSFilmSession& operator=(const DVPSFilmSession&); /** writes a Referenced Presentation LUT SQ, Illumination and * reflected ambient light to the given dataset. * Helper function used when creating Basic Film Session or * Basic Film Box. * @param dset the dataset to which the data is written * @return EC_Normal if successful, an error code otherwise. */ OFCondition addPresentationLUTReference(DcmItem& dset); /// SOP instance UID of basic film session object OFString sopInstanceUID; /// VR=IS, VM=1 DcmIntegerString numberOfCopies; /// VR=CS, VM=1 DcmCodeString printPriority; /// VR=CS, VM=1 DcmCodeString mediumType; /// VR=CS, VM=1 DcmCodeString filmDestination; /// VR=LO, VM=1 DcmLongString filmSessionLabel; /// VR=SH, VM=1 DcmShortString ownerID; /// VR=US, VM=1, Type 2c required if presentation SOP class present DcmUnsignedShort illumination; /// VR=US, VM=1, Type 2c required if presentation SOP class present DcmUnsignedShort reflectedAmbientLight; /// the ReferencedPresentationLUTSequence is only created/read on the fly DcmUniqueIdentifier referencedPresentationLUTInstanceUID; /** The Print SCP can be configured to enforce a rule requiring that the * number of entries in a Presentation LUT matches the bit depth of the * image pixel data. This member variable describes the type of the * current presentation LUT (if any). */ DVPSPrintPresentationLUTAlignment referencedPresentationLUTAlignment; }; #endif /* * $Log: dvpsfs.h,v $ * Revision 1.9 2010-10-14 13:16:36 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.8 2010-10-07 14:31:35 joergr * Removed leading underscore characters from preprocessor symbols (reserved). * * Revision 1.7 2009-11-24 14:12:57 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.6 2005-12-08 16:03:42 meichel * Changed include path schema for all DCMTK header files * * Revision 1.5 2001/09/26 15:36:10 meichel * Adapted dcmpstat to class OFCondition * * Revision 1.4 2001/06/01 15:50:15 meichel * Updated copyright header * * Revision 1.3 2000/06/08 10:44:28 meichel * Implemented Referenced Presentation LUT Sequence on Basic Film Session level. * Empty film boxes (pages) are not written to file anymore. * * Revision 1.2 2000/06/02 16:00:45 meichel * Adapted all dcmpstat classes to use OFConsole for log and error output * * Revision 1.1 2000/05/31 12:56:35 meichel * Added initial Print SCP support * * */ dcmtk-3.6.0/dcmpstat/include/dcmtk/dcmpstat/dvpsab.h0000644000310500011400000001250111455601263021654 0ustar joergrdicom3/* * * Copyright (C) 1998-2010, 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: DVPSAnnotationContent * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:16:35 $ * CVS/RCS Revision: $Revision: 1.10 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DVPSAB_H #define DVPSAB_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcvrus.h" /* for class DcmUnsignedShort */ #include "dcmtk/dcmdata/dcvrlo.h" /* for class DcmLongString */ #include "dcmtk/dcmdata/dcvrui.h" /* for class DcmUniqueIdentifier */ #include "dcmtk/dcmpstat/dvpstyp.h" /* for enum types */ /** the representation of a Annotation Content SQ item for Stored Print */ class DVPSAnnotationContent { public: /// default constructor DVPSAnnotationContent(); /// copy constructor DVPSAnnotationContent(const DVPSAnnotationContent& copy); /** clone method. * @return a pointer to a new DVPSAnnotationContent object containing * a copy of this object. */ DVPSAnnotationContent *clone() { return new DVPSAnnotationContent(*this); } /// destructor virtual ~DVPSAnnotationContent(); /** resets the object to initial state. * After this call, the object is in the same state as after * creation with the default constructor. */ void clear(); /** reads an annotation content item from a DICOM dataset. * The DICOM elements of the referenced item are copied * from the dataset to this object. * The completeness of the item (presence of all required elements, * value multiplicity) is checked. * If this method returns an error code, the object is in undefined state afterwards. * @param dset the item of the AnnotationContentSequence from which the data is to be read * @return EC_Normal if successful, an error code otherwise. */ OFCondition read(DcmItem &dset); /** writes the annotation box managed by this object to a DICOM dataset. * Copies of the DICOM element managed by this object are inserted into * the DICOM dataset. * @param dset the the item of the AnnotationContentSequence to which the data is written * @return EC_Normal if successful, an error code otherwise. */ OFCondition write(DcmItem &dset); /** sets the content of this annotation box object. * @param instanceuid SOP instance UID of this annotation * @param text annotation text string * @param position annotation box position * @return EC_Normal if successful, an error code otherwise. */ OFCondition setContent( const char *instanceuid, const char *text, Uint16 position); /** gets the current SOP Instance UID. * @return SOP Instance UID, may be NULL. */ const char *getSOPInstanceUID(); /** sets the SOP instance UID (which is returned by the Print SCP). * @param value new attribute value, must not be NULL. * @return EC_Normal if successful, an error code otherwise. */ OFCondition setSOPInstanceUID(const char *value); /** writes the attributes managed by this objects that are part of a * basic annotation box N-SET request into the DICOM dataset. * Copies of the DICOM element managed by this object are inserted into * the DICOM dataset. * @param dset the dataset to which the data is written * @return EC_Normal if successful, an error code otherwise. */ OFCondition prepareBasicAnnotationBox(DcmItem &dset); private: /// private undefined assignment operator DVPSAnnotationContent& operator=(const DVPSAnnotationContent&); /// Module=Annotation_List, VR=UI, VM=1, Type 1(c) DcmUniqueIdentifier sOPInstanceUID; /// Module=Annotation_List, VR=US, VM=1, Type 1(c) DcmUnsignedShort annotationPosition; /// Module=Annotation_List, VR=LO, VM=1, Type 1(c) DcmLongString textString; }; #endif /* * $Log: dvpsab.h,v $ * Revision 1.10 2010-10-14 13:16:35 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.9 2010-10-07 14:31:35 joergr * Removed leading underscore characters from preprocessor symbols (reserved). * * Revision 1.8 2009-11-24 14:12:57 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.7 2009-09-30 10:42:38 uli * Make dcmpstat's include headers self-sufficient by including all * needed headers directly and stop using dctk.h * * Revision 1.6 2005-12-08 16:03:32 meichel * Changed include path schema for all DCMTK header files * * Revision 1.5 2001/09/26 15:36:08 meichel * Adapted dcmpstat to class OFCondition * * Revision 1.4 2001/06/01 15:50:11 meichel * Updated copyright header * * Revision 1.3 2000/06/02 16:00:42 meichel * Adapted all dcmpstat classes to use OFConsole for log and error output * * Revision 1.2 2000/03/08 16:28:48 meichel * Updated copyright header. * * Revision 1.1 1999/10/19 14:46:05 meichel * added support for the Basic Annotation Box SOP Class * as well as access methods for Max Density and Min Density. * * */ dcmtk-3.6.0/dcmpstat/include/dcmtk/dcmpstat/dvpstx.h0000644000310500011400000002115511455601265021734 0ustar joergrdicom3/* * * Copyright (C) 1998-2010, 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: DVPSTextObject * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:16:37 $ * CVS/RCS Revision: $Revision: 1.11 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DVPSTX_H #define DVPSTX_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dctk.h" #include "dcmtk/dcmpstat/dvpstyp.h" /** an item of the text object sequence in a presentation state (internal use only). * This class manages the data structures comprising one item * of the Text Object Sequence which is contained * in the Graphic Annotation Sequence in a Presentation State object. */ class DVPSTextObject { public: /// default constructor DVPSTextObject(); /// copy constructor DVPSTextObject(const DVPSTextObject& copy); /** clone method. * @return a pointer to a new DVPSTextObject object containing * a copy of this object. */ DVPSTextObject *clone() { return new DVPSTextObject(*this); } /// destructor virtual ~DVPSTextObject(); /** reads a text object from a DICOM dataset. * The DICOM elements of the Text Object item are copied * from the dataset to this object. * The completeness of the item (presence of all required elements, * value multiplicity) is checked. * If this method returns an error code, the object is in undefined state afterwards. * @param dset the item of the TextObjectSequence from which the data is to be read * @return EC_Normal if successful, an error code otherwise. */ OFCondition read(DcmItem &dset); /** writes the text object managed by this object to a DICOM dataset. * Copies of the DICOM element managed by this object are inserted into * the DICOM dataset. * @param dset the the item of the TextObjectSequence to which the data is written * @return EC_Normal if successful, an error code otherwise. */ OFCondition write(DcmItem &dset); /** checks if this text object contains an anchor point. * @return OFTrue if anchor point present */ OFBool haveAnchorPoint(); /** checks if this text object contains bounding box. * @return OFTrue if bounding box present */ OFBool haveBoundingBox(); /** sets an anchor point for this text object. * @param x anchor point X value * @param y anchor point Y value * @param unit anchor point annotation units (pixel/display) * @param isVisible anchor point visibility * @return EC_Normal if successful, an error code otherwise. */ OFCondition setAnchorPoint(double x, double y, DVPSannotationUnit unit, OFBool isVisible); /** sets bounding box for this text object. * @param TLHC_x bounding box top-lefthand corner X value * @param TLHC_x bounding box top-lefthand corner Y value * @param BRHC_x bounding box bottom-righthand corner X value * @param BRHC_x bounding box bottom-righthand corner Y value * @param unit bounding box annotation units (pixel/display) * @param justification bounding box horizontal justification (left/right/center) * @return EC_Normal if successful, an error code otherwise. */ OFCondition setBoundingBox(double TLHC_x, double TLHC_y, double BRHC_x, double BRHC_y, DVPSannotationUnit unit, DVPSTextJustification justification); /** assigns a new "unformatted text value" for this text object. * @param text unformatted text value. Must not be NULL or empty string. * @return EC_Normal if successful, an error code otherwise. */ OFCondition setText(const char *text); /** removes any anchor point from the text object. * Attention: A text object must always contain either anchor point, bounding box * or both. This property is not asserted by the text object itself. */ void removeAnchorPoint(); /** removes any bounding box from the text object. * Attention: A text object must always contain either anchor point, bounding box * or both. This property is not asserted by the text object itself. */ void removeBoundingBox(); /** gets the unformatted text value for this text object. * @return unformatted text value */ const char *getText(); /** gets the bounding box TLHC x value. * May only be called when a bounding box is present (haveBoundingBox()==OFTrue) * @return bounding box TLHC x value */ double getBoundingBoxTLHC_x(); /** gets the bounding box TLHC y value. * May only be called when a bounding box is present (haveBoundingBox()==OFTrue) * @return bounding box TLHC y value */ double getBoundingBoxTLHC_y(); /** gets the bounding box BRHC x value. * May only be called when a bounding box is present (haveBoundingBox()==OFTrue) * @return bounding box BRHC x value */ double getBoundingBoxBRHC_x(); /** gets the bounding box BRHC y value. * May only be called when a bounding box is present (haveBoundingBox()==OFTrue) * @return bounding box BRHC y value */ double getBoundingBoxBRHC_y(); /** gets the bounding box annotation units. * May only be called when a bounding box is present (haveBoundingBox()==OFTrue) * @return bounding box annotation units */ DVPSannotationUnit getBoundingBoxAnnotationUnits(); /** gets the bounding box horizontal justification. * May only be called when a bounding box is present (haveBoundingBox()==OFTrue) * @return bounding box horizontal justification */ DVPSTextJustification getBoundingBoxHorizontalJustification(); /** gets the anchor point x value. * May only be called when an anchor point is present (haveAnchorPoint()==OFTrue) * @return anchor point x value */ double getAnchorPoint_x(); /** gets the anchor point y value. * May only be called when an anchor point is present (haveAnchorPoint()==OFTrue) * @return anchor point y value */ double getAnchorPoint_y(); /** gets the anchor point visibility * May only be called when an anchor point is present (haveAnchorPoint()==OFTrue) * @return OFTrue if anchor point is visible */ OFBool anchorPointIsVisible(); /** gets the anchor point annotation units. * May only be called when an anchor point is present (haveAnchorPoint()==OFTrue) * @return anchor point annotation units */ DVPSannotationUnit getAnchorPointAnnotationUnits(); private: /** private undefined assignment operator */ DVPSTextObject& operator=(const DVPSTextObject&); /// VR=CS, VM=1, Type 1c DcmCodeString boundingBoxAnnotationUnits; /// VR=CS, VM=1, Type 1c DcmCodeString anchorPointAnnotationUnits; /// VR=ST, VM=1, Type 1 DcmShortText unformattedTextValue; /// VR=FL, VM=2, Type 1c DcmFloatingPointSingle boundingBoxTLHC; /// VR=FL, VM=2, Type 1c DcmFloatingPointSingle boundingBoxBRHC; /// VR=CS, VM=1, Type 1c DcmCodeString boundingBoxTextHorizontalJustification; /// VR=FL, VM=2, Type 1c DcmFloatingPointSingle anchorPoint; /// VR=CS, VM=1, Type 1c DcmCodeString anchorPointVisibility; }; #endif /* * $Log: dvpstx.h,v $ * Revision 1.11 2010-10-14 13:16:37 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.10 2010-10-07 14:31:36 joergr * Removed leading underscore characters from preprocessor symbols (reserved). * * Revision 1.9 2009-11-24 14:12:58 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.8 2005-12-08 16:04:08 meichel * Changed include path schema for all DCMTK header files * * Revision 1.7 2001/09/26 15:36:18 meichel * Adapted dcmpstat to class OFCondition * * Revision 1.6 2001/06/01 15:50:24 meichel * Updated copyright header * * Revision 1.5 2000/06/02 16:00:54 meichel * Adapted all dcmpstat classes to use OFConsole for log and error output * * Revision 1.4 2000/03/08 16:28:58 meichel * Updated copyright header. * * Revision 1.3 1999/07/22 16:39:14 meichel * Adapted dcmpstat data structures and API to supplement 33 letter ballot text. * * Revision 1.2 1998/12/14 16:10:36 meichel * Implemented Presentation State interface for graphic layers, * text and graphic annotations, presentation LUTs. * * Revision 1.1 1998/11/27 14:50:34 meichel * Initial Release. * * */ dcmtk-3.6.0/dcmpstat/include/dcmtk/dcmpstat/dvpsabl.h0000644000310500011400000001505211455601264022035 0ustar joergrdicom3/* * * Copyright (C) 1998-2010, 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: DVPSAnnotationContent_PList * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:16:36 $ * CVS/RCS Revision: $Revision: 1.11 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DVPSABL_H #define DVPSABL_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcitem.h" #include "dcmtk/dcmpstat/dvpstyp.h" /* for enum types */ class DVPSAnnotationContent; /** the list of Annotations contained in a stored print object. * This class manages the data structures comprising one complete * Annotation Content Sequence in a Stored Print object. */ class DVPSAnnotationContent_PList { public: /// default constructor DVPSAnnotationContent_PList(); /// copy constructor DVPSAnnotationContent_PList(const DVPSAnnotationContent_PList& copy); /** clone method. * @return a pointer to a new DVPSAnnotationContent_PList object containing * a deep copy of this object. */ DVPSAnnotationContent_PList *clone() { return new DVPSAnnotationContent_PList(*this); } /// destructor virtual ~DVPSAnnotationContent_PList(); /** reads a list of annotations (AnnotationContentSequence) from a DICOM dataset. * The DICOM elements of the annotations are copied from the dataset to this object. * The completeness of all items (presence of all required elements, * value multiplicity) is checked. * If this method returns an error code, the object is in undefined state afterwards. * @param dset the DICOM dataset from which the sequence is to be read * @return EC_Normal if successful, an error code otherwise. */ OFCondition read(DcmItem &dset); /** writes the list of annotations managed by this object to a DICOM dataset. * Copies of the DICOM element managed by this object are inserted into * the DICOM dataset. * @param dset the DICOM dataset to which the AnnotationContentSequence is written * @return EC_Normal if successful, an error code otherwise. */ OFCondition write(DcmItem &dset); /** reset the object to initial state. * After this call, the object is in the same state as after * creation with the default constructor. */ void clear(); /** gets the number of annotations in this list. * @return the number of annotations. */ size_t size() const { return list_.size(); } /** creates a new annotation object and sets the content of this annotation object. * @param instanceuid SOP instance UID of this annotation * @param text annotation text string * @param position annotation box position * @return EC_Normal if successful, an error code otherwise. */ OFCondition addAnnotationBox( const char *instanceuid, const char *text, Uint16 position); /** deletes one of the registered annotations. * @param idx index, must be < size() * @return EC_Normal if successful, an error code otherwise. */ OFCondition deleteAnnotation(size_t idx); /** deletes multiple of the registered annotations, starting with the first one. * @param number number of annotations to delete, must be <= size() * @return EC_Normal if successful, an error code otherwise. */ OFCondition deleteMultipleAnnotations(size_t number); /** sets the SOP instance UID for the given annotation. * @param idx index, must be < getNumberOfAnnotations() * @param value new attribute value, must not be NULL. * @return EC_Normal if successful, an error code otherwise. */ OFCondition setAnnotationSOPInstanceUID(size_t idx, const char *value); /** gets the current SOP Instance UID for the given registered annotation. * @param idx index, must be < getNumberOfAnnotations() * @return SOP Instance UID, may be NULL. */ const char *getSOPInstanceUID(size_t idx); /** writes the attributes managed by the referenced object that are part of a * basic annotation box N-SET request into the DICOM dataset. * Copies of the DICOM element managed by this object are inserted into * the DICOM dataset. * @param idx index, must be < getNumberOfAnnotations() * @param dset the dataset to which the data is written * @return EC_Normal if successful, an error code otherwise. */ OFCondition prepareBasicAnnotationBox(size_t idx, DcmItem &dset); /** removes all UIDs from the annotation boxes managed by this object */ void clearAnnotationSOPInstanceUIDs(); private: /** private undefined assignment operator */ DVPSAnnotationContent_PList& operator=(const DVPSAnnotationContent_PList&); /** returns a pointer to the annotation with the given * index or NULL if it does not exist. * @param idx index, must be < size() * @return pointer to annotation object or NULL */ DVPSAnnotationContent *getAnnotationBox(size_t idx); /** the list maintained by this object */ OFList list_; }; #endif /* * $Log: dvpsabl.h,v $ * Revision 1.11 2010-10-14 13:16:36 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.10 2010-10-07 14:31:35 joergr * Removed leading underscore characters from preprocessor symbols (reserved). * * Revision 1.9 2009-11-24 14:12:57 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.8 2009-09-30 10:42:38 uli * Make dcmpstat's include headers self-sufficient by including all * needed headers directly and stop using dctk.h * * Revision 1.7 2005-12-08 16:03:33 meichel * Changed include path schema for all DCMTK header files * * Revision 1.6 2003/06/04 10:18:06 meichel * Replaced private inheritance from template with aggregation * * Revision 1.5 2001/09/26 15:36:08 meichel * Adapted dcmpstat to class OFCondition * * Revision 1.4 2001/06/01 15:50:12 meichel * Updated copyright header * * Revision 1.3 2000/06/02 16:00:42 meichel * Adapted all dcmpstat classes to use OFConsole for log and error output * * Revision 1.2 2000/03/08 16:28:48 meichel * Updated copyright header. * * Revision 1.1 1999/10/19 14:46:05 meichel * added support for the Basic Annotation Box SOP Class * as well as access methods for Max Density and Min Density. * * */ dcmtk-3.6.0/dcmpstat/include/dcmtk/dcmpstat/dvsighdl.h0000644000310500011400000002222511455601265022207 0ustar joergrdicom3/* * * Copyright (C) 2001-2010, 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: DVSignatureHandler * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:16:37 $ * CVS/RCS Revision: $Revision: 1.11 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DVSIGHDL_H #define DVSIGHDL_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/ofstd/ofstream.h" #include "dcmtk/dcmpstat/dvpstyp.h" #include "dcmtk/ofstd/ofstring.h" #include "dcmtk/dcmsign/sicertvf.h" #include "dcmtk/dcmdata/dcerror.h" class DcmAttributeTag; class DcmItem; class DcmStack; class DVConfiguration; class DcmAttributeTag; class DcmTagKey; /** handler for all digital signature related functions in dcmpstat */ class DVSignatureHandler { public: /** constructor * @param cfg system configuration */ DVSignatureHandler(DVConfiguration& cfg); /// destructor virtual ~DVSignatureHandler(); /** returns a string containing a complete HTML page with the * signature validation results for the last object of the * given type. Never returns NULL. * @param objtype object type * @return pointer to string with HTML page */ const char *getCurrentSignatureValidationHTML(DVPSObjectType objtype) const; /** returns a string containing a complete HTML page with the * signature validation overview. Never returns NULL. * @return pointer to string with HTML page */ const char *getCurrentSignatureValidationOverview() const; /** updates the digital signature information for the given object type. * If compiled without WITH_OPENSSL, always reports that no signatures * were found in the object. * @param dataset dataset to be checked for digital signatures * @param objtype object type of dataset * @param onRead true if the dataset is just being read, false if it is being written */ void updateDigitalSignatureInformation(DcmItem& dataset, DVPSObjectType objtype, OFBool onRead); /** disables the digital signature information for the given object type. * @param objtype object type */ void disableDigitalSignatureInformation(DVPSObjectType objtype); /** returns the status flag for the current object of given type. * @param objtype object type * @return digital signature status for object */ DVPSSignatureStatus getCurrentSignatureStatus(DVPSObjectType objtype) const; /** returns number of correct signatures for given object type. * @param objtype object type * @return number of digital signatures */ unsigned long getNumberOfCorrectSignatures(DVPSObjectType objtype) const; /** returns number of untrustworthy signatures for given object type. * @param objtype object type * @return number of digital signatures */ unsigned long getNumberOfUntrustworthySignatures(DVPSObjectType objtype) const; /** returns number of corrupt signatures for given object type. * @param objtype object type * @return number of digital signatures */ unsigned long getNumberOfCorruptSignatures(DVPSObjectType objtype) const; /** returns the combined status flag for the current image and presentation state. * @return digital signature status for image and presentation state */ DVPSSignatureStatus getCombinedImagePStateSignatureStatus() const; /** disables internal settings for image and presentation state. * Called when a new SR object is loaded and the current * image/presentation state are hidden consequently. */ void disableImageAndPState(); /** checks whether any attribute mentioned in the tag list is affected * by digital signatures. Returns true if either any of the attributes * is signed by a digital signature on the dataset level, or if any * of the attributes is a sequence that contains one or more signatures * in its items. Otherwise returns false. * If compiled without WITH_OPENSSL, always returns false. * @param item item or dataset to be tested * @param tagList list of attributes (tags) to be looked up inside the dataset * @return true if any of the given attributes is affected by a digital signature, * false otherwise. */ OFBool attributesSigned(DcmItem& item, DcmAttributeTag& tagList) const; /** adds one or more new digital signatures to the given dataset. * If compiled without WITH_OPENSSL, always returns EC_IllegalCall. * @param mainDataset reference to main dataset in which signature(s) are to be added * @param itemStack stack of items within the main dataset that are to be signed * separately. If main dataset is to be signed, it must be included in this stack. * @param attributesNotToSignInMainDataset list of attribute tags that should be * omitted from the signature on the main dataset level * @param usedID user ID in configuration file, must not be NULL * @param passwd passwd password for private key, may be NULL * @return EC_Normal if successful, an error code otherwise. */ OFCondition createSignature( DcmItem& mainDataset, const DcmStack& itemStack, DcmAttributeTag& attributesNotToSignInMainDataset, const char *userID, const char *passwd); private: /// private undefined copy constructor DVSignatureHandler(const DVSignatureHandler& copy); /// private undefined assignment operator DVSignatureHandler& operator=(const DVSignatureHandler&); /* print the location stack into the given stream. * It is assumed that the stack top is a DigitalSignatureSequence which is not printed * and that the stack bottom is the main dataset, which is also not printed. * @param stack search stack, as returned by DcmSignature::findFirstSignatureItem() etc. * @param os output stream */ static void printSignatureItemPosition(DcmStack& stack, STD_NAMESPACE ostream& os); /** replaces the current HTML page for the given object type by the new string. * @param objtype object type * @param str string, must not be NULL */ void replaceString(DVPSObjectType objtype, const char *str); /** updates the overview HTML page. */ void updateSignatureValidationOverview(); /// current SR html page OFString htmlSR; /// current image html page OFString htmlImage; /// current presentation state html page OFString htmlPState; /// current overview OFString htmlOverview; /// number of correct signatures in current SR unsigned long correctSignaturesSR; /// number of corrupt signatures in current SR unsigned long corruptSignaturesSR; /// number of untrustworthy signatures in current SR unsigned long untrustSignaturesSR; /// number of correct signatures in current Image unsigned long correctSignaturesImage; /// number of corrupt signatures in current Image unsigned long corruptSignaturesImage; /// number of untrustworthy signatures in current Image unsigned long untrustSignaturesImage; /// number of correct signatures in current PState unsigned long correctSignaturesPState; /// number of corrupt signatures in current PState unsigned long corruptSignaturesPState; /// number of untrustworthy signatures in current PState unsigned long untrustSignaturesPState; #ifdef WITH_OPENSSL /// the certificate verifier, available only if compiled with OpenSSL support SiCertificateVerifier certVerifier; #endif /// reference to object maintaining the system configuration DVConfiguration& config; }; #endif /* * $Log: dvsighdl.h,v $ * Revision 1.11 2010-10-14 13:16:37 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.10 2006/08/15 16:57:01 meichel * Updated the code in module dcmpstat to correctly compile when * all standard C++ classes remain in namespace std. * * Revision 1.9 2005/12/08 16:04:15 meichel * Changed include path schema for all DCMTK header files * * Revision 1.8 2004/02/04 15:49:09 joergr * Removed acknowledgements with e-mail addresses from CVS log. Removed leading * underscore characters from preprocessor symbols (reserved symbols). * * Revision 1.7 2002/04/16 14:02:04 joergr * Added configurable support for C++ ANSI standard includes (e.g. streams). * * Revision 1.6 2001/09/26 15:36:19 meichel * Adapted dcmpstat to class OFCondition * * Revision 1.5 2001/06/01 15:50:26 meichel * Updated copyright header * * Revision 1.4 2001/05/25 10:07:34 meichel * Modified dcmpstat signature handler to also compile without OpenSSL * * Revision 1.3 2001/01/29 14:55:43 meichel * Added new methods for creating signatures and checking the signature * status in module dcmpstat. * * Revision 1.2 2001/01/25 17:37:43 meichel * Fixed problem with undefined copy constructor * * Revision 1.1 2001/01/25 15:18:05 meichel * Added initial support for verification of digital signatures * in presentation states, images and structured reports to module dcmpstat. * * */ dcmtk-3.6.0/dcmpstat/include/dcmtk/dcmpstat/dvpstyp.h0000644000310500011400000003536211455601265022122 0ustar joergrdicom3/* * * Copyright (C) 1998-2010, 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: * enums: DVPSoverlayActivation, DVPSVOIActivation, DVPSGraphicLayering * DVPSPresentationLUTType, DVPSRotationType, * DVPSShutterType * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:16:37 $ * CVS/RCS Revision: $Revision: 1.21 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DVPSTYP_H #define DVPSTYP_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #define INCLUDE_CSTDIO #include "dcmtk/ofstd/ofstdinc.h" /** describes how to handle overlays when creating a default presentation state * for an image. */ enum DVPSoverlayActivation { /** ignore overlays even if present in the image. * A presentation state without any embedded or activated overlays * is created. */ DVPSO_ignoreOverlays, /** if overlays are present in the image, activate but do not copy them. * If the image contains overlays, overlay activation elements are * created in the presentation state object. The overlays remain in the image. */ DVPSO_referenceOverlays, /** if overlays are present in the image, copy them. * If the image contains overlays which are not embedded in the pixel * data but use the OverlayData element, the overlays are copied to the * presentation state and activated. * Overlays that are embedded in the image pixel data are not copied * but also activated. */ DVPSO_copyOverlays }; /** describes how to handle VOI transformations when creating a default presentation state * for an image. */ enum DVPSVOIActivation { /** ignore VOI transformations even if present in the image. * The presentation state will not contain any VOI transformation. */ DVPSV_ignoreVOI, /** select the first VOI window if present, VOI LUT alternatively. * If the image contains one or more settings for window center and * window width, the first window center/width is copied to the presentation * state. If the image contains no window center/width but does contain * one or more VOI LUTs, the first VOI LUT is copied to the presentation * state. */ DVPSV_preferVOIWindow, /** select the first VOI LUT if present, VOI Window alternatively. * If the image contains one or more VOI LUTs, * the first VOI LUT is copied to the presentation * state. If the image contains no VOI LUT but does contain * one or more settings for window center/width, the first * window center and width are copied to the presentation state. */ DVPSV_preferVOILUT }; /** describes how to handle layering of curves and overlays * when creating a default presentation state for an image. */ enum DVPSGraphicLayering { /** put all overlays and curves into a single graphic layer. * If curves and/or overlays are present, a single graphic layer is * created and all curves and overlays are assigned to this single layer. */ DVPSG_oneLayer, /** create one graphic layer for overlays and one graphic layer for curves on top of that. * If overlays are present, one layer containing all overlays is created. * If curves are present, a different layer containing all curves is created. * If both curves and overlays are present, the curves are assigned the higher layer order. */ DVPSG_twoLayers, /** create individual layers for each referenced element, curves on top of overlays. * For each overlay and curve present, a separate graphic layer is created. * The curve layers have higher order than the overlay layers. */ DVPSG_separateLayers }; /** describes a type of presentation LUT that is currently * being used or set in a presentation state. */ enum DVPSPresentationLUTType { /** Presentation LUT Shape with value 'IDENTITY' */ DVPSP_identity, /** Presentation LUT Shape with value 'INVERSE' */ DVPSP_inverse, /** Presentation LUT look up table */ DVPSP_table, /** Presentation LUT Shape with value 'LIN OD' */ DVPSP_lin_od }; /** some Print SCPs which support Presentation LUTs require that the number * of entries in a Presentation LUT matches the bit depth of the image pixel * data (4096 entries for 12 bit pixel data, 256 entries for 8 bit pixel * data). An instance of this enumeration describes the characteristics * of a Presentation LUT with regard to this matching rule. */ enum DVPSPrintPresentationLUTAlignment { /** Presentation LUT Shape, matches all kinds of image data */ DVPSK_shape, /** Presentation LUT with 256 entries and first entry mapped to 0, * matches 8 bit image data */ DVPSK_table8, /** Presentation LUT with 4096 entries and first entry mapped to 0, * matches 12 bit image data */ DVPSK_table12, /** Presentation LUT Shape with number of entries other than 256 or 4096 * or with first entry mapped to anything but 0. */ DVPSK_other }; /** describes the rotation status of a presentation state. */ enum DVPSRotationType { /** no rotation */ DVPSR_0_deg, /** rotation of 90 degrees */ DVPSR_90_deg, /** rotation of 180 degrees */ DVPSR_180_deg, /** rotation of 270 degrees */ DVPSR_270_deg }; /** describes the different types of display shutters */ enum DVPSShutterType { /** rectangular shutter */ DVPSU_rectangular, /** circular shutter */ DVPSU_circular, /** polygonal shutter */ DVPSU_polygonal, /** bitmap shutter */ DVPSU_bitmap }; /** describes the different types of annotation units */ enum DVPSannotationUnit { /** pixels */ DVPSA_pixels, /** fraction of specified display area */ DVPSA_display }; /** describes the specific character set of a DICOM element. * The defined terms for code extension techniques are * not supported. */ enum DVPScharacterSet { /** ISO 646 (ISO-IR 6): ASCII */ DVPSC_ascii, /** ISO-IR 100: Latin alphabet No. 1 */ DVPSC_latin1, /** ISO-IR 101: Latin alphabet No. 2 */ DVPSC_latin2, /** ISO-IR 109: Latin alphabet No. 3 */ DVPSC_latin3, /** ISO-IR 110: Latin alphabet No. 4 */ DVPSC_latin4, /** ISO-IR 148: Latin alphabet No. 5 */ DVPSC_latin5, /** ISO-IR 144: Cyrillic */ DVPSC_cyrillic, /** ISO-IR 127: Arabic */ DVPSC_arabic, /** ISO-IR 126: Greek */ DVPSC_greek, /** ISO-IR 138: Hebrew */ DVPSC_hebrew, /** ISO-IR 13: Japanese (Katakana/Romaji) */ DVPSC_japanese, /** unrecognized term or code extension */ DVPSC_other }; /** describes the different types of graphic objects */ enum DVPSGraphicType { /** single point */ DVPST_point, /** non-interpolated polygonal line */ DVPST_polyline, /** interpolated polygonal line */ DVPST_interpolated, /** circle */ DVPST_circle, /** ellipse */ DVPST_ellipse }; /** describes a curve type */ enum DVPSCurveType { /** region of interest (ROI) - a closed polygonal line */ DVPSL_roiCurve, /** polyline - an open polygonal line */ DVPSL_polylineCurve }; /** describes the horizontal justification of a text box */ enum DVPSTextJustification { /** left justified text */ DVPSX_left, /** right justified text */ DVPSX_right, /** centered text */ DVPSX_center }; /** describes the images and frames to which * an object (graphic layer, displayed area selection or VOI) is applicable */ enum DVPSObjectApplicability { /** the object only applies to the current (selected) frame of the current (attached) image */ DVPSB_currentFrame, /** the object applies to all frames of the current (attached) image */ DVPSB_currentImage, /** the object applies to all frames of all referenced images */ DVPSB_allImages }; /** describes the presentation size mode for a displayed area selection */ enum DVPSPresentationSizeMode { /** the displayed area should be scaled to fill the screen */ DVPSD_scaleToFit, /** the displayed area should be scaled to its true physical size */ DVPSD_trueSize, /** the displayed area should be scaled to a fixed scaling factor */ DVPSD_magnify }; /** describes the service type supported by a DICOM communication peer */ enum DVPSPeerType { /** Storage SCP peer */ DVPSE_storage, /** local Storage SCP */ DVPSE_receiver, /** remote Print Management SCP */ DVPSE_printRemote, /** local Print Management SCP */ DVPSE_printLocal, /** local or remote Print Management SCP */ DVPSE_printAny, /** any type of peer */ DVPSE_any }; /** describes the orientation (portrait or landscape) of a basic film box */ enum DVPSFilmOrientation { /** portrait orientation */ DVPSF_portrait, /** landscape orientation */ DVPSF_landscape, /** printer default */ DVPSF_default }; /** describes the trim mode (printing of borders around image boxes) for a basic film box */ enum DVPSTrimMode { /** print with trims (borders) */ DVPSH_trim_on, /** print without trims (borders) */ DVPSH_trim_off, /** printer default */ DVPSH_default }; /** describes the decimate/crop behaviour for a basic image box */ enum DVPSDecimateCropBehaviour { /** a magnification factor less than one to be applied to the image. */ DVPSI_decimate, /** some image rows and/or columns are to be deleted before printing. */ DVPSI_crop, /** the SCP shall not crop or decimate */ DVPSI_fail, /** printer default */ DVPSI_default }; /** describes the type of display function */ enum DVPSDisplayTransform { /** first entry */ DVPSD_first=0, /** Grayscale Standard Display Function (defined in DICOM part 14) */ DVPSD_GSDF=DVPSD_first, /** CIE Lab */ DVPSD_CIELAB=1, /** no display transform */ DVPSD_none=2, /** number of display transforms */ DVPSD_max=DVPSD_none }; /** describes the result of an association negotiation */ enum DVPSAssociationNegotiationResult { /** negotiation was successful */ DVPSJ_success, /** negotiation was unsuccessful */ DVPSJ_error, /** peer requests termination of server process */ DVPSJ_terminate }; /** describes the bit depth of a Basic Grayscale Image Box */ enum DVPSImageDepth { /** not yet assigned */ DVPSN_undefined, /** 8 bit */ DVPSN_8bit, /** 12 bit */ DVPSN_12bit }; /** describes the certificate verification policy for TLS association negotiation */ enum DVPSCertificateVerificationType { /** verify peer certificate, refuse transmission if absent */ DVPSQ_require, /** verify peer certificate if present */ DVPSQ_verify, /** don't verify peer certificate */ DVPSQ_ignore }; /** describes the types of objects handled by the dcmpstat signature routines */ enum DVPSObjectType { /** structured report */ DVPSS_structuredReport, /** image */ DVPSS_image, /** grayscale softcopy presentation state */ DVPSS_presentationState }; /** describes the types of objects handled by the dcmpstat signature routines */ enum DVPSSignatureStatus { /** no digital signatures are present */ DVPSW_unsigned, /** one or more digital signatures are present and have been successfully verified */ DVPSW_signed_OK, /** one or more digital signatures are present, and all of them are valid. * However, at least one of them was created * with a certificate issued by an unknown CA. */ DVPSW_signed_unknownCA, /** one or more digital signatures are present and at least one of them * could not be successfully verified because it was corrupt. */ DVPSW_signed_corrupt }; /** describes the mode to verify and sign structured reports */ enum DVPSVerifyAndSignMode { /** verify the document only */ DVPSY_verify, /** verify and digitally sign the document (apart from VerifyingObserver and SOPInstanceUID) */ DVPSY_verifyAndSign, /** verify and digitally sign the entire document (finalize it) */ DVPSY_verifyAndSign_finalize }; #endif /* * $Log: dvpstyp.h,v $ * Revision 1.21 2010-10-14 13:16:37 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.20 2010-10-07 14:31:36 joergr * Removed leading underscore characters from preprocessor symbols (reserved). * * Revision 1.19 2009-11-24 14:12:58 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.18 2005-12-08 16:04:10 meichel * Changed include path schema for all DCMTK header files * * Revision 1.17 2002/11/27 15:48:01 meichel * Adapted module dcmpstat to use of new header file ofstdinc.h * * Revision 1.16 2001/01/29 17:32:31 joergr * Added method to verify and digitally sign structured reports. * * Revision 1.15 2001/01/26 10:43:11 meichel * Introduced additional (fourth) status flag for signature validation * describing signatures that are valid but untrustworthy (unknown CA). * * Revision 1.14 2001/01/25 15:18:05 meichel * Added initial support for verification of digital signatures * in presentation states, images and structured reports to module dcmpstat. * * Revision 1.13 2000/10/10 12:23:41 meichel * Added extensions for TLS encrypted communication * * Revision 1.12 2000/07/07 13:38:45 joergr * Removed unused enum type. * * Revision 1.11 2000/06/05 16:22:52 joergr * Implemented log message methods. * * Revision 1.10 2000/05/31 12:56:40 meichel * Added initial Print SCP support * * Revision 1.9 2000/05/30 13:48:00 joergr * Added interface methods to support the following new features: * - write/filter log messages (not yet implemented) * * Revision 1.8 2000/03/08 16:28:58 meichel * Updated copyright header. * * Revision 1.7 1999/09/10 09:02:33 joergr * Added support for CIELAB display function. New methods to handle display * functions. Old methods are marked as retired and should be removed asap. * * Revision 1.6 1999/09/10 07:36:39 thiel * Added Presentation LUT Shape LIN OD * * Revision 1.5 1999/08/31 14:09:13 meichel * Added get/set methods for stored print attributes * * Revision 1.4 1999/07/22 16:39:15 meichel * Adapted dcmpstat data structures and API to supplement 33 letter ballot text. * * Revision 1.3 1998/12/22 17:57:08 meichel * Implemented Presentation State interface for overlays, * VOI LUTs, VOI windows, curves. Added test program that * allows to add curve data to DICOM images. * * Revision 1.2 1998/12/14 16:10:37 meichel * Implemented Presentation State interface for graphic layers, * text and graphic annotations, presentation LUTs. * * Revision 1.1 1998/11/27 14:50:36 meichel * Initial Release. * * */ dcmtk-3.6.0/dcmpstat/include/dcmtk/dcmpstat/dvpsri.h0000644000310500011400000001747011455601264021717 0ustar joergrdicom3/* * * Copyright (C) 1998-2010, 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: DVPSReferencedImage * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:16:36 $ * CVS/RCS Revision: $Revision: 1.13 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DVPSRI_H #define DVPSRI_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcvrui.h" #include "dcmtk/dcmdata/dcvris.h" /** an item of the referenced image sequence in a presentation state (internal use only). * This class manages the data structures comprising one item * of the Reference Image Sequence which is contained * in the Referenced Series Sequence in a Presentation State object. */ class DVPSReferencedImage { public: /// default constructor DVPSReferencedImage(); /// copy constructor DVPSReferencedImage(const DVPSReferencedImage& copy); /** clone method. * @return a pointer to a new DVPSReferencedImage object containing * a copy of this object. */ DVPSReferencedImage *clone() { return new DVPSReferencedImage(*this); } /// destructor virtual ~DVPSReferencedImage(); /** reads an image reference from a DICOM dataset. * The DICOM elements of the referenced image item are copied * from the dataset to this object. * The completeness of the item (presence of all required elements, * value multiplicity) is checked. * If this method returns an error code, the object is in undefined state afterwards. * @param dset the item of the ReferencedImageSequence from which the data is to be read * @return EC_Normal if successful, an error code otherwise. */ OFCondition read(DcmItem &dset); /** writes the image reference managed by this object to a DICOM dataset. * Copies of the DICOM element managed by this object are inserted into * the DICOM dataset. * @param dset the the item of the ReferencedImageSequence to which the data is written * @return EC_Normal if successful, an error code otherwise. */ OFCondition write(DcmItem &dset); /** check if the passed SOP Class UID is equal to the one stored in this object. * If sopclassuid is empty, the referencedSOPClassUID is assigned to it and the method returns * OFTrue. Otherwise the passed UID is compared with the referencedSOPClassUID. * OFTrue is returned if they are equal, OFFalse otherwise. * This method is used to check whether all image references in a presentation state * share the same SOP Class UID. * @param sopclassuid the SOP class UID to be validated * @return OFTrue if successful, OFFalse if unsuccessful. */ OFBool validateSOPClassUID(OFString& sopclassuid); /** set SOP Class UID of this image reference. * @param uid a pointer to the UID, which is copied into this object. */ void setSOPClassUID(const char *uid); /** set SOP Instance UID of this image reference. * @param uid a pointer to the UID, which is copied into this object. */ void setSOPInstanceUID(const char *uid); /** set the list of frame numbers of this image reference. * @param frames a list of frame numbers in DICOM IS format * (integer numbers separated by '\' characters) */ void setFrameNumbers(const char *frames); /** compare SOP Instance UID. * @param uid the UID to be compared * @return OFTrue if the referencedSOPInstanceUID of this object is * equal to uid, OFFalse otherwise. */ OFBool isSOPInstanceUID(const char *uid); /** gets the image reference managed by this object. * @param sopclassUID the SOP Class UID is returned in this string * @param instanceUID the SOP Instance UID is returned in this string * @param frames the list of frames is returned in this string * @return EC_Normal if successful, an error code otherwise. */ OFCondition getImageReference( OFString& sopclassUID, OFString& instanceUID, OFString& frames); /** checks whether this image reference applies to the given frame number. * An image reference applies to a frame if the frame number is explicitly * listed in the referencedFrameNumber attribute or if the referencedFrameNumber * is empty. * @param frame frame number to be checked * @return OFTrue if the image reference applies to the given frame number, OFFalse otherwise. */ OFBool appliesToFrame(unsigned long frame); /** checks whether this image reference applies exactly to the given frame number. * This is the case if the referencedFrameNumber only contains the given frame number. * @param frame frame number to be checked * @return OFTrue if the image reference applies only to the given frame number, OFFalse otherwise. */ OFBool appliesOnlyToFrame(unsigned long frame); /** checks whether this image reference applies all frames * because the referencedFrameNumber is empty. * @return OFTrue if the image reference applies to all frames, OFFalse otherwise. */ OFBool appliesToAllFrames(); /** update the reference such that the given frame is not referenced any more. * @param frame the frame reference * @param numberOfFrames the number of frames of the image reference */ void removeFrameReference(unsigned long frame, unsigned long numberOfFrames); private: /** undefined private assignment operator */ DVPSReferencedImage& operator=(const DVPSReferencedImage& source); /** flushes the frame cache. */ void flushCache(); /** updated the frame cache. */ void updateCache(); /// VR=UI, VM=1, Type 1c DcmUniqueIdentifier referencedSOPClassUID; /// VR=UI, VM=1, Type 1c DcmUniqueIdentifier referencedSOPInstanceUID; /// VR=IS, VM=1-n, Type 1c DcmIntegerString referencedFrameNumber; /// if exists, contains binary representation of referencedFrameNumber Sint32 *frameCache; /// describes array size of frameCache unsigned long frameCacheEntries; }; #endif /* * $Log: dvpsri.h,v $ * Revision 1.13 2010-10-14 13:16:36 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.12 2010-10-07 14:31:36 joergr * Removed leading underscore characters from preprocessor symbols (reserved). * * Revision 1.11 2009-11-24 14:12:57 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.10 2009-09-30 10:42:38 uli * Make dcmpstat's include headers self-sufficient by including all * needed headers directly and stop using dctk.h * * Revision 1.9 2005-12-08 16:03:59 meichel * Changed include path schema for all DCMTK header files * * Revision 1.8 2001/09/26 15:36:14 meichel * Adapted dcmpstat to class OFCondition * * Revision 1.7 2001/06/01 15:50:20 meichel * Updated copyright header * * Revision 1.6 2000/06/02 16:00:50 meichel * Adapted all dcmpstat classes to use OFConsole for log and error output * * Revision 1.5 2000/03/08 16:28:55 meichel * Updated copyright header. * * Revision 1.4 1999/07/22 16:39:09 meichel * Adapted dcmpstat data structures and API to supplement 33 letter ballot text. * * Revision 1.3 1999/01/15 17:33:03 meichel * added methods to DVPresentationState allowing to access the image * references in the presentation state. Also added methods allowing to * get the width and height of the attached image. * * Revision 1.2 1998/12/14 16:10:32 meichel * Implemented Presentation State interface for graphic layers, * text and graphic annotations, presentation LUTs. * * Revision 1.1 1998/11/27 14:50:31 meichel * Initial Release. * * */ dcmtk-3.6.0/dcmpstat/include/dcmtk/dcmpstat/dvpsall.h0000644000310500011400000002044411455601264022050 0ustar joergrdicom3/* * * Copyright (C) 1998-2010, 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: DVPSOverlayCurveActivationLayer * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:16:36 $ * CVS/RCS Revision: $Revision: 1.13 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DVPSALL_H #define DVPSALL_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcitem.h" #include "dcmtk/dcmpstat/dvpstyp.h" /* for enum types */ class DVPSGraphicLayer_PList; class DVPSOverlay_PList; class DVPSOverlayCurveActivationLayer; /** the list of curve and overlay activation layers contained in a presentation state (internal use only). * This class manages the data structures comprising the list of curve * activation layers and overlay activation layers * (all instances of the Curve Activation Layer Module and * Overlay Activation Layer Module repeating elements) * contained in a Presentation State object. */ class DVPSOverlayCurveActivationLayer_PList { public: /// default constructor DVPSOverlayCurveActivationLayer_PList(); /// copy constructor DVPSOverlayCurveActivationLayer_PList(const DVPSOverlayCurveActivationLayer_PList& copy); /** clone method. * @return a pointer to a new DVPSOverlayCurveActivationLayer_PList object containing * a deep copy of this object. */ DVPSOverlayCurveActivationLayer_PList *clone() { return new DVPSOverlayCurveActivationLayer_PList(*this); } /// destructor virtual ~DVPSOverlayCurveActivationLayer_PList(); /** reads the curve and overlay activations from a DICOM dataset. * The DICOM elements of the activations are copied from the dataset to this object. * If this method returns an error code, the object is in undefined state afterwards. * @param dset the DICOM dataset from which the activations are to be read * @return EC_Normal if successful, an error code otherwise. */ OFCondition read(DcmItem &dset); /** writes the curve and overlay activations managed by this object to a DICOM dataset. * Copies of the DICOM elements managed by this object are inserted into * the DICOM dataset. * @param dset the DICOM dataset to which the activations are written * @return EC_Normal if successful, an error code otherwise. */ OFCondition write(DcmItem &dset); /** reset the object to initial state. * After this call, the object is in the same state as after * creation with the default constructor. */ void clear(); /** create graphic layers and activations for DICOM image. * This method is used when a default presentation state * for a DICOM image is created. Depending on the given flags, * graphic layer and curve/overlay activations for the curves * and overlays present in the DICOM dataset are created. * If this method returns an error code, the object is in undefined state afterwards. * @param dset the DICOM dataset containing the image IOD * @param gLayerList the list of graphic layers to be created * @param overlayList the list of overlays internal to the presentation state * @param overlayActivation flag defining how overlays should be handled * @param curveActivation flag defining how curves should be handled * @param layering flag defining how graphic layers should be created * @return EC_Normal upon success, an error code otherwise. */ OFCondition createFromImage(DcmItem &dset, DVPSGraphicLayer_PList &gLayerList, DVPSOverlay_PList &overlayList, DVPSoverlayActivation overlayActivation, OFBool curveActivation, DVPSGraphicLayering layering); /** set activation layer for given repeating group. * The activation is created if necessary and the layer name * is assigned. This method check if a valid repeating group * number is passed and returns an error code otherwise. * @return EC_Normal if successful, an error code otherwise. */ OFCondition setActivation(Uint16 group, const char *layer); /** remove activation for given repeating group. */ void removeActivation(Uint16 group); /** get activation layer name of the given repeating group. * @return a pointer to the activation layer name if found, NULL otherwise. */ const char *getActivationLayer(Uint16 group); /** renames the activation layer name in all activations * with a matching old activation layer name. * Required to keep the presentation consistent when a * graphic layer is renamed. * @param oldName the old activation layer name * @param newName the new activation layer name */ void renameLayer(const char *oldName, const char *newName); /** deletes all activation belonging to the given activation * layer name. * @param name name of the deleted activation layer */ void removeLayer(const char *name); /** checks if the given layer name is used for any of the * activation layers managed by this object. * @param name name of the layer * @return OFTrue if name is used */ OFBool usesLayerName(const char *name); /** returns the number of activations for the given * graphic layer and object type (curve or overlay). * This method does not check whether an image object is attached to the * presentation state and if all activations really have a matching * curve structure in the attached image. * @param layer name of the graphic layer * @param isCurve if OFTrue, curves are counted, otherwise overlays are counted. * @return number of curves or overlays on the given layer. */ size_t getNumberOfActivations(const char *layer, OFBool isCurve); /** gets the repeating group of the overlay/curve activation with the given index * on the given layer. If the activation or the graphic layer does * not exist, 0 is returned. * @param layer name of the graphic layer * @param idx index of the object, must be < getNumberOfActivations(layer, isCurve) * @param isCurve if OFTrue, curves are searched, otherwise overlays are searched. * @return the repeating group number of the activation */ Uint16 getActivationGroup(const char *layer, size_t idx, OFBool isCurve); private: /// private undefined assignment operator DVPSOverlayCurveActivationLayer_PList& operator=(const DVPSOverlayCurveActivationLayer_PList&); /** the list maintained by this object */ OFList list_; }; #endif /* * $Log: dvpsall.h,v $ * Revision 1.13 2010-10-14 13:16:36 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.12 2010-10-07 14:31:35 joergr * Removed leading underscore characters from preprocessor symbols (reserved). * * Revision 1.11 2009-11-24 14:12:57 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.10 2009-09-30 10:42:38 uli * Make dcmpstat's include headers self-sufficient by including all * needed headers directly and stop using dctk.h * * Revision 1.9 2005-12-08 16:03:35 meichel * Changed include path schema for all DCMTK header files * * Revision 1.8 2003/06/04 10:18:06 meichel * Replaced private inheritance from template with aggregation * * Revision 1.7 2001/09/26 15:36:08 meichel * Adapted dcmpstat to class OFCondition * * Revision 1.6 2001/06/01 15:50:12 meichel * Updated copyright header * * Revision 1.5 2000/06/02 16:00:43 meichel * Adapted all dcmpstat classes to use OFConsole for log and error output * * Revision 1.4 2000/03/08 16:28:49 meichel * Updated copyright header. * * Revision 1.3 1998/12/22 17:57:04 meichel * Implemented Presentation State interface for overlays, * VOI LUTs, VOI windows, curves. Added test program that * allows to add curve data to DICOM images. * * Revision 1.2 1998/12/14 16:10:26 meichel * Implemented Presentation State interface for graphic layers, * text and graphic annotations, presentation LUTs. * * Revision 1.1 1998/11/27 14:50:25 meichel * Initial Release. * * */ dcmtk-3.6.0/dcmpstat/include/dcmtk/dcmpstat/dvpssp.h0000644000310500011400000014524511455601264021731 0ustar joergrdicom3/* * * Copyright (C) 1999-2010, 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: DVPSStoredPrint * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:16:36 $ * CVS/RCS Revision: $Revision: 1.42 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DVPSSP_H #define DVPSSP_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/dvpsibl.h" /* for class DVPSImageBoxContent_PList */ #include "dcmtk/dcmpstat/dvpsabl.h" /* for class DVPSAnnotationContent_PList */ #include "dcmtk/dcmpstat/dvpstat.h" /* for class DVPresentationState */ #include "dcmtk/dcmpstat/dvpspr.h" /* for class DVPrintMessageHandler */ class DicomImage; class DVPSPresentationLUT; class DVConfiguration; /** the representation of a Stored Print object */ class DVPSStoredPrint { public: /** constructor * @param illumin default Illumination setting * @param reflection default Reflected Ambient Light setting * @param aetitle application entity title of the print originator (SCU) */ DVPSStoredPrint(Uint16 illumin, Uint16 reflection, const char *aetitle = NULL); /// copy constructor DVPSStoredPrint(const DVPSStoredPrint& copy); /** clone method. * @return a pointer to a new DVPSStoredPrint object containing * a copy of this object. */ DVPSStoredPrint *clone() { return new DVPSStoredPrint(*this); } /// destructor virtual ~DVPSStoredPrint(); /** reset the object to initial state. * After this call, the object is in the same state as after * creation with the default constructor. */ void clear(); /** reads a Stored Print object from a DICOM dataset. * The DICOM elements of the stored print object are copied * from the dataset to this object. * The completeness of the object (presence of all required elements, * value multiplicity) is checked. * If this method returns an error code, the object is in undefined state afterwards. * @param dset the dataset from which the data is to be read * @return EC_Normal if successful, an error code otherwise. */ OFCondition read(DcmItem &dset); /** writes the Stored Print object to a DICOM dataset. * Copies of the DICOM elements managed by this object are inserted into * the DICOM dataset. * @param dset the dataset to which the data is written * @param writeRequestedImageSize if false, the Requested Image Size attributes are not written, * e. g. because they are not supported by the target printer. * @param limitImages if true, only the number of image references * that are needed for the current image display format (film layout) are written. * If false, all image references are written. * @param updateDecimateCrop if true, the decimate/crop attribute on image box level * is replaced by the global stored print level setting in all image boxes * prior to writing the dataset. * @param ignoreEmptyImages if true, all image boxes without image box position are ignored * when writing. * @return EC_Normal if successful, an error code otherwise. */ OFCondition write( DcmItem &dset, OFBool writeRequestedImageSize, OFBool limitImages, OFBool updateDecimateCrop, OFBool ignoreEmptyImages); /** sets the name of the current printer. * This name is identical to the unique entry used in the configuration file. * @return name of the current printer */ OFCondition setOriginator(const char *aetitle); /** sets the application entity title of the print SCU. * @return application entity title of the print SCU */ OFCondition setDestination(const char *aetitle); /** sets the application entity title of the print SCP. * @return application entity title of the print SCP */ OFCondition setPrinterName(const char *name); /** sets the image display format to 'STANDARD\columns,rows'. * The caller must make sure that the column and row values are * valid for the selected printer. * @param columns number of columns * @param rows number of rows * @return EC_Normal if successful, an error code otherwise. */ OFCondition setImageDisplayFormat(unsigned long columns, unsigned long rows); /** sets the (optional) film size ID. * @param value new attribute value, may be NULL. * The caller is responsible for making sure * that the value is valid for the selected printer. * @return EC_Normal if successful, an error code otherwise. */ OFCondition setFilmSizeID(const char *value); /** sets the (optional) magnification type. * @param value new attribute value, may be NULL. * The caller is responsible for making sure * that the value is valid for the selected printer. * @return EC_Normal if successful, an error code otherwise. */ OFCondition setMagnificationType(const char *value); /** sets the (optional) smoothing type. * @param value new attribute value, may be NULL. * The caller is responsible for making sure * that the value is valid for the selected printer. * @return EC_Normal if successful, an error code otherwise. */ OFCondition setSmoothingType(const char *value); /** sets the (optional) configuration information. * @param value new attribute value, may be NULL. * The caller is responsible for making sure * that the value is valid for the selected printer. * @return EC_Normal if successful, an error code otherwise. */ OFCondition setConfigurationInformation(const char *value); /** sets the (optional) requested resolution ID. * @param value new attribute value, may be NULL. * The caller is responsible for making sure * that the value is valid for the selected printer. * @return EC_Normal if successful, an error code otherwise. */ OFCondition setResolutionID(const char *value); /** sets the (optional) film orientation. * @param value new enumerated value. The caller is responsible for * making sure that the selected printer supports film orientation * if a non-default value is set. * @return EC_Normal if successful, an error code otherwise. */ OFCondition setFilmOrientation(DVPSFilmOrientation value); /** sets the (optional) trim (printing of borders). * @param value new enumerated value. The caller is responsible for * making sure that the selected printer supports trim * if a non-default value is set. * @return EC_Normal if successful, an error code otherwise. */ OFCondition setTrim(DVPSTrimMode value); /** sets the (optional) requested decimate/crop behaviour * for all image boxes managed by this stored print object. * @param value new enumerated value. The caller is responsible for * making sure that the selected printer supports decimate/crop * if a non-default value is set. * @return EC_Normal if successful, an error code otherwise. */ OFCondition setRequestedDecimateCropBehaviour(DVPSDecimateCropBehaviour value); /** sets the (optional) border density. * @param value new attribute value, may be NULL. * The caller is responsible for making sure * that the value is valid for the selected printer. * @return EC_Normal if successful, an error code otherwise. */ OFCondition setBorderDensity(const char *value); /** sets the (optional) empty image density. * @param value new attribute value, may be NULL. * The caller is responsible for making sure * that the value is valid for the selected printer. * @return EC_Normal if successful, an error code otherwise. */ OFCondition setEmtpyImageDensity(const char *value); /** sets the (optional) max density. * @param value new attribute value, may be NULL. * The caller is responsible for making sure * that the value is valid for the selected printer. * @return EC_Normal if successful, an error code otherwise. */ OFCondition setMaxDensity(const char *value); /** sets the (optional) min density. * @param value new attribute value, may be NULL. * The caller is responsible for making sure * that the value is valid for the selected printer. * @return EC_Normal if successful, an error code otherwise. */ OFCondition setMinDensity(const char *value); /** deletes all optional attribute values that might not be * supported by all printers. Film size ID, magnification and smoothing type, * configuration information, requested resolution ID, * trim and requested decimate/crop behaviour, border and empty image density * are reset to default. For all registered images, magnification, smoothing type * and configuration information are also set back to default. * @param name name of the new printer (optional) * @param aetitle of the new printer (optional) * @return EC_Normal if successful, an error code otherwise. */ OFCondition newPrinter(const char *name = NULL, const char *destinationAE = NULL); // short cut, delete all optional settings /** gets the the application entity title of the print SCU. * @return application entity title of the print SCP */ const char *getOriginator(); /** gets the the application entity title of the print SCP. * @return application entity title of the print SCP */ const char *getDestination(); /** gets the name of the current printer. * @return name of the current printer */ const char *getPrinterName(); /** gets the number of columns of the current image display format. * @return number of columns. */ unsigned long getImageDisplayFormatColumns(); /** gets the number of rows of the current image display format. * @return number of rows. */ unsigned long getImageDisplayFormatRows(); /** gets the current film orientation. * @return film orientation. */ DVPSFilmOrientation getFilmOrientation(); /** gets the current trim mode. * @return trim mode. */ DVPSTrimMode getTrim(); /** gets the current requested decimate/crop behaviour setting * that is used for all image boxes managed by this object. * @return requested decimate/crop behaviour */ DVPSDecimateCropBehaviour getRequestedDecimateCropBehaviour() { return decimateCropBehaviour; } /** gets the Study Instance UID. * @return Study Instance UID, may be NULL. */ const char *getStudyInstanceUID(); /** gets the Series Instance UID. * @return Series Instance UID, may be NULL. */ const char *getSeriesInstanceUID(); /** gets the SOP Instance UID. * @return SOP Instance UID, may be NULL. */ const char *getSOPInstanceUID(); /** gets the (optional) film size ID. * @return film size ID, may be NULL. */ const char *getFilmSizeID(); /** gets the (optional) magnification type. * @return magnification type, may be NULL. */ const char *getMagnificationType(); /** gets the (optional) smoothing type. * @return smoothing type, may be NULL. */ const char *getSmoothingType(); /** gets the (optional) configuration information. * @return configuration information, may be NULL. */ const char *getConfigurationInformation(); /** gets the (optional) requestes resolution ID * @return requested resolution ID, may be NULL. */ const char *getResolutionID(); /** gets the (optional) border density. * @return border density, may be NULL. */ const char *getBorderDensity(); /** gets the (optional) empty image density. * @return empty image density, may be NULL. */ const char *getEmtpyImageDensity(); /** gets the (optional) max density. * The string returned becomes invalid after the next * call to getMaxDensity or getMinDensity. * @return max density, may be NULL. */ const char *getMaxDensity(); /** gets the (optional) min density. * The string returned becomes invalid after the next * call to getMaxDensity or getMinDensity. * @return min density, may be NULL. */ const char *getMinDensity(); /** gets the (optional) max density. * @return max density (default: 300). */ Uint16 getMaxDensityValue(); /** gets the (optional) min density. * @return min density (default: 20). */ Uint16 getMinDensityValue(); /** gets the number of images currently registered in this object. * @return number of images. */ size_t getNumberOfImages() { return imageBoxContentList.size(); } /** gets the number of annotations currently registered in this object. * @return number of annotations. */ size_t getNumberOfAnnotations() { return annotationContentList.size(); } /** deletes one of the registered images. * @param idx index, must be < getNumberOfImages() * @return EC_Normal if successful, an error code otherwise. */ OFCondition deleteImage(size_t idx); /** deletes multiple of the registered * images, starting with the first one. * @param number number of images to delete, must be <= getNumberOfImages() * @return EC_Normal if successful, an error code otherwise. */ OFCondition deleteMultipleImages(size_t number); /** deletes as many images as fit on the current page according * to the image display format settings. Used to remove images * from the queue after a print job with one film box has been * spooled. * @return EC_Normal if successful, an error code otherwise. */ OFCondition deleteSpooledImages(); /** checks if one of the registered images has additional settings that are not * default values on the image box level. * @param idx index, must be < getNumberOfImages() * @return EC_Normal if successful, an error code otherwise. */ OFBool imageHasAdditionalSettings(size_t idx) { return imageBoxContentList.imageHasAdditionalSettings(idx); } /** sets the polarity for the given registered image box. * @param idx index, must be < getNumberOfImages() * @param value new attribute value (NORMAL or REVERSE), may be NULL. * @return EC_Normal if successful, an error code otherwise. */ OFCondition setImagePolarity(size_t idx, const char *value) { return imageBoxContentList.setImagePolarity(idx, value); } /** sets the requested size for the given registered image box. * @param idx index, must be < getNumberOfImages() * @param value new attribute value (in mm), may be NULL. * @return EC_Normal if successful, an error code otherwise. */ OFCondition setImageRequestedSize(size_t idx, const char *value) { return imageBoxContentList.setImageRequestedSize(idx, value); } /** sets the (optional) magnification type for the given registered image box. * @param idx index, must be < getNumberOfImages() * @param value new attribute value, may be NULL. * The caller is responsible for making sure * that the value is valid for the selected printer. * @return EC_Normal if successful, an error code otherwise. */ OFCondition setImageMagnificationType(size_t idx, const char *value) { return imageBoxContentList.setImageMagnificationType(idx, value); } /** sets the (optional) smoothing type for the given registered image box. * @param idx index, must be < getNumberOfImages() * @param value new attribute value, may be NULL. * The caller is responsible for making sure * that the value is valid for the selected printer. * @return EC_Normal if successful, an error code otherwise. */ OFCondition setImageSmoothingType(size_t idx, const char *value) { return imageBoxContentList.setImageSmoothingType(idx, value); } /** sets the (optional) configuration information for the given registered image box. * @param idx index, must be < getNumberOfImages() * @param value new attribute value, may be NULL. * The caller is responsible for making sure * that the value is valid for the selected printer. * @return EC_Normal if successful, an error code otherwise. */ OFCondition setImageConfigurationInformation(size_t idx, const char *value) { return imageBoxContentList.setImageConfigurationInformation(idx, value); } /** gets the polarity for the given registered image box. * @param idx index, must be < getNumberOfImages() * @return polarity (NORMAL or REVERSE), may be NULL. */ const char *getImagePolarity(size_t idx) { return imageBoxContentList.getImagePolarity(idx); } /** gets the requested size for the given registered image box. * @param idx index, must be < getNumberOfImages() * @return requested size (in mm), may be NULL. */ const char *getImageRequestedSize(size_t idx) { return imageBoxContentList.getImageRequestedSize(idx); } /** gets the (optional) magnification type for the given registered image box. * @param idx index, must be < getNumberOfImages() * @return magnification type, may be NULL. */ const char *getImageMagnificationType(size_t idx) { return imageBoxContentList.getImageMagnificationType(idx); } /** gets the (optional) smoothing type for the given registered image box. * @param idx index, must be < getNumberOfImages() * @return smoothing type, may be NULL. */ const char *getImageSmoothingType(size_t idx) { return imageBoxContentList.getImageSmoothingType(idx); } /** gets the (optional) configuration information for the given registered image box. * @param idx index, must be < getNumberOfImages() * @return configuration information, may be NULL. */ const char *getImageConfigurationInformation(size_t idx) { return imageBoxContentList.getImageConfigurationInformation(idx); } /** gets the presentation LUT for the given registered image box. * If not available the presentation LUT of the film box is used. * @param idx index, must be < getNumberOfImages() * @return pointer to presentation LUT, may be NULL. */ DVPSPresentationLUT *getImagePresentationLUT(size_t idx); /** gets the "global" presentation LUT which overrides the settings for the image boxes. * If not available the presentation LUT of the image box is used. * @return pointer to presentation LUT, may be NULL. */ DVPSPresentationLUT *getPresentationLUT(); /** resets the Presentation LUT to the default setting. i.e. the presentation LUT * which is specified separately for each image box is used. * @return EC_Normal if successful, an error code otherwise. */ OFCondition setDefaultPresentationLUT(); /** sets the current Presentation LUT shape (overrides the image box settings). * Only DVPSP_identity and DVPSP_lin_od are allowed. * @param shape the new presentation LUT shape. * @return EC_Normal if successful, an error code otherwise. */ OFCondition setPresentationLUTShape(DVPSPresentationLUTType shape); /** stores a presentation lookup table in the stored print object. * This method stores a presentation lookup table in the * stored print object and activates it. This LUT overrides the * settings made for the individual image boxes. If unsuccessful, * LUT is not set. * @param dset dataset from which the Presentation LUT SQ or Shape is read. * @return EC_Normal if successful, an error code otherwise. */ OFCondition setPresentationLookupTable(DcmItem &dset); /** converts an optical density (OD) value to an 8/12/16-bit P-value which is linear to luminance. * The output is not calibrated according to the GSDF. This can be done by convertPValueToDDL() in * class DVPSPresentationState. The attributes illumination, reflected ambient light and min/max * density (default 20/300) from this stored print object are used for the calculation. * @param density in hundreds of OD (e.g. 150 corressponds to 1.5 OD) * @param bits number of bits used for the output value (8, 12, 16) * @return P-Value, 0..0xFF, 0..0xFFF, 0..0xFFFF, < 0 if an error occurred. */ Sint32 convertODtoPValue(Uint16 density, unsigned int bits = 8); /** writes the general study and series module attributes for a grayscale hardcopy image * that is related to this stored print object to a DICOM dataset. * Copies of the DICOM elements managed by this object are inserted into * the DICOM dataset. * @param dset the dataset to which the data is written * @return EC_Normal if successful, an error code otherwise. */ OFCondition writeHardcopyImageAttributes(DcmItem &dset); /** creates a new image box object and sets the content of this image box object. * @param retrieveaetitle retrieve AETITLE of the referenced image * @param refstudyuid Study instance UID of the referenced image * @param refseriesuid Series instance UID of the referenced image * @param refsopclassuid SOP Class UID of the referenced image * @param refsopinstanceuid SOP instance UID of the referenced image * @param requestedimagesize requested images size for this image, may be NULL (absent) * @param patientid patient ID for the referenced image, may be NULL (absent) * @param presentationlut presentation LUT to be used, may be NULL (absent) * @param inversePLUT true if presentation LUT is for Monochrome1 and must be inversed. * @return EC_Normal if successful, an error code otherwise. */ OFCondition addImageBox( const char *retrieveaetitle, const char *refstudyuid, const char *refseriesuid, const char *refsopclassuid, const char *refsopinstanceuid, const char *requestedimagesize, const char *patientid, DVPSPresentationLUT *presentationlut, OFBool inversePLUT); /** creates a new image box object and sets the content of this image box object. * This is a specialized version of the method with the same name and more parameters. * SOP Class is assumed to be Grayscale Hardcopy, Study and Series are derived from * the Stored Print internal defaults. * @param retrieveaetitle retrieve AETITLE of the referenced image * @param refsopinstanceuid SOP instance UID of the referenced image * @param requestedimagesize requested images size for this image, default: absent * @param patientid patient ID for the referenced image, default: absent * @param presentationlut presentation LUT to be used, may be NULL (absent) * @param inversePLUT true if presentation LUT is for Monochrome1 and must be inversed. * @return EC_Normal if successful, an error code otherwise. */ OFCondition addImageBox( const char *retrieveaetitle, const char *refsopinstanceuid, const char *requestedimagesize=NULL, const char *patientid=NULL, DVPSPresentationLUT *presentationlut=NULL, OFBool inversePLUT=OFFalse); /** deletes all existing annotations and creates a new one, * with given text and position. Sets annotation display format * to the given value. * * @param displayformat annotation display format * @param text annotation text * @param position annotation position * @return EC_Normal if successful, an error code otherwise. */ OFCondition setSingleAnnotation( const char *displayformat, const char *text, Uint16 position); /** deletes all annotations, clears annotation display format. */ void deleteAnnotations(); /** sets a new SOP Instance UID for the Stored Print object. * @param uid new SOP Instance UID * @return EC_Normal if successful, an error code otherwise. */ OFCondition setInstanceUID(const char *uid); /** clears the SOP instance UID for the Stored Print object. * a new UID is assigned automatically when writing the object. */ void clearInstanceUID() { sOPInstanceUID.clear(); } /** returns the image UIDs that are required to look up the referenced image in the database * @param idx index, must be < getNumberOfImages() * @param studyUID Study UID of the image * @param seriesUID series UID of the image * @param instanceUID instance UID of the image * @return EC_Normal if successful, an error code otherwise. */ OFCondition getImageReference(size_t idx, const char *&studyUID, const char *&seriesUID, const char *&instanceUID) { return imageBoxContentList.getImageReference(idx, studyUID, seriesUID, instanceUID); } /** returns a description of the currently activated Presentation LUT (if * any) in terms of the Presentation LUT matching rule (see description * of enum type for details). * @return Presentation LUT alignment */ DVPSPrintPresentationLUTAlignment getReferencedPresentationLUTAlignment() { return referencedPresentationLUTAlignment; } /** Requests the properties of the printer (Printer SOP Instance N-GET). * The properties are not returned, but if the message handler is switched to "dump mode", * the DIMSE communication will be printed. * @param printHandler print communication handler, association must be open. * @return EC_Normal upon success, an error code otherwise. */ OFCondition printSCUgetPrinterInstance(DVPSPrintMessageHandler& printHandler); /** checks whether a presentation LUT or LUT shape is active in this stored print object. * In this case, if the printer supports the Presentation LUT SOP class, * a Presentation LUT SOP Instance is created in the printer. * @param printHandler print communication handler, association must be open. * @param printerRequiresMatchingLUT true if printer requires presentation LUTs matching the image depth * @param printerLUTRenderingPreferred true if SCP side presentation LUTs should be preferred * even if printer supports 12-bit image transmission. * @param printerSupports12Bit true if printer supports 12 bit transmission * @return EC_Normal upon success, an error code otherwise. */ OFCondition printSCUpreparePresentationLUT( DVPSPrintMessageHandler& printHandler, OFBool printerRequiresMatchingLUT, OFBool printerLUTRenderingPreferred, OFBool printerSupports12Bit); /** Creates a DICOM Basic Film Session SOP Instance in the printer. * @param printHandler print communication handler, association must be open. * @param dset DICOM dataset containing all Basic Film Session attributes managed outside this class * @param plutInSession true if printer expects referenced presentation LUT sequence, illumination * and reflected ambient light in basic film session, false if it expects them in basic film box. * @return EC_Normal upon success, an error code otherwise. */ OFCondition printSCUcreateBasicFilmSession( DVPSPrintMessageHandler& printHandler, DcmDataset& dset, OFBool plutInSession); /** Creates a DICOM Basic Film Box SOP Instance in the printer. * This method only allows one basic film box to exist at any time - * collation is not supported. * @param printHandler print communication handler, association must be open. * @param plutInSession true if printer expects referenced presentation LUT sequence, illumination * and reflected ambient light in basic film session, false if it expects them in basic film box. * @return EC_Normal upon success, an error code otherwise. */ OFCondition printSCUcreateBasicFilmBox(DVPSPrintMessageHandler& printHandler, OFBool plutInSession); /** Transmits a DICOM image to the printer (Basic Grayscale Image Box N-SET). * @param printHandler print communication handler, association must be open. * @param idx index of the image reference from which the Image Box settings are taken, * must be < getNumberOfImages(). * @param image DICOM image to be printed * @param useMonochrome1 if true, the image is transmitted in MONOCHROME1 photometric interpretation. * Default is false, image is transmitted in MONOCHROME2 in this case. * @return EC_Normal upon success, an error code otherwise. */ OFCondition printSCUsetBasicImageBox( DVPSPrintMessageHandler& printHandler, size_t idx, DicomImage& image, OFBool useMonochrome1=OFFalse); /** Transmits a DICOM annotation to the printer (Basic Annotation Box N-SET). * @param printHandler print communication handler, association must be open. * @param idx index of the annotation from which the settings are taken, * must be < getNumberOfAnnotations(). * @return EC_Normal upon success, an error code otherwise. */ OFCondition printSCUsetBasicAnnotationBox( DVPSPrintMessageHandler& printHandler, size_t idx); /** Prints the current DICOM Basic Film Box SOP Instance. * @param printHandler print communication handler, association must be open. * @return EC_Normal upon success, an error code otherwise. */ OFCondition printSCUprintBasicFilmBox(DVPSPrintMessageHandler& printHandler); /** Prints the current DICOM Basic Film Session. * @param printHandler print communication handler, association must be open. * @return EC_Normal upon success, an error code otherwise. */ OFCondition printSCUprintBasicFilmSession(DVPSPrintMessageHandler& printHandler); /** Deletes all objects currently present in the print association. * @param printHandler print communication handler, association must be open. * @return EC_Normal upon success, an error code otherwise. */ OFCondition printSCUdelete(DVPSPrintMessageHandler& printHandler); /** sets the illumination to be used * with the print Presentation LUT SOP Class. * @param value new attribute value, in cd/m2. * The caller is responsible for making sure * that the value is valid for the selected printer. * @return EC_Normal if successful, an error code otherwise. */ OFCondition setPrintIllumination(Uint16 value); /** gets the current illumination setting * used with the print Presentation LUT SOP Class. * @return illumination in cd/m2 */ Uint16 getPrintIllumination(); /** sets the reflected ambient light to be used * with the print Presentation LUT SOP Class. * @param value new attribute value, in cd/m2. * The caller is responsible for making sure * that the value is valid for the selected printer. * @return EC_Normal if successful, an error code otherwise. */ OFCondition setPrintReflectedAmbientLight(Uint16 value); /** gets the current reflected ambient light setting * used with the print Presentation LUT SOP Class. * @return reflected ambient light in cd/m2 */ Uint16 getPrintReflectedAmbientLight(); /** performs a Print SCP Basic Film Box N-CREATE operation on a newly * created instance of this class. The results of the operation are * stored in the objects passed as rsp, rspDataset and * globalPresentationLUTList. * @param cfg config file facility * @param cfgname symbolic printer name in config file * @param rqDataset N-CREATE request dataset, may be NULL * @param rsp N-CREATE response message * @param rspDataset N-CREATE response dataset passed back in this parameter * @param presentationLUTnegotiated * OFTrue if support for the Presentation LUT SOP class * has been negotiated at association negotiation and is supported on * Basic Film Box level * @param globalPresentationLUTList * list of presentation LUTs managed by the Print SCP. * If a SCP default Presentation LUT needs to be created as the result * of the N-CREATE operation, it is stored in this list. * @param filmSessionUID * SOP instance UID of the Basic Film Session object * @param study study UID to be used when storing Stored Print or image objects * @param psSeries series UID to be used when storing Stored Print objects * @param imgSeries series UID to be used when storing image objects (Hardcopy Grayscale) * @return OFTrue if N-CREATE was successful, OFFalse otherwise. */ OFBool printSCPCreate( DVConfiguration& cfg, const char *cfgname, DcmDataset *rqDataset, T_DIMSE_Message& rsp, DcmDataset *& rspDataset, OFBool presentationLUTnegotiated, DVPSPresentationLUT_PList& globalPresentationLUTList, const char *filmSessionUID, DcmUniqueIdentifier& study, DcmUniqueIdentifier& psSeries, DcmUniqueIdentifier& imgSeries); /** performs a Print SCP Basic Film Box N-SET operation on an instance of * this class. The results of the N-SET operation are stored in the * objects passed as rsp and rspDataset. * @param cfg config file facility * @param cfgname symbolic printer name in config file * @param rqDataset N-SET request dataset * @param rsp N-SET response message * @param rspDataset N-SET response dataset passed back in this parameter * @param presentationLUTnegotiated * OFTrue if support for the Presentation LUT SOP class * has been negotiated at association negotiation and is supported on * Basic Film Box level * @param globalPresentationLUTList * list of presentation LUTs managed by the Print SCP * @return OFTrue if N-SET was successful, OFFalse otherwise. */ OFBool printSCPSet( DVConfiguration& cfg, const char *cfgname, DcmDataset *rqDataset, T_DIMSE_Message& rsp, DcmDataset *& rspDataset, OFBool presentationLUTnegotiated, DVPSPresentationLUT_PList& globalPresentationLUTList); /** checks whether the given UID string matches the film box UID. * @param c uid to be compared * @return OFTrue if equal, OFFalse otherwise */ OFBool isFilmBoxInstance(const char *c) { if (c && (filmBoxInstanceUID == c)) return OFTrue; else return OFFalse; } /** checks whether the Presentation LUT with the given UID * is referenced by this Stored Print object on the film box level. * Presentation LUT references on Image Box level are ignored. * @param c uid to be compared * @return OFTrue if equal, OFFalse otherwise */ OFBool usesPresentationLUT(const char *c); /** looks up the image box with the given SOP instance UID in the image box list * and returns a pointer to a new object containing a copy of this * image box. If the object is not found, NULL is returned. * @param uid SOP instance UID of the image box to be looked up * @return pointer to copied image box object, may be NULL. */ DVPSImageBoxContent *duplicateImageBox(const char *uid) { return imageBoxContentList.duplicateImageBox(uid); } /** checks whether any of the image boxes managed by the image box list * has the same position as the given one, but a different * SOP instance UID. This is used during a Print SCP basic grayscale * image box N-SET operation to check whether an image position clash exists. * @param uid SOP instance UID of the image box to be looked up * @param position image position to be looked up */ OFBool haveImagePositionClash(const char *uid, Uint16 position) { return imageBoxContentList.haveImagePositionClash(uid, position); } /** adds the given image box object to the image box list. * Any other object existing in the list with the same SOP instance UID is removed. * Used during a Print SCP basic grayscale image box N-SET operation. * @param newImageBox new image box object to be added to the list. */ void replaceImageBox(DVPSImageBoxContent *newImageBox) { imageBoxContentList.replace(newImageBox); } /** updates the list of Presentation LUTs managed by the Stored Print object * from a global list. If a Presentation LUT is active on Film Box level, the corresponding * LUT is copied from the global presentation LUT list. * Presentation LUT references on Image Box level are ignored. * Used during a Print SCP N-ACTION operation. * @param globalPresentationLUTList list of presentation LUTs managed by the Print SCP */ void updatePresentationLUTList(DVPSPresentationLUT_PList& globalPresentationLUTList); /** checks whether the given Presentation LUT type could be used together * with all image boxes in this film box on a Print SCP that requires a matching * alignment between a Presentation LUT and the image pixel data. * @param align LUT alignment type * @return OFTrue if matching, OFFalse otherwise */ OFBool matchesPresentationLUT(DVPSPrintPresentationLUTAlignment align) const { return imageBoxContentList.matchesPresentationLUT(align); } /** replaces the settings for illumination, reflected ambient light and * referenced Presentation LUT in this film box. * Used by a Print SCP if Presentation LUT is implemented on Film Session * level. * @param newIllumination new value for illumination * @param newReflectedAmbientLight new value for reflectedAmbientLight * @param newReferencedPLUT new value for referenced presentation LUT instance UID * @param newAlignment new alignment type of active presentation LUT */ void overridePresentationLUTSettings( DcmUnsignedShort& newIllumination, DcmUnsignedShort& newReflectedAmbientLight, DcmUniqueIdentifier& newReferencedPLUT, DVPSPrintPresentationLUTAlignment newAlignment); /** checks whether any of the image boxes has an image box position * assigned. If no image box position is assigned, the stored print object * cannot be written and a Print SCP should return a warning * status upon receipt of an N-ACTION request. * @return OFTrue if empty page (no image box position assigned), OFFalse otherwise. */ OFBool emptyPageWarning() { return imageBoxContentList.emptyPageWarning(); } private: /// private undefined assignment operator DVPSStoredPrint& operator=(const DVPSStoredPrint&); /* checks if given SOP class UID is an image storage SOP class * @return OFTrue if image SOP class, OFFalse otherwise. */ OFBool isImageStorageSOPClass(OFString& sopclassuid); /** create default values for all missing type 1 elements. * Called before a stored print object is written. * @return EC_Normal if successful, an error code otherwise. */ OFCondition createDefaultValues(); /** writes a Referenced Presentation LUT SQ to the given * dataset. Helper function used in the more general write() method. * @param dset the dataset to which the data is written * @return EC_Normal if successful, an error code otherwise. */ OFCondition addReferencedPLUTSQ(DcmItem &dset); /** writes a Referenced Presentation LUT SQ, Illumination and * reflected ambient light to the given dataset. * Helper function used when creating Basic Film Session or * Basic Film Box. * @param dset the dataset to which the data is written * @return EC_Normal if successful, an error code otherwise. */ OFCondition addPresentationLUTReference(DcmItem& dset); /** invalidates the cached number of columns and rows */ void invalidateCache(); /** updates the cached number of columns and rows */ void updateCache(); /* Module: Patient (M) */ /// Module=Patient, VR=PN, VM=1, Type 1 DcmPersonName patientName; /// Module=Patient, VR=LO, VM=1, Type 2 DcmLongString patientID; /// Module=Patient, VR=DA, VM=1, Type 2 DcmDate patientBirthDate; /// Module=Patient, VR=CS, VM=1, Type 2 DcmCodeString patientSex; /* Module: General Study (M) */ /// Module=General_Study, VR=UI, VM=1, Type 1 DcmUniqueIdentifier studyInstanceUID; /// Module=General_Study, VR=DA, VM=1, Type 2 DcmDate studyDate; /// Module=General_Study, VR=TM, VM=1, Type 2 DcmTime studyTime; /// Module=General_Study, VR=PN, VM=1, Type 2 DcmPersonName referringPhysicianName; /// Module=General_Study, VR=SH, VM=1, Type 2 DcmShortString studyID; /// Module=General_Study, VR=SH, VM=1, Type 2 DcmShortString accessionNumber; /* Module: General Series (M) */ /// Module=General_Series, VR=UI, VM=1, Type 1 DcmUniqueIdentifier seriesInstanceUID; /// Module=General_Series, VR=IS, VM=1, Type 2 DcmIntegerString seriesNumber; /* Module: General Equipment (M) */ /// Module=General_Equipment, VR=LO, VM=1, Type 2 DcmLongString manufacturer; /* Module: Printer Characteristics (M) */ // the PrintManagementCapabilitiesSequence is only created/checked on the fly // PrinterCharacteristicsSequence /// Module=Printer_Characteristics_Module, VR=AE, VM=1, Type 2 DcmApplicationEntity originator; /// Module=Printer_Characteristics_Module, VR=AE, VM=1, Type 2 DcmApplicationEntity destination; /// Module=Printer_Characteristics_Module, VR=LO, VM=1, Type 3 DcmLongString printerName; /* Module: Film Box (M) */ /// Module=Film_Box_Module, VR=IS, VM=1, Type 2 DcmIntegerString instanceNumber; /* the following attributes belong to the Film Box Content SQ (Type 1) */ /// Module=Film_Box_Module, VR=ST, VM=1, Type 1 DcmShortText imageDisplayFormat; /// Module=Film_Box_Module, VR=CS, VM=1, Type 3 DcmCodeString annotationDisplayFormatID; /// Module=Film_Box_Module, VR=CS, VM=1, Type 2 DcmCodeString filmOrientation; /// Module=Film_Box_Module, VR=CS, VM=1, Type 2 DcmCodeString filmSizeID; /// Module=Film_Box_Module, VR=CS, VM=1, Type 2 DcmCodeString magnificationType; /// Module=Film_Box_Module, VR=CS, VM=1, Type 3 DcmCodeString smoothingType; /// Module=Film_Box_Module, VR=CS, VM=1, Type 3 DcmCodeString borderDensity; /// Module=Film_Box_Module, VR=CS, VM=1, Type 3 DcmCodeString emptyImageDensity; /// Module=Film_Box_Module, VR=US, VM=1, Type 3 DcmUnsignedShort minDensity; /// Module=Film_Box_Module, VR=US, VM=1, Type 2 DcmUnsignedShort maxDensity; /// Module=Film_Box_Module, VR=CS, VM=1, Type 3 DcmCodeString trim; /// Module=Film_Box_Module, VR=ST, VM=1, Type 2 DcmShortText configurationInformation; /// Module=Film_Box_Module, VR=US, VM=1, Type 2c required if presentation SOP class present DcmUnsignedShort illumination; /// Module=Film_Box_Module, VR=US, VM=1, Type 2c required if presentation SOP class present DcmUnsignedShort reflectedAmbientLight; /// Module=Film_Box_Module (Supplement 38), VR=CS, VM=1, Type 3 DcmCodeString requestedResolutionID; /// the ReferencedPresentationLUTSequence is only created/read on the fly DcmUniqueIdentifier referencedPresentationLUTInstanceUID; /** The Print SCP can be configured to enforce a rule requiring that the * number of entries in a Presentation LUT matches the bit depth of the * image pixel data. This member variable describes the type of the * current presentation LUT (if any). */ DVPSPrintPresentationLUTAlignment referencedPresentationLUTAlignment; /* Module: Image Box List (M) */ /// Module=Image_Box_List_Module, VR=SQ, VM=1, Type 1 DVPSImageBoxContent_PList imageBoxContentList; /* Module: Annotation List (U) */ /// Module=Annotation_List_Module, VR=SQ, VM=1, Type 3 DVPSAnnotationContent_PList annotationContentList; /* Module: Presentation LUT List (U) */ DVPSPresentationLUT_PList presentationLUTList; /* Module: SOP Common (M) * we don't store the SOP Class UID because it is well known. */ /// Module=SOP_Common, VR=UI, VM=1, Type 1 DcmUniqueIdentifier sOPInstanceUID; /// Module=SOP_Common, VR=CS, VM=1-n, Type 1C DcmCodeString specificCharacterSet; /// Module=SOP_Common, VR=DA, VM=1, Type 3 DcmDate instanceCreationDate; /// Module=SOP_Common, VR=TM, VM=1, Type 3 DcmTime instanceCreationTime; /// used when creating hardcopy image objects DcmUniqueIdentifier imageSeriesInstanceUID; /// flag indicating whether the currentXX values are up to date OFBool currentValuesValid; /// current number of columns unsigned long currentNumCols; /// current number of rows unsigned long currentNumRows; /// requested decimate/crop behaviour used in all image boxes DVPSDecimateCropBehaviour decimateCropBehaviour; /// the current film session instance OFString filmSessionInstanceUID; /// the current film box instance OFString filmBoxInstanceUID; /** the current presentation LUT instance. If used as Print SCU, the * content of this string can differ from referencedPresentationLUTInstanceUID * which contains the UID from the Stored Print object wheras this * string contains the UID assigned by the remote Print SCP. * If used as Print SCP, these strings should always be equal. */ OFString presentationLUTInstanceUID; /// stores the "global" presentation LUT that overrides the image box LUTs (optional) DVPSPresentationLUT globalPresentationLUT; /// flag indicating whether the globalPresentationLUT is currently valid or not OFBool globalPresentationLUTValid; /// transmit images in 12 bit for the current print job OFBool transmitImagesIn12Bit; /// presentation LUTs are rendered on SCP side OFBool renderPresentationLUTinSCP; /// temporary buffer for getMaxDensity and getMinDensity OFString tempDensity; }; #endif /* * $Log: dvpssp.h,v $ * Revision 1.42 2010-10-14 13:16:36 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.41 2010-08-09 13:20:50 joergr * Updated data dictionary to 2009 edition of the DICOM standard. From now on, * the official "keyword" is used for the attribute name which results in a * number of minor changes (e.g. "PatientsName" is now called "PatientName"). * * Revision 1.40 2009-11-24 14:12:57 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.39 2009-09-30 10:42:38 uli * Make dcmpstat's include headers self-sufficient by including all * needed headers directly and stop using dctk.h * * Revision 1.38 2005-12-08 16:04:03 meichel * Changed include path schema for all DCMTK header files * * Revision 1.37 2004/02/04 15:49:09 joergr * Removed acknowledgements with e-mail addresses from CVS log. Removed leading * underscore characters from preprocessor symbols (reserved symbols). * * Revision 1.36 2002/04/16 14:02:03 joergr * Added configurable support for C++ ANSI standard includes (e.g. streams). * * Revision 1.35 2001/09/26 15:36:15 meichel * Adapted dcmpstat to class OFCondition * * Revision 1.34 2001/06/01 15:50:21 meichel * Updated copyright header * * Revision 1.33 2000/07/18 16:03:44 joergr * Moved method convertODtoLum/PValue from class DVInterface to DVPSStoredPrint * and corrected implementation. * Changed behaviour of methods getMin/MaxDensityValue (return default value if * attribute empty/absent). * * Revision 1.32 2000/07/07 14:14:24 joergr * Added support for LIN OD presentation LUT shape. * * Revision 1.31 2000/07/05 12:33:29 joergr * Corrected documentation of one method. * * Revision 1.30 2000/07/04 15:58:03 joergr * Added support for overriding the presentation LUT settings made for the * image boxes. * * Revision 1.29 2000/06/20 14:50:08 meichel * Added monochrome1 printing mode. * * Revision 1.28 2000/06/19 16:29:07 meichel * Added options for session printing and LIN OD to print tools, fixed * pixel aspect ratio related bug. * * Revision 1.27 2000/06/14 11:28:15 joergr * Added methods to access the attributes Polarity and Requested Image Size. * * Revision 1.26 2000/06/08 10:44:29 meichel * Implemented Referenced Presentation LUT Sequence on Basic Film Session level. * Empty film boxes (pages) are not written to file anymore. * * Revision 1.25 2000/06/07 14:23:09 joergr * Added methods to access the image polarity attribute. * Added missing transformations (polarity, GSDF, presentation LUT, aspect * ratio) to print preview rendering. * * Revision 1.24 2000/06/07 13:17:46 meichel * added binary and textual log facilities to Print SCP. * * Revision 1.23 2000/06/02 16:00:51 meichel * Adapted all dcmpstat classes to use OFConsole for log and error output * * Revision 1.22 2000/05/31 12:56:39 meichel * Added initial Print SCP support * * Revision 1.21 2000/05/31 07:54:24 joergr * Added support for Stored Print attributes Originator and Destination * application entity title. * * Revision 1.20 2000/05/30 13:42:09 joergr * Added methods to set, get and store the printer name in the stored print * object (PrinterCharacteristicsSequence). * * Revision 1.19 2000/03/08 16:28:56 meichel * Updated copyright header. * * Revision 1.18 2000/03/03 14:13:55 meichel * Implemented library support for redirecting error messages into memory * instead of printing them to stdout/stderr for GUI applications. * * Revision 1.17 2000/02/29 12:16:16 meichel * Fixed bug in dcmpstat library that caused Monochrome1 images * to be printed inverse if a Presentation LUT was applied. * * Revision 1.16 1999/10/19 14:46:04 meichel * added support for the Basic Annotation Box SOP Class * as well as access methods for Max Density and Min Density. * * Revision 1.15 1999/10/13 14:11:12 meichel * Fixed bug in routine that renders P-LUTs into a print bitmap * before sending an image to the printer * * Revision 1.14 1999/10/07 17:21:50 meichel * Reworked management of Presentation LUTs in order to create tighter * coupling between Softcopy and Print. * * Revision 1.13 1999/09/24 15:24:30 meichel * Added support for CP 173 (Presentation LUT clarifications) * * Revision 1.12 1999/09/17 14:33:59 meichel * Completed print spool functionality including Supplement 22 support * * Revision 1.11 1999/09/15 17:43:29 meichel * Implemented print job dispatcher code for dcmpstat, adapted dcmprtsv * and dcmpsprt applications. * * Revision 1.10 1999/09/13 15:19:10 meichel * Added implementations for a number of further print API methods. * * Revision 1.9 1999/09/10 12:46:47 meichel * Added implementations for a number of print API methods. * * Revision 1.8 1999/09/09 14:57:33 thiel * Added methods for print spooler * * Revision 1.7 1999/09/09 12:20:47 meichel * Added print API method declarations and implementations (empty for now). * * Revision 1.6 1999/09/08 16:46:44 meichel * Added print API method declarations * * Revision 1.5 1999/09/01 16:14:41 meichel * Added support for requested image size to print routines * * Revision 1.4 1999/08/31 14:09:12 meichel * Added get/set methods for stored print attributes * * Revision 1.3 1999/08/27 15:57:57 meichel * Added methods for saving hardcopy images and stored print objects * either in file or in the local database. * * Revision 1.2 1999/08/26 09:31:00 thiel * Add extensions for the usage of the StoredPrint * * Revision 1.1 1999/07/30 13:34:50 meichel * Added new classes managing Stored Print objects * * */ dcmtk-3.6.0/dcmpstat/include/dcmtk/dcmpstat/dvpspll.h0000644000310500011400000001427711455601264022076 0ustar joergrdicom3/* * * Copyright (C) 1998-2010, 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: DVPSPresentationLUT_PList * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:16:36 $ * CVS/RCS Revision: $Revision: 1.13 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DVPSPLL_H #define DVPSPLL_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/ofstd/oflist.h" #include "dcmtk/dcmpstat/dvpstyp.h" /* for enum types */ #include "dcmtk/dcmnet/dimse.h" class DVPSPresentationLUT; class DVPSImageBoxContent_PList; /** the list of presentation LUTs contained in a stored print object. * This class manages the data structures comprising one complete * Presentation LUT Content Sequence. */ class DVPSPresentationLUT_PList { public: /// default constructor DVPSPresentationLUT_PList(); /// copy constructor DVPSPresentationLUT_PList(const DVPSPresentationLUT_PList& copy); /** clone method. * @return a pointer to a new DVPSPresentationLUT_PList object containing * a deep copy of this object. */ DVPSPresentationLUT_PList *clone() { return new DVPSPresentationLUT_PList(*this); } /// destructor virtual ~DVPSPresentationLUT_PList(); /** reads a list of Presentation LUTs (Presentation LUT Content Sequence) from a DICOM dataset. * The DICOM elements of the image references item are copied from the dataset to this object. * The completeness of all items (presence of all required elements, * value multiplicity) is checked. * If this method returns an error code, the object is in undefined state afterwards. * @param dset the DICOM dataset from which the sequence is to be read * @return EC_Normal if successful, an error code otherwise. */ OFCondition read(DcmItem &dset); /** writes the list of Presentation LUTs managed by this object to a DICOM dataset. * Copies of the DICOM element managed by this object are inserted into * the DICOM dataset. * @param dset the DICOM dataset to which the ReferencedImageSequence is written * @return EC_Normal if successful, an error code otherwise. */ OFCondition write(DcmItem &dset); /** reset the object to initial state. * After this call, the object is in the same state as after * creation with the default constructor. */ void clear(); /** gets the number of Presentation LUTs in this list. * @return the number of Presentation LUTs. */ size_t size() const { return list_.size(); } /** finds a presentation LUT by its SOP instance UID. * @param instanceUID SOP instance UID * @return pointer to matching presentation LUT if found, NULL otherwise. */ DVPSPresentationLUT *findPresentationLUT(const char *instanceUID); /** removes all presentation LUT entries that are not * referenced from the film box or image box level. * @param filmBox Presentation LUT UID reference on film box level, may be NULL. * @param imageBoxes list of image boxes */ void cleanup(const char *filmBox, DVPSImageBoxContent_PList& imageBoxes); /** adds a Presentation LUT to the list of managed LUTs. * The referenced LUT is copied. If an identical LUT already exists, * no duplicate is created. * @param newLUT pointer to new Presentation LUT. May be NULL. * @param inversePLUT true if presentation LUT is for Monochrome1 and must be inversed. * @return UID of referenced Presentation LUT. May be NULL (if input was NULL). */ const char *addPresentationLUT(DVPSPresentationLUT *newLUT, OFBool inversePLUT); /** adds a Presentation LUT to the list of managed LUT. The LUT object becomes * owned by this object and is destroyed upon destruction of the list. * @param newLUT LUT to be added. */ void insert(DVPSPresentationLUT *newLUT) { if (newLUT) list_.push_back(newLUT); } /** performs a Print SCP Presentation LUT N-DELETE operation. * The results of the N-DELETE operation are stored in the object passed as rsp. * @param rq N-DELETE request message * @param rsp N-DELETE response message */ void printSCPDelete(T_DIMSE_Message& rq, T_DIMSE_Message& rsp); private: /** private undefined assignment operator */ DVPSPresentationLUT_PList& operator=(const DVPSPresentationLUT_PList&); /** the list maintained by this object */ OFList list_; }; #endif /* * $Log: dvpspll.h,v $ * Revision 1.13 2010-10-14 13:16:36 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.12 2010-10-07 14:31:36 joergr * Removed leading underscore characters from preprocessor symbols (reserved). * * Revision 1.11 2009-11-24 14:12:57 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.10 2009-09-30 10:42:38 uli * Make dcmpstat's include headers self-sufficient by including all * needed headers directly and stop using dctk.h * * Revision 1.9 2005-12-08 16:03:56 meichel * Changed include path schema for all DCMTK header files * * Revision 1.8 2003/06/04 10:18:06 meichel * Replaced private inheritance from template with aggregation * * Revision 1.7 2001/09/26 15:36:14 meichel * Adapted dcmpstat to class OFCondition * * Revision 1.6 2001/06/01 15:50:19 meichel * Updated copyright header * * Revision 1.5 2000/06/02 16:00:49 meichel * Adapted all dcmpstat classes to use OFConsole for log and error output * * Revision 1.4 2000/05/31 12:56:39 meichel * Added initial Print SCP support * * Revision 1.3 2000/03/08 16:28:54 meichel * Updated copyright header. * * Revision 1.2 2000/02/29 12:16:15 meichel * Fixed bug in dcmpstat library that caused Monochrome1 images * to be printed inverse if a Presentation LUT was applied. * * Revision 1.1 1999/10/07 17:21:49 meichel * Reworked management of Presentation LUTs in order to create tighter * coupling between Softcopy and Print. * * */ dcmtk-3.6.0/dcmpstat/include/dcmtk/dcmpstat/dvpsrs.h0000644000310500011400000002243311455601264021724 0ustar joergrdicom3/* * * Copyright (C) 1998-2010, 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: DVPSReferencedSeries * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:16:36 $ * CVS/RCS Revision: $Revision: 1.14 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DVPSRS_H #define DVPSRS_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmpstat/dvpsril.h" /* for DVPSReferencedImage_PList */ #include "dcmtk/dcmdata/dcvrae.h" #include "dcmtk/dcmdata/dcvrsh.h" #include "dcmtk/dcmdata/dcvrui.h" /** an item of the referenced series sequence in a presentation state (internal use only). * This class manages the data structures comprising one item * of the Referenced Series Sequence in a Presentation State object. */ class DVPSReferencedSeries { public: /// default constructor DVPSReferencedSeries(); /// copy constructor DVPSReferencedSeries(const DVPSReferencedSeries& copy); /** clone method. * @return a pointer to a new DVPSReferencedSeries object containing * a deep copy of this object. */ DVPSReferencedSeries *clone() { return new DVPSReferencedSeries(*this); } /// destructor virtual ~DVPSReferencedSeries(); /** reads an series reference from a DICOM dataset. * The DICOM elements of the referenced series item are copied * from the dataset to this object. * The completeness of the item (presence of all required elements, * value multiplicity) is checked. * If this method returns an error code, the object is in undefined state afterwards. * @param dset the item of the ReferencedSeriesSequence from which the data is to be read * @return EC_Normal if successful, an error code otherwise. */ OFCondition read(DcmItem &dset); /** writes the series reference managed by this object to a DICOM dataset. * Copies of the DICOM element managed by this object are inserted into * the DICOM dataset. * @param dset the the item of the ReferencedSeriesSequence to which the data is written * @return EC_Normal if successful, an error code otherwise. */ OFCondition write(DcmItem &dset); /** check if the passed SOP Class UID is equal to the ones stored in this object. * This method checks whether this object contains at least one image reference * and whether all image references use the same SOP class UID as the one passed. * If sopclassuid is empty, the referencedSOPClassUID of the first image reference * is assigned to it. * @param sopclassuid the SOP class UID to be validated * @return OFTrue if successful, OFFalse if unsuccessful. */ OFBool isValid(OFString& sopclassuid); /** compare SOP Instance UID. * @param uid the UID to be compared * @return OFTrue if the SeriesInstanceUID of this object is * equal to uid, OFFalse otherwise. */ OFBool isSeriesUID(const char *uid); /** checks if an image reference with the given SOP instance UID exists * in the ReferencedImageSequence of this series reference. * @param sopinstanceuid the SOP instance UID of the searched image reference * @return a pointer to the matching DVPSReferencedImage if found, NULL otherwise. */ DVPSReferencedImage *findImageReference(const char *sopinstanceuid); /** remove image reference from this series reference if present. * If an image reference with a SOP instance UID corresponding to the * passed UID is found, it is removed from this series reference. * @param uid a pointer to the image SOP instance UID. */ void removeImageReference(const char *sopinstanceuid); /** set Series Instance UID of this series reference. * @param uid a pointer to the UID, which is copied into this object. */ void setSeriesInstanceUID(const char *uid); /** set the optional retrieve location for this series reference. * @param aetitle the retrieveAETitle, must be a valid DICOM 'AE' value. Default: value absent. * @param filesetID the storageMediaFileSetID, must be a valid DICOM 'SH' value. Default: value absent. * @param filesetUID the storageMediaFileSetUID, must be a valid DICOM UID. Default: value absent. */ void setRetrieveLocation(const char *aetitle=NULL, const char *filesetID=NULL, const char *filesetUID=NULL); /** gets the retrieveAETitle for this series reference. * @return retrieveAETitle if present, NULL otherwise. */ const char *getRetrieveAETitle(); /** gets the storageMediaFileSetID for this series reference. * @return storageMediaFileSetID if present, NULL otherwise. */ const char *getStorageMediaFileSetID(); /** gets the storageMediaFileSetUID for this series reference. * @return storageMediaFileSetUID if present, NULL otherwise. */ const char *getStorageMediaFileSetUID(); /** add image reference to this series reference. * A new image reference for this series is created. * The image SOP instance UID must be unique (must not yet exist * as a reference in this series), otherwise an error code is returned. * @param sopclassUID a pointer to the Image SOP Class UID, which is copied into * the new image reference * @param instanceUID a pointer to the Image SOP Instance UID, which is copied into * the new image reference * @param frames a list of frame numbers in DICOM IS format * (integer numbers separated by '\' characters). Default: frame numbers absent. * The frame numbers are required if the referenced image is a multiframe image. * @return EC_Normal if successful, an error code otherwise. */ OFCondition addImageReference( const char *sopclassUID, const char *instanceUID, const char *frames=NULL); /** gets the number of image references in this object. * @return the number of image references. */ size_t numberOfImageReferences() const { return referencedImageList.size(); } /** gets an image reference with the given index. * @param idx index, must be < numberOfImageReferences(). * @param seriesUID the Series Instance UID is returned in this string * @param sopclassUID the SOP Class UID is returned in this string * @param instanceUID the SOP Instance UID is returned in this string * @param frames the list of frames is returned in this string * @param aetitle the series retrieveAETitle is returned in this string * @param filesetID the series storageMediaFileSetID is returned in this string * @param filesetUID the series storageMediaFileSetUID is returned in this string * @return EC_Normal if successful, an error code otherwise. */ OFCondition getImageReference( size_t idx, OFString& seriesUID, OFString& sopclassUID, OFString& instanceUID, OFString& frames, OFString& aetitle, OFString& filesetID, OFString& filesetUID); private: /// private undefined assignment operator DVPSReferencedSeries& operator=(const DVPSReferencedSeries&); /// Referenced Image Sequence DVPSReferencedImage_PList referencedImageList; /// VR=UI, VM=1, Type 1c DcmUniqueIdentifier seriesInstanceUID; /// VR=AE, VM=1, Type 3 DcmApplicationEntity retrieveAETitle; /// VR=SH, VM=1, Type 3 DcmShortString storageMediaFileSetID; /// VR=UI, VM=1, Type 3 DcmUniqueIdentifier storageMediaFileSetUID; }; #endif /* * $Log: dvpsrs.h,v $ * Revision 1.14 2010-10-14 13:16:36 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.13 2010-10-07 14:31:36 joergr * Removed leading underscore characters from preprocessor symbols (reserved). * * Revision 1.12 2010-03-01 09:08:49 uli * Removed some unnecessary include directives in the headers. * * Revision 1.11 2009-11-24 14:12:57 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.10 2009-09-30 10:42:38 uli * Make dcmpstat's include headers self-sufficient by including all * needed headers directly and stop using dctk.h * * Revision 1.9 2005-12-08 16:04:01 meichel * Changed include path schema for all DCMTK header files * * Revision 1.8 2001/09/26 15:36:15 meichel * Adapted dcmpstat to class OFCondition * * Revision 1.7 2001/06/01 15:50:21 meichel * Updated copyright header * * Revision 1.6 2000/06/02 16:00:51 meichel * Adapted all dcmpstat classes to use OFConsole for log and error output * * Revision 1.5 2000/03/08 16:28:56 meichel * Updated copyright header. * * Revision 1.4 1999/07/22 16:39:10 meichel * Adapted dcmpstat data structures and API to supplement 33 letter ballot text. * * Revision 1.3 1999/01/15 17:33:04 meichel * added methods to DVPresentationState allowing to access the image * references in the presentation state. Also added methods allowing to * get the width and height of the attached image. * * Revision 1.2 1998/12/14 16:10:33 meichel * Implemented Presentation State interface for graphic layers, * text and graphic annotations, presentation LUTs. * * Revision 1.1 1998/11/27 14:50:32 meichel * Initial Release. * * */ dcmtk-3.6.0/dcmpstat/include/dcmtk/dcmpstat/dvcache.h0000644000310500011400000006457011455601263022007 0ustar joergrdicom3/* * * Copyright (C) 1998-2010, 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: Joerg Riesmeier * * Purpose: Classes for caching of the image database (Header/Source) * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:16:35 $ * CVS/RCS Revision: $Revision: 1.20 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DVCACHE_H #define DVCACHE_H #include "dcmtk/config/osconfig.h" #include "dcmtk/ofstd/oflist.h" #include "dcmtk/ofstd/ofstring.h" #include "dcmtk/dcmqrdb/dcmqrdbi.h" /* for DVIFhierarchyStatus */ /*--------------------* * type definitions * *--------------------*/ /** describes the different types of instances stored in the database */ enum DVPSInstanceType { /// image object DVPSI_image, /// presentation state object DVPSI_presentationState, /// structured reporting document DVPSI_structuredReport, /// stored print object DVPSI_storedPrint, /// hardcopy grayscale object DVPSI_hardcopyGrayscale }; /*---------------------* * class declaration * *---------------------*/ /** A class to handle an instance cache (list of items). * This is the lowest level in the hierarchical cache structure. * Images are handled as well as presentation states. This class * is used by DVSeriesCache. */ class DVInstanceCache { public: /** Internal structure defining the list items. */ struct ItemStruct { /** Constructor. * sets internal member variables. * ** @param uid unique identifier * @param pos file position in index file * @param status review status * @param type type of instance * @param size image size (in bytes) * @param filename filename of instance */ ItemStruct(const OFString &uid, const int pos, const DVIFhierarchyStatus status, const DVPSInstanceType type, const int size, const OFString &filename) : UID(uid), Pos(pos), Status(status), Type(type), ImageSize(size), Filename(filename), Checked(OFFalse), Description(), Label(), List() {} /// instance UID OFString UID; /// position in the index file int Pos; /// review status DVIFhierarchyStatus Status; /// type of instance DVPSInstanceType Type; /// image size (in bytes) int ImageSize; /// filename of instance OFString Filename; /// status flag to avoid double checking of referencing pstates OFBool Checked; /// instance description OFString Description; /// instance label OFString Label; /// list of referencing pstates OFList List; }; /** Constructor */ DVInstanceCache() : List(), Iterator(), OldIterator() { Iterator = OldIterator = List.end(); } /** Destructor */ virtual ~DVInstanceCache() { clear(); } /** reset all member variables to initial state. * delete all list items. */ inline void clear() { Iterator = List.begin(); OFListIterator(ItemStruct *) last = List.end(); while (Iterator != last) { delete (*Iterator); Iterator = List.erase(Iterator); } List.clear(); Iterator = OldIterator = List.end(); } /** checks whether instance cache is empty * ** @result OFTrue if cache is empty, OFFalse otherwise */ inline OFBool empty() const { return List.empty(); } /** gets number of cache entries * ** @return number of cache entries */ inline Uint32 getCount() const { return List.size(); } /** sets internal cursor to specified position in cache list * ** @param idx index position in cache list (starting with 0) * ** @return OFTrue if successful, OFFalse if 'idx' is invalid */ inline OFBool gotoItem(Uint32 idx) { OFBool result = OFFalse; Iterator = List.begin(); OFListIterator(ItemStruct *) last = List.end(); while (Iterator != last) { if (idx == 0) { result = OFTrue; break; } idx--; ++Iterator; } return result; } /** sets internal cursor to first position in cache list * ** @return OFTrue if successful, OFFalse if list is empty */ inline OFBool gotoFirst() { OldIterator = Iterator; Iterator = List.begin(); return (Iterator != List.end()); } /** sets internal cursor to next position in cache list * ** @return OFTrue if successful, OFFalse if new position is invalid */ inline OFBool gotoNext() { OFListIterator(ItemStruct *) last = List.end(); if (Iterator != last) Iterator++; return (Iterator != last); } /** sets internal cursor to last visited position in cache list * ** @return OFTrue if successful, * OFFalse if last visited position was invalid or the last one in the list */ inline OFBool reset() { OFBool result = OFFalse; OFListIterator(ItemStruct *) last = List.end(); if (OldIterator != last) { Iterator = OldIterator; OldIterator = last; result = OFTrue; } return result; } /** checks whether an item with the specified UID exists in the cache list * ** @param uid UID which should be checked * ** @return OFTrue if such an item exists, OFFalse otherwise */ inline OFBool isElem(const OFString &uid) { OFBool result = OFFalse; Iterator = List.begin(); OFListIterator(ItemStruct *) last = List.end(); while (Iterator != last) { const ItemStruct *item = (*Iterator); if (item != NULL) { if (item->UID == uid) { result = OFTrue; break; } } ++Iterator; } return result; } /** gets the file position of the current (selected) instance * ** @return file position if successful, 0 otherwise */ inline int getPos() const { const ItemStruct *item = getItem(); return (item != NULL) ? item->Pos : 0; } /** gets review status of the current (selected) instance * ** @return hierarchical status code if successful, 'isNew' otherwise */ inline DVIFhierarchyStatus getStatus() const { const ItemStruct *item = getItem(); return (item != NULL) ? item->Status : DVIF_objectIsNew; } /** gets type of the instance * ** @return type of instance */ inline DVPSInstanceType getType() const { const ItemStruct *item = getItem(); return (item != NULL) ? item->Type : DVPSI_image; } /** gets image size of current (selected) instance * ** @return image size in bytes if successful, 0 otherwise */ inline int getImageSize() const { const ItemStruct *item = getItem(); return (item != NULL) ? item->ImageSize : 0; } /** gets filename of current (selected) instance * ** @return filename if successful, NULL otherwise */ inline const char *getFilename() const { const ItemStruct *item = getItem(); return (item != NULL) ? item->Filename.c_str() : (const char *)NULL; } /** gets reference to current (selected) instance * ** @return pointer to ItemStruct if successful, NULL otherwise */ inline ItemStruct *getItem() const { OFListConstIterator(ItemStruct *) it = Iterator; return (it != List.end()) ? (*Iterator) : (ItemStruct *)NULL; } /** adds a new item to the cache list. * sets internal cursor to new position. * ** @param uid unique identifier * @param pos file position in index file * @param status review status * @param type type of instance * @param size image size (in bytes) * @param filename filename of instance */ inline void addItem(const OFString &uid, const int pos, const DVIFhierarchyStatus status, const DVPSInstanceType type, const int size, const OFString &filename) { ItemStruct *item = new ItemStruct(uid, pos, status, type, size, filename); List.push_back(item); Iterator = --List.end(); // set to new position } /** updates hierarchical/review status for all list items. * ** @return resulting review status (summary of all items) */ inline DVIFhierarchyStatus updateStatus() { OFListIterator(ItemStruct *) first = List.begin(); OFListIterator(ItemStruct *) last = List.end(); OFListIterator(ItemStruct *) iter = first; DVIFhierarchyStatus status = DVIF_objectIsNew; while (iter != last) { ItemStruct *item = (*iter); if (item != NULL) { switch (item->Status) { case DVIF_objectIsNew: if (status == DVIF_objectIsNotNew) status = DVIF_objectContainsNewSubobjects; break; case DVIF_objectIsNotNew: case DVIF_objectContainsNewSubobjects: if (iter == first) status = DVIF_objectIsNotNew; else if (status == DVIF_objectIsNew) status = DVIF_objectContainsNewSubobjects; break; } } ++iter; } return status; } protected: /// list of instances OFList List; /// internal cursor to current (selected) list item OFListIterator(ItemStruct *) Iterator; /// last visited position in item list OFListIterator(ItemStruct *) OldIterator; }; /* ------------------------------ */ /** A class to handle a series cache (list of items). * This is the middle level in the hierarchical cache structure. * This class is used by DVStudyCache. The internal structure * is a list of DVInstanceCache. */ class DVSeriesCache { public: /** Internal structure defining the list items. */ struct ItemStruct { /** Constructor. * sets internal member variables. * ** @param uid unique identifier * @param status review status (optional) * @param type type of series */ ItemStruct(const OFString &uid, const DVIFhierarchyStatus status = DVIF_objectIsNew, const DVPSInstanceType type = DVPSI_image) : UID(uid), Status(status), Type(type), List() {} /// instance UID OFString UID; /// review status for the series DVIFhierarchyStatus Status; /// type of all instances within this series DVPSInstanceType Type; /// list of instances within this series DVInstanceCache List; }; /** Constructor. */ DVSeriesCache() : List(), Iterator(), OldIterator() { Iterator = OldIterator = List.end(); } /** Destructor */ virtual ~DVSeriesCache() { clear(); } /** reset all member variables to initial state * delete all list items. */ inline void clear() { Iterator = List.begin(); OFListIterator(ItemStruct *) last = List.end(); while (Iterator != last) { delete (*Iterator); Iterator = List.erase(Iterator); } List.clear(); Iterator = OldIterator = List.end(); } /** checks whether instance cache is empty * ** @return OFTrue if cache is empty, OFFalse otherwise */ inline OFBool empty() const { return List.empty(); } /** gets number of cache entries * ** @return number of cache entries */ inline Uint32 getCount() const { return List.size(); } /** sets internal cursor to specified position in cache list * ** @param idx index position in cache list (starting with 0) * ** @return OFTrue if successful, OFFalse if 'idx' is invalid */ inline OFBool gotoItem(Uint32 idx) { OFBool result = OFFalse; Iterator = List.begin(); OFListIterator(ItemStruct *) last = List.end(); while (Iterator != last) { if (idx == 0) { result = OFTrue; break; } idx--; ++Iterator; } return result; } /** sets internal cursor to first position in cache list * ** @return OFTrue if successful, OFFalse if list is empty */ inline OFBool gotoFirst() { OldIterator = Iterator; Iterator = List.begin(); return (Iterator != List.end()); } /** sets internal cursor to next position in cache list * ** @return OFTrue if successful, OFFalse if new position is invalid */ inline OFBool gotoNext() { OFListIterator(ItemStruct *) last = List.end(); if (Iterator != last) Iterator++; return (Iterator != last); } /** sets internal cursor to last visited position in cache list * ** @return OFTrue if successful, * OFFalse if last visited position was invalid or the last one in the list */ inline OFBool reset() { OFBool result = OFFalse; OFListIterator(ItemStruct *) last = List.end(); if (OldIterator != last) { Iterator = OldIterator; OldIterator = last; result = OFTrue; } return result; } /** checks whether an item with the specified UID exists in the cache list * ** @param uid UID which should be checked * ** @return OFTrue if such an item exists, OFFalse otherwise */ inline OFBool isElem(const OFString &uid) { OFBool result = OFFalse; Iterator = List.begin(); OFListIterator(ItemStruct *) last = List.end(); while (Iterator != last) { const ItemStruct *item = (*Iterator); if (item != NULL) { if (item->UID == uid) { result = OFTrue; break; } } ++Iterator; } return result; } /** gets review status of the current (selected) series * ** @return hierarchical status code if successful, 'isNew' otherwise */ inline DVIFhierarchyStatus getStatus() const { const ItemStruct *item = getItem(); return (item != NULL) ? item->Status : DVIF_objectIsNew; } /** gets type of all instances in the series * ** @return type of all instances */ inline DVPSInstanceType getType() const { const ItemStruct *item = getItem(); return (item != NULL) ? item->Type : DVPSI_image; } /** gets reference to current (selected) series * ** @return pointer to ItemStruct if successful, NULL otherwise */ inline ItemStruct *getItem() const { OFListConstIterator(ItemStruct *) it = Iterator; return (it != List.end()) ? (*Iterator) : (ItemStruct *)NULL; } /** adds a new item to the cache list. * sets internal cursor to new position. * ** @param uid unique identifier * @param status review status (optional) */ inline void addItem(const OFString &uid, const DVIFhierarchyStatus status = DVIF_objectIsNew) { ItemStruct *item = new ItemStruct(uid, status); List.push_back(item); Iterator = --List.end(); // set to new position } /** updates hierarchical/review status for all list items. * ** @return resulting review status (summary of all items) */ inline DVIFhierarchyStatus updateStatus() { OFListIterator(ItemStruct *) first = List.begin(); OFListIterator(ItemStruct *) last = List.end(); OFListIterator(ItemStruct *) iter = first; DVIFhierarchyStatus status = DVIF_objectIsNew; while (iter != last) { ItemStruct *item = (*iter); if (item != NULL) { item->Status = item->List.updateStatus(); switch (item->Status) { case DVIF_objectIsNew: if (status == DVIF_objectIsNotNew) status = DVIF_objectContainsNewSubobjects; break; case DVIF_objectIsNotNew: if (iter == first) status = DVIF_objectIsNotNew; else if (status == DVIF_objectIsNew) status = DVIF_objectContainsNewSubobjects; break; case DVIF_objectContainsNewSubobjects: status = DVIF_objectContainsNewSubobjects; break; } } ++iter; } return status; } protected: /// list of series OFList List; /// internal cursor to current (selected) list item OFListIterator(ItemStruct *) Iterator; /// last visited position in item list OFListIterator(ItemStruct *) OldIterator; }; /* ------------------------------ */ /** A class to handle a study cache (list of items). * This is the highest level in the hierarchical cache structure. * This class is used by DVInterface. The internal structure * is a list of DVSeriesCache. */ class DVStudyCache { public: /** Internal structure defining the list items. */ struct ItemStruct { /** Constructor. * sets internal member variables. * ** @param uid unique identifier * @param status review status (optional) */ ItemStruct(const OFString &uid, const DVIFhierarchyStatus status = DVIF_objectIsNew) : UID(uid), Status(status), List() {} /// instance UID OFString UID; /// review status for the series DVIFhierarchyStatus Status; /// list of series within this study DVSeriesCache List; }; /** Constructor. */ DVStudyCache() : List(), Iterator() { Iterator = List.end(); } /** Destructor */ virtual ~DVStudyCache() { clear(); } /** reset all member variables to initial state * delete all list items. */ inline void clear() { Iterator = List.begin(); OFListIterator(ItemStruct *) last = List.end(); while (Iterator != last) { delete (*Iterator); Iterator = List.erase(Iterator); } List.clear(); Iterator = List.end(); } /** checks whether study cache is empty * ** @return OFTrue if cache is empty, OFFalse otherwise */ inline OFBool empty() const { return List.empty(); } /** gets number of cache entries * ** @return number of cache entries */ inline Uint32 getCount() const { return List.size(); } /** sets internal cursor to specified position in cache list * ** @param idx index position in cache list (starting with 0) * ** @return OFTrue if successful, OFFalse if 'idx' is invalid */ inline OFBool gotoItem(Uint32 idx) { OFBool result = OFFalse; Iterator = List.begin(); OFListIterator(ItemStruct *) last = List.end(); while (Iterator != last) { if (idx == 0) { result = OFTrue; break; } idx--; ++Iterator; } return result; } /** sets internal cursor to first position in cache list * ** @return OFTrue if successful, OFFalse if list is empty */ inline OFBool gotoFirst() { //OldIterator = Iterator; Iterator = List.begin(); return (Iterator != List.end()); } /** sets internal cursor to next position in cache list * ** @return OFTrue if successful, OFFalse if new position is invalid */ inline OFBool gotoNext() { OFListIterator(ItemStruct *) last = List.end(); if (Iterator != last) Iterator++; return (Iterator != last); } /** checks whether an item with the specified UID exists in the cache list * ** @param uid UID which should be checked * ** @return OFTrue if such an item exists, OFFalse otherwise */ inline OFBool isElem(const OFString &uid) { OFBool result = OFFalse; Iterator = List.begin(); OFListIterator(ItemStruct *) last = List.end(); while (Iterator != last) { const ItemStruct *item = (*Iterator); if (item != NULL) { if (item->UID == uid) { result= OFTrue; break; } } ++Iterator; } return result; } /** gets review status of the current (selected) sstudy * ** @return hierarchical status code if successful, 'isNew' otherwise */ inline DVIFhierarchyStatus getStatus() const { const ItemStruct *item = getItem(); return (item != NULL) ? item->Status : DVIF_objectIsNew; } /** gets reference to current (selected) study * ** @return pointer to ItemStruct if successful, NULL otherwise */ inline ItemStruct *getItem() const { OFListConstIterator(ItemStruct *) it = Iterator; return (it != List.end()) ? (*Iterator) : (ItemStruct *)NULL; } /** adds a new item to the cache list. * sets internal cursor to new position. * ** @param uid unique identifier * @param status review status (optional) */ inline void addItem(const OFString &uid, const DVIFhierarchyStatus status = DVIF_objectIsNew) { ItemStruct *item = new ItemStruct(uid, status); List.push_back(item); Iterator = --List.end(); // set to new position } /** updates hierarchical/review status for all list items. * ** @return resulting review status (summary of all items) */ inline void updateStatus() { OFListIterator(ItemStruct *) iter = List.begin(); OFListIterator(ItemStruct *) last = List.end(); while (iter != last) { ItemStruct *item = (*iter); if (item != NULL) item->Status = item->List.updateStatus(); ++iter; } } protected: /// list of studies OFList List; /// internal cursor to current (selected) list item OFListIterator(ItemStruct *) Iterator; }; #endif /* * * CVS/RCS Log: * $Log: dvcache.h,v $ * Revision 1.20 2010-10-14 13:16:35 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.19 2010-10-07 14:31:35 joergr * Removed leading underscore characters from preprocessor symbols (reserved). * * Revision 1.18 2009-09-07 12:51:40 joergr * Converted Windows line breaks to Unix format. * * Revision 1.17 2009-09-04 13:53:09 meichel * Minor const iterator related changes needed to compile with VC6 with HAVE_STL * * Revision 1.16 2005-12-08 16:03:30 meichel * Changed include path schema for all DCMTK header files * * Revision 1.15 2005/04/04 10:11:57 meichel * Module dcmpstat now uses the dcmqrdb API instead of imagectn for maintaining * the index database * * Revision 1.14 2001/06/01 15:50:11 meichel * Updated copyright header * * Revision 1.13 2000/10/16 11:39:10 joergr * Added method allowing to select an instance by instance UID and SOP class * UID (without series and study UID). Required for composite references in * DICOM SR. * * Revision 1.12 2000/06/30 09:08:39 joergr * Fixed bug in database cache routines (re. study status). * * Revision 1.11 2000/05/30 13:37:15 joergr * Renamed GrayscaleHardcopy to HardcopyGrayscale (which is the correct term * according to the DICOM standard). * * Revision 1.10 2000/03/08 16:28:47 meichel * Updated copyright header. * * Revision 1.9 1999/09/08 17:03:00 joergr * Added support for new instance types in database (grayscale hardcopy and * stored print). * * Revision 1.8 1999/08/17 10:32:54 joergr * Added Doc++ styled comments. * Corrected wrong return type for method 'getImageSize()'. * * Revision 1.7 1999/05/03 11:01:08 joergr * Minor code purifications to keep Sun CC 2.0.1 quiet. * * Revision 1.6 1999/04/29 15:25:36 joergr * Added PresentationLabel to index file. * * Revision 1.5 1999/04/27 11:20:49 joergr * Add remaining member variables to member initialization list to avoid * compiler warnings. * * Revision 1.4 1999/02/24 20:14:39 joergr * Added support for presentation state caching (e.g. pstate description). * Removed unused methods. * * Revision 1.3 1999/02/19 18:56:08 joergr * Added new methods to interate through Caches (getFirst/getNext) - needed * for delete routines in Interface class. * * Revision 1.2 1999/02/19 09:45:19 joergr * Changed some comments, corrected typos and formatting. * * Revision 1.1 1999/02/18 18:50:18 joergr * Re-implemented methods to access index file (delete methods are still * missing). * * */ dcmtk-3.6.0/dcmpstat/include/dcmtk/dcmpstat/dvpsvwl.h0000644000310500011400000000760311455601265022113 0ustar joergrdicom3/* * * Copyright (C) 1998-2010, 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: DVPSVOIWindow_PList * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:16:37 $ * CVS/RCS Revision: $Revision: 1.11 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DVPSVWL_H #define DVPSVWL_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcitem.h" class DVPSVOIWindow; /** the list of VOI Windows contained in an image attached to a presentation state. * This class manages the data structures comprising the VOI Windows * of one image attached to a presentation state. */ class DVPSVOIWindow_PList { public: /// default constructor DVPSVOIWindow_PList(); /// copy constructor DVPSVOIWindow_PList(const DVPSVOIWindow_PList& copy); /** clone method. * @return a pointer to a new DVPSVOIWindow_PList object containing * a deep copy of this object. */ DVPSVOIWindow_PList *clone() { return new DVPSVOIWindow_PList(*this); } /// destructor virtual ~DVPSVOIWindow_PList(); /** reads a list of VOI Windows from a DICOM dataset. * The DICOM elements of the VOI Window are copied * from the dataset to this object. * If this method returns an error code, the object is in undefined state afterwards. * @param dset the dataset from which the VOI Windows are to be read * @return EC_Normal if successful, an error code otherwise. */ OFCondition read(DcmItem &dset); /** reset the object to initial state. * After this call, the object is in the same state as after * creation with the default constructor. */ void clear(); /** get number of VOI Windows in this list. * @return the number of VOI Windows. */ size_t size() const { return list_.size(); } /** returns a pointer to the VOI Window with the given * index or NULL if it does not exist. * @param idx index, must be < size() * @return pointer to VOI Window or NULL */ DVPSVOIWindow *getVOIWindow(size_t idx); private: /// private undefined assignment operator DVPSVOIWindow_PList& operator=(const DVPSVOIWindow_PList&); /** the list maintained by this object */ OFList list_; }; #endif /* * $Log: dvpsvwl.h,v $ * Revision 1.11 2010-10-14 13:16:37 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.10 2010-10-07 14:31:36 joergr * Removed leading underscore characters from preprocessor symbols (reserved). * * Revision 1.9 2009-11-24 14:12:58 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.8 2009-09-30 10:42:38 uli * Make dcmpstat's include headers self-sufficient by including all * needed headers directly and stop using dctk.h * * Revision 1.7 2005-12-08 16:04:14 meichel * Changed include path schema for all DCMTK header files * * Revision 1.6 2003/06/04 10:18:06 meichel * Replaced private inheritance from template with aggregation * * Revision 1.5 2001/09/26 15:36:19 meichel * Adapted dcmpstat to class OFCondition * * Revision 1.4 2001/06/01 15:50:25 meichel * Updated copyright header * * Revision 1.3 2000/06/02 16:00:55 meichel * Adapted all dcmpstat classes to use OFConsole for log and error output * * Revision 1.2 2000/03/08 16:28:59 meichel * Updated copyright header. * * Revision 1.1 1998/12/22 17:57:10 meichel * Implemented Presentation State interface for overlays, * VOI LUTs, VOI windows, curves. Added test program that * allows to add curve data to DICOM images. * * */ dcmtk-3.6.0/dcmpstat/include/dcmtk/dcmpstat/dvpsgll.h0000644000310500011400000003312411455601264022055 0ustar joergrdicom3/* * * Copyright (C) 1998-2010, 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: DVPSGraphicLayer_PList * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:16:36 $ * CVS/RCS Revision: $Revision: 1.15 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DVPSGLL_H #define DVPSGLL_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcitem.h" class DVPSGraphicLayer; class DVPSOverlayCurveActivationLayer_PList; class DVPSGraphicAnnotation_PList; /** the list of graphic layers contained in a presentation state (internal use only). * This class manages the data structures comprising the complete * Graphic Layer Sequence in a Presentation State object. */ class DVPSGraphicLayer_PList { public: /// default constructor DVPSGraphicLayer_PList(); /// copy constructor DVPSGraphicLayer_PList(const DVPSGraphicLayer_PList& copy); /** clone method. * @return a pointer to a new DVPSGraphicLayer_PList object containing * a deep copy of this object. */ DVPSGraphicLayer_PList *clone() { return new DVPSGraphicLayer_PList(*this); } /// destructor virtual ~DVPSGraphicLayer_PList(); /** reads the Graphic Layer Sequence from a DICOM dataset. * The completeness of the sequence items (presence of all required elements, * value multiplicity) is checked. * If this method returns an error code, the object is in undefined state afterwards. * @param dset the DICOM dataset from which the overlays are read * @return EC_Normal if successful, an error code otherwise. */ OFCondition read(DcmItem &dset); /** writes the Graphic Layer Sequence managed by this object to a DICOM dataset. * Copies of the DICOM elements managed by this object are inserted into * the DICOM dataset. * @param dset the DICOM dataset to which the sequence is written * @return EC_Normal if successful, an error code otherwise. */ OFCondition write(DcmItem &dset); /** reset the object to initial state. * After this call, the object is in the same state as after * creation with the default constructor. */ void clear(); /** adds a new graphic layer to the list. The recommended display value * of the new graphic layer remains undefined and can be set later. * @param gLayer name of the graphic layer. Must be unique within the sequence, * i.e. no other graphic layer with the same name may exist, otherwise an error * code is returned. * @param gLayerOrder graphic layer order of the new layer. * @param gLayerDescription (optional) description of the new layer. Default: description absent. * @return EC_Normal if successful, an error code otherwise. */ OFCondition addGraphicLayer(const char *gLayer, const Sint32 gLayerOrder, const char *gLayerDescription=NULL); /** creates a new graphic layer with the given * name and optional description. * The new name must be unique, otherwise an error code is returned. * The toFrontGraphicLayer() method is implicitly called for the new layer. * @param gLayer the name of the graphic layer. Must be a valid DICOM Code String. * @param gLayerDescription the optional description of the graphic layer. * Must be a valid DICOM Long String. * @return EC_Normal upon success, an error code otherwise */ OFCondition addGraphicLayer( const char *gLayer, const char *gLayerDescription=NULL); /** get number of graphic layer objects in this list. * @return the number of objects. */ size_t size() const { return list_.size(); } /** sorts the graphic layers according to * the graphic layer order. Layers with lower order have lower * indices after sorting which means that the layers can be * drawn to the screen in ascending index order. * Calling this routine may result in a re-numbering * of the graphic layer orders in a way that does not affect * their sequence. * @param lowestLayer is the lowest number assigned to * a layer during the renumbering. */ void sortGraphicLayers(Sint32 lowestLayer=1); /** gets the unique name of the graphic * layer with the given index. If no layer for the given * index exists, NULL is returned. * @param idx index of the graphic layer, must be < getNumberOfGraphicLayers() * @return name of the graphic layer */ const char *getGraphicLayerName(size_t idx); /** gets the index of the graphic * layer with the given unique name. If no matching layer * is found, DVPS_IDX_NONE is returned. * @param name name of the graphic layer * @return index of the graphic layer */ size_t getGraphicLayerIndex(const char *name); /** gets a description string for the graphic * layer with the given index. If no layer for the given * index exists, or if the description is empty, NULL is returned. * @param idx index of the graphic layer, must be < getNumberOfGraphicLayers() * @return description of the graphic layer */ const char *getGraphicLayerDescription(size_t idx); /** checks whether a recommended display value (grayscale, color or both) for the given graphic layer exists. * @param idx index of the graphic layer, must be < getNumberOfGraphicLayers() * @return OFTrue if a recommended display value exists */ OFBool haveGraphicLayerRecommendedDisplayValue(size_t idx); /** gets the recommended grayscale display value for the given graphic layer. * If the graphic layer contains an RGB display value but no grayscale * display value, the RGB value is implicitly converted to grayscale. * @param idx index of the graphic layer, must be < getNumberOfGraphicLayers() * @param gray the recommended display value as an unsigned 16-bit P-value * is returned in this parameter. * @return EC_Normal upon success, an error code otherwise */ OFCondition getGraphicLayerRecommendedDisplayValueGray(size_t idx, Uint16& gray); /** gets the recommended RGB display value for the given graphic layer. * If the graphic layer contains a grayscale display value but no RGB * display value, the grayscale value is implicitly converted to RGB. * @param idx index of the graphic layer, must be < getNumberOfGraphicLayers() * @param r returns the R component of the recommended display value as unsigned 16-bit P-value * @param g returns the G component of the recommended display value as unsigned 16-bit P-value * @param b returns the B component of the recommended display value as unsigned 16-bit P-value * @return EC_Normal upon success, an error code otherwise */ OFCondition getGraphicLayerRecommendedDisplayValueRGB(size_t idx, Uint16& r, Uint16& g, Uint16& b); /** set graphic layer recommended grayscale display value for the given graphic layer. * This method does not affect (set or modify) the recommended RGB display value * which should be set separately. * @param idx index of the graphic layer, must be < getNumberOfGraphicLayers() * @param gray the recommended display value as an unsigned 16-bit P-value * @return EC_Normal upon success, an error code otherwise */ OFCondition setGraphicLayerRecommendedDisplayValueGray(size_t idx, Uint16 gray); /** set graphic layer recommended RGB display value for the given graphic layer. * This method does not affect (set or modify) the recommended grayscale display value * which should be set separately. * @param idx index of the graphic layer, must be < getNumberOfGraphicLayers() * @param r the R component of the recommended display value as unsigned 16-bit P-value * @param g the G component of the recommended display value as unsigned 16-bit P-value * @param b the B component of the recommended display value as unsigned 16-bit P-value * @return EC_Normal upon success, an error code otherwise */ OFCondition setGraphicLayerRecommendedDisplayValueRGB(size_t idx, Uint16 r, Uint16 g, Uint16 b); /** removes recommended display values for the given graphic layer. * @param rgb if true, the RGB recommended display value is removed * @param monochrome if true the monochrome recommended display value is removed */ void removeGraphicLayerRecommendedDisplayValue(size_t idx, OFBool rgb, OFBool monochrome); /** assigns a new unique name to the given graphic layer. * The new name must be unique, otherwise an error code is returned. * @param idx index of the graphic layer, must be < getNumberOfGraphicLayers() * @param name the new name of the graphic layer. Must be a valid DICOM Code String. * @return EC_Normal upon success, an error code otherwise */ OFCondition setGraphicLayerName(size_t idx, const char *name); /** sets a new description to the given graphic layer. * @param idx index of the graphic layer, must be < getNumberOfGraphicLayers() * @param descr description of the graphic layer. Must be a valid DICOM Long String. * @return EC_Normal upon success, an error code otherwise */ OFCondition setGraphicLayerDescription(size_t idx, const char *descr); /** makes a graphic layer the highest layer for display. * This method assigns a graphic layer order higher than all * existing graphic layer orders to the given graphic layer, * sorts and renumbers the list of graphic layers. Upon success, * the given graphic layer is guaranteed to have the new index * (getNumberOfGraphicLayers()-1). * @param idx index of the graphic layer, must be < getNumberOfGraphicLayers() * @return EC_Normal upon success, an error code otherwise */ OFCondition toFrontGraphicLayer(size_t idx); /** makes a graphic layer the lowest layer for display. * This method assigns a graphic layer order lower than all * existing graphic layer orders to the given graphic layer, * sorts and renumbers the list of graphic layers. Upon success, * the given graphic layer is guaranteed to have the new index 0. * @param idx index of the graphic layer, must be < getNumberOfGraphicLayers() * @return EC_Normal upon success, an error code otherwise */ OFCondition toBackGraphicLayer(size_t idx); /** exchanges the layer order of the two graphic layers with * the given indices. This method does not sort or renumber * the graphic layers. * @param idx1 index of the first graphic layer, must be < getNumberOfGraphicLayers() * @param idx2 index of the second graphic layer, must be < getNumberOfGraphicLayers() * @return EC_Normal upon success, an error code otherwise */ OFCondition exchangeGraphicLayers(size_t idx1, size_t idx2); /** removes and deletes a graphic layer. * @param idx index of the graphic layer, must be < getNumberOfGraphicLayers() * @return EC_Normal upon success, an error code otherwise */ OFCondition removeGraphicLayer(size_t idx); /** removes and deletes all graphic layers for which * no matching text, graphic, curve or overlay object exists. * Called before writing a presentation state. */ void cleanupLayers( DVPSOverlayCurveActivationLayer_PList& activations, DVPSGraphicAnnotation_PList& annotations); private: /// private undefined assignment operator DVPSGraphicLayer_PList& operator=(const DVPSGraphicLayer_PList&); /** gets the the graphic layer with the given index. If no layer for the given * index exists, NULL is returned. * @param idx index of the graphic layer, must be < getNumberOfGraphicLayers() * @return pointer to the graphic layer */ DVPSGraphicLayer *getGraphicLayer(size_t idx); /** the list maintained by this object */ OFList list_; }; #endif /* * $Log: dvpsgll.h,v $ * Revision 1.15 2010-10-14 13:16:36 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.14 2010-10-07 14:31:35 joergr * Removed leading underscore characters from preprocessor symbols (reserved). * * Revision 1.13 2009-11-24 14:12:57 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.12 2009-09-30 10:42:38 uli * Make dcmpstat's include headers self-sufficient by including all * needed headers directly and stop using dctk.h * * Revision 1.11 2005-12-08 16:03:46 meichel * Changed include path schema for all DCMTK header files * * Revision 1.10 2003/06/04 10:18:06 meichel * Replaced private inheritance from template with aggregation * * Revision 1.9 2001/09/26 15:36:11 meichel * Adapted dcmpstat to class OFCondition * * Revision 1.8 2001/06/01 15:50:16 meichel * Updated copyright header * * Revision 1.7 2000/06/02 16:00:46 meichel * Adapted all dcmpstat classes to use OFConsole for log and error output * * Revision 1.6 2000/03/08 16:28:52 meichel * Updated copyright header. * * Revision 1.5 1999/07/30 13:34:46 meichel * Added new classes managing Stored Print objects * * Revision 1.4 1999/07/22 16:39:08 meichel * Adapted dcmpstat data structures and API to supplement 33 letter ballot text. * * Revision 1.3 1999/02/09 15:58:55 meichel * Implemented bitmap shutter activation amd method for * exchanging graphic layers. * * Revision 1.2 1998/12/14 16:10:29 meichel * Implemented Presentation State interface for graphic layers, * text and graphic annotations, presentation LUTs. * * Revision 1.1 1998/11/27 14:50:28 meichel * Initial Release. * * */ dcmtk-3.6.0/dcmpstat/include/dcmtk/dcmpstat/dvpsprt.h0000644000310500011400000003256111455601264022110 0ustar joergrdicom3/* * * Copyright (C) 2000-2010, 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 * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:16:36 $ * CVS/RCS Revision: $Revision: 1.12 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #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 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 /* * $Log: dvpsprt.h,v $ * Revision 1.12 2010-10-14 13:16:36 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.11 2009-11-24 14:12:57 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.10 2009-09-30 10:42:38 uli * Make dcmpstat's include headers self-sufficient by including all * needed headers directly and stop using dctk.h * * Revision 1.9 2005-12-08 16:03:58 meichel * Changed include path schema for all DCMTK header files * * Revision 1.8 2004/02/04 15:49:09 joergr * Removed acknowledgements with e-mail addresses from CVS log. Removed leading * underscore characters from preprocessor symbols (reserved symbols). * * Revision 1.7 2003/09/05 10:38:32 meichel * Print SCP now supports TLS connections and the Verification Service Class. * * Revision 1.6 2002/04/16 14:02:03 joergr * Added configurable support for C++ ANSI standard includes (e.g. streams). * * Revision 1.5 2001/10/12 13:46:52 meichel * Adapted dcmpstat to OFCondition based dcmnet module (supports strict mode). * * Revision 1.4 2001/06/01 15:50:20 meichel * Updated copyright header * * Revision 1.3 2000/06/07 13:17:45 meichel * added binary and textual log facilities to Print SCP. * * Revision 1.2 2000/06/02 16:00:50 meichel * Adapted all dcmpstat classes to use OFConsole for log and error output * * Revision 1.1 2000/05/31 12:56:36 meichel * Added initial Print SCP support * */ dcmtk-3.6.0/dcmpstat/include/dcmtk/dcmpstat/dvpscul.h0000644000310500011400000001122111455601264022054 0ustar joergrdicom3/* * * Copyright (C) 1998-2010, 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: DVPSCurve_PList * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:16:36 $ * CVS/RCS Revision: $Revision: 1.11 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DVPSCUL_H #define DVPSCUL_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcitem.h" class DVPSCurve; /** the list of curves contained in image which is attached to a presentation state. * This class manages the data structures comprising the list of curves * (all instances of the Curve Module repeating elements) * contained in an image object. */ class DVPSCurve_PList { public: /// default constructor DVPSCurve_PList(); /// copy constructor DVPSCurve_PList(const DVPSCurve_PList& copy); /** clone method. * @return a pointer to a new DVPSCurve_PList object containing * a deep copy of this object. */ DVPSCurve_PList *clone() { return new DVPSCurve_PList(*this); } /// destructor virtual ~DVPSCurve_PList(); /** reads all curve groups which can be displayed in a presentation state * from a DICOM dataset. * This method checks which curves are contained in the DICOM dataset. * All curves complying with the presentation state requirements * (i.e. 2-dimensional POLY or ROI curves without curve descriptor) are copied * into the "list of curves" structure managed by this object. * The completeness of the curves (presence of all required elements, * value multiplicity) is checked. * If this method returns an error code, the object is in undefined state afterwards. * @param dset the DICOM dataset from which the curves are read * @return EC_Normal if successful, an error code otherwise. */ OFCondition read(DcmItem &dset); /** reset the object to initial state. * After this call, the object is in the same state as after * creation with the default constructor. */ void clear(); /** check presence of curve group * @param group curve repeating group to be checked * @return OFTrue if the specified curve group is present in the * list of curves managed by this object. */ OFBool haveCurveGroup(Uint16 group); /** get curve by group * @param group curve repeating group to be checked * @return a pointer to the matching DVPSCurve object if found, * NULL otherwise. */ DVPSCurve *getCurveGroup(Uint16 group); /** get curve by index * @param idx index, must be < size() * @return a pointer to the matching DVPSCurve object if it exists, * NULL otherwise. */ DVPSCurve *getCurve(size_t idx); /** get number of curves in this list. * @return the number of curves. */ size_t size() const { return list_.size(); } private: /// private undefined assignment operator DVPSCurve_PList& operator=(const DVPSCurve_PList&); /** the list maintained by this object */ OFList list_; }; #endif /* * $Log: dvpscul.h,v $ * Revision 1.11 2010-10-14 13:16:36 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.10 2010-10-07 14:31:35 joergr * Removed leading underscore characters from preprocessor symbols (reserved). * * Revision 1.9 2009-11-24 14:12:57 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.8 2009-09-30 10:42:38 uli * Make dcmpstat's include headers self-sufficient by including all * needed headers directly and stop using dctk.h * * Revision 1.7 2005-12-08 16:03:38 meichel * Changed include path schema for all DCMTK header files * * Revision 1.6 2003/06/04 10:18:06 meichel * Replaced private inheritance from template with aggregation * * Revision 1.5 2001/09/26 15:36:09 meichel * Adapted dcmpstat to class OFCondition * * Revision 1.4 2001/06/01 15:50:14 meichel * Updated copyright header * * Revision 1.3 2000/06/02 16:00:44 meichel * Adapted all dcmpstat classes to use OFConsole for log and error output * * Revision 1.2 2000/03/08 16:28:50 meichel * Updated copyright header. * * Revision 1.1 1998/12/22 17:57:05 meichel * Implemented Presentation State interface for overlays, * VOI LUTs, VOI windows, curves. Added test program that * allows to add curve data to DICOM images. * * */ dcmtk-3.6.0/dcmpstat/include/dcmtk/dcmpstat/dvpsvll.h0000644000310500011400000000767711455601265022113 0ustar joergrdicom3/* * * Copyright (C) 1998-2010, 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: DVPSVOILUT_PList * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:16:37 $ * CVS/RCS Revision: $Revision: 1.11 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DVPSVLL_H #define DVPSVLL_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcitem.h" class DVPSVOILUT; /** the list of VOI LUTs contained in an image attached to a presentation state. * This class manages the data structures comprising the VOI LUT Sequence * of one image attached to a presentation state. */ class DVPSVOILUT_PList { public: /// default constructor DVPSVOILUT_PList(); /// copy constructor DVPSVOILUT_PList(const DVPSVOILUT_PList& copy); /** clone method. * @return a pointer to a new DVPSVOILUT_PList object containing * a deep copy of this object. */ DVPSVOILUT_PList *clone() { return new DVPSVOILUT_PList(*this); } /// destructor virtual ~DVPSVOILUT_PList(); /** reads a list of VOI LUTs from a DICOM dataset. * The DICOM elements of the VOI LUT Sequence are copied * from the dataset to this object. * The completeness of the item (presence of all required elements, * value multiplicity) is checked. * If this method returns an error code, the object is in undefined state afterwards. * @param dset the dataset from which the VOI LUT Sequence is to be read * @return EC_Normal if successful, an error code otherwise. */ OFCondition read(DcmItem &dset); /** reset the object to initial state. * After this call, the object is in the same state as after * creation with the default constructor. */ void clear(); /** get number of VOI LUTs in this list. * @return the number of VOI LUTs. */ size_t size() const { return list_.size(); } /** returns a pointer to the VOI LUT with the given * index or NULL if it does not exist. * @param idx index, must be < size() * @return pointer to VOI LUT or NULL */ DVPSVOILUT *getVOILUT(size_t idx); private: /// private undefined assignment operator DVPSVOILUT_PList& operator=(const DVPSVOILUT_PList&); /** the list maintained by this object */ OFList list_; }; #endif /* * $Log: dvpsvll.h,v $ * Revision 1.11 2010-10-14 13:16:37 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.10 2010-10-07 14:31:36 joergr * Removed leading underscore characters from preprocessor symbols (reserved). * * Revision 1.9 2009-11-24 14:12:58 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.8 2009-09-30 10:42:38 uli * Make dcmpstat's include headers self-sufficient by including all * needed headers directly and stop using dctk.h * * Revision 1.7 2005-12-08 16:04:12 meichel * Changed include path schema for all DCMTK header files * * Revision 1.6 2003/06/04 10:18:06 meichel * Replaced private inheritance from template with aggregation * * Revision 1.5 2001/09/26 15:36:18 meichel * Adapted dcmpstat to class OFCondition * * Revision 1.4 2001/06/01 15:50:25 meichel * Updated copyright header * * Revision 1.3 2000/06/02 16:00:54 meichel * Adapted all dcmpstat classes to use OFConsole for log and error output * * Revision 1.2 2000/03/08 16:28:59 meichel * Updated copyright header. * * Revision 1.1 1998/12/22 17:57:09 meichel * Implemented Presentation State interface for overlays, * VOI LUTs, VOI windows, curves. Added test program that * allows to add curve data to DICOM images. * * */ dcmtk-3.6.0/dcmpstat/include/dcmtk/dcmpstat/dviface.h0000644000310500011400000031570611455601263022013 0ustar joergrdicom3/* * * Copyright (C) 1998-2010, 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, Joerg Riesmeier * * Purpose: * classes: DVInterface * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:16:35 $ * CVS/RCS Revision: $Revision: 1.95 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DVIFACE_H #define DVIFACE_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/ofstd/ofstream.h" #include "dcmtk/dcmpstat/dvpscf.h" /* for class DVConfiguration */ #include "dcmtk/dcmpstat/dvpstat.h" /* for class DVPresentationState */ #include "dcmtk/dcmqrdb/dcmqridx.h" /* for struct IdxRecord */ #include "dcmtk/ofstd/ofstring.h" /* for class OFString */ #include "dcmtk/dcmpstat/dvcache.h" /* for index file caching */ class DicomImage; class DiDisplayFunction; class DVPSStoredPrint; class DVPSPrintMessageHandler; class DSRDocument; class DVSignatureHandler; /** Interface class for the Softcopy Presentation State viewer. * This class manages the database facilities, allows to start and stop * network transactions and gives access to images and presentation states. */ class DVInterface: public DVConfiguration { public: /** constructor. * @param config_file filename (path) of the config file to be used * by the interface object. The caller should make sure that the config file * really exists because the constructor cannot return an error status. * If a non-existing filename (or NULL) is passed, an empty configuration file * is assumed. * @param useLog (optional) flag specifying whether a general log file should be used * (config entry GENERAL\APPLICATION\LOGFILE). */ DVInterface(const char *config_file = NULL, OFBool useLog = OFFalse); /** destructor. */ virtual ~DVInterface(); /* load images, presentation states and structured reports */ /** loads an image which is contained in the database * and creates a default presentation state for the image. * This method acquires a database lock which must be explicitly freed by the user. * @param studyUID study instance UID of the image * @param seriesUID series instance UID of the image * @param instanceUID SOP instance UID of the image * @param changeStatus if true the image file is marked 'reviewed' (not new) * @return EC_Normal upon success, an error code otherwise. */ OFCondition loadImage(const char *studyUID, const char *seriesUID, const char *instanceUID, OFBool changeStatus = OFFalse); /** loads an image (which need not be contained in the database) * and creates a default presentation state for the image. * This method does not acquire a database lock. * @param filename path and filename of the image to be loaded * @return EC_Normal upon success, an error code otherwise. */ OFCondition loadImage(const char *filename); /** loads an image which referenced by the current presentation * state and needs to be contained in the database. * This method acquires a database lock which must be explicitly freed by the user. * @param idx index of the image to be loaded (< getNumberOfImageReferences()) * @param changeStatus if true the image file is marked 'reviewed' (not new) * @return EC_Normal upon success, an error code otherwise. */ OFCondition loadReferencedImage(size_t idx, OFBool changeStatus = OFFalse); /** loads a presentation state which is contained in the database. * The first image referenced in presentation state is also looked up in the * database, loaded, and attached to the presentation state. * This method acquires a database lock which must be explicitly freed by the user. * @param studyUID study instance UID of the presentation state * @param seriesUID series instance UID of the presentation state * @param instanceUID SOP instance UID of the presentation state * @param changeStatus if true the pstate and (first) image file is marked 'reviewed' (not new) * @return EC_Normal upon success, an error code otherwise. */ OFCondition loadPState(const char *studyUID, const char *seriesUID, const char *instanceUID, OFBool changeStatus = OFFalse); /** loads a presentation state and an image (which need not be contained in the database) * and attaches the image to the presentation state (if specified, otherwise the current * image will be used). * This method does not acquire a database lock. * @param pstName path and filename of the presentation state to be loaded * @param imgName path and filename of the image to be loaded * @return EC_Normal upon success, an error code otherwise. */ OFCondition loadPState(const char *pstName, const char *imgName = NULL); /** loads a structured report which is contained in the database. * This method acquires a database lock which must be explicitly freed by the user. * @param studyUID study instance UID of the structured report * @param seriesUID series instance UID of the structured report * @param instanceUID SOP instance UID of the structured report * @param changeStatus if true the structured report file is marked 'reviewed' (not new) * @return EC_Normal upon success, an error code otherwise. */ OFCondition loadStructuredReport(const char *studyUID, const char *seriesUID, const char *instanceUID, OFBool changeStatus = OFFalse); /** loads a structured report (which need not be contained in the database). * This method does not acquire a database lock. * @param filename path and filename of the structured report to be loaded * @return EC_Normal upon success, an error code otherwise. */ OFCondition loadStructuredReport(const char *filename); /** loads a structured reporting "template". * This "template" is just a DICOM Structured Reporting file which resides in a * special sub-folder and is referenced by the configuration file. This meachanism * should facilitate the creation of new reports since one does not have to start * with a completely empty report. * Please note that the current structured report is replaced by the specified * "template". New study/series/instance UIDs are generated automatically for the * new report. * This method does not acquire a database lock. * @param reportID report identifier, as returned by getReportID(). * @return EC_Normal upon success, an error code otherwise. */ OFCondition loadSRTemplate(const char *reportID); /** saves the current presentation state in the same directory * in which the database index file resides. The filename is generated automatically. * A new SOP Instance UID is assigned whenever a presentation state is saved. * After successfully storing the presentation state, the database index is updated * to include the new object. * This method releases under any circumstances the database lock if it exists. * @param replaceSOPInstanceUID flag indicating whether the * SOP Instance UID should be replaced by a new UID. * If true, a new UID is always generated. If false, a new * UID is generated only if no UID has been assigned before. * @return EC_Normal upon success, an error code otherwise. */ OFCondition savePState(OFBool replaceSOPInstanceUID); /** saves the current presentation state in a file with the given path and filename. * A new SOP Instance UID is assigned whenever a presentation state is saved. * This method does not acquire a database lock and does not register * the saved presentation state in the database. * @param filename path and filename under which the presentation state is to be saved * @param replaceSOPInstanceUID flag indicating whether the * SOP Instance UID should be replaced by a new UID. * If true, a new UID is always generated. If false, a new * UID is generated only if no UID has been assigned before. * @param explicitVR selects the transfer syntax to be written. True (the default) selects * Explicit VR Little Endian, False selects Implicit VR Little Endian. * @return EC_Normal upon success, an error code otherwise. */ OFCondition savePState(const char *filename, OFBool replaceSOPInstanceUID, OFBool explicitVR=OFTrue); /** saves the DICOM image that is currently attached to the presentation state * in a file with the given path and filename. * This method does not acquire a database lock and does not register * the saved presentation state in the database. * @param filename path and filename under which the image is to be saved * @param explicitVR selects the transfer syntax to be written. True (the default) selects * Explicit VR Little Endian, False selects Implicit VR Little Endian. * @return EC_Normal upon success, an error code otherwise. */ OFCondition saveCurrentImage(const char *filename, OFBool explicitVR=OFTrue); /** saves the current structured report in the same directory in which the database index * file resides. The filename is generated automatically. A new SOP Instance UID is not * assigned automatically unless the method getStructuredReport().createRevisedVersion() * is called (see documentation in file dcmsr/dsrdoc.h). This is not required for the * first version of a document (i.e. directly after program start or calling the method * getStructuredReport().createNewDocument()). * After successfully storing the structured report, the database index is updated * to include the new object. * This method releases under any circumstances the database lock if it exists. * @return EC_Normal upon success, an error code otherwise. */ OFCondition saveStructuredReport(); /** saves the current structured report in a file with the given path and filename. * A new SOP Instance UID is not assigned automatically unless the method * getStructuredReport().createRevisedVersion() is called (see documentation in file * dcmsr/dsrdoc.h). This is not required for the first version of a document (i.e. * directly after program start or calling the method getStructuredReport().createNewDocument()). * This method does not acquire a database lock and does not register the saved structured * report in the database. * @param filename path and filename under which the structured report is to be saved * @param explicitVR selects the transfer syntax to be written. True (the default) selects * Explicit VR Little Endian, False selects Implicit VR Little Endian. * @return EC_Normal upon success, an error code otherwise. */ OFCondition saveStructuredReport(const char *filename, OFBool explicitVR=OFTrue); /** adds an image which is contained in the database * to the list of referenced images of the current presentation state. * This method acquires a database lock which must be explicitly freed by the user. * @param studyUID study instance UID of the image * @param seriesUID series instance UID of the image * @param instanceUID SOP instance UID of the image * @return EC_Normal upon success, an error code otherwise. */ OFCondition addImageReferenceToPState(const char *studyUID, const char *seriesUID, const char *instanceUID); /** gets the number of image references contained in the current presentation state. * @return number of image references, 0 if an error occurred. */ size_t getNumberOfImageReferences(); /** returns a reference to the current presentation state. * This reference will become invalid when the DVInterface object is deleted, * a different image or presentation state is loaded * (using loadPState or loadImage) or when resetPresentationState() is called. * @return reference to the current presentation state */ DVPresentationState& getCurrentPState() { return *pState; } /** returns a reference to the current structured report. * This reference will become invalid when the DVInterface object is deleted or * a different structured report is loaded (using loadStructuredReport). * @return reference to the current structured report */ DSRDocument& getCurrentReport() { return *pReport; } /** returns a reference to the print handler. * This reference remains valid as long as the DVInterface object exists. * @return reference to the current print handler */ DVPSStoredPrint& getPrintHandler() { return *pPrint; } /** resets the presentation state object to the status it had immediately after the * last successful operation of "loadImage" or "loadPState". A state can also explicitly * specified as such a "reset state" by using the method saveCurrentPStateForReset(). * Attention: The last reference returned by getCurrentPState() becomes invalid * when this method is called. * @return EC_Normal upon success, an error code otherwise. */ OFCondition resetPresentationState(); /** saves the current state of the presentation state object to be used for * resetPresentationState(). This is e.g. useful after registration of additional images * directly after a new images has been loaded. * @return EC_Normal upon success, an error code otherwise. */ OFCondition saveCurrentPStateForReset(); /** removes any shared or exclusive lock on the database. * This method should be called when a database transaction * (i.e. reading all studies, series, instances etc.) is finished. * As long as a lock exists on the database, no other application * (i.e. the network receiver) can add new images to the database. * This method also clears the index cache. * @return EC_Normal upon success, an error code otherwise. */ OFCondition releaseDatabase(); /** searches in the database for a DICOM instance with the given * study, series and instance UIDs and returns its pathname if found. * If the given instance is not found in the database, NULL is returned. * This method acquires a database lock which must be explicitly freed by the user. * @param studyUID the DICOM study instance UID * @param seriesUID the DICOM series instance UID * @param instanceUID the DICOM SOP instance UID * @return filename (path) if found, NULL otherwise */ const char *getFilename(const char *studyUID, const char *seriesUID, const char *instanceUID); /** returns the number of studies currently contained in the database. * This method acquires a database lock which must be explicitly freed by the user. * The number reported (returned) by this method remains valid as long * as the database lock remains active and no function modifying the database is called. * Functions that modify the database are: Storing new presentation states, * deleting data, modifying the 'reviewed' status flag of IODs. * @return number of studies in the database. */ Uint32 getNumberOfStudies(); /** selects the study with the given index in the database. * This method acquires a database lock which must be explicitly freed by the user. * The selection remains valid until the database lock is removed or the database * is modified (see comments for getNumberOfStudies). * Implicitly the first series and first instance within this study is selected, too. * @param idx index to be selected, must be < getNumberOfStudies() * @return EC_Normal upon success, an error code otherwise. */ OFCondition selectStudy(Uint32 idx); /** selects the study with the given UID in the database. * This method acquires a database lock which must be explicitly freed by the user. * The selection remains valid until the database lock is removed or the database * is modified (see comments for getNumberOfStudies). * Implicitly the first series and first instance within this study is selected, too. * @param studyUID the DICOM study instance UID * @return EC_Normal upon success, an error code otherwise. */ OFCondition selectStudy(const char *studyUID); /** returns the review status of the currently selected study. * May be called only if a valid study selection exists - see selectStudy(). * This method acquires a database lock which must be explicitly freed by the user. * Implicitly the first instance within this series is selected, too. * @return study review status */ DVIFhierarchyStatus getStudyStatus() ; /** returns the Study Instance UID of the currently selected study. * May be called only if a valid study selection exists - see selectStudy(). * This method acquires a database lock which must be explicitly freed by the user. * @return Study Instance UID or NULL if absent or not selected. */ const char *getStudyUID(); /** returns the Study Description of the currently selected study. * May be called only if a valid study selection exists - see selectStudy(). * This method acquires a database lock which must be explicitly freed by the user. * @return Study Description or NULL if absent or not selected. */ const char *getStudyDescription(); /** returns the Study Date of the currently selected study. * May be called only if a valid study selection exists - see selectStudy(). * This method acquires a database lock which must be explicitly freed by the user. * @return Study Date or NULL if absent or not selected. */ const char *getStudyDate(); /** returns the Study Time of the currently selected study. * May be called only if a valid study selection exists - see selectStudy(). * This method acquires a database lock which must be explicitly freed by the user. * @return Study Time or NULL if absent or not selected. */ const char *getStudyTime(); /** returns the Referring Physicians Name of the currently selected study. * May be called only if a valid study selection exists - see selectStudy(). * This method acquires a database lock which must be explicitly freed by the user. * @return Referring Physicians Name or NULL if absent or not selected. */ const char *getReferringPhysiciansName(); /** returns the Accession Number of the currently selected study. * May be called only if a valid study selection exists - see selectStudy(). * This method acquires a database lock which must be explicitly freed by the user. * @return Accession Number or NULL if absent or not selected. */ const char *getAccessionNumber(); /** returns the Name Of Physicians Reading Study of the currently selected study. * May be called only if a valid study selection exists - see selectStudy(). * This method acquires a database lock which must be explicitly freed by the user. * @return Name Of Physicians Reading Study or NULL if absent or not selected. */ const char *getNameOfPhysiciansReadingStudy(); /** returns the Patient Name of the currently selected study. * May be called only if a valid study selection exists - see selectStudy(). * Note: Since the database uses the Study Root model, patient data appears * on the study level. * This method acquires a database lock which must be explicitly freed by the user. * @return Patient Name or NULL if absent or not selected. */ const char *getPatientName(); /** returns the Patient ID of the currently selected study. * May be called only if a valid study selection exists - see selectStudy(). * Note: Since the database uses the Study Root model, patient data appears * on the study level. * This method acquires a database lock which must be explicitly freed by the user. * @return Patient ID or NULL if absent or not selected. */ const char *getPatientID(); /** returns the Patient Birth Date of the currently selected study. * May be called only if a valid study selection exists - see selectStudy(). * Note: Since the database uses the Study Root model, patient data appears * on the study level. * This method acquires a database lock which must be explicitly freed by the user. * @return Patient Birth Date or NULL if absent or not selected. */ const char *getPatientBirthDate(); /** returns the Patient Sex of the currently selected study. * May be called only if a valid study selection exists - see selectStudy(). * Note: Since the database uses the Study Root model, patient data appears * on the study level. * This method acquires a database lock which must be explicitly freed by the user. * @return Patient Sex or NULL if absent or not selected. */ const char *getPatientSex(); /** returns the Patient Birth Time of the currently selected study. * May be called only if a valid study selection exists - see selectStudy(). * Note: Since the database uses the Study Root model, patient data appears * on the study level. * This method acquires a database lock which must be explicitly freed by the user. * @return Patient Birth Time or NULL if absent or not selected. */ const char *getPatientBirthTime(); /** returns the Other Patient Names of the currently selected study. * May be called only if a valid study selection exists - see selectStudy(). * Note: Since the database uses the Study Root model, patient data appears * on the study level. * This method acquires a database lock which must be explicitly freed by the user. * @return Other Patient Names or NULL if absent or not selected. */ const char *getOtherPatientNames(); /** returns the Other Patient ID of the currently selected study. * May be called only if a valid study selection exists - see selectStudy(). * Note: Since the database uses the Study Root model, patient data appears * on the study level. * This method acquires a database lock which must be explicitly freed by the user. * @return Other Patient ID or NULL if absent or not selected. */ const char *getOtherPatientID(); /** returns the Patient Ethnic Group of the currently selected study. * May be called only if a valid study selection exists - see selectStudy(). * Note: Since the database uses the Study Root model, patient data appears * on the study level. * This method acquires a database lock which must be explicitly freed by the user. * @return Patient Ethnic Group or NULL if absent or not selected. */ const char *getEthnicGroup(); /** returns the number of series within the currently selected study. * May be called only if a valid study selection exists - see selectStudy(). * This method acquires a database lock which must be explicitly freed by the user. * See the comments for getNumberOfStudies() about the validity period * of the returned number. * @return number of series in the current study. */ Uint32 getNumberOfSeries(); /** selects the series with the given index within the currently selected study. * This method acquires a database lock which must be explicitly freed by the user. * The selection remains valid until the database lock is removed or the database * is modified (see comments for getNumberOfStudies). * @param idx index to be selected, must be < getNumberOfSeries() * @return EC_Normal upon success, an error code otherwise. */ OFCondition selectSeries(Uint32 idx); /** selects the series with the given UID within the currently selected study. * This method acquires a database lock which must be explicitly freed by the user. * The selection remains valid until the database lock is removed or the database * is modified (see comments for getNumberOfStudies). * @param seriesUID series instance UID of the image * @return EC_Normal upon success, an error code otherwise. */ OFCondition selectSeries(const char *seriesUID); /** returns the Series Instance UID of the currently selected series. * May be called only if a valid series selection exists - see selectSeries(). * This method acquires a database lock which must be explicitly freed by the user. * @return Series Instance UID or NULL if absent or not selected. */ const char *getSeriesUID(); /** returns the review status of the currently selected series. * May be called only if a valid series selection exists - see selectSeries(). * This method acquires a database lock which must be explicitly freed by the user. * @return series review status */ DVIFhierarchyStatus getSeriesStatus(); /** returns the type of all instances within the currently selected series. * DICOM series always contain a single modality only, if not the modality of * the first examined instance (which is no image) is used (e.g. PresentationState). * May be called only if a valid series selection exists - see selectSeries(). * This method acquires a database lock which must be explicitly freed by the user. * @return instance type */ DVPSInstanceType getSeriesType(); /** returns the type of the currently selected instance. * May be called only if a valid instance selection exists - see selectInstance(). * This method acquires a database lock which must be explicitly freed by the user. * @return instance type */ DVPSInstanceType getInstanceType(); /** returns the Series Number of the currently selected series. * May be called only if a valid series selection exists - see selectSeries(). * This method acquires a database lock which must be explicitly freed by the user. * @return Series Number or NULL if absent or not selected. */ const char *getSeriesNumber(); /** returns the Series Date of the currently selected series. * May be called only if a valid series selection exists - see selectSeries(). * This method acquires a database lock which must be explicitly freed by the user. * @return Series Date or NULL if absent or not selected. */ const char *getSeriesDate(); /** returns the Series Time of the currently selected series. * May be called only if a valid series selection exists - see selectSeries(). * This method acquires a database lock which must be explicitly freed by the user. * @return Series Time or NULL if absent or not selected. */ const char *getSeriesTime(); /** returns the Series Description of the currently selected series. * May be called only if a valid series selection exists - see selectSeries(). * This method acquires a database lock which must be explicitly freed by the user. * @return Series Description or NULL if absent or not selected. */ const char *getSeriesDescription(); /** returns the Series Performing Physicians Name of the currently selected series. * May be called only if a valid series selection exists - see selectSeries(). * This method acquires a database lock which must be explicitly freed by the user. * @return Series Performing Physicians Name or NULL if absent or not selected. */ const char *getSeriesPerformingPhysiciansName(); /** returns the Series Protocol Name of the currently selected series. * May be called only if a valid series selection exists - see selectSeries(). * This method acquires a database lock which must be explicitly freed by the user. * @return Series Protocol Name or NULL if absent or not selected. */ const char *getSeriesProtocolName(); /** returns the Series Operators Name of the currently selected series. * May be called only if a valid series selection exists - see selectSeries(). * This method acquires a database lock which must be explicitly freed by the user. * @return Series Operators Name or NULL if absent or not selected. */ const char *getSeriesOperatorsName(); /** returns the Modality of the currently selected series. * May be called only if a valid series selection exists - see selectSeries(). * This method acquires a database lock which must be explicitly freed by the user. * @return Modality or NULL if absent or not selected. */ const char *getModality(); /** returns the number of instances (IODs) within the currently selected series. * May be called only if a valid series selection exists - see selectSeries(). * This method acquires a database lock which must be explicitly freed by the user. * See the comments for getNumberOfStudies() about the validity period * of the returned number. * @return number of instances in the current series. */ Uint32 getNumberOfInstances(); /** selects the instance with the given index within the currently selected series. * This method acquires a database lock which must be explicitly freed by the user. * The selection remains valid until the database lock is removed or the database * is modified (see comments for getNumberOfStudies). * @param idx index to be selected, must be < getNumberOfInstances() * @return EC_Normal upon success, an error code otherwise. */ OFCondition selectInstance(Uint32 idx); /** selects the instance with the given UID within the currently selected series. * This method acquires a database lock which must be explicitly freed by the user. * The selection remains valid until the database lock is removed or the database * is modified (see comments for getNumberOfStudies). * @param instanceUID SOP instance UID of the instance * @return EC_Normal upon success, an error code otherwise. */ OFCondition selectInstance(const char *instanceUID); /** selects the instance with the given UID and SOP class over all studies and series. * Please note that in worst case all studies, series and instances are examined. * This method acquires a database lock which must be explicitly freed by the user. * The selection remains valid until the database lock is removed or the database * is modified (see comments for getNumberOfStudies). * @param instanceUID SOP instance UID of the instance * @param sopClassUID SOP class UID of the instance (might be NULL to be not compared) * @return EC_Normal upon success, an error code otherwise. */ OFCondition selectInstance(const char *instanceUID, const char *sopClassUID); /** selects the instance with the given UIDs. * This method acquires a database lock which must be explicitly freed by the user. * The selection remains valid until the database lock is removed or the database * is modified (see comments for getNumberOfStudies). * @param studyUID study instance UID of the instance * @param seriesUID series instance UID of the instance * @param instanceUID SOP instance UID of the instance * @return EC_Normal upon success, an error code otherwise. */ OFCondition selectInstance(const char *studyUID, const char *seriesUID, const char *instanceUID); /** returns the SOP class UID of the currently selected instance. * May be called only if a valid instance selection exists - see selectInstance(). * This method acquires a database lock which must be explicitly freed by the user. * @return SOP Instance UID or NULL if absent or not selected. */ const char *getSOPClassUID(); /** returns the SOP Instance UID of the currently selected instance. * May be called only if a valid instance selection exists - see selectInstance(). * This method acquires a database lock which must be explicitly freed by the user. * @return SOP Instance UID or NULL if absent or not selected. */ const char *getInstanceUID(); /** returns the Image Number of the currently selected instance. * May be called only if a valid instance selection exists - see selectInstance(). * This method acquires a database lock which must be explicitly freed by the user. * @return Image Number or NULL if absent or not selected. */ const char *getImageNumber(); /** returns the Filename of the currently selected instance. * May be called only if a valid instance selection exists - see selectInstance(). * This method acquires a database lock which must be explicitly freed by the user. * @return Filename or NULL if absent or not selected. */ const char *getFilename(); /** returns the review status of the currently selected instance. * May be called only if a valid instance selection exists - see selectInstance(). * This method acquires a database lock which must be explicitly freed by the user. * @return instance review status */ DVIFhierarchyStatus getInstanceStatus() ; /** returns the escription of the currently selected instance. * May be called only if a valid instance selection exists - see selectInstance(). * This method acquires a database lock which must be explicitly freed by the user. * @return Instance Description or NULL if absent or not selected. */ const char *getInstanceDescription(); /** returns the Presentation Label of the currently selected instance. * May be called only if a valid instance selection exists - see selectInstance(). * This method acquires a database lock which must be explicitly freed by the user. * @return Presentation Label or NULL if absent or not selected. */ const char *getPresentationLabel(); /* methods modifying the database */ /** modifies the review flag for one instance in the database, which is set to * 'reviewed' state (DVIF_objectIsNotNew). The status of the corresponding series * and study is updated automatically. * This method acquires a database lock which must be explicitly freed by the user. * The database is modified - any study, series or instance selection * and the number of studies, series and instances reported will become invalid since * other processes may modify the database before the exclusive lock is granted to this method. * @param studyUID study instance UID of the reviewed instance * @param seriesUID series instance UID of the reviewed instance * @param instanceUID SOP instance UID of the reviewed instance * @return EC_Normal upon success, an error code otherwise. */ OFCondition instanceReviewed(const char *studyUID, const char *seriesUID, const char *instanceUID); /** deletes the given instance from the database. If the corresponding DICOM file * resides in the same directory as the index file, it is also removed. * This method acquires a database lock which must be explicitly freed by the user. * The database is modified - any study, series or instance selection * and the number of studies, series and instances reported will become invalid since * other processes may modify the database before the exclusive lock is granted to this method. * @param studyUID study instance UID of the instance to be deleted * @param seriesUID series instance UID of the instance to be deleted * @param instanceUID SOP instance UID of the instance to be deleted * @return EC_Normal upon success, an error code otherwise. */ OFCondition deleteInstance(const char *studyUID, const char *seriesUID, const char *instanceUID); /** deletes the given series from the database. Any of the corresponding DICOM files * residing in the same directory as the index file are also removed. * This method acquires a database lock which must be explicitly freed by the user. * The database is modified - any study, series or instance selection * and the number of studies, series and instances reported will become invalid since * other processes may modify the database before the exclusive lock is granted to this method. * @param studyUID study instance UID of the series to be deleted * @param seriesUID series instance UID of the series to be deleted * @return EC_Normal upon success, an error code otherwise. */ OFCondition deleteSeries(const char *studyUID, const char *seriesUID); /** deletes the given study from the database. Any of the corresponding DICOM files * residing in the same directory as the index file are also removed. * This method acquires a database lock which must be explicitly freed by the user. * The database is modified - any study, series or instance selection * and the number of studies, series and instances reported will become invalid since * other processes may modify the database before the exclusive lock is granted to this method. * @param studyUID study instance UID of the study to be deleted * @return EC_Normal upon success, an error code otherwise. */ OFCondition deleteStudy(const char *studyUID); /* here follow the Network interface methods */ /** starts the network receiver processes (Storage Service Class SCPs). * The receiver processes will wait for incoming DICOM associations, receive images * and presentation states. Data will be stored in file and registered in the * database index file. Attention: Successful return of this method is no guarantee * that the network receiver has successfully started, because certain errors * (i.e. incorrect settings in the config file) will only be noted in the network * receiver process when running. On Unix platform, successful return of this method * means that the fork() used to start the receiver was successful. * On Win32 platforms, it means that the CreateProcess() call was successful. * @return EC_Normal if the receiver processes could be started, an error code otherwise. */ OFCondition startReceiver(); /** terminates the network receiver process (Storage Service Class SCP). * This method attempts to terminate the network receiver process by * requesting a DICOM association with it and delivering a special "shutdown" command. * If for some reason the network receiver cannot be found (i.e. because it has * terminated abnormally), a TCP/IP timeout (several seconds) may occur before this method returns. * @return EC_Normal if the receiver process could be terminated, an error code otherwise. */ OFCondition terminateReceiver(); /** starts the query/retrieve server process (Query/Retrieve Service Class SCP). * The query/retrieve process will wait for incoming DICOM associations, serve queries and * send the requested instances to the specified destination. Data will be taken from the * same local database used to store received instances and created presentation states, * stored print objects and hardcopy grayscale images. * The configuration file which is required for the query/retrieve process will be created * automatically from the 'global' configuration file each time this method is called, unless * this automatical creation is disabled (entry: [QUERYRETIUEVE] AutoCreateConfigFile = false). * Attention: Successful return of this method is no guarantee that the query/retrieve server * has successfully started, because certain errors (i.e. incorrect settings in the config file) * will only be noted in the query/retrieve process when running. On Unix platform, successful * return of this method means that the fork() used to start the receiver was successful. * On Win32 platforms, it means that the CreateProcess() call was successful. * @return EC_Normal if the query/retrieve process could be started, an error code otherwise. */ OFCondition startQueryRetrieveServer(); /** terminates the query/retrieve server process (Query/Retrieve Service Class SCP). * This method attempts to terminate the query/retrieve process by requesting a * DICOM association with it and delivering a special "shutdown" command. * If for some reason the query/retrieve server cannot be found (i.e. because it has * terminated abnormally), a TCP/IP timeout (several seconds) may occur before this * method returns. * @return EC_Normal if the query/retrieve process could be terminated, * an error code otherwise. */ OFCondition terminateQueryRetrieveServer(); /** tests whether the database has been modified in any way since the last * call to this method. Any write access to the database (adding, deleting, changing) * is reported. This method works by modifying and checking the "modification date/time" * of the database index file. This method is not affected by database locks and can be * called at any time. * Always returns OFTrue for the first call after construction of the interface. * Also returns OFTrue if something goes wrong (i.e. if the method cannot make sure * that nothing has changed). * @return OFTrue if the database has been modified since the last call to this method. */ OFBool newInstancesReceived(); /** sends a complete study over network to a different DICOM peer. * A separate application or process is launched to handle the send operation. * This call returns when the send operation has successfully been launched. * No information about the status or success of the transfer itself is being made * available. * @param targetID symbolic identifier of the send target, must be one of the * strings returned by getTargetID(). * @param studyUID Study Instance UID of the study to be sent. Must be a study * contained in the database. * @return EC_Normal when the send process has successfully been launched, * an error condition otherwise. */ OFCondition sendStudy(const char *targetID, const char *studyUID) { return sendIOD(targetID, studyUID, NULL, NULL); } /** sends a complete series over network to a different DICOM peer. * A separate application or process is launched to handle the send operation. * This call returns when the send operation has successfully been launched. * No information about the status or success of the transfer itself is being made * available. * @param targetID symbolic identifier of the send target, must be one of the * strings returned by getTargetID(). * @param studyUID Study Instance UID of the series to be sent. Must be a series * contained in the database. * @param seriesUID Series Instance UID of the series to be sent. Must be a series * contained in the database. * @return EC_Normal when the send process has successfully been launched, * an error condition otherwise. */ OFCondition sendSeries(const char *targetID, const char *studyUID, const char *seriesUID) { return sendIOD(targetID, studyUID, seriesUID, NULL); } /** sends a single instance (image or presentation state) * over network to a different DICOM peer. * A separate application or process is launched to handle the send operation. * This call returns when the send operation has successfully been launched. * No information about the status or success of the transfer itself is being made * available. * @param targetID symbolic identifier of the send target, must be one of the * strings returned by getTargetID(). * @param studyUID Study Instance UID of the IOD to be sent. Must be an IOD * contained in the database. * @param seriesUID Series Instance UID of the IOD to be sent. Must be an IOD * contained in the database. * @param instanceUID SOP Instance UID of the IOD to be sent. Must be an IOD * contained in the database. * @return EC_Normal when the send process has successfully been launched, * an error condition otherwise. */ OFCondition sendIOD(const char *targetID, const char *studyUID, const char *seriesUID, const char *instanceUID); /** creates a dump of the contents of a DICOM file and displays it on-screen. * A separate application or process is launched to handle the dump and display. * This call returns when the dump operation has successfully been launched. * No information about the status or success of the process itself is being made * available. * This method does not acquire a database lock. * @param filename path of file to be displayed. * @return EC_Normal when the process has successfully been launched, * an error condition otherwise. */ OFCondition dumpIOD(const char *filename); /** creates a dump of the contents of a DICOM file and displays it on-screen. * A separate application or process is launched to handle the dump and display. * This call returns when the dump operation has successfully been launched. * No information about the status or success of the process itself is being made * available. * This method acquires a database lock which must be explicitly freed by the user. * @param studyUID Study Instance UID of the IOD to be dumped. Must be an IOD * contained in the database. * @param seriesUID Series Instance UID of the IOD to be dumped. Must be an IOD * contained in the database. * @param instanceUID SOP Instance UID of the IOD to be dumped. Must be an IOD * contained in the database. * @return EC_Normal when the process has successfully been launched, * an error condition otherwise. */ OFCondition dumpIOD(const char *studyUID, const char *seriesUID, const char *instanceUID); /** checks the contents of a DICOM file and displays an evaluation report on the screen. * A separate application or process is launched to handle the evaluation and display. * This call returns when the check operation has successfully been launched. * No information about the status or success of the process itself is being made * available. * This method does not acquire a database lock. * @param filename path of file to be checked. * @return EC_Normal when the process has successfully been launched, * an error condition otherwise. */ OFCondition checkIOD(const char *filename); /** checks the contents of a DICOM file and displays an evaluation report on the screen. * A separate application or process is launched to handle the evaluation and display. * This call returns when the check operation has successfully been launched. * No information about the status or success of the process itself is being made * available. * This method acquires a database lock which must be explicitly freed by the user. * @param studyUID Study Instance UID of the IOD to be checked. Must be an IOD * contained in the database. * @param seriesUID Series Instance UID of the IOD to be checked. Must be an IOD * contained in the database. * @param instanceUID SOP Instance UID of the IOD to be checked. Must be an IOD * contained in the database. * @return EC_Normal when the process has successfully been launched, * an error condition otherwise. */ OFCondition checkIOD(const char *studyUID, const char *seriesUID, const char *instanceUID); /** saves a monochrome bitmap as a DICOM Secondary Capture image. * The bitmap must use one byte per pixel, left to right, top to bottom * order of the pixels. 0 is interpreted as black, 255 as white. * @param filename the file name or path under which the image is saved. * @param pixelData a pointer to the image data. Must contain at least * width*height bytes of data. * @param width the width of the image, must be <= 0xFFFF * @param height the height of the image, must be <= 0xFFFF * @param aspectRatio the pixel aspect ratio as width/height. If omitted, a pixel * aspect ratio of 1/1 is assumed. * @param explicitVR selects the transfer syntax to be written. * True selects Explicit VR Little Endian, False selects Implicit VR Little Endian. * @param instanceUID optional parameter containing the SOP Instance UID to be written. * This parameter should be omitted unless the SOP Instance UID needs to be controlled * externally. * @return EC_Normal upon success, an error code otherwise. */ OFCondition saveDICOMImage( const char *filename, const void *pixelData, unsigned long width, unsigned long height, double aspectRatio=1.0, OFBool explicitVR=OFTrue, const char *instanceUID=NULL); /** saves a monochrome bitmap as a DICOM Secondary Capture image * in the same directory in which the database index file resides. * The filename is generated automatically. * When the image is stored successfully, the database index is updated * to include the new object. * This method releases under any circumstances the database lock if it exists. * @param pixelData a pointer to the image data. Must contain at least * width*height bytes of data. * @param width the width of the image, must be <= 0xFFFF * @param height the height of the image, must be <= 0xFFFF * @param aspectRatio the pixel aspect ratio as width/height. If omitted, a pixel * aspect ratio of 1/1 is assumed. * @return EC_Normal upon success, an error code otherwise. */ OFCondition saveDICOMImage( const void *pixelData, unsigned long width, unsigned long height, double aspectRatio=1.0); /** saves a monochrome bitmap as a DICOM Hardcopy Grayscale image. * The bitmap must use 16 bits per pixel, left to right, top to bottom * order of the pixels. It is assumed that only values 0..4095 are used. * @param filename the file name or path under which the image is saved. * @param pixelData a pointer to the image data. Must contain at least * width*height*2 bytes of data. * @param width the width of the image, must be <= 0xFFFF * @param height the height of the image, must be <= 0xFFFF * @param aspectRatio the pixel aspect ratio as width/height. If omitted, a pixel * aspect ratio of 1/1 is assumed. * @param explicitVR selects the transfer syntax to be written. * True selects Explicit VR Little Endian, False selects Implicit VR Little Endian. * @param instanceUID optional parameter containing the SOP Instance UID to be written. * This parameter should be omitted unless the SOP Instance UID needs to be controlled * externally. * @return EC_Normal upon success, an error code otherwise. */ OFCondition saveHardcopyGrayscaleImage( const char *filename, const void *pixelData, unsigned long width, unsigned long height, double aspectRatio=1.0, OFBool explicitVR=OFTrue, const char *instanceUID=NULL); /** saves a monochrome bitmap as a DICOM Hardcopy Grayscale image * in the same directory in which the database index file resides. * The filename is generated automatically. * When the image is stored successfully, the database index is updated * to include the new object. * This method releases under any circumstances the database lock if it exists. * @param pixelData a pointer to the image data. Must contain at least * width*height*2 bytes of data. * @param width the width of the image, must be <= 0xFFFF * @param height the height of the image, must be <= 0xFFFF * @param aspectRatio the pixel aspect ratio as width/height. If omitted, a pixel * aspect ratio of 1/1 is assumed. * @return EC_Normal upon success, an error code otherwise. */ OFCondition saveHardcopyGrayscaleImage( const void *pixelData, unsigned long width, unsigned long height, double aspectRatio=1.0); /** saves a DICOM object into a file in the same directory in which the * database index file resides. The object must contain a SOP Class * UID and SOP Instance UID. The filename is generated automatically. * When the image is stored successfully, the database index is * updated to include the new object. This method releases under any * circumstances the database lock if it exists. * @param fileformat the complete DICOM file object to be written * @return EC_Normal upon success, an error code otherwise. */ OFCondition saveFileFormatToDB(DcmFileFormat &fileformat); /** loads a Stored Print object which is contained in the database into memory. * Attention: The current print job (Stored Print object) will be deleted by doing this. * This method acquires a database lock which must be explicitly freed by the user. * @param studyUID study instance UID of the Stored Print object * @param seriesUID series instance UID of the Stored Print object * @param instanceUID SOP instance UID of the Stored Print object * @param changeStatus if true the stored print object is marked 'reviewed' (not new) * @return EC_Normal upon success, an error code otherwise. */ OFCondition loadStoredPrint(const char *studyUID, const char *seriesUID, const char *instanceUID, OFBool changeStatus = OFFalse); /** loads a Stored Print object (which need not be contained in the database) into memory. * Attention: The current print job (Stored Print object) will be deleted by doing this. * This method does not acquire a database lock. * @param filename path and filename of the Stored Print object to be loaded * @return EC_Normal upon success, an error code otherwise. */ OFCondition loadStoredPrint(const char *filename); /** saves the current print job as a Stored Print object. * @param filename the file name or path under which the image is saved. * @param writeRequestedImageSize if false, the Requested Image Size attributes are not written, * e. g. because they are not supported by the target printer. * @param explicitVR selects the transfer syntax to be written. * True selects Explicit VR Little Endian, False selects Implicit VR Little Endian. * @param instanceUID optional parameter containing the SOP Instance UID to be written. * This parameter should be omitted unless the SOP Instance UID needs to be controlled * externally. * @return EC_Normal upon success, an error code otherwise. */ OFCondition saveStoredPrint( const char *filename, OFBool writeRequestedImageSize, OFBool explicitVR=OFTrue, const char *instanceUID=NULL); /** saves the current print job as a Stored Print object * in the same directory in which the database index file resides. * The filename is generated automatically. * When the image is stored successfully, the database index is updated * to include the new object. * This method releases under any circumstances the database lock if it exists. * @param writeRequestedImageSize if false, the Requested Image Size attributes are not written, * e. g. because they are not supported by the target printer. * @return EC_Normal upon success, an error code otherwise. */ OFCondition saveStoredPrint(OFBool writeRequestedImageSize); /** gets the number of Hardcopy Grayscaleimages currently registered by the stored print object. * @return number of images. */ size_t getNumberOfPrintPreviews(); /** loads a Hardcopy Grayscale image registered by the stored print object and creates a preview. * The preview bitmap is implicitly scaled to fit into the rectangle specified by * setMaxPrintPreviewWidthHeight(). * @param idx index of the image, must be < getNumberOfPrintPreviews() * @param printLUT OFTrue if presentation LUT should be interpreted as a print presentation LUT * (default, in this case there is no implicit scaling of the input width of the LUT and, * therefore, the VOI transformation - which is absent for print - is used), * OFFalse otherwise (softcopy interpretation of a presentation LUT) * @param changeStatus if true the hardcopy grayscale image file is marked 'reviewed' (not new) * @return EC_Normal if successful, an error code otherwise. */ OFCondition loadPrintPreview(size_t idx, OFBool printLUT = OFTrue, OFBool changeStatus = OFFalse); /** removes a currently loaded Hardcopy Grayscale image from memory. */ void unloadPrintPreview(); /** gets number of bytes used for the print preview bitmap. * (depends on width, height and depth) * @return number of bytes used for the preview bitmap */ unsigned long getPrintPreviewSize(); /** sets the maximum print preview bitmap width and height. * Larger images are scaled down (according to the pixel aspect ratio) to fit into * the specified rectangle. * Attention: If the values differ from the the previous ones the currently loaded * hardcopy grayscale image (preview) is automatically detroyed and has to be re-loaded. * @param width maximum width of preview bitmap (in pixels) * @param height maximum height of preview bitmap (in pixels) */ void setMaxPrintPreviewWidthHeight(unsigned long width, unsigned long height); /** gets width and height of print preview bitmap. * The return values depend on the current maximum preview bitmap width/height values! * @param width upon success, the bitmap width (in pixels) is returned in this parameter * @param height upon success, the bitmap height (in pixels) is returned in this parameter * @return EC_Normal upon success, an error code otherwise */ OFCondition getPrintPreviewWidthHeight(unsigned long &width, unsigned long &height); /** writes the bitmap data of the print preview image into the given buffer. * The storage area must be allocated and deleted from the calling method. * @param bitmap pointer to storage area where the pixel data is copied to (array of 8 bit values) * @param size specifies size of the storage area in bytes * @return EC_Normal upon success, an error code otherwise */ OFCondition getPrintPreviewBitmap(void *bitmap, unsigned long size); /** stores the current presentation state in a temporary place * and creates a new presentation state that corresponds with an * image displayed "without" presentation state. * If called twice, an error code is returned. * @return EC_Normal upon success, an error code otherwise. */ OFCondition disablePState(); /** restores the stored presentation state (see disablePresentationState) * and deletes the temporary presentation state. * If no stored presentation state exists, returns an error. * @return EC_Normal upon success, an error code otherwise. */ OFCondition enablePState(); /** returns number of presentation states referencing the currently selected image. * If no instance is currently selected or the selected instance is a presentation * state, returns an error. * @return number of presentation states, 0 if none available or an error occurred */ Uint32 getNumberOfPStates(); /** selects and loads specified presentation state referencing the currently selected * image. * @param idx index to be selected, must be < getNumberOfPStates() * @param changeStatus if true the presentation state is marked 'reviewed' (not new) * @return EC_Normal upon success, an error code otherwise. */ OFCondition selectPState(Uint32 idx, OFBool changeStatus = OFFalse); /** returns description of specified presentation state referencing the currently * selected image. * @param idx index to be selected, must be < getNumberOfPStates() * @return presentation state description or NULL idx is invalid */ const char *getPStateDescription(Uint32 idx); /** returns label of specified presentation state referencing the currently * selected image. * @param idx index to be selected, must be < getNumberOfPStates() * @return presentation state label or NULL idx is invalid */ const char *getPStateLabel(Uint32 idx); /** checks whether display correction is possible (in principle), * i.e. a valid monitor characteristics description exists * and current system is a low-cost system (without built-in * calibration). * @param transform display transform to be checked (default: GSDF) * @return OFTrue if display transform is possible, OFFalse otherwise */ OFBool isDisplayTransformPossible(DVPSDisplayTransform transform = DVPSD_GSDF); /** sets ambient light value for the display transformation. * @param value ambient light value to be set * @return EC_Normal upon success, an error code otherwise. */ OFCondition setAmbientLightValue(double value); /** returns ambient light value for the display transformation. * @param value returned ambient light value * @return EC_Normal upon success, an error code otherwise. */ OFCondition getAmbientLightValue(double &value); /* print related methods */ /** selects the current printer. Also adjusts the destination AE title and the * printer name attribute within the Stored Print object. * @param targetID one of the printer target IDs returned by getTargetID(). * @return EC_Normal if successful, an error code otherwise. */ OFCondition setCurrentPrinter(const char *targetID); /** gets the current printer's target ID. * @return printer target ID, can be NULL if no printer is defined * in the configuration file. */ const char *getCurrentPrinter(); /** sets the (optional) print medium type. * @param value new attribute value, may be NULL. * The caller is responsible for making sure * that the value is valid for the selected printer. * @return EC_Normal if successful, an error code otherwise. */ OFCondition setPrinterMediumType(const char *value); /** gets the (optional) print medium type. * @return medium type, may be NULL. */ const char *getPrinterMediumType(); /** sets the (optional) printer film destination. * @param value new attribute value, may be NULL. * The caller is responsible for making sure * that the value is valid for the selected printer. * @return EC_Normal if successful, an error code otherwise. */ OFCondition setPrinterFilmDestination(const char *value); /** gets the (optional) printer film destination. * @return printer film destination, may be NULL or empty string. */ const char *getPrinterFilmDestination(); /** sets the (optional) printer film session label. * @param value new attribute value, may be NULL. * The caller is responsible for making sure * that the value is valid for the selected printer. * @return EC_Normal if successful, an error code otherwise. */ OFCondition setPrinterFilmSessionLabel(const char *value); /** gets the (optional) printer film session label. * @return printer film session label, may be NULL or empty string. */ const char *getPrinterFilmSessionLabel(); /** sets the (optional) print priority. * @param value new attribute value, may be NULL. * The caller is responsible for making sure * that the value is valid for the selected printer. * @return EC_Normal if successful, an error code otherwise. */ OFCondition setPrinterPriority(const char *value); /** gets the (optional) print priority. * @return print priority, may be NULL or empty string. */ const char *getPrinterPriority(); /** sets the (optional) print session owner ID. * @param value new attribute value, may be NULL. * The caller is responsible for making sure * that the value is valid for the selected printer. * @return EC_Normal if successful, an error code otherwise. */ OFCondition setPrinterOwnerID(const char *value); /** gets the (optional) print session owner ID. * @return print session owner ID, may be NULL or empty string. */ const char *getPrinterOwnerID(); /** sets the (optional) print number of copies. * @param value new attribute value, may be 0. * The caller is responsible for making sure * that the value is valid for the selected printer. * @return EC_Normal if successful, an error code otherwise. */ OFCondition setPrinterNumberOfCopies(unsigned long value); /** gets the (optional) print number of copies. * @return print number of copies, 0 if absent. */ unsigned long getPrinterNumberOfCopies(); /** resets the settings for basic film session (everything that * is not managed by the Stored Print object) to initial state. * Affects medium type, film destination, film session label, * priority, owner ID, and number of copies. */ void clearFilmSessionSettings(); /** sets the LUT with the given identifier * in the Presentation State as current Presentation LUT. * @param lutID LUT identifier, as returned by getLUTID(). * @return EC_Normal if successful, an error code otherwise. */ OFCondition selectDisplayPresentationLUT(const char *lutID); /** if the Presentation State contains an active * Presentation LUT that was set with selectDisplayPresentationLUT(), * return the corresponding LUT identifier. * @return lutID if found, NULL or empty string otherwise. */ const char *getDisplayPresentationLUTID(); /** sets the LUT with the given identifier in the Stored Print object * as current Presentation LUT. This LUT overrides the settings made * for the separate image boxes, it can be deactivated using the method * DVPSStoredPrint::setDefaultPresentationLUT(). * @param lutID LUT identifier, as returned by getLUTID(). * @return EC_Normal if successful, an error code otherwise. */ OFCondition selectPrintPresentationLUT(const char *lutID); /** if the Stored Print object contains an active * Presentation LUT that was set with selectPrintPresentationLUT(), * return the corresponding LUT identifier. * @return lutID if found, NULL or empty string otherwise. */ const char *getPrintPresentationLUTID(); /** start spooling of print job with current settings. * @param deletePrintedImages if true, delete printed images from queue. * @return EC_Normal if successful, an error code otherwise. */ OFCondition spoolPrintJob(OFBool deletePrintedImages=OFTrue); /** starts the print spooler process. * The print spooler will wait for print jobs created with spoolPrintJob() * and communicate them to the printer using the DICOM Print Management Service Class. * Attention: Successful return of this method is no guarantee * that the spooler has successfully started, because certain errors * (i.e. incorrect settings in the config file) will only be noted in the spooler * process when running. On Unix platform, successful return of this method * means that the fork() used to start the spooler was successful. * On Win32 platforms, it means that the CreateProcess() call was successful. * @return EC_Normal if the spooler process could be started, an error code otherwise. */ OFCondition startPrintSpooler(); /** terminates the print spooler process. This method creates a "dummy" * print job that request the print spooler to shutdown as soon as all other pending * print jobs are finished. * @return EC_Normal if the spooler process dummy print job could be written, * an error code otherwise. */ OFCondition terminatePrintSpooler(); /** starts the print server process (Basic Grayscale Print Management SCP). * The print server process will wait for incoming DICOM associations, handle the * DICOM print protcol, store data in file and register stored print and grayscale * image objects in the database index file. * Attention: Successful return of this method is no guarantee that the print * server has successfully started, because certain errors (i.e. incorrect settings * in the config file) will only be noted in the print server process when running. * On Unix platform, successful return of this method means that the fork() used to * start the server was successful. * On Win32 platforms, it means that the CreateProcess() call was successful. * @return EC_Normal if the server process could be started, an error code otherwise. */ OFCondition startPrintServer(); /** terminates the print server process (Basic Grayscale Print Management SCP). * This method attempts to terminate the print server process by requesting a DICOM * association with it and delivering a special "shutdown" command. * If for some reason the print server cannot be found (i.e. because it has terminated * abnormally), a TCP/IP timeout (several seconds) may occur before this method returns. * @return EC_Normal if the server process could be terminated, an error code otherwise. */ OFCondition terminatePrintServer(); /** adds an existing DICOM image (should be Hardcopy Grayscale) * that is already present in the image database to the current print image queue * without rendering it again. * The "requested image size" option is not used - the bitmap is treated as if the * presentation mode was "SCALE TO FIT". * @param studyUID study instance UID of the image, as reported by getStudyUID() * @param seriesUID series instance UID of the image, as reported by getSeriesUID() * @param instanceUID SOP instance UID of the image, as reported by getInstanceUID() * @return EC_Normal upon success, an error code otherwise. */ OFCondition addToPrintHardcopyFromDB(const char *studyUID, const char *seriesUID, const char *instanceUID); /** requests the spooler process to print an old print job that is stored * in the database as a "stored print" object. The Stored Print that is printed * does not contain all parameters of a print job. The following parameters are taken from the * current settings in this object: Target printer, medium type, * illumination and reflected ambient light. * @param studyUID study instance UID of the Stored Print, as reported by getStudyUID() * @param seriesUID series instance UID of the Stored Print, as reported by getSeriesUID() * @param instanceUID SOP instance UID of the Stored Print, as reported by getInstanceUID() * @return EC_Normal upon success, an error code otherwise. */ OFCondition spoolStoredPrintFromDB(const char *studyUID, const char *seriesUID, const char *instanceUID); /** Initiates the creation of a DICOM Basic Film Session SOP Instance in the printer. * This method stores all Basic Film Session related attributes that are managed by this object * in a DICOM dataset and passes the result to the embedded Stored Print object which manages * the further communication. * @param printHandler print communication handler, association must be open. * @param plutInSession true if printer expects referenced presentation LUT sequence, illumination * and reflected ambient light in basic film session, false if it expects them in basic film box. * @return EC_Normal upon success, an error code otherwise. */ OFCondition printSCUcreateBasicFilmSession(DVPSPrintMessageHandler& printHandler, OFBool plutInSession); /* annotation interface */ /** gets the current setting of the annotation activity annotation flag. * @return OFTrue if annotation is on, OFFalse otherwise. */ OFBool isActiveAnnotation() { return activateAnnotation; } /** gets the current setting of the Prepend Date/Time annotation flag. * @return OFTrue if Prepend Date/Time is on, OFFalse otherwise. */ OFBool getPrependDateTime() { return prependDateTime; } /** gets the current setting of the Prepend Printer Name annotation flag. * @return OFTrue if Prepend Printer Name is on, OFFalse otherwise. */ OFBool getPrependPrinterName() { return prependPrinterName; } /** gets the current setting of the Prepend Lighting annotation flag. * @return OFTrue if Prepend Lighting is on, OFFalse otherwise. */ OFBool getPrependLighting() { return prependLighting; } /** gets the current annotation text. * @return annotation text, may be NULL or empty string. */ const char *getAnnotationText() { return annotationText.c_str(); } /** switches annotation printing on/off * @param value OFTrue if annotation is switched on, OFFalse otherwise. */ void setActiveAnnotation(OFBool value) { activateAnnotation=value; } /** sets the Prepend Date/Time annotation flag. * @param value OFTrue if Prepend Date/Time is switched on, OFFalse otherwise. */ void setPrependDateTime(OFBool value) { prependDateTime=value; } /** sets the Prepend Printer Name annotation flag. * @param value OFTrue if Prepend Printer Name is switched on, OFFalse otherwise. */ void setPrependPrinterName(OFBool value) { prependPrinterName=value; } /** sets the Prepend Lighting annotation flag. * @param value OFTrue if Prepend Lighting is switched on, OFFalse otherwise. */ void setPrependLighting(OFBool value) { prependLighting=value; } /** sets the current annotation text. * @param value new text, may be NULL. */ void setAnnotationText(const char *value); /* user management interface */ /** verifies the given password for the given user ID. This method tries * to load and decrypt the private key for the given user with the * given password. If this fails, the password verification fails, * otherwise the password verification succeeds. * This method requires that DCMTK be configured and compiled with * the WITH_OPENSSL flag, otherwise always returns false. * @param userID symbolic user ID for given user, as returned by * DVConfiguration::getUserID() * @param passwd for user as entered in some GUI control * @return true if password verification succeeds, false otherwise. */ OFBool verifyUserPassword(const char *userID, const char *passwd); /** verifies and digitally signs the current structured report. * If the user ID is known (i.e. specified in the configuration file) the current * structured report is verified (a verifying observer is added). If the 'mode' * parameter is set accordingly and the password is correct (see verifyUserPassword) * the report is also digitally signed. * Please note that a document can be verified/signed more than once, but only completed * documents can be verified. After signing the report no modifications should be performed * before the object is stored in the database or a file. Otherwise the digital signature * would be corrupted. Therefore, the SOP instance UID should be generated before calling * this method. * To digitally sign the report it is required that DCMTK is configured and compiled * with the WITH_OPENSSL flag, otherwise only verification is available (returns an * error code if mode differs from DVPSY_verify). * @param userID symbolic user ID for given user, as returned by * DVConfiguration::getUserID() * @param passwd for user as entered in some GUI control * @param mode flag specifying whether to verify only, verify and sign or verify and * sign and finalize the document. The difference between the second and the third mode * is that "finalize" always signs the entire document whereas the other mode only signs * the marked items (if any, all items otherwise) and leaves out certain header attributes * (e.g. the SOP instance UID and the verifying observer sequence). * @return status, EC_Normal if successful, an error code otherwise. */ OFCondition verifyAndSignStructuredReport(const char *userID, const char *passwd, DVPSVerifyAndSignMode mode); /* digital signatures */ /** returns a string containing a complete HTML page with the * signature validation results for the last object of the * given type. Never returns NULL. * @param objtype object type * @return pointer to string with HTML page */ const char *getCurrentSignatureValidationHTML(DVPSObjectType objtype) const; /** returns a string containing a complete HTML page with the * signature validation overview. Never returns NULL. * @return pointer to string with HTML page */ const char *getCurrentSignatureValidationOverview() const; /** returns the status flag for the current object of given type. * @param objtype object type * @return digital signature status for object */ DVPSSignatureStatus getCurrentSignatureStatus(DVPSObjectType objtype) const; /** returns the combined status flag for the current image and presentation state. * @return digital signature status for image and presentation state */ DVPSSignatureStatus getCombinedImagePStateSignatureStatus() const; /** returns number of correct signatures for given object type. * @param objtype object type * @return number of digital signatures */ unsigned long getNumberOfCorrectSignatures(DVPSObjectType objtype) const; /** returns number of untrustworthy signatures for given object type. * @param objtype object type * @return number of digital signatures */ unsigned long getNumberOfUntrustworthySignatures(DVPSObjectType objtype) const; /** returns number of corrupt signatures for given object type. * @param objtype object type * @return number of digital signatures */ unsigned long getNumberOfCorruptSignatures(DVPSObjectType objtype) const; /** disables internal settings for image and presentation state. * Called when a new SR object is loaded and the current * image/presentation state are hidden consequently. */ void disableImageAndPState(); private: /** private undefined copy constructor */ DVInterface(const DVInterface&); /** private undefined assignment operator */ DVInterface& operator=(const DVInterface&); /** helper function that exchanges the current presentation state and image * by the pointers passed and frees the old ones. * @param newState new presentation state, must not be NULL * @param image image file * @param state presentation state if newState was not created from image. * @return EC_Normal upon success, an error code otherwise. */ OFCondition exchangeImageAndPState(DVPresentationState *newState, DcmFileFormat *image, DcmFileFormat *state=NULL); /** creates a database handle if none exists yet (this method may * be called multiple times without interference) and puts a shared lock * on the database. * The lock will remain until explicitly released with releaseDatabase(); * @return EC_Normal upon success, an error code otherwise. */ OFCondition lockDatabase(); /** creates an exlusive lock on the database if none exists. * The lock will remain until explicitly released with releaseDatabase() * or unlockExclusive(). * This method also clears the index cache. * @return EC_Normal upon success, an error code otherwise. */ OFCondition lockExclusive(); /** removes an exlusive lock on the database if any. * @return EC_Normal upon success, an error code otherwise. */ OFCondition unlockExclusive(); /** creates a new pair of filenames for print job creation. * @param printer printer identifier * @param tempname temporary name is returned here * @param jobname print job name is returned here * @return EC_Normal upon success, an error code otherwise. */ OFCondition createPrintJobFilenames(const char *printer, OFString& tempname, OFString& jobname); /** creates the query/retrieve server configuration file. * @param filename path to the configuration file (incl. filename) * @return EC_Normal upon success, an error code otherwise. */ OFCondition createQueryRetrieveServerConfigFile(const char *filename); /** starts an external application and passes a filename. * @param application pathname of the application to be started * @param filename filename to be passed as single parameter. * @return EC_Normal if fork or CreateProcess succeeds, an error * condition otherwise. */ OFCondition startExternalApplication(const char *application, const char *filename); /* member variables */ /** pointer to the current print handler object */ DVPSStoredPrint *pPrint; /** pointer to the current presentation state object */ DVPresentationState *pState; /** pointer to the current structured reporting object (should never be NULL) */ DSRDocument *pReport; /** pointer to the handler object for digital signatures */ DVSignatureHandler *pSignatureHandler; /** pointer to the stored presentation state object (if any) */ DVPresentationState *pStoredPState; /** pointer to the current DICOM image attached to the presentation state */ DcmFileFormat *pDicomImage; /** pointer to the current DICOM dataset containing the loaded presentation state. * Is NULL when the presentation state has been created "on the fly" from image. */ DcmFileFormat *pDicomPState; /** pointer to the current hardcopy grayscale image (bitmap information only) */ DicomImage *pHardcopyImage; /** a unique string generated for each instance of this class. * Used to identify print jobs generated from this instance. */ OFString printJobIdentifier; /** a counter used for generating print job names. */ unsigned long printJobCounter; /** string containing the path name of the config file as passed to the ctor. */ OFString configPath; /** string containing the path name of the database index file * after a database lock has been acquired for the first time */ OFString databaseIndexFile; /** initialized with construction time of the interface object * minus one day. Used to check modifications of the database index file. */ unsigned long referenceTime; /** list of display function object */ DiDisplayFunction *displayFunction[DVPSD_max]; /** handle to access database/index file */ DcmQueryRetrieveIndexDatabaseHandle *pHandle; /** locking mode (OFFalse => shared, OFTrue => exclusive) */ OFBool lockingMode; /** hierarchical cache structure to optimize index file access */ DVStudyCache idxCache; /** record structure of index items (last read entry) */ IdxRecord idxRec; /** position of last read index record (for optimization purposes) */ int idxRecPos; /** OFTrue if current image is already stored in database, OFFalse otherwise */ OFBool imageInDatabase; /* private methods for database */ /** creates index cache to optimize reading of index file */ OFBool createIndexCache(); /** creates cache of referencing pstates for the current image */ OFBool createPStateCache(); /** clears index cache (includes pstate cache) */ void clearIndexCache(); /** clears specified index record (and makes pos invalid) */ void clearIndexRecord(IdxRecord &record, int &recpos); /** reads specified index record (comparing pos with oldpos to avoid redundant * loading) */ OFBool readIndexRecord(const int pos, IdxRecord &record, int *oldpos = NULL); /** updates (hierarchical) status cache (propagates status information from instances * to series and from series to studies) */ void updateStatusCache(); /** returns pointer to study struct specified by given UIDs or to current study */ DVStudyCache::ItemStruct *getStudyStruct(const char *studyUID = NULL, const char *seriesUID = NULL); /** returns pointer to series struct specified by given UIDs or to current series */ DVSeriesCache::ItemStruct *getSeriesStruct(const char *studyUID = NULL, const char *seriesUID = NULL, const char *instanceUID = NULL); /** returns pointer to instance struct specified by given UIDs or to current instance */ DVInstanceCache::ItemStruct *getInstanceStruct(const char *studyUID = NULL, const char *seriesUID = NULL, const char *instanceUID = NULL); /** returns index of specified study within study description record */ int findStudyIdx(StudyDescRecord *study, const char *uid); /** conditionally deletes given image file (only if file resides in index.dat directory) */ int deleteImageFile(const char *filename); /** resets index file modification time to reference time (yesterday) */ void resetDatabaseReferenceTime(); /** modifies the review flag for one instance in the database (see method with three UID * parameters) */ OFCondition instanceReviewed(int pos); /** minimum width of print bitmap (used for implicit scaling) */ unsigned long minimumPrintBitmapWidth; /** minimum height of print bitmap (used for implicit scaling) */ unsigned long minimumPrintBitmapHeight; /** maximum width of print bitmap (used for implicit scaling) */ unsigned long maximumPrintBitmapWidth; /** maximum height of print bitmap (used for implicit scaling) */ unsigned long maximumPrintBitmapHeight; /** maximum width of print preview bitmap */ unsigned long maximumPrintPreviewWidth; /** maximum height of print preview bitmap */ unsigned long maximumPrintPreviewHeight; /** maximum width of (optional) preview image */ unsigned long maximumPreviewImageWidth; /** maximum height of (optional) preview image */ unsigned long maximumPreviewImageHeight; /** target ID of current printer, empty if no printer exists in config file */ OFString currentPrinter; /** config file identifier of LUT currently selected as Display Presentation LUT */ OFString displayCurrentLUTID; /** config file identifier of LUT currently selected as Print Presentation LUT */ OFString printCurrentLUTID; /** printer medium type identifier, may be empty. VR=CS, VM=1 */ OFString printerMediumType; /** printer film destination identifier, may be empty. VR=CS, VM=1 */ OFString printerFilmDestination; /** printer film session label, may be empty. VR=LO, VM=1 */ OFString printerFilmSessionLabel; /** printer number of copies */ unsigned long printerNumberOfCopies; /** printer print priority, may be empty. VR=CS, VM=1, * enumerated values: HIGH, MED, LOW */ OFString printerPriority; /** printer film session owner ID, may be empty. VR=SH, VM=1 */ OFString printerOwnerID; /** true if annotation should be created when spooling print job */ OFBool activateAnnotation; /** true if date and time should be prepended to annotation text */ OFBool prependDateTime; /** true if printer name should be prepended to annotation text */ OFBool prependPrinterName; /** true if reflected ambient light and illumination should be prepended to annotation text */ OFBool prependLighting; /** annotation text (if any) */ OFString annotationText; }; #endif /* * CVS/RCS Log: * $Log: dviface.h,v $ * Revision 1.95 2010-10-14 13:16:35 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.94 2009-11-24 14:12:57 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.93 2009-09-30 10:42:37 uli * Make dcmpstat's include headers self-sufficient by including all * needed headers directly and stop using dctk.h * * Revision 1.92 2009-05-28 10:55:38 joergr * Fixed various Doxygen API documentation issues. * * Revision 1.91 2005/12/08 16:03:31 meichel * Changed include path schema for all DCMTK header files * * Revision 1.90 2005/04/04 10:11:57 meichel * Module dcmpstat now uses the dcmqrdb API instead of imagectn for maintaining * the index database * * Revision 1.89 2004/02/04 15:48:23 joergr * Removed acknowledgements with e-mail addresses from CVS log. * * Revision 1.88 2003/04/29 10:13:56 meichel * Moved configuration file parser from module dcmpstat to ofstd and renamed * class to OFConfigFile. Cleaned up implementation (no more friend declarations). * * Revision 1.87 2002/04/16 14:02:02 joergr * Added configurable support for C++ ANSI standard includes (e.g. streams). * * Revision 1.86 2001/09/26 15:36:06 meichel * Adapted dcmpstat to class OFCondition * * Revision 1.85 2001/02/23 13:31:46 joergr * Changed behaviour of method verifyAndSignStructuredReport() with 'finalize'. * Now the entire document is always signed independently from the tree items * marked. * * Revision 1.84 2001/01/29 17:32:30 joergr * Added method to verify and digitally sign structured reports. * * Revision 1.83 2001/01/29 14:55:41 meichel * Added new methods for creating signatures and checking the signature * status in module dcmpstat. * * Revision 1.82 2001/01/25 15:18:04 meichel * Added initial support for verification of digital signatures * in presentation states, images and structured reports to module dcmpstat. * * Revision 1.81 2000/11/14 16:35:16 joergr * Added creation of new UIDs and setting of content date/time when starting * a new SR document from a "template". * * Revision 1.80 2000/11/13 15:50:42 meichel * Added dcmpstat support methods for creating image references * in SR documents. * * Revision 1.79 2000/11/13 11:52:40 meichel * Added support for user logins and certificates. * * Revision 1.78 2000/11/13 10:42:38 joergr * Added support for Structured Reporting "templates". * * Revision 1.77 2000/10/16 11:39:43 joergr * Added support for new structured reports. * Added method allowing to select an instance by instance UID and SOP class * UID (without series and study UID). Required for composite references in * DICOM SR. * * Revision 1.76 2000/10/10 12:23:39 meichel * Added extensions for TLS encrypted communication * * Revision 1.75 2000/07/18 16:02:35 joergr * Moved method convertODtoLum/PValue from class DVInterface to DVPSStoredPrint * and corrected implementation. * * Revision 1.74 2000/07/17 12:05:09 joergr * Added methods to select objects from the database directly. * * Revision 1.73 2000/07/14 17:09:47 joergr * Added changeStatus parameter to all methods loading instances from the * database. * * Revision 1.72 2000/07/06 09:41:00 joergr * Added flag to loadPrintPreview() method allowing to choose how to interpret * the presentation LUT (hardcopy or softcopy definition). * * Revision 1.71 2000/07/04 15:58:00 joergr * Added support for overriding the presentation LUT settings made for the * image boxes. * * Revision 1.70 2000/06/21 15:40:57 meichel * Added DICOMscope support for calling the Presentation State Checker. * * Revision 1.69 2000/06/09 10:13:54 joergr * Added method to get number of presentation states referencing an image * (specified by the three UIDs). * * Revision 1.68 2000/06/08 17:36:23 joergr * Added method convertODtoLum(). * * Revision 1.67 2000/06/07 14:15:52 joergr * Added configuration file entry "LogLevel" to filter log messages. * Added flag to constructor specifying whether the general log file should be * used (default: off). * * Revision 1.66 2000/06/05 16:21:30 joergr * Implemented log message methods. * Added method allowing to specify the current presentation state to be used * for resetting the pstate. * * Revision 1.65 2000/06/02 16:00:41 meichel * Adapted all dcmpstat classes to use OFConsole for log and error output * * Revision 1.64 2000/06/02 13:53:53 joergr * Implemented start/terminatePrintServer methods. * * Revision 1.63 2000/06/02 12:41:50 joergr * Corrected wrong interface descriptions. * * Revision 1.62 2000/05/31 12:56:37 meichel * Added initial Print SCP support * * Revision 1.61 2000/05/31 07:54:23 joergr * Added support for Stored Print attributes Originator and Destination * application entity title. * * Revision 1.60 2000/05/30 13:36:45 joergr * Added new private SOP class (UID definition) to allow external shutdown * of console applications via negotiation of this special SOP class * (currently used for imagectn and dcmpsrcv). * Renamed GrayscaleHardcopy to HardcopyGrayscale (which is the correct term * according to the DICOM standard). * Added support for multi-frame images and multiple references from a single * presentation to a number of images. * Removed methods which were already marked as "retired". * Added interface methods to support the following new features: * - start/terminate query/retrieve server * - load stored print objects * - create print preview from hardcopy grayscale images * - check DICOM IODs for correctness (not yet implemented) * - set presentation LUT for film session (not yet implemented) * - start/terminate print server (not yet implemented) * - write/filter log messages (not yet implemented) * * Revision 1.59 2000/03/08 16:28:47 meichel * Updated copyright header. * * Revision 1.58 2000/03/03 14:13:54 meichel * Implemented library support for redirecting error messages into memory * instead of printing them to stdout/stderr for GUI applications. * * Revision 1.57 1999/11/03 13:05:31 meichel * Added support for transmitting annotations in the film session label. * Added support for dump tool launched from DVInterface. * * Revision 1.56 1999/10/20 10:47:13 joergr * Added support for a down-scaled preview image of the current DICOM image * (e.g. useful for online-windowing or print preview). * * Revision 1.55 1999/10/19 14:46:01 meichel * added support for the Basic Annotation Box SOP Class * as well as access methods for Max Density and Min Density. * * Revision 1.54 1999/10/07 17:21:45 meichel * Reworked management of Presentation LUTs in order to create tighter * coupling between Softcopy and Print. * * Revision 1.53 1999/09/27 10:41:52 meichel * Print interface now copies current printer name, avoids JNI problems. * * Revision 1.52 1999/09/24 15:24:28 meichel * Added support for CP 173 (Presentation LUT clarifications) * * Revision 1.51 1999/09/23 17:37:12 meichel * Added support for Basic Film Session options to dcmpstat print code. * * Revision 1.50 1999/09/17 14:33:55 meichel * Completed print spool functionality including Supplement 22 support * * Revision 1.49 1999/09/15 17:43:25 meichel * Implemented print job dispatcher code for dcmpstat, adapted dcmprtsv * and dcmpsprt applications. * * Revision 1.48 1999/09/13 15:19:08 meichel * Added implementations for a number of further print API methods. * * Revision 1.47 1999/09/10 12:46:44 meichel * Added implementations for a number of print API methods. * * Revision 1.46 1999/09/10 09:37:29 joergr * Re-added automatically removed method declarations (maybe a problem with * CVS's merge algorithm). * * Revision 1.43 1999/09/08 17:03:01 joergr * Added support for new instance types in database (grayscale hardcopy and * stored print). * * Revision 1.42 1999/09/08 16:42:01 meichel * Moved configuration file evaluation to separate class. * * Revision 1.41 1999/09/01 16:14:39 meichel * Added support for requested image size to print routines * * Revision 1.40 1999/08/31 16:54:44 meichel * Added new sample application that allows to create simple print jobs. * * Revision 1.39 1999/08/31 14:02:05 meichel * Added print related config file methods * * Revision 1.38 1999/08/27 15:57:55 meichel * Added methods for saving hardcopy images and stored print objects * either in file or in the local database. * * Revision 1.37 1999/08/25 16:47:20 joergr * Moved method 'saveFileFormat()' to public part of the interface class. * * Revision 1.36 1999/05/05 14:25:26 joergr * Added optional parameter to method loadPState (from database) to change * instance reviewed flag for pstate and image. * * Revision 1.35 1999/04/29 15:25:37 joergr * Added PresentationLabel to index file. * * Revision 1.34 1999/04/27 11:23:16 joergr * Enhanced savePState() method: now image file is also added to index file * and stored in image directory (if not already there). * Added new entry to index file: Presentation Description. * * Revision 1.33 1999/03/03 13:24:32 joergr * Added methods to get and set ambient light value (re: Barten transformation). * Moved method 'isBartenTransformPossible()' from presentation state class to * interface class. * * Revision 1.32 1999/03/02 12:52:51 joergr * Added parameter to selectPState() specifying whether to change the review * status of the loaded presentation state. * * Revision 1.31 1999/02/25 18:38:58 joergr * Added some comments. * Renamed methods enable/disablePState(). * * Revision 1.30 1999/02/24 20:17:48 joergr * Added methods to get a list of presentation states referencing the * currently selected image. * Added support for exchanging current presentation state (load from file) * without deleting the current image. * * Revision 1.29 1999/02/22 14:20:20 joergr * Added deletion of image files (depending on directory where the file is * stored). * Modified comments for getGUIConfig... methods to indicate that the * specified key must be upper case. * Reset reference time for file modification checking after the index file * has been changed internally (delete and change status methods). * * Revision 1.28 1999/02/19 18:58:11 joergr * Added methods to disable and (re-)enable PresentationStates. * Added (private) helper methods to reduce redundant lines of code. * * Revision 1.27 1999/02/19 09:44:17 joergr * Added comments to new database routines and related member variables. * * Revision 1.26 1999/02/18 18:46:19 joergr * Re-implemented methods to access index file (delete methods are still * missing). * Removed parameter 'deletefile' from delete methods. This parameter is * not necessary because the decision whether a images file is deleted only * depends on the directory where the file is stored (see comments). * * Revision 1.25 1999/02/18 11:07:26 meichel * Added new parameter explicitVR to interface methods savePState, * saveDICOMImage. Allows to choose between explicit VR and implicit VR * little endian format. Added new method saveCurrentImage that allows to * save the current image to file. * * Revision 1.24 1999/02/17 10:05:30 meichel * Moved creation of Display Function object from DVPresentationState to * DVInterface to avoid unnecessary re-reads. * * Revision 1.23 1999/02/16 16:36:10 meichel * Added method newInstancesReceived() to DVInterface class. * * Revision 1.22 1999/02/12 10:02:46 vorwerk * added cache , changed deletemethods. * * Revision 1.21 1999/02/09 15:58:07 meichel * Implemented methods that save images and presentation states in the DB. * * Revision 1.20 1999/02/08 10:52:33 meichel * Updated documentation of dviface.h in Doc++ style. * Removed dummy parameter from constructor. * * Revision 1.19 1999/02/05 17:45:35 meichel * Added config file entry for monitor characteristics file. Monitor charac- * teristics are passed to dcmimage if present to activate Barten transform. * * Revision 1.18 1999/02/05 11:38:01 vorwerk * parameter in stripidxarray added. * * Revision 1.17 1999/01/29 16:01:05 meichel * Reworked index file handle acquisition and locking code. * * Revision 1.16 1999/01/28 15:30:53 vorwerk * New database lock method added. * * Revision 1.15 1999/01/27 15:28:34 vorwerk * new method idxfiletest added to handle with indexfiles of length zero. * * Revision 1.14 1999/01/27 14:59:28 meichel * Implemented DICOM network receive application "dcmpsrcv" which receives * images and presentation states and stores them in the local database. * * Revision 1.13 1999/01/25 18:18:23 meichel * Defined private SOP class UID for network receiver * shutdown function. Cleanup up some code. * * Revision 1.12 1999/01/25 16:55:17 vorwerk * function stripidxarray added. * * Revision 1.11 1999/01/25 13:05:55 meichel * Implemented DVInterface::startReceiver() * and several config file related methods. * * Revision 1.10 1999/01/20 19:25:25 meichel * Implemented sendIOD method which creates a separate process for trans- * mitting images from the local database to a remote communication peer. * * Revision 1.9 1999/01/19 15:14:48 vorwerk * Methods for acesseing additional attributes added. * * Revision 1.8 1999/01/15 17:27:14 meichel * added DVInterface method resetPresentationState() which allows to reset a * presentation state to the initial state (after loading). * * Revision 1.7 1999/01/14 17:50:30 meichel * added new method saveDICOMImage() to class DVInterface. * Allows to store a bitmap as a DICOM image. * * Revision 1.6 1999/01/04 13:27:16 vorwerk * line inserted * * Revision 1.5 1999/01/04 13:02:26 vorwerk * getSeriesPerformingPhysicainsName() changed in getSeriesPerformingPhysiciansName() * * Revision 1.4 1998/12/22 17:57:03 meichel * Implemented Presentation State interface for overlays, * VOI LUTs, VOI windows, curves. Added test program that * allows to add curve data to DICOM images. * * Revision 1.3 1998/12/22 15:50:06 vorwerk * - constructor now with parameter for directory of index.dat * - changed const methods in non-const-methods * - added methods for attributes of DICOM-documents * - added private method for operations on index.dat * * Revision 1.2 1998/11/30 11:26:59 joergr * Added CVS/RCS log at end of file. * * */ dcmtk-3.6.0/dcmpstat/include/dcmtk/dcmpstat/dvpsov.h0000644000310500011400000001607411455601264021730 0ustar joergrdicom3/* * * Copyright (C) 1998-2010, 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: DVPSOverlay * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:16:36 $ * CVS/RCS Revision: $Revision: 1.13 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DVPSOV_H #define DVPSOV_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dctk.h" class DicomImage; /** an overlay contained in a presentation state (internal use only). * This class manages the data structures comprising a single overlay * (one instance of the Overlay Plane Module repeating elements) * that is contained in a Presentation State object. */ class DVPSOverlay { public: /// default constructor DVPSOverlay(); /// copy constructor DVPSOverlay(const DVPSOverlay& copy); /** clone method. * @return a pointer to a new DVPSOverlay object containing * a copy of this object. */ DVPSOverlay *clone() const { return new DVPSOverlay(*this); } /// destructor virtual ~DVPSOverlay(); /** reads the specified overlay group from a DICOM dataset. * The DICOM elements of the Overlay Plane module are copied * from the dataset to this object. The OverlayData element, which is * optional in the Overlay Plane Module but required for presentation states, * must be present. * The completeness of the overlay plane (presence of all required elements, * value multiplicity) is checked. * If this method returns an error code, the object is in undefined state afterwards. * @param dset the DICOM dataset from which the overlay is to be read * @param ovGroup the lower byte of the overlay group to be read * @param asGroup the lower byte of the overlay group to be assigned to the * overlay plane in the presentation state. Default: identical to ovGroup. * @return EC_Normal if successful, an error code otherwise. */ OFCondition read(DcmItem &dset, Uint8 ovGroup, Uint8 asGroup=0xFF); /** writes the overlay plane managed by this object to a DICOM dataset. * Copies of the DICOM element managed by this object are inserted into * the DICOM dataset. * @param dset the DICOM dataset to which the overlay is written * @return EC_Normal if successful, an error code otherwise. */ OFCondition write(DcmItem &dset); /** get group number of overlay repeating group managed by this object. * @return the lower byte of the overlay group */ Uint8 getOverlayGroup() const { return overlayGroup; } /** sets the group number for the overlay repeating group managed * by this object. * @param newGroup lower byte of the repeating group number. */ void setOverlayGroup(Uint8 newGroup) { overlayGroup = newGroup; } /** checks if the overlay is suitable as a bitmap shutter * for an image with the given image size. Checks overlay type, * origin and size. * @param x image width in pixels * @param y image height in pixels * @return OFTrue if the specified overlay group matches the image size. */ OFBool isSuitableAsShutter(unsigned long x, unsigned long y); /** gets the overlay label if present. * If the label string is absent, this method returns NULL. * @return overlay label */ const char *getOverlayLabel(); /** gets the overlay description if present. * If the label string is absent, this method returns NULL. * @return overlay description */ const char *getOverlayDescription(); /** checks whether this overlay is ROI type. * @return OFTrue if overlay is ROI, OFFalse if overlay is Graphic. */ OFBool isROI(); /** retrieve origin and size values for this overlay * @param originX horizontal origin returned in this parameter * @param originY vertical origin returned in this parameter * @param sizeX horizontal size returned in this parameter * @param sizeY vertical size returned in this parameter * @return EC_Normal if successful, an error code otherwise */ OFCondition getValues( Sint16& originX, Sint16& originY, Uint16& sizeX, Uint16& sizeY); /// return reference to overlay data DcmOverlayData& getData() { return overlayData; } /// return reference to overlay label DcmLongString& getLabel() { return overlayLabel; } /// return reference to overlay description DcmLongString& getDescription() { return overlayDescription; } private: /// private undefined assignment operator DVPSOverlay& operator=(const DVPSOverlay&); /// lower byte of the overlay repeating group managed by this object Uint8 overlayGroup; /// VR=US, VM=1, Type=1 DcmUnsignedShort overlayRows; /// VR=US, VM=1, Type=1 DcmUnsignedShort overlayColumns; /// VR=CS, VM=1, Type=1 DcmCodeString overlayType; /// VR=SS, VM=2, Type=1 DcmSignedShort overlayOrigin; /// VR=US, VM=1, Type=1 DcmUnsignedShort overlayBitsAllocated; /// VR=US, VM=1, Type=1 DcmUnsignedShort overlayBitPosition; /// VR=OW, VM=1, Type=1C DcmOverlayData overlayData; /// VR=LO, VM=1, Type=3 DcmLongString overlayDescription; /// VR=LO, VM=1, Type=3 DcmLongString overlayLabel; }; #endif /* * $Log: dvpsov.h,v $ * Revision 1.13 2010-10-14 13:16:36 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.12 2010-10-07 14:31:36 joergr * Removed leading underscore characters from preprocessor symbols (reserved). * * Revision 1.11 2009-11-24 14:12:57 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.10 2005-12-08 16:03:53 meichel * Changed include path schema for all DCMTK header files * * Revision 1.9 2003/08/27 14:59:41 meichel * Changed API of class DVPSOverlay to avoid dependency on module dcmimgle * * Revision 1.8 2001/09/26 15:36:13 meichel * Adapted dcmpstat to class OFCondition * * Revision 1.7 2001/06/01 15:50:18 meichel * Updated copyright header * * Revision 1.6 2000/06/02 16:00:48 meichel * Adapted all dcmpstat classes to use OFConsole for log and error output * * Revision 1.5 2000/03/08 16:28:53 meichel * Updated copyright header. * * Revision 1.4 1999/02/09 15:58:56 meichel * Implemented bitmap shutter activation amd method for * exchanging graphic layers. * * Revision 1.3 1998/12/22 17:57:06 meichel * Implemented Presentation State interface for overlays, * VOI LUTs, VOI windows, curves. Added test program that * allows to add curve data to DICOM images. * * Revision 1.2 1998/12/14 16:10:31 meichel * Implemented Presentation State interface for graphic layers, * text and graphic annotations, presentation LUTs. * * Revision 1.1 1998/11/27 14:50:30 meichel * Initial Release. * * */ dcmtk-3.6.0/dcmpstat/include/dcmtk/dcmpstat/dvpscu.h0000644000310500011400000001246611455601264021714 0ustar joergrdicom3/* * * Copyright (C) 1998-2010, 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: DVPSCurve * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:16:36 $ * CVS/RCS Revision: $Revision: 1.9 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DVPSCU_H #define DVPSCU_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmpstat/dvpstyp.h" #include "dcmtk/ofstd/ofstring.h" #include "dcmtk/dcmdata/dctypes.h" #include "dcmtk/dcmdata/dcerror.h" class DcmItem; /** the representation of one Curve in a DICOM image. */ class DVPSCurve { public: /// default constructor DVPSCurve(); /// copy constructor DVPSCurve(const DVPSCurve& copy); /** clone method. * @return a pointer to a new DVPSCurve object containing * a copy of this object. */ DVPSCurve *clone() { return new DVPSCurve(*this); } /// destructor virtual ~DVPSCurve(); /** reads a curve from a DICOM dataset. * The DICOM elements of the Graphic Object item are copied * from the dataset to this object. * The completeness of the curve (presence of all required elements, * value multiplicity) is checked. * If this method returns an error code, the object is in undefined state afterwards. * @param dset the DICOM dataset from which the data is to be read * @param group lower byte of the curve repeating group to be read * @return EC_Normal if successful, an error code otherwise. */ OFCondition read(DcmItem &dset, Uint8 group); /** get group number of curve repeating group managed by this object. * @return the lower byte of the curve group */ Uint8 getCurveGroup() { return curveGroup; } /** gets the number of points in the curve. * @return number of points */ size_t getNumberOfPoints() { return numberOfPoints; } /** gets the type of data in the curve (ROI or POLY). * @return type of data in curve */ DVPSCurveType getTypeOfData() { return typeOfData; } /** gets one point from the curve data. * @param idx index of the curve point, must be < getNumberOfPoints(); * @param x upon success the x value of the point is returned in this parameter * @param y upon success the y value of the point is returned in this parameter * @return EC_Normal if successful, an error code otherwise. */ OFCondition getPoint(size_t idx, double& x, double& y); /** gets the curve description string if present. * If the description string is absent, this method returns NULL or an empty string. * @return curve description */ const char *getCurveDescription() { return curveDescription.c_str(); } /** gets the curve label string if present. * If the label string is absent, this method returns NULL or an empty string. * @return curve label */ const char *getCurveLabel() { return curveLabel.c_str(); } /** gets the curve axis units string for the X dimension if present. * If the string is absent, this method returns NULL or an empty string. * @return curve description */ const char *getCurveAxisUnitsX() { return axisUnitsX.c_str(); } /** gets the curve axis units string for the Y dimension if present. * If the string is absent, this method returns NULL or an empty string. * @return curve description */ const char *getCurveAxisUnitsY() { return axisUnitsY.c_str(); } private: /// private undefined assignment operator DVPSCurve& operator=(const DVPSCurve&); /// lower byte of the curve repeating group managed by this object Uint8 curveGroup; /// number of points in curve data size_t numberOfPoints; /// type of curve data DVPSCurveType typeOfData; /// curve data, converted to double double *curveData; /// curve data description if present OFString curveDescription; /// curve label if present OFString curveLabel; /// axis units X if present OFString axisUnitsX; /// axis units Y if present OFString axisUnitsY; }; #endif /* * $Log: dvpscu.h,v $ * Revision 1.9 2010-10-14 13:16:36 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.8 2010-10-07 14:31:35 joergr * Removed leading underscore characters from preprocessor symbols (reserved). * * Revision 1.7 2009-11-24 14:12:57 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.6 2005-12-08 16:03:37 meichel * Changed include path schema for all DCMTK header files * * Revision 1.5 2001/09/26 15:36:09 meichel * Adapted dcmpstat to class OFCondition * * Revision 1.4 2001/06/01 15:50:13 meichel * Updated copyright header * * Revision 1.3 2000/06/02 16:00:44 meichel * Adapted all dcmpstat classes to use OFConsole for log and error output * * Revision 1.2 2000/03/08 16:28:50 meichel * Updated copyright header. * * Revision 1.1 1998/12/22 17:57:04 meichel * Implemented Presentation State interface for overlays, * VOI LUTs, VOI windows, curves. Added test program that * allows to add curve data to DICOM images. * * */ dcmtk-3.6.0/dcmpstat/include/dcmtk/dcmpstat/dvpsgrl.h0000644000310500011400000001202511455601264022060 0ustar joergrdicom3/* * * Copyright (C) 1998-2010, 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: DVPSGraphicObject_PList * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:16:36 $ * CVS/RCS Revision: $Revision: 1.12 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DVPSGRL_H #define DVPSGRL_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcitem.h" class DVPSGraphicObject; /** the list of graphic objects contained in a presentation state (internal use only). * This class manages the data structures comprising one complete * Graphic Object Sequence which is contained in one item * of the Graphic Annotation Sequence in a Presentation State object. */ class DVPSGraphicObject_PList { public: /// default constructor DVPSGraphicObject_PList(); /// copy constructor DVPSGraphicObject_PList(const DVPSGraphicObject_PList& copy); /** clone method. * @return a pointer to a new DVPSGraphicObject_PList object containing * a deep copy of this object. */ DVPSGraphicObject_PList *clone() { return new DVPSGraphicObject_PList(*this); } /// destructor virtual ~DVPSGraphicObject_PList(); /** reads a list of graphic objects from a DICOM dataset. * The DICOM elements of the Graphic Object Sequence are copied * from the dataset to this object. * The completeness of the item (presence of all required elements, * value multiplicity) is checked. * If this method returns an error code, the object is in undefined state afterwards. * @param dset the dataset from which the GraphicObjectSequence is to be read * @return EC_Normal if successful, an error code otherwise. */ OFCondition read(DcmItem &dset); /** writes the list of graphic objects managed by this object to a DICOM dataset. * Copies of the DICOM elements managed by this object are inserted into * the DICOM dataset. * @param dset the dataset to which the GraphicObjectSequence is written * @return EC_Normal if successful, an error code otherwise. */ OFCondition write(DcmItem &dset); /** reset the object to initial state. * After this call, the object is in the same state as after * creation with the default constructor. */ void clear(); /** get number of graphic objects in this list. * @return the number of graphic objects. */ size_t size() const { return list_.size(); } /** returns a pointer to the graphic object with the given * index or NULL if it does not exist. * @param idx index, must be < size() * @return pointer to graphic object or NULL */ DVPSGraphicObject *getGraphicObject(size_t idx); /** adds the given graphic object to * the list of graphic objects managed by this object. * @param text graphic object to be inserted. */ void addGraphicObject(DVPSGraphicObject *graphic); /** returns a pointer to the graphic object with the given * index (or NULL if it does not exist) and removes it from the list. * @param idx index, must be < size() * @return pointer to graphic object or NULL */ DVPSGraphicObject *removeGraphicObject(size_t idx); private: /// private undefined assignment operator DVPSGraphicObject_PList& operator=(const DVPSGraphicObject_PList&); /** the list maintained by this object */ OFList list_; }; #endif /* * $Log: dvpsgrl.h,v $ * Revision 1.12 2010-10-14 13:16:36 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.11 2010-10-07 14:31:35 joergr * Removed leading underscore characters from preprocessor symbols (reserved). * * Revision 1.10 2009-11-24 14:12:57 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.9 2009-09-30 10:42:38 uli * Make dcmpstat's include headers self-sufficient by including all * needed headers directly and stop using dctk.h * * Revision 1.8 2005-12-08 16:03:48 meichel * Changed include path schema for all DCMTK header files * * Revision 1.7 2003/06/04 10:18:06 meichel * Replaced private inheritance from template with aggregation * * Revision 1.6 2001/09/26 15:36:12 meichel * Adapted dcmpstat to class OFCondition * * Revision 1.5 2001/06/01 15:50:17 meichel * Updated copyright header * * Revision 1.4 2000/06/02 16:00:47 meichel * Adapted all dcmpstat classes to use OFConsole for log and error output * * Revision 1.3 2000/03/08 16:28:52 meichel * Updated copyright header. * * Revision 1.2 1998/12/14 16:10:30 meichel * Implemented Presentation State interface for graphic layers, * text and graphic annotations, presentation LUTs. * * Revision 1.1 1998/11/27 14:50:29 meichel * Initial Release. * * */ dcmtk-3.6.0/dcmpstat/include/dcmtk/dcmpstat/dvpsgr.h0000644000310500011400000001326611455601264021714 0ustar joergrdicom3/* * * Copyright (C) 1998-2010, 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: DVPSGraphicObject * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:16:36 $ * CVS/RCS Revision: $Revision: 1.10 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DVPSGR_H #define DVPSGR_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dctk.h" #include "dcmtk/dcmpstat/dvpstyp.h" /** an item of the graphic object sequence in a presentation state (internal use only). * This class manages the data structures comprising one item * of the Graphic Object Sequence which is contained * in the Graphic Annotation Sequence in a Presentation State object. */ class DVPSGraphicObject { public: /// default constructor DVPSGraphicObject(); /// copy constructor DVPSGraphicObject(const DVPSGraphicObject& copy); /** clone method. * @return a pointer to a new DVPSGraphicObject object containing * a copy of this object. */ DVPSGraphicObject *clone() { return new DVPSGraphicObject(*this); } /// destructor virtual ~DVPSGraphicObject(); /** reads a graphic object from a DICOM dataset. * The DICOM elements of the Graphic Object item are copied * from the dataset to this object. * The completeness of the item (presence of all required elements, * value multiplicity) is checked. * If this method returns an error code, the object is in undefined state afterwards. * @param dset the item of the GraphicObjectSequence from which the data is to be read * @return EC_Normal if successful, an error code otherwise. */ OFCondition read(DcmItem &dset); /** writes the graphic object managed by this object to a DICOM dataset. * Copies of the DICOM element managed by this object are inserted into * the DICOM dataset. * @param dset the the item of the GraphicObjectSequence to which the data is written * @return EC_Normal if successful, an error code otherwise. */ OFCondition write(DcmItem &dset); /** gets the graphic annotation units. * @return annotation units */ DVPSannotationUnit getAnnotationUnits(); /** gets the number of graphic points. * @return number of graphic points */ size_t getNumberOfPoints(); /** gets one point from the graphic data. * @param idx index of the graphic point, must be < getNumberOfPoints(); * @param x upon success the x value of the point is returned in this parameter * @param y upon success the y value of the point is returned in this parameter * @return EC_Normal if successful, an error code otherwise. */ OFCondition getPoint(size_t idx, Float32& x, Float32& y); /** gets the graphic type of this graphic object. * @return graphic type */ DVPSGraphicType getGraphicType(); /** checks if the graphic is filled * @return OFTrue if graphic is filled. */ OFBool isFilled(); /** sets the graphic data for this graphic object. * @param number number of graphic points in parameter "data" * @param data pointer to an array of Float32 values with a size of (at least) * 2*number. The values are copied into the graphic object. * @param unit the graphic annotation units for this data. * @return EC_Normal if successful, an error code otherwise. */ OFCondition setData(size_t number, const Float32 *data, DVPSannotationUnit unit); /** sets the graphic type for the graphic object * @param gtype the graphic type * @return EC_Normal if successful, an error code otherwise. */ OFCondition setGraphicType(DVPSGraphicType gtype); /** sets the graphic filled status for the graphic object * @param isFilled OFTrue if graphic is filled, OFFalse otherwise. * @return EC_Normal if successful, an error code otherwise. */ OFCondition setFilled(OFBool filled); private: /// private undefined assignment operator DVPSGraphicObject& operator=(const DVPSGraphicObject&); /// VR=CS, VM=1, Type 1 DcmCodeString graphicAnnotationUnits; /// VR=US, VM=1, Type 1 DcmUnsignedShort numberOfGraphicPoints; /// VR=FL, VM=2-n, Type 1 DcmFloatingPointSingle graphicData; /// VR=CS, VM=1, Type 1 DcmCodeString graphicType; /// VR=CS, VM=1, Type 1c DcmCodeString graphicFilled; }; #endif /* * $Log: dvpsgr.h,v $ * Revision 1.10 2010-10-14 13:16:36 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.9 2010-10-07 14:31:35 joergr * Removed leading underscore characters from preprocessor symbols (reserved). * * Revision 1.8 2009-11-24 14:12:57 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.7 2005-12-08 16:03:47 meichel * Changed include path schema for all DCMTK header files * * Revision 1.6 2001/09/26 15:36:11 meichel * Adapted dcmpstat to class OFCondition * * Revision 1.5 2001/06/01 15:50:16 meichel * Updated copyright header * * Revision 1.4 2000/06/02 16:00:47 meichel * Adapted all dcmpstat classes to use OFConsole for log and error output * * Revision 1.3 2000/03/08 16:28:52 meichel * Updated copyright header. * * Revision 1.2 1998/12/14 16:10:30 meichel * Implemented Presentation State interface for graphic layers, * text and graphic annotations, presentation LUTs. * * Revision 1.1 1998/11/27 14:50:28 meichel * Initial Release. * * */ dcmtk-3.6.0/dcmpstat/include/dcmtk/dcmpstat/dvpsovl.h0000644000310500011400000001521411455601264022077 0ustar joergrdicom3/* * * Copyright (C) 1998-2010, 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: DVPSOverlay_PList * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:16:36 $ * CVS/RCS Revision: $Revision: 1.14 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DVPSOVL_H #define DVPSOVL_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcitem.h" class DVPSOverlay; /** the list of overlays contained in a presentation state (internal use only). * This class manages the data structures comprising the list of overlays * (all instances of the Overlay Plane Module repeating elements) * contained in a Presentation State object. */ class DVPSOverlay_PList { public: /// default constructor DVPSOverlay_PList(); /// copy constructor DVPSOverlay_PList(const DVPSOverlay_PList& copy); /** clone method. * @return a pointer to a new DVPSOverlay_PList object containing * a deep copy of this object. */ DVPSOverlay_PList *clone() { return new DVPSOverlay_PList(*this); } /// destructor virtual ~DVPSOverlay_PList(); /** reads all overlay groups from a DICOM dataset. * This method checks which overlays are contained in the DICOM dataset. * All overlays that contain the OverlayData element are copied * into the "list of overlays" structure managed by this object. * The completeness of the overlays (presence of all required elements, * value multiplicity) is checked. * If this method returns an error code, the object is in undefined state afterwards. * @param dset the DICOM dataset from which the overlays are read * @return EC_Normal if successful, an error code otherwise. */ OFCondition read(DcmItem &dset); /** writes the overlays managed by this object to a DICOM dataset. * Copies of the DICOM elements managed by this object are inserted into * the DICOM dataset. * @param dset the DICOM dataset to which the overlays are written * @return EC_Normal if successful, an error code otherwise. */ OFCondition write(DcmItem &dset); /** reset the object to initial state. * After this call, the object is in the same state as after * creation with the default constructor. */ void clear(); /** check presence of overlay group * @param group overlay repeating group to be checked * @return OFTrue if the specified overlay group is present in the * list of overlays managed by this object. */ OFBool haveOverlayGroup(Uint16 group); /** gets the number of overlays in managed by this object. * @return number of overlays in this list. */ size_t size() const { return list_.size(); } /** gets the overlay object with the given index. * @param idx index of the overlay, must be < size(). * @return pointer to overlay object or NULL. */ DVPSOverlay *getOverlay(size_t idx); /** removes the overlay object with the given index. * @param idx index of the overlay, must be < size(). * @return EC_Normal upon success, an error code otherwise */ OFCondition removeOverlay(size_t idx); /** changes the repeating group used for an overlay. * @param idx index of the overlay, must be < size(). * @param newGroup new repeating group number 0x6000-0x601F (even) * @return EC_Normal upon success, an error code otherwise. */ OFCondition changeOverlayGroup(size_t idx, Uint16 newGroup); /** adds a new overlay bitmap. * The overlay is read from a DICOM dataset which must contain the * attributes required for a graphic or ROI overlay, see class DVPSOverlay. * The dataset can be an image or standalone overlay IOD. * The overlay data is copied into the presentation state, i.e. the DICOM dataset * can be deleted after execution of this method. * @param overlayIOD the DICOM dataset from which the overlay is to be read * @groupInItem the repeating group 0x6000..0x61F (even) of the overlay to be read * @param newGroup repeating group number 0x6000-0x601F (even) to be used for * the overlay in the presentation state. * @return EC_Normal upon success, an error code otherwise. */ OFCondition addOverlay(DcmItem& overlayIOD, Uint16 groupInItem, Uint16 newGroup); /** get overlay by group * @param group overlay repeating group to be checked * @return a pointer to the matching DVPSOverlay object if found, * NULL otherwise. */ DVPSOverlay *getOverlayGroup(Uint16 group); private: /// private undefined assignment operator DVPSOverlay_PList& operator=(const DVPSOverlay_PList&); /** the list maintained by this object */ OFList list_; }; #endif /* * $Log: dvpsovl.h,v $ * Revision 1.14 2010-10-14 13:16:36 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.13 2010-10-07 14:31:36 joergr * Removed leading underscore characters from preprocessor symbols (reserved). * * Revision 1.12 2009-11-24 14:12:57 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.11 2009-09-30 10:42:38 uli * Make dcmpstat's include headers self-sufficient by including all * needed headers directly and stop using dctk.h * * Revision 1.10 2005-12-08 16:03:54 meichel * Changed include path schema for all DCMTK header files * * Revision 1.9 2003/06/04 10:18:06 meichel * Replaced private inheritance from template with aggregation * * Revision 1.8 2001/09/26 15:36:13 meichel * Adapted dcmpstat to class OFCondition * * Revision 1.7 2001/06/01 15:50:19 meichel * Updated copyright header * * Revision 1.6 2000/06/02 16:00:49 meichel * Adapted all dcmpstat classes to use OFConsole for log and error output * * Revision 1.5 2000/03/08 16:28:54 meichel * Updated copyright header. * * Revision 1.4 2000/03/06 18:23:15 joergr * Added const type specifier to derived method (reported by Sun CC 4.2). * * Revision 1.3 1998/12/22 17:57:06 meichel * Implemented Presentation State interface for overlays, * VOI LUTs, VOI windows, curves. Added test program that * allows to add curve data to DICOM images. * * Revision 1.2 1998/12/14 16:10:31 meichel * Implemented Presentation State interface for graphic layers, * text and graphic annotations, presentation LUTs. * * Revision 1.1 1998/11/27 14:50:30 meichel * Initial Release. * * */ dcmtk-3.6.0/dcmpstat/include/dcmtk/dcmpstat/dvpsibl.h0000644000310500011400000004670011455601264022051 0ustar joergrdicom3/* * * Copyright (C) 1998-2010, 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: DVPSImageBoxContent_PList * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:16:36 $ * CVS/RCS Revision: $Revision: 1.28 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DVPSIBL_H #define DVPSIBL_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcitem.h" #include "dcmtk/dcmpstat/dvpstyp.h" /* for enum types */ #include "dcmtk/dcmdata/dcvrui.h" class DVPSImageBoxContent; class DVPSPresentationLUT_PList; /** the list of Image Boxes contained in a stored print object. * This class manages the data structures comprising one complete * Image Box Content Sequence in a Stored Print object. */ class DVPSImageBoxContent_PList { public: /// default constructor DVPSImageBoxContent_PList(); /// copy constructor DVPSImageBoxContent_PList(const DVPSImageBoxContent_PList& copy); /** clone method. * @return a pointer to a new DVPSImageBoxContent_PList object containing * a deep copy of this object. */ DVPSImageBoxContent_PList *clone() { return new DVPSImageBoxContent_PList(*this); } /// destructor virtual ~DVPSImageBoxContent_PList(); /** reads a list of image boxes (ImageBoxContentSequence) from a DICOM dataset. * The DICOM elements of the image boxes are copied from the dataset to this object. * The completeness of all items (presence of all required elements, * value multiplicity) is checked. * If this method returns an error code, the object is in undefined state afterwards. * @param dset the DICOM dataset from which the sequence is to be read * @param presentationLUTList list of presentation LUTs which may be referenced * @return EC_Normal if successful, an error code otherwise. */ OFCondition read(DcmItem &dset, DVPSPresentationLUT_PList& presentationLUTList); /** writes the list of image boxes managed by this object to a DICOM dataset. * Copies of the DICOM element managed by this object are inserted into * the DICOM dataset. * @param dset the DICOM dataset to which the ImageBoxContentSequence is written * @param writeRequestedImageSize if false, the Requested Image Size attributes are not written, * e.g. because they are not supported by the target printer. * @param numItems the number of items (from the beginning of the list) to be written. * Default: all items are written. * @param ignoreEmptyImages if true, all image boxes without image box position are ignored * when writing. * @param writeReferencedPLUTSQ if false, the Referenced Presentation LUT Sequence is not written, * e.g. because a "general" presentation LUT is used instead of those referenced by the image boxes. * @return EC_Normal if successful, an error code otherwise. */ OFCondition write( DcmItem &dset, OFBool writeRequestedImageSize, size_t numItems, OFBool ignoreEmptyImages, OFBool writeReferencedPLUTSQ = OFTrue); /** reset the object to initial state. * After this call, the object is in the same state as after * creation with the default constructor. */ void clear(); /** gets the number of image boxes in this list. * @return the number of image boxes. */ size_t size() const { return list_.size(); } /** create default values for all missing type 1 elements. * Called before a stored print object is written. * @param renumber if true, new imageBoxPosition values are created * @param ignoreEmptyImages if true, an empty image box position does not cause an error. * @return EC_Normal if successful, an error code otherwise. */ OFCondition createDefaultValues(OFBool renumber, OFBool ignoreEmptyImages); /** adds all image SOP classes referenced in the image box list to * the given sequence. Duplicate entries are suppressed. * @param seq sequence to be added to, should be a PrintManagementCapabilitiesSequence. * @param numItems number of items of this list to be taken into account. * Default: all items. * @return EC_Normal if successful, an error code otherwise. */ OFCondition addImageSOPClasses(DcmSequenceOfItems& seq, size_t numItems=0); /** creates a new image box object and sets the content of this image box object. * @param instanceuid SOP instance UID of this image box * @param retrieveaetitle retrieve AETITLE of the referenced image * @param refstudyuid study instance UID of the referenced image * @param refseriesuid series instance UID of the referenced image * @param refsopclassuid SOP class UID of the referenced image * @param refsopinstanceuid SOP instance UID of the referenced image * @param requestedimagesize requested images size for this image, default: absent * @param patientid patient ID for the referenced image, default: absent * @return EC_Normal if successful, an error code otherwise. */ OFCondition addImageBox( const char *instanceuid, const char *retrieveaetitle, const char *refstudyuid, const char *refseriesuid, const char *refsopclassuid, const char *refsopinstanceuid, const char *requestedimagesize, const char *patientid, const char *presentationlutuid); /** adds the given image box object to the list managed by this object. * @param box image box object to be added. * @return EC_Normal if successful, an error code otherwise. */ OFCondition addImageBox(DVPSImageBoxContent *box); /** sets the (optional) requested decimate/crop behaviour * for all image boxes managed by this object. * @param value new enumerated value. The caller is responsible for * making sure that the selected printer supports decimate/crop * if a non-default value is set. * @return EC_Normal if successful, an error code otherwise. */ OFCondition setRequestedDecimateCropBehaviour(DVPSDecimateCropBehaviour value); /** deletes one of the registered images. * @param idx index, must be < size() * @return EC_Normal if successful, an error code otherwise. */ OFCondition deleteImage(size_t idx); /** deletes multiple of the registered images, starting with the first one. * @param number number of images to delete, must be <= size() * @return EC_Normal if successful, an error code otherwise. */ OFCondition deleteMultipleImages(size_t number); /** checks if one of the registered images has additional settings that are not * default values on the image box level. * @param idx index, must be < getNumberOfImages() * @return EC_Normal if successful, an error code otherwise. */ OFBool imageHasAdditionalSettings(size_t idx); /** sets the polarity for the given registered image box. * @param idx index, must be < getNumberOfImages() * @param value new attribute value (NORMAL or REVERSE), may be NULL. * @return EC_Normal if successful, an error code otherwise. */ OFCondition setImagePolarity(size_t idx, const char *value); /** sets the requested size for the given registered image box. * @param idx index, must be < getNumberOfImages() * @param value new attribute value, may be NULL. * @return EC_Normal if successful, an error code otherwise. */ OFCondition setImageRequestedSize(size_t idx, const char *value); /** sets the (optional) magnification type for the given registered image box. * @param idx index, must be < getNumberOfImages() * @param value new attribute value, may be NULL. * The caller is responsible for making sure * that the value is valid for the selected printer. * @return EC_Normal if successful, an error code otherwise. */ OFCondition setImageMagnificationType(size_t idx, const char *value); /** sets the (optional) smoothing type for the given registered image box. * @param idx index, must be < getNumberOfImages() * @param value new attribute value, may be NULL. * The caller is responsible for making sure * that the value is valid for the selected printer. * @return EC_Normal if successful, an error code otherwise. */ OFCondition setImageSmoothingType(size_t idx, const char *value); /** sets the (optional) configuration information for the given registered image box. * @param idx index, must be < getNumberOfImages() * @param value new attribute value, may be NULL. * The caller is responsible for making sure * that the value is valid for the selected printer. * @return EC_Normal if successful, an error code otherwise. */ OFCondition setImageConfigurationInformation(size_t idx, const char *value); /** sets the SOP instance UID for the given image box. * @param idx index, must be < getNumberOfImages() * @param value new attribute value, must not be NULL. * @return EC_Normal if successful, an error code otherwise. */ OFCondition setImageSOPInstanceUID(size_t idx, const char *value); /** sets magnification type, smoothing type and configuration information back to default * for all registered images. * @return EC_Normal if successful, an error code otherwise. */ OFCondition setAllImagesToDefault(); /** gets the polarity for the given registered image box. * @param idx index, must be < getNumberOfImages() * @return polarity, may be NULL. */ const char *getImagePolarity(size_t idx); /** gets the requested size for the given registered image box. * @param idx index, must be < getNumberOfImages() * @return requested size, may be NULL. */ const char *getImageRequestedSize(size_t idx); /** gets the (optional) magnification type for the given registered image box. * @param idx index, must be < getNumberOfImages() * @return magnification type, may be NULL. */ const char *getImageMagnificationType(size_t idx); /** gets the (optional) smoothing type for the given registered image box. * @param idx index, must be < getNumberOfImages() * @return smoothing type, may be NULL. */ const char *getImageSmoothingType(size_t idx); /** gets the (optional) configuration information for the given registered image box. * @param idx index, must be < getNumberOfImages() * @return configuration information, may be NULL. */ const char *getImageConfigurationInformation(size_t idx); /** gets the current SOP Instance UID for the given registered image box.. * @param idx index, must be < getNumberOfImages() * @return SOP Instance UID, may be NULL. */ const char *getSOPInstanceUID(size_t idx); /** gets the referenced Presentation LUT SOP Instance UID for the given registered image box.. * @param idx index, must be < getNumberOfImages() * @return SOP Instance UID, may be NULL. */ const char *getReferencedPresentationLUTInstanceUID(size_t idx); /** returns the image UIDs that are required to look up the referenced image in the database * @param idx index, must be < getNumberOfImages() * @param studyUID Study UID of the image * @param seriesUID series UID of the image * @param instanceUID instance UID of the image * @return EC_Normal if successful, an error code otherwise. */ OFCondition getImageReference(size_t idx, const char *&studyUID, const char *&seriesUID, const char *&instanceUID); /** writes the attributes managed by the referenced object that are part of a * basic grayscale image box N-SET request into the DICOM dataset. * Copies of the DICOM element managed by this object are inserted into * the DICOM dataset. * @param idx index, must be < getNumberOfImages() * @param dset the dataset to which the data is written * @return EC_Normal if successful, an error code otherwise. */ OFCondition prepareBasicImageBox(size_t idx, DcmItem &dset); /** checks whether the given SOP instance UID is used as * referenced Presentation LUT SOP Instance UID inside the list of * image boxes managed by this object. * @param uid name of UID * @return OFTrue if UID is used, OFFalse otherwise. */ OFBool presentationLUTInstanceUIDisUsed(const char *uid); /** if only one Presentation LUT is required to render all images * managed by this object, returns the UID of this presentation LUT. * Otherwise returns NULL. * @param filmBox UID of Presentation LUT specified on Film Box * level. May be NULL or empty string if absent. * @return UID of Presentation LUT if found, NULL or empty string otherwise. */ const char *haveSinglePresentationLUTUsed(const char *filmBox); /** creates a number of image boxes as part of a Print SCP N-CREATE operation. * The previous content of the list is deleted. * @param numBoxes number of boxes to be created * @param studyUID study instance UID under which Hardcopy Grayscale images will be saved * @param seriesUID series instance UID under which Hardcopy Grayscale images will be saved * @param aetitle retrieve AE title for Hardcopy Grayscale images * @return OFTrue if successful, OFFalse otherwise. */ OFBool printSCPCreate( unsigned long numBoxes, DcmUniqueIdentifier& studyUID, DcmUniqueIdentifier& seriesUID, const char *aetitle); /** writes a Referenced Image Box Sequence for the image boxes * managed by this object. Used in a Print SCP N-CREATE operation. * @param dset the dataset to which the data is written * @return EC_Normal if successful, an error code otherwise. */ OFCondition writeReferencedImageBoxSQ(DcmItem &dset); /** checks whether the given Presentation LUT type could be used together * with all image boxes in this list on a Print SCP that requires a matching * alignment between a Presentation LUT and the image pixel data. * @param align LUT alignment type * @return OFTrue if matching, OFFalse otherwise */ OFBool matchesPresentationLUT(DVPSPrintPresentationLUTAlignment align) const; /** looks up the image box with the given SOP instance UID in this list * and returns a pointer to a new object containing a copy of this * image box. If the object is not found, NULL is returned. * @param uid SOP instance UID of the image box to be looked up * @return pointer to copied image box object, may be NULL. */ DVPSImageBoxContent *duplicateImageBox(const char *uid); /** checks whether any of the image boxes managed by this list * has the same position as the given one, but a different * SOP instance UID. This is used during an Print SCP N-SET operation * to check whether a position clash exists. * @param uid SOP instance UID of the image box to be looked up * @param position image position to be looked up */ OFBool haveImagePositionClash(const char *uid, Uint16 position); /** adds the given image box object to this list. Any other object existing * in the list with the same SOP instance UID is removed. * Used during a Print SCP image box N-SET operation. * @param newImageBox new image box object to be added to the list. */ void replace(DVPSImageBoxContent *newImageBox); /** checks whether any of the image boxes has an image box position * assigned. If no image box position is assigned, the object list * cannot be written and a Print SCP should return a warning * status upon receipt of an N-ACTION request. * @return OFTrue if empty page (no image box position assigned), OFFalse otherwise. */ OFBool emptyPageWarning(); private: /** private undefined assignment operator */ DVPSImageBoxContent_PList& operator=(const DVPSImageBoxContent_PList&); /** returns a pointer to the image box with the given * index or NULL if it does not exist. * @param idx index, must be < size() * @return pointer to image box object or NULL */ DVPSImageBoxContent *getImageBox(size_t idx); /** the list maintained by this object */ OFList list_; }; #endif /* * $Log: dvpsibl.h,v $ * Revision 1.28 2010-10-14 13:16:36 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.27 2010-10-07 14:31:36 joergr * Removed leading underscore characters from preprocessor symbols (reserved). * * Revision 1.26 2010-03-01 09:08:49 uli * Removed some unnecessary include directives in the headers. * * Revision 1.25 2009-11-24 14:12:57 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.24 2009-09-30 10:42:38 uli * Make dcmpstat's include headers self-sufficient by including all * needed headers directly and stop using dctk.h * * Revision 1.23 2005-12-08 16:03:51 meichel * Changed include path schema for all DCMTK header files * * Revision 1.22 2003/06/04 10:18:06 meichel * Replaced private inheritance from template with aggregation * * Revision 1.21 2001/09/26 15:36:13 meichel * Adapted dcmpstat to class OFCondition * * Revision 1.20 2001/06/01 15:50:18 meichel * Updated copyright header * * Revision 1.19 2000/07/04 15:58:02 joergr * Added support for overriding the presentation LUT settings made for the * image boxes. * * Revision 1.18 2000/06/14 11:28:14 joergr * Added methods to access the attributes Polarity and Requested Image Size. * * Revision 1.17 2000/06/08 10:44:29 meichel * Implemented Referenced Presentation LUT Sequence on Basic Film Session level. * Empty film boxes (pages) are not written to file anymore. * * Revision 1.16 2000/06/07 14:17:41 joergr * Added methods to access the image polarity attribute. * * Revision 1.15 2000/06/02 16:00:48 meichel * Adapted all dcmpstat classes to use OFConsole for log and error output * * Revision 1.14 2000/05/31 12:56:39 meichel * Added initial Print SCP support * * Revision 1.13 2000/03/08 16:28:53 meichel * Updated copyright header. * * Revision 1.12 1999/10/19 14:46:03 meichel * added support for the Basic Annotation Box SOP Class * as well as access methods for Max Density and Min Density. * * Revision 1.11 1999/10/07 17:21:48 meichel * Reworked management of Presentation LUTs in order to create tighter * coupling between Softcopy and Print. * * Revision 1.10 1999/09/24 15:23:45 meichel * Print spooler (dcmprtsv) now logs diagnostic messages in log files * when operating in spool mode. * * Revision 1.9 1999/09/17 14:33:57 meichel * Completed print spool functionality including Supplement 22 support * * Revision 1.8 1999/09/15 17:43:28 meichel * Implemented print job dispatcher code for dcmpstat, adapted dcmprtsv * and dcmpsprt applications. * * Revision 1.7 1999/09/10 12:46:47 meichel * Added implementations for a number of print API methods. * * Revision 1.6 1999/09/09 14:57:33 thiel * Added methods for print spooler * * Revision 1.5 1999/09/01 16:14:40 meichel * Added support for requested image size to print routines * * Revision 1.4 1999/08/31 14:09:11 meichel * Added get/set methods for stored print attributes * * Revision 1.3 1999/08/27 15:57:56 meichel * Added methods for saving hardcopy images and stored print objects * either in file or in the local database. * * Revision 1.2 1999/08/26 09:30:59 thiel * Add extensions for the usage of the StoredPrint * * Revision 1.1 1999/07/30 13:34:48 meichel * Added new classes managing Stored Print objects * * */ dcmtk-3.6.0/dcmpstat/include/dcmtk/dcmpstat/dvpstxl.h0000644000310500011400000001166011455601265022110 0ustar joergrdicom3/* * * Copyright (C) 1998-2010, 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: DVPSTextObject_PList * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:16:37 $ * CVS/RCS Revision: $Revision: 1.12 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DVPSTXL_H #define DVPSTXL_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcitem.h" class DVPSTextObject; /** the list of text objects contained in a presentation state (internal use only). * This class manages the data structures comprising one complete * Text Object Sequence which is contained in one item * of the Graphic Annotation Sequence in a Presentation State object. */ class DVPSTextObject_PList { public: /// default constructor DVPSTextObject_PList(); /// copy constructor DVPSTextObject_PList(const DVPSTextObject_PList& copy); /** clone method. * @return a pointer to a new DVPSTextObject_PList object containing * a deep copy of this object. */ DVPSTextObject_PList *clone() { return new DVPSTextObject_PList(*this); } /// destructor virtual ~DVPSTextObject_PList(); /** reads a list of text objects from a DICOM dataset. * The DICOM elements of the Text Object Sequence are copied * from the dataset to this object. * The completeness of the item (presence of all required elements, * value multiplicity) is checked. * If this method returns an error code, the object is in undefined state afterwards. * @param dset the dataset from which the TextObjectSequence is to be read * @return EC_Normal if successful, an error code otherwise. */ OFCondition read(DcmItem &dset); /** writes the list of text objects managed by this object to a DICOM dataset. * Copies of the DICOM elements managed by this object are inserted into * the DICOM dataset. * @param dset the dataset to which the TextObjectSequence is written * @return EC_Normal if successful, an error code otherwise. */ OFCondition write(DcmItem &dset); /** reset the object to initial state. * After this call, the object is in the same state as after * creation with the default constructor. */ void clear(); /** get number of text objects in this list. * @return the number of text objects. */ size_t size() const { return list_.size(); } /** returns a pointer to the text object with the given * index or NULL if it does not exist. * @param idx index, must be < size() * @return pointer to text object or NULL */ DVPSTextObject *getTextObject(size_t idx); /** adds the given text object to * the list of text objects managed by this object. * @param text text object to be inserted. */ void addTextObject(DVPSTextObject *text); /** returns a pointer to the text object with the given * index (or NULL if it does not exist) and removes it from the list. * @param idx index, must be < size() * @return pointer to text object or NULL */ DVPSTextObject *removeTextObject(size_t idx); private: /** private undefined assignment operator */ DVPSTextObject_PList& operator=(const DVPSTextObject_PList&); /** the list maintained by this object */ OFList list_; }; #endif /* * $Log: dvpstxl.h,v $ * Revision 1.12 2010-10-14 13:16:37 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.11 2010-10-07 14:31:36 joergr * Removed leading underscore characters from preprocessor symbols (reserved). * * Revision 1.10 2009-11-24 14:12:58 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.9 2009-09-30 10:42:38 uli * Make dcmpstat's include headers self-sufficient by including all * needed headers directly and stop using dctk.h * * Revision 1.8 2005-12-08 16:04:09 meichel * Changed include path schema for all DCMTK header files * * Revision 1.7 2003/06/04 10:18:06 meichel * Replaced private inheritance from template with aggregation * * Revision 1.6 2001/09/26 15:36:18 meichel * Adapted dcmpstat to class OFCondition * * Revision 1.5 2001/06/01 15:50:24 meichel * Updated copyright header * * Revision 1.4 2000/06/02 16:00:54 meichel * Adapted all dcmpstat classes to use OFConsole for log and error output * * Revision 1.3 2000/03/08 16:28:58 meichel * Updated copyright header. * * Revision 1.2 1998/12/14 16:10:37 meichel * Implemented Presentation State interface for graphic layers, * text and graphic annotations, presentation LUTs. * * Revision 1.1 1998/11/27 14:50:35 meichel * Initial Release. * * */ dcmtk-3.6.0/dcmpstat/include/dcmtk/dcmpstat/dvpsril.h0000644000310500011400000002421711455601264022070 0ustar joergrdicom3/* * * Copyright (C) 1998-2010, 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: DVPSReferencedImage_PList * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:16:36 $ * CVS/RCS Revision: $Revision: 1.14 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DVPSRIL_H #define DVPSRIL_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcitem.h" #include "dcmtk/dcmpstat/dvpstyp.h" /* for enum types */ class DVPSReferencedImage; class DVPSReferencedSeries_PList; /** the list of referenced images contained in a presentation state (internal use only). * This class manages the data structures comprising one complete * Reference Image Sequence which is contained in one item * of the Referenced Series Sequence in a Presentation State object. */ class DVPSReferencedImage_PList { public: /// default constructor DVPSReferencedImage_PList(); /// copy constructor DVPSReferencedImage_PList(const DVPSReferencedImage_PList& copy); /** clone method. * @return a pointer to a new DVPSReferencedImage_PList object containing * a deep copy of this object. */ DVPSReferencedImage_PList *clone() { return new DVPSReferencedImage_PList(*this); } /// destructor virtual ~DVPSReferencedImage_PList(); /** reads a list of image references (ReferencedImageSequence) from a DICOM dataset. * The DICOM elements of the image references item are copied from the dataset to this object. * The completeness of all items (presence of all required elements, * value multiplicity) is checked. * If this method returns an error code, the object is in undefined state afterwards. * @param dset the DICOM dataset from which the sequence is to be read * @return EC_Normal if successful, an error code otherwise. */ OFCondition read(DcmItem &dset); /** writes the list of image references managed by this object to a DICOM dataset. * Copies of the DICOM element managed by this object are inserted into * the DICOM dataset. * @param dset the DICOM dataset to which the ReferencedImageSequence is written * @return EC_Normal if successful, an error code otherwise. */ OFCondition write(DcmItem &dset); /** reset the object to initial state. * After this call, the object is in the same state as after * creation with the default constructor. */ void clear(); /** checks if images are referenced within this ReferencedImageSequence * and whether all images share the same SOP class UID. * @param sopclassuid should be an empty string when called. * Returns the SOP class UID of the images in the list. * @return OFTrue if the sequence is valid (correct), OFFalse otherwise. */ OFBool isValid(OFString& sopclassuid); /** checks if an image reference with the given SOP instance UID exists * in this ReferencedImageSequence. * @param sopinstanceuid the SOP instance UID of the searched image reference * @return a pointer to the matching DVPSReferencedImage if found, NULL otherwise. */ DVPSReferencedImage *findImageReference(const char *sopinstanceuid); /** update the reference to the given image such that * the given frame is not referenced any more. * @param sopinstanceuid the SOP instance UID of the image reference * @param frame the frame reference * @param numberOfFrames the number of frames of the image reference */ void removeFrameReference(const char *sopinstanceuid, unsigned long frame, unsigned long numberOfFrames); /** checks if an image reference with the given SOP instance UID exists * in this ReferencedImageSequence and deletes it. * @param sopinstanceuid the SOP instance UID of the image reference to be removed. */ void removeImageReference(const char *sopinstanceuid); /** add a new image reference. * Checks if the referenced SOP instance UID already exists in this sequence. * If it exists, an error code is returned. Otherwise a new image reference * is created and added to the ReferencedImageSequence. * @param sopclassUID the SOP class UID of the image reference to be added. * @param instanceUID the SOP instance UID of the image reference to be added. * @param frames a list of frame numbers in DICOM IS format * (integer numbers separated by '\' characters). Default: frame numbers absent. * The frame numbers are required if the referenced image is a multiframe image. */ OFCondition addImageReference( const char *sopclassUID, const char *instanceUID, const char *frames=NULL); /** add a new image reference. * Checks if the referenced SOP instance UID already exists in this sequence. * If it exists, an error code is returned. Otherwise a new image reference * is created and added to the ReferencedImageSequence. * @param sopclassUID the SOP class UID of the image reference to be added. * @param instanceUID the SOP instance UID of the image reference to be added. * @param frame the frame number of the image reference (current image) to be added. * @param applicability the applicability of the image reference (DVPSB_currentFrame or DVPSB_currentImage) * @return EC_Normal if successful, an error code otherwise. */ OFCondition addImageReference( const char *sopclassUID, const char *instanceUID, unsigned long frame, DVPSObjectApplicability applicability); /** removes a reference to an image or frame. If the current reference is empty ("global"), an * explicit list of references is constructed from the list of series/instance references. * The image or frame reference is removed from the total list of references in this object. * If the only reference contained in this object is removed, the reference list becomes empty * which means that the current reference becomes "global". This case must be handled by the caller. * @param allReferences list of series/instance references registered for the presentation state. * @param instanceUID SOP instance UID of the current image * @param frame number of the current frame * @param numberOfFrames the number of frames of the current image * @param applicability the applicability of the image reference to be removed * (DVPSB_currentFrame or DVPSB_currentImage) */ void removeImageReference( DVPSReferencedSeries_PList& allReferences, const char *instanceUID, unsigned long frame, unsigned long numberOfFrames, DVPSObjectApplicability applicability); /** gets the number of image references in this list. * @return the number of image references. */ size_t size() const { return list_.size(); } /** gets an image reference with the given index. * @param idx index, must be < size(). * @param sopclassUID the SOP Class UID is returned in this string * @param instanceUID the SOP Instance UID is returned in this string * @param frames the list of frames is returned in this string * @return EC_Normal if successful, an error code otherwise. */ OFCondition getImageReference( size_t idx, OFString& sopclassUID, OFString& instanceUID, OFString& frames); /** checks if the object containing this list of image references * is applicable to the given image and frame. * @param instanceUID SOP instance UID of the current image * @param frame number of the current frame * @return OFTrue if applicable. */ OFBool isApplicable(const char *instanceUID, unsigned long frame); /** checks if the object containing this list of image references * matches exactly the applicability * defined by the instanceUID, frame and applicability parameters. * @param instanceUID SOP instance UID of the current image * @param frame number of the current frame * @return OFTrue if matching. */ OFBool matchesApplicability(const char *instanceUID, unsigned long frame, DVPSObjectApplicability applicability); private: /// private undefined assignment operator DVPSReferencedImage_PList& operator=(const DVPSReferencedImage_PList&); /** the list maintained by this object */ OFList list_; }; #endif /* * $Log: dvpsril.h,v $ * Revision 1.14 2010-10-14 13:16:36 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.13 2010-10-07 14:31:36 joergr * Removed leading underscore characters from preprocessor symbols (reserved). * * Revision 1.12 2009-11-24 14:12:57 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.11 2009-09-30 10:42:38 uli * Make dcmpstat's include headers self-sufficient by including all * needed headers directly and stop using dctk.h * * Revision 1.10 2005-12-08 16:04:00 meichel * Changed include path schema for all DCMTK header files * * Revision 1.9 2003/06/04 10:18:06 meichel * Replaced private inheritance from template with aggregation * * Revision 1.8 2001/09/26 15:36:15 meichel * Adapted dcmpstat to class OFCondition * * Revision 1.7 2001/06/01 15:50:20 meichel * Updated copyright header * * Revision 1.6 2000/06/02 16:00:50 meichel * Adapted all dcmpstat classes to use OFConsole for log and error output * * Revision 1.5 2000/03/08 16:28:55 meichel * Updated copyright header. * * Revision 1.4 1999/07/22 16:39:10 meichel * Adapted dcmpstat data structures and API to supplement 33 letter ballot text. * * Revision 1.3 1999/01/15 17:33:03 meichel * added methods to DVPresentationState allowing to access the image * references in the presentation state. Also added methods allowing to * get the width and height of the attached image. * * Revision 1.2 1998/12/14 16:10:33 meichel * Implemented Presentation State interface for graphic layers, * text and graphic annotations, presentation LUTs. * * Revision 1.1 1998/11/27 14:50:32 meichel * Initial Release. * * */ dcmtk-3.6.0/dcmpstat/include/dcmtk/dcmpstat/dvpsvl.h0000644000310500011400000000754411455601265021730 0ustar joergrdicom3/* * * Copyright (C) 1998-2010, 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: DVPSVOILUT * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:16:37 $ * CVS/RCS Revision: $Revision: 1.10 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DVPSVL_H #define DVPSVL_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmpstat/dvpstyp.h" #include "dcmtk/ofstd/ofstring.h" #include "dcmtk/dcmdata/dctk.h" class DVPSSoftcopyVOI; /** the representation of one VOI LUT in a DICOM image. */ class DVPSVOILUT { public: /// default constructor DVPSVOILUT(); /// copy constructor DVPSVOILUT(const DVPSVOILUT& copy); /** clone method. * @return a pointer to a new DVPSVOILUT object containing * a copy of this object. */ DVPSVOILUT *clone() { return new DVPSVOILUT(*this); } /// destructor virtual ~DVPSVOILUT(); /** reads a VOI LUT from a DICOM dataset. * The DICOM elements of the VOI LUT item are copied * from the dataset to this object. * The completeness of the item (presence of all required elements, * value multiplicity) is checked. * If this method returns an error code, the object is in undefined state afterwards. * @param dset the item of the VOI LUT Sequence from which the data is to be read * @return EC_Normal if successful, an error code otherwise. */ OFCondition read(DcmItem &dset); /** resets the object to initial state. * After this call, the object is in the same state as after * creation with the default constructor. */ void clear(); /** gets the LUT explanation for this VOI LUT. * If no explanation exists, NULL is returned. * @return LUT explanation or NULL */ const char *getExplanation(); /** assigns the contents of this VOI LUT to the * references passed as parameters. * @param reference to the Softcopy VOI in which the LUT is stored. */ OFCondition assign(DVPSSoftcopyVOI& voi); private: /// private undefined assignment operator DVPSVOILUT& operator=(const DVPSVOILUT&); /// Module=VOI_LUT, VR=xs, VM=3, Type 1c DcmUnsignedShort voiLUTDescriptor; /// Module=VOI_LUT, VR=LO, VM=1, Type 3 DcmLongString voiLUTExplanation; /// Module=VOI_LUT, VR=xs, VM=1-n, Type 1c DcmUnsignedShort voiLUTData; }; #endif /* * $Log: dvpsvl.h,v $ * Revision 1.10 2010-10-14 13:16:37 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.9 2010-10-07 14:31:36 joergr * Removed leading underscore characters from preprocessor symbols (reserved). * * Revision 1.8 2009-11-24 14:12:58 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.7 2005-12-08 16:04:11 meichel * Changed include path schema for all DCMTK header files * * Revision 1.6 2001/09/26 15:36:18 meichel * Adapted dcmpstat to class OFCondition * * Revision 1.5 2001/06/01 15:50:25 meichel * Updated copyright header * * Revision 1.4 2000/06/02 16:00:54 meichel * Adapted all dcmpstat classes to use OFConsole for log and error output * * Revision 1.3 2000/03/08 16:28:59 meichel * Updated copyright header. * * Revision 1.2 1999/07/22 16:39:15 meichel * Adapted dcmpstat data structures and API to supplement 33 letter ballot text. * * Revision 1.1 1998/12/22 17:57:09 meichel * Implemented Presentation State interface for overlays, * VOI LUTs, VOI windows, curves. Added test program that * allows to add curve data to DICOM images. * * */ dcmtk-3.6.0/dcmpstat/include/dcmtk/dcmpstat/dvpspr.h0000644000310500011400000003651311455601264021725 0ustar joergrdicom3/* * * Copyright (C) 1998-2010, 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: DVPSPrintMessageHandler * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:16:36 $ * CVS/RCS Revision: $Revision: 1.17 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DVPSPR_H #define DVPSPR_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmnet/dimse.h" /** pure abstract event handler class for N-EVENT-REPORT. */ class DVPSPrintEventHandler { public: /// destructor virtual ~DVPSPrintEventHandler() {} /** handles an N-EVENT-REPORT-RQ message. This method is called * from DVPSPrintMessageHandler whenever an event report is received. * The event message, information and status detail elements must be copied * if they should remain valid after the end of this method call. * The event handler can react on the event message in any implementation * dependent way, e.g. display the event on-screen. * @param eventMessage the N-EVENT-REPORT-RQ message * @param eventInformation event information dataset. May be NULL if no event information available. * @param statusDetail status detail dataset. ay be NULL if no status detail available. * @return the status code to be sent back as part of the N-EVENT-REPORT-RSP message, usually STATUS_Success. */ virtual DIC_US handleEvent( T_DIMSE_N_EventReportRQ& eventMessage, DcmDataset *eventInformation, DcmDataset *statusDetail)=0; }; /** representation of an association used for DICOM Basic Grayscale Print. */ class DVPSPrintMessageHandler { public: /// default constructor DVPSPrintMessageHandler(); /// destructor virtual ~DVPSPrintMessageHandler(); /** sends an N-CREATE-RQ message and receives response. * Any event report requests incoming before the expected response message are handled. * @param sopclassUID the affected SOP class UID, must be one of the supported print classes. * @param sopinstanceUID the affected SOP instance UID. May be empty in which case the * UID is assigned by the SCP and returned in this parameter. * @param attributeListIn the attribute list dataset, may be NULL. * @param status the response message status code is passed back in this parameter * if the method returns with success status. Content is undefined otherwise. * @param attributeListOut a pointer to the attribute list returned by the SCP is passed back * in this parameter if the method returns with success status. Content is undefined otherwise. * May return NULL if the SCP has not returned an attribute list. If a DICOM dataset is returned, * it must be deleted by the caller. * @return DIMSE_NORMAL if successful (e.g. no protocol failure), an error code otherwise. */ OFCondition createRQ( const char *sopclassUID, OFString& sopinstanceUID, DcmDataset *attributeListIn, Uint16& status, DcmDataset* &attributeListOut); /** sends an N-SET-RQ message and receives response. * Any event report requests incoming before the expected response message are handled. * @param sopclassUID the requested SOP class UID, must be one of the supported print classes. * @param sopinstanceUID the requested SOP instance UID * @param modificationList the modification list dataset, must not be NULL. * @param status the response message status code is passed back in this parameter * if the method returns with success status. Content is undefined otherwise. * @param attributeListOut a pointer to the attribute list returned by the SCP is passed back * in this parameter if the method returns with success status. Content is undefined otherwise. * May return NULL if the SCP has not returned an attribute list. If a DICOM dataset is returned, * it must be deleted by the caller. * @return DIMSE_NORMAL if successful (e.g. no protocol failure), an error code otherwise. */ OFCondition setRQ( const char *sopclassUID, const char *sopinstanceUID, DcmDataset *modificationList, Uint16& status, DcmDataset* &attributeListOut); /** sends an N-GET-RQ message and receives response. * Any event report requests incoming before the expected response message are handled. * @param sopclassUID the requested SOP class UID, must be one of the supported print classes. * @param sopinstanceUID the requested SOP instance UID * @param attributeIdentifierList the list of DICOM attributes to get, may be NULL. * The attributes should be coded in pairs along the array (e.g. {g,e,g,e,g,e,...}). * @param numShorts the number of Uint16 values in the array (not the number of pairs). * @param status the response message status code is passed back in this parameter * if the method returns with success status. Content is undefined otherwise. * @param attributeListOut a pointer to the attribute list returned by the SCP is passed back * in this parameter if the method returns with success status. Content is undefined otherwise. * May return NULL if the SCP has not returned an attribute list. If a DICOM dataset is returned, * it must be deleted by the caller. * @return DIMSE_NORMAL if successful (e.g. no protocol failure), an error code otherwise. */ OFCondition getRQ( const char *sopclassUID, const char *sopinstanceUID, const Uint16 *attributeIdentifierList, size_t numShorts, Uint16& status, DcmDataset* &attributeListOut); /** sends an N-ACTION-RQ message and receives response. * Any event report requests incoming before the expected response message are handled. * @param sopclassUID the requested SOP class UID, must be one of the supported print classes. * @param sopinstanceUID the requested SOP instance UID * @param actionTypeID the action type ID * @param actionInformation the action information dataset, may be NULL. * @param status the response message status code is passed back in this parameter * if the method returns with success status. Content is undefined otherwise. * @param actionReply a pointer to the action reply dataset returned by the SCP is passed back * in this parameter if the method returns with success status. Content is undefined otherwise. * May return NULL if the SCP has not returned an attribute list. If a DICOM dataset is returned, * it must be deleted by the caller. * @return DIMSE_NORMAL if successful (e.g. no protocol failure), an error code otherwise. */ OFCondition actionRQ( const char *sopclassUID, const char *sopinstanceUID, Uint16 actionTypeID, DcmDataset *actionInformation, Uint16& status, DcmDataset* &actionReply); /** sends an N-DELETE-RQ message and receives response. * Any event report requests incoming before the expected response message are handled. * @param sopclassUID the requested SOP class UID, must be one of the supported print classes. * @param sopinstanceUID the requested SOP instance UID * @param status the response message status code is passed back in this parameter * if the method returns with success status. Content is undefined otherwise. * @return DIMSE_NORMAL if successful (e.g. no protocol failure), an error code otherwise. */ OFCondition deleteRQ( const char *sopclassUID, const char *sopinstanceUID, Uint16& status); /** opens a DICOM association to a remote printer. * The Basic Grayscale Print Management Meta SOP Class and Presentation LUT SOP Class * are requested. The association is only accepted if the remote printer supports * at least the Basic Grayscale Print Management Meta SOP Class. * @param tlayer transport layer object, may be NULL. If present, a transport * layer object for TLS transports is expected. * @param myAEtitle the print client's own application entity title (calling aetitle) * @param peerAEtitle the printer's called aetitle * @param peerHost hostname/IP address of the printer * @param peerPort port number of the printer * @param peerMaxPDU maximum PDU size to negotiate, must be between 8192 and 65536. * @param negotiatePresentationLUT if true, Presentation LUT SOP Class is negotiated * @param negotiateAnnotationBox if true, Basic Annotation Box SOP Class is negotiated * @param implicitOnly if true, only the default implicit VR transfer syntax is proposed, * otherwise all uncompressed transfer syntaxes are proposed. * @return status code that can be checked with the SUCCESS macro. If successful, an association * is established. If unsuccessful, no association is established. */ OFCondition negotiateAssociation( DcmTransportLayer *tlayer, const char *myAEtitle, const char *peerAEtitle, const char *peerHost, int peerPort, long peerMaxPDU, OFBool negotiatePresentationLUT, OFBool negotiateAnnotationBox, OFBool implicitOnly); /** releases the current association. * @return ASC_NORMAL or ASC_RELEASECONFIRMED upon success, an error code otherwise. */ OFCondition releaseAssociation(); /** aborts the current association. * @return a status code that can be checked with the SUCCESS() macro. */ OFCondition abortAssociation(); /** registers an event handler object for incoming N-EVENT-REPORTs. * @param handler pointer to the new handler object. May be NULL. */ void setEventHandler(DVPSPrintEventHandler *handler) { eventHandler = handler; } /** sets the blocking and timeout mode for receive operations. * @param blockMode blocking mode * @param timeout */ void setTimeout(T_DIMSE_BlockingMode blocking, int timeOut) { blockMode=blocking; timeout=timeOut; } /** checks if the remote printer supports the Presentation LUT SOP class. * May only be called if association in place. * @return true if presentation context for presentation LUT exists, false otherwise. */ OFBool printerSupportsPresentationLUT(); /** checks if the remote printer supports the Basic Annotation Box SOP class. * May only be called if association in place. * @return true if presentation context for Basic Annotation Box exists, false otherwise. */ OFBool printerSupportsAnnotationBox(); private: /// private undefined copy constructor DVPSPrintMessageHandler(const DVPSPrintMessageHandler& copy); /// private undefined assignment operator DVPSPrintMessageHandler& operator=(const DVPSPrintMessageHandler& copy); /** sends a DIMSE-N request (any type except N-EVENT-REPORT) and waits for a response. * Any event report requests incoming before the expected DIMSE-N-RSP are handled. * If an event handler is registered, it is called for each received event report request. * @param presId presentation context ID * @param request DIMSE-N request message to be sent. All fields except DataSetType must be filled in. * @param rqDataSet DICOM dataset to be sent with the request message, e.g. N-Set modification list, * N-Action action information, or N-Create attribute list. Not applicable to N-Get or N-Delete. * @param response the received response is passed back in this parameter if the method returns * with success status. Content is undefined otherwise. * @param statusDetail the status detail dataset of the received response is passed back in this * parameter if the method returns with success status. Content is undefined otherwise. * @param rspDataset the received response dataset is passed back in this * parameter if the method returns with success status. Content is undefined otherwise. * @return DIMSE_NORMAL if successful, an error code otherwise. */ OFCondition sendNRequest( T_ASC_PresentationContextID presId, T_DIMSE_Message &request, DcmDataset *rqDataSet, T_DIMSE_Message &response, DcmDataset* &statusDetail, DcmDataset* &rspDataset); /** looks for an accepted presentation context for the given SOP class. * If the SOP class is one of the Basic Grayscale Print Management Meta classes, * looks for a presentation context for the meta SOP class. * @param sopclassuid SOP Class UID for which a presentation context is searched * @return presentation context if found, 0 otherwise. */ T_ASC_PresentationContextID findAcceptedPC(const char *sopclassuid); /** dumps the given message to the dump stream if it exists. * @param msg message to be dumped, should be DIMSE-N * @param dataset option dataset to be dumped, may be NULL * @param outgoing OFTrue if message is outgoing, OFFalse if incoming. */ void dumpNMessage(T_DIMSE_Message &msg, DcmItem *dataset, OFBool outgoing); /// the association to be used for message communication. Can be NULL. T_ASC_Association *assoc; /// the network used for establishing associations. Can be NULL. T_ASC_Network *net; /// the current event handler. Can be NULL. DVPSPrintEventHandler *eventHandler; /// blocking mode for receive T_DIMSE_BlockingMode blockMode; /// timeout for receive int timeout; }; #endif /* * $Log: dvpspr.h,v $ * Revision 1.17 2010-10-14 13:16:36 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.16 2010-10-07 14:31:36 joergr * Removed leading underscore characters from preprocessor symbols (reserved). * * Revision 1.15 2009-11-24 14:12:57 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.14 2009-09-30 10:42:38 uli * Make dcmpstat's include headers self-sufficient by including all * needed headers directly and stop using dctk.h * * Revision 1.13 2006-08-15 16:57:01 meichel * Updated the code in module dcmpstat to correctly compile when * all standard C++ classes remain in namespace std. * * Revision 1.12 2005/12/09 14:48:35 meichel * Added missing virtual destructors * * Revision 1.11 2005/12/08 16:03:57 meichel * Changed include path schema for all DCMTK header files * * Revision 1.10 2003/09/05 14:31:33 meichel * Print SCU now supports TLS connections. * * Revision 1.9 2001/10/12 13:46:52 meichel * Adapted dcmpstat to OFCondition based dcmnet module (supports strict mode). * * Revision 1.8 2001/06/01 15:50:19 meichel * Updated copyright header * * Revision 1.7 2000/06/02 16:00:50 meichel * Adapted all dcmpstat classes to use OFConsole for log and error output * * Revision 1.6 2000/03/08 16:28:55 meichel * Updated copyright header. * * Revision 1.5 1999/10/28 08:18:56 meichel * Print client does not attempt any more to negotiate Presentation LUT or * Annotation Box if config file says that the printer does not support them. * * Revision 1.4 1999/10/13 14:10:47 meichel * Now negotiation Basic Annotation Box SOP Class * * Revision 1.3 1999/09/24 15:23:47 meichel * Print spooler (dcmprtsv) now logs diagnostic messages in log files * when operating in spool mode. * * Revision 1.2 1999/09/17 14:33:58 meichel * Completed print spool functionality including Supplement 22 support * * Revision 1.1 1999/07/30 13:34:49 meichel * Added new classes managing Stored Print objects * * */ dcmtk-3.6.0/dcmpstat/include/dcmtk/dcmpstat/CMakeLists.txt0000644000310500011400000000012010346064025022753 0ustar joergrdicom3# declare installation files INSTALL_FILES(${INSTALL_INCDIR}/dcmtk/dcmpstat .h) dcmtk-3.6.0/dcmpstat/include/dcmtk/dcmpstat/dcmpstat.h0000644000310500011400000012263011455601263022221 0ustar joergrdicom3/* * * Copyright (C) 1998-2010, 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: DcmPresentationState * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:16:35 $ * CVS/RCS Revision: $Revision: 1.7 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DCMPSTAT_H #define DCMPSTAT_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dctk.h" #include "dcmtk/ofstd/ofstring.h" /* for class OFString */ #include "dcmtk/dcmpstat/dvpstyp.h" /* for enum types */ #include "dcmtk/dcmpstat/dvpsovl.h" /* for DVPSOverlay_PList */ #include "dcmtk/dcmpstat/dvpsgll.h" /* for DVPSGraphicLayer_PList */ #include "dcmtk/dcmpstat/dvpsrsl.h" /* for DVPSReferencedSeries_PList */ #include "dcmtk/dcmpstat/dvpsall.h" /* for DVPSOverlayCurveActivationLayer_PList */ #include "dcmtk/dcmpstat/dvpsgal.h" /* for DVPSGraphicObject_PList */ #include "dcmtk/dcmpstat/dvpscul.h" /* for DVPSCurve_PList */ #include "dcmtk/dcmpstat/dvpsvll.h" /* for DVPSVOILUT_PList */ #include "dcmtk/dcmpstat/dvpsvwl.h" /* for DVPSVOIWindow_PList */ #include "dcmtk/dcmpstat/dvpsdal.h" /* for DVPSDisplayedArea_PList */ #include "dcmtk/dcmpstat/dvpssvl.h" /* for DVPSSoftcopyVOI_PList */ #include "dcmtk/dcmpstat/dvpspl.h" /* for DVPSPresentationLUT */ class DVPSTextObject; class DVPSGraphicObject; class DVPSCurve; class DVPSDisplayedArea; class DVPSSoftcopyVOI; /** a Grayscale Softcopy Presentation State. * This class manages the data structures comprising a Presentation State object. * Presentation states can be created, read, written, and modified. */ class DcmPresentationState { public: /** default constructor */ DcmPresentationState(); /// destructor virtual ~DcmPresentationState(); /** reads a presentation state from a DICOM dataset. * The DICOM elements of the presentation state are copied * from the dataset to this object. * The completeness and correctness of the * presentation state (presence of all required elements, * value multiplicity) is checked. * If this method returns an error code, the object is in undefined state afterwards. * @param dset the dataset from which the presentation state is to be read * @return EC_Normal if successful, an error code otherwise. */ OFCondition read(DcmItem &dset); /** writes the presentation state managed by this object to a DICOM dataset. * Copies of the DICOM elements managed by this object are inserted into * the DICOM dataset. * @param dset the dataset to which the presentation state is written * @param replaceSOPInstanceUID flag indicating whether the * SOP Instance UID should be replaced by a new UID. * If true, a new UID is always generated. If false, a new * UID is generated only if no UID has been assigned before. * @return EC_Normal if successful, an error code otherwise. */ OFCondition write(DcmItem &dset, OFBool replaceSOPInstanceUID); /** generates a new SOP Instance UID for the Presentation State. * @return new SOP Instance UID if successfully set, NULL otherwise. */ const char *createInstanceUID(); /** returns the current SOP Instance UID for the Presentation State. * @return SOP Instance UID if present, NULL otherwise. */ const char *getInstanceUID(); /** returns the (currently hard-coded) SOP Class UID of the Presentation State. * @return SOP Class UID of the presentation state */ const char *getSOPClassUID(); /** returns the patient ID of the presentation state */ const char *getPatientID(); /** returns the Study Instance UID of the presentation state. * @return Study Instance UID if successful, NULL otherwise. */ const char *getStudyUID(); /** adds a reference to an image to this presentation state. * This method checks if the given SOP class and Study UID match * for this presentation state and returns an error code otherwise. * @param studyUID the Study Instance UID of the image reference to be added. * @param seriesUID the Series Instance UID of the image reference to be added. * @param sopclassUID the SOP class UID of the image reference to be added. * @param instanceUID the SOP instance UID of the image reference to be added. * @param frames a list of frame numbers in DICOM IS format * (integer numbers separated by '\' characters). Default: frame numbers absent. * The frame numbers are required if the referenced image is a multiframe image. * @param aetitle the series retrieveAETitle. Must be a valid DICOM 'AE' value. Default: value absent. * @param filesetID the series storageMediaFileSetID. Must be a valid DICOM 'SH' value. Default: value absent. * @param filesetUID the series storageMediaFileSetUID. Must be a valid DICOM UID. Default: value absent. * @return EC_Normal if successful, an error code otherwise. */ OFCondition addImageReference( const char *studyUID, const char *seriesUID, const char *sopclassUID, const char *instanceUID, const char *frames=NULL, const char *aetitle=NULL, const char *filesetID=NULL, const char *filesetUID=NULL); /** adds a reference to an image to this presentation state. * This method checks if the given SOP class and Study UID match * for this presentation state and returns an error code otherwise. * @param dset the DICOM dataset containing the image IOD * @param aetitle the series retrieveAETitle. Must be a valid DICOM 'AE' value. Default: value absent. * @param filesetID the series storageMediaFileSetID. Must be a valid DICOM 'SH' value. Default: value absent. * @param filesetUID the series storageMediaFileSetUID. Must be a valid DICOM UID. Default: value absent. * @return EC_Normal if successful, an error code otherwise. */ OFCondition addImageReference( DcmItem &dset, const char *aetitle=NULL, const char *filesetID=NULL, const char *filesetUID=NULL); /** removes a reference to an image from this presentation state. * @param studyUID the Study Instance UID of the image reference to be removed. * @param seriesUID the Series Instance UID of the image reference to be removed. * @param instanceUID the SOP instance UID of the image reference to be removed. * @return EC_Normal if successful, an error code otherwise. */ OFCondition removeImageReference( const char *studyUID, const char *seriesUID, const char *instanceUID); /** removes a reference to an image from this presentation state. * @param dset the DICOM dataset containing the image IOD * @return EC_Normal if successful, an error code otherwise. */ OFCondition removeImageReference(DcmItem &dset); /** gets the number of image references in all series managed by this list. * @return number of image references */ size_t numberOfImageReferences(); /** gets an image reference with the given index. * @param idx index, must be < numberOfImageReferences(). * @param studyUID the Study Instance UID is returned in this string * @param seriesUID the Series Instance UID is returned in this string * @param sopclassUID the SOP Class UID is returned in this string * @param instanceUID the SOP Instance UID is returned in this string * @param frames the list of frames is returned in this string * @param aetitle the series retrieveAETitle is returned in this string * @param filesetID the series storageMediaFileSetID is returned in this string * @param filesetUID the series storageMediaFileSetUID is returned in this string * @return EC_Normal if successful, an error code otherwise. */ OFCondition getImageReference( size_t idx, OFString& studyUID, OFString& seriesUID, OFString& sopclassUID, OFString& instanceUID, OFString& frames, OFString& aetitle, OFString& filesetID, OFString& filesetUID); /** resets the object to initial state. * After this call, the object is in the same state as after * creation with the default constructor. */ void clear(); /** creates a default presentation state for a DICOM image. * A number of flags specify how curves, overlays, VOI transformations, * a display shutter and a presentation LUT shape * should be treated when found in the image IOD. * If this method returns an error code, the object is in undefined state afterwards. * @param dset the DICOM dataset containing the image IOD * @param overlayActivation flag defining how overlays should be handled * (copied, activated or ignored). Default: Copy overlays. * @param voiActivation flag defining how VOI LUTs or VOI window width/center should * be handled. Default: Use VOI and prefer VOI LUT from VOI window. * @param curveActivation flag defining whether curves in the image should * be activated. Default: Activate curves. * @param shutterActivation flag defining whether a shutter (not bitmap shutter) * should be copied to the presentation state when found in the image. * Default: Copy shutter. * @param presentationActivation flag defining whether a presentation LUT shape * should be copied to the presentation state when found in the image. * Default: Copy presentation LUT shape. * @param layering flag defining how graphic layers should be created for * activated overlays and curves. Default: Create one layer for all overlays * and another layer for all curves. * @param aetitle the series retrieveAETitle. Must be a valid DICOM 'AE' value. Default: value absent. * @param filesetID the series storageMediaFileSetID. Must be a valid DICOM 'SH' value. Default: value absent. * @param filesetUID the series storageMediaFileSetUID. Must be a valid DICOM UID. Default: value absent. * @return EC_Normal upon success, an error code otherwise. */ OFCondition createFromImage(DcmItem &dset, DVPSoverlayActivation overlayActivation = DVPSO_copyOverlays, DVPSVOIActivation voiActivation = DVPSV_preferVOILUT, OFBool curveActivation = OFTrue, OFBool shutterActivation = OFTrue, OFBool presentationActivation = OFTrue, DVPSGraphicLayering layering = DVPSG_twoLayers, const char * aetitle = NULL, const char * filesetID = NULL, const char * filesetUID = NULL); /* Presentation LUT Interface */ /** gets the current Presentation LUT type. * @return the current presentation LUT type */ DVPSPresentationLUTType getPresentationLUT() { return presentationLUT.getType(); } /** checks if a real Presentation LUT (not shape) * is available in the presentation state. * @return OFTrue if the presentation state contains * a presentation LUT, no matter if it is activated or not. * Returns OFFalse otherwise. */ OFBool havePresentationLookupTable() { return presentationLUT.haveTable(); } /** gets a description of the current presentation LUT. * For well-known presentation LUT shapes, a standard text * is returned. For presentation LUTs, the LUT explanation * is returned if it exists and a standard text otherwise. * This method never returns NULL. * @return a pointer to a string describing the current presentation LUT. */ const char *getCurrentPresentationLUTExplanation() { return presentationLUT.getCurrentExplanation(); } /** returns the LUT explanation of the presentation LUT * if it exists and is non-empty. * Otherwise returns NULL. * @return a string pointer */ const char *getPresentationLUTExplanation() { return presentationLUT.getLUTExplanation(); } /** gets the current Presentation LUT object. * @return the current presentation LUT object */ DVPSPresentationLUT *getPresentationLUTData() { return &presentationLUT; } /* Rotate/Flip Interface */ /** gets the current rotation status of the presentation state. * @return the current rotation status */ DVPSRotationType getRotation(); /** gets the current horizontal flip status of the presentation state. * @return OFTrue if flip is on, OFFalse if flip is off. */ OFBool getFlip(); /** sets rotation status of the presentation state. * @param rotation the rotation to be set * @return EC_Normal if successful, an error code otherwise. */ OFCondition setRotation(DVPSRotationType rotation); /** sets horizontal flip status of the presentation state. * @param isFlipped the flip status, OFTrue for on, OFFalse for off. * @return EC_Normal if successful, an error code otherwise. */ OFCondition setFlip(OFBool isFlipped); /* VOI Transform Interface */ /* Displayed Area Interface */ /* shutter Interface */ /** checks if a display shutter of given type is active. * @param type the shutter type * @return OFTrue if this type of shutter is currently active. */ OFBool haveShutter(DVPSShutterType type); /* rectangular shutter Interface */ /** gets rectangular shutter left vertical edge. * May only be called if a rectangular shutter is active. * @return the rect shutter LV edge. */ Sint32 getRectShutterLV(); /** gets rectangular shutter right vertical edge. * May only be called if a rectangular shutter is active. * @return the rect shutter RV edge. */ Sint32 getRectShutterRV(); /** gets rectangular shutter upper horitontal edge. * May only be called if a rectangular shutter is active. * @return the rect shutter UH edge. */ Sint32 getRectShutterUH(); /** gets rectangular shutter lower horiztonal edge. * May only be called if a rectangular shutter is active. * @return the rect shutter LH edge. */ Sint32 getRectShutterLH(); /* circular shutter Interface */ /** gets circular shutter center x component. * May only be called if a circular shutter is active. * @return the circ shutter center x component */ Sint32 getCenterOfCircularShutter_x(); /** gets circular shutter center y component. * May only be called if a circular shutter is active. * @return the circ shutter center y component */ Sint32 getCenterOfCircularShutter_y(); /** gets circular shutter radius. * May only be called if a circular shutter is active. * Note: In DICOM, a circular shutter must be rendered * with consideration of the image pixel aspect ratio. * The radius returned by this method is the number * of pixels describing a horizontal line from the * center of the circle to its border. See sample figures * in NEMA PS3.3:1998. * @return the circ shutter radius */ Sint32 getRadiusOfCircularShutter(); /* polygonal shutter Interface */ /** gets polygonal shutter number of points. * May only be called if a polygonal shutter is active. * @return the number of points describing the poly shutter */ size_t getNumberOfPolyShutterVertices(); /** get polygonal shutter point. * May only be called if a polygonal shutter is active. * Shutter points are relative to the origin 1\1 which is * the left upper edge of the image. * @param idx the index of the shutter point, must be < getNumberOfPolyShutterVertices() * @param x returns the x component of the point * @param y returns the y component of the point * @return EC_Normal upon success, an error code otherwise. */ OFCondition getPolyShutterVertex(size_t idx, Sint32& x, Sint32& y); /** sets polygonal display shutter origin. * This method creates a * polygonal shutter consisting only of a single point. * The polygonal display shutter is deactivated after this method. * @param x the x component of the shutter origin * @param y the x component of the shutter origin * @return EC_Normal upon success, an error code otherwise. */ OFCondition setPolyShutterOrigin(Sint32 x, Sint32 y); /* bitmap shutter Interface * * see methods: * overlayIsBitmapShutter(), * overlayIsSuitableAsBitmapShutter(), * activateOverlayAsBitmapShutter() * in overlay interface definitions. */ /* shutter presentation value Interface */ /** gets the shutter presentation value. If no shutter display * value exists, a default of 0 (black) is set. * @return the shutter presentation value as 16bit unsigned P-value */ Uint16 getShutterPresentationValue(); /** sets the shutter presentation value to the given P-value. * @param pvalue the shutter presentation value. * @return EC_Normal upon success, an error code otherwise. */ OFCondition setShutterPresentationValue(Uint16 pvalue); /* Presentation State Label, Description and Name Interface */ /** returns a label for the presentation state. * If no label is available, NULL is returned. * @return a pointer to a string or NULL. */ const char *getPresentationLabel(); /** returns a description for the presentation state. * If no description is available, NULL is returned. * @return a pointer to a string or NULL. */ const char *getPresentationDescription(); /** returns the creator's name for the presentation state. * If no name is available, NULL is returned. * @return a pointer to a string or NULL. */ const char *getPresentationCreatorsName(); /** sets the presentation state label. * The passed string must be a valid DICOM Code String * (i.e. max 16 characters, only uppercase and numbers). * @param label the new presentation state label * @return EC_Normal upon success, an error code otherwise. */ OFCondition setPresentationLabel(const char *label); /** sets the presentation state description. * The passed string must be a valid DICOM Long String * (i.e. max 64 characters, no backslash or control chars). * @param descr the new presentation state description * @return EC_Normal upon success, an error code otherwise. */ OFCondition setPresentationDescription(const char *descr); /** sets the presentation state creator's name. * The passed string must be a valid DICOM Person Name String * (see NEMA PS3.5:1998). * @param name the new creator's name * @return EC_Normal upon success, an error code otherwise. */ OFCondition setPresentationCreatorsName(const char *name); /* specific character set */ /** sets the specific character set for this presentation state. * @param charset the new character set for this text object * @return EC_Normal if successful, an error code otherwise. */ OFCondition setCharset(DVPScharacterSet charset); /** gets the specific character set for this presentation state. * @return character set identifier */ DVPScharacterSet getCharset(); /** gets the specific character set string for this presentation state. * @return character set if present, NULL otherwise */ const char *getCharsetString(); /* graphic layers */ /** sorts the graphic layers according to * the graphic layer order. Layers with lower order have lower * indices after sorting which means that the layers can be * drawn to the screen in ascending index order. * Calling this routine may result in a re-numbering * of the graphic layer orders in a way that does not affect * their sequence. */ void sortGraphicLayers(); /** returns the number of graphic layers. * @return number of graphic layers */ size_t getNumberOfGraphicLayers(); /** gets the unique name of the graphic * layer with the given index. If no layer for the given * index exists, NULL is returned. * @param idx index of the graphic layer, must be < getNumberOfGraphicLayers() * @return name of the graphic layer */ const char *getGraphicLayerName(size_t idx); /** gets the index of the graphic * layer with the given unique name. If no matching layer * is found, DVPS_IDX_NONE is returned. * @param name name of the graphic layer * @return index of the graphic layer */ size_t getGraphicLayerIndex(const char *name); /** gets a description string for the graphic * layer with the given index. If no layer for the given * index exists, or if the description is empty, NULL is returned. * @param idx index of the graphic layer, must be < getNumberOfGraphicLayers() * @return description of the graphic layer */ const char *getGraphicLayerDescription(size_t idx); /** checks whether a recommended display value (grayscale, color or both) for the given graphic layer exists. * @param idx index of the graphic layer, must be < getNumberOfGraphicLayers() * @return OFTrue if a recommended display value exists */ OFBool haveGraphicLayerRecommendedDisplayValue(size_t idx); /** gets the recommended grayscale display value for the given graphic layer. * If the graphic layer contains an RGB display value but no grayscale * display value, the RGB value is implicitly converted to grayscale. * @param idx index of the graphic layer, must be < getNumberOfGraphicLayers() * @param gray the recommended display value as an unsigned 16-bit P-value * is returned in this parameter. * @return EC_Normal upon success, an error code otherwise */ OFCondition getGraphicLayerRecommendedDisplayValueGray(size_t idx, Uint16& gray); /** gets the recommended RGB display value for the given graphic layer. * If the graphic layer contains a grayscale display value but no RGB * display value, the grayscale value is implicitly converted to RGB. * @param idx index of the graphic layer, must be < getNumberOfGraphicLayers() * @param r returns the R component of the recommended display value as unsigned 16-bit P-value * @param g returns the G component of the recommended display value as unsigned 16-bit P-value * @param b returns the B component of the recommended display value as unsigned 16-bit P-value * @return EC_Normal upon success, an error code otherwise */ OFCondition getGraphicLayerRecommendedDisplayValueRGB(size_t idx, Uint16& r, Uint16& g, Uint16& b); /** set graphic layer recommended grayscale display value for the given graphic layer. * This method does not affect (set or modify) the recommended RGB display value * which should be set separately. * @param idx index of the graphic layer, must be < getNumberOfGraphicLayers() * @param gray the recommended display value as an unsigned 16-bit P-value * @return EC_Normal upon success, an error code otherwise */ OFCondition setGraphicLayerRecommendedDisplayValueGray(size_t idx, Uint16 gray); /** set graphic layer recommended RGB display value for the given graphic layer. * This method does not affect (set or modify) the recommended grayscale display value * which should be set separately. * @param idx index of the graphic layer, must be < getNumberOfGraphicLayers() * @param r the R component of the recommended display value as unsigned 16-bit P-value * @param g the G component of the recommended display value as unsigned 16-bit P-value * @param b the B component of the recommended display value as unsigned 16-bit P-value * @return EC_Normal upon success, an error code otherwise */ OFCondition setGraphicLayerRecommendedDisplayValueRGB(size_t idx, Uint16 r, Uint16 g, Uint16 b); /** removes recommended display values for the given graphic layer. * @param idx index of the graphic layer, must be < getNumberOfGraphicLayers() * @param rgb if true, the RGB recommended display value is removed * @param monochrome if true the monochrome recommended display value is removed */ void removeGraphicLayerRecommendedDisplayValue(size_t idx, OFBool rgb, OFBool monochrome); /** assigns a new unique name to the given graphic layer. * The new name must be unique, otherwise an error code is returned. * Upon success, all references (for graphic annotations, curves and overlays) to the given * graphic layer are also renamed so that the presentation state remains * consistent. * @param idx index of the graphic layer, must be < getNumberOfGraphicLayers() * @param name the new name of the graphic layer. Must be a valid DICOM Code String. * @return EC_Normal upon success, an error code otherwise */ OFCondition setGraphicLayerName(size_t idx, const char *name); /** sets a new description to the given graphic layer. * @param idx index of the graphic layer, must be < getNumberOfGraphicLayers() * @param descr description of the graphic layer. Must be a valid DICOM Long String. * @return EC_Normal upon success, an error code otherwise */ OFCondition setGraphicLayerDescription(size_t idx, const char *descr); /** makes a graphic layer the highest layer for display. * This method assigns a graphic layer order higher than all * existing graphic layer orders to the given graphic layer, * sorts and renumbers the list of graphic layers. Upon success, * the given graphic layer is guaranteed to have the new index * (getNumberOfGraphicLayers()-1). * @param idx index of the graphic layer, must be < getNumberOfGraphicLayers() * @return EC_Normal upon success, an error code otherwise */ OFCondition toFrontGraphicLayer(size_t idx); /** makes a graphic layer the lowest layer for display. * This method assigns a graphic layer order lower than all * existing graphic layer orders to the given graphic layer, * sorts and renumbers the list of graphic layers. Upon success, * the given graphic layer is guaranteed to have the new index 0. * @param idx index of the graphic layer, must be < getNumberOfGraphicLayers() * @return EC_Normal upon success, an error code otherwise */ OFCondition toBackGraphicLayer(size_t idx); /** exchanges the layer order of the two graphic layers with * the given indices. This method does not sort or renumber * the graphic layers. * @param idx1 index of the first graphic layer, must be < getNumberOfGraphicLayers() * @param idx2 index of the second graphic layer, must be < getNumberOfGraphicLayers() * @return EC_Normal upon success, an error code otherwise */ OFCondition exchangeGraphicLayers(size_t idx1, size_t idx2); /** creates a new graphic layer with the given * name and optional description. * The new name must be unique, otherwise an error code is returned. * The toFrontGraphicLayer() method is implicitly called for the new layer. * @param gLayer the name of the graphic layer. Must be a valid DICOM Code String. * @param gLayerDescription the optional description of the graphic layer. * Must be a valid DICOM Long String. * @return EC_Normal upon success, an error code otherwise */ OFCondition addGraphicLayer( const char *gLayer, const char *gLayerDescription=NULL); /* text objects */ /* graphic objects */ /* curves */ /** returns the number of curve activations for the given * graphic layer. * @param layer index of the graphic layer, must be < getNumberOfGraphicLayers() * @return number of curves */ size_t getNumberOfCurves(size_t layer); /** deletes the curve activation with the given index * on the given layer. * @param layer index of the graphic layer, must be < getNumberOfGraphicLayers() * @param idx index of the curve activation, must be < getNumberOfCurves(layer) * @return EC_Normal upon success, an error code otherwise */ OFCondition removeCurve(size_t layer, size_t idx); /** moves the curve activation with the given index on the given * layer to a different layer. * @param old_layer index of the graphic layer on which the curve is, * must be < getNumberOfGraphicLayers() * @param idx index of the curve activation, must be < getNumberOfCurves(layer) * @param new_layer index of the graphic layer to which the curve is moved, * must be < getNumberOfGraphicLayers() * @return EC_Normal upon success, an error code otherwise */ OFCondition moveCurve(size_t old_layer, size_t idx, size_t new_layer); /* overlays */ /** gets the number of overlays that are currently activated * on the given graphic layer. * @param layer index of the graphic layer, must be < getNumberOfGraphicLayers() * @return number of active overlays */ size_t getNumberOfActiveOverlays(size_t layer); /** gets the repeating group number of the given activated overlay. * @param layer index of the graphic layer, must be < getNumberOfGraphicLayers() * @param idx index of the overlay, must be < getNumberOfActiveOverlays(). * @return repeating group number if found, 0 otherwise. */ Uint16 getActiveOverlayGroup(size_t layer, size_t idx); /** gets the number of overlays which are embedded in the * presentation state. * @return number of overlays in presentation state */ size_t getNumberOfOverlaysInPresentationState(); /** gets the repeating group number of the given overlay in the presentation state. * @param idx index of the overlay, must be < getNumberOfOverlaysInPresentationState(). * @return repeating group number if found, 0 otherwise. */ Uint16 getOverlayInPresentationStateGroup(size_t idx); /** gets the overlay label of the given overlay in the presentation state. * @param idx index of the overlay, must be < getNumberOfOverlaysInPresentationState(). * @return label string if it exists, NULL otherwise. */ const char *getOverlayInPresentationStateLabel(size_t idx); /** gets the overlay description of the given overlay in the presentation state. * @param idx index of the overlay, must be < getNumberOfOverlaysInPresentationState(). * @return description string if it exists, NULL otherwise. */ const char *getOverlayInPresentationStateDescription(size_t idx); /** gets the index of the activation layer on which the given * overlay from the presentation state is activated. If an overlay is used * as a bitmap shutter, it is reported as being not activated by this method. * @param idx index of the overlay, must be < getNumberOfOverlaysInPresentationState(). * @return layer index (which is < getNumberOfGraphicLayers()) if overlay exists * and is activated, DVPS_IDX_NONE otherwise. */ size_t getOverlayInPresentationStateActivationLayer(size_t idx); /** checks if the given overlay in the presentation state * is currently activated as a bitmap shutter. * @param idx index of the overlay, must be < getNumberOfOverlaysInPresentationState(). * @return OFTrue if overlay exists and is activated as bitmap shutter, OFFalse otherwise. */ OFBool overlayIsBitmapShutter(size_t idx); /** checks whether the given overlay in the presentation state is a ROI * (region of interest) overlay. * @param idx index of the overlay, must be < getNumberOfOverlaysInPresentationState(). * @return OFTrue if overlay exists and is ROI, OFFalse otherwise. */ OFBool overlayInPresentationStateIsROI(size_t idx); /** moves the overlay activation with the given index on the given * layer to a different layer. * @param old_layer index of the graphic layer on which the curve is, * must be < getNumberOfGraphicLayers() * @param idx index of the overlay activation, must be < getNumberOfActiveOverlays(layer) * @param new_layer index of the graphic layer to which the curve is moved, * must be < getNumberOfGraphicLayers() * @return EC_Normal upon success, an error code otherwise */ OFCondition moveOverlay(size_t old_layer, size_t idx, size_t new_layer); /* attached image */ /* Display transform */ /* print related methods */ private: /** private undefined copy constructor */ DcmPresentationState(const DcmPresentationState& copy); /** private undefined assignment operator */ DcmPresentationState& operator=(const DcmPresentationState& obj); /** create dummy values for all missing type 1 elements. * Called before a presentation state is written to make sure * that the presentation state is complete. * @param replaceSOPInstanceUID flag indicating whether the * SOP Instance UID should be replaced by a new UID. * If true, a new UID is always generated. If false, a new * UID is generated only if no UID has been assigned before. * @return EC_Normal if successful, an error code otherwise. */ OFCondition createDummyValues(OFBool replaceSOPInstanceUID); /** removes and deletes all graphic layer for which * no matching text, graphic, curve or overlay object exists. * Also deletes all graphic annotation sequence items containing * no text and no graphic object. Called before writing a presentation state. */ void cleanupLayers(); protected: /** creates a default displayed area selection for the given dataset. * Used in createFromImage(). * @param dset the DICOM dataset containing the image IOD * @return EC_Normal upon success, an error code otherwise. */ OFCondition createDefaultDisplayedArea(DcmItem &dset); /* Module: Patient (M) */ /// Module=Patient, VR=PN, VM=1, Type 1 DcmPersonName patientName; /// Module=Patient, VR=LO, VM=1, Type 2 DcmLongString patientID; /// Module=Patient, VR=DA, VM=1, Type 2 DcmDate patientBirthDate; /// Module=Patient, VR=CS, VM=1, Type 2 DcmCodeString patientSex; /* Module: General Study (M) */ /// Module=General_Study, VR=UI, VM=1, Type 1 DcmUniqueIdentifier studyInstanceUID; /// Module=General_Study, VR=DA, VM=1, Type 2 DcmDate studyDate; /// Module=General_Study, VR=TM, VM=1, Type 2 DcmTime studyTime; /// Module=General_Study, VR=PN, VM=1, Type 2 DcmPersonName referringPhysicianName; /// Module=General_Study, VR=SH, VM=1, Type 2 DcmShortString studyID; /// Module=General_Study, VR=SH, VM=1, Type 2 DcmShortString accessionNumber; /* Module: General Series (M) */ /// Module=General_Series, VR=UI, VM=1, Type 1 DcmUniqueIdentifier seriesInstanceUID; /// Module=General_Series, VR=IS, VM=1, Type 2 DcmIntegerString seriesNumber; /* Module: Presentation Series (M) - specializes general series */ // modality; see General Series /* Module: General Equipment (M) */ /// Module=General_Equipment, VR=LO, VM=1, Type 2 DcmLongString manufacturer; /* Module: Displayed Area (M) */ /// Module=Displayed_Area, VR=SQ, Card=1-n, Type 1 DVPSDisplayedArea_PList displayedAreaSelectionList; /* Module: Softcopy Presentation LUT (M) * There must never be more that one Presentation LUT for one Presentation State, * therefore we need not save a list of LUTs. */ /// Module=Softcopy_Presentation_LUT, VR=SQ, Card=1, Type 1C DVPSPresentationLUT presentationLUT; /* Module: Presentation State (M) * specializes mask and display shutter */ /// Module=Presentation_State, VR=IS, VM=1, Type 1 DcmIntegerString imageNumber; /// Module=Presentation_State, VR=CS, VM=1, Type 1 DcmCodeString presentationLabel; /// Module=Presentation_State, VR=LO, VM=1, Type 2 DcmLongString presentationDescription; /// Module=Presentation_State, VR=DA, VM=1, Type 1 DcmDate presentationCreationDate; /// Module=Presentation_State, VR=TM, VM=1, Type 1 DcmTime presentationCreationTime; /// Module=Presentation_State, VR=PN, VM=1, Type 2 DcmPersonName presentationCreatorsName; /// ReferencedSeriesSequence, Module=Presentation_State DVPSReferencedSeries_PList referencedSeriesList; // shutterPresentationValue; Type 1c. See Display Shutter module /* Module: SOP Common (M) * we don't store the SOP Class UID because it is well known. */ /// Module=SOP_Common, VR=UI, VM=1, Type 1 DcmUniqueIdentifier sOPInstanceUID; /// Module=SOP_Common, VR=CS, VM=1-n, Type 1C DcmCodeString specificCharacterSet; /// Module=SOP_Common, VR=DA, VM=1, Type 3 DcmDate instanceCreationDate; /// Module=SOP_Common, VR=TM, VM=1, Type 3 DcmTime instanceCreationTime; /// Module=SOP_Common, VR=UI, VM=1, Type 3 DcmUniqueIdentifier instanceCreatorUID; /* Module: Display Shutter (C) * "required if display shutter to be applied and BitmapDispShutter not present" */ /// if true, a rectangular shutter is in use OFBool useShutterRectangular; /// if true, a circular shutter is in use OFBool useShutterCircular; /// if true, a polygonal shutter is in use OFBool useShutterPolygonal; /// if true, a bitmap shutter is in use OFBool useShutterBitmap; /// Module=Display_Shutter, VM=CS, VR=1-3, Type 1 DcmCodeString shutterShape; /// Module=Display_Shutter, VR=IS, VM=1, Type 1C DcmIntegerString shutterLeftVerticalEdge; /// Module=Display_Shutter, VR=IS, VM=1, Type 1C DcmIntegerString shutterRightVerticalEdge; /// Module=Display_Shutter, VR=IS, VM=1, Type 1C DcmIntegerString shutterUpperHorizontalEdge; /// Module=Display_Shutter, VR=IS, VM=1, Type 1C DcmIntegerString shutterLowerHorizontalEdge; /// Module=Display_Shutter, VR=IS, VM=2, Type 1C DcmIntegerString centerOfCircularShutter; /// Module=Display_Shutter, VR=IS, VM=1, Type 1C DcmIntegerString radiusOfCircularShutter; /// Module=Display_Shutter, VR=IS, VM=2-2n, Type 1C DcmIntegerString verticesOfThePolygonalShutter; /// Module=Display_Shutter, VR=US, VM=1, Type 3 (1c in other modules) DcmUnsignedShort shutterPresentationValue; /* Module: Bitmap Display Shutter (C) * "required if display shutter to be applied and DispShutter not present" */ /// Module=Bitmap_Display_Shutter, VR=US, VM=1, Type 1 DcmUnsignedShort shutterOverlayGroup; // shutterPresentationValue already defined in Display Shutter module // shutterShape already defined in Display Shutter module /* Module: Overlay Plane (C) * "required if overlay to be applied or BitmapDispShutter present" */ /// Overlay(s), Module=Overlay_Plane DVPSOverlay_PList overlayList; /* Module: Overlay/Curve Activation (C) * "required if ref. image contains overlay or curve to be displayed" */ /// Overlay/Curve Activation Layer(s), Module=Overlay_Activation/Curve_Activation DVPSOverlayCurveActivationLayer_PList activationLayerList; /* Module: Graphic Annotation (C) * "required if graphical annotation to be applied" */ /// GraphicAnnotationSequence, Module=Graphic_Annotation DVPSGraphicAnnotation_PList graphicAnnotationList; /* Module: Spatial Transformation (C) * "required if rotation/flipping/magnification to be applied" */ /// Module=Spatial_Transform, VR=US, VM=1, Type 1 DcmUnsignedShort imageRotation; /// Module=Spatial_Transform, VR=CS, VM=1, Type 1 DcmCodeString imageHorizontalFlip; /* Module: Graphic Layer (C) * "required if graphic annotation, overlays or curves to be applied" */ /// GraphicLayerSequence, Module=Graphic_Layer DVPSGraphicLayer_PList graphicLayerList; /* Module: Modality LUT (C) * "required if modality LUT to be applied" * There must never be more that one Modality LUT for one Presentation State, * therefore we need not save a list of LUTs. */ /// if true, a modality rescale slope/intercept is set OFBool useModalityRescale; /// if true, a modality LUT is set OFBool useModalityLUT; /// Module=Modality_LUT, VR=xs, VM=3, Type 1c DcmUnsignedShort modalityLUTDescriptor; /// Module=Modality_LUT, VR=LO, VM=1, Type 3 DcmLongString modalityLUTExplanation; /// Module=Modality_LUT, VR=LO, VM=1, Type 3 DcmLongString modalityLUTType; /// Module=Modality_LUT, VR=xs, VM=1-n, Type 1c DcmUnsignedShort modalityLUTData; /// Module=Modality_LUT, VR=DS, VM=1, Type 1c DcmDecimalString rescaleIntercept; /// Module=Modality_LUT, VR=DS, VM=1, Type 1c DcmDecimalString rescaleSlope; /// Module=Modality_LUT, VR=LO, VM=1, Type 1c DcmLongString rescaleType; /* Module: Softcopy VOI LUT (C) * "required if VOI LUT to be applied" */ /// Module=Softcopy_VOI_LUT, VR=SQ, Card=1-n, Type 1 DVPSSoftcopyVOI_PList softcopyVOIList; }; #endif /* * $Log: dcmpstat.h,v $ * Revision 1.7 2010-10-14 13:16:35 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.6 2010-10-07 14:31:35 joergr * Removed leading underscore characters from preprocessor symbols (reserved). * * Revision 1.5 2010-08-09 13:20:50 joergr * Updated data dictionary to 2009 edition of the DICOM standard. From now on, * the official "keyword" is used for the attribute name which results in a * number of minor changes (e.g. "PatientsName" is now called "PatientName"). * * Revision 1.4 2009-11-24 14:12:57 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.3 2009-05-28 10:40:20 joergr * Fixed various Doxygen API documentation issues. * * Revision 1.2 2005/12/08 16:03:29 meichel * Changed include path schema for all DCMTK header files * * Revision 1.1 2003/08/27 14:57:19 meichel * Splitted class DVPresentationState into a base class DcmPresentationState * that does not depend on module dcmimgle and current derived class with * public API identical to the previous version. * * */ dcmtk-3.6.0/dcmpstat/include/dcmtk/dcmpstat/dvpshlp.h0000644000310500011400000001365111455601264022065 0ustar joergrdicom3/* * * Copyright (C) 1998-2010, 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, Joerg Riesmeier * * Purpose: * classes: DVPSHelper * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:16:36 $ * CVS/RCS Revision: $Revision: 1.9 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DVPSHLP_H #define DVPSHLP_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcsequen.h" class DcmFileFormat; /** this class contains a collection of static helper methods. */ class DVPSHelper { public: /** helper function which loads a DICOM file and returns a * pointer to a DcmFileFormat object if loading succeeds. * @param filename name of DICOM file to be loaded * @param fileformat pointer to DcmFileFormat object passed back here * @return EC_Normal upon success, an error code otherwise. */ static OFCondition loadFileFormat(const char *filename, DcmFileFormat *&fileformat); /** helper function which saves a DICOM object to file. * @param filename name of DICOM file to be created * @param fileformat DICOM object to be saved * @param explicitVR selects the transfer syntax to be written. * True selects Explicit VR Little Endian, False selects Implicit VR Little Endian. * @return EC_Normal upon success, an error code otherwise. */ static OFCondition saveFileFormat(const char *filename, DcmFileFormat *fileformat, OFBool explicitVR); /** helper function that inserts a new element into a DICOM dataset. * A new DICOM element of the type determined by the tag is created. * The string value (if any) is assigned and the element is inserted * into the dataset. Only tags corresponding to string VRs may be passed. * @param item the dataset into which the new element is inserted * @param tag the tag key of the new DICOM element, must have string VR. * @param value the value to be inserted. If omitted, an empty element is created. * @return EC_Normal upon success, an error code otherwise. */ static OFCondition putStringValue(DcmItem *item, DcmTagKey tag, const char *value=NULL); /** helper function that inserts a new element into a DICOM dataset. * A new DICOM element of type "US" is created, the value is assigned * and the element is inserted into the dataset. * @param item the dataset into which the new element is inserted * @param tag the tag key of the new DICOM element, must have "US" VR. * @param value the value to be inserted. * @return EC_Normal upon success, an error code otherwise. */ static OFCondition putUint16Value(DcmItem *item, DcmTagKey tag, Uint16 value); /** helper function that cleans up pending processes under Unix. * No function if used on Windows. */ static void cleanChildren(); /** helper function that writes the current date in DICOM format (YYYYMMDD) * @param str current date is written to this string */ static void currentDate(OFString &str); /** helper function that writes the current time in DICOM format (HHMMSS) * @param str current time is written to this string */ static void currentTime(OFString &str); /** assigns the given value to the given DICOM element if it is empty * and the status is OK, returns new status. * @param result status in/out * @param a_name DICOM element to be set * @param a_value new value, must not be NULL. */ static void setDefault(OFCondition& result, DcmElement& a_name, const char *a_value); /** static helper method that checks whether the given sequence contains an * item with a ReferencedSOPClassUID element that matches the given UID string. * @param seq sequence to be searched, should be a PrintManagementCapabilitiesSequence. * @param uid UID string * @return OFTrue if found, OFFalse otherwise. Returns OFFalse if uid is NULL. */ static OFBool haveReferencedUIDItem(DcmSequenceOfItems& seq, const char *uid); /** static helper method that adds an item to the given sequence. The item * contains a ReferencedSOPClassUID element with the given UID string as value. * @param seq sequence to be added to, should be a PrintManagementCapabilitiesSequence. * @param uid UID string, must not be NULL * @return EC_Normal if successful, an error code otherwise. */ static OFCondition addReferencedUIDItem(DcmSequenceOfItems& seq, const char *uid); }; #endif /* * CVS/RCS Log: * $Log: dvpshlp.h,v $ * Revision 1.9 2010-10-14 13:16:36 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.8 2009-11-24 14:12:57 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.7 2009-09-30 10:42:38 uli * Make dcmpstat's include headers self-sufficient by including all * needed headers directly and stop using dctk.h * * Revision 1.6 2005-12-08 16:03:49 meichel * Changed include path schema for all DCMTK header files * * Revision 1.5 2001/09/26 15:36:12 meichel * Adapted dcmpstat to class OFCondition * * Revision 1.4 2001/06/01 15:50:17 meichel * Updated copyright header * * Revision 1.3 2000/06/02 16:00:47 meichel * Adapted all dcmpstat classes to use OFConsole for log and error output * * Revision 1.2 2000/03/08 16:28:53 meichel * Updated copyright header. * * Revision 1.1 1999/09/17 14:28:00 meichel * Moved static helper functions to new class DVPSHelper, removed some unused code. * * */ dcmtk-3.6.0/dcmpstat/include/dcmtk/dcmpstat/dvpsib.h0000644000310500011400000004367411455601264021704 0ustar joergrdicom3/* * * Copyright (C) 1998-2010, 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: DVPSImageBoxContent * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:16:36 $ * CVS/RCS Revision: $Revision: 1.24 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DVPSIB_H #define DVPSIB_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/ofstd/ofstring.h" #include "dcmtk/dcmdata/dctk.h" #include "dcmtk/dcmpstat/dvpstyp.h" /* for enum types */ #include "dcmtk/dcmnet/dimse.h" class DVPSPresentationLUT_PList; class DVConfiguration; /** the representation of a Image Box Content SQ item for Stored Print */ class DVPSImageBoxContent { public: /// default constructor DVPSImageBoxContent(); /// copy constructor DVPSImageBoxContent(const DVPSImageBoxContent& copy); /** clone method. * @return a pointer to a new DVPSImageBoxContent object containing * a copy of this object. */ DVPSImageBoxContent *clone() { return new DVPSImageBoxContent(*this); } /// destructor virtual ~DVPSImageBoxContent(); /** resets the object to initial state. * After this call, the object is in the same state as after * creation with the default constructor. */ void clear(); /** reads an image box content item from a DICOM dataset. * The DICOM elements of the referenced item are copied * from the dataset to this object. * The completeness of the item (presence of all required elements, * value multiplicity) is checked. * If this method returns an error code, the object is in undefined state afterwards. * @param dset the item of the ImageBoxContentSequence from which the data is to be read * @param presentationLUTList list of presentation LUTs which may be referenced * @return EC_Normal if successful, an error code otherwise. */ OFCondition read(DcmItem &dset, DVPSPresentationLUT_PList& presentationLUTList); /** writes the image box managed by this object to a DICOM dataset. * Copies of the DICOM element managed by this object are inserted into * the DICOM dataset. * @param dset the the item of the ImageBoxContentSequence to which the data is written * @param writeRequestedImageSize if false, the Requested Image Size attribute is not written, * e.g. because it is not supported by the target printer. * @param writeReferencedPLUTSQ if false, the Referenced Presentation LUT Sequence is not written, * e.g. because a "general" presentation LUT is used instead of those referenced by the image boxes. * @return EC_Normal if successful, an error code otherwise. */ OFCondition write(DcmItem &dset, OFBool writeRequestedImageSize, OFBool writeReferencedPLUTSQ = OFTrue); /** create default values for all missing type 1 elements. * Called before a stored print object is written. * @param renumber if true, a new imageBoxPosition values is created * @param number new imageBoxPosition to be assigned * @param ignoreEmptyImages if true, an empty image box position does not cause an error. * @return EC_Normal if successful, an error code otherwise. */ OFCondition createDefaultValues(OFBool renumber, unsigned long number, OFBool ignoreEmptyImages); /** returns the referencedSOPClassUID from the ReferencedImageSequence * @return referencedSOPClassUID string */ const char *getSOPClassUID(); /** sets the content of this image box object. * @param instanceuid SOP instance UID of this image box * @param retrieveaetitle retrieve AETITLE of the referenced image * @param refstudyuid study instance UID of the referenced image * @param refseriesuid series instance UID of the referenced image * @param refsopclassuid SOP class UID of the referenced image * @param refsopinstanceuid SOP instance UID of the referenced image * @param requestedimagesize requested images size for this image * @param patientid patient ID for the referenced image * @param presentationlutreference referenced SOP instance UID for the referenced Presentation LUT, * @return EC_Normal if successful, an error code otherwise. */ OFCondition setContent( const char *instanceuid, const char *retrieveaetitle, const char *refstudyuid, const char *refseriesuid, const char *refsopclassuid, const char *refsopinstanceuid, const char *requestedimagesize, const char *patientid, const char *presentationlutreference); /** sets the (optional) requested decimate/crop behaviour for this image box. * @param value new enumerated value. The caller is responsible for * making sure that the selected printer supports decimate/crop * if a non-default value is set. * @return EC_Normal if successful, an error code otherwise. */ OFCondition setRequestedDecimateCropBehaviour(DVPSDecimateCropBehaviour value); /** gets the current requested decimate/crop behaviour setting * that is used for this image box. * @return requested decimate/crop behaviour */ DVPSDecimateCropBehaviour getRequestedDecimateCropBehaviour(); /** checks whether image box has additional settings * that are not default. * @return OFTrue if additional settings exist, OFFalse otherwise. */ OFBool hasAdditionalSettings(); /** gets the (optional) referenced Presentation LUT Instance UID. * @return UID, may be NULL. */ const char *getReferencedPresentationLUTInstanceUID(); /** gets the polarity. * @return polarity, may be NULL. */ const char *getPolarity(); /** gets the requested image size. * @return requested image size, may be NULL. */ const char *getRequestedImageSize(); /** gets the (optional) magnification type. * @return magnification type, may be NULL. */ const char *getMagnificationType(); /** gets the (optional) smoothing type. * @return smoothing type, may be NULL. */ const char *getSmoothingType(); /** gets the (optional) configuration information. * @return configuration information, may be NULL. */ const char *getConfigurationInformation(); /** gets the current SOP Instance UID. * @return SOP Instance UID, may be NULL. */ const char *getSOPInstanceUID(); /** gets the current image box position, 0 if none is set. * @return image box position */ Uint16 getImageBoxPosition(); /** sets the polarity. * @param value new attribute value (NORMAL or REVERSE), may be NULL. * @return EC_Normal if successful, an error code otherwise. */ OFCondition setPolarity(const char *value); /** sets the requested image size. * @param value new attribute value, may be NULL. * @return EC_Normal if successful, an error code otherwise. */ OFCondition setRequestedImageSize(const char *value); /** sets the (optional) magnification type. * @param value new attribute value, may be NULL. * The caller is responsible for making sure * that the value is valid for the selected printer. * @return EC_Normal if successful, an error code otherwise. */ OFCondition setMagnificationType(const char *value); /** sets the (optional) smoothing type. * @param value new attribute value, may be NULL. * The caller is responsible for making sure * that the value is valid for the selected printer. * @return EC_Normal if successful, an error code otherwise. */ OFCondition setSmoothingType(const char *value); /** sets the (optional) configuration information. * @param value new attribute value, may be NULL. * The caller is responsible for making sure * that the value is valid for the selected printer. * @return EC_Normal if successful, an error code otherwise. */ OFCondition setConfigurationInformation(const char *value); /** sets the SOP instance UID (which is returned by the Print SCP). * @param value new attribute value, must not be NULL. * @return EC_Normal if successful, an error code otherwise. */ OFCondition setSOPInstanceUID(const char *value); /** sets magnification type, smoothing type and configuration information back to default. * @return EC_Normal if successful, an error code otherwise. */ OFCondition setDefault(); /** returns the image UIDs that are required to look up the referenced image in the database * @param studyUID Study UID of the image * @param seriesUID series UID of the image * @param instanceUID instance UID of the image * @return EC_Normal if successful, an error code otherwise. */ OFCondition getImageReference(const char *&studyUID, const char *&seriesUID, const char *&instanceUID); /** writes the attributes managed by this objects that are part of a * basic grayscale image box N-SET request into the DICOM dataset. * Copies of the DICOM element managed by this object are inserted into * the DICOM dataset. * @param dset the dataset to which the data is written * @return EC_Normal if successful, an error code otherwise. */ OFCondition prepareBasicImageBox(DcmItem &dset); /** checks whether the given Presentation LUT type could be used together * with this image box on a Print SCP that requires a matching alignment * between a Presentation LUT and the image pixel data. * @param align LUT alignment type * @return OFTrue if matching, OFFalse otherwise */ OFBool matchesPresentationLUT(DVPSPrintPresentationLUTAlignment align) const; /** performs a Print SCP Basic Grayscale Image Box N-SET operation. * The results of the N-SET operation are stored in the objects passed as * rsp and rspDataset. * @param cfg config file facility * @param cfgname symbolic printer name in config file * @param rqDataset N-SET request dataset * @param rsp N-SET response message * @param rspDataset N-SET response dataset passed back in this parameter * @param imageDataset a hardcopy grayscale image (without general study * and general series modules which must be added by the caller) * containing the image data from the N-SET request is written to * this dataset if the method returns successfully. * @param align describes the current Presentation LUT. Used if the Print * SCP has been configured to enforce a matching of Presentation LUT * and pixel data bit depth. * @param presentationLUTnegotiated * OFTrue if support for the Presentation LUT SOP class * has been negotiated at association negotiation * @return OFTrue if N-SET operation was successful, OFFalse otherwise. */ OFBool printSCPSet( DVConfiguration& cfg, const char *cfgname, DcmDataset *rqDataset, T_DIMSE_Message& rsp, DcmDataset *& rspDataset, DcmDataset &imageDataset, DVPSPrintPresentationLUTAlignment align, OFBool presentationLUTnegotiated); /** assigns new values for study instance UID, series instance UID * and retrieve aetitle. * @param studyUID new studyUID * @param seriesUID new seriesUID * @param aetitle new retrieve aetitle, must not be NULL. * @return EC_Normal if successful, an error code otherwise. */ OFCondition setUIDsAndAETitle( DcmUniqueIdentifier& studyUID, DcmUniqueIdentifier& seriesUID, const char *aetitle); private: /// private undefined assignment operator DVPSImageBoxContent& operator=(const DVPSImageBoxContent&); /** writes a Referenced Presentation LUT SQ to the given * dataset. Helper function used in the more general write() method. * @param dset the dataset to which the data is written * @return EC_Normal if successful, an error code otherwise. */ OFCondition addReferencedPLUTSQ(DcmItem &dset); /** evaluates the contents of the Basic Grayscale Image Sequence during a * Print SCP Basic Grayscale Image Box N-SET operation. * The results of the N-SET operation are stored in the object passed as rsp. * @param cfg config file facility * @param cfgname symbolic printer name in config file * @param rqDataset first item of the Basic Grayscale Image Sequence * @param rsp N-SET response message * @param imageDataset a hardcopy grayscale image (without general study * and general series modules which must be added by the caller) * containing the image data from the N-SET request is written to * this dataset if the method returns successfully. * @param align describes the current Presentation LUT. Used if the Print * SCP has been configured to enforce a matching of Presentation LUT * and pixel data bit depth. * @param presentationLUTnegotiated * OFTrue if support for the Presentation LUT SOP class * has been negotiated at association negotiation * @return OFTrue if N-SET operation was successful, OFFalse otherwise. */ OFBool printSCPEvaluateBasicGrayscaleImageSequence( DVConfiguration& cfg, const char *cfgname, DcmItem *rqDataset, T_DIMSE_Message& rsp, DcmDataset &imageDataset, DVPSPrintPresentationLUTAlignment align, OFBool presentationLUTnegotiated); /// Module=Image_Box_List, VR=UI, VM=1, Type 1(c) DcmUniqueIdentifier sOPInstanceUID; /// Module=Image_Box_List, VR=US, VM=1, Type 1 DcmUnsignedShort imageBoxPosition; /// Module=Image_Box_List, VR=CS, VM=1, Type 2 DcmCodeString polarity; /// Module=Image_Box_List, VR=CS, VM=1, Type 3 DcmCodeString magnificationType; /// Module=Image_Box_List, VR=ST, VM=1, Type 3 DcmShortText configurationInformation; /// Module=Image_Box_List, VR=CS, VM=1, Type 3 DcmCodeString smoothingType; /// Module=Image_Box_List, VR=DS, VM=1, Type 3 DcmDecimalString requestedImageSize; /// Module=Image_Box_List (Supplement 38), VR=CS, VM=1, Type 3 DcmCodeString requestedDecimateCropBehavior; /* the following attributes belong to the ReferencedImageSequence * which must have exactly one item here. */ /// Module=Image_Box_List, VR=AE, VM=1-n, Type 1 DcmApplicationEntity retrieveAETitle; /// Module=Image_Box_List, VR=UI, VM=1, Type 1 DcmUniqueIdentifier referencedSOPClassUID; /// Module=Image_Box_List, VR=UI, VM=1, Type 1 DcmUniqueIdentifier referencedSOPInstanceUID; /// Module=Image_Box_List, VR=UI, VM=1, Type 1 DcmUniqueIdentifier studyInstanceUID; /// Module=Image_Box_List, VR=UI, VM=1, Type 1 DcmUniqueIdentifier seriesInstanceUID; /// Module=Image_Box_List, VR=IS, VM=1, Type 1c DcmIntegerString referencedFrameNumber; /// Module=Image_Box_List, VR=LO, VM=1, Type 2 DcmLongString patientID; // we do not support the ReferencedImageOverlayBoxSequence which is retired in Supplement 35 anyway. // the ReferencedPresentationLUTSequence is only created/read on the fly DcmUniqueIdentifier referencedPresentationLUTInstanceUID; /// describes whether the image depth is 8 bit or 12 bit. DVPSImageDepth imageDepth; }; #endif /* * $Log: dvpsib.h,v $ * Revision 1.24 2010-10-14 13:16:36 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.23 2010-10-07 14:31:35 joergr * Removed leading underscore characters from preprocessor symbols (reserved). * * Revision 1.22 2009-11-24 14:12:57 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.21 2005-12-08 16:03:50 meichel * Changed include path schema for all DCMTK header files * * Revision 1.20 2001/09/26 15:36:12 meichel * Adapted dcmpstat to class OFCondition * * Revision 1.19 2001/06/01 15:50:17 meichel * Updated copyright header * * Revision 1.18 2000/07/04 15:58:01 joergr * Added support for overriding the presentation LUT settings made for the * image boxes. * * Revision 1.17 2000/06/14 11:28:13 joergr * Added methods to access the attributes Polarity and Requested Image Size. * * Revision 1.16 2000/06/08 10:44:29 meichel * Implemented Referenced Presentation LUT Sequence on Basic Film Session level. * Empty film boxes (pages) are not written to file anymore. * * Revision 1.15 2000/06/07 14:17:41 joergr * Added methods to access the image polarity attribute. * * Revision 1.14 2000/06/02 16:00:47 meichel * Adapted all dcmpstat classes to use OFConsole for log and error output * * Revision 1.13 2000/05/31 12:56:38 meichel * Added initial Print SCP support * * Revision 1.12 2000/03/08 16:28:53 meichel * Updated copyright header. * * Revision 1.11 1999/10/07 17:21:47 meichel * Reworked management of Presentation LUTs in order to create tighter * coupling between Softcopy and Print. * * Revision 1.10 1999/09/24 15:23:44 meichel * Print spooler (dcmprtsv) now logs diagnostic messages in log files * when operating in spool mode. * * Revision 1.9 1999/09/17 14:33:56 meichel * Completed print spool functionality including Supplement 22 support * * Revision 1.8 1999/09/15 17:43:27 meichel * Implemented print job dispatcher code for dcmpstat, adapted dcmprtsv * and dcmpsprt applications. * * Revision 1.7 1999/09/10 12:46:46 meichel * Added implementations for a number of print API methods. * * Revision 1.6 1999/09/09 14:57:32 thiel * Added methods for print spooler * * Revision 1.5 1999/09/01 16:14:40 meichel * Added support for requested image size to print routines * * Revision 1.4 1999/08/31 14:09:10 meichel * Added get/set methods for stored print attributes * * Revision 1.3 1999/08/27 15:57:55 meichel * Added methods for saving hardcopy images and stored print objects * either in file or in the local database. * * Revision 1.2 1999/08/26 09:30:59 thiel * Add extensions for the usage of the StoredPrint * * Revision 1.1 1999/07/30 13:34:47 meichel * Added new classes managing Stored Print objects * * */ dcmtk-3.6.0/dcmpstat/include/dcmtk/dcmpstat/dvpsdef.h0000644000310500011400000002314711455601264022041 0ustar joergrdicom3/* * * Copyright (C) 1998-2010, 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: * definitions of constants and macros for pstat module * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:16:36 $ * CVS/RCS Revision: $Revision: 1.12 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DVPSDEF_H #define DVPSDEF_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/oflog/oflog.h" OFLogger DCM_dcmpstatGetLogger(); OFLogger DCM_dcmpstatDumpGetLogger(); OFLogger DCM_dcmpstatLogfileGetLogger(); #define DCMPSTAT_TRACE(msg) OFLOG_TRACE(DCM_dcmpstatGetLogger(), msg) #define DCMPSTAT_DEBUG(msg) OFLOG_DEBUG(DCM_dcmpstatGetLogger(), msg) #define DCMPSTAT_INFO(msg) OFLOG_INFO(DCM_dcmpstatGetLogger(), msg) #define DCMPSTAT_WARN(msg) OFLOG_WARN(DCM_dcmpstatGetLogger(), msg) #define DCMPSTAT_ERROR(msg) OFLOG_ERROR(DCM_dcmpstatGetLogger(), msg) #define DCMPSTAT_FATAL(msg) OFLOG_FATAL(DCM_dcmpstatGetLogger(), msg) #define DCMPSTAT_DUMP(msg) OFLOG_DEBUG(DCM_dcmpstatDumpGetLogger(), msg) #define DCMPSTAT_LOGFILE(msg) OFLOG_DEBUG(DCM_dcmpstatLogfileGetLogger(), msg) /* default for max PDU size */ #define DEFAULT_MAXPDU 16384 #define DEFAULT_filmDestination "DEFAULT" #define DEFAULT_filmOrientation "PORTRAIT" #define DEFAULT_filmSizeID "DEFAULT" #define DEFAULT_illumination 2000 #define DEFAULT_imageDisplayFormat "STANDARD\\1,1" #define DEFAULT_imageNumber "1" #define DEFAULT_magnificationType "DEFAULT" #define DEFAULT_maxDensity 320 #define DEFAULT_mediumType "DEFAULT" #define DEFAULT_minDensity 20 #define DEFAULT_numberOfCopies "1" #define DEFAULT_ownerID "DEFAULT" #define DEFAULT_patientName "^^^^" #define DEFAULT_presentationLabel "UNNAMED" #define DEFAULT_printerStatus "NORMAL" #define DEFAULT_printerStatusInfo "NORMAL" #define DEFAULT_priority "MED" #define DEFAULT_reflectedAmbientLight 10 #define DEFAULT_seriesNumber "1" #define DEFAULT_shutterPresentationValue 0 #define DEFAULT_specificCharacterSet "ISO_IR 100" #define DEFAULT_trim "NO" /* SOP instance UID used by the Print SCP when creating a default IDENTITY Presentation LUT */ #define WELLKNOWN_IDENTITY_PLUT_UID "1.2.276.0.7230010.3.4.1915765545.18030.917282194.1" /* SOP class UID used by the Print SCP when storing a DIMSE log as a DICOM file */ #define PSTAT_DIMSE_LOG_STORAGE_UID "1.2.276.0.7230010.3.4.1915765545.18030.917282194.2" /* size_t value indicating that no index is active or available */ #define DVPS_IDX_NONE ((size_t)-1) /* max study count for DB handle creation */ #define PSTAT_MAXSTUDYCOUNT 200 /* study size for DB handle creation */ #define PSTAT_STUDYSIZE DB_UpperMaxBytesPerStudy /* filename suffixes for print jobs */ #define PRINTJOB_SUFFIX ".job" #define PRINTJOB_DONE_SUFFIX ".old" #define PRINTJOB_TEMP_SUFFIX ".tmp" /* default AETitle for the Presentation State viewer */ #define PSTAT_AETITLE "DCMPSTAT" /* default path for database folder */ #define PSTAT_DBFOLDER "." /* default path for LUT folder */ #define PSTAT_LUTFOLDER "." /* default path for report folder */ #define PSTAT_REPORTFOLDER "." /* default path for spool folder */ #define PSTAT_SPOOLFOLDER "." /* config file facility constant for high resolution graphics */ #define L2_HIGHRESOLUTIONGRAPHICS "HIGHRESOLUTIONGRAPHICS" #define PSTAT_DCM_LogReservation DcmTag(0x0009, 0x0010, EVR_LO) #define PSTAT_DCM_AcseSequence DcmTag(0x0009, 0x1100, EVR_SQ) #define PSTAT_DCM_LogSequence DcmTag(0x0009, 0x1200, EVR_SQ) #define PSTAT_DCM_LogEntryType DcmTag(0x0009, 0x1001, EVR_CS) #define PSTAT_DCM_LogDate DcmTag(0x0009, 0x1002, EVR_DA) #define PSTAT_DCM_LogTime DcmTag(0x0009, 0x1003, EVR_TM) #define PSTAT_DCM_AssociateData DcmTag(0x0009, 0x1004, EVR_OB) /* --------------- a few macros which avoid copy/paste code --------------- */ // inserts a copy of a dicom data element into a dataset #define ADD_TO_DATASET(a_type, a_name) \ if (result==EC_Normal) \ { \ delem = new a_type(a_name); \ if (delem) dset.insert(delem, OFTrue); else result=EC_MemoryExhausted; \ } // inserts a copy of a dicom data element into an item #define ADD_TO_DATASET2(a_type, a_name) \ if (result==EC_Normal) \ { \ delem = new a_type(a_name); \ if (delem) ditem->insert(delem, OFTrue); else result=EC_MemoryExhausted; \ } // inserts a copy of a dicom data element into an item #define ADD_TO_PDATASET(a_type, a_name) \ if (writeresult==EC_Normal) \ { \ delem = new a_type(a_name); \ if (delem) rspDataset->insert(delem, OFTrue); else writeresult=EC_MemoryExhausted; \ } // inserts a copy of a repeating element into a dataset, assigns group number #define ADD_REPEATING_ELEMENT_TO_DATASET(a_type, a_name, a_group) \ if (result==EC_Normal) \ { \ delem = new a_type(a_name); \ if (delem) \ { \ delem->setGTag(a_group); \ dset.insert(delem, OFTrue); \ } else result=EC_MemoryExhausted; \ } // reads a dicom element from a dataset if present #define READ_FROM_DATASET(a_type, a_name) \ stack.clear(); \ if (EC_Normal == dset.search((DcmTagKey &)a_name.getTag(), stack, ESM_fromHere, OFFalse)) \ { \ a_name = *((a_type *)(stack.top())); \ } // reads a dicom element from an item if present #define READ_FROM_DATASET2(a_type, a_name) \ stack.clear(); \ if (EC_Normal == item->search((DcmTagKey &)a_name.getTag(), stack, ESM_fromHere, OFFalse)) \ { \ a_name = *((a_type *)(stack.top())); \ } // reads a dicom element from an item if present #define READ_FROM_PDATASET(a_type, a_name) \ stack.clear(); \ if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)a_name.getTag(), stack, ESM_fromHere, OFFalse))) \ { \ a_name = *((a_type *)(stack.top())); \ } // assigns a newly generated UID to a dicom element if it is empty #define SET_UID(a_name) \ if (result==EC_Normal) \ { \ if (a_name.getLength()==0) result = a_name.putString(dcmGenerateUniqueIdentifier(uid)); \ } #endif /* * $Log: dvpsdef.h,v $ * Revision 1.12 2010-10-14 13:16:36 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.11 2010-10-07 14:31:35 joergr * Removed leading underscore characters from preprocessor symbols (reserved). * * Revision 1.10 2009-12-15 14:50:49 uli * Fixes some issues with --logfile and the config's log options. * * Revision 1.9 2009-11-24 14:12:57 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.8 2005-12-08 16:03:41 meichel * Changed include path schema for all DCMTK header files * * Revision 1.7 2002/01/08 10:32:12 joergr * Corrected spelling of function dcmGenerateUniqueIdentifier(). * * Revision 1.6 2001/11/28 13:59:31 joergr * Check return value of DcmItem::insert() statements where appropriate to * avoid memory leaks when insert procedure fails. * * Revision 1.5 2001/06/01 15:50:15 meichel * Updated copyright header * * Revision 1.4 2000/11/13 10:42:40 joergr * Added support for Structured Reporting "templates". * * Revision 1.3 2000/06/07 13:16:37 meichel * now using DIMSE status constants and log facilities defined in dcmnet * * Revision 1.2 2000/06/02 16:00:45 meichel * Adapted all dcmpstat classes to use OFConsole for log and error output * * Revision 1.1 2000/05/31 12:56:59 meichel * Moved dcmpstat macros and constants into a common header file * * */ dcmtk-3.6.0/dcmpstat/include/dcmtk/dcmpstat/dvpsal.h0000644000310500011400000001144611455601264021676 0ustar joergrdicom3/* * * Copyright (C) 1998-2010, 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: DVPSOverlayCurveActivationLayer * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:16:36 $ * CVS/RCS Revision: $Revision: 1.10 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DVPSAL_H #define DVPSAL_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcitem.h" #include "dcmtk/dcmdata/dcvrcs.h" /** a curve or overlay activation layer in a presentation state (internal use only). * This class manages the data structures comprising a single curve * activation layer or overlay activation layer * (one instance of the Curve Activation Layer Module or * Overlay Activation Layer Module repeating elements) * contained in a Presentation State object. */ class DVPSOverlayCurveActivationLayer { public: /// default constructor DVPSOverlayCurveActivationLayer(); /// copy constructor DVPSOverlayCurveActivationLayer(const DVPSOverlayCurveActivationLayer& copy); /** clone method. * @return a pointer to a new DVPSOverlayCurveActivationLayer object containing * a copy of this object. */ DVPSOverlayCurveActivationLayer *clone() { return new DVPSOverlayCurveActivationLayer(*this); } /// destructor virtual ~DVPSOverlayCurveActivationLayer(); /** reads the activation layer for the specified repeating group from a DICOM dataset. * The DICOM elements of the Overlay/Curve Activation Layer module are copied * from the dataset to this object. * The completeness of the module is checked. * If this method returns an error code, the object is in undefined state afterwards. * @param dset the DICOM dataset from which the activation layer is to be read * @param ovGroup the the repeating group to be read * @return EC_Normal if successful, an error code otherwise. */ OFCondition read(DcmItem &dset, Uint16 ovGroup); /** writes the activation layer managed by this object to a DICOM dataset. * Copies of the DICOM elements managed by this object are inserted into * the DICOM dataset. * @param dset the DICOM dataset to which the activation layer is written * @return EC_Normal if successful, an error code otherwise. */ OFCondition write(DcmItem &dset); /** set activation layer name of this activation. * @param aLayer a pointer to the activation layer name, which is copied into this object. */ void setActivationLayer(const char *aLayer); /** set repeating group of this activation. * @param rGroup the repeating group */ void setRepeatingGroup(Uint16 rGroup); /** get activation layer name. * @return a pointer to the activation layer name */ const char *getActivationLayer(); /** get repeating group. * @return the repeating group of this activation. */ Uint16 getRepeatingGroup(); /** compare repeating group. * @param rGroup the repeating group to compare * @return OFTrue if the activation matches the passed repeating group, OFFalse otherwise. */ OFBool isRepeatingGroup(Uint16 rGroup); private: /// private undefined assignment operator DVPSOverlayCurveActivationLayer& operator=(const DVPSOverlayCurveActivationLayer&); /// the repeating group managed by this object Uint16 repeatingGroup; /// VR=CS, VM=1, Type 2c DcmCodeString activationLayer; }; #endif /* * $Log: dvpsal.h,v $ * Revision 1.10 2010-10-14 13:16:36 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.9 2010-10-07 14:31:35 joergr * Removed leading underscore characters from preprocessor symbols (reserved). * * Revision 1.8 2009-11-24 14:12:57 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.7 2009-09-30 10:42:38 uli * Make dcmpstat's include headers self-sufficient by including all * needed headers directly and stop using dctk.h * * Revision 1.6 2005-12-08 16:03:34 meichel * Changed include path schema for all DCMTK header files * * Revision 1.5 2001/09/26 15:36:08 meichel * Adapted dcmpstat to class OFCondition * * Revision 1.4 2001/06/01 15:50:12 meichel * Updated copyright header * * Revision 1.3 2000/06/02 16:00:43 meichel * Adapted all dcmpstat classes to use OFConsole for log and error output * * Revision 1.2 2000/03/08 16:28:48 meichel * Updated copyright header. * * Revision 1.1 1998/11/27 14:50:24 meichel * Initial Release. * * */ dcmtk-3.6.0/dcmpstat/include/dcmtk/dcmpstat/dvpsgl.h0000644000310500011400000001635111455601264021704 0ustar joergrdicom3/* * * Copyright (C) 1998-2010, 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: DVPSGraphicLayer * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:16:36 $ * CVS/RCS Revision: $Revision: 1.11 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DVPSGL_H #define DVPSGL_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dctk.h" /** an item of the graphic layer sequence in a presentation state (internal use only). * This class manages the data structures comprising one item * of the Graphic Layer Sequence in a Presentation State object. */ class DVPSGraphicLayer { public: /// default constructor DVPSGraphicLayer(); /// copy constructor DVPSGraphicLayer(const DVPSGraphicLayer& copy); /** clone method. * @return a pointer to a new DVPSGraphicLayer object containing * a copy of this object. */ DVPSGraphicLayer *clone() { return new DVPSGraphicLayer(*this); } /// destructor virtual ~DVPSGraphicLayer(); /** reads a graphic layer from a DICOM dataset. * The DICOM elements of the Graphic Layer item are copied * from the dataset to this object. * The completeness of the item (presence of all required elements, * value multiplicity) is checked. * If this method returns an error code, the object is in undefined state afterwards. * @param dset the item of the GraphicLayerSequence from which the data is to be read * @return EC_Normal if successful, an error code otherwise. */ OFCondition read(DcmItem &dset); /** writes the graphic layer managed by this object to a DICOM dataset. * Copies of the DICOM element managed by this object are inserted into * the DICOM dataset. * @param dset the the item of the GraphicLayerSequence to which the data is written * @return EC_Normal if successful, an error code otherwise. */ OFCondition write(DcmItem &dset); /** get graphic layer name of this layer. * @return a pointer to the graphic layer name */ const char *getGL(); /** get graphic layer description of this layer. * @return a pointer to the graphic layer description */ const char *getGLDescription(); /** gets the graphic layer order of this layer. * @return the graphic layer order */ Sint32 getGLOrder(); /** checks whether a recommended display value (grayscale, color or both) exists. * @return OFTrue if a recommended display value exists */ OFBool haveGLRecommendedDisplayValue(); /** gets the recommended grayscale display value. * If the graphic layer contains an RGB display value but no grayscale * display value, the RGB value is implicitly converted to grayscale. * @param gray the recommended display value as an unsigned 16-bit P-value * is returned in this parameter. * @return EC_Normal upon success, an error code otherwise */ OFCondition getGLRecommendedDisplayValueGray(Uint16& gray); /** gets the recommended RGB display value. * If the graphic layer contains a grayscale display value but no RGB * display value, the grayscale value is implicitly converted to RGB. * @param r returns the R component of the recommended display value as unsigned 16-bit P-value * @param g returns the G component of the recommended display value as unsigned 16-bit P-value * @param b returns the B component of the recommended display value as unsigned 16-bit P-value * @return EC_Normal upon success, an error code otherwise */ OFCondition getGLRecommendedDisplayValueRGB(Uint16& r, Uint16& g, Uint16& b); /** removes recommended display values. * @param rgb if true, the RGB recommended display value is removed * @param monochrome if true the monochrome recommended display value is removed */ void removeRecommendedDisplayValue(OFBool rgb, OFBool monochrome); /** set graphic layer name of this layer. * @param gl a pointer to the graphic layer name, which is copied into this object. */ void setGL(const char *gl); /** set graphic layer order of this layer. * @param glOrder the graphic layer order. */ void setGLOrder(Sint32 glOrder); /** set graphic layer recommended grayscale display value of this layer. * This method does not affect (set or modify) the recommended RGB display value * which should be set separately. * @param gray the recommended display value in P-values 0..0xffff. */ void setGLRecommendedDisplayValueGray(Uint16 gray); /** set graphic layer recommended RGB display value of this layer. * This method does not affect (set or modify) the recommended grayscale display value * which should be set separately. * @param r the red component of the recommended display value in P-values 0..0xffff. * @param g the green component of the recommended display value in P-values 0..0xffff. * @param b the blue component of the recommended display value in P-values 0..0xffff. */ void setGLRecommendedDisplayValueRGB(Uint16 r, Uint16 g, Uint16 b); /** set graphic layer description of this layer. * @param glDescription a pointer to the graphic layer description, which is copied into this object. */ void setGLDescription(const char *glDescription); private: /// private undefined assignment operator DVPSGraphicLayer& operator=(const DVPSGraphicLayer&); /// VR=CS, VM=1, Type 1 DcmCodeString graphicLayer; /// VR=IS, VM=1, Type 1 DcmIntegerString graphicLayerOrder; /// VR=US, VM=1, Type 3 DcmUnsignedShort graphicLayerRecommendedDisplayGrayscaleValue; /// VR=US, VM=3, Type 3 DcmUnsignedShort graphicLayerRecommendedDisplayRGBValue; /// VR=LO, VM=1, Type 3 DcmLongString graphicLayerDescription; }; #endif /* * $Log: dvpsgl.h,v $ * Revision 1.11 2010-10-14 13:16:36 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.10 2010-10-07 14:31:35 joergr * Removed leading underscore characters from preprocessor symbols (reserved). * * Revision 1.9 2009-11-24 14:12:57 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.8 2005-12-08 16:03:45 meichel * Changed include path schema for all DCMTK header files * * Revision 1.7 2001/09/26 15:36:11 meichel * Adapted dcmpstat to class OFCondition * * Revision 1.6 2001/06/01 15:50:16 meichel * Updated copyright header * * Revision 1.5 2000/06/02 16:00:46 meichel * Adapted all dcmpstat classes to use OFConsole for log and error output * * Revision 1.4 2000/03/08 16:28:51 meichel * Updated copyright header. * * Revision 1.3 1999/07/22 16:39:08 meichel * Adapted dcmpstat data structures and API to supplement 33 letter ballot text. * * Revision 1.2 1998/12/14 16:10:29 meichel * Implemented Presentation State interface for graphic layers, * text and graphic annotations, presentation LUTs. * * Revision 1.1 1998/11/27 14:50:27 meichel * Initial Release. * * */ dcmtk-3.6.0/dcmpstat/include/dcmtk/dcmpstat/dvpssv.h0000644000310500011400000002356011455601264021732 0ustar joergrdicom3/* * * Copyright (C) 1998-2010, 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: DVPSSoftcopyVOI * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:16:36 $ * CVS/RCS Revision: $Revision: 1.10 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DVPSSV_H #define DVPSSV_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcvrus.h" #include "dcmtk/dcmdata/dcvrds.h" #include "dcmtk/dcmdata/dcvrlo.h" #include "dcmtk/dcmpstat/dvpsril.h" /* for DVPSReferencedImage_PList */ #include "dcmtk/dcmpstat/dvpstyp.h" /* for enum types */ class DVPSReferencedSeries_PList; /** the representation of one item of the Softcopy VOI LUT Sequence */ class DVPSSoftcopyVOI { public: /// default constructor DVPSSoftcopyVOI(); /// copy constructor DVPSSoftcopyVOI(const DVPSSoftcopyVOI& copy); /** clone method. * @return a pointer to a new DVPSSoftcopyVOI object containing * a copy of this object. */ DVPSSoftcopyVOI *clone() { return new DVPSSoftcopyVOI(*this); } /// destructor virtual ~DVPSSoftcopyVOI(); /** reads a softcopy VOI LUT item from a DICOM dataset. * The DICOM elements of the softcopy VOI LUT item are copied * from the dataset to this object. * The completeness of the item (presence of all required elements, * value multiplicity) is checked. * If this method returns an error code, the object is in undefined state afterwards. * @param dset the item of the SoftcopyVOILUTSequence from which the data is to be read * @return EC_Normal if successful, an error code otherwise. */ OFCondition read(DcmItem &dset); /** writes the dsoftcopy VOI LUT item managed by this object to a DICOM dataset. * Copies of the DICOM elements managed by this object are inserted into * the DICOM dataset. * @param dset the the item of the SoftcopyVOILUTSequence to which the data is written * @return EC_Normal if successful, an error code otherwise. */ OFCondition write(DcmItem &dset); /** checks if this displayed area is applicable to the given image and frame. * @param instanceUID SOP instance UID of the current image * @param frame number of the current frame * @return OFTrue if applicable. */ OFBool isApplicable(const char *instanceUID, unsigned long frame); /** checks if this displayed area matches exactly the applicability * defined by the instanceUID, frame and applicability parameters. * @param instanceUID SOP instance UID of the current image * @param frame number of the current frame * @return OFTrue if matching. */ OFBool matchesApplicability(const char *instanceUID, unsigned long frame, DVPSObjectApplicability applicability); /** add a new image reference. * Checks if the referenced SOP instance UID already exists in this sequence. * If it exists, an error code is returned. Otherwise a new image reference * is created and added to the ReferencedImageSequence. * @param sopclassUID the SOP class UID of the image reference to be added. * @param instanceUID the SOP instance UID of the image reference to be added. * @param frame the frame number of the image reference (current image) to be added. * @param applicability the applicability of the image reference (DVPSB_currentFrame or DVPSB_currentImage) * @return EC_Normal if successful, an error code otherwise. */ OFCondition addImageReference( const char *sopclassUID, const char *instanceUID, unsigned long frame, DVPSObjectApplicability applicability); /** removes a reference to an image or frame. If the current reference is empty ("global"), an * explicit list of references is constructed from the list of series/instance references. * The image or frame reference is removed from the total list of references in this object. * If the only reference contained in this object is removed, the reference list becomes empty * which means that the current reference becomes "global". This case must be handled by the * called (e.g. by deleting the displayed area selection object). * @param allReferences list of series/instance references registered for the presentation state. * @param instanceUID SOP instance UID of the current image * @param frame number of the current frame * @param numberOfFrames the number of frames of the current image * @param applicability applicability of the new displayed area selection * @param applicability the applicability of the image reference to be removed * (DVPSB_currentFrame or DVPSB_currentImage) */ void removeImageReference( DVPSReferencedSeries_PList& allReferences, const char *instanceUID, unsigned long frame, unsigned long numberOfFrames, DVPSObjectApplicability applicability); /** removes all image references for this displayed area. */ void clearImageReferences() { referencedImageList.clear(); } /** checks if the list of image references for this displayed area is empty. * @return OFTrue if list of image references is empty, OFFalse otherwise. */ OFBool imageReferencesEmpty() { if (referencedImageList.size()==0) return OFTrue; else return OFFalse; } /** check if a VOI LUT is currently active * @return OFTrue if a VOI LUT is active, OFFalse if VOI Window is active. */ OFBool haveLUT() { return useLUT; } /** returns a description string for a currently active VOI transform. * If no description is available, NULL is returned. * @return a pointer to a string or NULL. */ const char *getCurrentVOIDescription(); /** gets the width of the current VOI window. * May only be called if haveLUT() is OFFalse. * @param w the window width is returned in this parameter * @return EC_Normal upon success, an error code otherwise. */ OFCondition getCurrentWindowWidth(double &w); /** get the center of the current VOI window. * May only be called if haveLUT() is OFFalse. * @param c the window center is returned in this parameter * @return EC_Normal upon success, an error code otherwise. */ OFCondition getCurrentWindowCenter(double &c); /** returns a reference to the current VOI LUT descriptor. * May only be called if haveLUT() is OFTrue. * @return reference to the current VOI LUT descriptor */ DcmUnsignedShort& getLUTDescriptor() { return voiLUTDescriptor; } /** returns a reference to the current VOI LUT data. * May only be called if haveLUT() is OFTrue. * @return reference to the current VOI LUT data */ DcmUnsignedShort& getLUTData() { return voiLUTData; } /** sets a user defined VOI window center and width. * @param wCenter the window center * @param wWidth the window width * @param description an optional description. Default: absent. * @return EC_Normal upon success, an error code otherwise. */ OFCondition setVOIWindow(double wCenter, double wWidth, const char *description=NULL); /** stores (copies) a VOI lookup table. * If the method returns an error code, an old LUT is left unchanged. * @param lutDescriptor the LUT Descriptor in DICOM format (VM=3) * @param lutData the LUT Data in DICOM format * @param lutExplanation the LUT Explanation in DICOM format, may be empty. * @return EC_Normal if successful, an error code otherwise. */ OFCondition setVOILUT( DcmUnsignedShort& lutDescriptor, DcmUnsignedShort& lutData, DcmLongString& lutExplanation); private: /// private undefined assignment operator DVPSSoftcopyVOI& operator=(const DVPSSoftcopyVOI&); /* since the VOI LUT sequence in the Softcopy VOI LUT module must * not contain more than one item, we do not need to manage a list of * VOI LUT SQ items. */ /// ReferencedImageSequence, Type 1c DVPSReferencedImage_PList referencedImageList; /// If true, a VOI LUT is set, otherwise a VOI Window is set. OFBool useLUT; /// Module=VOI_LUT, VR=xs, VM=3, Type 1c DcmUnsignedShort voiLUTDescriptor; /// Module=VOI_LUT, VR=LO, VM=1, Type 3 DcmLongString voiLUTExplanation; /// Module=VOI_LUT, VR=xs, VM=1-n, Type 1c DcmUnsignedShort voiLUTData; /// Module=VOI_LUT, VR=DS, VM=1-n, Type 1c (unlike VOI LUT module!) DcmDecimalString windowCenter; /// Module=VOI_LUT, VR=DS, VM=1-n, Type 1c DcmDecimalString windowWidth; /// Module=VOI_LUT, VR=LO, VM=1-n, Type 3 DcmLongString windowCenterWidthExplanation; }; #endif /* * $Log: dvpssv.h,v $ * Revision 1.10 2010-10-14 13:16:36 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.9 2010-10-07 14:31:36 joergr * Removed leading underscore characters from preprocessor symbols (reserved). * * Revision 1.8 2009-11-24 14:12:57 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.7 2009-09-30 10:42:38 uli * Make dcmpstat's include headers self-sufficient by including all * needed headers directly and stop using dctk.h * * Revision 1.6 2005-12-08 16:04:05 meichel * Changed include path schema for all DCMTK header files * * Revision 1.5 2001/09/26 15:36:16 meichel * Adapted dcmpstat to class OFCondition * * Revision 1.4 2001/06/01 15:50:22 meichel * Updated copyright header * * Revision 1.3 2000/06/02 16:00:52 meichel * Adapted all dcmpstat classes to use OFConsole for log and error output * * Revision 1.2 2000/03/08 16:28:57 meichel * Updated copyright header. * * Revision 1.1 1999/07/22 16:39:12 meichel * Adapted dcmpstat data structures and API to supplement 33 letter ballot text. * * */ dcmtk-3.6.0/dcmpstat/include/dcmtk/dcmpstat/dvpsda.h0000644000310500011400000003056011455601264021664 0ustar joergrdicom3/* * * Copyright (C) 1998-2010, 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: DVPSDisplayedArea * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:16:36 $ * CVS/RCS Revision: $Revision: 1.10 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DVPSDA_H #define DVPSDA_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dctk.h" #include "dcmtk/dcmpstat/dvpsril.h" /* for DVPSReferencedImage_PList */ #include "dcmtk/dcmpstat/dvpstyp.h" /* for enum types */ class DVPSReferencedSeries_PList; /** an item of the displayed area selection sequence in a presentation state. */ class DVPSDisplayedArea { public: /// default constructor DVPSDisplayedArea(); /// copy constructor DVPSDisplayedArea(const DVPSDisplayedArea& copy); /** clone method. * @return a pointer to a new DVPSDisplayedArea object containing * a copy of this object. */ DVPSDisplayedArea *clone() { return new DVPSDisplayedArea(*this); } /// destructor virtual ~DVPSDisplayedArea(); /** reads an displayed area selection from a DICOM dataset. * The DICOM elements of the displayed area selection item are copied * from the dataset to this object. * The completeness of the item (presence of all required elements, * value multiplicity) is checked. * If this method returns an error code, the object is in undefined state afterwards. * @param dset the item of the DisplayedAreaSelectionSequence from which the data is to be read * @return EC_Normal if successful, an error code otherwise. */ OFCondition read(DcmItem &dset); /** writes the displayed area selection managed by this object to a DICOM dataset. * Copies of the DICOM element managed by this object are inserted into * the DICOM dataset. * @param dset the the item of the DisplayedAreaSelectionSequence to which the data is written * @return EC_Normal if successful, an error code otherwise. */ OFCondition write(DcmItem &dset); /** checks if this displayed area is applicable to the given image and frame. * @param instanceUID SOP instance UID of the current image * @param frame number of the current frame * @return OFTrue if applicable. */ OFBool isApplicable(const char *instanceUID, unsigned long frame); /** checks if this displayed area matches exactly the applicability * defined by the instanceUID, frame and applicability parameters. * @param instanceUID SOP instance UID of the current image * @param frame number of the current frame * @return OFTrue if matching. */ OFBool matchesApplicability(const char *instanceUID, unsigned long frame, DVPSObjectApplicability applicability); /** gets the presentation size mode for this displayed area selection. * @return presentation size mode */ DVPSPresentationSizeMode getPresentationSizeMode(); /** gets the presentation pixel aspect ratio for this displayed area selection. * Pixel aspect ratio is defined here as the width of a pixel divided * by the height of a pixel (x/y). * @return pixel aspect ratio */ double getPresentationPixelAspectRatio(); /** gets the displayed area top lefthand corner and * bottom righthand corner. * @param tlhcX the displayed area top lefthand corner X value is returned in this parameter * @param tlhcY the displayed area top lefthand corner Y value is returned in this parameter * @param brhcX the displayed area bottom righthand corner X value is returned in this parameter * @param brhcY the displayed area bottom righthand corner Y value is returned in this parameter */ void getDisplayedArea(Sint32& tlhcX, Sint32& tlhcY, Sint32& brhcX, Sint32& brhcY); /** gets the presentation pixel spacing for this displayed area if present. * @param x the horizontal pixel spacing (mm) is returned in this parameter upon success * @param y the vertical pixel spacing (mm) is returned in this parameter upon success * @return EC_Normal if successful, an error code if no presentation pixel spacing is available. */ OFCondition getPresentationPixelSpacing(double& x, double& y); /** gets the presentation pixel magnification ratio for this displayed area if present. * @param magnification the magnification ratio is returned in this parameter upon success * @return EC_Normal if successful, an error code if no magnification ratio is available. */ OFCondition getPresentationPixelMagnificationRatio(double& magnification); /** add a new image reference. * Checks if the referenced SOP instance UID already exists in this sequence. * If it exists, an error code is returned. Otherwise a new image reference * is created and added to the ReferencedImageSequence. * @param sopclassUID the SOP class UID of the image reference to be added. * @param instanceUID the SOP instance UID of the image reference to be added. * @param frame the frame number of the image reference (current image) to be added. * @param applicability the applicability of the image reference (DVPSB_currentFrame or DVPSB_currentImage) * @return EC_Normal if successful, an error code otherwise. */ OFCondition addImageReference( const char *sopclassUID, const char *instanceUID, unsigned long frame, DVPSObjectApplicability applicability); /** removes a reference to an image or frame. If the current reference is empty ("global"), an * explicit list of references is constructed from the list of series/instance references. * The image or frame reference is removed from the total list of references in this object. * If the only reference contained in this object is removed, the reference list becomes empty * which means that the current reference becomes "global". This case must be handled by the caller. * @param allReferences list of series/instance references registered for the presentation state. * @param instanceUID SOP instance UID of the current image * @param frame number of the current frame * @param numberOfFrames the number of frames of the current image * @param applicability the applicability of the image reference to be removed * (DVPSB_currentFrame or DVPSB_currentImage) */ void removeImageReference( DVPSReferencedSeries_PList& allReferences, const char *instanceUID, unsigned long frame, unsigned long numberOfFrames, DVPSObjectApplicability applicability); /** removes all image references for this displayed area. */ void clearImageReferences() { referencedImageList.clear(); } /** checks if the list of image references for this displayed area is empty. * @return OFTrue if list of image references is empty, OFFalse otherwise. */ OFBool imageReferencesEmpty() { if (referencedImageList.size()==0) return OFTrue; else return OFFalse; } /** checks if the TRUE SIZE mode is possible, i.e. * if pixel spacing is known. * @return OFTrue if TRUE SIZE mode is available, OFFalse otherwise. */ OFBool canUseTrueSize(); /** sets the displayed area pixel spacing and * removes any pixel aspect ratio setting. * @param spacingX horizontal pixel spacing in mm * @param spacingY vertical pixel spacing in mm * @return EC_Normal if successful, an error code otherwise. */ OFCondition setDisplayedAreaPixelSpacing(double spacingX, double spacingY); /** sets the displayed area pixel spacing and * removes any pixel aspect ratio setting. * @param spacing vertical/horizontal spacing in DICOM DS format. * @return EC_Normal if successful, an error code otherwise. */ OFCondition setDisplayedAreaPixelSpacing(const char *spacing); /** sets the displayed area pixel spacing and * removes any pixel spacing setting. * Pixel aspect ratio is defined here as the width of a pixel divided * by the height of a pixel (x/y). * @param ratio pixel aspect ratio * @return EC_Normal if successful, an error code otherwise. */ OFCondition setDisplayedAreaPixelAspectRatio(double ratio); /** sets the displayed area pixel spacing and * removes any pixel spacing setting. * @param ratio pixel aspect ratio in DICOM IS format. * @return EC_Normal if successful, an error code otherwise. */ OFCondition setDisplayedAreaPixelAspectRatio(const char *ratio); /** sets the displayed area and size mode. * @param sizeMode presentation size mode. * @param tlhcX displayed area top lefthand corner X * @param tlhcY displayed area top lefthand corner Y * @param brhcX displayed area bottom righthand corner X * @param brhcY displayed area bottom righthand corner Y * @param magnification magnification factor - ignored unless * sizeMode==DVPSD_magnify. * @return EC_Normal if successful, an error code otherwise. */ OFCondition setDisplayedArea( DVPSPresentationSizeMode sizeMode, Sint32 tlhcX, Sint32 tlhcY, Sint32 brhcX, Sint32 brhcY, double magnification=1.0); /** adjusts the displayed area coordinates for the rotation and flipping * status of the image. * @param rotationFrom previous rotation * @param isFlippedFrom previous flip status * @param rotationTo new rotation * @param isFlippedTo new flip status */ void rotateAndFlip( DVPSRotationType rotationFrom, OFBool isFlippedFrom, DVPSRotationType rotationTo, OFBool isFlippedTo); private: /** undefined private assignment operator */ DVPSDisplayedArea& operator=(const DVPSDisplayedArea& source); /// swaps the horizontal (X) components of TLHC and BRHC void switchHorizontalCorners(); /// swaps the vertical (Y) components of TLHC and BRHC void switchVerticalCorners(); /** adjusts the displayed area coordinates for rotation and flipping. * This method can either be used to adjust from unrotated/unflipped * to a rotated/flipped status or back from this status to original. * @param rotation rotation * @param isFlipped flip status */ void rotateAndFlipFromOrTo(DVPSRotationType rotation, OFBool isFlipped); /// ReferencedImageSequence, Type 1c DVPSReferencedImage_PList referencedImageList; /// VR=SL, VM=2, Type 1 DcmSignedLong displayedAreaTopLeftHandCorner; /// VR=SL, VM=2, Type 1 DcmSignedLong displayedAreaBottomRightHandCorner; /// VR=CS, VM=1, Type 1 DcmCodeString presentationSizeMode; /// VR=DS, VM=2, Type 1c (required if presentationSizeMode is "TRUE SIZE") DcmDecimalString presentationPixelSpacing; /// VR=IS, VM=2, Type 1c (required if presentationPixelSpacing is absent) DcmIntegerString presentationPixelAspectRatio; /// VR=FL, VM=1, Type 1c (required if presentationSizeMode is "MAGNIFY") DcmFloatingPointSingle presentationPixelMagnificationRatio; }; #endif /* * $Log: dvpsda.h,v $ * Revision 1.10 2010-10-14 13:16:36 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.9 2010-10-07 14:31:35 joergr * Removed leading underscore characters from preprocessor symbols (reserved). * * Revision 1.8 2009-11-24 14:12:57 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.7 2005-12-08 16:03:39 meichel * Changed include path schema for all DCMTK header files * * Revision 1.6 2003/09/05 14:30:06 meichel * Introduced new API methods that allow Displayed Areas to be queried * and set either relative to the image (ignoring rotation and flip) or * in absolute values as defined in the standard. Rotate and flip methods * now adjust displayed areas in the presentation state. * * Revision 1.5 2001/09/26 15:36:09 meichel * Adapted dcmpstat to class OFCondition * * Revision 1.4 2001/06/01 15:50:14 meichel * Updated copyright header * * Revision 1.3 2000/06/02 16:00:44 meichel * Adapted all dcmpstat classes to use OFConsole for log and error output * * Revision 1.2 2000/03/08 16:28:50 meichel * Updated copyright header. * * Revision 1.1 1999/07/22 16:39:05 meichel * Adapted dcmpstat data structures and API to supplement 33 letter ballot text. * * */ dcmtk-3.6.0/dcmpstat/include/dcmtk/dcmpstat/dvpsvw.h0000644000310500011400000000764511455601265021745 0ustar joergrdicom3/* * * Copyright (C) 1998-2010, 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: DVPSVOIWindow * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:16:37 $ * CVS/RCS Revision: $Revision: 1.9 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DVPSVW_H #define DVPSVW_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/ofstd/ofstring.h" #include "dcmtk/dcmdata/dcerror.h" /* for OFCondition */ class DcmDecimalString; class DcmLongString; /** the representation of one VOI Window in a DICOM image. */ class DVPSVOIWindow { public: /// default constructor DVPSVOIWindow(); /// copy constructor DVPSVOIWindow(const DVPSVOIWindow& copy); /** clone method. * @return a pointer to a new DVPSVOIWindow object containing * a copy of this object. */ DVPSVOIWindow *clone() { return new DVPSVOIWindow(*this); } /// destructor virtual ~DVPSVOIWindow(); /** reads a VOI Window from DICOM elements. * The DICOM elements of the given VOI Window are copied to this object. * If this method returns an error code, the object is in undefined state afterwards. * @param idx the index of the VOI window to be read, must be < wcenter.getVM() * @param wcenter the window center(s) * @param wwidth the window width(s). wwidth.getVM() must be == wcenter.getVM(). * @param expl the window center/window width explanation. If omitted, explanation remains empty. * @return EC_Normal if successful, an error code otherwise. */ OFCondition read(size_t idx, DcmDecimalString &wcenter, DcmDecimalString& wwidth, DcmLongString *expl=NULL); /** reset the object to initial state. * After this call, the object is in the same state as after * creation with the default constructor. */ void clear(); /** gets the Window center/width explanation for this VOI Window. * If no explanation exists, NULL is returned. * @return Window explanation or NULL */ const char *getExplanation(); /** gets the Window Center of this VOI Window. * @return window center */ double getWindowCenter() { return windowCenter; } /** gets the Window Width of this VOI Window. * @return window width */ double getWindowWidth() { return windowWidth; } private: /// private undefined assignment operator DVPSVOIWindow& operator=(const DVPSVOIWindow&); // window center double windowCenter; // window width double windowWidth; // optional window explanation OFString windowCenterWidthExplanation; }; #endif /* * $Log: dvpsvw.h,v $ * Revision 1.9 2010-10-14 13:16:37 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.8 2010-10-07 14:31:36 joergr * Removed leading underscore characters from preprocessor symbols (reserved). * * Revision 1.7 2009-11-24 14:12:58 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.6 2005-12-08 16:04:13 meichel * Changed include path schema for all DCMTK header files * * Revision 1.5 2001/09/26 15:36:19 meichel * Adapted dcmpstat to class OFCondition * * Revision 1.4 2001/06/01 15:50:25 meichel * Updated copyright header * * Revision 1.3 2000/06/02 16:00:55 meichel * Adapted all dcmpstat classes to use OFConsole for log and error output * * Revision 1.2 2000/03/08 16:28:59 meichel * Updated copyright header. * * Revision 1.1 1998/12/22 17:57:10 meichel * Implemented Presentation State interface for overlays, * VOI LUTs, VOI windows, curves. Added test program that * allows to add curve data to DICOM images. * * */ dcmtk-3.6.0/dcmpstat/include/dcmtk/dcmpstat/dvpssvl.h0000644000310500011400000001670011455601264022104 0ustar joergrdicom3/* * * Copyright (C) 1998-2010, 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: DVPSSoftcopyVOI_PList * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:16:36 $ * CVS/RCS Revision: $Revision: 1.12 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DVPSSVL_H #define DVPSSVL_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcitem.h" #include "dcmtk/dcmpstat/dvpstyp.h" /* for enum types */ class DVPSSoftcopyVOI; class DVPSReferencedSeries_PList; /** the list of softcopy VOI LUT items contained in a presentation state (internal use only). * This class manages the data structures comprising one complete Softcopy VOI LUT sequence * contained in a presentation state object. */ class DVPSSoftcopyVOI_PList { public: /// default constructor DVPSSoftcopyVOI_PList(); /// copy constructor DVPSSoftcopyVOI_PList(const DVPSSoftcopyVOI_PList& copy); /** clone method. * @return a pointer to a new DVPSSoftcopyVOI_PList object containing * a deep copy of this object. */ DVPSSoftcopyVOI_PList *clone() { return new DVPSSoftcopyVOI_PList(*this); } /// destructor virtual ~DVPSSoftcopyVOI_PList(); /** reads a list of softcopy VOI LUTs (SoftcopyVOILUTSequence) from a DICOM dataset. * The DICOM elements of the softcopy VOI LUT item are copied from the dataset to this object. * The completeness of all items (presence of all required elements, * value multiplicity) is checked. * If this method returns an error code, the object is in undefined state afterwards. * @param dset the DICOM dataset from which the sequence is to be read * @return EC_Normal if successful, an error code otherwise. */ OFCondition read(DcmItem &dset); /** writes the list of softcopy VOI LUTs managed by this object to a DICOM dataset. * Copies of the DICOM elements managed by this object are inserted into * the DICOM dataset. * @param dset the DICOM dataset to which the SoftcopyVOILUTSequence is written * @return EC_Normal if successful, an error code otherwise. */ OFCondition write(DcmItem &dset); /** reset the object to initial state. * After this call, the object is in the same state as after * creation with the default constructor. */ void clear(); /** gets the number of softcopy VOI LUTs in this list. * @return the number of softcopy VOI LUTs. */ size_t size() const { return list_.size(); } /** creates a default softcopy VOI LUT sequence for a presentation state from a DICOM image. * If this method returns an error code, the object is in undefined state afterwards. * @param dset the DICOM dataset containing the image IOD * @param allReferences list of series/instance references registered for the * presentation state. * @param sopclassUID SOP class UID of the current image * @param instanceUID SOP instance UID of the current image * @param voiActivation flag defining how VOI LUTs or VOI window width/center should * be handled. Default: Use VOI and prefer VOI LUT from VOI window. * @return EC_Normal upon success, an error code otherwise. */ OFCondition createFromImage( DcmItem &dset, DVPSReferencedSeries_PList& allReferences, const char *sopclassUID, const char *instanceUID, DVPSVOIActivation voiActivation); /** checks if a softcopy VOI LUT item exists for the given image and frame. * @param instanceUID SOP instance UID of the current image * @param frame number of the current frame * @return pointer to the softcopy VOI LUT item if it exists, NULL otherwise. */ DVPSSoftcopyVOI *findSoftcopyVOI(const char *instanceUID, unsigned long frame); /** finds or creates a softcopy VOI LUT SQ item * with an applicability controlled by the applicability, instanceUID and frame * parameters. The softcopy VOI LUT sequence is rearranged such that * all other referenced images/frames keep their old settings. * @param allReferences list of series/instance references registered for the * presentation state. * @param sopclassUID SOP class UID of the current image * @param instanceUID SOP instance UID of the current image * @param frame number of the current frame * @param numberOfFrames number of frames of the current image * @param applicability applicability of the new softcopy VOI LUT * @return pointer to a softcopy VOI LUT object from the list * that matches the applicability parameters. NULL is returned if * out of memory. */ DVPSSoftcopyVOI *createSoftcopyVOI( DVPSReferencedSeries_PList& allReferences, const char *sopclassUID, const char *instanceUID, unsigned long frame, unsigned long numberOfFrames, DVPSObjectApplicability applicability); /** removes the softcopy VOI for a set of references * controlled by the applicability, instanceUID and frame * parameters. The softcopy VOI LUT sequence is rearranged such that * all other referenced images/frames keep their old settings. * @param allReferences list of series/instance references registered for the * presentation state. * @param instanceUID SOP instance UID of the current image * @param frame number of the current frame * @param numberOfFrames number of frames of the current image * @param applicability applicability of the VOI LUT removal */ void removeSoftcopyVOI( DVPSReferencedSeries_PList& allReferences, const char *instanceUID, unsigned long frame, unsigned long numberOfFrames, DVPSObjectApplicability applicability); private: /// private undefined assignment operator DVPSSoftcopyVOI_PList& operator=(const DVPSSoftcopyVOI_PList&); /** the list maintained by this object */ OFList list_; }; #endif /* * $Log: dvpssvl.h,v $ * Revision 1.12 2010-10-14 13:16:36 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.11 2010-10-07 14:31:36 joergr * Removed leading underscore characters from preprocessor symbols (reserved). * * Revision 1.10 2009-11-24 14:12:57 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.9 2009-09-30 10:42:38 uli * Make dcmpstat's include headers self-sufficient by including all * needed headers directly and stop using dctk.h * * Revision 1.8 2005-12-08 16:04:06 meichel * Changed include path schema for all DCMTK header files * * Revision 1.7 2003/06/04 10:18:06 meichel * Replaced private inheritance from template with aggregation * * Revision 1.6 2001/09/26 15:36:16 meichel * Adapted dcmpstat to class OFCondition * * Revision 1.5 2001/06/01 15:50:23 meichel * Updated copyright header * * Revision 1.4 2000/06/02 16:00:52 meichel * Adapted all dcmpstat classes to use OFConsole for log and error output * * Revision 1.3 2000/03/08 16:28:57 meichel * Updated copyright header. * * Revision 1.2 1999/07/30 13:34:51 meichel * Added new classes managing Stored Print objects * * Revision 1.1 1999/07/22 16:39:12 meichel * Adapted dcmpstat data structures and API to supplement 33 letter ballot text. * * */ dcmtk-3.6.0/dcmpstat/include/dcmtk/dcmpstat/dvpsdal.h0000644000310500011400000001510011455601264022031 0ustar joergrdicom3/* * * Copyright (C) 1998-2010, 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: DVPSDisplayedArea_PList * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:16:36 $ * CVS/RCS Revision: $Revision: 1.12 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DVPSDAL_H #define DVPSDAL_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcitem.h" #include "dcmtk/dcmpstat/dvpstyp.h" /* for enum types */ class DVPSDisplayedArea; class DVPSReferencedSeries_PList; /** the list of displayed area selections contained in a presentation state (internal use only). * This class manages the data structures comprising one complete displayed area selection sequence * contained in a presentation state object. */ class DVPSDisplayedArea_PList { public: /// default constructor DVPSDisplayedArea_PList(); /// copy constructor DVPSDisplayedArea_PList(const DVPSDisplayedArea_PList& copy); /** clone method. * @return a pointer to a new DVPSDisplayedArea_PList object containing * a deep copy of this object. */ DVPSDisplayedArea_PList *clone() { return new DVPSDisplayedArea_PList(*this); } /// destructor virtual ~DVPSDisplayedArea_PList(); /** reads a list of displayed area selections (DisplayedAreaSelectionSequence) from a DICOM dataset. * The DICOM elements of the displayed area selection item are copied from the dataset to this object. * The completeness of all items (presence of all required elements, * value multiplicity) is checked. * If this method returns an error code, the object is in undefined state afterwards. * @param dset the DICOM dataset from which the sequence is to be read * @return EC_Normal if successful, an error code otherwise. */ OFCondition read(DcmItem &dset); /** writes the list of displayed area selections managed by this object to a DICOM dataset. * Copies of the DICOM elements managed by this object are inserted into * the DICOM dataset. * @param dset the DICOM dataset to which the DisplayedAreaSelectionSequence is written * @return EC_Normal if successful, an error code otherwise. */ OFCondition write(DcmItem &dset); /** reset the object to initial state. * After this call, the object is in the same state as after * creation with the default constructor. */ void clear(); /** gets the number of displayed area selections in this list. * @return the number of displayed area selections. */ size_t size() const { return list_.size(); } /** checks if an displayed area selection exists for the given image and frame. * @param instanceUID SOP instance UID of the current image * @param frame number of the current frame * @return pointer to the displayed area if it exists, NULL otherwise. */ DVPSDisplayedArea *findDisplayedArea(const char *instanceUID, unsigned long frame); /** finds or creates a displayed area selection SQ item * with an applicability controlled by the applicability, instanceUID and frame * parameters. The displayed area selection sequence is rearranged such that * all other referenced images/frames keep their old displayed area settings. * @param allReferences list of series/instance references registered for the * presentation state. * @param sopclassUID SOP class UID of the current image * @param instanceUID SOP instance UID of the current image * @param frame number of the current frame * @param numberOfFrames number of frames of the current image * @param applicability applicability of the new displayed area selection * @return pointer to a displayed area selection object from the list * that matches the applicability parameters. NULL is returned if * out of memory. */ DVPSDisplayedArea *createDisplayedArea( DVPSReferencedSeries_PList& allReferences, const char *sopclassUID, const char *instanceUID, unsigned long frame, unsigned long numberOfFrames, DVPSObjectApplicability applicability); /** adjusts all displayed area coordinates for the rotation and flipping * status of the image. * @param rotationFrom previous rotation * @param isFlippedFrom previous flip status * @param rotationTo new rotation * @param isFlippedTo new flip status */ void rotateAndFlip( DVPSRotationType rotationFrom, OFBool isFlippedFrom, DVPSRotationType rotationTo, OFBool isFlippedTo); private: /** private undefined assignment operator */ DVPSDisplayedArea_PList& operator=(const DVPSDisplayedArea_PList&); /** the list maintained by this object */ OFList list_; }; #endif /* * $Log: dvpsdal.h,v $ * Revision 1.12 2010-10-14 13:16:36 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.11 2010-10-07 14:31:35 joergr * Removed leading underscore characters from preprocessor symbols (reserved). * * Revision 1.10 2009-11-24 14:12:57 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.9 2009-09-30 10:42:38 uli * Make dcmpstat's include headers self-sufficient by including all * needed headers directly and stop using dctk.h * * Revision 1.8 2005-12-08 16:03:40 meichel * Changed include path schema for all DCMTK header files * * Revision 1.7 2003/09/05 14:30:06 meichel * Introduced new API methods that allow Displayed Areas to be queried * and set either relative to the image (ignoring rotation and flip) or * in absolute values as defined in the standard. Rotate and flip methods * now adjust displayed areas in the presentation state. * * Revision 1.6 2003/06/04 10:18:06 meichel * Replaced private inheritance from template with aggregation * * Revision 1.5 2001/09/26 15:36:10 meichel * Adapted dcmpstat to class OFCondition * * Revision 1.4 2001/06/01 15:50:14 meichel * Updated copyright header * * Revision 1.3 2000/06/02 16:00:45 meichel * Adapted all dcmpstat classes to use OFConsole for log and error output * * Revision 1.2 2000/03/08 16:28:51 meichel * Updated copyright header. * * Revision 1.1 1999/07/22 16:39:06 meichel * Adapted dcmpstat data structures and API to supplement 33 letter ballot text. * * */ dcmtk-3.6.0/dcmpstat/include/dcmtk/dcmpstat/dvpspl.h0000644000310500011400000002643611455601264021722 0ustar joergrdicom3/* * * Copyright (C) 1998-2010, 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: DVPSPresentationLUT * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:16:36 $ * CVS/RCS Revision: $Revision: 1.16 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #ifndef DVPSPL_H #define DVPSPL_H #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmpstat/dvpstyp.h" /* for enum types */ #include "dcmtk/dcmdata/dcvrus.h" #include "dcmtk/dcmdata/dcvrui.h" #include "dcmtk/dcmdata/dcvrlo.h" struct T_DIMSE_Message; class DicomImage; class DiLookupTable; class DcmDataset; /** the representation of a Presentation LUT Content SQ item for Stored Print */ class DVPSPresentationLUT { public: /// default constructor DVPSPresentationLUT(); /// copy constructor DVPSPresentationLUT(const DVPSPresentationLUT& copy); /** clone method. * @return a pointer to a new DVPSPresentationLUT object containing * a copy of this object. */ DVPSPresentationLUT *clone() { return new DVPSPresentationLUT(*this); } /// destructor virtual ~DVPSPresentationLUT(); /** resets the object to initial state. * After this call, the object is in the same state as after * creation with the default constructor. */ void clear(); /** reads an Presentation LUT from a DICOM dataset. * The DICOM elements of the referenced item are copied * from the dataset to this object. * The completeness of the item (presence of all required elements, * value multiplicity) is checked. * If this method returns an error code, the object is in undefined state afterwards. * @param dset the item of the PresentationLUTContentSequence from which the data is to be read * @param withSOPInstance true if SOPinstanceUID should be read (when used with Stored Print). * @return EC_Normal if successful, an error code otherwise. */ OFCondition read(DcmItem &dset, OFBool withSOPInstance); /** writes the Presentation LUT managed by this object to a DICOM dataset. * Copies of the DICOM element managed by this object are inserted into * the DICOM dataset. * @param dset the the item of the PresentationLUTContentSequence to which the data is written * @param withSOPInstance true if SOPinstanceUID should be written (when used with Stored Print). * @return EC_Normal if successful, an error code otherwise. */ OFCondition write(DcmItem &dset, OFBool withSOPInstance); /** checks whether current presentation LUT is inverse, i.e. * shape is INVERSE or first LUT entry larger than last LUT entry. */ OFBool isInverse(); /** gets the current Presentation LUT type. * @return the current presentation LUT type */ DVPSPresentationLUTType getType() { return presentationLUT; } /** gets a description of the Presentation LUT in terms of * its restrictions for use with a Print SCP that requires * Presentation LUT number of entries to match the bit depth * of the image pixel data. * @return the current presentation LUT alignment type */ DVPSPrintPresentationLUTAlignment getAlignment(); /** checks if a real Presentation LUT (not shape) is available. * @return OFTrue if this object contains * a presentation LUT, no matter if it is activated or not. * Returns OFFalse otherwise. */ OFBool haveTable(); /** gets a description of the current presentation LUT. * For well-known presentation LUT shapes, a standard text * is returned. For presentation LUTs, the LUT explanation * is returned if it exists and a standard text otherwise. * This method never returns NULL. * @return a pointer to a string describing the current presentation LUT. */ const char *getCurrentExplanation(); /** returns the LUT explanation of the presentation LUT if it exists and is non-empty. * Otherwise returns NULL. * @return a string pointer */ const char *getLUTExplanation(); /** returns the SOP instance UID of the presentation LUT if present. * Otherwise returns NULL. * @return a string pointer */ const char *getSOPInstanceUID(); /** stores a presentation lookup table and activates it. * The LUT is copied. If the method returns EC_Normal, * any old presentation LUT is overwritten. * If the method returns an error code, an old LUT is left unchanged. * @param lutDescriptor the LUT Descriptor in DICOM format (VM=3) * @param lutData the LUT Data in DICOM format * @param lutExplanation the LUT Explanation in DICOM format, may be empty. * @return EC_Normal if successful, an error code otherwise. */ OFCondition setLUT( DcmUnsignedShort& lutDescriptor, DcmUnsignedShort& lutData, DcmLongString& lutExplanation); /** sets the current Presentation LUT type. * DVPSP_table can only be used if the object * contains a lookup table, i.e. if haveTable() returns OFTrue. * @param newType the new presentation LUT type. * @return EC_Normal if successful, an error code otherwise. */ OFCondition setType(DVPSPresentationLUTType newType); /** inverts presentation LUT or presentation state LUT shape. * @return EC_Normal upon success, an error code otherwise. */ OFCondition invert(); /** activates the current presentation transform in the given DicomImage. * @param image the DicomImage for which the presentation transform is to be set. * @param printLUT OFTrue if presentation LUT is activated for print bitmap rendering * (in this case there is no implicit scaling of the input width of the LUT and, * therefore, the VOI transformation - which is absent for print - is used), * OFFalse otherwise (softcopy rendering, default) * @return OFTrue if successful, OFFalse otherwise. */ OFBool activate(DicomImage *image, OFBool printLUT = OFFalse); /** activates the inverse LUT of the current presentation LUT (if any) in the given DicomImage. * Presentation LUT shape is not supported by this method. * @param image the DicomImage for which the inverse presentation LUT is to be set. * @return OFTrue if successful, OFFalse otherwise. */ OFBool activateInverseLUT(DicomImage *image); /** creates a DiLookupTable instance from the LUT table * managed by this object. The returned object must be freed by the caller. * @return new DiLookupTable object, may be NULL if no LUT present. */ DiLookupTable *createDiLookupTable(); /** compares a DiLookupTable instance with the LUT table * managed by this object. Returns OFTrue if equal, OFFalse otherwise. * @param lut DiLookupTable object to compare with * @return comparison, true if equal */ OFBool compareDiLookupTable(DiLookupTable *lut); /** sets the SOP instance UID. * @param value new attribute value, must not be NULL. * @return EC_Normal if successful, an error code otherwise. */ OFCondition setSOPInstanceUID(const char *value); /** checks whether the current Presentation LUT (or shape) is * legal when used with Supplement 22. * @return true if current Presentation LUT is legal for print. */ OFBool isLegalPrintPresentationLUT(); /** checks whether the current Presentation LUT (or shape) * matches the current image bit depth in number of entries and first value mapped. * @param is12bit true if the image is 12 bit, false if the image is 8 bit * @return true if Presentation LUT matches, false otherwise. */ OFBool matchesImageDepth(OFBool is12bit); /** performs a Print SCP N-CREATE operation on a newly created instance of * this class. The results of the operation are stored in the objects * passed as rsp and rspDataset. * @param rqDataset N-CREATE request dataset, may be NULL * @param rsp N-CREATE response message * @param rspDataset N-CREATE response dataset passed back in this parameter * @param matchRequired boolean flag specifying whether the SCP should * enforce a rule that all Presentation LUTs must match with the * bit depth of the image pixel data. * @param supports12Bit boolean flag specifying whether the SCP should * allow 12 bit/pixel image data transmission. Affects handling of * matching rule. * @return OFTrue if operation was successful, OFFalse otherwise. */ OFBool printSCPCreate( DcmDataset *rqDataset, T_DIMSE_Message& rsp, DcmDataset *& rspDataset, OFBool matchRequired, OFBool supports12Bit); private: /// private undefined assignment operator DVPSPresentationLUT& operator=(const DVPSPresentationLUT&); /// describes active type of presentation LUT. DVPSPresentationLUTType presentationLUT; /// Module=Softcopy_Presentation_LUT, VR=xs, VM=3, Type 1c DcmUnsignedShort presentationLUTDescriptor; /// Module=Softcopy_Presentation_LUT, VR=LO, VM=1, Type 3 DcmLongString presentationLUTExplanation; /// Module=Softcopy_Presentation_LUT, VR=xs, VM=1-n, Type 1c DcmUnsignedShort presentationLUTData; /// Module=Presentation_LUT_List, VR=UI, VM=1, Type 1 DcmUniqueIdentifier sOPInstanceUID; }; #endif /* * $Log: dvpspl.h,v $ * Revision 1.16 2010-10-14 13:16:36 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.15 2010-10-07 14:31:36 joergr * Removed leading underscore characters from preprocessor symbols (reserved). * * Revision 1.14 2009-11-24 14:12:57 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.13 2009-09-30 10:42:38 uli * Make dcmpstat's include headers self-sufficient by including all * needed headers directly and stop using dctk.h * * Revision 1.12 2005-12-08 16:03:55 meichel * Changed include path schema for all DCMTK header files * * Revision 1.11 2003/08/27 14:59:09 meichel * Moved all methods of class DVPSPresentationLUT that depend on module dcmimgle * into a separate implementation file * * Revision 1.10 2001/09/26 15:36:14 meichel * Adapted dcmpstat to class OFCondition * * Revision 1.9 2001/06/01 15:50:19 meichel * Updated copyright header * * Revision 1.8 2000/06/09 10:14:11 joergr * Added support for rendering inverse presentation LUT into print bitmaps. * * Revision 1.7 2000/06/07 14:20:18 joergr * Added support for rendering "hardcopy" and "softcopy" presentation LUTs. * * Revision 1.6 2000/06/02 16:00:49 meichel * Adapted all dcmpstat classes to use OFConsole for log and error output * * Revision 1.5 2000/05/31 12:56:39 meichel * Added initial Print SCP support * * Revision 1.4 2000/03/08 16:28:54 meichel * Updated copyright header. * * Revision 1.3 1999/10/07 17:21:49 meichel * Reworked management of Presentation LUTs in order to create tighter * coupling between Softcopy and Print. * * Revision 1.2 1999/09/24 15:23:46 meichel * Print spooler (dcmprtsv) now logs diagnostic messages in log files * when operating in spool mode. * * Revision 1.1 1999/07/30 13:34:49 meichel * Added new classes managing Stored Print objects * * */ dcmtk-3.6.0/dcmpstat/libsrc/0000755000310500011400000000000011511320677015137 5ustar joergrdicom3dcmtk-3.6.0/dcmpstat/libsrc/dvpsall.cc0000644000310500011400000004115511455601067017123 0ustar joergrdicom3/* * * Copyright (C) 1998-2010, 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: DVPSOverlayCurveActivationLayer_PList * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:14:31 $ * CVS/RCS Revision: $Revision: 1.17 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/ofstd/ofstring.h" #include "dcmtk/dcmpstat/dvpsall.h" #include "dcmtk/dcmpstat/dvpsal.h" /* for DVPSOverlayCurveActivationLayer */ #include "dcmtk/dcmpstat/dvpsovl.h" /* for DVPSOverlay_PList */ #include "dcmtk/dcmpstat/dvpsgll.h" /* for DVPSGraphicLayer_PList */ #include "dcmtk/dcmpstat/dvpsdef.h" /* for constants and macros */ #include "dcmtk/dcmpstat/dvpsov.h" /* for DVPSOverlay, needed by MSVC5 with STL */ #include "dcmtk/dcmpstat/dvpsgl.h" /* for DVPSGraphicLayer, needed by MSVC5 with STL */ DVPSOverlayCurveActivationLayer_PList::DVPSOverlayCurveActivationLayer_PList() : list_() { } DVPSOverlayCurveActivationLayer_PList::DVPSOverlayCurveActivationLayer_PList(const DVPSOverlayCurveActivationLayer_PList &arg) : list_() { OFListConstIterator(DVPSOverlayCurveActivationLayer *) first = arg.list_.begin(); OFListConstIterator(DVPSOverlayCurveActivationLayer *) last = arg.list_.end(); while (first != last) { list_.push_back((*first)->clone()); ++first; } } DVPSOverlayCurveActivationLayer_PList::~DVPSOverlayCurveActivationLayer_PList() { clear(); } void DVPSOverlayCurveActivationLayer_PList::clear() { OFListIterator(DVPSOverlayCurveActivationLayer *) first = list_.begin(); OFListIterator(DVPSOverlayCurveActivationLayer *) last = list_.end(); while (first != last) { delete (*first); first = list_.erase(first); } } OFCondition DVPSOverlayCurveActivationLayer_PList::read(DcmItem &dset) { OFCondition result = EC_Normal; DcmStack stack; DcmTagKey key(DCM_RETIRED_CurveActivationLayer); DVPSOverlayCurveActivationLayer *newLayer = NULL; Uint16 i = 0x5000; while (i < 0x6020) { if (result==EC_Normal) { stack.clear(); key.setGroup(i); if (EC_Normal == dset.search(key, stack, ESM_fromHere, OFFalse)) { newLayer = new DVPSOverlayCurveActivationLayer(); if (newLayer) { result = newLayer->read(dset,i); list_.push_back(newLayer); } else result = EC_MemoryExhausted; } } i += 2; if (i == 0x5020) i = 0x6000; } return result; } OFCondition DVPSOverlayCurveActivationLayer_PList::write(DcmItem &dset) { OFCondition result = EC_Normal; OFListIterator(DVPSOverlayCurveActivationLayer *) first = list_.begin(); OFListIterator(DVPSOverlayCurveActivationLayer *) last = list_.end(); while (first != last) { if (result==EC_Normal) result = (*first)->write(dset); ++first; } return result; } OFCondition DVPSOverlayCurveActivationLayer_PList::createFromImage( DcmItem &dset, DVPSGraphicLayer_PList &gLayerList, DVPSOverlay_PList &overlayList, DVPSoverlayActivation overlayActivation, OFBool curveActivation, DVPSGraphicLayering layering) { OFCondition result = EC_Normal; long currentLayer = 0; long lastOverlayLayer = 0; char layerName[100]; char layerDesc[100]; OFString aString; Uint16 dimensions; OFBool found; DcmStack stack; DcmTagKey overlayRows(DCM_OverlayRows); DcmTagKey overlayColumns(DCM_OverlayColumns); DcmTagKey overlayType(DCM_OverlayType); DcmTagKey overlayOrigin(DCM_OverlayOrigin); DcmTagKey overlayBitsAllocated(DCM_OverlayBitsAllocated); DcmTagKey overlayBitPosition(DCM_OverlayBitPosition); DcmTagKey curveDimensions(DCM_RETIRED_CurveDimensions); DcmTagKey numberOfPoints(DCM_RETIRED_NumberOfPoints); DcmTagKey typeOfData(DCM_RETIRED_TypeOfData); DcmTagKey dataValueRepresentation(DCM_RETIRED_DataValueRepresentation); DcmTagKey curveData(DCM_RETIRED_CurveData); OFBool haveOverlays = OFFalse; /* first we handle overlays */ if ((overlayActivation==DVPSO_referenceOverlays) || (overlayActivation==DVPSO_copyOverlays)) { for (Uint16 group = 0x6000; ((result==EC_Normal)&&(group < 0x6020)); group += 2) { found = OFFalse; /* check if we have an internal overlay with this group */ if (overlayList.haveOverlayGroup(group)) found=OFTrue; /* otherwise check if we have an external overlay with this group */ if (!found) { overlayRows.setGroup(group); overlayColumns.setGroup(group); overlayType.setGroup(group); overlayOrigin.setGroup(group); overlayBitsAllocated.setGroup(group); overlayBitPosition.setGroup(group); stack.clear(); if (EC_Normal == dset.search(overlayRows, stack, ESM_fromHere, OFFalse)) found = OFTrue; stack.clear(); if (EC_Normal != dset.search(overlayColumns, stack, ESM_fromHere, OFFalse)) found = OFFalse; stack.clear(); if (EC_Normal != dset.search(overlayType, stack, ESM_fromHere, OFFalse)) found = OFFalse; stack.clear(); if (EC_Normal != dset.search(overlayOrigin, stack, ESM_fromHere, OFFalse)) found = OFFalse; stack.clear(); if (EC_Normal != dset.search(overlayBitsAllocated, stack, ESM_fromHere, OFFalse)) found = OFFalse; stack.clear(); if (EC_Normal != dset.search(overlayBitPosition, stack, ESM_fromHere, OFFalse)) found = OFFalse; } /* if found, create graphic layer if necessary. Create activation. */ if (found) { switch (layering) { case DVPSG_oneLayer: if (currentLayer==0) { currentLayer++; sprintf(layerName, "LAYER"); result = gLayerList.addGraphicLayer(layerName, 1, "Overlays and Curves"); } break; case DVPSG_twoLayers: if (currentLayer==0) { currentLayer++; sprintf(layerName, "OVERLAY"); result = gLayerList.addGraphicLayer(layerName, 1, "Overlays"); } break; case DVPSG_separateLayers: currentLayer++; sprintf(layerName, "OVERLAY%04ld", (long)currentLayer); sprintf(layerDesc, "Overlay Layer %ld", (long)currentLayer); result = gLayerList.addGraphicLayer(layerName, currentLayer, layerDesc); break; } DVPSOverlayCurveActivationLayer *newLayer = new DVPSOverlayCurveActivationLayer(); if (newLayer) { newLayer->setActivationLayer(layerName); newLayer->setRepeatingGroup(group); list_.push_back(newLayer); haveOverlays = OFTrue; } else result = EC_MemoryExhausted; } } } lastOverlayLayer = currentLayer; /* then we handle curves */ if (curveActivation) { for (Uint16 group = 0x5000; ((result==EC_Normal)&&(group < 0x5020)); group += 2) { found = OFFalse; /* check if we have an external curve with this group */ curveDimensions.setGroup(group); numberOfPoints.setGroup(group); typeOfData.setGroup(group); dataValueRepresentation.setGroup(group); curveData.setGroup(group); stack.clear(); if (EC_Normal == dset.search(curveDimensions, stack, ESM_fromHere, OFFalse)) found = OFTrue; stack.clear(); if (EC_Normal != dset.search(numberOfPoints, stack, ESM_fromHere, OFFalse)) found = OFFalse; stack.clear(); if (EC_Normal != dset.search(typeOfData, stack, ESM_fromHere, OFFalse)) found = OFFalse; stack.clear(); if (EC_Normal != dset.search(dataValueRepresentation, stack, ESM_fromHere, OFFalse)) found = OFFalse; stack.clear(); if (EC_Normal != dset.search(curveData, stack, ESM_fromHere, OFFalse)) found = OFFalse; /* if we have found a curve, make sure that this is a type of curve we can display */ if (found) { /* read the curve dimensions and curve type from the dataset */ DcmUnsignedShort curveDimensionsValue(DCM_RETIRED_CurveDimensions); DcmCodeString typeOfDataValue(DCM_RETIRED_TypeOfData); curveDimensionsValue.setGTag(group); typeOfDataValue.setGTag(group); READ_FROM_DATASET(DcmUnsignedShort, curveDimensionsValue) READ_FROM_DATASET(DcmCodeString, typeOfDataValue) /* we can only display POLY and ROI curves */ aString.clear(); typeOfDataValue.getOFString(aString,0); if ((aString != "POLY")&&(aString != "ROI")) found=OFFalse; /* we can only display 2D curves */ dimensions=0; curveDimensionsValue.getUint16(dimensions,0); if (dimensions != 2) found=OFFalse; } /* if found, create graphic layer if necessary. Create activation. */ if (found) { switch (layering) { case DVPSG_oneLayer: if (currentLayer==0) { currentLayer++; sprintf(layerName, "LAYER"); result = gLayerList.addGraphicLayer(layerName, 1, "Overlays and Curves"); } break; case DVPSG_twoLayers: if ((currentLayer==0)||((currentLayer==1)&&(haveOverlays))) { currentLayer++; sprintf(layerName, "CURVE"); result = gLayerList.addGraphicLayer(layerName, 1, "Curves"); } break; case DVPSG_separateLayers: currentLayer++; sprintf(layerName, "CURVE%04ld", (long)currentLayer-lastOverlayLayer); sprintf(layerDesc, "Curve Layer %ld", (long)currentLayer-lastOverlayLayer); result = gLayerList.addGraphicLayer(layerName, currentLayer, layerDesc); break; } DVPSOverlayCurveActivationLayer *newLayer = new DVPSOverlayCurveActivationLayer(); if (newLayer) { newLayer->setActivationLayer(layerName); newLayer->setRepeatingGroup(group); list_.push_back(newLayer); } else result = EC_MemoryExhausted; } } } return result; } OFCondition DVPSOverlayCurveActivationLayer_PList::setActivation(Uint16 group, const char *layer) { /* first we make sure we have a valid overlay group */ OFBool result = OFFalse; if ((group < 0x6020)&&(group >= 0x6000)&&((group & 1) == 0)) result = OFTrue; if ((group < 0x5020)&&(group >= 0x5000)&&((group & 1) == 0)) result = OFTrue; if (!result) return EC_IllegalCall; if (layer==NULL) return EC_IllegalCall; OFListIterator(DVPSOverlayCurveActivationLayer *) first = list_.begin(); OFListIterator(DVPSOverlayCurveActivationLayer *) last = list_.end(); while (first != last) { if ((*first)->isRepeatingGroup(group)) { (*first)->setActivationLayer(layer); return EC_Normal; } ++first; } DVPSOverlayCurveActivationLayer * newLayer = new DVPSOverlayCurveActivationLayer(); if (newLayer) { newLayer->setActivationLayer(layer); newLayer->setRepeatingGroup(group); list_.push_back(newLayer); return EC_Normal; } return EC_MemoryExhausted; } void DVPSOverlayCurveActivationLayer_PList::removeActivation(Uint16 group) { OFListIterator(DVPSOverlayCurveActivationLayer *) first = list_.begin(); OFListIterator(DVPSOverlayCurveActivationLayer *) last = list_.end(); while (first != last) { if ((*first)->isRepeatingGroup(group)) { delete (*first); first = list_.erase(first); } else ++first; } } const char *DVPSOverlayCurveActivationLayer_PList::getActivationLayer(Uint16 group) { OFListIterator(DVPSOverlayCurveActivationLayer *) first = list_.begin(); OFListIterator(DVPSOverlayCurveActivationLayer *) last = list_.end(); while (first != last) { if ((*first)->isRepeatingGroup(group)) return (*first)->getActivationLayer(); ++first; } return NULL; } void DVPSOverlayCurveActivationLayer_PList::renameLayer(const char *oldName, const char *newName) { if ((oldName==NULL)||(newName==NULL)) return; OFString aString(oldName); OFListIterator(DVPSOverlayCurveActivationLayer *) first = list_.begin(); OFListIterator(DVPSOverlayCurveActivationLayer *) last = list_.end(); while (first != last) { if (aString == (*first)->getActivationLayer()) { (*first)->setActivationLayer(newName); } ++first; } return; } void DVPSOverlayCurveActivationLayer_PList::removeLayer(const char *name) { if (name==NULL) return; OFString aString(name); OFListIterator(DVPSOverlayCurveActivationLayer *) first = list_.begin(); OFListIterator(DVPSOverlayCurveActivationLayer *) last = list_.end(); while (first != last) { if (aString == (*first)->getActivationLayer()) { delete (*first); first = list_.erase(first); } else ++first; } return; } OFBool DVPSOverlayCurveActivationLayer_PList::usesLayerName(const char *name) { if (name==NULL) return OFFalse; OFString aString(name); OFListIterator(DVPSOverlayCurveActivationLayer *) first = list_.begin(); OFListIterator(DVPSOverlayCurveActivationLayer *) last = list_.end(); while (first != last) { if (aString == (*first)->getActivationLayer()) return OFTrue; ++first; } return OFFalse; } size_t DVPSOverlayCurveActivationLayer_PList::getNumberOfActivations(const char *layer, OFBool isCurve) { if (layer==NULL) return 0; size_t result = 0; Uint16 group; OFString aString(layer); OFListIterator(DVPSOverlayCurveActivationLayer *) first = list_.begin(); OFListIterator(DVPSOverlayCurveActivationLayer *) last = list_.end(); while (first != last) { if (aString == (*first)->getActivationLayer()) { group = (*first)->getRepeatingGroup(); if (((isCurve) && (group < 0x6000)) || ((!isCurve) && (group >= 0x6000))) result++; } ++first; } return result; } Uint16 DVPSOverlayCurveActivationLayer_PList::getActivationGroup(const char *layer, size_t idx, OFBool isCurve) { if (layer==NULL) return 0; Uint16 group; OFString aString(layer); OFListIterator(DVPSOverlayCurveActivationLayer *) first = list_.begin(); OFListIterator(DVPSOverlayCurveActivationLayer *) last = list_.end(); while (first != last) { if (aString == (*first)->getActivationLayer()) { group = (*first)->getRepeatingGroup(); if (((isCurve) && (group < 0x6000)) || ((!isCurve) && (group >= 0x6000))) { if (idx==0) return group; else idx--; } } ++first; } return 0; } /* * $Log: dvpsall.cc,v $ * Revision 1.17 2010-10-14 13:14:31 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.16 2009-11-24 14:12:58 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.15 2008-04-30 12:38:43 meichel * Fixed compile errors due to changes in attribute tag names * * Revision 1.14 2005/12/08 15:46:19 meichel * Changed include path schema for all DCMTK header files * * Revision 1.13 2004/02/04 15:57:49 joergr * Removed acknowledgements with e-mail addresses from CVS log. * * Revision 1.12 2003/09/05 08:37:46 meichel * Fixed minor issue that caused certain error messages during the * parse process on a GSPS object to be "swallowed". * * Revision 1.11 2003/06/12 18:23:11 joergr * Modified code to use const_iterators where appropriate (required for STL). * * Revision 1.10 2003/06/04 12:30:28 meichel * Added various includes needed by MSVC5 with STL * * Revision 1.9 2003/06/04 10:18:07 meichel * Replaced private inheritance from template with aggregation * * Revision 1.8 2001/09/26 15:36:23 meichel * Adapted dcmpstat to class OFCondition * * Revision 1.7 2001/06/01 15:50:27 meichel * Updated copyright header * * Revision 1.6 2000/06/02 16:00:57 meichel * Adapted all dcmpstat classes to use OFConsole for log and error output * * Revision 1.5 2000/05/31 13:02:36 meichel * Moved dcmpstat macros and constants into a common header file * * Revision 1.4 2000/03/08 16:29:02 meichel * Updated copyright header. * * Revision 1.3 1998/12/22 17:57:14 meichel * Implemented Presentation State interface for overlays, * VOI LUTs, VOI windows, curves. Added test program that * allows to add curve data to DICOM images. * * Revision 1.2 1998/12/14 16:10:39 meichel * Implemented Presentation State interface for graphic layers, * text and graphic annotations, presentation LUTs. * * Revision 1.1 1998/11/27 14:50:39 meichel * Initial Release. * * */ dcmtk-3.6.0/dcmpstat/libsrc/dvpstat.cc0000644000310500011400000024741511455601071017145 0ustar joergrdicom3/* * * Copyright (C) 1998-2010, 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: DVPresentationState * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:14:33 $ * CVS/RCS Revision: $Revision: 1.86 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/ofstd/ofstream.h" #include "dcmtk/dcmpstat/dvpstat.h" #include "dcmtk/dcmpstat/dvpsdef.h" /* for constants and macros */ #include "dcmtk/ofstd/ofstring.h" #include "dcmtk/dcmimgle/dcmimage.h" /* for DicomImage */ #include "dcmtk/dcmpstat/dvpscu.h" /* for DVPSCurve */ #include "dcmtk/dcmpstat/dvpsvl.h" /* for DVPSVOILUT */ #include "dcmtk/dcmpstat/dvpsvw.h" /* for DVPSVOIWindow */ #include "dcmtk/dcmpstat/dvpsov.h" /* for DVPSOverlay */ #include "dcmtk/dcmpstat/dvpsda.h" /* for DVPSDisplayedArea */ #include "dcmtk/dcmpstat/dvpssv.h" /* for DVPSSoftcopyVOI */ #include "dcmtk/dcmpstat/dvpshlp.h" /* for class DVPSHelper */ #include "dcmtk/ofstd/ofstd.h" /* for class OFStandard */ #include "dcmtk/dcmpstat/dvpsgl.h" /* for DVPSGraphicLayer, needed by MSVC5 with STL */ #include "dcmtk/dcmpstat/dvpsrs.h" /* for DVPSReferencedSeries, needed by MSVC5 with STL */ #include "dcmtk/dcmpstat/dvpsal.h" /* for DVPSOverlayCurveActivationLayer, needed by MSVC5 with STL */ #include "dcmtk/dcmpstat/dvpsga.h" /* for DVPSGraphicAnnotation, needed by MSVC5 with STL */ #include "dcmtk/dcmpstat/dvpsri.h" /* for DVPSReferencedImage, needed by MSVC5 with STL */ #include "dcmtk/dcmpstat/dvpstx.h" /* for DVPSTextObject, needed by MSVC5 with STL */ #include "dcmtk/dcmpstat/dvpsgr.h" /* for DVPSGraphicObject, needed by MSVC5 with STL */ #define INCLUDE_CSTDLIB #define INCLUDE_CSTDIO #define INCLUDE_CSTRING #define INCLUDE_CMATH #define INCLUDE_CTIME #define INCLUDE_LIBC #define INCLUDE_UNISTD #include "dcmtk/ofstd/ofstdinc.h" /* --------------- class DVPresentationState --------------- */ DVPresentationState::DVPresentationState( DiDisplayFunction **dispFunction, unsigned long minPrintBitmapX, unsigned long minPrintBitmapY, unsigned long maxPrintBitmapX, unsigned long maxPrintBitmapY, unsigned long maxPreviewImageX, unsigned long maxPreviewImageY) : DcmPresentationState() , currentImageDataset(NULL) , currentImageFileformat(NULL) , currentImage(NULL) , previewImage(NULL) , currentImageWidth(0) , currentImageHeight(0) , renderedImageWidth(0) , renderedImageHeight(0) , renderedImageTop(0) , renderedImageLeft(0) , renderedImageBottom(0) , renderedImageRight(0) , currentImageSOPClassUID(NULL) , currentImageSOPInstanceUID(NULL) , currentImageSelectedFrame(0) , currentImageOwned(OFFalse) , currentImageVOIValid(OFFalse) , currentImagePLUTValid(OFFalse) , currentImageFlip(OFFalse) , currentImageRotation(DVPSR_0_deg) , currentImageOverlaysValid(0) , currentImageCurveList() , currentImageVOILUTList() , currentImageVOIWindowList() , currentImageModality(DCM_Modality) , currentImageMonochrome1(OFFalse) , displayTransform(DVPSD_GSDF) , imageInverse(OFFalse) , displayFunction(dispFunction) , minimumPrintBitmapWidth(minPrintBitmapX) , minimumPrintBitmapHeight(minPrintBitmapY) , maximumPrintBitmapWidth(maxPrintBitmapX) , maximumPrintBitmapHeight(maxPrintBitmapY) , maximumPreviewImageWidth(maxPreviewImageX) , maximumPreviewImageHeight(maxPreviewImageY) { createInstanceUID(); } DVPresentationState::~DVPresentationState() { detachImage(); } void DVPresentationState::detachImage() { if (currentImage) delete currentImage; deletePreviewImage(); if (currentImageOwned) { if (currentImageFileformat) delete currentImageFileformat; else if (currentImageDataset) delete currentImageDataset; } currentImage = NULL; currentImageFileformat = NULL; currentImageDataset = NULL; currentImageCurveList.clear(); currentImageVOILUTList.clear(); currentImageVOIWindowList.clear(); currentImageModality.clear(); currentImageMonochrome1 = OFFalse; // reset flags currentImageWidth = 0; currentImageHeight = 0; renderedImageWidth = 0; renderedImageHeight = 0; renderedImageTop = 0; renderedImageLeft = 0; renderedImageBottom = 0; renderedImageRight = 0; currentImageOwned = OFFalse; currentImageVOIValid = OFFalse; currentImagePLUTValid = OFFalse; currentImageFlip = OFFalse; currentImageRotation = DVPSR_0_deg; currentImageOverlaysValid = 0; currentImageSOPClassUID=NULL; currentImageSOPInstanceUID=NULL; currentImageSelectedFrame=0; } void DVPresentationState::clear() { DcmPresentationState::clear(); detachImage(); // clears all currentImageXX attributes // we do not change the display function displayTransform = DVPSD_GSDF; imageInverse = OFFalse; return; } OFCondition DVPresentationState::writeHardcopyImageAttributes(DcmItem &dset) { OFCondition result = EC_Normal; DcmElement *delem=NULL; DcmSequenceOfItems *dseq=NULL; DcmItem *ditem=NULL; DVPSHelper::setDefault(result, patientName, DEFAULT_patientName); ADD_TO_DATASET(DcmPersonName, patientName) ADD_TO_DATASET(DcmLongString, patientID) ADD_TO_DATASET(DcmDate, patientBirthDate) ADD_TO_DATASET(DcmCodeString, patientSex) // write source image sequence if (result == EC_Normal) { dseq = new DcmSequenceOfItems(DCM_SourceImageSequence); if (dseq) { // first item references source image if (currentImageSOPClassUID && currentImageSOPInstanceUID) { ditem = new DcmItem(); if (ditem) { delem = new DcmUniqueIdentifier(DCM_SOPClassUID); if (delem) { result = delem->putString(currentImageSOPClassUID); ditem->insert(delem, OFTrue /*replaceOld*/); } else result=EC_MemoryExhausted; delem = new DcmUniqueIdentifier(DCM_SOPInstanceUID); if (delem) { result = delem->putString(currentImageSOPInstanceUID); ditem->insert(delem, OFTrue /*replaceOld*/); } else result=EC_MemoryExhausted; if (EC_Normal == result) dseq->insert(ditem); else delete ditem; } else result = EC_MemoryExhausted; } // second item references presentation state ditem = new DcmItem(); if (ditem) { delem = new DcmUniqueIdentifier(sOPInstanceUID); if (delem) ditem->insert(delem, OFTrue /*replaceOld*/); else result=EC_MemoryExhausted; delem = new DcmUniqueIdentifier(DCM_SOPClassUID); if (delem) { result = delem->putString(UID_GrayscaleSoftcopyPresentationStateStorage); ditem->insert(delem, OFTrue /*replaceOld*/); } else result=EC_MemoryExhausted; if (EC_Normal == result) dseq->insert(ditem); else delete ditem; } } else result = EC_MemoryExhausted; if (EC_Normal == result) dset.insert(dseq, OFTrue /*replaceOld*/); else delete dseq; } return result; } unsigned long DVPresentationState::getPrintBitmapSize() { unsigned long result = 0; unsigned long width; unsigned long height; if (getPrintBitmapWidthHeight(width, height) == EC_Normal) result = width * height * 2; // print bitmap: 12 bit stored, 16 bit allocated (2 bytes per pixel) return result; } OFCondition DVPresentationState::setMinimumPrintBitmapWidthHeight(unsigned long width, unsigned long height) { OFCondition result = EC_IllegalCall; const unsigned long max = (width > height) ? width : height; if (((maximumPrintBitmapWidth == 0) || (maximumPrintBitmapWidth >= 2 * max)) && ((maximumPrintBitmapHeight == 0) || (maximumPrintBitmapHeight >= 2 * max))) { minimumPrintBitmapWidth = width; minimumPrintBitmapHeight = height; result = EC_Normal; } return result; } OFCondition DVPresentationState::setMaximumPrintBitmapWidthHeight(unsigned long width, unsigned long height) { OFCondition result = EC_IllegalCall; const unsigned long min = (width < height) ? width : height; if (((minimumPrintBitmapWidth == 0) || (min >= 2 * minimumPrintBitmapWidth)) && ((minimumPrintBitmapHeight == 0) || (min >= 2 * minimumPrintBitmapHeight))) { maximumPrintBitmapWidth = width; maximumPrintBitmapHeight = height; result = EC_Normal; } return result; } OFCondition DVPresentationState::getPrintBitmapWidthHeight(unsigned long &width, unsigned long &height) { OFCondition result = EC_Normal; if (currentImage) { renderPixelData(OFFalse); // switch off display function width = renderedImageWidth; height = renderedImageHeight; if ((width > 0) && (height > 0)) { width = (unsigned long)(renderedImageRight - renderedImageLeft + 1); height = (unsigned long)(renderedImageBottom - renderedImageTop + 1); if ((minimumPrintBitmapWidth > 0) && (width < minimumPrintBitmapWidth)) { if ((minimumPrintBitmapHeight > 0) && (height < minimumPrintBitmapHeight)) { const unsigned long xfactor = (unsigned long)((double)(minimumPrintBitmapWidth - 1) / (double)width) + 1; const unsigned long yfactor = (unsigned long)((double)(minimumPrintBitmapHeight - 1) / (double)height) + 1; if (xfactor > yfactor) { width *= xfactor; height *= xfactor; } else { width *= yfactor; height *= yfactor; } } else { const unsigned long factor = (unsigned long)((double)(minimumPrintBitmapWidth - 1) / (double)width) + 1; width *= factor; height *= factor; } } else if ((minimumPrintBitmapHeight > 0) && (height < minimumPrintBitmapHeight)) { const unsigned long factor = (unsigned long)((double)(minimumPrintBitmapHeight - 1) / (double)height) + 1; width *= factor; height *= factor; } if ((maximumPrintBitmapWidth > 0) && (width > maximumPrintBitmapWidth)) { if ((maximumPrintBitmapHeight > 0) && (height > maximumPrintBitmapHeight)) { const unsigned long xdivisor = (unsigned long)((double)(width - 1) / (double)maximumPrintBitmapWidth) + 1; const unsigned long ydivisor = (unsigned long)((double)(height - 1) / (double)maximumPrintBitmapHeight) + 1; if (xdivisor > ydivisor) { width /= xdivisor; height /= xdivisor; } else { width /= ydivisor; height /= ydivisor; } } else { const unsigned long divisor = (unsigned long)((double)(width - 1) / (double)maximumPrintBitmapWidth) + 1; width /= divisor; height /= divisor; } } else if ((maximumPrintBitmapHeight > 0) && (height > maximumPrintBitmapHeight)) { const unsigned long divisor = (unsigned long)((double)(height - 1) / (double)maximumPrintBitmapHeight) + 1; width /= divisor; height /= divisor; } } } else { width = 0; height = 0; result = EC_IllegalCall; } return result; } OFCondition DVPresentationState::getPrintBitmapWidth(unsigned long &width) { unsigned long dummy; return getPrintBitmapWidthHeight(width, dummy); } OFCondition DVPresentationState::getPrintBitmapHeight(unsigned long &height) { unsigned long dummy; return getPrintBitmapWidthHeight(dummy, height); } double DVPresentationState::getPrintBitmapPixelAspectRatio() { double result = getDisplayedAreaPresentationPixelAspectRatio(); if (result == 1.0) return result; // handle most frequent case quickly if (result == 0.0) result = 1.0; // should never happen DVPSRotationType rotation = getRotation(); if ((rotation==DVPSR_90_deg)||(rotation==DVPSR_270_deg)) result = 1.0/result; return result; } OFCondition DVPresentationState::getPrintBitmap(void *bitmap, unsigned long size, OFBool inversePLUT) { OFCondition result = EC_IllegalCall; if ((bitmap != NULL) && (size == getPrintBitmapSize())) // check given buffer { if (currentImage) { renderPixelData(OFFalse); // don't use current display function unsigned long width; unsigned long height; if (getPrintBitmapWidthHeight(width, height) == EC_Normal) { DicomImage *image = currentImage; /* we deactivate any presentation LUT at this point because * getPrintBitmapWidthHeight() calls renderPixelData(). */ if (presentationLUT.getType() == DVPSP_table) { if (inversePLUT) { if (currentImageMonochrome1) currentImage->setPolarity(EPP_Reverse); presentationLUT.activateInverseLUT(currentImage); } else { // we never render a presentation LUT into the print bitmap at this stage. if (currentImageMonochrome1) currentImage->setPresentationLutShape(ESP_Inverse); else currentImage->setPresentationLutShape(ESP_Identity); } // make sure the presentation LUT is re-activated for on-screen display currentImagePLUTValid = OFFalse; } /* clip to displayed area if necessary */ if ((renderedImageLeft != 1) || (renderedImageRight != (signed long)renderedImageWidth) || (renderedImageTop != 1) || (renderedImageBottom != (signed long)renderedImageHeight)) { DicomImage *img = currentImage->createMonoOutputImage(currentImageSelectedFrame-1, 12 /*bits*/); if (img == NULL) img = currentImage; // fall-back solution image = img->createClippedImage(renderedImageLeft - 1, renderedImageTop - 1, renderedImageRight - renderedImageLeft + 1, renderedImageBottom - renderedImageTop + 1, getShutterPresentationValue()); if (img != currentImage) delete img; } /* scale up to minimum size or down to maximum size if necessary */ if (((signed long)width != renderedImageRight - renderedImageLeft + 1) || ((signed long)height != renderedImageBottom - renderedImageTop + 1)) { DicomImage *img = image; image = img->createScaledImage(width, height, 0 /*no interpolation*/, 0 /*ignore aspect ratio*/); if (img != currentImage) delete img; } if (image != NULL) { if (image->getOutputData(bitmap, size, 12 /*bits*/, currentImageSelectedFrame-1)) result = EC_Normal; } if (image != currentImage) delete image; } } } return result; } OFCondition DVPresentationState::createPreviewImage(unsigned long maxWidth, unsigned long maxHeight, OFBool clipMode) { OFCondition result = EC_IllegalCall; if ((currentImage != NULL) && (maxWidth > 0) && (maxHeight > 0)) { deletePreviewImage(); renderPixelData(); unsigned long width = maxWidth; unsigned long height = maxHeight; double ratio = getPrintBitmapPixelAspectRatio(); // never 0 ! if ((double)renderedImageWidth / (double)maxWidth * ratio < (double)renderedImageHeight / (double)maxHeight) width = 0; else height = 0; if (clipMode) { /* not yet implemented: clip preview image to current displayed area */ } double oldRatio = currentImage->getWidthHeightRatio(); currentImage->setWidthHeightRatio(ratio); previewImage = currentImage->createScaledImage(width, height, 1 /*interpolate*/, 1 /*aspect ratio*/); currentImage->setWidthHeightRatio(oldRatio); if (previewImage != NULL) { if (previewImage->getStatus() == EIS_Normal) { previewImage->removeAllOverlays(); result = EC_Normal; } else { deletePreviewImage(); } } } return result; } void DVPresentationState::deletePreviewImage() { delete previewImage; previewImage = NULL; } unsigned long DVPresentationState::getPreviewImageSize() { unsigned long result = 0; unsigned long width; unsigned long height; if (getPreviewImageWidthHeight(width, height) == EC_Normal) result = width * height; return result; } OFCondition DVPresentationState::getPreviewImageWidthHeight(unsigned long &width, unsigned long &height) { OFCondition result = EC_IllegalCall; if (previewImage != NULL) { width = previewImage->getWidth(); height = previewImage->getHeight(); if ((width > 0) && (height > 0)) result = EC_Normal; } else { width = 0; height = 0; } return result; } OFCondition DVPresentationState::getPreviewImageWidth(unsigned long &width) { unsigned long dummy; return getPreviewImageWidthHeight(width, dummy); } OFCondition DVPresentationState::getPreviewImageHeight(unsigned long &height) { unsigned long dummy; return getPreviewImageWidthHeight(dummy, height); } OFCondition DVPresentationState::getPreviewImageBitmap(void *bitmap, unsigned long size) { OFCondition result = EC_IllegalCall; if ((previewImage != NULL) && (bitmap != NULL) && (size > 0)) { renderPixelData(); if (previewImage->getOutputData(bitmap, size, 8 /*bits*/, currentImageSelectedFrame-1)) result = EC_Normal; } return result; } OFCondition DVPresentationState::attachImage(DcmDataset *dataset, OFBool transferOwnership) { if (!dataset) return EC_IllegalCall; // select the right DicomImage constructor depending on the Modality LUT DicomImage *image = NULL; if (useModalityRescale) { Float64 slope = 1.0; Float64 intercept = 0.0; if (EC_Normal != rescaleSlope.getFloat64(slope, 0)) { DCMPSTAT_INFO("unable to evaluate Modality Rescale Slope, ignoring."); slope = 1.0; } if (EC_Normal != rescaleIntercept.getFloat64(intercept, 0)) { DCMPSTAT_INFO("unable to evaluate Modality Rescale Slope, ignoring."); intercept = 0.0; } image = new DicomImage(dataset, dataset->getOriginalXfer(), slope, intercept, CIF_UsePresentationState); } else if (useModalityLUT) { image = new DicomImage(dataset, dataset->getOriginalXfer(), modalityLUTData, modalityLUTDescriptor, &modalityLUTExplanation, CIF_UsePresentationState); } else { image = new DicomImage(dataset, dataset->getOriginalXfer(), CIF_UsePresentationState); } OFCondition result = EC_Normal; if (image) { if (EIS_Normal == image->getStatus()) { OFString aString; DcmStack stack; detachImage(); currentImage = image; currentImageWidth = image->getWidth(); currentImageHeight = image->getHeight(); currentImageDataset = dataset; currentImageOwned = transferOwnership; currentImageSelectedFrame = 1; // default: first frame // get Modality if (EC_Normal == dataset->search(DCM_Modality, stack, ESM_fromHere, OFFalse)) { currentImageModality = *((DcmCodeString *)(stack.top())); } stack.clear(); // determine default Presentation LUT Shape if (EC_Normal == dataset->search(DCM_PhotometricInterpretation, stack, ESM_fromHere, OFFalse)) { DcmCodeString *photometricInterpretation = (DcmCodeString *)(stack.top()); if (photometricInterpretation->getVM() == 1) { aString.clear(); photometricInterpretation->getOFString(aString,0); if ((aString == "MONOCHROME1")||(aString == "MONOCHROME 1")) currentImageMonochrome1 = OFTrue; } } stack.clear(); // get SOP class UID and SOP instance UID. if ((EC_Normal == result)&&(EC_Normal == dataset->search(DCM_SOPClassUID, stack, ESM_fromHere, OFFalse))) { result = ((DcmUniqueIdentifier *)(stack.top()))->getString(currentImageSOPClassUID); } stack.clear(); if ((EC_Normal == result)&&(EC_Normal == dataset->search(DCM_SOPInstanceUID, stack, ESM_fromHere, OFFalse))) { result = ((DcmUniqueIdentifier *)(stack.top()))->getString(currentImageSOPInstanceUID); } if (EC_Normal==result) result = currentImageCurveList.read(*dataset); if (EC_Normal==result) result = currentImageVOILUTList.read(*dataset); if (EC_Normal==result) result = currentImageVOIWindowList.read(*dataset); createPreviewImage(maximumPreviewImageWidth, maximumPreviewImageHeight); } else { delete image; result = EC_IllegalCall; } } else result = EC_MemoryExhausted; return result; } OFCondition DVPresentationState::getImageWidth(unsigned long &width) { OFCondition result=EC_Normal; if (currentImage) width = currentImageWidth; else { width = 0; result = EC_IllegalCall; } return result; } OFCondition DVPresentationState::getImageHeight(unsigned long &height) { OFCondition result=EC_Normal; if (currentImage) height = currentImageHeight; else { height = 0; result = EC_IllegalCall; } return result; } OFCondition DVPresentationState::attachImage(DcmFileFormat *fileformat, OFBool transferOwnership) { if (fileformat == NULL) return EC_IllegalCall; OFCondition result = attachImage(fileformat->getDataset(), transferOwnership); if (EC_Normal == result) currentImageFileformat = fileformat; return result; } OFCondition DVPresentationState::addImageReferenceAttached( const char *aetitle, const char *filesetID, const char *filesetUID) { if (currentImageDataset) return addImageReference(*currentImageDataset, aetitle, filesetID, filesetUID); else return EC_IllegalCall; } OFCondition DVPresentationState::removeImageReferenceAttached() { if (currentImageDataset) return removeImageReference(*currentImageDataset); else return EC_IllegalCall; } OFCondition DVPresentationState::setCurrentPresentationLUT(DVPSPresentationLUTType newType) { OFCondition result = presentationLUT.setType(newType); currentImagePLUTValid = OFFalse; // PLUT has changed imageInverse = presentationLUT.isInverse(); return result; } OFCondition DVPresentationState::setDefaultPresentationLUTShape() { OFCondition result = EC_Normal; if (currentImageMonochrome1) result=presentationLUT.setType(DVPSP_inverse); else result=presentationLUT.setType(DVPSP_identity); currentImagePLUTValid = OFFalse; // PLUT has changed imageInverse = presentationLUT.isInverse(); return result; } OFCondition DVPresentationState::setPresentationLookupTable( DcmUnsignedShort& lutDescriptor, DcmUnsignedShort& lutData, DcmLongString& lutExplanation) { OFCondition result = presentationLUT.setLUT(lutDescriptor, lutData, lutExplanation); currentImagePLUTValid = OFFalse; // PLUT has changed OFBool wasInverse = imageInverse; imageInverse = presentationLUT.isInverse(); // keep inverse/normal status as before if ((wasInverse && (! imageInverse))||(imageInverse && (! wasInverse))) result = invertImage(); return result; } OFCondition DVPresentationState::setPresentationLookupTable(DcmItem &dset) { OFCondition result = presentationLUT.read(dset, OFFalse); if (EC_Normal != result) presentationLUT.setType(DVPSP_identity); // set to well-defined default in case of error currentImagePLUTValid = OFFalse; // PLUT has changed OFBool wasInverse = imageInverse; imageInverse = presentationLUT.isInverse(); // keep inverse/normal status as before if ((wasInverse && (! imageInverse))||(imageInverse && (! wasInverse))) result = invertImage(); return result; } void DVPresentationState::removeShutter(DVPSShutterType type) { switch (type) { case DVPSU_rectangular: useShutterRectangular = OFFalse; break; case DVPSU_circular: useShutterCircular = OFFalse; break; case DVPSU_polygonal: useShutterPolygonal = OFFalse; break; case DVPSU_bitmap: if (useShutterBitmap) currentImageOverlaysValid = 1; // invalid but nothing added useShutterBitmap = OFFalse; break; } return; } OFCondition DVPresentationState::setRectShutter(Sint32 lv, Sint32 rv, Sint32 uh, Sint32 lh) { OFCondition result=EC_Normal; char buf[80]; sprintf(buf, "%ld", (long)lv); result = shutterLeftVerticalEdge.putString(buf); sprintf(buf, "%ld", (long)rv); if (EC_Normal==result) result = shutterRightVerticalEdge.putString(buf); sprintf(buf, "%ld", (long)uh); if (EC_Normal==result) result = shutterUpperHorizontalEdge.putString(buf); sprintf(buf, "%ld", (long)lh); if (EC_Normal==result) result = shutterLowerHorizontalEdge.putString(buf); if ((EC_Normal==result)&&(shutterPresentationValue.getLength()==0)) result = shutterPresentationValue.putUint16(0,0); if (EC_Normal==result) { useShutterRectangular = OFTrue; if (useShutterBitmap) currentImageOverlaysValid = 1; // invalid but nothing added useShutterBitmap = OFFalse; } return result; } OFCondition DVPresentationState::setCircularShutter(Sint32 centerX, Sint32 centerY, Sint32 radius) { OFCondition result=EC_Normal; char buf[80]; sprintf(buf, "%ld\\%ld", (long)centerY, (long)centerX); result = centerOfCircularShutter.putString(buf); sprintf(buf, "%ld", (long)radius); if (EC_Normal==result) result = radiusOfCircularShutter.putString(buf); if ((EC_Normal==result)&&(shutterPresentationValue.getLength()==0)) result = shutterPresentationValue.putUint16(0,0); if (EC_Normal==result) { useShutterCircular = OFTrue; if (useShutterBitmap) currentImageOverlaysValid = 1; // invalid but nothing added useShutterBitmap = OFFalse; } return result; } OFCondition DVPresentationState::addPolyShutterVertex(Sint32 x, Sint32 y) { if (verticesOfThePolygonalShutter.getLength()==0) return EC_IllegalCall; OFString aString; OFCondition result = verticesOfThePolygonalShutter.getOFStringArray(aString,OFTrue); if (result==EC_Normal) { char buf[80]; sprintf(buf, "\\%ld\\%ld", (long)y, (long)x); aString += buf; result = verticesOfThePolygonalShutter.putOFStringArray(aString); } if (result==EC_Normal) { Sint32 xp0 = 0; Sint32 yp0 = 0; result = getPolyShutterVertex(0, xp0, yp0); if (result==EC_Normal) { if ((xp0==x)&&(yp0==y)) // polygon is closed now, activate. { if (shutterPresentationValue.getLength()==0) result = shutterPresentationValue.putUint16(0,0); if (EC_Normal==result) { useShutterPolygonal = OFTrue; if (useShutterBitmap) currentImageOverlaysValid = 1; // invalid but nothing added useShutterBitmap = OFFalse; } } } } return result; } OFCondition DVPresentationState::removeGraphicLayer(size_t idx) { const char *name = graphicLayerList.getGraphicLayerName(idx); if (name==NULL) return EC_IllegalCall; activationLayerList.removeLayer(name); currentImageOverlaysValid = 1; // invalid but nothing added graphicAnnotationList.removeLayer(name); return graphicLayerList.removeGraphicLayer(idx); } size_t DVPresentationState::getNumberOfTextObjects(size_t layer) { if (!currentImage) return 0; return graphicAnnotationList.getNumberOfTextObjects(graphicLayerList.getGraphicLayerName(layer), currentImageSOPInstanceUID, currentImageSelectedFrame); } DVPSTextObject *DVPresentationState::getTextObject(size_t layer, size_t idx) { if (!currentImage) return NULL; return graphicAnnotationList.getTextObject(graphicLayerList.getGraphicLayerName(layer), currentImageSOPInstanceUID, currentImageSelectedFrame, idx); } DVPSTextObject *DVPresentationState::addTextObject(size_t layer, DVPSObjectApplicability applicability) { if (!currentImage) return NULL; return graphicAnnotationList.addTextObject(graphicLayerList.getGraphicLayerName(layer), currentImageSOPClassUID, currentImageSOPInstanceUID, currentImageSelectedFrame, applicability); } OFCondition DVPresentationState::removeTextObject(size_t layer, size_t idx) { if (!currentImage) return EC_IllegalCall; return graphicAnnotationList.removeTextObject(graphicLayerList.getGraphicLayerName(layer), currentImageSOPInstanceUID, currentImageSelectedFrame, idx); } OFCondition DVPresentationState::moveTextObject(size_t old_layer, size_t idx, size_t new_layer, DVPSObjectApplicability applicability) { if (!currentImage) return EC_IllegalCall; if (old_layer==new_layer) return EC_Normal; return graphicAnnotationList.moveTextObject( graphicLayerList.getGraphicLayerName(old_layer), currentImageSOPClassUID, currentImageSOPInstanceUID, currentImageSelectedFrame, idx, applicability, graphicLayerList.getGraphicLayerName(new_layer)); } size_t DVPresentationState::getNumberOfGraphicObjects(size_t layer) { if (!currentImage) return 0; return graphicAnnotationList.getNumberOfGraphicObjects(graphicLayerList.getGraphicLayerName(layer), currentImageSOPInstanceUID, currentImageSelectedFrame); } DVPSGraphicObject *DVPresentationState::getGraphicObject(size_t layer, size_t idx) { if (!currentImage) return NULL; return graphicAnnotationList.getGraphicObject(graphicLayerList.getGraphicLayerName(layer), currentImageSOPInstanceUID, currentImageSelectedFrame, idx); } DVPSGraphicObject *DVPresentationState::addGraphicObject(size_t layer, DVPSObjectApplicability applicability) { if (!currentImage) return NULL; return graphicAnnotationList.addGraphicObject(graphicLayerList.getGraphicLayerName(layer), currentImageSOPClassUID, currentImageSOPInstanceUID, currentImageSelectedFrame, applicability); } OFCondition DVPresentationState::removeGraphicObject(size_t layer, size_t idx) { if (!currentImage) return EC_IllegalCall; return graphicAnnotationList.removeGraphicObject(graphicLayerList.getGraphicLayerName(layer), currentImageSOPInstanceUID, currentImageSelectedFrame, idx); } OFCondition DVPresentationState::moveGraphicObject(size_t old_layer, size_t idx, size_t new_layer, DVPSObjectApplicability applicability) { if (!currentImage) return EC_IllegalCall; if (old_layer==new_layer) return EC_Normal; return graphicAnnotationList.moveGraphicObject( graphicLayerList.getGraphicLayerName(old_layer), currentImageSOPClassUID, currentImageSOPInstanceUID, currentImageSelectedFrame, idx, applicability, graphicLayerList.getGraphicLayerName(new_layer)); } DVPSCurve *DVPresentationState::getCurve(size_t layer, size_t idx) { Uint16 rgroup = activationLayerList.getActivationGroup( graphicLayerList.getGraphicLayerName(layer), idx, OFTrue); if (rgroup==0) return NULL; else return currentImageCurveList.getCurveGroup(rgroup); } size_t DVPresentationState::getNumberOfCurvesInImage() { return currentImageCurveList.size(); } DVPSCurve *DVPresentationState::getCurveInImage(size_t idx) { return currentImageCurveList.getCurve(idx); } OFCondition DVPresentationState::addCurve(size_t layer, size_t curveidxinimage) { const char *lname = graphicLayerList.getGraphicLayerName(layer); DVPSCurve *curve = currentImageCurveList.getCurve(curveidxinimage); if ((curve==NULL)||(lname==NULL)) return EC_IllegalCall; return activationLayerList.setActivation(0x5000 + curve->getCurveGroup(), lname); } OFBool DVPresentationState::haveActiveVOIWindow() { DVPSSoftcopyVOI *voi = getCurrentSoftcopyVOI(); if (voi) { if (voi->haveLUT()) return OFFalse; else return OFTrue; } return OFFalse; } OFBool DVPresentationState::haveActiveVOILUT() { DVPSSoftcopyVOI *voi = getCurrentSoftcopyVOI(); if (voi) return voi->haveLUT(); return OFFalse; } const char *DVPresentationState::getCurrentVOIDescription() { DVPSSoftcopyVOI *voi = getCurrentSoftcopyVOI(); if (voi) return voi->getCurrentVOIDescription(); return NULL; } OFCondition DVPresentationState::getCurrentWindowWidth(double &w) { DVPSSoftcopyVOI *voi = getCurrentSoftcopyVOI(); if (voi) return voi->getCurrentWindowWidth(w); return EC_IllegalCall; } OFCondition DVPresentationState::getCurrentWindowCenter(double &c) { DVPSSoftcopyVOI *voi = getCurrentSoftcopyVOI(); if (voi) return voi->getCurrentWindowCenter(c); return EC_IllegalCall; } size_t DVPresentationState::getNumberOfVOILUTsInImage() { return currentImageVOILUTList.size(); } size_t DVPresentationState::getNumberOfVOIWindowsInImage() { return currentImageVOIWindowList.size(); } const char *DVPresentationState::getDescriptionOfVOILUTsInImage(size_t idx) { DVPSVOILUT *lut = currentImageVOILUTList.getVOILUT(idx); if (lut==NULL) return NULL; return lut->getExplanation(); } const char *DVPresentationState::getDescriptionOfVOIWindowsInImage(size_t idx) { DVPSVOIWindow *window = currentImageVOIWindowList.getVOIWindow(idx); if (window==NULL) return NULL; return window->getExplanation(); } OFCondition DVPresentationState::setVOILUTFromImage(size_t idx, DVPSObjectApplicability applicability) { if (currentImage == NULL) return EC_IllegalCall; DVPSVOILUT *lut = currentImageVOILUTList.getVOILUT(idx); if (lut) { currentImageVOIValid = OFFalse; // VOI has changed DVPSSoftcopyVOI *voi = softcopyVOIList.createSoftcopyVOI( referencedSeriesList, currentImageSOPClassUID, currentImageSOPInstanceUID, currentImageSelectedFrame, currentImage->getFrameCount(), applicability); if (voi) return lut->assign(*voi); } return EC_IllegalCall; } OFCondition DVPresentationState::setVOIWindowFromImage(size_t idx, DVPSObjectApplicability applicability) { currentImageVOIValid = OFFalse; // VOI has changed DVPSVOIWindow *window = currentImageVOIWindowList.getVOIWindow(idx); if (window) { return setVOIWindow(window->getWindowCenter(), window->getWindowWidth(), window->getExplanation(), applicability); } return EC_IllegalCall; } OFCondition DVPresentationState::setVOIWindow(double wCenter, double wWidth, const char *description, DVPSObjectApplicability applicability) { if (currentImage == NULL) return EC_IllegalCall; currentImageVOIValid = OFFalse; // VOI has changed DVPSSoftcopyVOI *voi = softcopyVOIList.createSoftcopyVOI( referencedSeriesList, currentImageSOPClassUID, currentImageSOPInstanceUID, currentImageSelectedFrame, currentImage->getFrameCount(), applicability); if (voi) return voi->setVOIWindow(wCenter, wWidth, description); return EC_IllegalCall; } OFCondition DVPresentationState::setVOILUT( DcmUnsignedShort& lutDescriptor, DcmUnsignedShort& lutData, DcmLongString& lutExplanation, DVPSObjectApplicability applicability) { if (lutData.getLength() == 0) return EC_IllegalCall; if (lutDescriptor.getVM() != 3) return EC_IllegalCall; if (currentImage == NULL) return EC_IllegalCall; currentImageVOIValid = OFFalse; // VOI has changed DVPSSoftcopyVOI *voi = softcopyVOIList.createSoftcopyVOI( referencedSeriesList, currentImageSOPClassUID, currentImageSOPInstanceUID, currentImageSelectedFrame, currentImage->getFrameCount(), applicability); if (voi) return voi->setVOILUT(lutDescriptor, lutData, lutExplanation); return EC_IllegalCall; } void DVPresentationState::deactivateVOI(DVPSObjectApplicability applicability) { if (currentImage == NULL) return; currentImageVOIValid = OFFalse; // VOI has changed softcopyVOIList.removeSoftcopyVOI( referencedSeriesList, currentImageSOPInstanceUID, currentImageSelectedFrame, currentImage->getFrameCount(), applicability); return; } OFCondition DVPresentationState::setGammaVOILUT(double gammaValue, DVPSObjectApplicability applicability) { if (currentImage == NULL) return EC_IllegalCall; OFCondition status = EC_IllegalCall; const unsigned int numberOfBits = 16; unsigned long numberOfEntries = 0; signed long firstMapped = 0; if (haveActiveVOIWindow()) // use active VOI window to specify the LUT descriptor { double ww, wc; if ((getCurrentWindowWidth(ww) == EC_Normal) && (getCurrentWindowCenter(wc) == EC_Normal)) { if (ww <= 65536) { numberOfEntries = (unsigned long)ww; firstMapped = (signed long)(wc - ww / 2); } } } if (numberOfEntries == 0) // no valid VOI window, use whole pixel range { double min, max; if (getImageMinMaxPixelRange(min, max) == EC_Normal) { if (max - min < 65536.0) { numberOfEntries = (unsigned long)(max - min + 1.0); firstMapped = (signed long)min; } } } if ((numberOfEntries > 0) && (numberOfEntries <= 65536) && (((firstMapped >= -32768) && (firstMapped <= 32767)) || ((firstMapped >= 0) && (firstMapped <= 65535)))) { Uint16 *data = new Uint16[numberOfEntries]; if (data != NULL) { /* calculate gamma curve */ const Uint16 maxValue = 0xFFFF >> (16 - numberOfBits); double step = (double)maxValue / ((double)numberOfEntries - 1.0); double gammaExp = 1.0 / gammaValue; double factor = (double)maxValue / pow((double)maxValue, gammaExp); unsigned long i; for (i = 0; i < numberOfEntries; i++) data[i]= (Uint16)(factor * pow(i * step, gammaExp)); Uint16 numEntries16 = 0; if (numberOfEntries < 65536) numEntries16 = (Uint16)numberOfEntries; /* LUT Descriptor */ DcmElement *lutDescriptor = NULL; if (firstMapped < 0) { // LUT Descriptor is SS lutDescriptor = new DcmSignedShort(DcmTag(DCM_LUTDescriptor, EVR_SS)); if (lutDescriptor != NULL) { status = lutDescriptor->putSint16((Sint16)numEntries16, 0); if (EC_Normal == status) status = lutDescriptor->putSint16((Sint16)firstMapped, 1); if (EC_Normal == status) status = lutDescriptor->putSint16((Sint16)numberOfBits, 2); } else status = EC_MemoryExhausted; } else { // LUT Descriptor is US lutDescriptor = new DcmUnsignedShort(DcmTag(DCM_LUTDescriptor, EVR_US)); if (lutDescriptor != NULL) { status = lutDescriptor->putUint16(numEntries16, 0); if (EC_Normal == status) status = lutDescriptor->putUint16((Uint16)firstMapped, 1); if (EC_Normal == status) status = lutDescriptor->putUint16((Uint16)numberOfBits, 2); } else status = EC_MemoryExhausted; } /* LUT Data */ DcmElement *lutData = NULL; if (status == EC_Normal) { // LUT Data as OW, because of max size = 64K lutData = new DcmOtherByteOtherWord(DcmTag(DCM_LUTData, EVR_OW)); if (lutData != NULL) status = lutData->putUint16Array(data, numberOfEntries); else status = EC_MemoryExhausted; } /* LUT Explanation */ DcmLongString *lutExplanation = NULL; if (status == EC_Normal) { char explanation[100]; char gammabuf[16]; OFStandard::ftoa(gammabuf, sizeof(gammabuf), gammaValue, OFStandard::ftoa_format_f, 3, 1); sprintf(explanation, "LUT with gamma %s, descriptor %u/%ld/%u", gammabuf, (numberOfEntries < 65536) ? (Uint16)numberOfEntries : 0, firstMapped, numberOfBits); lutExplanation = new DcmLongString(DCM_LUTExplanation); if (lutExplanation != NULL) status = lutExplanation->putString(explanation); else status = EC_MemoryExhausted; } /* set VOI LUT */ if (status == EC_Normal) { if ((lutDescriptor != NULL) && (lutData != NULL) && (lutExplanation != NULL)) status = setVOILUT(*(DcmUnsignedShort *)lutDescriptor, *(DcmUnsignedShort *)lutData, *lutExplanation, applicability); } /* delete temporary dcmtk structures */ delete lutDescriptor; delete lutData; delete lutExplanation; } else status = EC_MemoryExhausted; delete[] data; } return status; } const char *DVPresentationState::getActiveOverlayLabel(size_t layer, size_t idx) { Uint16 group = getActiveOverlayGroup(layer, idx); if (group==0) return NULL; DVPSOverlay *internalOverlay = overlayList.getOverlayGroup(group); if (internalOverlay) return internalOverlay->getOverlayLabel(); if (currentImage) return currentImage->getOverlayLabel(group); return NULL; } const char *DVPresentationState::getActiveOverlayDescription(size_t layer, size_t idx) { Uint16 group = getActiveOverlayGroup(layer, idx); if (group==0) return NULL; DVPSOverlay *internalOverlay = overlayList.getOverlayGroup(group); if (internalOverlay) return internalOverlay->getOverlayDescription(); if (currentImage) return currentImage->getOverlayDescription(group); return NULL; } OFBool DVPresentationState::activeOverlayIsROI(size_t layer, size_t idx) { Uint16 group = getActiveOverlayGroup(layer, idx); if (group==0) return OFFalse; DVPSOverlay *internalOverlay = overlayList.getOverlayGroup(group); if (internalOverlay) return internalOverlay->isROI(); if ((currentImage)&&(EMO_RegionOfInterest == currentImage->getOverlayMode(group))) return OFTrue; return OFFalse; } size_t DVPresentationState::getNumberOfOverlaysInImage() { if (currentImage == NULL) return 0; unsigned int numOverlays=currentImage->getOverlayCount(); size_t result = (size_t) numOverlays; Uint16 group; for (unsigned int i=0; igetOverlayGroupNumber(i)); if ((group==0)||(overlayList.haveOverlayGroup(group))) result--; } return result; } Uint16 DVPresentationState::getOverlayInImageGroup(size_t idx) { if (currentImage == NULL) return 0; size_t currentIndex = 0; Uint16 group; do { group = (Uint16) (currentImage->getOverlayGroupNumber(currentIndex++)); if (!overlayList.haveOverlayGroup(group)) { // group is not shadowed by the presentation state if (idx==0) return group; else idx--; } } while (group != 0); return 0; } const char *DVPresentationState::getOverlayInImageLabel(size_t idx) { Uint16 group = getOverlayInImageGroup(idx); // returns 0 if currentImage==NULL if (group==0) return NULL; else return currentImage->getOverlayLabel(group); } const char *DVPresentationState::getOverlayInImageDescription(size_t idx) { Uint16 group = getOverlayInImageGroup(idx); // returns 0 if currentImage==NULL if (group==0) return NULL; else return currentImage->getOverlayDescription(group); } size_t DVPresentationState::getOverlayInImageActivationLayer(size_t idx) { Uint16 group = getOverlayInImageGroup(idx); // returns 0 if currentImage==NULL if (group==0) return DVPS_IDX_NONE; const char *layerName = activationLayerList.getActivationLayer(group); if (layerName) return graphicLayerList.getGraphicLayerIndex(layerName); else return DVPS_IDX_NONE; } OFBool DVPresentationState::overlayInImageIsROI(size_t idx) { Uint16 group = getOverlayInImageGroup(idx); // returns 0 if currentImage==NULL if (group==0) return OFFalse; if (EMO_RegionOfInterest == currentImage->getOverlayMode(group)) return OFTrue; else return OFFalse; } OFCondition DVPresentationState::removeOverlayFromPresentationState(size_t idx) { Uint16 group = getOverlayInPresentationStateGroup(idx); if (group != 0) { activationLayerList.removeActivation(group); currentImageOverlaysValid = 1; // invalid but nothing added return overlayList.removeOverlay(idx); } return EC_IllegalCall; // overlay does not exist } Uint16 DVPresentationState::findOverlayGroup(Uint16 currentGroup) { int allocated[16]; size_t i, max; Uint16 group = 0; for (i=0; i<16; i++) allocated[i]=0; max = overlayList.size(); for (i=0; i= 0x6000)&&(group <= 0x601F)) allocated[(Uint16)(group - 0x6000) >> 1] = 2; } max = getNumberOfOverlaysInImage(); for (i=0; i= 0x6000)&&(group <= 0x601F)) allocated[(Uint16)(group - 0x6000) >> 1] += 1; } // now we have 0=unused, 1=used in image, 2=used in pstate, 3=used in both. // check if the current group can be left unchanged if ((currentGroup >= 0x6000)&&(currentGroup <= 0x601F)) { if (allocated[(Uint16)(group - 0x6000) >> 1] == 2) return currentGroup; } // find a free group for (i=0; i<16; i++) if (allocated[i]==0) return 0x6000+(i<<1); // find a group not used in the presentation state for (i=0; i<16; i++) if (allocated[i]<2) return 0x6000+(i<<1); // not found. return 0; } OFCondition DVPresentationState::changeOverlayGroupInPresentationState(size_t idx, Uint16 newGroup) { Uint16 group = getOverlayInPresentationStateGroup(idx); if (group != 0) { if (newGroup==0) newGroup = findOverlayGroup(group); if (newGroup==group) return EC_Normal; // shortcut - no change needed OFCondition result = overlayList.changeOverlayGroup(idx, newGroup); if (EC_Normal == result) { const char *layerName = activationLayerList.getActivationLayer(group); if (layerName) { activationLayerList.removeActivation(group); result = activationLayerList.setActivation(newGroup, layerName); currentImageOverlaysValid = 0; // invalid } } return result; } return EC_IllegalCall; } OFCondition DVPresentationState::addOverlayToPresentationState(DcmItem& overlayIOD, Uint16 groupInItem, Uint16 newGroup) { if (newGroup==0) newGroup = findOverlayGroup(); if (newGroup==0) return EC_IllegalCall; // no group number available return overlayList.addOverlay(overlayIOD, groupInItem, newGroup); } OFBool DVPresentationState::overlayIsSuitableAsBitmapShutter(size_t idx) { if (currentImage) { DVPSOverlay *overlay = overlayList.getOverlay(idx); if (overlay) { return overlay->isSuitableAsShutter(currentImage->getWidth(), currentImage->getHeight()); } } return OFFalse; } OFCondition DVPresentationState::activateOverlayInImage(size_t layer, size_t idx) { Uint16 group = getOverlayInImageGroup(idx); if (group==0) return EC_IllegalCall; if (activationLayerList.getActivationLayer(group) != NULL) return EC_IllegalCall; //already activated const char *layerName = getGraphicLayerName(layer); if (layerName==NULL) return EC_IllegalCall; currentImageOverlaysValid = 1; // invalid but nothing (external) added return activationLayerList.setActivation(group, layerName); } OFCondition DVPresentationState::activateOverlayInPresentationState(size_t layer, size_t idx) { Uint16 group = getOverlayInPresentationStateGroup(idx); if (group==0) return EC_IllegalCall; if (activationLayerList.getActivationLayer(group) != NULL) return EC_IllegalCall; //already activated if (haveShutter(DVPSU_bitmap)) { // check if the overlay is used as the bitmap shutter Uint16 shutterGroup=0; shutterOverlayGroup.getUint16(shutterGroup,0); if (shutterGroup == group) return EC_IllegalCall; // used as bitmap shutter } const char *layerName = getGraphicLayerName(layer); if (layerName==NULL) return EC_IllegalCall; currentImageOverlaysValid = 0; // invalid return activationLayerList.setActivation(group, layerName); } OFCondition DVPresentationState::activateOverlayAsBitmapShutter(size_t idx) { Uint16 group = getOverlayInPresentationStateGroup(idx); if (group==0) return EC_IllegalCall; if (activationLayerList.getActivationLayer(group) != NULL) return EC_IllegalCall; // activated as overlay if (overlayIsSuitableAsBitmapShutter(idx)) { shutterOverlayGroup.clear(); OFCondition result = shutterOverlayGroup.putUint16(group,0); if ((EC_Normal==result)&&(shutterPresentationValue.getLength()==0)) result = shutterPresentationValue.putUint16(0,0); if (EC_Normal==result) { useShutterRectangular = OFFalse; useShutterCircular = OFFalse; useShutterPolygonal = OFFalse; useShutterBitmap = OFTrue; currentImageOverlaysValid = 0; // invalid } return result; } return EC_IllegalCall; } OFCondition DVPresentationState::deactivateOverlay(size_t layer, size_t idx) { Uint16 group = activationLayerList.getActivationGroup( graphicLayerList.getGraphicLayerName(layer), idx, OFFalse); if (group == 0) return EC_IllegalCall; activationLayerList.removeActivation(group); currentImageOverlaysValid = 1; // invalid but nothing added return EC_Normal; } Uint16 DVPresentationState::convertPValueToDDL(Uint16 pvalue, unsigned int bits) { Uint16 result = 0; if ((bits == 8) || (bits == 12)) { if (currentImage && (bits == 8)) { /* activate display transform */ if (displayFunction && (displayTransform != DVPSD_none)) currentImage->setDisplayFunction(displayFunction[displayTransform]); else currentImage->setNoDisplayFunction(); currentImage->convertPValueToDDL(pvalue, result, bits /* 8 */); } else result = (pvalue >> (16 - bits)); } return result; } void DVPresentationState::renderPixelData(OFBool display) { if (currentImage == NULL) return; int result=0; /* activate Barten transform */ if (displayFunction && (displayTransform != DVPSD_none) && display) { currentImage->setDisplayFunction(displayFunction[displayTransform]); if (previewImage != NULL) previewImage->setDisplayFunction(displayFunction[displayTransform]); } else { currentImage->setNoDisplayFunction(); if (previewImage != NULL) previewImage->setNoDisplayFunction(); } if (! currentImageVOIValid) { currentImageVOIValid = OFTrue; /* set VOI transformation */ DVPSSoftcopyVOI *voi = getCurrentSoftcopyVOI(); if (voi) { if (voi->haveLUT()) { result = currentImage->setVoiLut(voi->getLUTData(), voi->getLUTDescriptor()); if (previewImage != NULL) previewImage->setVoiLut(voi->getLUTData(), voi->getLUTDescriptor()); } else { double wc=0.0, ww=0.0; if ((EC_Normal == voi->getCurrentWindowCenter(wc)) && (EC_Normal == voi->getCurrentWindowWidth(ww))) { result = currentImage->setWindow(wc, ww); if (previewImage != NULL) previewImage->setWindow(wc, ww); } else { result = currentImage->setNoVoiTransformation(); if (previewImage != NULL) previewImage->setNoVoiTransformation(); } } } else { result = currentImage->setNoVoiTransformation(); if (previewImage != NULL) previewImage->setNoVoiTransformation(); } if (!result) DCMPSTAT_INFO("unable to set VOI transformation, ignoring."); } /* VOI transform */ if (! currentImagePLUTValid) { presentationLUT.activate(currentImage); if (previewImage != NULL) presentationLUT.activate(previewImage); currentImagePLUTValid = OFTrue; } /* Presentation LUT */ Uint16 bitmapShutterGroup = 0; Uint16 bitmapShutterPValue = 0; if (useShutterBitmap) { if (EC_Normal != shutterOverlayGroup.getUint16(bitmapShutterGroup, 0)) bitmapShutterGroup=0; if (EC_Normal != shutterPresentationValue.getUint16(bitmapShutterPValue, 0)) bitmapShutterPValue=0; } if (currentImageOverlaysValid==1) { /* overlays are invalid but no external overlays have been added */ /* remove all external overlays that are not active as overlay or bitmap shutter */ for (unsigned int remgroup=0x6000; remgroup <= 0x601F; remgroup += 2) { if ((remgroup != bitmapShutterGroup)&&((! overlayList.haveOverlayGroup(remgroup))|| (NULL == activationLayerList.getActivationLayer(remgroup)))) { currentImage->removeOverlay(remgroup); // ignore return value. } } currentImageOverlaysValid = 2; // valid } else if (currentImageOverlaysValid==0) { /* overlays are invalid */ /* since we might be required to add external overlays, we first * need to flip the image back to its original rotation and flip state */ if (currentImageFlip) { result = currentImage->flipImage(); if (previewImage != NULL) previewImage->flipImage(); if (!result) DCMPSTAT_INFO("unable to flip image horizontally, ignoring."); currentImageFlip = OFFalse; } signed int srot=0; switch(currentImageRotation) { case DVPSR_0_deg: break; case DVPSR_90_deg: srot=270; break; case DVPSR_180_deg: srot=180; break; case DVPSR_270_deg: srot=90; break; } if (srot != 0) { result = currentImage->rotateImage(srot); if (previewImage != NULL) previewImage->rotateImage(srot); if (!result) DCMPSTAT_INFO("unable to rotate image by " << srot << " degrees, ignoring."); } currentImageRotation = DVPSR_0_deg; // deactivate all overlays first result = currentImage->removeAllOverlays(); if (!result) DCMPSTAT_INFO("unable to disable external overlays, ignoring."); size_t numOverlays = overlayList.size(); DVPSOverlay *overlay = NULL; Uint16 ovgroup; for (size_t ovidx=0; ovidxgetOverlayGroup()+ 0x6000; if (NULL != activationLayerList.getActivationLayer(ovgroup)) { if (activateOverlayHelper(*overlay, *currentImage).bad()) { if (!result) DCMPSTAT_INFO("unable to set external overlay group 0x" << STD_NAMESPACE hex << ovgroup << STD_NAMESPACE dec << ", ignoring."); } } else if ((useShutterBitmap)&&(ovgroup == bitmapShutterGroup)) { //activate bitmap overlay if (activateOverlayHelper(*overlay, *currentImage, OFTrue, bitmapShutterPValue).bad()) { if (!result) DCMPSTAT_INFO("unable to activate bitmap shutter 0x" << STD_NAMESPACE hex << ovgroup << STD_NAMESPACE dec << ", ignoring."); } } } } currentImageOverlaysValid = 2; // valid } OFBool pstateFlip = getFlip(); DVPSRotationType pstateRotation = getRotation(); // store image width and height after application of rotation if ((pstateRotation == DVPSR_90_deg) || (pstateRotation == DVPSR_270_deg)) { renderedImageWidth = currentImageHeight; renderedImageHeight = currentImageWidth; } else { renderedImageWidth = currentImageWidth; renderedImageHeight = currentImageHeight; } // get coordinates of current displayed area and store values after the // 'virtual' anti-rotation has been applied Sint32 tlhcX = 1; Sint32 tlhcY = 1; Sint32 brhcX = currentImageWidth; Sint32 brhcY = currentImageHeight; getImageRelativeDisplayedArea(tlhcX, tlhcY, brhcX, brhcY); if (tlhcX > brhcX) { // swap 'left' and 'right' if necessary Sint32 tmp = tlhcX; tlhcX = brhcX; brhcX = tmp; } if (tlhcY > brhcY) { // swap 'top' and 'bottom' if necessary Sint32 tmp = tlhcY; tlhcY = brhcY; brhcY = tmp; } switch (pstateRotation) { case DVPSR_0_deg: renderedImageTop = tlhcY; renderedImageLeft = tlhcX; renderedImageBottom = brhcY; renderedImageRight = brhcX; break; case DVPSR_90_deg: renderedImageTop = tlhcX; renderedImageLeft = (signed long)currentImageHeight - brhcY + 1; renderedImageBottom = brhcX; renderedImageRight = (signed long)currentImageHeight - tlhcY + 1; break; case DVPSR_180_deg: renderedImageTop = (signed long)currentImageHeight - brhcY + 1; renderedImageLeft = (signed long)currentImageWidth - brhcX + 1; renderedImageBottom = (signed long)currentImageHeight - tlhcY + 1; renderedImageRight = (signed long)currentImageWidth - tlhcX + 1; break; case DVPSR_270_deg: renderedImageTop = (signed long)currentImageWidth - brhcX + 1; renderedImageLeft = tlhcY; renderedImageBottom = (signed long)currentImageWidth - tlhcX + 1; renderedImageRight = brhcY; break; } if (pstateFlip) { signed long tmp = renderedImageLeft; renderedImageLeft = (signed long)renderedImageWidth - renderedImageRight + 1; renderedImageRight = (signed long)renderedImageWidth - tmp + 1; } // we can always reach the final rotation/flip status with // at most one rotation and one flip. The following formula // derives the operations to perform. OFBool flp=OFFalse; if ((pstateFlip && !currentImageFlip)||(!pstateFlip && currentImageFlip)) flp=OFTrue; else flp=OFFalse; signed int rot=0; switch (pstateRotation) { case DVPSR_0_deg: switch(currentImageRotation) { case DVPSR_0_deg: rot=0; break; case DVPSR_90_deg: if (currentImageFlip) rot=90; else rot=270; break; case DVPSR_180_deg: rot=180; break; case DVPSR_270_deg: if (currentImageFlip) rot=270; else rot=90; break; } break; case DVPSR_90_deg: switch(currentImageRotation) { case DVPSR_0_deg: if (currentImageFlip) rot=270; else rot=90; break; case DVPSR_90_deg: rot=0; break; case DVPSR_180_deg: if (currentImageFlip) rot=90; else rot=270; break; case DVPSR_270_deg: rot=180; break; } break; case DVPSR_180_deg: switch(currentImageRotation) { case DVPSR_0_deg: rot=180; break; case DVPSR_90_deg: if (currentImageFlip) rot=270; else rot=90; break; case DVPSR_180_deg: rot=0; break; case DVPSR_270_deg: if (currentImageFlip) rot=90; else rot=270; break; } break; case DVPSR_270_deg: switch(currentImageRotation) { case DVPSR_0_deg: if (currentImageFlip) rot=90; else rot=270; break; case DVPSR_90_deg: rot=180; break; case DVPSR_180_deg: if (currentImageFlip) rot=270; else rot=90; break; case DVPSR_270_deg: rot=0; break; } break; } if (rot != 0) { result = currentImage->rotateImage(rot); if (previewImage != NULL) previewImage->rotateImage(rot); if (!result) DCMPSTAT_INFO("unable to rotate image by " << rot << " degrees, ignoring."); } if (flp) { result = currentImage->flipImage(); if (previewImage != NULL) previewImage->flipImage(); if (!result) DCMPSTAT_INFO("unable to flip image horizontally, ignoring."); } currentImageRotation = pstateRotation; currentImageFlip = pstateFlip; return; } OFCondition DVPresentationState::getOverlayData( size_t layer, size_t idx, const void *&overlayData, unsigned int &width, unsigned int &height, unsigned int &left_pos, unsigned int &top_pos, OFBool &isROI, Uint16 &fore, unsigned int bits) { EM_Overlay mode = EMO_Default; if (currentImage && ((bits == 8) || (bits == 12))) { renderPixelData(); Uint16 group = activationLayerList.getActivationGroup(graphicLayerList.getGraphicLayerName(layer), idx, OFFalse); if (group==0) return EC_IllegalCall; Uint16 back = 0; fore = (Uint16)DicomImageClass::maxval(bits); /* 255 or 4095 */ Uint16 pvalue = 65535; if (graphicLayerList.getGraphicLayerRecommendedDisplayValueGray(layer, pvalue) == EC_Normal) currentImage->convertPValueToDDL(pvalue, fore, bits); if (fore == 0) back = (Uint16)DicomImageClass::maxval(bits); const void *data = currentImage->getOverlayData((unsigned int)group, left_pos, top_pos, width, height, mode, currentImageSelectedFrame-1, bits, fore, back); if (EMO_RegionOfInterest == mode) isROI=OFTrue; else isROI=OFFalse; if (data) overlayData = data; else { overlayData = NULL; return EC_IllegalCall; } } else { overlayData = NULL; width = 0; height = 0; left_pos = 0; top_pos = 0; isROI = OFFalse; fore = 0; return EC_IllegalCall; } return EC_Normal; } OFBool DVPresentationState::isInverse() { return imageInverse; } OFCondition DVPresentationState::invertImage() { OFCondition status = presentationLUT.invert(); currentImagePLUTValid = OFFalse; // PLUT has changed imageInverse = (imageInverse ? OFFalse : OFTrue); return status; } OFCondition DVPresentationState::getPixelData( const void *&pixelData, unsigned long &width, unsigned long &height) { if (currentImage) { renderPixelData(); width = currentImage->getWidth(); height = currentImage->getHeight(); pixelData = currentImage->getOutputData(8, currentImageSelectedFrame-1); } else { pixelData = NULL; width = 0; height = 0; return EC_IllegalCall; } return EC_Normal; } OFCondition DVPresentationState::getPixelData( void *pixelData, unsigned long size) { if (currentImage) { renderPixelData(); if (currentImage->getOutputData(pixelData, size, 8, currentImageSelectedFrame-1)) return EC_Normal; } return EC_IllegalCall; } OFCondition DVPresentationState::getImageMinMaxPixelRange(double &minValue, double& maxValue) { OFCondition result = EC_IllegalCall; if (currentImage) { if (currentImage->getMinMaxValues(minValue, maxValue, 1)) result = EC_Normal; } return result; } OFCondition DVPresentationState::getImageMinMaxPixelValue(double &minValue, double& maxValue) { OFCondition result = EC_IllegalCall; if (currentImage) { if (currentImage->getMinMaxValues(minValue, maxValue, 0)) result = EC_Normal; } return result; } OFCondition DVPresentationState::getImageNumberOfFrames(unsigned long &frames) { if (currentImage) { frames = (unsigned long)(currentImage->getFrameCount()); return EC_Normal; } return EC_IllegalCall; } OFCondition DVPresentationState::selectImageFrameNumber(unsigned long frame) { if ((frame > 0) && currentImage && (frame <= currentImage->getFrameCount())) { if (currentImageSelectedFrame != frame) currentImageVOIValid = OFFalse; // VOI might has changed currentImageSelectedFrame=frame; return EC_Normal; } return EC_IllegalCall; } unsigned long DVPresentationState::getSelectedImageFrameNumber() { if (currentImage) { if (currentImageSelectedFrame <= currentImage->getFrameCount()) return currentImageSelectedFrame; } return 0; } DVPSDisplayedArea *DVPresentationState::getDisplayedAreaSelection() { if (currentImage==NULL) return NULL; DVPSDisplayedArea * area = displayedAreaSelectionList.findDisplayedArea(currentImageSOPInstanceUID, currentImageSelectedFrame); if (area==NULL) { DCMPSTAT_INFO("no displayed area selection item for current image found, creating default."); if ((currentImageDataset)&&(EC_Normal == createDefaultDisplayedArea(*currentImageDataset))) { area = displayedAreaSelectionList.findDisplayedArea(currentImageSOPInstanceUID, currentImageSelectedFrame); } } return area; } DVPSPresentationSizeMode DVPresentationState::getDisplayedAreaPresentationSizeMode() { DVPSDisplayedArea * area = getDisplayedAreaSelection(); if (area) return area->getPresentationSizeMode(); else return DVPSD_scaleToFit; } double DVPresentationState::getDisplayedAreaPresentationPixelAspectRatio() { DVPSDisplayedArea * area = getDisplayedAreaSelection(); if (area) return area->getPresentationPixelAspectRatio(); else return 1.0; } OFCondition DVPresentationState::getStandardDisplayedArea(Sint32& tlhcX, Sint32& tlhcY, Sint32& brhcX, Sint32& brhcY) { DVPSDisplayedArea * area = getDisplayedAreaSelection(); if (area) { area->getDisplayedArea(tlhcX, tlhcY, brhcX, brhcY); return EC_Normal; } return EC_IllegalCall; } OFCondition DVPresentationState::getImageRelativeDisplayedArea(Sint32& tlhcX, Sint32& tlhcY, Sint32& brhcX, Sint32& brhcY) { DVPSDisplayedArea * area = getDisplayedAreaSelection(); if (area) { DVPSRotationType rotation = getRotation(); OFBool flip = getFlip(); area = area->clone(); // create temporary copy area->rotateAndFlip(rotation, flip, DVPSR_0_deg, OFFalse); area->getDisplayedArea(tlhcX, tlhcY, brhcX, brhcY); delete area; return EC_Normal; } return EC_IllegalCall; } OFCondition DVPresentationState::getDisplayedAreaPresentationPixelSpacing(double& x, double& y) { DVPSDisplayedArea * area = getDisplayedAreaSelection(); if (area) return area->getPresentationPixelSpacing(x, y); else return EC_IllegalCall; } OFCondition DVPresentationState::getDisplayedAreaPresentationPixelMagnificationRatio(double& magnification) { DVPSDisplayedArea * area = getDisplayedAreaSelection(); if (area) return area->getPresentationPixelMagnificationRatio(magnification); else return EC_IllegalCall; } OFBool DVPresentationState::canUseDisplayedAreaTrueSize() { DVPSDisplayedArea * area = getDisplayedAreaSelection(); if (area) return area->canUseTrueSize(); else return OFFalse; } OFCondition DVPresentationState::setStandardDisplayedArea( DVPSPresentationSizeMode sizeMode, Sint32 tlhcX, Sint32 tlhcY, Sint32 brhcX, Sint32 brhcY, double magnification, DVPSObjectApplicability applicability) { if (currentImage == NULL) return EC_IllegalCall; // make sure that we have an old displayed area item that "knows" about pixel spacing/aspect ratio, // because we will only copy this data into the new item. DVPSDisplayedArea *area = getDisplayedAreaSelection(); // find appropriate item, create new if necessary. area = displayedAreaSelectionList.createDisplayedArea( referencedSeriesList, currentImageSOPClassUID, currentImageSOPInstanceUID, currentImageSelectedFrame, currentImage->getFrameCount(), applicability); if (area) return area->setDisplayedArea(sizeMode, tlhcX, tlhcY, brhcX, brhcY, magnification); return EC_IllegalCall; } OFCondition DVPresentationState::setImageRelativeDisplayedArea( DVPSPresentationSizeMode sizeMode, Sint32 tlhcX, Sint32 tlhcY, Sint32 brhcX, Sint32 brhcY, double magnification, DVPSObjectApplicability applicability) { if (currentImage == NULL) return EC_IllegalCall; // make sure that we have an old displayed area item that "knows" about pixel spacing/aspect ratio, // because we will only copy this data into the new item. DVPSDisplayedArea *area = getDisplayedAreaSelection(); // find appropriate item, create new if necessary. area = displayedAreaSelectionList.createDisplayedArea( referencedSeriesList, currentImageSOPClassUID, currentImageSOPInstanceUID, currentImageSelectedFrame, currentImage->getFrameCount(), applicability); if (area) { // get current rotation and flip status DVPSRotationType rotation = getRotation(); OFBool flip = getFlip(); // force rotation and flip status back to unrotated/unflipped // because in this case standard displayed area and image relative displayed area are the same area->rotateAndFlip(rotation, flip, DVPSR_0_deg, OFFalse); // set displayed area OFCondition result = area->setDisplayedArea(sizeMode, tlhcX, tlhcY, brhcX, brhcY, magnification); // restore rotation and flip status area->rotateAndFlip(DVPSR_0_deg, OFFalse, rotation, flip); return result; } return EC_IllegalCall; } DVPSSoftcopyVOI *DVPresentationState::getCurrentSoftcopyVOI() { if (currentImage==NULL) return NULL; return softcopyVOIList.findSoftcopyVOI(currentImageSOPInstanceUID, currentImageSelectedFrame); } OFCondition DVPresentationState::getPrintBitmapRequestedImageSize(OFString& requestedImageSize) { requestedImageSize.clear(); if ((currentImage)&&(getDisplayedAreaPresentationSizeMode()==DVPSD_trueSize)) { double x=0.0, y=0.0; if (EC_Normal == getDisplayedAreaPresentationPixelSpacing(x, y)) { char c[80]; DVPSRotationType rotation = getRotation(); if ((rotation==DVPSR_90_deg)||(rotation==DVPSR_270_deg)) { x = y * currentImageHeight; // physical height of unrotated image in mm } else { x *= currentImageWidth; // physical width of unrotated image in mm } OFStandard::ftoa(c, sizeof(c), x, OFStandard::ftoa_format_f); requestedImageSize = c; return EC_Normal; } } return EC_IllegalCall; } OFCondition DVPresentationState::writePresentationLUTforPrint(DcmItem &dset) { OFCondition result = EC_Normal; if (currentImageMonochrome1) { // write inverted LUT because image is also converted to MONOCHROME2 presentationLUT.invert(); if (EC_Normal==result) result = presentationLUT.write(dset, OFFalse); presentationLUT.invert(); } else result = presentationLUT.write(dset, OFFalse); return result; } const char *DVPresentationState::getCurrentImageModality() { char *c = NULL; if (EC_Normal == currentImageModality.getString(c)) return c; else return NULL; } const char *DVPresentationState::getAttachedImageSOPClassUID() { return currentImageSOPClassUID; } const char *DVPresentationState::getAttachedImageSOPInstanceUID() { return currentImageSOPInstanceUID; } OFCondition DVPresentationState::activateOverlayHelper(DVPSOverlay& ovl, DicomImage &image, OFBool asShutter, Uint16 pvalue) { Sint16 originX=0; Sint16 originY=0; Uint16 sizeX=0; Uint16 sizeY=0; unsigned int group = ovl.getOverlayGroup() + 0x6000; EM_Overlay mode=EMO_Graphic; if (asShutter) mode=EMO_BitmapShutter; else if (ovl.isROI()) mode=EMO_RegionOfInterest; OFCondition result = ovl.getValues(originX, originY, sizeX, sizeY); if (result.good()) { signed int left_pos = (signed int) originX; signed int top_pos = (signed int) originY; unsigned int columns = (unsigned int)sizeX; unsigned int rows = (unsigned int)sizeY; if (0 == image.addOverlay(group, left_pos, top_pos, columns, rows, ovl.getData(), ovl.getLabel(), ovl.getDescription(), mode)) result = EC_IllegalCall; if ((asShutter)&&(EC_Normal==result)) { if (0 == image.showOverlay(group, pvalue)) result = EC_IllegalCall; } } return result; } OFCondition DVPresentationState::read(DcmItem &dset) { OFCondition result = DcmPresentationState::read(dset); imageInverse = presentationLUT.isInverse(); return result; } OFCondition DVPresentationState::createFromImage( DcmItem &dset, DVPSoverlayActivation overlayActivation, DVPSVOIActivation voiActivation, OFBool curveActivation, OFBool shutterActivation, OFBool presentationActivation, DVPSGraphicLayering layering, const char *aetitle, const char *filesetID, const char *filesetUID) { OFCondition result = DcmPresentationState::createFromImage( dset, overlayActivation, voiActivation, curveActivation, shutterActivation, presentationActivation, layering, aetitle, filesetID, filesetUID); imageInverse = presentationLUT.isInverse(); return result; } /* * $Log: dvpstat.cc,v $ * Revision 1.86 2010-10-14 13:14:33 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.85 2009-11-24 14:12:59 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.84 2009-09-17 06:56:54 joergr * Added parentheses around && within || in order to avoid compiler warnings. * * Revision 1.83 2009-08-26 07:52:21 joergr * Added parentheses around && within || in order to avoid warnings reported by * gcc 4.3.2. * * Revision 1.82 2006/08/15 16:57:02 meichel * Updated the code in module dcmpstat to correctly compile when * all standard C++ classes remain in namespace std. * * Revision 1.81 2005/12/08 15:46:51 meichel * Changed include path schema for all DCMTK header files * * Revision 1.80 2004/08/03 11:43:18 meichel * Headers libc.h and unistd.h are now included via ofstdinc.h * * Revision 1.79 2004/02/04 15:57:49 joergr * Removed acknowledgements with e-mail addresses from CVS log. * * Revision 1.78 2003/09/05 14:30:08 meichel * Introduced new API methods that allow Displayed Areas to be queried * and set either relative to the image (ignoring rotation and flip) or * in absolute values as defined in the standard. Rotate and flip methods * now adjust displayed areas in the presentation state. * * Revision 1.77 2003/08/27 14:57:20 meichel * Splitted class DVPresentationState into a base class DcmPresentationState * that does not depend on module dcmimgle and current derived class with * public API identical to the previous version. * * Revision 1.76 2003/06/04 12:30:29 meichel * Added various includes needed by MSVC5 with STL * * Revision 1.75 2003/04/14 14:28:05 meichel * Added explicit typecasts in calls to pow(). Needed by Visual C++ .NET 2003. * * Revision 1.74 2002/12/09 13:28:16 joergr * Renamed parameter/local variable to avoid name clashes with global * declaration left and/or right (used for as iostream manipulators). * * Revision 1.73 2002/12/04 10:41:38 meichel * Changed toolkit to use OFStandard::ftoa instead of sprintf for all * double to string conversions that are supposed to be locale independent * * Revision 1.72 2002/11/27 15:48:15 meichel * Adapted module dcmpstat to use of new header file ofstdinc.h * * Revision 1.71 2002/04/16 14:02:22 joergr * Added configurable support for C++ ANSI standard includes (e.g. streams). * * Revision 1.70 2002/01/08 10:40:58 joergr * Corrected spelling of function dcmGenerateUniqueIdentifier(). * Changed prefix of UIDs created for series and studies (now using constants * SITE_SERIES_UID_ROOT and SITE_STUDY_UID_ROOT which are supposed to be used * in these cases). * * Revision 1.69 2001/11/28 13:57:05 joergr * Check return value of DcmItem::insert() statements where appropriate to * avoid memory leaks when insert procedure fails. * * Revision 1.68 2001/09/28 13:50:14 joergr * Added "#include " to keep gcc 3.0 quiet. * * Revision 1.67 2001/09/26 15:36:34 meichel * Adapted dcmpstat to class OFCondition * * Revision 1.66 2001/06/01 15:50:39 meichel * Updated copyright header * * Revision 1.65 2000/11/13 15:50:46 meichel * Added dcmpstat support methods for creating image references * in SR documents. * * Revision 1.64 2000/07/12 12:49:05 joergr * Added comment. * * Revision 1.63 2000/07/03 14:04:01 joergr * Fixed bug: VOI LUT transform defined per frame was not supported by the * method renderPixelData(). * * Revision 1.62 2000/06/09 10:15:37 joergr * Added support for rendering inverse presentation LUT into print bitmaps. * * Revision 1.61 2000/06/08 17:39:07 joergr * Corrected bug in addImageReferenceToPState(). * * Revision 1.60 2000/06/08 10:44:38 meichel * Implemented Referenced Presentation LUT Sequence on Basic Film Session level. * Empty film boxes (pages) are not written to file anymore. * * Revision 1.59 2000/06/02 16:01:08 meichel * Adapted all dcmpstat classes to use OFConsole for log and error output * * Revision 1.58 2000/06/02 12:48:04 joergr * Reject invalid frame numbers in method selectImageFrameNumber(). * * Revision 1.57 2000/05/31 13:02:40 meichel * Moved dcmpstat macros and constants into a common header file * * Revision 1.56 2000/05/30 14:22:14 joergr * Renamed some variables to avoid compiler warnings (reported by gcc 2.9x with * additional compiler flags). * * Revision 1.55 2000/05/30 13:59:16 joergr * Removed methods which were already marked as "retired". * Added new function allowing to set a VOILUT created from a given gamma * value. * * Revision 1.54 2000/03/08 16:29:11 meichel * Updated copyright header. * * Revision 1.53 2000/03/03 14:14:06 meichel * Implemented library support for redirecting error messages into memory * instead of printing them to stdout/stderr for GUI applications. * * Revision 1.52 2000/02/23 15:12:57 meichel * Corrected macro for Borland C++ Builder 4 workaround. * * Revision 1.51 2000/02/01 11:54:45 meichel * Avoiding to include as extern "C" on Borland C++ Builder 4, * workaround for bug in compiler header files. * * Revision 1.50 1999/11/15 19:03:13 joergr * Changed behaviour of method getOverlayData(): parameter 'transp' replaced by * 'fore' to specify the foreground color used for the overlay plane. * Fixed bug concerning the setting of window center and width for the preview * image. * * Revision 1.49 1999/11/12 16:51:54 meichel * Corrected creation of circular shutters, X/Y coordinates were swapped. * * Revision 1.48 1999/10/25 18:46:07 joergr * Fixed bug caused by the incorrect order of x/y coordinates for circular * and polygonal shutters (the DICOM standard is somehow inconsistent in this * respect). * * Revision 1.47 1999/10/22 09:08:23 joergr * Added validity check to methods setting pixel aspect ratio and pixel * spacing (>0). Fixed problems with incorrect pixel spacing (0\0) stored in * sample images. * * Revision 1.46 1999/10/20 18:41:20 joergr * Added explicit type cast to make MSVC happy. * * Revision 1.45 1999/10/20 11:01:16 joergr * Enhanced method getOverlayData to support 12 bit data for print. * Enhanced method convertPValueToDDL to support 12 bit data for print. * Added support for a down-scaled preview image of the current DICOM image * (e.g. useful for online-windowing or print preview). * Always use the variable 'currentImageSelectedFrame' as the frame number, * not 1. * * Revision 1.44 1999/10/19 16:24:58 meichel * Corrected handling of MONOCHROME1 images when used with P-LUTs * * Revision 1.43 1999/10/18 10:18:52 joergr * Use the current display shutter P-value for the border area of print * bitmaps. * Switch off time consuming interpolation for implicite scaling of print * bitmaps. * * Revision 1.42 1999/10/13 14:12:02 meichel * Added config file entries and access methods * for user-defined VOI presets, log directory, verbatim logging * and an explicit list of image display formats for each printer. * * Revision 1.41 1999/10/07 17:22:03 meichel * Reworked management of Presentation LUTs in order to create tighter * coupling between Softcopy and Print. * * Revision 1.40 1999/10/06 13:24:50 joergr * Fixed bug in renderPixelData: images haven't been flipped correctly for * PrintBitmap. * Corrected creation of PrintBitmap pixel data: VOI windows should be applied * before clipping to avoid that the region outside the image (border) is also * windowed (this requires a new method in dcmimgle to create a DicomImage * with the grayscale transformations already applied). * * Revision 1.39 1999/09/30 12:04:04 joergr * Corrected typos and formatting; modified comments. * * Revision 1.38 1999/09/20 13:22:23 joergr * Corrected bug with clipping of rotated print bitmaps (removed inconsistency * with 90 and 270 degree rotation). * * Revision 1.37 1999/09/17 14:29:46 meichel * Moved static helper functions to new class DVPSHelper, removed some unused code. * * Revision 1.36 1999/09/13 14:01:23 thiel * correction of DEBUG code for LIN_OD * * Revision 1.35 1999/09/10 13:07:38 thiel * correction of LIN OD in createFromImage * * Revision 1.34 1999/09/10 12:46:58 meichel * Added implementations for a number of print API methods. * * Revision 1.33 1999/09/10 09:16:44 joergr * Added support for CIELAB display function. New methods to handle display * functions. Old methods are marked as retired and should be removed asap. * * Revision 1.32 1999/09/10 07:32:44 thiel * Added Presentation LUT Shape LIN OD * * Revision 1.31 1999/09/07 09:05:13 joergr * Completed support for getting a print bitmap out of a pstate object. * * Revision 1.30 1999/09/01 16:15:11 meichel * Added support for requested image size to print routines * * Revision 1.29 1999/08/31 14:01:38 meichel * Fixed print image crop boundary computation problem * * Revision 1.28 1999/08/27 15:57:51 meichel * Added methods for saving hardcopy images and stored print objects * either in file or in the local database. * * Revision 1.27 1999/08/25 16:51:17 joergr * Added minimal support to get a print bitmap out of a pstate object. * * Revision 1.26 1999/07/30 13:35:01 meichel * Added new classes managing Stored Print objects * * Revision 1.25 1999/07/28 07:57:26 meichel * Minor correction for VC++ 5. * * Revision 1.24 1999/07/22 16:40:04 meichel * Adapted dcmpstat data structures and API to supplement 33 letter ballot text. * * Revision 1.23 1999/07/14 12:03:44 meichel * Updated data dictionary for supplement 29, 39, 33_lb, CP packet 4 and 5. * Corrected dcmtk applications for changes in attribute name constants. * * Revision 1.22 1999/05/04 15:27:27 meichel * Minor code purifications to keep gcc on OSF1 quiet. * * Revision 1.21 1999/05/03 11:01:38 joergr * Minor code purifications to keep Sun CC 2.0.1 quiet. * * Revision 1.20 1999/04/28 11:34:29 meichel * When creating a presentation state for an image, modality rescale/slope * without rescale type is handled now in a more lenient way. * * Revision 1.19 1999/04/27 11:26:01 joergr * Added method to check whether current image is inverse or not. * * Revision 1.18 1999/03/22 09:52:42 meichel * Reworked data dictionary based on the 1998 DICOM edition and the latest * supplement versions. Corrected dcmtk applications for minor changes * in attribute name constants. * * Revision 1.17 1999/03/22 09:06:48 joergr * Added parameter to get value of (transparent) background color for method * getOverlayData. * * Revision 1.16 1999/03/03 17:58:07 joergr * Changed implementation of invertImage(): set modify flag for all plut types. * * Revision 1.15 1999/03/03 14:02:03 joergr * Changed implementation of invertImage() to avoid compiler errors on MSVC5 * ('return' has to be last statement). * * Revision 1.14 1999/03/03 13:32:34 joergr * Added method to invert an image by changing the presentation state LUT or * shape. * Changed implementation of method 'getOverlayData()': now conversion from * P-value to DDL is implictly performed and the correct P-value for the related * layer is used. * * Revision 1.13 1999/02/25 18:41:42 joergr * Added method to fill pixel data into an externally handled storage area. * Added initialization of local variable to avoid compiler warnings (reported * by gcc 2.7.2.1 on Linux). * * Revision 1.12 1999/02/23 11:49:05 joergr * Corrected bug: shutters were not saved correctly (sometimes even ignored). * * Revision 1.11 1999/02/18 11:36:40 meichel * Added new method convertPValueToDDL() to DVPresentationState * that maps P-Values to DDLs. * * Revision 1.10 1999/02/17 10:05:35 meichel * Moved creation of Display Function object from DVPresentationState to * DVInterface to avoid unnecessary re-reads. * * Revision 1.9 1999/02/09 15:59:09 meichel * Implemented bitmap shutter activation amd method for * exchanging graphic layers. * * Revision 1.8 1999/02/05 17:45:39 meichel * Added config file entry for monitor characteristics file. Monitor charac- * teristics are passed to dcmimage if present to activate Barten transform. * * Revision 1.7 1999/01/18 17:30:36 meichel * Now preventing VOI Windows with a width <= 0.0. Presentation label and * creator's name are now correctly set. * * Revision 1.6 1999/01/15 17:32:59 meichel * added methods to DVPresentationState allowing to access the image * references in the presentation state. Also added methods allowing to * get the width and height of the attached image. * * Revision 1.5 1999/01/11 13:35:51 meichel * added new methods getImageAspectRatio, getImageMinMaxPixelRange and * getImageMinMaxPixelValue to class DVPresentationState. * * Revision 1.4 1998/12/23 14:02:27 meichel * Updated for changed interfaces in dcmimage overlays. * Fixed bug affecting overlay origin delivered to dcmimage. * * Revision 1.3 1998/12/22 17:57:18 meichel * Implemented Presentation State interface for overlays, * VOI LUTs, VOI windows, curves. Added test program that * allows to add curve data to DICOM images. * * Revision 1.2 1998/12/14 16:10:48 meichel * Implemented Presentation State interface for graphic layers, * text and graphic annotations, presentation LUTs. * * Revision 1.1 1998/11/27 14:50:47 meichel * Initial Release. * */ dcmtk-3.6.0/dcmpstat/libsrc/dvpsgll.cc0000644000310500011400000003371511455601070017126 0ustar joergrdicom3/* * * Copyright (C) 1998-2010, 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: DVPSGraphicLayer_PList * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:14:32 $ * CVS/RCS Revision: $Revision: 1.19 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/ofstd/ofstring.h" #include "dcmtk/dcmpstat/dvpsgll.h" #include "dcmtk/dcmpstat/dvpsgl.h" /* for DVPSGraphicLayer */ #include "dcmtk/dcmpstat/dvpsdef.h" /* for DVPS_IDX_NONE */ #include "dcmtk/dcmpstat/dvpsgal.h" /* for DVPSOverlayCurveActivationLayer_PList */ #include "dcmtk/dcmpstat/dvpsall.h" /* for DVPSGraphicAnnotation_PList& annotations */ #include "dcmtk/dcmpstat/dvpsal.h" /* for DVPSOverlayCurveActivationLayer, needed by MSVC5 with STL */ #include "dcmtk/dcmpstat/dvpsga.h" /* for DVPSGraphicAnnotation, needed by MSVC5 with STL */ #include "dcmtk/dcmpstat/dvpstx.h" /* for DVPSTextObject, needed by MSVC5 with STL */ #include "dcmtk/dcmpstat/dvpsgr.h" /* for DVPSGraphicObject, needed by MSVC5 with STL */ #include "dcmtk/dcmpstat/dvpsri.h" /* for DVPSReferencedImage, needed by MSVC5 with STL */ DVPSGraphicLayer_PList::DVPSGraphicLayer_PList() : list_() { } DVPSGraphicLayer_PList::DVPSGraphicLayer_PList(const DVPSGraphicLayer_PList &arg) : list_() { OFListConstIterator(DVPSGraphicLayer *) first = arg.list_.begin(); OFListConstIterator(DVPSGraphicLayer *) last = arg.list_.end(); while (first != last) { list_.push_back((*first)->clone()); ++first; } } DVPSGraphicLayer_PList::~DVPSGraphicLayer_PList() { clear(); } void DVPSGraphicLayer_PList::clear() { OFListIterator(DVPSGraphicLayer *) first = list_.begin(); OFListIterator(DVPSGraphicLayer *) last = list_.end(); while (first != last) { delete (*first); first = list_.erase(first); } } OFCondition DVPSGraphicLayer_PList::read(DcmItem &dset) { OFCondition result = EC_Normal; DcmStack stack; DVPSGraphicLayer *newLayer = NULL; DcmSequenceOfItems *dseq=NULL; DcmItem *ditem=NULL; if (EC_Normal == dset.search(DCM_GraphicLayerSequence, stack, ESM_fromHere, OFFalse)) { dseq=(DcmSequenceOfItems *)stack.top(); if (dseq) { unsigned long numItems = dseq->card(); for (unsigned int i=0; igetItem(i); newLayer = new DVPSGraphicLayer(); if (newLayer && ditem) { result = newLayer->read(*ditem); list_.push_back(newLayer); } else result = EC_MemoryExhausted; } } } return result; } OFCondition DVPSGraphicLayer_PList::write(DcmItem &dset) { if (size()==0) return EC_Normal; // don't write empty Sequence OFCondition result = EC_Normal; DcmSequenceOfItems *dseq=NULL; DcmItem *ditem=NULL; dseq = new DcmSequenceOfItems(DCM_GraphicLayerSequence); if (dseq) { OFListIterator(DVPSGraphicLayer *) first = list_.begin(); OFListIterator(DVPSGraphicLayer *) last = list_.end(); while (first != last) { if (result==EC_Normal) { ditem = new DcmItem(); if (ditem) { result = (*first)->write(*ditem); if (result==EC_Normal) dseq->insert(ditem); else delete ditem; } else result = EC_MemoryExhausted; } ++first; } if (result==EC_Normal) dset.insert(dseq, OFTrue /*replaceOld*/); else delete dseq; } else result = EC_MemoryExhausted; return result; } OFCondition DVPSGraphicLayer_PList::addGraphicLayer(const char *gLayer, const Sint32 gLayerOrder, const char *gLayerDescription) { if (gLayer==NULL) return EC_IllegalCall; OFString ggLayer(gLayer); /* check that no graphic layer with the same name exist */ OFListIterator(DVPSGraphicLayer *) first = list_.begin(); OFListIterator(DVPSGraphicLayer *) last = list_.end(); while (first != last) { if (ggLayer == (*first)->getGL()) return EC_IllegalCall; ++first; } DVPSGraphicLayer *newLayer = new DVPSGraphicLayer; if (newLayer) { newLayer->setGL(gLayer); newLayer->setGLOrder(gLayerOrder); if (gLayerDescription) newLayer->setGLDescription(gLayerDescription); list_.push_back(newLayer); } else return EC_MemoryExhausted; return EC_Normal; } DVPSGraphicLayer *DVPSGraphicLayer_PList::getGraphicLayer(size_t idx) { OFListIterator(DVPSGraphicLayer *) first = list_.begin(); OFListIterator(DVPSGraphicLayer *) last = list_.end(); while (first != last) { if ((idx--) == 0) return *first; ++first; } return NULL; } OFCondition DVPSGraphicLayer_PList::addGraphicLayer( const char *gLayer, const char *gLayerDescription) { sortGraphicLayers(1); Sint32 layerOrder = size()+1; return addGraphicLayer(gLayer, layerOrder, gLayerDescription); } void DVPSGraphicLayer_PList::sortGraphicLayers(Sint32 lowestLayer) { /* this sorting routine is a simple straight selection. * since we won't have many graphic layers, this should be sufficient. */ OFList tempList; tempList.splice(tempList.end(),list_); // move all entries to tempList OFListIterator(DVPSGraphicLayer *) current; OFListIterator(DVPSGraphicLayer *) first; OFListIterator(DVPSGraphicLayer *) last; Sint32 currentSize; while (tempList.size() > 0) { current = tempList.begin(); currentSize = (*current)->getGLOrder(); first = tempList.begin(); last = tempList.end(); while (first != last) { if ((*first)->getGLOrder() < currentSize) { current = first; currentSize = (*first)->getGLOrder(); } ++first; } list_.push_back(*current); tempList.erase(current); } /* now renumber layer orders */ first = list_.begin(); last = list_.end(); while (first != last) (*first++)->setGLOrder(lowestLayer++); return; } const char *DVPSGraphicLayer_PList::getGraphicLayerName(size_t idx) { DVPSGraphicLayer *layer = getGraphicLayer(idx); if (layer) return layer->getGL(); else return NULL; } size_t DVPSGraphicLayer_PList::getGraphicLayerIndex(const char *name) { if (name==NULL) return DVPS_IDX_NONE; size_t idx =0; OFString aString(name); OFListIterator(DVPSGraphicLayer *) first = list_.begin(); OFListIterator(DVPSGraphicLayer *) last = list_.end(); while (first != last) { if (aString == (*first)->getGL()) return idx; idx++; ++first; } return DVPS_IDX_NONE; } const char *DVPSGraphicLayer_PList::getGraphicLayerDescription(size_t idx) { DVPSGraphicLayer *layer = getGraphicLayer(idx); if (layer) return layer->getGLDescription(); else return NULL; } OFBool DVPSGraphicLayer_PList::haveGraphicLayerRecommendedDisplayValue(size_t idx) { DVPSGraphicLayer *layer = getGraphicLayer(idx); if (layer) return layer->haveGLRecommendedDisplayValue(); else return OFFalse; } OFCondition DVPSGraphicLayer_PList::getGraphicLayerRecommendedDisplayValueGray(size_t idx, Uint16& gray) { DVPSGraphicLayer *layer = getGraphicLayer(idx); if (layer) return layer->getGLRecommendedDisplayValueGray(gray); else return EC_IllegalCall; } OFCondition DVPSGraphicLayer_PList::getGraphicLayerRecommendedDisplayValueRGB(size_t idx, Uint16& r, Uint16& g, Uint16& b) { DVPSGraphicLayer *layer = getGraphicLayer(idx); if (layer) return layer->getGLRecommendedDisplayValueRGB(r, g, b); else return EC_IllegalCall; } OFCondition DVPSGraphicLayer_PList::setGraphicLayerRecommendedDisplayValueGray(size_t idx, Uint16 gray) { DVPSGraphicLayer *layer = getGraphicLayer(idx); if (layer) { layer->setGLRecommendedDisplayValueGray(gray); return EC_Normal; } else return EC_IllegalCall; } OFCondition DVPSGraphicLayer_PList::setGraphicLayerRecommendedDisplayValueRGB(size_t idx, Uint16 r, Uint16 g, Uint16 b) { DVPSGraphicLayer *layer = getGraphicLayer(idx); if (layer) { layer->setGLRecommendedDisplayValueRGB(r, g, b); return EC_Normal; } else return EC_IllegalCall; } void DVPSGraphicLayer_PList::removeGraphicLayerRecommendedDisplayValue(size_t idx, OFBool rgb, OFBool monochrome) { DVPSGraphicLayer *layer = getGraphicLayer(idx); if (layer) layer->removeRecommendedDisplayValue(rgb, monochrome); return; } OFCondition DVPSGraphicLayer_PList::setGraphicLayerName(size_t idx, const char *name) { if (name==NULL) return EC_IllegalCall; OFString aString(name); /* check that no graphic layer with the same name exist */ OFListIterator(DVPSGraphicLayer *) first = list_.begin(); OFListIterator(DVPSGraphicLayer *) last = list_.end(); while (first != last) { if (aString == (*first)->getGL()) return EC_IllegalCall; ++first; } DVPSGraphicLayer *layer = getGraphicLayer(idx); if (layer) { layer->setGL(name); return EC_Normal; } return EC_IllegalCall; } OFCondition DVPSGraphicLayer_PList::setGraphicLayerDescription(size_t idx, const char *descr) { DVPSGraphicLayer *layer = getGraphicLayer(idx); if (layer) { layer->setGLDescription(descr); return EC_Normal; } return EC_IllegalCall; } OFCondition DVPSGraphicLayer_PList::toFrontGraphicLayer(size_t idx) { OFListIterator(DVPSGraphicLayer *) first = list_.begin(); OFListIterator(DVPSGraphicLayer *) last = list_.end(); OFBool found = OFFalse; while ((!found) && (first != last)) { if ((idx--) == 0) found=OFTrue; else ++first; } if (found) { DVPSGraphicLayer *layer = *first; list_.erase(first); sortGraphicLayers(1); Sint32 layerOrder = size()+1; layer->setGLOrder(layerOrder); list_.push_back(layer); } else return EC_IllegalCall; return EC_Normal; } OFCondition DVPSGraphicLayer_PList::toBackGraphicLayer(size_t idx) { OFListIterator(DVPSGraphicLayer *) first = list_.begin(); OFListIterator(DVPSGraphicLayer *) last = list_.end(); OFBool found = OFFalse; while ((!found) && (first != last)) { if ((idx--) == 0) found=OFTrue; else ++first; } if (found) { DVPSGraphicLayer *layer = *first; list_.erase(first); sortGraphicLayers(2); layer->setGLOrder(1); list_.push_front(layer); } else return EC_IllegalCall; return EC_Normal; } OFCondition DVPSGraphicLayer_PList::exchangeGraphicLayers(size_t idx1, size_t idx2) { if (idx1 == idx2) return EC_Normal; DVPSGraphicLayer *layer1 = getGraphicLayer(idx1); DVPSGraphicLayer *layer2 = getGraphicLayer(idx2); if ((layer1==NULL)||(layer2==NULL)) return EC_IllegalCall; Sint32 order1 = layer1->getGLOrder(); Sint32 order2 = layer2->getGLOrder(); if (order1 != order2) { layer1->setGLOrder(order2); layer2->setGLOrder(order1); } return EC_Normal; } OFCondition DVPSGraphicLayer_PList::removeGraphicLayer(size_t idx) { OFListIterator(DVPSGraphicLayer *) first = list_.begin(); OFListIterator(DVPSGraphicLayer *) last = list_.end(); OFBool found = OFFalse; while ((!found) && (first != last)) { if ((idx--) == 0) found=OFTrue; else ++first; } if (found) { delete *first; list_.erase(first); } else return EC_IllegalCall; return EC_Normal; } void DVPSGraphicLayer_PList::cleanupLayers( DVPSOverlayCurveActivationLayer_PList& activations, DVPSGraphicAnnotation_PList& annotations) { OFListIterator(DVPSGraphicLayer *) first = list_.begin(); OFListIterator(DVPSGraphicLayer *) last = list_.end(); const char *name=NULL; while (first != last) { name = (*first)->getGL(); if ((! activations.usesLayerName(name))&&(! annotations.usesLayerName(name))) { delete (*first); first = list_.erase(first); } else ++first; } return; } /* * $Log: dvpsgll.cc,v $ * Revision 1.19 2010-10-14 13:14:32 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.18 2009-11-24 14:12:58 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.17 2005-12-08 15:46:29 meichel * Changed include path schema for all DCMTK header files * * Revision 1.16 2004/02/04 15:57:49 joergr * Removed acknowledgements with e-mail addresses from CVS log. * * Revision 1.15 2003/09/05 08:37:46 meichel * Fixed minor issue that caused certain error messages during the * parse process on a GSPS object to be "swallowed". * * Revision 1.14 2003/06/12 18:23:11 joergr * Modified code to use const_iterators where appropriate (required for STL). * * Revision 1.13 2003/06/04 12:30:28 meichel * Added various includes needed by MSVC5 with STL * * Revision 1.12 2003/06/04 10:18:07 meichel * Replaced private inheritance from template with aggregation * * Revision 1.11 2001/11/28 13:56:54 joergr * Check return value of DcmItem::insert() statements where appropriate to * avoid memory leaks when insert procedure fails. * * Revision 1.10 2001/09/26 15:36:26 meichel * Adapted dcmpstat to class OFCondition * * Revision 1.9 2001/06/01 15:50:31 meichel * Updated copyright header * * Revision 1.8 2000/06/02 16:01:01 meichel * Adapted all dcmpstat classes to use OFConsole for log and error output * * Revision 1.7 2000/05/31 13:02:37 meichel * Moved dcmpstat macros and constants into a common header file * * Revision 1.6 2000/03/08 16:29:05 meichel * Updated copyright header. * * Revision 1.5 1999/07/22 16:39:59 meichel * Adapted dcmpstat data structures and API to supplement 33 letter ballot text. * * Revision 1.4 1999/04/30 16:40:50 meichel * Minor code purifications to keep Sun CC 2.0.1 quiet * * Revision 1.3 1999/02/09 15:59:07 meichel * Implemented bitmap shutter activation amd method for * exchanging graphic layers. * * Revision 1.2 1998/12/14 16:10:42 meichel * Implemented Presentation State interface for graphic layers, * text and graphic annotations, presentation LUTs. * * Revision 1.1 1998/11/27 14:50:42 meichel * Initial Release. * * */ dcmtk-3.6.0/dcmpstat/libsrc/dvpsibl.cc0000644000310500011400000005070511455601070017114 0ustar joergrdicom3/* * * Copyright (C) 1999-2010, 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: DVPSImageBoxContent_PList * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:14:32 $ * CVS/RCS Revision: $Revision: 1.31 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmpstat/dvpsibl.h" #include "dcmtk/dcmpstat/dvpsib.h" /* for DVPSImageBoxContent */ #include "dcmtk/dcmpstat/dvpshlp.h" /* for class DVPSHelper */ /* --------------- class DVPSImageBoxContent_PList --------------- */ DVPSImageBoxContent_PList::DVPSImageBoxContent_PList() : list_() { } DVPSImageBoxContent_PList::DVPSImageBoxContent_PList(const DVPSImageBoxContent_PList &arg) : list_() { OFListConstIterator(DVPSImageBoxContent *) first = arg.list_.begin(); OFListConstIterator(DVPSImageBoxContent *) last = arg.list_.end(); while (first != last) { list_.push_back((*first)->clone()); ++first; } } DVPSImageBoxContent_PList::~DVPSImageBoxContent_PList() { clear(); } void DVPSImageBoxContent_PList::clear() { OFListIterator(DVPSImageBoxContent *) first = list_.begin(); OFListIterator(DVPSImageBoxContent *) last = list_.end(); while (first != last) { delete (*first); first = list_.erase(first); } } OFCondition DVPSImageBoxContent_PList::read(DcmItem &dset, DVPSPresentationLUT_PList& presentationLUTList) { OFCondition result = EC_Normal; DcmStack stack; DVPSImageBoxContent *newImage = NULL; DcmSequenceOfItems *dseq=NULL; DcmItem *ditem=NULL; if (EC_Normal == dset.search(DCM_RETIRED_ImageBoxContentSequence, stack, ESM_fromHere, OFFalse)) { dseq=(DcmSequenceOfItems *)stack.top(); if (dseq) { unsigned long numItems = dseq->card(); for (unsigned int i=0; igetItem(i); newImage = new DVPSImageBoxContent(); if (newImage && ditem) { result = newImage->read(*ditem, presentationLUTList); list_.push_back(newImage); } else result = EC_MemoryExhausted; } } } return result; } OFCondition DVPSImageBoxContent_PList::write( DcmItem &dset, OFBool writeRequestedImageSize, size_t numItems, OFBool ignoreEmptyImages, OFBool writeReferencedPLUTSQ) { if (size()==0) return EC_IllegalCall; // can't write if sequence is empty OFCondition result = EC_Normal; DcmSequenceOfItems *dseq=NULL; DcmItem *ditem=NULL; OFBool working = OFTrue; unsigned long numWritten = 0; dseq = new DcmSequenceOfItems(DCM_RETIRED_ImageBoxContentSequence); if (dseq) { OFListIterator(DVPSImageBoxContent *) first = list_.begin(); OFListIterator(DVPSImageBoxContent *) last = list_.end(); while ((first != last) && working) { if ((result==EC_Normal) && ((! ignoreEmptyImages)||((*first)->getImageBoxPosition() > 0))) { ditem = new DcmItem(); if (ditem) { result = (*first)->write(*ditem, writeRequestedImageSize, writeReferencedPLUTSQ); if (result==EC_Normal) { dseq->insert(ditem); numWritten++; } else delete ditem; } else result = EC_MemoryExhausted; } ++first; if (numItems && (--numItems==0)) working=OFFalse; } // we're not allowed to store SP objects with empty image box list sequence if ((result==EC_Normal) && (numWritten > 0)) dset.insert(dseq, OFTrue /*replaceOld*/); else delete dseq; } else result = EC_MemoryExhausted; return result; } OFCondition DVPSImageBoxContent_PList::createDefaultValues(OFBool renumber, OFBool ignoreEmptyImages) { if (size()==0) return EC_IllegalCall; // can't write if sequence is empty OFCondition result = EC_Normal; unsigned long counter = 1; OFListIterator(DVPSImageBoxContent *) first = list_.begin(); OFListIterator(DVPSImageBoxContent *) last = list_.end(); while ((first != last)&&(EC_Normal == result)) { result = (*first)->createDefaultValues(renumber, counter++, ignoreEmptyImages); ++first; } return result; } OFCondition DVPSImageBoxContent_PList::addImageSOPClasses(DcmSequenceOfItems& seq, size_t numItems) { OFCondition result = EC_Normal; OFBool working = OFTrue; const char *c = NULL; OFListIterator(DVPSImageBoxContent *) first = list_.begin(); OFListIterator(DVPSImageBoxContent *) last = list_.end(); while ((first != last) && working) { if (EC_Normal == result) { c = (*first)->getSOPClassUID(); if (c && (! DVPSHelper::haveReferencedUIDItem(seq, c))) result = DVPSHelper::addReferencedUIDItem(seq, c); } ++first; if (numItems && (--numItems==0)) working=OFFalse; } return result; } OFCondition DVPSImageBoxContent_PList::addImageBox( const char *instanceuid, const char *retrieveaetitle, const char *refstudyuid, const char *refseriesuid, const char *refsopclassuid, const char *refsopinstanceuid, const char *requestedimagesize, const char *patientid, const char *presentationlutuid) { OFCondition result = EC_Normal; DVPSImageBoxContent *newImage = new DVPSImageBoxContent(); if (newImage) { result = newImage->setContent(instanceuid, retrieveaetitle, refstudyuid, refseriesuid, refsopclassuid, refsopinstanceuid, requestedimagesize, patientid, presentationlutuid); if (EC_Normal == result) list_.push_back(newImage); else delete newImage; } else result = EC_MemoryExhausted; return result; } OFCondition DVPSImageBoxContent_PList::addImageBox(DVPSImageBoxContent * box) { list_.push_back(box); return(EC_Normal); } OFCondition DVPSImageBoxContent_PList::setRequestedDecimateCropBehaviour(DVPSDecimateCropBehaviour value) { OFCondition result=EC_Normal; OFListIterator(DVPSImageBoxContent *) first = list_.begin(); OFListIterator(DVPSImageBoxContent *) last = list_.end(); while (first != last) { result = (*first)->setRequestedDecimateCropBehaviour(value); if (EC_Normal != result) return result; ++first; } return result; } OFCondition DVPSImageBoxContent_PList::deleteImage(size_t idx) { OFListIterator(DVPSImageBoxContent *) first = list_.begin(); OFListIterator(DVPSImageBoxContent *) last = list_.end(); while ((first != last)&&(idx--)) ++first; if (first != last) { delete (*first); list_.erase(first); return EC_Normal; } return EC_IllegalCall; } OFCondition DVPSImageBoxContent_PList::deleteMultipleImages(size_t number) { OFListIterator(DVPSImageBoxContent *) first = list_.begin(); OFListIterator(DVPSImageBoxContent *) last = list_.end(); while ((first != last)&&(number--)) { delete (*first); first = list_.erase(first); } return EC_Normal; } DVPSImageBoxContent *DVPSImageBoxContent_PList::getImageBox(size_t idx) { OFListIterator(DVPSImageBoxContent *) first = list_.begin(); OFListIterator(DVPSImageBoxContent *) last = list_.end(); while (first != last) { if (idx==0) return *first; idx--; ++first; } return NULL; } OFBool DVPSImageBoxContent_PList::imageHasAdditionalSettings(size_t idx) { DVPSImageBoxContent *box = getImageBox(idx); if (box) return box->hasAdditionalSettings(); return OFFalse; } OFCondition DVPSImageBoxContent_PList::setImagePolarity(size_t idx, const char *value) { DVPSImageBoxContent *box = getImageBox(idx); if (box) return box->setPolarity(value); return EC_IllegalCall; } OFCondition DVPSImageBoxContent_PList::setImageRequestedSize(size_t idx, const char *value) { DVPSImageBoxContent *box = getImageBox(idx); if (box) return box->setRequestedImageSize(value); return EC_IllegalCall; } OFCondition DVPSImageBoxContent_PList::setImageMagnificationType(size_t idx, const char *value) { DVPSImageBoxContent *box = getImageBox(idx); if (box) return box->setMagnificationType(value); return EC_IllegalCall; } OFCondition DVPSImageBoxContent_PList::setImageSmoothingType(size_t idx, const char *value) { DVPSImageBoxContent *box = getImageBox(idx); if (box) return box->setSmoothingType(value); return EC_IllegalCall; } OFCondition DVPSImageBoxContent_PList::setImageConfigurationInformation(size_t idx, const char *value) { DVPSImageBoxContent *box = getImageBox(idx); if (box) return box->setConfigurationInformation(value); return EC_IllegalCall; } OFCondition DVPSImageBoxContent_PList::setImageSOPInstanceUID(size_t idx, const char *value) { DVPSImageBoxContent *box = getImageBox(idx); if (box) return box->setSOPInstanceUID(value); return EC_IllegalCall; } const char *DVPSImageBoxContent_PList::getImagePolarity(size_t idx) { DVPSImageBoxContent *box = getImageBox(idx); if (box) return box->getPolarity(); return NULL; } const char *DVPSImageBoxContent_PList::getImageRequestedSize(size_t idx) { DVPSImageBoxContent *box = getImageBox(idx); if (box) return box->getRequestedImageSize(); return NULL; } const char *DVPSImageBoxContent_PList::getImageMagnificationType(size_t idx) { DVPSImageBoxContent *box = getImageBox(idx); if (box) return box->getMagnificationType(); return NULL; } const char *DVPSImageBoxContent_PList::getImageSmoothingType(size_t idx) { DVPSImageBoxContent *box = getImageBox(idx); if (box) return box->getSmoothingType(); return NULL; } const char *DVPSImageBoxContent_PList::getImageConfigurationInformation(size_t idx) { DVPSImageBoxContent *box = getImageBox(idx); if (box) return box->getConfigurationInformation(); return NULL; } const char *DVPSImageBoxContent_PList::getSOPInstanceUID(size_t idx) { DVPSImageBoxContent *box = getImageBox(idx); if (box) return box->getSOPInstanceUID(); return NULL; } const char *DVPSImageBoxContent_PList::getReferencedPresentationLUTInstanceUID(size_t idx) { DVPSImageBoxContent *box = getImageBox(idx); if (box) return box->getReferencedPresentationLUTInstanceUID(); return NULL; } OFCondition DVPSImageBoxContent_PList::setAllImagesToDefault() { OFCondition result = EC_Normal; OFListIterator(DVPSImageBoxContent *) first = list_.begin(); OFListIterator(DVPSImageBoxContent *) last = list_.end(); while (first != last) { result = (*first)->setDefault(); ++first; if (EC_Normal != result) return result; } return result; } OFCondition DVPSImageBoxContent_PList::getImageReference(size_t idx, const char *&studyUID, const char *&seriesUID, const char *&instanceUID) { DVPSImageBoxContent *box = getImageBox(idx); if (box) return box->getImageReference(studyUID, seriesUID, instanceUID); return EC_IllegalCall; } OFCondition DVPSImageBoxContent_PList::prepareBasicImageBox(size_t idx, DcmItem &dset) { DVPSImageBoxContent *box = getImageBox(idx); if (box) return box->prepareBasicImageBox(dset); return EC_IllegalCall; } OFBool DVPSImageBoxContent_PList::presentationLUTInstanceUIDisUsed(const char *uid) { OFString uidS; if (uid) uidS = uid; const char *c; OFListIterator(DVPSImageBoxContent *) first = list_.begin(); OFListIterator(DVPSImageBoxContent *) last = list_.end(); while (first != last) { c = (*first)->getReferencedPresentationLUTInstanceUID(); if (c && (uidS == c)) return OFTrue; ++first; } return OFFalse; } const char *DVPSImageBoxContent_PList::haveSinglePresentationLUTUsed(const char *filmBox) { OFList uidList; if (filmBox==NULL) filmBox = ""; const char *c; OFString aString; OFBool found; OFListIterator(char *) uidfirst; OFListIterator(char *) uidlast; OFListIterator(DVPSImageBoxContent *) first = list_.begin(); OFListIterator(DVPSImageBoxContent *) last = list_.end(); while (first != last) { c = (*first)->getReferencedPresentationLUTInstanceUID(); if ((c == NULL)||(strlen(c)==0)) c = filmBox; aString = c; // aString now contains the UID of the P-LUT to be used for this image, if any. uidfirst = uidList.begin(); uidlast = uidList.end(); found = OFFalse; while (uidfirst != uidlast) { if (aString == (*uidfirst)) { found = OFTrue; break; } ++uidfirst; } if (!found) uidList.push_back((char *)c); ++first; } if (uidList.size()==1) return *(uidList.begin()); // if there is only one LUT, return it return NULL; } OFBool DVPSImageBoxContent_PList::printSCPCreate( unsigned long numBoxes, DcmUniqueIdentifier& studyUID, DcmUniqueIdentifier& seriesUID, const char *aetitle) { clear(); DVPSImageBoxContent *box = NULL; char uid[100]; for (unsigned long i=0; isetSOPInstanceUID(dcmGenerateUniqueIdentifier(uid))) && (EC_Normal == box->setUIDsAndAETitle(studyUID, seriesUID, aetitle))) { list_.push_back(box); } else { delete box; return OFFalse; } } else return OFFalse; } return OFTrue; } OFCondition DVPSImageBoxContent_PList::writeReferencedImageBoxSQ(DcmItem &dset) { if (size()==0) return EC_IllegalCall; // can't write if sequence is empty OFCondition result = EC_Normal; DcmSequenceOfItems *dseq=NULL; DcmItem *ditem=NULL; DcmUniqueIdentifier *uid=NULL; const char *instanceUID=NULL; dseq = new DcmSequenceOfItems(DCM_ReferencedImageBoxSequence); if (dseq) { OFListIterator(DVPSImageBoxContent *) first = list_.begin(); OFListIterator(DVPSImageBoxContent *) last = list_.end(); while (first != last) { if (result==EC_Normal) { ditem = new DcmItem(); if (ditem) { uid = new DcmUniqueIdentifier(DCM_ReferencedSOPClassUID); if (uid) result = uid->putString(UID_BasicGrayscaleImageBoxSOPClass); else result = EC_MemoryExhausted; if (EC_Normal == result) result = ditem->insert(uid, OFTrue /*replaceOld*/); else delete uid; uid = new DcmUniqueIdentifier(DCM_ReferencedSOPInstanceUID); instanceUID = (*first)->getSOPInstanceUID(); if (uid && instanceUID) result = uid->putString(instanceUID); else result = EC_MemoryExhausted; if (EC_Normal == result) result = ditem->insert(uid, OFTrue /*replaceOld*/); else delete uid; if (result==EC_Normal) dseq->insert(ditem); else delete ditem; } else result = EC_MemoryExhausted; } ++first; } if (result==EC_Normal) dset.insert(dseq, OFTrue /*replaceOld*/); else delete dseq; } else result = EC_MemoryExhausted; return result; } OFBool DVPSImageBoxContent_PList::matchesPresentationLUT(DVPSPrintPresentationLUTAlignment align) const { OFBool result = OFTrue; OFListConstIterator(DVPSImageBoxContent *) first = list_.begin(); OFListConstIterator(DVPSImageBoxContent *) last = list_.end(); while (first != last) { result = result && (*first)->matchesPresentationLUT(align); ++first; } return result; } DVPSImageBoxContent *DVPSImageBoxContent_PList::duplicateImageBox(const char *uid) { if (uid == NULL) return NULL; OFString aString(uid); OFListIterator(DVPSImageBoxContent *) first = list_.begin(); OFListIterator(DVPSImageBoxContent *) last = list_.end(); while (first != last) { if (aString == (*first)->getSOPInstanceUID()) return (*first)->clone(); ++first; } return NULL; } OFBool DVPSImageBoxContent_PList::haveImagePositionClash(const char *uid, Uint16 position) { if (uid == NULL) return OFFalse; OFString aString(uid); OFListIterator(DVPSImageBoxContent *) first = list_.begin(); OFListIterator(DVPSImageBoxContent *) last = list_.end(); while (first != last) { if (((*first)->getImageBoxPosition() == position)&&(aString != (*first)->getSOPInstanceUID())) return OFTrue; //clash ++first; } return OFFalse; } void DVPSImageBoxContent_PList::replace(DVPSImageBoxContent *newImageBox) { if (! newImageBox) return; OFString aString(newImageBox->getSOPInstanceUID()); OFListIterator(DVPSImageBoxContent *) first = list_.begin(); OFListIterator(DVPSImageBoxContent *) last = list_.end(); while (first != last) { if (aString == (*first)->getSOPInstanceUID()) { delete (*first); first = list_.erase(first); } else ++first; } list_.push_back(newImageBox); } OFBool DVPSImageBoxContent_PList::emptyPageWarning() { OFListIterator(DVPSImageBoxContent *) first = list_.begin(); OFListIterator(DVPSImageBoxContent *) last = list_.end(); while (first != last) { if ((*first)->getImageBoxPosition() > 0) return OFFalse; ++first; } return OFTrue; } /* * $Log: dvpsibl.cc,v $ * Revision 1.31 2010-10-14 13:14:32 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.30 2009-11-24 14:12:58 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.29 2008-04-30 12:38:43 meichel * Fixed compile errors due to changes in attribute tag names * * Revision 1.28 2005/12/08 15:46:34 meichel * Changed include path schema for all DCMTK header files * * Revision 1.27 2004/02/04 15:57:49 joergr * Removed acknowledgements with e-mail addresses from CVS log. * * Revision 1.26 2003/06/12 18:23:11 joergr * Modified code to use const_iterators where appropriate (required for STL). * * Revision 1.25 2003/06/04 10:18:07 meichel * Replaced private inheritance from template with aggregation * * Revision 1.24 2002/01/08 10:35:45 joergr * Corrected spelling of function dcmGenerateUniqueIdentifier(). * * Revision 1.23 2001/11/28 13:56:57 joergr * Check return value of DcmItem::insert() statements where appropriate to * avoid memory leaks when insert procedure fails. * * Revision 1.22 2001/09/26 15:36:28 meichel * Adapted dcmpstat to class OFCondition * * Revision 1.21 2001/06/01 15:50:33 meichel * Updated copyright header * * Revision 1.20 2000/07/04 16:06:47 joergr * Added support for overriding the presentation LUT settings made for the * image boxes. * * Revision 1.19 2000/06/14 11:29:00 joergr * Added methods to access the attributes Polarity and Requested Image Size. * * Revision 1.18 2000/06/08 10:44:35 meichel * Implemented Referenced Presentation LUT Sequence on Basic Film Session level. * Empty film boxes (pages) are not written to file anymore. * * Revision 1.17 2000/06/07 14:26:46 joergr * Added methods to access the image polarity attribute. * * Revision 1.16 2000/06/02 16:01:02 meichel * Adapted all dcmpstat classes to use OFConsole for log and error output * * Revision 1.15 2000/05/31 12:58:15 meichel * Added initial Print SCP support * * Revision 1.14 2000/03/08 16:29:07 meichel * Updated copyright header. * * Revision 1.13 2000/03/07 16:23:37 joergr * Removed type specifier 'const' to make Sun CC 2.0.1 happy. * * Revision 1.12 2000/03/06 15:53:24 meichel * Fixed unassigned variable usage problem * * Revision 1.11 2000/03/03 14:14:00 meichel * Implemented library support for redirecting error messages into memory * instead of printing them to stdout/stderr for GUI applications. * * Revision 1.10 1999/10/07 17:21:59 meichel * Reworked management of Presentation LUTs in order to create tighter * coupling between Softcopy and Print. * * Revision 1.9 1999/09/24 15:24:07 meichel * Print spooler (dcmprtsv) now logs diagnostic messages in log files * when operating in spool mode. * * Revision 1.8 1999/09/17 14:33:52 meichel * Completed print spool functionality including Supplement 22 support * * Revision 1.7 1999/09/15 17:43:34 meichel * Implemented print job dispatcher code for dcmpstat, adapted dcmprtsv * and dcmpsprt applications. * * Revision 1.6 1999/09/10 12:46:56 meichel * Added implementations for a number of print API methods. * * Revision 1.5 1999/09/01 16:15:08 meichel * Added support for requested image size to print routines * * Revision 1.4 1999/08/31 14:09:27 meichel * Added get/set methods for stored print attributes * * Revision 1.3 1999/08/27 15:57:49 meichel * Added methods for saving hardcopy images and stored print objects * either in file or in the local database. * * Revision 1.2 1999/08/26 09:29:48 thiel * Extensions for the usage of the StoredPrint * * Revision 1.1 1999/07/30 13:34:57 meichel * Added new classes managing Stored Print objects * * */ dcmtk-3.6.0/dcmpstat/libsrc/dvpssp.cc0000644000310500011400000035504611455601071016777 0ustar joergrdicom3/* * * Copyright (C) 1998-2010, 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: DVPSStoredPrint * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:14:33 $ * CVS/RCS Revision: $Revision: 1.59 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmpstat/dvpssp.h" #include "dcmtk/dcmpstat/dvpsdef.h" /* for constants and macros */ #include "dcmtk/ofstd/ofstring.h" #include "dcmtk/dcmdata/dcuid.h" #include "dcmtk/dcmpstat/dvpsib.h" #include "dcmtk/dcmpstat/dvpshlp.h" #include "dcmtk/dcmimgle/dcmimage.h" #include "dcmtk/dcmimgle/digsdfn.h" #include "dcmtk/dcmpstat/dvpscf.h" #include "dcmtk/dcmpstat/dvpsov.h" /* for DVPSOverlay, needed by MSVC5 with STL */ #include "dcmtk/dcmpstat/dvpsgl.h" /* for DVPSGraphicLayer, needed by MSVC5 with STL */ #include "dcmtk/dcmpstat/dvpsrs.h" /* for DVPSReferencedSeries, needed by MSVC5 with STL */ #include "dcmtk/dcmpstat/dvpsal.h" /* for DVPSOverlayCurveActivationLayer, needed by MSVC5 with STL */ #include "dcmtk/dcmpstat/dvpsga.h" /* for DVPSGraphicAnnotation, needed by MSVC5 with STL */ #include "dcmtk/dcmpstat/dvpscu.h" /* for DVPSCurve, needed by MSVC5 with STL */ #include "dcmtk/dcmpstat/dvpsvl.h" /* for DVPSVOILUT, needed by MSVC5 with STL */ #include "dcmtk/dcmpstat/dvpsvw.h" /* for DVPSVOIWindow, needed by MSVC5 with STL */ #include "dcmtk/dcmpstat/dvpsda.h" /* for DVPSDisplayedArea, needed by MSVC5 with STL */ #include "dcmtk/dcmpstat/dvpssv.h" /* for DVPSSoftcopyVOI, needed by MSVC5 with STL */ #include "dcmtk/dcmpstat/dvpsab.h" /* for DVPSAnnotationContent, needed by MSVC5 with STL */ #include "dcmtk/dcmpstat/dvpstx.h" /* for DVPSTextObject, needed by MSVC5 with STL */ #include "dcmtk/dcmpstat/dvpsgr.h" /* for DVPSGraphicObject, needed by MSVC5 with STL */ #include "dcmtk/dcmpstat/dvpsri.h" /* for DVPSReferencedImage, needed by MSVC5 with STL */ #define INCLUDE_CMATH #define INCLUDE_CTIME #include "dcmtk/ofstd/ofstdinc.h" /* --------------- class DVPSStoredPrint --------------- */ DVPSStoredPrint::DVPSStoredPrint(Uint16 illumin, Uint16 reflection, const char *aetitle) : patientName(DCM_PatientName) , patientID(DCM_PatientID) , patientBirthDate(DCM_PatientBirthDate) , patientSex(DCM_PatientSex) , studyInstanceUID(DCM_StudyInstanceUID) , studyDate(DCM_StudyDate) , studyTime(DCM_StudyTime) , referringPhysicianName(DCM_ReferringPhysicianName) , studyID(DCM_StudyID) , accessionNumber(DCM_AccessionNumber) , seriesInstanceUID(DCM_SeriesInstanceUID) , seriesNumber(DCM_SeriesNumber) , manufacturer(DCM_Manufacturer) , originator(DCM_Originator) , destination(DCM_RETIRED_DestinationAE) , printerName(DCM_PrinterName) , instanceNumber(DCM_InstanceNumber) , imageDisplayFormat(DCM_ImageDisplayFormat) , annotationDisplayFormatID(DCM_AnnotationDisplayFormatID) , filmOrientation(DCM_FilmOrientation) , filmSizeID(DCM_FilmSizeID) , magnificationType(DCM_MagnificationType) , smoothingType(DCM_SmoothingType) , borderDensity(DCM_BorderDensity) , emptyImageDensity(DCM_EmptyImageDensity) , minDensity(DCM_MinDensity) , maxDensity(DCM_MaxDensity) , trim(DCM_Trim) , configurationInformation(DCM_ConfigurationInformation) , illumination(DCM_Illumination) , reflectedAmbientLight(DCM_ReflectedAmbientLight) , requestedResolutionID(DCM_RequestedResolutionID) , referencedPresentationLUTInstanceUID(DCM_ReferencedSOPInstanceUID) , referencedPresentationLUTAlignment(DVPSK_other) , imageBoxContentList() , annotationContentList() , presentationLUTList() , sOPInstanceUID(DCM_SOPInstanceUID) , specificCharacterSet(DCM_SpecificCharacterSet) , instanceCreationDate(DCM_InstanceCreationDate) , instanceCreationTime(DCM_InstanceCreationTime) , imageSeriesInstanceUID(DCM_SeriesInstanceUID) , currentValuesValid(OFFalse) , currentNumCols(0) , currentNumRows(0) , decimateCropBehaviour(DVPSI_default) , filmSessionInstanceUID() , filmBoxInstanceUID() , presentationLUTInstanceUID() , globalPresentationLUT() , globalPresentationLUTValid(OFFalse) , transmitImagesIn12Bit(OFTrue) , renderPresentationLUTinSCP(OFFalse) , tempDensity() { illumination.putUint16(illumin, 0); reflectedAmbientLight.putUint16(reflection, 0); if (aetitle != NULL) originator.putString(aetitle); } DVPSStoredPrint::DVPSStoredPrint(const DVPSStoredPrint& copy) : patientName(copy.patientName) , patientID(copy.patientID) , patientBirthDate(copy.patientBirthDate) , patientSex(copy.patientSex) , studyInstanceUID(copy.studyInstanceUID) , studyDate(copy.studyDate) , studyTime(copy.studyTime) , referringPhysicianName(copy.referringPhysicianName) , studyID(copy.studyID) , accessionNumber(copy.accessionNumber) , seriesInstanceUID(copy.seriesInstanceUID) , seriesNumber(copy.seriesNumber) , manufacturer(copy.manufacturer) , originator(copy.originator) , destination(copy.destination) , printerName(copy.printerName) , instanceNumber(copy.instanceNumber) , imageDisplayFormat(copy.imageDisplayFormat) , annotationDisplayFormatID(copy.annotationDisplayFormatID) , filmOrientation(copy.filmOrientation) , filmSizeID(copy.filmSizeID) , magnificationType(copy.magnificationType) , smoothingType(copy.smoothingType) , borderDensity(copy.borderDensity) , emptyImageDensity(copy.emptyImageDensity) , minDensity(copy.minDensity) , maxDensity(copy.maxDensity) , trim(copy.trim) , configurationInformation(copy.configurationInformation) , illumination(copy.illumination) , reflectedAmbientLight(copy.reflectedAmbientLight) , requestedResolutionID(copy.requestedResolutionID) , referencedPresentationLUTInstanceUID(copy.referencedPresentationLUTInstanceUID) , referencedPresentationLUTAlignment(copy.referencedPresentationLUTAlignment) , imageBoxContentList(copy.imageBoxContentList) , annotationContentList(copy.annotationContentList) , presentationLUTList(copy.presentationLUTList) , sOPInstanceUID(copy.sOPInstanceUID) , specificCharacterSet(copy.specificCharacterSet) , instanceCreationDate(copy.instanceCreationDate) , instanceCreationTime(copy.instanceCreationTime) , imageSeriesInstanceUID(copy.imageSeriesInstanceUID) , currentValuesValid(copy.currentValuesValid) , currentNumCols(copy.currentNumCols) , currentNumRows(copy.currentNumRows) , decimateCropBehaviour(copy.decimateCropBehaviour) , filmSessionInstanceUID(copy.filmSessionInstanceUID) , filmBoxInstanceUID(copy.filmBoxInstanceUID) , presentationLUTInstanceUID(copy.presentationLUTInstanceUID) , globalPresentationLUT(copy.globalPresentationLUT) , globalPresentationLUTValid(copy.globalPresentationLUTValid) , transmitImagesIn12Bit(copy.transmitImagesIn12Bit) , renderPresentationLUTinSCP(copy.renderPresentationLUTinSCP) , tempDensity(copy.tempDensity) { } DVPSStoredPrint::~DVPSStoredPrint() { } void DVPSStoredPrint::clear() { patientName.clear(); patientID.clear(); patientBirthDate.clear(); patientSex.clear(); studyInstanceUID.clear(); studyDate.clear(); studyTime.clear(); referringPhysicianName.clear(); studyID.clear(); accessionNumber.clear(); seriesInstanceUID.clear(); seriesNumber.clear(); manufacturer.clear(); originator.clear(); destination.clear(); printerName.clear(); instanceNumber.clear(); imageDisplayFormat.clear(); annotationDisplayFormatID.clear(); filmOrientation.clear(); filmSizeID.clear(); magnificationType.clear(); smoothingType.clear(); borderDensity.clear(); emptyImageDensity.clear(); minDensity.clear(); maxDensity.clear(); trim.clear(); configurationInformation.clear(); illumination.clear(); reflectedAmbientLight.clear(); requestedResolutionID.clear(); referencedPresentationLUTInstanceUID.clear(); referencedPresentationLUTAlignment = DVPSK_other; imageBoxContentList.clear(); annotationContentList.clear(); presentationLUTList.clear(); sOPInstanceUID.clear(); specificCharacterSet.clear(); instanceCreationDate.clear(); instanceCreationTime.clear(); imageSeriesInstanceUID.clear(); invalidateCache(); decimateCropBehaviour = DVPSI_default; filmSessionInstanceUID.clear(); filmBoxInstanceUID.clear(); presentationLUTInstanceUID.clear(); globalPresentationLUT.clear(); globalPresentationLUTValid = OFFalse; transmitImagesIn12Bit = OFTrue; renderPresentationLUTinSCP = OFFalse; tempDensity.clear(); } void DVPSStoredPrint::invalidateCache() { currentValuesValid = OFFalse; currentNumCols=0; currentNumRows=0; } void DVPSStoredPrint::updateCache() { if (currentValuesValid) return; OFString aString; imageDisplayFormat.getOFStringArray(aString,OFTrue); if (aString.substr(0,9) == "STANDARD\\") { unsigned long columns=0; unsigned long rows=0; const char *format = aString.c_str() + 9; if (2==sscanf(format, "%lu,%lu", &columns, &rows)) { currentNumCols = columns; currentNumRows = rows; if ((columns > 0)&&(rows > 0)) currentValuesValid = OFTrue; } else { DCMPSTAT_INFO("cannot parse image display format '" << aString.c_str() << "'"); } } else { DCMPSTAT_INFO("unknown image display format '" << aString.c_str() << "'"); } return; } OFBool DVPSStoredPrint::isImageStorageSOPClass(OFString& sopclassuid) { for (int i=0; icard() ==1) { item = seq->getItem(0); stack.clear(); READ_FROM_DATASET2(DcmShortText, imageDisplayFormat) READ_FROM_DATASET2(DcmCodeString, annotationDisplayFormatID) if (result==EC_TagNotFound) result = EC_Normal; READ_FROM_DATASET2(DcmCodeString, filmOrientation) READ_FROM_DATASET2(DcmCodeString, filmSizeID) READ_FROM_DATASET2(DcmCodeString, magnificationType) READ_FROM_DATASET2(DcmCodeString, smoothingType) if (result==EC_TagNotFound) result = EC_Normal; READ_FROM_DATASET2(DcmCodeString, borderDensity) if (result==EC_TagNotFound) result = EC_Normal; READ_FROM_DATASET2(DcmCodeString, emptyImageDensity) if (result==EC_TagNotFound) result = EC_Normal; READ_FROM_DATASET2(DcmUnsignedShort, minDensity) if (result==EC_TagNotFound) result = EC_Normal; READ_FROM_DATASET2(DcmUnsignedShort, maxDensity) READ_FROM_DATASET2(DcmCodeString, trim) READ_FROM_DATASET2(DcmShortText, configurationInformation) READ_FROM_DATASET2(DcmUnsignedShort, illumination) if (result==EC_TagNotFound) result = EC_Normal; READ_FROM_DATASET2(DcmUnsignedShort, reflectedAmbientLight) if (result==EC_TagNotFound) result = EC_Normal; READ_FROM_DATASET2(DcmCodeString, requestedResolutionID) if (result==EC_TagNotFound) result = EC_Normal; // check referenced presentation LUT sequence // if there is any reference, it must refer to one of the presentation LUTs we are managing. stack.clear(); if (EC_Normal == item->search(DCM_ReferencedPresentationLUTSequence, stack, ESM_fromHere, OFFalse)) { seq=(DcmSequenceOfItems *)stack.top(); if (seq->card() ==1) { item = seq->getItem(0); stack.clear(); READ_FROM_DATASET2(DcmUniqueIdentifier, referencedPresentationLUTInstanceUID) if (referencedPresentationLUTInstanceUID.getLength() > 0) { referencedPresentationLUTInstanceUID.getOFString(aString,0); if (NULL == presentationLUTList.findPresentationLUT(aString.c_str())) { result=EC_IllegalCall; DCMPSTAT_INFO("FilmBoxContentSequence presentation LUT reference cannot be resolved"); } } } else { result=EC_TagNotFound; DCMPSTAT_INFO("found FilmBoxContentSequence in Stored Print with ReferencedPresentationLUTSequence number of items != 1"); } } } else { result=EC_TagNotFound; DCMPSTAT_INFO("found FilmBoxContentSequence in Stored Print with number of items != 1"); } } } if (EC_Normal==result) result = imageBoxContentList.read(dset, presentationLUTList); if (EC_Normal==result) result = annotationContentList.read(dset); /* Now perform basic sanity checks */ if (result==EC_Normal) { if ((studyInstanceUID.getLength() == 0)||(studyInstanceUID.getVM() != 1)) { result=EC_TagNotFound; DCMPSTAT_INFO("StudyInstanceUID missing or incorrect in Stored Print"); } if ((seriesInstanceUID.getLength() == 0)||(seriesInstanceUID.getVM() != 1)) { result=EC_TagNotFound; DCMPSTAT_INFO("SeriesInstanceUID missing or incorrect in Stored Print"); } if ((sOPInstanceUID.getLength() == 0)||(sOPInstanceUID.getVM() != 1)) { result=EC_TagNotFound; DCMPSTAT_INFO("SOPInstanceUID missing or incorrect in Stored Print"); } if ((patientName.getLength() == 0)||(patientName.getVM() != 1)) { // result=EC_TagNotFound; DCMPSTAT_INFO("PatientName missing or incorrect in Stored Print"); } if ((imageDisplayFormat.getLength() == 0)||(imageDisplayFormat.getVM() != 1)) { result=EC_TagNotFound; DCMPSTAT_INFO("ImageDisplayFormat missing or incorrect in Stored Print"); } if (imageBoxContentList.size() == 0) { result=EC_TagNotFound; DCMPSTAT_INFO("ImageBoxContentSequence missing or empty in Stored Print"); } } /* Finally check the Print Management Capabilities Sequence * we require the following SOP classes to be referenced here: * - Basic Film Box * - Basic Grayscale Image Box * - at least one Image Storage SOP Class * we also allow the following SOP classes to be referenced: * - Printer (is part of Basic Grayscale Meta SOP Class) * - Basic Film Session (ditto) * - Presentation LUT * - Basic Annotation Box */ if (result==EC_Normal) { stack.clear(); if (EC_Normal == dset.search(DCM_RETIRED_PrintManagementCapabilitiesSequence, stack, ESM_fromHere, OFFalse)) { OFBool haveFilmBox = OFFalse; OFBool haveGrayscaleImageBox = OFFalse; OFBool haveImageStorage = OFFalse; seq=(DcmSequenceOfItems *)stack.top(); unsigned long numItems = seq->card(); for (unsigned long i=0; igetItem(i); stack.clear(); refsopclassuid.clear(); READ_FROM_DATASET2(DcmUniqueIdentifier, refsopclassuid) refsopclassuid.getOFString(aString,0); if (aString == UID_BasicFilmBoxSOPClass) haveFilmBox=OFTrue; else if (aString==UID_BasicGrayscaleImageBoxSOPClass) haveGrayscaleImageBox = OFTrue; else if ((aString == UID_PrinterSOPClass) ||(aString == UID_BasicFilmSessionSOPClass) ||(aString == UID_PresentationLUTSOPClass) ||(aString == UID_BasicAnnotationBoxSOPClass)) { } else if (isImageStorageSOPClass(aString)) haveImageStorage=OFTrue; else { result=EC_IllegalCall; DCMPSTAT_INFO("Unsupported SOP Class UID in PrintManagementCapabilitiesSequence"); } } if (EC_Normal==result) { if (! haveFilmBox) { result=EC_IllegalCall; DCMPSTAT_INFO("Film Box SOP Class not referenced in PrintManagementCapabilitiesSequence"); } if (! haveGrayscaleImageBox) { result=EC_IllegalCall; DCMPSTAT_INFO("Basic Grayscale Image Box SOP Class not referenced in PrintManagementCapabilitiesSequence"); } if (! haveImageStorage) { result=EC_IllegalCall; DCMPSTAT_INFO("No Image Storage SOP Class referenced in PrintManagementCapabilitiesSequence"); } } } else { result=EC_TagNotFound; DCMPSTAT_INFO("PrintManagementCapabilitiesSequence not found"); } } /* read PrinterName from PrinterCharacteristicsSequence if available */ if (result == EC_Normal) { originator.clear(); destination.clear(); printerName.clear(); stack.clear(); if (EC_Normal == dset.search(DCM_RETIRED_PrinterCharacteristicsSequence, stack, ESM_fromHere, OFFalse)) { seq = (DcmSequenceOfItems *)stack.top(); if (seq->card() > 0) { item = seq->getItem(0); stack.clear(); READ_FROM_DATASET2(DcmApplicationEntity, originator) READ_FROM_DATASET2(DcmApplicationEntity, destination) READ_FROM_DATASET2(DcmLongString, printerName) } } if (printerName.getLength() == 0) DCMPSTAT_INFO("PrinterName missing or incorrect in PrinterCharacteristicsSequence"); } return result; } OFCondition DVPSStoredPrint::createDefaultValues() { OFCondition result = EC_Normal; char uid[100]; OFString aString; SET_UID(seriesInstanceUID) SET_UID(imageSeriesInstanceUID) if ((result==EC_Normal)&&(patientName.getLength()==0)) { result = patientName.putString(DEFAULT_patientName); } if ((result==EC_Normal)&&(sOPInstanceUID.getLength()==0)) { result = sOPInstanceUID.putString(dcmGenerateUniqueIdentifier(uid)); DVPSHelper::currentDate(aString); if (result==EC_Normal) result = instanceCreationDate.putString(aString.c_str()); DVPSHelper::currentTime(aString); if (result==EC_Normal) result = instanceCreationTime.putString(aString.c_str()); } if ((result==EC_Normal)&&(studyInstanceUID.getLength()==0)) { result = studyInstanceUID.putString(dcmGenerateUniqueIdentifier(uid, SITE_STUDY_UID_ROOT)); DVPSHelper::currentDate(aString); if (result==EC_Normal) result = studyDate.putString(aString.c_str()); DVPSHelper::currentTime(aString); if (result==EC_Normal) result = studyTime.putString(aString.c_str()); } if ((result==EC_Normal)&&(imageDisplayFormat.getLength()==0)) result = imageDisplayFormat.putString(DEFAULT_imageDisplayFormat); return result; } OFCondition DVPSStoredPrint::write( DcmItem &dset, OFBool writeRequestedImageSize, OFBool limitImages, OFBool updateDecimateCrop, OFBool ignoreEmptyImages) { DcmElement *delem=NULL; DcmSequenceOfItems *dseq=NULL; DcmItem *ditem=NULL; OFCondition result = createDefaultValues(); if ((EC_Normal==result)&& updateDecimateCrop) result = imageBoxContentList.setRequestedDecimateCropBehaviour(decimateCropBehaviour); // set in all image boxes if (EC_Normal==result) result = imageBoxContentList.createDefaultValues(limitImages, ignoreEmptyImages); // renumber if limitImages is true ADD_TO_DATASET(DcmPersonName, patientName) ADD_TO_DATASET(DcmLongString, patientID) ADD_TO_DATASET(DcmDate, patientBirthDate) ADD_TO_DATASET(DcmCodeString, patientSex) ADD_TO_DATASET(DcmUniqueIdentifier, studyInstanceUID) ADD_TO_DATASET(DcmDate, studyDate) ADD_TO_DATASET(DcmTime, studyTime) ADD_TO_DATASET(DcmPersonName, referringPhysicianName) ADD_TO_DATASET(DcmShortString, studyID) ADD_TO_DATASET(DcmShortString, accessionNumber) ADD_TO_DATASET(DcmUniqueIdentifier, seriesInstanceUID) ADD_TO_DATASET(DcmIntegerString, seriesNumber) ADD_TO_DATASET(DcmLongString, manufacturer) ADD_TO_DATASET(DcmIntegerString, instanceNumber) ADD_TO_DATASET(DcmUniqueIdentifier, sOPInstanceUID) if (specificCharacterSet.getLength() > 0) { ADD_TO_DATASET(DcmCodeString, specificCharacterSet) } if (instanceCreationDate.getLength() > 0) { ADD_TO_DATASET(DcmDate, instanceCreationDate) } if (instanceCreationTime.getLength() > 0) { ADD_TO_DATASET(DcmTime, instanceCreationTime) } /* create the Film Box Content SQ */ if (result == EC_Normal) { ditem = new DcmItem(); if (ditem) { dseq = new DcmSequenceOfItems(DCM_RETIRED_FilmBoxContentSequence); if (dseq) { ADD_TO_DATASET2(DcmShortText, imageDisplayFormat) ADD_TO_DATASET2(DcmCodeString, filmOrientation) ADD_TO_DATASET2(DcmCodeString, filmSizeID) ADD_TO_DATASET2(DcmCodeString, magnificationType) ADD_TO_DATASET2(DcmUnsignedShort, maxDensity) ADD_TO_DATASET2(DcmShortText, configurationInformation) if (annotationDisplayFormatID.getLength() > 0) { ADD_TO_DATASET2(DcmCodeString, annotationDisplayFormatID) } if (smoothingType.getLength() > 0) { ADD_TO_DATASET2(DcmCodeString, smoothingType) } if (borderDensity.getLength() > 0) { ADD_TO_DATASET2(DcmCodeString, borderDensity) } if (emptyImageDensity.getLength() > 0) { ADD_TO_DATASET2(DcmCodeString, emptyImageDensity) } if (minDensity.getLength() > 0) { ADD_TO_DATASET2(DcmUnsignedShort, minDensity) } if (trim.getLength() > 0) { ADD_TO_DATASET2(DcmCodeString, trim) } if (requestedResolutionID.getLength() > 0) { ADD_TO_DATASET2(DcmCodeString, requestedResolutionID) } if ((presentationLUTList.size() > 0) || globalPresentationLUTValid) { ADD_TO_DATASET2(DcmUnsignedShort, illumination) ADD_TO_DATASET2(DcmUnsignedShort, reflectedAmbientLight) if ((result == EC_Normal) && globalPresentationLUTValid) { // generate a new UID for the "global" presentation LUT char uid[100]; dcmGenerateUniqueIdentifier(uid); globalPresentationLUT.setSOPInstanceUID(uid); result = referencedPresentationLUTInstanceUID.putString(uid); } if (EC_Normal == result) result = addReferencedPLUTSQ(*ditem); } if (result==EC_Normal) { dseq->insert(ditem); dset.insert(dseq, OFTrue /*replaceOld*/); } else { // out of memory during creation of sequence contents. delete dseq; delete ditem; result = EC_MemoryExhausted; } } else { // could allocate item but not sequence. Bail out. delete ditem; result = EC_MemoryExhausted; } } else result = EC_MemoryExhausted; } /* add SOP Class UID */ DcmUniqueIdentifier sopclassuid(DCM_SOPClassUID); if (result==EC_Normal) { result = sopclassuid.putString(UID_RETIRED_StoredPrintStorage); } ADD_TO_DATASET(DcmUniqueIdentifier, sopclassuid) /* add Modality */ DcmCodeString modality(DCM_Modality); if (result==EC_Normal) { result = modality.putString("STORED_PRINT"); // defined term } ADD_TO_DATASET(DcmCodeString, modality) // compute number of image boxes to write updateCache(); unsigned long writeImageBoxes=0; // default: write all if (limitImages && currentValuesValid) writeImageBoxes = currentNumCols * currentNumRows; // write PresentationLUTContentSequence if (EC_Normal == result) { // write general presentation LUT only if (globalPresentationLUTValid) { dseq = new DcmSequenceOfItems(DCM_RETIRED_PresentationLUTContentSequence); if (dseq) { ditem = new DcmItem(); if (ditem) { result = globalPresentationLUT.write(*ditem, OFTrue); if (result == EC_Normal) dseq->insert(ditem); else delete ditem; } else result = EC_MemoryExhausted; } else result = EC_MemoryExhausted; if (result == EC_Normal) dset.insert(dseq, OFTrue /*replaceOld*/); else delete dseq; } else { // write presentation LUT list result = presentationLUTList.write(dset); } } // write imageBoxContentList if (EC_Normal == result) result = imageBoxContentList.write(dset, writeRequestedImageSize, (size_t)writeImageBoxes, ignoreEmptyImages, !globalPresentationLUTValid); // write annotationContentList if (EC_Normal == result) result = annotationContentList.write(dset); // write PrintManagementCapabilitiesSequence dseq = new DcmSequenceOfItems(DCM_RETIRED_PrintManagementCapabilitiesSequence); if (dseq) { if (EC_Normal == result) result = DVPSHelper::addReferencedUIDItem(*dseq, UID_BasicFilmSessionSOPClass); if (EC_Normal == result) result = DVPSHelper::addReferencedUIDItem(*dseq, UID_BasicFilmBoxSOPClass); if (EC_Normal == result) result = DVPSHelper::addReferencedUIDItem(*dseq, UID_BasicGrayscaleImageBoxSOPClass); if (EC_Normal == result) result = imageBoxContentList.addImageSOPClasses(*dseq, (size_t)writeImageBoxes); if ((result == EC_Normal)&&(presentationLUTList.size() > 0)) { result = DVPSHelper::addReferencedUIDItem(*dseq, UID_PresentationLUTSOPClass); } if ((result == EC_Normal)&&(annotationContentList.size() > 0)) { result = DVPSHelper::addReferencedUIDItem(*dseq, UID_BasicAnnotationBoxSOPClass); } if (result==EC_Normal) dset.insert(dseq, OFTrue /*replaceOld*/); else delete dseq; } else result = EC_MemoryExhausted; // write PrinterCharacteristicsSequence (Type 2) if (EC_Normal == result) { dseq = new DcmSequenceOfItems(DCM_RETIRED_PrinterCharacteristicsSequence); if (dseq) { if (printerName.getLength() > 0) { ditem = new DcmItem(); if (ditem) { ADD_TO_DATASET2(DcmApplicationEntity, originator); ADD_TO_DATASET2(DcmApplicationEntity, destination); ADD_TO_DATASET2(DcmLongString, printerName); if (result == EC_Normal) result = dseq->insert(ditem); else delete ditem; } else result = EC_MemoryExhausted; } if (result == EC_Normal) dset.insert(dseq, OFTrue /*replaceOld*/); else delete dseq; } else result = EC_MemoryExhausted; } return result; } OFCondition DVPSStoredPrint::writeHardcopyImageAttributes(DcmItem &dset) { DcmElement *delem=NULL; OFCondition result = createDefaultValues(); // add general study module ADD_TO_DATASET(DcmUniqueIdentifier, studyInstanceUID) ADD_TO_DATASET(DcmDate, studyDate) ADD_TO_DATASET(DcmTime, studyTime) ADD_TO_DATASET(DcmPersonName, referringPhysicianName) ADD_TO_DATASET(DcmShortString, studyID) ADD_TO_DATASET(DcmShortString, accessionNumber) // add general series module for hardcopy images DcmIntegerString imageSeriesNumber(DCM_SeriesNumber); // always empty DcmCodeString modality(DCM_Modality); if (result==EC_Normal) { result = modality.putString("HC"); } ADD_TO_DATASET(DcmUniqueIdentifier, imageSeriesInstanceUID) ADD_TO_DATASET(DcmIntegerString, imageSeriesNumber) ADD_TO_DATASET(DcmCodeString, modality) return result; } DVPSPresentationLUT *DVPSStoredPrint::getImagePresentationLUT(size_t idx) { /* look for referenced Presentation LUT in image box */ const char *plutuid = imageBoxContentList.getReferencedPresentationLUTInstanceUID(idx); /* if absent, look for referenced Presentation LUT in film box */ if ((plutuid == NULL) || (strlen(plutuid) == 0)) { char *uid = NULL; if (referencedPresentationLUTInstanceUID.getString(uid) == EC_Normal) plutuid = uid; } DVPSPresentationLUT *plut = NULL; if ((plutuid != NULL) && (strlen(plutuid) > 0)) plut = presentationLUTList.findPresentationLUT(plutuid); return plut; } DVPSPresentationLUT *DVPSStoredPrint::getPresentationLUT() { if (globalPresentationLUTValid) return &globalPresentationLUT; return NULL; } OFCondition DVPSStoredPrint::setDefaultPresentationLUT() { globalPresentationLUTValid = OFFalse; globalPresentationLUT.clear(); return EC_Normal; } OFCondition DVPSStoredPrint::setPresentationLUTShape(DVPSPresentationLUTType shape) { OFCondition result = EC_IllegalCall; if ((shape == DVPSP_identity) || (shape == DVPSP_lin_od)) { result = globalPresentationLUT.setType(shape); globalPresentationLUTValid = (result == EC_Normal); } return result; } OFCondition DVPSStoredPrint::setPresentationLookupTable(DcmItem &dset) { OFCondition result = globalPresentationLUT.read(dset, OFFalse); globalPresentationLUTValid = (result == EC_Normal); return result; } Sint32 DVPSStoredPrint::convertODtoPValue(Uint16 density, unsigned int bits) { const Uint16 min = getMinDensityValue(); const Uint16 max = getMaxDensityValue(); if ((min < max) && ((bits == 8) || (bits == 12) || (bits == 16))) { if (density >= max) return 0; else if (density <= min) return (Sint32)DicomImageClass::maxval(bits); else { const double l0 = (double)getPrintIllumination(); const double la = (double)getPrintReflectedAmbientLight(); const double d0 = (double)density / 100; const double dmin = (double)min / 100; const double dmax = (double)max / 100; const double lmin = la + l0 * pow((double)10, -dmax); const double lmax = la + l0 * pow((double)10, -dmin); const double jmin = DiGSDFunction::getJNDIndex(lmin); const double jmax = DiGSDFunction::getJNDIndex(lmax); const double factor = (double)DicomImageClass::maxval(bits) / (jmax - jmin); return (Sint32)((DiGSDFunction::getJNDIndex(la + l0 * pow((double)10, -d0)) - jmin) * factor); } } return -1; } OFCondition DVPSStoredPrint::addImageBox( const char *retrieveaetitle, const char *refstudyuid, const char *refseriesuid, const char *refsopclassuid, const char *refsopinstanceuid, const char *requestedimagesize, const char *patientid, DVPSPresentationLUT *presentationlut, OFBool inversePLUT) { char instanceuid[100]; const char *lutUID = presentationLUTList.addPresentationLUT(presentationlut, inversePLUT); return imageBoxContentList.addImageBox(dcmGenerateUniqueIdentifier(instanceuid), retrieveaetitle, refstudyuid, refseriesuid, refsopclassuid, refsopinstanceuid, requestedimagesize, patientid, lutUID); } OFCondition DVPSStoredPrint::addImageBox( const char *retrieveaetitle, const char *refsopinstanceuid, const char *requestedimagesize, const char *patientid, DVPSPresentationLUT *presentationlut, OFBool inversePLUT) { char *refstudyuid=NULL; char *refseriesuid=NULL; createDefaultValues(); // make sure that all UIDs are defined studyInstanceUID.getString(refstudyuid); // same study UID for stored print and hardcopy image imageSeriesInstanceUID.getString(refseriesuid); // but separate series for the hardcopy images return addImageBox(retrieveaetitle, refstudyuid, refseriesuid, UID_RETIRED_HardcopyGrayscaleImageStorage, refsopinstanceuid, requestedimagesize, patientid, presentationlut, inversePLUT); } OFCondition DVPSStoredPrint::setOriginator(const char *aetitle) { if ((aetitle == NULL) || (strlen(aetitle) == 0)) return originator.clear(); else return originator.putString(aetitle); } OFCondition DVPSStoredPrint::setDestination(const char *aetitle) { if ((aetitle == NULL) || (strlen(aetitle) == 0)) return destination.clear(); else return destination.putString(aetitle); } OFCondition DVPSStoredPrint::setPrinterName(const char *name) { if ((name == NULL) || (strlen(name) == 0)) return printerName.clear(); else return printerName.putString(name); } OFCondition DVPSStoredPrint::setInstanceUID(const char *uid) { if ((uid==NULL)||(strlen(uid)==0)) return EC_IllegalCall; return sOPInstanceUID.putString(uid); } OFCondition DVPSStoredPrint::setImageDisplayFormat(unsigned long columns, unsigned long rows) { if ((columns==0)||(rows==0)) return EC_IllegalCall; char newFormat[80]; sprintf(newFormat, "STANDARD\\%lu,%lu", columns, rows); OFCondition result = imageDisplayFormat.putString(newFormat); if (EC_Normal == result) { currentNumCols = columns; currentNumRows = rows; currentValuesValid = OFTrue; } else invalidateCache(); return result; } OFCondition DVPSStoredPrint::setFilmSizeID(const char *value) { if ((value==NULL)||(strlen(value)==0)) { filmSizeID.clear(); return EC_Normal; } return filmSizeID.putString(value); } OFCondition DVPSStoredPrint::setMagnificationType(const char *value) { if ((value==NULL)||(strlen(value)==0)) { magnificationType.clear(); return EC_Normal; } return magnificationType.putString(value); } OFCondition DVPSStoredPrint::setSmoothingType(const char *value) { if ((value==NULL)||(strlen(value)==0)) { smoothingType.clear(); return EC_Normal; } return smoothingType.putString(value); } OFCondition DVPSStoredPrint::setConfigurationInformation(const char *value) { if ((value==NULL)||(strlen(value)==0)) { configurationInformation.clear(); return EC_Normal; } return configurationInformation.putString(value); } OFCondition DVPSStoredPrint::setResolutionID(const char *value) { if ((value==NULL)||(strlen(value)==0)) { requestedResolutionID.clear(); return EC_Normal; } return requestedResolutionID.putString(value); } OFCondition DVPSStoredPrint::setFilmOrientation(DVPSFilmOrientation value) { switch (value) { case DVPSF_portrait: return filmOrientation.putString("PORTRAIT"); /* break; */ case DVPSF_landscape: return filmOrientation.putString("LANDSCAPE"); /* break; */ case DVPSF_default: filmOrientation.clear(); break; } return EC_Normal; } OFCondition DVPSStoredPrint::setTrim(DVPSTrimMode value) { switch (value) { case DVPSH_trim_on: return trim.putString("YES"); /* break; */ case DVPSH_trim_off: return trim.putString("NO"); /* break; */ case DVPSH_default: trim.clear(); break; } return EC_Normal; } OFCondition DVPSStoredPrint::setRequestedDecimateCropBehaviour(DVPSDecimateCropBehaviour value) { decimateCropBehaviour = value; return EC_Normal; } OFCondition DVPSStoredPrint::newPrinter(const char *name, const char *destinationAE) { filmSizeID.clear(); magnificationType.clear(); smoothingType.clear(); configurationInformation.clear(); requestedResolutionID.clear(); trim.clear(); borderDensity.clear(); emptyImageDensity.clear(); minDensity.clear(); maxDensity.clear(); if (name != NULL) setPrinterName(name); if (destinationAE != NULL) setDestination(destinationAE); OFCondition result = setRequestedDecimateCropBehaviour(DVPSI_default); if (EC_Normal == result) result = imageBoxContentList.setAllImagesToDefault(); return result; } const char *DVPSStoredPrint::getOriginator() { char *c = NULL; if (EC_Normal == originator.getString(c)) return c; else return NULL; } const char *DVPSStoredPrint::getDestination() { char *c = NULL; if (EC_Normal == destination.getString(c)) return c; else return NULL; } const char *DVPSStoredPrint::getPrinterName() { char *c = NULL; if (EC_Normal == printerName.getString(c)) return c; else return NULL; } unsigned long DVPSStoredPrint::getImageDisplayFormatColumns() { updateCache(); return currentNumCols; } unsigned long DVPSStoredPrint::getImageDisplayFormatRows() { updateCache(); return currentNumRows; } DVPSFilmOrientation DVPSStoredPrint::getFilmOrientation() { DVPSFilmOrientation result = DVPSF_default; char *c = NULL; if ((EC_Normal == filmOrientation.getString(c))&& c) { OFString aString(c); if (aString == "PORTRAIT") result = DVPSF_portrait; else if (aString == "LANDSCAPE") result = DVPSF_landscape; } return result; } DVPSTrimMode DVPSStoredPrint::getTrim() { DVPSTrimMode result = DVPSH_default; char *c = NULL; if ((EC_Normal == trim.getString(c))&& c) { OFString aString(c); if (aString == "YES") result = DVPSH_trim_on; else if (aString == "NO") result = DVPSH_trim_off; } return result; } const char *DVPSStoredPrint::getStudyInstanceUID() { char *c = NULL; if (EC_Normal == studyInstanceUID.getString(c)) return c; else return NULL; } const char *DVPSStoredPrint::getSeriesInstanceUID() { char *c = NULL; if (EC_Normal == seriesInstanceUID.getString(c)) return c; else return NULL; } const char *DVPSStoredPrint::getSOPInstanceUID() { char *c = NULL; if (EC_Normal == sOPInstanceUID.getString(c)) return c; else return NULL; } const char *DVPSStoredPrint::getFilmSizeID() { char *c = NULL; if (EC_Normal == filmSizeID.getString(c)) return c; else return NULL; } const char *DVPSStoredPrint::getMagnificationType() { char *c = NULL; if (EC_Normal == magnificationType.getString(c)) return c; else return NULL; } const char *DVPSStoredPrint::getSmoothingType() { char *c = NULL; if (EC_Normal == smoothingType.getString(c)) return c; else return NULL; } const char *DVPSStoredPrint::getConfigurationInformation() { char *c = NULL; if (EC_Normal == configurationInformation.getString(c)) return c; else return NULL; } const char *DVPSStoredPrint::getResolutionID() { char *c = NULL; if (EC_Normal == requestedResolutionID.getString(c)) return c; else return NULL; } OFCondition DVPSStoredPrint::setBorderDensity(const char *value) { if ((value==NULL)||(strlen(value)==0)) { borderDensity.clear(); return EC_Normal; } return borderDensity.putString(value); } OFCondition DVPSStoredPrint::setEmtpyImageDensity(const char *value) { if ((value==NULL)||(strlen(value)==0)) { emptyImageDensity.clear(); return EC_Normal; } return emptyImageDensity.putString(value); } const char *DVPSStoredPrint::getBorderDensity() { char *c = NULL; if (EC_Normal == borderDensity.getString(c)) return c; else return NULL; } const char *DVPSStoredPrint::getEmtpyImageDensity() { char *c = NULL; if (EC_Normal == emptyImageDensity.getString(c)) return c; else return NULL; } OFCondition DVPSStoredPrint::setPrintIllumination(Uint16 value) { return illumination.putUint16(value, 0); } Uint16 DVPSStoredPrint::getPrintIllumination() { Uint16 result = 0; if (EC_Normal == illumination.getUint16(result, 0)) return result; else return 0; } OFCondition DVPSStoredPrint::setPrintReflectedAmbientLight(Uint16 value) { return reflectedAmbientLight.putUint16(value, 0); } Uint16 DVPSStoredPrint::getPrintReflectedAmbientLight() { Uint16 result = 0; if (EC_Normal == reflectedAmbientLight.getUint16(result, 0)) return result; else return 0; } OFCondition DVPSStoredPrint::deleteImage(size_t idx) { OFCondition result = imageBoxContentList.deleteImage(idx); char *c = NULL; if (EC_Normal != configurationInformation.getString(c)) c = NULL; presentationLUTList.cleanup(c, imageBoxContentList); return result; } OFCondition DVPSStoredPrint::deleteMultipleImages(size_t number) { OFCondition result = imageBoxContentList.deleteMultipleImages(number); char *c = NULL; if (EC_Normal != configurationInformation.getString(c)) c = NULL; presentationLUTList.cleanup(c, imageBoxContentList); return result; } OFCondition DVPSStoredPrint::deleteSpooledImages() { OFCondition result = EC_IllegalCall; char *c = NULL; unsigned long deleteImageBoxes=0; updateCache(); if (currentValuesValid) { deleteImageBoxes = currentNumCols * currentNumRows; if (deleteImageBoxes > imageBoxContentList.size()) deleteImageBoxes = imageBoxContentList.size(); result = imageBoxContentList.deleteMultipleImages((size_t)deleteImageBoxes); } if (EC_Normal != configurationInformation.getString(c)) c = NULL; presentationLUTList.cleanup(c, imageBoxContentList); return result; } OFCondition DVPSStoredPrint::printSCUgetPrinterInstance(DVPSPrintMessageHandler& printHandler) { DcmDataset *attributeListOut=NULL; Uint16 status=0; OFCondition cond=printHandler.getRQ(UID_PrinterSOPClass, UID_PrinterSOPInstance, NULL, 0, status, attributeListOut); /* the N-GET response has been dumped somewhere else, we only need to delete it */ delete attributeListOut; if (cond.bad()) return EC_IllegalCall; return EC_Normal; } OFCondition DVPSStoredPrint::printSCUpreparePresentationLUT( DVPSPrintMessageHandler& printHandler, OFBool printerRequiresMatchingLUT, OFBool printerLUTRenderingPreferred, OFBool printerSupports12Bit) { /* first of all we determine whether we can let the print SCP render Presentation LUT for us. */ renderPresentationLUTinSCP = OFFalse; // set to true if we can create a presentation LUT for all images transmitImagesIn12Bit = OFTrue; // set to false later if images should be transmitted in 8-bit depth OFBool printerSupportsPresentationLUT = printHandler.printerSupportsPresentationLUT(); DVPSPresentationLUT *plut = NULL; if (printerSupportsPresentationLUT) { char *filmBox = NULL; if (EC_Normal != referencedPresentationLUTInstanceUID.getString(filmBox)) filmBox=NULL; const char *plutuid = imageBoxContentList.haveSinglePresentationLUTUsed(filmBox); if (plutuid) plut = presentationLUTList.findPresentationLUT(plutuid); if (plut && (plut->isLegalPrintPresentationLUT())) { /* there is a single Presentation LUT that can be used for the complete film, * and it is a valid Supplement 22 Presentation LUT. */ if (printerSupports12Bit) { /* 12-bit printer, we use the LUT if the printer can handle it and if the user wants it */ if (printerLUTRenderingPreferred) { if (printerRequiresMatchingLUT) { if (plut->matchesImageDepth(OFTrue)) renderPresentationLUTinSCP = OFTrue; else { if (plut->matchesImageDepth(OFFalse)) { renderPresentationLUTinSCP = OFTrue; transmitImagesIn12Bit = OFFalse; } } } else renderPresentationLUTinSCP = OFTrue; } } else { /* 8-bit printer, we use the LUT if the printer can handle it */ transmitImagesIn12Bit = OFFalse; if (printerRequiresMatchingLUT) { if (plut->matchesImageDepth(OFFalse)) renderPresentationLUTinSCP = OFTrue; } else renderPresentationLUTinSCP = OFTrue; } } else transmitImagesIn12Bit = printerSupports12Bit; } else { transmitImagesIn12Bit = printerSupports12Bit; DCMPSTAT_INFO("spooler: printer does not support Presentation LUT SOP Class," << " presentation LUT related print job settings will be ignored."); } OFCondition result = EC_Normal; if (printerSupportsPresentationLUT) { DcmDataset dset; DcmDataset *attributeListOut=NULL; Uint16 status=0; if (renderPresentationLUTinSCP) { result = plut->write(dset, OFFalse); } else { DVPSPresentationLUT identity; result = identity.write(dset, OFFalse); } if (result==EC_Normal) { OFCondition cond = printHandler.createRQ(UID_PresentationLUTSOPClass, presentationLUTInstanceUID, &dset, status, attributeListOut); if ((cond.good())&&((status==0)||((status & 0xf000)==0xb000))) { /* nothing */ } else { presentationLUTInstanceUID.clear(); result = EC_IllegalCall; } delete attributeListOut; } } return result; } OFCondition DVPSStoredPrint::addReferencedPLUTSQ(DcmItem &dset) { if (referencedPresentationLUTInstanceUID.getLength() == 0) return EC_Normal; OFCondition result = EC_Normal; DcmElement *delem=NULL; DcmSequenceOfItems *dseq = new DcmSequenceOfItems(DCM_ReferencedPresentationLUTSequence); DcmItem *ditem = new DcmItem(); if (ditem && dseq) { ADD_TO_DATASET2(DcmUniqueIdentifier, referencedPresentationLUTInstanceUID) if (result==EC_Normal) { dseq->insert(ditem); dset.insert(dseq, OFTrue /*replaceOld*/); } else { delete dseq; delete ditem; } } else { delete dseq; delete ditem; result = EC_MemoryExhausted; } return result; } OFCondition DVPSStoredPrint::addPresentationLUTReference(DcmItem& dset) { DcmElement *delem=NULL; OFCondition result = EC_Normal; ADD_TO_DATASET(DcmUnsignedShort, illumination) ADD_TO_DATASET(DcmUnsignedShort, reflectedAmbientLight) if (presentationLUTInstanceUID.size() > 0) { DcmUniqueIdentifier refsopclassuid(DCM_ReferencedSOPClassUID); DcmUniqueIdentifier refsopinstanceuid(DCM_ReferencedSOPInstanceUID); if (result==EC_Normal) result = refsopclassuid.putString(UID_PresentationLUTSOPClass); if (result==EC_Normal) result = refsopinstanceuid.putString(presentationLUTInstanceUID.c_str()); DcmSequenceOfItems *dseq = new DcmSequenceOfItems(DCM_ReferencedPresentationLUTSequence); DcmItem *ditem = new DcmItem(); if ((result == EC_Normal) && ditem && dseq) { ADD_TO_DATASET2(DcmUniqueIdentifier, refsopclassuid) ADD_TO_DATASET2(DcmUniqueIdentifier, refsopinstanceuid) if (result==EC_Normal) { dseq->insert(ditem); dset.insert(dseq, OFTrue /*replaceOld*/); } else { delete dseq; delete ditem; } } else { delete dseq; delete ditem; result = EC_MemoryExhausted; } } return result; } OFCondition DVPSStoredPrint::printSCUcreateBasicFilmSession( DVPSPrintMessageHandler& printHandler, DcmDataset& dset, OFBool plutInSession) { if (filmSessionInstanceUID.size() > 0) return EC_IllegalCall; DcmDataset *attributeListOut=NULL; Uint16 status=0; OFCondition result = EC_Normal; // we expect 'number of copies', 'print priority', 'medium type' and 'film destination' in dset // add illumination and reflection, and presentation LUT reference if necessary. if ((printHandler.printerSupportsPresentationLUT()) && plutInSession) result = addPresentationLUTReference(dset); if (result==EC_Normal) { OFCondition cond = printHandler.createRQ(UID_BasicFilmSessionSOPClass, filmSessionInstanceUID, &dset, status, attributeListOut); if ((cond.bad())||((status!=0)&&((status & 0xf000)!=0xb000))) { result = EC_IllegalCall; filmSessionInstanceUID.clear(); } delete attributeListOut; } return result; } OFCondition DVPSStoredPrint::printSCUcreateBasicFilmBox(DVPSPrintMessageHandler& printHandler, OFBool plutInSession) { if ((filmSessionInstanceUID.size() == 0)||(filmBoxInstanceUID.size() > 0)) return EC_IllegalCall; OFCondition result = EC_Normal; DcmDataset dset; DcmElement *delem=NULL; DcmSequenceOfItems *dseq=NULL; DcmSequenceOfItems *seq=NULL; DcmItem *ditem=NULL; DcmItem *item=NULL; DcmDataset *attributeListOut=NULL; char *c = NULL; Uint16 status=0; DcmStack stack; OFString grayscaleIB(UID_BasicGrayscaleImageBoxSOPClass); OFString annotationB(UID_BasicAnnotationBoxSOPClass); ADD_TO_DATASET(DcmShortText, imageDisplayFormat) if (filmOrientation.getLength() > 0) { ADD_TO_DATASET(DcmCodeString, filmOrientation) } if (filmSizeID.getLength() > 0) { ADD_TO_DATASET(DcmCodeString, filmSizeID) } if (magnificationType.getLength() > 0) { ADD_TO_DATASET(DcmCodeString, magnificationType) } if (maxDensity.getLength() > 0) { ADD_TO_DATASET(DcmUnsignedShort, maxDensity) } if (configurationInformation.getLength() > 0) { ADD_TO_DATASET(DcmShortText, configurationInformation) } if (smoothingType.getLength() > 0) { ADD_TO_DATASET(DcmCodeString, smoothingType) } if (borderDensity.getLength() > 0) { ADD_TO_DATASET(DcmCodeString, borderDensity) } if (emptyImageDensity.getLength() > 0) { ADD_TO_DATASET(DcmCodeString, emptyImageDensity) } if (minDensity.getLength() > 0) { ADD_TO_DATASET(DcmUnsignedShort, minDensity) } if (trim.getLength() > 0) { ADD_TO_DATASET(DcmCodeString, trim) } if (requestedResolutionID.getLength() > 0) { ADD_TO_DATASET(DcmCodeString, requestedResolutionID) } if ((printHandler.printerSupportsAnnotationBox())&&(annotationDisplayFormatID.getLength() > 0)) { ADD_TO_DATASET(DcmCodeString, annotationDisplayFormatID) } // add Referenced Film Session SQ DcmUniqueIdentifier refsopclassuid(DCM_ReferencedSOPClassUID); DcmUniqueIdentifier refsopinstanceuid(DCM_ReferencedSOPInstanceUID); if (result==EC_Normal) result = refsopclassuid.putString(UID_BasicFilmSessionSOPClass); if (result==EC_Normal) result = refsopinstanceuid.putString(filmSessionInstanceUID.c_str()); if (result==EC_Normal) { ditem = new DcmItem(); if (ditem) { dseq = new DcmSequenceOfItems(DCM_ReferencedFilmSessionSequence); if (dseq) { ADD_TO_DATASET2(DcmUniqueIdentifier, refsopclassuid) ADD_TO_DATASET2(DcmUniqueIdentifier, refsopinstanceuid) if (result==EC_Normal) { dseq->insert(ditem); dset.insert(dseq, OFTrue /*replaceOld*/); } else { // out of memory during creation of sequence contents. delete dseq; delete ditem; result = EC_MemoryExhausted; } } else { // could allocate item but not sequence. Bail out. delete ditem; result = EC_MemoryExhausted; } } else result = EC_MemoryExhausted; } // add illumination and reflection, and presentation LUT reference if necessary. if ((result==EC_Normal) && (printHandler.printerSupportsPresentationLUT()) && (!plutInSession)) result = addPresentationLUTReference(dset); if (result==EC_Normal) { size_t numItems = 0; size_t i; OFCondition cond = printHandler.createRQ(UID_BasicFilmBoxSOPClass, filmBoxInstanceUID, &dset, status, attributeListOut); if ((cond.good())&&((status==0)||((status & 0xf000)==0xb000))&& attributeListOut) { // N-CREATE was successful, now evaluate Referenced Image Box SQ stack.clear(); if (EC_Normal == attributeListOut->search(DCM_ReferencedImageBoxSequence, stack, ESM_fromHere, OFFalse)) { seq=(DcmSequenceOfItems *)stack.top(); numItems = (size_t)seq->card(); if (numItems > imageBoxContentList.size()) numItems = imageBoxContentList.size(); for (i=0; igetItem(i); stack.clear(); READ_FROM_DATASET2(DcmUniqueIdentifier, refsopclassuid) READ_FROM_DATASET2(DcmUniqueIdentifier, refsopinstanceuid) if (EC_Normal==result) result = refsopclassuid.getString(c); if ((EC_Normal==result) && c && (grayscaleIB == c)) { result = refsopinstanceuid.getString(c); if (EC_Normal==result) result = imageBoxContentList.setImageSOPInstanceUID(i, c); } else result = EC_IllegalCall; /* wrong SOP class or unable to read UID */ } } else result=EC_TagNotFound; // evaluate Referenced Basic Annotation Box SQ if present stack.clear(); annotationContentList.clearAnnotationSOPInstanceUIDs(); if (EC_Normal == attributeListOut->search(DCM_ReferencedBasicAnnotationBoxSequence, stack, ESM_fromHere, OFFalse)) { seq=(DcmSequenceOfItems *)stack.top(); numItems = (size_t)seq->card(); if (numItems > annotationContentList.size()) numItems = annotationContentList.size(); for (i=0; igetItem(i); stack.clear(); READ_FROM_DATASET2(DcmUniqueIdentifier, refsopclassuid) READ_FROM_DATASET2(DcmUniqueIdentifier, refsopinstanceuid) if (EC_Normal==result) result = refsopclassuid.getString(c); if ((EC_Normal==result) && c && (annotationB == c)) { result = refsopinstanceuid.getString(c); if (EC_Normal==result) result = annotationContentList.setAnnotationSOPInstanceUID(i, c); } else result = EC_IllegalCall; /* wrong SOP class or unable to read UID */ } } } else { filmBoxInstanceUID.clear(); result = EC_IllegalCall; } delete attributeListOut; } return result; } OFCondition DVPSStoredPrint::printSCUprintBasicFilmBox(DVPSPrintMessageHandler& printHandler) { if (filmBoxInstanceUID.size() == 0) return EC_IllegalCall; DcmDataset *attributeListOut=NULL; Uint16 status=0; OFCondition cond = printHandler.actionRQ(UID_BasicFilmBoxSOPClass, filmBoxInstanceUID.c_str(), 1 /* action type ID 1 = print */, NULL /* no action information */, status, attributeListOut); delete attributeListOut; // should be empty anyway if ((cond.good())&&((status==0)||((status & 0xf000)==0xb000))) return EC_Normal; return EC_IllegalCall; // otherwise } OFCondition DVPSStoredPrint::printSCUprintBasicFilmSession(DVPSPrintMessageHandler& printHandler) { DcmDataset *attributeListOut=NULL; Uint16 status=0; OFCondition cond = printHandler.actionRQ(UID_BasicFilmSessionSOPClass, filmSessionInstanceUID.c_str(), 1 /* action type ID 1 = print */, NULL /* no action information */, status, attributeListOut); delete attributeListOut; // should be empty anyway if ((cond.good())&&((status==0)||((status & 0xf000)==0xb000))) return EC_Normal; return EC_IllegalCall; // otherwise } OFCondition DVPSStoredPrint::printSCUdelete(DVPSPrintMessageHandler& printHandler) { OFCondition cond = EC_Normal; Uint16 status=0; OFCondition result = EC_Normal; // delete basic film box if (filmBoxInstanceUID.size() > 0) { cond = printHandler.deleteRQ(UID_BasicFilmBoxSOPClass, filmBoxInstanceUID.c_str(), status); if ((cond.bad())||((status!=0)&&((status & 0xf000)!=0xb000))) result = EC_IllegalCall; filmBoxInstanceUID.clear(); } // delete basic film session if (filmSessionInstanceUID.size() > 0) { cond = printHandler.deleteRQ(UID_BasicFilmSessionSOPClass, filmSessionInstanceUID.c_str(), status); if ((cond.bad())||((status!=0)&&((status & 0xf000)!=0xb000))) result = EC_IllegalCall; filmSessionInstanceUID.clear(); } // delete presentation LUT if ((presentationLUTInstanceUID.size() > 0)&&(printHandler.printerSupportsPresentationLUT())) { cond = printHandler.deleteRQ(UID_PresentationLUTSOPClass, presentationLUTInstanceUID.c_str(), status); if ((cond.bad())||((status!=0)&&((status & 0xf000)!=0xb000))) result = EC_IllegalCall; presentationLUTInstanceUID.clear(); } return result; } OFCondition DVPSStoredPrint::printSCUsetBasicImageBox( DVPSPrintMessageHandler& printHandler, size_t idx, DicomImage& image, OFBool useMonochrome1) { DcmDataset dataset; DcmItem *ditem = NULL; DcmSequenceOfItems *dseq = NULL; char str[100]; DcmPolymorphOBOW *pxData = NULL; const void *pxDataVoid; unsigned long width = image.getWidth(); unsigned long height = image.getHeight(); DcmDataset *attributeListOut=NULL; Uint16 status=0; const char *imageSopInstanceUID = imageBoxContentList.getSOPInstanceUID(idx); if (imageSopInstanceUID==NULL) return EC_IllegalCall; /* any presentation LUT to render on SCU side? */ if (! renderPresentationLUTinSCP) { /* look for referenced Presentation LUT in image box */ const char *imageplutuid = imageBoxContentList.getReferencedPresentationLUTInstanceUID(idx); char *filmplutuid = NULL; if (EC_Normal != referencedPresentationLUTInstanceUID.getString(filmplutuid)) filmplutuid=NULL; /* if absent, look for referenced Presentation LUT in film box */ if ((imageplutuid == NULL)||(strlen(imageplutuid)==0)) imageplutuid = filmplutuid; DVPSPresentationLUT *pLUT = NULL; if (imageplutuid && (strlen(imageplutuid)>0)) pLUT = presentationLUTList.findPresentationLUT(imageplutuid); if (pLUT) { /* found presentation LUT, activate */ if (pLUT->activate(&image)) { if ((pLUT->getType() == DVPSP_table)&&(! transmitImagesIn12Bit)) { DCMPSTAT_INFO("rendering Presentation LUT into 8-bit bitmap, image quality loss possible."); } } else { DCMPSTAT_INFO("unable to activate Presentation LUT, using IDENTITY instead."); image.setPresentationLutShape(ESP_Identity); } } /* else image.setPresentationLutShape(ESP_Identity); -- this does not make sense for MONO1 HG images */ } /* else image.setPresentationLutShape(ESP_Identity); -- this does not make sense for MONO1 HG images */ OFCondition result = imageBoxContentList.prepareBasicImageBox(idx, dataset); if (EC_Normal == result) { ditem = new DcmItem(); if (ditem) { dseq = new DcmSequenceOfItems(DCM_BasicGrayscaleImageSequence); if (dseq) { if (EC_Normal==result) result = DVPSHelper::putUint16Value(ditem, DCM_SamplesPerPixel, 1); if (useMonochrome1) { image.setPolarity(EPP_Reverse); if (EC_Normal==result) result = DVPSHelper::putStringValue(ditem, DCM_PhotometricInterpretation, "MONOCHROME1"); } else { if (EC_Normal==result) result = DVPSHelper::putStringValue(ditem, DCM_PhotometricInterpretation, "MONOCHROME2"); } if (EC_Normal==result) result = DVPSHelper::putUint16Value(ditem, DCM_PixelRepresentation, 0); if (EC_Normal==result) result = DVPSHelper::putUint16Value(ditem, DCM_Rows, (Uint16)height); if (EC_Normal==result) result = DVPSHelper::putUint16Value(ditem, DCM_Columns, (Uint16)width); double aspectRatio = image.getWidthHeightRatio(); if ((aspectRatio != 1.0)&&(aspectRatio != 0)) { sprintf(str, "10000\\%ld", (long)(aspectRatio*10000.0)); if (EC_Normal==result) result = DVPSHelper::putStringValue(ditem, DCM_PixelAspectRatio, str); } if (transmitImagesIn12Bit) { if (EC_Normal==result) result = DVPSHelper::putUint16Value(ditem, DCM_BitsAllocated, 16); if (EC_Normal==result) result = DVPSHelper::putUint16Value(ditem, DCM_BitsStored, 12); if (EC_Normal==result) result = DVPSHelper::putUint16Value(ditem, DCM_HighBit, 11); if (EC_Normal==result) { pxDataVoid = image.getOutputData(12); pxData = new DcmPolymorphOBOW(DCM_PixelData); if (pxData && pxDataVoid) { result = pxData->putUint16Array((Uint16 *)pxDataVoid, (width*height)); if (EC_Normal==result) result = ditem->insert(pxData, OFTrue /*replaceOld*/); else delete pxData; } else result = EC_IllegalCall; } } else { if (EC_Normal==result) result = DVPSHelper::putUint16Value(ditem, DCM_BitsAllocated, 8); if (EC_Normal==result) result = DVPSHelper::putUint16Value(ditem, DCM_BitsStored, 8); if (EC_Normal==result) result = DVPSHelper::putUint16Value(ditem, DCM_HighBit, 7); if (EC_Normal==result) { pxDataVoid = image.getOutputData(8); pxData = new DcmPolymorphOBOW(DCM_PixelData); if (pxData && pxDataVoid) { result = pxData->putUint8Array((Uint8 *)pxDataVoid, (width*height)); if (EC_Normal==result) result = ditem->insert(pxData, OFTrue /*replaceOld*/); else delete pxData; } else result = EC_IllegalCall; } } if (result==EC_Normal) { dseq->insert(ditem); dataset.insert(dseq, OFTrue /*replaceOld*/); } else { // out of memory during creation of sequence contents. delete dseq; delete ditem; result = EC_MemoryExhausted; } } else { // could allocate item but not sequence. Bail out. delete ditem; result = EC_MemoryExhausted; } } else result = EC_MemoryExhausted; } if (EC_Normal == result) { OFCondition cond = printHandler.setRQ(UID_BasicGrayscaleImageBoxSOPClass, imageSopInstanceUID, &dataset, status, attributeListOut); if ((cond.bad())||((status!=0)&&((status & 0xf000)!=0xb000))) result = EC_IllegalCall; } delete attributeListOut; return result; } OFCondition DVPSStoredPrint::printSCUsetBasicAnnotationBox( DVPSPrintMessageHandler& printHandler, size_t idx) { DcmDataset dataset; DcmDataset *attributeListOut=NULL; Uint16 status=0; OFCondition result = EC_Normal; if (printHandler.printerSupportsAnnotationBox()) { const char *annotationSopInstanceUID = annotationContentList.getSOPInstanceUID(idx); if ((annotationSopInstanceUID==NULL)||(strlen(annotationSopInstanceUID)==0)) { DCMPSTAT_INFO("not enough Annotation Boxes created by printer, ignoring annotation."); return EC_Normal; } result = annotationContentList.prepareBasicAnnotationBox(idx, dataset); if (EC_Normal == result) { OFCondition cond = printHandler.setRQ(UID_BasicAnnotationBoxSOPClass, annotationSopInstanceUID, &dataset, status, attributeListOut); if ((cond.bad())||((status!=0)&&((status & 0xf000)!=0xb000))) result = EC_IllegalCall; } delete attributeListOut; } else { DCMPSTAT_INFO("printer does not support Annotation Box, ignoring annotation."); } return result; } const char *DVPSStoredPrint::getMaxDensity() { if (maxDensity.getLength() > 0) { Uint16 density=0; if (EC_Normal == maxDensity.getUint16(density,0)) { char buf[20]; sprintf(buf, "%hu", density); tempDensity = buf; return tempDensity.c_str(); } } return NULL; } const char *DVPSStoredPrint::getMinDensity() { if (minDensity.getLength() > 0) { Uint16 density=0; if (EC_Normal == minDensity.getUint16(density,0)) { char buf[20]; sprintf(buf, "%hu", density); tempDensity = buf; return tempDensity.c_str(); } } return NULL; } Uint16 DVPSStoredPrint::getMaxDensityValue() { if (maxDensity.getLength() > 0) { Uint16 density = 0; if (EC_Normal == maxDensity.getUint16(density, 0)) return density; } return 300; } Uint16 DVPSStoredPrint::getMinDensityValue() { if (minDensity.getLength() > 0) { Uint16 density = 0; if (EC_Normal == minDensity.getUint16(density, 0)) return density; } return 20; } OFCondition DVPSStoredPrint::setMaxDensity(const char *value) { OFCondition result = EC_Normal; if (value && (strlen(value)>0)) { Uint16 density = 0; if (1 == (sscanf(value, "%hu", &density))) { result = maxDensity.putUint16(density, 0); } else result = EC_IllegalCall; } else maxDensity.clear(); return result; } OFCondition DVPSStoredPrint::setMinDensity(const char *value) { OFCondition result = EC_Normal; if (value && (strlen(value)>0)) { Uint16 density = 0; if (1 == (sscanf(value, "%hu", &density))) { result = minDensity.putUint16(density, 0); } else result = EC_IllegalCall; } else minDensity.clear(); return result; } OFCondition DVPSStoredPrint::setSingleAnnotation( const char *displayformat, const char *text, Uint16 position) { OFCondition result = EC_IllegalCall; if (displayformat && text) { char newuid[70]; dcmGenerateUniqueIdentifier(newuid); deleteAnnotations(); result = annotationContentList.addAnnotationBox(newuid, text, position); if (EC_Normal==result) result = annotationDisplayFormatID.putString(displayformat); } return result; } void DVPSStoredPrint::deleteAnnotations() { annotationContentList.clear(); annotationDisplayFormatID.clear(); return; } OFBool DVPSStoredPrint::printSCPCreate( DVConfiguration& cfg, const char *cfgname, DcmDataset *rqDataset, T_DIMSE_Message& rsp, DcmDataset *& rspDataset, OFBool presentationLUTnegotiated, DVPSPresentationLUT_PList& globalPresentationLUTList, const char *filmSessionUID, DcmUniqueIdentifier& study, DcmUniqueIdentifier& psSeries, DcmUniqueIdentifier& imgSeries) { studyInstanceUID = study; seriesInstanceUID = psSeries; imageSeriesInstanceUID = imgSeries; OFBool result = OFTrue; DcmStack stack; filmBoxInstanceUID = rsp.msg.NCreateRSP.AffectedSOPInstanceUID; // filmOrientation if (result) { READ_FROM_PDATASET(DcmCodeString, filmOrientation) if (filmOrientation.getLength() == 0) filmOrientation.putString(DEFAULT_filmOrientation); else { OFString aString; filmOrientation.getOFString(aString, 0, OFTrue); if ((aString != "PORTRAIT")&&(aString != "LANDSCAPE")) { DCMPSTAT_INFO("cannot create Basic Film Box: illegal film orientation: '" << aString.c_str() << "'"); rsp.msg.NCreateRSP.DimseStatus = STATUS_N_InvalidAttributeValue; result = OFFalse; } } } // imageDisplayFormat if (result) { READ_FROM_PDATASET(DcmShortText, imageDisplayFormat) if (imageDisplayFormat.getLength() == 0) { DCMPSTAT_INFO("cannot create Basic Film Box: image display format missing or empty"); rsp.msg.NCreateRSP.DimseStatus = STATUS_N_MissingAttribute; result = OFFalse; } else { currentValuesValid = OFFalse; updateCache(); // evaluates image display format and computes number of columns and rows if (currentValuesValid) { // now we check whether this is a supported layout as per the config file Uint32 numPortraitDisplayFormats = cfg.getTargetPrinterNumberOfPortraitDisplayFormats(cfgname); if (numPortraitDisplayFormats > 0) { OFBool found = OFFalse; DVPSFilmOrientation orientation = getFilmOrientation(); Uint32 col=0; Uint32 row=0; for (Uint32 i=0; i 0) { OFString aString; cfg.getTargetPrinterFilmSizeID(cfgname, 0, aString); filmSizeID.putString(aString.c_str()); } else { filmSizeID.putString(DEFAULT_filmSizeID); } } else { // check whether we can accept the proposed medium type OFString theSizeID; OFString aString; OFBool found = OFFalse; filmSizeID.getOFString(theSizeID, 0, OFTrue); for (Uint32 i=0; i 0) { OFString aString; cfg.getTargetPrinterMagnificationType(cfgname, 0, aString); magnificationType.putString(aString.c_str()); } else { magnificationType.putString(DEFAULT_magnificationType); } } else { // check whether we can accept the proposed medium type OFString theMagnification; OFString aString; OFBool found = OFFalse; magnificationType.getOFString(theMagnification, 0, OFTrue); for (Uint32 i=0; i 0) { OFString aString; cfg.getTargetPrinterSmoothingType(cfgname, 0, aString); smoothingType.putString(aString.c_str()); } } else { // check whether we can accept the proposed smoothing type OFString theSmoothing; OFString aString; OFBool found = OFFalse; smoothingType.getOFString(theSmoothing, 0, OFTrue); for (Uint32 i=0; i 0) { OFString aString; cfg.getTargetPrinterBorderDensity(cfgname, 0, aString); borderDensity.putString(aString.c_str()); } } else { // check whether we can accept the proposed border density if (numBorderDensities == 0) // we don't support border density { DCMPSTAT_INFO("cannot create Basic Film Box: border density requested but not supported."); rsp.msg.NCreateRSP.DimseStatus = STATUS_N_NoSuchAttribute; result = OFFalse; } else { OFString theBorderDensity; OFString aString; OFBool found = OFFalse; OFBool supportsNumericDensity = OFFalse; unsigned long l; borderDensity.getOFString(theBorderDensity, 0, OFTrue); for (Uint32 i=0; i 0) { OFString aString; cfg.getTargetPrinterEmptyImageDensity(cfgname, 0, aString); emptyImageDensity.putString(aString.c_str()); } } else { // check whether we can accept the proposed empty image density if (numEmptyImageDensities == 0) // we don't support empty image density { DCMPSTAT_INFO("cannot create Basic Film Box: empty image density requested but not supported."); rsp.msg.NCreateRSP.DimseStatus = STATUS_N_NoSuchAttribute; result = OFFalse; } else { OFString theEIDensity; OFString aString; OFBool found = OFFalse; OFBool supportsNumericDensity = OFFalse; unsigned long l; emptyImageDensity.getOFString(theEIDensity, 0, OFTrue); for (Uint32 i=0; i 0) { OFString aString; cfg.getTargetPrinterMaxDensity(cfgname, 0, aString); if (EC_Normal != setMaxDensity(aString.c_str())) maxDensity.putUint16(DEFAULT_maxDensity, 0); } } // we don't check a max density set by the user (for now) } // minDensity if (result) { Uint32 numMinDensities = cfg.getTargetPrinterNumberOfMinDensities(cfgname); READ_FROM_PDATASET(DcmUnsignedShort, minDensity) if (minDensity.getLength() == 0) { if (numMinDensities > 0) { OFString aString; cfg.getTargetPrinterMinDensity(cfgname, 0, aString); if (EC_Normal != setMinDensity(aString.c_str())) minDensity.putUint16(DEFAULT_minDensity, 0); } } else { if (numMinDensities == 0) // we don't support min density { DCMPSTAT_INFO("cannot create Basic Film Box: min density requested but not supported."); rsp.msg.NCreateRSP.DimseStatus = STATUS_N_NoSuchAttribute; result = OFFalse; } // we don't check a min density set by the user (for now) } } // trim if (result) { READ_FROM_PDATASET(DcmCodeString, trim) if (trim.getLength() == 0) { if (cfg.getTargetPrinterSupportsTrim(cfgname)) trim.putString(DEFAULT_trim); } else { if (cfg.getTargetPrinterSupportsTrim(cfgname)) { OFString aString; trim.getOFString(aString, 0, OFTrue); if ((aString != "YES")&&(aString != "NO")) { DCMPSTAT_INFO("cannot create Basic Film Box: illegal trim: '" << aString.c_str() << "'"); rsp.msg.NCreateRSP.DimseStatus = STATUS_N_InvalidAttributeValue; result = OFFalse; } } else { DCMPSTAT_INFO("cannot create Basic Film Box: trim requested but not supported."); rsp.msg.NCreateRSP.DimseStatus = STATUS_N_NoSuchAttribute; result = OFFalse; } } } // configurationInformation if (result) { READ_FROM_PDATASET(DcmShortText, configurationInformation) if (configurationInformation.getLength() > 0) { // check whether we can accept the proposed configuration information Uint32 numConfigurationInformation = cfg.getTargetPrinterNumberOfConfigurationSettings(cfgname); if (numConfigurationInformation == 0) // we don't support configuration information { DCMPSTAT_INFO("cannot create Basic Film Box: configuration information requested but not supported."); rsp.msg.NCreateRSP.DimseStatus = STATUS_N_NoSuchAttribute; result = OFFalse; } else { OFString theConfiguration; OFBool found = OFFalse; configurationInformation.getOFString(theConfiguration, 0, OFTrue); for (Uint32 i=0; i 0) { OFString aString; cfg.getTargetPrinterResolutionID(cfgname, 0, aString); requestedResolutionID.putString(aString.c_str()); } } else { // check whether we can accept the requested resolution ID if (numResolutionIDs == 0) // we don't support requested resolution ID { DCMPSTAT_INFO("cannot create Basic Film Box: requested resolution ID present but not supported."); rsp.msg.NCreateRSP.DimseStatus = STATUS_N_NoSuchAttribute; result = OFFalse; } else { OFString theResolutionID; OFString aString; OFBool found = OFFalse; requestedResolutionID.getOFString(theResolutionID, 0, OFTrue); for (Uint32 i=0; isearch(DCM_ReferencedPresentationLUTSequence, stack, ESM_fromHere, OFFalse))) { DcmSequenceOfItems *seq=(DcmSequenceOfItems *)stack.top(); if (seq->card() ==1) { OFString aString; DcmItem *item = seq->getItem(0); stack.clear(); READ_FROM_DATASET2(DcmUniqueIdentifier, referencedPresentationLUTInstanceUID) if (referencedPresentationLUTInstanceUID.getLength() > 0) { referencedPresentationLUTInstanceUID.getOFString(aString,0); DVPSPresentationLUT *currentPLUT = globalPresentationLUTList.findPresentationLUT(aString.c_str()); if (NULL == currentPLUT) { DCMPSTAT_INFO("cannot create Basic Film Box: presentation LUT reference cannot be resolved"); rsp.msg.NCreateRSP.DimseStatus = STATUS_N_InvalidAttributeValue; result = OFFalse; } else { // check referenced SOP class UID DcmUniqueIdentifier refClassUID(DCM_ReferencedSOPClassUID); stack.clear(); READ_FROM_DATASET2(DcmUniqueIdentifier, refClassUID) if (refClassUID.getLength() > 0) { aString.clear(); refClassUID.getOFString(aString,0, OFTrue); if (aString != UID_PresentationLUTSOPClass) { DCMPSTAT_INFO("cannot create Basic Film Box: referenced SOP class UID in referenced presentation LUT sequence incorrect:" << DcmObject::PrintHelper(*stack.top(), DCMTypes::PF_shortenLongTagValues)); rsp.msg.NCreateRSP.DimseStatus = STATUS_N_InvalidAttributeValue; result = OFFalse; } else { // referenced presentation LUT sequence is OK // synchronize presentationLUTInstanceUID and referencedPresentationLUTInstanceUID presentationLUTInstanceUID.clear(); referencedPresentationLUTInstanceUID.getOFString(presentationLUTInstanceUID,0); referencedPresentationLUTAlignment = currentPLUT->getAlignment(); } } else { DCMPSTAT_INFO("cannot create Basic Film Box: no referenced SOP class UID in referenced presentation LUT sequence"); rsp.msg.NCreateRSP.DimseStatus = STATUS_N_InvalidAttributeValue; result = OFFalse; } } } else { DCMPSTAT_INFO("cannot create Basic Film Box: no referenced SOP instance UID in referenced presentation LUT sequence"); rsp.msg.NCreateRSP.DimseStatus = STATUS_N_InvalidAttributeValue; result = OFFalse; } } else { DCMPSTAT_INFO("cannot create Basic Film Box: referenced presentation LUT sequence number of items != 1"); rsp.msg.NCreateRSP.DimseStatus = STATUS_N_InvalidAttributeValue; result = OFFalse; } } } } /* if presentationLUTnegotiated */ DcmSequenceOfItems *refFilmSessionSequence = NULL; // referenced film session sequence if (result) { stack.clear(); if (rqDataset && (EC_Normal == rqDataset->search(DCM_ReferencedFilmSessionSequence, stack, ESM_fromHere, OFFalse))) { DcmUniqueIdentifier classUID(DCM_ReferencedSOPClassUID); DcmUniqueIdentifier instanceUID(DCM_ReferencedSOPInstanceUID); refFilmSessionSequence =(DcmSequenceOfItems *)stack.top(); if (refFilmSessionSequence->card() ==1) { OFString aString; DcmItem *item = refFilmSessionSequence->getItem(0); stack.clear(); READ_FROM_DATASET2(DcmUniqueIdentifier, instanceUID) if (instanceUID.getLength() > 0) { instanceUID.getOFString(aString,0); if (aString != filmSessionUID) { DCMPSTAT_INFO("cannot create Basic Film Box: referenced film session instance UID incorrect"); rsp.msg.NCreateRSP.DimseStatus = STATUS_N_InvalidAttributeValue; result = OFFalse; } else { // check referenced SOP class UID stack.clear(); READ_FROM_DATASET2(DcmUniqueIdentifier, classUID) if (classUID.getLength() > 0) { aString.clear(); classUID.getOFString(aString,0, OFTrue); if (aString != UID_BasicFilmSessionSOPClass) { DCMPSTAT_INFO("cannot create Basic Film Box: referenced SOP class UID in referenced film session sequence incorrect:" << DcmObject::PrintHelper(*stack.top(), DCMTypes::PF_shortenLongTagValues)); rsp.msg.NCreateRSP.DimseStatus = STATUS_N_InvalidAttributeValue; result = OFFalse; } } else { DCMPSTAT_INFO("cannot create Basic Film Box: no referenced SOP class UID in referenced film session sequence"); rsp.msg.NCreateRSP.DimseStatus = STATUS_N_InvalidAttributeValue; result = OFFalse; } } } else { DCMPSTAT_INFO("cannot create Basic Film Box: no referenced SOP instance UID in referenced film session sequence"); rsp.msg.NCreateRSP.DimseStatus = STATUS_N_InvalidAttributeValue; result = OFFalse; } } else { DCMPSTAT_INFO("cannot create Basic Film Box: referenced film session sequence number of items != 1"); rsp.msg.NCreateRSP.DimseStatus = STATUS_N_InvalidAttributeValue; result = OFFalse; } } else { DCMPSTAT_INFO("cannot create Basic Film Box: referenced film session sequence absent"); rsp.msg.NCreateRSP.DimseStatus = STATUS_N_MissingAttribute; result = OFFalse; } } // browse through rqDataset and check for unsupported attributes if (result && rqDataset) { OFBool intoSub = OFTrue; stack.clear(); while (EC_Normal == rqDataset->nextObject(stack, intoSub)) { intoSub = OFFalse; const DcmTagKey& currentTag = (stack.top())->getTag(); if (currentTag.getElement() == 0x0000) /* group length */ ; else if (currentTag == DCM_ImageDisplayFormat) /* OK */ ; else if (currentTag == DCM_FilmOrientation) /* OK */ ; else if (currentTag == DCM_FilmSizeID) /* OK */ ; else if (currentTag == DCM_MagnificationType) /* OK */ ; else if (currentTag == DCM_SmoothingType) /* OK */ ; else if (currentTag == DCM_BorderDensity) /* OK */ ; else if (currentTag == DCM_EmptyImageDensity) /* OK */ ; else if (currentTag == DCM_MinDensity) /* OK */ ; else if (currentTag == DCM_MaxDensity) /* OK */ ; else if (currentTag == DCM_Trim) /* OK */ ; else if (currentTag == DCM_ConfigurationInformation) /* OK */ ; else if (currentTag == DCM_RequestedResolutionID) /* OK */ ; else if (currentTag == DCM_ReferencedFilmSessionSequence) /* OK */ ; else if (currentTag == DCM_Illumination) { if (! presentationLUTnegotiated) { DCMPSTAT_INFO("cannot create Basic Film Box: illumination received:\n" << DcmObject::PrintHelper(*stack.top(), DCMTypes::PF_shortenLongTagValues)); rsp.msg.NCreateRSP.DimseStatus = STATUS_N_NoSuchAttribute; result = OFFalse; } } else if (currentTag == DCM_ReflectedAmbientLight) { if (! presentationLUTnegotiated) { DCMPSTAT_INFO("cannot create Basic Film Box: reflected ambient light received:\n" << DcmObject::PrintHelper(*stack.top(), DCMTypes::PF_shortenLongTagValues)); rsp.msg.NCreateRSP.DimseStatus = STATUS_N_NoSuchAttribute; result = OFFalse; } } else if (currentTag == DCM_ReferencedPresentationLUTSequence) { if (! presentationLUTnegotiated) { DCMPSTAT_INFO("cannot create Basic Film Box: referenced presentation LUT sequence received:\n" << DcmObject::PrintHelper(*stack.top(), DCMTypes::PF_shortenLongTagValues)); rsp.msg.NCreateRSP.DimseStatus = STATUS_N_NoSuchAttribute; result = OFFalse; } } else { DCMPSTAT_INFO("cannot create Basic Film Box: unsupported attribute received:\n" << DcmObject::PrintHelper(*stack.top(), DCMTypes::PF_shortenLongTagValues)); rsp.msg.NCreateRSP.DimseStatus = STATUS_N_NoSuchAttribute; result = OFFalse; } } } // if n-create was successful, create response dataset if (result) { rspDataset = new DcmDataset; if (rspDataset) { OFCondition writeresult = EC_Normal; DcmElement *delem = NULL; if (refFilmSessionSequence) // should never be NULL if we get this far { DcmSequenceOfItems *newRefFilmSessionSequence = new DcmSequenceOfItems(*refFilmSessionSequence); if (newRefFilmSessionSequence) rspDataset->insert(newRefFilmSessionSequence, OFTrue /*replaceOld*/); else writeresult = EC_MemoryExhausted; } ADD_TO_PDATASET(DcmShortText, imageDisplayFormat) ADD_TO_PDATASET(DcmCodeString, filmOrientation) ADD_TO_PDATASET(DcmCodeString, filmSizeID) ADD_TO_PDATASET(DcmCodeString, magnificationType) ADD_TO_PDATASET(DcmUnsignedShort, maxDensity) ADD_TO_PDATASET(DcmShortText, configurationInformation) if (smoothingType.getLength() > 0) { ADD_TO_PDATASET(DcmCodeString, smoothingType) } if (borderDensity.getLength() > 0) { ADD_TO_PDATASET(DcmCodeString, borderDensity) } if (emptyImageDensity.getLength() > 0) { ADD_TO_PDATASET(DcmCodeString, emptyImageDensity) } if (minDensity.getLength() > 0) { ADD_TO_PDATASET(DcmUnsignedShort, minDensity) } if (trim.getLength() > 0) { ADD_TO_PDATASET(DcmCodeString, trim) } if (requestedResolutionID.getLength() > 0) { ADD_TO_PDATASET(DcmCodeString, requestedResolutionID) } if (presentationLUTnegotiated) { if (referencedPresentationLUTInstanceUID.getLength() == 0) { referencedPresentationLUTInstanceUID.putString(WELLKNOWN_IDENTITY_PLUT_UID); if (NULL == globalPresentationLUTList.findPresentationLUT(WELLKNOWN_IDENTITY_PLUT_UID)) { DVPSPresentationLUT *wellknownlut = new DVPSPresentationLUT(); if (wellknownlut) { writeresult = wellknownlut->setType(DVPSP_identity); if (EC_Normal == writeresult) writeresult = wellknownlut->setSOPInstanceUID(WELLKNOWN_IDENTITY_PLUT_UID); if (EC_Normal == writeresult) globalPresentationLUTList.insert(wellknownlut); } else writeresult = EC_MemoryExhausted; } } if (EC_Normal == writeresult) writeresult = addPresentationLUTReference(*rspDataset); } // create image boxes and referenced image box sequence if (imageBoxContentList.printSCPCreate(currentNumRows * currentNumCols, studyInstanceUID, imageSeriesInstanceUID, cfg.getNetworkAETitle())) { if (EC_Normal == writeresult) writeresult = imageBoxContentList.writeReferencedImageBoxSQ(*rspDataset); } else writeresult = EC_MemoryExhausted; if (EC_Normal == writeresult) { rsp.msg.NCreateRSP.DataSetType = DIMSE_DATASET_PRESENT; } else { delete rspDataset; rspDataset = NULL; rsp.msg.NCreateRSP.DimseStatus = STATUS_N_ProcessingFailure; result = OFFalse; } } else { rsp.msg.NCreateRSP.DimseStatus = STATUS_N_ProcessingFailure; result = OFFalse; } } return result; } OFBool DVPSStoredPrint::printSCPSet( DVConfiguration& cfg, const char *cfgname, DcmDataset *rqDataset, T_DIMSE_Message& rsp, DcmDataset *& rspDataset, OFBool presentationLUTnegotiated, DVPSPresentationLUT_PList& globalPresentationLUTList) { OFBool result = OFTrue; DcmStack stack; OFCondition writeresult = EC_Normal; DcmElement *delem = NULL; rspDataset = new DcmDataset; if ((rqDataset == NULL)||(rspDataset == NULL)) { rsp.msg.NSetRSP.DimseStatus = STATUS_N_ProcessingFailure; result = OFFalse; } // magnificationType if (result) { stack.clear(); if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)magnificationType.getTag(), stack, ESM_fromHere, OFFalse))) { magnificationType = *((DcmCodeString *)(stack.top())); Uint32 numMagnifications = cfg.getTargetPrinterNumberOfMagnificationTypes(cfgname); OFString theMagnification; OFString aString; OFBool found = OFFalse; magnificationType.getOFString(theMagnification, 0, OFTrue); for (Uint32 i=0; isearch((DcmTagKey &)smoothingType.getTag(), stack, ESM_fromHere, OFFalse))) { smoothingType = *((DcmCodeString *)(stack.top())); Uint32 numSmoothings = cfg.getTargetPrinterNumberOfSmoothingTypes(cfgname); OFString theSmoothing; OFString aString; OFBool found = OFFalse; smoothingType.getOFString(theSmoothing, 0, OFTrue); for (Uint32 i=0; isearch((DcmTagKey &)borderDensity.getTag(), stack, ESM_fromHere, OFFalse))) { borderDensity = *((DcmCodeString *)(stack.top())); Uint32 numBorderDensities = cfg.getTargetPrinterNumberOfBorderDensities(cfgname); if (numBorderDensities == 0) // we don't support border density { DCMPSTAT_INFO("cannot update Basic Film Box: border density requested but not supported."); rsp.msg.NSetRSP.DimseStatus = STATUS_N_NoSuchAttribute; result = OFFalse; } else { OFString theBorderDensity; OFString aString; OFBool found = OFFalse; OFBool supportsNumericDensity = OFFalse; unsigned long l; borderDensity.getOFString(theBorderDensity, 0, OFTrue); for (Uint32 i=0; isearch((DcmTagKey &)emptyImageDensity.getTag(), stack, ESM_fromHere, OFFalse))) { emptyImageDensity = *((DcmCodeString *)(stack.top())); Uint32 numEmptyImageDensities = cfg.getTargetPrinterNumberOfEmptyImageDensities(cfgname); if (numEmptyImageDensities == 0) // we don't support empty image density { DCMPSTAT_INFO("cannot update Basic Film Box: empty image density requested but not supported."); rsp.msg.NSetRSP.DimseStatus = STATUS_N_NoSuchAttribute; result = OFFalse; } else { OFString theEIDensity; OFString aString; OFBool found = OFFalse; OFBool supportsNumericDensity = OFFalse; unsigned long l; emptyImageDensity.getOFString(theEIDensity, 0, OFTrue); for (Uint32 i=0; isearch((DcmTagKey &)maxDensity.getTag(), stack, ESM_fromHere, OFFalse))) { maxDensity = *((DcmUnsignedShort *)(stack.top())); // we don't check a max density set by the user (for now) ADD_TO_PDATASET(DcmUnsignedShort, maxDensity) } } // minDensity if (result) { stack.clear(); if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)minDensity.getTag(), stack, ESM_fromHere, OFFalse))) { minDensity = *((DcmUnsignedShort *)(stack.top())); Uint32 numMinDensities = cfg.getTargetPrinterNumberOfMinDensities(cfgname); if (numMinDensities == 0) // we don't support min density { DCMPSTAT_INFO("cannot update Basic Film Box: min density requested but not supported."); rsp.msg.NSetRSP.DimseStatus = STATUS_N_NoSuchAttribute; result = OFFalse; } else { // we don't check a min density set by the user (for now) ADD_TO_PDATASET(DcmUnsignedShort, minDensity) } } } // trim if (result) { stack.clear(); if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)trim.getTag(), stack, ESM_fromHere, OFFalse))) { trim = *((DcmCodeString *)(stack.top())); if (cfg.getTargetPrinterSupportsTrim(cfgname)) { OFString aString; trim.getOFString(aString, 0, OFTrue); if ((aString != "YES")&&(aString != "NO")) { DCMPSTAT_INFO("cannot update Basic Film Box: illegal trim: '" << aString.c_str() << "'"); rsp.msg.NSetRSP.DimseStatus = STATUS_N_InvalidAttributeValue; result = OFFalse; } else { ADD_TO_PDATASET(DcmCodeString, trim) } } else { DCMPSTAT_INFO("cannot update Basic Film Box: trim requested but not supported."); rsp.msg.NSetRSP.DimseStatus = STATUS_N_NoSuchAttribute; result = OFFalse; } } } // configurationInformation if (result) { stack.clear(); if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)configurationInformation.getTag(), stack, ESM_fromHere, OFFalse))) { configurationInformation = *((DcmShortText *)(stack.top())); Uint32 numConfigurationInformation = cfg.getTargetPrinterNumberOfConfigurationSettings(cfgname); if (numConfigurationInformation == 0) // we don't support configuration information { DCMPSTAT_INFO("cannot update Basic Film Box: configuration information requested but not supported."); rsp.msg.NSetRSP.DimseStatus = STATUS_N_NoSuchAttribute; result = OFFalse; } else { OFString theConfiguration; OFBool found = OFFalse; configurationInformation.getOFString(theConfiguration, 0, OFTrue); for (Uint32 i=0; isearch((DcmTagKey &)illumination.getTag(), stack, ESM_fromHere, OFFalse))) { illumination = *((DcmUnsignedShort *)(stack.top())); // we don't check illumination set by the user (for now) ADD_TO_PDATASET(DcmUnsignedShort, illumination) } } // reflectedAmbientLight if (result) { stack.clear(); if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)reflectedAmbientLight.getTag(), stack, ESM_fromHere, OFFalse))) { reflectedAmbientLight = *((DcmUnsignedShort *)(stack.top())); // we don't check reflected ambient light set by the user (for now) ADD_TO_PDATASET(DcmUnsignedShort, reflectedAmbientLight) } } // referenced presentation LUT sequence if (result) { stack.clear(); if (rqDataset && (EC_Normal == rqDataset->search(DCM_ReferencedPresentationLUTSequence, stack, ESM_fromHere, OFFalse))) { DcmSequenceOfItems *seq=(DcmSequenceOfItems *)stack.top(); if (seq->card() ==1) { OFString aString; DcmItem *item = seq->getItem(0); stack.clear(); READ_FROM_DATASET2(DcmUniqueIdentifier, referencedPresentationLUTInstanceUID) if (referencedPresentationLUTInstanceUID.getLength() > 0) { referencedPresentationLUTInstanceUID.getOFString(aString,0); DVPSPresentationLUT *currentPLUT = globalPresentationLUTList.findPresentationLUT(aString.c_str()); if (NULL == currentPLUT) { DCMPSTAT_INFO("cannot update Basic Film Box: presentation LUT reference cannot be resolved"); rsp.msg.NSetRSP.DimseStatus = STATUS_N_InvalidAttributeValue; result = OFFalse; } else { // check referenced SOP class UID DcmUniqueIdentifier refClassUID(DCM_ReferencedSOPClassUID); stack.clear(); READ_FROM_DATASET2(DcmUniqueIdentifier, refClassUID) if (refClassUID.getLength() > 0) { aString.clear(); refClassUID.getOFString(aString,0, OFTrue); if (aString != UID_PresentationLUTSOPClass) { DCMPSTAT_INFO("cannot update Basic Film Box: referenced SOP class UID in referenced presentation LUT sequence incorrect:\n" << DcmObject::PrintHelper(*stack.top(), DCMTypes::PF_shortenLongTagValues)); rsp.msg.NSetRSP.DimseStatus = STATUS_N_InvalidAttributeValue; result = OFFalse; } else { referencedPresentationLUTAlignment = currentPLUT->getAlignment(); if ((cfg.getTargetPrinterPresentationLUTMatchRequired(cfgname)) && (! imageBoxContentList.matchesPresentationLUT(referencedPresentationLUTAlignment))) { DCMPSTAT_INFO("cannot update Basic Film Box: referenced presentation LUT number of entries does not match image bit depth."); rsp.msg.NSetRSP.DimseStatus = STATUS_N_InvalidAttributeValue; result = OFFalse; } else { // referenced presentation LUT sequence is OK // synchronize presentationLUTInstanceUID and referencedPresentationLUTInstanceUID presentationLUTInstanceUID.clear(); referencedPresentationLUTInstanceUID.getOFString(presentationLUTInstanceUID,0); DcmSequenceOfItems *newSeq = new DcmSequenceOfItems(*seq); if (newSeq) rspDataset->insert(newSeq, OFTrue /*replaceOld*/); else { writeresult = EC_MemoryExhausted; } } } } else { DCMPSTAT_INFO("cannot update Basic Film Box: no referenced SOP class UID in referenced presentation LUT sequence"); rsp.msg.NSetRSP.DimseStatus = STATUS_N_InvalidAttributeValue; result = OFFalse; } } } else { DCMPSTAT_INFO("cannot update Basic Film Box: no referenced SOP instance UID in referenced presentation LUT sequence"); rsp.msg.NSetRSP.DimseStatus = STATUS_N_InvalidAttributeValue; result = OFFalse; } } else { DCMPSTAT_INFO("cannot update Basic Film Box: referenced presentation LUT sequence number of items != 1"); rsp.msg.NSetRSP.DimseStatus = STATUS_N_InvalidAttributeValue; result = OFFalse; } } } } /* if presentationLUTnegotiated */ // browse through rqDataset and check for unsupported attributes if (result && rqDataset) { OFBool intoSub = OFTrue; stack.clear(); while (EC_Normal == rqDataset->nextObject(stack, intoSub)) { intoSub = OFFalse; const DcmTagKey& currentTag = (stack.top())->getTag(); if (currentTag.getElement() == 0x0000) /* group length */ ; else if (currentTag == DCM_MagnificationType) /* OK */ ; else if (currentTag == DCM_SmoothingType) /* OK */ ; else if (currentTag == DCM_BorderDensity) /* OK */ ; else if (currentTag == DCM_EmptyImageDensity) /* OK */ ; else if (currentTag == DCM_MinDensity) /* OK */ ; else if (currentTag == DCM_MaxDensity) /* OK */ ; else if (currentTag == DCM_Trim) /* OK */ ; else if (currentTag == DCM_ConfigurationInformation) /* OK */ ; else if (currentTag == DCM_ReferencedFilmSessionSequence) /* OK */ ; else if (currentTag == DCM_Illumination) { if (! presentationLUTnegotiated) { DCMPSTAT_INFO("cannot update Basic Film Box: illumination received:\n" << DcmObject::PrintHelper(*stack.top(), DCMTypes::PF_shortenLongTagValues)); rsp.msg.NSetRSP.DimseStatus = STATUS_N_NoSuchAttribute; result = OFFalse; } } else if (currentTag == DCM_ReflectedAmbientLight) { if (! presentationLUTnegotiated) { DCMPSTAT_INFO("cannot update Basic Film Box: reflected ambient light received:\n" << DcmObject::PrintHelper(*stack.top(), DCMTypes::PF_shortenLongTagValues)); rsp.msg.NSetRSP.DimseStatus = STATUS_N_NoSuchAttribute; result = OFFalse; } } else if (currentTag == DCM_ReferencedPresentationLUTSequence) { if (! presentationLUTnegotiated) { DCMPSTAT_INFO("cannot update Basic Film Box: referenced presentation LUT sequence received:\n" << DcmObject::PrintHelper(*stack.top(), DCMTypes::PF_shortenLongTagValues)); rsp.msg.NSetRSP.DimseStatus = STATUS_N_NoSuchAttribute; result = OFFalse; } } else { DCMPSTAT_INFO("cannot update Basic Film Box: unsupported attribute received:" << DcmObject::PrintHelper(*stack.top(), DCMTypes::PF_shortenLongTagValues)); rsp.msg.NSetRSP.DimseStatus = STATUS_N_NoSuchAttribute; result = OFFalse; } } } // if n-set was successful, send back response dataset if (result && (EC_Normal == writeresult)) { rsp.msg.NSetRSP.DataSetType = DIMSE_DATASET_PRESENT; } else { delete rspDataset; rspDataset = NULL; if (rsp.msg.NSetRSP.DimseStatus == 0) rsp.msg.NSetRSP.DimseStatus = STATUS_N_ProcessingFailure; result = OFFalse; } return result; } OFBool DVPSStoredPrint::usesPresentationLUT(const char *c) { char *plut = NULL; if (c && (EC_Normal == referencedPresentationLUTInstanceUID.getString(plut)) && plut) { OFString aString(plut); if (aString == c) return OFTrue; } return OFFalse; } void DVPSStoredPrint::updatePresentationLUTList(DVPSPresentationLUT_PList& globalPresentationLUTList) { presentationLUTList.clear(); if (referencedPresentationLUTInstanceUID.getLength() > 0) { OFString aString; referencedPresentationLUTInstanceUID.getOFString(aString,0); DVPSPresentationLUT *currentPLUT = globalPresentationLUTList.findPresentationLUT(aString.c_str()); if (currentPLUT) presentationLUTList.insert(currentPLUT->clone()); else { referencedPresentationLUTInstanceUID.clear(); presentationLUTInstanceUID.clear(); } } } void DVPSStoredPrint::overridePresentationLUTSettings( DcmUnsignedShort& newIllumination, DcmUnsignedShort& newReflectedAmbientLight, DcmUniqueIdentifier& newReferencedPLUT, DVPSPrintPresentationLUTAlignment newAlignment) { illumination = newIllumination; reflectedAmbientLight = newReflectedAmbientLight; referencedPresentationLUTInstanceUID = newReferencedPLUT; presentationLUTInstanceUID.clear(); referencedPresentationLUTInstanceUID.getOFString(presentationLUTInstanceUID,0); referencedPresentationLUTAlignment = newAlignment; } /* * $Log: dvpssp.cc,v $ * Revision 1.59 2010-10-14 13:14:33 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.58 2010-09-24 13:32:58 joergr * Compared names of SOP Class UIDs with 2009 edition of the DICOM standard. The * resulting name changes are mainly caused by the fact that the corresponding * SOP Class is now retired. * * Revision 1.57 2010-08-09 13:21:57 joergr * Updated data dictionary to 2009 edition of the DICOM standard. From now on, * the official "keyword" is used for the attribute name which results in a * number of minor changes (e.g. "PatientsName" is now called "PatientName"). * * Revision 1.56 2009-12-15 14:39:37 uli * Fixed an unsafe usage of OFString. * * Revision 1.55 2009-11-24 14:12:59 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.54 2008-04-30 12:38:43 meichel * Fixed compile errors due to changes in attribute tag names * * Revision 1.53 2006/08/15 16:57:02 meichel * Updated the code in module dcmpstat to correctly compile when * all standard C++ classes remain in namespace std. * * Revision 1.52 2005/12/08 15:46:47 meichel * Changed include path schema for all DCMTK header files * * Revision 1.51 2003/06/04 12:30:28 meichel * Added various includes needed by MSVC5 with STL * * Revision 1.50 2003/04/14 14:28:05 meichel * Added explicit typecasts in calls to pow(). Needed by Visual C++ .NET 2003. * * Revision 1.49 2003/03/12 17:34:22 meichel * Updated DcmObject::print() flags * * Revision 1.48 2002/11/27 15:48:13 meichel * Adapted module dcmpstat to use of new header file ofstdinc.h * * Revision 1.47 2002/01/08 10:39:56 joergr * Corrected spelling of function dcmGenerateUniqueIdentifier(). * Changed prefix of UIDs created for series and studies (now using constants * SITE_SERIES_UID_ROOT and SITE_STUDY_UID_ROOT which are supposed to be used * in these cases). * * Revision 1.46 2001/11/28 13:57:01 joergr * Check return value of DcmItem::insert() statements where appropriate to * avoid memory leaks when insert procedure fails. * * Revision 1.45 2001/10/12 13:46:56 meichel * Adapted dcmpstat to OFCondition based dcmnet module (supports strict mode). * * Revision 1.44 2001/09/28 13:50:54 joergr * Changed formatting. * * Revision 1.43 2001/09/26 15:36:32 meichel * Adapted dcmpstat to class OFCondition * * Revision 1.42 2001/06/07 14:31:35 joergr * Removed unused variable (reported by gcc 2.5.8 on NeXTSTEP). * * Revision 1.41 2001/06/01 15:50:37 meichel * Updated copyright header * * Revision 1.40 2001/05/25 10:07:58 meichel * Corrected some DIMSE error status codes for Print SCP * * Revision 1.39 2000/09/06 08:55:39 meichel * Updated Print SCP to accept and silently ignore group length attributes. * * Revision 1.38 2000/07/18 16:06:27 joergr * Moved method convertODtoLum/PValue from class DVInterface to DVPSStoredPrint * and corrected implementation. * Changed behaviour of methods getMin/MaxDensityValue (return default value if * attribute empty/absent). * * Revision 1.37 2000/07/12 16:39:42 meichel * Print SCP now writes PrinterCharacteristicsSequence when saving Stored Prints. * * Revision 1.36 2000/07/07 14:15:15 joergr * Added support for LIN OD presentation LUT shape. * * Revision 1.35 2000/07/04 16:06:48 joergr * Added support for overriding the presentation LUT settings made for the * image boxes. * * Revision 1.34 2000/06/20 14:50:09 meichel * Added monochrome1 printing mode. * * Revision 1.33 2000/06/19 16:29:08 meichel * Added options for session printing and LIN OD to print tools, fixed * pixel aspect ratio related bug. * * Revision 1.32 2000/06/08 10:44:37 meichel * Implemented Referenced Presentation LUT Sequence on Basic Film Session level. * Empty film boxes (pages) are not written to file anymore. * * Revision 1.31 2000/06/07 14:27:50 joergr * Added missing transformations (polarity, GSDF, presentation LUT, aspect * ratio) to print preview rendering. * * Revision 1.30 2000/06/07 13:17:08 meichel * now using DIMSE status constants and log facilities defined in dcmnet * * Revision 1.29 2000/06/02 16:01:06 meichel * Adapted all dcmpstat classes to use OFConsole for log and error output * * Revision 1.28 2000/06/02 12:46:43 joergr * Corrected handling of optional parameters in method newPrinter(). * * Revision 1.27 2000/05/31 12:58:16 meichel * Added initial Print SCP support * * Revision 1.26 2000/05/31 07:56:22 joergr * Added support for Stored Print attributes Originator and Destination * application entity title. * * Revision 1.25 2000/05/30 13:57:51 joergr * Added methods to set, get and store the printer name in the stored print * object (PrinterCharacteristicsSequence). * * Revision 1.24 2000/03/08 16:29:10 meichel * Updated copyright header. * * Revision 1.23 2000/03/07 16:24:01 joergr * Added explicit type casts to make Sun CC 2.0.1 happy. * * Revision 1.22 2000/03/03 14:14:05 meichel * Implemented library support for redirecting error messages into memory * instead of printing them to stdout/stderr for GUI applications. * * Revision 1.21 2000/02/29 12:16:20 meichel * Fixed bug in dcmpstat library that caused Monochrome1 images * to be printed inverse if a Presentation LUT was applied. * * Revision 1.20 1999/11/19 10:58:40 meichel * Fixed bug in dcmpstat module that prevented printing of images * * Revision 1.19 1999/10/19 14:48:26 meichel * added support for the Basic Annotation Box SOP Class * as well as access methods for Max Density and Min Density. * * Revision 1.18 1999/10/13 14:11:14 meichel * Fixed bug in routine that renders P-LUTs into a print bitmap * before sending an image to the printer * * Revision 1.17 1999/10/07 17:22:01 meichel * Reworked management of Presentation LUTs in order to create tighter * coupling between Softcopy and Print. * * Revision 1.16 1999/09/24 15:24:34 meichel * Added support for CP 173 (Presentation LUT clarifications) * * Revision 1.15 1999/09/17 14:33:54 meichel * Completed print spool functionality including Supplement 22 support * * Revision 1.14 1999/09/15 17:43:36 meichel * Implemented print job dispatcher code for dcmpstat, adapted dcmprtsv * and dcmpsprt applications. * * Revision 1.13 1999/09/13 15:19:16 meichel * Added implementations for a number of further print API methods. * * Revision 1.12 1999/09/10 12:46:57 meichel * Added implementations for a number of print API methods. * * Revision 1.11 1999/09/10 07:32:43 thiel * Added Presentation LUT Shape LIN OD * * Revision 1.10 1999/09/09 14:57:50 thiel * Added methods for print spooler * * Revision 1.9 1999/09/09 12:20:53 meichel * Added print API method declarations and implementations (empty for now). * * Revision 1.8 1999/09/08 16:46:32 meichel * Added print API method declarations * * Revision 1.7 1999/09/01 16:15:09 meichel * Added support for requested image size to print routines * * Revision 1.6 1999/08/31 16:54:47 meichel * Added new sample application that allows to create simple print jobs. * * Revision 1.5 1999/08/31 14:09:28 meichel * Added get/set methods for stored print attributes * * Revision 1.4 1999/08/27 15:57:50 meichel * Added methods for saving hardcopy images and stored print objects * either in file or in the local database. * * Revision 1.3 1999/08/26 09:29:49 thiel * Extensions for the usage of the StoredPrint * * Revision 1.2 1999/08/25 16:56:14 joergr * Added '#include ' to make MSVC happy. * * Revision 1.1 1999/07/30 13:34:59 meichel * Added new classes managing Stored Print objects * * */ dcmtk-3.6.0/dcmpstat/libsrc/dvpsvwl.cc0000644000310500011400000001121611455601071017151 0ustar joergrdicom3/* * * Copyright (C) 1998-2010, 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: DVPSVOIWindow_PList * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:14:33 $ * CVS/RCS Revision: $Revision: 1.15 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcdeftag.h" #include "dcmtk/dcmdata/dcvrlo.h" #include "dcmtk/dcmdata/dcvrds.h" #include "dcmtk/dcmpstat/dvpsvwl.h" #include "dcmtk/dcmpstat/dvpsvw.h" /* for DVPSVOIWindow */ #include "dcmtk/dcmpstat/dvpsdef.h" /* for constants and macros */ DVPSVOIWindow_PList::DVPSVOIWindow_PList() : list_() { } DVPSVOIWindow_PList::DVPSVOIWindow_PList(const DVPSVOIWindow_PList &arg) : list_() { OFListConstIterator(DVPSVOIWindow *) first = arg.list_.begin(); OFListConstIterator(DVPSVOIWindow *) last = arg.list_.end(); while (first != last) { list_.push_back((*first)->clone()); ++first; } } DVPSVOIWindow_PList::~DVPSVOIWindow_PList() { clear(); } void DVPSVOIWindow_PList::clear() { OFListIterator(DVPSVOIWindow *) first = list_.begin(); OFListIterator(DVPSVOIWindow *) last = list_.end(); while (first != last) { delete (*first); first = list_.erase(first); } } OFCondition DVPSVOIWindow_PList::read(DcmItem &dset) { OFCondition result = EC_Normal; DcmStack stack; DVPSVOIWindow *newObject = NULL; DcmDecimalString windowCenter(DCM_WindowCenter); DcmDecimalString windowWidth(DCM_WindowWidth); DcmLongString windowCenterWidthExplanation(DCM_WindowCenterWidthExplanation); READ_FROM_DATASET(DcmDecimalString, windowCenter) READ_FROM_DATASET(DcmDecimalString, windowWidth) READ_FROM_DATASET(DcmLongString, windowCenterWidthExplanation) DcmLongString *expl=NULL; if (windowCenterWidthExplanation.getVM() > 0) expl = &windowCenterWidthExplanation; size_t vm = (size_t)windowCenter.getVM(); for (size_t i=0; iread(i, windowCenter, windowWidth, expl)) list_.push_back(newObject); else delete(newObject); } else result = EC_MemoryExhausted; } return result; } DVPSVOIWindow *DVPSVOIWindow_PList::getVOIWindow(size_t idx) { OFListIterator(DVPSVOIWindow *) first = list_.begin(); OFListIterator(DVPSVOIWindow *) last = list_.end(); while (first != last) { if (idx==0) return *first; idx--; ++first; } return NULL; } /* * $Log: dvpsvwl.cc,v $ * Revision 1.15 2010-10-14 13:14:33 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.14 2009-11-24 14:12:59 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.13 2009-09-30 10:42:39 uli * Make dcmpstat's include headers self-sufficient by including all * needed headers directly and stop using dctk.h * * Revision 1.12 2005-12-08 15:46:58 meichel * Changed include path schema for all DCMTK header files * * Revision 1.11 2004/02/04 15:57:49 joergr * Removed acknowledgements with e-mail addresses from CVS log. * * Revision 1.10 2003/09/05 08:37:46 meichel * Fixed minor issue that caused certain error messages during the * parse process on a GSPS object to be "swallowed". * * Revision 1.9 2003/06/12 18:23:11 joergr * Modified code to use const_iterators where appropriate (required for STL). * * Revision 1.8 2003/06/04 10:18:07 meichel * Replaced private inheritance from template with aggregation * * Revision 1.7 2001/09/26 15:36:36 meichel * Adapted dcmpstat to class OFCondition * * Revision 1.6 2001/06/01 15:50:42 meichel * Updated copyright header * * Revision 1.5 2000/06/02 16:01:11 meichel * Adapted all dcmpstat classes to use OFConsole for log and error output * * Revision 1.4 2000/05/31 13:02:42 meichel * Moved dcmpstat macros and constants into a common header file * * Revision 1.3 2000/03/08 16:29:14 meichel * Updated copyright header. * * Revision 1.2 1999/04/30 16:40:50 meichel * Minor code purifications to keep Sun CC 2.0.1 quiet * * Revision 1.1 1998/12/22 17:57:22 meichel * Implemented Presentation State interface for overlays, * VOI LUTs, VOI windows, curves. Added test program that * allows to add curve data to DICOM images. * * */ dcmtk-3.6.0/dcmpstat/libsrc/dcmpstat.cc0000644000310500011400000023356011455601067017300 0ustar joergrdicom3/* * * Copyright (C) 1998-2010, 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: DcmPresentationState * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:14:31 $ * CVS/RCS Revision: $Revision: 1.15 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmpstat/dcmpstat.h" #include "dcmtk/ofstd/ofstd.h" /* for class OFStandard */ #include "dcmtk/ofstd/ofstream.h" #include "dcmtk/ofstd/ofstring.h" #include "dcmtk/dcmpstat/dvpsdef.h" /* for constants and macros */ #include "dcmtk/dcmpstat/dvpscu.h" /* for DVPSCurve */ #include "dcmtk/dcmpstat/dvpsvl.h" /* for DVPSVOILUT */ #include "dcmtk/dcmpstat/dvpsvw.h" /* for DVPSVOIWindow */ #include "dcmtk/dcmpstat/dvpsov.h" /* for DVPSOverlay */ #include "dcmtk/dcmpstat/dvpsda.h" /* for DVPSDisplayedArea */ #include "dcmtk/dcmpstat/dvpssv.h" /* for DVPSSoftcopyVOI */ #include "dcmtk/dcmpstat/dvpshlp.h" /* for class DVPSHelper */ #include "dcmtk/dcmpstat/dvpsgl.h" /* for DVPSGraphicLayer, needed by MSVC5 with STL */ #include "dcmtk/dcmpstat/dvpsrs.h" /* for DVPSReferencedSeries, needed by MSVC5 with STL */ #include "dcmtk/dcmpstat/dvpsal.h" /* for DVPSOverlayCurveActivationLayer, needed by MSVC5 with STL */ #include "dcmtk/dcmpstat/dvpsga.h" /* for DVPSGraphicAnnotation, needed by MSVC5 with STL */ #include "dcmtk/dcmpstat/dvpsri.h" /* for DVPSReferencedImage, needed by MSVC5 with STL */ #include "dcmtk/dcmpstat/dvpstx.h" /* for DVPSTextObject, needed by MSVC5 with STL */ #include "dcmtk/dcmpstat/dvpsgr.h" /* for DVPSGraphicObject, needed by MSVC5 with STL */ #define INCLUDE_CSTDLIB #define INCLUDE_CSTDIO #define INCLUDE_CSTRING #define INCLUDE_CMATH #define INCLUDE_CTIME #define INCLUDE_LIBC #define INCLUDE_UNISTD #include "dcmtk/ofstd/ofstdinc.h" OFLogger DCM_dcmpstatGetLogger() { static OFLogger DCM_dcmpstatLogger = OFLog::getLogger("dcmtk.dcmpstat"); return DCM_dcmpstatLogger; } OFLogger DCM_dcmpstatDumpGetLogger() { static OFLogger DCM_dcmpstatLogger = OFLog::getLogger("dcmtk.dcmpstat.dump"); return DCM_dcmpstatLogger; } OFLogger DCM_dcmpstatLogfileGetLogger() { static OFLogger DCM_dcmpstatLogger = OFLog::getLogger("dcmtk.dcmpstat.logfile"); return DCM_dcmpstatLogger; } /* --------------- class DcmPresentationState --------------- */ DcmPresentationState::DcmPresentationState() : patientName(DCM_PatientName) , patientID(DCM_PatientID) , patientBirthDate(DCM_PatientBirthDate) , patientSex(DCM_PatientSex) , studyInstanceUID(DCM_StudyInstanceUID) , studyDate(DCM_StudyDate) , studyTime(DCM_StudyTime) , referringPhysicianName(DCM_ReferringPhysicianName) , studyID(DCM_StudyID) , accessionNumber(DCM_AccessionNumber) , seriesInstanceUID(DCM_SeriesInstanceUID) , seriesNumber(DCM_SeriesNumber) , manufacturer(DCM_Manufacturer) , displayedAreaSelectionList() , presentationLUT() , imageNumber(DCM_InstanceNumber) , presentationLabel(DCM_ContentLabel) , presentationDescription(DCM_ContentDescription) , presentationCreationDate(DCM_PresentationCreationDate) , presentationCreationTime(DCM_PresentationCreationTime) , presentationCreatorsName(DCM_ContentCreatorName) , referencedSeriesList() , sOPInstanceUID(DCM_SOPInstanceUID) , specificCharacterSet(DCM_SpecificCharacterSet) , instanceCreationDate(DCM_InstanceCreationDate) , instanceCreationTime(DCM_InstanceCreationTime) , instanceCreatorUID(DCM_InstanceCreatorUID) , useShutterRectangular(OFFalse) , useShutterCircular(OFFalse) , useShutterPolygonal(OFFalse) , useShutterBitmap(OFFalse) , shutterShape(DCM_ShutterShape) , shutterLeftVerticalEdge(DCM_ShutterLeftVerticalEdge) , shutterRightVerticalEdge(DCM_ShutterRightVerticalEdge) , shutterUpperHorizontalEdge(DCM_ShutterUpperHorizontalEdge) , shutterLowerHorizontalEdge(DCM_ShutterLowerHorizontalEdge) , centerOfCircularShutter(DCM_CenterOfCircularShutter) , radiusOfCircularShutter(DCM_RadiusOfCircularShutter) , verticesOfThePolygonalShutter(DCM_VerticesOfThePolygonalShutter) , shutterPresentationValue(DCM_ShutterPresentationValue) , shutterOverlayGroup(DCM_ShutterOverlayGroup) , overlayList() , activationLayerList() , graphicAnnotationList() , imageRotation(DCM_ImageRotation) , imageHorizontalFlip(DCM_ImageHorizontalFlip) , graphicLayerList() , useModalityRescale(OFFalse) , useModalityLUT(OFFalse) , modalityLUTDescriptor(DCM_LUTDescriptor) , modalityLUTExplanation(DCM_LUTExplanation) , modalityLUTType(DCM_ModalityLUTType) , modalityLUTData(DCM_LUTData) , rescaleIntercept(DCM_RescaleIntercept) , rescaleSlope(DCM_RescaleSlope) , rescaleType(DCM_RescaleType) , softcopyVOIList() { createInstanceUID(); } DcmPresentationState::~DcmPresentationState() { } void DcmPresentationState::clear() { patientName.clear(); patientID.clear(); patientBirthDate.clear(); patientSex.clear(); studyInstanceUID.clear(); studyDate.clear(); studyTime.clear(); referringPhysicianName.clear(); studyID.clear(); accessionNumber.clear(); seriesInstanceUID.clear(); seriesNumber.clear(); manufacturer.clear(); displayedAreaSelectionList.clear(); presentationLUT.clear(); imageNumber.clear(); presentationLabel.clear(); presentationDescription.clear(); presentationCreationDate.clear(); presentationCreationTime.clear(); presentationCreatorsName.clear(); referencedSeriesList.clear(); sOPInstanceUID.clear(); specificCharacterSet.clear(); instanceCreationDate.clear(); instanceCreationTime.clear(); instanceCreatorUID.clear(); shutterShape.clear(); shutterLeftVerticalEdge.clear(); shutterRightVerticalEdge.clear(); shutterUpperHorizontalEdge.clear(); shutterLowerHorizontalEdge.clear(); centerOfCircularShutter.clear(); radiusOfCircularShutter.clear(); verticesOfThePolygonalShutter.clear(); shutterPresentationValue.clear(); shutterOverlayGroup.clear(); overlayList.clear(); activationLayerList.clear(); graphicAnnotationList.clear(); imageRotation.clear(); imageHorizontalFlip.clear(); graphicLayerList.clear(); useModalityRescale = OFFalse; useModalityLUT = OFFalse; modalityLUTDescriptor.clear(); modalityLUTExplanation.clear(); modalityLUTType.clear(); modalityLUTData.clear(); rescaleIntercept.clear(); rescaleSlope.clear(); rescaleType.clear(); softcopyVOIList.clear(); return; } const char *DcmPresentationState::createInstanceUID() { char uid[100]; OFString aString; char *puid = NULL; OFCondition result = sOPInstanceUID.putString(dcmGenerateUniqueIdentifier(uid)); DVPSHelper::currentDate(aString); DVPSHelper::setDefault(result, instanceCreationDate, aString.c_str()); DVPSHelper::currentTime(aString); DVPSHelper::setDefault(result, instanceCreationTime, aString.c_str()); if (EC_Normal == result) { if (EC_Normal != sOPInstanceUID.getString(puid)) puid=NULL; } return puid; } const char *DcmPresentationState::getInstanceUID() { char *puid = NULL; if (EC_Normal != sOPInstanceUID.getString(puid)) puid=NULL; return puid; } const char *DcmPresentationState::getSOPClassUID() { return UID_GrayscaleSoftcopyPresentationStateStorage; } const char *DcmPresentationState::getPatientID() { char *c = NULL; if (EC_Normal == patientID.getString(c)) return c; else return NULL; } const char *DcmPresentationState::getStudyUID() { char *c = NULL; if (EC_Normal == studyInstanceUID.getString(c)) return c; else return NULL; } OFCondition DcmPresentationState::createDummyValues(OFBool replaceSOPInstanceUID) { OFCondition result = EC_Normal; char uid[100]; OFString aString; DVPSHelper::setDefault(result, patientName, DEFAULT_patientName); SET_UID(studyInstanceUID) SET_UID(seriesInstanceUID) DVPSHelper::setDefault(result, imageNumber, DEFAULT_imageNumber); DVPSHelper::setDefault(result, presentationLabel, DEFAULT_presentationLabel); DVPSHelper::currentDate(aString); DVPSHelper::setDefault(result, presentationCreationDate, aString.c_str() ); DVPSHelper::currentTime(aString); DVPSHelper::setDefault(result, presentationCreationTime, aString.c_str() ); if ((result==EC_Normal)&&(replaceSOPInstanceUID ||(sOPInstanceUID.getLength()==0))) { sOPInstanceUID.putString(dcmGenerateUniqueIdentifier(uid)); DVPSHelper::currentDate(aString); DVPSHelper::setDefault(result, instanceCreationDate, aString.c_str() ); DVPSHelper::currentTime(aString); DVPSHelper::setDefault(result, instanceCreationTime, aString.c_str() ); } // default for specific character set is -absent-. // DVPSHelper::setDefault(result, specificCharacterSet, DEFAULT_specificCharacterSet ); // create some dummy defaults for shutters if (shutterPresentationValue.getVM() != 1) shutterPresentationValue.putUint16(0); DVPSHelper::setDefault(result, shutterLeftVerticalEdge, "1"); DVPSHelper::setDefault(result, shutterRightVerticalEdge, "1024"); DVPSHelper::setDefault(result, shutterUpperHorizontalEdge, "1"); DVPSHelper::setDefault(result, shutterLowerHorizontalEdge, "1024"); DVPSHelper::setDefault(result, centerOfCircularShutter, "512\\512"); DVPSHelper::setDefault(result, radiusOfCircularShutter, "512"); DVPSHelper::setDefault(result, verticesOfThePolygonalShutter, "1\\1\\1\\1024\\1024\\1024\\1024\\1\\1\\1"); if (shutterOverlayGroup.getVM() != 1) shutterOverlayGroup.putUint16(0x6000); // create defaults for Spatial Transformation Module if (result==EC_Normal) { if (imageRotation.getVM() != 1) result = imageRotation.putUint16(0); } DVPSHelper::setDefault(result, imageHorizontalFlip, "N"); // create defaults for Modality Rescale DVPSHelper::setDefault(result, rescaleIntercept, "0"); DVPSHelper::setDefault(result, rescaleSlope, "1"); DVPSHelper::setDefault(result, rescaleType, "UNSPECIFIED"); return result; } OFCondition DcmPresentationState::read(DcmItem &dset) { OFCondition result = EC_Normal; DcmStack stack; DcmSequenceOfItems *seq; DcmItem *item; clear(); // re-initialize Presentation State object /* check SOP class UID and modality first */ DcmUniqueIdentifier sopclassuid(DCM_SOPClassUID); DcmCodeString modality(DCM_Modality); OFString aString; READ_FROM_DATASET(DcmUniqueIdentifier, sopclassuid) READ_FROM_DATASET(DcmCodeString, modality) if (sopclassuid.getLength() == 0) { result=EC_IllegalCall; DCMPSTAT_INFO("SOPClassUID absent or empty in presentation state"); } else if (sopclassuid.getVM() != 1) { result=EC_IllegalCall; DCMPSTAT_INFO("SOPClassUID VM != 1 in presentation state"); } if (modality.getLength() == 0) { result=EC_IllegalCall; DCMPSTAT_INFO("Modality absent or empty in presentation state"); } else if (modality.getVM() != 1) { result=EC_IllegalCall; DCMPSTAT_INFO("Modality VM != 1 in presentation state"); } sopclassuid.getOFString(aString,0); if (aString != UID_GrayscaleSoftcopyPresentationStateStorage) { result=EC_IllegalCall; DCMPSTAT_INFO("SOP Class UID does not match GrayscaleSoftcopyPresentationStateStorage"); } modality.getOFString(aString,0); if (aString != "PR") { result=EC_IllegalCall; DCMPSTAT_INFO("Modality does not match 'PR' for presentation state"); } if (result==EC_Normal) { READ_FROM_DATASET(DcmPersonName, patientName) READ_FROM_DATASET(DcmLongString, patientID) READ_FROM_DATASET(DcmDate, patientBirthDate) READ_FROM_DATASET(DcmCodeString, patientSex) READ_FROM_DATASET(DcmUniqueIdentifier, studyInstanceUID) READ_FROM_DATASET(DcmDate, studyDate) READ_FROM_DATASET(DcmTime, studyTime) READ_FROM_DATASET(DcmPersonName, referringPhysicianName) READ_FROM_DATASET(DcmShortString, studyID) READ_FROM_DATASET(DcmShortString, accessionNumber) READ_FROM_DATASET(DcmUniqueIdentifier, seriesInstanceUID) READ_FROM_DATASET(DcmIntegerString, seriesNumber) READ_FROM_DATASET(DcmLongString, manufacturer) READ_FROM_DATASET(DcmIntegerString, imageNumber) READ_FROM_DATASET(DcmCodeString, presentationLabel) READ_FROM_DATASET(DcmLongString, presentationDescription) READ_FROM_DATASET(DcmDate, presentationCreationDate) READ_FROM_DATASET(DcmTime, presentationCreationTime) READ_FROM_DATASET(DcmPersonName, presentationCreatorsName) READ_FROM_DATASET(DcmUniqueIdentifier, sOPInstanceUID) READ_FROM_DATASET(DcmCodeString, specificCharacterSet) READ_FROM_DATASET(DcmDate, instanceCreationDate) READ_FROM_DATASET(DcmTime, instanceCreationTime) READ_FROM_DATASET(DcmUniqueIdentifier, instanceCreatorUID) READ_FROM_DATASET(DcmCodeString, shutterShape) READ_FROM_DATASET(DcmIntegerString, shutterLeftVerticalEdge) READ_FROM_DATASET(DcmIntegerString, shutterRightVerticalEdge) READ_FROM_DATASET(DcmIntegerString, shutterUpperHorizontalEdge) READ_FROM_DATASET(DcmIntegerString, shutterLowerHorizontalEdge) READ_FROM_DATASET(DcmIntegerString, centerOfCircularShutter) READ_FROM_DATASET(DcmIntegerString, radiusOfCircularShutter) READ_FROM_DATASET(DcmIntegerString, verticesOfThePolygonalShutter) READ_FROM_DATASET(DcmUnsignedShort, shutterPresentationValue) READ_FROM_DATASET(DcmUnsignedShort, shutterOverlayGroup) READ_FROM_DATASET(DcmUnsignedShort, imageRotation) READ_FROM_DATASET(DcmCodeString, imageHorizontalFlip) READ_FROM_DATASET(DcmDecimalString, rescaleIntercept) READ_FROM_DATASET(DcmDecimalString, rescaleSlope) READ_FROM_DATASET(DcmLongString, rescaleType) } /* read Modality LUT Sequence */ if (result==EC_Normal) { stack.clear(); if (EC_Normal == dset.search(DCM_ModalityLUTSequence, stack, ESM_fromHere, OFFalse)) { seq=(DcmSequenceOfItems *)stack.top(); if (seq->card() ==1) { item = seq->getItem(0); stack.clear(); if (EC_Normal == item->search((DcmTagKey &)modalityLUTDescriptor.getTag(), stack, ESM_fromHere, OFFalse)) { modalityLUTDescriptor = *((DcmUnsignedShort *)(stack.top())); } stack.clear(); if (EC_Normal == item->search((DcmTagKey &)modalityLUTExplanation.getTag(), stack, ESM_fromHere, OFFalse)) { modalityLUTExplanation = *((DcmLongString *)(stack.top())); } stack.clear(); if (EC_Normal == item->search((DcmTagKey &)modalityLUTData.getTag(), stack, ESM_fromHere, OFFalse)) { modalityLUTData = *((DcmUnsignedShort *)(stack.top())); } stack.clear(); if (EC_Normal == item->search((DcmTagKey &)modalityLUTType.getTag(), stack, ESM_fromHere, OFFalse)) { modalityLUTType = *((DcmLongString *)(stack.top())); } } else { result=EC_TagNotFound; DCMPSTAT_INFO("Modality LUT SQ does not have exactly one item in presentation state"); } } } if (result==EC_Normal) result = overlayList.read(dset); if (result==EC_Normal) result = activationLayerList.read(dset); if (result==EC_Normal) result = graphicLayerList.read(dset); if (result==EC_Normal) result = referencedSeriesList.read(dset); if (result==EC_Normal) result = graphicAnnotationList.read(dset); if (result==EC_Normal) result = displayedAreaSelectionList.read(dset); if (result==EC_Normal) result = softcopyVOIList.read(dset); if (result==EC_Normal) result = presentationLUT.read(dset, OFFalse); /* Now perform basic sanity checks and adjust use flags */ if (result==EC_Normal) { if (patientName.getLength() == 0) { result=EC_IllegalCall; DCMPSTAT_INFO("patientName absent or empty in presentation state"); } else if (patientName.getVM() != 1) { result=EC_IllegalCall; DCMPSTAT_INFO("patientName VM != 1 in presentation state"); } if (studyInstanceUID.getLength() == 0) { result=EC_IllegalCall; DCMPSTAT_INFO("studyInstanceUID absent or empty in presentation state"); } else if (studyInstanceUID.getVM() != 1) { result=EC_IllegalCall; DCMPSTAT_INFO("studyInstanceUID VM != 1 in presentation state"); } if (displayedAreaSelectionList.size() == 0) { result=EC_IllegalCall; DCMPSTAT_INFO("displayedAreaSelectionSQ absent or empty in presentation state"); } if (imageNumber.getLength() == 0) { result=EC_IllegalCall; DCMPSTAT_INFO("instanceNumber absent or empty in presentation state"); } else if (imageNumber.getVM() != 1) { result=EC_IllegalCall; DCMPSTAT_INFO("instanceNumber VM != 1 in presentation state"); } if (presentationLabel.getLength() == 0) { result=EC_IllegalCall; DCMPSTAT_INFO("presentationLabel absent or empty in presentation state"); } else if (presentationLabel.getVM() != 1) { result=EC_IllegalCall; DCMPSTAT_INFO("presentationLabel VM != 1 in presentation state"); } if (presentationCreationDate.getLength() == 0) { result=EC_IllegalCall; DCMPSTAT_INFO("presentationCreationDate absent or empty in presentation state"); } else if (presentationCreationDate.getVM() != 1) { result=EC_IllegalCall; DCMPSTAT_INFO("presentationCreationDate VM != 1 in presentation state"); } if (presentationCreationTime.getLength() == 0) { result=EC_IllegalCall; DCMPSTAT_INFO("presentationCreationTime absent or empty in presentation state"); } else if (presentationCreationTime.getVM() != 1) { result=EC_IllegalCall; DCMPSTAT_INFO("presentationCreationTime VM != 1 in presentation state"); } if (sOPInstanceUID.getLength() == 0) { result=EC_IllegalCall; DCMPSTAT_INFO("sOPInstanceUID absent or empty in presentation state"); } else if (sOPInstanceUID.getVM() != 1) { result=EC_IllegalCall; DCMPSTAT_INFO("sOPInstanceUID VM != 1 in presentation state"); } /* if imageRotation or imageHorizontalFlip are present, then both must be present. */ if ((imageRotation.getLength() > 0)&&(imageHorizontalFlip.getLength() == 0)) { result=EC_IllegalCall; DCMPSTAT_INFO("imageRotation present but imageHorizontalFlip absent or empty in presentation state"); } if ((imageRotation.getLength() == 0)&&(imageHorizontalFlip.getLength() > 0)) { result=EC_IllegalCall; DCMPSTAT_INFO("imageHorizontalFlip present but imageRotation absent or empty in presentation state"); } /* Modality LUT */ if (rescaleIntercept.getLength() > 0) { useModalityRescale = OFTrue; if (rescaleSlope.getLength() == 0) { result=EC_IllegalCall; DCMPSTAT_INFO("rescaleIntercept present but rescaleSlope absent or empty in presentation state"); } else if (rescaleSlope.getVM() != 1) { result=EC_IllegalCall; DCMPSTAT_INFO("rescaleIntercept present but rescaleSlope VM != 1 in presentation state"); } if (rescaleType.getLength() == 0) { result=EC_IllegalCall; DCMPSTAT_INFO("rescaleIntercept present but rescaleType absent or empty in presentation state"); } else if (rescaleType.getVM() != 1) { result=EC_IllegalCall; DCMPSTAT_INFO("rescaleIntercept present but rescaleType VM != 1 in presentation state"); } if (rescaleIntercept.getVM() != 1) { result=EC_IllegalCall; DCMPSTAT_INFO("rescaleIntercept present but VM != 1 in presentation state"); } } else useModalityRescale = OFFalse; if (modalityLUTData.getLength() > 0) { useModalityLUT = OFTrue; if (modalityLUTDescriptor.getLength() == 0) { result=EC_IllegalCall; DCMPSTAT_INFO("modalityLUTData present but modalityLUTDescriptor absent or empty in presentation state"); } else if (modalityLUTDescriptor.getVM() != 3) { result=EC_IllegalCall; DCMPSTAT_INFO("modalityLUTData present but modalityLUTDescriptor VM != 3 in presentation state"); } } else useModalityLUT = OFFalse; /* we may not have both modality rescale and LUT */ if (useModalityRescale && useModalityLUT) { result=EC_IllegalCall; DCMPSTAT_INFO("both modality rescale and LUT present in presentation state"); } } /* end result==EC_Normal */ /* check shutters */ if (result==EC_Normal) { // now we examine the shutterShape for the Shutter modules Uint32 i; aString.clear(); useShutterRectangular=OFFalse; useShutterCircular=OFFalse; useShutterPolygonal=OFFalse; useShutterBitmap=OFFalse; for (i=0; i= 0x6000) { if (!overlayList.haveOverlayGroup(shuttergroup)) { result=EC_IllegalCall; DCMPSTAT_INFO("bitmap shutter specified but referenced overlay group missing in presentation state"); } } else { result=EC_IllegalCall; DCMPSTAT_INFO("wrong overlay group specified for bitmap shutter in presentation state"); } } /* check that referenced series list is non-empty and that every series contains images and that all referenced images share the same SOP class UID. */ if (result.good() && (!referencedSeriesList.isValid())) { // referencedSeriesList.isValid() has already displayed an error message in verbose mode result = EC_IllegalCall; } /* check that there is no mask module present. We don't support Mask and therefore are obliged to reject any presentation state containing a mask! */ stack.clear(); if (EC_Normal == dset.search(DCM_MaskSubtractionSequence, stack, ESM_fromHere, OFFalse)) { result=EC_IllegalCall; DCMPSTAT_INFO("mask module present in presentation state, but unsupported"); } stack.clear(); if (EC_Normal == dset.search(DCM_RecommendedViewingMode, stack, ESM_fromHere, OFFalse)) { result=EC_IllegalCall; DCMPSTAT_INFO("mask module present in presentation state, but unsupported"); } return result; } OFCondition DcmPresentationState::createDefaultDisplayedArea(DcmItem &dset) { DcmUnsignedShort rows(DCM_Rows); DcmUnsignedShort columns(DCM_Columns); DcmUniqueIdentifier sopclassUID(DCM_SOPClassUID); DcmUniqueIdentifier imageUID(DCM_SOPInstanceUID); DcmDecimalString imagerPixelSpacing(DCM_ImagerPixelSpacing); DcmDecimalString pixelSpacing(DCM_PixelSpacing); DcmIntegerString pixelAspectRatio(DCM_PixelAspectRatio); Uint16 cols_uint=0; Uint16 rows_uint=0; char *c_sopclassUID = NULL; char *c_imageUID = NULL; char *pixelspacing = NULL; OFCondition result = EC_Normal; DcmStack stack; READ_FROM_DATASET(DcmUnsignedShort, rows) READ_FROM_DATASET(DcmUnsignedShort, columns) READ_FROM_DATASET(DcmUniqueIdentifier, sopclassUID) READ_FROM_DATASET(DcmUniqueIdentifier, imageUID) READ_FROM_DATASET(DcmDecimalString, imagerPixelSpacing) READ_FROM_DATASET(DcmDecimalString, pixelSpacing) READ_FROM_DATASET(DcmIntegerString, pixelAspectRatio) if (result == EC_Normal) result = columns.getUint16(cols_uint,0); if (result == EC_Normal) result = rows.getUint16(rows_uint,0); if (result == EC_Normal) result = sopclassUID.getString(c_sopclassUID); if (result == EC_Normal) result = imageUID.getString(c_imageUID); /* create displayed area selection item for this image */ if (EC_Normal == result) { DVPSDisplayedArea *area = displayedAreaSelectionList.createDisplayedArea( referencedSeriesList, c_sopclassUID, c_imageUID, 1, 1, DVPSB_currentImage); if (area) { if (EC_Normal == result) result = area->setDisplayedArea(DVPSD_scaleToFit, (Sint32)1, (Sint32)1, (Sint32)cols_uint, (Sint32)rows_uint); if (EC_Normal == result) { OFBool foundRatio = OFFalse; if ((imagerPixelSpacing.getVM()==2)&&(EC_Normal==imagerPixelSpacing.getString(pixelspacing))) { result = area->setDisplayedAreaPixelSpacing(pixelspacing); if (EC_Normal==result) foundRatio = OFTrue; } if ((! foundRatio)&&(pixelSpacing.getVM()==2)&&(EC_Normal==pixelSpacing.getString(pixelspacing))) { result = area->setDisplayedAreaPixelSpacing(pixelspacing); if (EC_Normal==result) foundRatio = OFTrue; } if ((! foundRatio)&&(pixelAspectRatio.getVM()==2)&&(EC_Normal==pixelAspectRatio.getString(pixelspacing))) { result = area->setDisplayedAreaPixelAspectRatio(pixelspacing); if (EC_Normal==result) foundRatio = OFTrue; } if (! foundRatio) result = area->setDisplayedAreaPixelAspectRatio(1.0); } } else result = EC_MemoryExhausted; } return result; } OFCondition DcmPresentationState::createFromImage( DcmItem &dset, DVPSoverlayActivation overlayActivation, DVPSVOIActivation voiActivation, OFBool curveActivation, OFBool shutterActivation, OFBool presentationActivation, DVPSGraphicLayering layering, const char *aetitle, const char *filesetID, const char *filesetUID) { OFCondition result = EC_Normal; DcmStack stack; DcmSequenceOfItems *seq; DcmItem *item; char uid[100]; OFString aString; OFString ofsopclassUID; OFString ofimageUID; OFBool isMonochrome1 = OFFalse; DcmUniqueIdentifier sopclassUID(DCM_SOPClassUID); DcmUniqueIdentifier imageUID(DCM_SOPInstanceUID); DcmCodeString photometricInterpretation(DCM_PhotometricInterpretation); DcmCodeString presentationLUTShape(DCM_PresentationLUTShape); clear(); // re-initialize Presentation State object /* copy some image attributes we will need later */ READ_FROM_DATASET(DcmCodeString, photometricInterpretation) READ_FROM_DATASET(DcmUniqueIdentifier, sopclassUID) READ_FROM_DATASET(DcmUniqueIdentifier, imageUID) sopclassUID.getOFString(ofsopclassUID,0); imageUID.getOFString(ofimageUID,0); /* copy attributes for Patient, General Study and General Equipment * modules from image object. Also copy specific character set (SOP common). */ READ_FROM_DATASET(DcmPersonName, patientName) READ_FROM_DATASET(DcmLongString, patientID) READ_FROM_DATASET(DcmDate, patientBirthDate) READ_FROM_DATASET(DcmCodeString, patientSex) READ_FROM_DATASET(DcmUniqueIdentifier, studyInstanceUID) READ_FROM_DATASET(DcmDate, studyDate) READ_FROM_DATASET(DcmTime, studyTime) READ_FROM_DATASET(DcmPersonName, referringPhysicianName) READ_FROM_DATASET(DcmShortString, studyID) READ_FROM_DATASET(DcmShortString, accessionNumber) READ_FROM_DATASET(DcmLongString, manufacturer) READ_FROM_DATASET(DcmCodeString, specificCharacterSet) /* if there is a modality rescale, copy it now. * Later we decide whether we want to use it. */ READ_FROM_DATASET(DcmDecimalString, rescaleIntercept) READ_FROM_DATASET(DcmDecimalString, rescaleSlope) READ_FROM_DATASET(DcmLongString, rescaleType) if ((result==EC_Normal) && shutterActivation) { /* if there is a display shutter in the image (i.e. in XA, RF, DX), copy it. * We never copy bitmap shutters. */ READ_FROM_DATASET(DcmCodeString, shutterShape) READ_FROM_DATASET(DcmIntegerString, shutterLeftVerticalEdge) READ_FROM_DATASET(DcmIntegerString, shutterRightVerticalEdge) READ_FROM_DATASET(DcmIntegerString, shutterUpperHorizontalEdge) READ_FROM_DATASET(DcmIntegerString, shutterLowerHorizontalEdge) READ_FROM_DATASET(DcmIntegerString, centerOfCircularShutter) READ_FROM_DATASET(DcmIntegerString, radiusOfCircularShutter) READ_FROM_DATASET(DcmIntegerString, verticesOfThePolygonalShutter) READ_FROM_DATASET(DcmUnsignedShort, shutterPresentationValue) } if ((result==EC_Normal) && presentationActivation) { /* if there is a Presentation LUT shape in the image (i.e. in DX), copy it. * We never copy presentation LUT sequences. */ READ_FROM_DATASET(DcmCodeString, presentationLUTShape) } /* read Modality LUT Sequence */ if (result==EC_Normal) { stack.clear(); if (EC_Normal == dset.search(DCM_ModalityLUTSequence, stack, ESM_fromHere, OFFalse)) { seq=(DcmSequenceOfItems *)stack.top(); if (seq->card() >0) { item = seq->getItem(0); stack.clear(); if (EC_Normal == item->search((DcmTagKey &)modalityLUTDescriptor.getTag(), stack, ESM_fromHere, OFFalse)) { modalityLUTDescriptor = *((DcmUnsignedShort *)(stack.top())); } stack.clear(); if (EC_Normal == item->search((DcmTagKey &)modalityLUTExplanation.getTag(), stack, ESM_fromHere, OFFalse)) { modalityLUTExplanation = *((DcmLongString *)(stack.top())); } stack.clear(); if (EC_Normal == item->search((DcmTagKey &)modalityLUTData.getTag(), stack, ESM_fromHere, OFFalse)) { modalityLUTData = *((DcmUnsignedShort *)(stack.top())); } stack.clear(); if (EC_Normal == item->search((DcmTagKey &)modalityLUTType.getTag(), stack, ESM_fromHere, OFFalse)) { modalityLUTType = *((DcmLongString *)(stack.top())); } } else result=EC_TagNotFound; } } /* copy overlays if appropriate */ if ((result==EC_Normal)&&(overlayActivation==DVPSO_copyOverlays)) result = overlayList.read(dset); /* Now perform basic sanity checks and adjust use flags */ if ((studyInstanceUID.getLength() == 0)||(studyInstanceUID.getVM() != 1)) result=EC_IllegalCall; if (photometricInterpretation.getVM() == 1) { aString.clear(); photometricInterpretation.getOFString(aString,0); if ((aString == "MONOCHROME1")||(aString == "MONOCHROME 1")) isMonochrome1 = OFTrue; else if ((aString != "MONOCHROME2")&&(aString != "MONOCHROME 2")) { result = EC_IllegalCall; DCMPSTAT_INFO("Wrong image photometric interpretation - not MONOCHROME1/2"); } } if (result==EC_Normal) { if ((patientName.getLength() == 0)||(patientName.getVM() != 1)) result = patientName.putString(DEFAULT_patientName); } if (result==EC_Normal) { result = imageNumber.putString(DEFAULT_imageNumber); } if (result==EC_Normal) { result = presentationLabel.putString(DEFAULT_presentationLabel); } if (result==EC_Normal) { aString.clear(); DVPSHelper::currentDate(aString); result = presentationCreationDate.putString(aString.c_str()); } if (result==EC_Normal) { aString.clear(); DVPSHelper::currentTime(aString); result = presentationCreationTime.putString(aString.c_str()); } if (result==EC_Normal) result = seriesInstanceUID.putString(dcmGenerateUniqueIdentifier(uid, SITE_SERIES_UID_ROOT)); if (result==EC_Normal) result = sOPInstanceUID.putString(dcmGenerateUniqueIdentifier(uid)); if (result==EC_Normal) result = seriesNumber.putString(DEFAULT_seriesNumber); if (result==EC_Normal) result = specificCharacterSet.putString(DEFAULT_specificCharacterSet); if (result==EC_Normal) { /* Presentation LUT Shape */ if (isMonochrome1) presentationLUT.setType(DVPSP_inverse); else presentationLUT.setType(DVPSP_identity); if (presentationLUTShape.getVM() == 1) { aString.clear(); presentationLUTShape.getOFString(aString,0); if (aString == "IDENTITY") presentationLUT.setType(DVPSP_identity); if (aString == "INVERSE") presentationLUT.setType(DVPSP_inverse); if (aString == "LIN OD") { DCMPSTAT_INFO("LIN OD found in presentation state; set to IDENTITY"); presentationLUT.setType(DVPSP_identity); } } } if (result==EC_Normal) { /* Modality LUT */ if ((rescaleIntercept.getVM() == 1) && (rescaleSlope.getVM() == 1)) { useModalityRescale = OFTrue; modalityLUTData.clear(); modalityLUTDescriptor.clear(); modalityLUTExplanation.clear(); modalityLUTType.clear(); // be lenient with Modality rescale type. If missing or wrong, just invent a value. if (rescaleType.getVM() != 1) rescaleType.putString("US"); } else useModalityRescale = OFFalse; // these three SOP classes use the X-Ray Image Module in which the meaning // of the Modality LUT transformation is "inversersed" and, therefore, // must not be copied into the presentation state if ((ofsopclassUID == UID_XRayAngiographicImageStorage) || (ofsopclassUID == UID_XRayRadiofluoroscopicImageStorage) || (ofsopclassUID == UID_RETIRED_XRayAngiographicBiPlaneImageStorage)) { modalityLUTData.clear(); modalityLUTDescriptor.clear(); modalityLUTExplanation.clear(); modalityLUTType.clear(); useModalityLUT = OFFalse; } if ((modalityLUTDescriptor.getVM() == 3) && (modalityLUTData.getLength() > 0)) { useModalityLUT = OFTrue; rescaleIntercept.clear(); rescaleSlope.clear(); rescaleType.clear(); } else useModalityLUT = OFFalse; } /* check shutters */ if (result==EC_Normal) { // now we examine the shutterShape for the Shutter modules Uint32 i; aString.clear(); useShutterRectangular=OFFalse; useShutterCircular=OFFalse; useShutterPolygonal=OFFalse; useShutterBitmap=OFFalse; for (i=0; i0) aString += '\\'; aString += "CIRCULAR"; } if (useShutterPolygonal) { if (aString.size() >0) aString += '\\'; aString += "POLYGONAL"; } shutterShape.putString(aString.c_str()); if ((shutterPresentationValue.getLength() == 0)||(shutterPresentationValue.getVM() != 1)) { shutterPresentationValue.clear(); shutterPresentationValue.putUint16(DEFAULT_shutterPresentationValue,0); } } } /* browse the image for overlays and curves, create activation tags and * graphic layers as appropriate. */ if (result==EC_Normal) result = activationLayerList.createFromImage(dset, graphicLayerList, overlayList, overlayActivation, curveActivation, layering); /* create reference for this image */ if (EC_Normal == result) result = addImageReference(dset, aetitle, filesetID, filesetUID); /* create displayed area selection item for this image */ if (EC_Normal == result) result = createDefaultDisplayedArea(dset); /* create softcopy VOI LUT sequence item for this image if necessary */ if (EC_Normal == result) result = softcopyVOIList.createFromImage(dset, referencedSeriesList, ofsopclassUID.c_str(), ofimageUID.c_str(), voiActivation); return result; } OFCondition DcmPresentationState::write(DcmItem &dset, OFBool replaceSOPInstanceUID) { OFCondition result = EC_Normal; DcmElement *delem=NULL; DcmSequenceOfItems *dseq=NULL; DcmItem *ditem=NULL; cleanupLayers(); /* remove unused layers */ createDummyValues(replaceSOPInstanceUID); /* add SOP Class UID */ DcmUniqueIdentifier sopclassuid(DCM_SOPClassUID); if (result==EC_Normal) { result = sopclassuid.putString(UID_GrayscaleSoftcopyPresentationStateStorage); } ADD_TO_DATASET(DcmUniqueIdentifier, sopclassuid) /* add Modality */ DcmCodeString modality(DCM_Modality); if (result==EC_Normal) { result = modality.putString("PR"); } ADD_TO_DATASET(DcmCodeString, modality) ADD_TO_DATASET(DcmPersonName, patientName) ADD_TO_DATASET(DcmLongString, patientID) ADD_TO_DATASET(DcmDate, patientBirthDate) ADD_TO_DATASET(DcmCodeString, patientSex) ADD_TO_DATASET(DcmUniqueIdentifier, studyInstanceUID) ADD_TO_DATASET(DcmDate, studyDate) ADD_TO_DATASET(DcmTime, studyTime) ADD_TO_DATASET(DcmPersonName, referringPhysicianName) ADD_TO_DATASET(DcmShortString, studyID) ADD_TO_DATASET(DcmShortString, accessionNumber) ADD_TO_DATASET(DcmCodeString, modality) ADD_TO_DATASET(DcmUniqueIdentifier, seriesInstanceUID) ADD_TO_DATASET(DcmIntegerString, seriesNumber) ADD_TO_DATASET(DcmLongString, manufacturer) ADD_TO_DATASET(DcmIntegerString, imageNumber) ADD_TO_DATASET(DcmCodeString, presentationLabel) ADD_TO_DATASET(DcmLongString, presentationDescription) ADD_TO_DATASET(DcmDate, presentationCreationDate) ADD_TO_DATASET(DcmTime, presentationCreationTime) ADD_TO_DATASET(DcmPersonName, presentationCreatorsName) ADD_TO_DATASET(DcmUniqueIdentifier, sOPInstanceUID) if (specificCharacterSet.getLength() >0) { ADD_TO_DATASET(DcmCodeString, specificCharacterSet) } if (instanceCreationDate.getLength() >0) { ADD_TO_DATASET(DcmDate, instanceCreationDate) } if (instanceCreationTime.getLength() >0) { ADD_TO_DATASET(DcmTime, instanceCreationTime) } if (instanceCreatorUID.getLength() >0) { ADD_TO_DATASET(DcmUniqueIdentifier, instanceCreatorUID) } shutterShape.clear(); if (useShutterRectangular || useShutterCircular || useShutterPolygonal) { OFString aString; if (useShutterRectangular) aString = "RECTANGULAR"; if (useShutterCircular) { if (aString.size() > 0) aString += '\\'; aString += "CIRCULAR"; } if (useShutterPolygonal) { if (aString.size() > 0) aString += '\\'; aString += "POLYGONAL"; } shutterShape.putString(aString.c_str()); } else if (useShutterBitmap) { shutterShape.putString("BITMAP"); } if (useShutterRectangular || useShutterCircular || useShutterPolygonal) { ADD_TO_DATASET(DcmCodeString, shutterShape) ADD_TO_DATASET(DcmUnsignedShort, shutterPresentationValue) if (useShutterRectangular) { ADD_TO_DATASET(DcmIntegerString, shutterLeftVerticalEdge) ADD_TO_DATASET(DcmIntegerString, shutterRightVerticalEdge) ADD_TO_DATASET(DcmIntegerString, shutterUpperHorizontalEdge) ADD_TO_DATASET(DcmIntegerString, shutterLowerHorizontalEdge) } if (useShutterCircular) { ADD_TO_DATASET(DcmIntegerString, centerOfCircularShutter) ADD_TO_DATASET(DcmIntegerString, radiusOfCircularShutter) } if (useShutterPolygonal) { ADD_TO_DATASET(DcmIntegerString, verticesOfThePolygonalShutter) } } else if (useShutterBitmap) { ADD_TO_DATASET(DcmCodeString, shutterShape) ADD_TO_DATASET(DcmUnsignedShort, shutterPresentationValue) ADD_TO_DATASET(DcmUnsignedShort, shutterOverlayGroup) } if (EC_Normal == result) result = referencedSeriesList.write(dset); if (EC_Normal == result) result = overlayList.write(dset); if (EC_Normal == result) result = activationLayerList.write(dset); if (EC_Normal == result) result = graphicAnnotationList.write(dset); if (EC_Normal == result) result = displayedAreaSelectionList.write(dset); if (EC_Normal == result) result = softcopyVOIList.write(dset); if (EC_Normal == result) result = graphicLayerList.write(dset); if (EC_Normal == result) result = presentationLUT.write(dset, OFFalse); // strictly speaking we are not allowed to include the Spatial Transformation // Module if neither rotation nor flipping are needed. OFString aString; OFBool haveRotation=OFFalse; OFBool haveFlip=OFFalse; if (imageRotation.getVM() == 1) { Uint16 urot=0; imageRotation.getUint16(urot,0); if (urot) haveRotation=OFTrue; } if (imageHorizontalFlip.getLength() > 0) { imageHorizontalFlip.getOFString(aString, 0, OFTrue); if (aString == "Y") haveFlip=OFTrue; } if (haveRotation || haveFlip) { ADD_TO_DATASET(DcmUnsignedShort, imageRotation) ADD_TO_DATASET(DcmCodeString, imageHorizontalFlip) } if (useModalityRescale) { ADD_TO_DATASET(DcmDecimalString, rescaleIntercept) ADD_TO_DATASET(DcmDecimalString, rescaleSlope) ADD_TO_DATASET(DcmLongString, rescaleType) } else if (useModalityLUT) { if (result == EC_Normal) { ditem = new DcmItem(); if (ditem) { dseq = new DcmSequenceOfItems(DCM_ModalityLUTSequence); if (dseq) { delem = new DcmUnsignedShort(modalityLUTDescriptor); if (delem) ditem->insert(delem, OFTrue /*replaceOld*/); else result=EC_MemoryExhausted; delem = new DcmUnsignedShort(modalityLUTData); if (delem) ditem->insert(delem, OFTrue /*replaceOld*/); else result=EC_MemoryExhausted; delem = new DcmLongString(modalityLUTType); if (delem) ditem->insert(delem, OFTrue /*replaceOld*/); else result=EC_MemoryExhausted; if (modalityLUTExplanation.getLength() >0) { delem = new DcmLongString(modalityLUTExplanation); if (delem) ditem->insert(delem, OFTrue /*replaceOld*/); else result=EC_MemoryExhausted; } if (result==EC_Normal) { dseq->insert(ditem); dset.insert(dseq, OFTrue /*replaceOld*/); } else { // out of memory during creation of sequence contents. delete dseq; delete ditem; result = EC_MemoryExhausted; } } else { // could allocate item but not sequence. Bail out. delete ditem; result = EC_MemoryExhausted; } } else result = EC_MemoryExhausted; } } return result; } OFCondition DcmPresentationState::addImageReference( const char *studyUID, const char *seriesUID, const char *sopclassUID, const char *instanceUID, const char *frames, const char *aetitle, const char *filesetID, const char *filesetUID) { if ((studyUID==NULL)||(seriesUID==NULL)||(sopclassUID==NULL)||(instanceUID==NULL)) return EC_IllegalCall; OFString study; studyInstanceUID.getOFString(study,0); if (study != studyUID) { DCMPSTAT_INFO("cannot add reference to image with different Study Instance UID."); return EC_IllegalCall; } return referencedSeriesList.addImageReference(seriesUID, sopclassUID, instanceUID, frames, aetitle, filesetID, filesetUID); } OFCondition DcmPresentationState::addImageReference( DcmItem &dset, const char *aetitle, const char *filesetID, const char *filesetUID) { DcmIntegerString numberOfFrames(DCM_NumberOfFrames); DcmUniqueIdentifier studyUID(DCM_StudyInstanceUID); DcmUniqueIdentifier seriesUID(DCM_SeriesInstanceUID); DcmUniqueIdentifier sopclassUID(DCM_SOPClassUID); DcmUniqueIdentifier imageUID(DCM_SOPInstanceUID); OFString ofstudyUID; OFString ofseriesUID; OFString ofsopclassUID; OFString ofimageUID; OFString aString; char buf[20]; Sint32 i=0; Sint32 ofnumberOfFrames=0; DcmStack stack; READ_FROM_DATASET(DcmIntegerString, numberOfFrames) READ_FROM_DATASET(DcmUniqueIdentifier, studyUID) READ_FROM_DATASET(DcmUniqueIdentifier, seriesUID) READ_FROM_DATASET(DcmUniqueIdentifier, sopclassUID) READ_FROM_DATASET(DcmUniqueIdentifier, imageUID) numberOfFrames.getSint32(ofnumberOfFrames,0); seriesUID.getOFString(ofseriesUID,0); sopclassUID.getOFString(ofsopclassUID,0); imageUID.getOFString(ofimageUID,0); studyUID.getOFString(ofstudyUID,0); OFCondition result = EC_Normal; /* if the image is multiframe, reference all frames */ if (ofnumberOfFrames > 1) { for (i=0; i 0) sprintf(buf, "\\%ld", (long)(i+1)); else sprintf(buf, "%ld", (long)(i+1)); aString += buf; } result = addImageReference(ofstudyUID.c_str(), ofseriesUID.c_str(), ofsopclassUID.c_str(), ofimageUID.c_str(), aString.c_str(), aetitle, filesetID, filesetUID); } else { result = addImageReference(ofstudyUID.c_str(), ofseriesUID.c_str(), ofsopclassUID.c_str(), ofimageUID.c_str(), NULL, aetitle, filesetID, filesetUID); } /* create default displayed area entry for the new referenced image */ if (result == EC_Normal) createDefaultDisplayedArea(dset); /* what is about VOI LUT sequence, annotations, etc. ? */ return result; } OFCondition DcmPresentationState::removeImageReference( const char *studyUID, const char *seriesUID, const char *instanceUID) { if ((studyUID==NULL)||(seriesUID)||(instanceUID==NULL)) return EC_IllegalCall; OFString study; studyInstanceUID.getOFString(study,0); if (study != studyUID) return EC_IllegalCall; referencedSeriesList.removeImageReference(seriesUID, instanceUID); /* still need to remove references from displayed area list, etc. */ return EC_Normal; } OFCondition DcmPresentationState::removeImageReference(DcmItem &dset) { DcmUniqueIdentifier studyUID(DCM_StudyInstanceUID); DcmUniqueIdentifier seriesUID(DCM_SeriesInstanceUID); DcmUniqueIdentifier imageUID(DCM_SOPInstanceUID); OFString ofstudyInstanceUID; OFString ofstudyUID; OFString ofseriesUID; OFString ofimageUID; DcmStack stack; READ_FROM_DATASET(DcmUniqueIdentifier, studyUID) READ_FROM_DATASET(DcmUniqueIdentifier, seriesUID) READ_FROM_DATASET(DcmUniqueIdentifier, imageUID) seriesUID.getOFString(ofseriesUID,0); studyInstanceUID.getOFString(ofstudyInstanceUID,0); if (ofstudyInstanceUID != ofstudyUID) return EC_IllegalCall; imageUID.getOFString(ofimageUID,0); studyUID.getOFString(ofstudyUID,0); referencedSeriesList.removeImageReference(ofseriesUID.c_str(), ofimageUID.c_str()); /* still need to remove references from displayed area list, etc. */ return EC_Normal; } size_t DcmPresentationState::numberOfImageReferences() { return referencedSeriesList.numberOfImageReferences(); } OFCondition DcmPresentationState::getImageReference( size_t idx, OFString& studyUID, OFString& seriesUID, OFString& sopclassUID, OFString& instanceUID, OFString& frames, OFString& aetitle, OFString& filesetID, OFString& filesetUID) { OFCondition result = referencedSeriesList.getImageReference(idx, seriesUID, sopclassUID, instanceUID, frames, aetitle, filesetID, filesetUID); if (EC_Normal == result) result = studyInstanceUID.getOFString(studyUID,0); return result; } DVPSRotationType DcmPresentationState::getRotation() { DVPSRotationType result = DVPSR_0_deg; Uint16 rotation=0; imageRotation.getUint16(rotation,0); if (rotation==90) result = DVPSR_90_deg; else if (rotation==180) result = DVPSR_180_deg; else if (rotation==270) result = DVPSR_270_deg; return result; } OFBool DcmPresentationState::getFlip() { OFBool result = OFFalse; OFString flip; imageHorizontalFlip.getOFString(flip,0); if (flip=="Y") result = OFTrue; return result; } OFCondition DcmPresentationState::setRotation(DVPSRotationType rotation) { // Re-compute all displayed areas DVPSRotationType oldRotation = getRotation(); OFBool flip = getFlip(); displayedAreaSelectionList.rotateAndFlip(oldRotation, flip, rotation, flip); OFCondition result = EC_Normal; switch (rotation) { case DVPSR_0_deg: result = imageRotation.putUint16(0); break; case DVPSR_90_deg: result = imageRotation.putUint16(90); break; case DVPSR_180_deg: result = imageRotation.putUint16(180); break; case DVPSR_270_deg: result = imageRotation.putUint16(270); break; } return result; } OFCondition DcmPresentationState::setFlip(OFBool isFlipped) { // Re-compute all displayed areas DVPSRotationType rotation = getRotation(); OFBool oldFlip = getFlip(); displayedAreaSelectionList.rotateAndFlip(rotation, oldFlip, rotation, isFlipped); if (isFlipped) return imageHorizontalFlip.putString("Y"); else return imageHorizontalFlip.putString("N"); } OFBool DcmPresentationState::haveShutter(DVPSShutterType type) { OFBool result = OFFalse; switch (type) { case DVPSU_rectangular: result = useShutterRectangular; break; case DVPSU_circular: result = useShutterCircular; break; case DVPSU_polygonal: result = useShutterPolygonal; break; case DVPSU_bitmap: result = useShutterBitmap; break; } return result; } Sint32 DcmPresentationState::getRectShutterLV() { Sint32 result=0; shutterLeftVerticalEdge.getSint32(result,0); return result; } Sint32 DcmPresentationState::getRectShutterRV() { Sint32 result=0; shutterRightVerticalEdge.getSint32(result,0); return result; } Sint32 DcmPresentationState::getRectShutterUH() { Sint32 result=0; shutterUpperHorizontalEdge.getSint32(result,0); return result; } Sint32 DcmPresentationState::getRectShutterLH() { Sint32 result=0; shutterLowerHorizontalEdge.getSint32(result,0); return result; } Sint32 DcmPresentationState::getCenterOfCircularShutter_x() { Sint32 result=0; centerOfCircularShutter.getSint32(result,1); return result; } Sint32 DcmPresentationState::getCenterOfCircularShutter_y() { Sint32 result=0; centerOfCircularShutter.getSint32(result,0); return result; } Sint32 DcmPresentationState::getRadiusOfCircularShutter() { Sint32 result=0; radiusOfCircularShutter.getSint32(result,0); return result; } size_t DcmPresentationState::getNumberOfPolyShutterVertices() { return (verticesOfThePolygonalShutter.getVM() / 2); } OFCondition DcmPresentationState::getPolyShutterVertex(size_t idx, Sint32& x, Sint32& y) { x=0; y=0; OFCondition result = verticesOfThePolygonalShutter.getSint32(y,2*idx); if (EC_Normal==result) result = verticesOfThePolygonalShutter.getSint32(x,2*idx+1); return result; } OFCondition DcmPresentationState::setPolyShutterOrigin(Sint32 x, Sint32 y) { char buf[80]; useShutterPolygonal = OFFalse; verticesOfThePolygonalShutter.clear(); sprintf(buf, "%ld\\%ld", (long)y, (long)x); return verticesOfThePolygonalShutter.putString(buf); } Uint16 DcmPresentationState::getShutterPresentationValue() { Uint16 result=0; shutterPresentationValue.getUint16(result,0); return result; } OFCondition DcmPresentationState::setShutterPresentationValue(Uint16 pvalue) { return shutterPresentationValue.putUint16(pvalue,0); } const char *DcmPresentationState::getPresentationLabel() { char *value = NULL; if (EC_Normal != presentationLabel.getString(value)) return NULL; return value; } const char *DcmPresentationState::getPresentationDescription() { char *value = NULL; if (EC_Normal != presentationDescription.getString(value)) return NULL; return value; } const char *DcmPresentationState::getPresentationCreatorsName() { char *value = NULL; if (EC_Normal != presentationCreatorsName.getString(value)) return NULL; return value; } OFCondition DcmPresentationState::setPresentationLabel(const char *label) { return presentationLabel.putString(label); } OFCondition DcmPresentationState::setPresentationDescription(const char *descr) { return presentationDescription.putString(descr); } OFCondition DcmPresentationState::setPresentationCreatorsName(const char *name) { return presentationCreatorsName.putString(name); } void DcmPresentationState::sortGraphicLayers() { graphicLayerList.sortGraphicLayers(); return; } size_t DcmPresentationState::getNumberOfGraphicLayers() { return graphicLayerList.size(); } const char *DcmPresentationState::getGraphicLayerName(size_t idx) { return graphicLayerList.getGraphicLayerName(idx); } size_t DcmPresentationState::getGraphicLayerIndex(const char *name) { return graphicLayerList.getGraphicLayerIndex(name); } const char *DcmPresentationState::getGraphicLayerDescription(size_t idx) { return graphicLayerList.getGraphicLayerDescription(idx); } OFBool DcmPresentationState::haveGraphicLayerRecommendedDisplayValue(size_t idx) { return graphicLayerList.haveGraphicLayerRecommendedDisplayValue(idx); } OFCondition DcmPresentationState::getGraphicLayerRecommendedDisplayValueGray(size_t idx, Uint16& gray) { return graphicLayerList.getGraphicLayerRecommendedDisplayValueGray(idx,gray); } OFCondition DcmPresentationState::getGraphicLayerRecommendedDisplayValueRGB(size_t idx, Uint16& r, Uint16& g, Uint16& b) { return graphicLayerList.getGraphicLayerRecommendedDisplayValueRGB(idx,r,g,b); } OFCondition DcmPresentationState::setGraphicLayerRecommendedDisplayValueGray(size_t idx, Uint16 gray) { return graphicLayerList.setGraphicLayerRecommendedDisplayValueGray(idx,gray); } OFCondition DcmPresentationState::setGraphicLayerRecommendedDisplayValueRGB(size_t idx, Uint16 r, Uint16 g, Uint16 b) { return graphicLayerList.setGraphicLayerRecommendedDisplayValueRGB(idx,r,g,b); } void DcmPresentationState::removeGraphicLayerRecommendedDisplayValue(size_t idx, OFBool rgb, OFBool monochrome) { graphicLayerList.removeGraphicLayerRecommendedDisplayValue(idx, rgb, monochrome); return; } OFCondition DcmPresentationState::setGraphicLayerName(size_t idx, const char *name) { const char *oname = graphicLayerList.getGraphicLayerName(idx); if (name==NULL) return EC_IllegalCall; OFString oldName(oname); // make a copy of the pointer which will become invalid OFCondition result=graphicLayerList.setGraphicLayerName(idx, name); if (EC_Normal==result) { activationLayerList.renameLayer(oldName.c_str(), name); graphicAnnotationList.renameLayer(oldName.c_str(), name); } return result; } OFCondition DcmPresentationState::setGraphicLayerDescription(size_t idx, const char *descr) { return graphicLayerList.setGraphicLayerDescription(idx, descr); } OFCondition DcmPresentationState::toFrontGraphicLayer(size_t idx) { return graphicLayerList.toFrontGraphicLayer(idx); } OFCondition DcmPresentationState::toBackGraphicLayer(size_t idx) { return graphicLayerList.toBackGraphicLayer(idx); } OFCondition DcmPresentationState::exchangeGraphicLayers(size_t idx1, size_t idx2) { return graphicLayerList.exchangeGraphicLayers(idx1, idx2); } OFCondition DcmPresentationState::addGraphicLayer( const char *gLayer, const char *gLayerDescription) { return graphicLayerList.addGraphicLayer(gLayer,gLayerDescription); } void DcmPresentationState::cleanupLayers() { graphicAnnotationList.cleanupLayers(); graphicLayerList.cleanupLayers(activationLayerList, graphicAnnotationList); } OFCondition DcmPresentationState::setCharset(DVPScharacterSet charset) { if (charset==DVPSC_other) return EC_IllegalCall; const char *cname=NULL; switch (charset) { case DVPSC_latin1: cname = "ISO_IR 100"; break; case DVPSC_latin2: cname = "ISO_IR 101"; break; case DVPSC_latin3: cname = "ISO_IR 109"; break; case DVPSC_latin4: cname = "ISO_IR 110"; break; case DVPSC_latin5: cname = "ISO_IR 148"; break; case DVPSC_cyrillic: cname = "ISO_IR 144"; break; case DVPSC_arabic: cname = "ISO_IR 127"; break; case DVPSC_greek: cname = "ISO_IR 126"; break; case DVPSC_hebrew: cname = "ISO_IR 138"; break; case DVPSC_japanese: cname = "ISO_IR 13"; break; default: // can only be DVPSC_ascii break; } if (cname) return specificCharacterSet.putString(cname); else { specificCharacterSet.clear(); return EC_Normal; } } DVPScharacterSet DcmPresentationState::getCharset() { if (specificCharacterSet.getLength()==0) return DVPSC_ascii; OFString aString; specificCharacterSet.getOFString(aString,0); if (aString == "ISO_IR 6") return DVPSC_ascii; else if (aString == "ISO_IR 100") return DVPSC_latin1; else if (aString == "ISO_IR 101") return DVPSC_latin2; else if (aString == "ISO_IR 109") return DVPSC_latin3; else if (aString == "ISO_IR 110") return DVPSC_latin4; else if (aString == "ISO_IR 148") return DVPSC_latin5; else if (aString == "ISO_IR 144") return DVPSC_cyrillic; else if (aString == "ISO_IR 127") return DVPSC_arabic; else if (aString == "ISO_IR 126") return DVPSC_greek; else if (aString == "ISO_IR 138") return DVPSC_hebrew; else if (aString == "ISO_IR 13") return DVPSC_japanese; /* default */ return DVPSC_other; } const char *DcmPresentationState::getCharsetString() { char *c = NULL; if (EC_Normal == specificCharacterSet.getString(c)) return c; else return NULL; } size_t DcmPresentationState::getNumberOfCurves(size_t layer) { return activationLayerList.getNumberOfActivations( graphicLayerList.getGraphicLayerName(layer), OFTrue); } OFCondition DcmPresentationState::removeCurve(size_t layer, size_t idx) { Uint16 group = activationLayerList.getActivationGroup( graphicLayerList.getGraphicLayerName(layer), idx, OFTrue); if (group == 0) return EC_IllegalCall; activationLayerList.removeActivation(group); return EC_Normal; } OFCondition DcmPresentationState::moveCurve(size_t old_layer, size_t idx, size_t new_layer) { const char *lname = graphicLayerList.getGraphicLayerName(new_layer); if (lname==NULL) return EC_IllegalCall; Uint16 group = activationLayerList.getActivationGroup( graphicLayerList.getGraphicLayerName(old_layer), idx, OFTrue); if (group == 0) return EC_IllegalCall; activationLayerList.removeActivation(group); return activationLayerList.setActivation(group, lname); } size_t DcmPresentationState::getNumberOfActiveOverlays(size_t layer) { return activationLayerList.getNumberOfActivations( graphicLayerList.getGraphicLayerName(layer), OFFalse); } Uint16 DcmPresentationState::getActiveOverlayGroup(size_t layer, size_t idx) { return activationLayerList.getActivationGroup(graphicLayerList.getGraphicLayerName(layer), idx, OFFalse); } size_t DcmPresentationState::getNumberOfOverlaysInPresentationState() { return overlayList.size(); } Uint16 DcmPresentationState::getOverlayInPresentationStateGroup(size_t idx) { DVPSOverlay *overlay = overlayList.getOverlay(idx); if (overlay) return (0x6000+overlay->getOverlayGroup()); return 0; } const char *DcmPresentationState::getOverlayInPresentationStateLabel(size_t idx) { DVPSOverlay *overlay = overlayList.getOverlay(idx); if (overlay) return overlay->getOverlayLabel(); return NULL; } const char *DcmPresentationState::getOverlayInPresentationStateDescription(size_t idx) { DVPSOverlay *overlay = overlayList.getOverlay(idx); if (overlay) return overlay->getOverlayDescription(); return NULL; } size_t DcmPresentationState::getOverlayInPresentationStateActivationLayer(size_t idx) { DVPSOverlay *overlay = overlayList.getOverlay(idx); if (overlay) { const char *layerName = activationLayerList.getActivationLayer(0x6000+overlay->getOverlayGroup()); if (layerName) return graphicLayerList.getGraphicLayerIndex(layerName); } return DVPS_IDX_NONE; } OFBool DcmPresentationState::overlayIsBitmapShutter(size_t idx) { if (shutterOverlayGroup.getLength() == 0) return OFFalse; Uint16 shutterGroup=0; if (EC_Normal == shutterOverlayGroup.getUint16(shutterGroup,0)) { DVPSOverlay *overlay = overlayList.getOverlay(idx); if (overlay) return (shutterGroup == 0x6000+overlay->getOverlayGroup()); } return OFFalse; } OFBool DcmPresentationState::overlayInPresentationStateIsROI(size_t idx) { DVPSOverlay *overlay = overlayList.getOverlay(idx); if (overlay) return overlay->isROI(); return OFFalse; } OFCondition DcmPresentationState::moveOverlay(size_t old_layer, size_t idx, size_t new_layer) { const char *lname = graphicLayerList.getGraphicLayerName(new_layer); if (lname==NULL) return EC_IllegalCall; Uint16 group = activationLayerList.getActivationGroup( graphicLayerList.getGraphicLayerName(old_layer), idx, OFFalse); if (group == 0) return EC_IllegalCall; activationLayerList.removeActivation(group); return activationLayerList.setActivation(group, lname); } /* * $Log: dcmpstat.cc,v $ * Revision 1.15 2010-10-14 13:14:31 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.14 2010-09-24 13:32:58 joergr * Compared names of SOP Class UIDs with 2009 edition of the DICOM standard. The * resulting name changes are mainly caused by the fact that the corresponding * SOP Class is now retired. * * Revision 1.13 2010-08-09 13:21:56 joergr * Updated data dictionary to 2009 edition of the DICOM standard. From now on, * the official "keyword" is used for the attribute name which results in a * number of minor changes (e.g. "PatientsName" is now called "PatientName"). * * Revision 1.12 2010-04-29 10:36:20 joergr * Fixed typo in log message. * * Revision 1.11 2009-12-15 14:50:49 uli * Fixes some issues with --logfile and the config's log options. * * Revision 1.10 2009-11-24 14:12:58 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.9 2006-08-15 16:57:01 meichel * Updated the code in module dcmpstat to correctly compile when * all standard C++ classes remain in namespace std. * * Revision 1.8 2005/12/08 15:46:14 meichel * Changed include path schema for all DCMTK header files * * Revision 1.7 2004/08/03 11:43:18 meichel * Headers libc.h and unistd.h are now included via ofstdinc.h * * Revision 1.6 2004/02/13 11:49:36 joergr * Adapted code for changed tag names (e.g. PresentationLabel -> ContentLabel). * * Revision 1.5 2004/02/04 15:57:48 joergr * Removed acknowledgements with e-mail addresses from CVS log. * * Revision 1.4 2003/12/18 16:37:49 meichel * During creation of default presentation state from image the Modality LUT * is now ignored for XA, RF and XA Biplane SOP instances * * Revision 1.3 2003/09/05 14:30:08 meichel * Introduced new API methods that allow Displayed Areas to be queried * and set either relative to the image (ignoring rotation and flip) or * in absolute values as defined in the standard. Rotate and flip methods * now adjust displayed areas in the presentation state. * * Revision 1.2 2003/09/05 08:37:46 meichel * Fixed minor issue that caused certain error messages during the * parse process on a GSPS object to be "swallowed". * * Revision 1.1 2003/08/27 14:57:20 meichel * Splitted class DVPresentationState into a base class DcmPresentationState * that does not depend on module dcmimgle and current derived class with * public API identical to the previous version. * * Revision 1.76 2003/06/04 12:30:29 meichel * Added various includes needed by MSVC5 with STL * * Revision 1.75 2003/04/14 14:28:05 meichel * Added explicit typecasts in calls to pow(). Needed by Visual C++ .NET 2003. * * Revision 1.74 2002/12/09 13:28:16 joergr * Renamed parameter/local variable to avoid name clashes with global * declaration left and/or right (used for as iostream manipulators). * * Revision 1.73 2002/12/04 10:41:38 meichel * Changed toolkit to use OFStandard::ftoa instead of sprintf for all * double to string conversions that are supposed to be locale independent * * Revision 1.72 2002/11/27 15:48:15 meichel * Adapted module dcmpstat to use of new header file ofstdinc.h * * Revision 1.71 2002/04/16 14:02:22 joergr * Added configurable support for C++ ANSI standard includes (e.g. streams). * * Revision 1.70 2002/01/08 10:40:58 joergr * Corrected spelling of function dcmGenerateUniqueIdentifier(). * Changed prefix of UIDs created for series and studies (now using constants * SITE_SERIES_UID_ROOT and SITE_STUDY_UID_ROOT which are supposed to be used * in these cases). * * Revision 1.69 2001/11/28 13:57:05 joergr * Check return value of DcmItem::insert() statements where appropriate to * avoid memory leaks when insert procedure fails. * * Revision 1.68 2001/09/28 13:50:14 joergr * Added "#include " to keep gcc 3.0 quiet. * * Revision 1.67 2001/09/26 15:36:34 meichel * Adapted dcmpstat to class OFCondition * * Revision 1.66 2001/06/01 15:50:39 meichel * Updated copyright header * * Revision 1.65 2000/11/13 15:50:46 meichel * Added dcmpstat support methods for creating image references * in SR documents. * * Revision 1.64 2000/07/12 12:49:05 joergr * Added comment. * * Revision 1.63 2000/07/03 14:04:01 joergr * Fixed bug: VOI LUT transform defined per frame was not supported by the * method renderPixelData(). * * Revision 1.62 2000/06/09 10:15:37 joergr * Added support for rendering inverse presentation LUT into print bitmaps. * * Revision 1.61 2000/06/08 17:39:07 joergr * Corrected bug in addImageReferenceToPState(). * * Revision 1.60 2000/06/08 10:44:38 meichel * Implemented Referenced Presentation LUT Sequence on Basic Film Session level. * Empty film boxes (pages) are not written to file anymore. * * Revision 1.59 2000/06/02 16:01:08 meichel * Adapted all dcmpstat classes to use OFConsole for log and error output * * Revision 1.58 2000/06/02 12:48:04 joergr * Reject invalid frame numbers in method selectImageFrameNumber(). * * Revision 1.57 2000/05/31 13:02:40 meichel * Moved dcmpstat macros and constants into a common header file * * Revision 1.56 2000/05/30 14:22:14 joergr * Renamed some variables to avoid compiler warnings (reported by gcc 2.9x with * additional compiler flags). * * Revision 1.55 2000/05/30 13:59:16 joergr * Removed methods which were already marked as "retired". * Added new function allowing to set a VOILUT created from a given gamma * value. * * Revision 1.54 2000/03/08 16:29:11 meichel * Updated copyright header. * * Revision 1.53 2000/03/03 14:14:06 meichel * Implemented library support for redirecting error messages into memory * instead of printing them to stdout/stderr for GUI applications. * * Revision 1.52 2000/02/23 15:12:57 meichel * Corrected macro for Borland C++ Builder 4 workaround. * * Revision 1.51 2000/02/01 11:54:45 meichel * Avoiding to include as extern "C" on Borland C++ Builder 4, * workaround for bug in compiler header files. * * Revision 1.50 1999/11/15 19:03:13 joergr * Changed behaviour of method getOverlayData(): parameter 'transp' replaced by * 'fore' to specify the foreground color used for the overlay plane. * Fixed bug concerning the setting of window center and width for the preview * image. * * Revision 1.49 1999/11/12 16:51:54 meichel * Corrected creation of circular shutters, X/Y coordinates were swapped. * * Revision 1.48 1999/10/25 18:46:07 joergr * Fixed bug caused by the incorrect order of x/y coordinates for circular * and polygonal shutters (the DICOM standard is somehow inconsistent in this * respect). * * Revision 1.47 1999/10/22 09:08:23 joergr * Added validity check to methods setting pixel aspect ratio and pixel * spacing (>0). Fixed problems with incorrect pixel spacing (0\0) stored in * sample images. * * Revision 1.46 1999/10/20 18:41:20 joergr * Added explicit type cast to make MSVC happy. * * Revision 1.45 1999/10/20 11:01:16 joergr * Enhanced method getOverlayData to support 12 bit data for print. * Enhanced method convertPValueToDDL to support 12 bit data for print. * Added support for a down-scaled preview image of the current DICOM image * (e.g. useful for online-windowing or print preview). * Always use the variable 'currentImageSelectedFrame' as the frame number, * not 1. * * Revision 1.44 1999/10/19 16:24:58 meichel * Corrected handling of MONOCHROME1 images when used with P-LUTs * * Revision 1.43 1999/10/18 10:18:52 joergr * Use the current display shutter P-value for the border area of print * bitmaps. * Switch off time consuming interpolation for implicite scaling of print * bitmaps. * * Revision 1.42 1999/10/13 14:12:02 meichel * Added config file entries and access methods * for user-defined VOI presets, log directory, verbatim logging * and an explicit list of image display formats for each printer. * * Revision 1.41 1999/10/07 17:22:03 meichel * Reworked management of Presentation LUTs in order to create tighter * coupling between Softcopy and Print. * * Revision 1.40 1999/10/06 13:24:50 joergr * Fixed bug in renderPixelData: images haven't been flipped correctly for * PrintBitmap. * Corrected creation of PrintBitmap pixel data: VOI windows should be applied * before clipping to avoid that the region outside the image (border) is also * windowed (this requires a new method in dcmimgle to create a DicomImage * with the grayscale transformations already applied). * * Revision 1.39 1999/09/30 12:04:04 joergr * Corrected typos and formatting; modified comments. * * Revision 1.38 1999/09/20 13:22:23 joergr * Corrected bug with clipping of rotated print bitmaps (removed inconsistency * with 90 and 270 degree rotation). * * Revision 1.37 1999/09/17 14:29:46 meichel * Moved static helper functions to new class DVPSHelper, removed some unused code. * * Revision 1.36 1999/09/13 14:01:23 thiel * correction of DEBUG code for LIN_OD * * Revision 1.35 1999/09/10 13:07:38 thiel * correction of LIN OD in createFromImage * * Revision 1.34 1999/09/10 12:46:58 meichel * Added implementations for a number of print API methods. * * Revision 1.33 1999/09/10 09:16:44 joergr * Added support for CIELAB display function. New methods to handle display * functions. Old methods are marked as retired and should be removed asap. * * Revision 1.32 1999/09/10 07:32:44 thiel * Added Presentation LUT Shape LIN OD * * Revision 1.31 1999/09/07 09:05:13 joergr * Completed support for getting a print bitmap out of a pstate object. * * Revision 1.30 1999/09/01 16:15:11 meichel * Added support for requested image size to print routines * * Revision 1.29 1999/08/31 14:01:38 meichel * Fixed print image crop boundary computation problem * * Revision 1.28 1999/08/27 15:57:51 meichel * Added methods for saving hardcopy images and stored print objects * either in file or in the local database. * * Revision 1.27 1999/08/25 16:51:17 joergr * Added minimal support to get a print bitmap out of a pstate object. * * Revision 1.26 1999/07/30 13:35:01 meichel * Added new classes managing Stored Print objects * * Revision 1.25 1999/07/28 07:57:26 meichel * Minor correction for VC++ 5. * * Revision 1.24 1999/07/22 16:40:04 meichel * Adapted dcmpstat data structures and API to supplement 33 letter ballot text. * * Revision 1.23 1999/07/14 12:03:44 meichel * Updated data dictionary for supplement 29, 39, 33_lb, CP packet 4 and 5. * Corrected dcmtk applications for changes in attribute name constants. * * Revision 1.22 1999/05/04 15:27:27 meichel * Minor code purifications to keep gcc on OSF1 quiet. * * Revision 1.21 1999/05/03 11:01:38 joergr * Minor code purifications to keep Sun CC 2.0.1 quiet. * * Revision 1.20 1999/04/28 11:34:29 meichel * When creating a presentation state for an image, modality rescale/slope * without rescale type is handled now in a more lenient way. * * Revision 1.19 1999/04/27 11:26:01 joergr * Added method to check whether current image is inverse or not. * * Revision 1.18 1999/03/22 09:52:42 meichel * Reworked data dictionary based on the 1998 DICOM edition and the latest * supplement versions. Corrected dcmtk applications for minor changes * in attribute name constants. * * Revision 1.17 1999/03/22 09:06:48 joergr * Added parameter to get value of (transparent) background color for method * getOverlayData. * * Revision 1.16 1999/03/03 17:58:07 joergr * Changed implementation of invertImage(): set modify flag for all plut types. * * Revision 1.15 1999/03/03 14:02:03 joergr * Changed implementation of invertImage() to avoid compiler errors on MSVC5 * ('return' has to be last statement). * * Revision 1.14 1999/03/03 13:32:34 joergr * Added method to invert an image by changing the presentation state LUT or * shape. * Changed implementation of method 'getOverlayData()': now conversion from * P-value to DDL is implictly performed and the correct P-value for the related * layer is used. * * Revision 1.13 1999/02/25 18:41:42 joergr * Added method to fill pixel data into an externally handled storage area. * Added initialization of local variable to avoid compiler warnings (reported * by gcc 2.7.2.1 on Linux). * * Revision 1.12 1999/02/23 11:49:05 joergr * Corrected bug: shutters were not saved correctly (sometimes even ignored). * * Revision 1.11 1999/02/18 11:36:40 meichel * Added new method convertPValueToDDL() to DcmPresentationState * that maps P-Values to DDLs. * * Revision 1.10 1999/02/17 10:05:35 meichel * Moved creation of Display Function object from DcmPresentationState to * DVInterface to avoid unnecessary re-reads. * * Revision 1.9 1999/02/09 15:59:09 meichel * Implemented bitmap shutter activation amd method for * exchanging graphic layers. * * Revision 1.8 1999/02/05 17:45:39 meichel * Added config file entry for monitor characteristics file. Monitor charac- * teristics are passed to dcmimage if present to activate Barten transform. * * Revision 1.7 1999/01/18 17:30:36 meichel * Now preventing VOI Windows with a width <= 0.0. Presentation label and * creator's name are now correctly set. * * Revision 1.6 1999/01/15 17:32:59 meichel * added methods to DcmPresentationState allowing to access the image * references in the presentation state. Also added methods allowing to * get the width and height of the attached image. * * Revision 1.5 1999/01/11 13:35:51 meichel * added new methods getImageAspectRatio, getImageMinMaxPixelRange and * getImageMinMaxPixelValue to class DcmPresentationState. * * Revision 1.4 1998/12/23 14:02:27 meichel * Updated for changed interfaces in dcmimage overlays. * Fixed bug affecting overlay origin delivered to dcmimage. * * Revision 1.3 1998/12/22 17:57:18 meichel * Implemented Presentation State interface for overlays, * VOI LUTs, VOI windows, curves. Added test program that * allows to add curve data to DICOM images. * * Revision 1.2 1998/12/14 16:10:48 meichel * Implemented Presentation State interface for graphic layers, * text and graphic annotations, presentation LUTs. * * Revision 1.1 1998/11/27 14:50:47 meichel * Initial Release. * */ dcmtk-3.6.0/dcmpstat/libsrc/dvpspll.cc0000644000310500011400000002310011455601070017122 0ustar joergrdicom3/* * * Copyright (C) 1999-2010, 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: DVPSImageBoxContent_PList * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:14:32 $ * CVS/RCS Revision: $Revision: 1.21 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmpstat/dvpspll.h" #include "dcmtk/dcmpstat/dvpspl.h" /* for DVPSImageBoxContent */ #include "dcmtk/dcmpstat/dvpshlp.h" /* for class DVPSHelper */ #include "dcmtk/dcmpstat/dvpsibl.h" /* for class DVPSImageBoxContent_PList */ #include "dcmtk/dcmimgle/diluptab.h" /* for class DiLookupTable */ #include "dcmtk/dcmpstat/dvpsdef.h" #include "dcmtk/dcmpstat/dvpsib.h" /* for DVPSImageBoxContent, needed by MSVC5 with STL */ /* --------------- class DVPSImageBoxContent_PList --------------- */ DVPSPresentationLUT_PList::DVPSPresentationLUT_PList() : list_() { } DVPSPresentationLUT_PList::DVPSPresentationLUT_PList(const DVPSPresentationLUT_PList &arg) : list_() { OFListConstIterator(DVPSPresentationLUT *) first = arg.list_.begin(); OFListConstIterator(DVPSPresentationLUT *) last = arg.list_.end(); while (first != last) { list_.push_back((*first)->clone()); ++first; } } DVPSPresentationLUT_PList::~DVPSPresentationLUT_PList() { clear(); } void DVPSPresentationLUT_PList::clear() { OFListIterator(DVPSPresentationLUT *) first = list_.begin(); OFListIterator(DVPSPresentationLUT *) last = list_.end(); while (first != last) { delete (*first); first = list_.erase(first); } } OFCondition DVPSPresentationLUT_PList::read(DcmItem &dset) { OFCondition result = EC_Normal; DcmStack stack; DVPSPresentationLUT *newLUT = NULL; DcmSequenceOfItems *dseq=NULL; DcmItem *ditem=NULL; if (EC_Normal == dset.search(DCM_RETIRED_PresentationLUTContentSequence, stack, ESM_fromHere, OFFalse)) { dseq=(DcmSequenceOfItems *)stack.top(); if (dseq) { unsigned long numItems = dseq->card(); for (unsigned int i=0; igetItem(i); newLUT = new DVPSPresentationLUT(); if (newLUT && ditem) { result = newLUT->read(*ditem, OFTrue); list_.push_back(newLUT); } else result = EC_MemoryExhausted; } } } return result; } OFCondition DVPSPresentationLUT_PList::write(DcmItem &dset) { if (size()==0) return EC_Normal; // don't write if sequence is empty OFCondition result = EC_Normal; DcmSequenceOfItems *dseq=NULL; DcmItem *ditem=NULL; dseq = new DcmSequenceOfItems(DCM_RETIRED_PresentationLUTContentSequence); if (dseq) { OFListIterator(DVPSPresentationLUT *) first = list_.begin(); OFListIterator(DVPSPresentationLUT *) last = list_.end(); while (first != last) { if (result==EC_Normal) { ditem = new DcmItem(); if (ditem) { result = (*first)->write(*ditem, OFTrue); if (result==EC_Normal) dseq->insert(ditem); else delete ditem; } else result = EC_MemoryExhausted; } ++first; } if (result==EC_Normal) dset.insert(dseq, OFTrue /*replaceOld*/); else delete dseq; } else result = EC_MemoryExhausted; return result; } void DVPSPresentationLUT_PList::cleanup(const char *filmBox, DVPSImageBoxContent_PList& imageBoxes) { OFString aFilmbox; if (filmBox) aFilmbox = filmBox; const char *uid; OFListIterator(DVPSPresentationLUT *) first = list_.begin(); OFListIterator(DVPSPresentationLUT *) last = list_.end(); while (first != last) { uid = (*first)->getSOPInstanceUID(); if (uid && ((aFilmbox == uid)||(imageBoxes.presentationLUTInstanceUIDisUsed(uid)))) ++first; else { delete (*first); first = list_.erase(first); } } return; } DVPSPresentationLUT *DVPSPresentationLUT_PList::findPresentationLUT(const char *instanceUID) { if (instanceUID==NULL) return NULL; OFString instance(instanceUID); OFListIterator(DVPSPresentationLUT *) first = list_.begin(); OFListIterator(DVPSPresentationLUT *) last = list_.end(); const char *c; while (first != last) { c = (*first)->getSOPInstanceUID(); if (c && (instance == c)) return (*first); ++first; } return NULL; } const char *DVPSPresentationLUT_PList::addPresentationLUT(DVPSPresentationLUT *newLUT, OFBool inversePLUT) { if (newLUT == NULL) return NULL; DiLookupTable *diLUT = NULL; const char *result = NULL; // 'INVERSE' LUT shape is undefined for Print and has already // been rendered into the bitmap at this stage. DVPSPresentationLUTType lutType = newLUT->getType(); if (lutType == DVPSP_inverse) lutType = DVPSP_identity; DVPSPresentationLUT *myLUT = newLUT->clone(); if (myLUT) { // make sure that we don't copy an inverse LUT shape if (myLUT->getType() == DVPSP_inverse) myLUT->setType(DVPSP_identity); if (lutType == DVPSP_table) { if (inversePLUT) myLUT->invert(); diLUT = myLUT->createDiLookupTable(); } } else return NULL; // see if myLUT is already somewhere in the list OFListIterator(DVPSPresentationLUT *) first = list_.begin(); OFListIterator(DVPSPresentationLUT *) last = list_.end(); while (first != last) { if ((*first)->getType() == lutType) { if (lutType == DVPSP_table) { if ((*first)->compareDiLookupTable(diLUT)) { result = (*first)->getSOPInstanceUID(); break; } } else { result = (*first)->getSOPInstanceUID(); break; } } ++first; } delete diLUT; if (result) { delete myLUT; return result; } // no match, store new LUT char uid[100]; dcmGenerateUniqueIdentifier(uid); myLUT->setSOPInstanceUID(uid); list_.push_back(myLUT); result = myLUT->getSOPInstanceUID(); return result; } void DVPSPresentationLUT_PList::printSCPDelete(T_DIMSE_Message& rq, T_DIMSE_Message& rsp) { OFListIterator(DVPSPresentationLUT *) first = list_.begin(); OFListIterator(DVPSPresentationLUT *) last = list_.end(); OFBool found = OFFalse; OFString theUID(rq.msg.NDeleteRQ.RequestedSOPInstanceUID); while ((first != last) && (!found)) { if (theUID == (*first)->getSOPInstanceUID()) found = OFTrue; else ++first; } if (found) { delete (*first); list_.erase(first); } else { // presentation LUT does not exist or wrong instance UID DCMPSTAT_INFO("cannot delete presentation LUT with instance UID '" << rq.msg.NDeleteRQ.RequestedSOPInstanceUID << "': object does not exist."); rsp.msg.NDeleteRSP.DimseStatus = STATUS_N_NoSuchObjectInstance; } } /* * $Log: dvpspll.cc,v $ * Revision 1.21 2010-10-14 13:14:32 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.20 2009-11-24 14:12:59 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.19 2008-04-30 12:38:43 meichel * Fixed compile errors due to changes in attribute tag names * * Revision 1.18 2006/08/15 16:57:02 meichel * Updated the code in module dcmpstat to correctly compile when * all standard C++ classes remain in namespace std. * * Revision 1.17 2005/12/08 15:46:40 meichel * Changed include path schema for all DCMTK header files * * Revision 1.16 2004/02/04 15:57:49 joergr * Removed acknowledgements with e-mail addresses from CVS log. * * Revision 1.15 2003/06/12 18:23:11 joergr * Modified code to use const_iterators where appropriate (required for STL). * * Revision 1.14 2003/06/04 12:30:28 meichel * Added various includes needed by MSVC5 with STL * * Revision 1.13 2003/06/04 10:18:07 meichel * Replaced private inheritance from template with aggregation * * Revision 1.12 2002/01/08 10:35:46 joergr * Corrected spelling of function dcmGenerateUniqueIdentifier(). * * Revision 1.11 2001/11/28 13:56:58 joergr * Check return value of DcmItem::insert() statements where appropriate to * avoid memory leaks when insert procedure fails. * * Revision 1.10 2001/09/26 15:36:30 meichel * Adapted dcmpstat to class OFCondition * * Revision 1.9 2001/06/01 15:50:35 meichel * Updated copyright header * * Revision 1.8 2000/06/07 13:17:07 meichel * now using DIMSE status constants and log facilities defined in dcmnet * * Revision 1.7 2000/06/02 16:01:04 meichel * Adapted all dcmpstat classes to use OFConsole for log and error output * * Revision 1.6 2000/05/31 12:58:16 meichel * Added initial Print SCP support * * Revision 1.5 2000/03/08 16:29:08 meichel * Updated copyright header. * * Revision 1.4 2000/03/03 14:14:02 meichel * Implemented library support for redirecting error messages into memory * instead of printing them to stdout/stderr for GUI applications. * * Revision 1.3 2000/02/29 12:16:20 meichel * Fixed bug in dcmpstat library that caused Monochrome1 images * to be printed inverse if a Presentation LUT was applied. * * Revision 1.2 1999/10/19 14:48:24 meichel * added support for the Basic Annotation Box SOP Class * as well as access methods for Max Density and Min Density. * * Revision 1.1 1999/10/07 17:22:00 meichel * Reworked management of Presentation LUTs in order to create tighter * coupling between Softcopy and Print. * * */ dcmtk-3.6.0/dcmpstat/libsrc/dvpscf.cc0000644000310500011400000014111511457521676016751 0ustar joergrdicom3/* * * Copyright (C) 1998-2010, 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: Joerg Riesmeier, Marco Eichelberg * * Purpose: DVConfiguration * * Last Update: $Author: uli $ * Update Date: $Date: 2010-10-20 08:09:34 $ * CVS/RCS Revision: $Revision: 1.47 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmpstat/dvpscf.h" /* for DVConfiguration */ #include "dcmtk/ofstd/ofconfig.h" /* for class OFConfigFile */ #include "dcmtk/dcmpstat/dvpsdef.h" /* for constants */ #include "dcmtk/ofstd/ofstd.h" /* for class OFStandard */ #define INCLUDE_CSTDIO #define INCLUDE_CSTRING #define INCLUDE_CCTYPE #include "dcmtk/ofstd/ofstdinc.h" #ifndef HAVE_WINDOWS_H /* some Unix operating systems do not define a prototype for strncasecmp * although the function is known. */ #ifndef HAVE_PROTOTYPE_STRNCASECMP extern "C" int strncasecmp(const char *s1, const char *s2, size_t n); #endif #endif /* keywords for configuration file */ #define L0_AETITLE "AETITLE" #define L0_ALWAYSDELETETERMINATEJOBS "ALWAYSDELETETERMINATEJOBS" #define L0_ANNOTATION "ANNOTATION" #define L0_AUTOCREATECONFIGFILE "AUTOCREATECONFIGFILE" #define L0_BINARYLOG "BINARYLOG" #define L0_BITPRESERVINGMODE "BITPRESERVINGMODE" #define L0_BORDERDENSITY "BORDERDENSITY" #define L0_CACERTIFICATEDIRECTORY "CACERTIFICATEDIRECTORY" #define L0_CENTER "CENTER" #define L0_CERTIFICATE "CERTIFICATE" #define L0_CHARACTERISTICS "CHARACTERISTICS" #define L0_CHECK "CHECK" #define L0_CIPHERSUITES "CIPHERSUITES" #define L0_CODE "CODE" #define L0_CORRECTUIDPADDING "CORRECTUIDPADDING" #define L0_DEFAULTILLUMINATION "DEFAULTILLUMINATION" #define L0_DEFAULTREFLECTION "DEFAULTREFLECTION" #define L0_DELETEPRINTJOBS "DELETEPRINTJOBS" #define L0_DESCRIPTION "DESCRIPTION" #define L0_DETAILEDLOG "DETAILEDLOG" #define L0_DICOMNAME "DICOMNAME" #define L0_DIFFIEHELLMANPARAMETERS "DIFFIEHELLMANPARAMETERS" #define L0_DIRECTORY "DIRECTORY" #define L0_DISABLENEWVRS "DISABLENEWVRS" #define L0_DISPLAYFORMAT "DISPLAYFORMAT" #define L0_DUMP "DUMP" #define L0_EMPTYIMAGEDENSITY "EMPTYIMAGEDENSITY" #define L0_FILENAME "FILENAME" #define L0_FILMDESTINATION "FILMDESTINATION" #define L0_FILMSIZEID "FILMSIZEID" #define L0_HOSTNAME "HOSTNAME" #define L0_IMPLICITONLY "IMPLICITONLY" #define L0_KEEPMESSAGEPORTOPEN "KEEPMESSAGEPORTOPEN" #define L0_LOGDIRECTORY "LOGDIRECTORY" #define L0_LOGFILE "LOGFILE" #define L0_LOGIN "LOGIN" #define L0_LOGLEVEL "LOGLEVEL" #define L0_MAGNIFICATIONTYPE "MAGNIFICATIONTYPE" #define L0_MAXASSOCIATIONS "MAXASSOCIATIONS" #define L0_MAXCOLUMNS "MAXCOLUMNS" #define L0_MAXDENSITY "MAXDENSITY" #define L0_MAXPDU "MAXPDU" #define L0_MAXPRINTRESOLUTION "MAXPRINTRESOLUTION" #define L0_MAXROWS "MAXROWS" #define L0_MEDIUMTYPE "MEDIUMTYPE" #define L0_MESSAGEPORT "MESSAGEPORT" #define L0_MINDENSITY "MINDENSITY" #define L0_MINPRINTRESOLUTION "MINPRINTRESOLUTION" #define L0_MODALITY "MODALITY" #define L0_NAME "NAME" #define L0_OMITSOPCLASSUIDFROMCREATERESPONSE "OMITSOPCLASSUIDFROMCREATERESPONSE" #define L0_ORGANIZATION "ORGANIZATION" #define L0_PEERAUTHENTICATION "PEERAUTHENTICATION" #define L0_PORT "PORT" #define L0_PRESENTATIONLUTINFILMSESSION "PRESENTATIONLUTINFILMSESSION" #define L0_PRESENTATIONLUTMATCHREQUIRED "PRESENTATIONLUTMATCHREQUIRED" #define L0_PRESENTATIONLUTPREFERSCPRENDERING "PRESENTATIONLUTPREFERSCPRENDERING" #define L0_PREVIEW "PREVIEWSIZE" #define L0_PRIVATEKEY "PRIVATEKEY" #define L0_PRIVATEKEYPASSWORD "PRIVATEKEYPASSWORD" #define L0_RANDOMSEED "RANDOMSEED" #define L0_RECEIVER "RECEIVER" #define L0_RESOLUTION "RESOLUTION" #define L0_RESOLUTIONID "RESOLUTIONID" #define L0_SCREENSIZE "SCREENSIZE" #define L0_SENDER "SENDER" #define L0_SERVER "SERVER" #define L0_SESSIONLABELANNOTATION "SESSIONLABELANNOTATION" #define L0_SLEEP "SLEEP" #define L0_SMOOTHINGTYPE "SMOOTHINGTYPE" #define L0_SPOOLER "SPOOLER" #define L0_SUPPORTS12BIT "SUPPORTS12BIT" #define L0_SUPPORTSDECIMATECROP "SUPPORTSDECIMATECROP" #define L0_SUPPORTSIMAGESIZE "SUPPORTSIMAGESIZE" #define L0_SUPPORTSPRESENTATIONLUT "SUPPORTSPRESENTATIONLUT" #define L0_SUPPORTSTRIM "SUPPORTSTRIM" #define L0_TIMEOUT "TIMEOUT" #define L0_TLSDIRECTORY "TLSDIRECTORY" #define L0_TYPE "TYPE" #define L0_USEPEMFORMAT "USEPEMFORMAT" #define L0_USERKEYDIRECTORY "USERKEYDIRECTORY" #define L0_USETLS "USETLS" #define L0_WIDTH "WIDTH" #define L1_APPLICATION "APPLICATION" #define L1_DATABASE "DATABASE" #define L1_GUI "GUI" #define L1_LUT "LUT" #define L1_REPORT "REPORT" #define L1_MONITOR "MONITOR" #define L1_NETWORK "NETWORK" #define L1_PRINT "PRINT" #define L1_QUERY_RETRIEVE "QUERY_RETRIEVE" #define L1_TLS "TLS" #define L2_COMMUNICATION "COMMUNICATION" #define L2_GENERAL "GENERAL" // L2_HIGHRESOLUTIONGRAPHICS is defined in dvpsdef.h #define L2_LUT "LUT" #define L2_USERS "USERS" #define L2_VOI "VOI" #define L2_REPORT "REPORT" /* --------------- static helper functions --------------- */ static DVPSPeerType getConfigTargetType(const char *val) { DVPSPeerType result = DVPSE_storage; /* default */ if (val==NULL) return result; OFString pstring(val); OFString ostring; size_t len = pstring.length(); unsigned char c; for (size_t i=0; i='a') && (c <= 'z')) ostring += (char)(toupper(c)); else if ((c>='A') && (c <= 'Z')) ostring += c; else if ((c>='0') && (c <= '9')) ostring += c; else if (c=='_') ostring += c; } if (ostring=="PRINTER") result=DVPSE_printRemote; else if (ostring=="LOCALPRINTER") result=DVPSE_printLocal; else if (ostring=="STORAGE") result=DVPSE_storage; else if (ostring=="RECEIVER") result=DVPSE_receiver; else { DCMPSTAT_INFO("unsupported peer type in config file: '" << val << "', ignoring."); } return result; } static Uint32 countValues(const char *str) { if (str) { Uint32 result = 0; if (*str) result++; char c; while ((c = *str++)) if (c == '\\') result++; return result; } return 0; } static void copyValue(const char *str, Uint32 idx, OFString& target) { target.clear(); if (str) { char c = '\\'; while (idx) { c = *str++; if (c == 0) idx=0; else if (c == '\\') idx--; } if (c=='\\') { const char *endstr = str; while ((*endstr) && (*endstr != '\\')) endstr++; target.assign(str,(endstr-str)); } } return; } static int strCompare(const char *str1, const char *str2, size_t len) { #ifdef HAVE_WINDOWS_H return _strnicmp(str1, str2, len); #else return strncasecmp(str1, str2, len); #endif } DVConfiguration::DVConfiguration(const char *config_file) : pConfig(NULL) { if (config_file) { FILE *cfgfile = fopen(config_file, "rb"); if (cfgfile) { pConfig = new OFConfigFile(cfgfile); fclose(cfgfile); } } } DVConfiguration::~DVConfiguration() { if (pConfig) delete pConfig; } Uint32 DVConfiguration::getNumberOfTargets(DVPSPeerType peerType) { Uint32 result = 0; DVPSPeerType currentType; if (pConfig) { pConfig->set_section(2, L2_COMMUNICATION); if (pConfig->section_valid(2)) { pConfig->first_section(1); while (pConfig->section_valid(1)) { currentType = getConfigTargetType(pConfig->get_entry(L0_TYPE)); switch (peerType) { case DVPSE_storage: if (currentType==DVPSE_storage) result++; break; case DVPSE_receiver: if (currentType==DVPSE_receiver) result++; break; case DVPSE_printRemote: if (currentType==DVPSE_printRemote) result++; break; case DVPSE_printLocal: if (currentType==DVPSE_printLocal) result++; break; case DVPSE_printAny: if (currentType==DVPSE_printRemote) result++; else if (currentType==DVPSE_printLocal) result++; break; case DVPSE_any: result++; break; } pConfig->next_section(1); } } } return result; } const char *DVConfiguration::getTargetID(Uint32 idx, DVPSPeerType peerType) { const char *result=NULL; DVPSPeerType currentType; OFBool found = OFFalse; if (pConfig) { pConfig->set_section(2, L2_COMMUNICATION); if (pConfig->section_valid(2)) { pConfig->first_section(1); while ((! found)&&(pConfig->section_valid(1))) { currentType = getConfigTargetType(pConfig->get_entry(L0_TYPE)); switch (peerType) { case DVPSE_storage: if (currentType==DVPSE_storage) { if (idx==0) found=OFTrue; else idx--; } break; case DVPSE_receiver: if (currentType==DVPSE_receiver) { if (idx==0) found=OFTrue; else idx--; } break; case DVPSE_printRemote: if (currentType==DVPSE_printRemote) { if (idx==0) found=OFTrue; else idx--; } break; case DVPSE_printLocal: if (currentType==DVPSE_printLocal) { if (idx==0) found=OFTrue; else idx--; } break; case DVPSE_printAny: if ((currentType==DVPSE_printRemote)||(currentType==DVPSE_printLocal)) { if (idx==0) found=OFTrue; else idx--; } break; case DVPSE_any: if (idx==0) found=OFTrue; else idx--; break; } if (!found) pConfig->next_section(1); } if (pConfig->section_valid(1)) result = pConfig->get_keyword(1); } } return result; } const char *DVConfiguration::getConfigEntry(const char *l2_key, const char *l1_key, const char *l0_key) { const char *result=NULL; if (l2_key && l1_key && l0_key && pConfig) { pConfig->select_section(l1_key, l2_key); if (pConfig->section_valid(1)) result = pConfig->get_entry(l0_key); } return result; } OFBool DVConfiguration::getConfigBoolEntry(const char *l2_key, const char *l1_key, const char *l0_key, OFBool deflt) { OFBool result=deflt; if (l2_key && l1_key && l0_key && pConfig) { pConfig->select_section(l1_key, l2_key); if (pConfig->section_valid(1)) { pConfig->set_section(0,l0_key); result = pConfig->get_bool_value(deflt); } } return result; } const char *DVConfiguration::getTargetDescription(const char *targetID) { return getConfigEntry(L2_COMMUNICATION, targetID, L0_DESCRIPTION); } const char *DVConfiguration::getTargetHostname(const char *targetID) { return getConfigEntry(L2_COMMUNICATION, targetID, L0_HOSTNAME); } unsigned short DVConfiguration::getTargetPort(const char *targetID) { const char *c = getConfigEntry(L2_COMMUNICATION, targetID, L0_PORT); unsigned short result = 0; if (c) { if (1 != sscanf(c, "%hu", &result)) result=0; } return result; } const char *DVConfiguration::getTargetAETitle(const char *targetID) { return getConfigEntry(L2_COMMUNICATION, targetID, L0_AETITLE); } unsigned long DVConfiguration::getTargetMaxPDU(const char *targetID) { const char *c = getConfigEntry(L2_COMMUNICATION, targetID, L0_MAXPDU); unsigned long result = 0; if (c) { if (1 != sscanf(c, "%lu", &result)) result=0; } return result; } Sint32 DVConfiguration::getTargetTimeout(const char *targetID) { const char *c = getConfigEntry(L2_COMMUNICATION, targetID, L0_TIMEOUT); signed long result = -1; // default is -1 if (c) { if (1 != sscanf(c, "%ld", &result)) result=0; } return (Sint32) result; } OFBool DVConfiguration::getTargetImplicitOnly(const char *targetID) { return getConfigBoolEntry(L2_COMMUNICATION, targetID, L0_IMPLICITONLY, OFFalse); } OFBool DVConfiguration::getTargetDisableNewVRs(const char *targetID) { return getConfigBoolEntry(L2_COMMUNICATION, targetID, L0_DISABLENEWVRS, OFFalse); } DVPSPeerType DVConfiguration::getTargetType(const char *targetID) { return getConfigTargetType(getConfigEntry(L2_COMMUNICATION, targetID, L0_TYPE)); } const char *DVConfiguration::getLogFolder() { return getConfigEntry(L2_GENERAL, L1_APPLICATION, L0_LOGDIRECTORY); } const char *DVConfiguration::getLogFile() { return getConfigEntry(L2_GENERAL, L1_APPLICATION, L0_LOGFILE); } OFLogger::LogLevel DVConfiguration::getLogLevel() { OFLogger::LogLevel result = OFLogger::FATAL_LOG_LEVEL; const char *c = getConfigEntry(L2_GENERAL, L1_APPLICATION, L0_LOGLEVEL); if (c != NULL) { if (strCompare(c, "ERROR", 5) == 0) result = OFLogger::ERROR_LOG_LEVEL; else if (strCompare(c, "WARN", 4) == 0) result = OFLogger::WARN_LOG_LEVEL; else if (strCompare(c, "INFO", 4) == 0) result = OFLogger::INFO_LOG_LEVEL; else if (strCompare(c, "DEBUG", 5) == 0) result = OFLogger::DEBUG_LOG_LEVEL; } return result; } unsigned short DVConfiguration::getMessagePort() { const char *c = getConfigEntry(L2_GENERAL, L1_APPLICATION, L0_MESSAGEPORT); unsigned short result = 0; if (c) { if (1 != sscanf(c, "%hu", &result)) result=0; } return result; } OFBool DVConfiguration::getMessagePortKeepOpen() { return getConfigBoolEntry(L2_GENERAL, L1_APPLICATION, L0_KEEPMESSAGEPORTOPEN, OFFalse); } const char *DVConfiguration::getNetworkAETitle() { const char *result = getConfigEntry(L2_GENERAL, L1_NETWORK, L0_AETITLE); if (result==NULL) result = PSTAT_AETITLE; return result; } OFBool DVConfiguration::getQueryRetrieveAutoCreateConfigFile() { return getConfigBoolEntry(L2_GENERAL, L1_QUERY_RETRIEVE, L0_AUTOCREATECONFIGFILE, OFTrue); } const char *DVConfiguration::getQueryRetrieveAETitle() { const char *result = getConfigEntry(L2_GENERAL, L1_QUERY_RETRIEVE, L0_AETITLE); if (result==NULL) result = PSTAT_AETITLE; return result; } unsigned short DVConfiguration::getQueryRetrievePort() { const char *c = getConfigEntry(L2_GENERAL, L1_QUERY_RETRIEVE, L0_PORT); unsigned short result = 0; if (c) { if (1 != sscanf(c, "%hu", &result)) result=0; } return result; } unsigned long DVConfiguration::getQueryRetrieveMaxPDU() { const char *c = getConfigEntry(L2_GENERAL, L1_QUERY_RETRIEVE, L0_MAXPDU); unsigned long result = 0; if (c) { if (1 != sscanf(c, "%lu", &result)) result=0; } return result; } Sint32 DVConfiguration::getQueryRetrieveTimeout() { const char *c = getConfigEntry(L2_GENERAL, L1_QUERY_RETRIEVE, L0_TIMEOUT); signed long result = -1; // default is -1 if (c) { if (1 != sscanf(c, "%ld", &result)) result=0; } return (Sint32) result; } unsigned long DVConfiguration::getQueryRetrieveMaxAssociations() { const char *c = getConfigEntry(L2_GENERAL, L1_QUERY_RETRIEVE, L0_MAXASSOCIATIONS); unsigned long result = 0; if (c) { if (1 != sscanf(c, "%lu", &result)) result=0; } return result; } const char *DVConfiguration::getDatabaseFolder() { const char *result = getConfigEntry(L2_GENERAL, L1_DATABASE, L0_DIRECTORY); if (result==NULL) result = PSTAT_DBFOLDER; return result; } const char *DVConfiguration::getSpoolFolder() { const char *result = getConfigEntry(L2_GENERAL, L1_PRINT, L0_DIRECTORY); if (result==NULL) result = PSTAT_SPOOLFOLDER; return result; } OFBool DVConfiguration::getDetailedLog() { return getConfigBoolEntry(L2_GENERAL, L1_PRINT, L0_DETAILEDLOG, OFFalse); } OFBool DVConfiguration::getBinaryLog() { return getConfigBoolEntry(L2_GENERAL, L1_PRINT, L0_BINARYLOG, OFFalse); } unsigned long DVConfiguration::getSpoolerSleep() { const char *c = getConfigEntry(L2_GENERAL, L1_PRINT, L0_SLEEP); unsigned long result = 0; if (c) { if (1 != sscanf(c, "%lu", &result)) result=0; } return result; } OFBool DVConfiguration::getSpoolerDeletePrintJobs() { return getConfigBoolEntry(L2_GENERAL, L1_PRINT, L0_DELETEPRINTJOBS, OFFalse); } OFBool DVConfiguration::getSpoolerAlwaysDeleteTerminateJobs() { return getConfigBoolEntry(L2_GENERAL, L1_PRINT, L0_ALWAYSDELETETERMINATEJOBS, OFFalse); } const char *DVConfiguration::getLUTFolder() { const char *result = getConfigEntry(L2_GENERAL, L1_LUT, L0_DIRECTORY); if (result==NULL) result = PSTAT_LUTFOLDER; return result; } const char *DVConfiguration::getReportFolder() { const char *result = getConfigEntry(L2_GENERAL, L1_REPORT, L0_DIRECTORY); if (result==NULL) result = PSTAT_REPORTFOLDER; return result; } const char *DVConfiguration::getSenderName() { return getConfigEntry(L2_GENERAL, L1_NETWORK, L0_SENDER); } const char *DVConfiguration::getReceiverName() { return getConfigEntry(L2_GENERAL, L1_NETWORK, L0_RECEIVER); } const char *DVConfiguration::getQueryRetrieveServerName() { return getConfigEntry(L2_GENERAL, L1_QUERY_RETRIEVE, L0_SERVER); } const char *DVConfiguration::getSpoolerName() { return getConfigEntry(L2_GENERAL, L1_PRINT, L0_SPOOLER); } const char *DVConfiguration::getPrintServerName() { return getConfigEntry(L2_GENERAL, L1_PRINT, L0_SERVER); } const char *DVConfiguration::getDumpToolName() { return getConfigEntry(L2_GENERAL, L1_DATABASE, L0_DUMP); } const char *DVConfiguration::getCheckToolName() { return getConfigEntry(L2_GENERAL, L1_DATABASE, L0_CHECK); } const char *DVConfiguration::getMonitorCharacteristicsFile() { return getConfigEntry(L2_GENERAL, L1_MONITOR, L0_CHARACTERISTICS); } double DVConfiguration::getMonitorPixelWidth() { const char *resolution = getConfigEntry(L2_GENERAL, L1_MONITOR, L0_RESOLUTION); const char *screensize = getConfigEntry(L2_GENERAL, L1_MONITOR, L0_SCREENSIZE); if (resolution && screensize) { double rX=0.0, rY=0.0, sX=0.0, sY=0.0; OFString s(resolution); OFBool success = OFFalse; rX = OFStandard::atof(s.c_str(), &success); if (success) { s.erase(0, s.find('\\')+1); if (s.length() > 0) { rY = OFStandard::atof(s.c_str(), &success); } else success = OFFalse; } if (success) { s = screensize; sX = OFStandard::atof(s.c_str(), &success); if (success) { s.erase(0, s.find('\\')+1); if (s.length() > 0) { sY = OFStandard::atof(s.c_str(), &success); } else success = OFFalse; } } if (success && (rX > 0) && (rY > 0) && (sX > 0) && (sY > 0)) { // everything OK, return pixel width return sX/rX; } } return 0.0; } double DVConfiguration::getMonitorPixelHeight() { const char *resolution = getConfigEntry(L2_GENERAL, L1_MONITOR, L0_RESOLUTION); const char *screensize = getConfigEntry(L2_GENERAL, L1_MONITOR, L0_SCREENSIZE); if (resolution && screensize) { double rX=0.0, rY=0.0, sX=0.0, sY=0.0; OFString s(resolution); OFBool success = OFFalse; rX = OFStandard::atof(s.c_str(), &success); if (success) { s.erase(0, s.find('\\')+1); if (s.length() > 0) { rY = OFStandard::atof(s.c_str(), &success); } else success = OFFalse; } if (success) { s = screensize; sX = OFStandard::atof(s.c_str(), &success); if (success) { s.erase(0, s.find('\\')+1); if (s.length() > 0) { sY = OFStandard::atof(s.c_str(), &success); } else success = OFFalse; } } if (success && (rX > 0) && (rY > 0) && (sX > 0) && (sY > 0)) { // everything OK, return pixel height return sY/rY; } } return 0.0; } Uint32 DVConfiguration::getMaxPreviewResolutionX() { const char *c = getConfigEntry(L2_GENERAL, L1_MONITOR, L0_PREVIEW); if (c) { unsigned long result = 0; unsigned long dummy = 0; if (2 == sscanf(c, "%lu\\%lu", &result, &dummy)) return (Uint32) result; } return 0; } Uint32 DVConfiguration::getMaxPreviewResolutionY() { const char *c = getConfigEntry(L2_GENERAL, L1_MONITOR, L0_PREVIEW); if (c) { unsigned long result = 0; unsigned long dummy = 0; if (2 == sscanf(c, "%lu\\%lu", &dummy, &result)) return (Uint32) result; } return 0; } const char *DVConfiguration::getGUIConfigEntry(const char *key) { return getConfigEntry(L2_GENERAL, L1_GUI, key); } OFBool DVConfiguration::getGUIConfigEntryBool(const char *key, OFBool dfl) { return getConfigBoolEntry(L2_GENERAL, L1_GUI, key, dfl); } OFBool DVConfiguration::getTargetPrinterSupportsPresentationLUT(const char *targetID) { return getConfigBoolEntry(L2_COMMUNICATION, targetID, L0_SUPPORTSPRESENTATIONLUT, OFFalse); } OFBool DVConfiguration::getTargetPrinterPresentationLUTMatchRequired(const char *targetID) { return getConfigBoolEntry(L2_COMMUNICATION, targetID, L0_PRESENTATIONLUTMATCHREQUIRED, OFTrue); } OFBool DVConfiguration::getTargetPrinterPresentationLUTPreferSCPRendering(const char *targetID) { return getConfigBoolEntry(L2_COMMUNICATION, targetID, L0_PRESENTATIONLUTPREFERSCPRENDERING, OFFalse); } OFBool DVConfiguration::getTargetPrinterPresentationLUTinFilmSession(const char *targetID) { return getConfigBoolEntry(L2_COMMUNICATION, targetID, L0_PRESENTATIONLUTINFILMSESSION, OFFalse); } OFBool DVConfiguration::getTargetPrinterSupports12BitTransmission(const char *targetID) { return getConfigBoolEntry(L2_COMMUNICATION, targetID, L0_SUPPORTS12BIT, OFTrue); } OFBool DVConfiguration::getTargetPrintSCPOmitSOPClassUIDFromCreateResponse(const char *targetID) { return getConfigBoolEntry(L2_COMMUNICATION, targetID, L0_OMITSOPCLASSUIDFROMCREATERESPONSE, OFFalse); } OFBool DVConfiguration::getTargetPrinterSupportsRequestedImageSize(const char *targetID) { return getConfigBoolEntry(L2_COMMUNICATION, targetID, L0_SUPPORTSIMAGESIZE, OFFalse); } OFBool DVConfiguration::getTargetPrinterSupportsDecimateCrop(const char *targetID) { return getConfigBoolEntry(L2_COMMUNICATION, targetID, L0_SUPPORTSDECIMATECROP, OFFalse); } OFBool DVConfiguration::getTargetPrinterSupportsTrim(const char *targetID) { return getConfigBoolEntry(L2_COMMUNICATION, targetID, L0_SUPPORTSTRIM, OFFalse); } Uint32 DVConfiguration::getTargetPrinterNumberOfFilmSizeIDs(const char *targetID) { return countValues(getConfigEntry(L2_COMMUNICATION, targetID, L0_FILMSIZEID)); } const char *DVConfiguration::getTargetPrinterFilmSizeID(const char *targetID, Uint32 idx, OFString& value) { copyValue(getConfigEntry(L2_COMMUNICATION, targetID, L0_FILMSIZEID), idx, value); if (value.length()) return value.c_str(); else return NULL; } Uint32 DVConfiguration::getTargetPrinterNumberOfMediumTypes(const char *targetID) { return countValues(getConfigEntry(L2_COMMUNICATION, targetID, L0_MEDIUMTYPE)); } const char *DVConfiguration::getTargetPrinterMediumType(const char *targetID, Uint32 idx, OFString& value) { copyValue(getConfigEntry(L2_COMMUNICATION, targetID, L0_MEDIUMTYPE), idx, value); if (value.length()) return value.c_str(); else return NULL; } Uint32 DVConfiguration::getTargetPrinterNumberOfFilmDestinations(const char *targetID) { return countValues(getConfigEntry(L2_COMMUNICATION, targetID, L0_FILMDESTINATION)); } const char *DVConfiguration::getTargetPrinterFilmDestination(const char *targetID, Uint32 idx, OFString& value) { copyValue(getConfigEntry(L2_COMMUNICATION, targetID, L0_FILMDESTINATION), idx, value); if (value.length()) return value.c_str(); else return NULL; } Uint32 DVConfiguration::getTargetPrinterNumberOfPrinterResolutionIDs(const char *targetID) { return countValues(getConfigEntry(L2_COMMUNICATION, targetID, L0_RESOLUTIONID)); } const char *DVConfiguration::getTargetPrinterResolutionID(const char *targetID, Uint32 idx, OFString& value) { copyValue(getConfigEntry(L2_COMMUNICATION, targetID, L0_RESOLUTIONID), idx, value); if (value.length()) return value.c_str(); else return NULL; } Uint32 DVConfiguration::getTargetPrinterNumberOfMagnificationTypes(const char *targetID) { return countValues(getConfigEntry(L2_COMMUNICATION, targetID, L0_MAGNIFICATIONTYPE)); } const char *DVConfiguration::getTargetPrinterMagnificationType(const char *targetID, Uint32 idx, OFString& value) { copyValue(getConfigEntry(L2_COMMUNICATION, targetID, L0_MAGNIFICATIONTYPE), idx, value); if (value.length()) return value.c_str(); else return NULL; } Uint32 DVConfiguration::getTargetPrinterNumberOfSmoothingTypes(const char *targetID) { return countValues(getConfigEntry(L2_COMMUNICATION, targetID, L0_SMOOTHINGTYPE)); } const char *DVConfiguration::getTargetPrinterSmoothingType(const char *targetID, Uint32 idx, OFString& value) { copyValue(getConfigEntry(L2_COMMUNICATION, targetID, L0_SMOOTHINGTYPE), idx, value); if (value.length()) return value.c_str(); else return NULL; } Uint32 DVConfiguration::getTargetPrinterNumberOfConfigurationSettings(const char *targetID) { Uint32 result = 0; if (pConfig) { pConfig->select_section(targetID, L2_COMMUNICATION); if (pConfig->section_valid(1)) { int counter = 1; char l0_key[80]; do { sprintf(l0_key, "CONFIGURATION_%d", counter++); } while (NULL != pConfig->get_entry(l0_key)); result = counter - 2; } } return result; } const char *DVConfiguration::getTargetPrinterConfigurationSetting(const char *targetID, Uint32 idx) { char l0_key[80]; sprintf(l0_key, "CONFIGURATION_%d", (int)idx+1); return getConfigEntry(L2_COMMUNICATION, targetID, l0_key); } Uint32 DVConfiguration::getNumberOfLUTs() { Uint32 result = 0; if (pConfig) { pConfig->set_section(2, L2_LUT); if (pConfig->section_valid(2)) { pConfig->first_section(1); while (pConfig->section_valid(1)) { result++; pConfig->next_section(1); } } } return result; } const char *DVConfiguration::getLUTID(Uint32 idx) { OFBool found = OFFalse; const char *result=NULL; if (pConfig) { pConfig->set_section(2, L2_LUT); if (pConfig->section_valid(2)) { pConfig->first_section(1); while ((! found)&&(pConfig->section_valid(1))) { if (idx==0) found=OFTrue; else { idx--; pConfig->next_section(1); } } if (pConfig->section_valid(1)) result = pConfig->get_keyword(1); } } return result; } const char *DVConfiguration::getLUTDescription(const char *lutID) { return getConfigEntry(L2_LUT, lutID, L0_DESCRIPTION); } const char *DVConfiguration::getLUTFilename(const char *lutID) { return getConfigEntry(L2_LUT, lutID, L0_FILENAME); } Uint32 DVConfiguration::getNumberOfReports() { Uint32 result = 0; if (pConfig) { pConfig->set_section(2, L2_REPORT); if (pConfig->section_valid(2)) { pConfig->first_section(1); while (pConfig->section_valid(1)) { result++; pConfig->next_section(1); } } } return result; } const char *DVConfiguration::getReportID(Uint32 idx) { OFBool found = OFFalse; const char *result=NULL; if (pConfig) { pConfig->set_section(2, L2_REPORT); if (pConfig->section_valid(2)) { pConfig->first_section(1); while ((! found)&&(pConfig->section_valid(1))) { if (idx==0) found=OFTrue; else { idx--; pConfig->next_section(1); } } if (pConfig->section_valid(1)) result = pConfig->get_keyword(1); } } return result; } const char *DVConfiguration::getReportDescription(const char *reportID) { return getConfigEntry(L2_REPORT, reportID, L0_DESCRIPTION); } const char *DVConfiguration::getReportFilename(const char *reportID) { return getConfigEntry(L2_REPORT, reportID, L0_FILENAME); } Uint32 DVConfiguration::getTargetPrinterNumberOfBorderDensities(const char *targetID) { return countValues(getConfigEntry(L2_COMMUNICATION, targetID, L0_BORDERDENSITY)); } const char *DVConfiguration::getTargetPrinterBorderDensity(const char *targetID, Uint32 idx, OFString& value) { copyValue(getConfigEntry(L2_COMMUNICATION, targetID, L0_BORDERDENSITY), idx, value); if (value.length()) return value.c_str(); else return NULL; } Uint32 DVConfiguration::getTargetPrinterNumberOfMaxDensities(const char *targetID) { return countValues(getConfigEntry(L2_COMMUNICATION, targetID, L0_MAXDENSITY)); } const char *DVConfiguration::getTargetPrinterMaxDensity(const char *targetID, Uint32 idx, OFString& value) { copyValue(getConfigEntry(L2_COMMUNICATION, targetID, L0_MAXDENSITY), idx, value); if (value.length()) return value.c_str(); else return NULL; } Uint32 DVConfiguration::getTargetPrinterNumberOfMinDensities(const char *targetID) { return countValues(getConfigEntry(L2_COMMUNICATION, targetID, L0_MINDENSITY)); } const char *DVConfiguration::getTargetPrinterMinDensity(const char *targetID, Uint32 idx, OFString& value) { copyValue(getConfigEntry(L2_COMMUNICATION, targetID, L0_MINDENSITY), idx, value); if (value.length()) return value.c_str(); else return NULL; } Uint32 DVConfiguration::getTargetPrinterNumberOfEmptyImageDensities(const char *targetID) { return countValues(getConfigEntry(L2_COMMUNICATION, targetID, L0_EMPTYIMAGEDENSITY)); } const char *DVConfiguration::getTargetPrinterEmptyImageDensity(const char *targetID, Uint32 idx, OFString& value) { copyValue(getConfigEntry(L2_COMMUNICATION, targetID, L0_EMPTYIMAGEDENSITY), idx, value); if (value.length()) return value.c_str(); else return NULL; } Uint32 DVConfiguration::getMinPrintResolutionX() { const char *c = getConfigEntry(L2_GENERAL, L1_PRINT, L0_MINPRINTRESOLUTION); if (c) { unsigned long result = 0; unsigned long dummy = 0; if (2 == sscanf(c, "%lu\\%lu", &result, &dummy)) return (Uint32) result; } return 0; } Uint32 DVConfiguration::getMinPrintResolutionY() { const char *c = getConfigEntry(L2_GENERAL, L1_PRINT, L0_MINPRINTRESOLUTION); if (c) { unsigned long result = 0; unsigned long dummy = 0; if (2 == sscanf(c, "%lu\\%lu", &dummy, &result)) return (Uint32) result; } return 0; } Uint32 DVConfiguration::getMaxPrintResolutionX() { const char *c = getConfigEntry(L2_GENERAL, L1_PRINT, L0_MAXPRINTRESOLUTION); if (c) { unsigned long result = 0; unsigned long dummy = 0; if (2 == sscanf(c, "%lu\\%lu", &result, &dummy)) return (Uint32) result; } return 0; } Uint32 DVConfiguration::getMaxPrintResolutionY() { const char *c = getConfigEntry(L2_GENERAL, L1_PRINT, L0_MAXPRINTRESOLUTION); if (c) { unsigned long result = 0; unsigned long dummy = 0; if (2 == sscanf(c, "%lu\\%lu", &dummy, &result)) return (Uint32) result; } return 0; } Uint16 DVConfiguration::getDefaultPrintIllumination() { const char *c = getConfigEntry(L2_GENERAL, L1_PRINT, L0_DEFAULTILLUMINATION); if (c) { Uint16 result = 0; if (1 == sscanf(c, "%hu", &result)) return result; } return DEFAULT_illumination; } Uint16 DVConfiguration::getDefaultPrintReflection() { const char *c = getConfigEntry(L2_GENERAL, L1_PRINT, L0_DEFAULTREFLECTION); if (c) { Uint16 result = 0; if (1 == sscanf(c, "%hu", &result)) return result; } return DEFAULT_reflectedAmbientLight; } Uint32 DVConfiguration::getNumberOfVOIPresets(const char *modality) { Uint32 result = 0; if (modality && pConfig) { OFString aModality = modality; const char *currentModality = NULL; pConfig->set_section(2, L2_VOI); if (pConfig->section_valid(2)) { pConfig->first_section(1); while (pConfig->section_valid(1)) { currentModality = pConfig->get_entry(L0_MODALITY); if (currentModality && (aModality == currentModality)) result++; pConfig->next_section(1); } } } return result; } const char *DVConfiguration::getVOIPresetDescription(const char *modality, Uint32 idx) { if (modality && pConfig) { OFString aModality = modality; const char *currentModality = NULL; pConfig->set_section(2, L2_VOI); if (pConfig->section_valid(2)) { pConfig->first_section(1); while (pConfig->section_valid(1)) { currentModality = pConfig->get_entry(L0_MODALITY); if (currentModality && (aModality == currentModality)) { if (idx==0) { // found entry return pConfig->get_entry(L0_DESCRIPTION); } else idx--; } pConfig->next_section(1); } } } return NULL; } double DVConfiguration::getVOIPresetWindowCenter(const char *modality, Uint32 idx) { double result = 0.0; if (modality && pConfig) { OFString aModality = modality; const char *currentModality = NULL; pConfig->set_section(2, L2_VOI); if (pConfig->section_valid(2)) { pConfig->first_section(1); while (pConfig->section_valid(1)) { currentModality = pConfig->get_entry(L0_MODALITY); if (currentModality && (aModality == currentModality)) { if (idx==0) { // found entry const char *window = pConfig->get_entry(L0_CENTER); if (window) return OFStandard::atof(window); else return 0.0; } else idx--; } pConfig->next_section(1); } } } return result; } double DVConfiguration::getVOIPresetWindowWidth(const char *modality, Uint32 idx) { double result = 1.0; if (modality && pConfig) { OFString aModality = modality; const char *currentModality = NULL; pConfig->set_section(2, L2_VOI); if (pConfig->section_valid(2)) { pConfig->first_section(1); while (pConfig->section_valid(1)) { currentModality = pConfig->get_entry(L0_MODALITY); if (currentModality && (aModality == currentModality)) { if (idx==0) { // found entry const char *window = pConfig->get_entry(L0_WIDTH); if (window) return OFStandard::atof(window); else return 1.0; } else idx--; } pConfig->next_section(1); } } } return result; } Uint32 DVConfiguration::getTargetPrinterNumberOfPortraitDisplayFormats(const char *targetID) { return countValues(getConfigEntry(L2_COMMUNICATION, targetID, L0_DISPLAYFORMAT)); } Uint32 DVConfiguration::getTargetPrinterPortraitDisplayFormatRows(const char *targetID, Uint32 idx) { OFString value; unsigned long rows=0; unsigned long columns=0; copyValue(getConfigEntry(L2_COMMUNICATION, targetID, L0_DISPLAYFORMAT), idx, value); if (2==sscanf(value.c_str(), "%lu,%lu", &columns, &rows)) return rows; return 0; } Uint32 DVConfiguration::getTargetPrinterPortraitDisplayFormatColumns(const char *targetID, Uint32 idx) { OFString value; unsigned long rows=0; unsigned long columns=0; copyValue(getConfigEntry(L2_COMMUNICATION, targetID, L0_DISPLAYFORMAT), idx, value); if (2==sscanf(value.c_str(), "%lu,%lu", &columns, &rows)) return columns; return 0; } OFBool DVConfiguration::getTargetPrinterSupportsAnnotation(const char *targetID) { if (NULL==getConfigEntry(L2_COMMUNICATION, targetID, L0_ANNOTATION)) return getTargetPrinterSessionLabelAnnotation(targetID); return OFTrue; } OFBool DVConfiguration::getTargetPrinterSupportsAnnotationBoxSOPClass(const char *targetID) { if (NULL==getConfigEntry(L2_COMMUNICATION, targetID, L0_ANNOTATION)) return OFFalse; return OFTrue; } OFBool DVConfiguration::getTargetPrinterSessionLabelAnnotation(const char *targetID) { return getConfigBoolEntry(L2_COMMUNICATION, targetID, L0_SESSIONLABELANNOTATION, OFFalse); } const char *DVConfiguration::getTargetPrinterAnnotationDisplayFormatID(const char *targetID, OFString& value) { copyValue(getConfigEntry(L2_COMMUNICATION, targetID, L0_ANNOTATION), 1, value); if (value.length()) return value.c_str(); else return NULL; } Uint16 DVConfiguration::getTargetPrinterAnnotationPosition(const char *targetID) { OFString value; copyValue(getConfigEntry(L2_COMMUNICATION, targetID, L0_ANNOTATION), 0, value); if (value.length()) { Uint16 result = 0; if (1 == sscanf(value.c_str(), "%hu", &result)) return result; } return 0; } const char *DVConfiguration::getTLSFolder() { return getConfigEntry(L2_GENERAL, L1_TLS, L0_TLSDIRECTORY); } const char *DVConfiguration::getTLSCACertificateFolder() { return getConfigEntry(L2_GENERAL, L1_TLS, L0_CACERTIFICATEDIRECTORY); } OFBool DVConfiguration::getTLSPEMFormat() { return getConfigBoolEntry(L2_GENERAL, L1_TLS, L0_USEPEMFORMAT, OFTrue); } OFBool DVConfiguration::getTargetBitPreservingMode(const char *targetID) { return getConfigBoolEntry(L2_COMMUNICATION, targetID, L0_BITPRESERVINGMODE, OFFalse); } OFBool DVConfiguration::getTargetCorrectUIDPadding(const char *targetID) { return getConfigBoolEntry(L2_COMMUNICATION, targetID, L0_CORRECTUIDPADDING, OFFalse); } OFBool DVConfiguration::getTargetUseTLS(const char *targetID) { return getConfigBoolEntry(L2_COMMUNICATION, targetID, L0_USETLS, OFFalse); } const char *DVConfiguration::getTargetCertificate(const char *targetID) { return getConfigEntry(L2_COMMUNICATION, targetID, L0_CERTIFICATE); } const char *DVConfiguration::getTargetPrivateKey(const char *targetID) { return getConfigEntry(L2_COMMUNICATION, targetID, L0_PRIVATEKEY); } const char *DVConfiguration::getTargetPrivateKeyPassword(const char *targetID) { return getConfigEntry(L2_COMMUNICATION, targetID, L0_PRIVATEKEYPASSWORD); } Uint32 DVConfiguration::getTargetNumberOfCipherSuites(const char *targetID) { return countValues(getConfigEntry(L2_COMMUNICATION, targetID, L0_CIPHERSUITES)); } const char *DVConfiguration::getTargetCipherSuite(const char *targetID, Uint32 idx, OFString& value) { copyValue(getConfigEntry(L2_COMMUNICATION, targetID, L0_CIPHERSUITES), idx, value); if (value.length()) return value.c_str(); else return NULL; } DVPSCertificateVerificationType DVConfiguration::getTargetPeerAuthentication(const char *targetID) { DVPSCertificateVerificationType result = DVPSQ_require; const char *c = getConfigEntry(L2_COMMUNICATION, targetID, L0_PEERAUTHENTICATION); if (c != NULL) { if (strCompare(c, "REQUIRE", 7) == 0) result = DVPSQ_require; else if (strCompare(c, "VERIFY", 6) == 0) result = DVPSQ_verify; else if (strCompare(c, "IGNORE", 6) == 0) result = DVPSQ_ignore; } return result; } const char *DVConfiguration::getTargetDiffieHellmanParameters(const char *targetID) { return getConfigEntry(L2_COMMUNICATION, targetID, L0_DIFFIEHELLMANPARAMETERS); } const char *DVConfiguration::getTargetRandomSeed(const char *targetID) { return getConfigEntry(L2_COMMUNICATION, targetID, L0_RANDOMSEED); } const char *DVConfiguration::getUserCertificateFolder() { return getConfigEntry(L2_GENERAL, L1_TLS, L0_USERKEYDIRECTORY); } Uint32 DVConfiguration::getNumberOfUsers() { Uint32 result = 0; if (pConfig) { pConfig->set_section(2, L2_USERS); if (pConfig->section_valid(2)) { pConfig->first_section(1); while (pConfig->section_valid(1)) { result++; pConfig->next_section(1); } } } return result; } const char *DVConfiguration::getUserID(Uint32 idx) { OFBool found = OFFalse; const char *result=NULL; if (pConfig) { pConfig->set_section(2, L2_USERS); if (pConfig->section_valid(2)) { pConfig->first_section(1); while ((! found)&&(pConfig->section_valid(1))) { if (idx==0) found=OFTrue; else { idx--; pConfig->next_section(1); } } if (pConfig->section_valid(1)) result = pConfig->get_keyword(1); } } return result; } const char *DVConfiguration::getUserLogin(const char *userID) { return getConfigEntry(L2_USERS, userID, L0_LOGIN); } const char *DVConfiguration::getUserName(const char *userID) { return getConfigEntry(L2_USERS, userID, L0_NAME); } const char *DVConfiguration::getUserDICOMName(const char *userID) { return getConfigEntry(L2_USERS, userID, L0_DICOMNAME); } const char *DVConfiguration::getUserCertificate(const char *userID) { return getConfigEntry(L2_USERS, userID, L0_CERTIFICATE); } const char *DVConfiguration::getUserPrivateKey(const char *userID) { return getConfigEntry(L2_USERS, userID, L0_PRIVATEKEY); } const char *DVConfiguration::getUserOrganization(const char *userID) { return getConfigEntry(L2_USERS, userID, L0_ORGANIZATION); } const char *DVConfiguration::getUserCodingSchemeDesignator(const char *userID, OFString& value) { copyValue(getConfigEntry(L2_USERS, userID, L0_CODE), 0, value); if (value.length()) return value.c_str(); else return NULL; } const char *DVConfiguration::getUserCodingSchemeVersion(const char *userID, OFString& value) { copyValue(getConfigEntry(L2_USERS, userID, L0_CODE), 1, value); if (value.length()) return value.c_str(); else return NULL; } const char *DVConfiguration::getUserCodeValue(const char *userID, OFString& value) { copyValue(getConfigEntry(L2_USERS, userID, L0_CODE), 2, value); if (value.length()) return value.c_str(); else return NULL; } const char *DVConfiguration::getUserCodeMeaning(const char *userID, OFString& value) { copyValue(getConfigEntry(L2_USERS, userID, L0_CODE), 3, value); if (value.length()) return value.c_str(); else return NULL; } /* * CVS/RCS Log: * $Log: dvpscf.cc,v $ * Revision 1.47 2010-10-20 08:09:34 uli * Also made sure toupper() and tolower() get a valid argument. * * Revision 1.46 2010-10-14 13:14:31 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.45 2009-11-24 14:12:58 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.44 2006-08-15 16:57:02 meichel * Updated the code in module dcmpstat to correctly compile when * all standard C++ classes remain in namespace std. * * Revision 1.43 2005/12/08 15:46:20 meichel * Changed include path schema for all DCMTK header files * * Revision 1.42 2003/04/29 10:13:56 meichel * Moved configuration file parser from module dcmpstat to ofstd and renamed * class to OFConfigFile. Cleaned up implementation (no more friend declarations). * * Revision 1.41 2002/11/29 13:16:33 meichel * Introduced new command line option --timeout for controlling the * connection request timeout. * * Revision 1.40 2002/11/27 15:48:07 meichel * Adapted module dcmpstat to use of new header file ofstdinc.h * * Revision 1.39 2002/11/25 18:27:41 meichel * Converted compile time option to leniently handle space padded UIDs * in the Storage Service Class into command line / config file option. * * Revision 1.38 2002/06/26 17:21:10 joergr * Removed superfluous semicolon at very awkward positions (this is a bug * fix!). * * Revision 1.37 2002/06/20 12:20:27 meichel * Changed toolkit to use OFStandard::atof instead of atof, strtod or * sscanf for all string to double conversions that are supposed to * be locale independent * * Revision 1.36 2001/06/01 15:50:28 meichel * Updated copyright header * * Revision 1.35 2000/12/19 12:13:04 meichel * Added test for a strncasecmp prototype in , missing on Ultrix * and SunOS 4.1.x. * * Revision 1.34 2000/11/13 11:52:45 meichel * Added support for user logins and certificates. * * Revision 1.33 2000/11/13 10:43:21 joergr * Added support for Structured Reporting "templates". * * Revision 1.32 2000/10/10 12:24:40 meichel * Added extensions for IPC message communication * * Revision 1.31 2000/06/21 15:41:01 meichel * Added DICOMscope support for calling the Presentation State Checker. * * Revision 1.30 2000/06/07 16:46:43 joergr * Corrected typo in #ifdef statement. * * Revision 1.29 2000/06/07 14:26:04 joergr * Added configuration file entry "LogLevel" to filter log messages. * * Revision 1.28 2000/06/07 13:17:27 meichel * added binary and textual log facilities to Print SCP. * * Revision 1.27 2000/06/06 09:43:26 joergr * Moved configuration file entry "LogDirectory" from "[PRINT]" to new * (more general) section "[APPLICATION]". * * Revision 1.26 2000/06/05 16:25:30 joergr * Implemented log message methods. * * Revision 1.25 2000/06/02 16:00:58 meichel * Adapted all dcmpstat classes to use OFConsole for log and error output * * Revision 1.24 2000/06/02 13:54:36 joergr * Implemented start/terminatePrintServer methods. * * Revision 1.23 2000/05/31 12:58:14 meichel * Added initial Print SCP support * * Revision 1.22 2000/05/30 13:57:11 joergr * Added new section to the config file describing the query/retrieve server * settings. * * Revision 1.21 2000/03/08 16:29:02 meichel * Updated copyright header. * * Revision 1.20 2000/03/06 16:08:08 meichel * Changed a couple of definitions that implied that Uint32 or size_t are long * * Revision 1.19 2000/03/03 14:13:58 meichel * Implemented library support for redirecting error messages into memory * instead of printing them to stdout/stderr for GUI applications. * * Revision 1.18 1999/11/25 11:41:12 joergr * Changed config file entry "HighEndSystem" to "HighResolutionGraphics". * * Revision 1.17 1999/11/03 13:05:34 meichel * Added support for transmitting annotations in the film session label. * Added support for dump tool launched from DVInterface. * * Revision 1.16 1999/10/22 13:05:33 meichel * Added conditional define to prevent compiler warning * * Revision 1.15 1999/10/20 10:54:42 joergr * Added support for a down-scaled preview image of the current DICOM image * (e.g. useful for online-windowing or print preview). * * Revision 1.14 1999/10/19 14:48:23 meichel * added support for the Basic Annotation Box SOP Class * as well as access methods for Max Density and Min Density. * * Revision 1.13 1999/10/13 14:12:00 meichel * Added config file entries and access methods * for user-defined VOI presets, log directory, verbatim logging * and an explicit list of image display formats for each printer. * * Revision 1.12 1999/10/07 17:21:57 meichel * Reworked management of Presentation LUTs in order to create tighter * coupling between Softcopy and Print. * * Revision 1.11 1999/10/01 15:34:33 joergr * Fixed "copy and paste" error. * * Revision 1.10 1999/10/01 13:33:18 joergr * Added new option to config file: AlwaysDeleteTerminateJobs. * * Revision 1.9 1999/09/27 12:49:27 meichel * Fixed index bug in getLUTID, always returned first index. * * Revision 1.8 1999/09/27 10:41:27 meichel * Fixed index bug in getTargetPrinterConfigurationSetting. * * Revision 1.7 1999/09/24 15:24:33 meichel * Added support for CP 173 (Presentation LUT clarifications) * * Revision 1.6 1999/09/23 17:37:16 meichel * Added support for Basic Film Session options to dcmpstat print code. * * Revision 1.5 1999/09/15 17:43:33 meichel * Implemented print job dispatcher code for dcmpstat, adapted dcmprtsv * and dcmpsprt applications. * * Revision 1.4 1999/09/13 15:19:15 meichel * Added implementations for a number of further print API methods. * * Revision 1.3 1999/09/10 12:46:54 meichel * Added implementations for a number of print API methods. * * Revision 1.2 1999/09/09 12:20:52 meichel * Added print API method declarations and implementations (empty for now). * * Revision 1.1 1999/09/08 16:41:42 meichel * Moved configuration file evaluation to separate class. * * */ dcmtk-3.6.0/dcmpstat/libsrc/dvpsgal.cc0000644000310500011400000003726311455601070017115 0ustar joergrdicom3/* * * Copyright (C) 1998-2010, 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: DVPSGraphicAnnotation_PList * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:14:32 $ * CVS/RCS Revision: $Revision: 1.17 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmpstat/dvpsgal.h" #include "dcmtk/dcmpstat/dvpsga.h" /* for DVPSGraphicAnnotation */ #include "dcmtk/ofstd/ofstring.h" /* for OFString */ #include "dcmtk/dcmpstat/dvpstx.h" /* for DVPSTextObject */ #include "dcmtk/dcmpstat/dvpsgr.h" /* for DVPSGraphicObject */ #include "dcmtk/dcmpstat/dvpsri.h" /* for DVPSReferencedImage, needed by MSVC5 with STL */ DVPSGraphicAnnotation_PList::DVPSGraphicAnnotation_PList() : list_() { } DVPSGraphicAnnotation_PList::DVPSGraphicAnnotation_PList(const DVPSGraphicAnnotation_PList &arg) : list_() { OFListConstIterator(DVPSGraphicAnnotation *) first = arg.list_.begin(); OFListConstIterator(DVPSGraphicAnnotation *) last = arg.list_.end(); while (first != last) { list_.push_back((*first)->clone()); ++first; } } DVPSGraphicAnnotation_PList::~DVPSGraphicAnnotation_PList() { clear(); } void DVPSGraphicAnnotation_PList::clear() { OFListIterator(DVPSGraphicAnnotation *) first = list_.begin(); OFListIterator(DVPSGraphicAnnotation *) last = list_.end(); while (first != last) { delete (*first); first = list_.erase(first); } } OFCondition DVPSGraphicAnnotation_PList::read(DcmItem &dset) { OFCondition result = EC_Normal; DcmStack stack; DVPSGraphicAnnotation *newObject = NULL; DcmSequenceOfItems *dseq=NULL; DcmItem *ditem=NULL; if (EC_Normal == dset.search(DCM_GraphicAnnotationSequence, stack, ESM_fromHere, OFFalse)) { dseq=(DcmSequenceOfItems *)stack.top(); if (dseq) { unsigned long numItems = dseq->card(); for (unsigned int i=0; igetItem(i); newObject = new DVPSGraphicAnnotation(); if (newObject && ditem) { result = newObject->read(*ditem); list_.push_back(newObject); } else result = EC_MemoryExhausted; } } } return result; } OFCondition DVPSGraphicAnnotation_PList::write(DcmItem &dset) { if (list_.size()==0) return EC_Normal; // don't write empty Sequence OFCondition result = EC_Normal; DcmSequenceOfItems *dseq=NULL; DcmItem *ditem=NULL; dseq = new DcmSequenceOfItems(DCM_GraphicAnnotationSequence); if (dseq) { OFListIterator(DVPSGraphicAnnotation *) first = list_.begin(); OFListIterator(DVPSGraphicAnnotation *) last = list_.end(); while (first != last) { if (result==EC_Normal) { ditem = new DcmItem(); if (ditem) { result = (*first)->write(*ditem); if (result==EC_Normal) dseq->insert(ditem); else delete ditem; } else result = EC_MemoryExhausted; } ++first; } if (result==EC_Normal) dset.insert(dseq, OFTrue /*replaceOld*/); else delete dseq; } else result = EC_MemoryExhausted; return result; } void DVPSGraphicAnnotation_PList::renameLayer(const char *oldName, const char *newName) { if ((oldName==NULL)||(newName==NULL)) return; OFString aString(oldName); OFListIterator(DVPSGraphicAnnotation *) first = list_.begin(); OFListIterator(DVPSGraphicAnnotation *) last = list_.end(); while (first != last) { if (aString == (*first)->getAnnotationLayer()) { (*first)->setAnnotationLayer(newName); } ++first; } return; } void DVPSGraphicAnnotation_PList::removeLayer(const char *name) { if (name==NULL) return; OFString aString(name); OFListIterator(DVPSGraphicAnnotation *) first = list_.begin(); OFListIterator(DVPSGraphicAnnotation *) last = list_.end(); while (first != last) { if (aString == (*first)->getAnnotationLayer()) { delete (*first); first = list_.erase(first); } else ++first; } return; } void DVPSGraphicAnnotation_PList::cleanupLayers() { OFListIterator(DVPSGraphicAnnotation *) first = list_.begin(); OFListIterator(DVPSGraphicAnnotation *) last = list_.end(); while (first != last) { if ((*first)->isEmpty()) { delete (*first); first = list_.erase(first); } else ++first; } return; } OFBool DVPSGraphicAnnotation_PList::usesLayerName(const char *name) { if (name==NULL) return OFFalse; OFString aString(name); OFListIterator(DVPSGraphicAnnotation *) first = list_.begin(); OFListIterator(DVPSGraphicAnnotation *) last = list_.end(); while (first != last) { if (aString == (*first)->getAnnotationLayer()) return OFTrue; ++first; } return OFFalse; } size_t DVPSGraphicAnnotation_PList::getNumberOfTextObjects(const char *layer, const char *instanceUID, unsigned long frame) { if (layer==NULL) return 0; size_t result = 0; OFString aString(layer); OFListIterator(DVPSGraphicAnnotation *) first = list_.begin(); OFListIterator(DVPSGraphicAnnotation *) last = list_.end(); while (first != last) { if ((aString == (*first)->getAnnotationLayer()) && ((*first)->isApplicable(instanceUID, frame))) { result += (*first)->getNumberOfTextObjects(); } ++first; } return result; } DVPSTextObject *DVPSGraphicAnnotation_PList::getTextObject(const char *layer, const char *instanceUID, unsigned long frame, size_t idx) { if (layer==NULL) return NULL; size_t tmp = 0; OFString aString(layer); OFListIterator(DVPSGraphicAnnotation *) first = list_.begin(); OFListIterator(DVPSGraphicAnnotation *) last = list_.end(); while (first != last) { if ((aString == (*first)->getAnnotationLayer()) && ((*first)->isApplicable(instanceUID, frame))) { tmp = (*first)->getNumberOfTextObjects(); if (idx < tmp) return (*first)->getTextObject(idx); else idx -= tmp; } ++first; } return NULL; } DVPSTextObject *DVPSGraphicAnnotation_PList::addTextObject( const char *layer, const char *sopclassUID, const char *instanceUID, unsigned long frame, DVPSObjectApplicability applicability, DVPSTextObject *text) { if (layer==NULL) return NULL; if (text==NULL) { text = new DVPSTextObject(); } if (text==NULL) return NULL; DVPSGraphicAnnotation *annotation = NULL; OFString aString(layer); OFListIterator(DVPSGraphicAnnotation *) first = list_.begin(); OFListIterator(DVPSGraphicAnnotation *) last = list_.end(); while (first != last) { if ((aString == (*first)->getAnnotationLayer()) && ((*first)->isApplicable(instanceUID, frame, applicability))) { annotation = *first; first = last; } else ++first; } if (annotation==NULL) { annotation = new DVPSGraphicAnnotation(); if (annotation) { annotation->setAnnotationLayer(layer); if (applicability != DVPSB_allImages) annotation->addImageReference(sopclassUID, instanceUID, frame, applicability); list_.push_back(annotation); } } if (annotation) { annotation->addTextObject(text); return text; } delete text; return NULL; } OFCondition DVPSGraphicAnnotation_PList::removeTextObject(const char *layer, const char *instanceUID, unsigned long frame, size_t idx) { if (layer==NULL) return EC_IllegalCall; size_t tmp = 0; OFString aString(layer); OFListIterator(DVPSGraphicAnnotation *) first = list_.begin(); OFListIterator(DVPSGraphicAnnotation *) last = list_.end(); while (first != last) { if ((aString == (*first)->getAnnotationLayer()) && ((*first)->isApplicable(instanceUID, frame))) { tmp = (*first)->getNumberOfTextObjects(); if (idx < tmp) { DVPSTextObject *textObject = (*first)->removeTextObject(idx); if (textObject) { delete textObject; return EC_Normal; } else return EC_IllegalCall; } else idx -= tmp; } ++first; } return EC_IllegalCall; } OFCondition DVPSGraphicAnnotation_PList::moveTextObject( const char *old_layer, const char *sopclassUID, const char *instanceUID, unsigned long frame, size_t idx, DVPSObjectApplicability applicability, const char *new_layer) { if (old_layer==NULL) return EC_IllegalCall; if (new_layer==NULL) return EC_IllegalCall; size_t tmp = 0; OFString aString(old_layer); OFListIterator(DVPSGraphicAnnotation *) first = list_.begin(); OFListIterator(DVPSGraphicAnnotation *) last = list_.end(); while (first != last) { if ((aString == (*first)->getAnnotationLayer()) && ((*first)->isApplicable(instanceUID, frame))) { tmp = (*first)->getNumberOfTextObjects(); if (idx < tmp) { DVPSTextObject *textObject = (*first)->removeTextObject(idx); if (textObject) { textObject = addTextObject(new_layer, sopclassUID, instanceUID, frame, applicability, textObject); if (textObject) return EC_Normal; else return EC_MemoryExhausted; } else return EC_IllegalCall; } else idx -= tmp; } ++first; } return EC_IllegalCall; } size_t DVPSGraphicAnnotation_PList::getNumberOfGraphicObjects(const char *layer, const char *instanceUID, unsigned long frame) { if (layer==NULL) return 0; size_t result = 0; OFString aString(layer); OFListIterator(DVPSGraphicAnnotation *) first = list_.begin(); OFListIterator(DVPSGraphicAnnotation *) last = list_.end(); while (first != last) { if ((aString == (*first)->getAnnotationLayer()) && ((*first)->isApplicable(instanceUID, frame))) { result += (*first)->getNumberOfGraphicObjects(); } ++first; } return result; } DVPSGraphicObject *DVPSGraphicAnnotation_PList::getGraphicObject(const char *layer, const char *instanceUID, unsigned long frame, size_t idx) { if (layer==NULL) return NULL; size_t tmp = 0; OFString aString(layer); OFListIterator(DVPSGraphicAnnotation *) first = list_.begin(); OFListIterator(DVPSGraphicAnnotation *) last = list_.end(); while (first != last) { if ((aString == (*first)->getAnnotationLayer()) && ((*first)->isApplicable(instanceUID, frame))) { tmp = (*first)->getNumberOfGraphicObjects(); if (idx < tmp) return (*first)->getGraphicObject(idx); else idx -= tmp; } ++first; } return NULL; } DVPSGraphicObject *DVPSGraphicAnnotation_PList::addGraphicObject( const char *layer, const char *sopclassUID, const char *instanceUID, unsigned long frame, DVPSObjectApplicability applicability, DVPSGraphicObject *graphic) { if (layer==NULL) return NULL; if (graphic==NULL) graphic = new DVPSGraphicObject(); if (graphic==NULL) return NULL; DVPSGraphicAnnotation *annotation = NULL; OFString aString(layer); OFListIterator(DVPSGraphicAnnotation *) first = list_.begin(); OFListIterator(DVPSGraphicAnnotation *) last = list_.end(); while (first != last) { if ((aString == (*first)->getAnnotationLayer()) && ((*first)->isApplicable(instanceUID, frame, applicability))) { annotation = *first; first = last; } else ++first; } if (annotation==NULL) { annotation = new DVPSGraphicAnnotation(); if (annotation) { annotation->setAnnotationLayer(layer); if (applicability != DVPSB_allImages) annotation->addImageReference(sopclassUID, instanceUID, frame, applicability); list_.push_back(annotation); } } if (annotation) { annotation->addGraphicObject(graphic); return graphic; } delete graphic; return NULL; } OFCondition DVPSGraphicAnnotation_PList::removeGraphicObject(const char *layer, const char *instanceUID, unsigned long frame, size_t idx) { if (layer==NULL) return EC_IllegalCall; size_t tmp = 0; OFString aString(layer); OFListIterator(DVPSGraphicAnnotation *) first = list_.begin(); OFListIterator(DVPSGraphicAnnotation *) last = list_.end(); while (first != last) { if ((aString == (*first)->getAnnotationLayer()) && ((*first)->isApplicable(instanceUID, frame))) { tmp = (*first)->getNumberOfGraphicObjects(); if (idx < tmp) { DVPSGraphicObject *graphicObject = (*first)->removeGraphicObject(idx); if (graphicObject) { delete graphicObject; return EC_Normal; } else return EC_IllegalCall; } else idx -= tmp; } ++first; } return EC_IllegalCall; } OFCondition DVPSGraphicAnnotation_PList::moveGraphicObject( const char *old_layer, const char *sopclassUID, const char *instanceUID, unsigned long frame, size_t idx, DVPSObjectApplicability applicability, const char *new_layer) { if (old_layer==NULL) return EC_IllegalCall; if (new_layer==NULL) return EC_IllegalCall; size_t tmp = 0; OFString aString(old_layer); OFListIterator(DVPSGraphicAnnotation *) first = list_.begin(); OFListIterator(DVPSGraphicAnnotation *) last = list_.end(); while (first != last) { if ((aString == (*first)->getAnnotationLayer()) && ((*first)->isApplicable(instanceUID, frame))) { tmp = (*first)->getNumberOfGraphicObjects(); if (idx < tmp) { DVPSGraphicObject *graphicObject = (*first)->removeGraphicObject(idx); if (graphicObject) { graphicObject = addGraphicObject(new_layer, sopclassUID, instanceUID, frame, applicability, graphicObject); if (graphicObject) return EC_Normal; else return EC_MemoryExhausted; } else return EC_IllegalCall; } else idx -= tmp; } ++first; } return EC_IllegalCall; } /* * $Log: dvpsgal.cc,v $ * Revision 1.17 2010-10-14 13:14:32 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.16 2009-11-24 14:12:58 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.15 2005-12-08 15:46:27 meichel * Changed include path schema for all DCMTK header files * * Revision 1.14 2004/02/04 15:57:49 joergr * Removed acknowledgements with e-mail addresses from CVS log. * * Revision 1.13 2003/09/05 08:37:46 meichel * Fixed minor issue that caused certain error messages during the * parse process on a GSPS object to be "swallowed". * * Revision 1.12 2003/06/12 18:23:11 joergr * Modified code to use const_iterators where appropriate (required for STL). * * Revision 1.11 2003/06/04 12:30:28 meichel * Added various includes needed by MSVC5 with STL * * Revision 1.10 2003/06/04 10:18:07 meichel * Replaced private inheritance from template with aggregation * * Revision 1.9 2001/11/28 13:56:54 joergr * Check return value of DcmItem::insert() statements where appropriate to * avoid memory leaks when insert procedure fails. * * Revision 1.8 2001/09/26 15:36:25 meichel * Adapted dcmpstat to class OFCondition * * Revision 1.7 2001/06/01 15:50:30 meichel * Updated copyright header * * Revision 1.6 2000/06/02 16:01:00 meichel * Adapted all dcmpstat classes to use OFConsole for log and error output * * Revision 1.5 2000/03/08 16:29:04 meichel * Updated copyright header. * * Revision 1.4 1999/07/22 16:39:57 meichel * Adapted dcmpstat data structures and API to supplement 33 letter ballot text. * * Revision 1.3 1999/04/30 16:40:49 meichel * Minor code purifications to keep Sun CC 2.0.1 quiet * * Revision 1.2 1998/12/14 16:10:41 meichel * Implemented Presentation State interface for graphic layers, * text and graphic annotations, presentation LUTs. * * Revision 1.1 1998/11/27 14:50:40 meichel * Initial Release. * * */ dcmtk-3.6.0/dcmpstat/libsrc/dvpsfs.cc0000644000310500011400000010076011455601070016753 0ustar joergrdicom3/* * * Copyright (C) 1998-2010, 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: DVPSFilmSession * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:14:32 $ * CVS/RCS Revision: $Revision: 1.17 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmpstat/dvpsfs.h" #include "dcmtk/dcmpstat/dvpsdef.h" /* for constants and macros */ #include "dcmtk/ofstd/ofstring.h" #include "dcmtk/dcmpstat/dvpshlp.h" #include "dcmtk/dcmpstat/dvpscf.h" #include "dcmtk/dcmpstat/dvpspl.h" #include "dcmtk/dcmpstat/dvpspll.h" #include "dcmtk/dcmpstat/dvpssp.h" #include "dcmtk/dcmpstat/dvpsspl.h" #include "dcmtk/dcmpstat/dvpsib.h" /* for DVPSImageBoxContent, needed by MSVC5 with STL */ #include "dcmtk/dcmpstat/dvpsab.h" /* for DVPSAnnotationContent, needed by MSVC5 with STL */ #include "dcmtk/dcmpstat/dvpsov.h" /* for DVPSOverlay, needed by MSVC5 with STL */ #include "dcmtk/dcmpstat/dvpsgl.h" /* for DVPSGraphicLayer, needed by MSVC5 with STL */ #include "dcmtk/dcmpstat/dvpsal.h" /* for DVPSOverlayCurveActivationLayer, needed by MSVC5 with STL */ #include "dcmtk/dcmpstat/dvpsga.h" /* for DVPSGraphicAnnotation, needed by MSVC5 with STL */ #include "dcmtk/dcmpstat/dvpscu.h" /* for DVPSCurve, needed by MSVC5 with STL */ #include "dcmtk/dcmpstat/dvpsvl.h" /* for DVPSVOILUT, needed by MSVC5 with STL */ #include "dcmtk/dcmpstat/dvpsvw.h" /* for DVPSVOIWindow, needed by MSVC5 with STL */ #include "dcmtk/dcmpstat/dvpsda.h" /* for DVPSDisplayedArea, needed by MSVC5 with STL */ #include "dcmtk/dcmpstat/dvpssv.h" /* for DVPSSoftcopyVOI, needed by MSVC5 with STL */ #include "dcmtk/dcmpstat/dvpsrs.h" /* for DVPSReferencedSeries, needed by MSVC5 with STL */ #include "dcmtk/dcmpstat/dvpstx.h" /* for DVPSTextObject, needed by MSVC5 with STL */ #include "dcmtk/dcmpstat/dvpsgr.h" /* for DVPSGraphicObject, needed by MSVC5 with STL */ #include "dcmtk/dcmpstat/dvpsri.h" /* for DVPSReferencedImage, needed by MSVC5 with STL */ #define INCLUDE_CSTRING #include "dcmtk/ofstd/ofstdinc.h" /* --------------- class DVPSFilmSession --------------- */ DVPSFilmSession::DVPSFilmSession(Uint16 illumin, Uint16 reflection) : sopInstanceUID(NULL) , numberOfCopies(DCM_NumberOfCopies) , printPriority(DCM_PrintPriority) , mediumType(DCM_MediumType) , filmDestination(DCM_FilmDestination) , filmSessionLabel(DCM_FilmSessionLabel) , ownerID(DCM_OwnerID) , illumination(DCM_Illumination) , reflectedAmbientLight(DCM_ReflectedAmbientLight) , referencedPresentationLUTInstanceUID(DCM_ReferencedSOPInstanceUID) , referencedPresentationLUTAlignment(DVPSK_other) { illumination.putUint16(illumin, 0); reflectedAmbientLight.putUint16(reflection, 0); } DVPSFilmSession::DVPSFilmSession(const DVPSFilmSession& copy) : sopInstanceUID(copy.sopInstanceUID) , numberOfCopies(copy.numberOfCopies) , printPriority(copy.printPriority) , mediumType(copy.mediumType) , filmDestination(copy.filmDestination) , filmSessionLabel(copy.filmSessionLabel) , ownerID(copy.ownerID) , illumination(copy.illumination) , reflectedAmbientLight(copy.reflectedAmbientLight) , referencedPresentationLUTInstanceUID(copy.referencedPresentationLUTInstanceUID) , referencedPresentationLUTAlignment(copy.referencedPresentationLUTAlignment) { } DVPSFilmSession::~DVPSFilmSession() { } OFBool DVPSFilmSession::isInstance(const char *uid) { if (uid && (sopInstanceUID == uid)) return OFTrue; return OFFalse; } OFBool DVPSFilmSession::printSCPCreate( DVConfiguration& cfg, const char *cfgname, DcmDataset *rqDataset, T_DIMSE_Message& rsp, DcmDataset *& rspDataset, const char *peerae, OFBool presentationLUTnegotiated, DVPSPresentationLUT_PList& globalPresentationLUTList) { OFBool result = OFTrue; DcmStack stack; sopInstanceUID = rsp.msg.NCreateRSP.AffectedSOPInstanceUID; // numberOfCopies if (result) { READ_FROM_PDATASET(DcmIntegerString, numberOfCopies) if (numberOfCopies.getLength() == 0) numberOfCopies.putString(DEFAULT_numberOfCopies); else { Sint32 numCopies=0; char *numCopiesString=NULL; if ((EC_Normal != numberOfCopies.getSint32(numCopies)) || (numCopies < 1)) { numberOfCopies.getString(numCopiesString); if (numCopiesString==NULL) numCopiesString = (char *)""; DCMPSTAT_INFO("cannot create Basic Film Session: illegal number of copies: '" << numCopiesString << "'"); rsp.msg.NCreateRSP.DimseStatus = STATUS_N_InvalidAttributeValue; result = OFFalse; } } } // printPriority if (result) { READ_FROM_PDATASET(DcmCodeString, printPriority) if (printPriority.getLength() == 0) printPriority.putString(DEFAULT_priority); else { OFString aString; printPriority.getOFString(aString, 0, OFTrue); if ((aString != "HIGH")&&(aString != "MED")&&(aString != "LOW")) { DCMPSTAT_INFO("cannot create Basic Film Session: illegal print priority: '" << aString.c_str() << "'"); rsp.msg.NCreateRSP.DimseStatus = STATUS_N_InvalidAttributeValue; result = OFFalse; } } } // mediumType if (result) { Uint32 numMediumTypes = cfg.getTargetPrinterNumberOfMediumTypes(cfgname); READ_FROM_PDATASET(DcmCodeString, mediumType) if (mediumType.getLength() == 0) { if (numMediumTypes > 0) { OFString aString; cfg.getTargetPrinterMediumType(cfgname, 0, aString); mediumType.putString(aString.c_str()); } else { mediumType.putString(DEFAULT_mediumType); } } else { // check whether we can accept the proposed medium type OFString theMedium; OFString aString; OFBool found = OFFalse; mediumType.getOFString(theMedium, 0, OFTrue); for (Uint32 i=0; i 0) { OFString aString; cfg.getTargetPrinterFilmDestination(cfgname, 0, aString); filmDestination.putString(aString.c_str()); } else { filmDestination.putString(DEFAULT_filmDestination); } } else { // check whether we can accept the proposed medium type OFString theDestination; OFString aString; OFBool found = OFFalse; filmDestination.getOFString(theDestination, 0, OFTrue); for (Uint32 i=0; isearch(DCM_ReferencedPresentationLUTSequence, stack, ESM_fromHere, OFFalse))) { DcmSequenceOfItems *seq=(DcmSequenceOfItems *)stack.top(); if (seq->card() ==1) { OFString aString; DcmItem *item = seq->getItem(0); stack.clear(); READ_FROM_DATASET2(DcmUniqueIdentifier, referencedPresentationLUTInstanceUID) if (referencedPresentationLUTInstanceUID.getLength() > 0) { referencedPresentationLUTInstanceUID.getOFString(aString,0); DVPSPresentationLUT *currentPLUT = globalPresentationLUTList.findPresentationLUT(aString.c_str()); if (NULL == currentPLUT) { DCMPSTAT_INFO("cannot create Basic Film Session: presentation LUT reference cannot be resolved"); rsp.msg.NCreateRSP.DimseStatus = STATUS_N_InvalidAttributeValue; result = OFFalse; } else { // check referenced SOP class UID DcmUniqueIdentifier refClassUID(DCM_ReferencedSOPClassUID); stack.clear(); READ_FROM_DATASET2(DcmUniqueIdentifier, refClassUID) if (refClassUID.getLength() > 0) { aString.clear(); refClassUID.getOFString(aString,0, OFTrue); if (aString != UID_PresentationLUTSOPClass) { DCMPSTAT_INFO("cannot create Basic Film Session: referenced SOP class UID in referenced presentation LUT sequence incorrect:\n" << DcmObject::PrintHelper(*stack.top(), DCMTypes::PF_shortenLongTagValues)); rsp.msg.NCreateRSP.DimseStatus = STATUS_N_InvalidAttributeValue; result = OFFalse; } else { // referenced presentation LUT sequence is OK referencedPresentationLUTAlignment = currentPLUT->getAlignment(); } } else { DCMPSTAT_INFO("cannot create Basic Film Session: no referenced SOP class UID in referenced presentation LUT sequence"); rsp.msg.NCreateRSP.DimseStatus = STATUS_N_InvalidAttributeValue; result = OFFalse; } } } else { DCMPSTAT_INFO("cannot create Basic Film Session: no referenced SOP instance UID in referenced presentation LUT sequence"); rsp.msg.NCreateRSP.DimseStatus = STATUS_N_InvalidAttributeValue; result = OFFalse; } } else { DCMPSTAT_INFO("cannot create Basic Film Session: referenced presentation LUT sequence number of items != 1"); rsp.msg.NCreateRSP.DimseStatus = STATUS_N_InvalidAttributeValue; result = OFFalse; } } } } /* if presentationLUTnegotiated */ // browse through rqDataset and check for unsupported attributes if (result && rqDataset) { OFBool intoSub = OFTrue; stack.clear(); while (EC_Normal == rqDataset->nextObject(stack, intoSub)) { intoSub = OFFalse; const DcmTagKey& currentTag = (stack.top())->getTag(); if (currentTag.getElement() == 0x0000) /* group length */ ; else if (currentTag == DCM_NumberOfCopies) /* OK */ ; else if (currentTag == DCM_PrintPriority) /* OK */ ; else if (currentTag == DCM_MediumType) /* OK */ ; else if (currentTag == DCM_FilmDestination) /* OK */ ; else if (currentTag == DCM_FilmSessionLabel) /* OK */ ; else if (currentTag == DCM_OwnerID) /* OK */ ; else if (currentTag == DCM_MemoryAllocation) { DCMPSTAT_INFO("warning while creating Basic Film Session: memory allocation not supported:\n" << DcmObject::PrintHelper(*stack.top(), DCMTypes::PF_shortenLongTagValues)); if (rsp.msg.NCreateRSP.DimseStatus == 0) rsp.msg.NCreateRSP.DimseStatus = STATUS_N_PRINT_BFS_Warn_MemoryAllocation; } else if (currentTag == DCM_Illumination) { if (! presentationLUTnegotiated) { DCMPSTAT_INFO("cannot create Basic Film Session: illumination received:\n" << DcmObject::PrintHelper(*stack.top(), DCMTypes::PF_shortenLongTagValues)); rsp.msg.NCreateRSP.DimseStatus = STATUS_N_NoSuchAttribute; result = OFFalse; } } else if (currentTag == DCM_ReflectedAmbientLight) { if (! presentationLUTnegotiated) { DCMPSTAT_INFO("cannot create Basic Film Session: reflected ambient light received:\n" << DcmObject::PrintHelper(*stack.top(), DCMTypes::PF_shortenLongTagValues)); rsp.msg.NCreateRSP.DimseStatus = STATUS_N_NoSuchAttribute; result = OFFalse; } } else if (currentTag == DCM_ReferencedPresentationLUTSequence) { if (! presentationLUTnegotiated) { DCMPSTAT_INFO("cannot create Basic Film Session: referenced presentation LUT sequence received:\n" << DcmObject::PrintHelper(*stack.top(), DCMTypes::PF_shortenLongTagValues)); rsp.msg.NCreateRSP.DimseStatus = STATUS_N_NoSuchAttribute; result = OFFalse; } } else { DCMPSTAT_INFO("cannot create Basic Film Session: unsupported attribute received:\n" << DcmObject::PrintHelper(*stack.top(), DCMTypes::PF_shortenLongTagValues)); rsp.msg.NCreateRSP.DimseStatus = STATUS_N_NoSuchAttribute; result = OFFalse; } } } // if n-create was successful, create response dataset if (result) { rspDataset = new DcmDataset; if (rspDataset) { OFCondition writeresult = EC_Normal; DcmElement *delem = NULL; ADD_TO_PDATASET(DcmIntegerString, numberOfCopies) ADD_TO_PDATASET(DcmCodeString, printPriority) ADD_TO_PDATASET(DcmCodeString, mediumType) ADD_TO_PDATASET(DcmCodeString, filmDestination) ADD_TO_PDATASET(DcmLongString, filmSessionLabel) ADD_TO_PDATASET(DcmShortString, ownerID) if (presentationLUTnegotiated) { if (referencedPresentationLUTInstanceUID.getLength() == 0) { referencedPresentationLUTInstanceUID.putString(WELLKNOWN_IDENTITY_PLUT_UID); if (NULL == globalPresentationLUTList.findPresentationLUT(WELLKNOWN_IDENTITY_PLUT_UID)) { DVPSPresentationLUT *wellknownlut = new DVPSPresentationLUT(); if (wellknownlut) { writeresult = wellknownlut->setType(DVPSP_identity); if (EC_Normal == writeresult) writeresult = wellknownlut->setSOPInstanceUID(WELLKNOWN_IDENTITY_PLUT_UID); if (EC_Normal == writeresult) globalPresentationLUTList.insert(wellknownlut); } else writeresult = EC_MemoryExhausted; } } if (EC_Normal == writeresult) writeresult = addPresentationLUTReference(*rspDataset); } if (EC_Normal == writeresult) { rsp.msg.NCreateRSP.DataSetType = DIMSE_DATASET_PRESENT; } else { delete rspDataset; rspDataset = NULL; rsp.msg.NCreateRSP.DimseStatus = STATUS_N_ProcessingFailure; result = OFFalse; } } else { rsp.msg.NCreateRSP.DimseStatus = STATUS_N_ProcessingFailure; result = OFFalse; } } return result; } OFBool DVPSFilmSession::printSCPSet( DVConfiguration& cfg, const char *cfgname, DcmDataset *rqDataset, T_DIMSE_Message& rsp, DcmDataset *& rspDataset, OFBool presentationLUTnegotiated, DVPSPresentationLUT_PList& globalPresentationLUTList, DVPSStoredPrint_PList& basicFilmBoxList) { OFBool result = OFTrue; DcmStack stack; OFCondition writeresult = EC_Normal; DcmElement *delem = NULL; OFBool overrideFilmBoxPLUTSettings = OFFalse; rspDataset = new DcmDataset; if ((rqDataset == NULL)||(rspDataset == NULL)) { rsp.msg.NSetRSP.DimseStatus = STATUS_N_ProcessingFailure; result = OFFalse; } // numberOfCopies if (result) { stack.clear(); if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)numberOfCopies.getTag(), stack, ESM_fromHere, OFFalse))) { numberOfCopies = *((DcmIntegerString *)(stack.top())); Sint32 numCopies=0; char *numCopiesString=NULL; if ((EC_Normal != numberOfCopies.getSint32(numCopies)) || (numCopies < 1)) { numberOfCopies.getString(numCopiesString); if (numCopiesString==NULL) numCopiesString = (char *)""; DCMPSTAT_INFO("cannot update Basic Film Session: illegal number of copies: '" << numCopiesString << "'"); rsp.msg.NSetRSP.DimseStatus = STATUS_N_InvalidAttributeValue; result = OFFalse; } else { ADD_TO_PDATASET(DcmIntegerString, numberOfCopies) } } } // printPriority if (result) { stack.clear(); if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)printPriority.getTag(), stack, ESM_fromHere, OFFalse))) { printPriority = *((DcmCodeString *)(stack.top())); OFString aString; printPriority.getOFString(aString, 0, OFTrue); if ((aString != "HIGH")&&(aString != "MED")&&(aString != "LOW")) { DCMPSTAT_INFO("cannot update Basic Film Session: illegal print priority: '" << aString.c_str() << "'"); rsp.msg.NSetRSP.DimseStatus = STATUS_N_InvalidAttributeValue; result = OFFalse; } else { ADD_TO_PDATASET(DcmCodeString, printPriority) } } } // mediumType if (result) { Uint32 numMediumTypes = cfg.getTargetPrinterNumberOfMediumTypes(cfgname); stack.clear(); if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)mediumType.getTag(), stack, ESM_fromHere, OFFalse))) { mediumType = *((DcmCodeString *)(stack.top())); OFString theMedium; OFString aString; OFBool found = OFFalse; mediumType.getOFString(theMedium, 0, OFTrue); for (Uint32 i=0; isearch((DcmTagKey &)filmDestination.getTag(), stack, ESM_fromHere, OFFalse))) { filmDestination = *((DcmCodeString *)(stack.top())); OFString theDestination; OFString aString; OFBool found = OFFalse; filmDestination.getOFString(theDestination, 0, OFTrue); for (Uint32 i=0; isearch((DcmTagKey &)filmSessionLabel.getTag(), stack, ESM_fromHere, OFFalse))) { filmSessionLabel = *((DcmLongString *)(stack.top())); ADD_TO_PDATASET(DcmLongString, filmSessionLabel) } } // ownerID if (result) { stack.clear(); if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)ownerID.getTag(), stack, ESM_fromHere, OFFalse))) { ownerID = *((DcmShortString *)(stack.top())); ADD_TO_PDATASET(DcmShortString, ownerID) } } if (presentationLUTnegotiated) { // illumination if (result) { stack.clear(); if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)illumination.getTag(), stack, ESM_fromHere, OFFalse))) { illumination = *((DcmUnsignedShort *)(stack.top())); // we don't check illumination set by the user (for now) ADD_TO_PDATASET(DcmUnsignedShort, illumination) } } // reflectedAmbientLight if (result) { stack.clear(); if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)reflectedAmbientLight.getTag(), stack, ESM_fromHere, OFFalse))) { reflectedAmbientLight = *((DcmUnsignedShort *)(stack.top())); // we don't check reflected ambient light set by the user (for now) ADD_TO_PDATASET(DcmUnsignedShort, reflectedAmbientLight) } } // referenced presentation LUT sequence if (result) { stack.clear(); if (rqDataset && (EC_Normal == rqDataset->search(DCM_ReferencedPresentationLUTSequence, stack, ESM_fromHere, OFFalse))) { DcmSequenceOfItems *seq=(DcmSequenceOfItems *)stack.top(); if (seq->card() ==1) { OFString aString; DcmItem *item = seq->getItem(0); stack.clear(); READ_FROM_DATASET2(DcmUniqueIdentifier, referencedPresentationLUTInstanceUID) if (referencedPresentationLUTInstanceUID.getLength() > 0) { referencedPresentationLUTInstanceUID.getOFString(aString,0); DVPSPresentationLUT *currentPLUT = globalPresentationLUTList.findPresentationLUT(aString.c_str()); if (NULL == currentPLUT) { DCMPSTAT_INFO("cannot update Basic Film Session: presentation LUT reference cannot be resolved"); rsp.msg.NSetRSP.DimseStatus = STATUS_N_InvalidAttributeValue; result = OFFalse; } else { // check referenced SOP class UID DcmUniqueIdentifier refClassUID(DCM_ReferencedSOPClassUID); stack.clear(); READ_FROM_DATASET2(DcmUniqueIdentifier, refClassUID) if (refClassUID.getLength() > 0) { aString.clear(); refClassUID.getOFString(aString,0, OFTrue); if (aString != UID_PresentationLUTSOPClass) { DCMPSTAT_INFO("cannot update Basic Film Session: referenced SOP class UID in referenced presentation LUT sequence incorrect:\n" << DcmObject::PrintHelper(*stack.top(), DCMTypes::PF_shortenLongTagValues)); rsp.msg.NSetRSP.DimseStatus = STATUS_N_InvalidAttributeValue; result = OFFalse; } else { referencedPresentationLUTAlignment = currentPLUT->getAlignment(); if ((cfg.getTargetPrinterPresentationLUTMatchRequired(cfgname)) && (! basicFilmBoxList.matchesPresentationLUT(referencedPresentationLUTAlignment))) { DCMPSTAT_INFO("cannot update Basic Film Session: referenced presentation LUT number of entries does not match image bit depth."); rsp.msg.NSetRSP.DimseStatus = STATUS_N_InvalidAttributeValue; result = OFFalse; } else { // referenced presentation LUT sequence is OK overrideFilmBoxPLUTSettings = OFTrue; DcmSequenceOfItems *newSeq = new DcmSequenceOfItems(*seq); if (newSeq) rspDataset->insert(newSeq, OFTrue /*replaceOld*/); else { writeresult = EC_MemoryExhausted; } } } } else { DCMPSTAT_INFO("cannot update Basic Film Session: no referenced SOP class UID in referenced presentation LUT sequence"); rsp.msg.NSetRSP.DimseStatus = STATUS_N_InvalidAttributeValue; result = OFFalse; } } } else { DCMPSTAT_INFO("cannot update Basic Film Session: no referenced SOP instance UID in referenced presentation LUT sequence"); rsp.msg.NSetRSP.DimseStatus = STATUS_N_InvalidAttributeValue; result = OFFalse; } } else { DCMPSTAT_INFO("cannot update Basic Film Session: referenced presentation LUT sequence number of items != 1"); rsp.msg.NSetRSP.DimseStatus = STATUS_N_InvalidAttributeValue; result = OFFalse; } } } } /* if presentationLUTnegotiated */ // browse through rqDataset and check for unsupported attributes if (result && rqDataset) { stack.clear(); OFBool intoSub = OFTrue; while (EC_Normal == rqDataset->nextObject(stack, intoSub)) { intoSub = OFFalse; const DcmTagKey& currentTag = (stack.top())->getTag(); if (currentTag.getElement() == 0x0000) /* group length */ ; else if (currentTag == DCM_NumberOfCopies) /* OK */ ; else if (currentTag == DCM_PrintPriority) /* OK */ ; else if (currentTag == DCM_MediumType) /* OK */ ; else if (currentTag == DCM_FilmDestination) /* OK */ ; else if (currentTag == DCM_FilmSessionLabel) /* OK */ ; else if (currentTag == DCM_OwnerID) /* OK */ ; else if (currentTag == DCM_MemoryAllocation) { DCMPSTAT_INFO("warning while updating Basic Film Session: memory allocation not supported\n" << DcmObject::PrintHelper(*stack.top(), DCMTypes::PF_shortenLongTagValues)); if (rsp.msg.NSetRSP.DimseStatus == 0) rsp.msg.NSetRSP.DimseStatus = STATUS_N_PRINT_BFS_Warn_MemoryAllocation; } else if (currentTag == DCM_Illumination) { if (! presentationLUTnegotiated) { DCMPSTAT_INFO("cannot update Basic Film Session: illumination received:\n" << DcmObject::PrintHelper(*stack.top(), DCMTypes::PF_shortenLongTagValues)); rsp.msg.NSetRSP.DimseStatus = STATUS_N_NoSuchAttribute; result = OFFalse; } } else if (currentTag == DCM_ReflectedAmbientLight) { if (! presentationLUTnegotiated) { DCMPSTAT_INFO("cannot update Basic Film Session: reflected ambient light received:\n" << DcmObject::PrintHelper(*stack.top(), DCMTypes::PF_shortenLongTagValues)); rsp.msg.NSetRSP.DimseStatus = STATUS_N_NoSuchAttribute; result = OFFalse; } } else if (currentTag == DCM_ReferencedPresentationLUTSequence) { if (! presentationLUTnegotiated) { DCMPSTAT_INFO("cannot update Basic Film Session: referenced presentation LUT sequence received:\n" << DcmObject::PrintHelper(*stack.top(), DCMTypes::PF_shortenLongTagValues)); rsp.msg.NSetRSP.DimseStatus = STATUS_N_NoSuchAttribute; result = OFFalse; } } else { DCMPSTAT_INFO("cannot update Basic Film Session: unsupported attribute received:\n" << DcmObject::PrintHelper(*stack.top(), DCMTypes::PF_shortenLongTagValues)); rsp.msg.NSetRSP.DimseStatus = STATUS_N_NoSuchAttribute; result = OFFalse; } } } // if n-set was successful, send back response dataset if (result && (EC_Normal == writeresult)) { rsp.msg.NSetRSP.DataSetType = DIMSE_DATASET_PRESENT; if (overrideFilmBoxPLUTSettings) { basicFilmBoxList.overridePresentationLUTSettings(illumination, reflectedAmbientLight, referencedPresentationLUTInstanceUID, referencedPresentationLUTAlignment); } } else { delete rspDataset; rspDataset = NULL; if (rsp.msg.NSetRSP.DimseStatus == 0) rsp.msg.NSetRSP.DimseStatus = STATUS_N_ProcessingFailure; result = OFFalse; } return result; } OFCondition DVPSFilmSession::addPresentationLUTReference(DcmItem& dset) { DcmElement *delem=NULL; OFCondition result = EC_Normal; ADD_TO_DATASET(DcmUnsignedShort, illumination) ADD_TO_DATASET(DcmUnsignedShort, reflectedAmbientLight) if (referencedPresentationLUTInstanceUID.getLength() > 0) { DcmUniqueIdentifier refsopclassuid(DCM_ReferencedSOPClassUID); if (result==EC_Normal) result = refsopclassuid.putString(UID_PresentationLUTSOPClass); DcmSequenceOfItems *dseq = new DcmSequenceOfItems(DCM_ReferencedPresentationLUTSequence); DcmItem *ditem = new DcmItem(); if ((result == EC_Normal) && ditem && dseq) { ADD_TO_DATASET2(DcmUniqueIdentifier, refsopclassuid) ADD_TO_DATASET2(DcmUniqueIdentifier, referencedPresentationLUTInstanceUID) if (result==EC_Normal) { dseq->insert(ditem); dset.insert(dseq, OFTrue /*replaceOld*/); } else { delete dseq; delete ditem; } } else { delete dseq; delete ditem; result = EC_MemoryExhausted; } } return result; } void DVPSFilmSession::copyPresentationLUTSettings(DVPSStoredPrint& sp) { sp.overridePresentationLUTSettings(illumination, reflectedAmbientLight, referencedPresentationLUTInstanceUID, referencedPresentationLUTAlignment); } /* * $Log: dvpsfs.cc,v $ * Revision 1.17 2010-10-14 13:14:32 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.16 2009-11-24 14:12:58 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.15 2006-08-15 16:57:02 meichel * Updated the code in module dcmpstat to correctly compile when * all standard C++ classes remain in namespace std. * * Revision 1.14 2005/12/08 15:46:25 meichel * Changed include path schema for all DCMTK header files * * Revision 1.13 2003/06/04 12:30:28 meichel * Added various includes needed by MSVC5 with STL * * Revision 1.12 2003/03/12 17:34:22 meichel * Updated DcmObject::print() flags * * Revision 1.11 2002/11/27 15:48:09 meichel * Adapted module dcmpstat to use of new header file ofstdinc.h * * Revision 1.10 2001/11/28 13:56:53 joergr * Check return value of DcmItem::insert() statements where appropriate to * avoid memory leaks when insert procedure fails. * * Revision 1.9 2001/09/26 15:36:24 meichel * Adapted dcmpstat to class OFCondition * * Revision 1.8 2001/06/01 15:50:30 meichel * Updated copyright header * * Revision 1.7 2001/05/25 10:07:56 meichel * Corrected some DIMSE error status codes for Print SCP * * Revision 1.6 2000/09/06 08:55:36 meichel * Updated Print SCP to accept and silently ignore group length attributes. * * Revision 1.5 2000/06/08 10:44:34 meichel * Implemented Referenced Presentation LUT Sequence on Basic Film Session level. * Empty film boxes (pages) are not written to file anymore. * * Revision 1.4 2000/06/07 13:17:06 meichel * now using DIMSE status constants and log facilities defined in dcmnet * * Revision 1.3 2000/06/02 16:00:59 meichel * Adapted all dcmpstat classes to use OFConsole for log and error output * * Revision 1.2 2000/06/02 12:45:05 joergr * Removed const type specifier to avoid compiler warnings reported by MSVC. * * Revision 1.1 2000/05/31 12:58:11 meichel * Added initial Print SCP support * * */ dcmtk-3.6.0/dcmpstat/libsrc/dvpsrs.cc0000644000310500011400000002136111455601070016766 0ustar joergrdicom3/* * * Copyright (C) 1998-2010, 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: DVPSReferencedSeries * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:14:32 $ * CVS/RCS Revision: $Revision: 1.18 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcdeftag.h" #include "dcmtk/dcmpstat/dvpsrs.h" #include "dcmtk/dcmpstat/dvpsdef.h" /* for constants and macros */ #include "dcmtk/dcmpstat/dvpsri.h" /* for DVPSReferencedImage, needed by MSVC5 with STL */ /* --------------- class DVPSReferencedSeries --------------- */ DVPSReferencedSeries::DVPSReferencedSeries() : referencedImageList() , seriesInstanceUID(DCM_SeriesInstanceUID) , retrieveAETitle(DCM_RetrieveAETitle) , storageMediaFileSetID(DCM_StorageMediaFileSetID) , storageMediaFileSetUID(DCM_StorageMediaFileSetUID) { } DVPSReferencedSeries::DVPSReferencedSeries(const DVPSReferencedSeries& copy) : referencedImageList(copy.referencedImageList) , seriesInstanceUID(copy.seriesInstanceUID) , retrieveAETitle(copy.retrieveAETitle) , storageMediaFileSetID(copy.storageMediaFileSetID) , storageMediaFileSetUID(copy.storageMediaFileSetUID) { } DVPSReferencedSeries::~DVPSReferencedSeries() { } OFCondition DVPSReferencedSeries::read(DcmItem &dset) { OFCondition result = EC_Normal; DcmStack stack; READ_FROM_DATASET(DcmUniqueIdentifier, seriesInstanceUID) READ_FROM_DATASET(DcmApplicationEntity, retrieveAETitle) READ_FROM_DATASET(DcmShortString, storageMediaFileSetID) READ_FROM_DATASET(DcmUniqueIdentifier, storageMediaFileSetUID) if (result==EC_Normal) result = referencedImageList.read(dset); /* Now perform basic sanity checks */ if (seriesInstanceUID.getLength() == 0) { result=EC_IllegalCall; DCMPSTAT_INFO("presentation state contains a referenced series SQ item with seriesInstanceUID absent or empty"); } else if (seriesInstanceUID.getVM() != 1) { result=EC_IllegalCall; DCMPSTAT_INFO("presentation state contains a referenced series SQ item with seriesInstanceUID VM != 1"); } else if (retrieveAETitle.getVM() > 1) { result=EC_IllegalCall; DCMPSTAT_INFO("presentation state contains a referenced series SQ item with retrieveAETitle VM > 1"); } else if (storageMediaFileSetID.getVM() > 1) { result=EC_IllegalCall; DCMPSTAT_INFO("presentation state contains a referenced series SQ item with storageMediaFileSetID VM > 1"); } else if (storageMediaFileSetUID.getVM() > 1) { result=EC_IllegalCall; DCMPSTAT_INFO("presentation state contains a referenced series SQ item with storageMediaFileSetUID VM > 1"); } return result; } OFCondition DVPSReferencedSeries::write(DcmItem &dset) { OFCondition result = EC_Normal; DcmElement *delem=NULL; ADD_TO_DATASET(DcmUniqueIdentifier, seriesInstanceUID) if (retrieveAETitle.getLength() > 0) { ADD_TO_DATASET(DcmApplicationEntity, retrieveAETitle) } if (storageMediaFileSetID.getLength() > 0) { ADD_TO_DATASET(DcmShortString, storageMediaFileSetID) } if (storageMediaFileSetUID.getLength() > 0) { ADD_TO_DATASET(DcmUniqueIdentifier, storageMediaFileSetUID) } if (result==EC_Normal) result = referencedImageList.write(dset); return result; } OFBool DVPSReferencedSeries::isValid(OFString& sopclassuid) { return referencedImageList.isValid(sopclassuid); } OFBool DVPSReferencedSeries::isSeriesUID(const char *uid) { OFString aString; if (uid && (EC_Normal == seriesInstanceUID.getOFString(aString,0))) { if (aString == uid) return OFTrue; } return OFFalse; } DVPSReferencedImage *DVPSReferencedSeries::findImageReference(const char *sopinstanceuid) { return referencedImageList.findImageReference(sopinstanceuid); } void DVPSReferencedSeries::removeImageReference(const char *sopinstanceuid) { referencedImageList.removeImageReference(sopinstanceuid); return; } OFCondition DVPSReferencedSeries::addImageReference( const char *sopclassUID, const char *instanceUID, const char *frames) { return referencedImageList.addImageReference(sopclassUID, instanceUID, frames); } void DVPSReferencedSeries::setSeriesInstanceUID(const char *uid) { if (uid) seriesInstanceUID.putString(uid); else seriesInstanceUID.clear(); return; } void DVPSReferencedSeries::setRetrieveLocation(const char *aetitle, const char *filesetID, const char *filesetUID) { if (aetitle) retrieveAETitle.putString(aetitle); else retrieveAETitle.clear(); if (filesetID) storageMediaFileSetID.putString(filesetID); else storageMediaFileSetID.clear(); if (filesetUID) storageMediaFileSetUID.putString(filesetUID); else storageMediaFileSetUID.clear(); } const char *DVPSReferencedSeries::getRetrieveAETitle() { char *c = NULL; if (EC_Normal == retrieveAETitle.getString(c)) return c; else return NULL; } const char *DVPSReferencedSeries::getStorageMediaFileSetID() { char *c = NULL; if (EC_Normal == storageMediaFileSetID.getString(c)) return c; else return NULL; } const char *DVPSReferencedSeries::getStorageMediaFileSetUID() { char *c = NULL; if (EC_Normal == storageMediaFileSetUID.getString(c)) return c; else return NULL; } OFCondition DVPSReferencedSeries::getImageReference( size_t idx, OFString& seriesUID, OFString& sopclassUID, OFString& instanceUID, OFString& frames, OFString& aetitle, OFString& filesetID, OFString& filesetUID) { OFCondition result = referencedImageList.getImageReference(idx, sopclassUID, instanceUID, frames); if (EC_Normal == result) result = seriesInstanceUID.getOFString(seriesUID,0); // must not be empty string if (EC_Normal == result) { if (retrieveAETitle.getLength() == 0) aetitle.clear(); else result = retrieveAETitle.getOFString(aetitle,0); } if (EC_Normal == result) { if (storageMediaFileSetID.getLength() == 0) filesetID.clear(); else result = storageMediaFileSetID.getOFString(filesetID,0); } if (EC_Normal == result) { if (storageMediaFileSetUID.getLength() == 0) filesetUID.clear(); else result = storageMediaFileSetUID.getOFString(filesetUID,0); } return result; } /* * $Log: dvpsrs.cc,v $ * Revision 1.18 2010-10-14 13:14:32 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.17 2009-11-24 14:12:59 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.16 2009-09-30 10:42:39 uli * Make dcmpstat's include headers self-sufficient by including all * needed headers directly and stop using dctk.h * * Revision 1.15 2009-08-26 08:15:30 joergr * Added explicit braces to avoid ambiguous else (reported by gcc 4.3.2). * * Revision 1.14 2006/08/15 16:57:02 meichel * Updated the code in module dcmpstat to correctly compile when * all standard C++ classes remain in namespace std. * * Revision 1.13 2005/12/08 15:46:45 meichel * Changed include path schema for all DCMTK header files * * Revision 1.12 2003/06/04 12:30:28 meichel * Added various includes needed by MSVC5 with STL * * Revision 1.11 2001/09/26 15:36:31 meichel * Adapted dcmpstat to class OFCondition * * Revision 1.10 2001/06/01 15:50:36 meichel * Updated copyright header * * Revision 1.9 2000/06/02 16:01:06 meichel * Adapted all dcmpstat classes to use OFConsole for log and error output * * Revision 1.8 2000/05/31 13:02:38 meichel * Moved dcmpstat macros and constants into a common header file * * Revision 1.7 2000/03/08 16:29:09 meichel * Updated copyright header. * * Revision 1.6 2000/03/03 14:14:04 meichel * Implemented library support for redirecting error messages into memory * instead of printing them to stdout/stderr for GUI applications. * * Revision 1.5 1999/09/24 11:13:52 meichel * Fixed problems related to DcmElement::getOFString on empty strings. * * Revision 1.4 1999/07/22 16:40:01 meichel * Adapted dcmpstat data structures and API to supplement 33 letter ballot text. * * Revision 1.3 1999/01/15 17:32:57 meichel * added methods to DVPresentationState allowing to access the image * references in the presentation state. Also added methods allowing to * get the width and height of the attached image. * * Revision 1.2 1998/12/14 16:10:47 meichel * Implemented Presentation State interface for graphic layers, * text and graphic annotations, presentation LUTs. * * Revision 1.1 1998/11/27 14:50:46 meichel * Initial Release. * * */ dcmtk-3.6.0/dcmpstat/libsrc/dvpstx.cc0000644000310500011400000003345511455601071017005 0ustar joergrdicom3/* * * Copyright (C) 1998-2010, 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: DVPSTextObject * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:14:33 $ * CVS/RCS Revision: $Revision: 1.16 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmpstat/dvpstx.h" #include "dcmtk/ofstd/ofstring.h" #include "dcmtk/dcmpstat/dvpsdef.h" /* for constants and macros */ #define INCLUDE_CSTRING #include "dcmtk/ofstd/ofstdinc.h" /* --------------- class DVPSTextObject --------------- */ DVPSTextObject::DVPSTextObject() : boundingBoxAnnotationUnits(DCM_BoundingBoxAnnotationUnits) , anchorPointAnnotationUnits(DCM_AnchorPointAnnotationUnits) , unformattedTextValue(DCM_UnformattedTextValue) , boundingBoxTLHC(DCM_BoundingBoxTopLeftHandCorner) , boundingBoxBRHC(DCM_BoundingBoxBottomRightHandCorner) , boundingBoxTextHorizontalJustification(DCM_BoundingBoxTextHorizontalJustification) , anchorPoint(DCM_AnchorPoint) , anchorPointVisibility(DCM_AnchorPointVisibility) { } DVPSTextObject::DVPSTextObject(const DVPSTextObject& copy) : boundingBoxAnnotationUnits(copy.boundingBoxAnnotationUnits) , anchorPointAnnotationUnits(copy.anchorPointAnnotationUnits) , unformattedTextValue(copy.unformattedTextValue) , boundingBoxTLHC(copy.boundingBoxTLHC) , boundingBoxBRHC(copy.boundingBoxBRHC) , boundingBoxTextHorizontalJustification(copy.boundingBoxTextHorizontalJustification) , anchorPoint(copy.anchorPoint) , anchorPointVisibility(copy.anchorPointVisibility) { } DVPSTextObject::~DVPSTextObject() { } OFCondition DVPSTextObject::read(DcmItem &dset) { OFCondition result = EC_Normal; DcmStack stack; READ_FROM_DATASET(DcmCodeString, boundingBoxAnnotationUnits) READ_FROM_DATASET(DcmCodeString, anchorPointAnnotationUnits) READ_FROM_DATASET(DcmShortText, unformattedTextValue) READ_FROM_DATASET(DcmFloatingPointSingle, boundingBoxTLHC) READ_FROM_DATASET(DcmFloatingPointSingle, boundingBoxBRHC) READ_FROM_DATASET(DcmCodeString, boundingBoxTextHorizontalJustification) READ_FROM_DATASET(DcmFloatingPointSingle, anchorPoint) READ_FROM_DATASET(DcmCodeString, anchorPointVisibility) /* Now perform basic sanity checks */ if (unformattedTextValue.getLength() == 0) { result=EC_IllegalCall; DCMPSTAT_INFO("presentation state contains a text object SQ item with unformattedTextValue absent or empty"); } else if (unformattedTextValue.getVM() != 1) { result=EC_IllegalCall; DCMPSTAT_INFO("presentation state contains a text object SQ item with unformattedTextValue VM != 1"); } if (boundingBoxAnnotationUnits.getVM() > 1) { result=EC_IllegalCall; DCMPSTAT_INFO("presentation state contains a text object SQ item with boundingBoxAnnotationUnits VM > 1"); } if (anchorPointAnnotationUnits.getVM() > 1) { result=EC_IllegalCall; DCMPSTAT_INFO("presentation state contains a text object SQ item with anchorPointAnnotationUnits VM > 1"); } if (anchorPointVisibility.getVM() > 1) { result=EC_IllegalCall; DCMPSTAT_INFO("presentation state contains a text object SQ item with anchorPointVisibility VM > 1"); } if (boundingBoxTLHC.getVM() ==1) { result=EC_IllegalCall; DCMPSTAT_INFO("presentation state contains a text object SQ item with boundingBoxTLHC VM == 1"); } else if (boundingBoxTLHC.getVM() > 2) { result=EC_IllegalCall; DCMPSTAT_INFO("presentation state contains a text object SQ item with boundingBoxTLHC VM > 2"); } if (boundingBoxBRHC.getVM() ==1) { result=EC_IllegalCall; DCMPSTAT_INFO("presentation state contains a text object SQ item with boundingBoxBRHC VM == 1"); } else if (boundingBoxBRHC.getVM() > 2) { result=EC_IllegalCall; DCMPSTAT_INFO("presentation state contains a text object SQ item with boundingBoxBRHC VM > 2"); } if (boundingBoxTextHorizontalJustification.getVM() > 1) { result=EC_IllegalCall; DCMPSTAT_INFO("presentation state contains a text object SQ item with boundingBoxTextHorizontalJustification VM > 1"); } if (anchorPoint.getVM() ==1) { result=EC_IllegalCall; DCMPSTAT_INFO("presentation state contains a text object SQ item with anchorPoint VM == 1"); } else if (anchorPoint.getVM() > 2) { result=EC_IllegalCall; DCMPSTAT_INFO("presentation state contains a text object SQ item with anchorPoint VM > 2"); } /* test for the various type 1c conditions */ if ((boundingBoxAnnotationUnits.getVM() == 0) && ((boundingBoxTLHC.getVM() >0) || (boundingBoxBRHC.getVM() >0))) { result=EC_IllegalCall; DCMPSTAT_INFO("presentation state contains a text object SQ item with bounding box but boundingBoxAnnotationUnits absent or empty"); } if ((boundingBoxTextHorizontalJustification.getVM() == 0) && ((boundingBoxTLHC.getVM() >0) || (boundingBoxBRHC.getVM() >0))) { result=EC_IllegalCall; DCMPSTAT_INFO("presentation state contains a text object SQ item with bounding box but boundingBoxTextHorizontalJustification absent or empty"); } if ((anchorPointAnnotationUnits.getVM() == 0) && (anchorPoint.getVM() >0)) { result=EC_IllegalCall; DCMPSTAT_INFO("presentation state contains a text object SQ item with anchor point but anchorPointAnnotationUnits absent or empty"); } if ((anchorPointVisibility.getVM() == 0) && (anchorPoint.getVM() >0)) { result=EC_IllegalCall; DCMPSTAT_INFO("presentation state contains a text object SQ item with anchor point but anchorPointVisibility absent or empty"); } if ((boundingBoxTLHC.getVM() == 0) && (anchorPoint.getVM() == 0)) { result=EC_IllegalCall; DCMPSTAT_INFO("presentation state contains a text object SQ item without bounding box and anchor point"); } if ((boundingBoxBRHC.getVM() == 0) && (anchorPoint.getVM() == 0)) { result=EC_IllegalCall; DCMPSTAT_INFO("presentation state contains a text object SQ item without bounding box and anchor point"); } return result; } OFCondition DVPSTextObject::write(DcmItem &dset) { OFCondition result = EC_Normal; DcmElement *delem=NULL; ADD_TO_DATASET(DcmShortText, unformattedTextValue) if (anchorPoint.getLength() > 0) { ADD_TO_DATASET(DcmFloatingPointSingle, anchorPoint) ADD_TO_DATASET(DcmCodeString, anchorPointAnnotationUnits) ADD_TO_DATASET(DcmCodeString, anchorPointVisibility) } if (boundingBoxTLHC.getLength() > 0) { ADD_TO_DATASET(DcmFloatingPointSingle, boundingBoxTLHC) ADD_TO_DATASET(DcmFloatingPointSingle, boundingBoxBRHC) ADD_TO_DATASET(DcmCodeString, boundingBoxAnnotationUnits) ADD_TO_DATASET(DcmCodeString, boundingBoxTextHorizontalJustification) } return result; } OFBool DVPSTextObject::haveAnchorPoint() { if (anchorPoint.getLength() > 0) return OFTrue; else return OFFalse; } OFBool DVPSTextObject::haveBoundingBox() { if (boundingBoxTLHC.getLength() > 0) return OFTrue; else return OFFalse; } OFCondition DVPSTextObject::setAnchorPoint(double x, double y, DVPSannotationUnit unit, OFBool isVisible) { Float32 aPoint[2]; anchorPoint.clear(); anchorPointVisibility.clear(); anchorPointAnnotationUnits.clear(); aPoint[0] = (Float32) x; aPoint[1] = (Float32) y; OFCondition result = anchorPoint.putFloat32Array(aPoint, 2); if (result==EC_Normal) { if (isVisible) result=anchorPointVisibility.putString("Y"); else result=anchorPointVisibility.putString("N"); } if (result==EC_Normal) { if (unit==DVPSA_display) result=anchorPointAnnotationUnits.putString("DISPLAY"); else result=anchorPointAnnotationUnits.putString("PIXEL"); } return result; } OFCondition DVPSTextObject::setBoundingBox( double TLHC_x, double TLHC_y, double BRHC_x, double BRHC_y, DVPSannotationUnit unit, DVPSTextJustification justification) { Float32 aPoint[2]; boundingBoxAnnotationUnits.clear(); boundingBoxTLHC.clear(); boundingBoxBRHC.clear(); aPoint[0] = (Float32)TLHC_x; aPoint[1] = (Float32)TLHC_y; OFCondition result = boundingBoxTLHC.putFloat32Array(aPoint, 2); if (result==EC_Normal) { aPoint[0] = (Float32)BRHC_x; aPoint[1] = (Float32)BRHC_y; result = boundingBoxBRHC.putFloat32Array(aPoint, 2); } if (result==EC_Normal) { if (unit==DVPSA_display) result=boundingBoxAnnotationUnits.putString("DISPLAY"); else result=boundingBoxAnnotationUnits.putString("PIXEL"); switch (justification) { case DVPSX_left: boundingBoxTextHorizontalJustification.putString("LEFT"); break; case DVPSX_right: boundingBoxTextHorizontalJustification.putString("RIGHT"); break; case DVPSX_center: boundingBoxTextHorizontalJustification.putString("CENTER"); break; } } return result; } OFCondition DVPSTextObject::setText(const char *text) { if ((text==NULL)||(strlen(text)==0)) return EC_IllegalCall; return unformattedTextValue.putString(text); } void DVPSTextObject::removeAnchorPoint() { anchorPoint.clear(); anchorPointVisibility.clear(); anchorPointAnnotationUnits.clear(); return; } void DVPSTextObject::removeBoundingBox() { boundingBoxAnnotationUnits.clear(); boundingBoxTLHC.clear(); boundingBoxBRHC.clear(); return; } const char *DVPSTextObject::getText() { char *c = NULL; if (EC_Normal == unformattedTextValue.getString(c)) return c; else return NULL; } double DVPSTextObject::getBoundingBoxTLHC_x() { Float32 result =0.0; if (boundingBoxTLHC.getVM() == 2) { boundingBoxTLHC.getFloat32(result,0); } return result; } double DVPSTextObject::getBoundingBoxTLHC_y() { Float32 result =0.0; if (boundingBoxTLHC.getVM() == 2) { boundingBoxTLHC.getFloat32(result,1); } return result; } double DVPSTextObject::getBoundingBoxBRHC_x() { Float32 result =0.0; if (boundingBoxBRHC.getVM() == 2) { boundingBoxBRHC.getFloat32(result,0); } return result; } double DVPSTextObject::getBoundingBoxBRHC_y() { Float32 result =0.0; if (boundingBoxBRHC.getVM() == 2) { boundingBoxBRHC.getFloat32(result,1); } return result; } DVPSannotationUnit DVPSTextObject::getBoundingBoxAnnotationUnits() { DVPSannotationUnit aresult = DVPSA_pixels; OFString aString; OFCondition result = boundingBoxAnnotationUnits.getOFString(aString,0); if ((result==EC_Normal)&&(aString == "DISPLAY")) aresult = DVPSA_display; return aresult; } DVPSTextJustification DVPSTextObject::getBoundingBoxHorizontalJustification() { DVPSTextJustification aresult = DVPSX_left; OFString aString; OFCondition result = boundingBoxTextHorizontalJustification.getOFString(aString,0); if ((result==EC_Normal)&&(aString == "RIGHT")) aresult = DVPSX_right; if ((result==EC_Normal)&&(aString == "CENTER")) aresult = DVPSX_center; return aresult; } double DVPSTextObject::getAnchorPoint_x() { Float32 result =0.0; if (anchorPoint.getVM() == 2) { anchorPoint.getFloat32(result,0); } return result; } double DVPSTextObject::getAnchorPoint_y() { Float32 result =0.0; if (anchorPoint.getVM() == 2) { anchorPoint.getFloat32(result,1); } return result; } OFBool DVPSTextObject::anchorPointIsVisible() { OFString aString; anchorPointVisibility.getOFString(aString,0); if (aString == "Y") return OFTrue; else return OFFalse; } DVPSannotationUnit DVPSTextObject::getAnchorPointAnnotationUnits() { DVPSannotationUnit aresult = DVPSA_pixels; OFString aString; OFCondition result = anchorPointAnnotationUnits.getOFString(aString,0); if ((result==EC_Normal)&&(aString == "DISPLAY")) aresult = DVPSA_display; return aresult; } /* * $Log: dvpstx.cc,v $ * Revision 1.16 2010-10-14 13:14:33 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.15 2009-11-24 14:12:59 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.14 2006-08-15 16:57:02 meichel * Updated the code in module dcmpstat to correctly compile when * all standard C++ classes remain in namespace std. * * Revision 1.13 2005/12/08 15:46:53 meichel * Changed include path schema for all DCMTK header files * * Revision 1.12 2002/11/27 15:48:17 meichel * Adapted module dcmpstat to use of new header file ofstdinc.h * * Revision 1.11 2001/09/26 15:36:35 meichel * Adapted dcmpstat to class OFCondition * * Revision 1.10 2001/06/01 15:50:40 meichel * Updated copyright header * * Revision 1.9 2000/06/02 16:01:09 meichel * Adapted all dcmpstat classes to use OFConsole for log and error output * * Revision 1.8 2000/05/31 13:02:41 meichel * Moved dcmpstat macros and constants into a common header file * * Revision 1.7 2000/03/08 16:29:12 meichel * Updated copyright header. * * Revision 1.6 2000/03/03 14:14:07 meichel * Implemented library support for redirecting error messages into memory * instead of printing them to stdout/stderr for GUI applications. * * Revision 1.5 1999/07/22 16:40:06 meichel * Adapted dcmpstat data structures and API to supplement 33 letter ballot text. * * Revision 1.4 1999/01/11 13:35:24 meichel * added some explicit type conversions to avoid compiler warnings with VC++. * * Revision 1.3 1998/12/22 17:57:19 meichel * Implemented Presentation State interface for overlays, * VOI LUTs, VOI windows, curves. Added test program that * allows to add curve data to DICOM images. * * Revision 1.2 1998/12/14 16:10:49 meichel * Implemented Presentation State interface for graphic layers, * text and graphic annotations, presentation LUTs. * * Revision 1.1 1998/11/27 14:50:48 meichel * Initial Release. * * */ dcmtk-3.6.0/dcmpstat/libsrc/dvpssvl.cc0000644000310500011400000002645111455601071017154 0ustar joergrdicom3/* * * Copyright (C) 1999-2010, 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: DVPSSoftcopyVOI_PList * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:14:33 $ * CVS/RCS Revision: $Revision: 1.16 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcdeftag.h" #include "dcmtk/dcmdata/dcsequen.h" #include "dcmtk/dcmpstat/dvpssvl.h" #include "dcmtk/dcmpstat/dvpssv.h" /* for DVPSSoftcopyVOI */ #include "dcmtk/dcmpstat/dvpsdef.h" /* for constants and macros */ #include "dcmtk/dcmpstat/dvpsri.h" /* for DVPSReferencedImage, needed by MSVC5 with STL */ /* --------------- class DVPSSoftcopyVOI_PList --------------- */ DVPSSoftcopyVOI_PList::DVPSSoftcopyVOI_PList() : list_() { } DVPSSoftcopyVOI_PList::DVPSSoftcopyVOI_PList(const DVPSSoftcopyVOI_PList &arg) : list_() { OFListConstIterator(DVPSSoftcopyVOI *) first = arg.list_.begin(); OFListConstIterator(DVPSSoftcopyVOI *) last = arg.list_.end(); while (first != last) { list_.push_back((*first)->clone()); ++first; } } DVPSSoftcopyVOI_PList::~DVPSSoftcopyVOI_PList() { clear(); } void DVPSSoftcopyVOI_PList::clear() { OFListIterator(DVPSSoftcopyVOI *) first = list_.begin(); OFListIterator(DVPSSoftcopyVOI *) last = list_.end(); while (first != last) { delete (*first); first = list_.erase(first); } } OFCondition DVPSSoftcopyVOI_PList::read(DcmItem &dset) { OFCondition result = EC_Normal; DcmStack stack; DVPSSoftcopyVOI *newImage = NULL; DcmSequenceOfItems *dseq=NULL; DcmItem *ditem=NULL; if (EC_Normal == dset.search(DCM_SoftcopyVOILUTSequence, stack, ESM_fromHere, OFFalse)) { dseq=(DcmSequenceOfItems *)stack.top(); if (dseq) { unsigned long numItems = dseq->card(); for (unsigned int i=0; igetItem(i); newImage = new DVPSSoftcopyVOI(); if (newImage && ditem) { result = newImage->read(*ditem); list_.push_back(newImage); } else result = EC_MemoryExhausted; } } } return result; } OFCondition DVPSSoftcopyVOI_PList::write(DcmItem &dset) { if (size()==0) return EC_Normal; // don't write empty Sequence OFCondition result = EC_Normal; DcmSequenceOfItems *dseq=NULL; DcmItem *ditem=NULL; dseq = new DcmSequenceOfItems(DCM_SoftcopyVOILUTSequence); if (dseq) { OFListIterator(DVPSSoftcopyVOI *) first = list_.begin(); OFListIterator(DVPSSoftcopyVOI *) last = list_.end(); while (first != last) { if (result==EC_Normal) { ditem = new DcmItem(); if (ditem) { result = (*first)->write(*ditem); if (result==EC_Normal) dseq->insert(ditem); else delete ditem; } else result = EC_MemoryExhausted; } ++first; } if (result==EC_Normal) dset.insert(dseq, OFTrue /*replaceOld*/); else delete dseq; } else result = EC_MemoryExhausted; return result; } DVPSSoftcopyVOI *DVPSSoftcopyVOI_PList::findSoftcopyVOI(const char *instanceUID, unsigned long frame) { OFListIterator(DVPSSoftcopyVOI *) first = list_.begin(); OFListIterator(DVPSSoftcopyVOI *) last = list_.end(); while (first != last) { if ((*first)->isApplicable(instanceUID, frame)) return (*first); ++first; } return NULL; } DVPSSoftcopyVOI *DVPSSoftcopyVOI_PList::createSoftcopyVOI( DVPSReferencedSeries_PList& allReferences, const char *sopclassUID, const char *instanceUID, unsigned long frame, unsigned long numberOfFrames, DVPSObjectApplicability applicability) { DVPSSoftcopyVOI *oldArea = findSoftcopyVOI(instanceUID, frame); DVPSSoftcopyVOI *newArea = NULL; if (oldArea == NULL) newArea = new DVPSSoftcopyVOI(); else { // Check if the existing VOI LUT item happens to match the new // applicability. If yes, we only need to return the existing item. if (oldArea->matchesApplicability(instanceUID, frame, applicability)) return oldArea; // the applicability has changed. Rework the complete sequence. newArea = new DVPSSoftcopyVOI(*oldArea); // create copy if (newArea) newArea->clearImageReferences(); OFListIterator(DVPSSoftcopyVOI *) first = list_.begin(); OFListIterator(DVPSSoftcopyVOI *) last = list_.end(); switch (applicability) { case DVPSB_currentFrame: case DVPSB_currentImage: while (first != last) { (*first)->removeImageReference(allReferences, instanceUID, frame, numberOfFrames, applicability); if ((*first)->imageReferencesEmpty()) { delete (*first); first = list_.erase(first); } else ++first; } break; case DVPSB_allImages: clear(); // delete all softcopy VOI LUT items break; } } if (newArea) { if (applicability != DVPSB_allImages) newArea->addImageReference(sopclassUID, instanceUID, frame, applicability); list_.push_back(newArea); } return newArea; } void DVPSSoftcopyVOI_PList::removeSoftcopyVOI( DVPSReferencedSeries_PList& allReferences, const char *instanceUID, unsigned long frame, unsigned long numberOfFrames, DVPSObjectApplicability applicability) { OFListIterator(DVPSSoftcopyVOI *) first = list_.begin(); OFListIterator(DVPSSoftcopyVOI *) last = list_.end(); switch (applicability) { case DVPSB_currentFrame: case DVPSB_currentImage: while (first != last) { (*first)->removeImageReference(allReferences, instanceUID, frame, numberOfFrames, applicability); if ((*first)->imageReferencesEmpty()) { delete (*first); first = list_.erase(first); } else ++first; } break; case DVPSB_allImages: clear(); // delete all softcopy VOI LUT items break; } return; } OFCondition DVPSSoftcopyVOI_PList::createFromImage( DcmItem &dset, DVPSReferencedSeries_PList& allReferences, const char *sopclassUID, const char *instanceUID, DVPSVOIActivation voiActivation) { if (voiActivation == DVPSV_ignoreVOI) return EC_Normal; OFCondition result = EC_Normal; DcmStack stack; DcmSequenceOfItems *seq; DcmItem *item; DcmUnsignedShort voiLUTDescriptor(DCM_LUTDescriptor); DcmLongString voiLUTExplanation(DCM_LUTExplanation); DcmUnsignedShort voiLUTData(DCM_LUTData); DcmDecimalString windowCenter(DCM_WindowCenter); DcmDecimalString windowWidth(DCM_WindowWidth); DcmLongString windowCenterWidthExplanation(DCM_WindowCenterWidthExplanation); READ_FROM_DATASET(DcmDecimalString, windowCenter) READ_FROM_DATASET(DcmDecimalString, windowWidth) READ_FROM_DATASET(DcmLongString, windowCenterWidthExplanation) /* read VOI LUT Sequence */ if (result==EC_Normal) { stack.clear(); if (EC_Normal == dset.search(DCM_VOILUTSequence, stack, ESM_fromHere, OFFalse)) { seq=(DcmSequenceOfItems *)stack.top(); if (seq->card() > 0) { item = seq->getItem(0); stack.clear(); if (EC_Normal == item->search((DcmTagKey &)voiLUTDescriptor.getTag(), stack, ESM_fromHere, OFFalse)) { voiLUTDescriptor = *((DcmUnsignedShort *)(stack.top())); } stack.clear(); if (EC_Normal == item->search((DcmTagKey &)voiLUTExplanation.getTag(), stack, ESM_fromHere, OFFalse)) { voiLUTExplanation = *((DcmLongString *)(stack.top())); } stack.clear(); if (EC_Normal == item->search((DcmTagKey &)voiLUTData.getTag(), stack, ESM_fromHere, OFFalse)) { voiLUTData = *((DcmUnsignedShort *)(stack.top())); } } else result=EC_TagNotFound; } } OFBool haveWindow = ((windowCenter.getVM() > 0) && (windowWidth.getVM() > 0)); OFBool haveLUT = ((voiLUTDescriptor.getVM() == 3) && (voiLUTData.getLength() > 0)); if (result==EC_Normal) { DVPSSoftcopyVOI *voi = NULL; if (haveWindow && ((voiActivation==DVPSV_preferVOIWindow)||(! haveLUT))) { // create VOI window Float64 wc, ww; char *wexp = NULL; result = windowCenter.getFloat64(wc,0); if (EC_Normal==result) result = windowWidth.getFloat64(ww,0); if (windowCenterWidthExplanation.getLength() > 0) { if (EC_Normal != windowCenterWidthExplanation.getString(wexp)) wexp = NULL; } if (EC_Normal==result) { voi = createSoftcopyVOI(allReferences, sopclassUID, instanceUID, 1, 1, DVPSB_currentImage); if (voi) result = voi->setVOIWindow(wc, ww, wexp); else result = EC_MemoryExhausted; } } else if (haveLUT && ((voiActivation==DVPSV_preferVOILUT)||(! haveWindow))) { // create VOI LUT voi = createSoftcopyVOI(allReferences, sopclassUID, instanceUID, 1, 1, DVPSB_currentImage); if (voi) result = voi->setVOILUT(voiLUTDescriptor, voiLUTData, voiLUTExplanation); else result = EC_MemoryExhausted; } } return result; } /* * $Log: dvpssvl.cc,v $ * Revision 1.16 2010-10-14 13:14:33 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.15 2009-11-24 14:12:59 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.14 2009-09-30 10:42:39 uli * Make dcmpstat's include headers self-sufficient by including all * needed headers directly and stop using dctk.h * * Revision 1.13 2005-12-08 15:46:50 meichel * Changed include path schema for all DCMTK header files * * Revision 1.12 2004/02/04 15:57:49 joergr * Removed acknowledgements with e-mail addresses from CVS log. * * Revision 1.11 2003/06/12 18:23:11 joergr * Modified code to use const_iterators where appropriate (required for STL). * * Revision 1.10 2003/06/04 12:30:29 meichel * Added various includes needed by MSVC5 with STL * * Revision 1.9 2003/06/04 10:18:07 meichel * Replaced private inheritance from template with aggregation * * Revision 1.8 2002/10/18 08:34:52 meichel * Fixed minor bug in presentation state code that caused error messages * in the Softcopy VOI LUT module to be "swallowed" even if verbose mode * was enabled. * * Revision 1.7 2001/11/28 13:57:04 joergr * Check return value of DcmItem::insert() statements where appropriate to * avoid memory leaks when insert procedure fails. * * Revision 1.6 2001/09/26 15:36:33 meichel * Adapted dcmpstat to class OFCondition * * Revision 1.5 2001/06/01 15:50:39 meichel * Updated copyright header * * Revision 1.4 2000/06/02 16:01:08 meichel * Adapted all dcmpstat classes to use OFConsole for log and error output * * Revision 1.3 2000/05/31 13:02:40 meichel * Moved dcmpstat macros and constants into a common header file * * Revision 1.2 2000/03/08 16:29:11 meichel * Updated copyright header. * * Revision 1.1 1999/07/22 16:40:03 meichel * Adapted dcmpstat data structures and API to supplement 33 letter ballot text. * * */ dcmtk-3.6.0/dcmpstat/libsrc/dvpsprt.cc0000644000310500011400000012123111455601070017144 0ustar joergrdicom3/* * * Copyright (C) 2000-2010, 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 * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:14:32 $ * CVS/RCS Revision: $Revision: 1.22 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/ofstd/ofstream.h" #include "dcmtk/dcmpstat/dvpsprt.h" #include "dcmtk/dcmpstat/dvpsdef.h" /* for constants */ #include "dcmtk/dcmpstat/dviface.h" #include "dcmtk/dcmpstat/dvpsfs.h" #include "dcmtk/dcmpstat/dvpssp.h" #include "dcmtk/dcmpstat/dvpshlp.h" #include "dcmtk/ofstd/ofdatime.h" #include "dcmtk/dcmpstat/dvpsov.h" /* for DVPSOverlay, needed by MSVC5 with STL */ #include "dcmtk/dcmpstat/dvpsgl.h" /* for DVPSGraphicLayer, needed by MSVC5 with STL */ #include "dcmtk/dcmpstat/dvpsrs.h" /* for DVPSReferencedSeries, needed by MSVC5 with STL */ #include "dcmtk/dcmpstat/dvpsal.h" /* for DVPSOverlayCurveActivationLayer, needed by MSVC5 with STL */ #include "dcmtk/dcmpstat/dvpsga.h" /* for DVPSGraphicAnnotation, needed by MSVC5 with STL */ #include "dcmtk/dcmpstat/dvpscu.h" /* for DVPSCurve, needed by MSVC5 with STL */ #include "dcmtk/dcmpstat/dvpsvl.h" /* for DVPSVOILUT, needed by MSVC5 with STL */ #include "dcmtk/dcmpstat/dvpsvw.h" /* for DVPSVOIWindow, needed by MSVC5 with STL */ #include "dcmtk/dcmpstat/dvpsda.h" /* for DVPSDisplayedArea, needed by MSVC5 with STL */ #include "dcmtk/dcmpstat/dvpssv.h" /* for DVPSSoftcopyVOI, needed by MSVC5 with STL */ #include "dcmtk/dcmpstat/dvpsib.h" /* for DVPSImageBoxContent, needed by MSVC5 with STL */ #include "dcmtk/dcmpstat/dvpsab.h" /* for DVPSAnnotationContent, needed by MSVC5 with STL */ #include "dcmtk/dcmpstat/dvpstx.h" /* for DVPSTextObject, needed by MSVC5 with STL */ #include "dcmtk/dcmpstat/dvpsgr.h" /* for DVPSGraphicObject, needed by MSVC5 with STL */ #include "dcmtk/dcmpstat/dvpsri.h" /* for DVPSReferencedImage, needed by MSVC5 with STL */ DVPSPrintSCP::DVPSPrintSCP(DVInterface &iface, const char *cfname) : dviface(iface) , cfgname(cfname) , blockMode(DIMSE_BLOCKING) , timeout(0) , filmSession(NULL) , presentationLUTList() , storedPrintList() , assoc(NULL) , studyInstanceUID(DCM_StudyInstanceUID) , psSeriesInstanceUID(DCM_SeriesInstanceUID) , imageSeriesInstanceUID(DCM_SeriesInstanceUID) , logSequence(NULL) , acseSequence(NULL) , logPath() { } DVPSPrintSCP::~DVPSPrintSCP() { dropAssociation(); delete logSequence; delete acseSequence; } int DVPSPrintSCP::errorCond(OFCondition cond, const char *message) { int result = cond.bad(); if (result) { OFString temp_str; DCMPSTAT_INFO(message << OFendl << DimseCondition::dump(temp_str, cond)); } return result; } DVPSAssociationNegotiationResult DVPSPrintSCP::negotiateAssociation(T_ASC_Network &net) { DVPSAssociationNegotiationResult result = DVPSJ_success; char buf[BUFSIZ]; OFBool dropAssoc = OFFalse; // get AETITLE from config file const char *aetitle = dviface.getTargetAETitle(cfgname); if (aetitle==NULL) aetitle = dviface.getNetworkAETitle(); // default if AETITLE is missing // get MaxPDU from config file unsigned long maxPDU = dviface.getTargetMaxPDU(cfgname); if (maxPDU == 0) maxPDU = DEFAULT_MAXPDU; else if (maxPDU > ASC_MAXIMUMPDUSIZE) { DCMPSTAT_INFO("max PDU size " << maxPDU << " too big, using default: " << DEFAULT_MAXPDU); maxPDU = DEFAULT_MAXPDU; } else if (maxPDU < ASC_MINIMUMPDUSIZE) { DCMPSTAT_INFO("max PDU size " << maxPDU << " too small, using default: " << DEFAULT_MAXPDU); maxPDU = DEFAULT_MAXPDU; } // check whether we want to support Presentation LUT OFBool supportPresentationLUT = dviface.getTargetPrinterSupportsPresentationLUT(cfgname); // check whether we want to support Implicit VR only OFBool implicitOnly = dviface.getTargetImplicitOnly(cfgname); // check whether we're expected to accept TLS associations OFBool useTLS = dviface.getTargetUseTLS(cfgname); void *associatePDU=NULL; unsigned long associatePDUlength=0; OFCondition cond = ASC_receiveAssociation(&net, &assoc, maxPDU, &associatePDU, &associatePDUlength, useTLS); if (errorCond(cond, "Failed to receive association:")) { dropAssoc = OFTrue; result = DVPSJ_error; } else { DCMPSTAT_INFO("Association Received (" << assoc->params->DULparams.callingPresentationAddress << ":" << assoc->params->DULparams.callingAPTitle << " -> " << assoc->params->DULparams.calledAPTitle << ") " << OFDateTime::getCurrentDateTime()); OFString temp_str; DCMPSTAT_DUMP(ASC_dumpParameters(temp_str, assoc->params, ASC_ASSOC_RQ)); ASC_setAPTitles(assoc->params, NULL, NULL, aetitle); /* Application Context Name */ cond = ASC_getApplicationContextName(assoc->params, buf); if (cond.bad() || strcmp(buf, DICOM_STDAPPLICATIONCONTEXT) != 0) { /* reject: the application context name is not supported */ DCMPSTAT_INFO("Bad AppContextName: " << buf); cond = refuseAssociation(OFTrue); dropAssoc = OFTrue; result = DVPSJ_error; } else { const char *abstractSyntaxes[] = { UID_VerificationSOPClass, UID_BasicGrayscalePrintManagementMetaSOPClass, UID_PresentationLUTSOPClass, UID_PrivateShutdownSOPClass }; int numAbstractSyntaxes = 3; if (supportPresentationLUT) numAbstractSyntaxes = 4; const char* transferSyntaxes[] = { NULL, NULL, NULL }; int numTransferSyntaxes = 0; if (implicitOnly) { transferSyntaxes[0] = UID_LittleEndianImplicitTransferSyntax; numTransferSyntaxes = 1; } else { transferSyntaxes[2] = UID_LittleEndianImplicitTransferSyntax; numTransferSyntaxes = 3; if (gLocalByteOrder == EBO_LittleEndian) { /* we are on a little endian machine */ transferSyntaxes[0] = UID_LittleEndianExplicitTransferSyntax; transferSyntaxes[1] = UID_BigEndianExplicitTransferSyntax; } else { /* we are on a big endian machine */ transferSyntaxes[0] = UID_BigEndianExplicitTransferSyntax; transferSyntaxes[1] = UID_LittleEndianExplicitTransferSyntax; } } /* accept presentation contexts */ cond = ASC_acceptContextsWithPreferredTransferSyntaxes( assoc->params, (const char**)abstractSyntaxes, numAbstractSyntaxes, (const char**)transferSyntaxes, numTransferSyntaxes); errorCond(cond, "Cannot accept presentation contexts:"); } /* check if we have negotiated the private "shutdown" SOP Class */ if (0 != ASC_findAcceptedPresentationContextID(assoc, UID_PrivateShutdownSOPClass)) { cond = refuseAssociation(OFFalse); dropAssoc = OFTrue; result = DVPSJ_terminate; } } /* receiveAssociation successful */ if (dropAssoc) dropAssociation(); if (acseSequence && associatePDU) { addLogEntry(acseSequence, "A_ASSOCIATE_RQ"); DcmItem *newItem = new DcmItem(); if (newItem) { DcmElement *assocData = new DcmOtherByteOtherWord(PSTAT_DCM_AssociateData); if (assocData) { assocData->putUint8Array((Uint8 *) associatePDU, associatePDUlength); newItem->insert(assocData, OFTrue /*replaceOld*/); acseSequence->insert(newItem); } else delete newItem; } } delete[] (char *)associatePDU; return result; } OFCondition DVPSPrintSCP::refuseAssociation(OFBool isBadContext) { T_ASC_RejectParameters rej; if (isBadContext) { rej.result = ASC_RESULT_REJECTEDTRANSIENT; rej.source = ASC_SOURCE_SERVICEUSER; rej.reason = ASC_REASON_SU_APPCONTEXTNAMENOTSUPPORTED; } else { rej.result = ASC_RESULT_REJECTEDPERMANENT; rej.source = ASC_SOURCE_SERVICEUSER; rej.reason = ASC_REASON_SU_NOREASON; } void *associatePDU=NULL; unsigned long associatePDUlength=0; OFCondition cond = ASC_rejectAssociation(assoc, &rej, &associatePDU, &associatePDUlength); OFString temp_str; DCMPSTAT_DUMP(ASC_dumpParameters(temp_str, assoc->params, ASC_ASSOC_RJ)); if (acseSequence && associatePDU) { addLogEntry(acseSequence, "A_ASSOCIATE_RJ"); DcmItem *newItem = new DcmItem(); if (newItem) { DcmElement *assocData = new DcmOtherByteOtherWord(PSTAT_DCM_AssociateData); if (assocData) { assocData->putUint8Array((Uint8 *) associatePDU, associatePDUlength); newItem->insert(assocData, OFTrue /*replaceOld*/); acseSequence->insert(newItem); } else delete newItem; } } delete[] (char *)associatePDU; errorCond(cond, "Association Reject Failed:"); return cond; } void DVPSPrintSCP::dropAssociation() { if (assoc == NULL) return; OFCondition cond = ASC_dropSCPAssociation(assoc); errorCond(cond, "Cannot Drop Association:"); cond = ASC_destroyAssociation(&assoc); errorCond(cond, "Cannot Destroy Association:"); assoc = NULL; return; } void DVPSPrintSCP::handleClient() { void *associatePDU=NULL; unsigned long associatePDUlength=0; OFString temp_str; OFCondition cond = ASC_acknowledgeAssociation(assoc, &associatePDU, &associatePDUlength); DCMPSTAT_DUMP(ASC_dumpParameters(temp_str, assoc->params, ASC_ASSOC_AC)); if (acseSequence && associatePDU) { addLogEntry(acseSequence, "A_ASSOCIATE_AC"); DcmItem *newItem = new DcmItem(); if (newItem) { DcmElement *assocData = new DcmOtherByteOtherWord(PSTAT_DCM_AssociateData); if (assocData) { assocData->putUint8Array((Uint8 *) associatePDU, associatePDUlength); newItem->insert(assocData, OFTrue /*replaceOld*/); acseSequence->insert(newItem); } else delete newItem; } } delete[] (char *)associatePDU; if (! errorCond(cond, "Cannot acknowledge association:")) { DCMPSTAT_INFO("Association Acknowledged (Max Send PDV: " << assoc->sendPDVLength << ")" << ((ASC_countAcceptedPresentationContexts(assoc->params) == 0) ? "\n (but no valid presentation contexts)" : "")); T_DIMSE_Message msg; T_ASC_PresentationContextID presID; cond = EC_Normal; DcmDataset *rawCommandSet=NULL; /* do real work */ while (cond.good()) { cond = DIMSE_receiveCommand(assoc, DIMSE_BLOCKING, 0, &presID, &msg, NULL, &rawCommandSet); /* did peer release, abort, or do we have a valid message ? */ if (cond.good()) { addLogEntry(logSequence, "RECEIVE"); if (rawCommandSet) { if (logSequence) logSequence->insert(new DcmItem(*rawCommandSet)); delete rawCommandSet; rawCommandSet = NULL; } else { // should not happen if (logSequence) logSequence->insert(new DcmItem()); } } if (cond.good()) { /* process command */ switch (msg.CommandField) { case DIMSE_C_ECHO_RQ: cond = handleCEcho(msg, presID); break; case DIMSE_N_GET_RQ: cond = handleNGet(msg, presID); break; case DIMSE_N_SET_RQ: cond = handleNSet(msg, presID); break; case DIMSE_N_ACTION_RQ: cond = handleNAction(msg, presID); break; case DIMSE_N_CREATE_RQ: cond = handleNCreate(msg, presID); break; case DIMSE_N_DELETE_RQ: cond = handleNDelete(msg, presID); break; default: cond = DIMSE_BADCOMMANDTYPE; /* unsupported command */ dumpNMessage(msg, NULL, OFFalse); DCMPSTAT_INFO("Cannot handle command: 0x" << STD_NAMESPACE hex << (unsigned)msg.CommandField << STD_NAMESPACE dec); break; } } else { /* finish processing loop */ } } /* while */ if (logSequence) saveDimseLog(); /* close association */ if (cond == DUL_PEERREQUESTEDRELEASE) { DCMPSTAT_INFO("Association Release"); cond = ASC_acknowledgeRelease(assoc); errorCond(cond, "Cannot release association:"); } else if (cond == DUL_PEERABORTEDASSOCIATION) { DCMPSTAT_INFO("Association Aborted"); } else { errorCond(cond, "DIMSE Failure (aborting association):"); cond = ASC_abortAssociation(assoc); errorCond(cond, "Cannot abort association:"); } } dropAssociation(); } OFCondition DVPSPrintSCP::handleCEcho(T_DIMSE_Message& rq, T_ASC_PresentationContextID presID) { OFCondition cond = DIMSE_sendEchoResponse(assoc, presID, &rq.msg.CEchoRQ, STATUS_Success, NULL); return cond; } OFCondition DVPSPrintSCP::handleNGet(T_DIMSE_Message& rq, T_ASC_PresentationContextID presID) { // initialize response message T_DIMSE_Message rsp; rsp.CommandField = DIMSE_N_GET_RSP; rsp.msg.NGetRSP.MessageIDBeingRespondedTo = rq.msg.NGetRQ.MessageID; rsp.msg.NGetRSP.AffectedSOPClassUID[0] = 0; rsp.msg.NGetRSP.DimseStatus = STATUS_Success; rsp.msg.NGetRSP.AffectedSOPInstanceUID[0] = 0; rsp.msg.NGetRSP.DataSetType = DIMSE_DATASET_NULL; rsp.msg.NGetRSP.opts = 0; OFCondition cond = EC_Normal; DcmDataset *rspDataset = NULL; if (rq.msg.NGetRQ.DataSetType == DIMSE_DATASET_PRESENT) { DcmDataset *dataset = NULL; // should not happen cond = DIMSE_receiveDataSetInMemory(assoc, blockMode, timeout, &presID, &dataset, NULL, NULL); if (cond.good()) { if (logSequence) logSequence->insert(new DcmItem(*dataset)); dumpNMessage(rq, dataset, OFFalse); } delete dataset; if (cond.bad()) return cond; } else { dumpNMessage(rq, NULL, OFFalse); if (logSequence) logSequence->insert(new DcmItem()); } OFString sopClass(rq.msg.NGetRQ.RequestedSOPClassUID); if (sopClass == UID_PrinterSOPClass) { // Print N-GET printerNGet(rq, rsp, rspDataset); } else { DCMPSTAT_INFO("N-GET unsupported for SOP class '" << sopClass << "'"); rsp.msg.NGetRSP.DimseStatus = STATUS_N_NoSuchSOPClass; } DcmDataset *rspCommand = NULL; addLogEntry(logSequence, "SEND"); dumpNMessage(rsp, rspDataset, OFTrue); cond = DIMSE_sendMessageUsingMemoryData(assoc, presID, &rsp, NULL, rspDataset, NULL, NULL, &rspCommand); if (logSequence) { if (rspCommand) logSequence->insert(new DcmItem(*rspCommand)); if (rspDataset) logSequence->insert(new DcmItem(*rspDataset)); else logSequence->insert(new DcmItem()); } delete rspCommand; delete rspDataset; return cond; } OFCondition DVPSPrintSCP::handleNSet(T_DIMSE_Message& rq, T_ASC_PresentationContextID presID) { // initialize response message T_DIMSE_Message rsp; rsp.CommandField = DIMSE_N_SET_RSP; rsp.msg.NSetRSP.MessageIDBeingRespondedTo = rq.msg.NSetRQ.MessageID; rsp.msg.NSetRSP.AffectedSOPClassUID[0] = 0; rsp.msg.NSetRSP.DimseStatus = STATUS_Success; rsp.msg.NSetRSP.AffectedSOPInstanceUID[0] = 0; rsp.msg.NSetRSP.DataSetType = DIMSE_DATASET_NULL; rsp.msg.NSetRSP.opts = 0; OFCondition cond = EC_Normal; DcmDataset *rqDataset = NULL; DcmDataset *rspDataset = NULL; if (rq.msg.NSetRQ.DataSetType == DIMSE_DATASET_PRESENT) { cond = DIMSE_receiveDataSetInMemory(assoc, blockMode, timeout, &presID, &rqDataset, NULL, NULL); if (cond.bad()) return cond; if (logSequence && rqDataset) logSequence->insert(new DcmItem(*rqDataset)); } else if (logSequence) logSequence->insert(new DcmItem()); dumpNMessage(rq, rqDataset, OFFalse); OFString sopClass(rq.msg.NSetRQ.RequestedSOPClassUID); if (sopClass == UID_BasicFilmSessionSOPClass) { // BFS N-SET filmSessionNSet(rq, rqDataset, rsp, rspDataset); } else if (sopClass == UID_BasicFilmBoxSOPClass) { // BFB N-SET filmBoxNSet(rq, rqDataset, rsp, rspDataset); } else if (sopClass == UID_BasicGrayscaleImageBoxSOPClass) { // BGIB N-SET imageBoxNSet(rq, rqDataset, rsp, rspDataset); } else { DCMPSTAT_INFO("N-SET unsupported for SOP class '" << sopClass << "'"); rsp.msg.NSetRSP.DimseStatus = STATUS_N_NoSuchSOPClass; } DcmDataset *rspCommand = NULL; addLogEntry(logSequence, "SEND"); dumpNMessage(rsp, rspDataset, OFTrue); cond = DIMSE_sendMessageUsingMemoryData(assoc, presID, &rsp, NULL, rspDataset, NULL, NULL, &rspCommand); if (logSequence) { if (rspCommand) logSequence->insert(new DcmItem(*rspCommand)); if (rspDataset) logSequence->insert(new DcmItem(*rspDataset)); else logSequence->insert(new DcmItem()); } delete rspCommand; delete rqDataset; delete rspDataset; return cond; } OFCondition DVPSPrintSCP::handleNAction(T_DIMSE_Message& rq, T_ASC_PresentationContextID presID) { // initialize response message T_DIMSE_Message rsp; rsp.CommandField = DIMSE_N_ACTION_RSP; rsp.msg.NActionRSP.MessageIDBeingRespondedTo = rq.msg.NActionRQ.MessageID; rsp.msg.NActionRSP.AffectedSOPClassUID[0] = 0; rsp.msg.NActionRSP.DimseStatus = STATUS_Success; rsp.msg.NActionRSP.AffectedSOPInstanceUID[0] = 0; rsp.msg.NActionRSP.ActionTypeID = rq.msg.NActionRQ.ActionTypeID; rsp.msg.NActionRSP.DataSetType = DIMSE_DATASET_NULL; rsp.msg.NActionRSP.opts = O_NACTION_ACTIONTYPEID; OFCondition cond = EC_Normal; DcmDataset *rqDataset = NULL; if (rq.msg.NActionRQ.DataSetType == DIMSE_DATASET_PRESENT) { cond = DIMSE_receiveDataSetInMemory(assoc, blockMode, timeout, &presID, &rqDataset, NULL, NULL); if (cond.bad()) return cond; if (logSequence && rqDataset) logSequence->insert(new DcmItem(*rqDataset)); } else if (logSequence) logSequence->insert(new DcmItem()); dumpNMessage(rq, rqDataset, OFFalse); OFString sopClass(rq.msg.NActionRQ.RequestedSOPClassUID); if (sopClass == UID_BasicFilmSessionSOPClass) { // BFS N-ACTION filmSessionNAction(rq, rsp); } else if (sopClass == UID_BasicFilmBoxSOPClass) { // BFB N-ACTION filmBoxNAction(rq, rsp); } else { DCMPSTAT_INFO("N-ACTION unsupported for SOP class '" << sopClass << "'"); rsp.msg.NActionRSP.DimseStatus = STATUS_N_NoSuchSOPClass; } DcmDataset *rspCommand = NULL; addLogEntry(logSequence, "SEND"); dumpNMessage(rsp, NULL, OFTrue); cond = DIMSE_sendMessageUsingMemoryData(assoc, presID, &rsp, NULL, NULL, NULL, NULL, &rspCommand); if (logSequence) { if (rspCommand) logSequence->insert(new DcmItem(*rspCommand)); logSequence->insert(new DcmItem()); } delete rspCommand; delete rqDataset; return cond; } OFCondition DVPSPrintSCP::handleNCreate(T_DIMSE_Message& rq, T_ASC_PresentationContextID presID) { // initialize response message T_DIMSE_Message rsp; rsp.CommandField = DIMSE_N_CREATE_RSP; rsp.msg.NCreateRSP.MessageIDBeingRespondedTo = rq.msg.NCreateRQ.MessageID; rsp.msg.NCreateRSP.AffectedSOPClassUID[0] = 0; rsp.msg.NCreateRSP.DimseStatus = STATUS_Success; if (rq.msg.NCreateRQ.opts & O_NCREATE_AFFECTEDSOPINSTANCEUID) { // instance UID is provided by SCU strncpy(rsp.msg.NCreateRSP.AffectedSOPInstanceUID, rq.msg.NCreateRQ.AffectedSOPInstanceUID, sizeof(DIC_UI)); } else { // we generate our own instance UID dcmGenerateUniqueIdentifier(rsp.msg.NCreateRSP.AffectedSOPInstanceUID); } rsp.msg.NCreateRSP.DataSetType = DIMSE_DATASET_NULL; OFBool omitFlag = dviface.getTargetPrintSCPOmitSOPClassUIDFromCreateResponse(cfgname); if (omitFlag) { rsp.msg.NCreateRSP.opts = O_NCREATE_AFFECTEDSOPINSTANCEUID; } else { strncpy(rsp.msg.NCreateRSP.AffectedSOPClassUID, rq.msg.NCreateRQ.AffectedSOPClassUID, sizeof(DIC_UI)); rsp.msg.NCreateRSP.opts = O_NCREATE_AFFECTEDSOPINSTANCEUID | O_NCREATE_AFFECTEDSOPCLASSUID; } OFCondition cond = EC_Normal; DcmDataset *rqDataset = NULL; DcmDataset *rspDataset = NULL; if (rq.msg.NCreateRQ.DataSetType == DIMSE_DATASET_PRESENT) { cond = DIMSE_receiveDataSetInMemory(assoc, blockMode, timeout, &presID, &rqDataset, NULL, NULL); if (cond.bad()) return cond; if (logSequence && rqDataset) logSequence->insert(new DcmItem(*rqDataset)); } else if (logSequence) logSequence->insert(new DcmItem()); dumpNMessage(rq, rqDataset, OFFalse); OFString sopClass(rq.msg.NCreateRQ.AffectedSOPClassUID); if (sopClass == UID_BasicFilmSessionSOPClass) { // BFS N-CREATE filmSessionNCreate(rqDataset, rsp, rspDataset); } else if (sopClass == UID_BasicFilmBoxSOPClass) { // BFB N-CREATE filmBoxNCreate(rqDataset, rsp, rspDataset); } else if (sopClass == UID_PresentationLUTSOPClass) { // P-LUT N-CREATE presentationLUTNCreate(rqDataset, rsp, rspDataset); } else { DCMPSTAT_INFO("N-CREATE unsupported for SOP class '" << sopClass << "'"); rsp.msg.NCreateRSP.DimseStatus = STATUS_N_NoSuchSOPClass; rsp.msg.NCreateRSP.opts = 0; // don't include affected SOP instance UID } DcmDataset *rspCommand = NULL; addLogEntry(logSequence, "SEND"); dumpNMessage(rsp, rspDataset, OFTrue); cond = DIMSE_sendMessageUsingMemoryData(assoc, presID, &rsp, NULL, rspDataset, NULL, NULL, &rspCommand); if (logSequence) { if (rspCommand) logSequence->insert(new DcmItem(*rspCommand)); if (rspDataset) logSequence->insert(new DcmItem(*rspDataset)); else logSequence->insert(new DcmItem()); } delete rspCommand; delete rqDataset; delete rspDataset; return cond; } OFCondition DVPSPrintSCP::handleNDelete(T_DIMSE_Message& rq, T_ASC_PresentationContextID presID) { // initialize response message T_DIMSE_Message rsp; rsp.CommandField = DIMSE_N_DELETE_RSP; rsp.msg.NDeleteRSP.MessageIDBeingRespondedTo = rq.msg.NDeleteRQ.MessageID; rsp.msg.NDeleteRSP.AffectedSOPClassUID[0] = 0; rsp.msg.NDeleteRSP.DimseStatus = STATUS_Success; rsp.msg.NDeleteRSP.AffectedSOPInstanceUID[0] = 0; rsp.msg.NDeleteRSP.DataSetType = DIMSE_DATASET_NULL; rsp.msg.NDeleteRSP.opts = 0; OFCondition cond = EC_Normal; if (rq.msg.NDeleteRQ.DataSetType == DIMSE_DATASET_PRESENT) { // should not happen DcmDataset *dataset = NULL; cond = DIMSE_receiveDataSetInMemory(assoc, blockMode, timeout, &presID, &dataset, NULL, NULL); if (cond.good()) { if (logSequence) logSequence->insert(new DcmItem(*dataset)); dumpNMessage(rq, dataset, OFFalse); } delete dataset; if (cond.bad()) return cond; } else { if (logSequence) logSequence->insert(new DcmItem()); dumpNMessage(rq, NULL, OFFalse); } OFString sopClass(rq.msg.NDeleteRQ.RequestedSOPClassUID); if (sopClass == UID_BasicFilmSessionSOPClass) { // BFS N-DELETE filmSessionNDelete(rq, rsp); } else if (sopClass == UID_BasicFilmBoxSOPClass) { // BFB N-DELETE filmBoxNDelete(rq, rsp); } else if (sopClass == UID_PresentationLUTSOPClass) { // P-LUT N-DELETE presentationLUTNDelete(rq, rsp); } else { DCMPSTAT_INFO("N-DELETE unsupported for SOP class '" << sopClass << "'"); rsp.msg.NDeleteRSP.DimseStatus = STATUS_N_NoSuchSOPClass; } DcmDataset *rspCommand = NULL; addLogEntry(logSequence, "SEND"); dumpNMessage(rsp, NULL, OFTrue); cond = DIMSE_sendMessageUsingMemoryData(assoc, presID, &rsp, NULL, NULL, NULL, NULL, &rspCommand); if (logSequence) { if (rspCommand) logSequence->insert(new DcmItem(*rspCommand)); logSequence->insert(new DcmItem()); } delete rspCommand; return cond; } void DVPSPrintSCP::printerNGet(T_DIMSE_Message& rq, T_DIMSE_Message& rsp, DcmDataset *& rspDataset) { OFString printerInstance(UID_PrinterSOPInstance); if (printerInstance == rq.msg.NGetRQ.RequestedSOPInstanceUID) { OFBool result = OFTrue; rspDataset = new DcmDataset; if (rspDataset == NULL) { rsp.msg.NGetRSP.DimseStatus = STATUS_N_ProcessingFailure; result = OFFalse; } int i=0; DIC_US group=0; DIC_US element=0; while (i+1 < rq.msg.NGetRQ.ListCount) { group = rq.msg.NGetRQ.AttributeIdentifierList[i++]; element = rq.msg.NGetRQ.AttributeIdentifierList[i++]; if ((group == 0x2110)&&(element == 0x0010)) { if (EC_Normal != DVPSHelper::putStringValue(rspDataset, DCM_PrinterStatus, DEFAULT_printerStatus)) result = OFFalse; } else if ((group == 0x2110)&&(element == 0x0020)) { if (EC_Normal != DVPSHelper::putStringValue(rspDataset, DCM_PrinterStatusInfo, DEFAULT_printerStatusInfo)) result = OFFalse; } else if (element == 0x0000) { /* group length */ } else { DCMPSTAT_INFO("cannot retrieve printer information: unsupported attribute (" << STD_NAMESPACE hex << STD_NAMESPACE setfill('0') << STD_NAMESPACE setw(4) << (int)group << "," << STD_NAMESPACE hex << STD_NAMESPACE setfill('0') << STD_NAMESPACE setw(4) << (int)element << ") in attribute list."); rsp.msg.NGetRSP.DimseStatus = STATUS_N_NoSuchAttribute; result = OFFalse; } } if (rq.msg.NGetRQ.ListCount == 0) { if (EC_Normal != DVPSHelper::putStringValue(rspDataset, DCM_PrinterStatus, DEFAULT_printerStatus)) result = OFFalse; if (EC_Normal != DVPSHelper::putStringValue(rspDataset, DCM_PrinterStatusInfo, DEFAULT_printerStatusInfo)) result = OFFalse; } if (result) { rsp.msg.NSetRSP.DataSetType = DIMSE_DATASET_PRESENT; } else { delete rspDataset; rspDataset = NULL; if (rsp.msg.NGetRSP.DimseStatus == 0) rsp.msg.NGetRSP.DimseStatus = STATUS_N_ProcessingFailure; result = OFFalse; } } else { DCMPSTAT_INFO("cannot retrieve printer information, instance UID is not well-known printer SOP instance UID."); rsp.msg.NGetRSP.DimseStatus = STATUS_N_NoSuchObjectInstance; } } void DVPSPrintSCP::filmSessionNSet(T_DIMSE_Message& rq, DcmDataset *rqDataset, T_DIMSE_Message& rsp, DcmDataset *& rspDataset) { if (filmSession && (filmSession->isInstance(rq.msg.NSetRQ.RequestedSOPInstanceUID))) { OFBool usePLUTinFilmSession = OFFalse; if (assoc && (0 != ASC_findAcceptedPresentationContextID(assoc, UID_PresentationLUTSOPClass))) { if (dviface.getTargetPrinterPresentationLUTinFilmSession(cfgname)) usePLUTinFilmSession = OFTrue; } DVPSFilmSession *newSession = new DVPSFilmSession(*filmSession); if (newSession) { if (newSession->printSCPSet(dviface, cfgname, rqDataset, rsp, rspDataset, usePLUTinFilmSession, presentationLUTList, storedPrintList)) { delete filmSession; filmSession = newSession; } else delete newSession; } else { DCMPSTAT_INFO("cannot update film session, out of memory."); rsp.msg.NSetRSP.DimseStatus = STATUS_N_ProcessingFailure; } } else { // film session does not exist or wrong instance UID DCMPSTAT_INFO("cannot update film session, object not found."); rsp.msg.NSetRSP.DimseStatus = STATUS_N_NoSuchObjectInstance; } } void DVPSPrintSCP::filmBoxNSet(T_DIMSE_Message& rq, DcmDataset *rqDataset, T_DIMSE_Message& rsp, DcmDataset *& rspDataset) { OFBool usePLUTinFilmBox = OFFalse; if (assoc && (0 != ASC_findAcceptedPresentationContextID(assoc, UID_PresentationLUTSOPClass))) { if (! dviface.getTargetPrinterPresentationLUTinFilmSession(cfgname)) usePLUTinFilmBox = OFTrue; } storedPrintList.printSCPBasicFilmBoxSet(dviface, cfgname, rq, rqDataset, rsp, rspDataset, usePLUTinFilmBox, presentationLUTList); } void DVPSPrintSCP::filmSessionNAction(T_DIMSE_Message& rq, T_DIMSE_Message& rsp) { if (filmSession && (filmSession->isInstance(rq.msg.NActionRQ.RequestedSOPInstanceUID))) { storedPrintList.printSCPBasicFilmSessionAction(dviface, cfgname, rsp, presentationLUTList); } else { // film session does not exist or wrong instance UID DCMPSTAT_INFO("cannot print film session, object not found."); rsp.msg.NActionRSP.DimseStatus = STATUS_N_NoSuchObjectInstance; } } void DVPSPrintSCP::filmBoxNAction(T_DIMSE_Message& rq, T_DIMSE_Message& rsp) { storedPrintList.printSCPBasicFilmBoxAction(dviface, cfgname, rq, rsp, presentationLUTList); } void DVPSPrintSCP::filmSessionNCreate(DcmDataset *rqDataset, T_DIMSE_Message& rsp, DcmDataset *& rspDataset) { if (filmSession) { // film session exists already, refuse n-create DCMPSTAT_INFO("cannot create two film sessions concurrently."); rsp.msg.NCreateRSP.DimseStatus = STATUS_N_DuplicateSOPInstance; rsp.msg.NCreateRSP.opts = 0; // don't include affected SOP instance UID } else { OFBool usePLUTinFilmSession = OFFalse; if (assoc && (0 != ASC_findAcceptedPresentationContextID(assoc, UID_PresentationLUTSOPClass))) { if (dviface.getTargetPrinterPresentationLUTinFilmSession(cfgname)) usePLUTinFilmSession = OFTrue; } DVPSFilmSession *newSession = new DVPSFilmSession(DEFAULT_illumination, DEFAULT_reflectedAmbientLight); if (newSession) { DIC_AE peerTitle; peerTitle[0]=0; ASC_getAPTitles(assoc->params, peerTitle, NULL, NULL); if (newSession->printSCPCreate(dviface, cfgname, rqDataset, rsp, rspDataset, peerTitle, usePLUTinFilmSession, presentationLUTList)) filmSession = newSession; char uid[100]; studyInstanceUID.putString(dcmGenerateUniqueIdentifier(uid, SITE_STUDY_UID_ROOT)); psSeriesInstanceUID.putString(dcmGenerateUniqueIdentifier(uid, SITE_SERIES_UID_ROOT)); imageSeriesInstanceUID.putString(dcmGenerateUniqueIdentifier(uid)); } else { DCMPSTAT_INFO("cannot create film session, out of memory."); rsp.msg.NCreateRSP.DimseStatus = STATUS_N_ProcessingFailure; rsp.msg.NCreateRSP.opts = 0; // don't include affected SOP instance UID } } } void DVPSPrintSCP::filmBoxNCreate(DcmDataset *rqDataset, T_DIMSE_Message& rsp, DcmDataset *& rspDataset) { if (filmSession) { if (storedPrintList.haveFilmBoxInstance(rsp.msg.NCreateRSP.AffectedSOPInstanceUID)) { DCMPSTAT_INFO("cannot create film box, requested SOP instance UID already in use."); rsp.msg.NCreateRSP.DimseStatus = STATUS_N_DuplicateSOPInstance; rsp.msg.NCreateRSP.opts = 0; // don't include affected SOP instance UID } else { DVPSStoredPrint *newSPrint = new DVPSStoredPrint(DEFAULT_illumination, DEFAULT_reflectedAmbientLight); if (newSPrint) { if (assoc) newSPrint->setOriginator(assoc->params->DULparams.callingAPTitle); // get AETITLE from config file const char *aetitle = dviface.getTargetAETitle(cfgname); if (aetitle==NULL) aetitle = dviface.getNetworkAETitle(); // default if AETITLE is missing newSPrint->setDestination(aetitle); newSPrint->setPrinterName(cfgname); OFBool usePLUTinFilmBox = OFFalse; OFBool usePLUTinFilmSession = OFFalse; if (assoc && (0 != ASC_findAcceptedPresentationContextID(assoc, UID_PresentationLUTSOPClass))) { if (dviface.getTargetPrinterPresentationLUTinFilmSession(cfgname)) usePLUTinFilmSession = OFTrue; else usePLUTinFilmBox = OFTrue; } if (newSPrint->printSCPCreate(dviface, cfgname, rqDataset, rsp, rspDataset, usePLUTinFilmBox, presentationLUTList, filmSession->getUID(), studyInstanceUID, psSeriesInstanceUID, imageSeriesInstanceUID)) { if (usePLUTinFilmSession) { filmSession->copyPresentationLUTSettings(*newSPrint); // update P-LUT settings from film session } storedPrintList.insert(newSPrint); } else delete newSPrint; } else { DCMPSTAT_INFO("cannot create film box, out of memory."); rsp.msg.NCreateRSP.DimseStatus = STATUS_N_ProcessingFailure; rsp.msg.NCreateRSP.opts = 0; // don't include affected SOP instance UID } } } else { // no film session, refuse n-create DCMPSTAT_INFO("cannot create film box without film session."); rsp.msg.NCreateRSP.DimseStatus = STATUS_N_InvalidObjectInstance; rsp.msg.NCreateRSP.opts = 0; // don't include affected SOP instance UID } } void DVPSPrintSCP::presentationLUTNCreate(DcmDataset *rqDataset, T_DIMSE_Message& rsp, DcmDataset *& rspDataset) { if ((assoc==NULL) || (0 == ASC_findAcceptedPresentationContextID(assoc, UID_PresentationLUTSOPClass))) { DCMPSTAT_INFO("cannot create presentation LUT, not negotiated."); rsp.msg.NCreateRSP.DimseStatus = STATUS_N_NoSuchSOPClass; rsp.msg.NCreateRSP.opts = 0; // don't include affected SOP instance UID } else if (presentationLUTList.findPresentationLUT(rsp.msg.NCreateRSP.AffectedSOPInstanceUID)) { DCMPSTAT_INFO("cannot create presentation LUT, requested SOP instance UID already in use."); rsp.msg.NCreateRSP.DimseStatus = STATUS_N_DuplicateSOPInstance; rsp.msg.NCreateRSP.opts = 0; // don't include affected SOP instance UID } else { DVPSPresentationLUT *newPLut = new DVPSPresentationLUT(); if (newPLut) { OFBool matchRequired = dviface.getTargetPrinterPresentationLUTMatchRequired(cfgname); OFBool supports12Bit = dviface.getTargetPrinterSupports12BitTransmission(cfgname); if (newPLut->printSCPCreate(rqDataset, rsp, rspDataset, matchRequired, supports12Bit)) { presentationLUTList.insert(newPLut); } else delete newPLut; } else { DCMPSTAT_INFO("cannot create presentation LUT, out of memory."); rsp.msg.NCreateRSP.DimseStatus = STATUS_N_ProcessingFailure; rsp.msg.NCreateRSP.opts = 0; // don't include affected SOP instance UID } } } void DVPSPrintSCP::filmSessionNDelete(T_DIMSE_Message& rq, T_DIMSE_Message& rsp) { if (filmSession && (filmSession->isInstance(rq.msg.NDeleteRQ.RequestedSOPInstanceUID))) { // delete film box hierarchy and film session object storedPrintList.clear(); delete filmSession; filmSession = NULL; } else { // film session does not exist or wrong instance UID DCMPSTAT_INFO("cannot delete film session with instance UID '" << rq.msg.NDeleteRQ.RequestedSOPInstanceUID << "': object does not exist."); rsp.msg.NDeleteRSP.DimseStatus = STATUS_N_NoSuchObjectInstance; } } void DVPSPrintSCP::filmBoxNDelete(T_DIMSE_Message& rq, T_DIMSE_Message& rsp) { storedPrintList.printSCPBasicFilmBoxDelete(rq, rsp); } void DVPSPrintSCP::presentationLUTNDelete(T_DIMSE_Message& rq, T_DIMSE_Message& rsp) { // check whether references to this object exist. In this case, don't delete if (storedPrintList.usesPresentationLUT(rq.msg.NDeleteRQ.RequestedSOPInstanceUID)) { DCMPSTAT_INFO("cannot delete presentation LUT '" << rq.msg.NDeleteRQ.RequestedSOPInstanceUID << "': object still in use."); rsp.msg.NDeleteRSP.DimseStatus = STATUS_N_ProcessingFailure; } else { presentationLUTList.printSCPDelete(rq, rsp); } } void DVPSPrintSCP::imageBoxNSet(T_DIMSE_Message& rq, DcmDataset *rqDataset, T_DIMSE_Message& rsp, DcmDataset *& rspDataset) { OFBool usePLUT = OFFalse; if (assoc && (0 != ASC_findAcceptedPresentationContextID(assoc, UID_PresentationLUTSOPClass))) usePLUT = OFTrue; storedPrintList.printSCPBasicGrayscaleImageBoxSet(dviface, cfgname, rq, rqDataset, rsp, rspDataset, usePLUT); } void DVPSPrintSCP::addLogEntry(DcmSequenceOfItems *seq, const char *text) { if ((!seq)||(!text)) return; DcmItem *newItem = new DcmItem(); if (!newItem) return; OFString aString; DcmElement *logEntryType = new DcmCodeString(PSTAT_DCM_LogEntryType); if (logEntryType) { logEntryType->putString(text); newItem->insert(logEntryType, OFTrue /*replaceOld*/); } DVPSHelper::currentDate(aString); DcmElement *logDate = new DcmDate(PSTAT_DCM_LogDate); if (logDate) { logDate->putString(aString.c_str()); newItem->insert(logDate, OFTrue /*replaceOld*/); } DVPSHelper::currentTime(aString); DcmElement *logTime = new DcmTime(PSTAT_DCM_LogTime); if (logTime) { logTime->putString(aString.c_str()); newItem->insert(logTime, OFTrue /*replaceOld*/); } seq->insert(newItem); } void DVPSPrintSCP::setDimseLogPath(const char *fname) { if (fname) { logPath = fname; if (logSequence == NULL) logSequence = new DcmSequenceOfItems(PSTAT_DCM_LogSequence); if (acseSequence == NULL) acseSequence = new DcmSequenceOfItems(PSTAT_DCM_AcseSequence); } else { logPath.clear(); delete logSequence; logSequence = NULL; } } void DVPSPrintSCP::saveDimseLog() { if (logSequence == NULL) return; DcmFileFormat fformat; DcmDataset *dset = fformat.getDataset(); if (! dset) return; dset->insert(logSequence, OFTrue /*replaceOld*/); logSequence = NULL; if (acseSequence) dset->insert(acseSequence, OFTrue /*replaceOld*/); acseSequence = NULL; char uid[80]; OFString aString; const char *aetitle = dviface.getTargetAETitle(cfgname); if (aetitle==NULL) aetitle = dviface.getNetworkAETitle(); // default if AETITLE is missing aString = OFFIS_DTK_IMPLEMENTATION_VERSION_NAME; aString += " "; aString += aetitle; DcmElement *logReserve = new DcmLongString(PSTAT_DCM_LogReservation); if (logReserve) { logReserve->putString(aString.c_str()); dset->insert(logReserve, OFTrue /*replaceOld*/); } DVPSHelper::putStringValue(dset, DCM_SOPClassUID, PSTAT_DIMSE_LOG_STORAGE_UID); DVPSHelper::putStringValue(dset, DCM_SOPInstanceUID, dcmGenerateUniqueIdentifier(uid)); DVPSHelper::currentDate(aString); DVPSHelper::putStringValue(dset, DCM_InstanceCreationDate, aString.c_str()); DVPSHelper::currentTime(aString); DVPSHelper::putStringValue(dset, DCM_InstanceCreationTime, aString.c_str()); OFCondition cond = DVPSHelper::saveFileFormat(logPath.c_str(), &fformat, OFTrue); if (cond == EC_Normal) { DCMPSTAT_INFO("DIMSE communication log stored in in DICOM file '" << logPath << "'."); } else { DCMPSTAT_INFO("unable to store DIMSE communication log in file '" << logPath << "'."); } logPath.clear(); } void DVPSPrintSCP::dumpNMessage(T_DIMSE_Message &msg, DcmItem *dataset, OFBool outgoing) { OFString str; if (outgoing) { DIMSE_dumpMessage(str, msg, DIMSE_OUTGOING, dataset); } else { DIMSE_dumpMessage(str, msg, DIMSE_INCOMING, dataset); } DCMPSTAT_DUMP(str); } /* * $Log: dvpsprt.cc,v $ * Revision 1.22 2010-10-14 13:14:32 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.21 2009-11-24 14:12:59 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.20 2006-08-15 16:57:02 meichel * Updated the code in module dcmpstat to correctly compile when * all standard C++ classes remain in namespace std. * * Revision 1.19 2005/12/08 15:46:42 meichel * Changed include path schema for all DCMTK header files * * Revision 1.18 2004/02/04 15:57:49 joergr * Removed acknowledgements with e-mail addresses from CVS log. * * Revision 1.17 2003/09/05 10:38:34 meichel * Print SCP now supports TLS connections and the Verification Service Class. * * Revision 1.16 2003/06/04 12:30:28 meichel * Added various includes needed by MSVC5 with STL * * Revision 1.15 2002/04/16 14:02:22 joergr * Added configurable support for C++ ANSI standard includes (e.g. streams). * * Revision 1.14 2002/04/11 13:13:45 joergr * Replaced direct call of system routines by new standard date and time * functions. * * Revision 1.13 2002/01/08 10:38:56 joergr * Corrected spelling of function dcmGenerateUniqueIdentifier(). * Changed prefix of UIDs created for series and studies (now using constants * SITE_SERIES_UID_ROOT and SITE_STUDY_UID_ROOT which are supposed to be used * in these cases). * * Revision 1.12 2001/11/28 13:56:59 joergr * Check return value of DcmItem::insert() statements where appropriate to * avoid memory leaks when insert procedure fails. * * Revision 1.11 2001/10/12 13:46:56 meichel * Adapted dcmpstat to OFCondition based dcmnet module (supports strict mode). * * Revision 1.10 2001/09/28 13:49:37 joergr * Added "#include " to keep gcc 3.0 quiet. * * Revision 1.9 2001/09/26 15:36:30 meichel * Adapted dcmpstat to class OFCondition * * Revision 1.8 2001/06/01 15:50:35 meichel * Updated copyright header * * Revision 1.7 2001/05/25 10:07:58 meichel * Corrected some DIMSE error status codes for Print SCP * * Revision 1.6 2000/09/06 08:55:38 meichel * Updated Print SCP to accept and silently ignore group length attributes. * * Revision 1.5 2000/07/12 16:39:42 meichel * Print SCP now writes PrinterCharacteristicsSequence when saving Stored Prints. * * Revision 1.4 2000/06/08 10:44:36 meichel * Implemented Referenced Presentation LUT Sequence on Basic Film Session level. * Empty film boxes (pages) are not written to file anymore. * * Revision 1.3 2000/06/07 13:17:28 meichel * added binary and textual log facilities to Print SCP. * * Revision 1.2 2000/06/02 16:01:04 meichel * Adapted all dcmpstat classes to use OFConsole for log and error output * * Revision 1.1 2000/05/31 12:58:12 meichel * Added initial Print SCP support * * */ dcmtk-3.6.0/dcmpstat/libsrc/dvpsabl.cc0000644000310500011400000001717311455601067017114 0ustar joergrdicom3/* * * Copyright (C) 1999-2010, 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: DVPSAnnotationContent_PList * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:14:31 $ * CVS/RCS Revision: $Revision: 1.15 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcdeftag.h" #include "dcmtk/dcmpstat/dvpsabl.h" #include "dcmtk/dcmpstat/dvpsab.h" /* for DVPSAnnotationContent */ #include "dcmtk/dcmpstat/dvpshlp.h" /* for class DVPSHelper */ /* --------------- class DVPSAnnotationContent_PList --------------- */ DVPSAnnotationContent_PList::DVPSAnnotationContent_PList() : list_() { } DVPSAnnotationContent_PList::DVPSAnnotationContent_PList(const DVPSAnnotationContent_PList &arg) : list_() { OFListConstIterator(DVPSAnnotationContent *) first = arg.list_.begin(); OFListConstIterator(DVPSAnnotationContent *) last = arg.list_.end(); while (first != last) { list_.push_back((*first)->clone()); ++first; } } DVPSAnnotationContent_PList::~DVPSAnnotationContent_PList() { clear(); } void DVPSAnnotationContent_PList::clear() { OFListIterator(DVPSAnnotationContent *) first = list_.begin(); OFListIterator(DVPSAnnotationContent *) last = list_.end(); while (first != last) { delete (*first); first = list_.erase(first); } } OFCondition DVPSAnnotationContent_PList::read(DcmItem &dset) { OFCondition result = EC_Normal; DcmStack stack; DVPSAnnotationContent *newAnnotation = NULL; DcmSequenceOfItems *dseq=NULL; DcmItem *ditem=NULL; if (EC_Normal == dset.search(DCM_RETIRED_AnnotationContentSequence, stack, ESM_fromHere, OFFalse)) { dseq=(DcmSequenceOfItems *)stack.top(); if (dseq) { unsigned long numItems = dseq->card(); for (unsigned int i=0; igetItem(i); newAnnotation = new DVPSAnnotationContent(); if (newAnnotation && ditem) { result = newAnnotation->read(*ditem); list_.push_back(newAnnotation); } else result = EC_MemoryExhausted; } } } return result; } OFCondition DVPSAnnotationContent_PList::write(DcmItem &dset) { if (size()==0) return EC_Normal; // don't write if sequence is empty OFCondition result = EC_Normal; DcmSequenceOfItems *dseq=NULL; DcmItem *ditem=NULL; dseq = new DcmSequenceOfItems(DCM_RETIRED_AnnotationContentSequence); if (dseq) { OFListIterator(DVPSAnnotationContent *) first = list_.begin(); OFListIterator(DVPSAnnotationContent *) last = list_.end(); while (first != last) { if (result==EC_Normal) { ditem = new DcmItem(); if (ditem) { result = (*first)->write(*ditem); if (result==EC_Normal) dseq->insert(ditem); else delete ditem; } else result = EC_MemoryExhausted; } ++first; } if (result==EC_Normal) dset.insert(dseq, OFTrue /*replaceOld*/); else delete dseq; } else result = EC_MemoryExhausted; return result; } OFCondition DVPSAnnotationContent_PList::addAnnotationBox( const char *instanceuid, const char *text, Uint16 position) { OFCondition result = EC_Normal; DVPSAnnotationContent *newAnnotation = new DVPSAnnotationContent(); if (newAnnotation) { result = newAnnotation->setContent(instanceuid, text, position); if (EC_Normal == result) list_.push_back(newAnnotation); else delete newAnnotation; } else result = EC_MemoryExhausted; return result; } OFCondition DVPSAnnotationContent_PList::deleteAnnotation(size_t idx) { OFListIterator(DVPSAnnotationContent *) first = list_.begin(); OFListIterator(DVPSAnnotationContent *) last = list_.end(); while ((first != last)&&(idx--)) ++first; if (first != last) { delete (*first); list_.erase(first); return EC_Normal; } return EC_IllegalCall; } OFCondition DVPSAnnotationContent_PList::deleteMultipleAnnotations(size_t number) { OFListIterator(DVPSAnnotationContent *) first = list_.begin(); OFListIterator(DVPSAnnotationContent *) last = list_.end(); while ((first != last)&&(number--)) { delete (*first); first = list_.erase(first); } return EC_Normal; } DVPSAnnotationContent *DVPSAnnotationContent_PList::getAnnotationBox(size_t idx) { OFListIterator(DVPSAnnotationContent *) first = list_.begin(); OFListIterator(DVPSAnnotationContent *) last = list_.end(); while (first != last) { if (idx==0) return *first; idx--; ++first; } return NULL; } OFCondition DVPSAnnotationContent_PList::setAnnotationSOPInstanceUID(size_t idx, const char *value) { DVPSAnnotationContent *box = getAnnotationBox(idx); if (box) return box->setSOPInstanceUID(value); return EC_IllegalCall; } const char *DVPSAnnotationContent_PList::getSOPInstanceUID(size_t idx) { DVPSAnnotationContent *box = getAnnotationBox(idx); if (box) return box->getSOPInstanceUID(); return NULL; } OFCondition DVPSAnnotationContent_PList::prepareBasicAnnotationBox(size_t idx, DcmItem &dset) { DVPSAnnotationContent *box = getAnnotationBox(idx); if (box) return box->prepareBasicAnnotationBox(dset); return EC_IllegalCall; } void DVPSAnnotationContent_PList::clearAnnotationSOPInstanceUIDs() { OFListIterator(DVPSAnnotationContent *) first = list_.begin(); OFListIterator(DVPSAnnotationContent *) last = list_.end(); while (first != last) { (*first)->setSOPInstanceUID(NULL); ++first; } } /* * $Log: dvpsabl.cc,v $ * Revision 1.15 2010-10-14 13:14:31 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.14 2009-11-24 14:12:58 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.13 2009-09-30 10:42:38 uli * Make dcmpstat's include headers self-sufficient by including all * needed headers directly and stop using dctk.h * * Revision 1.12 2008-04-30 12:38:43 meichel * Fixed compile errors due to changes in attribute tag names * * Revision 1.11 2005/12/08 15:46:17 meichel * Changed include path schema for all DCMTK header files * * Revision 1.10 2004/02/04 15:57:49 joergr * Removed acknowledgements with e-mail addresses from CVS log. * * Revision 1.9 2003/06/12 18:23:11 joergr * Modified code to use const_iterators where appropriate (required for STL). * * Revision 1.8 2003/06/04 10:18:07 meichel * Replaced private inheritance from template with aggregation * * Revision 1.7 2001/11/28 13:56:52 joergr * Check return value of DcmItem::insert() statements where appropriate to * avoid memory leaks when insert procedure fails. * * Revision 1.6 2001/09/26 15:36:22 meichel * Adapted dcmpstat to class OFCondition * * Revision 1.5 2001/06/01 15:50:27 meichel * Updated copyright header * * Revision 1.4 2000/06/02 16:00:57 meichel * Adapted all dcmpstat classes to use OFConsole for log and error output * * Revision 1.3 2000/03/08 16:29:01 meichel * Updated copyright header. * * Revision 1.2 2000/03/03 14:13:57 meichel * Implemented library support for redirecting error messages into memory * instead of printing them to stdout/stderr for GUI applications. * * Revision 1.1 1999/10/19 14:48:27 meichel * added support for the Basic Annotation Box SOP Class * as well as access methods for Max Density and Min Density. * * */ dcmtk-3.6.0/dcmpstat/libsrc/dvpsrsl.cc0000644000310500011400000002407311455601070017145 0ustar joergrdicom3/* * * Copyright (C) 1998-2010, 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: DVPSReferencedSeries_PList * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:14:32 $ * CVS/RCS Revision: $Revision: 1.21 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcdeftag.h" #include "dcmtk/dcmdata/dcsequen.h" #include "dcmtk/dcmpstat/dvpsrsl.h" #include "dcmtk/dcmpstat/dvpsrs.h" /* for DVPSReferencedSeries */ #include "dcmtk/dcmpstat/dvpsri.h" /* for DVPSReferencedImage, needed by MSVC5 with STL */ #include "dcmtk/dcmpstat/dvpsdef.h" DVPSReferencedSeries_PList::DVPSReferencedSeries_PList() : list_() { } DVPSReferencedSeries_PList::DVPSReferencedSeries_PList(const DVPSReferencedSeries_PList &arg) : list_() { OFListConstIterator(DVPSReferencedSeries *) first = arg.list_.begin(); OFListConstIterator(DVPSReferencedSeries *) last = arg.list_.end(); while (first != last) { list_.push_back((*first)->clone()); ++first; } } DVPSReferencedSeries_PList::~DVPSReferencedSeries_PList() { clear(); } void DVPSReferencedSeries_PList::clear() { OFListIterator(DVPSReferencedSeries *) first = list_.begin(); OFListIterator(DVPSReferencedSeries *) last = list_.end(); while (first != last) { delete (*first); first = list_.erase(first); } } OFCondition DVPSReferencedSeries_PList::read(DcmItem &dset) { OFCondition result = EC_Normal; DcmStack stack; DVPSReferencedSeries *newSeries = NULL; DcmSequenceOfItems *dseq=NULL; DcmItem *ditem=NULL; if (EC_Normal == dset.search(DCM_ReferencedSeriesSequence, stack, ESM_fromHere, OFFalse)) { dseq=(DcmSequenceOfItems *)stack.top(); if (dseq) { unsigned long numItems = dseq->card(); for (unsigned int i=0; igetItem(i); newSeries = new DVPSReferencedSeries(); if (newSeries && ditem) { result = newSeries->read(*ditem); list_.push_back(newSeries); } else result = EC_MemoryExhausted; } } } return result; } OFCondition DVPSReferencedSeries_PList::write(DcmItem &dset) { OFCondition result = EC_Normal; DcmSequenceOfItems *dseq=NULL; DcmItem *ditem=NULL; dseq = new DcmSequenceOfItems(DCM_ReferencedSeriesSequence); if (dseq) { OFListIterator(DVPSReferencedSeries *) first = list_.begin(); OFListIterator(DVPSReferencedSeries *) last = list_.end(); while (first != last) { if (result==EC_Normal) { ditem = new DcmItem(); if (ditem) { result = (*first)->write(*ditem); if (result==EC_Normal) dseq->insert(ditem); else delete ditem; } else result = EC_MemoryExhausted; } ++first; } if (result==EC_Normal) dset.insert(dseq, OFTrue /*replaceOld*/); else delete dseq; } else result = EC_MemoryExhausted; return result; } OFBool DVPSReferencedSeries_PList::isValid() { if (list_.size() == 0) { DCMPSTAT_INFO("referenced series SQ is empty in presentation state"); return OFFalse; } OFBool result = OFTrue; OFString sopclassuid; OFListIterator(DVPSReferencedSeries *) first = list_.begin(); OFListIterator(DVPSReferencedSeries *) last = list_.end(); while ((result == OFTrue) && (first != last)) { result = (*first)->isValid(sopclassuid); ++first; } return result; } OFBool DVPSReferencedSeries_PList::checkSOPClass(const char *uid) { OFBool result = OFTrue; OFString sopclassuid(uid); OFListIterator(DVPSReferencedSeries *) first = list_.begin(); OFListIterator(DVPSReferencedSeries *) last = list_.end(); while ((result == OFTrue) && (first != last)) { result = (*first)->isValid(sopclassuid); ++first; } return result; } void DVPSReferencedSeries_PList::removeImageReference(const char *seriesUID, const char *instanceUID) { DVPSReferencedSeries *series = findSeriesReference(seriesUID); if (series) series->removeImageReference(instanceUID); return; } DVPSReferencedSeries *DVPSReferencedSeries_PList::findSeriesReference(const char *seriesUID) { OFListIterator(DVPSReferencedSeries *) first = list_.begin(); OFListIterator(DVPSReferencedSeries *) last = list_.end(); while (first != last) { if ((*first)->isSeriesUID(seriesUID)) return *first; ++first; } return NULL; } DVPSReferencedImage *DVPSReferencedSeries_PList::findImageReference(const char *seriesUID, const char *instanceUID) { DVPSReferencedSeries *series = findSeriesReference(seriesUID); if (series) return series->findImageReference(instanceUID); else return NULL; } void DVPSReferencedSeries_PList::removeSeriesReference(const char *seriesUID) { OFListIterator(DVPSReferencedSeries *) first = list_.begin(); OFListIterator(DVPSReferencedSeries *) last = list_.end(); while (first != last) { if ((*first)->isSeriesUID(seriesUID)) { delete (*first); first = list_.erase(first); } else ++first; } return; } OFCondition DVPSReferencedSeries_PList::addImageReference( const char *seriesUID, const char *sopclassUID, const char *instanceUID, const char *frames, const char *aetitle, const char *filesetID, const char *filesetUID) { if ((seriesUID==NULL) || (sopclassUID==NULL) || (instanceUID==NULL)) return EC_IllegalCall; OFCondition result = EC_Normal; if (checkSOPClass(sopclassUID)) { DVPSReferencedSeries *series = findSeriesReference(seriesUID); if (series == NULL) { series = new DVPSReferencedSeries(); if (series) { series->setSeriesInstanceUID(seriesUID); list_.push_back(series); } } if (series) { result = series->addImageReference(sopclassUID, instanceUID, frames); if (EC_Normal == result) series->setRetrieveLocation(aetitle, filesetID, filesetUID); } else result = EC_MemoryExhausted; } else result = EC_IllegalCall; return result; } size_t DVPSReferencedSeries_PList::numberOfImageReferences() { size_t result=0; OFListIterator(DVPSReferencedSeries *) first = list_.begin(); OFListIterator(DVPSReferencedSeries *) last = list_.end(); while (first != last) { result += (*first)->numberOfImageReferences(); ++first; } return result; } OFCondition DVPSReferencedSeries_PList::getImageReference( size_t idx, OFString& seriesUID, OFString& sopclassUID, OFString& instanceUID, OFString& frames, OFString& aetitle, OFString& filesetID, OFString& filesetUID) { OFListIterator(DVPSReferencedSeries *) first = list_.begin(); OFListIterator(DVPSReferencedSeries *) last = list_.end(); OFBool found = OFFalse; size_t i; while ((!found)&&(first != last)) { i=(*first)->numberOfImageReferences(); if (i > idx) found = OFTrue; else { idx -= i; ++first; } } if (found) return (*first)->getImageReference(idx, seriesUID, sopclassUID, instanceUID, frames, aetitle, filesetID, filesetUID); return EC_IllegalCall; } /* * $Log: dvpsrsl.cc,v $ * Revision 1.21 2010-10-14 13:14:32 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.20 2009-11-24 14:12:59 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.19 2009-09-30 10:42:39 uli * Make dcmpstat's include headers self-sufficient by including all * needed headers directly and stop using dctk.h * * Revision 1.18 2006-08-15 16:57:02 meichel * Updated the code in module dcmpstat to correctly compile when * all standard C++ classes remain in namespace std. * * Revision 1.17 2005/12/08 15:46:46 meichel * Changed include path schema for all DCMTK header files * * Revision 1.16 2004/02/04 15:57:49 joergr * Removed acknowledgements with e-mail addresses from CVS log. * * Revision 1.15 2003/10/15 16:57:14 meichel * Updated error messages generated while parsing presentation states * * Revision 1.14 2003/09/05 08:37:46 meichel * Fixed minor issue that caused certain error messages during the * parse process on a GSPS object to be "swallowed". * * Revision 1.13 2003/06/12 18:23:11 joergr * Modified code to use const_iterators where appropriate (required for STL). * * Revision 1.12 2003/06/04 12:30:28 meichel * Added various includes needed by MSVC5 with STL * * Revision 1.11 2003/06/04 10:18:07 meichel * Replaced private inheritance from template with aggregation * * Revision 1.10 2001/11/28 13:57:00 joergr * Check return value of DcmItem::insert() statements where appropriate to * avoid memory leaks when insert procedure fails. * * Revision 1.9 2001/09/26 15:36:32 meichel * Adapted dcmpstat to class OFCondition * * Revision 1.8 2001/06/01 15:50:37 meichel * Updated copyright header * * Revision 1.7 2000/06/02 16:01:06 meichel * Adapted all dcmpstat classes to use OFConsole for log and error output * * Revision 1.6 2000/03/08 16:29:10 meichel * Updated copyright header. * * Revision 1.5 2000/03/03 14:14:04 meichel * Implemented library support for redirecting error messages into memory * instead of printing them to stdout/stderr for GUI applications. * * Revision 1.4 1999/07/22 16:40:02 meichel * Adapted dcmpstat data structures and API to supplement 33 letter ballot text. * * Revision 1.3 1999/01/15 17:32:58 meichel * added methods to DVPresentationState allowing to access the image * references in the presentation state. Also added methods allowing to * get the width and height of the attached image. * * Revision 1.2 1998/12/14 16:10:47 meichel * Implemented Presentation State interface for graphic layers, * text and graphic annotations, presentation LUTs. * * Revision 1.1 1998/11/27 14:50:47 meichel * Initial Release. * * */ dcmtk-3.6.0/dcmpstat/libsrc/dvpspr.cc0000644000310500011400000005524311455601070016771 0ustar joergrdicom3/* * * Copyright (C) 1998-2010, 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: DVPSPrintMessageHandler * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:14:32 $ * CVS/RCS Revision: $Revision: 1.23 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/ofstd/ofstring.h" #include "dcmtk/dcmpstat/dvpsdef.h" #include "dcmtk/dcmpstat/dvpspr.h" /* --------------- class DVPSPrintMessageHandler --------------- */ DVPSPrintMessageHandler::DVPSPrintMessageHandler() : assoc(NULL) , net(NULL) , eventHandler(NULL) , blockMode(DIMSE_BLOCKING) , timeout(0) { } DVPSPrintMessageHandler::~DVPSPrintMessageHandler() { abortAssociation(); // won't do any harm if there is no association in place } void DVPSPrintMessageHandler::dumpNMessage(T_DIMSE_Message &msg, DcmItem *dataset, OFBool outgoing) { OFString str; if (outgoing) { DIMSE_dumpMessage(str, msg, DIMSE_OUTGOING, dataset); } else { DIMSE_dumpMessage(str, msg, DIMSE_INCOMING, dataset); } DCMPSTAT_DUMP(str); } OFCondition DVPSPrintMessageHandler::sendNRequest( T_ASC_PresentationContextID presId, T_DIMSE_Message &request, DcmDataset *rqDataSet, T_DIMSE_Message &response, DcmDataset* &statusDetail, DcmDataset* &rspDataset) { OFCondition cond = EC_Normal; T_DIMSE_Command expectedResponse; DIC_US expectedMessageID=0; if (assoc == NULL) { return DIMSE_ILLEGALASSOCIATION; } T_DIMSE_DataSetType datasetType = DIMSE_DATASET_NULL; if (rqDataSet && (rqDataSet->card() > 0)) datasetType = DIMSE_DATASET_PRESENT; switch(request.CommandField) { case DIMSE_N_GET_RQ: request.msg.NGetRQ.DataSetType = datasetType; expectedResponse = DIMSE_N_GET_RSP; expectedMessageID = request.msg.NGetRQ.MessageID; break; case DIMSE_N_SET_RQ: request.msg.NSetRQ.DataSetType = datasetType; expectedResponse = DIMSE_N_SET_RSP; expectedMessageID = request.msg.NSetRQ.MessageID; break; case DIMSE_N_ACTION_RQ: request.msg.NActionRQ.DataSetType = datasetType; expectedResponse = DIMSE_N_ACTION_RSP; expectedMessageID = request.msg.NActionRQ.MessageID; break; case DIMSE_N_CREATE_RQ: request.msg.NCreateRQ.DataSetType = datasetType; expectedResponse = DIMSE_N_CREATE_RSP; expectedMessageID = request.msg.NCreateRQ.MessageID; break; case DIMSE_N_DELETE_RQ: request.msg.NDeleteRQ.DataSetType = datasetType; expectedResponse = DIMSE_N_DELETE_RSP; expectedMessageID = request.msg.NDeleteRQ.MessageID; break; default: return DIMSE_BADCOMMANDTYPE; /* break; */ } dumpNMessage(request, rqDataSet, OFTrue); cond = DIMSE_sendMessageUsingMemoryData(assoc, presId, &request, NULL, rqDataSet, NULL, NULL); if (cond.bad()) return cond; T_ASC_PresentationContextID thisPresId; T_DIMSE_Message eventReportRsp; DIC_US eventReportStatus; do { thisPresId = presId; statusDetail = NULL; cond = DIMSE_receiveCommand(assoc, blockMode, timeout, &thisPresId, &response, &statusDetail); if (cond.bad()) return cond; if (response.CommandField == DIMSE_N_EVENT_REPORT_RQ) { /* handle N-EVENT-REPORT-RQ */ rspDataset = NULL; if (response.msg.NEventReportRQ.DataSetType == DIMSE_DATASET_PRESENT) { cond = DIMSE_receiveDataSetInMemory(assoc, blockMode, timeout, &thisPresId, &rspDataset, NULL, NULL); if (cond.bad()) return cond; } dumpNMessage(response, rspDataset, OFFalse); // call event handler if registered eventReportStatus = STATUS_Success; if (eventHandler) eventReportStatus = eventHandler->handleEvent(response.msg.NEventReportRQ, rspDataset, statusDetail); if (rspDataset) delete rspDataset; rspDataset = NULL; if (statusDetail) delete statusDetail; statusDetail = NULL; // send back N-EVENT-REPORT-RSP */ eventReportRsp.CommandField = DIMSE_N_EVENT_REPORT_RSP; eventReportRsp.msg.NEventReportRSP.MessageIDBeingRespondedTo = response.msg.NEventReportRQ.MessageID; eventReportRsp.msg.NEventReportRSP.EventTypeID = response.msg.NEventReportRQ.EventTypeID; eventReportRsp.msg.NEventReportRSP.DimseStatus = eventReportStatus; eventReportRsp.msg.NEventReportRSP.DataSetType = DIMSE_DATASET_NULL; eventReportRsp.msg.NEventReportRSP.opts = O_NEVENTREPORT_EVENTTYPEID; eventReportRsp.msg.NEventReportRSP.AffectedSOPClassUID[0] = 0; eventReportRsp.msg.NEventReportRSP.AffectedSOPInstanceUID[0] = 0; dumpNMessage(eventReportRsp, NULL, OFTrue); cond = DIMSE_sendMessageUsingMemoryData(assoc, thisPresId, &eventReportRsp, NULL, NULL, NULL, NULL); if (cond.bad()) return cond; } else { /* No N-EVENT-REPORT-RQ. Check if this message is what we expected */ if (response.CommandField != expectedResponse) { char buf1[256]; sprintf(buf1, "DIMSE: Unexpected Response Command Field: 0x%x", (unsigned)response.CommandField); return makeDcmnetCondition(DIMSEC_UNEXPECTEDRESPONSE, OF_error, buf1); } T_DIMSE_DataSetType responseDataset = DIMSE_DATASET_NULL; DIC_US responseMessageID = 0; /** change request to response */ switch(expectedResponse) { case DIMSE_N_GET_RSP: responseDataset = response.msg.NGetRSP.DataSetType; responseMessageID = response.msg.NGetRSP.MessageIDBeingRespondedTo; break; case DIMSE_N_SET_RSP: responseDataset = response.msg.NSetRSP.DataSetType; responseMessageID = response.msg.NSetRSP.MessageIDBeingRespondedTo; break; case DIMSE_N_ACTION_RSP: responseDataset = response.msg.NActionRSP.DataSetType; responseMessageID = response.msg.NActionRSP.MessageIDBeingRespondedTo; break; case DIMSE_N_CREATE_RSP: responseDataset = response.msg.NCreateRSP.DataSetType; responseMessageID = response.msg.NCreateRSP.MessageIDBeingRespondedTo; break; case DIMSE_N_DELETE_RSP: responseDataset = response.msg.NDeleteRSP.DataSetType; responseMessageID = response.msg.NDeleteRSP.MessageIDBeingRespondedTo; break; default: { char buf1[256]; sprintf(buf1, "DIMSE: Unexpected Response Command Field: 0x%x", (unsigned)response.CommandField); return makeDcmnetCondition(DIMSEC_UNEXPECTEDRESPONSE, OF_error, buf1); } /* break; */ } if (responseMessageID != expectedMessageID) { char buf1[256]; sprintf(buf1, "DIMSE: Unexpected Response Command Field: 0x%x", (unsigned)response.CommandField); return makeDcmnetCondition(DIMSEC_UNEXPECTEDRESPONSE, OF_error, buf1); } rspDataset = NULL; if (responseDataset == DIMSE_DATASET_PRESENT) { cond = DIMSE_receiveDataSetInMemory(assoc, blockMode, timeout, &thisPresId, &rspDataset, NULL, NULL); if (cond.bad()) return cond; } dumpNMessage(response, rspDataset, OFFalse); } } while (response.CommandField == DIMSE_N_EVENT_REPORT_RQ); return EC_Normal; } OFCondition DVPSPrintMessageHandler::createRQ( const char *sopclassUID, OFString& sopinstanceUID, DcmDataset *attributeListIn, Uint16& status, DcmDataset* &attributeListOut) { if (assoc == NULL) { return DIMSE_ILLEGALASSOCIATION; } if (sopclassUID==NULL) { return DIMSE_NULLKEY; } T_ASC_PresentationContextID presCtx = findAcceptedPC(sopclassUID); if (presCtx == 0) { return DIMSE_NOVALIDPRESENTATIONCONTEXTID; } T_DIMSE_Message request; T_DIMSE_Message response; DcmDataset *statusDetail = NULL; // construct N-CREATE-RQ request.CommandField = DIMSE_N_CREATE_RQ; request.msg.NCreateRQ.MessageID = assoc->nextMsgID++; strcpy(request.msg.NCreateRQ.AffectedSOPClassUID, sopclassUID); if (sopinstanceUID.size() > 0) { strcpy(request.msg.NCreateRQ.AffectedSOPInstanceUID, sopinstanceUID.c_str()); request.msg.NCreateRQ.opts = O_NCREATE_AFFECTEDSOPINSTANCEUID; } else { request.msg.NCreateRQ.AffectedSOPInstanceUID[0] = 0; request.msg.NCreateRQ.opts = 0; } OFCondition cond = sendNRequest(presCtx, request, attributeListIn, response, statusDetail, attributeListOut); if (cond.good()) { status = response.msg.NCreateRSP.DimseStatus; // if response contains SOP Instance UID, copy it. if (response.msg.NCreateRSP.opts & O_NCREATE_AFFECTEDSOPINSTANCEUID) { sopinstanceUID = response.msg.NCreateRSP.AffectedSOPInstanceUID; } } if (statusDetail) delete statusDetail; return cond; } OFCondition DVPSPrintMessageHandler::setRQ( const char *sopclassUID, const char *sopinstanceUID, DcmDataset *modificationList, Uint16& status, DcmDataset* &attributeListOut) { if (assoc == NULL) { return DIMSE_ILLEGALASSOCIATION; } if ((sopclassUID==NULL)||(sopinstanceUID==NULL)||(modificationList==NULL)) { return DIMSE_NULLKEY; } T_ASC_PresentationContextID presCtx = findAcceptedPC(sopclassUID); if (presCtx == 0) { return DIMSE_NOVALIDPRESENTATIONCONTEXTID; } T_DIMSE_Message request; T_DIMSE_Message response; DcmDataset *statusDetail = NULL; // construct N-SET-RQ request.CommandField = DIMSE_N_SET_RQ; request.msg.NSetRQ.MessageID = assoc->nextMsgID++; strcpy(request.msg.NSetRQ.RequestedSOPClassUID, sopclassUID); strcpy(request.msg.NSetRQ.RequestedSOPInstanceUID, sopinstanceUID); OFCondition cond = sendNRequest(presCtx, request, modificationList, response, statusDetail, attributeListOut); if (cond.good()) status = response.msg.NSetRSP.DimseStatus; if (statusDetail) delete statusDetail; return cond; } OFCondition DVPSPrintMessageHandler::getRQ( const char *sopclassUID, const char *sopinstanceUID, const Uint16 *attributeIdentifierList, size_t numShorts, Uint16& status, DcmDataset* &attributeListOut) { if (assoc == NULL) { return DIMSE_ILLEGALASSOCIATION; } if ((sopclassUID==NULL)||(sopinstanceUID==NULL)) { return DIMSE_NULLKEY; } T_ASC_PresentationContextID presCtx = findAcceptedPC(sopclassUID); if (presCtx == 0) { return DIMSE_NOVALIDPRESENTATIONCONTEXTID; } T_DIMSE_Message request; T_DIMSE_Message response; DcmDataset *statusDetail = NULL; // construct N-GET-RQ request.CommandField = DIMSE_N_GET_RQ; request.msg.NGetRQ.MessageID = assoc->nextMsgID++; strcpy(request.msg.NGetRQ.RequestedSOPClassUID, sopclassUID); strcpy(request.msg.NGetRQ.RequestedSOPInstanceUID, sopinstanceUID); request.msg.NGetRQ.ListCount = 0; if (attributeIdentifierList) request.msg.NGetRQ.ListCount = (int)numShorts; request.msg.NGetRQ.AttributeIdentifierList = (DIC_US *)attributeIdentifierList; OFCondition cond = sendNRequest(presCtx, request, NULL, response, statusDetail, attributeListOut); if (cond.good()) status = response.msg.NGetRSP.DimseStatus; if (statusDetail) delete statusDetail; return cond; } OFCondition DVPSPrintMessageHandler::actionRQ( const char *sopclassUID, const char *sopinstanceUID, Uint16 actionTypeID, DcmDataset *actionInformation, Uint16& status, DcmDataset* &actionReply) { if (assoc == NULL) { return DIMSE_ILLEGALASSOCIATION; } if ((sopclassUID==NULL)||(sopinstanceUID==NULL)) { return DIMSE_NULLKEY; } T_ASC_PresentationContextID presCtx = findAcceptedPC(sopclassUID); if (presCtx == 0) { return DIMSE_NOVALIDPRESENTATIONCONTEXTID; } T_DIMSE_Message request; T_DIMSE_Message response; DcmDataset *statusDetail = NULL; // construct N-ACTION-RQ request.CommandField = DIMSE_N_ACTION_RQ; request.msg.NActionRQ.MessageID = assoc->nextMsgID++; strcpy(request.msg.NActionRQ.RequestedSOPClassUID, sopclassUID); strcpy(request.msg.NActionRQ.RequestedSOPInstanceUID, sopinstanceUID); request.msg.NActionRQ.ActionTypeID = (DIC_US)actionTypeID; OFCondition cond = sendNRequest(presCtx, request, actionInformation, response, statusDetail, actionReply); if (cond.good()) status = response.msg.NActionRSP.DimseStatus; if (statusDetail) delete statusDetail; return cond; } OFCondition DVPSPrintMessageHandler::deleteRQ( const char *sopclassUID, const char *sopinstanceUID, Uint16& status) { if (assoc == NULL) { return DIMSE_ILLEGALASSOCIATION; } if ((sopclassUID==NULL)||(sopinstanceUID==NULL)) { return DIMSE_NULLKEY; } T_ASC_PresentationContextID presCtx = findAcceptedPC(sopclassUID); if (presCtx == 0) { return DIMSE_NOVALIDPRESENTATIONCONTEXTID; } T_DIMSE_Message request; T_DIMSE_Message response; DcmDataset *statusDetail = NULL; DcmDataset *attributeListOut = NULL; // construct N-DELETE-RQ request.CommandField = DIMSE_N_DELETE_RQ; request.msg.NDeleteRQ.MessageID = assoc->nextMsgID++; strcpy(request.msg.NDeleteRQ.RequestedSOPClassUID, sopclassUID); strcpy(request.msg.NDeleteRQ.RequestedSOPInstanceUID, sopinstanceUID); OFCondition cond = sendNRequest(presCtx, request, NULL, response, statusDetail, attributeListOut); if (cond.good()) status = response.msg.NDeleteRSP.DimseStatus; if (statusDetail) delete statusDetail; if (attributeListOut) delete attributeListOut; // should never happen return cond; } OFCondition DVPSPrintMessageHandler::releaseAssociation() { OFCondition result = EC_Normal; if (assoc) { result = ASC_releaseAssociation(assoc); ASC_destroyAssociation(&assoc); ASC_dropNetwork(&net); assoc = NULL; net = NULL; } return result; } OFCondition DVPSPrintMessageHandler::abortAssociation() { OFCondition result = EC_Normal; if (assoc) { result = ASC_abortAssociation(assoc); ASC_destroyAssociation(&assoc); ASC_dropNetwork(&net); assoc = NULL; net = NULL; } return result; } T_ASC_PresentationContextID DVPSPrintMessageHandler::findAcceptedPC(const char *sopclassuid) { if ((assoc==NULL)||(sopclassuid==NULL)) return 0; // if the SOP class is one of the Basic Grayscale Print Management Meta SOP Classes, // look for a presentation context for Basic Grayscale Print. OFString sopclass(sopclassuid); if ((sopclass == UID_BasicFilmSessionSOPClass) || (sopclass == UID_BasicFilmBoxSOPClass) || (sopclass == UID_BasicGrayscaleImageBoxSOPClass) || (sopclass == UID_PrinterSOPClass)) sopclassuid = UID_BasicGrayscalePrintManagementMetaSOPClass; return ASC_findAcceptedPresentationContextID(assoc, sopclassuid); } OFCondition DVPSPrintMessageHandler::negotiateAssociation( DcmTransportLayer *tlayer, const char *myAEtitle, const char *peerAEtitle, const char *peerHost, int peerPort, long peerMaxPDU, OFBool negotiatePresentationLUT, OFBool negotiateAnnotationBox, OFBool implicitOnly) { if (assoc) { return makeDcmnetCondition(DIMSEC_ILLEGALASSOCIATION, OF_error, "association already in place"); } if ((myAEtitle==NULL)||(peerAEtitle==NULL)||(peerHost==NULL)) { return DIMSE_NULLKEY; } T_ASC_Parameters *params=NULL; DIC_NODENAME dnlocalHost; DIC_NODENAME dnpeerHost; OFCondition cond = ASC_initializeNetwork(NET_REQUESTOR, 0, 30, &net); if (cond.good()) cond = ASC_createAssociationParameters(¶ms, peerMaxPDU); if (tlayer && cond.good()) { cond = ASC_setTransportLayer(net, tlayer, 0); if (cond.good()) cond = ASC_setTransportLayerType(params, OFTrue /* use TLS */); } if (cond.bad()) return cond; ASC_setAPTitles(params, myAEtitle, peerAEtitle, NULL); gethostname(dnlocalHost, sizeof(dnlocalHost) - 1); sprintf(dnpeerHost, "%s:%d", peerHost, peerPort); ASC_setPresentationAddresses(params, dnlocalHost, dnpeerHost); /* presentation contexts */ const char* transferSyntaxes[3]; int transferSyntaxCount = 0; if (implicitOnly) { transferSyntaxes[0] = UID_LittleEndianImplicitTransferSyntax; transferSyntaxCount = 1; } else { /* gLocalByteOrder is defined in dcxfer.h */ if (gLocalByteOrder == EBO_LittleEndian) { /* we are on a little endian machine */ transferSyntaxes[0] = UID_LittleEndianExplicitTransferSyntax; transferSyntaxes[1] = UID_BigEndianExplicitTransferSyntax; } else { /* we are on a big endian machine */ transferSyntaxes[0] = UID_BigEndianExplicitTransferSyntax; transferSyntaxes[1] = UID_LittleEndianExplicitTransferSyntax; } transferSyntaxes[2] = UID_LittleEndianImplicitTransferSyntax; transferSyntaxCount = 3; } /* we always propose basic grayscale, presentation LUT and annotation box*/ if (cond.good()) cond = ASC_addPresentationContext(params, 1, UID_BasicGrayscalePrintManagementMetaSOPClass, transferSyntaxes, transferSyntaxCount); if (negotiatePresentationLUT) { if (cond.good()) cond = ASC_addPresentationContext(params, 3, UID_PresentationLUTSOPClass, transferSyntaxes, transferSyntaxCount); } if (negotiateAnnotationBox) { if (cond.good()) cond = ASC_addPresentationContext(params, 5, UID_BasicAnnotationBoxSOPClass, transferSyntaxes, transferSyntaxCount); } /* create association */ DCMPSTAT_INFO("Requesting Association"); if (cond.good()) { cond = ASC_requestAssociation(net, params, &assoc); if (cond == DUL_ASSOCIATIONREJECTED) { OFString temp_str; T_ASC_RejectParameters rej; ASC_getRejectParameters(params, &rej); DCMPSTAT_INFO("Association Rejected" << OFendl << ASC_printRejectParameters(temp_str, &rej)); } else { if (cond.bad()) { // if assoc is non-NULL, then params has already been moved into the // assoc structure. Make sure we only delete once! if (assoc) ASC_destroyAssociation(&assoc); else if (params) ASC_destroyAssociationParameters(¶ms); if (net) ASC_dropNetwork(&net); assoc = NULL; net = NULL; return cond; } } } if ((cond.good()) && (0 == ASC_findAcceptedPresentationContextID(assoc, UID_BasicGrayscalePrintManagementMetaSOPClass))) { DCMPSTAT_INFO("Peer does not support Basic Grayscale Print Management, aborting association."); abortAssociation(); cond = DIMSE_NOVALIDPRESENTATIONCONTEXTID; } if (cond.good()) { DCMPSTAT_INFO("Association accepted (Max Send PDV: " << assoc->sendPDVLength << ")"); } else { // params is now an alias to assoc->params. Don't call ASC_destroyAssociationParameters. if (assoc) ASC_destroyAssociation(&assoc); if (net) ASC_dropNetwork(&net); assoc = NULL; net = NULL; } return cond; } OFBool DVPSPrintMessageHandler::printerSupportsPresentationLUT() { if ((assoc)&&(0 != ASC_findAcceptedPresentationContextID(assoc, UID_PresentationLUTSOPClass))) return OFTrue; return OFFalse; } OFBool DVPSPrintMessageHandler::printerSupportsAnnotationBox() { if ((assoc)&&(0 != ASC_findAcceptedPresentationContextID(assoc, UID_BasicAnnotationBoxSOPClass))) return OFTrue; return OFFalse; } /* * $Log: dvpspr.cc,v $ * Revision 1.23 2010-10-14 13:14:32 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.22 2009-11-24 14:12:59 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.21 2006-08-15 16:57:02 meichel * Updated the code in module dcmpstat to correctly compile when * all standard C++ classes remain in namespace std. * * Revision 1.20 2005/12/08 15:46:41 meichel * Changed include path schema for all DCMTK header files * * Revision 1.19 2005/11/16 14:58:24 meichel * Set association timeout in ASC_initializeNetwork to 30 seconds. This improves * the responsiveness of the tools if the peer blocks during assoc negotiation. * * Revision 1.18 2003/09/05 14:31:33 meichel * Print SCU now supports TLS connections. * * Revision 1.17 2002/09/17 12:53:54 meichel * Fixed memory leak * * Revision 1.16 2001/11/09 16:03:21 joergr * Fixed small bug introduced during changeover to new OFCondition mechanism. * * Revision 1.15 2001/10/12 13:46:55 meichel * Adapted dcmpstat to OFCondition based dcmnet module (supports strict mode). * * Revision 1.14 2001/08/22 08:28:15 meichel * Fixed double deletion of association parameters in dcmpstat * class DVPSPrintMessageHandler. * * Revision 1.13 2001/06/01 15:50:35 meichel * Updated copyright header * * Revision 1.12 2000/06/07 13:17:08 meichel * now using DIMSE status constants and log facilities defined in dcmnet * * Revision 1.11 2000/06/02 16:01:04 meichel * Adapted all dcmpstat classes to use OFConsole for log and error output * * Revision 1.10 2000/03/08 16:29:08 meichel * Updated copyright header. * * Revision 1.9 2000/03/07 16:24:56 joergr * Added brackets to case block within a switch statement (reported an error * by Sun CC 2.0.1). * * Revision 1.8 2000/03/03 14:14:03 meichel * Implemented library support for redirecting error messages into memory * instead of printing them to stdout/stderr for GUI applications. * * Revision 1.7 1999/10/28 08:18:57 meichel * Print client does not attempt any more to negotiate Presentation LUT or * Annotation Box if config file says that the printer does not support them. * * Revision 1.6 1999/10/19 14:48:24 meichel * added support for the Basic Annotation Box SOP Class * as well as access methods for Max Density and Min Density. * * Revision 1.5 1999/10/13 14:10:49 meichel * Now negotiation Basic Annotation Box SOP Class * * Revision 1.4 1999/09/24 15:24:08 meichel * Print spooler (dcmprtsv) now logs diagnostic messages in log files * when operating in spool mode. * * Revision 1.3 1999/09/17 14:33:53 meichel * Completed print spool functionality including Supplement 22 support * * Revision 1.2 1999/08/26 09:29:49 thiel * Extensions for the usage of the StoredPrint * * Revision 1.1 1999/07/30 13:34:58 meichel * Added new classes managing Stored Print objects * * */ dcmtk-3.6.0/dcmpstat/libsrc/dvpsovl.cc0000644000310500011400000001456011455601070017145 0ustar joergrdicom3/* * * Copyright (C) 1998-2010, 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: DVPSOverlay_PList * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:14:32 $ * CVS/RCS Revision: $Revision: 1.14 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmpstat/dvpsovl.h" #include "dcmtk/dcmpstat/dvpsov.h" /* for DVPSOverlay */ DVPSOverlay_PList::DVPSOverlay_PList() : list_() { } DVPSOverlay_PList::DVPSOverlay_PList(const DVPSOverlay_PList &arg) : list_() { OFListConstIterator(DVPSOverlay *) first = arg.list_.begin(); OFListConstIterator(DVPSOverlay *) last = arg.list_.end(); while (first != last) { list_.push_back((*first)->clone()); ++first; } } DVPSOverlay_PList::~DVPSOverlay_PList() { clear(); } void DVPSOverlay_PList::clear() { OFListIterator(DVPSOverlay *) first = list_.begin(); OFListIterator(DVPSOverlay *) last = list_.end(); while (first != last) { delete (*first); first = list_.erase(first); } } OFCondition DVPSOverlay_PList::read(DcmItem &dset) { OFCondition result = EC_Normal; DcmStack stack; DcmTagKey key(0x6000,0x3000); DVPSOverlay *newOverlay = NULL; for (Uint8 i=0; i<16; i+=2) { if (result==EC_Normal) { stack.clear(); key.setGroup(0x6000+i); if (EC_Normal == dset.search(key, stack, ESM_fromHere, OFFalse)) { newOverlay = new DVPSOverlay(); if (newOverlay) { result = newOverlay->read(dset,i); list_.push_back(newOverlay); } else result = EC_MemoryExhausted; } } } return result; } OFCondition DVPSOverlay_PList::write(DcmItem &dset) { OFCondition result = EC_Normal; OFListIterator(DVPSOverlay *) first = list_.begin(); OFListIterator(DVPSOverlay *) last = list_.end(); while (first != last) { if (result==EC_Normal) result = (*first)->write(dset); ++first; } return result; } OFBool DVPSOverlay_PList::haveOverlayGroup(Uint16 group) { if (getOverlayGroup(group)) return OFTrue; else return OFFalse; } DVPSOverlay *DVPSOverlay_PList::getOverlayGroup(Uint16 group) { Uint8 lowergroup = (Uint8)(group & 0x00FF); OFListIterator(DVPSOverlay *) first = list_.begin(); OFListIterator(DVPSOverlay *) last = list_.end(); while (first != last) { if ((*first)->getOverlayGroup() == lowergroup) return *first; ++first; } return NULL; } DVPSOverlay *DVPSOverlay_PList::getOverlay(size_t idx) { OFListIterator(DVPSOverlay *) first = list_.begin(); OFListIterator(DVPSOverlay *) last = list_.end(); while (first != last) { if (idx==0) return *first; idx--; ++first; } return NULL; } OFCondition DVPSOverlay_PList::removeOverlay(size_t idx) { OFListIterator(DVPSOverlay *) first = list_.begin(); OFListIterator(DVPSOverlay *) last = list_.end(); while (first != last) { if (idx==0) { delete (*first); first = list_.erase(first); return EC_Normal; } idx--; ++first; } return EC_IllegalCall; } OFCondition DVPSOverlay_PList::changeOverlayGroup(size_t idx, Uint16 newGroup) { if ((newGroup < 0x6000)||(newGroup > 0x601F)) return EC_IllegalCall; DVPSOverlay *overlay = getOverlay(idx); if (overlay) { if (newGroup == (overlay->getOverlayGroup()+0x6000)) return EC_Normal; if (haveOverlayGroup(newGroup)) return EC_IllegalCall; // don't allocate twice overlay->setOverlayGroup((Uint8)(newGroup-0x6000)); return EC_Normal; } return EC_IllegalCall; } OFCondition DVPSOverlay_PList::addOverlay(DcmItem& overlayIOD, Uint16 groupInItem, Uint16 newGroup) { if ((groupInItem < 0x6000)||(groupInItem > 0x601F)) return EC_IllegalCall; if ((newGroup < 0x6000)||(newGroup > 0x601F)) return EC_IllegalCall; if (haveOverlayGroup(newGroup)) return EC_IllegalCall; // don't allocate twice DcmStack stack; DcmTagKey key(groupInItem,0x3000); DVPSOverlay *newOverlay = NULL; OFCondition result = overlayIOD.search(key, stack, ESM_fromHere, OFFalse); if (EC_Normal == result) { newOverlay = new DVPSOverlay(); if (newOverlay) { result = newOverlay->read(overlayIOD,(Uint8)(groupInItem-0x6000), (Uint8)(newGroup-0x6000)); if (EC_Normal==result) list_.push_back(newOverlay); else delete newOverlay; } else result = EC_MemoryExhausted; } return result; } /* * $Log: dvpsovl.cc,v $ * Revision 1.14 2010-10-14 13:14:32 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.13 2009-11-24 14:12:59 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.12 2005-12-08 15:46:37 meichel * Changed include path schema for all DCMTK header files * * Revision 1.11 2004/02/04 15:57:49 joergr * Removed acknowledgements with e-mail addresses from CVS log. * * Revision 1.10 2003/09/05 08:37:46 meichel * Fixed minor issue that caused certain error messages during the * parse process on a GSPS object to be "swallowed". * * Revision 1.9 2003/06/12 18:23:11 joergr * Modified code to use const_iterators where appropriate (required for STL). * * Revision 1.8 2003/06/04 10:18:07 meichel * Replaced private inheritance from template with aggregation * * Revision 1.7 2001/09/26 15:36:29 meichel * Adapted dcmpstat to class OFCondition * * Revision 1.6 2001/06/01 15:50:34 meichel * Updated copyright header * * Revision 1.5 2000/06/02 16:01:03 meichel * Adapted all dcmpstat classes to use OFConsole for log and error output * * Revision 1.4 2000/03/08 16:29:07 meichel * Updated copyright header. * * Revision 1.3 1998/12/22 17:57:17 meichel * Implemented Presentation State interface for overlays, * VOI LUTs, VOI windows, curves. Added test program that * allows to add curve data to DICOM images. * * Revision 1.2 1998/12/14 16:10:45 meichel * Implemented Presentation State interface for graphic layers, * text and graphic annotations, presentation LUTs. * * Revision 1.1 1998/11/27 14:50:44 meichel * Initial Release. * * */ dcmtk-3.6.0/dcmpstat/libsrc/dvpsmsg.cc0000644000310500011400000003331711455601070017134 0ustar joergrdicom3/* * * Copyright (C) 1998-2010, 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: DVPSIPCMessage * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:14:32 $ * CVS/RCS Revision: $Revision: 1.12 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmnet/dcompat.h" BEGIN_EXTERN_C #ifdef HAVE_WINDOWS_H #include #include #endif END_EXTERN_C #include "dcmtk/dcmpstat/dvpsmsg.h" #include "dcmtk/ofstd/ofstring.h" /* for class OFString */ #include "dcmtk/ofstd/ofbmanip.h" /* for OFBitmanipTemplate<> */ #include "dcmtk/dcmdata/dcswap.h" /* for swapIfNecessary() */ #include "dcmtk/dcmnet/dcmtrans.h" /* for class DcmTransportConnection */ /* --------------- class DVPSIPCMessage --------------- */ #define PAYLOAD_ALLOCATION_UNIT 1024 #define PAYLOAD_OFFSET 8 // constants for message type const Uint32 DVPSIPCMessage::OK = 0; const Uint32 DVPSIPCMessage::requestApplicationID = 1; const Uint32 DVPSIPCMessage::assignApplicationID = 2; const Uint32 DVPSIPCMessage::applicationTerminates = 3; const Uint32 DVPSIPCMessage::receivedUnencryptedDICOMConnection = 5; const Uint32 DVPSIPCMessage::receivedEncryptedDICOMConnection = 7; const Uint32 DVPSIPCMessage::connectionClosed = 9; const Uint32 DVPSIPCMessage::connectionAborted = 11; const Uint32 DVPSIPCMessage::requestedUnencryptedDICOMConnection = 13; const Uint32 DVPSIPCMessage::requestedEncryptedDICOMConnection = 15; const Uint32 DVPSIPCMessage::receivedDICOMObject = 17; const Uint32 DVPSIPCMessage::sentDICOMObject = 19; // message status constants const Uint32 DVPSIPCMessage::statusOK = 0; const Uint32 DVPSIPCMessage::statusWarning = 1; const Uint32 DVPSIPCMessage::statusError = 2; // client type constants const Uint32 DVPSIPCMessage::clientOther = 0; const Uint32 DVPSIPCMessage::clientStoreSCP = 1; const Uint32 DVPSIPCMessage::clientStoreSCU = 2; const Uint32 DVPSIPCMessage::clientPrintSCP = 3; const Uint32 DVPSIPCMessage::clientPrintSCU = 4; const Uint32 DVPSIPCMessage::clientQRSCP = 5; DVPSIPCMessage::DVPSIPCMessage() : messageType(OK) , payloadUsed(PAYLOAD_OFFSET) , payloadAllocated(PAYLOAD_ALLOCATION_UNIT) , payloadReadOffset(PAYLOAD_OFFSET) , payload(NULL) { payload = new unsigned char[payloadAllocated]; } DVPSIPCMessage::DVPSIPCMessage(const DVPSIPCMessage& copy) : messageType(copy.messageType) , payloadUsed(copy.payloadUsed) , payloadAllocated(copy.payloadAllocated) , payloadReadOffset(copy.payloadReadOffset) , payload(NULL) { payload = new unsigned char[payloadAllocated]; OFBitmanipTemplate::copyMem(copy.payload, payload, payloadUsed); } DVPSIPCMessage::~DVPSIPCMessage() { delete[] payload; } DVPSIPCMessage& DVPSIPCMessage::operator=(const DVPSIPCMessage& copy) { messageType = copy.messageType; payloadUsed = copy.payloadUsed; payloadReadOffset = copy.payloadReadOffset; if (payloadAllocated < payloadUsed) { delete[] payload; payloadAllocated = copy.payloadAllocated; payload = new unsigned char[payloadAllocated]; } OFBitmanipTemplate::copyMem(copy.payload, payload, payloadUsed); return *this; } void DVPSIPCMessage::resizePayload(Uint32 i) { Uint32 requiredSize = payloadUsed+i; if (requiredSize < payloadAllocated) return; while (payloadAllocated < requiredSize) payloadAllocated += PAYLOAD_ALLOCATION_UNIT; unsigned char *newpayload = new unsigned char[payloadAllocated]; OFBitmanipTemplate::copyMem(payload, newpayload, payloadUsed); delete[] payload; payload = newpayload; return; } void DVPSIPCMessage::addStringToPayload(const char *str) { Uint32 length = 0; if (str) length = strlen(str); else str = ""; Uint32 padBytes = 4 - (length % 4); resizePayload(sizeof(Uint32)+length+padBytes); // write string length addIntToPayload(length+padBytes); // write string strcpy((char *)(payload + payloadUsed), str); payloadUsed += length; // write pad bytes for (Uint32 i=0; i < padBytes; i++) *(payload + payloadUsed++) = 0; return; } void DVPSIPCMessage::addIntToPayload(Uint32 i) { resizePayload(sizeof(Uint32)); unsigned char *target = payload + payloadUsed; // write integer value *(Uint32 *)target = i; // and swap to big endian swapIfNecessary(EBO_BigEndian, gLocalByteOrder, target, sizeof(Uint32), sizeof(Uint32)); payloadUsed += sizeof(Uint32); return; } OFBool DVPSIPCMessage::extractStringFromPayload(OFString& str) { Uint32 length = 0; if (! extractIntFromPayload(length)) return OFFalse; // check if we have sufficient data available if (payloadReadOffset + length > payloadUsed) return OFFalse; str = (const char *)(payload+payloadReadOffset); // guaranteed to be zero terminated string payloadReadOffset += length; return OFTrue; } OFBool DVPSIPCMessage::extractIntFromPayload(Uint32& i) { // check if we have sufficient data available if (payloadReadOffset + sizeof(Uint32) > payloadUsed) return OFFalse; // copy integer into temporary buffer and adjust byte order there unsigned char *temp = new unsigned char[sizeof(Uint32)+8]; // allocate a bit more than needed to be safe OFBitmanipTemplate::copyMem(payload+payloadReadOffset, temp, sizeof(Uint32)); swapIfNecessary(gLocalByteOrder, EBO_BigEndian, temp, sizeof(Uint32), sizeof(Uint32)); payloadReadOffset += sizeof(Uint32); i = *(Uint32 *)temp; delete[] temp; return OFTrue; } void DVPSIPCMessage::rewindPayload() { payloadReadOffset = PAYLOAD_OFFSET; } void DVPSIPCMessage::erasePayload() { payloadUsed = PAYLOAD_OFFSET; } OFBool DVPSIPCMessage::send(DcmTransportConnection &connection) { // adjust message type and length *(Uint32 *)payload = messageType; *(Uint32 *)(payload + sizeof(Uint32)) = (payloadUsed - PAYLOAD_OFFSET); swapIfNecessary(EBO_BigEndian, gLocalByteOrder, payload, 2*sizeof(Uint32), sizeof(Uint32)); // send if (connection.write(payload, (size_t)payloadUsed) <= 0) return OFFalse; return OFTrue; } OFBool DVPSIPCMessage::receive(DcmTransportConnection &connection) { payloadReadOffset = PAYLOAD_OFFSET; // read message type and payload length if (connection.read(payload, 2*sizeof(Uint32)) <= 0) return OFFalse; swapIfNecessary(gLocalByteOrder, EBO_BigEndian, payload, 2*sizeof(Uint32), sizeof(Uint32)); messageType = *(Uint32 *)payload; payloadUsed = *(Uint32 *)(payload+sizeof(Uint32)); // check if we need to allocate more memory Uint32 requiredSize = payloadUsed + PAYLOAD_OFFSET; if (requiredSize > payloadAllocated) { delete[] payload; while (payloadAllocated < requiredSize) payloadAllocated += PAYLOAD_ALLOCATION_UNIT; payload = new unsigned char[payloadAllocated]; } // read payload if any if (payloadUsed > 0) { if (connection.read(payload+PAYLOAD_OFFSET, (size_t)payloadUsed) <= 0) { payloadUsed = PAYLOAD_OFFSET; return OFFalse; } else { payloadUsed += PAYLOAD_OFFSET; return OFTrue; } } else payloadUsed = PAYLOAD_OFFSET; return OFTrue; } /* --------------- class DVPSIPCClient --------------- */ DVPSIPCClient::DVPSIPCClient(Uint32 clientType, const char *txt, int thePort, OFBool keepOpen) : port(thePort) , serverActive(OFTrue) , applicationID(0) , keepConnectionOpen(keepOpen) , connection(NULL) { DVPSIPCMessage msg; msg.setMessageType(DVPSIPCMessage::requestApplicationID); msg.addIntToPayload(clientType); msg.addIntToPayload(DVPSIPCMessage::statusOK); msg.addStringToPayload(txt); if (performTransaction(msg)) { if ((msg.getMessageType() != DVPSIPCMessage::assignApplicationID) || (! msg.extractIntFromPayload(applicationID))) { // protocol violation serverActive = OFFalse; } } else { serverActive = OFFalse; } return; } DVPSIPCClient::~DVPSIPCClient() { if (connection) { connection->close(); delete connection; } } void DVPSIPCClient::requestConnection() { if (connection) return; // connection already open int s = socket(AF_INET, SOCK_STREAM, 0); if (s < 0) return; struct hostent *hp = gethostbyname("localhost"); if (NULL == hp) return; struct sockaddr_in server; server.sin_family = AF_INET; server.sin_port = (unsigned short) htons(port); memcpy(&server.sin_addr, hp->h_addr, (size_t) hp->h_length); if (connect(s, (struct sockaddr *) & server, sizeof(server)) < 0) { #ifdef HAVE_WINSOCK_H (void) shutdown(s, 1 /* SD_SEND */); (void) closesocket(s); #else (void) close(s); #endif return; } connection = new DcmTCPConnection(s); } OFBool DVPSIPCClient::performTransaction(DVPSIPCMessage& msg) { if (!serverActive) return OFFalse; requestConnection(); // this would be the right place to retry connections if (connection == NULL) return OFFalse; OFBool result = msg.send(*connection); if (result) result = msg.receive(*connection); if (! keepConnectionOpen) { connection->close(); delete connection; connection = NULL; } return result; } void DVPSIPCClient::notifyApplicationTerminates(Uint32 status) { DVPSIPCMessage msg; msg.setMessageType(DVPSIPCMessage::applicationTerminates); msg.addIntToPayload(applicationID); msg.addIntToPayload(status); performTransaction(msg); } void DVPSIPCClient::notifyReceivedUnencryptedDICOMConnection(Uint32 status, const char *txt) { DVPSIPCMessage msg; msg.setMessageType(DVPSIPCMessage::receivedUnencryptedDICOMConnection); msg.addIntToPayload(applicationID); msg.addIntToPayload(status); msg.addStringToPayload(txt); performTransaction(msg); } void DVPSIPCClient::notifyReceivedEncryptedDICOMConnection(Uint32 status, const char *txt) { DVPSIPCMessage msg; msg.setMessageType(DVPSIPCMessage::receivedEncryptedDICOMConnection); msg.addIntToPayload(applicationID); msg.addIntToPayload(status); msg.addStringToPayload(txt); performTransaction(msg); } void DVPSIPCClient::notifyConnectionClosed(Uint32 status) { DVPSIPCMessage msg; msg.setMessageType(DVPSIPCMessage::connectionClosed); msg.addIntToPayload(applicationID); msg.addIntToPayload(status); performTransaction(msg); } void DVPSIPCClient::notifyConnectionAborted(Uint32 status, const char *txt) { DVPSIPCMessage msg; msg.setMessageType(DVPSIPCMessage::connectionAborted); msg.addIntToPayload(applicationID); msg.addIntToPayload(status); msg.addStringToPayload(txt); performTransaction(msg); } void DVPSIPCClient::notifyRequestedUnencryptedDICOMConnection(Uint32 status, const char *txt) { DVPSIPCMessage msg; msg.setMessageType(DVPSIPCMessage::requestedUnencryptedDICOMConnection); msg.addIntToPayload(applicationID); msg.addIntToPayload(status); msg.addStringToPayload(txt); performTransaction(msg); } void DVPSIPCClient::notifyRequestedEncryptedDICOMConnection(Uint32 status, const char *txt) { DVPSIPCMessage msg; msg.setMessageType(DVPSIPCMessage::requestedEncryptedDICOMConnection); msg.addIntToPayload(applicationID); msg.addIntToPayload(status); msg.addStringToPayload(txt); performTransaction(msg); } void DVPSIPCClient::notifyReceivedDICOMObject(Uint32 status, const char *txt) { DVPSIPCMessage msg; msg.setMessageType(DVPSIPCMessage::receivedDICOMObject); msg.addIntToPayload(applicationID); msg.addIntToPayload(status); msg.addStringToPayload(txt); performTransaction(msg); } void DVPSIPCClient::notifySentDICOMObject(Uint32 status, const char *txt) { DVPSIPCMessage msg; msg.setMessageType(DVPSIPCMessage::sentDICOMObject); msg.addIntToPayload(applicationID); msg.addIntToPayload(status); msg.addStringToPayload(txt); performTransaction(msg); } /* * $Log: dvpsmsg.cc,v $ * Revision 1.12 2010-10-14 13:14:32 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.11 2005/12/08 15:46:35 meichel * Changed include path schema for all DCMTK header files * * Revision 1.10 2001/06/05 10:30:56 joergr * Replaced some #ifdef _WIN32 statements by #ifdef HAVE_WINDOWS_H or #ifdef * __CYGWIN__ respectively to reflect the fact that the latest Cygwin/gcc * version does not define _WIN32 any more. * * Revision 1.9 2001/06/01 15:50:33 meichel * Updated copyright header * * Revision 1.8 2000/12/19 12:12:53 meichel * Inclusion of TCP header files now protected by extern "C", needed on Ultrix * * Revision 1.7 2000/12/12 16:45:40 meichel * Minor changes to keep gcc 2.7.x on SunOS 4.1.3 happy * * Revision 1.6 2000/11/14 13:27:15 meichel * Fixed system include files for Linux. * * Revision 1.5 2000/11/08 18:38:23 meichel * Updated dcmpstat IPC protocol for additional message parameters * * Revision 1.4 2000/10/23 12:19:52 joergr * Replaced non-Unix style newline in preprocessor statement. * * Revision 1.3 2000/10/16 11:43:38 joergr * Added explicit typecast to avoid compiler warnings (Sun CC 2.0.1). * * Revision 1.2 2000/10/11 16:16:25 meichel * Updated includes for Win32 environment * * Revision 1.1 2000/10/10 12:24:41 meichel * Added extensions for IPC message communication * * */ dcmtk-3.6.0/dcmpstat/libsrc/Makefile.in0000644000310500011400000000336011265112555017206 0ustar joergrdicom3# # Makefile for dcmpstat/libsrc # @SET_MAKE@ SHELL = /bin/sh VPATH = @srcdir@:@top_srcdir@/include:@top_srcdir@/@configdir@/include srcdir = @srcdir@ top_srcdir = @top_srcdir@ configdir = @top_srcdir@/@configdir@ include $(configdir)/@common_makefile@ dcmdatadir = $(top_srcdir)/../dcmdata ofstddir = $(top_srcdir)/../ofstd oflogdir = $(top_srcdir)/../oflog dcmimgledir = $(top_srcdir)/../dcmimgle dcmsrdir = $(top_srcdir)/../dcmsr dcmqrdbdir = $(top_srcdir)/../dcmqrdb dcmnetdir = $(top_srcdir)/../dcmnet dcmsigndir = $(top_srcdir)/../dcmsign dcmtlsdir = $(top_srcdir)/../dcmtls LOCALINCLUDES = -I$(ofstddir)/include -I$(oflogdir)/include -I$(dcmdatadir)/include \ -I$(dcmimgledir)/include -I$(dcmsrdir)/include -I$(dcmqrdbdir)/include \ -I$(dcmnetdir)/include -I$(dcmsigndir)/include -I$(dcmtlsdir)/include LOCALDEFS = objs = dvpsal.o dvpsgal.o dvpsgr.o dvpsovl.o dvpsrs.o dvpstx.o \ dvpsall.o dvpsgl.o dvpsgrl.o dvpsri.o dvpsrsl.o dvpstxl.o \ dvpsga.o dvpsgll.o dvpsov.o dvpsril.o dvpstat.o dviface.o \ dvpscu.o dvpscul.o dvpsvl.o dvpsvll.o dvpsvw.o dvpsvwl.o \ dvpsda.o dvpsdal.o dvpssv.o dvpssvl.o dvpspl.o \ dvpsib.o dvpsibl.o dvpssp.o dvpspr.o dvpscf.o dvpshlp.o \ dvpspll.o dvpsab.o dvpsabl.o dvpsspl.o dvpsprt.o dvpsfs.o \ dvpsmsg.o dvsighdl.o dcmpstat.o dvpspl2.o library = libdcmpstat.$(LIBEXT) all: $(library) install: $(library) $(configdir)/mkinstalldirs $(DESTDIR)$(libdir) $(INSTALL_DATA) $(library) $(DESTDIR)$(libdir)/$(library) $(RANLIB) $(DESTDIR)$(libdir)/$(library) $(library): $(objs) $(AR) $(ARFLAGS) $@ $(objs) $(RANLIB) $@ clean: rm -f $(objs) $(library) $(TRASH) distclean: rm -f $(objs) $(library) $(DISTTRASH) dependencies: $(CXX) -MM $(defines) $(includes) $(CPPFLAGS) $(CXXFLAGS) *.cc > $(DEP) include $(DEP) dcmtk-3.6.0/dcmpstat/libsrc/dvpstxl.cc0000644000310500011400000001235011455601071017150 0ustar joergrdicom3/* * * Copyright (C) 1998-2010, 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: DVPSTextObject_PList * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:14:33 $ * CVS/RCS Revision: $Revision: 1.13 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmpstat/dvpstxl.h" #include "dcmtk/dcmpstat/dvpstx.h" /* for DVPSTextObject */ DVPSTextObject_PList::DVPSTextObject_PList() : list_() { } DVPSTextObject_PList::DVPSTextObject_PList(const DVPSTextObject_PList &arg) : list_() { OFListConstIterator(DVPSTextObject *) first = arg.list_.begin(); OFListConstIterator(DVPSTextObject *) last = arg.list_.end(); while (first != last) { list_.push_back((*first)->clone()); ++first; } } DVPSTextObject_PList::~DVPSTextObject_PList() { clear(); } void DVPSTextObject_PList::clear() { OFListIterator(DVPSTextObject *) first = list_.begin(); OFListIterator(DVPSTextObject *) last = list_.end(); while (first != last) { delete (*first); first = list_.erase(first); } } OFCondition DVPSTextObject_PList::read(DcmItem &dset) { OFCondition result = EC_Normal; DcmStack stack; DVPSTextObject *newObject = NULL; DcmSequenceOfItems *dseq=NULL; DcmItem *ditem=NULL; if (EC_Normal == dset.search(DCM_TextObjectSequence, stack, ESM_fromHere, OFFalse)) { dseq=(DcmSequenceOfItems *)stack.top(); if (dseq) { unsigned long numItems = dseq->card(); for (unsigned int i=0; igetItem(i); newObject = new DVPSTextObject(); if (newObject && ditem) { result = newObject->read(*ditem); list_.push_back(newObject); } else result = EC_MemoryExhausted; } } } return result; } OFCondition DVPSTextObject_PList::write(DcmItem &dset) { if (size()==0) return EC_Normal; // don't write empty Sequence OFCondition result = EC_Normal; DcmSequenceOfItems *dseq=NULL; DcmItem *ditem=NULL; dseq = new DcmSequenceOfItems(DCM_TextObjectSequence); if (dseq) { OFListIterator(DVPSTextObject *) first = list_.begin(); OFListIterator(DVPSTextObject *) last = list_.end(); while (first != last) { if (result==EC_Normal) { ditem = new DcmItem(); if (ditem) { result = (*first)->write(*ditem); if (result==EC_Normal) dseq->insert(ditem); else delete ditem; } else result = EC_MemoryExhausted; } ++first; } if (result==EC_Normal) dset.insert(dseq, OFTrue /*replaceOld*/); else delete dseq; } else result = EC_MemoryExhausted; return result; } DVPSTextObject *DVPSTextObject_PList::getTextObject(size_t idx) { OFListIterator(DVPSTextObject *) first = list_.begin(); OFListIterator(DVPSTextObject *) last = list_.end(); while (first != last) { if (idx==0) return *first; idx--; ++first; } return NULL; } void DVPSTextObject_PList::addTextObject(DVPSTextObject *text) { if (text) list_.push_back(text); } DVPSTextObject *DVPSTextObject_PList::removeTextObject(size_t idx) { OFListIterator(DVPSTextObject *) first = list_.begin(); OFListIterator(DVPSTextObject *) last = list_.end(); while (first != last) { if (idx==0) { DVPSTextObject *result = *first; list_.erase(first); return result; } idx--; ++first; } return NULL; } /* * $Log: dvpstxl.cc,v $ * Revision 1.13 2010-10-14 13:14:33 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.12 2009-11-24 14:12:59 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.11 2005-12-08 15:46:54 meichel * Changed include path schema for all DCMTK header files * * Revision 1.10 2004/02/04 15:57:49 joergr * Removed acknowledgements with e-mail addresses from CVS log. * * Revision 1.9 2003/06/12 18:23:11 joergr * Modified code to use const_iterators where appropriate (required for STL). * * Revision 1.8 2003/06/04 10:18:07 meichel * Replaced private inheritance from template with aggregation * * Revision 1.7 2001/11/28 13:57:07 joergr * Check return value of DcmItem::insert() statements where appropriate to * avoid memory leaks when insert procedure fails. * * Revision 1.6 2001/09/26 15:36:35 meichel * Adapted dcmpstat to class OFCondition * * Revision 1.5 2001/06/01 15:50:41 meichel * Updated copyright header * * Revision 1.4 2000/06/02 16:01:09 meichel * Adapted all dcmpstat classes to use OFConsole for log and error output * * Revision 1.3 2000/03/08 16:29:13 meichel * Updated copyright header. * * Revision 1.2 1998/12/14 16:10:49 meichel * Implemented Presentation State interface for graphic layers, * text and graphic annotations, presentation LUTs. * * Revision 1.1 1998/11/27 14:50:49 meichel * Initial Release. * * */ dcmtk-3.6.0/dcmpstat/libsrc/Makefile.dep0000644000310500011400000114322411465014456017360 0ustar joergrdicom3dcmpstat.o: dcmpstat.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmpstat/dcmpstat.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../dcmdata/include/dcmtk/dcmdata/dctk.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../dcmdata/include/dcmtk/dcmdata/dcswap.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dcxfer.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvr.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../dcmdata/include/dcmtk/dcmdata/dcistrma.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dcostrma.h \ ../../dcmdata/include/dcmtk/dcmdata/dcuid.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvm.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h \ ../../dcmdata/include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmdata/include/dcmtk/dcmdata/dctag.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdicent.h \ ../../dcmdata/include/dcmtk/dcmdata/dchashdi.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdict.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdeftag.h \ ../../dcmdata/include/dcmtk/dcmdata/dcobject.h \ ../../dcmdata/include/dcmtk/dcmdata/dcstack.h \ ../../dcmdata/include/dcmtk/dcmdata/dcelem.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../../dcmdata/include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpcache.h \ ../../dcmdata/include/dcmtk/dcmdata/dcmetinf.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdatset.h \ ../../dcmdata/include/dcmtk/dcmdata/dcsequen.h \ ../../dcmdata/include/dcmtk/dcmdata/dcfilefo.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdicdir.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdirrec.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrulup.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrul.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpixseq.h \ ../../dcmdata/include/dcmtk/dcmdata/dcofsetl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcbytstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrae.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvras.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrcs.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrda.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrds.h \ ../../ofstd/include/dcmtk/ofstd/ofvector.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrdt.h \ ../../ofstd/include/dcmtk/ofstd/ofdatime.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvris.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrtm.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrui.h \ ../../dcmdata/include/dcmtk/dcmdata/dcchrstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlo.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlt.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrpn.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsh.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrst.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrut.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrobow.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpixel.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrpobw.h \ ../../dcmdata/include/dcmtk/dcmdata/dcovlay.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrat.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrss.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrus.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrfl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrfd.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrof.h \ ../../dcmdata/include/dcmtk/dcmdata/cmdlnarg.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmpstat/dvpstyp.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmpstat/dvpsovl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../include/dcmtk/dcmpstat/dvpsgll.h ../include/dcmtk/dcmpstat/dvpsrsl.h \ ../include/dcmtk/dcmpstat/dvpsall.h ../include/dcmtk/dcmpstat/dvpsgal.h \ ../include/dcmtk/dcmpstat/dvpscul.h ../include/dcmtk/dcmpstat/dvpsvll.h \ ../include/dcmtk/dcmpstat/dvpsvwl.h ../include/dcmtk/dcmpstat/dvpsdal.h \ ../include/dcmtk/dcmpstat/dvpssvl.h ../include/dcmtk/dcmpstat/dvpspl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrus.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrui.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlo.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmpstat/dvpsdef.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../include/dcmtk/dcmpstat/dvpscu.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../include/dcmtk/dcmpstat/dvpsvl.h ../include/dcmtk/dcmpstat/dvpsvw.h \ ../include/dcmtk/dcmpstat/dvpsov.h ../include/dcmtk/dcmpstat/dvpsda.h \ ../include/dcmtk/dcmpstat/dvpsril.h ../include/dcmtk/dcmpstat/dvpssv.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrds.h \ ../include/dcmtk/dcmpstat/dvpshlp.h \ ../../dcmdata/include/dcmtk/dcmdata/dcsequen.h \ ../include/dcmtk/dcmpstat/dvpsgl.h ../include/dcmtk/dcmpstat/dvpsrs.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrae.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsh.h \ ../include/dcmtk/dcmpstat/dvpsal.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrcs.h \ ../include/dcmtk/dcmpstat/dvpsga.h ../include/dcmtk/dcmpstat/dvpstxl.h \ ../include/dcmtk/dcmpstat/dvpsgrl.h ../include/dcmtk/dcmpstat/dvpsri.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvris.h \ ../include/dcmtk/dcmpstat/dvpstx.h ../include/dcmtk/dcmpstat/dvpsgr.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h dviface.o: dviface.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmpstat/dviface.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmpstat/dvpscf.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmpstat/dvpstyp.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../include/dcmtk/dcmpstat/dvpstat.h \ ../include/dcmtk/dcmpstat/dcmpstat.h \ ../../dcmdata/include/dcmtk/dcmdata/dctk.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../dcmdata/include/dcmtk/dcmdata/dcswap.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dcxfer.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvr.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../dcmdata/include/dcmtk/dcmdata/dcistrma.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dcostrma.h \ ../../dcmdata/include/dcmtk/dcmdata/dcuid.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvm.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h \ ../../dcmdata/include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmdata/include/dcmtk/dcmdata/dctag.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdicent.h \ ../../dcmdata/include/dcmtk/dcmdata/dchashdi.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdict.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdeftag.h \ ../../dcmdata/include/dcmtk/dcmdata/dcobject.h \ ../../dcmdata/include/dcmtk/dcmdata/dcstack.h \ ../../dcmdata/include/dcmtk/dcmdata/dcelem.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../../dcmdata/include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpcache.h \ ../../dcmdata/include/dcmtk/dcmdata/dcmetinf.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdatset.h \ ../../dcmdata/include/dcmtk/dcmdata/dcsequen.h \ ../../dcmdata/include/dcmtk/dcmdata/dcfilefo.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdicdir.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdirrec.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrulup.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrul.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpixseq.h \ ../../dcmdata/include/dcmtk/dcmdata/dcofsetl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcbytstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrae.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvras.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrcs.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrda.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrds.h \ ../../ofstd/include/dcmtk/ofstd/ofvector.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrdt.h \ ../../ofstd/include/dcmtk/ofstd/ofdatime.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvris.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrtm.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrui.h \ ../../dcmdata/include/dcmtk/dcmdata/dcchrstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlo.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlt.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrpn.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsh.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrst.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrut.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrobow.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpixel.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrpobw.h \ ../../dcmdata/include/dcmtk/dcmdata/dcovlay.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrat.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrss.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrus.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrfl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrfd.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrof.h \ ../../dcmdata/include/dcmtk/dcmdata/cmdlnarg.h \ ../include/dcmtk/dcmpstat/dvpsovl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../include/dcmtk/dcmpstat/dvpsgll.h ../include/dcmtk/dcmpstat/dvpsrsl.h \ ../include/dcmtk/dcmpstat/dvpsall.h ../include/dcmtk/dcmpstat/dvpsgal.h \ ../include/dcmtk/dcmpstat/dvpscul.h ../include/dcmtk/dcmpstat/dvpsvll.h \ ../include/dcmtk/dcmpstat/dvpsvwl.h ../include/dcmtk/dcmpstat/dvpsdal.h \ ../include/dcmtk/dcmpstat/dvpssvl.h ../include/dcmtk/dcmpstat/dvpspl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrus.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrui.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlo.h \ ../../dcmqrdb/include/dcmtk/dcmqrdb/dcmqridx.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../dcmnet/include/dcmtk/dcmnet/dicom.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../dcmnet/include/dcmtk/dcmnet/cond.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../../dcmnet/include/dcmtk/dcmnet/dcompat.h \ ../../ofstd/include/dcmtk/ofstd/ofbmanip.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../dcmdata/include/dcmtk/dcmdata/dcuid.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdatset.h \ ../../dcmdata/include/dcmtk/dcmdata/dcuid.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdeftag.h \ ../../dcmqrdb/include/dcmtk/dcmqrdb/dcmqrdbi.h \ ../../dcmqrdb/include/dcmtk/dcmqrdb/dcmqrdba.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmnet/include/dcmtk/dcmnet/dimse.h \ ../../dcmnet/include/dcmtk/dcmnet/dicom.h \ ../../dcmnet/include/dcmtk/dcmnet/lst.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../dcmnet/include/dcmtk/dcmnet/dul.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../dcmnet/include/dcmtk/dcmnet/extneg.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmnet/include/dcmtk/dcmnet/dcuserid.h \ ../../dcmnet/include/dcmtk/dcmnet/assoc.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdatset.h \ ../../ofstd/include/dcmtk/ofstd/offname.h \ ../include/dcmtk/dcmpstat/dvcache.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../dcmqrdb/include/dcmtk/dcmqrdb/dcmqrdbi.h \ ../include/dcmtk/dcmpstat/dvpsdef.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofbmanip.h \ ../../ofstd/include/dcmtk/ofstd/ofdatime.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../dcmimgle/include/dcmtk/dcmimgle/digsdfn.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../dcmimgle/include/dcmtk/dcmimgle/didispfn.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../dcmimgle/include/dcmtk/dcmimgle/diciefn.h \ ../../dcmimgle/include/dcmtk/dcmimgle/dicielut.h \ ../../dcmimgle/include/dcmtk/dcmimgle/didislut.h \ ../../dcmimgle/include/dcmtk/dcmimgle/dibaslut.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../dcmimgle/include/dcmtk/dcmimgle/diutils.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../dcmnet/include/dcmtk/dcmnet/diutil.h \ ../../dcmnet/include/dcmtk/dcmnet/dimse.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../include/dcmtk/dcmpstat/dvpssp.h ../include/dcmtk/dcmpstat/dvpspll.h \ ../../dcmnet/include/dcmtk/dcmnet/dimse.h \ ../include/dcmtk/dcmpstat/dvpsibl.h ../include/dcmtk/dcmpstat/dvpsabl.h \ ../include/dcmtk/dcmpstat/dvpspr.h ../include/dcmtk/dcmpstat/dvpshlp.h \ ../../dcmdata/include/dcmtk/dcmdata/dcsequen.h \ ../../dcmimgle/include/dcmtk/dcmimgle/dcmimage.h \ ../../dcmimgle/include/dcmtk/dcmimgle/dimoimg.h \ ../../dcmimgle/include/dcmtk/dcmimgle/diimage.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../../dcmdata/include/dcmtk/dcmdata/dcfcache.h \ ../../dcmimgle/include/dcmtk/dcmimgle/diovlay.h \ ../../dcmimgle/include/dcmtk/dcmimgle/diobjcou.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../dcmimgle/include/dcmtk/dcmimgle/diovdat.h \ ../../dcmimgle/include/dcmtk/dcmimgle/diovpln.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../dcmimgle/include/dcmtk/dcmimgle/dimopx.h \ ../../dcmimgle/include/dcmtk/dcmimgle/dipixel.h \ ../../dcmimgle/include/dcmtk/dcmimgle/dimomod.h \ ../../dcmimgle/include/dcmtk/dcmimgle/diluptab.h \ ../../dcmdata/include/dcmtk/dcmdata/dctagkey.h \ ../../dcmimgle/include/dcmtk/dcmimgle/dimoopx.h \ ../include/dcmtk/dcmpstat/dvsighdl.h \ ../../dcmsign/include/dcmtk/dcmsign/sicertvf.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../dcmsign/include/dcmtk/dcmsign/sitypes.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../../dcmsign/include/dcmtk/dcmsign/dcsignat.h \ ../../dcmdata/include/dcmtk/dcmdata/dcxfer.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../dcmsr/include/dcmtk/dcmsr/dsrdoc.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../dcmsr/include/dcmtk/dcmsr/dsrdoctr.h \ ../../dcmsr/include/dcmtk/dcmsr/dsrtree.h \ ../../dcmsr/include/dcmtk/dcmsr/dsrtypes.h \ ../../dcmdata/include/dcmtk/dcmdata/dctk.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../dcmsr/include/dcmtk/dcmsr/dsrtncsr.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../dcmsr/include/dcmtk/dcmsr/dsrdoctn.h \ ../../dcmsr/include/dcmtk/dcmsr/dsrcodvl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../../dcmsr/include/dcmtk/dcmsr/dsrcitem.h \ ../../dcmsr/include/dcmtk/dcmsr/dsrnumvl.h \ ../../dcmsr/include/dcmtk/dcmsr/dsrscovl.h \ ../../dcmsr/include/dcmtk/dcmsr/dsrscogr.h \ ../../dcmsr/include/dcmtk/dcmsr/dsrtlist.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../../dcmsr/include/dcmtk/dcmsr/dsrtcovl.h \ ../../dcmsr/include/dcmtk/dcmsr/dsrtcodt.h \ ../../dcmsr/include/dcmtk/dcmsr/dsrtcosp.h \ ../../dcmsr/include/dcmtk/dcmsr/dsrtcoto.h \ ../../dcmsr/include/dcmtk/dcmsr/dsrcomvl.h \ ../../dcmsr/include/dcmtk/dcmsr/dsrimgvl.h \ ../../dcmsr/include/dcmtk/dcmsr/dsrimgfr.h \ ../../dcmsr/include/dcmtk/dcmsr/dsrwavvl.h \ ../../dcmsr/include/dcmtk/dcmsr/dsrwavch.h \ ../../dcmsr/include/dcmtk/dcmsr/dsrsoprf.h \ ../../dcmdata/include/dcmtk/dcmdata/dctagkey.h \ ../../dcmsr/include/dcmtk/dcmsr/dsrcsidl.h \ ../../dcmsr/include/dcmtk/dcmsr/dsrcodvl.h \ ../../oflog/include/dcmtk/oflog/fileap.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/fstreams.h \ ../include/dcmtk/dcmpstat/dvpsib.h ../include/dcmtk/dcmpstat/dvpsab.h \ ../include/dcmtk/dcmpstat/dvpsov.h ../include/dcmtk/dcmpstat/dvpsgl.h \ ../include/dcmtk/dcmpstat/dvpsal.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrcs.h \ ../include/dcmtk/dcmpstat/dvpsga.h ../include/dcmtk/dcmpstat/dvpstxl.h \ ../include/dcmtk/dcmpstat/dvpsgrl.h ../include/dcmtk/dcmpstat/dvpsril.h \ ../include/dcmtk/dcmpstat/dvpscu.h ../include/dcmtk/dcmpstat/dvpsvl.h \ ../include/dcmtk/dcmpstat/dvpsvw.h ../include/dcmtk/dcmpstat/dvpsda.h \ ../include/dcmtk/dcmpstat/dvpssv.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrds.h \ ../include/dcmtk/dcmpstat/dvpsrs.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrae.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsh.h \ ../include/dcmtk/dcmpstat/dvpstx.h ../include/dcmtk/dcmpstat/dvpsgr.h \ ../include/dcmtk/dcmpstat/dvpsri.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvris.h \ ../../dcmqrdb/include/dcmtk/dcmqrdb/dcmqrdbi.h \ ../../dcmqrdb/include/dcmtk/dcmqrdb/dcmqrdbs.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../dcmtls/include/dcmtk/dcmtls/tlstrans.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../dcmnet/include/dcmtk/dcmnet/dcmtrans.h \ ../../dcmnet/include/dcmtk/dcmnet/dcmlayer.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../dcmtls/include/dcmtk/dcmtls/tlslayer.h \ ../../dcmnet/include/dcmtk/dcmnet/dcmlayer.h \ ../../oflog/include/dcmtk/oflog/oflog.h dvpsab.o: dvpsab.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdeftag.h \ ../../dcmdata/include/dcmtk/dcmdata/dctagkey.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../dcmdata/include/dcmtk/dcmdata/dcobject.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dcxfer.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvr.h \ ../../dcmdata/include/dcmtk/dcmdata/dctag.h \ ../../dcmdata/include/dcmtk/dcmdata/dcstack.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../dcmdata/include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpcache.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../include/dcmtk/dcmpstat/dvpsab.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrus.h \ ../../dcmdata/include/dcmtk/dcmdata/dcelem.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlo.h \ ../../dcmdata/include/dcmtk/dcmdata/dcchrstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dcbytstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrui.h \ ../include/dcmtk/dcmpstat/dvpstyp.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmpstat/dvpsdef.h \ ../../oflog/include/dcmtk/oflog/oflog.h dvpsabl.o: dvpsabl.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdeftag.h \ ../../dcmdata/include/dcmtk/dcmdata/dctagkey.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../include/dcmtk/dcmpstat/dvpsabl.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../dcmdata/include/dcmtk/dcmdata/dcobject.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dcxfer.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvr.h \ ../../dcmdata/include/dcmtk/dcmdata/dctag.h \ ../../dcmdata/include/dcmtk/dcmdata/dcstack.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../dcmdata/include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpcache.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../include/dcmtk/dcmpstat/dvpstyp.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmpstat/dvpsab.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrus.h \ ../../dcmdata/include/dcmtk/dcmdata/dcelem.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlo.h \ ../../dcmdata/include/dcmtk/dcmdata/dcchrstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dcbytstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrui.h \ ../include/dcmtk/dcmpstat/dvpshlp.h \ ../../dcmdata/include/dcmtk/dcmdata/dcsequen.h dvpsal.o: dvpsal.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdeftag.h \ ../../dcmdata/include/dcmtk/dcmdata/dctagkey.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../include/dcmtk/dcmpstat/dvpsal.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../dcmdata/include/dcmtk/dcmdata/dcobject.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dcxfer.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvr.h \ ../../dcmdata/include/dcmtk/dcmdata/dctag.h \ ../../dcmdata/include/dcmtk/dcmdata/dcstack.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../dcmdata/include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpcache.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrcs.h \ ../../dcmdata/include/dcmtk/dcmdata/dcbytstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dcelem.h \ ../include/dcmtk/dcmpstat/dvpsdef.h \ ../../oflog/include/dcmtk/oflog/oflog.h dvpsall.o: dvpsall.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../include/dcmtk/dcmpstat/dvpsall.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../dcmdata/include/dcmtk/dcmdata/dcobject.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dcxfer.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvr.h \ ../../dcmdata/include/dcmtk/dcmdata/dctag.h \ ../../dcmdata/include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmdata/include/dcmtk/dcmdata/dcstack.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../dcmdata/include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpcache.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../include/dcmtk/dcmpstat/dvpstyp.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmpstat/dvpsal.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrcs.h \ ../../dcmdata/include/dcmtk/dcmdata/dcbytstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dcelem.h \ ../include/dcmtk/dcmpstat/dvpsovl.h ../include/dcmtk/dcmpstat/dvpsgll.h \ ../include/dcmtk/dcmpstat/dvpsdef.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../include/dcmtk/dcmpstat/dvpsov.h \ ../../dcmdata/include/dcmtk/dcmdata/dctk.h \ ../../dcmdata/include/dcmtk/dcmdata/dcswap.h \ ../../dcmdata/include/dcmtk/dcmdata/dcistrma.h \ ../../dcmdata/include/dcmtk/dcmdata/dcostrma.h \ ../../dcmdata/include/dcmtk/dcmdata/dcuid.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvm.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdicent.h \ ../../dcmdata/include/dcmtk/dcmdata/dchashdi.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdict.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdeftag.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../../dcmdata/include/dcmtk/dcmdata/dcmetinf.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdatset.h \ ../../dcmdata/include/dcmtk/dcmdata/dcsequen.h \ ../../dcmdata/include/dcmtk/dcmdata/dcfilefo.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdicdir.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdirrec.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrulup.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrul.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpixseq.h \ ../../dcmdata/include/dcmtk/dcmdata/dcofsetl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrae.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvras.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrcs.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrda.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrds.h \ ../../ofstd/include/dcmtk/ofstd/ofvector.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrdt.h \ ../../ofstd/include/dcmtk/ofstd/ofdatime.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvris.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrtm.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrui.h \ ../../dcmdata/include/dcmtk/dcmdata/dcchrstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlo.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlt.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrpn.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsh.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrst.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrut.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrobow.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpixel.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrpobw.h \ ../../dcmdata/include/dcmtk/dcmdata/dcovlay.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrat.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrss.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrus.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrfl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrfd.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrof.h \ ../../dcmdata/include/dcmtk/dcmdata/cmdlnarg.h \ ../include/dcmtk/dcmpstat/dvpsgl.h dvpscf.o: dvpscf.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmpstat/dvpscf.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmpstat/dvpstyp.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../ofstd/include/dcmtk/ofstd/ofconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../include/dcmtk/dcmpstat/dvpsdef.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h dvpscu.o: dvpscu.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmpstat/dvpscu.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmpstat/dvpstyp.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dctk.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../dcmdata/include/dcmtk/dcmdata/dcswap.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../../dcmdata/include/dcmtk/dcmdata/dcxfer.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvr.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../dcmdata/include/dcmtk/dcmdata/dcistrma.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dcostrma.h \ ../../dcmdata/include/dcmtk/dcmdata/dcuid.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvm.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h \ ../../dcmdata/include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmdata/include/dcmtk/dcmdata/dctag.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdicent.h \ ../../dcmdata/include/dcmtk/dcmdata/dchashdi.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdict.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdeftag.h \ ../../dcmdata/include/dcmtk/dcmdata/dcobject.h \ ../../dcmdata/include/dcmtk/dcmdata/dcstack.h \ ../../dcmdata/include/dcmtk/dcmdata/dcelem.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../../dcmdata/include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpcache.h \ ../../dcmdata/include/dcmtk/dcmdata/dcmetinf.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdatset.h \ ../../dcmdata/include/dcmtk/dcmdata/dcsequen.h \ ../../dcmdata/include/dcmtk/dcmdata/dcfilefo.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdicdir.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdirrec.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrulup.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrul.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpixseq.h \ ../../dcmdata/include/dcmtk/dcmdata/dcofsetl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcbytstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrae.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvras.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrcs.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrda.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrds.h \ ../../ofstd/include/dcmtk/ofstd/ofvector.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrdt.h \ ../../ofstd/include/dcmtk/ofstd/ofdatime.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvris.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrtm.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrui.h \ ../../dcmdata/include/dcmtk/dcmdata/dcchrstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlo.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlt.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrpn.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsh.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrst.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrut.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrobow.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpixel.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrpobw.h \ ../../dcmdata/include/dcmtk/dcmdata/dcovlay.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrat.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrss.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrus.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrfl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrfd.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrof.h \ ../../dcmdata/include/dcmtk/dcmdata/cmdlnarg.h \ ../../ofstd/include/dcmtk/ofstd/ofbmanip.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h dvpscul.o: dvpscul.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmpstat/dvpscul.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../dcmdata/include/dcmtk/dcmdata/dcobject.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dcxfer.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvr.h \ ../../dcmdata/include/dcmtk/dcmdata/dctag.h \ ../../dcmdata/include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmdata/include/dcmtk/dcmdata/dcstack.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../dcmdata/include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpcache.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../include/dcmtk/dcmpstat/dvpscu.h ../include/dcmtk/dcmpstat/dvpstyp.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h dvpsda.o: dvpsda.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../include/dcmtk/dcmpstat/dvpsda.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../dcmdata/include/dcmtk/dcmdata/dctk.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../dcmdata/include/dcmtk/dcmdata/dcswap.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dcxfer.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvr.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../dcmdata/include/dcmtk/dcmdata/dcistrma.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dcostrma.h \ ../../dcmdata/include/dcmtk/dcmdata/dcuid.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvm.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h \ ../../dcmdata/include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmdata/include/dcmtk/dcmdata/dctag.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdicent.h \ ../../dcmdata/include/dcmtk/dcmdata/dchashdi.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdict.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdeftag.h \ ../../dcmdata/include/dcmtk/dcmdata/dcobject.h \ ../../dcmdata/include/dcmtk/dcmdata/dcstack.h \ ../../dcmdata/include/dcmtk/dcmdata/dcelem.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../../dcmdata/include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpcache.h \ ../../dcmdata/include/dcmtk/dcmdata/dcmetinf.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdatset.h \ ../../dcmdata/include/dcmtk/dcmdata/dcsequen.h \ ../../dcmdata/include/dcmtk/dcmdata/dcfilefo.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdicdir.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdirrec.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrulup.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrul.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpixseq.h \ ../../dcmdata/include/dcmtk/dcmdata/dcofsetl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcbytstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrae.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvras.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrcs.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrda.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrds.h \ ../../ofstd/include/dcmtk/ofstd/ofvector.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrdt.h \ ../../ofstd/include/dcmtk/ofstd/ofdatime.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvris.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrtm.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrui.h \ ../../dcmdata/include/dcmtk/dcmdata/dcchrstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlo.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlt.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrpn.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsh.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrst.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrut.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrobow.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpixel.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrpobw.h \ ../../dcmdata/include/dcmtk/dcmdata/dcovlay.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrat.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrss.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrus.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrfl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrfd.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrof.h \ ../../dcmdata/include/dcmtk/dcmdata/cmdlnarg.h \ ../include/dcmtk/dcmpstat/dvpsril.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../include/dcmtk/dcmpstat/dvpstyp.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmpstat/dvpsri.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrui.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvris.h \ ../include/dcmtk/dcmpstat/dvpsrsl.h ../include/dcmtk/dcmpstat/dvpsdef.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../include/dcmtk/dcmpstat/dvpsrs.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrae.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsh.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h dvpsdal.o: dvpsdal.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmpstat/dvpsdal.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../dcmdata/include/dcmtk/dcmdata/dcobject.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dcxfer.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvr.h \ ../../dcmdata/include/dcmtk/dcmdata/dctag.h \ ../../dcmdata/include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmdata/include/dcmtk/dcmdata/dcstack.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../dcmdata/include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpcache.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../include/dcmtk/dcmpstat/dvpstyp.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmpstat/dvpsda.h \ ../../dcmdata/include/dcmtk/dcmdata/dctk.h \ ../../dcmdata/include/dcmtk/dcmdata/dcswap.h \ ../../dcmdata/include/dcmtk/dcmdata/dcistrma.h \ ../../dcmdata/include/dcmtk/dcmdata/dcostrma.h \ ../../dcmdata/include/dcmtk/dcmdata/dcuid.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvm.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdicent.h \ ../../dcmdata/include/dcmtk/dcmdata/dchashdi.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdict.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdeftag.h \ ../../dcmdata/include/dcmtk/dcmdata/dcelem.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../../dcmdata/include/dcmtk/dcmdata/dcmetinf.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdatset.h \ ../../dcmdata/include/dcmtk/dcmdata/dcsequen.h \ ../../dcmdata/include/dcmtk/dcmdata/dcfilefo.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdicdir.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdirrec.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrulup.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrul.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpixseq.h \ ../../dcmdata/include/dcmtk/dcmdata/dcofsetl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcbytstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrae.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvras.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrcs.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrda.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrds.h \ ../../ofstd/include/dcmtk/ofstd/ofvector.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrdt.h \ ../../ofstd/include/dcmtk/ofstd/ofdatime.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvris.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrtm.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrui.h \ ../../dcmdata/include/dcmtk/dcmdata/dcchrstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlo.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlt.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrpn.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsh.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrst.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrut.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrobow.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpixel.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrpobw.h \ ../../dcmdata/include/dcmtk/dcmdata/dcovlay.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrat.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrss.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrus.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrfl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrfd.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrof.h \ ../../dcmdata/include/dcmtk/dcmdata/cmdlnarg.h \ ../include/dcmtk/dcmpstat/dvpsril.h ../include/dcmtk/dcmpstat/dvpsri.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrui.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvris.h dvpsfs.o: dvpsfs.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmpstat/dvpsfs.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../dcmdata/include/dcmtk/dcmdata/dctk.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../dcmdata/include/dcmtk/dcmdata/dcswap.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dcxfer.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvr.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../dcmdata/include/dcmtk/dcmdata/dcistrma.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dcostrma.h \ ../../dcmdata/include/dcmtk/dcmdata/dcuid.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvm.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h \ ../../dcmdata/include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmdata/include/dcmtk/dcmdata/dctag.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdicent.h \ ../../dcmdata/include/dcmtk/dcmdata/dchashdi.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdict.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdeftag.h \ ../../dcmdata/include/dcmtk/dcmdata/dcobject.h \ ../../dcmdata/include/dcmtk/dcmdata/dcstack.h \ ../../dcmdata/include/dcmtk/dcmdata/dcelem.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../../dcmdata/include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpcache.h \ ../../dcmdata/include/dcmtk/dcmdata/dcmetinf.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdatset.h \ ../../dcmdata/include/dcmtk/dcmdata/dcsequen.h \ ../../dcmdata/include/dcmtk/dcmdata/dcfilefo.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdicdir.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdirrec.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrulup.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrul.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpixseq.h \ ../../dcmdata/include/dcmtk/dcmdata/dcofsetl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcbytstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrae.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvras.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrcs.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrda.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrds.h \ ../../ofstd/include/dcmtk/ofstd/ofvector.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrdt.h \ ../../ofstd/include/dcmtk/ofstd/ofdatime.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvris.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrtm.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrui.h \ ../../dcmdata/include/dcmtk/dcmdata/dcchrstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlo.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlt.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrpn.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsh.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrst.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrut.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrobow.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpixel.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrpobw.h \ ../../dcmdata/include/dcmtk/dcmdata/dcovlay.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrat.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrss.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrus.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrfl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrfd.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrof.h \ ../../dcmdata/include/dcmtk/dcmdata/cmdlnarg.h \ ../include/dcmtk/dcmpstat/dvpstyp.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../dcmnet/include/dcmtk/dcmnet/dimse.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../dcmnet/include/dcmtk/dcmnet/dicom.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../dcmnet/include/dcmtk/dcmnet/cond.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../../dcmnet/include/dcmtk/dcmnet/dcompat.h \ ../../ofstd/include/dcmtk/ofstd/ofbmanip.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../dcmdata/include/dcmtk/dcmdata/dcuid.h \ ../../dcmnet/include/dcmtk/dcmnet/lst.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../dcmnet/include/dcmtk/dcmnet/dul.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../dcmnet/include/dcmtk/dcmnet/extneg.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmnet/include/dcmtk/dcmnet/dcuserid.h \ ../../dcmnet/include/dcmtk/dcmnet/assoc.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdatset.h \ ../include/dcmtk/dcmpstat/dvpsdef.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmpstat/dvpshlp.h \ ../../dcmdata/include/dcmtk/dcmdata/dcsequen.h \ ../include/dcmtk/dcmpstat/dvpscf.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../include/dcmtk/dcmpstat/dvpspl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrus.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrui.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlo.h \ ../include/dcmtk/dcmpstat/dvpspll.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../include/dcmtk/dcmpstat/dvpssp.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../include/dcmtk/dcmpstat/dvpspll.h ../include/dcmtk/dcmpstat/dvpsibl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../include/dcmtk/dcmpstat/dvpsabl.h ../include/dcmtk/dcmpstat/dvpstat.h \ ../include/dcmtk/dcmpstat/dcmpstat.h \ ../include/dcmtk/dcmpstat/dvpsovl.h ../include/dcmtk/dcmpstat/dvpsgll.h \ ../include/dcmtk/dcmpstat/dvpsrsl.h ../include/dcmtk/dcmpstat/dvpsall.h \ ../include/dcmtk/dcmpstat/dvpsgal.h ../include/dcmtk/dcmpstat/dvpscul.h \ ../include/dcmtk/dcmpstat/dvpsvll.h ../include/dcmtk/dcmpstat/dvpsvwl.h \ ../include/dcmtk/dcmpstat/dvpsdal.h ../include/dcmtk/dcmpstat/dvpssvl.h \ ../include/dcmtk/dcmpstat/dvpspl.h ../include/dcmtk/dcmpstat/dvpspr.h \ ../include/dcmtk/dcmpstat/dvpsspl.h ../include/dcmtk/dcmpstat/dvpsib.h \ ../include/dcmtk/dcmpstat/dvpsab.h ../include/dcmtk/dcmpstat/dvpsov.h \ ../include/dcmtk/dcmpstat/dvpsgl.h ../include/dcmtk/dcmpstat/dvpsal.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrcs.h \ ../include/dcmtk/dcmpstat/dvpsga.h ../include/dcmtk/dcmpstat/dvpstxl.h \ ../include/dcmtk/dcmpstat/dvpsgrl.h ../include/dcmtk/dcmpstat/dvpsril.h \ ../include/dcmtk/dcmpstat/dvpscu.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../include/dcmtk/dcmpstat/dvpsvl.h ../include/dcmtk/dcmpstat/dvpsvw.h \ ../include/dcmtk/dcmpstat/dvpsda.h ../include/dcmtk/dcmpstat/dvpssv.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrds.h \ ../include/dcmtk/dcmpstat/dvpsrs.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrae.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsh.h \ ../include/dcmtk/dcmpstat/dvpstx.h ../include/dcmtk/dcmpstat/dvpsgr.h \ ../include/dcmtk/dcmpstat/dvpsri.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvris.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h dvpsga.o: dvpsga.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmpstat/dvpsga.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrcs.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../dcmdata/include/dcmtk/dcmdata/dcbytstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../dcmdata/include/dcmtk/dcmdata/dcelem.h \ ../../dcmdata/include/dcmtk/dcmdata/dcobject.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dcxfer.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvr.h \ ../../dcmdata/include/dcmtk/dcmdata/dctag.h \ ../../dcmdata/include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmdata/include/dcmtk/dcmdata/dcstack.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../include/dcmtk/dcmpstat/dvpstxl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpcache.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../include/dcmtk/dcmpstat/dvpsgrl.h ../include/dcmtk/dcmpstat/dvpsril.h \ ../include/dcmtk/dcmpstat/dvpstyp.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmpstat/dvpsri.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrui.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvris.h \ ../include/dcmtk/dcmpstat/dvpstyp.h ../include/dcmtk/dcmpstat/dvpsdef.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../include/dcmtk/dcmpstat/dvpstx.h \ ../../dcmdata/include/dcmtk/dcmdata/dctk.h \ ../../dcmdata/include/dcmtk/dcmdata/dcswap.h \ ../../dcmdata/include/dcmtk/dcmdata/dcistrma.h \ ../../dcmdata/include/dcmtk/dcmdata/dcostrma.h \ ../../dcmdata/include/dcmtk/dcmdata/dcuid.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvm.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdicent.h \ ../../dcmdata/include/dcmtk/dcmdata/dchashdi.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdict.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdeftag.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../../dcmdata/include/dcmtk/dcmdata/dcmetinf.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdatset.h \ ../../dcmdata/include/dcmtk/dcmdata/dcsequen.h \ ../../dcmdata/include/dcmtk/dcmdata/dcfilefo.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdicdir.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdirrec.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrulup.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrul.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpixseq.h \ ../../dcmdata/include/dcmtk/dcmdata/dcofsetl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrae.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvras.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrcs.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrda.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrds.h \ ../../ofstd/include/dcmtk/ofstd/ofvector.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrdt.h \ ../../ofstd/include/dcmtk/ofstd/ofdatime.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvris.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrtm.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrui.h \ ../../dcmdata/include/dcmtk/dcmdata/dcchrstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlo.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlt.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrpn.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsh.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrst.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrut.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrobow.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpixel.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrpobw.h \ ../../dcmdata/include/dcmtk/dcmdata/dcovlay.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrat.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrss.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrus.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrfl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrfd.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrof.h \ ../../dcmdata/include/dcmtk/dcmdata/cmdlnarg.h \ ../include/dcmtk/dcmpstat/dvpsgr.h dvpsgal.o: dvpsgal.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmpstat/dvpsgal.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../dcmdata/include/dcmtk/dcmdata/dcobject.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dcxfer.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvr.h \ ../../dcmdata/include/dcmtk/dcmdata/dctag.h \ ../../dcmdata/include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmdata/include/dcmtk/dcmdata/dcstack.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../dcmdata/include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpcache.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../include/dcmtk/dcmpstat/dvpstyp.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmpstat/dvpsga.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrcs.h \ ../../dcmdata/include/dcmtk/dcmdata/dcbytstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dcelem.h \ ../include/dcmtk/dcmpstat/dvpstxl.h ../include/dcmtk/dcmpstat/dvpsgrl.h \ ../include/dcmtk/dcmpstat/dvpsril.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmpstat/dvpstx.h \ ../../dcmdata/include/dcmtk/dcmdata/dctk.h \ ../../dcmdata/include/dcmtk/dcmdata/dcswap.h \ ../../dcmdata/include/dcmtk/dcmdata/dcistrma.h \ ../../dcmdata/include/dcmtk/dcmdata/dcostrma.h \ ../../dcmdata/include/dcmtk/dcmdata/dcuid.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvm.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdicent.h \ ../../dcmdata/include/dcmtk/dcmdata/dchashdi.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdict.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdeftag.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../../dcmdata/include/dcmtk/dcmdata/dcmetinf.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdatset.h \ ../../dcmdata/include/dcmtk/dcmdata/dcsequen.h \ ../../dcmdata/include/dcmtk/dcmdata/dcfilefo.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdicdir.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdirrec.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrulup.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrul.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpixseq.h \ ../../dcmdata/include/dcmtk/dcmdata/dcofsetl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrae.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvras.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrcs.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrda.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrds.h \ ../../ofstd/include/dcmtk/ofstd/ofvector.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrdt.h \ ../../ofstd/include/dcmtk/ofstd/ofdatime.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvris.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrtm.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrui.h \ ../../dcmdata/include/dcmtk/dcmdata/dcchrstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlo.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlt.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrpn.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsh.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrst.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrut.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrobow.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpixel.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrpobw.h \ ../../dcmdata/include/dcmtk/dcmdata/dcovlay.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrat.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrss.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrus.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrfl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrfd.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrof.h \ ../../dcmdata/include/dcmtk/dcmdata/cmdlnarg.h \ ../include/dcmtk/dcmpstat/dvpsgr.h ../include/dcmtk/dcmpstat/dvpsri.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrui.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvris.h dvpsgl.o: dvpsgl.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmpstat/dvpsgl.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../dcmdata/include/dcmtk/dcmdata/dctk.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../dcmdata/include/dcmtk/dcmdata/dcswap.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dcxfer.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvr.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../dcmdata/include/dcmtk/dcmdata/dcistrma.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dcostrma.h \ ../../dcmdata/include/dcmtk/dcmdata/dcuid.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvm.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h \ ../../dcmdata/include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmdata/include/dcmtk/dcmdata/dctag.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdicent.h \ ../../dcmdata/include/dcmtk/dcmdata/dchashdi.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdict.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdeftag.h \ ../../dcmdata/include/dcmtk/dcmdata/dcobject.h \ ../../dcmdata/include/dcmtk/dcmdata/dcstack.h \ ../../dcmdata/include/dcmtk/dcmdata/dcelem.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../../dcmdata/include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpcache.h \ ../../dcmdata/include/dcmtk/dcmdata/dcmetinf.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdatset.h \ ../../dcmdata/include/dcmtk/dcmdata/dcsequen.h \ ../../dcmdata/include/dcmtk/dcmdata/dcfilefo.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdicdir.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdirrec.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrulup.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrul.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpixseq.h \ ../../dcmdata/include/dcmtk/dcmdata/dcofsetl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcbytstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrae.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvras.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrcs.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrda.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrds.h \ ../../ofstd/include/dcmtk/ofstd/ofvector.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrdt.h \ ../../ofstd/include/dcmtk/ofstd/ofdatime.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvris.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrtm.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrui.h \ ../../dcmdata/include/dcmtk/dcmdata/dcchrstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlo.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlt.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrpn.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsh.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrst.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrut.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrobow.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpixel.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrpobw.h \ ../../dcmdata/include/dcmtk/dcmdata/dcovlay.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrat.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrss.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrus.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrfl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrfd.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrof.h \ ../../dcmdata/include/dcmtk/dcmdata/cmdlnarg.h \ ../include/dcmtk/dcmpstat/dvpsdef.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h dvpsgll.o: dvpsgll.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../include/dcmtk/dcmpstat/dvpsgll.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../dcmdata/include/dcmtk/dcmdata/dcobject.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dcxfer.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvr.h \ ../../dcmdata/include/dcmtk/dcmdata/dctag.h \ ../../dcmdata/include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmdata/include/dcmtk/dcmdata/dcstack.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../dcmdata/include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpcache.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../include/dcmtk/dcmpstat/dvpsgl.h \ ../../dcmdata/include/dcmtk/dcmdata/dctk.h \ ../../dcmdata/include/dcmtk/dcmdata/dcswap.h \ ../../dcmdata/include/dcmtk/dcmdata/dcistrma.h \ ../../dcmdata/include/dcmtk/dcmdata/dcostrma.h \ ../../dcmdata/include/dcmtk/dcmdata/dcuid.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvm.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdicent.h \ ../../dcmdata/include/dcmtk/dcmdata/dchashdi.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdict.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdeftag.h \ ../../dcmdata/include/dcmtk/dcmdata/dcelem.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../../dcmdata/include/dcmtk/dcmdata/dcmetinf.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdatset.h \ ../../dcmdata/include/dcmtk/dcmdata/dcsequen.h \ ../../dcmdata/include/dcmtk/dcmdata/dcfilefo.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdicdir.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdirrec.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrulup.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrul.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpixseq.h \ ../../dcmdata/include/dcmtk/dcmdata/dcofsetl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcbytstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrae.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvras.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrcs.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrda.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrds.h \ ../../ofstd/include/dcmtk/ofstd/ofvector.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrdt.h \ ../../ofstd/include/dcmtk/ofstd/ofdatime.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvris.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrtm.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrui.h \ ../../dcmdata/include/dcmtk/dcmdata/dcchrstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlo.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlt.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrpn.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsh.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrst.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrut.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrobow.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpixel.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrpobw.h \ ../../dcmdata/include/dcmtk/dcmdata/dcovlay.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrat.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrss.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrus.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrfl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrfd.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrof.h \ ../../dcmdata/include/dcmtk/dcmdata/cmdlnarg.h \ ../include/dcmtk/dcmpstat/dvpsdef.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../include/dcmtk/dcmpstat/dvpsgal.h ../include/dcmtk/dcmpstat/dvpstyp.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmpstat/dvpsall.h ../include/dcmtk/dcmpstat/dvpsal.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrcs.h \ ../include/dcmtk/dcmpstat/dvpsga.h ../include/dcmtk/dcmpstat/dvpstxl.h \ ../include/dcmtk/dcmpstat/dvpsgrl.h ../include/dcmtk/dcmpstat/dvpsril.h \ ../include/dcmtk/dcmpstat/dvpstx.h ../include/dcmtk/dcmpstat/dvpsgr.h \ ../include/dcmtk/dcmpstat/dvpsri.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrui.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvris.h dvpsgr.o: dvpsgr.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmpstat/dvpsgr.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../dcmdata/include/dcmtk/dcmdata/dctk.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../dcmdata/include/dcmtk/dcmdata/dcswap.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dcxfer.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvr.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../dcmdata/include/dcmtk/dcmdata/dcistrma.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dcostrma.h \ ../../dcmdata/include/dcmtk/dcmdata/dcuid.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvm.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h \ ../../dcmdata/include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmdata/include/dcmtk/dcmdata/dctag.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdicent.h \ ../../dcmdata/include/dcmtk/dcmdata/dchashdi.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdict.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdeftag.h \ ../../dcmdata/include/dcmtk/dcmdata/dcobject.h \ ../../dcmdata/include/dcmtk/dcmdata/dcstack.h \ ../../dcmdata/include/dcmtk/dcmdata/dcelem.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../../dcmdata/include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpcache.h \ ../../dcmdata/include/dcmtk/dcmdata/dcmetinf.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdatset.h \ ../../dcmdata/include/dcmtk/dcmdata/dcsequen.h \ ../../dcmdata/include/dcmtk/dcmdata/dcfilefo.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdicdir.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdirrec.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrulup.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrul.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpixseq.h \ ../../dcmdata/include/dcmtk/dcmdata/dcofsetl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcbytstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrae.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvras.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrcs.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrda.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrds.h \ ../../ofstd/include/dcmtk/ofstd/ofvector.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrdt.h \ ../../ofstd/include/dcmtk/ofstd/ofdatime.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvris.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrtm.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrui.h \ ../../dcmdata/include/dcmtk/dcmdata/dcchrstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlo.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlt.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrpn.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsh.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrst.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrut.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrobow.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpixel.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrpobw.h \ ../../dcmdata/include/dcmtk/dcmdata/dcovlay.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrat.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrss.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrus.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrfl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrfd.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrof.h \ ../../dcmdata/include/dcmtk/dcmdata/cmdlnarg.h \ ../include/dcmtk/dcmpstat/dvpstyp.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmpstat/dvpsdef.h \ ../../oflog/include/dcmtk/oflog/oflog.h dvpsgrl.o: dvpsgrl.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmpstat/dvpsgrl.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../dcmdata/include/dcmtk/dcmdata/dcobject.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dcxfer.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvr.h \ ../../dcmdata/include/dcmtk/dcmdata/dctag.h \ ../../dcmdata/include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmdata/include/dcmtk/dcmdata/dcstack.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../dcmdata/include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpcache.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../include/dcmtk/dcmpstat/dvpsgr.h \ ../../dcmdata/include/dcmtk/dcmdata/dctk.h \ ../../dcmdata/include/dcmtk/dcmdata/dcswap.h \ ../../dcmdata/include/dcmtk/dcmdata/dcistrma.h \ ../../dcmdata/include/dcmtk/dcmdata/dcostrma.h \ ../../dcmdata/include/dcmtk/dcmdata/dcuid.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvm.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdicent.h \ ../../dcmdata/include/dcmtk/dcmdata/dchashdi.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdict.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdeftag.h \ ../../dcmdata/include/dcmtk/dcmdata/dcelem.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../../dcmdata/include/dcmtk/dcmdata/dcmetinf.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdatset.h \ ../../dcmdata/include/dcmtk/dcmdata/dcsequen.h \ ../../dcmdata/include/dcmtk/dcmdata/dcfilefo.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdicdir.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdirrec.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrulup.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrul.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpixseq.h \ ../../dcmdata/include/dcmtk/dcmdata/dcofsetl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcbytstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrae.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvras.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrcs.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrda.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrds.h \ ../../ofstd/include/dcmtk/ofstd/ofvector.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrdt.h \ ../../ofstd/include/dcmtk/ofstd/ofdatime.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvris.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrtm.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrui.h \ ../../dcmdata/include/dcmtk/dcmdata/dcchrstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlo.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlt.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrpn.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsh.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrst.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrut.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrobow.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpixel.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrpobw.h \ ../../dcmdata/include/dcmtk/dcmdata/dcovlay.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrat.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrss.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrus.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrfl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrfd.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrof.h \ ../../dcmdata/include/dcmtk/dcmdata/cmdlnarg.h \ ../include/dcmtk/dcmpstat/dvpstyp.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h dvpshlp.o: dvpshlp.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmpstat/dvpshlp.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../dcmdata/include/dcmtk/dcmdata/dcsequen.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dcelem.h \ ../../dcmdata/include/dcmtk/dcmdata/dcobject.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dcxfer.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvr.h \ ../../dcmdata/include/dcmtk/dcmdata/dctag.h \ ../../dcmdata/include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmdata/include/dcmtk/dcmdata/dcstack.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../dcmdata/include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../include/dcmtk/dcmpstat/dvpsdef.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../dcmnet/include/dcmtk/dcmnet/dcompat.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofbmanip.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../dcmdata/include/dcmtk/dcmdata/dctk.h \ ../../dcmdata/include/dcmtk/dcmdata/dcswap.h \ ../../dcmdata/include/dcmtk/dcmdata/dcistrma.h \ ../../dcmdata/include/dcmtk/dcmdata/dcostrma.h \ ../../dcmdata/include/dcmtk/dcmdata/dcuid.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvm.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdicent.h \ ../../dcmdata/include/dcmtk/dcmdata/dchashdi.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdict.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdeftag.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpcache.h \ ../../dcmdata/include/dcmtk/dcmdata/dcmetinf.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdatset.h \ ../../dcmdata/include/dcmtk/dcmdata/dcsequen.h \ ../../dcmdata/include/dcmtk/dcmdata/dcfilefo.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdicdir.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdirrec.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrulup.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrul.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpixseq.h \ ../../dcmdata/include/dcmtk/dcmdata/dcofsetl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcbytstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrae.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvras.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrcs.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrda.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrds.h \ ../../ofstd/include/dcmtk/ofstd/ofvector.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrdt.h \ ../../ofstd/include/dcmtk/ofstd/ofdatime.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvris.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrtm.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrui.h \ ../../dcmdata/include/dcmtk/dcmdata/dcchrstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlo.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlt.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrpn.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsh.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrst.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrut.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrobow.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpixel.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrpobw.h \ ../../dcmdata/include/dcmtk/dcmdata/dcovlay.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrat.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrss.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrus.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrfl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrfd.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrof.h \ ../../dcmdata/include/dcmtk/dcmdata/cmdlnarg.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h dvpsib.o: dvpsib.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../include/dcmtk/dcmpstat/dvpsib.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmdata/include/dcmtk/dcmdata/dctk.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../dcmdata/include/dcmtk/dcmdata/dcswap.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dcxfer.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvr.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../dcmdata/include/dcmtk/dcmdata/dcistrma.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dcostrma.h \ ../../dcmdata/include/dcmtk/dcmdata/dcuid.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvm.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h \ ../../dcmdata/include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmdata/include/dcmtk/dcmdata/dctag.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdicent.h \ ../../dcmdata/include/dcmtk/dcmdata/dchashdi.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdict.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdeftag.h \ ../../dcmdata/include/dcmtk/dcmdata/dcobject.h \ ../../dcmdata/include/dcmtk/dcmdata/dcstack.h \ ../../dcmdata/include/dcmtk/dcmdata/dcelem.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../../dcmdata/include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpcache.h \ ../../dcmdata/include/dcmtk/dcmdata/dcmetinf.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdatset.h \ ../../dcmdata/include/dcmtk/dcmdata/dcsequen.h \ ../../dcmdata/include/dcmtk/dcmdata/dcfilefo.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdicdir.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdirrec.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrulup.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrul.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpixseq.h \ ../../dcmdata/include/dcmtk/dcmdata/dcofsetl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcbytstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrae.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvras.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrcs.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrda.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrds.h \ ../../ofstd/include/dcmtk/ofstd/ofvector.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrdt.h \ ../../ofstd/include/dcmtk/ofstd/ofdatime.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvris.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrtm.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrui.h \ ../../dcmdata/include/dcmtk/dcmdata/dcchrstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlo.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlt.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrpn.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsh.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrst.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrut.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrobow.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpixel.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrpobw.h \ ../../dcmdata/include/dcmtk/dcmdata/dcovlay.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrat.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrss.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrus.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrfl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrfd.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrof.h \ ../../dcmdata/include/dcmtk/dcmdata/cmdlnarg.h \ ../include/dcmtk/dcmpstat/dvpstyp.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../dcmnet/include/dcmtk/dcmnet/dimse.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../dcmnet/include/dcmtk/dcmnet/dicom.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../dcmnet/include/dcmtk/dcmnet/cond.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../../dcmnet/include/dcmtk/dcmnet/dcompat.h \ ../../ofstd/include/dcmtk/ofstd/ofbmanip.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../dcmdata/include/dcmtk/dcmdata/dcuid.h \ ../../dcmnet/include/dcmtk/dcmnet/lst.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../dcmnet/include/dcmtk/dcmnet/dul.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../dcmnet/include/dcmtk/dcmnet/extneg.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmnet/include/dcmtk/dcmnet/dcuserid.h \ ../../dcmnet/include/dcmtk/dcmnet/assoc.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdatset.h \ ../include/dcmtk/dcmpstat/dvpsdef.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../include/dcmtk/dcmpstat/dvpspll.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../include/dcmtk/dcmpstat/dvpscf.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../include/dcmtk/dcmpstat/dvpshlp.h \ ../../dcmdata/include/dcmtk/dcmdata/dcsequen.h \ ../include/dcmtk/dcmpstat/dvpspl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrus.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrui.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlo.h dvpsibl.o: dvpsibl.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmpstat/dvpsibl.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../dcmdata/include/dcmtk/dcmdata/dcobject.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dcxfer.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvr.h \ ../../dcmdata/include/dcmtk/dcmdata/dctag.h \ ../../dcmdata/include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmdata/include/dcmtk/dcmdata/dcstack.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../dcmdata/include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpcache.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../include/dcmtk/dcmpstat/dvpstyp.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrui.h \ ../../dcmdata/include/dcmtk/dcmdata/dcbytstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dcelem.h \ ../include/dcmtk/dcmpstat/dvpsib.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmdata/include/dcmtk/dcmdata/dctk.h \ ../../dcmdata/include/dcmtk/dcmdata/dcswap.h \ ../../dcmdata/include/dcmtk/dcmdata/dcistrma.h \ ../../dcmdata/include/dcmtk/dcmdata/dcostrma.h \ ../../dcmdata/include/dcmtk/dcmdata/dcuid.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvm.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdicent.h \ ../../dcmdata/include/dcmtk/dcmdata/dchashdi.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdict.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdeftag.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../../dcmdata/include/dcmtk/dcmdata/dcmetinf.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdatset.h \ ../../dcmdata/include/dcmtk/dcmdata/dcsequen.h \ ../../dcmdata/include/dcmtk/dcmdata/dcfilefo.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdicdir.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdirrec.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrulup.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrul.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpixseq.h \ ../../dcmdata/include/dcmtk/dcmdata/dcofsetl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrae.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvras.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrcs.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrda.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrds.h \ ../../ofstd/include/dcmtk/ofstd/ofvector.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrdt.h \ ../../ofstd/include/dcmtk/ofstd/ofdatime.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvris.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrtm.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrui.h \ ../../dcmdata/include/dcmtk/dcmdata/dcchrstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlo.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlt.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrpn.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsh.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrst.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrut.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrobow.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpixel.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrpobw.h \ ../../dcmdata/include/dcmtk/dcmdata/dcovlay.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrat.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrss.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrus.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrfl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrfd.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrof.h \ ../../dcmdata/include/dcmtk/dcmdata/cmdlnarg.h \ ../../dcmnet/include/dcmtk/dcmnet/dimse.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../dcmnet/include/dcmtk/dcmnet/dicom.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../dcmnet/include/dcmtk/dcmnet/cond.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../../dcmnet/include/dcmtk/dcmnet/dcompat.h \ ../../ofstd/include/dcmtk/ofstd/ofbmanip.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../dcmdata/include/dcmtk/dcmdata/dcuid.h \ ../../dcmnet/include/dcmtk/dcmnet/lst.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../dcmnet/include/dcmtk/dcmnet/dul.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../dcmnet/include/dcmtk/dcmnet/extneg.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmnet/include/dcmtk/dcmnet/dcuserid.h \ ../../dcmnet/include/dcmtk/dcmnet/assoc.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdatset.h \ ../include/dcmtk/dcmpstat/dvpshlp.h \ ../../dcmdata/include/dcmtk/dcmdata/dcsequen.h dvpsmsg.o: dvpsmsg.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../../dcmnet/include/dcmtk/dcmnet/dcompat.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofbmanip.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmpstat/dvpsmsg.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofbmanip.h \ ../../dcmdata/include/dcmtk/dcmdata/dcswap.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dcxfer.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvr.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../dcmnet/include/dcmtk/dcmnet/dcmtrans.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../dcmnet/include/dcmtk/dcmnet/dcmlayer.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h dvpsov.o: dvpsov.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmpstat/dvpsov.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../dcmdata/include/dcmtk/dcmdata/dctk.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../dcmdata/include/dcmtk/dcmdata/dcswap.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dcxfer.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvr.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../dcmdata/include/dcmtk/dcmdata/dcistrma.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dcostrma.h \ ../../dcmdata/include/dcmtk/dcmdata/dcuid.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvm.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h \ ../../dcmdata/include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmdata/include/dcmtk/dcmdata/dctag.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdicent.h \ ../../dcmdata/include/dcmtk/dcmdata/dchashdi.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdict.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdeftag.h \ ../../dcmdata/include/dcmtk/dcmdata/dcobject.h \ ../../dcmdata/include/dcmtk/dcmdata/dcstack.h \ ../../dcmdata/include/dcmtk/dcmdata/dcelem.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../../dcmdata/include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpcache.h \ ../../dcmdata/include/dcmtk/dcmdata/dcmetinf.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdatset.h \ ../../dcmdata/include/dcmtk/dcmdata/dcsequen.h \ ../../dcmdata/include/dcmtk/dcmdata/dcfilefo.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdicdir.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdirrec.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrulup.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrul.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpixseq.h \ ../../dcmdata/include/dcmtk/dcmdata/dcofsetl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcbytstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrae.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvras.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrcs.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrda.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrds.h \ ../../ofstd/include/dcmtk/ofstd/ofvector.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrdt.h \ ../../ofstd/include/dcmtk/ofstd/ofdatime.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvris.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrtm.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrui.h \ ../../dcmdata/include/dcmtk/dcmdata/dcchrstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlo.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlt.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrpn.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsh.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrst.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrut.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrobow.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpixel.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrpobw.h \ ../../dcmdata/include/dcmtk/dcmdata/dcovlay.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrat.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrss.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrus.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrfl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrfd.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrof.h \ ../../dcmdata/include/dcmtk/dcmdata/cmdlnarg.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmpstat/dvpsdef.h \ ../../oflog/include/dcmtk/oflog/oflog.h dvpsovl.o: dvpsovl.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmpstat/dvpsovl.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../dcmdata/include/dcmtk/dcmdata/dcobject.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dcxfer.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvr.h \ ../../dcmdata/include/dcmtk/dcmdata/dctag.h \ ../../dcmdata/include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmdata/include/dcmtk/dcmdata/dcstack.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../dcmdata/include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpcache.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../include/dcmtk/dcmpstat/dvpsov.h \ ../../dcmdata/include/dcmtk/dcmdata/dctk.h \ ../../dcmdata/include/dcmtk/dcmdata/dcswap.h \ ../../dcmdata/include/dcmtk/dcmdata/dcistrma.h \ ../../dcmdata/include/dcmtk/dcmdata/dcostrma.h \ ../../dcmdata/include/dcmtk/dcmdata/dcuid.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvm.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdicent.h \ ../../dcmdata/include/dcmtk/dcmdata/dchashdi.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdict.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdeftag.h \ ../../dcmdata/include/dcmtk/dcmdata/dcelem.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../../dcmdata/include/dcmtk/dcmdata/dcmetinf.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdatset.h \ ../../dcmdata/include/dcmtk/dcmdata/dcsequen.h \ ../../dcmdata/include/dcmtk/dcmdata/dcfilefo.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdicdir.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdirrec.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrulup.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrul.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpixseq.h \ ../../dcmdata/include/dcmtk/dcmdata/dcofsetl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcbytstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrae.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvras.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrcs.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrda.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrds.h \ ../../ofstd/include/dcmtk/ofstd/ofvector.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrdt.h \ ../../ofstd/include/dcmtk/ofstd/ofdatime.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvris.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrtm.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrui.h \ ../../dcmdata/include/dcmtk/dcmdata/dcchrstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlo.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlt.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrpn.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsh.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrst.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrut.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrobow.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpixel.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrpobw.h \ ../../dcmdata/include/dcmtk/dcmdata/dcovlay.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrat.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrss.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrus.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrfl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrfd.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrof.h \ ../../dcmdata/include/dcmtk/dcmdata/cmdlnarg.h dvpspl2.o: dvpspl2.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../include/dcmtk/dcmpstat/dvpspl.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmpstat/dvpstyp.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrus.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../dcmdata/include/dcmtk/dcmdata/dcelem.h \ ../../dcmdata/include/dcmtk/dcmdata/dcobject.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dcxfer.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvr.h \ ../../dcmdata/include/dcmtk/dcmdata/dctag.h \ ../../dcmdata/include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmdata/include/dcmtk/dcmdata/dcstack.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrui.h \ ../../dcmdata/include/dcmtk/dcmdata/dcbytstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlo.h \ ../../dcmdata/include/dcmtk/dcmdata/dcchrstr.h \ ../../dcmimgle/include/dcmtk/dcmimgle/dcmimage.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../dcmimgle/include/dcmtk/dcmimgle/dimoimg.h \ ../../dcmimgle/include/dcmtk/dcmimgle/diimage.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpcache.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../dcmdata/include/dcmtk/dcmdata/dcfcache.h \ ../../dcmdata/include/dcmtk/dcmdata/dcistrma.h \ ../../dcmimgle/include/dcmtk/dcmimgle/diovlay.h \ ../../dcmimgle/include/dcmtk/dcmimgle/diobjcou.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../dcmimgle/include/dcmtk/dcmimgle/diovdat.h \ ../../dcmimgle/include/dcmtk/dcmimgle/diovpln.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmimgle/include/dcmtk/dcmimgle/diutils.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../dcmimgle/include/dcmtk/dcmimgle/dimopx.h \ ../../dcmimgle/include/dcmtk/dcmimgle/dipixel.h \ ../../dcmimgle/include/dcmtk/dcmimgle/dimomod.h \ ../../dcmimgle/include/dcmtk/dcmimgle/diluptab.h \ ../../dcmdata/include/dcmtk/dcmdata/dctagkey.h \ ../../dcmimgle/include/dcmtk/dcmimgle/dibaslut.h \ ../../dcmimgle/include/dcmtk/dcmimgle/dimoopx.h \ ../../dcmimgle/include/dcmtk/dcmimgle/didispfn.h \ ../include/dcmtk/dcmpstat/dvpsdef.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../dcmnet/include/dcmtk/dcmnet/dimse.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../dcmnet/include/dcmtk/dcmnet/dicom.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../dcmnet/include/dcmtk/dcmnet/cond.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../../dcmnet/include/dcmtk/dcmnet/dcompat.h \ ../../ofstd/include/dcmtk/ofstd/ofbmanip.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../dcmdata/include/dcmtk/dcmdata/dcuid.h \ ../../dcmnet/include/dcmtk/dcmnet/lst.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../dcmnet/include/dcmtk/dcmnet/dul.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../dcmnet/include/dcmtk/dcmnet/extneg.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmnet/include/dcmtk/dcmnet/dcuserid.h \ ../../dcmnet/include/dcmtk/dcmnet/assoc.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdatset.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h dvpspl.o: dvpspl.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdeftag.h \ ../../dcmdata/include/dcmtk/dcmdata/dctagkey.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../dcmdata/include/dcmtk/dcmdata/dcsequen.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dcelem.h \ ../../dcmdata/include/dcmtk/dcmdata/dcobject.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dcxfer.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvr.h \ ../../dcmdata/include/dcmtk/dcmdata/dctag.h \ ../../dcmdata/include/dcmtk/dcmdata/dcstack.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../dcmdata/include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrcs.h \ ../../dcmdata/include/dcmtk/dcmdata/dcbytstr.h \ ../include/dcmtk/dcmpstat/dvpspl.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmpstat/dvpstyp.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrus.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrui.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlo.h \ ../../dcmdata/include/dcmtk/dcmdata/dcchrstr.h \ ../include/dcmtk/dcmpstat/dvpsdef.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../dcmnet/include/dcmtk/dcmnet/dimse.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../dcmnet/include/dcmtk/dcmnet/dicom.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../dcmnet/include/dcmtk/dcmnet/cond.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../../dcmnet/include/dcmtk/dcmnet/dcompat.h \ ../../ofstd/include/dcmtk/ofstd/ofbmanip.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../dcmdata/include/dcmtk/dcmdata/dcuid.h \ ../../dcmnet/include/dcmtk/dcmnet/lst.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../dcmnet/include/dcmtk/dcmnet/dul.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../dcmnet/include/dcmtk/dcmnet/extneg.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmnet/include/dcmtk/dcmnet/dcuserid.h \ ../../dcmnet/include/dcmtk/dcmnet/assoc.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdatset.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpcache.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h dvpspll.o: dvpspll.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmpstat/dvpspll.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmpstat/dvpstyp.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../dcmnet/include/dcmtk/dcmnet/dimse.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../dcmnet/include/dcmtk/dcmnet/dicom.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../dcmnet/include/dcmtk/dcmnet/cond.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmnet/include/dcmtk/dcmnet/dcompat.h \ ../../ofstd/include/dcmtk/ofstd/ofbmanip.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../dcmdata/include/dcmtk/dcmdata/dcuid.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../dcmnet/include/dcmtk/dcmnet/lst.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../dcmnet/include/dcmtk/dcmnet/dul.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../dcmnet/include/dcmtk/dcmnet/extneg.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmnet/include/dcmtk/dcmnet/dcuserid.h \ ../../dcmnet/include/dcmtk/dcmnet/assoc.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdatset.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../dcmdata/include/dcmtk/dcmdata/dcobject.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../../dcmdata/include/dcmtk/dcmdata/dcxfer.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvr.h \ ../../dcmdata/include/dcmtk/dcmdata/dctag.h \ ../../dcmdata/include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmdata/include/dcmtk/dcmdata/dcstack.h \ ../../dcmdata/include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpcache.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../include/dcmtk/dcmpstat/dvpspl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrus.h \ ../../dcmdata/include/dcmtk/dcmdata/dcelem.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrui.h \ ../../dcmdata/include/dcmtk/dcmdata/dcbytstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlo.h \ ../../dcmdata/include/dcmtk/dcmdata/dcchrstr.h \ ../include/dcmtk/dcmpstat/dvpshlp.h \ ../../dcmdata/include/dcmtk/dcmdata/dcsequen.h \ ../include/dcmtk/dcmpstat/dvpsibl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../../dcmimgle/include/dcmtk/dcmimgle/diluptab.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../dcmdata/include/dcmtk/dcmdata/dctagkey.h \ ../../dcmimgle/include/dcmtk/dcmimgle/dibaslut.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../dcmimgle/include/dcmtk/dcmimgle/diutils.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../dcmimgle/include/dcmtk/dcmimgle/diobjcou.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../include/dcmtk/dcmpstat/dvpsdef.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../include/dcmtk/dcmpstat/dvpsib.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmdata/include/dcmtk/dcmdata/dctk.h \ ../../dcmdata/include/dcmtk/dcmdata/dcswap.h \ ../../dcmdata/include/dcmtk/dcmdata/dcistrma.h \ ../../dcmdata/include/dcmtk/dcmdata/dcostrma.h \ ../../dcmdata/include/dcmtk/dcmdata/dcuid.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvm.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdicent.h \ ../../dcmdata/include/dcmtk/dcmdata/dchashdi.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdict.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdeftag.h \ ../../dcmdata/include/dcmtk/dcmdata/dcmetinf.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdatset.h \ ../../dcmdata/include/dcmtk/dcmdata/dcsequen.h \ ../../dcmdata/include/dcmtk/dcmdata/dcfilefo.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdicdir.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdirrec.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrulup.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrul.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpixseq.h \ ../../dcmdata/include/dcmtk/dcmdata/dcofsetl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrae.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvras.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrcs.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrda.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrds.h \ ../../ofstd/include/dcmtk/ofstd/ofvector.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrdt.h \ ../../ofstd/include/dcmtk/ofstd/ofdatime.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvris.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrtm.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrui.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlo.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlt.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrpn.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsh.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrst.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrut.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrobow.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpixel.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrpobw.h \ ../../dcmdata/include/dcmtk/dcmdata/dcovlay.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrat.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrss.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrus.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrfl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrfd.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrof.h \ ../../dcmdata/include/dcmtk/dcmdata/cmdlnarg.h dvpspr.o: dvpspr.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../include/dcmtk/dcmpstat/dvpsdef.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../include/dcmtk/dcmpstat/dvpspr.h \ ../../dcmnet/include/dcmtk/dcmnet/dimse.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../dcmnet/include/dcmtk/dcmnet/dicom.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../dcmnet/include/dcmtk/dcmnet/cond.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmnet/include/dcmtk/dcmnet/dcompat.h \ ../../ofstd/include/dcmtk/ofstd/ofbmanip.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../dcmdata/include/dcmtk/dcmdata/dcuid.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../dcmnet/include/dcmtk/dcmnet/lst.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../dcmnet/include/dcmtk/dcmnet/dul.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../dcmnet/include/dcmtk/dcmnet/extneg.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmnet/include/dcmtk/dcmnet/dcuserid.h \ ../../dcmnet/include/dcmtk/dcmnet/assoc.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdatset.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../dcmdata/include/dcmtk/dcmdata/dcobject.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../../dcmdata/include/dcmtk/dcmdata/dcxfer.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvr.h \ ../../dcmdata/include/dcmtk/dcmdata/dctag.h \ ../../dcmdata/include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmdata/include/dcmtk/dcmdata/dcstack.h \ ../../dcmdata/include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpcache.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h dvpsprt.o: dvpsprt.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmpstat/dvpsprt.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../include/dcmtk/dcmpstat/dvpstyp.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmpstat/dvpspll.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../dcmnet/include/dcmtk/dcmnet/dimse.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../dcmnet/include/dcmtk/dcmnet/dicom.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../dcmnet/include/dcmtk/dcmnet/cond.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmnet/include/dcmtk/dcmnet/dcompat.h \ ../../ofstd/include/dcmtk/ofstd/ofbmanip.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../dcmdata/include/dcmtk/dcmdata/dcuid.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../dcmnet/include/dcmtk/dcmnet/lst.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../dcmnet/include/dcmtk/dcmnet/dul.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../dcmnet/include/dcmtk/dcmnet/extneg.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmnet/include/dcmtk/dcmnet/dcuserid.h \ ../../dcmnet/include/dcmtk/dcmnet/assoc.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdatset.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../dcmdata/include/dcmtk/dcmdata/dcobject.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../../dcmdata/include/dcmtk/dcmdata/dcxfer.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvr.h \ ../../dcmdata/include/dcmtk/dcmdata/dctag.h \ ../../dcmdata/include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmdata/include/dcmtk/dcmdata/dcstack.h \ ../../dcmdata/include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpcache.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../include/dcmtk/dcmpstat/dvpsspl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrus.h \ ../../dcmdata/include/dcmtk/dcmdata/dcelem.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrui.h \ ../../dcmdata/include/dcmtk/dcmdata/dcbytstr.h \ ../../dcmnet/include/dcmtk/dcmnet/assoc.h \ ../include/dcmtk/dcmpstat/dvpsdef.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../include/dcmtk/dcmpstat/dviface.h ../include/dcmtk/dcmpstat/dvpscf.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../include/dcmtk/dcmpstat/dvpstat.h \ ../include/dcmtk/dcmpstat/dcmpstat.h \ ../../dcmdata/include/dcmtk/dcmdata/dctk.h \ ../../dcmdata/include/dcmtk/dcmdata/dcswap.h \ ../../dcmdata/include/dcmtk/dcmdata/dcistrma.h \ ../../dcmdata/include/dcmtk/dcmdata/dcostrma.h \ ../../dcmdata/include/dcmtk/dcmdata/dcuid.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvm.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdicent.h \ ../../dcmdata/include/dcmtk/dcmdata/dchashdi.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdict.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdeftag.h \ ../../dcmdata/include/dcmtk/dcmdata/dcmetinf.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdatset.h \ ../../dcmdata/include/dcmtk/dcmdata/dcsequen.h \ ../../dcmdata/include/dcmtk/dcmdata/dcfilefo.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdicdir.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdirrec.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrulup.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrul.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpixseq.h \ ../../dcmdata/include/dcmtk/dcmdata/dcofsetl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrae.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvras.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrcs.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrda.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrds.h \ ../../ofstd/include/dcmtk/ofstd/ofvector.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrdt.h \ ../../ofstd/include/dcmtk/ofstd/ofdatime.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvris.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrtm.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrui.h \ ../../dcmdata/include/dcmtk/dcmdata/dcchrstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlo.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlt.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrpn.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsh.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrst.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrut.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrobow.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpixel.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrpobw.h \ ../../dcmdata/include/dcmtk/dcmdata/dcovlay.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrat.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrss.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrus.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrfl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrfd.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrof.h \ ../../dcmdata/include/dcmtk/dcmdata/cmdlnarg.h \ ../include/dcmtk/dcmpstat/dvpsovl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../include/dcmtk/dcmpstat/dvpsgll.h ../include/dcmtk/dcmpstat/dvpsrsl.h \ ../include/dcmtk/dcmpstat/dvpsall.h ../include/dcmtk/dcmpstat/dvpsgal.h \ ../include/dcmtk/dcmpstat/dvpscul.h ../include/dcmtk/dcmpstat/dvpsvll.h \ ../include/dcmtk/dcmpstat/dvpsvwl.h ../include/dcmtk/dcmpstat/dvpsdal.h \ ../include/dcmtk/dcmpstat/dvpssvl.h ../include/dcmtk/dcmpstat/dvpspl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlo.h \ ../../dcmqrdb/include/dcmtk/dcmqrdb/dcmqridx.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../dcmnet/include/dcmtk/dcmnet/dicom.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdatset.h \ ../../dcmdata/include/dcmtk/dcmdata/dcuid.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdeftag.h \ ../../dcmqrdb/include/dcmtk/dcmqrdb/dcmqrdbi.h \ ../../dcmqrdb/include/dcmtk/dcmqrdb/dcmqrdba.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmnet/include/dcmtk/dcmnet/dimse.h \ ../../ofstd/include/dcmtk/ofstd/offname.h \ ../include/dcmtk/dcmpstat/dvcache.h \ ../../dcmqrdb/include/dcmtk/dcmqrdb/dcmqrdbi.h \ ../include/dcmtk/dcmpstat/dvpsfs.h ../include/dcmtk/dcmpstat/dvpssp.h \ ../include/dcmtk/dcmpstat/dvpsibl.h ../include/dcmtk/dcmpstat/dvpsabl.h \ ../include/dcmtk/dcmpstat/dvpspr.h ../include/dcmtk/dcmpstat/dvpshlp.h \ ../../dcmdata/include/dcmtk/dcmdata/dcsequen.h \ ../../ofstd/include/dcmtk/ofstd/ofdatime.h \ ../include/dcmtk/dcmpstat/dvpsov.h ../include/dcmtk/dcmpstat/dvpsgl.h \ ../include/dcmtk/dcmpstat/dvpsrs.h ../include/dcmtk/dcmpstat/dvpsril.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrae.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsh.h \ ../include/dcmtk/dcmpstat/dvpsal.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrcs.h \ ../include/dcmtk/dcmpstat/dvpsga.h ../include/dcmtk/dcmpstat/dvpstxl.h \ ../include/dcmtk/dcmpstat/dvpsgrl.h ../include/dcmtk/dcmpstat/dvpscu.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../include/dcmtk/dcmpstat/dvpsvl.h ../include/dcmtk/dcmpstat/dvpsvw.h \ ../include/dcmtk/dcmpstat/dvpsda.h ../include/dcmtk/dcmpstat/dvpssv.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrds.h \ ../include/dcmtk/dcmpstat/dvpsib.h ../include/dcmtk/dcmpstat/dvpsab.h \ ../include/dcmtk/dcmpstat/dvpstx.h ../include/dcmtk/dcmpstat/dvpsgr.h \ ../include/dcmtk/dcmpstat/dvpsri.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvris.h dvpsri.o: dvpsri.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdeftag.h \ ../../dcmdata/include/dcmtk/dcmdata/dctagkey.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../dcmdata/include/dcmtk/dcmdata/dcobject.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dcxfer.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvr.h \ ../../dcmdata/include/dcmtk/dcmdata/dctag.h \ ../../dcmdata/include/dcmtk/dcmdata/dcstack.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../dcmdata/include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpcache.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../include/dcmtk/dcmpstat/dvpsri.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrui.h \ ../../dcmdata/include/dcmtk/dcmdata/dcbytstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dcelem.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvris.h \ ../include/dcmtk/dcmpstat/dvpsdef.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h dvpsril.o: dvpsril.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdeftag.h \ ../../dcmdata/include/dcmtk/dcmdata/dctagkey.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../dcmdata/include/dcmtk/dcmdata/dcsequen.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dcelem.h \ ../../dcmdata/include/dcmtk/dcmdata/dcobject.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dcxfer.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvr.h \ ../../dcmdata/include/dcmtk/dcmdata/dctag.h \ ../../dcmdata/include/dcmtk/dcmdata/dcstack.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../dcmdata/include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../include/dcmtk/dcmpstat/dvpsril.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpcache.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../include/dcmtk/dcmpstat/dvpstyp.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmpstat/dvpsri.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrui.h \ ../../dcmdata/include/dcmtk/dcmdata/dcbytstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvris.h \ ../include/dcmtk/dcmpstat/dvpsrsl.h ../include/dcmtk/dcmpstat/dvpsrs.h \ ../include/dcmtk/dcmpstat/dvpsril.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrae.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsh.h \ ../../dcmdata/include/dcmtk/dcmdata/dcchrstr.h \ ../include/dcmtk/dcmpstat/dvpsdef.h \ ../../oflog/include/dcmtk/oflog/oflog.h dvpsrs.o: dvpsrs.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdeftag.h \ ../../dcmdata/include/dcmtk/dcmdata/dctagkey.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../include/dcmtk/dcmpstat/dvpsrs.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmpstat/dvpsril.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../dcmdata/include/dcmtk/dcmdata/dcobject.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dcxfer.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvr.h \ ../../dcmdata/include/dcmtk/dcmdata/dctag.h \ ../../dcmdata/include/dcmtk/dcmdata/dcstack.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../dcmdata/include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpcache.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../include/dcmtk/dcmpstat/dvpstyp.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrae.h \ ../../dcmdata/include/dcmtk/dcmdata/dcbytstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dcelem.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsh.h \ ../../dcmdata/include/dcmtk/dcmdata/dcchrstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrui.h \ ../include/dcmtk/dcmpstat/dvpsdef.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../include/dcmtk/dcmpstat/dvpsri.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvris.h dvpsrsl.o: dvpsrsl.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdeftag.h \ ../../dcmdata/include/dcmtk/dcmdata/dctagkey.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../dcmdata/include/dcmtk/dcmdata/dcsequen.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dcelem.h \ ../../dcmdata/include/dcmtk/dcmdata/dcobject.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dcxfer.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvr.h \ ../../dcmdata/include/dcmtk/dcmdata/dctag.h \ ../../dcmdata/include/dcmtk/dcmdata/dcstack.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../dcmdata/include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../include/dcmtk/dcmpstat/dvpsrsl.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpcache.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../include/dcmtk/dcmpstat/dvpsrs.h ../include/dcmtk/dcmpstat/dvpsril.h \ ../include/dcmtk/dcmpstat/dvpstyp.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrae.h \ ../../dcmdata/include/dcmtk/dcmdata/dcbytstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsh.h \ ../../dcmdata/include/dcmtk/dcmdata/dcchrstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrui.h \ ../include/dcmtk/dcmpstat/dvpsri.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvris.h \ ../include/dcmtk/dcmpstat/dvpsdef.h \ ../../oflog/include/dcmtk/oflog/oflog.h dvpssp.o: dvpssp.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmpstat/dvpssp.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../include/dcmtk/dcmpstat/dvpstyp.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmpstat/dvpspll.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../dcmnet/include/dcmtk/dcmnet/dimse.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../dcmnet/include/dcmtk/dcmnet/dicom.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../dcmnet/include/dcmtk/dcmnet/cond.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmnet/include/dcmtk/dcmnet/dcompat.h \ ../../ofstd/include/dcmtk/ofstd/ofbmanip.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../dcmdata/include/dcmtk/dcmdata/dcuid.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../dcmnet/include/dcmtk/dcmnet/lst.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../dcmnet/include/dcmtk/dcmnet/dul.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../dcmnet/include/dcmtk/dcmnet/extneg.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmnet/include/dcmtk/dcmnet/dcuserid.h \ ../../dcmnet/include/dcmtk/dcmnet/assoc.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdatset.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../dcmdata/include/dcmtk/dcmdata/dcobject.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../../dcmdata/include/dcmtk/dcmdata/dcxfer.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvr.h \ ../../dcmdata/include/dcmtk/dcmdata/dctag.h \ ../../dcmdata/include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmdata/include/dcmtk/dcmdata/dcstack.h \ ../../dcmdata/include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpcache.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../include/dcmtk/dcmpstat/dvpsibl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrui.h \ ../../dcmdata/include/dcmtk/dcmdata/dcbytstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dcelem.h \ ../include/dcmtk/dcmpstat/dvpsabl.h ../include/dcmtk/dcmpstat/dvpstat.h \ ../include/dcmtk/dcmpstat/dcmpstat.h \ ../../dcmdata/include/dcmtk/dcmdata/dctk.h \ ../../dcmdata/include/dcmtk/dcmdata/dcswap.h \ ../../dcmdata/include/dcmtk/dcmdata/dcistrma.h \ ../../dcmdata/include/dcmtk/dcmdata/dcostrma.h \ ../../dcmdata/include/dcmtk/dcmdata/dcuid.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvm.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdicent.h \ ../../dcmdata/include/dcmtk/dcmdata/dchashdi.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdict.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdeftag.h \ ../../dcmdata/include/dcmtk/dcmdata/dcmetinf.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdatset.h \ ../../dcmdata/include/dcmtk/dcmdata/dcsequen.h \ ../../dcmdata/include/dcmtk/dcmdata/dcfilefo.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdicdir.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdirrec.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrulup.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrul.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpixseq.h \ ../../dcmdata/include/dcmtk/dcmdata/dcofsetl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrae.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvras.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrcs.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrda.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrds.h \ ../../ofstd/include/dcmtk/ofstd/ofvector.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrdt.h \ ../../ofstd/include/dcmtk/ofstd/ofdatime.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvris.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrtm.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrui.h \ ../../dcmdata/include/dcmtk/dcmdata/dcchrstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlo.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlt.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrpn.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsh.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrst.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrut.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrobow.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpixel.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrpobw.h \ ../../dcmdata/include/dcmtk/dcmdata/dcovlay.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrat.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrss.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrus.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrfl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrfd.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrof.h \ ../../dcmdata/include/dcmtk/dcmdata/cmdlnarg.h \ ../include/dcmtk/dcmpstat/dvpsovl.h ../include/dcmtk/dcmpstat/dvpsgll.h \ ../include/dcmtk/dcmpstat/dvpsrsl.h ../include/dcmtk/dcmpstat/dvpsall.h \ ../include/dcmtk/dcmpstat/dvpsgal.h ../include/dcmtk/dcmpstat/dvpscul.h \ ../include/dcmtk/dcmpstat/dvpsvll.h ../include/dcmtk/dcmpstat/dvpsvwl.h \ ../include/dcmtk/dcmpstat/dvpsdal.h ../include/dcmtk/dcmpstat/dvpssvl.h \ ../include/dcmtk/dcmpstat/dvpspl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrus.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlo.h \ ../include/dcmtk/dcmpstat/dvpspr.h ../include/dcmtk/dcmpstat/dvpsdef.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmdata/include/dcmtk/dcmdata/dcuid.h \ ../include/dcmtk/dcmpstat/dvpsib.h ../include/dcmtk/dcmpstat/dvpshlp.h \ ../../dcmdata/include/dcmtk/dcmdata/dcsequen.h \ ../../dcmimgle/include/dcmtk/dcmimgle/dcmimage.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../dcmimgle/include/dcmtk/dcmimgle/dimoimg.h \ ../../dcmimgle/include/dcmtk/dcmimgle/diimage.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../../dcmdata/include/dcmtk/dcmdata/dcfcache.h \ ../../dcmimgle/include/dcmtk/dcmimgle/diovlay.h \ ../../dcmimgle/include/dcmtk/dcmimgle/diobjcou.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../dcmimgle/include/dcmtk/dcmimgle/diovdat.h \ ../../dcmimgle/include/dcmtk/dcmimgle/diovpln.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmimgle/include/dcmtk/dcmimgle/diutils.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../dcmimgle/include/dcmtk/dcmimgle/dimopx.h \ ../../dcmimgle/include/dcmtk/dcmimgle/dipixel.h \ ../../dcmimgle/include/dcmtk/dcmimgle/dimomod.h \ ../../dcmimgle/include/dcmtk/dcmimgle/diluptab.h \ ../../dcmdata/include/dcmtk/dcmdata/dctagkey.h \ ../../dcmimgle/include/dcmtk/dcmimgle/dibaslut.h \ ../../dcmimgle/include/dcmtk/dcmimgle/dimoopx.h \ ../../dcmimgle/include/dcmtk/dcmimgle/didispfn.h \ ../../dcmimgle/include/dcmtk/dcmimgle/digsdfn.h \ ../include/dcmtk/dcmpstat/dvpscf.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../include/dcmtk/dcmpstat/dvpsov.h ../include/dcmtk/dcmpstat/dvpsgl.h \ ../include/dcmtk/dcmpstat/dvpsrs.h ../include/dcmtk/dcmpstat/dvpsril.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrae.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsh.h \ ../include/dcmtk/dcmpstat/dvpsal.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrcs.h \ ../include/dcmtk/dcmpstat/dvpsga.h ../include/dcmtk/dcmpstat/dvpstxl.h \ ../include/dcmtk/dcmpstat/dvpsgrl.h ../include/dcmtk/dcmpstat/dvpscu.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../include/dcmtk/dcmpstat/dvpsvl.h ../include/dcmtk/dcmpstat/dvpsvw.h \ ../include/dcmtk/dcmpstat/dvpsda.h ../include/dcmtk/dcmpstat/dvpssv.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrds.h \ ../include/dcmtk/dcmpstat/dvpsab.h ../include/dcmtk/dcmpstat/dvpstx.h \ ../include/dcmtk/dcmpstat/dvpsgr.h ../include/dcmtk/dcmpstat/dvpsri.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvris.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h dvpsspl.o: dvpsspl.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmpstat/dvpsspl.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrus.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../dcmdata/include/dcmtk/dcmdata/dcelem.h \ ../../dcmdata/include/dcmtk/dcmdata/dcobject.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dcxfer.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvr.h \ ../../dcmdata/include/dcmtk/dcmdata/dctag.h \ ../../dcmdata/include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmdata/include/dcmtk/dcmdata/dcstack.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrui.h \ ../../dcmdata/include/dcmtk/dcmdata/dcbytstr.h \ ../../dcmnet/include/dcmtk/dcmnet/dimse.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../dcmnet/include/dcmtk/dcmnet/dicom.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../dcmnet/include/dcmtk/dcmnet/cond.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../../dcmnet/include/dcmtk/dcmnet/dcompat.h \ ../../ofstd/include/dcmtk/ofstd/ofbmanip.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../dcmdata/include/dcmtk/dcmdata/dcuid.h \ ../../dcmnet/include/dcmtk/dcmnet/lst.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../dcmnet/include/dcmtk/dcmnet/dul.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../dcmnet/include/dcmtk/dcmnet/extneg.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmnet/include/dcmtk/dcmnet/dcuserid.h \ ../../dcmnet/include/dcmtk/dcmnet/assoc.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdatset.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpcache.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../include/dcmtk/dcmpstat/dvpstyp.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmpstat/dvpssp.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmpstat/dvpspll.h ../include/dcmtk/dcmpstat/dvpsibl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../include/dcmtk/dcmpstat/dvpsabl.h ../include/dcmtk/dcmpstat/dvpstat.h \ ../include/dcmtk/dcmpstat/dcmpstat.h \ ../../dcmdata/include/dcmtk/dcmdata/dctk.h \ ../../dcmdata/include/dcmtk/dcmdata/dcswap.h \ ../../dcmdata/include/dcmtk/dcmdata/dcistrma.h \ ../../dcmdata/include/dcmtk/dcmdata/dcostrma.h \ ../../dcmdata/include/dcmtk/dcmdata/dcuid.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvm.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdicent.h \ ../../dcmdata/include/dcmtk/dcmdata/dchashdi.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdict.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdeftag.h \ ../../dcmdata/include/dcmtk/dcmdata/dcmetinf.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdatset.h \ ../../dcmdata/include/dcmtk/dcmdata/dcsequen.h \ ../../dcmdata/include/dcmtk/dcmdata/dcfilefo.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdicdir.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdirrec.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrulup.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrul.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpixseq.h \ ../../dcmdata/include/dcmtk/dcmdata/dcofsetl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrae.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvras.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrcs.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrda.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrds.h \ ../../ofstd/include/dcmtk/ofstd/ofvector.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrdt.h \ ../../ofstd/include/dcmtk/ofstd/ofdatime.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvris.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrtm.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrui.h \ ../../dcmdata/include/dcmtk/dcmdata/dcchrstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlo.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlt.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrpn.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsh.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrst.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrut.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrobow.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpixel.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrpobw.h \ ../../dcmdata/include/dcmtk/dcmdata/dcovlay.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrat.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrss.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrus.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrfl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrfd.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrof.h \ ../../dcmdata/include/dcmtk/dcmdata/cmdlnarg.h \ ../include/dcmtk/dcmpstat/dvpsovl.h ../include/dcmtk/dcmpstat/dvpsgll.h \ ../include/dcmtk/dcmpstat/dvpsrsl.h ../include/dcmtk/dcmpstat/dvpsall.h \ ../include/dcmtk/dcmpstat/dvpsgal.h ../include/dcmtk/dcmpstat/dvpscul.h \ ../include/dcmtk/dcmpstat/dvpsvll.h ../include/dcmtk/dcmpstat/dvpsvwl.h \ ../include/dcmtk/dcmpstat/dvpsdal.h ../include/dcmtk/dcmpstat/dvpssvl.h \ ../include/dcmtk/dcmpstat/dvpspl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlo.h \ ../include/dcmtk/dcmpstat/dvpspr.h ../include/dcmtk/dcmpstat/dvpsib.h \ ../include/dcmtk/dcmpstat/dviface.h ../include/dcmtk/dcmpstat/dvpscf.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../dcmqrdb/include/dcmtk/dcmqrdb/dcmqridx.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../dcmnet/include/dcmtk/dcmnet/dicom.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdatset.h \ ../../dcmdata/include/dcmtk/dcmdata/dcuid.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdeftag.h \ ../../dcmqrdb/include/dcmtk/dcmqrdb/dcmqrdbi.h \ ../../dcmqrdb/include/dcmtk/dcmqrdb/dcmqrdba.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmnet/include/dcmtk/dcmnet/dimse.h \ ../../ofstd/include/dcmtk/ofstd/offname.h \ ../include/dcmtk/dcmpstat/dvcache.h \ ../../dcmqrdb/include/dcmtk/dcmqrdb/dcmqrdbi.h \ ../include/dcmtk/dcmpstat/dvpsdef.h ../include/dcmtk/dcmpstat/dvpsov.h \ ../include/dcmtk/dcmpstat/dvpsgl.h ../include/dcmtk/dcmpstat/dvpsrs.h \ ../include/dcmtk/dcmpstat/dvpsril.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrae.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsh.h \ ../include/dcmtk/dcmpstat/dvpsal.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrcs.h \ ../include/dcmtk/dcmpstat/dvpsga.h ../include/dcmtk/dcmpstat/dvpstxl.h \ ../include/dcmtk/dcmpstat/dvpsgrl.h ../include/dcmtk/dcmpstat/dvpscu.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../include/dcmtk/dcmpstat/dvpsvl.h ../include/dcmtk/dcmpstat/dvpsvw.h \ ../include/dcmtk/dcmpstat/dvpsda.h ../include/dcmtk/dcmpstat/dvpssv.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrds.h \ ../include/dcmtk/dcmpstat/dvpsab.h ../include/dcmtk/dcmpstat/dvpstx.h \ ../include/dcmtk/dcmpstat/dvpsgr.h ../include/dcmtk/dcmpstat/dvpsri.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvris.h dvpssv.o: dvpssv.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdeftag.h \ ../../dcmdata/include/dcmtk/dcmdata/dctagkey.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../dcmdata/include/dcmtk/dcmdata/dcsequen.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dcelem.h \ ../../dcmdata/include/dcmtk/dcmdata/dcobject.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dcxfer.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvr.h \ ../../dcmdata/include/dcmtk/dcmdata/dctag.h \ ../../dcmdata/include/dcmtk/dcmdata/dcstack.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../dcmdata/include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../include/dcmtk/dcmpstat/dvpssv.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrus.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrds.h \ ../../ofstd/include/dcmtk/ofstd/ofvector.h \ ../../dcmdata/include/dcmtk/dcmdata/dcbytstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlo.h \ ../../dcmdata/include/dcmtk/dcmdata/dcchrstr.h \ ../include/dcmtk/dcmpstat/dvpsril.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpcache.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../include/dcmtk/dcmpstat/dvpstyp.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmpstat/dvpsri.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrui.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvris.h \ ../include/dcmtk/dcmpstat/dvpsrsl.h ../include/dcmtk/dcmpstat/dvpsdef.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../include/dcmtk/dcmpstat/dvpsrs.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrae.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsh.h dvpssvl.o: dvpssvl.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdeftag.h \ ../../dcmdata/include/dcmtk/dcmdata/dctagkey.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../dcmdata/include/dcmtk/dcmdata/dcsequen.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dcelem.h \ ../../dcmdata/include/dcmtk/dcmdata/dcobject.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dcxfer.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvr.h \ ../../dcmdata/include/dcmtk/dcmdata/dctag.h \ ../../dcmdata/include/dcmtk/dcmdata/dcstack.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../dcmdata/include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../include/dcmtk/dcmpstat/dvpssvl.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpcache.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../include/dcmtk/dcmpstat/dvpstyp.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmpstat/dvpssv.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrus.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrds.h \ ../../ofstd/include/dcmtk/ofstd/ofvector.h \ ../../dcmdata/include/dcmtk/dcmdata/dcbytstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlo.h \ ../../dcmdata/include/dcmtk/dcmdata/dcchrstr.h \ ../include/dcmtk/dcmpstat/dvpsril.h ../include/dcmtk/dcmpstat/dvpsdef.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../include/dcmtk/dcmpstat/dvpsri.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrui.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvris.h dvpstat.o: dvpstat.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmpstat/dvpstat.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmpstat/dcmpstat.h \ ../../dcmdata/include/dcmtk/dcmdata/dctk.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../dcmdata/include/dcmtk/dcmdata/dcswap.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dcxfer.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvr.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../dcmdata/include/dcmtk/dcmdata/dcistrma.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dcostrma.h \ ../../dcmdata/include/dcmtk/dcmdata/dcuid.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvm.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h \ ../../dcmdata/include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmdata/include/dcmtk/dcmdata/dctag.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdicent.h \ ../../dcmdata/include/dcmtk/dcmdata/dchashdi.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdict.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdeftag.h \ ../../dcmdata/include/dcmtk/dcmdata/dcobject.h \ ../../dcmdata/include/dcmtk/dcmdata/dcstack.h \ ../../dcmdata/include/dcmtk/dcmdata/dcelem.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../../dcmdata/include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpcache.h \ ../../dcmdata/include/dcmtk/dcmdata/dcmetinf.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdatset.h \ ../../dcmdata/include/dcmtk/dcmdata/dcsequen.h \ ../../dcmdata/include/dcmtk/dcmdata/dcfilefo.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdicdir.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdirrec.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrulup.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrul.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpixseq.h \ ../../dcmdata/include/dcmtk/dcmdata/dcofsetl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcbytstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrae.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvras.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrcs.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrda.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrds.h \ ../../ofstd/include/dcmtk/ofstd/ofvector.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrdt.h \ ../../ofstd/include/dcmtk/ofstd/ofdatime.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvris.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrtm.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrui.h \ ../../dcmdata/include/dcmtk/dcmdata/dcchrstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlo.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlt.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrpn.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsh.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrst.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrut.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrobow.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpixel.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrpobw.h \ ../../dcmdata/include/dcmtk/dcmdata/dcovlay.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrat.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrss.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrus.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrfl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrfd.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrof.h \ ../../dcmdata/include/dcmtk/dcmdata/cmdlnarg.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmpstat/dvpstyp.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../include/dcmtk/dcmpstat/dvpsovl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../include/dcmtk/dcmpstat/dvpsgll.h ../include/dcmtk/dcmpstat/dvpsrsl.h \ ../include/dcmtk/dcmpstat/dvpsall.h ../include/dcmtk/dcmpstat/dvpsgal.h \ ../include/dcmtk/dcmpstat/dvpscul.h ../include/dcmtk/dcmpstat/dvpsvll.h \ ../include/dcmtk/dcmpstat/dvpsvwl.h ../include/dcmtk/dcmpstat/dvpsdal.h \ ../include/dcmtk/dcmpstat/dvpssvl.h ../include/dcmtk/dcmpstat/dvpspl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrus.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrui.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlo.h \ ../include/dcmtk/dcmpstat/dvpsdef.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmimgle/include/dcmtk/dcmimgle/dcmimage.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../dcmimgle/include/dcmtk/dcmimgle/dimoimg.h \ ../../dcmimgle/include/dcmtk/dcmimgle/diimage.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../../dcmdata/include/dcmtk/dcmdata/dcfcache.h \ ../../dcmimgle/include/dcmtk/dcmimgle/diovlay.h \ ../../dcmimgle/include/dcmtk/dcmimgle/diobjcou.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../dcmimgle/include/dcmtk/dcmimgle/diovdat.h \ ../../dcmimgle/include/dcmtk/dcmimgle/diovpln.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmimgle/include/dcmtk/dcmimgle/diutils.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../dcmimgle/include/dcmtk/dcmimgle/dimopx.h \ ../../dcmimgle/include/dcmtk/dcmimgle/dipixel.h \ ../../dcmimgle/include/dcmtk/dcmimgle/dimomod.h \ ../../dcmimgle/include/dcmtk/dcmimgle/diluptab.h \ ../../dcmdata/include/dcmtk/dcmdata/dctagkey.h \ ../../dcmimgle/include/dcmtk/dcmimgle/dibaslut.h \ ../../dcmimgle/include/dcmtk/dcmimgle/dimoopx.h \ ../../dcmimgle/include/dcmtk/dcmimgle/didispfn.h \ ../include/dcmtk/dcmpstat/dvpscu.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../include/dcmtk/dcmpstat/dvpsvl.h ../include/dcmtk/dcmpstat/dvpsvw.h \ ../include/dcmtk/dcmpstat/dvpsov.h ../include/dcmtk/dcmpstat/dvpsda.h \ ../include/dcmtk/dcmpstat/dvpsril.h ../include/dcmtk/dcmpstat/dvpssv.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrds.h \ ../include/dcmtk/dcmpstat/dvpshlp.h \ ../../dcmdata/include/dcmtk/dcmdata/dcsequen.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../include/dcmtk/dcmpstat/dvpsgl.h ../include/dcmtk/dcmpstat/dvpsrs.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrae.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsh.h \ ../include/dcmtk/dcmpstat/dvpsal.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrcs.h \ ../include/dcmtk/dcmpstat/dvpsga.h ../include/dcmtk/dcmpstat/dvpstxl.h \ ../include/dcmtk/dcmpstat/dvpsgrl.h ../include/dcmtk/dcmpstat/dvpsri.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvris.h \ ../include/dcmtk/dcmpstat/dvpstx.h ../include/dcmtk/dcmpstat/dvpsgr.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h dvpstx.o: dvpstx.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmpstat/dvpstx.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../dcmdata/include/dcmtk/dcmdata/dctk.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../dcmdata/include/dcmtk/dcmdata/dcswap.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dcxfer.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvr.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../dcmdata/include/dcmtk/dcmdata/dcistrma.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dcostrma.h \ ../../dcmdata/include/dcmtk/dcmdata/dcuid.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvm.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h \ ../../dcmdata/include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmdata/include/dcmtk/dcmdata/dctag.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdicent.h \ ../../dcmdata/include/dcmtk/dcmdata/dchashdi.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdict.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdeftag.h \ ../../dcmdata/include/dcmtk/dcmdata/dcobject.h \ ../../dcmdata/include/dcmtk/dcmdata/dcstack.h \ ../../dcmdata/include/dcmtk/dcmdata/dcelem.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../../dcmdata/include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpcache.h \ ../../dcmdata/include/dcmtk/dcmdata/dcmetinf.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdatset.h \ ../../dcmdata/include/dcmtk/dcmdata/dcsequen.h \ ../../dcmdata/include/dcmtk/dcmdata/dcfilefo.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdicdir.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdirrec.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrulup.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrul.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpixseq.h \ ../../dcmdata/include/dcmtk/dcmdata/dcofsetl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcbytstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrae.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvras.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrcs.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrda.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrds.h \ ../../ofstd/include/dcmtk/ofstd/ofvector.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrdt.h \ ../../ofstd/include/dcmtk/ofstd/ofdatime.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvris.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrtm.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrui.h \ ../../dcmdata/include/dcmtk/dcmdata/dcchrstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlo.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlt.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrpn.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsh.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrst.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrut.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrobow.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpixel.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrpobw.h \ ../../dcmdata/include/dcmtk/dcmdata/dcovlay.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrat.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrss.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrus.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrfl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrfd.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrof.h \ ../../dcmdata/include/dcmtk/dcmdata/cmdlnarg.h \ ../include/dcmtk/dcmpstat/dvpstyp.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../include/dcmtk/dcmpstat/dvpsdef.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h dvpstxl.o: dvpstxl.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmpstat/dvpstxl.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../dcmdata/include/dcmtk/dcmdata/dcobject.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dcxfer.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvr.h \ ../../dcmdata/include/dcmtk/dcmdata/dctag.h \ ../../dcmdata/include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmdata/include/dcmtk/dcmdata/dcstack.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../dcmdata/include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpcache.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../include/dcmtk/dcmpstat/dvpstx.h \ ../../dcmdata/include/dcmtk/dcmdata/dctk.h \ ../../dcmdata/include/dcmtk/dcmdata/dcswap.h \ ../../dcmdata/include/dcmtk/dcmdata/dcistrma.h \ ../../dcmdata/include/dcmtk/dcmdata/dcostrma.h \ ../../dcmdata/include/dcmtk/dcmdata/dcuid.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvm.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdicent.h \ ../../dcmdata/include/dcmtk/dcmdata/dchashdi.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdict.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdeftag.h \ ../../dcmdata/include/dcmtk/dcmdata/dcelem.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../../dcmdata/include/dcmtk/dcmdata/dcmetinf.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdatset.h \ ../../dcmdata/include/dcmtk/dcmdata/dcsequen.h \ ../../dcmdata/include/dcmtk/dcmdata/dcfilefo.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdicdir.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdirrec.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrulup.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrul.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpixseq.h \ ../../dcmdata/include/dcmtk/dcmdata/dcofsetl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcbytstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrae.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvras.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrcs.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrda.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrds.h \ ../../ofstd/include/dcmtk/ofstd/ofvector.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrdt.h \ ../../ofstd/include/dcmtk/ofstd/ofdatime.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvris.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrtm.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrui.h \ ../../dcmdata/include/dcmtk/dcmdata/dcchrstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlo.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlt.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrpn.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsh.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrst.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrut.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrobow.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpixel.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrpobw.h \ ../../dcmdata/include/dcmtk/dcmdata/dcovlay.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrat.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrss.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrus.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrfl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrfd.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrof.h \ ../../dcmdata/include/dcmtk/dcmdata/cmdlnarg.h \ ../include/dcmtk/dcmpstat/dvpstyp.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h dvpsvl.o: dvpsvl.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmpstat/dvpsvl.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmpstat/dvpstyp.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../dcmdata/include/dcmtk/dcmdata/dctk.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../dcmdata/include/dcmtk/dcmdata/dcswap.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dcxfer.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvr.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../dcmdata/include/dcmtk/dcmdata/dcistrma.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dcostrma.h \ ../../dcmdata/include/dcmtk/dcmdata/dcuid.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvm.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h \ ../../dcmdata/include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmdata/include/dcmtk/dcmdata/dctag.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdicent.h \ ../../dcmdata/include/dcmtk/dcmdata/dchashdi.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdict.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdeftag.h \ ../../dcmdata/include/dcmtk/dcmdata/dcobject.h \ ../../dcmdata/include/dcmtk/dcmdata/dcstack.h \ ../../dcmdata/include/dcmtk/dcmdata/dcelem.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../../dcmdata/include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpcache.h \ ../../dcmdata/include/dcmtk/dcmdata/dcmetinf.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdatset.h \ ../../dcmdata/include/dcmtk/dcmdata/dcsequen.h \ ../../dcmdata/include/dcmtk/dcmdata/dcfilefo.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdicdir.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdirrec.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrulup.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrul.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpixseq.h \ ../../dcmdata/include/dcmtk/dcmdata/dcofsetl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcbytstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrae.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvras.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrcs.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrda.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrds.h \ ../../ofstd/include/dcmtk/ofstd/ofvector.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrdt.h \ ../../ofstd/include/dcmtk/ofstd/ofdatime.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvris.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrtm.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrui.h \ ../../dcmdata/include/dcmtk/dcmdata/dcchrstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlo.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlt.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrpn.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsh.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrst.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrut.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrobow.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpixel.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrpobw.h \ ../../dcmdata/include/dcmtk/dcmdata/dcovlay.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrat.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrss.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrus.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrfl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrfd.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrof.h \ ../../dcmdata/include/dcmtk/dcmdata/cmdlnarg.h \ ../include/dcmtk/dcmpstat/dvpssv.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrus.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrds.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlo.h \ ../include/dcmtk/dcmpstat/dvpsril.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../include/dcmtk/dcmpstat/dvpsdef.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../include/dcmtk/dcmpstat/dvpsri.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrui.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvris.h dvpsvll.o: dvpsvll.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmpstat/dvpsvll.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../dcmdata/include/dcmtk/dcmdata/dcobject.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dcxfer.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvr.h \ ../../dcmdata/include/dcmtk/dcmdata/dctag.h \ ../../dcmdata/include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmdata/include/dcmtk/dcmdata/dcstack.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../dcmdata/include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpcache.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../include/dcmtk/dcmpstat/dvpsvl.h ../include/dcmtk/dcmpstat/dvpstyp.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmdata/include/dcmtk/dcmdata/dctk.h \ ../../dcmdata/include/dcmtk/dcmdata/dcswap.h \ ../../dcmdata/include/dcmtk/dcmdata/dcistrma.h \ ../../dcmdata/include/dcmtk/dcmdata/dcostrma.h \ ../../dcmdata/include/dcmtk/dcmdata/dcuid.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvm.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdicent.h \ ../../dcmdata/include/dcmtk/dcmdata/dchashdi.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdict.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdeftag.h \ ../../dcmdata/include/dcmtk/dcmdata/dcelem.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../../dcmdata/include/dcmtk/dcmdata/dcmetinf.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdatset.h \ ../../dcmdata/include/dcmtk/dcmdata/dcsequen.h \ ../../dcmdata/include/dcmtk/dcmdata/dcfilefo.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdicdir.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdirrec.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrulup.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrul.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpixseq.h \ ../../dcmdata/include/dcmtk/dcmdata/dcofsetl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcbytstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrae.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvras.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrcs.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrda.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrds.h \ ../../ofstd/include/dcmtk/ofstd/ofvector.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrdt.h \ ../../ofstd/include/dcmtk/ofstd/ofdatime.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvris.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrtm.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrui.h \ ../../dcmdata/include/dcmtk/dcmdata/dcchrstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlo.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlt.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrpn.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsh.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrst.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrut.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrobow.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpixel.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrpobw.h \ ../../dcmdata/include/dcmtk/dcmdata/dcovlay.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrat.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrss.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrus.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrfl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrfd.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrof.h \ ../../dcmdata/include/dcmtk/dcmdata/cmdlnarg.h dvpsvw.o: dvpsvw.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmpstat/dvpsvw.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmdata/include/dcmtk/dcmdata/dctk.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../dcmdata/include/dcmtk/dcmdata/dcswap.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../../dcmdata/include/dcmtk/dcmdata/dcxfer.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvr.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../dcmdata/include/dcmtk/dcmdata/dcistrma.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dcostrma.h \ ../../dcmdata/include/dcmtk/dcmdata/dcuid.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvm.h \ ../../ofstd/include/dcmtk/ofstd/ofdefine.h \ ../../dcmdata/include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmdata/include/dcmtk/dcmdata/dctag.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdicent.h \ ../../dcmdata/include/dcmtk/dcmdata/dchashdi.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdict.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdeftag.h \ ../../dcmdata/include/dcmtk/dcmdata/dcobject.h \ ../../dcmdata/include/dcmtk/dcmdata/dcstack.h \ ../../dcmdata/include/dcmtk/dcmdata/dcelem.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../../dcmdata/include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpcache.h \ ../../dcmdata/include/dcmtk/dcmdata/dcmetinf.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdatset.h \ ../../dcmdata/include/dcmtk/dcmdata/dcsequen.h \ ../../dcmdata/include/dcmtk/dcmdata/dcfilefo.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdicdir.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdirrec.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrulup.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrul.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpixseq.h \ ../../dcmdata/include/dcmtk/dcmdata/dcofsetl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcbytstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrae.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvras.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrcs.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrda.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrds.h \ ../../ofstd/include/dcmtk/ofstd/ofvector.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrdt.h \ ../../ofstd/include/dcmtk/ofstd/ofdatime.h \ ../../ofstd/include/dcmtk/ofstd/ofdate.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvris.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrtm.h \ ../../ofstd/include/dcmtk/ofstd/oftime.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrui.h \ ../../dcmdata/include/dcmtk/dcmdata/dcchrstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlo.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlt.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrpn.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsh.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrst.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrut.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrobow.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpixel.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrpobw.h \ ../../dcmdata/include/dcmtk/dcmdata/dcovlay.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrat.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrss.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrus.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrsl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrfl.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrfd.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrof.h \ ../../dcmdata/include/dcmtk/dcmdata/cmdlnarg.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h dvpsvwl.o: dvpsvwl.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdeftag.h \ ../../dcmdata/include/dcmtk/dcmdata/dctagkey.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrlo.h \ ../../dcmdata/include/dcmtk/dcmdata/dcchrstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dcbytstr.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../dcmdata/include/dcmtk/dcmdata/dcelem.h \ ../../dcmdata/include/dcmtk/dcmdata/dcobject.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dcxfer.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvr.h \ ../../dcmdata/include/dcmtk/dcmdata/dctag.h \ ../../dcmdata/include/dcmtk/dcmdata/dcstack.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrds.h \ ../../ofstd/include/dcmtk/ofstd/ofvector.h \ ../include/dcmtk/dcmpstat/dvpsvwl.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpcache.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../include/dcmtk/dcmpstat/dvpsvw.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../include/dcmtk/dcmpstat/dvpsdef.h \ ../../oflog/include/dcmtk/oflog/oflog.h dvsighdl.o: dvsighdl.cc ../../config/include/dcmtk/config/osconfig.h \ ../../config/include/dcmtk/config/cfunix.h \ ../include/dcmtk/dcmpstat/dvsighdl.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../config/include/dcmtk/config/osconfig.h \ ../include/dcmtk/dcmpstat/dvpstyp.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../dcmsign/include/dcmtk/dcmsign/sicertvf.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../dcmsign/include/dcmtk/dcmsign/sitypes.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dcdeftag.h \ ../../dcmdata/include/dcmtk/dcmdata/dctagkey.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmsign/include/dcmtk/dcmsign/dcsignat.h \ ../../dcmdata/include/dcmtk/dcmdata/dcxfer.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../config/include/dcmtk/config/osconfig.h \ ../../oflog/include/dcmtk/oflog/logger.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/config/defines.h \ ../../oflog/include/dcmtk/oflog/helpers/threadcf.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h \ ../../oflog/include/dcmtk/oflog/spi/apndatch.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/appender.h \ ../../oflog/include/dcmtk/oflog/layout.h \ ../../oflog/include/dcmtk/oflog/helpers/lloguser.h \ ../../oflog/include/dcmtk/oflog/config.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/streams.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../ofstd/include/dcmtk/ofstd/ofmap.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../oflog/include/dcmtk/oflog/loglevel.h \ ../../oflog/include/dcmtk/oflog/ndc.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../ofstd/include/dcmtk/ofstd/ofstack.h \ ../../oflog/include/dcmtk/oflog/tstring.h \ ../../oflog/include/dcmtk/oflog/helpers/timehelp.h \ ../../oflog/include/dcmtk/oflog/helpers/threads.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/spi/filter.h \ ../../oflog/include/dcmtk/oflog/helpers/pointer.h \ ../../oflog/include/dcmtk/oflog/helpers/property.h \ ../../oflog/include/dcmtk/oflog/spi/logevent.h \ ../../ofstd/include/dcmtk/ofstd/ofaptr.h \ ../../oflog/include/dcmtk/oflog/spi/logfact.h \ ../../oflog/include/dcmtk/oflog/logmacro.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../ofstd/include/dcmtk/ofstd/ofconapp.h \ ../../ofstd/include/dcmtk/ofstd/ofcmdln.h \ ../../ofstd/include/dcmtk/ofstd/ofconsol.h \ ../../ofstd/include/dcmtk/ofstd/ofthread.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvr.h \ ../../ofstd/include/dcmtk/ofstd/ofglobal.h \ ../../ofstd/include/dcmtk/ofstd/ofstdinc.h \ ../../dcmdata/include/dcmtk/dcmdata/dcobject.h \ ../../dcmdata/include/dcmtk/dcmdata/dcerror.h \ ../../dcmdata/include/dcmtk/dcmdata/dcxfer.h \ ../../dcmdata/include/dcmtk/dcmdata/dctag.h \ ../../dcmdata/include/dcmtk/dcmdata/dcstack.h \ ../../ofstd/include/dcmtk/ofstd/oftypes.h \ ../../dcmdata/include/dcmtk/dcmdata/dcsequen.h \ ../../ofstd/include/dcmtk/ofstd/offile.h \ ../../ofstd/include/dcmtk/ofstd/ofstd.h \ ../../ofstd/include/dcmtk/ofstd/ofcond.h \ ../../dcmdata/include/dcmtk/dcmdata/dcelem.h \ ../../dcmdata/include/dcmtk/dcmdata/dcobject.h \ ../../dcmdata/include/dcmtk/dcmdata/dclist.h \ ../../ofstd/include/dcmtk/ofstd/ofcast.h \ ../../dcmdata/include/dcmtk/dcmdata/dcvrat.h \ ../../dcmdata/include/dcmtk/dcmdata/dcitem.h \ ../../dcmdata/include/dcmtk/dcmdata/dcpcache.h \ ../../ofstd/include/dcmtk/ofstd/oflist.h \ ../include/dcmtk/dcmpstat/dvpscf.h \ ../../dcmdata/include/dcmtk/dcmdata/dctypes.h \ ../../oflog/include/dcmtk/oflog/oflog.h \ ../../dcmsign/include/dcmtk/dcmsign/sicert.h \ ../../ofstd/include/dcmtk/ofstd/ofstring.h \ ../../dcmsign/include/dcmtk/dcmsign/sitypes.h \ ../../dcmsign/include/dcmtk/dcmsign/sinullpr.h \ ../../dcmsign/include/dcmtk/dcmsign/sisprof.h \ ../../dcmsign/include/dcmtk/dcmsign/siprivat.h \ ../../dcmsign/include/dcmtk/dcmsign/siripemd.h \ ../../dcmsign/include/dcmtk/dcmsign/simac.h \ ../../ofstd/include/dcmtk/ofstd/ofstream.h dcmtk-3.6.0/dcmpstat/libsrc/dvpscul.cc0000644000310500011400000000763511455601070017135 0ustar joergrdicom3/* * * Copyright (C) 1998-2010, 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: DVPSCurve_PList * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:14:32 $ * CVS/RCS Revision: $Revision: 1.12 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmpstat/dvpscul.h" #include "dcmtk/dcmpstat/dvpscu.h" /* for DVPSCurve */ DVPSCurve_PList::DVPSCurve_PList() : list_() { } DVPSCurve_PList::DVPSCurve_PList(const DVPSCurve_PList &arg) : list_() { OFListConstIterator(DVPSCurve *) first = arg.list_.begin(); OFListConstIterator(DVPSCurve *) last = arg.list_.end(); while (first != last) { list_.push_back((*first)->clone()); ++first; } } DVPSCurve_PList::~DVPSCurve_PList() { clear(); } void DVPSCurve_PList::clear() { OFListIterator(DVPSCurve *) first = list_.begin(); OFListIterator(DVPSCurve *) last = list_.end(); while (first != last) { delete (*first); first = list_.erase(first); } } OFCondition DVPSCurve_PList::read(DcmItem &dset) { OFCondition result = EC_Normal; DVPSCurve *newCurve = NULL; for (Uint8 i=0; i<16; i+=2) { newCurve = new DVPSCurve(); if (newCurve) { result = newCurve->read(dset,i); if (result==EC_Normal) list_.push_back(newCurve); else delete newCurve; } else return EC_MemoryExhausted; } return EC_Normal; } OFBool DVPSCurve_PList::haveCurveGroup(Uint16 group) { if (getCurveGroup(group)) return OFTrue; else return OFFalse; } DVPSCurve *DVPSCurve_PList::getCurveGroup(Uint16 group) { Uint8 lowergroup = (Uint8)(group & 0x00FF); OFListIterator(DVPSCurve *) first = list_.begin(); OFListIterator(DVPSCurve *) last = list_.end(); while (first != last) { if ((*first)->getCurveGroup() == lowergroup) return *first; ++first; } return NULL; } DVPSCurve *DVPSCurve_PList::getCurve(size_t idx) { OFListIterator(DVPSCurve *) first = list_.begin(); OFListIterator(DVPSCurve *) last = list_.end(); while (first != last) { if (idx==0) return *first; idx--; ++first; } return NULL; } /* * $Log: dvpscul.cc,v $ * Revision 1.12 2010-10-14 13:14:32 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.11 2009-11-24 14:12:58 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.10 2005-12-08 15:46:22 meichel * Changed include path schema for all DCMTK header files * * Revision 1.9 2004/02/04 15:57:49 joergr * Removed acknowledgements with e-mail addresses from CVS log. * * Revision 1.8 2003/09/05 08:37:46 meichel * Fixed minor issue that caused certain error messages during the * parse process on a GSPS object to be "swallowed". * * Revision 1.7 2003/06/12 18:23:11 joergr * Modified code to use const_iterators where appropriate (required for STL). * * Revision 1.6 2003/06/04 10:18:07 meichel * Replaced private inheritance from template with aggregation * * Revision 1.5 2001/09/26 15:36:24 meichel * Adapted dcmpstat to class OFCondition * * Revision 1.4 2001/06/01 15:50:29 meichel * Updated copyright header * * Revision 1.3 2000/06/02 16:00:58 meichel * Adapted all dcmpstat classes to use OFConsole for log and error output * * Revision 1.2 2000/03/08 16:29:03 meichel * Updated copyright header. * * Revision 1.1 1998/12/22 17:57:15 meichel * Implemented Presentation State interface for overlays, * VOI LUTs, VOI windows, curves. Added test program that * allows to add curve data to DICOM images. * * */ dcmtk-3.6.0/dcmpstat/libsrc/dvpsov.cc0000644000310500011400000002404411455601070016767 0ustar joergrdicom3/* * * Copyright (C) 1998-2010, 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: DVPSOverlay * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:14:32 $ * CVS/RCS Revision: $Revision: 1.19 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmpstat/dvpsov.h" #include "dcmtk/ofstd/ofstring.h" #include "dcmtk/dcmpstat/dvpsdef.h" /* for constants and macros */ /* --------------- class DVPSOverlay --------------- */ DVPSOverlay::DVPSOverlay() : overlayGroup(0) , overlayRows(DCM_OverlayRows) , overlayColumns(DCM_OverlayColumns) , overlayType(DCM_OverlayType) , overlayOrigin(DCM_OverlayOrigin) , overlayBitsAllocated(DCM_OverlayBitsAllocated) , overlayBitPosition(DCM_OverlayBitPosition) , overlayData(DCM_OverlayData) , overlayDescription(DCM_OverlayDescription) , overlayLabel(DCM_OverlayLabel) { } DVPSOverlay::DVPSOverlay(const DVPSOverlay& copy) : overlayGroup(copy.overlayGroup) , overlayRows(copy.overlayRows) , overlayColumns(copy.overlayColumns) , overlayType(copy.overlayType) , overlayOrigin(copy.overlayOrigin) , overlayBitsAllocated(copy.overlayBitsAllocated) , overlayBitPosition(copy.overlayBitPosition) , overlayData(copy.overlayData) , overlayDescription(copy.overlayDescription) , overlayLabel(copy.overlayLabel) { } DVPSOverlay::~DVPSOverlay() { } OFCondition DVPSOverlay::read(DcmItem &dset, Uint8 ovGroup, Uint8 asGroup) { OFCondition result = EC_Normal; DcmStack stack; if (asGroup==0xFF) asGroup=ovGroup; overlayGroup = asGroup; Uint16 gtag = 0x6000 + ovGroup; overlayRows.setGTag(gtag); overlayColumns.setGTag(gtag); overlayType.setGTag(gtag); overlayOrigin.setGTag(gtag); overlayBitsAllocated.setGTag(gtag); overlayBitPosition.setGTag(gtag); overlayData.setGTag(gtag); overlayDescription.setGTag(gtag); overlayLabel.setGTag(gtag); READ_FROM_DATASET(DcmUnsignedShort, overlayRows) READ_FROM_DATASET(DcmUnsignedShort, overlayColumns) READ_FROM_DATASET(DcmCodeString, overlayType) READ_FROM_DATASET(DcmSignedShort, overlayOrigin) READ_FROM_DATASET(DcmUnsignedShort, overlayBitsAllocated) READ_FROM_DATASET(DcmUnsignedShort, overlayBitPosition) READ_FROM_DATASET(DcmOverlayData, overlayData) READ_FROM_DATASET(DcmLongString, overlayDescription) READ_FROM_DATASET(DcmLongString, overlayLabel) /* Now perform basic sanity checks and adjust use flags */ if (overlayRows.getLength() == 0) { result=EC_IllegalCall; DCMPSTAT_INFO("presentation state contains an overlay with overlayRows absent or empty"); } else if (overlayRows.getVM() != 1) { result=EC_IllegalCall; DCMPSTAT_INFO("presentation state contains an overlay with overlayRows VM != 1"); } if (overlayColumns.getLength() == 0) { result=EC_IllegalCall; DCMPSTAT_INFO("presentation state contains an overlay with overlayColumns absent or empty"); } else if (overlayColumns.getVM() != 1) { result=EC_IllegalCall; DCMPSTAT_INFO("presentation state contains an overlay with overlayColumns VM != 1"); } if (overlayType.getLength() == 0) { result=EC_IllegalCall; DCMPSTAT_INFO("presentation state contains an overlay with overlayType absent or empty"); } else if (overlayType.getVM() != 1) { result=EC_IllegalCall; DCMPSTAT_INFO("presentation state contains an overlay with overlayType VM != 1"); } if (overlayOrigin.getLength() == 0) { result=EC_IllegalCall; DCMPSTAT_INFO("presentation state contains an overlay with overlayOrigin absent or empty"); } else if (overlayOrigin.getVM() != 2) { result=EC_IllegalCall; DCMPSTAT_INFO("presentation state contains an overlay with overlayOrigin VM != 2"); } if (overlayBitsAllocated.getLength() == 0) { result=EC_IllegalCall; DCMPSTAT_INFO("presentation state contains an overlay with overlayBitsAllocated absent or empty"); } else if (overlayBitsAllocated.getVM() != 1) { result=EC_IllegalCall; DCMPSTAT_INFO("presentation state contains an overlay with overlayBitsAllocated VM != 1"); } if (overlayBitPosition.getLength() == 0) { result=EC_IllegalCall; DCMPSTAT_INFO("presentation state contains an overlay with overlayBitPosition absent or empty"); } else if (overlayBitPosition.getVM() != 1) { result=EC_IllegalCall; DCMPSTAT_INFO("presentation state contains an overlay with overlayBitPosition VM != 1"); } /* in a presentation state object, the overlay data must always be present in this group */ if (overlayData.getLength() == 0) { result=EC_IllegalCall; DCMPSTAT_INFO("presentation state contains an overlay with overlayData absent or empty"); } return result; } OFCondition DVPSOverlay::write(DcmItem &dset) { OFCondition result = EC_Normal; DcmElement *delem=NULL; Uint16 repeatingGroup = 0x6000 + overlayGroup; ADD_REPEATING_ELEMENT_TO_DATASET(DcmUnsignedShort, overlayRows, repeatingGroup) ADD_REPEATING_ELEMENT_TO_DATASET(DcmUnsignedShort, overlayColumns, repeatingGroup) ADD_REPEATING_ELEMENT_TO_DATASET(DcmCodeString, overlayType, repeatingGroup) ADD_REPEATING_ELEMENT_TO_DATASET(DcmSignedShort, overlayOrigin, repeatingGroup) ADD_REPEATING_ELEMENT_TO_DATASET(DcmUnsignedShort, overlayBitsAllocated, repeatingGroup) ADD_REPEATING_ELEMENT_TO_DATASET(DcmUnsignedShort, overlayBitPosition, repeatingGroup) if (overlayData.getLength() >0) { ADD_REPEATING_ELEMENT_TO_DATASET(DcmOverlayData, overlayData, repeatingGroup) } if (overlayDescription.getLength() >0) { ADD_REPEATING_ELEMENT_TO_DATASET(DcmLongString, overlayDescription, repeatingGroup) } if (overlayLabel.getLength() >0) { ADD_REPEATING_ELEMENT_TO_DATASET(DcmLongString, overlayLabel, repeatingGroup) } return result; } OFBool DVPSOverlay::isSuitableAsShutter(unsigned long x, unsigned long y) { // check that overlay is Graphic, not ROI. if (isROI()) return OFFalse; // check if overlay origin is 1\1 Sint16 originX=0; Sint16 originY=0; OFCondition result = overlayOrigin.getSint16(originX,0); if (result==EC_Normal) result = overlayOrigin.getSint16(originY,1); if ((result != EC_Normal)||(originX != 1)||(originY != 1)) return OFFalse; // check if overlay size matches given image size Uint16 rows=0; Uint16 columns=0; result = overlayRows.getUint16(rows,0); if (result==EC_Normal) result = overlayColumns.getUint16(columns,0); if (result==EC_Normal) return ((columns==x)&&(rows==y)); return OFFalse; } const char *DVPSOverlay::getOverlayLabel() { char *c = NULL; if (EC_Normal == overlayLabel.getString(c)) return c; else return NULL; } const char *DVPSOverlay::getOverlayDescription() { char *c = NULL; if (EC_Normal == overlayDescription.getString(c)) return c; else return NULL; } OFBool DVPSOverlay::isROI() { OFString aString; if (EC_Normal == overlayType.getOFString(aString,0)) { return (aString == "ROI"); } return OFFalse; } OFCondition DVPSOverlay::getValues( Sint16& originX, Sint16& originY, Uint16& sizeX, Uint16& sizeY) { OFCondition result = overlayOrigin.getSint16(originX,1); if (result.good()) result = overlayOrigin.getSint16(originY,0); if (result.good()) result = overlayColumns.getUint16(sizeX,0); if (result.good()) result = overlayRows.getUint16(sizeY,0); return result; } /* * $Log: dvpsov.cc,v $ * Revision 1.19 2010-10-14 13:14:32 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.18 2009-11-24 14:12:58 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.17 2006-08-15 16:57:02 meichel * Updated the code in module dcmpstat to correctly compile when * all standard C++ classes remain in namespace std. * * Revision 1.16 2005/12/08 15:46:36 meichel * Changed include path schema for all DCMTK header files * * Revision 1.15 2003/08/27 14:59:42 meichel * Changed API of class DVPSOverlay to avoid dependency on module dcmimgle * * Revision 1.14 2002/12/09 13:28:16 joergr * Renamed parameter/local variable to avoid name clashes with global * declaration left and/or right (used for as iostream manipulators). * * Revision 1.13 2001/12/18 10:36:41 meichel * Minor modifications to avoid warning on Sun CC 2.0.1 * * Revision 1.12 2001/09/26 15:36:28 meichel * Adapted dcmpstat to class OFCondition * * Revision 1.11 2001/06/01 15:50:34 meichel * Updated copyright header * * Revision 1.10 2000/06/02 16:01:03 meichel * Adapted all dcmpstat classes to use OFConsole for log and error output * * Revision 1.9 2000/05/31 13:02:37 meichel * Moved dcmpstat macros and constants into a common header file * * Revision 1.8 2000/03/08 16:29:07 meichel * Updated copyright header. * * Revision 1.7 2000/03/03 14:14:01 meichel * Implemented library support for redirecting error messages into memory * instead of printing them to stdout/stderr for GUI applications. * * Revision 1.6 1999/05/03 11:01:37 joergr * Minor code purifications to keep Sun CC 2.0.1 quiet. * * Revision 1.5 1999/02/09 15:59:08 meichel * Implemented bitmap shutter activation amd method for * exchanging graphic layers. * * Revision 1.4 1998/12/23 14:02:26 meichel * Updated for changed interfaces in dcmimage overlays. * Fixed bug affecting overlay origin delivered to dcmimage. * * Revision 1.3 1998/12/22 17:57:17 meichel * Implemented Presentation State interface for overlays, * VOI LUTs, VOI windows, curves. Added test program that * allows to add curve data to DICOM images. * * Revision 1.2 1998/12/14 16:10:44 meichel * Implemented Presentation State interface for graphic layers, * text and graphic annotations, presentation LUTs. * * Revision 1.1 1998/11/27 14:50:44 meichel * Initial Release. * * */ dcmtk-3.6.0/dcmpstat/libsrc/dvpsgr.cc0000644000310500011400000002266711455601070016764 0ustar joergrdicom3/* * * Copyright (C) 1998-2010, 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: DVPSGraphicObject * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:14:32 $ * CVS/RCS Revision: $Revision: 1.14 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmpstat/dvpsgr.h" #include "dcmtk/ofstd/ofstring.h" #include "dcmtk/dcmpstat/dvpsdef.h" /* for constants and macros */ /* --------------- class DVPSGraphicObject --------------- */ DVPSGraphicObject::DVPSGraphicObject() : graphicAnnotationUnits(DCM_GraphicAnnotationUnits) , numberOfGraphicPoints(DCM_NumberOfGraphicPoints) , graphicData(DCM_GraphicData) , graphicType(DCM_GraphicType) , graphicFilled(DCM_GraphicFilled) { } DVPSGraphicObject::DVPSGraphicObject(const DVPSGraphicObject& copy) : graphicAnnotationUnits(copy.graphicAnnotationUnits) , numberOfGraphicPoints(copy.numberOfGraphicPoints) , graphicData(copy.graphicData) , graphicType(copy.graphicType) , graphicFilled(copy.graphicFilled) { } DVPSGraphicObject::~DVPSGraphicObject() { } OFCondition DVPSGraphicObject::read(DcmItem &dset) { OFCondition result = EC_Normal; DcmStack stack; DcmUnsignedShort graphicDimensions(DCM_GraphicDimensions); // VR=US, VM=1, Type 1 READ_FROM_DATASET(DcmCodeString, graphicAnnotationUnits) READ_FROM_DATASET(DcmUnsignedShort, graphicDimensions) READ_FROM_DATASET(DcmUnsignedShort, numberOfGraphicPoints) READ_FROM_DATASET(DcmFloatingPointSingle, graphicData) READ_FROM_DATASET(DcmCodeString, graphicType) READ_FROM_DATASET(DcmCodeString, graphicFilled) /* Now perform basic sanity checks */ if (graphicAnnotationUnits.getLength() == 0) { result=EC_IllegalCall; DCMPSTAT_INFO("presentation state contains a graphic object SQ item with graphicAnnotationUnits absent or empty"); } else if (graphicAnnotationUnits.getVM() != 1) { result=EC_IllegalCall; DCMPSTAT_INFO("presentation state contains a graphic object SQ item with graphicAnnotationUnits VM != 1"); } if (graphicDimensions.getVM() != 1) { result=EC_IllegalCall; DCMPSTAT_INFO("presentation state contains a graphic object SQ item with graphicDimensions VM != 1"); } else { Uint16 dimension=0; if ((EC_Normal != graphicDimensions.getUint16(dimension,0))||(dimension != 2)) { result=EC_IllegalCall; DCMPSTAT_INFO("presentation state contains a graphic object SQ item with graphicDimensions != 2"); } } if (numberOfGraphicPoints.getLength() == 0) { result=EC_IllegalCall; DCMPSTAT_INFO("presentation state contains a graphic object SQ item with numberOfGraphicPoints absent or empty"); } else if (numberOfGraphicPoints.getVM() != 1) { result=EC_IllegalCall; DCMPSTAT_INFO("presentation state contains a graphic object SQ item with numberOfGraphicPoints VM != 1"); } if (graphicData.getLength() == 0) { result=EC_IllegalCall; DCMPSTAT_INFO("presentation state contains a graphic object SQ item with graphicData absent or empty"); } else if (graphicData.getVM() < 2) { result=EC_IllegalCall; DCMPSTAT_INFO("presentation state contains a graphic object SQ item with graphicData VM < 2"); } if (graphicType.getLength() == 0) { result=EC_IllegalCall; DCMPSTAT_INFO("presentation state contains a graphic object SQ item with graphicType absent or empty"); } else if (graphicType.getVM() != 1) { result=EC_IllegalCall; DCMPSTAT_INFO("presentation state contains a graphic object SQ item with graphicType VM != 1"); } if ((graphicFilled.getLength() > 0)&&(graphicFilled.getVM() != 1)) { result=EC_IllegalCall; DCMPSTAT_INFO("presentation state contains a graphic object SQ item with graphicFilled present but VM != 1"); } return result; } OFCondition DVPSGraphicObject::write(DcmItem &dset) { OFCondition result = EC_Normal; DcmElement *delem=NULL; DcmUnsignedShort graphicDimensions(DCM_GraphicDimensions); // VR=US, VM=1, Type 1 Uint16 dimensions=2; graphicDimensions.putUint16(dimensions,0); ADD_TO_DATASET(DcmCodeString, graphicAnnotationUnits) ADD_TO_DATASET(DcmUnsignedShort, graphicDimensions) ADD_TO_DATASET(DcmUnsignedShort, numberOfGraphicPoints) ADD_TO_DATASET(DcmFloatingPointSingle, graphicData) ADD_TO_DATASET(DcmCodeString, graphicType) // strictly speaking we are not allowed to include graphicFilled // when the graphicType is "POLYLINE" or "INTERPOLATED" and the // first point of graphicData is not equal the last point. // For simplicity reasons we always include the attribute unless // the graphic type is POINT. if (DVPST_point != getGraphicType()) { ADD_TO_DATASET(DcmCodeString, graphicFilled) } return result; } DVPSannotationUnit DVPSGraphicObject::getAnnotationUnits() { DVPSannotationUnit aresult = DVPSA_pixels; OFString aString; OFCondition result = graphicAnnotationUnits.getOFString(aString,0); if ((result==EC_Normal)&&(aString == "DISPLAY")) aresult = DVPSA_display; return aresult; } size_t DVPSGraphicObject::getNumberOfPoints() { Uint16 result=0; if (EC_Normal == numberOfGraphicPoints.getUint16(result,0)) return result; else return 0; } OFCondition DVPSGraphicObject::getPoint(size_t idx, Float32& x, Float32& y) { x=0.0; y=0.0; OFCondition result = EC_IllegalCall; if ((idx*2+1) 1) { result=EC_IllegalCall; DCMPSTAT_INFO("presentation state contains a curve or overlay activation layer with VM > 1"); } return result; } OFCondition DVPSOverlayCurveActivationLayer::write(DcmItem &dset) { OFCondition result = EC_Normal; DcmElement *delem=NULL; ADD_REPEATING_ELEMENT_TO_DATASET(DcmCodeString, activationLayer, repeatingGroup) return result; } void DVPSOverlayCurveActivationLayer::setActivationLayer(const char *aLayer) { if (aLayer) activationLayer.putString(aLayer); else activationLayer.clear(); return; } void DVPSOverlayCurveActivationLayer::setRepeatingGroup(Uint16 rGroup) { repeatingGroup = rGroup; return; } const char *DVPSOverlayCurveActivationLayer::getActivationLayer() { char *c = NULL; if (EC_Normal == activationLayer.getString(c)) return c; else return NULL; } Uint16 DVPSOverlayCurveActivationLayer::getRepeatingGroup() { return repeatingGroup; } OFBool DVPSOverlayCurveActivationLayer::isRepeatingGroup(Uint16 rGroup) { if (rGroup==repeatingGroup) return OFTrue; else return OFFalse; } /* * $Log: dvpsal.cc,v $ * Revision 1.12 2010-10-14 13:14:31 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.11 2009-11-24 14:12:58 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.10 2009-09-30 10:42:38 uli * Make dcmpstat's include headers self-sufficient by including all * needed headers directly and stop using dctk.h * * Revision 1.9 2006-08-15 16:57:02 meichel * Updated the code in module dcmpstat to correctly compile when * all standard C++ classes remain in namespace std. * * Revision 1.8 2005/12/08 15:46:18 meichel * Changed include path schema for all DCMTK header files * * Revision 1.7 2001/09/26 15:36:23 meichel * Adapted dcmpstat to class OFCondition * * Revision 1.6 2001/06/01 15:50:27 meichel * Updated copyright header * * Revision 1.5 2000/06/02 16:00:57 meichel * Adapted all dcmpstat classes to use OFConsole for log and error output * * Revision 1.4 2000/05/31 13:02:35 meichel * Moved dcmpstat macros and constants into a common header file * * Revision 1.3 2000/03/08 16:29:01 meichel * Updated copyright header. * * Revision 1.2 2000/03/03 14:13:57 meichel * Implemented library support for redirecting error messages into memory * instead of printing them to stdout/stderr for GUI applications. * * Revision 1.1 1998/11/27 14:50:38 meichel * Initial Release. * * */ dcmtk-3.6.0/dcmpstat/libsrc/dvpsvll.cc0000644000310500011400000000751111455601071017141 0ustar joergrdicom3/* * * Copyright (C) 1998-2010, 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: DVPSVOILUT_PList * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:14:33 $ * CVS/RCS Revision: $Revision: 1.12 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmpstat/dvpsvll.h" #include "dcmtk/dcmpstat/dvpsvl.h" /* for DVPSVOILUT */ DVPSVOILUT_PList::DVPSVOILUT_PList() : list_() { } DVPSVOILUT_PList::DVPSVOILUT_PList(const DVPSVOILUT_PList &arg) : list_() { OFListConstIterator(DVPSVOILUT *) first = arg.list_.begin(); OFListConstIterator(DVPSVOILUT *) last = arg.list_.end(); while (first != last) { list_.push_back((*first)->clone()); ++first; } } DVPSVOILUT_PList::~DVPSVOILUT_PList() { clear(); } void DVPSVOILUT_PList::clear() { OFListIterator(DVPSVOILUT *) first = list_.begin(); OFListIterator(DVPSVOILUT *) last = list_.end(); while (first != last) { delete (*first); first = list_.erase(first); } } OFCondition DVPSVOILUT_PList::read(DcmItem &dset) { OFCondition result = EC_Normal; DcmStack stack; DVPSVOILUT *newObject = NULL; DcmSequenceOfItems *dseq=NULL; DcmItem *ditem=NULL; if (EC_Normal == dset.search(DCM_VOILUTSequence, stack, ESM_fromHere, OFFalse)) { dseq=(DcmSequenceOfItems *)stack.top(); if (dseq) { unsigned long numItems = dseq->card(); for (unsigned int i=0; igetItem(i); newObject = new DVPSVOILUT(); if (newObject && ditem) { if (EC_Normal == newObject->read(*ditem)) list_.push_back(newObject); else delete(newObject); } else result = EC_MemoryExhausted; } } } return result; } DVPSVOILUT *DVPSVOILUT_PList::getVOILUT(size_t idx) { OFListIterator(DVPSVOILUT *) first = list_.begin(); OFListIterator(DVPSVOILUT *) last = list_.end(); while (first != last) { if (idx==0) return *first; idx--; ++first; } return NULL; } /* * $Log: dvpsvll.cc,v $ * Revision 1.12 2010-10-14 13:14:33 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.11 2009-11-24 14:12:59 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.10 2005-12-08 15:46:56 meichel * Changed include path schema for all DCMTK header files * * Revision 1.9 2004/02/04 15:57:49 joergr * Removed acknowledgements with e-mail addresses from CVS log. * * Revision 1.8 2003/09/05 08:37:46 meichel * Fixed minor issue that caused certain error messages during the * parse process on a GSPS object to be "swallowed". * * Revision 1.7 2003/06/12 18:23:11 joergr * Modified code to use const_iterators where appropriate (required for STL). * * Revision 1.6 2003/06/04 10:18:07 meichel * Replaced private inheritance from template with aggregation * * Revision 1.5 2001/09/26 15:36:36 meichel * Adapted dcmpstat to class OFCondition * * Revision 1.4 2001/06/01 15:50:41 meichel * Updated copyright header * * Revision 1.3 2000/06/02 16:01:10 meichel * Adapted all dcmpstat classes to use OFConsole for log and error output * * Revision 1.2 2000/03/08 16:29:13 meichel * Updated copyright header. * * Revision 1.1 1998/12/22 17:57:21 meichel * Implemented Presentation State interface for overlays, * VOI LUTs, VOI windows, curves. Added test program that * allows to add curve data to DICOM images. * * */ dcmtk-3.6.0/dcmpstat/libsrc/dvpshlp.cc0000644000310500011400000002012211455601070017117 0ustar joergrdicom3/* * * Copyright (C) 1998-2010, 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: Joerg Riesmeier, Marco Eichelberg * * Purpose: DVPSHelper * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:14:32 $ * CVS/RCS Revision: $Revision: 1.19 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmpstat/dvpshlp.h" #include "dcmtk/dcmpstat/dvpsdef.h" #include "dcmtk/dcmnet/dcompat.h" /* compatability routines */ #include "dcmtk/dcmdata/dctk.h" #define INCLUDE_CSTDIO #define INCLUDE_CERRNO #define INCLUDE_CTIME #include "dcmtk/ofstd/ofstdinc.h" BEGIN_EXTERN_C #ifdef HAVE_SYS_TYPES_H #include /* for fork */ #endif #ifdef HAVE_SYS_WAIT_H #include /* for waitpid */ #endif #ifdef HAVE_SYS_TIME_H #include /* for wait3 */ #endif #ifdef HAVE_SYS_RESOURCE_H #include /* for wait3 */ #endif END_EXTERN_C void DVPSHelper::currentDate(OFString &str) { DcmDate::getCurrentDate(str); } void DVPSHelper::currentTime(OFString &str) { DcmTime::getCurrentTime(str); } OFCondition DVPSHelper::loadFileFormat(const char *filename, DcmFileFormat *&fileformat) { fileformat = new DcmFileFormat; OFCondition result = fileformat->loadFile(filename); if (result.bad()) { delete fileformat; fileformat = NULL; } return result; } OFCondition DVPSHelper::saveFileFormat(const char *filename, DcmFileFormat *fileformat, OFBool explicitVR) { E_TransferSyntax xfer = EXS_LittleEndianImplicit; if (explicitVR) xfer = EXS_LittleEndianExplicit; return fileformat->saveFile(filename, xfer, EET_ExplicitLength, EGL_recalcGL, EPD_withoutPadding); } OFCondition DVPSHelper::putStringValue(DcmItem *item, DcmTagKey tag, const char *value) { OFCondition result = EC_Normal; DcmTag localTag(tag); if (item) { DcmElement *elem = NULL; switch(localTag.getEVR()) { case EVR_AE: elem = new DcmApplicationEntity(localTag); break; case EVR_AS: elem = new DcmAgeString(localTag); break; case EVR_CS: elem = new DcmCodeString(localTag); break; case EVR_DA: elem = new DcmDate(localTag); break; case EVR_DS: elem = new DcmDecimalString(localTag); break; case EVR_DT: elem = new DcmDateTime(localTag); break; case EVR_IS: elem = new DcmIntegerString(localTag); break; case EVR_TM: elem = new DcmTime(localTag); break; case EVR_UI: elem = new DcmUniqueIdentifier(localTag); break; case EVR_LO: elem = new DcmLongString(localTag); break; case EVR_LT: elem = new DcmLongText(localTag); break; case EVR_PN: elem = new DcmPersonName(localTag); break; case EVR_SH: elem = new DcmShortString(localTag); break; case EVR_ST: elem = new DcmShortText(localTag); break; default: result=EC_IllegalCall; break; } if (elem) { if (value) result = elem->putString(value); } else if (result==EC_Normal) result = EC_MemoryExhausted; if (EC_Normal==result) item->insert(elem, OFTrue); } else result = EC_IllegalCall; return result; } OFCondition DVPSHelper::putUint16Value(DcmItem *item, DcmTagKey tag, Uint16 value) { OFCondition result = EC_Normal; DcmTag localTag(tag); if (item) { DcmElement *elem = new DcmUnsignedShort(localTag); if (elem) result = elem->putUint16(value); else result=EC_MemoryExhausted; if (EC_Normal==result) item->insert(elem, OFTrue); } else result = EC_IllegalCall; return result; } void DVPSHelper::cleanChildren() { #ifdef HAVE_WAITPID int stat_loc; #elif HAVE_WAIT3 struct rusage rusage; #if defined(__NeXT__) /* some systems need a union wait as argument to wait3 */ union wait status; #else int status; #endif #endif #if defined(HAVE_WAITPID) || defined(HAVE_WAIT3) int child = 1; int options = WNOHANG; while (child > 0) { #ifdef HAVE_WAITPID child = (int)(waitpid(-1, &stat_loc, options)); #elif defined(HAVE_WAIT3) child = wait3(&status, options, &rusage); #endif if (child < 0) { if ((errno != ECHILD) && (errno != 0)) { char buf[256]; DCMPSTAT_ERROR("wait for child failed: " << OFStandard::strerror(errno, buf, sizeof(buf))); } } } #endif } void DVPSHelper::setDefault(OFCondition& result, DcmElement& a_name, const char *a_value) { if ((result==EC_Normal)&&(a_name.getLength()==0)) result = a_name.putString(a_value); return; } OFBool DVPSHelper::haveReferencedUIDItem(DcmSequenceOfItems& seq, const char *uid) { if (uid==NULL) return OFFalse; DcmItem *item = NULL; DcmUniqueIdentifier *refuid = NULL; unsigned long numItems = seq.card(); DcmStack stack; OFString aString; for (unsigned long i=0; isearch(DCM_ReferencedSOPClassUID, stack, ESM_fromHere, OFFalse)) { aString.clear(); refuid = (DcmUniqueIdentifier *)(stack.top()); if (refuid) refuid->getOFString(aString,0); if (aString == uid) return OFTrue; } } return OFFalse; } OFCondition DVPSHelper::addReferencedUIDItem(DcmSequenceOfItems& seq, const char *uid) { if (uid==NULL) return EC_IllegalCall; OFCondition result = EC_Normal; DcmElement *delem = new DcmUniqueIdentifier(DCM_ReferencedSOPClassUID); if (delem) { result = delem->putString(uid); if (EC_Normal==result) { DcmItem *ditem = new DcmItem(); if (ditem) { ditem->insert(delem, OFTrue /*replaceOld*/); seq.insert(ditem); } else { delete delem; result=EC_MemoryExhausted; } } } else result=EC_MemoryExhausted; return result; } /* * CVS/RCS Log: * $Log: dvpshlp.cc,v $ * Revision 1.19 2010-10-14 13:14:32 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.18 2010-06-03 10:33:00 joergr * Replaced calls to strerror() by new helper function OFStandard::strerror() * which results in using the thread safe version of strerror() if available. * * Revision 1.17 2009-11-24 14:12:58 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.16 2009-09-30 10:42:38 uli * Make dcmpstat's include headers self-sufficient by including all * needed headers directly and stop using dctk.h * * Revision 1.15 2006-08-15 16:57:02 meichel * Updated the code in module dcmpstat to correctly compile when * all standard C++ classes remain in namespace std. * * Revision 1.14 2005/12/08 15:46:32 meichel * Changed include path schema for all DCMTK header files * * Revision 1.13 2002/11/27 15:48:11 meichel * Adapted module dcmpstat to use of new header file ofstdinc.h * * Revision 1.12 2002/08/20 12:22:03 meichel * Adapted code to new loadFile and saveFile methods, thus removing direct * use of the DICOM stream classes. * * Revision 1.11 2002/04/11 13:13:45 joergr * Replaced direct call of system routines by new standard date and time * functions. * * Revision 1.10 2001/11/28 13:56:55 joergr * Check return value of DcmItem::insert() statements where appropriate to * avoid memory leaks when insert procedure fails. * * Revision 1.9 2001/09/26 15:36:27 meichel * Adapted dcmpstat to class OFCondition * * Revision 1.8 2001/06/01 15:50:32 meichel * Updated copyright header * * Revision 1.7 2000/12/19 13:45:49 joergr * Added #include statement to keep gcc 2.5.8 (NeXTSTEP) quiet. * * Revision 1.6 2000/10/16 11:46:15 joergr * Added check to avoid wrong warning messages when shutting down application * externally. * * */ dcmtk-3.6.0/dcmpstat/libsrc/dvpscu.cc0000644000310500011400000002550711455601070016757 0ustar joergrdicom3/* * * Copyright (C) 1998-2010, 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: DVPSCurve * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:14:32 $ * CVS/RCS Revision: $Revision: 1.8 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmpstat/dvpscu.h" #include "dcmtk/dcmdata/dctk.h" #include "dcmtk/ofstd/ofbmanip.h" DVPSCurve::DVPSCurve() : curveGroup(0) , numberOfPoints(0) , typeOfData(DVPSL_polylineCurve) , curveData(NULL) , curveDescription() , curveLabel() , axisUnitsX() , axisUnitsY() { } DVPSCurve::DVPSCurve(const DVPSCurve& copy) : curveGroup(copy.curveGroup) , numberOfPoints(copy.numberOfPoints) , typeOfData(copy.typeOfData) , curveData(NULL) , curveDescription(copy.curveDescription) , curveLabel(copy.curveLabel) , axisUnitsX(copy.axisUnitsX) , axisUnitsY(copy.axisUnitsY) { if (copy.curveData) { curveData = new double[2*numberOfPoints]; if (curveData) { OFBitmanipTemplate::copyMem(copy.curveData, curveData, 2*numberOfPoints); } } } DVPSCurve::~DVPSCurve() { if (curveData) delete[] curveData; } OFCondition DVPSCurve::read(DcmItem &dset, Uint8 group) { OFCondition result = EC_Normal; DcmStack stack; curveGroup = group; DcmElement *d_curveDimensions = NULL; DcmElement *d_numberOfPoints = NULL; DcmElement *d_typeOfData = NULL; DcmElement *d_dataVR = NULL; DcmElement *d_curveData = NULL; DcmElement *d_curveDescription = NULL; DcmElement *d_axisUnits = NULL; DcmElement *d_curveLabel = NULL; /* first we look for the Curve Data */ DcmTagKey key(0x5000 + group,0x3000); if (EC_Normal == dset.search(key, stack, ESM_fromHere, OFFalse)) { d_curveData = (DcmElement *)(stack.top()); } else return EC_IllegalCall; key.setElement(0x0005); // Curve Dimensions stack.clear(); if (EC_Normal == dset.search(key, stack, ESM_fromHere, OFFalse)) { d_curveDimensions = (DcmElement *)(stack.top()); } else return EC_IllegalCall; key.setElement(0x0110); // Curve Data Descriptor stack.clear(); if (EC_Normal == dset.search(key, stack, ESM_fromHere, OFFalse)) { return EC_IllegalCall; // we don't support curves with Curve Data Descriptor! } key.setElement(0x0010); // Number of Points stack.clear(); if (EC_Normal == dset.search(key, stack, ESM_fromHere, OFFalse)) { d_numberOfPoints = (DcmElement *)(stack.top()); } else return EC_IllegalCall; key.setElement(0x0020); // Type of Data stack.clear(); if (EC_Normal == dset.search(key, stack, ESM_fromHere, OFFalse)) { d_typeOfData = (DcmElement *)(stack.top()); } else return EC_IllegalCall; key.setElement(0x0103); // Data Value Representation stack.clear(); if (EC_Normal == dset.search(key, stack, ESM_fromHere, OFFalse)) { d_dataVR = (DcmElement *)(stack.top()); } else return EC_IllegalCall; key.setElement(0x0022); // Curve Description stack.clear(); if (EC_Normal == dset.search(key, stack, ESM_fromHere, OFFalse)) { d_curveDescription = (DcmElement *)(stack.top()); } key.setElement(0x0030); // Axis Units stack.clear(); if (EC_Normal == dset.search(key, stack, ESM_fromHere, OFFalse)) { d_axisUnits = (DcmElement *)(stack.top()); } key.setElement(0x2500); // Curve Label stack.clear(); if (EC_Normal == dset.search(key, stack, ESM_fromHere, OFFalse)) { d_curveLabel = (DcmElement *)(stack.top()); } Uint16 u=0; if ((EC_Normal != d_curveDimensions->getUint16(u,0))||(u != 2)) { // Curve Dimensions unreadable or != 2, bail out return EC_IllegalCall; } u=0; if ((EC_Normal != d_numberOfPoints->getUint16(u,0))||(u == 0)) { // Number of Points == 0 or unreadable, bail out. return EC_IllegalCall; } else numberOfPoints = u; OFString aString; if (EC_Normal != d_typeOfData->getOFString(aString,0)) { // cannot read type of data, bail out return EC_IllegalCall; } else { if (aString == "ROI") typeOfData=DVPSL_roiCurve; else if (aString == "POLY") typeOfData=DVPSL_polylineCurve; else return EC_IllegalCall; // unsupported type of data, bail out } if ((d_curveDescription) &&(EC_Normal == d_curveDescription->getOFString(aString,0))) { curveDescription = aString; } if ((d_axisUnits) &&(EC_Normal == d_axisUnits->getOFString(aString,0))) { axisUnitsX = aString; } if ((d_axisUnits) &&(EC_Normal == d_axisUnits->getOFString(aString,1))) { axisUnitsY = aString; } if ((d_curveLabel) &&(EC_Normal == d_curveLabel->getOFString(aString,0))) { curveLabel = aString; } Uint16 dataVR=0; if (EC_Normal != d_dataVR->getUint16(dataVR,0)) { // cannot read curve data VR, bail out return EC_IllegalCall; } curveData = new double[numberOfPoints*2]; if (curveData==NULL) return EC_MemoryExhausted; void *rawData=NULL; size_t align=0; Uint8 *pui8=NULL; Uint16 *pui16=NULL; Sint16 *psi16=NULL; Float32 *pfl32=NULL; Float64 *pfl64=NULL; Sint32 *psi32=NULL; switch (d_curveData->ident()) { case EVR_OB: case EVR_OW: case EVR_ox: case EVR_US: if (EC_Normal == d_curveData->getUint8Array(pui8)) { rawData = pui8; align = 1; } else if (EC_Normal == d_curveData->getUint16Array(pui16)) { rawData = pui16; align = sizeof(Uint16); } else result = EC_IllegalCall; break; case EVR_SS: if (EC_Normal == d_curveData->getSint16Array(psi16)) { rawData = psi16; align = sizeof(Sint16); } else result = EC_IllegalCall; break; case EVR_FL: if (EC_Normal == d_curveData->getFloat32Array(pfl32)) { rawData = pfl32; align = sizeof(Float32); } else result = EC_IllegalCall; break; case EVR_FD: if (EC_Normal == d_curveData->getFloat64Array(pfl64)) { rawData = pfl64; align = sizeof(Float64); } else result = EC_IllegalCall; break; case EVR_SL: if (EC_Normal == d_curveData->getSint32Array(psi32)) { rawData = psi32; align = sizeof(Sint32); } else result = EC_IllegalCall; break; default: result = EC_IllegalCall; break; } size_t byteLength = (size_t)(d_curveData->getLength()); size_t maxidx = 2*numberOfPoints; size_t i; switch (dataVR) { case 0: // VR=US. align can be 1 or 2 if ((align==1)||(align==sizeof(Uint16))) { if (align==1) swapIfNecessary(gLocalByteOrder, EBO_LittleEndian, rawData, byteLength, sizeof(Uint16)); if (maxidx*sizeof(Uint16) <= byteLength) { for (i=0; i0)) result = referencedImageList.write(dset); return result; } void DVPSGraphicAnnotation::setAnnotationLayer(const char *aLayer) { if (aLayer) graphicAnnotationLayer.putString(aLayer); else graphicAnnotationLayer.clear(); return; } const char *DVPSGraphicAnnotation::getAnnotationLayer() { char *c = NULL; if (EC_Normal == graphicAnnotationLayer.getString(c)) return c; else return NULL; } OFBool DVPSGraphicAnnotation::isEmpty() { if ((textObjectList.size() == 0)&&(graphicObjectList.size()==0)) return OFTrue; else return OFFalse; } size_t DVPSGraphicAnnotation::getNumberOfTextObjects() { return textObjectList.size(); } size_t DVPSGraphicAnnotation::getNumberOfGraphicObjects() { return graphicObjectList.size(); } DVPSTextObject *DVPSGraphicAnnotation::getTextObject(size_t idx) { return textObjectList.getTextObject(idx); } DVPSGraphicObject *DVPSGraphicAnnotation::getGraphicObject(size_t idx) { return graphicObjectList.getGraphicObject(idx); } void DVPSGraphicAnnotation::addTextObject(DVPSTextObject *text) { textObjectList.addTextObject(text); } void DVPSGraphicAnnotation::addGraphicObject(DVPSGraphicObject *graphic) { graphicObjectList.addGraphicObject(graphic); } DVPSTextObject *DVPSGraphicAnnotation::removeTextObject(size_t idx) { return textObjectList.removeTextObject(idx); } DVPSGraphicObject *DVPSGraphicAnnotation::removeGraphicObject(size_t idx) { return graphicObjectList.removeGraphicObject(idx); } OFCondition DVPSGraphicAnnotation::addImageReference( const char *sopclassUID, const char *instanceUID, unsigned long frame, DVPSObjectApplicability applicability) { if ((sopclassUID==NULL)||(instanceUID==NULL)||(applicability==DVPSB_allImages)) return EC_IllegalCall; const char *framenumber=NULL; if (applicability==DVPSB_currentFrame) { char frameString[100]; sprintf(frameString, "%ld", frame); framenumber = frameString; } return referencedImageList.addImageReference(sopclassUID, instanceUID, framenumber); } OFBool DVPSGraphicAnnotation::isApplicable( const char *instanceUID, unsigned long frame, DVPSObjectApplicability applicability) { if (referencedImageList.size() == 0) return OFTrue; // if no image references exist, the annotation is valid "globally". DVPSReferencedImage *imageRef = NULL; switch (applicability) { case DVPSB_currentFrame: // check if annotation applies to current frame imageRef = referencedImageList.findImageReference(instanceUID); if (imageRef) return imageRef->appliesToFrame(frame); break; case DVPSB_currentImage: // check if annotation applies to all frames of current image imageRef = referencedImageList.findImageReference(instanceUID); if (imageRef) return imageRef->appliesToAllFrames(); break; default: /* do nothing */ break; } return OFFalse; } /* * $Log: dvpsga.cc,v $ * Revision 1.14 2010-10-14 13:14:32 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.13 2009-11-24 14:12:58 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.12 2006-08-15 16:57:02 meichel * Updated the code in module dcmpstat to correctly compile when * all standard C++ classes remain in namespace std. * * Revision 1.11 2005/12/08 15:46:26 meichel * Changed include path schema for all DCMTK header files * * Revision 1.10 2003/06/04 12:30:28 meichel * Added various includes needed by MSVC5 with STL * * Revision 1.9 2001/09/26 15:36:25 meichel * Adapted dcmpstat to class OFCondition * * Revision 1.8 2001/06/01 15:50:30 meichel * Updated copyright header * * Revision 1.7 2000/06/02 16:01:00 meichel * Adapted all dcmpstat classes to use OFConsole for log and error output * * Revision 1.6 2000/05/31 13:02:36 meichel * Moved dcmpstat macros and constants into a common header file * * Revision 1.5 2000/03/08 16:29:04 meichel * Updated copyright header. * * Revision 1.4 2000/03/03 14:13:59 meichel * Implemented library support for redirecting error messages into memory * instead of printing them to stdout/stderr for GUI applications. * * Revision 1.3 1999/07/22 16:39:57 meichel * Adapted dcmpstat data structures and API to supplement 33 letter ballot text. * * Revision 1.2 1998/12/14 16:10:40 meichel * Implemented Presentation State interface for graphic layers, * text and graphic annotations, presentation LUTs. * * Revision 1.1 1998/11/27 14:50:40 meichel * Initial Release. * * */ dcmtk-3.6.0/dcmpstat/libsrc/dviface.cc0000644000310500011400000053056111455601067017063 0ustar joergrdicom3/* * * Copyright (C) 1998-2010, 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: Joerg Riesmeier, Marco Eichelberg * * Purpose: DVPresentationState * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:14:31 $ * CVS/RCS Revision: $Revision: 1.165 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmpstat/dviface.h" #include "dcmtk/dcmpstat/dvpsdef.h" /* for constants */ #include "dcmtk/ofstd/ofstring.h" /* for class OFString */ #include "dcmtk/ofstd/ofbmanip.h" /* for OFBitmanipTemplate */ #include "dcmtk/ofstd/ofdatime.h" /* for OFDateTime */ #include "dcmtk/ofstd/oflist.h" /* for class OFList */ #include "dcmtk/ofstd/ofstream.h" #include "dcmtk/ofstd/ofcast.h" #include "dcmtk/dcmimgle/digsdfn.h" /* for DiGSDFunction */ #include "dcmtk/dcmimgle/diciefn.h" /* for DiCIELABFunction */ #include "dcmtk/dcmnet/diutil.h" /* for DU_getStringDOElement */ #include "dcmtk/dcmpstat/dvpssp.h" /* for class DVPSStoredPrint */ #include "dcmtk/dcmpstat/dvpshlp.h" /* for class DVPSHelper */ #include "dcmtk/dcmimgle/dcmimage.h" /* for class DicomImage */ #include "dcmtk/dcmpstat/dvsighdl.h" /* for class DVSignatureHandler */ #include "dcmtk/dcmsign/dcsignat.h" /* for class DcmSignature */ #include "dcmtk/dcmsr/dsrdoc.h" /* for class DSRDocument */ #include "dcmtk/dcmsr/dsrcodvl.h" /* for class DSRCodedEntryValue */ #include "dcmtk/oflog/fileap.h" /* for log4cplus::FileAppender */ #include "dcmtk/dcmpstat/dvpsib.h" /* for DVPSImageBoxContent, needed by MSVC5 with STL */ #include "dcmtk/dcmpstat/dvpsab.h" /* for DVPSAnnotationContent, needed by MSVC5 with STL */ #include "dcmtk/dcmpstat/dvpsov.h" /* for DVPSOverlay, needed by MSVC5 with STL */ #include "dcmtk/dcmpstat/dvpsgl.h" /* for DVPSGraphicLayer, needed by MSVC5 with STL */ #include "dcmtk/dcmpstat/dvpsal.h" /* for DVPSOverlayCurveActivationLayer, needed by MSVC5 with STL */ #include "dcmtk/dcmpstat/dvpsga.h" /* for DVPSGraphicAnnotation, needed by MSVC5 with STL */ #include "dcmtk/dcmpstat/dvpscu.h" /* for DVPSCurve, needed by MSVC5 with STL */ #include "dcmtk/dcmpstat/dvpsvl.h" /* for DVPSVOILUT, needed by MSVC5 with STL */ #include "dcmtk/dcmpstat/dvpsvw.h" /* for DVPSVOIWindow, needed by MSVC5 with STL */ #include "dcmtk/dcmpstat/dvpsda.h" /* for DVPSDisplayedArea, needed by MSVC5 with STL */ #include "dcmtk/dcmpstat/dvpssv.h" /* for DVPSSoftcopyVOI, needed by MSVC5 with STL */ #include "dcmtk/dcmpstat/dvpsrs.h" /* for DVPSReferencedSeries, needed by MSVC5 with STL */ #include "dcmtk/dcmpstat/dvpstx.h" /* for DVPSTextObject, needed by MSVC5 with STL */ #include "dcmtk/dcmpstat/dvpsgr.h" /* for DVPSGraphicObject, needed by MSVC5 with STL */ #include "dcmtk/dcmpstat/dvpsri.h" /* for DVPSReferencedImage, needed by MSVC5 with STL */ #include "dcmtk/dcmqrdb/dcmqrdbi.h" /* for DB_UpperMaxBytesPerStudy */ #include "dcmtk/dcmqrdb/dcmqrdbs.h" /* for DcmQueryRetrieveDatabaseStatus */ #define INCLUDE_CSTDIO #define INCLUDE_CCTYPE #define INCLUDE_CMATH #define INCLUDE_UNISTD #include "dcmtk/ofstd/ofstdinc.h" BEGIN_EXTERN_C #ifdef HAVE_SYS_TYPES_H #include /* for fork */ #endif #ifdef HAVE_SYS_WAIT_H #include /* for waitpid */ #endif #ifdef HAVE_SYS_TIME_H #include /* for wait3 */ #endif #ifdef HAVE_SYS_RESOURCE_H #include /* for wait3 */ #endif #ifdef HAVE_SYS_STAT_H #include /* for stat, fstat */ #endif #ifdef HAVE_SYS_UTIME_H #include /* for utime */ #endif #ifdef HAVE_UTIME_H #include /* for utime */ #endif END_EXTERN_C #ifdef HAVE_WINDOWS_H #include #include /* for CreateProcess */ #endif #ifdef WITH_OPENSSL #include "dcmtk/dcmtls/tlstrans.h" #include "dcmtk/dcmtls/tlslayer.h" BEGIN_EXTERN_C #include #include #include #include END_EXTERN_C #endif DVInterface::DVInterface(const char *config_file, OFBool useLog) : DVConfiguration(config_file) , pPrint(NULL) , pState(NULL) , pReport(NULL) , pSignatureHandler(NULL) , pStoredPState(NULL) , pDicomImage(NULL) , pDicomPState(NULL) , pHardcopyImage(NULL) , printJobIdentifier() , printJobCounter(0) , configPath() , databaseIndexFile() , referenceTime(0) , pHandle(NULL) , lockingMode(OFFalse) , idxCache() , idxRec() , idxRecPos(-1) , imageInDatabase(OFFalse) , minimumPrintBitmapWidth(0) , minimumPrintBitmapHeight(0) , maximumPrintBitmapWidth(0) , maximumPrintBitmapHeight(0) , maximumPrintPreviewWidth(0) , maximumPrintPreviewHeight(0) , maximumPreviewImageWidth(0) , maximumPreviewImageHeight(0) , currentPrinter() , displayCurrentLUTID() , printCurrentLUTID() , printerMediumType() , printerFilmDestination() , printerFilmSessionLabel() , printerNumberOfCopies(0) , printerPriority() , printerOwnerID() , activateAnnotation(OFFalse) , prependDateTime(OFTrue) , prependPrinterName(OFTrue) , prependLighting(OFTrue) , annotationText() { #ifdef WITH_OPENSSL DcmSignature::initializeLibrary(); // initializes OpenSSL for dcmsign and dcmtls #endif clearIndexRecord(idxRec, idxRecPos); if (config_file) configPath = config_file; /* initialize display transform (only on low-cost systems) */ for (int i = DVPSD_first; i < DVPSD_max;i++) displayFunction[i] = NULL; if (!getGUIConfigEntryBool(L2_HIGHRESOLUTIONGRAPHICS, OFFalse)) { const char *displayFunctionFile = getMonitorCharacteristicsFile(); if (displayFunctionFile && (strlen(displayFunctionFile) > 0)) { DiDisplayFunction *df = new DiGSDFunction(displayFunctionFile); if (df && (df->isValid())) { displayFunction[DVPSD_GSDF] = df; df = new DiCIELABFunction(displayFunctionFile); if (df && (df->isValid())) displayFunction[DVPSD_CIELAB] = df; } else { if (df) delete df; DCMPSTAT_WARN("Unable to load monitor characterics file '" << displayFunctionFile << "', ignoring"); } } } minimumPrintBitmapWidth = getMinPrintResolutionX(); minimumPrintBitmapHeight = getMinPrintResolutionY(); maximumPrintBitmapWidth = getMaxPrintResolutionX(); maximumPrintBitmapHeight = getMaxPrintResolutionY(); maximumPreviewImageWidth = getMaxPreviewResolutionX(); maximumPreviewImageHeight = getMaxPreviewResolutionY(); pPrint = new DVPSStoredPrint(getDefaultPrintIllumination(), getDefaultPrintReflection(), getNetworkAETitle()); pState = new DVPresentationState(OFstatic_cast(DiDisplayFunction **, displayFunction), minimumPrintBitmapWidth, minimumPrintBitmapHeight, maximumPrintBitmapWidth, maximumPrintBitmapHeight, maximumPreviewImageWidth, maximumPreviewImageHeight); pReport = new DSRDocument(); pSignatureHandler = new DVSignatureHandler(*this); referenceTime = OFstatic_cast(unsigned long, time(NULL)); /* initialize printJobIdentifier with a string comprising the current time */ char buf[20]; sprintf(buf, "%lu", referenceTime); printJobIdentifier = buf; /* initialize reference time with "yesterday" */ if (referenceTime >= 86400) referenceTime -= 86400; // subtract one day setCurrentPrinter(getTargetID(0, DVPSE_printAny)); if (useLog) { const char *filename = getLogFile(); if (filename != NULL) { const char *directory = getLogFolder(); OFString filepath; if (directory != NULL) { filepath = directory; filepath += PATH_SEPARATOR; filepath += filename; } else filepath = filename; // This will badly interact with oflog config files :( const char *pattern = "%D, Level %p, Module DCMPSTAT%n%m%n"; OFauto_ptr layout(new log4cplus::PatternLayout(pattern)); log4cplus::SharedAppenderPtr logfile(new log4cplus::FileAppender(filepath, STD_NAMESPACE ios::app)); // We can't use OFLog::getLogger() here because that doesn't let us // configure the object log4cplus::Logger log = log4cplus::Logger::getInstance("dcmtk.dcmpstat.logfile"); logfile->setLayout(layout); log.addAppender(logfile); log.setLogLevel(getLogLevel()); // All log messages to the logger "dcmtk.dcmpstat" are now written // to the log file } } DCMPSTAT_LOGFILE("---------------------------\n--- Application started ---\n---------------------------"); } DVInterface::~DVInterface() { DCMPSTAT_INFO("Application terminated"); delete pPrint; delete pState; delete pReport; delete pSignatureHandler; delete pStoredPState; delete pDicomImage; delete pDicomPState; delete pHardcopyImage; for (int i = DVPSD_first; i < DVPSD_max; i++) delete displayFunction[i]; if (pHandle) releaseDatabase(); // refresh database index file access time if (databaseIndexFile.length() > 0) // cast to char* required for gcc 2.5.8 on NeXTSTEP utime(OFconst_cast(char *, databaseIndexFile.c_str()), NULL); } OFCondition DVInterface::loadImage(const char *studyUID, const char *seriesUID, const char *instanceUID, OFBool changeStatus) { OFCondition status = EC_IllegalCall; if (studyUID && seriesUID && instanceUID) { if (lockDatabase() == EC_Normal) { const char *filename = getFilename(studyUID, seriesUID, instanceUID); if (filename) { if ((status = loadImage(filename)) == EC_Normal) { imageInDatabase = OFTrue; if (changeStatus) instanceReviewed(studyUID, seriesUID, instanceUID); } } else DCMPSTAT_LOGFILE("Load image from database failed: UIDs not in index file"); } else DCMPSTAT_LOGFILE("Load image from database failed: could not lock index file"); } else DCMPSTAT_LOGFILE("Load image from database failed: invalid UIDs"); return status; } OFCondition DVInterface::loadImage(const char *imgName) { OFCondition status = EC_IllegalCall; DcmFileFormat *image = NULL; DVPresentationState *newState = new DVPresentationState(OFstatic_cast(DiDisplayFunction **, displayFunction), minimumPrintBitmapWidth, minimumPrintBitmapHeight, maximumPrintBitmapWidth, maximumPrintBitmapHeight, maximumPreviewImageWidth, maximumPreviewImageHeight); if (newState==NULL) { DCMPSTAT_LOGFILE("Load image from file failed: memory exhausted"); return EC_MemoryExhausted; } if ((status = DVPSHelper::loadFileFormat(imgName, image)) == EC_Normal) { if (image) { DcmDataset *dataset = image->getDataset(); if (dataset) { if (EC_Normal == (status = newState->createFromImage(*dataset))) status = newState->attachImage(image, OFFalse); if (EC_Normal == status) { exchangeImageAndPState(newState, image); imageInDatabase = OFFalse; } } else status = EC_CorruptedData; } else status = EC_IllegalCall; if (status != EC_Normal) DCMPSTAT_LOGFILE("Load image from file failed: invalid data structures"); } else DCMPSTAT_LOGFILE("Load image from file failed: could not read fileformat"); if (status != EC_Normal) { delete newState; delete image; } return status; } OFCondition DVInterface::loadReferencedImage(size_t idx, OFBool changeStatus) { OFCondition status = EC_IllegalCall; if ((pState != NULL) && (idx < pState->numberOfImageReferences())) { OFString ofstudyUID, ofseriesUID, ofsopclassUID, ofinstanceUID, offrames, aetitle, mediaID, mediaUID; if ((status = pState->getImageReference(idx, ofstudyUID, ofseriesUID, ofsopclassUID, ofinstanceUID, offrames, aetitle, mediaID, mediaUID)) == EC_Normal) { if (lockDatabase() == EC_Normal) { const char *filename = getFilename(ofstudyUID.c_str(), ofseriesUID.c_str(), ofinstanceUID.c_str()); if (filename != NULL) { DcmFileFormat *image = NULL; if ((status = DVPSHelper::loadFileFormat(filename, image)) == EC_Normal) { status = EC_IllegalCall; if (image != NULL) { DcmDataset *dataset = image->getDataset(); if (dataset != NULL) { if ((status = pState->attachImage(image, OFFalse)) == EC_Normal) { exchangeImageAndPState(pState, image); // do not exchange pState imageInDatabase = OFTrue; if (changeStatus) instanceReviewed(ofstudyUID.c_str(), ofseriesUID.c_str(), ofinstanceUID.c_str()); } } } if (status != EC_Normal) DCMPSTAT_LOGFILE("Load referenced image from file failed: invalid data structures"); } else { status = EC_CorruptedData; DCMPSTAT_LOGFILE("Load referenced image from file failed: could not read fileformat"); } if (status != EC_Normal) delete image; } else { status = EC_IllegalCall; DCMPSTAT_LOGFILE("Load referenced image from database failed: UIDs not in index file"); } } else DCMPSTAT_LOGFILE("Load referenced image from database failed: could not lock index file"); } else DCMPSTAT_LOGFILE("Load referenced image from database failed: internal error"); } else DCMPSTAT_LOGFILE("Load referenced image from database failed: internal error"); return status; } OFCondition DVInterface::loadPState(const char *studyUID, const char *seriesUID, const char *instanceUID, OFBool changeStatus) { // determine the filename of the presentation state OFCondition status = lockDatabase(); if (status != EC_Normal) { DCMPSTAT_LOGFILE("Load presentation state from database failed: could not lock index file"); return status; } const char *filename = getFilename(studyUID, seriesUID, instanceUID); if (filename==NULL) { DCMPSTAT_LOGFILE("Load presentation state from database failed: UIDs not in index file"); return EC_IllegalCall; } // load the presentation state DcmFileFormat *pstate = NULL; DVPresentationState *newState = new DVPresentationState(OFstatic_cast(DiDisplayFunction **, displayFunction), minimumPrintBitmapWidth, minimumPrintBitmapHeight, maximumPrintBitmapWidth, maximumPrintBitmapHeight, maximumPreviewImageWidth, maximumPreviewImageHeight); if (newState==NULL) { DCMPSTAT_LOGFILE("Load presentation state from database failed: memory exhausted"); return EC_MemoryExhausted; } if ((EC_Normal == (status = DVPSHelper::loadFileFormat(filename, pstate)))&&(pstate)) { DcmDataset *dataset = pstate->getDataset(); if (dataset) status = newState->read(*dataset); else status = EC_CorruptedData; } if (status == EC_Normal) { // access the first image reference in the presentation state OFString ofstudyUID, ofseriesUID, ofsopclassUID, ofinstanceUID, offrames, aetitle, mediaID, mediaUID; status = newState->getImageReference(0, ofstudyUID, ofseriesUID, ofsopclassUID, ofinstanceUID, offrames, aetitle, mediaID, mediaUID); // we could do something fancy with the retrieve AE title and the storage media ID here, // but we just assume that the referenced image is in our local database. if (EC_Normal == status) { // determine the filename of the referenced image const char *imagefilename = NULL; imagefilename = getFilename(ofstudyUID.c_str(), ofseriesUID.c_str(), ofinstanceUID.c_str()); // load the image file and attach it if (imagefilename) { DcmFileFormat *fimage = NULL; if ((EC_Normal == (status = DVPSHelper::loadFileFormat(imagefilename, fimage)))&&(fimage)) { DcmDataset *dataset = pstate->getDataset(); if (dataset) { status = newState->attachImage(fimage, OFFalse); if (EC_Normal == status) { exchangeImageAndPState(newState, fimage, pstate); imageInDatabase = OFTrue; if (changeStatus) { // mark pstate and (first) image reviewed instanceReviewed(studyUID, seriesUID, instanceUID); instanceReviewed(ofstudyUID.c_str(), ofseriesUID.c_str(), ofinstanceUID.c_str()); } } } else status = EC_CorruptedData; } if (status!=EC_Normal) { delete fimage; DCMPSTAT_LOGFILE("Load presentation state from database failed: could not read image data"); } } else { status = EC_IllegalCall; // no valid image filename DCMPSTAT_LOGFILE("Load presentation state from database failed: referenced image not in index file"); } } } else DCMPSTAT_LOGFILE("Load presentation state from database failed: could not read fileformat"); if (status!=EC_Normal) { delete pstate; delete newState; } return status; } OFCondition DVInterface::loadPState(const char *pstName, const char *imgName) { OFCondition status = EC_IllegalCall; DcmFileFormat *pstate = NULL; DcmFileFormat *image = pDicomImage; // default: do not replace image if image filename is NULL DVPresentationState *newState = new DVPresentationState(OFstatic_cast(DiDisplayFunction **, displayFunction), minimumPrintBitmapWidth, minimumPrintBitmapHeight, maximumPrintBitmapWidth, maximumPrintBitmapHeight, maximumPreviewImageWidth, maximumPreviewImageHeight); if (newState==NULL) { DCMPSTAT_LOGFILE("Load presentation state from file failed: memory exhausted"); return EC_MemoryExhausted; } if ((status = DVPSHelper::loadFileFormat(pstName, pstate)) == EC_Normal) { if ((imgName == NULL) || ((status = DVPSHelper::loadFileFormat(imgName, image)) == EC_Normal)) { if ((pstate)&&(image)) { DcmDataset *dataset = pstate->getDataset(); if (dataset) { if (EC_Normal == (status = newState->read(*dataset))) status = newState->attachImage(image, OFFalse); if (EC_Normal == status) { exchangeImageAndPState(newState, image, pstate); imageInDatabase = OFFalse; } } else status = EC_CorruptedData; } else status = EC_IllegalCall; if (status != EC_Normal) DCMPSTAT_LOGFILE("Load presentation state from file failed: invalid data structures"); } else DCMPSTAT_LOGFILE("Load presentation state from file failed: could not load image"); } else DCMPSTAT_LOGFILE("Load presentation state from file failed: could not read fileformat"); if (status != EC_Normal) { delete newState; if (image != pDicomImage) delete image; delete pstate; } return status; } OFCondition DVInterface::loadStructuredReport(const char *studyUID, const char *seriesUID, const char *instanceUID, OFBool changeStatus) { OFCondition status = EC_IllegalCall; if (studyUID && seriesUID && instanceUID) { if (lockDatabase() == EC_Normal) { const char *filename = getFilename(studyUID, seriesUID, instanceUID); if (filename) { if ((status = loadStructuredReport(filename)) == EC_Normal) { if (changeStatus) instanceReviewed(studyUID, seriesUID, instanceUID); } } else DCMPSTAT_LOGFILE("Load structured report from database failed: UIDs not in index file"); } else DCMPSTAT_LOGFILE("Load structured report from database failed: could not lock index file"); } else DCMPSTAT_LOGFILE("Load structured report from database failed: invalid UIDs"); return status; } OFCondition DVInterface::loadStructuredReport(const char *filename) { OFCondition status = EC_IllegalCall; DcmFileFormat *fileformat = NULL; DSRDocument *newReport = new DSRDocument(); if (newReport == NULL) { DCMPSTAT_LOGFILE("Load structured report from file failed: memory exhausted"); return EC_MemoryExhausted; } if ((status = DVPSHelper::loadFileFormat(filename, fileformat)) == EC_Normal) { if (fileformat) { DcmDataset *dataset = fileformat->getDataset(); if (dataset) { if ((status = newReport->read(*dataset, DSRTypes::RF_readDigitalSignatures)) == EC_Normal) { delete pReport; pReport = newReport; if (pSignatureHandler) { pSignatureHandler->updateDigitalSignatureInformation(*dataset, DVPSS_structuredReport, OFTrue); /* check whether loaded report is 'finalized' (certain attributes are digitally signed) */ DcmAttributeTag tagList(DcmTag(0, 0) /* irrelevant value */); tagList.putTagVal(DCM_SOPInstanceUID, 0); tagList.putTagVal(DCM_VerifyingObserverSequence, 1); tagList.putTagVal(DCM_InstanceCreationDate, 2); tagList.putTagVal(DCM_InstanceCreationTime, 3); tagList.putTagVal(DCM_InstanceCreatorUID, 4); if (pSignatureHandler->attributesSigned(*dataset, tagList)) pReport->finalizeDocument(); } } } else status = EC_CorruptedData; } else status = EC_IllegalCall; if (status != EC_Normal) DCMPSTAT_LOGFILE("Load structured report from file failed: invalid data structures"); } else DCMPSTAT_LOGFILE("Load structured report from file failed: could not read fileformat"); if (status != EC_Normal) delete newReport; delete fileformat; return status; } OFCondition DVInterface::loadSRTemplate(const char *reportID) { OFCondition result = EC_IllegalCall; if (reportID) { const char *srfile = getReportFilename(reportID); if (srfile) { OFString filename = getReportFolder(); // never NULL. filename += PATH_SEPARATOR; filename += srfile; result = loadStructuredReport(filename.c_str()); if (result == EC_Normal) { if (pReport != NULL) { /* date/time is filled automatically if empty */ pReport->setContentDate(""); pReport->setContentTime(""); /* generate new study/series/instance UID and fill date/time */ pReport->createNewStudy(); } } else DCMPSTAT_LOGFILE("Load structured reporting 'template' from file failed"); } } return result; } OFCondition DVInterface::savePState(OFBool replaceSOPInstanceUID) { // release database lock since we are using the DB module directly releaseDatabase(); if (pState==NULL) return EC_IllegalCall; const char *instanceUID = NULL; if (replaceSOPInstanceUID) instanceUID=pState->createInstanceUID(); else instanceUID=pState->getInstanceUID(); if (instanceUID==NULL) return EC_IllegalCall; DcmQueryRetrieveDatabaseStatus dbStatus(STATUS_Success); OFCondition result=EC_Normal; char imageFileName[MAXPATHLEN+1]; DcmQueryRetrieveIndexDatabaseHandle dbhandle(getDatabaseFolder(), PSTAT_MAXSTUDYCOUNT, PSTAT_STUDYSIZE, result); if (result.bad()) { DCMPSTAT_LOGFILE("Save presentation state to database failed: could not lock index file"); return EC_IllegalCall; } if (dbhandle.makeNewStoreFileName(UID_GrayscaleSoftcopyPresentationStateStorage, instanceUID, imageFileName).good()) { // now store presentation state as filename result = savePState(imageFileName, OFFalse); if (EC_Normal==result) { if (dbhandle.storeRequest(UID_GrayscaleSoftcopyPresentationStateStorage, instanceUID, imageFileName, &dbStatus).bad()) { result = EC_IllegalCall; DCMPSTAT_LOGFILE("Save presentation state to database failed: could not register in index file"); DCMPSTAT_DEBUG("Unable to register presentation state '" << imageFileName << "' in database"); } } } if (pDicomImage != NULL) { DcmDataset *dset = pDicomImage->getDataset(); if (dset != NULL) { DIC_UI sopClass; DIC_UI instanceUID2; DIC_UI seriesUID; DIC_UI studyUID; if (DU_getStringDOElement(dset, DCM_SOPClassUID, sopClass) && DU_getStringDOElement(dset, DCM_SOPInstanceUID, instanceUID2) && DU_getStringDOElement(dset, DCM_SeriesInstanceUID, seriesUID) && DU_getStringDOElement(dset, DCM_StudyInstanceUID, studyUID) && ((!imageInDatabase) || (getSeriesStruct(studyUID, seriesUID, instanceUID2) == NULL))) { releaseDatabase(); /* avoid deadlocks */ if (dbhandle.makeNewStoreFileName(sopClass, instanceUID2, imageFileName).good()) { // now store presentation state as filename result = saveCurrentImage(imageFileName); if (EC_Normal==result) { if (dbhandle.storeRequest(sopClass, instanceUID2, imageFileName, &dbStatus).bad()) { result = EC_IllegalCall; DCMPSTAT_LOGFILE("Save presentation state to database failed: could not register image in index file"); DCMPSTAT_DEBUG("Unable to register image '" << imageFileName << "' in database"); } else { imageInDatabase = OFTrue; } } } } } } return result; } OFCondition DVInterface::savePState(const char *filename, OFBool replaceSOPInstanceUID, OFBool explicitVR) { if (pState==NULL) return EC_IllegalCall; if (filename==NULL) return EC_IllegalCall; OFCondition status = EC_IllegalCall; DcmFileFormat *fileformat = new DcmFileFormat(); DcmDataset *dataset = NULL; if (fileformat) dataset=fileformat->getDataset(); if (dataset) { if ((status = pState->write(*dataset, replaceSOPInstanceUID)) == EC_Normal) { status = DVPSHelper::saveFileFormat(filename, fileformat, explicitVR); // replace the stored data for resetPresentationState() delete pDicomPState; pDicomPState = fileformat; fileformat = NULL; // make sure we don't delete fileformat later if (pSignatureHandler) { pSignatureHandler->updateDigitalSignatureInformation(*pDicomPState->getDataset(), DVPSS_presentationState, OFFalse); } } if (status != EC_Normal) DCMPSTAT_LOGFILE("Save presentation state to file failed: could not write fileformat"); } else { DCMPSTAT_LOGFILE("Save presentation state to file failed: memory exhausted"); status = EC_MemoryExhausted; } delete fileformat; return status; } OFCondition DVInterface::saveCurrentImage(const char *filename, OFBool explicitVR) { if (filename==NULL) return EC_IllegalCall; if (pDicomImage==NULL) return EC_IllegalCall; OFCondition result = DVPSHelper::saveFileFormat(filename, pDicomImage, explicitVR); if (result != EC_Normal) DCMPSTAT_LOGFILE("Save image to file failed: could not write fileformat"); return result; } OFCondition DVInterface::saveStructuredReport() { // release database lock since we are using the DB module directly releaseDatabase(); if (pReport == NULL) return EC_IllegalCall; OFString sopClassUID; if (pReport->getSOPClassUID(sopClassUID).length() == 0) return EC_IllegalCall; OFString instanceUID; if (pReport->getSOPInstanceUID(instanceUID).length() == 0) return EC_IllegalCall; DcmQueryRetrieveDatabaseStatus dbStatus(STATUS_Success); char filename[MAXPATHLEN+1]; OFCondition result = EC_Normal; DcmQueryRetrieveIndexDatabaseHandle dbhandle(getDatabaseFolder(), PSTAT_MAXSTUDYCOUNT, PSTAT_STUDYSIZE, result); if (result.bad()) { DCMPSTAT_LOGFILE("Save structured report to database failed: could not lock index file"); return EC_IllegalCall; } if (dbhandle.makeNewStoreFileName(sopClassUID.c_str(), instanceUID.c_str(), filename).good()) { // now store presentation state as filename result = saveStructuredReport(filename); if (EC_Normal == result) { if (dbhandle.storeRequest(sopClassUID.c_str(), instanceUID.c_str(), filename, &dbStatus).bad()) { result = EC_IllegalCall; DCMPSTAT_LOGFILE("Save structured report to database failed: could not register in index file"); DCMPSTAT_DEBUG("Unable to register structured report '" << filename << "' in database"); } } } return result; } OFCondition DVInterface::saveStructuredReport(const char *filename, OFBool explicitVR) { if (pReport==NULL) return EC_IllegalCall; if (filename==NULL) return EC_IllegalCall; OFCondition status = EC_IllegalCall; DcmFileFormat *fileformat = new DcmFileFormat(); DcmDataset *dataset = NULL; if (fileformat) dataset=fileformat->getDataset(); if (dataset) { /* always add information about private OFFIS DCMTK Coding Scheme */ pReport->getCodingSchemeIdentification().addPrivateDcmtkCodingScheme(); if ((status = pReport->write(*dataset)) == EC_Normal) { status = DVPSHelper::saveFileFormat(filename, fileformat, explicitVR); if (pSignatureHandler) { pSignatureHandler->updateDigitalSignatureInformation(*dataset, DVPSS_structuredReport, OFFalse); } } if (status != EC_Normal) DCMPSTAT_LOGFILE("Save structured report to file failed: could not write fileformat"); } else { DCMPSTAT_LOGFILE("Save structured report to file failed: memory exhausted"); status = EC_MemoryExhausted; } delete fileformat; return status; } OFCondition DVInterface::addImageReferenceToPState(const char *studyUID, const char *seriesUID, const char *instanceUID) { OFCondition status = EC_IllegalCall; if (pState && studyUID && seriesUID && instanceUID) { OFString study = pState->getStudyUID(); if (study == studyUID) { if (lockDatabase() == EC_Normal) { const char *filename = getFilename(studyUID, seriesUID, instanceUID); if (filename) { DcmFileFormat *image = NULL; if ((status = DVPSHelper::loadFileFormat(filename, image)) == EC_Normal) { status = EC_CorruptedData; if (image) { DcmDataset *dataset = image->getDataset(); if (dataset) status = pState->addImageReference(*dataset); } if (status != EC_Normal) DCMPSTAT_LOGFILE("Add image reference to presentation state failed: invalid data structures"); } else DCMPSTAT_LOGFILE("Add image reference to presentation state failed: could not read fileformat"); delete image; } else DCMPSTAT_LOGFILE("Add image reference to presentation state failed: UIDs not in index file"); } else DCMPSTAT_LOGFILE("Add image reference to presentation state failed: could not lock index file"); } else DCMPSTAT_LOGFILE("Add image reference to presentation state failed: not the same study UID"); } else DCMPSTAT_LOGFILE("Add image reference to presentation state failed: invalid UIDs"); return status; } size_t DVInterface::getNumberOfImageReferences() { if (pState != NULL) return pState->numberOfImageReferences(); return 0; } OFCondition DVInterface::exchangeImageAndPState(DVPresentationState *newState, DcmFileFormat *image, DcmFileFormat *state) { if (newState==NULL) return EC_IllegalCall; if (image==NULL) return EC_IllegalCall; if (pState != newState) { delete pState; delete pStoredPState; delete pDicomPState; pState = newState; pStoredPState = NULL; pDicomPState = state; if (pSignatureHandler) { if (pDicomPState) pSignatureHandler->updateDigitalSignatureInformation(*pDicomPState->getDataset(), DVPSS_presentationState, OFTrue); else pSignatureHandler->disableDigitalSignatureInformation(DVPSS_presentationState); } } if (pDicomImage != image) { delete pDicomImage; // delete only if different pDicomImage = image; if (pSignatureHandler) { pSignatureHandler->updateDigitalSignatureInformation(*pDicomImage->getDataset(), DVPSS_image, OFTrue); } } return EC_Normal; } OFCondition DVInterface::resetPresentationState() { DVPresentationState *newState = new DVPresentationState(displayFunction, minimumPrintBitmapWidth, minimumPrintBitmapHeight, maximumPrintBitmapWidth, maximumPrintBitmapHeight, maximumPreviewImageWidth, maximumPreviewImageHeight); if (newState==NULL) return EC_MemoryExhausted; OFCondition status = EC_Normal; if ((pDicomImage)&&(pDicomPState)) { // both image and presentation state are present DcmDataset *dataset = pDicomPState->getDataset(); if (dataset) { if (EC_Normal == (status = newState->read(*dataset))) status = newState->attachImage(pDicomImage, OFFalse); if (EC_Normal == status) { if (pState) delete pState; if (pStoredPState) delete pStoredPState; pState = newState; pStoredPState = NULL; // return to original pstate } } else status = EC_IllegalCall; } else if (pDicomImage) { // only image is present DcmDataset *dataset = pDicomImage->getDataset(); if (dataset) { if (EC_Normal == (status = newState->createFromImage(*dataset))) status = newState->attachImage(pDicomImage, OFFalse); if (EC_Normal == status) { if (pState) delete pState; if (pStoredPState) delete pStoredPState; pState = newState; pStoredPState = NULL; } } else status = EC_IllegalCall; } if (EC_Normal != status) delete newState; return status; } OFCondition DVInterface::saveCurrentPStateForReset() { OFCondition status = EC_IllegalCall; if (pState != NULL) { DcmFileFormat *fileformat = new DcmFileFormat(); if (fileformat != NULL) { DcmDataset *dataset = fileformat->getDataset(); if (dataset) { status = pState->write(*dataset, OFFalse); // write current state to 'reset' dataset if (status == EC_Normal) { delete pDicomPState; pDicomPState = fileformat; fileformat = NULL; // avoid deletion of pDicomPState a few lines later } } else status = EC_MemoryExhausted; } else status = EC_MemoryExhausted; delete fileformat; } return status; } Uint32 DVInterface::getNumberOfPStates() { if (createPStateCache()) { DVInstanceCache::ItemStruct *instance = getInstanceStruct(); if ((instance != NULL) && ((instance->Type == DVPSI_image) || (instance->Type == DVPSI_hardcopyGrayscale))) return instance->List.size(); } return 0; } OFCondition DVInterface::selectPState(Uint32 idx, OFBool changeStatus) { if (createPStateCache()) { DVInstanceCache::ItemStruct *instance = getInstanceStruct(); if ((instance != NULL) && ((instance->Type == DVPSI_image) || (instance->Type == DVPSI_hardcopyGrayscale))) { OFListIterator(DVInstanceCache::ItemStruct *) iter = instance->List.begin(); OFListIterator(DVInstanceCache::ItemStruct *) last = instance->List.end(); while (iter != last) { if (idx == 0) { DVInstanceCache::ItemStruct *pstate = (*iter); if (pstate != NULL) { OFCondition status = EC_IllegalCall; if (pDicomImage == NULL) status = loadPState(pstate->Filename.c_str(), instance->Filename.c_str()); else status = loadPState(pstate->Filename.c_str()); if ((status == EC_Normal) && changeStatus) instanceReviewed(pstate->Pos); return status; } } idx--; ++iter; } } } return EC_IllegalCall; } const char *DVInterface::getPStateDescription(Uint32 idx) { if (createPStateCache()) { DVInstanceCache::ItemStruct *instance = getInstanceStruct(); if ((instance != NULL) && ((instance->Type == DVPSI_image) || (instance->Type == DVPSI_hardcopyGrayscale))) { OFListIterator(DVInstanceCache::ItemStruct *) iter = instance->List.begin(); OFListIterator(DVInstanceCache::ItemStruct *) last = instance->List.end(); while (iter != last) { if (idx == 0) { DVInstanceCache::ItemStruct *pstate = (*iter); if (pstate != NULL) return pstate->Description.c_str(); } idx--; ++iter; } } } return NULL; } const char *DVInterface::getPStateLabel(Uint32 idx) { if (createPStateCache()) { DVInstanceCache::ItemStruct *instance = getInstanceStruct(); if ((instance != NULL) && ((instance->Type == DVPSI_image) || (instance->Type == DVPSI_hardcopyGrayscale))) { OFListIterator(DVInstanceCache::ItemStruct *) iter = instance->List.begin(); OFListIterator(DVInstanceCache::ItemStruct *) last = instance->List.end(); while (iter != last) { if (idx == 0) { DVInstanceCache::ItemStruct *pstate = (*iter); if (pstate != NULL) return pstate->Label.c_str(); } idx--; ++iter; } } } return NULL; } OFCondition DVInterface::disablePState() { OFCondition status = EC_IllegalCall; if ((pState != NULL) && (pStoredPState == NULL)) { if (pDicomImage != NULL) { DcmDataset *dataset = pDicomImage->getDataset(); if (dataset != NULL) { DVPresentationState *newState = new DVPresentationState(displayFunction, minimumPrintBitmapWidth, minimumPrintBitmapHeight, maximumPrintBitmapWidth, maximumPrintBitmapHeight, maximumPreviewImageWidth, maximumPreviewImageHeight); if (newState != NULL) { if ((status = newState->createFromImage(*dataset)) == EC_Normal) { if ((status = newState->attachImage(pDicomImage, OFFalse)) == EC_Normal) { pStoredPState = pState; pState = newState; return EC_Normal; } } delete newState; } } } } return status; } OFCondition DVInterface::enablePState() { if ((pState != NULL) && (pStoredPState != NULL)) { delete pState; pState = pStoredPState; pStoredPState = NULL; return EC_Normal; } return EC_IllegalCall; } DVStudyCache::ItemStruct *DVInterface::getStudyStruct(const char *studyUID, const char *seriesUID) { if (createIndexCache()) { if (studyUID) { if (idxCache.isElem(studyUID)) { DVStudyCache::ItemStruct *study = idxCache.getItem(); if ((seriesUID == NULL) || (study->List.isElem(seriesUID))) return study; } } else return idxCache.getItem(); // current study } return NULL; } DVSeriesCache::ItemStruct *DVInterface::getSeriesStruct(const char *studyUID, const char *seriesUID, const char *instanceUID) { if ((studyUID && seriesUID) || (!studyUID && !seriesUID)) { DVStudyCache::ItemStruct *study = getStudyStruct(studyUID, seriesUID); if (study != NULL) { DVSeriesCache::ItemStruct *series = study->List.getItem(); if (series != NULL) { if ((instanceUID == NULL) || (series->List.isElem(instanceUID))) return series; } } } return NULL; } DVInstanceCache::ItemStruct *DVInterface::getInstanceStruct(const char *studyUID, const char *seriesUID, const char *instanceUID) { if ((studyUID && seriesUID && instanceUID) || (!studyUID && !seriesUID && !instanceUID)) { DVSeriesCache::ItemStruct *series = getSeriesStruct(studyUID, seriesUID, instanceUID); if (series != NULL) return series->List.getItem(); } return NULL; } const char *DVInterface::getFilename(const char *studyUID, const char *seriesUID, const char *instanceUID) { DVSeriesCache::ItemStruct *series = getSeriesStruct(studyUID, seriesUID, instanceUID); if (series != NULL) return series->List.getFilename(); return NULL; } OFCondition DVInterface::lockDatabase() { if (pHandle) return EC_Normal; // may be called multiple times OFCondition result; pHandle = new DcmQueryRetrieveIndexDatabaseHandle(getDatabaseFolder(), PSTAT_MAXSTUDYCOUNT, PSTAT_STUDYSIZE, result); if (result.good()) { lockingMode = OFFalse; if (pHandle->DB_lock(OFFalse).good()) { if (databaseIndexFile.length() == 0) databaseIndexFile = pHandle->getIndexFilename(); return EC_Normal; } } return EC_IllegalCall; } OFCondition DVInterface::lockExclusive() { if (pHandle && lockingMode) return EC_Normal; OFCondition result = EC_Normal; if (pHandle == NULL) result = lockDatabase(); if (result.good()) { // we now have a shared lock. pHandle->DB_unlock(); if (pHandle->DB_lock(OFTrue).good()) lockingMode = OFTrue; else result = EC_IllegalCall; } return result; } OFCondition DVInterface::unlockExclusive() { if (pHandle && lockingMode) { if (pHandle->DB_unlock().good()) { delete pHandle; pHandle=NULL; lockingMode=OFFalse; clearIndexCache(); return EC_Normal; } } return EC_IllegalCall; } OFCondition DVInterface::releaseDatabase() { if (pHandle == NULL) return EC_Normal; OFCondition cond = pHandle->DB_unlock(); if (cond.good()) { delete pHandle; pHandle = NULL; clearIndexCache(); } return cond; } void DVInterface::resetDatabaseReferenceTime() { // set index file modification time to "yesterday" to make sure // we notice any change even if different processes have minor // date/time differences (i.e. over NFS) #ifdef HAVE_DECLARATION_STRUCT_UTIMBUF struct utimbuf utime_buf; utime_buf.actime = OFstatic_cast(time_t, referenceTime); utime_buf.modtime = OFstatic_cast(time_t, referenceTime); if (0 != utime(databaseIndexFile.c_str(), &utime_buf)) #else // some old platforms use the prototype int utime(char *file, time_t timep[]) time_t utime_buf[2]; utime_buf[0] = OFstatic_cast(time_t, referenceTime); utime_buf[1] = OFstatic_cast(time_t, referenceTime); if (0 != utime(OFconst_cast(char *, databaseIndexFile.c_str()), utime_buf)) #endif { DCMPSTAT_WARN("Cannot set database index file modification time"); } else { struct stat stat_buf; if (0 == stat(databaseIndexFile.c_str(), &stat_buf)) { referenceTime = OFstatic_cast(unsigned long, stat_buf.st_mtime); } } } OFBool DVInterface::newInstancesReceived() { if (databaseIndexFile.length() == 0) { if (pHandle == NULL) { lockDatabase(); // derives databaseIndexFile releaseDatabase(); } } if (databaseIndexFile.length() > 0) { struct stat stat_buf; if (0== stat(databaseIndexFile.c_str(), &stat_buf)) { if (OFstatic_cast(unsigned long, stat_buf.st_mtime) == referenceTime) return OFFalse; } resetDatabaseReferenceTime(); } return OFTrue; // default } void DVInterface::clearIndexCache() { idxCache.clear(); clearIndexRecord(idxRec, idxRecPos); } OFBool DVInterface::createIndexCache() { if (lockDatabase() == EC_Normal) { if (idxCache.empty()) { int counter = 0; pHandle->DB_IdxInitLoop(&counter); IdxRecord record; while (pHandle->DB_IdxGetNext(&counter, &record).good()) { if (!idxCache.isElem(record.StudyInstanceUID)) idxCache.addItem(record.StudyInstanceUID); DVStudyCache::ItemStruct *study = idxCache.getItem(); if (study != NULL) { if (!study->List.isElem(record.SeriesInstanceUID)) study->List.addItem(record.SeriesInstanceUID); DVSeriesCache::ItemStruct *series = study->List.getItem(); if (series != NULL) { if (!series->List.isElem(record.SOPInstanceUID)) { DVPSInstanceType type = DVPSI_image; if (record.Modality != NULL) { if (strcmp(record.Modality, "PR") == 0) type = DVPSI_presentationState; if (strcmp(record.Modality, "SR") == 0) type = DVPSI_structuredReport; else if (strcmp(record.Modality, "HC") == 0) type =DVPSI_hardcopyGrayscale; else if (strcmp(record.Modality, "STORED_PRINT") == 0) type = DVPSI_storedPrint; } series->List.addItem(record.SOPInstanceUID, counter, record.hstat, type, record.ImageSize, record.filename); if (series->Type == DVPSI_image) series->Type = type; // series contains only one type of instances } } } } updateStatusCache(); } return OFTrue; } return OFFalse; } OFBool DVInterface::createPStateCache() { DVStudyCache::ItemStruct *study = getStudyStruct(); if (study != NULL) { DVSeriesCache::ItemStruct *series = study->List.getItem(); if (series != NULL) { DVInstanceCache::ItemStruct *instance = series->List.getItem(); if ((instance != NULL) && ((instance->Type == DVPSI_image) || (instance->Type == DVPSI_hardcopyGrayscale))) { if (!instance->Checked) // is current instance already checked? { if (instance->List.empty()) { OFString seriesUID = series->UID; OFString instanceUID = instance->UID; if (study->List.gotoFirst()) { do { /* for all series */ if (study->List.getType() == DVPSI_presentationState) { series = study->List.getItem(); if (series != NULL) { if (series->List.gotoFirst()) { do { /* for all instances */ if (series->List.getType() == DVPSI_presentationState) { DcmFileFormat *pstate = NULL; if ((DVPSHelper::loadFileFormat(series->List.getFilename(), pstate) == EC_Normal) && pstate) { DcmDataset *dataset = pstate->getDataset(); DVPSReferencedSeries_PList plist; if (dataset && (plist.read(*dataset) == EC_Normal) && plist.isValid()) { if (plist.findImageReference(seriesUID.c_str(), instanceUID.c_str())) { DVInstanceCache::ItemStruct *reference = series->List.getItem(); if (reference != NULL) { DcmStack stack; if (dataset->search(DCM_ContentDescription, stack, ESM_fromHere, OFFalse) == EC_Normal) { char *value = NULL; if ((*OFstatic_cast(DcmLongString *, stack.top())).getString(value) == EC_Normal) reference->Description = value; } stack.clear(); if (dataset->search(DCM_ContentLabel, stack, ESM_fromHere, OFFalse) == EC_Normal) { char *value = NULL; if ((*OFstatic_cast(DcmLongString *, stack.top())).getString(value) == EC_Normal) reference->Label = value; } instance->List.push_back(reference); } } } } delete pstate; } } while (series->List.gotoNext()); } series->List.reset(); // set iterator to old position } } } while (study->List.gotoNext()); } study->List.reset(); // set iterator to old position } instance->Checked = OFTrue; // do not check twice } return OFTrue; } } } return OFFalse; } void DVInterface::clearIndexRecord(IdxRecord &record, int &recpos) { OFBitmanipTemplate::zeroMem(OFreinterpret_cast(Uint8 *, &record), sizeof(idxRec)); recpos = -1; } OFBool DVInterface::readIndexRecord(const int pos, IdxRecord &record, int *oldpos) { if (lockDatabase() == EC_Normal) { if ((oldpos != NULL) && (pos == *oldpos)) // record already read return OFTrue; if (pHandle->DB_IdxRead(pos, &record).good()) { if (oldpos != NULL) *oldpos = pos; return OFTrue; } } return OFFalse; } void DVInterface::updateStatusCache() { idxCache.updateStatus(); } Uint32 DVInterface::getNumberOfStudies() { if (createIndexCache()) return idxCache.getCount(); return 0; } Uint32 DVInterface::getNumberOfSeries() { DVStudyCache::ItemStruct *study = getStudyStruct(); if (study != NULL) return study->List.getCount(); return 0; } Uint32 DVInterface::getNumberOfInstances() { DVSeriesCache::ItemStruct *series = getSeriesStruct(); if (series != NULL) return series->List.getCount(); return 0; } OFCondition DVInterface::selectStudy(Uint32 idx) { if (createIndexCache()) { if (idxCache.gotoItem(idx)) { DVStudyCache::ItemStruct *study = idxCache.getItem(); if (study->List.gotoItem(0)) { DVSeriesCache::ItemStruct *series = study->List.getItem(); if (series != NULL) { if (series->List.gotoItem(0)) { if (readIndexRecord(series->List.getPos(), idxRec, &idxRecPos)) return EC_Normal; } } } } } return EC_IllegalCall; } OFCondition DVInterface::selectStudy(const char *studyUID) { if (studyUID) { if (createIndexCache()) { if (idxCache.isElem(studyUID)) { DVStudyCache::ItemStruct *study = idxCache.getItem(); if (study->List.gotoItem(0)) { DVSeriesCache::ItemStruct *series = study->List.getItem(); if (series != NULL) { if (series->List.gotoItem(0)) { if (readIndexRecord(series->List.getPos(), idxRec, &idxRecPos)) return EC_Normal; } } } } } } return EC_IllegalCall; } OFCondition DVInterface::selectSeries(Uint32 idx) { DVStudyCache::ItemStruct *study = getStudyStruct(); if (study != NULL) { if (study->List.gotoItem(idx)) { DVSeriesCache::ItemStruct *series = study->List.getItem(); if (series != NULL) { if (series->List.gotoItem(0)) { if (readIndexRecord(series->List.getPos(), idxRec, &idxRecPos)) return EC_Normal; } } } } return EC_IllegalCall; } OFCondition DVInterface::selectSeries(const char *seriesUID) { if (seriesUID) { DVStudyCache::ItemStruct *study = getStudyStruct(); if (study != NULL) { if (study->List.isElem(seriesUID)) { DVSeriesCache::ItemStruct *series = study->List.getItem(); if (series != NULL) { if (series->List.gotoItem(0)) { if (readIndexRecord(series->List.getPos(), idxRec, &idxRecPos)) return EC_Normal; } } } } } return EC_IllegalCall; } OFCondition DVInterface::selectInstance(Uint32 idx) { DVSeriesCache::ItemStruct *series = getSeriesStruct(); if (series != NULL) { if (series->List.gotoItem(idx)) { if (readIndexRecord(series->List.getPos(), idxRec, &idxRecPos)) return EC_Normal; } } return EC_IllegalCall; } OFCondition DVInterface::selectInstance(const char *instanceUID) { if (instanceUID) { DVSeriesCache::ItemStruct *series = getSeriesStruct(); if (series != NULL) { if (series->List.isElem(instanceUID)) { if (readIndexRecord(series->List.getPos(), idxRec, &idxRecPos)) return EC_Normal; } } } return EC_IllegalCall; } OFCondition DVInterface::selectInstance(const char *instanceUID, const char *sopClassUID) { if (instanceUID) { if (createIndexCache() && idxCache.gotoFirst()) { DVStudyCache::ItemStruct *study = NULL; DVSeriesCache::ItemStruct *series = NULL; do { /* for all studies */ study = idxCache.getItem(); if ((study != NULL) && study->List.gotoFirst()) { do { /* for all series */ series = study->List.getItem(); if ((series != NULL) && series->List.isElem(instanceUID)) { if (readIndexRecord(series->List.getPos(), idxRec, &idxRecPos)) { if (sopClassUID == NULL) return EC_Normal; else if ((idxRec.SOPClassUID != NULL) && (strcmp(sopClassUID, idxRec.SOPClassUID) == 0)) return EC_Normal; } } } while (study->List.gotoNext()); } } while (idxCache.gotoNext()); } } return EC_IllegalCall; } OFCondition DVInterface::selectInstance(const char *studyUID, const char *seriesUID, const char *instanceUID) { if (studyUID && seriesUID && instanceUID) { if (createIndexCache()) { if (idxCache.isElem(studyUID)) { DVStudyCache::ItemStruct *study = idxCache.getItem(); if (study->List.isElem(seriesUID)) { DVSeriesCache::ItemStruct *series = study->List.getItem(); if (series != NULL) { if (series->List.isElem(instanceUID)) { if (readIndexRecord(series->List.getPos(), idxRec, &idxRecPos)) return EC_Normal; } } } } } } return EC_IllegalCall; } DVIFhierarchyStatus DVInterface::getStudyStatus() { return idxCache.getStatus(); } DVIFhierarchyStatus DVInterface::getSeriesStatus() { DVStudyCache::ItemStruct *study = idxCache.getItem(); if (study != NULL) return study->List.getStatus(); return DVIF_objectIsNew; } DVIFhierarchyStatus DVInterface::getInstanceStatus() { DVStudyCache::ItemStruct *study = idxCache.getItem(); if (study != NULL) { DVSeriesCache::ItemStruct *series = study->List.getItem(); if (series != NULL) return series->List.getStatus(); } return DVIF_objectIsNew; } DVPSInstanceType DVInterface::getSeriesType() { DVStudyCache::ItemStruct *study = idxCache.getItem(); if (study != NULL) return study->List.getType(); return DVPSI_image; } DVPSInstanceType DVInterface::getInstanceType() { DVStudyCache::ItemStruct *study = idxCache.getItem(); if (study != NULL) { DVSeriesCache::ItemStruct *series = study->List.getItem(); if (series != NULL) return series->List.getType(); } return DVPSI_image; } const char *DVInterface::getStudyUID() { return idxRec.StudyInstanceUID; } const char *DVInterface::getSeriesUID() { return idxRec.SeriesInstanceUID; } const char *DVInterface::getSOPClassUID() { return idxRec.SOPClassUID; } const char *DVInterface::getInstanceUID() { return idxRec.SOPInstanceUID; } const char *DVInterface::getStudyDescription() { return idxRec.StudyDescription; } const char *DVInterface::getStudyDate() { return idxRec.StudyDate; } const char *DVInterface::getStudyTime() { return idxRec.StudyTime; } const char *DVInterface::getReferringPhysiciansName() { return idxRec.ReferringPhysicianName; } const char *DVInterface::getAccessionNumber() { return idxRec.AccessionNumber; } const char *DVInterface::getNameOfPhysiciansReadingStudy() { return idxRec.NameOfPhysiciansReadingStudy; } const char *DVInterface::getPatientName() { return idxRec.PatientName; } const char *DVInterface::getPatientID() { return idxRec.PatientID; } const char *DVInterface::getPatientBirthDate() { return idxRec.PatientBirthDate; } const char *DVInterface::getPatientSex() { return idxRec.PatientSex; } const char *DVInterface::getPatientBirthTime() { return idxRec.PatientBirthTime; } const char *DVInterface::getOtherPatientNames() { return idxRec.OtherPatientNames; } const char *DVInterface::getOtherPatientID() { return idxRec.OtherPatientIDs; } const char *DVInterface::getEthnicGroup() { return idxRec.EthnicGroup; } const char *DVInterface::getSeriesDescription() { return idxRec.SeriesDescription; } const char *DVInterface::getSeriesNumber() { return idxRec.SeriesNumber; } const char *DVInterface::getSeriesDate() { return idxRec.SeriesDate; } const char *DVInterface::getSeriesTime() { return idxRec.SeriesTime; } const char *DVInterface::getSeriesPerformingPhysiciansName() { return idxRec.PerformingPhysicianName; } const char *DVInterface::getSeriesProtocolName() { return idxRec.ProtocolName; } const char *DVInterface::getSeriesOperatorsName() { return idxRec.OperatorsName; } const char *DVInterface::getModality() { return idxRec.Modality; } const char *DVInterface::getImageNumber() { return idxRec.ImageNumber; } const char *DVInterface::getFilename() { return idxRec.filename; } const char *DVInterface::getInstanceDescription() { return idxRec.InstanceDescription; } const char *DVInterface::getPresentationLabel() { return idxRec.PresentationLabel; } OFCondition DVInterface::instanceReviewed(int pos) { lockDatabase(); OFBool wasNew = newInstancesReceived(); if (pHandle == NULL) return EC_IllegalCall; OFCondition result = pHandle->instanceReviewed(pos); if (!wasNew) resetDatabaseReferenceTime(); releaseDatabase(); return result; } OFCondition DVInterface::instanceReviewed(const char *studyUID, const char *seriesUID, const char *instanceUID) { OFCondition result = EC_IllegalCall; DVInstanceCache::ItemStruct *instance = getInstanceStruct(studyUID, seriesUID, instanceUID); if (instance != NULL) { if (instance->Status == DVIF_objectIsNotNew) result = EC_Normal; else result = instanceReviewed(instance->Pos); } return result; } int DVInterface::findStudyIdx(StudyDescRecord *study, const char *uid) { if ((study != NULL) && (uid != NULL)) { register int i = 0; for (i = 0; i < PSTAT_MAXSTUDYCOUNT; i++) { if ((study[i].StudyInstanceUID != NULL) && (strcmp(uid, study[i].StudyInstanceUID) == 0)) { return i; } } } return -1; } int DVInterface::deleteImageFile(const char *filename) { if ((filename != NULL) && (pHandle != NULL)) { const char *pos; if (((pos = strrchr(filename, OFstatic_cast(int, PATH_SEPARATOR))) == NULL) || // check whether image file resides in index.dat directory (strncmp(filename, pHandle->getStorageArea(), pos - filename) == 0)) { // DB_deleteImageFile((/*const */char *)filename); if (unlink(filename) == 0) return 1; // image file has been deleted } return 2; // image file has not been deleted } return 0; // given filename is invalid } OFCondition DVInterface::deleteStudy(const char *studyUID) { DVStudyCache::ItemStruct *study = getStudyStruct(studyUID); if (study != NULL) { OFCondition result = EC_IllegalCall; OFBool wasNew = OFTrue; if (lockExclusive() == EC_Normal) { wasNew = newInstancesReceived(); if (study->List.gotoFirst()) { StudyDescRecord *study_desc = OFstatic_cast(StudyDescRecord *, malloc(SIZEOF_STUDYDESC)); if (study_desc != NULL) { if (pHandle->DB_GetStudyDesc(study_desc).good()) { int idx = findStudyIdx(study_desc, studyUID); if (idx >= 0) { do /* for all series */ { DVSeriesCache::ItemStruct *series = study->List.getItem(); if (series != NULL) { if (series->List.gotoFirst()) { do /* for all instances */ { pHandle->DB_IdxRemove(series->List.getPos()); deleteImageFile(series->List.getFilename()); } while (series->List.gotoNext()); } } } while (study->List.gotoNext()); study_desc[idx].NumberofRegistratedImages = 0; study_desc[idx].StudySize = 0; pHandle->DB_StudyDescChange(study_desc); } } free(study_desc); } } } unlockExclusive(); if (!wasNew) resetDatabaseReferenceTime(); return result; } return EC_IllegalCall; } OFCondition DVInterface::deleteSeries(const char *studyUID, const char *seriesUID) { DVSeriesCache::ItemStruct *series = getSeriesStruct(studyUID, seriesUID); if (series != NULL) { OFCondition result = EC_IllegalCall; OFBool wasNew = OFTrue; if (lockExclusive() == EC_Normal) { wasNew = newInstancesReceived(); if (series->List.gotoFirst()) { StudyDescRecord *study_desc = OFstatic_cast(StudyDescRecord *, malloc(SIZEOF_STUDYDESC)); if (study_desc != NULL) { if (pHandle->DB_GetStudyDesc(study_desc).good()) { int idx = findStudyIdx(study_desc, studyUID); if (idx >= 0) { do /* for all images */ { pHandle->DB_IdxRemove(series->List.getPos()); if (study_desc[idx].NumberofRegistratedImages > 0) { study_desc[idx].NumberofRegistratedImages--; study_desc[idx].StudySize -= series->List.getImageSize(); } deleteImageFile(series->List.getFilename()); } while (series->List.gotoNext()); pHandle->DB_StudyDescChange(study_desc); } } free(study_desc); } } } unlockExclusive(); if (!wasNew) resetDatabaseReferenceTime(); return result; } return EC_IllegalCall; } OFCondition DVInterface::deleteInstance(const char *studyUID, const char *seriesUID, const char *instanceUID) { DVSeriesCache::ItemStruct *series = getSeriesStruct(studyUID, seriesUID, instanceUID); if (series != NULL) { OFCondition result = EC_IllegalCall; OFBool wasNew = OFTrue; if (lockExclusive() == EC_Normal) { wasNew = newInstancesReceived(); pHandle->DB_IdxRemove(series->List.getPos()); StudyDescRecord *study_desc = OFstatic_cast(StudyDescRecord *, malloc(SIZEOF_STUDYDESC)); if (study_desc != NULL) { if (pHandle->DB_GetStudyDesc(study_desc).good()) { register int i = 0; for (i = 0; i < PSTAT_MAXSTUDYCOUNT; i++) { if ((study_desc[i].StudyInstanceUID != NULL) && (strcmp(studyUID, study_desc[i].StudyInstanceUID) != 0)) { if (study_desc[i].NumberofRegistratedImages > 0) { study_desc[i].NumberofRegistratedImages--; study_desc[i].StudySize -= series->List.getImageSize(); pHandle->DB_StudyDescChange(study_desc); } break; } } free(study_desc); result = EC_Normal; } deleteImageFile(series->List.getFilename()); } } unlockExclusive(); if (!wasNew) resetDatabaseReferenceTime(); return result; } return EC_IllegalCall; } OFBool DVInterface::isDisplayTransformPossible(DVPSDisplayTransform transform) { if (transform == DVPSD_none) return OFFalse; return (displayFunction[transform] != NULL); } OFCondition DVInterface::setAmbientLightValue(double value) { OFCondition result = EC_IllegalCall; for (int i = DVPSD_first; i < DVPSD_max; i++) { if ((displayFunction[i] != NULL) && (displayFunction[i]->setAmbientLightValue(value))) result = EC_Normal; // at least one display function has been valid } return result; } OFCondition DVInterface::getAmbientLightValue(double &value) { if (displayFunction[DVPSD_first] != NULL) { value = displayFunction[DVPSD_first]->getAmbientLightValue(); return EC_Normal; } return EC_IllegalCall; } OFCondition DVInterface::sendIOD(const char * targetID, const char * studyUID, const char * seriesUID, const char * instanceUID) { if ((targetID==NULL)||(studyUID==NULL)) return EC_IllegalCall; const char *sender_application = getSenderName(); if (sender_application==NULL) return EC_IllegalCall; if (configPath.length()==0) return EC_IllegalCall; DVPSHelper::cleanChildren(); // clean up old child processes before creating new ones #ifdef HAVE_FORK // Unix version - call fork() and execl() pid_t pid = fork(); if (pid < 0) { // fork failed - return error code return EC_IllegalCall; } else if (pid > 0) { // we are the parent process return EC_Normal; } else { // we are the child process if (execl(sender_application, sender_application, configPath.c_str(), targetID, studyUID, seriesUID, instanceUID, NULL) < 0) { DCMPSTAT_ERROR("Unable to execute '" << sender_application << "'"); } // if execl succeeds, this part will not get executed. // if execl fails, there is not much we can do except bailing out. abort(); } #else // Windows version - call CreateProcess() // initialize startup info PROCESS_INFORMATION procinfo; STARTUPINFO sinfo; OFBitmanipTemplate::zeroMem((char *)&sinfo, sizeof(sinfo)); sinfo.cb = sizeof(sinfo); char commandline[4096]; if (seriesUID && instanceUID) sprintf(commandline, "%s %s %s %s %s %s", sender_application, configPath.c_str(), targetID, studyUID, seriesUID, instanceUID); else if (seriesUID) sprintf(commandline, "%s %s %s %s %s", sender_application, configPath.c_str(), targetID, studyUID, seriesUID); else sprintf(commandline, "%s %s %s %s", sender_application, configPath.c_str(), targetID, studyUID); #ifdef DEBUG if (CreateProcess(NULL, commandline, NULL, NULL, 0, 0, NULL, NULL, &sinfo, &procinfo)) #else if (CreateProcess(NULL, commandline, NULL, NULL, 0, DETACHED_PROCESS, NULL, NULL, &sinfo, &procinfo)) #endif { return EC_Normal; } else { DCMPSTAT_ERROR("Unable to execute '" << sender_application << "'"); } #endif return EC_IllegalCall; } OFCondition DVInterface::startReceiver() { const char *receiver_application = getReceiverName(); if (receiver_application==NULL) return EC_IllegalCall; if (configPath.length()==0) return EC_IllegalCall; OFCondition result = EC_Normal; DCMPSTAT_LOGFILE("Starting network receiver processes ..."); Uint32 numberOfReceivers = getNumberOfTargets(DVPSE_receiver); for (Uint32 i=0; i < numberOfReceivers; i++) { DVPSHelper::cleanChildren(); // clean up old child processes before creating new ones #ifdef HAVE_FORK // Unix version - call fork() and execl() pid_t pid = fork(); if (pid < 0) { // fork failed - set error code result = EC_IllegalCall; } else if (pid > 0) { // we are the parent process, continue loop } else { // we are the child process if (execl(receiver_application, receiver_application, configPath.c_str(), getTargetID(i, DVPSE_receiver), NULL) < 0) { DCMPSTAT_ERROR("Unable to execute '" << receiver_application << "'"); } // if execl succeeds, this part will not get executed. // if execl fails, there is not much we can do except bailing out. abort(); } #else // Windows version - call CreateProcess() // initialize startup info PROCESS_INFORMATION procinfo; STARTUPINFO sinfo; OFBitmanipTemplate::zeroMem((char *)&sinfo, sizeof(sinfo)); sinfo.cb = sizeof(sinfo); char commandline[4096]; sprintf(commandline, "%s %s %s", receiver_application, configPath.c_str(), getTargetID(i, DVPSE_receiver)); #ifdef DEBUG if (CreateProcess(NULL, commandline, NULL, NULL, 0, 0, NULL, NULL, &sinfo, &procinfo)) #else if (CreateProcess(NULL, commandline, NULL, NULL, 0, DETACHED_PROCESS, NULL, NULL, &sinfo, &procinfo)) #endif { // continue loop } else { DCMPSTAT_ERROR("Unable to execute '" << receiver_application << "'"); result = EC_IllegalCall; } #endif } return result; } OFCondition DVInterface::terminateReceiver() { const char *receiver_application = getReceiverName(); if (receiver_application==NULL) return EC_IllegalCall; if (configPath.length()==0) return EC_IllegalCall; OFCondition result = EC_Normal; DCMPSTAT_LOGFILE("Terminating network receiver processes ..."); DVPSHelper::cleanChildren(); // clean up old child processes before creating new ones #ifdef HAVE_FORK // Unix version - call fork() and execl() pid_t pid = fork(); if (pid < 0) { // fork failed - set error code result = EC_IllegalCall; } else if (pid > 0) { // we are the parent process, continue loop } else { // we are the child process if (execl(receiver_application, receiver_application, configPath.c_str(), "--terminate", NULL) < 0) { DCMPSTAT_ERROR("Unable to execute '" << receiver_application << "'"); } // if execl succeeds, this part will not get executed. // if execl fails, there is not much we can do except bailing out. abort(); } #else // Windows version - call CreateProcess() // initialize startup info PROCESS_INFORMATION procinfo; STARTUPINFO sinfo; OFBitmanipTemplate::zeroMem((char *)&sinfo, sizeof(sinfo)); sinfo.cb = sizeof(sinfo); char commandline[4096]; sprintf(commandline, "%s %s %s", receiver_application, configPath.c_str(), "--terminate"); #ifdef DEBUG if (CreateProcess(NULL, commandline, NULL, NULL, 0, 0, NULL, NULL, &sinfo, &procinfo)) #else if (CreateProcess(NULL, commandline, NULL, NULL, 0, DETACHED_PROCESS, NULL, NULL, &sinfo, &procinfo)) #endif { // continue loop } else { DCMPSTAT_ERROR("Unable to execute '" << receiver_application << "'"); result = EC_IllegalCall; } #endif return result; } OFCondition DVInterface::startQueryRetrieveServer() { const char *server_application = getQueryRetrieveServerName(); if (server_application==NULL) return EC_IllegalCall; if (configPath.length()==0) return EC_IllegalCall; OFString config_filename = getQueryRetrieveServerName(); config_filename += ".cfg"; if (getQueryRetrieveAutoCreateConfigFile()) createQueryRetrieveServerConfigFile(config_filename.c_str()); DCMPSTAT_LOGFILE("Starting query/retrieve server process ..."); DVPSHelper::cleanChildren(); // clean up old child processes before creating new ones Sint32 timeout = getQueryRetrieveTimeout(); #ifdef HAVE_FORK // Unix version - call fork() and execl() pid_t pid = fork(); if (pid < 0) { // fork failed - return error code return EC_IllegalCall; } else if (pid > 0) { // we are the parent process return EC_Normal; } else { // we are the child process if (timeout > 0) { char str_timeout[20]; sprintf(str_timeout, "%lu", OFstatic_cast(unsigned long, timeout)); execl(server_application, server_application, "-c", config_filename.c_str(), "--allow-shutdown", "--timeout", str_timeout, NULL); } else { execl(server_application, server_application, "-c", config_filename.c_str(), "--allow-shutdown", NULL); } DCMPSTAT_ERROR("Unable to execute '" << server_application << "'"); // if execl succeeds, this part will not get executed. // if execl fails, there is not much we can do except bailing out. abort(); } #else // Windows version - call CreateProcess() // initialize startup info PROCESS_INFORMATION procinfo; STARTUPINFO sinfo; OFBitmanipTemplate::zeroMem((char *)&sinfo, sizeof(sinfo)); sinfo.cb = sizeof(sinfo); char commandline[4096]; if (timeout > 0) { sprintf(commandline, "%s -c %s --allow-shutdown --timeout %lu", server_application, config_filename.c_str(), (unsigned long) timeout); } else { sprintf(commandline, "%s -c %s --allow-shutdown", server_application, config_filename.c_str()); } #ifdef DEBUG if (CreateProcess(NULL, commandline, NULL, NULL, 0, 0, NULL, NULL, &sinfo, &procinfo)) #else if (CreateProcess(NULL, commandline, NULL, NULL, 0, DETACHED_PROCESS, NULL, NULL, &sinfo, &procinfo)) #endif { return EC_Normal; } else { DCMPSTAT_ERROR("Unable to execute '" << server_application << "'"); } #endif return EC_IllegalCall; } OFCondition DVInterface::terminateQueryRetrieveServer() { if (getQueryRetrieveServerName()==NULL) return EC_IllegalCall; if (configPath.length()==0) return EC_IllegalCall; #ifdef HAVE_GUSI_H GUSISetup(GUSIwithSIOUXSockets); GUSISetup(GUSIwithInternetSockets); #endif #ifdef HAVE_WINSOCK_H WSAData winSockData; /* we need at least version 1.1 */ WORD winSockVersionNeeded = MAKEWORD( 1, 1 ); WSAStartup(winSockVersionNeeded, &winSockData); #endif OFCondition result = EC_Normal; T_ASC_Network *net=NULL; T_ASC_Parameters *params=NULL; DIC_NODENAME localHost; DIC_NODENAME peerHost; T_ASC_Association *assoc=NULL; DCMPSTAT_LOGFILE("Terminating query/retrieve server process ..."); OFCondition cond = ASC_initializeNetwork(NET_REQUESTOR, 0, 30, &net); if (cond.good()) { cond = ASC_createAssociationParameters(¶ms, DEFAULT_MAXPDU); if (cond.good()) { ASC_setAPTitles(params, getNetworkAETitle(), getQueryRetrieveAETitle(), NULL); gethostname(localHost, sizeof(localHost) - 1); sprintf(peerHost, "localhost:%d", OFstatic_cast(int, getQueryRetrievePort())); ASC_setPresentationAddresses(params, localHost, peerHost); const char* transferSyntaxes[] = { UID_LittleEndianImplicitTransferSyntax }; cond = ASC_addPresentationContext(params, 1, UID_PrivateShutdownSOPClass, transferSyntaxes, 1); if (cond.good()) { cond = ASC_requestAssociation(net, params, &assoc); if (cond.good()) ASC_abortAssociation(assoc); // tear down association if necessary ASC_dropAssociation(assoc); ASC_destroyAssociation(&assoc); } } else result = EC_IllegalCall; ASC_dropNetwork(&net); } else result = EC_IllegalCall; #ifdef HAVE_WINSOCK_H WSACleanup(); #endif return result; } OFCondition DVInterface::createQueryRetrieveServerConfigFile(const char *filename) { STD_NAMESPACE ofstream output(filename); if (output) { DCMPSTAT_LOGFILE("Creating configuration file for query/retrieve server"); output << "# ATTENTION: This file has been created automatically and will" << OFendl; output << "# be re-created each time the query/retrieve server" << OFendl; output << "# is started. To avoid that manual changes to this" << OFendl; output << "# file are destroyed, the flag AutoCreateConfigFile" << OFendl; output << "# in the configuration file '" << configPath << "' has to be" << OFendl; output << "# switched off." << OFendl; output << OFendl; output << "NetworkType = \"tcp\"" << OFendl; output << "NetworkTCPPort = " << getQueryRetrievePort() << OFendl; output << "MaxPDUSize = " << getQueryRetrieveMaxPDU() << OFendl; output << "MaxAssociations = " << getQueryRetrieveMaxAssociations() << OFendl; output << "Display = \"no\"" << OFendl; output << OFendl; output << "HostTable BEGIN" << OFendl; const char *aet = NULL; const char *name = NULL; const Uint32 count = getNumberOfTargets(); for (Uint32 i = 0; i < count; i++) { const char *id = getTargetID(i); if (id != NULL) { aet = getTargetAETitle(id); name = getTargetHostname(id); if ((aet != NULL) && (name != NULL)) output << id << " = (" << aet << ", " << name << ", " << getTargetPort(id) << ")" << OFendl; } } output << "HostTable END" << OFendl; output << OFendl; output << "AETable BEGIN" << OFendl; output << getQueryRetrieveAETitle() << "\t" << getDatabaseFolder() << "\tR\t("; output << PSTAT_MAXSTUDYCOUNT << ", " << PSTAT_STUDYSIZE / 1024 / 1024 << "mb)\tANY" << OFendl; output << "AETable END" << OFendl; return EC_Normal; } DCMPSTAT_LOGFILE("Could not create configuration file for query/retrieve server"); return EC_IllegalCall; } OFCondition DVInterface::saveDICOMImage( const char *filename, const void *pixelData, unsigned long width, unsigned long height, double aspectRatio, OFBool explicitVR, const char *instanceUID) { if ((width<1)||(width > 0xFFFF)) return EC_IllegalCall; if ((height<1)||(height > 0xFFFF)) return EC_IllegalCall; if (pixelData == NULL) return EC_IllegalCall; if (filename == NULL) return EC_IllegalCall; if (aspectRatio == 0.0) return EC_IllegalCall; Uint16 columns = OFstatic_cast(Uint16, width); Uint16 rows = OFstatic_cast(Uint16, height); OFCondition status = EC_Normal; DcmFileFormat *fileformat = new DcmFileFormat(); DcmDataset *dataset = NULL; if (fileformat) dataset=fileformat->getDataset(); char newuid[70]; if (dataset) { if (EC_Normal==status) status = DVPSHelper::putStringValue(dataset, DCM_PatientName); if (EC_Normal==status) status = DVPSHelper::putStringValue(dataset, DCM_PatientID); if (EC_Normal==status) status = DVPSHelper::putStringValue(dataset, DCM_PatientBirthDate); if (EC_Normal==status) status = DVPSHelper::putStringValue(dataset, DCM_PatientSex); if (EC_Normal==status) status = DVPSHelper::putStringValue(dataset, DCM_StudyDate); if (EC_Normal==status) status = DVPSHelper::putStringValue(dataset, DCM_StudyTime); if (EC_Normal==status) status = DVPSHelper::putStringValue(dataset, DCM_ReferringPhysicianName); if (EC_Normal==status) status = DVPSHelper::putStringValue(dataset, DCM_StudyID); if (EC_Normal==status) status = DVPSHelper::putStringValue(dataset, DCM_AccessionNumber); if (EC_Normal==status) status = DVPSHelper::putStringValue(dataset, DCM_SeriesNumber); if (EC_Normal==status) status = DVPSHelper::putStringValue(dataset, DCM_InstanceNumber); if (EC_Normal==status) status = DVPSHelper::putStringValue(dataset, DCM_PatientOrientation); if (EC_Normal==status) status = DVPSHelper::putStringValue(dataset, DCM_SOPClassUID, UID_SecondaryCaptureImageStorage); if (EC_Normal==status) status = DVPSHelper::putStringValue(dataset, DCM_Modality, "OT"); if (EC_Normal==status) status = DVPSHelper::putStringValue(dataset, DCM_ConversionType, "WSD"); if (EC_Normal==status) status = DVPSHelper::putStringValue(dataset, DCM_PhotometricInterpretation, "MONOCHROME2"); dcmGenerateUniqueIdentifier(newuid); if (EC_Normal==status) status = DVPSHelper::putStringValue(dataset, DCM_SOPInstanceUID, (instanceUID ? instanceUID : newuid)); dcmGenerateUniqueIdentifier(newuid, SITE_SERIES_UID_ROOT); if (EC_Normal==status) status = DVPSHelper::putStringValue(dataset, DCM_SeriesInstanceUID, newuid); dcmGenerateUniqueIdentifier(newuid, SITE_STUDY_UID_ROOT); if (EC_Normal==status) status = DVPSHelper::putStringValue(dataset, DCM_StudyInstanceUID, newuid); if (EC_Normal==status) status = DVPSHelper::putUint16Value(dataset, DCM_SamplesPerPixel, 1); if (EC_Normal==status) status = DVPSHelper::putUint16Value(dataset, DCM_Rows, rows); if (EC_Normal==status) status = DVPSHelper::putUint16Value(dataset, DCM_Columns, columns); if (EC_Normal==status) status = DVPSHelper::putUint16Value(dataset, DCM_BitsAllocated, 8); if (EC_Normal==status) status = DVPSHelper::putUint16Value(dataset, DCM_BitsStored, 8); if (EC_Normal==status) status = DVPSHelper::putUint16Value(dataset, DCM_HighBit, 7); if (EC_Normal==status) status = DVPSHelper::putUint16Value(dataset, DCM_PixelRepresentation, 0); if ((EC_Normal==status)&&(aspectRatio != 1.0)) { sprintf(newuid, "%ld\\%ld", 1000L, OFstatic_cast(long, aspectRatio*1000.0)); status = DVPSHelper::putStringValue(dataset, DCM_PixelAspectRatio, newuid); } DcmPolymorphOBOW *pxData = new DcmPolymorphOBOW(DCM_PixelData); if (pxData) { status = pxData->putUint8Array(OFstatic_cast(Uint8 *, OFconst_cast(void *, pixelData)), OFstatic_cast(unsigned long, width*height)); if (EC_Normal==status) status = dataset->insert(pxData, OFTrue /*replaceOld*/); else delete pxData; } else status = EC_MemoryExhausted; if (status != EC_Normal) DCMPSTAT_LOGFILE("Save image to file failed: invalid data structures"); if (EC_Normal == status) { status = DVPSHelper::saveFileFormat(filename, fileformat, explicitVR); if (status != EC_Normal) DCMPSTAT_LOGFILE("Save image to file failed: could not write fileformat"); } } else { status = EC_MemoryExhausted; DCMPSTAT_LOGFILE("Save image to file failed: memory exhausted"); } delete fileformat; return status; } OFCondition DVInterface::saveDICOMImage( const void *pixelData, unsigned long width, unsigned long height, double aspectRatio) { // release database lock since we are using the DB module directly releaseDatabase(); char uid[100]; dcmGenerateUniqueIdentifier(uid); DcmQueryRetrieveDatabaseStatus dbStatus(STATUS_Success); char imageFileName[MAXPATHLEN+1]; OFCondition result = EC_Normal; DcmQueryRetrieveIndexDatabaseHandle handle(getDatabaseFolder(), PSTAT_MAXSTUDYCOUNT, PSTAT_STUDYSIZE, result); if (result.bad()) { DCMPSTAT_LOGFILE("Save image to database failed: could not lock index file"); return result; } if (handle.makeNewStoreFileName(UID_SecondaryCaptureImageStorage, uid, imageFileName).good()) { // now store presentation state as filename result = saveDICOMImage(imageFileName, pixelData, width, height, aspectRatio, OFTrue, uid); if (EC_Normal==result) { if (handle.storeRequest(UID_SecondaryCaptureImageStorage, uid, imageFileName, &dbStatus).bad()) { result = EC_IllegalCall; DCMPSTAT_LOGFILE("Save image to database failed: could not register in index file"); DCMPSTAT_DEBUG("Unable to register secondary capture image '" << imageFileName << "' in database"); } } } return result; } OFCondition DVInterface::saveHardcopyGrayscaleImage( const char *filename, const void *pixelData, unsigned long width, unsigned long height, double aspectRatio, OFBool explicitVR, const char *instanceUID) { if (pState == NULL) return EC_IllegalCall; if (pPrint == NULL) return EC_IllegalCall; if ((width<1)||(width > 0xFFFF)) return EC_IllegalCall; if ((height<1)||(height > 0xFFFF)) return EC_IllegalCall; if (pixelData == NULL) return EC_IllegalCall; if (filename == NULL) return EC_IllegalCall; if (aspectRatio == 0.0) return EC_IllegalCall; Uint16 columns = OFstatic_cast(Uint16, width); Uint16 rows = OFstatic_cast(Uint16, height); OFCondition status = EC_Normal; DcmFileFormat *fileformat = new DcmFileFormat(); DcmDataset *dataset = NULL; if (fileformat) dataset=fileformat->getDataset(); char newuid[70]; OFString aString; OFString theInstanceUID; if (dataset) { // write patient module if (EC_Normal==status) status = pState->writeHardcopyImageAttributes(*dataset); // write general study and general series module if (EC_Normal==status) status = pPrint->writeHardcopyImageAttributes(*dataset); // Hardcopy Equipment Module if (EC_Normal==status) status = DVPSHelper::putStringValue(dataset, DCM_RETIRED_HardcopyDeviceManufacturer, "OFFIS"); if (EC_Normal==status) status = DVPSHelper::putStringValue(dataset, DCM_RETIRED_HardcopyDeviceSoftwareVersion, OFFIS_DTK_IMPLEMENTATION_VERSION_NAME); // General Image Module if (EC_Normal==status) status = DVPSHelper::putStringValue(dataset, DCM_InstanceNumber); if (EC_Normal==status) status = DVPSHelper::putStringValue(dataset, DCM_PatientOrientation); if (EC_Normal==status) status = DVPSHelper::putStringValue(dataset, DCM_ImageType, "DERIVED\\SECONDARY"); if (EC_Normal==status) status = DVPSHelper::putStringValue(dataset, DCM_DerivationDescription, "Hardcopy rendered using Presentation State"); // source image sequence is written in pState->writeHardcopyImageAttributes(). // SOP Common Module if (EC_Normal==status) status = DVPSHelper::putStringValue(dataset, DCM_SOPClassUID, UID_RETIRED_HardcopyGrayscaleImageStorage); dcmGenerateUniqueIdentifier(newuid); theInstanceUID = (instanceUID ? instanceUID : newuid); if (EC_Normal==status) status = DVPSHelper::putStringValue(dataset, DCM_SOPInstanceUID, theInstanceUID.c_str()); DVPSHelper::currentDate(aString); if (EC_Normal==status) status = DVPSHelper::putStringValue(dataset, DCM_InstanceCreationDate, aString.c_str()); DVPSHelper::currentTime(aString); if (EC_Normal==status) status = DVPSHelper::putStringValue(dataset, DCM_InstanceCreationTime, aString.c_str()); // Hardcopy Grayscale Image Module if (EC_Normal==status) status = DVPSHelper::putStringValue(dataset, DCM_PhotometricInterpretation, "MONOCHROME2"); if (EC_Normal==status) status = DVPSHelper::putUint16Value(dataset, DCM_SamplesPerPixel, 1); if (EC_Normal==status) status = DVPSHelper::putUint16Value(dataset, DCM_Rows, rows); if (EC_Normal==status) status = DVPSHelper::putUint16Value(dataset, DCM_Columns, columns); if (EC_Normal==status) status = DVPSHelper::putUint16Value(dataset, DCM_BitsAllocated, 16); if (EC_Normal==status) status = DVPSHelper::putUint16Value(dataset, DCM_BitsStored, 12); if (EC_Normal==status) status = DVPSHelper::putUint16Value(dataset, DCM_HighBit, 11); if (EC_Normal==status) status = DVPSHelper::putUint16Value(dataset, DCM_PixelRepresentation, 0); if ((EC_Normal==status)&&(aspectRatio != 1.0)) { sprintf(newuid, "%ld\\%ld", 1000L, OFstatic_cast(long, aspectRatio*1000.0)); status = DVPSHelper::putStringValue(dataset, DCM_PixelAspectRatio, newuid); } DcmPolymorphOBOW *pxData = new DcmPolymorphOBOW(DCM_PixelData); if (pxData) { status = pxData->putUint16Array(OFstatic_cast(Uint16 *, OFconst_cast(void *, pixelData)), OFstatic_cast(unsigned long, width*height)); if (EC_Normal==status) status = dataset->insert(pxData, OFTrue /*replaceOld*/); else delete pxData; } else status = EC_MemoryExhausted; // add Presentation LUT to hardcopy file if present, making it a Standard Extended SOP Class if ((EC_Normal==status)&&(pState->getPresentationLUT() == DVPSP_table)) { status = pState->writePresentationLUTforPrint(*dataset); } if (status != EC_Normal) DCMPSTAT_LOGFILE("Save hardcopy grayscale image to file failed: invalid data structures"); // save image file if (EC_Normal == status) { status = DVPSHelper::saveFileFormat(filename, fileformat, explicitVR); if (status != EC_Normal) DCMPSTAT_LOGFILE("Save hardcopy grayscale image to file failed: could not write fileformat"); } } else { status = EC_MemoryExhausted; DCMPSTAT_LOGFILE("Save hardcopy grayscale image to file failed: memory exhausted"); } if (EC_Normal == status) { OFString reqImageTmp; const char *reqImageSize = NULL; DVPSPresentationLUT *presLUT = pState->getPresentationLUTData(); if (EC_Normal == pState->getPrintBitmapRequestedImageSize(reqImageTmp)) reqImageSize = reqImageTmp.c_str(); /* we don't pass the patient ID (available as pState->getPatientID()) here because then * we could end up with multiple images being part of one study and one series, but having * different patient IDs. This might confuse archives using the patient root query model. */ status = pPrint->addImageBox(getNetworkAETitle(), theInstanceUID.c_str(), reqImageSize, NULL, presLUT, pState->isMonochrome1Image()); } delete fileformat; return status; } OFCondition DVInterface::saveHardcopyGrayscaleImage( const void *pixelData, unsigned long width, unsigned long height, double aspectRatio) { // release database lock since we are using the DB module directly releaseDatabase(); char uid[100]; dcmGenerateUniqueIdentifier(uid); DcmQueryRetrieveDatabaseStatus dbStatus(STATUS_Success); char imageFileName[MAXPATHLEN+1]; OFCondition result=EC_Normal; DcmQueryRetrieveIndexDatabaseHandle handle(getDatabaseFolder(), PSTAT_MAXSTUDYCOUNT, PSTAT_STUDYSIZE, result); if (result.bad()) { DCMPSTAT_LOGFILE("Save hardcopy grayscale image to database failed: could not lock index file"); return result; } if (handle.makeNewStoreFileName(UID_RETIRED_HardcopyGrayscaleImageStorage, uid, imageFileName).good()) { result = saveHardcopyGrayscaleImage(imageFileName, pixelData, width, height, aspectRatio, OFTrue, uid); if (EC_Normal==result) { if (handle.storeRequest(UID_RETIRED_HardcopyGrayscaleImageStorage, uid, imageFileName, &dbStatus).bad()) { result = EC_IllegalCall; DCMPSTAT_LOGFILE("Save hardcopy grayscale image to database failed: could not register in index file"); DCMPSTAT_DEBUG("Unable to register hardcopy grayscale image '" << imageFileName << "' in database"); } } } return result; } OFCondition DVInterface::saveFileFormatToDB(DcmFileFormat &fileformat) { // release database lock since we are using the DB module directly releaseDatabase(); // get SOP class and instance UID from dataset char *classUID = NULL; char *instanceUID = NULL; DcmStack stack; DcmDataset *dset = fileformat.getDataset(); if (dset) { if (EC_Normal == dset->search(DCM_SOPInstanceUID, stack, ESM_fromHere, OFFalse)) { OFstatic_cast(DcmElement *, stack.top())->getString(instanceUID); } stack.clear(); if (EC_Normal == dset->search(DCM_SOPClassUID, stack, ESM_fromHere, OFFalse)) { OFstatic_cast(DcmElement *, stack.top())->getString(classUID); } } if ((instanceUID==NULL)||(classUID==NULL)) return EC_IllegalCall; DcmQueryRetrieveDatabaseStatus dbStatus(STATUS_Success); char imageFileName[MAXPATHLEN+1]; OFCondition result=EC_Normal; DcmQueryRetrieveIndexDatabaseHandle handle(getDatabaseFolder(), PSTAT_MAXSTUDYCOUNT, PSTAT_STUDYSIZE, result); if (result.bad()) { DCMPSTAT_LOGFILE("Save fileformat to database failed: could not lock index file"); return result; } if (handle.makeNewStoreFileName(classUID, instanceUID, imageFileName).good()) { // save image file result = DVPSHelper::saveFileFormat(imageFileName, &fileformat, OFTrue); if (EC_Normal==result) { if (handle.storeRequest(classUID, instanceUID, imageFileName, &dbStatus).bad()) { result = EC_IllegalCall; DCMPSTAT_LOGFILE("Save fileformat to database failed: could not register in index file"); DCMPSTAT_DEBUG("Unable to register file '" << imageFileName << "' in database"); } } } return result; } OFCondition DVInterface::loadStoredPrint(const char *studyUID, const char *seriesUID, const char *instanceUID, OFBool changeStatus) { OFCondition status = EC_IllegalCall; if (studyUID && seriesUID && instanceUID) { if (lockDatabase() == EC_Normal) { const char *filename = getFilename(studyUID, seriesUID, instanceUID); if (filename) { if ((status = loadStoredPrint(filename)) == EC_Normal) { if (changeStatus) instanceReviewed(studyUID, seriesUID, instanceUID); } } else DCMPSTAT_LOGFILE("Load stored print from database failed: UIDs not in index file"); } else DCMPSTAT_LOGFILE("Load stored print from database failed: could not lock index file"); } else DCMPSTAT_LOGFILE("Load stored print from database failed: invalid UIDs"); return status; } OFCondition DVInterface::loadStoredPrint(const char *filename) { OFCondition status = EC_IllegalCall; DcmFileFormat *fileformat = NULL; DVPSStoredPrint *print = new DVPSStoredPrint(getDefaultPrintIllumination(), getDefaultPrintReflection()); if (print==NULL) { DCMPSTAT_LOGFILE("Load stored print from file failed: memory exhausted"); return EC_MemoryExhausted; } if ((status = DVPSHelper::loadFileFormat(filename, fileformat)) == EC_Normal) { if (fileformat) { DcmDataset *dataset = fileformat->getDataset(); if (dataset) { if (EC_Normal == (status = print->read(*dataset))) { delete pPrint; pPrint = print; clearFilmSessionSettings(); } } else status = EC_CorruptedData; delete fileformat; } else status = EC_IllegalCall; if (status != EC_Normal) DCMPSTAT_LOGFILE("Load stored print from file failed: invalid data structures"); } else DCMPSTAT_LOGFILE("Load stored print from file failed: could not read fileformat"); if (status != EC_Normal) { delete print; } return status; } OFCondition DVInterface::saveStoredPrint( const char *filename, OFBool writeRequestedImageSize, OFBool explicitVR, const char *instanceUID) { if (pState == NULL) return EC_IllegalCall; if (pPrint == NULL) return EC_IllegalCall; if (filename == NULL) return EC_IllegalCall; OFCondition status = EC_Normal; DcmFileFormat *fileformat = new DcmFileFormat(); DcmDataset *dataset = NULL; if (fileformat) dataset = fileformat->getDataset(); char newuid[70]; char buf[32]; /* set annotation if active */ if (activateAnnotation) { OFString text; OFString dummy; if (prependDateTime) { OFDateTime::getCurrentDateTime().getISOFormattedDateTime(text, OFFalse /*showSeconds*/); } if (prependPrinterName) { text += currentPrinter; text += " "; } if (prependLighting) { sprintf(buf, "%d/%d ", pPrint->getPrintIllumination(), pPrint->getPrintReflectedAmbientLight()); text += buf; } text += annotationText; if (text.size() >64) text.erase(64); // limit to max annotation length if (getTargetPrinterSupportsAnnotationBoxSOPClass(currentPrinter.c_str())) { const char *displayformat = getTargetPrinterAnnotationDisplayFormatID(currentPrinter.c_str(), dummy); Uint16 position = getTargetPrinterAnnotationPosition(currentPrinter.c_str()); pPrint->setSingleAnnotation(displayformat, text.c_str(), position); } else pPrint->deleteAnnotations(); if (getTargetPrinterSessionLabelAnnotation(currentPrinter.c_str())) { status = setPrinterFilmSessionLabel(text.c_str()); } } else { pPrint->deleteAnnotations(); } if (dataset) { if (instanceUID) status = pPrint->setInstanceUID(instanceUID); else { dcmGenerateUniqueIdentifier(newuid); status = pPrint->setInstanceUID(newuid); } if (EC_Normal == status) status = pPrint->write(*dataset, writeRequestedImageSize, OFTrue, OFTrue, OFFalse); // save file if (EC_Normal == status) status = DVPSHelper::saveFileFormat(filename, fileformat, explicitVR); if (status != EC_Normal) DCMPSTAT_LOGFILE("Save stored print to file failed: could not write fileformat"); } else { DCMPSTAT_LOGFILE("Save stored print to file failed: memory exhausted"); status = EC_MemoryExhausted; } delete fileformat; return status; } OFCondition DVInterface::saveStoredPrint(OFBool writeRequestedImageSize) { // release database lock since we are using the DB module directly releaseDatabase(); char uid[100]; dcmGenerateUniqueIdentifier(uid); DcmQueryRetrieveDatabaseStatus dbStatus(STATUS_Success); char imageFileName[MAXPATHLEN+1]; OFCondition result=EC_Normal; DcmQueryRetrieveIndexDatabaseHandle handle(getDatabaseFolder(), PSTAT_MAXSTUDYCOUNT, PSTAT_STUDYSIZE, result); if (result.bad()) { DCMPSTAT_LOGFILE("Save stored print to database failed: could not lock index file"); return result; } if (handle.makeNewStoreFileName(UID_RETIRED_StoredPrintStorage, uid, imageFileName).good()) { // now store stored print object as filename result = saveStoredPrint(imageFileName, writeRequestedImageSize, OFTrue, uid); if (EC_Normal==result) { if (handle.storeRequest(UID_RETIRED_StoredPrintStorage, uid, imageFileName, &dbStatus).bad()) { result = EC_IllegalCall; DCMPSTAT_LOGFILE("Save stored print to database failed: could not register in index file"); DCMPSTAT_DEBUG("Unable to register stored print object '" << imageFileName << "' in database"); } } } return result; } size_t DVInterface::getNumberOfPrintPreviews() { if (pPrint != NULL) return pPrint->getNumberOfImages(); return 0; } OFCondition DVInterface::loadPrintPreview(size_t idx, OFBool printLUT, OFBool changeStatus) { OFCondition status = EC_IllegalCall; if ((pPrint != NULL) && (maximumPrintPreviewWidth > 0) && (maximumPrintPreviewHeight > 0)) { const char *studyUID; const char *seriesUID; const char *instanceUID; if ((status = pPrint->getImageReference(idx, studyUID, seriesUID, instanceUID)) == EC_Normal) { status = EC_IllegalCall; const char *filename = getFilename(studyUID, seriesUID, instanceUID); if (filename) { DicomImage *image = new DicomImage(filename); if (image != NULL) { if (image->getStatus() == EIS_Normal) { unsigned long width = maximumPrintPreviewWidth; unsigned long height = maximumPrintPreviewHeight; /* consider aspect ratio of the image and the display */ double ratio = image->getWidthHeightRatio(); const double mpWidth = getMonitorPixelWidth(); const double mpHeight = getMonitorPixelHeight(); if ((mpWidth > 0) && (mpHeight > 0)) ratio *= (mpWidth / mpHeight); if (ratio == 0.0) ratio = 1.0; if (OFstatic_cast(double, image->getWidth()) / OFstatic_cast(double, width * ratio) < OFstatic_cast(double, image->getHeight()) / OFstatic_cast(double, height)) { width = 0; } else height = 0; image->setWidthHeightRatio(ratio); pHardcopyImage = image->createScaledImage(width, height, 0 /*interpolate*/, 1 /*aspect ratio*/); if (pHardcopyImage != NULL) { if (pHardcopyImage->getStatus() == EIS_Normal) { /* set display function for calibrated output */ if (displayFunction != NULL) pHardcopyImage->setDisplayFunction(displayFunction[DVPSD_GSDF]); /* adapt polarity if necessary */ const char *polarity = pPrint->getImagePolarity(idx); if ((polarity != NULL) && (strcmp(polarity, "REVERSE") == 0)) pHardcopyImage->setPolarity(EPP_Reverse); /* set (print/display) presentation LUT */ DVPSPresentationLUT *plut = pPrint->getPresentationLUT(); // first check whether there's a global one if (plut == NULL) plut = pPrint->getImagePresentationLUT(idx); // ... then check for an image box specific if (plut != NULL) { pHardcopyImage->setHardcopyParameters(pPrint->getMinDensityValue(), pPrint->getMaxDensityValue(), pPrint->getPrintReflectedAmbientLight(), pPrint->getPrintIllumination()); plut->activate(pHardcopyImage, printLUT); } status = EC_Normal; if (changeStatus) instanceReviewed(studyUID, seriesUID, instanceUID); } else unloadPrintPreview(); } else DCMPSTAT_LOGFILE("Load hardcopy grayscale image for print preview failed: memory exhausted"); } else DCMPSTAT_LOGFILE("Load hardcopy grayscale image for print preview failed: could not read image"); delete image; } else DCMPSTAT_LOGFILE("Load hardcopy grayscale image for print preview failed: memory exhausted"); } else DCMPSTAT_LOGFILE("Load hardcopy grayscale image for print preview failed: UIDs not in index file"); } } return status; } void DVInterface::unloadPrintPreview() { delete pHardcopyImage; pHardcopyImage = NULL; } unsigned long DVInterface::getPrintPreviewSize() { unsigned long result = 0; unsigned long width; unsigned long height; if (getPrintPreviewWidthHeight(width, height) == EC_Normal) result = width * height; return result; } void DVInterface::setMaxPrintPreviewWidthHeight(unsigned long width, unsigned long height) { if ((width != maximumPrintPreviewWidth) || (height != maximumPrintPreviewHeight)) { unloadPrintPreview(); maximumPrintPreviewWidth = width; maximumPrintPreviewHeight = height; } } OFCondition DVInterface::getPrintPreviewWidthHeight(unsigned long &width, unsigned long &height) { OFCondition result = EC_IllegalCall; if (pHardcopyImage != NULL) { width = pHardcopyImage->getWidth(); height = pHardcopyImage->getHeight(); if ((width > 0) && (height > 0)) result = EC_Normal; } else { width = 0; height = 0; } return result; } OFCondition DVInterface::getPrintPreviewBitmap(void *bitmap, unsigned long size) { OFCondition status = EC_IllegalCall; if ((pHardcopyImage != NULL) && (bitmap != NULL) && (size > 0)) { if (pHardcopyImage->getOutputData(bitmap, size, 8 /*bits*/)) status = EC_Normal; } return status; } OFCondition DVInterface::setCurrentPrinter(const char *targetID) { if (targetID == NULL) return EC_IllegalCall; if (getTargetHostname(targetID) == NULL) return EC_IllegalCall; // Printer seems to be unknown activateAnnotation = getTargetPrinterSupportsAnnotation(targetID); if (pPrint != NULL) { pPrint->setPrinterName(targetID); pPrint->setDestination(getTargetAETitle(targetID)); } currentPrinter = targetID; return EC_Normal; } const char *DVInterface::getCurrentPrinter() { return currentPrinter.c_str(); } OFCondition DVInterface::setPrinterMediumType(const char *value) { if (value) printerMediumType = value; else printerMediumType.clear(); return EC_Normal; } const char *DVInterface::getPrinterMediumType() { return printerMediumType.c_str(); } OFCondition DVInterface::setPrinterFilmDestination(const char *value) { if (value) printerFilmDestination = value; else printerFilmDestination.clear(); return EC_Normal; } const char *DVInterface::getPrinterFilmDestination() { return printerFilmDestination.c_str(); } OFCondition DVInterface::setPrinterFilmSessionLabel(const char *value) { if (value) printerFilmSessionLabel = value; else printerFilmSessionLabel.clear(); return EC_Normal; } const char *DVInterface::getPrinterFilmSessionLabel() { return printerFilmSessionLabel.c_str(); } OFCondition DVInterface::setPrinterPriority(const char *value) { if (value) printerPriority = value; else printerPriority.clear(); return EC_Normal; } const char *DVInterface::getPrinterPriority() { return printerPriority.c_str(); } OFCondition DVInterface::setPrinterOwnerID(const char *value) { if (value) printerOwnerID = value; else printerOwnerID.clear(); return EC_Normal; } const char *DVInterface::getPrinterOwnerID() { return printerOwnerID.c_str(); } OFCondition DVInterface::setPrinterNumberOfCopies(unsigned long value) { printerNumberOfCopies = value; return EC_Normal; } unsigned long DVInterface::getPrinterNumberOfCopies() { return printerNumberOfCopies; } OFCondition DVInterface::selectDisplayPresentationLUT(const char *lutID) { OFCondition result = EC_IllegalCall; if (lutID && pState) { const char *lutfile = getLUTFilename(lutID); if (lutfile) { OFString filename = getLUTFolder(); // never NULL. filename += PATH_SEPARATOR; filename += lutfile; DcmFileFormat *fileformat = NULL; if ((result = DVPSHelper::loadFileFormat(filename.c_str(), fileformat)) == EC_Normal) { if (fileformat) { DcmDataset *dataset = fileformat->getDataset(); if (dataset) result = pState->setPresentationLookupTable(*dataset); else result = EC_IllegalCall; if (EC_Normal == result) displayCurrentLUTID = lutID; else displayCurrentLUTID.clear(); } else result = EC_IllegalCall; if (result != EC_Normal) DCMPSTAT_LOGFILE("Load display presentation LUT from file: invalid data structures"); } else DCMPSTAT_LOGFILE("Load display presentation LUT from file: could not read fileformat"); delete fileformat; } else DCMPSTAT_LOGFILE("Load display presentation LUT from file: not specified in config file"); } return result; } const char *DVInterface::getDisplayPresentationLUTID() { return displayCurrentLUTID.c_str(); } OFCondition DVInterface::selectPrintPresentationLUT(const char *lutID) { OFCondition result = EC_IllegalCall; if (lutID && pPrint) { const char *lutfile = getLUTFilename(lutID); if (lutfile) { OFString filename = getLUTFolder(); // never NULL. filename += PATH_SEPARATOR; filename += lutfile; DcmFileFormat *fileformat = NULL; if ((result = DVPSHelper::loadFileFormat(filename.c_str(), fileformat)) == EC_Normal) { if (fileformat) { DcmDataset *dataset = fileformat->getDataset(); if (dataset) result = pPrint->setPresentationLookupTable(*dataset); else result = EC_IllegalCall; if (EC_Normal == result) printCurrentLUTID = lutID; else printCurrentLUTID.clear(); } else result = EC_IllegalCall; if (result != EC_Normal) DCMPSTAT_LOGFILE("Load print presentation LUT from file: invalid data structures"); } else DCMPSTAT_LOGFILE("Load print presentation LUT from file: could not read fileformat"); delete fileformat; } else DCMPSTAT_LOGFILE("Load print presentation LUT from file: not specified in config file"); } return result; } const char *DVInterface::getPrintPresentationLUTID() { return printCurrentLUTID.c_str(); } OFCondition DVInterface::spoolPrintJob(OFBool deletePrintedImages) { if (pPrint==NULL) return EC_IllegalCall; if (currentPrinter.size()==0) return EC_IllegalCall; OFCondition result = saveStoredPrint(getTargetPrinterSupportsRequestedImageSize(currentPrinter.c_str())); if (EC_Normal == result) { result = spoolStoredPrintFromDB(pPrint->getStudyInstanceUID(), pPrint->getSeriesInstanceUID(), pPrint->getSOPInstanceUID()); } if ((EC_Normal == result) && deletePrintedImages) result = pPrint->deleteSpooledImages(); return result; } OFCondition DVInterface::startPrintSpooler() { const char *spooler_application = getSpoolerName(); if (spooler_application==NULL) return EC_IllegalCall; if (configPath.length()==0) return EC_IllegalCall; const char *printer = NULL; unsigned long sleepingTime = getSpoolerSleep(); if (sleepingTime==0) sleepingTime=1; // default char sleepStr[20]; sprintf(sleepStr, "%lu", sleepingTime); OFBool detailedLog = getDetailedLog(); OFCondition result = EC_Normal; DCMPSTAT_LOGFILE("Starting print spooler process ..."); DVPSHelper::cleanChildren(); // clean up old child processes before creating new ones Uint32 numberOfPrinters = getNumberOfTargets(DVPSE_printAny); if (numberOfPrinters > 0) for (Uint32 i=0; i < numberOfPrinters; i++) { printer = getTargetID(i, DVPSE_printAny); #ifdef HAVE_FORK // Unix version - call fork() and execl() pid_t pid = fork(); if (pid < 0) result = EC_IllegalCall; // fork failed - return error code else if (pid==0) { // we are the child process if (detailedLog) { if (execl(spooler_application, spooler_application, "--verbose", "--dump", "--spool", printJobIdentifier.c_str(), "--printer", printer, "--config", configPath.c_str(), "--sleep", sleepStr, NULL) < 0) { DCMPSTAT_ERROR("Unable to execute '" << spooler_application << "'"); } } else { if (execl(spooler_application, spooler_application, "--spool", printJobIdentifier.c_str(), "--printer", printer, "--config", configPath.c_str(), "--sleep", sleepStr, NULL) < 0) { DCMPSTAT_ERROR("Unable to execute '" << spooler_application << "'"); } } // if execl succeeds, this part will not get executed. // if execl fails, there is not much we can do except bailing out. abort(); } #else // Windows version - call CreateProcess() // initialize startup info PROCESS_INFORMATION procinfo; STARTUPINFO sinfo; OFBitmanipTemplate::zeroMem((char *)&sinfo, sizeof(sinfo)); sinfo.cb = sizeof(sinfo); char commandline[4096]; if (detailedLog) { sprintf(commandline, "%s --verbose --dump --spool %s --printer %s --config %s --sleep %s", spooler_application, printJobIdentifier.c_str(), printer, configPath.c_str(), sleepStr); } else { sprintf(commandline, "%s --spool %s --printer %s --config %s --sleep %s", spooler_application, printJobIdentifier.c_str(), printer, configPath.c_str(), sleepStr); } #ifdef DEBUG if (0 == CreateProcess(NULL, commandline, NULL, NULL, 0, 0, NULL, NULL, &sinfo, &procinfo)) #else if (0 == CreateProcess(NULL, commandline, NULL, NULL, 0, DETACHED_PROCESS, NULL, NULL, &sinfo, &procinfo)) #endif { DCMPSTAT_ERROR("Unable to execute '" << spooler_application << "'"); result = EC_IllegalCall; } #endif } return result; } OFCondition DVInterface::createPrintJobFilenames(const char *printer, OFString& tempname, OFString& jobname) { tempname.clear(); jobname.clear(); if (printer==NULL) return EC_IllegalCall; char buf[20]; sprintf(buf, "%04lu", printJobCounter++); jobname = getSpoolFolder(); jobname += PATH_SEPARATOR; jobname += printJobIdentifier; jobname += '_'; jobname += printer; jobname += '_'; jobname += buf; tempname = jobname; jobname += PRINTJOB_SUFFIX; tempname += PRINTJOB_TEMP_SUFFIX; return EC_Normal; } OFCondition DVInterface::terminatePrintSpooler() { if (getSpoolerName()==NULL) return EC_IllegalCall; if (configPath.length()==0) return EC_IllegalCall; DVPSHelper::cleanChildren(); // clean up old child processes before creating new ones OFString spoolFilename; OFString tempFilename; const char *prt = NULL; DCMPSTAT_LOGFILE("Terminating print spooler process ..."); Uint32 numberOfPrinters = getNumberOfTargets(DVPSE_printAny); if (numberOfPrinters > 0) for (Uint32 i=0; i < numberOfPrinters; i++) { prt = getTargetID(i, DVPSE_printAny); if (EC_Normal != createPrintJobFilenames(prt, tempFilename, spoolFilename)) return EC_IllegalCall; FILE *outf = fopen(tempFilename.c_str(),"wb"); if (outf) { OFString timeString; OFDateTime::getCurrentDateTime().getISOFormattedDateTime(timeString); fprintf(outf,"#\n# print job created %s\n", timeString.c_str()); fprintf(outf,"# target printer: [%s]\n#\n", (prt ? prt : "none")); fprintf(outf,"terminate\n"); fclose(outf); if (0 != rename(tempFilename.c_str(), spoolFilename.c_str())) { DCMPSTAT_ERROR("Unable to activate spooler termination request '" << spoolFilename.c_str() << "'"); return EC_IllegalCall; } } else { DCMPSTAT_ERROR("Unable to create spooler termination request '" << tempFilename.c_str() << "'"); return EC_IllegalCall; } } return EC_Normal; } OFCondition DVInterface::startPrintServer() { const char *application = getPrintServerName(); if (application==NULL) return EC_IllegalCall; if (configPath.length()==0) return EC_IllegalCall; const char *printer = NULL; OFBool detailedLog = getDetailedLog(); OFCondition result = EC_Normal; DCMPSTAT_LOGFILE("Starting print server process ..."); DVPSHelper::cleanChildren(); // clean up old child processes before creating new ones Uint32 numberOfPrinters = getNumberOfTargets(DVPSE_printLocal); if (numberOfPrinters > 0) for (Uint32 i=0; i < numberOfPrinters; i++) { printer = getTargetID(i, DVPSE_printLocal); #ifdef HAVE_FORK // Unix version - call fork() and execl() pid_t pid = fork(); if (pid < 0) result = EC_IllegalCall; // fork failed - return error code else if (pid==0) { // we are the child process if (detailedLog) { if (execl(application, application, "--logfile", "--verbose", "--dump", "--printer", printer, "--config", configPath.c_str(), NULL) < 0) { DCMPSTAT_ERROR("Unable to execute '" << application << "'"); } } else { if (execl(application, application, "--logfile", "--printer", printer, "--config", configPath.c_str(), NULL) < 0) { DCMPSTAT_ERROR("Unable to execute '" << application << "'"); } } // if execl succeeds, this part will not get executed. // if execl fails, there is not much we can do except bailing out. abort(); } #else // Windows version - call CreateProcess() // initialize startup info PROCESS_INFORMATION procinfo; STARTUPINFO sinfo; OFBitmanipTemplate::zeroMem((char *)&sinfo, sizeof(sinfo)); sinfo.cb = sizeof(sinfo); char commandline[4096]; if (detailedLog) { sprintf(commandline, "%s --logfile --verbose --dump --printer %s --config %s", application, printer, configPath.c_str()); } else { sprintf(commandline, "%s --logfile --printer %s --config %s", application, printer, configPath.c_str()); } #ifdef DEBUG if (0 == CreateProcess(NULL, commandline, NULL, NULL, 0, 0, NULL, NULL, &sinfo, &procinfo)) #else if (0 == CreateProcess(NULL, commandline, NULL, NULL, 0, DETACHED_PROCESS, NULL, NULL, &sinfo, &procinfo)) #endif { DCMPSTAT_ERROR("Unable to execute '" << application << "'"); result = EC_IllegalCall; } #endif } return result; // result of last process only } OFCondition DVInterface::terminatePrintServer() { if (getPrintServerName()==NULL) return EC_IllegalCall; if (configPath.length()==0) return EC_IllegalCall; #ifdef HAVE_GUSI_H GUSISetup(GUSIwithSIOUXSockets); GUSISetup(GUSIwithInternetSockets); #endif #ifdef HAVE_WINSOCK_H WSAData winSockData; /* we need at least version 1.1 */ WORD winSockVersionNeeded = MAKEWORD( 1, 1 ); WSAStartup(winSockVersionNeeded, &winSockData); #endif OFCondition result = EC_Normal; T_ASC_Network *net=NULL; T_ASC_Parameters *params=NULL; DIC_NODENAME localHost; DIC_NODENAME peerHost; T_ASC_Association *assoc=NULL; const char *target = NULL; OFBool useTLS = OFFalse; DCMPSTAT_LOGFILE("Terminating print server process ..."); #ifdef WITH_OPENSSL /* TLS directory */ const char *current = NULL; const char *tlsFolder = getTLSFolder(); if (tlsFolder==NULL) tlsFolder = "."; /* key file format */ int keyFileFormat = SSL_FILETYPE_PEM; if (! getTLSPEMFormat()) keyFileFormat = SSL_FILETYPE_ASN1; #endif Uint32 numberOfPrinters = getNumberOfTargets(DVPSE_printLocal); if (numberOfPrinters > 0) for (Uint32 i=0; i < numberOfPrinters; i++) { target = getTargetID(i, DVPSE_printLocal); useTLS = getTargetUseTLS(target); OFCondition cond = ASC_initializeNetwork(NET_REQUESTOR, 0, 30, &net); if (cond.good()) { cond = ASC_createAssociationParameters(¶ms, DEFAULT_MAXPDU); if (cond.good()) { if (useTLS) { #ifdef WITH_OPENSSL /* certificate file */ OFString tlsCertificateFile(tlsFolder); tlsCertificateFile += PATH_SEPARATOR; current = getTargetCertificate(target); if (current) tlsCertificateFile += current; else tlsCertificateFile += "sitecert.pem"; /* private key file */ OFString tlsPrivateKeyFile(tlsFolder); tlsPrivateKeyFile += PATH_SEPARATOR; current = getTargetPrivateKey(target); if (current) tlsPrivateKeyFile += current; else tlsPrivateKeyFile += "sitekey.pem"; /* private key password */ const char *tlsPrivateKeyPassword = getTargetPrivateKeyPassword(target); /* DH parameter file */ OFString tlsDHParametersFile; current = getTargetDiffieHellmanParameters(target); if (current) { tlsDHParametersFile = tlsFolder; tlsDHParametersFile += PATH_SEPARATOR; tlsDHParametersFile += current; } /* random seed file */ OFString tlsRandomSeedFile(tlsFolder); tlsRandomSeedFile += PATH_SEPARATOR; current = getTargetRandomSeed(target); if (current) tlsRandomSeedFile += current; else tlsRandomSeedFile += "siteseed.bin"; /* CA certificate directory */ const char *tlsCACertificateFolder = getTLSCACertificateFolder(); if (tlsCACertificateFolder==NULL) tlsCACertificateFolder = "."; /* ciphersuites */ #if OPENSSL_VERSION_NUMBER >= 0x0090700fL OFString tlsCiphersuites(TLS1_TXT_RSA_WITH_AES_128_SHA ":" SSL3_TXT_RSA_DES_192_CBC3_SHA); #else OFString tlsCiphersuites(SSL3_TXT_RSA_DES_192_CBC3_SHA); #endif Uint32 tlsNumberOfCiphersuites = getTargetNumberOfCipherSuites(target); if (tlsNumberOfCiphersuites > 0) { tlsCiphersuites.clear(); OFString currentSuite; const char *currentOpenSSL; for (Uint32 ui=0; ui 0) tlsCiphersuites += ":"; tlsCiphersuites += currentOpenSSL; } } } DcmTLSTransportLayer *tLayer = new DcmTLSTransportLayer(DICOM_APPLICATION_REQUESTOR, tlsRandomSeedFile.c_str()); if (tLayer) { if (tlsCACertificateFolder) tLayer->addTrustedCertificateDir(tlsCACertificateFolder, keyFileFormat); if (tlsDHParametersFile.size() > 0) tLayer->setTempDHParameters(tlsDHParametersFile.c_str()); tLayer->setPrivateKeyPasswd(tlsPrivateKeyPassword); // never prompt on console tLayer->setPrivateKeyFile(tlsPrivateKeyFile.c_str(), keyFileFormat); tLayer->setCertificateFile(tlsCertificateFile.c_str(), keyFileFormat); tLayer->setCipherSuites(tlsCiphersuites.c_str()); tLayer->setCertificateVerification(DCV_ignoreCertificate); ASC_setTransportLayer(net, tLayer, 1); } #else // we cannot shutdown a TLS process since we're compiled without OpenSSL support cond = EC_IllegalCall; #endif } ASC_setAPTitles(params, getNetworkAETitle(), getTargetAETitle(target), NULL); gethostname(localHost, sizeof(localHost) - 1); sprintf(peerHost, "%s:%d", getTargetHostname(target), OFstatic_cast(int, getTargetPort(target))); ASC_setPresentationAddresses(params, localHost, peerHost); if (cond.good()) cond = ASC_setTransportLayerType(params, useTLS); const char* transferSyntaxes[] = { UID_LittleEndianImplicitTransferSyntax }; if (cond.good()) cond = ASC_addPresentationContext(params, 1, UID_PrivateShutdownSOPClass, transferSyntaxes, 1); if (cond.good()) { cond = ASC_requestAssociation(net, params, &assoc); if (cond.good()) ASC_abortAssociation(assoc); // tear down association if necessary ASC_dropAssociation(assoc); ASC_destroyAssociation(&assoc); } } else result = EC_IllegalCall; ASC_dropNetwork(&net); } else result = EC_IllegalCall; } #ifdef HAVE_WINSOCK_H WSACleanup(); #endif return result; // result of last process only } OFCondition DVInterface::addToPrintHardcopyFromDB(const char *studyUID, const char *seriesUID, const char *instanceUID) { OFCondition result = EC_IllegalCall; if (pPrint) { if (studyUID && seriesUID && instanceUID) { if (EC_Normal == (result = lockDatabase())) { DcmUniqueIdentifier sopclassuid(DCM_SOPClassUID); const char *filename = getFilename(studyUID, seriesUID, instanceUID); if (filename) { DcmFileFormat *ff = NULL; if ((result = DVPSHelper::loadFileFormat(filename, ff)) == EC_Normal) { if (ff) { DcmDataset *dataset = ff->getDataset(); if (dataset) { DcmStack stack; DVPSPresentationLUT presentationLUT; if (EC_Normal != presentationLUT.read(*dataset, OFFalse)) presentationLUT.setType(DVPSP_identity); result = dataset->search(sopclassuid.getTag(), stack, ESM_fromHere, OFFalse); if (EC_Normal == result) { char *sopclass = NULL; sopclassuid = *OFstatic_cast(DcmUniqueIdentifier *, stack.top()); if (EC_Normal == sopclassuid.getString(sopclass)) result = pPrint->addImageBox(getNetworkAETitle(), studyUID, seriesUID, sopclass, instanceUID, NULL, NULL, &presentationLUT, OFFalse); else result = EC_IllegalCall; } } else result = EC_CorruptedData; } else result = EC_IllegalCall; if (result != EC_Normal) DCMPSTAT_LOGFILE("Load hardcopy grayscale image from file failed: invalid data structures"); } else DCMPSTAT_LOGFILE("Load hardcopy grayscale image from file failed: could not read fileformat"); if (ff) delete ff; } else { result = EC_IllegalCall; DCMPSTAT_LOGFILE("Load hardcopy grayscale image from database failed: UIDs not in index file"); } } else DCMPSTAT_LOGFILE("Load hardcopy grayscale image from database failed: could not lock index file"); } else DCMPSTAT_LOGFILE("Load hardcopy grayscale image from database failed: invalid UIDs"); } releaseDatabase(); return result; } OFCondition DVInterface::spoolStoredPrintFromDB(const char *studyUID, const char *seriesUID, const char *instanceUID) { if ((studyUID==NULL)||(seriesUID==NULL)||(instanceUID==NULL)||(configPath.length()==0)) return EC_IllegalCall; OFString spoolFilename; OFString tempFilename; const char *prt = getCurrentPrinter(); if (EC_Normal != createPrintJobFilenames(prt, tempFilename, spoolFilename)) return EC_IllegalCall; FILE *outf = fopen(tempFilename.c_str(),"wb"); if (outf) { OFString timeString; OFDateTime::getCurrentDateTime().getISOFormattedDateTime(timeString); fprintf(outf, "#\n# print job created %s\n", timeString.c_str()); fprintf(outf, "# target printer: [%s]\n#\n", (prt ? prt : "none")); fprintf(outf, "study %s\nseries %s\ninstance %s\n", studyUID, seriesUID, instanceUID); if (printerMediumType.size() >0) fprintf(outf,"mediumtype %s\n", printerMediumType.c_str()); if (printerFilmDestination.size() >0) fprintf(outf,"destination %s\n", printerFilmDestination.c_str()); if (printerFilmSessionLabel.size() >0) fprintf(outf,"label %s\n", printerFilmSessionLabel.c_str()); if (printerPriority.size() >0) fprintf(outf,"priority %s\n", printerPriority.c_str()); if (printerOwnerID.size() >0) fprintf(outf,"owner_id %s\n", printerOwnerID.c_str()); if (printerNumberOfCopies >0) fprintf(outf,"copies %lu\n", printerNumberOfCopies); fclose(outf); if (0 != rename(tempFilename.c_str(), spoolFilename.c_str())) { DCMPSTAT_ERROR("Unable to activate print job '" << spoolFilename.c_str() << "'"); return EC_IllegalCall; } } else { DCMPSTAT_ERROR("Unable to create print job '" << tempFilename.c_str() << "'"); return EC_IllegalCall; } return EC_Normal; } OFCondition DVInterface::printSCUcreateBasicFilmSession(DVPSPrintMessageHandler& printHandler, OFBool plutInSession) { if (!pPrint) return EC_IllegalCall; OFCondition result = EC_Normal; DcmDataset dset; DcmElement *delem = NULL; char buf[20]; if ((EC_Normal==result)&&(printerMediumType.size() > 0)) { delem = new DcmCodeString(DCM_MediumType); if (delem) result = delem->putString(printerMediumType.c_str()); else result=EC_IllegalCall; if (EC_Normal==result) result = dset.insert(delem, OFTrue /*replaceOld*/); } if ((EC_Normal==result)&&(printerFilmDestination.size() > 0)) { delem = new DcmCodeString(DCM_FilmDestination); if (delem) result = delem->putString(printerFilmDestination.c_str()); else result=EC_IllegalCall; if (EC_Normal==result) result = dset.insert(delem, OFTrue /*replaceOld*/); } if ((EC_Normal==result)&&(printerFilmSessionLabel.size() > 0)) { delem = new DcmLongString(DCM_FilmSessionLabel); if (delem) result = delem->putString(printerFilmSessionLabel.c_str()); else result=EC_IllegalCall; if (EC_Normal==result) result = dset.insert(delem, OFTrue /*replaceOld*/); } if ((EC_Normal==result)&&(printerPriority.size() > 0)) { delem = new DcmCodeString(DCM_PrintPriority); if (delem) result = delem->putString(printerPriority.c_str()); else result=EC_IllegalCall; if (EC_Normal==result) result = dset.insert(delem, OFTrue /*replaceOld*/); } if ((EC_Normal==result)&&(printerOwnerID.size() > 0)) { delem = new DcmShortString(DCM_OwnerID); if (delem) result = delem->putString(printerOwnerID.c_str()); else result=EC_IllegalCall; if (EC_Normal==result) result = dset.insert(delem, OFTrue /*replaceOld*/); } if ((EC_Normal==result)&&(printerNumberOfCopies > 0)) { sprintf(buf, "%lu", printerNumberOfCopies); delem = new DcmIntegerString(DCM_NumberOfCopies); if (delem) result = delem->putString(buf); else result=EC_IllegalCall; if (EC_Normal==result) result = dset.insert(delem, OFTrue /*replaceOld*/); } if (EC_Normal==result) result = pPrint->printSCUcreateBasicFilmSession(printHandler, dset, plutInSession); return result; } void DVInterface::clearFilmSessionSettings() { printerMediumType.clear(); printerFilmDestination.clear(); printerFilmSessionLabel.clear(); printerPriority.clear(); printerOwnerID.clear(); printerNumberOfCopies = 0; return; } void DVInterface::setAnnotationText(const char *value) { if (value) annotationText=value; else annotationText.clear(); return; } OFCondition DVInterface::startExternalApplication(const char *application, const char *filename) { if ((filename==NULL)||(application==NULL)) return EC_IllegalCall; DVPSHelper::cleanChildren(); // clean up old child processes before creating new ones #ifdef HAVE_FORK // Unix version - call fork() and execl() pid_t pid = fork(); if (pid < 0) return EC_IllegalCall; // fork failed - return error code else if (pid > 0) return EC_Normal; // we are the parent process else { // we are the child process if (execl(application, application, filename, NULL) < 0) { DCMPSTAT_ERROR("Unable to execute '" << application << "'"); } // if execl succeeds, this part will not get executed. // if execl fails, there is not much we can do except bailing out. abort(); } #else // Windows version - call CreateProcess() // initialize startup info PROCESS_INFORMATION procinfo; STARTUPINFO sinfo; OFBitmanipTemplate::zeroMem((char *)&sinfo, sizeof(sinfo)); sinfo.cb = sizeof(sinfo); char commandline[4096]; sprintf(commandline, "%s %s", application, filename); #ifdef DEBUG if (CreateProcess(NULL, commandline, NULL, NULL, 0, 0, NULL, NULL, &sinfo, &procinfo)) #else if (CreateProcess(NULL, commandline, NULL, NULL, 0, DETACHED_PROCESS, NULL, NULL, &sinfo, &procinfo)) #endif { return EC_Normal; } else { DCMPSTAT_ERROR("Unable to execute '" << application << "'"); } #endif return EC_IllegalCall; } OFCondition DVInterface::dumpIOD(const char *filename) { OFCondition result = startExternalApplication(getDumpToolName(), filename); if (result != EC_Normal) DCMPSTAT_LOGFILE("Dump IOD failed: could not start dump application"); return result; } OFCondition DVInterface::dumpIOD(const char *studyUID, const char *seriesUID, const char *instanceUID) { OFCondition result = EC_IllegalCall; if (studyUID && seriesUID && instanceUID) { if (EC_Normal == (result = lockDatabase())) { const char *filename = getFilename(studyUID, seriesUID, instanceUID); if (filename) result = dumpIOD(filename); else { result = EC_IllegalCall; DCMPSTAT_LOGFILE("Dump IOD from database failed: could not lock index file"); } } else DCMPSTAT_LOGFILE("Dump IOD from database failed: UIDs not in index file"); } else DCMPSTAT_LOGFILE("Dump IOD from database failed: invalid UIDs"); return result; } OFCondition DVInterface::checkIOD(const char *filename) { OFCondition result = startExternalApplication(getCheckToolName(), filename); if (result != EC_Normal) DCMPSTAT_LOGFILE("Check IOD failed: could not start evaluator application"); return result; } OFCondition DVInterface::checkIOD(const char *studyUID, const char *seriesUID, const char *instanceUID) { OFCondition result = EC_IllegalCall; if (studyUID && seriesUID && instanceUID) { if (EC_Normal == (result = lockDatabase())) { const char *filename = getFilename(studyUID, seriesUID, instanceUID); if (filename) result = checkIOD(filename); else { result = EC_IllegalCall; DCMPSTAT_LOGFILE("Check IOD from database failed: could not lock index file"); } } else DCMPSTAT_LOGFILE("Check IOD from database failed: UIDs not in index file"); } else DCMPSTAT_LOGFILE("Check IOD from database failed: invalid UIDs"); return result; } #ifdef WITH_OPENSSL /* buf : buffer to write password into * size : length of buffer in bytes * rwflag : nonzero if the password will be used as a new password, i.e. user should be asked to repeat the password * userdata: arbitrary pointer that can be set with SSL_CTX_set_default_passwd_cb_userdata() * returns : number of bytes written to password buffer, -1 upon error */ extern "C" int DVInterfacePasswordCallback(char *buf, int size, int rwflag, void *userdata); int DVInterfacePasswordCallback(char *buf, int size, int /* rwflag */, void *userdata) { if (userdata == NULL) return -1; OFString *password = (OFString *)userdata; int passwordSize = password->length(); if (passwordSize > size) passwordSize = size; strncpy(buf, password->c_str(), passwordSize); return passwordSize; } #endif #ifdef WITH_OPENSSL OFBool DVInterface::verifyUserPassword(const char *userID, const char *passwd) #else OFBool DVInterface::verifyUserPassword(const char * /*userID*/, const char * /*passwd*/) #endif { OFBool result = OFFalse; #ifdef WITH_OPENSSL OFString filename; OFString privateKeyPasswd; if (passwd) privateKeyPasswd = passwd; OFBool isPEMFormat = getTLSPEMFormat(); const char *userKey = getUserPrivateKey(userID); if (userKey == NULL) DCMPSTAT_LOGFILE("Cannot verify user password: unknown user or undefined private key file"); else { const char *userDir = getUserCertificateFolder(); if (userDir) { filename = userDir; filename += PATH_SEPARATOR; } filename += userKey; /* attempt to load the private key with the given password*/ EVP_PKEY *pkey = NULL; BIO *in = BIO_new(BIO_s_file_internal()); if (in) { if (BIO_read_filename(in, filename.c_str()) > 0) { if (isPEMFormat) { pkey = PEM_read_bio_PrivateKey(in, NULL, DVInterfacePasswordCallback, &privateKeyPasswd); if (pkey) result = OFTrue; } else { // ASN.1/DER encoded keys are never encrypted, thus no callback here. pkey = d2i_PrivateKey_bio(in, NULL); if (pkey) result = OFTrue; } } else DCMPSTAT_LOGFILE("Cannot verify user password: private key file not found"); BIO_free(in); } if (pkey) EVP_PKEY_free(pkey); } #else DCMPSTAT_LOGFILE("Cannot verify user password: not compiled with OpenSSL support"); #endif return result; } #ifdef WITH_OPENSSL OFCondition DVInterface::verifyAndSignStructuredReport(const char *userID, const char *passwd, DVPSVerifyAndSignMode mode) #else OFCondition DVInterface::verifyAndSignStructuredReport(const char *userID, const char * /*passwd*/, DVPSVerifyAndSignMode mode) #endif { OFCondition result = EC_IllegalCall; if ((pReport != NULL) && (userID != NULL)) { OFString userName(getUserDICOMName(userID)); OFString userOrg(getUserOrganization(userID)); OFString userCV, userCSD, userCSV, userCM; DSRCodedEntryValue userCode(getUserCodeValue(userID, userCV), getUserCodingSchemeDesignator(userID, userCSD), getUserCodingSchemeVersion(userID, userCSV), getUserCodeMeaning(userID, userCM)); /* verify document */ if (pReport->verifyDocument(userName, userCode, userOrg) == EC_Normal) { if ((mode == DVPSY_verifyAndSign) || (mode == DVPSY_verifyAndSign_finalize)) { #ifdef WITH_OPENSSL if (pSignatureHandler) { DcmStack stack; DcmItem dataset; if (pReport->write(dataset, &stack) == EC_Normal) { DcmAttributeTag tagList(DcmTag(0, 0) /* irrelevant value */); if (mode == DVPSY_verifyAndSign) { /* do not sign particular attributes */ tagList.putTagVal(DCM_SOPInstanceUID, 0); tagList.putTagVal(DCM_VerifyingObserverSequence, 1); tagList.putTagVal(DCM_InstanceCreationDate, 2); tagList.putTagVal(DCM_InstanceCreationTime, 3); tagList.putTagVal(DCM_InstanceCreatorUID, 4); } else if (mode == DVPSY_verifyAndSign_finalize) { /* always sign the entire document */ stack.clear(); } /* if no item is marked, sign entire dataset */ if (stack.empty()) stack.push(&dataset); /* digitally sign document */ if (pSignatureHandler->createSignature(dataset, stack, tagList, userID, passwd) == EC_Normal) { DSRDocument *newReport = new DSRDocument(); if (newReport != NULL) { if (newReport->read(dataset, DSRTypes::RF_readDigitalSignatures) == EC_Normal) { /* replace report in memory */ delete pReport; pReport = newReport; pSignatureHandler->updateDigitalSignatureInformation(dataset, DVPSS_structuredReport, OFFalse /* onRead? */); if (mode == DVPSY_verifyAndSign_finalize) result = pReport->finalizeDocument(); else result = EC_Normal; } } else result = EC_MemoryExhausted; } } } #else DCMPSTAT_LOGFILE("Cannot sign structured report: not compiled with OpenSSL support"); #endif } else result= EC_Normal; } } return result; } const char *DVInterface::getCurrentSignatureValidationHTML(DVPSObjectType objtype) const { return pSignatureHandler->getCurrentSignatureValidationHTML(objtype); } const char *DVInterface::getCurrentSignatureValidationOverview() const { return pSignatureHandler->getCurrentSignatureValidationOverview(); } DVPSSignatureStatus DVInterface::getCurrentSignatureStatus(DVPSObjectType objtype) const { return pSignatureHandler->getCurrentSignatureStatus(objtype); } DVPSSignatureStatus DVInterface::getCombinedImagePStateSignatureStatus() const { return pSignatureHandler->getCombinedImagePStateSignatureStatus(); } unsigned long DVInterface::getNumberOfCorrectSignatures(DVPSObjectType objtype) const { return pSignatureHandler->getNumberOfCorrectSignatures(objtype); } unsigned long DVInterface::getNumberOfUntrustworthySignatures(DVPSObjectType objtype) const { return pSignatureHandler->getNumberOfUntrustworthySignatures(objtype); } unsigned long DVInterface::getNumberOfCorruptSignatures(DVPSObjectType objtype) const { return pSignatureHandler->getNumberOfCorruptSignatures(objtype); } void DVInterface::disableImageAndPState() { pSignatureHandler->disableImageAndPState(); } /* * CVS/RCS Log: * $Log: dviface.cc,v $ * Revision 1.165 2010-10-14 13:14:31 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.164 2010-09-24 13:32:58 joergr * Compared names of SOP Class UIDs with 2009 edition of the DICOM standard. The * resulting name changes are mainly caused by the fact that the corresponding * SOP Class is now retired. * * Revision 1.163 2010-08-09 13:21:56 joergr * Updated data dictionary to 2009 edition of the DICOM standard. From now on, * the official "keyword" is used for the attribute name which results in a * number of minor changes (e.g. "PatientsName" is now called "PatientName"). * * Revision 1.162 2009-12-15 14:50:49 uli * Fixes some issues with --logfile and the config's log options. * * Revision 1.161 2009-12-15 12:34:40 uli * Re-added and fixed the command line option --logfile. * * Revision 1.160 2009-12-11 16:16:59 joergr * Removed old command line option --logfile when executing external processes. * Slightly modified log messages and log levels. * * Revision 1.159 2009-12-09 13:10:55 uli * Fixed include path which was still using an old file name. * * Revision 1.158 2009-11-24 14:12:58 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.157 2009-10-13 14:57:49 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.156 2008-04-30 12:38:43 meichel * Fixed compile errors due to changes in attribute tag names * * Revision 1.155 2006/08/15 16:57:01 meichel * Updated the code in module dcmpstat to correctly compile when * all standard C++ classes remain in namespace std. * * Revision 1.154 2005/12/08 15:46:15 meichel * Changed include path schema for all DCMTK header files * * Revision 1.153 2005/11/23 16:10:34 meichel * Added support for AES ciphersuites in TLS module. All TLS-enabled * tools now support the "AES TLS Secure Transport Connection Profile". * * Revision 1.152 2005/11/16 14:58:24 meichel * Set association timeout in ASC_initializeNetwork to 30 seconds. This improves * the responsiveness of the tools if the peer blocks during assoc negotiation. * * Revision 1.151 2005/04/04 10:11:59 meichel * Module dcmpstat now uses the dcmqrdb API instead of imagectn for maintaining * the index database * * Revision 1.150 2004/08/03 11:43:18 meichel * Headers libc.h and unistd.h are now included via ofstdinc.h * * Revision 1.149 2004/02/13 11:49:36 joergr * Adapted code for changed tag names (e.g. PresentationLabel -> ContentLabel). * * Revision 1.148 2004/02/04 15:57:48 joergr * Removed acknowledgements with e-mail addresses from CVS log. * * Revision 1.147 2003/12/19 14:57:04 meichel * Completed support for terminating TLS-based print server processes * * Revision 1.146 2003/12/19 13:49:57 meichel * DVInterface::terminatePrintServer now also correctly terminates * TLS-based print server processes. * * Revision 1.145 2003/11/03 10:56:07 joergr * Modified static type casts on DVPSLogMessageLevel variables to compile with * gcc 2.95. * * Revision 1.144 2003/09/18 11:52:18 joergr * Call addPrivateDcmtkCodingScheme() when saving a structured report. * Fixed wrong "assert" (pointer check) statement in saveStructuredReport(). * Adapted type casts to new-style typecast operators defined in ofcast.h. * * Revision 1.143 2003/06/04 12:30:28 meichel * Added various includes needed by MSVC5 with STL * * Revision 1.142 2003/04/29 10:13:56 meichel * Moved configuration file parser from module dcmpstat to ofstd and renamed * class to OFConfigFile. Cleaned up implementation (no more friend declarations). * * Revision 1.141 2002/12/20 14:51:58 wilkens * Modified name clash resulting in a compiler error on Solaris 2.5.1 using * compiler SC 2.0.1. * * Revision 1.140 2002/11/29 13:16:32 meichel * Introduced new command line option --timeout for controlling the * connection request timeout. * * Revision 1.139 2002/11/27 15:48:05 meichel * Adapted module dcmpstat to use of new header file ofstdinc.h * * Revision 1.138 2002/04/16 14:02:20 joergr * Added configurable support for C++ ANSI standard includes (e.g. streams). * * Revision 1.137 2002/04/11 13:13:43 joergr * Replaced direct call of system routines by new standard date and time * functions. * * Revision 1.136 2002/01/08 10:37:34 joergr * Corrected spelling of function dcmGenerateUniqueIdentifier(). * Changed prefix of UIDs created for series and studies (now using constants * SITE_SERIES_UID_ROOT and SITE_STUDY_UID_ROOT which are supposed to be used * in these cases). * * Revision 1.135 2001/11/28 13:56:50 joergr * Check return value of DcmItem::insert() statements where appropriate to * avoid memory leaks when insert procedure fails. * * Revision 1.134 2001/10/12 13:46:54 meichel * Adapted dcmpstat to OFCondition based dcmnet module (supports strict mode). * * Revision 1.133 2001/09/26 15:36:21 meichel * Adapted dcmpstat to class OFCondition * * Revision 1.132 2001/06/05 10:30:55 joergr * Replaced some #ifdef _WIN32 statements by #ifdef HAVE_WINDOWS_H or #ifdef * __CYGWIN__ respectively to reflect the fact that the latest Cygwin/gcc * version does not define _WIN32 any more. * * Revision 1.131 2001/05/10 16:44:53 joergr * Added dcmsr as a standard library to dcmpstat (removed preprecessor #ifdef). * * Revision 1.130 2001/05/07 16:04:47 joergr * Adapted read SR method call to new parameter scheme (integer flag instead of * boolean mode). * * Revision 1.129 2001/02/23 14:57:55 joergr * Update signature status when signing a structured report (not only when * saving/storing the report). * * Revision 1.128 2001/02/23 13:31:10 joergr * Changed behaviour of method verifyAndSignStructuredReport() with 'finalize'. * Now the entire document is always signed independently from the tree items * marked. * * Revision 1.127 2001/01/29 17:34:41 joergr * Added method to verify and digitally sign structured reports. * * Revision 1.126 2001/01/29 14:55:46 meichel * Added new methods for creating signatures and checking the signature * status in module dcmpstat. * * Revision 1.125 2001/01/25 15:18:09 meichel * Added initial support for verification of digital signatures * in presentation states, images and structured reports to module dcmpstat. * * Revision 1.124 2000/12/13 13:30:22 joergr * Added explicit typecast to keep gcc 2.5.8 (NeXTSTEP) quiet. * * Revision 1.123 2000/12/13 13:24:23 meichel * Removed unused local variables * * Revision 1.122 2000/12/11 18:18:24 joergr * Removed name of (conditionally) unused method parameters to avoid compiler * warnings (SunCC 2.0.1). * * Revision 1.121 2000/12/08 12:46:35 joergr * Separated module dcmsr from dcmpstat (use #define WITH_DCMSR to re-include * it - probably also requires modification of makefiles). * * Revision 1.120 2000/11/20 13:22:41 joergr * Fixed minor bugs (string related memory problems when used with JNI). * * Revision 1.119 2000/11/14 16:35:21 joergr * Added creation of new UIDs and setting of content date/time when starting * a new SR document from a "template". * * Revision 1.118 2000/11/14 13:25:59 meichel * Imagectn was always invoked in debug mode from class DVInterface * on Unix platforms. Fixed. * * Revision 1.117 2000/11/13 15:50:45 meichel * Added dcmpstat support methods for creating image references * in SR documents. * * Revision 1.116 2000/11/13 11:52:43 meichel * Added support for user logins and certificates. * * Revision 1.115 2000/11/13 10:43:20 joergr * Added support for Structured Reporting "templates". * * Revision 1.114 2000/11/10 16:21:17 meichel * Fixed problem with DICOMscope being unable to shut down receiver processes * that are operating with TLS encryption by adding a special shutdown mode to * dcmpsrcv. * * Revision 1.113 2000/10/16 11:46:45 joergr * Added support for new structured reports. * Added method allowing to select an instance by instance UID and SOP class * UID (without series and study UID). Required for composite references in * DICOM SR. * * Revision 1.112 2000/10/10 12:24:39 meichel * Added extensions for IPC message communication * * Revision 1.111 2000/08/31 15:56:14 joergr * Switched off interpolation for scaling of print preview images (this caused * problems with "scrambled" presentation LUTs in stored print objects). * Correct bug: pixel aspect ratio and photometric interpretation were ignored * for print preview. * * Revision 1.110 2000/07/18 16:05:08 joergr * Moved method convertODtoLum/PValue from class DVInterface to DVPSStoredPrint * and corrected implementation. * Changed behaviour of methods getMin/MaxDensityValue (return default value if * attribute empty/absent). * * Revision 1.109 2000/07/17 14:48:21 joergr * Added support for presentation states referencing to hardcopy grayscale * images. * * Revision 1.108 2000/07/17 12:05:29 joergr * Added methods to select objects from the database directly. * * Revision 1.107 2000/07/14 17:10:10 joergr * Added changeStatus parameter to all methods loading instances from the * database. * * Revision 1.106 2000/07/14 11:59:05 joergr * Fixed bug in getNumberOfPStates(study,series,instance) method. * * Revision 1.105 2000/07/12 12:52:00 joergr * Fixed bug in loadPrintPreview routine. * * Revision 1.104 2000/07/07 14:15:13 joergr * Added support for LIN OD presentation LUT shape. * * Revision 1.103 2000/07/06 09:41:17 joergr * Added flag to loadPrintPreview() method allowing to choose how to interpret * the presentation LUT (hardcopy or softcopy definition). * * Revision 1.102 2000/07/05 12:32:21 joergr * Added check whether external processes were actually started before * terminating them. * Fixed bug concerning the termination of external processes. * * Revision 1.101 2000/07/05 09:00:02 joergr * Added new log output messages. * * Revision 1.100 2000/07/04 16:06:28 joergr * Added support for overriding the presentation LUT settings made for the * image boxes. * Added new log output messages. * * Revision 1.99 2000/06/22 10:46:47 joergr * Fixed bug creating config file for Q/R server when Q/R server name was not * specified in application config file. * * Revision 1.98 2000/06/21 15:41:00 meichel * Added DICOMscope support for calling the Presentation State Checker. * * Revision 1.97 2000/06/09 10:14:55 joergr * Added method to get number of presentation states referencing an image * (specified by the three UIDs). * * Revision 1.96 2000/06/08 17:38:01 joergr * Corrected bug and added log messages in addImageReferenceToPState(). * Added method convertODtoLum(). * * Revision 1.95 2000/06/07 14:25:38 joergr * Added configuration file entry "LogLevel" to filter log messages. * Added flag to constructor specifying whether the general log file should be * used (default: off). * Added missing transformations (polarity, GSDF, presentation LUT, aspect * ratio) to print preview rendering. * Added log message output to I/O routines. * * Revision 1.94 2000/06/07 13:17:26 meichel * added binary and textual log facilities to Print SCP. * * Revision 1.93 2000/06/06 09:43:25 joergr * Moved configuration file entry "LogDirectory" from "[PRINT]" to new * (more general) section "[APPLICATION]". * * Revision 1.92 2000/06/05 16:24:27 joergr * Implemented log message methods. * Added method allowing to specify the current presentation state to be used * for resetting the pstate. * * Revision 1.91 2000/06/02 16:00:55 meichel * Adapted all dcmpstat classes to use OFConsole for log and error output * * Revision 1.90 2000/06/02 13:54:35 joergr * Implemented start/terminatePrintServer methods. * * Revision 1.89 2000/05/31 12:58:13 meichel * Added initial Print SCP support * * Revision 1.88 2000/05/31 07:56:20 joergr * Added support for Stored Print attributes Originator and Destination * application entity title. * * Revision 1.87 2000/05/30 14:22:13 joergr * Renamed some variables to avoid compiler warnings (reported by gcc 2.9x with * additional compiler flags). * * Revision 1.86 2000/05/30 13:56:23 joergr * Renamed GrayscaleHardcopy to HardcopyGrayscale (which is the correct term * according to the DICOM standard). * Added support for multi-frame images and multiple references from a single * presentation to a number of images. * Removed methods which were already marked as "retired". * Added support for the folowwing new features: * - start/terminate query/retrieve server * - load stored print objects * - create print preview from hardcopy grayscale images * * Revision 1.85 2000/03/08 16:29:00 meichel * Updated copyright header. * * Revision 1.84 2000/02/29 12:16:19 meichel * Fixed bug in dcmpstat library that caused Monochrome1 images * to be printed inverse if a Presentation LUT was applied. * * Revision 1.83 1999/11/25 11:41:10 joergr * Changed config file entry "HighEndSystem" to "HighResolutionGraphics". * * Revision 1.82 1999/11/18 18:23:06 meichel * Corrected various memory leaks. DcmFileFormat can be instantiated * with a DcmDataset* as a parameter, but in this case the dataset is * copied and not taken over by the DcmFileFormat. The pointer must * be freed explicitly by the caller. * * Revision 1.81 1999/11/03 13:05:33 meichel * Added support for transmitting annotations in the film session label. * Added support for dump tool launched from DVInterface. * * Revision 1.80 1999/10/21 15:31:45 joergr * Fixed bug in method addToPrintHardcopyFromDB(). * * Revision 1.79 1999/10/20 10:54:13 joergr * Added support for a down-scaled preview image of the current DICOM image * (e.g. useful for online-windowing or print preview). * Corrected bug concerning the minimum and maximum print bitmap size (first * presentation state created in the constructor of DVInterface never used the * correct values from the config file). * * Revision 1.78 1999/10/19 16:24:56 meichel * Corrected handling of MONOCHROME1 images when used with P-LUTs * * Revision 1.77 1999/10/19 14:48:21 meichel * added support for the Basic Annotation Box SOP Class * as well as access methods for Max Density and Min Density. * * Revision 1.76 1999/10/13 14:11:59 meichel * Added config file entries and access methods * for user-defined VOI presets, log directory, verbatim logging * and an explicit list of image display formats for each printer. * * Revision 1.75 1999/10/13 06:44:17 joergr * Fixed bug in get/setAmbientLightValue() * * Revision 1.74 1999/10/07 17:21:56 meichel * Reworked management of Presentation LUTs in order to create tighter * coupling between Softcopy and Print. * * Revision 1.73 1999/09/27 10:41:56 meichel * Print interface now copies current printer name, avoids JNI problems. * * Revision 1.72 1999/09/24 15:24:32 meichel * Added support for CP 173 (Presentation LUT clarifications) * * Revision 1.71 1999/09/23 17:37:15 meichel * Added support for Basic Film Session options to dcmpstat print code. * * Revision 1.70 1999/09/17 14:33:50 meichel * Completed print spool functionality including Supplement 22 support * * Revision 1.69 1999/09/15 17:43:31 meichel * Implemented print job dispatcher code for dcmpstat, adapted dcmprtsv * and dcmpsprt applications. * * Revision 1.68 1999/09/13 15:19:13 meichel * Added implementations for a number of further print API methods. * * Revision 1.67 1999/09/10 12:46:53 meichel * Added implementations for a number of print API methods. * * Revision 1.66 1999/09/10 09:36:28 joergr * Added support for CIELAB display function. New methods to handle display * functions. Old methods are marked as retired and should be removed asap. * * Revision 1.64 1999/09/08 17:11:43 joergr * Added support for new instance types in database (grayscale hardcopy and * stored print). * * Revision 1.63 1999/09/08 16:41:41 meichel * Moved configuration file evaluation to separate class. * * Revision 1.62 1999/09/01 16:15:06 meichel * Added support for requested image size to print routines * * Revision 1.61 1999/08/31 16:54:46 meichel * Added new sample application that allows to create simple print jobs. * * Revision 1.60 1999/08/31 14:02:08 meichel * Added print related config file methods * * Revision 1.59 1999/08/27 15:57:48 meichel * Added methods for saving hardcopy images and stored print objects * either in file or in the local database. * * Revision 1.58 1999/07/22 16:39:54 meichel * Adapted dcmpstat data structures and API to supplement 33 letter ballot text. * * Revision 1.57 1999/07/14 12:03:43 meichel * Updated data dictionary for supplement 29, 39, 33_lb, CP packet 4 and 5. * Corrected dcmtk applications for changes in attribute name constants. * * Revision 1.56 1999/05/05 14:26:21 joergr * Modified parameter of CreateProcess call to avoid creation of new command * line window under Windows. * Added optional parameter to method loadPState (from database) to change * instance reviewed flag for pstate and image. * * Revision 1.55 1999/05/04 16:05:49 joergr * Added releaseDatabase to savePState to avoid deadlocks. * Change status of variable imageInDatabase in savePState to avoid unnecessary * saving of (probabaly large) image files. * * Revision 1.54 1999/05/04 10:53:08 meichel * Added test for struct utimbuf declaration, absent on some platforms * * Revision 1.53 1999/05/03 14:15:58 joergr * Enhanced check in savePState() method whether image file is already stored * in database. * * Revision 1.52 1999/05/03 11:01:36 joergr * Minor code purifications to keep Sun CC 2.0.1 quiet. * * Revision 1.51 1999/04/29 15:26:14 joergr * Added PresentationLabel to index file. * * Revision 1.50 1999/04/28 17:00:17 joergr * Removed additional declaration of local variable (hides first declaration) * to avoid compiler warnings reported by gcc 2.7.2.1 (Linux). * * Revision 1.49 1999/04/27 11:25:31 joergr * Added new entry to index file: Presentation Description. * Enhanced savePState() method: now image file is also added to index file * and stored in image directory (if not already there). * * Revision 1.48 1999/03/22 09:52:40 meichel * Reworked data dictionary based on the 1998 DICOM edition and the latest * supplement versions. Corrected dcmtk applications for minor changes * in attribute name constants. * * Revision 1.47 1999/03/03 13:29:33 joergr * Added methods to get and set ambient light value (re: Barten transformation). * Moved method 'isBartenTransformPossible()' from presentation state class to * interface class. * * Revision 1.46 1999/03/02 13:38:17 joergr * Corrected typo (E_Normal instead of EC_Normal). * * Revision 1.45 1999/03/02 13:02:20 joergr * Added parameter to selectPState() specifying whether to change the review * status of the loaded presentation state. * * Revision 1.44 1999/02/27 16:59:20 joergr * Changed implementation of deleteImageFile (imagectn method doesn't function * under Window NT). * Removed bug in createPStateCache (cache was reported invalid on second call). * Modified method selectPState (image file is now implicitly loaded if * necessary). * * Revision 1.43 1999/02/25 18:44:08 joergr * Renamed methods enable/disablePState(). * Performed some modifications in the implementation of enable/disablePState * to avoid dmalloc warnings (not yet finished). * * Revision 1.42 1999/02/24 20:23:05 joergr * Added methods to get a list of presentation states referencing the * currently selected image. * Added support for exchanging current presentation state (load from file) * without deleting the current image. * Report an error when loading a presentation state and the referenced image * file is absent. * Removed bug concerning newInstancesReceived (Windows NT behaves different to * Unix when closing/unlocking a file). * * Revision 1.41 1999/02/23 11:45:24 joergr * Added check whether new instances have been received before resetting * database reference time (affects delete and instance reviewed methods). * * Revision 1.40 1999/02/22 14:21:59 joergr * Added deletion of image files (depending on directory where the file is * stored). * Reset reference time for file modification checking after the index file * has been changed internally (delete and change status methods). * Removed debug messages when creating and clearing index cache. * * Revision 1.39 1999/02/19 19:15:21 joergr * Corrected bug in disablePresentationState(). * * Revision 1.38 1999/02/19 19:03:04 joergr * Added methods to disable and (re-)enable PresentationStates. * Added (private) helper methods to reduce redundant lines of code. * Removed bug concerning method newInstancesReceived (databaseFilename was * never set). * Implemented main part of delete methods (image files are not yet deleted). * Removed implicit application of a shared lock to the database file when * unlock an exclusive lock. * * Revision 1.37 1999/02/19 09:48:27 joergr * Added method getFilename() to get filename of currently selected instance. * Modified implementation of instanceReviewed. * * Revision 1.36 1999/02/18 18:48:01 joergr * Re-implemented methods to access index file (delete methods are still * missing). * Removed parameter 'deletefile' from delete methods. This parameter is * not necessary because the decision whether a images file is deleted only * depends on the directory where the file is stored (see comments). * * Revision 1.35 1999/02/18 11:07:28 meichel * Added new parameter explicitVR to interface methods savePState, * saveDICOMImage. Allows to choose between explicit VR and implicit VR * little endian format. Added new method saveCurrentImage that allows to * save the current image to file. * * Revision 1.34 1999/02/17 12:46:10 vorwerk * bug fixed in strippidxarray. * * Revision 1.33 1999/02/17 10:05:33 meichel * Moved creation of Display Function object from DVPresentationState to * DVInterface to avoid unnecessary re-reads. * * Revision 1.32 1999/02/16 16:36:08 meichel * Added method newInstancesReceived() to DVInterface class. * * Revision 1.31 1999/02/12 10:04:13 vorwerk * added cache , changed delete methods. * * Revision 1.30 1999/02/10 16:01:40 meichel * Fixed memory leak in dviface.cc - Config file contents were never deleted. * * Revision 1.29 1999/02/09 15:58:10 meichel * Implemented methods that save images and presentation states in the DB. * * Revision 1.28 1999/02/08 10:52:35 meichel * Updated documentation of dviface.h in Doc++ style. * Removed dummy parameter from constructor. * * Revision 1.27 1999/02/05 17:45:37 meichel * Added config file entry for monitor characteristics file. Monitor charac- * teristics are passed to dcmimage if present to activate Barten transform. * * Revision 1.26 1999/02/05 12:45:12 vorwerk * actualised version: comments see previous version. * * Revision 1.24 1999/01/29 16:01:02 meichel * Reworked index file handle acquisition and locking code. * * Revision 1.23 1999/01/29 09:51:28 vorwerk * locking bug removed. * * Revision 1.22 1999/01/28 15:27:23 vorwerk * Exclusive and shared locking mechanism in all browser-methods added. * * Revision 1.21 1999/01/27 15:31:28 vorwerk * record deletion bug removed. Errorhandling for indexfiles with length zero added. * * Revision 1.20 1999/01/27 14:59:26 meichel * Implemented DICOM network receive application "dcmpsrcv" which receives * images and presentation states and stores them in the local database. * * Revision 1.19 1999/01/25 18:18:22 meichel * Defined private SOP class UID for network receiver * shutdown function. Cleanup up some code. * * Revision 1.18 1999/01/25 16:48:37 vorwerk * Bug in getaninstance removed. getNumberOfSeries and getNumberOfInstances results * are correct now. getStudyStatus bug removed. Error handling routines added. * * Revision 1.17 1999/01/25 13:05:57 meichel * Implemented DVInterface::startReceiver() * and several config file related methods. * * Revision 1.16 1999/01/20 19:25:30 meichel * Implemented sendIOD method which creates a separate process for trans- * mitting images from the local database to a remote communication peer. * * Revision 1.15 1999/01/19 15:13:41 vorwerk * Additional methods for attributes in the indexfile added. * Method getFilename implemented. * * Revision 1.14 1999/01/18 17:30:48 meichel * minor syntax purifications to keep VC++ happy * * Revision 1.13 1999/01/18 16:15:17 vorwerk * Bug in isPresentationstateSeries() corrected. * * Revision 1.12 1999/01/15 17:27:17 meichel * added DVInterface method resetPresentationState() which allows to reset a * presentation state to the initial state (after loading). * * Revision 1.11 1999/01/14 17:50:27 meichel * added new method saveDICOMImage() to class DVInterface. * Allows to store a bitmap as a DICOM image. * * Revision 1.10 1999/01/14 16:19:46 vorwerk * getNumberOfSeries bug corrected. Error handling in deletion and reviewed methods added. * * Revision 1.8 1999/01/11 10:10:18 vorwerk * error handling for getNumberofStudies and selectStudy implemented. * * Revision 1.7 1999/01/07 16:40:04 vorwerk * getSeriesDescription implemented * * Revision 1.5 1999/01/04 13:28:11 vorwerk * line inserted * * Revision 1.4 1999/01/04 13:10:30 vorwerk * getSeriesPerformingPhysicainsName() changed in getSeriesPerformingPhysiciansName() * * Revision 1.3 1998/12/22 17:57:13 meichel * Implemented Presentation State interface for overlays, * VOI LUTs, VOI windows, curves. Added test program that * allows to add curve data to DICOM images. * * Revision 1.2 1998/12/22 15:52:45 vorwerk * - browser methods implemented * - methods added for index.dat * * Revision 1.1 1998/11/27 14:50:38 meichel * Initial Release. * * */ dcmtk-3.6.0/dcmpstat/libsrc/dvpsvw.cc0000644000310500011400000000754111455601071017003 0ustar joergrdicom3/* * * Copyright (C) 1998-2010, 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: DVPSVOIWindow * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:14:33 $ * CVS/RCS Revision: $Revision: 1.11 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmpstat/dvpsvw.h" #include "dcmtk/dcmdata/dctk.h" #include "dcmtk/ofstd/ofstd.h" #define INCLUDE_CSTDIO #include "dcmtk/ofstd/ofstdinc.h" /* --------------- class DVPSVOIWindow --------------- */ DVPSVOIWindow::DVPSVOIWindow() : windowCenter(0.0) , windowWidth(0.0) , windowCenterWidthExplanation() { } DVPSVOIWindow::DVPSVOIWindow(const DVPSVOIWindow& copy) : windowCenter(copy.windowCenter) , windowWidth(copy.windowWidth) , windowCenterWidthExplanation(copy.windowCenterWidthExplanation) { } DVPSVOIWindow::~DVPSVOIWindow() { } void DVPSVOIWindow::clear() { windowCenter = 0.0; windowWidth = 0.0; windowCenterWidthExplanation.clear(); } OFCondition DVPSVOIWindow::read(size_t idx, DcmDecimalString &wcenter, DcmDecimalString& wwidth, DcmLongString *expl) { if (wcenter.getVM() <= idx) return EC_IllegalCall; if (wwidth.getVM() <= idx) return EC_IllegalCall; Float64 wc=0.0, ww=0.0; OFCondition result = wcenter.getFloat64(wc, idx); if (EC_Normal==result) result= wwidth.getFloat64(ww, idx); if (EC_Normal==result) { windowCenter = wc; windowWidth = ww; if (expl && (expl->getVM() > idx)) expl->getOFString(windowCenterWidthExplanation, idx); else { // create default description for VOI Window char descr[32]; windowCenterWidthExplanation = "window center="; OFStandard::ftoa(descr, sizeof(descr), wc, OFStandard::ftoa_uppercase); windowCenterWidthExplanation += descr; windowCenterWidthExplanation += " width="; OFStandard::ftoa(descr, sizeof(descr), ww, OFStandard::ftoa_uppercase); windowCenterWidthExplanation += descr; } } return result; } const char *DVPSVOIWindow::getExplanation() { if (windowCenterWidthExplanation.length() == 0) return NULL; return windowCenterWidthExplanation.c_str(); } /* * $Log: dvpsvw.cc,v $ * Revision 1.11 2010-10-14 13:14:33 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.10 2009-11-24 14:12:59 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.9 2005-12-08 15:46:57 meichel * Changed include path schema for all DCMTK header files * * Revision 1.8 2002/12/04 10:41:39 meichel * Changed toolkit to use OFStandard::ftoa instead of sprintf for all * double to string conversions that are supposed to be locale independent * * Revision 1.7 2002/11/27 15:48:17 meichel * Adapted module dcmpstat to use of new header file ofstdinc.h * * Revision 1.6 2002/08/20 12:41:01 meichel * Added explicit includes for header files included implicitly * via dcstream before. * * Revision 1.5 2001/09/26 15:36:36 meichel * Adapted dcmpstat to class OFCondition * * Revision 1.4 2001/06/01 15:50:42 meichel * Updated copyright header * * Revision 1.3 2000/06/02 16:01:10 meichel * Adapted all dcmpstat classes to use OFConsole for log and error output * * Revision 1.2 2000/03/08 16:29:13 meichel * Updated copyright header. * * Revision 1.1 1998/12/22 17:57:21 meichel * Implemented Presentation State interface for overlays, * VOI LUTs, VOI windows, curves. Added test program that * allows to add curve data to DICOM images. * * */ dcmtk-3.6.0/dcmpstat/libsrc/dvpspl.cc0000644000310500011400000004177611455601070016771 0ustar joergrdicom3/* * * Copyright (C) 1999-2010, 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: DVPSPresentationLUT * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:14:32 $ * CVS/RCS Revision: $Revision: 1.31 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcdeftag.h" #include "dcmtk/dcmdata/dcsequen.h" #include "dcmtk/dcmdata/dcvrcs.h" #include "dcmtk/dcmpstat/dvpspl.h" #include "dcmtk/dcmpstat/dvpsdef.h" /* for constants and macros */ #include "dcmtk/dcmnet/dimse.h" /* --------------- class DVPSPresentationLUT --------------- */ DVPSPresentationLUT::DVPSPresentationLUT() : presentationLUT(DVPSP_identity) , presentationLUTDescriptor(DCM_LUTDescriptor) , presentationLUTExplanation(DCM_LUTExplanation) , presentationLUTData(DCM_LUTData) , sOPInstanceUID(DCM_SOPInstanceUID) { } DVPSPresentationLUT::DVPSPresentationLUT(const DVPSPresentationLUT& copy) : presentationLUT(copy.presentationLUT) , presentationLUTDescriptor(copy.presentationLUTDescriptor) , presentationLUTExplanation(copy.presentationLUTExplanation) , presentationLUTData(copy.presentationLUTData) , sOPInstanceUID(copy.sOPInstanceUID) { } DVPSPresentationLUT::~DVPSPresentationLUT() { } void DVPSPresentationLUT::clear() { presentationLUT = DVPSP_identity; presentationLUTDescriptor.clear(); presentationLUTExplanation.clear(); presentationLUTData.clear(); sOPInstanceUID.clear(); } OFCondition DVPSPresentationLUT::read(DcmItem &dset, OFBool withSOPInstance) { DcmSequenceOfItems *seq; DcmItem *item; OFCondition result = EC_Normal; DcmStack stack; OFString aString; DcmCodeString presentationLUTShape(DCM_PresentationLUTShape); READ_FROM_DATASET(DcmCodeString, presentationLUTShape) if (withSOPInstance) { READ_FROM_DATASET(DcmUniqueIdentifier, sOPInstanceUID) } else sOPInstanceUID.clear(); /* read Presentation LUT Sequence */ if (result==EC_Normal) { stack.clear(); if (EC_Normal == dset.search(DCM_PresentationLUTSequence, stack, ESM_fromHere, OFFalse)) { seq=(DcmSequenceOfItems *)stack.top(); if (seq->card() ==1) { item = seq->getItem(0); stack.clear(); if (EC_Normal == item->search((DcmTagKey &)presentationLUTDescriptor.getTag(), stack, ESM_fromHere, OFFalse)) { presentationLUTDescriptor = *((DcmUnsignedShort *)(stack.top())); } stack.clear(); if (EC_Normal == item->search((DcmTagKey &)presentationLUTExplanation.getTag(), stack, ESM_fromHere, OFFalse)) { presentationLUTExplanation = *((DcmLongString *)(stack.top())); } stack.clear(); if (EC_Normal == item->search((DcmTagKey &)presentationLUTData.getTag(), stack, ESM_fromHere, OFFalse)) { presentationLUTData = *((DcmUnsignedShort *)(stack.top())); } } else { result=EC_TagNotFound; DCMPSTAT_INFO("found Presentation LUT SQ with number of items != 1"); } } } /* Now perform basic sanity checks */ if (presentationLUTShape.getLength() == 0) { presentationLUT = DVPSP_table; if (presentationLUTDescriptor.getLength() == 0) { result=EC_IllegalCall; DCMPSTAT_INFO("presentationLUTShape and presentationLUTDescriptor absent or empty"); } else if (presentationLUTDescriptor.getVM() != 3) { result=EC_IllegalCall; DCMPSTAT_INFO("presentationLUTDescriptor present but VM != 3 in presentation state"); } if (presentationLUTData.getLength() == 0) { result=EC_IllegalCall; DCMPSTAT_INFO("presentationLUTShape and presentationLUTData absent or empty"); } } else { if (presentationLUTShape.getVM() != 1) { result=EC_IllegalCall; DCMPSTAT_INFO("presentationLUTShape present but VM != 1"); } else { // check presentation LUT shape aString.clear(); presentationLUTShape.getOFString(aString,0); if (aString=="IDENTITY") presentationLUT = DVPSP_identity; else if (aString=="INVERSE") presentationLUT = DVPSP_inverse; else if (aString=="LIN OD") presentationLUT = DVPSP_lin_od; else { result=EC_IllegalCall; DCMPSTAT_INFO("unknown presentationLUTShape keyword: " << aString); } } } if (withSOPInstance) { if (sOPInstanceUID.getLength() == 0) { result=EC_IllegalCall; DCMPSTAT_INFO("sOPInstanceUID absent in Presentation LUT Content Sequence"); } else if (sOPInstanceUID.getVM() != 1) { result=EC_IllegalCall; DCMPSTAT_INFO("sOPInstanceUID VM != 1 in Presentation LUT Content Sequence"); } } return result; } OFCondition DVPSPresentationLUT::write(DcmItem &dset, OFBool withSOPInstance) { OFCondition result = EC_Normal; DcmElement *delem=NULL; DcmSequenceOfItems *dseq=NULL; DcmItem *ditem=NULL; DcmCodeString presentationLUTShape(DCM_PresentationLUTShape); if (presentationLUT==DVPSP_table) { if (result == EC_Normal) { ditem = new DcmItem(); if (ditem) { dseq = new DcmSequenceOfItems(DCM_PresentationLUTSequence); if (dseq) { delem = new DcmUnsignedShort(presentationLUTDescriptor); if (delem) ditem->insert(delem, OFTrue /*replaceOld*/); else result=EC_MemoryExhausted; delem = new DcmUnsignedShort(presentationLUTData); if (delem) ditem->insert(delem, OFTrue /*replaceOld*/); else result=EC_MemoryExhausted; if (presentationLUTExplanation.getLength() >0) { delem = new DcmLongString(presentationLUTExplanation); if (delem) ditem->insert(delem, OFTrue /*replaceOld*/); else result=EC_MemoryExhausted; } if (result==EC_Normal) { dseq->insert(ditem); dset.insert(dseq, OFTrue /*replaceOld*/); } else { // out of memory during creation of sequence contents. delete dseq; delete ditem; result = EC_MemoryExhausted; } } else { // could allocate item but not sequence. Bail out. delete ditem; result = EC_MemoryExhausted; } } else result = EC_MemoryExhausted; } } else { if (presentationLUT==DVPSP_inverse) presentationLUTShape.putString("INVERSE"); else if (presentationLUT==DVPSP_lin_od) presentationLUTShape.putString("LIN OD"); else presentationLUTShape.putString("IDENTITY"); ADD_TO_DATASET(DcmCodeString, presentationLUTShape) } if (withSOPInstance) { ADD_TO_DATASET(DcmUniqueIdentifier, sOPInstanceUID) } return result; } OFBool DVPSPresentationLUT::haveTable() { if ((presentationLUTDescriptor.getVM()==3)&&(presentationLUTData.getLength() > 0)) return OFTrue; else return OFFalse; } const char *DVPSPresentationLUT::getSOPInstanceUID() { char *c = NULL; if (EC_Normal == sOPInstanceUID.getString(c)) return c; else return NULL; } const char *DVPSPresentationLUT::getCurrentExplanation() { const char *value = NULL; switch (presentationLUT) { case DVPSP_identity: value = "Identity Presentation LUT Shape"; break; case DVPSP_inverse: value = "Inverse Presentation LUT Shape"; break; case DVPSP_lin_od: value = "Linear Optical Density Presentation LUT Shape"; break; case DVPSP_table: value = getLUTExplanation(); if (value==NULL) value = "Unnamed Presentation LUT"; break; } return value; } const char *DVPSPresentationLUT::getLUTExplanation() { char *value = NULL; if (EC_Normal != presentationLUTExplanation.getString(value)) return NULL; return value; } OFCondition DVPSPresentationLUT::setLUT( DcmUnsignedShort& lutDescriptor, DcmUnsignedShort& lutData, DcmLongString& lutExplanation) { if ((lutDescriptor.getVM()==3)&&(lutData.getLength() > 0)) { presentationLUTDescriptor = lutDescriptor; presentationLUTData = lutData; presentationLUTExplanation = lutExplanation; presentationLUT = DVPSP_table; } else return EC_IllegalCall; return EC_Normal; } OFCondition DVPSPresentationLUT::setType(DVPSPresentationLUTType newType) { if ((newType == DVPSP_table)&&(! haveTable())) return EC_IllegalCall; presentationLUT = newType; return EC_Normal; } OFCondition DVPSPresentationLUT::setSOPInstanceUID(const char *value) { if ((value==NULL)||(strlen(value)==0)) return EC_IllegalCall; return sOPInstanceUID.putString(value); } OFBool DVPSPresentationLUT::isLegalPrintPresentationLUT() { OFBool result = OFFalse; Uint16 val=0; switch (presentationLUT) { case DVPSP_table: if (EC_Normal == presentationLUTDescriptor.getUint16(val,2)) { if ((val>=10)&&(val<=16)) result = OFTrue; } break; case DVPSP_inverse: break; case DVPSP_identity: case DVPSP_lin_od: result = OFTrue; break; } return result; } OFBool DVPSPresentationLUT::matchesImageDepth(OFBool is12bit) { Uint16 numEntries=0; Uint16 firstMapped=0; OFBool result = OFFalse; switch (presentationLUT) { case DVPSP_table: if ((EC_Normal == presentationLUTDescriptor.getUint16(numEntries,0)) && (EC_Normal == presentationLUTDescriptor.getUint16(firstMapped,1))) { if ((firstMapped == 0)&&((is12bit && (numEntries == 4096))||((!is12bit) && (numEntries == 256)))) result = OFTrue; } break; case DVPSP_inverse: break; case DVPSP_identity: case DVPSP_lin_od: result = OFTrue; break; } return result; } DVPSPrintPresentationLUTAlignment DVPSPresentationLUT::getAlignment() { if (presentationLUT == DVPSP_table) { Uint16 numberOfEntries = 0; Uint16 firstEntryMapped = 0xFFFF; if (EC_Normal != presentationLUTDescriptor.getUint16(numberOfEntries, 0)) numberOfEntries = 0; if (EC_Normal != presentationLUTDescriptor.getUint16(firstEntryMapped, 1)) firstEntryMapped = 0xFFFF; if ((numberOfEntries == 256)&&(firstEntryMapped == 0)) return DVPSK_table8; if ((numberOfEntries == 4096)&&(firstEntryMapped == 0)) return DVPSK_table12; return DVPSK_other; } return DVPSK_shape; } OFBool DVPSPresentationLUT::printSCPCreate( DcmDataset *rqDataset, T_DIMSE_Message& rsp, DcmDataset *& rspDataset, OFBool matchRequired, OFBool supports12Bit) { OFBool result = OFTrue; DcmStack stack; if ((rqDataset==NULL)||(EC_Normal != read(*rqDataset, OFFalse))) { DCMPSTAT_INFO("cannot create Presentation LUT: attribute list error."); rsp.msg.NCreateRSP.DimseStatus = STATUS_N_NoSuchAttribute; result = OFFalse; } // read() has cleared sOPInstanceUID; assign UID now. if (EC_Normal != setSOPInstanceUID(rsp.msg.NCreateRSP.AffectedSOPInstanceUID)) { rsp.msg.NCreateRSP.DimseStatus = STATUS_N_ProcessingFailure; result = OFFalse; } // browse through rqDataset and check for unsupported attributes if (result && rqDataset) { OFBool intoSub = OFTrue; stack.clear(); while (EC_Normal == rqDataset->nextObject(stack, intoSub)) { intoSub = OFFalse; const DcmTagKey& currentTag = (stack.top())->getTag(); if (currentTag.getElement() == 0x0000) /* group length */ ; else if (currentTag == DCM_PresentationLUTShape) /* OK */ ; else if (currentTag == DCM_PresentationLUTSequence) /* OK */ ; else { DCMPSTAT_INFO("cannot create Presentation LUT: unsupported attribute received:" << OFendl << DcmObject::PrintHelper(*stack.top(), DCMTypes::PF_shortenLongTagValues)); rsp.msg.NCreateRSP.DimseStatus = STATUS_N_NoSuchAttribute; result = OFFalse; } } } // if match between LUT and pixel data required, enforce rule if (result && matchRequired) { OFBool matches = OFTrue; switch (getAlignment()) { case DVPSK_shape: case DVPSK_table8: break; // always OK case DVPSK_table12: // is OK if printer supports 12 bit matches = supports12Bit; break; case DVPSK_other: // never fits matches = OFFalse; break; } if (!matches) { DCMPSTAT_INFO("cannot create Presentation LUT: Mismatch between LUT entries and image pixel depth."); rsp.msg.NCreateRSP.DimseStatus = STATUS_N_NoSuchAttribute; result = OFFalse; } } // if n-create was successful, create response dataset if (result) { rspDataset = new DcmDataset; if (rspDataset) { if (EC_Normal == write(*rspDataset, OFFalse)) { rsp.msg.NCreateRSP.DataSetType = DIMSE_DATASET_PRESENT; } else { delete rspDataset; rspDataset = NULL; rsp.msg.NCreateRSP.DimseStatus = STATUS_N_ProcessingFailure; result = OFFalse; } } else { rsp.msg.NCreateRSP.DimseStatus = STATUS_N_ProcessingFailure; result = OFFalse; } } return result; } /* * $Log: dvpspl.cc,v $ * Revision 1.31 2010-10-14 13:14:32 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.30 2009-11-24 14:12:59 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.29 2009-09-30 10:42:38 uli * Make dcmpstat's include headers self-sufficient by including all * needed headers directly and stop using dctk.h * * Revision 1.28 2006-08-15 16:57:02 meichel * Updated the code in module dcmpstat to correctly compile when * all standard C++ classes remain in namespace std. * * Revision 1.27 2005/12/08 15:46:38 meichel * Changed include path schema for all DCMTK header files * * Revision 1.26 2004/02/04 15:57:49 joergr * Removed acknowledgements with e-mail addresses from CVS log. * * Revision 1.25 2003/08/27 14:59:08 meichel * Moved all methods of class DVPSPresentationLUT that depend on module dcmimgle * into a separate implementation file * * Revision 1.24 2003/03/12 17:34:22 meichel * Updated DcmObject::print() flags * * Revision 1.23 2001/11/28 13:56:58 joergr * Check return value of DcmItem::insert() statements where appropriate to * avoid memory leaks when insert procedure fails. * * Revision 1.22 2001/09/26 15:36:29 meichel * Adapted dcmpstat to class OFCondition * * Revision 1.21 2001/06/01 15:50:34 meichel * Updated copyright header * * Revision 1.20 2001/05/25 10:07:57 meichel * Corrected some DIMSE error status codes for Print SCP * * Revision 1.19 2000/09/06 08:55:38 meichel * Updated Print SCP to accept and silently ignore group length attributes. * * Revision 1.18 2000/07/11 14:53:06 joergr * Corrected rendering of presentation LUT shape LIN OD. * * Revision 1.17 2000/07/07 14:15:14 joergr * Added support for LIN OD presentation LUT shape. * * Revision 1.16 2000/07/07 13:39:50 joergr * Added support for LIN OD presentation LUT shape. * * Revision 1.15 2000/06/09 10:15:36 joergr * Added support for rendering inverse presentation LUT into print bitmaps. * * Revision 1.14 2000/06/08 10:44:36 meichel * Implemented Referenced Presentation LUT Sequence on Basic Film Session level. * Empty film boxes (pages) are not written to file anymore. * * Revision 1.13 2000/06/07 14:27:13 joergr * Added support for rendering "hardcopy" and "softcopy" presentation LUTs. * * Revision 1.12 2000/06/07 13:17:07 meichel * now using DIMSE status constants and log facilities defined in dcmnet * * Revision 1.11 2000/06/02 16:01:03 meichel * Adapted all dcmpstat classes to use OFConsole for log and error output * * Revision 1.10 2000/05/31 12:58:15 meichel * Added initial Print SCP support * * Revision 1.9 2000/03/08 16:29:07 meichel * Updated copyright header. * * Revision 1.8 2000/03/03 14:14:02 meichel * Implemented library support for redirecting error messages into memory * instead of printing them to stdout/stderr for GUI applications. * * Revision 1.7 1999/11/24 15:15:05 joergr * Replaced call of method invertTable() by mirrorTable() to invert a * presentation LUT. * * Revision 1.6 1999/10/20 10:55:19 joergr * Enhanced method invertTable to distinguish between copy of LUT data and * original (referenced) LUT data. * * Revision 1.5 1999/10/07 17:22:00 meichel * Reworked management of Presentation LUTs in order to create tighter * coupling between Softcopy and Print. * * Revision 1.4 1999/09/24 15:24:07 meichel * Print spooler (dcmprtsv) now logs diagnostic messages in log files * when operating in spool mode. * * Revision 1.3 1999/09/24 13:22:07 joergr * Corrected bug writing inverse Presentation LUT Shape. * * Revision 1.2 1999/09/10 07:32:43 thiel * Added Presentation LUT Shape LIN OD * * Revision 1.1 1999/07/30 13:34:57 meichel * Added new classes managing Stored Print objects * * */ dcmtk-3.6.0/dcmpstat/libsrc/CMakeLists.txt0000644000310500011400000000073110312227062017670 0ustar joergrdicom3# create library from source files ADD_LIBRARY(dcmpstat dcmpstat dviface dvpsab dvpsabl dvpsal dvpsall dvpscf dvpscu dvpscul dvpsda dvpsdal dvpsfs dvpsga dvpsgal dvpsgl dvpsgll dvpsgr dvpsgrl dvpshlp dvpsib dvpsibl dvpsmsg dvpsov dvpsovl dvpspl dvpspl2 dvpspll dvpspr dvpsprt dvpsri dvpsril dvpsrs dvpsrsl dvpssp dvpsspl dvpssv dvpssvl dvpstat dvpstx dvpstxl dvpsvl dvpsvll dvpsvw dvpsvwl dvsighdl) # declare installation files INSTALL_TARGETS(${INSTALL_LIBDIR} dcmpstat) dcmtk-3.6.0/dcmpstat/libsrc/dvpsab.cc0000644000310500011400000001367511455601067016743 0ustar joergrdicom3/* * * Copyright (C) 1998-2010, 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: DVPSAnnotationContent * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:14:31 $ * CVS/RCS Revision: $Revision: 1.13 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcdeftag.h" #include "dcmtk/dcmdata/dcitem.h" #include "dcmtk/dcmpstat/dvpsab.h" #include "dcmtk/dcmpstat/dvpsdef.h" /* for constants and macros */ /* --------------- class DVPSAnnotationContent --------------- */ DVPSAnnotationContent::DVPSAnnotationContent() : sOPInstanceUID(DCM_SOPInstanceUID) , annotationPosition(DCM_AnnotationPosition) , textString(DCM_TextString) { } DVPSAnnotationContent::DVPSAnnotationContent(const DVPSAnnotationContent& copy) : sOPInstanceUID(copy.sOPInstanceUID) , annotationPosition(copy.annotationPosition) , textString(copy.textString) { } DVPSAnnotationContent::~DVPSAnnotationContent() { } void DVPSAnnotationContent::clear() { sOPInstanceUID.clear(); annotationPosition.clear(); textString.clear(); return; } OFCondition DVPSAnnotationContent::setContent( const char *instanceuid, const char *text, Uint16 position) { OFCondition result = EC_Normal; if (instanceuid && text) { clear(); result = sOPInstanceUID.putString(instanceuid); if (EC_Normal == result) result = textString.putString(text); if (EC_Normal == result) result = annotationPosition.putUint16(position,0); } else result = EC_IllegalCall; return result; } OFCondition DVPSAnnotationContent::read(DcmItem &dset) { OFCondition result = EC_Normal; DcmStack stack; READ_FROM_DATASET(DcmUniqueIdentifier, sOPInstanceUID) READ_FROM_DATASET(DcmUnsignedShort, annotationPosition) READ_FROM_DATASET(DcmLongString, textString) /* Now perform basic sanity checks */ if (result==EC_Normal) { if ((sOPInstanceUID.getLength() == 0)||(sOPInstanceUID.getVM() != 1)) { result=EC_TagNotFound; DCMPSTAT_INFO("SOPInstanceUID missing or incorrect in Stored Print Annotation"); } if ((annotationPosition.getLength() == 0)||(annotationPosition.getVM() != 1)) { result=EC_TagNotFound; DCMPSTAT_INFO("AnnotationPosition missing or incorrect in Stored Print Annotation"); } if ((textString.getLength() == 0)||(textString.getVM() != 1)) { result=EC_TagNotFound; DCMPSTAT_INFO("TextString missing or incorrect in Stored Print Annotation"); } } return result; } OFCondition DVPSAnnotationContent::write(DcmItem &dset) { OFCondition result = EC_Normal; DcmElement *delem=NULL; /* before writing anything, check that we are able to write a correct item */ if (sOPInstanceUID.getLength() == 0) { result=EC_TagNotFound; DCMPSTAT_INFO("cannot write Stored Print Annotation: SOPInstanceUID empty"); } if (annotationPosition.getLength() == 0) { result=EC_TagNotFound; DCMPSTAT_INFO("cannot write Stored Print Annotation: AnnotationPosition empty"); } if (textString.getLength() == 0) { result=EC_TagNotFound; DCMPSTAT_INFO("cannot write Stored Print Annotation: TextString empty"); } ADD_TO_DATASET(DcmUniqueIdentifier, sOPInstanceUID) ADD_TO_DATASET(DcmUnsignedShort, annotationPosition) ADD_TO_DATASET(DcmLongString, textString) return result; } OFCondition DVPSAnnotationContent::prepareBasicAnnotationBox(DcmItem &dset) { OFCondition result = EC_Normal; DcmElement *delem=NULL; ADD_TO_DATASET(DcmUnsignedShort, annotationPosition) ADD_TO_DATASET(DcmLongString, textString) return result; } OFCondition DVPSAnnotationContent::setSOPInstanceUID(const char *value) { if ((value==NULL)||(strlen(value)==0)) { sOPInstanceUID.clear(); return EC_Normal; } return sOPInstanceUID.putString(value); } const char *DVPSAnnotationContent::getSOPInstanceUID() { char *c = NULL; if (EC_Normal == sOPInstanceUID.getString(c)) return c; else return NULL; } /* * $Log: dvpsab.cc,v $ * Revision 1.13 2010-10-14 13:14:31 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.12 2009-11-24 14:12:58 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.11 2009-09-30 10:42:38 uli * Make dcmpstat's include headers self-sufficient by including all * needed headers directly and stop using dctk.h * * Revision 1.10 2006-08-15 16:57:02 meichel * Updated the code in module dcmpstat to correctly compile when * all standard C++ classes remain in namespace std. * * Revision 1.9 2005/12/08 15:46:16 meichel * Changed include path schema for all DCMTK header files * * Revision 1.8 2001/09/26 15:36:22 meichel * Adapted dcmpstat to class OFCondition * * Revision 1.7 2001/06/07 14:31:34 joergr * Removed unused variable (reported by gcc 2.5.8 on NeXTSTEP). * * Revision 1.6 2001/06/01 15:50:26 meichel * Updated copyright header * * Revision 1.5 2000/06/02 16:00:56 meichel * Adapted all dcmpstat classes to use OFConsole for log and error output * * Revision 1.4 2000/05/31 13:02:35 meichel * Moved dcmpstat macros and constants into a common header file * * Revision 1.3 2000/03/08 16:29:01 meichel * Updated copyright header. * * Revision 1.2 2000/03/03 14:13:57 meichel * Implemented library support for redirecting error messages into memory * instead of printing them to stdout/stderr for GUI applications. * * Revision 1.1 1999/10/19 14:48:27 meichel * added support for the Basic Annotation Box SOP Class * as well as access methods for Max Density and Min Density. * * */ dcmtk-3.6.0/dcmpstat/libsrc/dvpsril.cc0000644000310500011400000003055111455601070017131 0ustar joergrdicom3/* * * Copyright (C) 1998-2010, 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: DVPSReferencedImage_PList * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:14:32 $ * CVS/RCS Revision: $Revision: 1.23 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcdeftag.h" #include "dcmtk/dcmdata/dcsequen.h" #include "dcmtk/dcmpstat/dvpsril.h" #include "dcmtk/dcmpstat/dvpsri.h" /* for DVPSReferencedImage */ #include "dcmtk/dcmpstat/dvpsrsl.h" /* DVPSReferencedSeries_PList */ #include "dcmtk/dcmpstat/dvpsrs.h" /* for DVPSReferencedSeries, needed by MSVC5 with STL */ #include "dcmtk/dcmpstat/dvpsdef.h" DVPSReferencedImage_PList::DVPSReferencedImage_PList() : list_() { } DVPSReferencedImage_PList::DVPSReferencedImage_PList(const DVPSReferencedImage_PList &arg) : list_() { OFListConstIterator(DVPSReferencedImage *) first = arg.list_.begin(); OFListConstIterator(DVPSReferencedImage *) last = arg.list_.end(); while (first != last) { list_.push_back((*first)->clone()); ++first; } } DVPSReferencedImage_PList::~DVPSReferencedImage_PList() { clear(); } void DVPSReferencedImage_PList::clear() { OFListIterator(DVPSReferencedImage *) first = list_.begin(); OFListIterator(DVPSReferencedImage *) last = list_.end(); while (first != last) { delete (*first); first = list_.erase(first); } } OFCondition DVPSReferencedImage_PList::read(DcmItem &dset) { OFCondition result = EC_Normal; DcmStack stack; DVPSReferencedImage *newImage = NULL; DcmSequenceOfItems *dseq=NULL; DcmItem *ditem=NULL; if (EC_Normal == dset.search(DCM_ReferencedImageSequence, stack, ESM_fromHere, OFFalse)) { dseq=(DcmSequenceOfItems *)stack.top(); if (dseq) { unsigned long numItems = dseq->card(); for (unsigned int i=0; igetItem(i); newImage = new DVPSReferencedImage(); if (newImage && ditem) { result = newImage->read(*ditem); list_.push_back(newImage); } else result = EC_MemoryExhausted; } } } return result; } OFCondition DVPSReferencedImage_PList::write(DcmItem &dset) { OFCondition result = EC_Normal; DcmSequenceOfItems *dseq=NULL; DcmItem *ditem=NULL; dseq = new DcmSequenceOfItems(DCM_ReferencedImageSequence); if (dseq) { OFListIterator(DVPSReferencedImage *) first = list_.begin(); OFListIterator(DVPSReferencedImage *) last = list_.end(); while (first != last) { if (result==EC_Normal) { ditem = new DcmItem(); if (ditem) { result = (*first)->write(*ditem); if (result==EC_Normal) dseq->insert(ditem); else delete ditem; } else result = EC_MemoryExhausted; } ++first; } if (result==EC_Normal) dset.insert(dseq, OFTrue /*replaceOld*/); else delete dseq; } else result = EC_MemoryExhausted; return result; } OFBool DVPSReferencedImage_PList::isValid(OFString& sopclassuid) { if (size() == 0) { DCMPSTAT_INFO("referenced image SQ contains empty item in presentation state"); return OFFalse; } OFBool result = OFTrue; OFListIterator(DVPSReferencedImage *) first = list_.begin(); OFListIterator(DVPSReferencedImage *) last = list_.end(); while ((result == OFTrue) && (first != last)) { result = (*first)->validateSOPClassUID(sopclassuid); ++first; } return result; } DVPSReferencedImage *DVPSReferencedImage_PList::findImageReference(const char *sopinstanceuid) { OFListIterator(DVPSReferencedImage *) first = list_.begin(); OFListIterator(DVPSReferencedImage *) last = list_.end(); while (first != last) { if ((*first)->isSOPInstanceUID(sopinstanceuid)) return *first; ++first; } return NULL; } void DVPSReferencedImage_PList::removeFrameReference(const char *sopinstanceuid, unsigned long frame, unsigned long numberOfFrames) { if ((frame<1)||(numberOfFramesisSOPInstanceUID(sopinstanceuid)) { (*first)->removeFrameReference(frame, numberOfFrames); if ((*first)->appliesToAllFrames()) { delete (*first); first = list_.erase(first); } else ++first; } else ++first; } return; } void DVPSReferencedImage_PList::removeImageReference(const char *sopinstanceuid) { OFListIterator(DVPSReferencedImage *) first = list_.begin(); OFListIterator(DVPSReferencedImage *) last = list_.end(); while (first != last) { if ((*first)->isSOPInstanceUID(sopinstanceuid)) { delete (*first); first = list_.erase(first); } else ++first; } return; } OFCondition DVPSReferencedImage_PList::addImageReference( const char *sopclassUID, const char *instanceUID, const char *frames) { OFCondition result = EC_Normal; /* make sure that we don't create two references to the same image */ if (findImageReference(instanceUID)) result = EC_IllegalCall; else { DVPSReferencedImage *image = new DVPSReferencedImage(); if (image) { image->setSOPClassUID(sopclassUID); image->setSOPInstanceUID(instanceUID); if (frames) image->setFrameNumbers(frames); list_.push_back(image); } else result = EC_MemoryExhausted; } return result; } OFCondition DVPSReferencedImage_PList::addImageReference( const char *sopclassUID, const char *instanceUID, unsigned long frame, DVPSObjectApplicability applicability) { if ((sopclassUID==NULL)||(instanceUID==NULL)||(applicability==DVPSB_allImages)) return EC_IllegalCall; const char *framenumber=NULL; if (applicability==DVPSB_currentFrame) { char frameString[100]; sprintf(frameString, "%ld", frame); framenumber = frameString; } return addImageReference(sopclassUID, instanceUID, framenumber); } OFCondition DVPSReferencedImage_PList::getImageReference( size_t idx, OFString& sopclassUID, OFString& instanceUID, OFString& frames) { if (size() <= idx) return EC_IllegalCall; OFListIterator(DVPSReferencedImage *) first = list_.begin(); OFListIterator(DVPSReferencedImage *) last = list_.end(); while (first != last) { if (idx==0) return (*first)->getImageReference(sopclassUID, instanceUID, frames); else { idx--; ++first; } } return EC_IllegalCall; } void DVPSReferencedImage_PList::removeImageReference( DVPSReferencedSeries_PList& allReferences, const char *instanceUID, unsigned long frame, unsigned long numberOfFrames, DVPSObjectApplicability applicability) { if (applicability == DVPSB_allImages) { clear(); return; } // if list of image references is empty, add all existing references if (size() == 0) { OFString seriesUID; OFString sopclassUID; OFString sopinstanceUID; OFString frames; OFString aetitle; OFString filesetID; OFString filesetUID; const char *cframes=NULL; size_t numberOfReferences = allReferences.numberOfImageReferences(); for (size_t i=0; i 0) cframes=frames.c_str(); else cframes=NULL; addImageReference(sopclassUID.c_str(), sopinstanceUID.c_str(), cframes); } } } if (applicability == DVPSB_currentImage) removeImageReference(instanceUID); else removeFrameReference(instanceUID, frame, numberOfFrames); return; } OFBool DVPSReferencedImage_PList::isApplicable(const char *instanceUID, unsigned long frame) { if (size() == 0) return OFTrue; // if no image references exist, the object is valid "globally". DVPSReferencedImage *imageRef = findImageReference(instanceUID); if (imageRef) return imageRef->appliesToFrame(frame); return OFFalse; } OFBool DVPSReferencedImage_PList::matchesApplicability(const char *instanceUID, unsigned long frame, DVPSObjectApplicability applicability) { DVPSReferencedImage *imageRef = NULL; switch (applicability) { case DVPSB_currentFrame: // we match if referenced image SQ contains exactly one item // referencing only the current frame of the current image if (size() == 1) { imageRef = findImageReference(instanceUID); if (imageRef) return imageRef->appliesOnlyToFrame(frame); } break; case DVPSB_currentImage: // we match if referenced image SQ contains exactly one item // referencing all frames of the current image if (size() == 1) { imageRef = findImageReference(instanceUID); if (imageRef) return imageRef->appliesToAllFrames(); } break; case DVPSB_allImages: // applicability matches if referenced image SQ is empty if (size() == 0) return OFTrue; break; } return OFFalse; } /* * $Log: dvpsril.cc,v $ * Revision 1.23 2010-10-14 13:14:32 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.22 2009-11-24 14:12:59 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.21 2009-09-30 10:42:39 uli * Make dcmpstat's include headers self-sufficient by including all * needed headers directly and stop using dctk.h * * Revision 1.20 2006-08-15 16:57:02 meichel * Updated the code in module dcmpstat to correctly compile when * all standard C++ classes remain in namespace std. * * Revision 1.19 2005/12/08 15:46:44 meichel * Changed include path schema for all DCMTK header files * * Revision 1.18 2004/02/04 15:57:49 joergr * Removed acknowledgements with e-mail addresses from CVS log. * * Revision 1.17 2003/10/15 16:57:14 meichel * Updated error messages generated while parsing presentation states * * Revision 1.16 2003/09/05 08:37:46 meichel * Fixed minor issue that caused certain error messages during the * parse process on a GSPS object to be "swallowed". * * Revision 1.15 2003/06/12 18:23:11 joergr * Modified code to use const_iterators where appropriate (required for STL). * * Revision 1.14 2003/06/04 12:30:28 meichel * Added various includes needed by MSVC5 with STL * * Revision 1.13 2003/06/04 10:18:07 meichel * Replaced private inheritance from template with aggregation * * Revision 1.12 2001/11/28 13:56:59 joergr * Check return value of DcmItem::insert() statements where appropriate to * avoid memory leaks when insert procedure fails. * * Revision 1.11 2001/09/26 15:36:31 meichel * Adapted dcmpstat to class OFCondition * * Revision 1.10 2001/06/01 15:50:36 meichel * Updated copyright header * * Revision 1.9 2000/06/29 13:56:21 joergr * Fixed bug causing a non-terminating "while" loop. * * Revision 1.8 2000/06/02 16:01:05 meichel * Adapted all dcmpstat classes to use OFConsole for log and error output * * Revision 1.7 2000/03/08 16:29:09 meichel * Updated copyright header. * * Revision 1.6 2000/03/06 18:24:08 joergr * Renamed local variable hiding a member variable (reported by Sun CC 4.2). * * Revision 1.5 2000/03/03 14:14:04 meichel * Implemented library support for redirecting error messages into memory * instead of printing them to stdout/stderr for GUI applications. * * Revision 1.4 1999/07/22 16:40:01 meichel * Adapted dcmpstat data structures and API to supplement 33 letter ballot text. * * Revision 1.3 1999/01/15 17:32:56 meichel * added methods to DVPresentationState allowing to access the image * references in the presentation state. Also added methods allowing to * get the width and height of the attached image. * * Revision 1.2 1998/12/14 16:10:46 meichel * Implemented Presentation State interface for graphic layers, * text and graphic annotations, presentation LUTs. * * Revision 1.1 1998/11/27 14:50:46 meichel * Initial Release. * * */ dcmtk-3.6.0/dcmpstat/libsrc/dvpspl2.cc0000644000310500011400000001260611455601070017041 0ustar joergrdicom3/* * * Copyright (C) 1998-2010, 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: DVPSPresentationLUT * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:14:32 $ * CVS/RCS Revision: $Revision: 1.6 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/ofstd/ofstring.h" #include "dcmtk/dcmpstat/dvpspl.h" #include "dcmtk/dcmimgle/dcmimage.h" /* for class DiLookupTable, DicomImage */ #include "dcmtk/dcmpstat/dvpsdef.h" /* for constants and macros */ #include "dcmtk/dcmnet/dimse.h" /* --------------- class DVPSPresentationLUT --------------- */ OFBool DVPSPresentationLUT::compareDiLookupTable(DiLookupTable *lut) { if ((presentationLUT == DVPSP_table) && lut && (0 == lut->compareLUT(presentationLUTData, presentationLUTDescriptor))) return OFTrue; return OFFalse; } DiLookupTable *DVPSPresentationLUT::createDiLookupTable() { DiLookupTable *result = NULL; if (presentationLUT == DVPSP_table) result = new DiLookupTable(presentationLUTData, presentationLUTDescriptor); return result; } OFCondition DVPSPresentationLUT::invert() { OFCondition status = EC_Normal; switch (presentationLUT) { case DVPSP_identity: presentationLUT = DVPSP_inverse; break; case DVPSP_inverse: presentationLUT = DVPSP_identity; break; case DVPSP_table: status = EC_IllegalCall; if (haveTable()) { DiLookupTable *lut = new DiLookupTable(presentationLUTData, presentationLUTDescriptor); if (lut && (lut->mirrorTable(0x2))) status = EC_Normal; // flag = 0x2: mirror only original LUT data delete lut; } break; case DVPSP_lin_od: status = EC_IllegalCall; break; } return status; } OFBool DVPSPresentationLUT::activate(DicomImage *image, OFBool printLUT) { if (image==NULL) return OFFalse; int result=0; switch (presentationLUT) { case DVPSP_identity: if (printLUT) { // in DICOM print, IDENTITY should not invert a MONOCHROME1 image result = image->setPresentationLutShape(ESP_Default); } else { result = image->setPresentationLutShape(ESP_Identity); } if (!result) DCMPSTAT_INFO("unable to set identity presentation LUT shape, ignoring."); break; case DVPSP_inverse: if (!printLUT) result = image->setPresentationLutShape(ESP_Inverse); if (!result) DCMPSTAT_INFO("unable to set inverse presentation LUT shape, ignoring."); break; case DVPSP_lin_od: result = image->setPresentationLutShape(ESP_LinOD); if (!result) DCMPSTAT_INFO("unable to set linear optical density presentation LUT shape, ignoring."); break; case DVPSP_table: if (printLUT) result = image->setVoiLut(presentationLUTData, presentationLUTDescriptor, &presentationLUTExplanation); else result = image->setPresentationLut(presentationLUTData, presentationLUTDescriptor, &presentationLUTExplanation); if (!result) DCMPSTAT_INFO("unable to set presentation LUT, ignoring."); break; } if (result) return OFTrue; else return OFFalse; } OFBool DVPSPresentationLUT::activateInverseLUT(DicomImage *image) { int result = 0; if ((image != NULL) && (presentationLUT == DVPSP_table)) { result = image->setInversePresentationLut(presentationLUTData, presentationLUTDescriptor); if (!result) DCMPSTAT_INFO("unable to set inverse presentation LUT, ignoring."); } if (result) return OFTrue; else return OFFalse; } OFBool DVPSPresentationLUT::isInverse() { OFBool result = OFFalse; switch (presentationLUT) { case DVPSP_identity: case DVPSP_lin_od: break; case DVPSP_inverse: result = OFTrue; break; case DVPSP_table: if ((presentationLUTDescriptor.getVM()==3)&&(presentationLUTData.getLength() > 0)) { DiLookupTable *lut = new DiLookupTable(presentationLUTData, presentationLUTDescriptor); if (lut && (lut->getFirstValue() > lut->getLastValue())) result = OFTrue; delete lut; } break; } return result; } /* * $Log: dvpspl2.cc,v $ * Revision 1.6 2010-10-14 13:14:32 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.5 2009-11-24 14:12:59 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.4 2006-08-15 16:57:02 meichel * Updated the code in module dcmpstat to correctly compile when * all standard C++ classes remain in namespace std. * * Revision 1.3 2005/12/08 15:46:39 meichel * Changed include path schema for all DCMTK header files * * Revision 1.2 2003/12/18 17:14:47 meichel * Fixed print preview for MONOCHROME1 images with IDENTITY P-LUT shape * * Revision 1.1 2003/08/27 14:59:08 meichel * Moved all methods of class DVPSPresentationLUT that depend on module dcmimgle * into a separate implementation file * * */ dcmtk-3.6.0/dcmpstat/libsrc/dvpssv.cc0000644000310500011400000002734711455601071017005 0ustar joergrdicom3/* * * Copyright (C) 1998-2010, 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: DVPSSoftcopyVOI * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:14:33 $ * CVS/RCS Revision: $Revision: 1.16 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcdeftag.h" #include "dcmtk/dcmdata/dcsequen.h" #include "dcmtk/dcmpstat/dvpssv.h" #include "dcmtk/dcmpstat/dvpsri.h" /* for DVPSReferencedImage */ #include "dcmtk/dcmpstat/dvpsrsl.h" /* DVPSReferencedSeries_PList */ #include "dcmtk/dcmpstat/dvpsdef.h" /* for constants and macros */ #include "dcmtk/ofstd/ofstd.h" #include "dcmtk/dcmpstat/dvpsrs.h" /* for DVPSReferencedSeries, needed by MSVC5 with STL */ /* --------------- class DVPSSoftcopyVOI --------------- */ DVPSSoftcopyVOI::DVPSSoftcopyVOI() : referencedImageList() , useLUT(OFFalse) , voiLUTDescriptor(DCM_LUTDescriptor) , voiLUTExplanation(DCM_LUTExplanation) , voiLUTData(DCM_LUTData) , windowCenter(DCM_WindowCenter) , windowWidth(DCM_WindowWidth) , windowCenterWidthExplanation(DCM_WindowCenterWidthExplanation) { } DVPSSoftcopyVOI::DVPSSoftcopyVOI(const DVPSSoftcopyVOI& copy) : referencedImageList(copy.referencedImageList) , useLUT(copy.useLUT) , voiLUTDescriptor(copy.voiLUTDescriptor) , voiLUTExplanation(copy.voiLUTExplanation) , voiLUTData(copy.voiLUTData) , windowCenter(copy.windowCenter) , windowWidth(copy.windowWidth) , windowCenterWidthExplanation(copy.windowCenterWidthExplanation) { } DVPSSoftcopyVOI::~DVPSSoftcopyVOI() { } OFCondition DVPSSoftcopyVOI::read(DcmItem &dset) { OFCondition result = EC_Normal; DcmStack stack; DcmSequenceOfItems *seq; DcmItem *item; READ_FROM_DATASET(DcmDecimalString, windowCenter) READ_FROM_DATASET(DcmDecimalString, windowWidth) READ_FROM_DATASET(DcmLongString, windowCenterWidthExplanation) /* read VOI LUT Sequence */ if (result==EC_Normal) { stack.clear(); if (EC_Normal == dset.search(DCM_VOILUTSequence, stack, ESM_fromHere, OFFalse)) { seq=(DcmSequenceOfItems *)stack.top(); if (seq->card() ==1) { item = seq->getItem(0); stack.clear(); if (EC_Normal == item->search((DcmTagKey &)voiLUTDescriptor.getTag(), stack, ESM_fromHere, OFFalse)) { voiLUTDescriptor = *((DcmUnsignedShort *)(stack.top())); } stack.clear(); if (EC_Normal == item->search((DcmTagKey &)voiLUTExplanation.getTag(), stack, ESM_fromHere, OFFalse)) { voiLUTExplanation = *((DcmLongString *)(stack.top())); } stack.clear(); if (EC_Normal == item->search((DcmTagKey &)voiLUTData.getTag(), stack, ESM_fromHere, OFFalse)) { voiLUTData = *((DcmUnsignedShort *)(stack.top())); } } else { result=EC_TagNotFound; DCMPSTAT_INFO("VOI LUT SQ does not have exactly one item in presentation state"); } } } if (result==EC_Normal) result = referencedImageList.read(dset); /* Now perform basic sanity checks */ if (result==EC_Normal) { if (windowCenter.getLength() > 0) { useLUT = OFFalse; if (windowWidth.getLength() == 0) { result=EC_IllegalCall; DCMPSTAT_INFO("windowCenter present but windowWidth absent or empty in presentation state"); } else if (windowWidth.getVM() != 1) { result=EC_IllegalCall; DCMPSTAT_INFO("windowCenter present but windowWidth VM != 1 in presentation state"); } if (windowCenter.getVM() != 1) { result=EC_IllegalCall; DCMPSTAT_INFO("windowCenter present but VM != 1 in presentation state"); } } else useLUT = OFTrue; if (voiLUTData.getLength() > 0) { if (! useLUT) { result=EC_IllegalCall; DCMPSTAT_INFO("both VOI window and LUT present in presentation state"); } if (voiLUTDescriptor.getLength() == 0) { result=EC_IllegalCall; DCMPSTAT_INFO("voiLUTData present but voiLUTDescriptor absent or empty in presentation state"); } else if (voiLUTDescriptor.getVM() != 3) { result=EC_IllegalCall; DCMPSTAT_INFO("voiLUTData present but voiLUTDescriptor VM != 3 in presentation state"); } } else if (useLUT) { result=EC_IllegalCall; DCMPSTAT_INFO("neither VOI window nor LUT present in presentation state"); } } return result; } OFCondition DVPSSoftcopyVOI::write(DcmItem &dset) { OFCondition result = EC_Normal; DcmElement *delem=NULL; DcmSequenceOfItems *dseq=NULL; DcmItem *ditem=NULL; if (useLUT) { ditem = new DcmItem(); if (ditem) { dseq = new DcmSequenceOfItems(DCM_VOILUTSequence); if (dseq) { delem = new DcmUnsignedShort(voiLUTDescriptor); if (delem) ditem->insert(delem, OFTrue /*replaceOld*/); else result=EC_MemoryExhausted; delem = new DcmUnsignedShort(voiLUTData); if (delem) ditem->insert(delem, OFTrue /*replaceOld*/); else result=EC_MemoryExhausted; if (voiLUTExplanation.getLength() >0) { delem = new DcmLongString(voiLUTExplanation); if (delem) ditem->insert(delem, OFTrue /*replaceOld*/); else result=EC_MemoryExhausted; } if (result==EC_Normal) { dseq->insert(ditem); dset.insert(dseq, OFTrue /*replaceOld*/); } else { // out of memory during creation of sequence contents. delete dseq; delete ditem; result = EC_MemoryExhausted; } } else { // could allocate item but not sequence. Bail out. delete ditem; result = EC_MemoryExhausted; } } else result = EC_MemoryExhausted; } else { ADD_TO_DATASET(DcmDecimalString, windowCenter) ADD_TO_DATASET(DcmDecimalString, windowWidth) if (windowCenterWidthExplanation.getLength() > 0) { ADD_TO_DATASET(DcmLongString, windowCenterWidthExplanation) } } if ((result == EC_Normal)&&(referencedImageList.size() >0)) result = referencedImageList.write(dset); return result; } OFBool DVPSSoftcopyVOI::isApplicable(const char *instanceUID, unsigned long frame) { return referencedImageList.isApplicable(instanceUID, frame); } OFBool DVPSSoftcopyVOI::matchesApplicability(const char *instanceUID, unsigned long frame, DVPSObjectApplicability applicability) { return referencedImageList.matchesApplicability(instanceUID, frame, applicability); } void DVPSSoftcopyVOI::removeImageReference( DVPSReferencedSeries_PList& allReferences, const char *instanceUID, unsigned long frame, unsigned long numberOfFrames, DVPSObjectApplicability applicability) { referencedImageList.removeImageReference(allReferences, instanceUID, frame, numberOfFrames, applicability); return; } OFCondition DVPSSoftcopyVOI::addImageReference( const char *sopclassUID, const char *instanceUID, unsigned long frame, DVPSObjectApplicability applicability) { return referencedImageList.addImageReference(sopclassUID, instanceUID, frame, applicability); } const char *DVPSSoftcopyVOI::getCurrentVOIDescription() { char *c=NULL; if (useLUT) { if (EC_Normal == voiLUTExplanation.getString(c)) return c; } else { if (EC_Normal == windowCenterWidthExplanation.getString(c)) return c; } return NULL; } OFCondition DVPSSoftcopyVOI::getCurrentWindowWidth(double &w) { OFCondition result = EC_IllegalCall; if (!useLUT) { Float64 temp=0.0; result = windowWidth.getFloat64(temp,0); if (EC_Normal==result) w = (double)temp; } return result; } OFCondition DVPSSoftcopyVOI::getCurrentWindowCenter(double &c) { OFCondition result = EC_IllegalCall; if (!useLUT) { Float64 temp=0.0; result = windowCenter.getFloat64(temp,0); if (EC_Normal==result) c = (double)temp; } return result; } OFCondition DVPSSoftcopyVOI::setVOIWindow(double wCenter, double wWidth, const char *description) { if (wWidth < 1.0) { DCMPSTAT_INFO("Window Width < 1 not allowed."); return EC_IllegalCall; } DcmDecimalString wc(DCM_WindowCenter); DcmDecimalString ww(DCM_WindowWidth); DcmLongString expl(DCM_WindowCenterWidthExplanation); char buf[80]; OFStandard::ftoa(buf, sizeof(buf), wCenter, OFStandard::ftoa_uppercase); OFCondition result = wc.putString(buf); OFStandard::ftoa(buf, sizeof(buf), wWidth, OFStandard::ftoa_uppercase); if (EC_Normal == result) result = ww.putString(buf); if ((EC_Normal == result)&&(description)) result = expl.putString(description); if (EC_Normal == result) { // everything worked fine, now copy. windowCenter = wc; windowWidth = ww; windowCenterWidthExplanation = expl; voiLUTDescriptor.clear(); voiLUTData.clear(); voiLUTExplanation.clear(); useLUT = OFFalse; } return result; } OFCondition DVPSSoftcopyVOI::setVOILUT( DcmUnsignedShort& lutDescriptor, DcmUnsignedShort& lutData, DcmLongString& lutExplanation) { if (lutData.getLength() == 0) return EC_IllegalCall; if (lutDescriptor.getVM() != 3) return EC_IllegalCall; voiLUTDescriptor = lutDescriptor; voiLUTData = lutData; voiLUTExplanation = lutExplanation; windowCenter.clear(); windowWidth.clear(); windowCenterWidthExplanation.clear(); useLUT = OFTrue; return EC_Normal; } /* * $Log: dvpssv.cc,v $ * Revision 1.16 2010-10-14 13:14:33 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.15 2009-11-24 14:12:59 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.14 2009-09-30 10:42:39 uli * Make dcmpstat's include headers self-sufficient by including all * needed headers directly and stop using dctk.h * * Revision 1.13 2006-08-15 16:57:02 meichel * Updated the code in module dcmpstat to correctly compile when * all standard C++ classes remain in namespace std. * * Revision 1.12 2005/12/08 15:46:49 meichel * Changed include path schema for all DCMTK header files * * Revision 1.11 2003/06/04 12:30:29 meichel * Added various includes needed by MSVC5 with STL * * Revision 1.10 2002/12/04 10:41:37 meichel * Changed toolkit to use OFStandard::ftoa instead of sprintf for all * double to string conversions that are supposed to be locale independent * * Revision 1.9 2001/11/28 13:57:03 joergr * Check return value of DcmItem::insert() statements where appropriate to * avoid memory leaks when insert procedure fails. * * Revision 1.8 2001/09/26 15:36:33 meichel * Adapted dcmpstat to class OFCondition * * Revision 1.7 2001/06/01 15:50:39 meichel * Updated copyright header * * Revision 1.6 2000/06/02 16:01:07 meichel * Adapted all dcmpstat classes to use OFConsole for log and error output * * Revision 1.5 2000/05/31 13:02:39 meichel * Moved dcmpstat macros and constants into a common header file * * Revision 1.4 2000/03/08 16:29:11 meichel * Updated copyright header. * * Revision 1.3 2000/03/03 14:14:06 meichel * Implemented library support for redirecting error messages into memory * instead of printing them to stdout/stderr for GUI applications. * * Revision 1.2 1999/10/05 12:10:59 joergr * Fixed bug in DVPSSoftcopyVOI::setVOIWindow(). Window width = 1 was * rejected. * * Revision 1.1 1999/07/22 16:40:03 meichel * Adapted dcmpstat data structures and API to supplement 33 letter ballot text. * * */ dcmtk-3.6.0/dcmpstat/libsrc/dvpsgrl.cc0000644000310500011400000001301311455601070017121 0ustar joergrdicom3/* * * Copyright (C) 1998-2010, 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: DVPSGraphicObject_PList * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:14:32 $ * CVS/RCS Revision: $Revision: 1.14 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmpstat/dvpsgrl.h" #include "dcmtk/dcmpstat/dvpsgr.h" /* for DVPSGraphicObject */ DVPSGraphicObject_PList::DVPSGraphicObject_PList() : list_() { } DVPSGraphicObject_PList::DVPSGraphicObject_PList(const DVPSGraphicObject_PList &arg) : list_() { OFListConstIterator(DVPSGraphicObject *) first = arg.list_.begin(); OFListConstIterator(DVPSGraphicObject *) last = arg.list_.end(); while (first != last) { list_.push_back((*first)->clone()); ++first; } } DVPSGraphicObject_PList::~DVPSGraphicObject_PList() { clear(); } void DVPSGraphicObject_PList::clear() { OFListIterator(DVPSGraphicObject *) first = list_.begin(); OFListIterator(DVPSGraphicObject *) last = list_.end(); while (first != last) { delete (*first); first = list_.erase(first); } } OFCondition DVPSGraphicObject_PList::read(DcmItem &dset) { OFCondition result = EC_Normal; DcmStack stack; DVPSGraphicObject *newObject = NULL; DcmSequenceOfItems *dseq=NULL; DcmItem *ditem=NULL; if (EC_Normal == dset.search(DCM_GraphicObjectSequence, stack, ESM_fromHere, OFFalse)) { dseq=(DcmSequenceOfItems *)stack.top(); if (dseq) { unsigned long numItems = dseq->card(); for (unsigned int i=0; igetItem(i); newObject = new DVPSGraphicObject(); if (newObject && ditem) { result = newObject->read(*ditem); list_.push_back(newObject); } else result = EC_MemoryExhausted; } } } return result; } OFCondition DVPSGraphicObject_PList::write(DcmItem &dset) { if (size()==0) return EC_Normal; // don't write empty Sequence OFCondition result = EC_Normal; DcmSequenceOfItems *dseq=NULL; DcmItem *ditem=NULL; dseq = new DcmSequenceOfItems(DCM_GraphicObjectSequence); if (dseq) { OFListIterator(DVPSGraphicObject *) first = list_.begin(); OFListIterator(DVPSGraphicObject *) last = list_.end(); while (first != last) { if (result==EC_Normal) { ditem = new DcmItem(); if (ditem) { result = (*first)->write(*ditem); if (result==EC_Normal) dseq->insert(ditem); else delete ditem; } else result = EC_MemoryExhausted; } ++first; } if (result==EC_Normal) dset.insert(dseq, OFTrue /*replaceOld*/); else delete dseq; } else result = EC_MemoryExhausted; return result; } DVPSGraphicObject *DVPSGraphicObject_PList::getGraphicObject(size_t idx) { OFListIterator(DVPSGraphicObject *) first = list_.begin(); OFListIterator(DVPSGraphicObject *) last = list_.end(); while (first != last) { if (idx==0) return *first; idx--; ++first; } return NULL; } void DVPSGraphicObject_PList::addGraphicObject(DVPSGraphicObject *graphic) { if (graphic) list_.push_back(graphic); } DVPSGraphicObject *DVPSGraphicObject_PList::removeGraphicObject(size_t idx) { OFListIterator(DVPSGraphicObject *) first = list_.begin(); OFListIterator(DVPSGraphicObject *) last = list_.end(); while (first != last) { if (idx==0) { DVPSGraphicObject *result = *first; list_.erase(first); return result; } idx--; ++first; } return NULL; } /* * $Log: dvpsgrl.cc,v $ * Revision 1.14 2010-10-14 13:14:32 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.13 2009-11-24 14:12:58 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.12 2005-12-08 15:46:31 meichel * Changed include path schema for all DCMTK header files * * Revision 1.11 2004/02/04 15:57:49 joergr * Removed acknowledgements with e-mail addresses from CVS log. * * Revision 1.10 2003/09/05 08:37:46 meichel * Fixed minor issue that caused certain error messages during the * parse process on a GSPS object to be "swallowed". * * Revision 1.9 2003/06/12 18:23:11 joergr * Modified code to use const_iterators where appropriate (required for STL). * * Revision 1.8 2003/06/04 10:18:07 meichel * Replaced private inheritance from template with aggregation * * Revision 1.7 2001/11/28 13:56:55 joergr * Check return value of DcmItem::insert() statements where appropriate to * avoid memory leaks when insert procedure fails. * * Revision 1.6 2001/09/26 15:36:27 meichel * Adapted dcmpstat to class OFCondition * * Revision 1.5 2001/06/01 15:50:32 meichel * Updated copyright header * * Revision 1.4 2000/06/02 16:01:01 meichel * Adapted all dcmpstat classes to use OFConsole for log and error output * * Revision 1.3 2000/03/08 16:29:06 meichel * Updated copyright header. * * Revision 1.2 1998/12/14 16:10:44 meichel * Implemented Presentation State interface for graphic layers, * text and graphic annotations, presentation LUTs. * * Revision 1.1 1998/11/27 14:50:43 meichel * Initial Release. * * */ dcmtk-3.6.0/dcmpstat/libsrc/dvpsib.cc0000644000310500011400000014634411455601070016745 0ustar joergrdicom3/* * * Copyright (C) 1998-2010, 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: DVPSImageBoxContent * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:14:32 $ * CVS/RCS Revision: $Revision: 1.40 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/ofstd/ofstring.h" #include "dcmtk/dcmpstat/dvpsib.h" #include "dcmtk/dcmpstat/dvpsdef.h" /* for constants and macros */ #include "dcmtk/dcmpstat/dvpspll.h" #include "dcmtk/dcmpstat/dvpscf.h" #include "dcmtk/dcmpstat/dvpshlp.h" #include "dcmtk/dcmpstat/dvpspl.h" /* for DVPSPresentationLUT, needed by MSVC5 with STL */ /* --------------- class DVPSImageBoxContent --------------- */ DVPSImageBoxContent::DVPSImageBoxContent() : sOPInstanceUID(DCM_SOPInstanceUID) , imageBoxPosition(DCM_ImageBoxPosition) , polarity(DCM_Polarity) , magnificationType(DCM_MagnificationType) , configurationInformation(DCM_ConfigurationInformation) , smoothingType(DCM_SmoothingType) , requestedImageSize(DCM_RequestedImageSize) , requestedDecimateCropBehavior(DCM_RequestedDecimateCropBehavior) , retrieveAETitle(DCM_RetrieveAETitle) , referencedSOPClassUID(DCM_ReferencedSOPClassUID) , referencedSOPInstanceUID(DCM_ReferencedSOPInstanceUID) , studyInstanceUID(DCM_StudyInstanceUID) , seriesInstanceUID(DCM_SeriesInstanceUID) , referencedFrameNumber(DCM_ReferencedFrameNumber) , patientID(DCM_PatientID) , referencedPresentationLUTInstanceUID(DCM_ReferencedSOPInstanceUID) , imageDepth(DVPSN_undefined) { } DVPSImageBoxContent::DVPSImageBoxContent(const DVPSImageBoxContent& copy) : sOPInstanceUID(copy.sOPInstanceUID) , imageBoxPosition(copy.imageBoxPosition) , polarity(copy.polarity) , magnificationType(copy.magnificationType) , configurationInformation(copy.configurationInformation) , smoothingType(copy.smoothingType) , requestedImageSize(copy.requestedImageSize) , requestedDecimateCropBehavior(copy.requestedDecimateCropBehavior) , retrieveAETitle(copy.retrieveAETitle) , referencedSOPClassUID(copy.referencedSOPClassUID) , referencedSOPInstanceUID(copy.referencedSOPInstanceUID) , studyInstanceUID(copy.studyInstanceUID) , seriesInstanceUID(copy.seriesInstanceUID) , referencedFrameNumber(copy.referencedFrameNumber) , patientID(copy.patientID) , referencedPresentationLUTInstanceUID(copy.referencedPresentationLUTInstanceUID) , imageDepth(copy.imageDepth) { } DVPSImageBoxContent::~DVPSImageBoxContent() { } void DVPSImageBoxContent::clear() { sOPInstanceUID.clear(); imageBoxPosition.clear(); polarity.clear(); magnificationType.clear(); configurationInformation.clear(); smoothingType.clear(); requestedImageSize.clear(); requestedDecimateCropBehavior.clear(); retrieveAETitle.clear(); referencedSOPClassUID.clear(); referencedSOPInstanceUID.clear(); studyInstanceUID.clear(); seriesInstanceUID.clear(); referencedFrameNumber.clear(); patientID.clear(); referencedPresentationLUTInstanceUID.clear(); imageDepth = DVPSN_undefined; return; } OFCondition DVPSImageBoxContent::setContent( const char *instanceuid, const char *retrieveaetitle, const char *refstudyuid, const char *refseriesuid, const char *refsopclassuid, const char *refsopinstanceuid, const char *requestedimagesize, const char *patientid, const char *presentationlutreference) { OFCondition result = EC_Normal; if (refstudyuid && refseriesuid && instanceuid && retrieveaetitle && refsopclassuid && refsopinstanceuid) { clear(); result = sOPInstanceUID.putString(instanceuid); if (EC_Normal == result) result = retrieveAETitle.putString(retrieveaetitle); if (EC_Normal == result) result = referencedSOPClassUID.putString(refsopclassuid); if (EC_Normal == result) result = referencedSOPInstanceUID.putString(refsopinstanceuid); if (EC_Normal == result) result = studyInstanceUID.putString(refstudyuid); if (EC_Normal == result) result = seriesInstanceUID.putString(refseriesuid); if (requestedimagesize && (EC_Normal == result)) result = requestedImageSize.putString(requestedimagesize); if (patientid && (EC_Normal == result)) result = patientID.putString(patientid); if (presentationlutreference && (EC_Normal == result)) result = referencedPresentationLUTInstanceUID.putString(presentationlutreference); } else result = EC_IllegalCall; return result; } OFCondition DVPSImageBoxContent::read(DcmItem &dset, DVPSPresentationLUT_PList& presentationLUTList) { DcmSequenceOfItems *seq; DcmItem *item; OFCondition result = EC_Normal; DcmStack stack; OFString aString; READ_FROM_DATASET(DcmUniqueIdentifier, sOPInstanceUID) READ_FROM_DATASET(DcmUnsignedShort, imageBoxPosition) READ_FROM_DATASET(DcmCodeString, polarity) READ_FROM_DATASET(DcmCodeString, magnificationType) if (result==EC_TagNotFound) result = EC_Normal; READ_FROM_DATASET(DcmShortText, configurationInformation) if (result==EC_TagNotFound) result = EC_Normal; READ_FROM_DATASET(DcmCodeString, smoothingType) if (result==EC_TagNotFound) result = EC_Normal; READ_FROM_DATASET(DcmDecimalString, requestedImageSize) if (result==EC_TagNotFound) result = EC_Normal; READ_FROM_DATASET(DcmCodeString, requestedDecimateCropBehavior) if (result==EC_TagNotFound) result = EC_Normal; if (result==EC_Normal) { stack.clear(); if (EC_Normal == dset.search(DCM_ReferencedImageSequence, stack, ESM_fromHere, OFFalse)) { seq=(DcmSequenceOfItems *)stack.top(); if (seq->card() ==1) { item = seq->getItem(0); stack.clear(); READ_FROM_DATASET2(DcmApplicationEntity, retrieveAETitle) READ_FROM_DATASET2(DcmUniqueIdentifier, referencedSOPClassUID) READ_FROM_DATASET2(DcmUniqueIdentifier, referencedSOPInstanceUID) READ_FROM_DATASET2(DcmUniqueIdentifier, studyInstanceUID) READ_FROM_DATASET2(DcmUniqueIdentifier, seriesInstanceUID) READ_FROM_DATASET2(DcmIntegerString, referencedFrameNumber) if (result==EC_TagNotFound) result = EC_Normal; READ_FROM_DATASET2(DcmLongString, patientID) } else { result=EC_TagNotFound; DCMPSTAT_INFO("found ReferencedImageSequence in Stored Print Image Box with number of items != 1"); } } } if (result==EC_Normal) { // check referenced presentation LUT sequence // if there is any reference, it must refer to one of the presentation LUTs we are managing. stack.clear(); if (EC_Normal == dset.search(DCM_ReferencedPresentationLUTSequence, stack, ESM_fromHere, OFFalse)) { seq=(DcmSequenceOfItems *)stack.top(); if (seq->card() ==1) { item = seq->getItem(0); stack.clear(); READ_FROM_DATASET2(DcmUniqueIdentifier, referencedPresentationLUTInstanceUID) if (referencedPresentationLUTInstanceUID.getLength() > 0) { referencedPresentationLUTInstanceUID.getOFString(aString,0); if (NULL == presentationLUTList.findPresentationLUT(aString.c_str())) { result=EC_IllegalCall; DCMPSTAT_INFO("ImageBoxContentSequence presentation LUT reference cannot be resolved"); } } } else { result=EC_TagNotFound; DCMPSTAT_INFO("found ImageBoxContentSequence in Stored Print with ReferencedPresentationLUTSequence number of items != 1"); } } } /* the following attributes belong to the ReferencedImageSequence */ if (result==EC_Normal) { stack.clear(); if (EC_Normal == dset.search(DCM_RETIRED_ReferencedImageOverlayBoxSequence, stack, ESM_fromHere, OFFalse)) { result=EC_IllegalCall; DCMPSTAT_INFO("Stored Print: retired ReferencedImageOverlayBoxSequence not supported"); } } /* Now perform basic sanity checks */ if (result==EC_Normal) { if ((sOPInstanceUID.getLength() == 0)||(sOPInstanceUID.getVM() != 1)) { result=EC_TagNotFound; DCMPSTAT_INFO("SOPInstanceUID missing or incorrect in Stored Print Image Box"); } if ((imageBoxPosition.getLength() == 0)||(imageBoxPosition.getVM() != 1)) { result=EC_TagNotFound; DCMPSTAT_INFO("ImageBoxPosition missing or incorrect in Stored Print Image Box"); } if (retrieveAETitle.getLength() == 0) { result=EC_TagNotFound; DCMPSTAT_INFO("RetrieveAETitle missing in Stored Print Image Box"); } if ((referencedSOPClassUID.getLength() == 0)||(referencedSOPClassUID.getVM() != 1)) { result=EC_TagNotFound; DCMPSTAT_INFO("ReferencedSOPClassUID missing or incorrect in Stored Print Image Box"); } if ((referencedSOPInstanceUID.getLength() == 0)||(referencedSOPInstanceUID.getVM() != 1)) { result=EC_TagNotFound; DCMPSTAT_INFO("ReferencedSOPInstanceUID missing or incorrect in Stored Print Image Box"); } if ((studyInstanceUID.getLength() == 0)||(studyInstanceUID.getVM() != 1)) { result=EC_TagNotFound; DCMPSTAT_INFO("StudyInstanceUID missing or incorrect in Stored Print Image Box"); } if ((seriesInstanceUID.getLength() == 0)||(seriesInstanceUID.getVM() != 1)) { result=EC_TagNotFound; DCMPSTAT_INFO("SeriesInstanceUID missing or incorrect in Stored Print Image Box"); } if (referencedFrameNumber.getVM() > 1) { result=EC_TagNotFound; DCMPSTAT_INFO("ReferencedFrameNumber VM>1 in Stored Print Image Box"); } } return result; } OFCondition DVPSImageBoxContent::write(DcmItem &dset, OFBool writeRequestedImageSize, OFBool writeReferencedPLUTSQ) { OFCondition result = EC_Normal; DcmElement *delem=NULL; DcmSequenceOfItems *dseq=NULL; DcmItem *ditem=NULL; /* before writing anything, check that we are able to write a correct item */ if (sOPInstanceUID.getLength() == 0) { result=EC_TagNotFound; DCMPSTAT_INFO("cannot write Stored Print Image Box: SOPInstanceUID empty"); } if (imageBoxPosition.getLength() == 0) { result=EC_TagNotFound; DCMPSTAT_INFO("cannot write Stored Print Image Box: ImageBoxPosition empty"); } if (retrieveAETitle.getLength() == 0) { result=EC_TagNotFound; DCMPSTAT_INFO("cannot write Stored Print Image Box: RetrieveAETitle empty"); } if (referencedSOPClassUID.getLength() == 0) { result=EC_TagNotFound; DCMPSTAT_INFO("cannot write Stored Print Image Box: ReferencedSOPClassUID empty"); } if (referencedSOPInstanceUID.getLength() == 0) { result=EC_TagNotFound; DCMPSTAT_INFO("cannot write Stored Print Image Box: ReferencedSOPInstanceUID empty"); } if (studyInstanceUID.getLength() == 0) { result=EC_TagNotFound; DCMPSTAT_INFO("cannot write Stored Print Image Box: StudyInstanceUID empty"); } if (seriesInstanceUID.getLength() == 0) { result=EC_TagNotFound; DCMPSTAT_INFO("cannot write Stored Print Image Box: SeriesInstanceUID empty"); } ADD_TO_DATASET(DcmUniqueIdentifier, sOPInstanceUID) ADD_TO_DATASET(DcmUnsignedShort, imageBoxPosition) ADD_TO_DATASET(DcmCodeString, polarity) if (magnificationType.getLength() > 0) { ADD_TO_DATASET(DcmCodeString, magnificationType) } if (configurationInformation.getLength() > 0) { ADD_TO_DATASET(DcmShortText, configurationInformation) } if (smoothingType.getLength() > 0) { ADD_TO_DATASET(DcmCodeString, smoothingType) } if ((writeRequestedImageSize)&&(requestedImageSize.getLength() > 0)) { ADD_TO_DATASET(DcmDecimalString, requestedImageSize) } if (requestedDecimateCropBehavior.getLength() > 0) { ADD_TO_DATASET(DcmCodeString, requestedDecimateCropBehavior) } if (result == EC_Normal) { ditem = new DcmItem(); if (ditem) { dseq = new DcmSequenceOfItems(DCM_ReferencedImageSequence); if (dseq) { delem = new DcmApplicationEntity(retrieveAETitle); if (delem) ditem->insert(delem, OFTrue /*replaceOld*/); else result=EC_MemoryExhausted; delem = new DcmUniqueIdentifier(referencedSOPClassUID); if (delem) ditem->insert(delem, OFTrue /*replaceOld*/); else result=EC_MemoryExhausted; delem = new DcmUniqueIdentifier(referencedSOPInstanceUID); if (delem) ditem->insert(delem, OFTrue /*replaceOld*/); else result=EC_MemoryExhausted; delem = new DcmUniqueIdentifier(studyInstanceUID); if (delem) ditem->insert(delem, OFTrue /*replaceOld*/); else result=EC_MemoryExhausted; delem = new DcmUniqueIdentifier(seriesInstanceUID); if (delem) ditem->insert(delem, OFTrue /*replaceOld*/); else result=EC_MemoryExhausted; if (referencedFrameNumber.getLength() >0) { delem = new DcmIntegerString(referencedFrameNumber); if (delem) ditem->insert(delem, OFTrue /*replaceOld*/); else result=EC_MemoryExhausted; } delem = new DcmLongString(patientID); if (delem) ditem->insert(delem, OFTrue /*replaceOld*/); else result=EC_MemoryExhausted; if (result==EC_Normal) { dseq->insert(ditem); dset.insert(dseq, OFTrue /*replaceOld*/); } else { // out of memory during creation of sequence contents. delete dseq; delete ditem; result = EC_MemoryExhausted; } } else { // could allocate item but not sequence. Bail out. delete ditem; result = EC_MemoryExhausted; } } else result = EC_MemoryExhausted; } if ((EC_Normal == result) && writeReferencedPLUTSQ) result = addReferencedPLUTSQ(dset); return result; } OFCondition DVPSImageBoxContent::addReferencedPLUTSQ(DcmItem &dset) { if (referencedPresentationLUTInstanceUID.getLength() == 0) return EC_Normal; OFCondition result = EC_Normal; DcmElement *delem=NULL; DcmSequenceOfItems *dseq = new DcmSequenceOfItems(DCM_ReferencedPresentationLUTSequence); DcmItem *ditem = new DcmItem(); if (ditem && dseq) { ADD_TO_DATASET2(DcmUniqueIdentifier, referencedPresentationLUTInstanceUID) if (result==EC_Normal) { dseq->insert(ditem); dset.insert(dseq, OFTrue /*replaceOld*/); } else { delete dseq; delete ditem; } } else { delete dseq; delete ditem; result = EC_MemoryExhausted; } return result; } OFCondition DVPSImageBoxContent::prepareBasicImageBox(DcmItem &dset) { OFCondition result = EC_Normal; DcmElement *delem=NULL; ADD_TO_DATASET(DcmUnsignedShort, imageBoxPosition) if (polarity.getLength() > 0) { ADD_TO_DATASET(DcmCodeString, polarity) } if (magnificationType.getLength() > 0) { ADD_TO_DATASET(DcmCodeString, magnificationType) } if (configurationInformation.getLength() > 0) { ADD_TO_DATASET(DcmShortText, configurationInformation) } if (smoothingType.getLength() > 0) { ADD_TO_DATASET(DcmCodeString, smoothingType) } if (requestedImageSize.getLength() > 0) { ADD_TO_DATASET(DcmDecimalString, requestedImageSize) } if (requestedDecimateCropBehavior.getLength() > 0) { ADD_TO_DATASET(DcmCodeString, requestedDecimateCropBehavior) } return result; } OFCondition DVPSImageBoxContent::createDefaultValues(OFBool renumber, unsigned long number, OFBool ignoreEmptyImages) { OFCondition result = EC_Normal; char uid[100]; OFBool isEmpty = OFFalse; SET_UID(sOPInstanceUID) if (renumber) { imageBoxPosition.clear(); result = imageBoxPosition.putUint16((Uint16)number, 0); } else { if (imageBoxPosition.getVM() != 1) isEmpty = OFTrue; if ((!ignoreEmptyImages)&& isEmpty) result = EC_TagNotFound; } if ((EC_Normal == result)&&((! isEmpty)||(! ignoreEmptyImages))) { if (retrieveAETitle.getLength() == 0) result = EC_TagNotFound; if (referencedSOPClassUID.getLength() == 0) result = EC_TagNotFound; if (referencedSOPInstanceUID.getLength() == 0) result = EC_TagNotFound; if (studyInstanceUID.getLength() == 0) result = EC_TagNotFound; if (seriesInstanceUID.getLength() == 0) result = EC_TagNotFound; } return result; } const char *DVPSImageBoxContent::getSOPClassUID() { char *c = NULL; if (EC_Normal == referencedSOPClassUID.getString(c)) return c; else return NULL; } OFCondition DVPSImageBoxContent::setRequestedDecimateCropBehaviour(DVPSDecimateCropBehaviour value) { switch (value) { case DVPSI_decimate: return requestedDecimateCropBehavior.putString("DECIMATE"); /* break; */ case DVPSI_crop: return requestedDecimateCropBehavior.putString("CROP"); /* break; */ case DVPSI_fail: return requestedDecimateCropBehavior.putString("FAIL"); /* break; */ case DVPSI_default: requestedDecimateCropBehavior.clear(); break; } return EC_Normal; } OFCondition DVPSImageBoxContent::getImageReference( const char *&studyUID, const char *&seriesUID, const char *&instanceUID) { OFCondition result=EC_Normal; char *astudyUID = NULL; char *aseriesUID = NULL; char *aninstanceUID = NULL; result = studyInstanceUID.getString(astudyUID); if (EC_Normal == result) result = seriesInstanceUID.getString(aseriesUID); if (EC_Normal == result) result = referencedSOPInstanceUID.getString(aninstanceUID); studyUID = astudyUID; seriesUID = aseriesUID; instanceUID = aninstanceUID; return result; } DVPSDecimateCropBehaviour DVPSImageBoxContent::getRequestedDecimateCropBehaviour() { DVPSDecimateCropBehaviour result = DVPSI_default; char *c = NULL; if ((EC_Normal == requestedDecimateCropBehavior.getString(c))&& c) { OFString aString(c); if (aString == "DECIMATE") result = DVPSI_decimate; else if (aString == "CROP") result = DVPSI_crop; else if (aString == "FAIL") result = DVPSI_fail; } return result; } const char *DVPSImageBoxContent::getPolarity() { char *c = NULL; if (EC_Normal == polarity.getString(c)) return c; else return NULL; } const char *DVPSImageBoxContent::getRequestedImageSize() { char *c = NULL; if (EC_Normal == requestedImageSize.getString(c)) return c; else return NULL; } const char *DVPSImageBoxContent::getMagnificationType() { char *c = NULL; if (EC_Normal == magnificationType.getString(c)) return c; else return NULL; } const char *DVPSImageBoxContent::getSmoothingType() { char *c = NULL; if (EC_Normal == smoothingType.getString(c)) return c; else return NULL; } const char *DVPSImageBoxContent::getConfigurationInformation() { char *c = NULL; if (EC_Normal == configurationInformation.getString(c)) return c; else return NULL; } const char *DVPSImageBoxContent::getReferencedPresentationLUTInstanceUID() { char *c = NULL; if (EC_Normal == referencedPresentationLUTInstanceUID.getString(c)) return c; else return NULL; } OFCondition DVPSImageBoxContent::setPolarity(const char *value) { OFCondition result = EC_IllegalCall; if ((value==NULL)||(strlen(value)==0)) { polarity.clear(); result = EC_Normal; } else { if ((result = polarity.putString(value)) == EC_Normal) { OFString str; if ((result = polarity.getOFString(str, 0, OFTrue)) == EC_Normal) { if ((str == "NORMAL") || (str == "REVERSE")) result = EC_Normal; } } } return result; } OFCondition DVPSImageBoxContent::setRequestedImageSize(const char *value) { if ((value==NULL)||(strlen(value)==0)) { requestedImageSize.clear(); return EC_Normal; } return requestedImageSize.putString(value); } OFCondition DVPSImageBoxContent::setMagnificationType(const char *value) { if ((value==NULL)||(strlen(value)==0)) { magnificationType.clear(); return EC_Normal; } return magnificationType.putString(value); } OFCondition DVPSImageBoxContent::setSmoothingType(const char *value) { if ((value==NULL)||(strlen(value)==0)) { smoothingType.clear(); return EC_Normal; } return smoothingType.putString(value); } OFCondition DVPSImageBoxContent::setConfigurationInformation(const char *value) { if ((value==NULL)||(strlen(value)==0)) { configurationInformation.clear(); return EC_Normal; } return configurationInformation.putString(value); } OFCondition DVPSImageBoxContent::setSOPInstanceUID(const char *value) { if ((value==NULL)||(strlen(value)==0)) return EC_IllegalCall; return sOPInstanceUID.putString(value); } const char *DVPSImageBoxContent::getSOPInstanceUID() { char *c = NULL; if (EC_Normal == sOPInstanceUID.getString(c)) return c; else return NULL; } OFCondition DVPSImageBoxContent::setDefault() { magnificationType.clear(); smoothingType.clear(); configurationInformation.clear(); return EC_Normal; } OFBool DVPSImageBoxContent::hasAdditionalSettings() { if (magnificationType.getLength() > 0) return OFTrue; if (smoothingType.getLength() > 0) return OFTrue; if (configurationInformation.getLength() > 0) return OFTrue; return OFFalse; } OFBool DVPSImageBoxContent::matchesPresentationLUT(DVPSPrintPresentationLUTAlignment align) const { OFBool result = OFFalse; switch (align) { case DVPSK_shape: // always matches result = OFTrue; break; case DVPSK_table8: if (imageDepth != DVPSN_12bit) result = OFTrue; break; case DVPSK_table12: if (imageDepth != DVPSN_8bit) result = OFTrue; break; case DVPSK_other: // never matches break; } return result; } OFBool DVPSImageBoxContent::printSCPSet( DVConfiguration& cfg, const char *cfgname, DcmDataset *rqDataset, T_DIMSE_Message& rsp, DcmDataset *& rspDataset, DcmDataset &imageDataset, DVPSPrintPresentationLUTAlignment align, OFBool presentationLUTnegotiated) { OFBool result = OFTrue; DcmStack stack; OFCondition writeresult = EC_Normal; DcmElement *delem = NULL; rspDataset = new DcmDataset; if ((rqDataset == NULL)||(rspDataset == NULL)) { rsp.msg.NSetRSP.DimseStatus = STATUS_N_ProcessingFailure; result = OFFalse; } // image(Box)Position if (result) { stack.clear(); if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)imageBoxPosition.getTag(), stack, ESM_fromHere, OFFalse))) { imageBoxPosition = *((DcmUnsignedShort *)(stack.top())); // the image box position is checked elsewhere ADD_TO_PDATASET(DcmUnsignedShort, imageBoxPosition) } else { DCMPSTAT_INFO("cannot update Basic Grayscale Image Box: attribute (2020,0010) Image Position missing."); rsp.msg.NSetRSP.DimseStatus = STATUS_N_MissingAttribute; result = OFFalse; } } // magnificationType if (result) { stack.clear(); if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)magnificationType.getTag(), stack, ESM_fromHere, OFFalse))) { magnificationType = *((DcmCodeString *)(stack.top())); Uint32 numMagnifications = cfg.getTargetPrinterNumberOfMagnificationTypes(cfgname); OFString theMagnification; OFString aString; OFBool found = OFFalse; magnificationType.getOFString(theMagnification, 0, OFTrue); for (Uint32 i=0; isearch((DcmTagKey &)smoothingType.getTag(), stack, ESM_fromHere, OFFalse))) { smoothingType = *((DcmCodeString *)(stack.top())); Uint32 numSmoothings = cfg.getTargetPrinterNumberOfSmoothingTypes(cfgname); OFString theSmoothing; OFString aString; OFBool found = OFFalse; smoothingType.getOFString(theSmoothing, 0, OFTrue); for (Uint32 i=0; isearch((DcmTagKey &)configurationInformation.getTag(), stack, ESM_fromHere, OFFalse))) { configurationInformation = *((DcmShortText *)(stack.top())); Uint32 numConfigurationInformation = cfg.getTargetPrinterNumberOfConfigurationSettings(cfgname); if (numConfigurationInformation == 0) // we don't support configuration information { DCMPSTAT_INFO("cannot update Basic Grayscale Image Box: configuration information requested but not supported."); rsp.msg.NSetRSP.DimseStatus = STATUS_N_NoSuchAttribute; result = OFFalse; } else { OFString theConfiguration; OFBool found = OFFalse; configurationInformation.getOFString(theConfiguration, 0, OFTrue); for (Uint32 i=0; isearch((DcmTagKey &)polarity.getTag(), stack, ESM_fromHere, OFFalse))) { polarity = *((DcmCodeString *)(stack.top())); OFString thePolarity; polarity.getOFString(thePolarity, 0, OFTrue); if ((thePolarity != "NORMAL")&&(thePolarity != "REVERSE")) { DCMPSTAT_INFO("cannot update Basic Grayscale Image Box: illegal polarity: '" << thePolarity.c_str() << "'"); rsp.msg.NSetRSP.DimseStatus = STATUS_N_InvalidAttributeValue; result = OFFalse; } else { ADD_TO_PDATASET(DcmCodeString, polarity) } } } // requestedImageSize if (result) { stack.clear(); if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)requestedImageSize.getTag(), stack, ESM_fromHere, OFFalse))) { if (! cfg.getTargetPrinterSupportsRequestedImageSize(cfgname)) { DCMPSTAT_INFO("cannot update Basic Grayscale Image Box: requested image size not supported."); rsp.msg.NSetRSP.DimseStatus = STATUS_N_NoSuchAttribute; result = OFFalse; } else { requestedImageSize = *((DcmDecimalString *)(stack.top())); // we don't check a requested image size set by the user (for now) ADD_TO_PDATASET(DcmDecimalString, requestedImageSize) } } } // requestedDecimateCropBehavior if (result) { stack.clear(); if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)requestedDecimateCropBehavior.getTag(), stack, ESM_fromHere, OFFalse))) { if (! cfg.getTargetPrinterSupportsDecimateCrop(cfgname)) { DCMPSTAT_INFO("cannot update Basic Grayscale Image Box: requested decimate/crop behaviour not supported."); rsp.msg.NSetRSP.DimseStatus = STATUS_N_NoSuchAttribute; result = OFFalse; } else { requestedDecimateCropBehavior = *((DcmCodeString *)(stack.top())); OFString theBehaviour; requestedDecimateCropBehavior.getOFString(theBehaviour, 0, OFTrue); if ((theBehaviour != "DECIMATE")&&(theBehaviour != "CROP")&&(theBehaviour != "FAIL")) { DCMPSTAT_INFO("cannot update Basic Grayscale Image Box: illegal decimate/crop behaviour: '" << theBehaviour.c_str() << "'"); rsp.msg.NSetRSP.DimseStatus = STATUS_N_InvalidAttributeValue; result = OFFalse; } else { ADD_TO_PDATASET(DcmCodeString, requestedDecimateCropBehavior) } } } } // basicGrayscaleImageSequence if (result) { stack.clear(); if (rqDataset && (EC_Normal == rqDataset->search(DCM_BasicGrayscaleImageSequence, stack, ESM_fromHere, OFFalse))) { DcmSequenceOfItems *seq=(DcmSequenceOfItems *)stack.top(); if (seq->card() ==1) { DcmItem *item = seq->getItem(0); result = printSCPEvaluateBasicGrayscaleImageSequence(cfg, cfgname, item, rsp, imageDataset, align, presentationLUTnegotiated); } else { DCMPSTAT_INFO("cannot update Basic Grayscale Image Box: basic grayscale image sequence number of items != 1"); rsp.msg.NSetRSP.DimseStatus = STATUS_N_InvalidAttributeValue; result = OFFalse; } } else { DCMPSTAT_INFO("cannot update Basic Grayscale Image Box: basic grayscale image sequence missing."); rsp.msg.NSetRSP.DimseStatus = STATUS_N_MissingAttribute; result = OFFalse; } } // browse through rqDataset and check for unsupported attributes if (result && rqDataset) { OFBool intoSub = OFTrue; stack.clear(); while (EC_Normal == rqDataset->nextObject(stack, intoSub)) { intoSub = OFFalse; const DcmTagKey& currentTag = (stack.top())->getTag(); if (currentTag.getElement() == 0x0000) /* group length */ ; else if (currentTag == DCM_ImageBoxPosition) /* OK */ ; else if (currentTag == DCM_Polarity) /* OK */ ; else if (currentTag == DCM_RequestedDecimateCropBehavior) /* OK */ ; else if (currentTag == DCM_RequestedImageSize) /* OK */ ; else if (currentTag == DCM_MagnificationType) /* OK */ ; else if (currentTag == DCM_SmoothingType) /* OK */ ; else if (currentTag == DCM_ConfigurationInformation) /* OK */ ; else if (currentTag == DCM_BasicGrayscaleImageSequence) /* OK */ ; else { DCMPSTAT_INFO("cannot update Basic Grayscale Image Box: unsupported attribute received:\n" << DcmObject::PrintHelper(*stack.top(), DCMTypes::PF_shortenLongTagValues)); rsp.msg.NSetRSP.DimseStatus = STATUS_N_NoSuchAttribute; result = OFFalse; } } } // if n-set was successful, send back response dataset if (result && (EC_Normal == writeresult)) { rsp.msg.NSetRSP.DataSetType = DIMSE_DATASET_PRESENT; } else { delete rspDataset; rspDataset = NULL; if (rsp.msg.NSetRSP.DimseStatus == 0) rsp.msg.NSetRSP.DimseStatus = STATUS_N_ProcessingFailure; result = OFFalse; } return result; } OFBool DVPSImageBoxContent::printSCPEvaluateBasicGrayscaleImageSequence( DVConfiguration& cfg, const char *cfgname, DcmItem *rqDataset, T_DIMSE_Message& rsp, DcmDataset &imageDataset, DVPSPrintPresentationLUTAlignment align, OFBool presentationLUTnegotiated) { OFBool result = OFTrue; DcmStack stack; OFCondition writeresult = EC_Normal; DcmElement *delem = NULL; DcmDataset *rspDataset = &imageDataset; if (rqDataset == NULL) { rsp.msg.NSetRSP.DimseStatus = STATUS_N_ProcessingFailure; result = OFFalse; } DcmUnsignedShort samplesPerPixel(DCM_SamplesPerPixel); DcmCodeString photometricInterpretation(DCM_PhotometricInterpretation); DcmUnsignedShort rows(DCM_Rows); DcmUnsignedShort columns(DCM_Columns); DcmIntegerString pixelAspectRatio(DCM_PixelAspectRatio); DcmUnsignedShort bitsAllocated(DCM_BitsAllocated); DcmUnsignedShort bitsStored(DCM_BitsStored); DcmUnsignedShort highBit(DCM_HighBit); DcmUnsignedShort pixelRepresentation(DCM_PixelRepresentation); DcmPixelData *pixelData = NULL; Uint16 val=0; char newuid[70]; OFString aString; // samplesPerPixel if (result) { stack.clear(); if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)samplesPerPixel.getTag(), stack, ESM_fromHere, OFFalse))) { samplesPerPixel = *((DcmUnsignedShort *)(stack.top())); val = 0; if ((EC_Normal == samplesPerPixel.getUint16(val,0)) && (val == 1)) { ADD_TO_PDATASET(DcmUnsignedShort, samplesPerPixel) } else { DCMPSTAT_INFO("cannot update Basic Grayscale Image Box: illegal samples per pixel value: " << val); rsp.msg.NSetRSP.DimseStatus = STATUS_N_InvalidAttributeValue; result = OFFalse; } } else { DCMPSTAT_INFO("cannot update Basic Grayscale Image Box: samples per pixel missing in basic grayscale image sequence"); rsp.msg.NSetRSP.DimseStatus = STATUS_N_MissingAttribute; result = OFFalse; } } // rows if (result) { stack.clear(); if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)rows.getTag(), stack, ESM_fromHere, OFFalse))) { rows = *((DcmUnsignedShort *)(stack.top())); val = 0; if ((EC_Normal == rows.getUint16(val,0)) && (val > 0)) { ADD_TO_PDATASET(DcmUnsignedShort, rows) } else { DCMPSTAT_INFO("cannot update Basic Grayscale Image Box: illegal rows value: " << val); rsp.msg.NSetRSP.DimseStatus = STATUS_N_InvalidAttributeValue; result = OFFalse; } } else { DCMPSTAT_INFO("cannot update Basic Grayscale Image Box: rows missing in basic grayscale image sequence"); rsp.msg.NSetRSP.DimseStatus = STATUS_N_MissingAttribute; result = OFFalse; } } // columns if (result) { stack.clear(); if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)columns.getTag(), stack, ESM_fromHere, OFFalse))) { columns = *((DcmUnsignedShort *)(stack.top())); val = 0; if ((EC_Normal == columns.getUint16(val,0)) && (val > 0)) { ADD_TO_PDATASET(DcmUnsignedShort, columns) } else { DCMPSTAT_INFO("cannot update Basic Grayscale Image Box: illegal columns value: " << val); rsp.msg.NSetRSP.DimseStatus = STATUS_N_InvalidAttributeValue; result = OFFalse; } } else { DCMPSTAT_INFO("cannot update Basic Grayscale Image Box: columns missing in basic grayscale image sequence"); rsp.msg.NSetRSP.DimseStatus = STATUS_N_MissingAttribute; result = OFFalse; } } Uint16 bitsStoredValue = 0; // bitsStored if (result) { stack.clear(); if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)bitsStored.getTag(), stack, ESM_fromHere, OFFalse))) { bitsStored = *((DcmUnsignedShort *)(stack.top())); val = 0; if ((EC_Normal == bitsStored.getUint16(val,0)) && ((val == 8) || (val == 12))) { bitsStoredValue = val; if (bitsStoredValue==8) imageDepth = DVPSN_8bit; else imageDepth = DVPSN_12bit; OFBool supports12Bit = cfg.getTargetPrinterSupports12BitTransmission(cfgname); if ((bitsStoredValue == 12)&&(! supports12Bit)) { DCMPSTAT_INFO("cannot update Basic Grayscale Image Box: image transmission with 12 bits/pixel not supported."); rsp.msg.NSetRSP.DimseStatus = STATUS_N_InvalidAttributeValue; result = OFFalse; } else { if (presentationLUTnegotiated && (cfg.getTargetPrinterPresentationLUTMatchRequired(cfgname)) && (! matchesPresentationLUT(align))) { DCMPSTAT_INFO("cannot update Basic Grayscale Image Box: image data with " << bitsStoredValue << " bits/pixel does not match characteristics of active Presentation LUT."); rsp.msg.NSetRSP.DimseStatus = STATUS_N_InvalidAttributeValue; result = OFFalse; } else { ADD_TO_PDATASET(DcmUnsignedShort, bitsStored) } } } else { DCMPSTAT_INFO("cannot update Basic Grayscale Image Box: illegal bits stored value: " << val); rsp.msg.NSetRSP.DimseStatus = STATUS_N_InvalidAttributeValue; result = OFFalse; } } else { DCMPSTAT_INFO("cannot update Basic Grayscale Image Box: bits stored missing in basic grayscale image sequence"); rsp.msg.NSetRSP.DimseStatus = STATUS_N_MissingAttribute; result = OFFalse; } } // bitsAllocated if (result) { stack.clear(); if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)bitsAllocated.getTag(), stack, ESM_fromHere, OFFalse))) { bitsAllocated = *((DcmUnsignedShort *)(stack.top())); val = 0; if ((EC_Normal == bitsAllocated.getUint16(val,0)) && (((val == 8)&&(bitsStoredValue == 8)) || ((val == 16)&&(bitsStoredValue == 12)))) { ADD_TO_PDATASET(DcmUnsignedShort, bitsAllocated) } else { DCMPSTAT_INFO("cannot update Basic Grayscale Image Box: illegal bits allocated value: " << val); rsp.msg.NSetRSP.DimseStatus = STATUS_N_InvalidAttributeValue; result = OFFalse; } } else { DCMPSTAT_INFO("cannot update Basic Grayscale Image Box: bits allocated missing in basic grayscale image sequence"); rsp.msg.NSetRSP.DimseStatus = STATUS_N_MissingAttribute; result = OFFalse; } } // highBit if (result) { stack.clear(); if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)highBit.getTag(), stack, ESM_fromHere, OFFalse))) { highBit = *((DcmUnsignedShort *)(stack.top())); val = 0; if ((EC_Normal == highBit.getUint16(val,0)) && (((val == 7)&&(bitsStoredValue == 8)) || ((val == 11)&&(bitsStoredValue == 12)))) { ADD_TO_PDATASET(DcmUnsignedShort, highBit) } else { DCMPSTAT_INFO("cannot update Basic Grayscale Image Box: illegal high bit value: " << val); rsp.msg.NSetRSP.DimseStatus = STATUS_N_InvalidAttributeValue; result = OFFalse; } } else { DCMPSTAT_INFO("cannot update Basic Grayscale Image Box: high bit missing in basic grayscale image sequence"); rsp.msg.NSetRSP.DimseStatus = STATUS_N_MissingAttribute; result = OFFalse; } } // pixelRepresentation if (result) { stack.clear(); if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)pixelRepresentation.getTag(), stack, ESM_fromHere, OFFalse))) { pixelRepresentation = *((DcmUnsignedShort *)(stack.top())); val = 0; if ((EC_Normal == pixelRepresentation.getUint16(val,0)) && (val == 0)) { ADD_TO_PDATASET(DcmUnsignedShort, pixelRepresentation) } else { DCMPSTAT_INFO("cannot update Basic Grayscale Image Box: illegal pixel representation value: " << val); rsp.msg.NSetRSP.DimseStatus = STATUS_N_InvalidAttributeValue; result = OFFalse; } } else { DCMPSTAT_INFO("cannot update Basic Grayscale Image Box: pixel representation missing in basic grayscale image sequence"); rsp.msg.NSetRSP.DimseStatus = STATUS_N_MissingAttribute; result = OFFalse; } } // photometricInterpretation if (result) { stack.clear(); if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)photometricInterpretation.getTag(), stack, ESM_fromHere, OFFalse))) { photometricInterpretation = *((DcmCodeString *)(stack.top())); OFString theColorModel; photometricInterpretation.getOFString(theColorModel, 0, OFTrue); if ((theColorModel != "MONOCHROME1")&&(theColorModel != "MONOCHROME2")) { DCMPSTAT_INFO("cannot update Basic Grayscale Image Box: illegal photometric interpretation: '" << theColorModel.c_str() << "'"); rsp.msg.NSetRSP.DimseStatus = STATUS_N_InvalidAttributeValue; result = OFFalse; } else { ADD_TO_PDATASET(DcmCodeString, photometricInterpretation) } } else { DCMPSTAT_INFO("cannot update Basic Grayscale Image Box: photometric interpretation missing in basic grayscale image sequence"); rsp.msg.NSetRSP.DimseStatus = STATUS_N_MissingAttribute; result = OFFalse; } } // pixelAspectRatio if (result) { stack.clear(); if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)pixelAspectRatio.getTag(), stack, ESM_fromHere, OFFalse))) { pixelAspectRatio = *((DcmIntegerString *)(stack.top())); if (pixelAspectRatio.getVM() != 2) { DCMPSTAT_INFO("cannot update Basic Grayscale Image Box: illegal pixel aspect ratio, VM=: '" << pixelAspectRatio.getVM()); rsp.msg.NSetRSP.DimseStatus = STATUS_N_InvalidAttributeValue; result = OFFalse; } else { ADD_TO_PDATASET(DcmIntegerString, pixelAspectRatio) } } } // pixelData if (result) { stack.clear(); if (rqDataset && (EC_Normal == rqDataset->search(DCM_PixelData, stack, ESM_fromHere, OFFalse))) { pixelData = new DcmPixelData(DCM_PixelData); if (pixelData) { DcmElement *oldPxData = (DcmElement *)(stack.top()); Uint16 *pxdata16 = NULL; Uint8 *pxdata8 = NULL; if ((EC_Normal == oldPxData->getUint16Array(pxdata16)) && pxdata16) { pixelData->putUint16Array(pxdata16, oldPxData->getLength()/sizeof(Uint16)); rspDataset->insert(pixelData, OFTrue /*replaceOld*/); } else if ((EC_Normal == oldPxData->getUint8Array(pxdata8)) && pxdata8) { pixelData->putUint8Array(pxdata8, oldPxData->getLength()/sizeof(Uint8)); rspDataset->insert(pixelData, OFTrue /*replaceOld*/); } else { DCMPSTAT_INFO("cannot update Basic Grayscale Image Box: cannot access pixel data"); rsp.msg.NSetRSP.DimseStatus = STATUS_N_ProcessingFailure; result = OFFalse; } } else writeresult=EC_MemoryExhausted; } else { DCMPSTAT_INFO("cannot update Basic Grayscale Image Box: pixel data missing in basic grayscale image sequence"); rsp.msg.NSetRSP.DimseStatus = STATUS_N_MissingAttribute; result = OFFalse; } } // browse through rqDataset and check for unsupported attributes if (result && rqDataset) { OFBool intoSub = OFTrue; stack.clear(); while (EC_Normal == rqDataset->nextObject(stack, intoSub)) { intoSub = OFFalse; const DcmTagKey& currentTag = (stack.top())->getTag(); if (currentTag.getElement() == 0x0000) /* group length */ ; else if (currentTag == DCM_SamplesPerPixel) /* OK */ ; else if (currentTag == DCM_PhotometricInterpretation) /* OK */ ; else if (currentTag == DCM_Rows) /* OK */ ; else if (currentTag == DCM_Columns) /* OK */ ; else if (currentTag == DCM_PixelAspectRatio) /* OK */ ; else if (currentTag == DCM_BitsAllocated) /* OK */ ; else if (currentTag == DCM_BitsStored) /* OK */ ; else if (currentTag == DCM_HighBit) /* OK */ ; else if (currentTag == DCM_PixelRepresentation) /* OK */ ; else if (currentTag == DCM_PixelData) /* OK */ ; else { DCMPSTAT_INFO("cannot update Basic Grayscale Image Box: unsupported attribute in basic grayscale image sequence:\n" << DcmObject::PrintHelper(*stack.top(), DCMTypes::PF_shortenLongTagValues)); rsp.msg.NSetRSP.DimseStatus = STATUS_N_NoSuchAttribute; result = OFFalse; } } } // if n-set was successful, send back response dataset if (result && (EC_Normal == writeresult)) { // complete Hardcopy Grayscale Image // write patient module if (EC_Normal==writeresult) writeresult = DVPSHelper::putStringValue(rspDataset, DCM_PatientName, DEFAULT_patientName); if (EC_Normal==writeresult) writeresult = DVPSHelper::putStringValue(rspDataset, DCM_PatientID); if (EC_Normal==writeresult) writeresult = DVPSHelper::putStringValue(rspDataset, DCM_PatientBirthDate); if (EC_Normal==writeresult) writeresult = DVPSHelper::putStringValue(rspDataset, DCM_PatientSex); // general study and general series modules are written somewhere else // Hardcopy Equipment Module if (EC_Normal==writeresult) writeresult = DVPSHelper::putStringValue(rspDataset, DCM_RETIRED_HardcopyDeviceManufacturer, "OFFIS"); if (EC_Normal==writeresult) writeresult = DVPSHelper::putStringValue(rspDataset, DCM_RETIRED_HardcopyDeviceSoftwareVersion, OFFIS_DTK_IMPLEMENTATION_VERSION_NAME); // General Image Module if (EC_Normal==writeresult) writeresult = DVPSHelper::putStringValue(rspDataset, DCM_InstanceNumber); if (EC_Normal==writeresult) writeresult = DVPSHelper::putStringValue(rspDataset, DCM_PatientOrientation); if (EC_Normal==writeresult) writeresult = DVPSHelper::putStringValue(rspDataset, DCM_ImageType, "DERIVED\\SECONDARY"); if (EC_Normal==writeresult) writeresult = DVPSHelper::putStringValue(rspDataset, DCM_DerivationDescription, "Hardcopy"); // SOP Common Module if (EC_Normal==writeresult) writeresult = DVPSHelper::putStringValue(rspDataset, DCM_SOPClassUID, UID_RETIRED_HardcopyGrayscaleImageStorage); if (EC_Normal==writeresult) writeresult = referencedSOPClassUID.putString(UID_RETIRED_HardcopyGrayscaleImageStorage); dcmGenerateUniqueIdentifier(newuid); if (EC_Normal==writeresult) writeresult = DVPSHelper::putStringValue(rspDataset, DCM_SOPInstanceUID, newuid); if (EC_Normal==writeresult) writeresult = referencedSOPInstanceUID.putString(newuid); DVPSHelper::currentDate(aString); if (EC_Normal==writeresult) writeresult = DVPSHelper::putStringValue(rspDataset, DCM_InstanceCreationDate, aString.c_str()); DVPSHelper::currentTime(aString); if (EC_Normal==writeresult) writeresult = DVPSHelper::putStringValue(rspDataset, DCM_InstanceCreationTime, aString.c_str()); } else result = OFFalse; return result; } Uint16 DVPSImageBoxContent::getImageBoxPosition() { Uint16 result = 0; if (EC_Normal == imageBoxPosition.getUint16(result, 0)) return result; else return 0; } OFCondition DVPSImageBoxContent::setUIDsAndAETitle(DcmUniqueIdentifier& studyUID, DcmUniqueIdentifier& seriesUID, const char *aetitle) { if (aetitle==NULL) return EC_IllegalCall; studyInstanceUID = studyUID; seriesInstanceUID = seriesUID; return retrieveAETitle.putString(aetitle); } /* * $Log: dvpsib.cc,v $ * Revision 1.40 2010-10-14 13:14:32 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.39 2010-09-24 13:32:58 joergr * Compared names of SOP Class UIDs with 2009 edition of the DICOM standard. The * resulting name changes are mainly caused by the fact that the corresponding * SOP Class is now retired. * * Revision 1.38 2010-08-09 13:21:56 joergr * Updated data dictionary to 2009 edition of the DICOM standard. From now on, * the official "keyword" is used for the attribute name which results in a * number of minor changes (e.g. "PatientsName" is now called "PatientName"). * * Revision 1.37 2009-11-24 14:12:58 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.36 2008-04-30 12:38:43 meichel * Fixed compile errors due to changes in attribute tag names * * Revision 1.35 2007/10/31 14:16:40 meichel * Fixed bug in DICOMscope support code that caused the Print SCU to send * wrong values for Decimate/Crop Behavior. * * Revision 1.34 2006/08/15 16:57:02 meichel * Updated the code in module dcmpstat to correctly compile when * all standard C++ classes remain in namespace std. * * Revision 1.33 2005/12/08 15:46:33 meichel * Changed include path schema for all DCMTK header files * * Revision 1.32 2003/06/04 12:30:28 meichel * Added various includes needed by MSVC5 with STL * * Revision 1.31 2003/03/12 17:34:22 meichel * Updated DcmObject::print() flags * * Revision 1.30 2002/06/20 12:19:49 meichel * Adapted toolkit to name changes in latest data dictionary * * Revision 1.29 2002/01/08 10:35:45 joergr * Corrected spelling of function dcmGenerateUniqueIdentifier(). * * Revision 1.28 2001/11/28 13:56:56 joergr * Check return value of DcmItem::insert() statements where appropriate to * avoid memory leaks when insert procedure fails. * * Revision 1.27 2001/09/26 15:36:27 meichel * Adapted dcmpstat to class OFCondition * * Revision 1.26 2001/06/07 14:31:34 joergr * Removed unused variable (reported by gcc 2.5.8 on NeXTSTEP). * * Revision 1.25 2001/06/01 15:50:32 meichel * Updated copyright header * * Revision 1.24 2001/05/25 10:07:57 meichel * Corrected some DIMSE error status codes for Print SCP * * Revision 1.23 2000/09/06 08:55:37 meichel * Updated Print SCP to accept and silently ignore group length attributes. * * Revision 1.22 2000/07/04 16:06:47 joergr * Added support for overriding the presentation LUT settings made for the * image boxes. * * Revision 1.21 2000/06/14 11:28:59 joergr * Added methods to access the attributes Polarity and Requested Image Size. * * Revision 1.20 2000/06/08 10:44:35 meichel * Implemented Referenced Presentation LUT Sequence on Basic Film Session level. * Empty film boxes (pages) are not written to file anymore. * * Revision 1.19 2000/06/07 14:26:45 joergr * Added methods to access the image polarity attribute. * * Revision 1.18 2000/06/07 13:17:06 meichel * now using DIMSE status constants and log facilities defined in dcmnet * * Revision 1.17 2000/06/02 16:01:02 meichel * Adapted all dcmpstat classes to use OFConsole for log and error output * * Revision 1.16 2000/05/31 12:58:15 meichel * Added initial Print SCP support * * Revision 1.15 2000/03/08 16:29:06 meichel * Updated copyright header. * * Revision 1.14 2000/03/03 14:14:00 meichel * Implemented library support for redirecting error messages into memory * instead of printing them to stdout/stderr for GUI applications. * * Revision 1.13 2000/02/03 11:48:27 meichel * Rebuilt data dictionary based on 1999 standard text, * latest supplements and CP packet 6. * * Revision 1.12 1999/10/07 17:21:58 meichel * Reworked management of Presentation LUTs in order to create tighter * coupling between Softcopy and Print. * * Revision 1.11 1999/09/24 15:24:06 meichel * Print spooler (dcmprtsv) now logs diagnostic messages in log files * when operating in spool mode. * * Revision 1.10 1999/09/17 14:33:51 meichel * Completed print spool functionality including Supplement 22 support * * Revision 1.9 1999/09/15 17:43:33 meichel * Implemented print job dispatcher code for dcmpstat, adapted dcmprtsv * and dcmpsprt applications. * * Revision 1.8 1999/09/10 12:46:55 meichel * Added implementations for a number of print API methods. * * Revision 1.7 1999/09/09 14:57:50 thiel * Added methods for print spooler * * Revision 1.6 1999/09/08 16:46:14 meichel * Fixed sequence tag used for writing image box references in Stored Print objects. * * Revision 1.5 1999/09/01 16:15:08 meichel * Added support for requested image size to print routines * * Revision 1.4 1999/08/31 14:09:26 meichel * Added get/set methods for stored print attributes * * Revision 1.3 1999/08/27 15:57:49 meichel * Added methods for saving hardcopy images and stored print objects * either in file or in the local database. * * Revision 1.2 1999/08/26 09:29:48 thiel * Extensions for the usage of the StoredPrint * * Revision 1.1 1999/07/30 13:34:56 meichel * Added new classes managing Stored Print objects * * */ dcmtk-3.6.0/dcmpstat/libsrc/dvpsri.cc0000644000310500011400000002301411455601070016751 0ustar joergrdicom3/* * * Copyright (C) 1998-2010, 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: DVPSReferencedImage * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:14:32 $ * CVS/RCS Revision: $Revision: 1.20 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcdeftag.h" #include "dcmtk/dcmdata/dcitem.h" #include "dcmtk/dcmpstat/dvpsri.h" #include "dcmtk/dcmpstat/dvpsdef.h" /* for constants and macros */ #define INCLUDE_CSTDIO #include "dcmtk/ofstd/ofstdinc.h" /* --------------- class DVPSReferencedImage --------------- */ DVPSReferencedImage::DVPSReferencedImage() : referencedSOPClassUID(DCM_ReferencedSOPClassUID) , referencedSOPInstanceUID(DCM_ReferencedSOPInstanceUID) , referencedFrameNumber(DCM_ReferencedFrameNumber) , frameCache(NULL) , frameCacheEntries(0) { } DVPSReferencedImage::DVPSReferencedImage(const DVPSReferencedImage& copy) : referencedSOPClassUID(copy.referencedSOPClassUID) , referencedSOPInstanceUID(copy.referencedSOPInstanceUID) , referencedFrameNumber(copy.referencedFrameNumber) , frameCache(NULL) // we don't copy the frame cache , frameCacheEntries(0) { } DVPSReferencedImage::~DVPSReferencedImage() { if (frameCache) delete[] frameCache; } OFCondition DVPSReferencedImage::read(DcmItem &dset) { OFCondition result = EC_Normal; DcmStack stack; flushCache(); READ_FROM_DATASET(DcmUniqueIdentifier, referencedSOPClassUID) READ_FROM_DATASET(DcmUniqueIdentifier, referencedSOPInstanceUID) READ_FROM_DATASET(DcmIntegerString, referencedFrameNumber) /* Now perform basic sanity checks */ if (referencedSOPClassUID.getLength() == 0) { result=EC_IllegalCall; DCMPSTAT_INFO("presentation state contains a referenced image SQ item with referencedSOPClassUID absent or empty"); } else if (referencedSOPClassUID.getVM() != 1) { result=EC_IllegalCall; DCMPSTAT_INFO("presentation state contains a referenced image SQ item with referencedSOPClassUID VM != 1"); } if (referencedSOPInstanceUID.getLength() == 0) { result=EC_IllegalCall; DCMPSTAT_INFO("presentation state contains a referenced image SQ item with referencedSOPInstanceUID absent or empty"); } else if (referencedSOPInstanceUID.getVM() != 1) { result=EC_IllegalCall; DCMPSTAT_INFO("presentation state contains a referenced image SQ item with referencedSOPInstanceUID VM != 1"); } return result; } OFCondition DVPSReferencedImage::write(DcmItem &dset) { OFCondition result = EC_Normal; DcmElement *delem=NULL; ADD_TO_DATASET(DcmUniqueIdentifier, referencedSOPClassUID) ADD_TO_DATASET(DcmUniqueIdentifier, referencedSOPInstanceUID) if (referencedFrameNumber.getLength() >0) { ADD_TO_DATASET(DcmIntegerString, referencedFrameNumber) } return result; } OFBool DVPSReferencedImage::validateSOPClassUID(OFString& sopclassuid) { OFBool result = OFTrue; if (sopclassuid.length() == 0) referencedSOPClassUID.getOFString(sopclassuid, 0); else { OFString currentUID; referencedSOPClassUID.getOFString(currentUID, 0); if (currentUID != sopclassuid) { result = OFFalse; DCMPSTAT_INFO("images of different SOP classes referenced in presentation state"); } } return result; } void DVPSReferencedImage::setSOPClassUID(const char *uid) { if (uid) referencedSOPClassUID.putString(uid); else referencedSOPClassUID.clear(); return; } void DVPSReferencedImage::setSOPInstanceUID(const char *uid) { if (uid) referencedSOPInstanceUID.putString(uid); else referencedSOPInstanceUID.clear(); return; } void DVPSReferencedImage::setFrameNumbers(const char *frames) { if (frames) referencedFrameNumber.putString(frames); else referencedFrameNumber.clear(); flushCache(); return; } OFBool DVPSReferencedImage::isSOPInstanceUID(const char *uid) { OFString aString; if (uid && (EC_Normal == referencedSOPInstanceUID.getOFString(aString,0))) { if (aString == uid) return OFTrue; } return OFFalse; } OFCondition DVPSReferencedImage::getImageReference( OFString& sopclassUID, OFString& instanceUID, OFString& frames) { OFCondition result = referencedSOPClassUID.getOFString(sopclassUID,0); if (EC_Normal == result) result = referencedSOPInstanceUID.getOFString(instanceUID,0); if (EC_Normal == result) result = referencedFrameNumber.getOFStringArray(frames); return result; } void DVPSReferencedImage::flushCache() { if (frameCache) delete[] frameCache; frameCache = NULL; frameCacheEntries = 0; } OFBool DVPSReferencedImage::appliesToAllFrames() { if (referencedFrameNumber.getLength() == 0) return OFTrue; if (referencedFrameNumber.getVM() == 0) return OFTrue; return OFFalse; } void DVPSReferencedImage::updateCache() { Sint32 val=0; unsigned long i; if (frameCache==NULL) { frameCacheEntries = (Uint32) referencedFrameNumber.getVM(); if (frameCacheEntries > 0) { frameCache = new Sint32[frameCacheEntries]; if (frameCache) { for (i=0; i1) { result=EC_IllegalCall; DCMPSTAT_INFO("presentation state contains a graphic layer SQ item with graphicLayerRecommendedDisplayGrayscaleValue VM != 1"); } if ((graphicLayerRecommendedDisplayRGBValue.getVM()>0)&&(graphicLayerRecommendedDisplayRGBValue.getVM() != 3)) { result=EC_IllegalCall; DCMPSTAT_INFO("presentation state contains a graphic layer SQ item with graphicLayerRecommendedDisplayRGBValue VM != 3"); } if (graphicLayerDescription.getVM() > 1) { result=EC_IllegalCall; DCMPSTAT_INFO("presentation state contains a graphic layer SQ item with graphicLayerDescription VM > 1"); } return result; } OFCondition DVPSGraphicLayer::write(DcmItem &dset) { OFCondition result = EC_Normal; DcmElement *delem=NULL; ADD_TO_DATASET(DcmCodeString, graphicLayer) ADD_TO_DATASET(DcmIntegerString, graphicLayerOrder) if (graphicLayerRecommendedDisplayGrayscaleValue.getLength() >0) { ADD_TO_DATASET(DcmUnsignedShort, graphicLayerRecommendedDisplayGrayscaleValue) } if (graphicLayerRecommendedDisplayRGBValue.getLength() >0) { ADD_TO_DATASET(DcmUnsignedShort, graphicLayerRecommendedDisplayRGBValue) } if (graphicLayerDescription.getLength() >0) { ADD_TO_DATASET(DcmLongString, graphicLayerDescription) } return result; } const char *DVPSGraphicLayer::getGL() { char *c = NULL; if (EC_Normal == graphicLayer.getString(c)) return c; else return NULL; } const char *DVPSGraphicLayer::getGLDescription() { char *c = NULL; if (EC_Normal == graphicLayerDescription.getString(c)) return c; else return NULL; } void DVPSGraphicLayer::setGL(const char *gl) { if (gl) graphicLayer.putString(gl); else graphicLayer.clear(); return; } void DVPSGraphicLayer::setGLOrder(Sint32 glOrder) { char buf[100]; sprintf(buf, "%ld", (long)glOrder); graphicLayerOrder.putString(buf); return; } void DVPSGraphicLayer::setGLRecommendedDisplayValueGray(Uint16 gray) { graphicLayerRecommendedDisplayGrayscaleValue.clear(); graphicLayerRecommendedDisplayGrayscaleValue.putUint16(gray,0); return; } void DVPSGraphicLayer::setGLRecommendedDisplayValueRGB(Uint16 r, Uint16 g, Uint16 b) { graphicLayerRecommendedDisplayRGBValue.clear(); graphicLayerRecommendedDisplayRGBValue.putUint16(r,0); graphicLayerRecommendedDisplayRGBValue.putUint16(g,1); graphicLayerRecommendedDisplayRGBValue.putUint16(b,2); return; } void DVPSGraphicLayer::setGLDescription(const char *glDescription) { if (glDescription) graphicLayerDescription.putString(glDescription); else graphicLayerDescription.clear(); return; } Sint32 DVPSGraphicLayer::getGLOrder() { Sint32 result=0; if (EC_Normal == graphicLayerOrder.getSint32(result,0)) return result; else return 0; } OFBool DVPSGraphicLayer::haveGLRecommendedDisplayValue() { if ((graphicLayerRecommendedDisplayGrayscaleValue.getVM() == 1) || (graphicLayerRecommendedDisplayRGBValue.getVM() == 3)) return OFTrue; else return OFFalse; } OFCondition DVPSGraphicLayer::getGLRecommendedDisplayValueGray(Uint16& gray) { gray = 0; OFCondition result = EC_Normal; if (graphicLayerRecommendedDisplayGrayscaleValue.getVM()==1) { Uint16 gr=0; result = graphicLayerRecommendedDisplayGrayscaleValue.getUint16(gr,0); if (result==EC_Normal) gray = gr; } else if (graphicLayerRecommendedDisplayRGBValue.getVM() == 3) { Uint16 r=0; Uint16 g=0; Uint16 b=0; result = graphicLayerRecommendedDisplayRGBValue.getUint16(r,0); if (EC_Normal==result) result = graphicLayerRecommendedDisplayRGBValue.getUint16(g,1); if (EC_Normal==result) result = graphicLayerRecommendedDisplayRGBValue.getUint16(b,2); if (result==EC_Normal) { double dg = 0.299*(double)r + 0.587*(double)g +0.114*(double)b; gray = (Uint16) dg; } } else result=EC_IllegalCall; return result; } OFCondition DVPSGraphicLayer::getGLRecommendedDisplayValueRGB(Uint16& r, Uint16& g, Uint16& b) { r = 0; g = 0; b = 0; OFCondition result = EC_Normal; if (graphicLayerRecommendedDisplayRGBValue.getVM()==3) { Uint16 rr=0; Uint16 gg=0; Uint16 bb=0; result = graphicLayerRecommendedDisplayRGBValue.getUint16(rr,0); if (EC_Normal==result) result = graphicLayerRecommendedDisplayRGBValue.getUint16(gg,1); if (EC_Normal==result) result = graphicLayerRecommendedDisplayRGBValue.getUint16(bb,2); if (result==EC_Normal) { r = rr; g = gg; b = bb; } } else if (graphicLayerRecommendedDisplayGrayscaleValue.getVM() == 1) { Uint16 gr=0; result = graphicLayerRecommendedDisplayGrayscaleValue.getUint16(gr,0); if (result==EC_Normal) { r = gr; g = gr; b = gr; } } else result=EC_IllegalCall; return result; } void DVPSGraphicLayer::removeRecommendedDisplayValue(OFBool rgb, OFBool monochrome) { if (rgb) graphicLayerRecommendedDisplayRGBValue.clear(); if (monochrome) graphicLayerRecommendedDisplayGrayscaleValue.clear(); return; } /* * $Log: dvpsgl.cc,v $ * Revision 1.17 2010-10-14 13:14:32 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.16 2009-11-24 14:12:58 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.15 2008-04-30 12:38:43 meichel * Fixed compile errors due to changes in attribute tag names * * Revision 1.14 2006/08/15 16:57:02 meichel * Updated the code in module dcmpstat to correctly compile when * all standard C++ classes remain in namespace std. * * Revision 1.13 2005/12/08 15:46:28 meichel * Changed include path schema for all DCMTK header files * * Revision 1.12 2002/11/27 15:48:10 meichel * Adapted module dcmpstat to use of new header file ofstdinc.h * * Revision 1.11 2002/08/20 12:41:00 meichel * Added explicit includes for header files included implicitly * via dcstream before. * * Revision 1.10 2001/09/26 15:36:26 meichel * Adapted dcmpstat to class OFCondition * * Revision 1.9 2001/06/01 15:50:31 meichel * Updated copyright header * * Revision 1.8 2000/06/02 16:01:00 meichel * Adapted all dcmpstat classes to use OFConsole for log and error output * * Revision 1.7 2000/05/31 13:02:36 meichel * Moved dcmpstat macros and constants into a common header file * * Revision 1.6 2000/03/08 16:29:05 meichel * Updated copyright header. * * Revision 1.5 2000/03/03 14:13:59 meichel * Implemented library support for redirecting error messages into memory * instead of printing them to stdout/stderr for GUI applications. * * Revision 1.4 1999/07/22 16:39:58 meichel * Adapted dcmpstat data structures and API to supplement 33 letter ballot text. * * Revision 1.3 1999/05/04 15:27:26 meichel * Minor code purifications to keep gcc on OSF1 quiet. * * Revision 1.2 1998/12/14 16:10:41 meichel * Implemented Presentation State interface for graphic layers, * text and graphic annotations, presentation LUTs. * * Revision 1.1 1998/11/27 14:50:41 meichel * Initial Release. * * */ dcmtk-3.6.0/dcmpstat/libsrc/dvpsda.cc0000644000310500011400000004264411455601070016735 0ustar joergrdicom3/* * * Copyright (C) 1998-2010, 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: DVPSDisplayedArea * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:14:32 $ * CVS/RCS Revision: $Revision: 1.16 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/ofstd/ofstring.h" #include "dcmtk/dcmpstat/dvpsda.h" #include "dcmtk/dcmpstat/dvpsri.h" /* for DVPSReferencedImage */ #include "dcmtk/dcmpstat/dvpsrsl.h" /* DVPSReferencedSeries_PList */ #include "dcmtk/dcmpstat/dvpsdef.h" /* for constants and macros */ #include "dcmtk/ofstd/ofstd.h" #include "dcmtk/dcmpstat/dvpsrs.h" /* for DVPSReferencedSeries, needed by MSVC5 with STL */ #define INCLUDE_CSTRING #include "dcmtk/ofstd/ofstdinc.h" /* --------------- class DVPSDisplayedArea --------------- */ DVPSDisplayedArea::DVPSDisplayedArea() : referencedImageList() , displayedAreaTopLeftHandCorner(DCM_DisplayedAreaTopLeftHandCorner) , displayedAreaBottomRightHandCorner(DCM_DisplayedAreaBottomRightHandCorner) , presentationSizeMode(DCM_PresentationSizeMode) , presentationPixelSpacing(DCM_PresentationPixelSpacing) , presentationPixelAspectRatio(DCM_PresentationPixelAspectRatio) , presentationPixelMagnificationRatio(DCM_PresentationPixelMagnificationRatio) { } DVPSDisplayedArea::DVPSDisplayedArea(const DVPSDisplayedArea& copy) : referencedImageList(copy.referencedImageList) , displayedAreaTopLeftHandCorner(copy.displayedAreaTopLeftHandCorner) , displayedAreaBottomRightHandCorner(copy.displayedAreaBottomRightHandCorner) , presentationSizeMode(copy.presentationSizeMode) , presentationPixelSpacing(copy.presentationPixelSpacing) , presentationPixelAspectRatio(copy.presentationPixelAspectRatio) , presentationPixelMagnificationRatio(copy.presentationPixelMagnificationRatio) { } DVPSDisplayedArea::~DVPSDisplayedArea() { } OFCondition DVPSDisplayedArea::read(DcmItem &dset) { OFCondition result = EC_Normal; DcmStack stack; OFString aString; READ_FROM_DATASET(DcmSignedLong, displayedAreaTopLeftHandCorner) READ_FROM_DATASET(DcmSignedLong, displayedAreaBottomRightHandCorner) READ_FROM_DATASET(DcmCodeString, presentationSizeMode) READ_FROM_DATASET(DcmDecimalString, presentationPixelSpacing) READ_FROM_DATASET(DcmIntegerString, presentationPixelAspectRatio) READ_FROM_DATASET(DcmFloatingPointSingle, presentationPixelMagnificationRatio) if (result==EC_Normal) result = referencedImageList.read(dset); /* Now perform basic sanity checks */ if (displayedAreaTopLeftHandCorner.getLength() == 0) { result=EC_IllegalCall; DCMPSTAT_INFO("presentation state contains a display area selection SQ item with displayedAreaTopLeftHandCorner absent or empty"); } else if (displayedAreaTopLeftHandCorner.getVM() != 2) { result=EC_IllegalCall; DCMPSTAT_INFO("presentation state contains a display area selection SQ item with displayedAreaTopLeftHandCorner VM != 2"); } if (displayedAreaBottomRightHandCorner.getLength() == 0) { result=EC_IllegalCall; DCMPSTAT_INFO("presentation state contains a display area selection SQ item with displayedAreaBottomRightHandCorner absent or empty"); } else if (displayedAreaBottomRightHandCorner.getVM() != 2) { result=EC_IllegalCall; DCMPSTAT_INFO("presentation state contains a display area selection SQ item with displayedAreaBottomRightHandCorner VM != 2"); } if (presentationSizeMode.getLength() == 0) { result=EC_IllegalCall; DCMPSTAT_INFO("presentation state contains a display area selection SQ item with presentationSizeMode absent or empty"); } else if (presentationSizeMode.getVM() != 1) { result=EC_IllegalCall; DCMPSTAT_INFO("presentation state contains a display area selection SQ item with presentationSizeMode VM != 1"); } else { aString.clear(); presentationSizeMode.getOFString(aString,0); if (aString=="TRUE SIZE") { if (presentationPixelSpacing.getVM() != 2) { result=EC_IllegalCall; DCMPSTAT_INFO("presentation state contains a display area selection SQ item with mode 'TRUE SIZE' but presentationPixelSpacing VM != 2"); } } else if (aString == "MAGNIFY") { if (presentationPixelMagnificationRatio.getVM() != 1) { result=EC_IllegalCall; DCMPSTAT_INFO("presentation state contains a display area selection SQ item with mode 'MAGNIFY' but presentationPixelSpacing VM != 1"); } } else if (aString != "SCALE TO FIT") { result=EC_IllegalCall; DCMPSTAT_INFO("presentation state contains a display area selection SQ item with unknown presentation size mode: " << aString); } } if ((presentationPixelSpacing.getLength() > 0)&&(presentationPixelSpacing.getVM() != 2)) { result=EC_IllegalCall; DCMPSTAT_INFO("presentation state contains a display area selection SQ item with presentationPixelSpacing VM != 2"); } if ((presentationPixelAspectRatio.getLength() > 0)&&(presentationPixelAspectRatio.getVM() != 2)) { result=EC_IllegalCall; DCMPSTAT_INFO("presentation state contains a display area selection SQ item with presentationPixelAspectRatio VM != 2"); } if ((presentationPixelMagnificationRatio.getLength() > 0)&&(presentationPixelMagnificationRatio.getVM() != 1)) { result=EC_IllegalCall; DCMPSTAT_INFO("presentation state contains a display area selection SQ item with presentationPixelMagnificationRatio VM != 1"); } if ((presentationPixelSpacing.getLength() == 0)&&(presentationPixelAspectRatio.getVM() != 2)) { result=EC_IllegalCall; DCMPSTAT_INFO("presentation state contains a display area selection SQ item with both presentationPixelSpacing and presentationPixelAspectRatio missing/incorrect"); } return result; } OFCondition DVPSDisplayedArea::write(DcmItem &dset) { OFCondition result = EC_Normal; DcmElement *delem=NULL; if ((presentationPixelSpacing.getLength()==0)&&(presentationPixelAspectRatio.getLength()==0)) presentationPixelAspectRatio.putString("1\\1"); ADD_TO_DATASET(DcmSignedLong, displayedAreaTopLeftHandCorner) ADD_TO_DATASET(DcmSignedLong, displayedAreaBottomRightHandCorner) ADD_TO_DATASET(DcmCodeString, presentationSizeMode) if (presentationPixelSpacing.getLength() >0) { ADD_TO_DATASET(DcmDecimalString, presentationPixelSpacing) } if (presentationPixelAspectRatio.getLength() >0) { ADD_TO_DATASET(DcmIntegerString, presentationPixelAspectRatio) } if (presentationPixelMagnificationRatio.getLength() >0) { ADD_TO_DATASET(DcmFloatingPointSingle, presentationPixelMagnificationRatio) } if ((result == EC_Normal)&&(referencedImageList.size() >0)) result = referencedImageList.write(dset); return result; } OFBool DVPSDisplayedArea::isApplicable(const char *instanceUID, unsigned long frame) { return referencedImageList.isApplicable(instanceUID, frame); } OFBool DVPSDisplayedArea::matchesApplicability(const char *instanceUID, unsigned long frame, DVPSObjectApplicability applicability) { return referencedImageList.matchesApplicability(instanceUID, frame, applicability); } void DVPSDisplayedArea::removeImageReference( DVPSReferencedSeries_PList& allReferences, const char *instanceUID, unsigned long frame, unsigned long numberOfFrames, DVPSObjectApplicability applicability) { referencedImageList.removeImageReference(allReferences, instanceUID, frame, numberOfFrames, applicability); return; } DVPSPresentationSizeMode DVPSDisplayedArea::getPresentationSizeMode() { OFString aString; presentationSizeMode.getOFString(aString,0); if (aString=="TRUE SIZE") return DVPSD_trueSize; else if (aString=="MAGNIFY") return DVPSD_magnify; return DVPSD_scaleToFit; } double DVPSDisplayedArea::getPresentationPixelAspectRatio() { double result = 1.0; // default in case something goes wrong if (presentationPixelSpacing.getVM() == 2) { Float64 flX=0.0; Float64 flY=0.0; presentationPixelSpacing.getFloat64(flY, 0); presentationPixelSpacing.getFloat64(flX, 1); if (flY != 0.0) result = flX/flY; } else if (presentationPixelAspectRatio.getVM() == 2) { Sint32 siX=0; Sint32 siY=0; presentationPixelAspectRatio.getSint32(siY, 0); presentationPixelAspectRatio.getSint32(siX, 1); if (siY != 0) result = ((double)siX) / ((double)siY); } return result; } void DVPSDisplayedArea::getDisplayedArea(Sint32& tlhcX, Sint32& tlhcY, Sint32& brhcX, Sint32& brhcY) { if (EC_Normal != displayedAreaTopLeftHandCorner.getSint32(tlhcX, 0)) tlhcX = 0; if (EC_Normal != displayedAreaTopLeftHandCorner.getSint32(tlhcY, 1)) tlhcY = 0; if (EC_Normal != displayedAreaBottomRightHandCorner.getSint32(brhcX, 0)) brhcX = 0; if (EC_Normal != displayedAreaBottomRightHandCorner.getSint32(brhcY, 1)) brhcY = 0; return; } OFCondition DVPSDisplayedArea::getPresentationPixelSpacing(double& x, double& y) { if (presentationPixelSpacing.getVM() == 2) { Float64 psX=0.0; Float64 psY=0.0; // presentationPixelSpacing uses the format row_spacing\\col_spacing presentationPixelSpacing.getFloat64(psY, 0); presentationPixelSpacing.getFloat64(psX, 1); x = psX; y = psY; return EC_Normal; } return EC_IllegalCall; } OFCondition DVPSDisplayedArea::getPresentationPixelMagnificationRatio(double& magnification) { if (presentationPixelMagnificationRatio.getVM() == 1) { Float32 mag=0.0; presentationPixelMagnificationRatio.getFloat32(mag, 0); magnification = (double)mag; return EC_Normal; } return EC_IllegalCall; } OFCondition DVPSDisplayedArea::addImageReference( const char *sopclassUID, const char *instanceUID, unsigned long frame, DVPSObjectApplicability applicability) { return referencedImageList.addImageReference(sopclassUID, instanceUID, frame, applicability); } OFBool DVPSDisplayedArea::canUseTrueSize() { if (presentationPixelSpacing.getVM() == 2) return OFTrue; else return OFFalse; } OFCondition DVPSDisplayedArea::setDisplayedAreaPixelSpacing(double spacingX, double spacingY) { char str[66]; OFStandard::ftoa(str, 32, spacingY, OFStandard::ftoa_format_f); strcat(str, "\\"); OFStandard::ftoa(strchr(str, 0), 32, spacingX, OFStandard::ftoa_format_f); return setDisplayedAreaPixelSpacing(str); } OFCondition DVPSDisplayedArea::setDisplayedAreaPixelSpacing(const char *spacing) { if (spacing==NULL) return EC_IllegalCall; presentationPixelAspectRatio.clear(); OFCondition result = presentationPixelSpacing.putString(spacing); if (EC_Normal == result) { Float64 fl=0.0; presentationPixelSpacing.getFloat64(fl, 0); if (fl == 0.0) result = EC_IllegalCall; else if (fl < 0) presentationPixelSpacing.putFloat64(-fl, 0); // silently correct negative values fl =0.0; presentationPixelSpacing.getFloat64(fl, 1); if (fl == 0.0) result = EC_IllegalCall; else if (fl < 0) presentationPixelSpacing.putFloat64(-fl, 1); // silently correct negative values } if (EC_Normal != result) presentationPixelSpacing.clear(); return result; } OFCondition DVPSDisplayedArea::setDisplayedAreaPixelAspectRatio(double ratio) { char str[100]; sprintf(str, "10000\\%ld", (long)(ratio*10000.0)); return setDisplayedAreaPixelAspectRatio(str); } OFCondition DVPSDisplayedArea::setDisplayedAreaPixelAspectRatio(const char *ratio) { if (ratio==NULL) return EC_IllegalCall; presentationPixelSpacing.clear(); OFCondition result = presentationPixelAspectRatio.putString(ratio); if (EC_Normal == result) { Sint32 si=0; presentationPixelAspectRatio.getSint32(si, 0); if (si == 0) result = EC_IllegalCall; else if (si < 0) presentationPixelAspectRatio.putSint32(-si, 0); // silently correct negative values si = 0; presentationPixelAspectRatio.getSint32(si, 1); if (si == 0) result = EC_IllegalCall; else if (si < 0) presentationPixelAspectRatio.putSint32(-si, 1); // silently correct negative values } if (EC_Normal != result) presentationPixelAspectRatio.clear(); return result; } OFCondition DVPSDisplayedArea::setDisplayedArea( DVPSPresentationSizeMode sizeMode, Sint32 tlhcX, Sint32 tlhcY, Sint32 brhcX, Sint32 brhcY, double magnification) { OFCondition result = EC_Normal; switch (sizeMode) { case DVPSD_scaleToFit: result = presentationSizeMode.putString("SCALE TO FIT"); if (EC_Normal == result) presentationPixelMagnificationRatio.clear(); break; case DVPSD_trueSize: if (! canUseTrueSize()) return EC_IllegalCall; result = presentationSizeMode.putString("TRUE SIZE"); if (EC_Normal == result) presentationPixelMagnificationRatio.clear(); break; case DVPSD_magnify: if (magnification == 0.0) return EC_IllegalCall; result = presentationSizeMode.putString("MAGNIFY"); if (EC_Normal == result) presentationPixelMagnificationRatio.clear(); if (EC_Normal == result) result = presentationPixelMagnificationRatio.putFloat32((Float32)magnification,0); break; } if (EC_Normal == result) result = displayedAreaTopLeftHandCorner.putSint32(tlhcX,0); if (EC_Normal == result) result = displayedAreaTopLeftHandCorner.putSint32(tlhcY,1); if (EC_Normal == result) result = displayedAreaBottomRightHandCorner.putSint32(brhcX,0); if (EC_Normal == result) result = displayedAreaBottomRightHandCorner.putSint32(brhcY,1); return result; } void DVPSDisplayedArea::switchHorizontalCorners() { Sint32 tlhcX = 0; Sint32 brhcX = 0; displayedAreaTopLeftHandCorner.getSint32(tlhcX, 0); displayedAreaBottomRightHandCorner.getSint32(brhcX, 0); displayedAreaTopLeftHandCorner.putSint32(brhcX,0); displayedAreaBottomRightHandCorner.putSint32(tlhcX,0); } void DVPSDisplayedArea::switchVerticalCorners() { Sint32 tlhcY = 0; Sint32 brhcY = 0; displayedAreaTopLeftHandCorner.getSint32(tlhcY, 1); displayedAreaBottomRightHandCorner.getSint32(brhcY, 1); displayedAreaTopLeftHandCorner.putSint32(brhcY,1); displayedAreaBottomRightHandCorner.putSint32(tlhcY,1); } void DVPSDisplayedArea::rotateAndFlipFromOrTo(DVPSRotationType rotation, OFBool isFlipped) { switch (rotation) { case DVPSR_0_deg: if (isFlipped) switchHorizontalCorners(); break; case DVPSR_90_deg: if (!isFlipped) switchVerticalCorners(); break; case DVPSR_180_deg: if (isFlipped) switchVerticalCorners(); else { switchHorizontalCorners(); switchVerticalCorners(); } break; case DVPSR_270_deg: if (isFlipped) { switchHorizontalCorners(); switchVerticalCorners(); } else switchHorizontalCorners(); break; } } void DVPSDisplayedArea::rotateAndFlip( DVPSRotationType rotationFrom, OFBool isFlippedFrom, DVPSRotationType rotationTo, OFBool isFlippedTo) { // restore original coordinates (no rotation, no flipping) rotateAndFlipFromOrTo(rotationFrom, isFlippedFrom); // create new coordinates rotateAndFlipFromOrTo(rotationTo, isFlippedTo); } /* * $Log: dvpsda.cc,v $ * Revision 1.16 2010-10-14 13:14:32 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.15 2009-11-24 14:12:58 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.14 2006-08-15 16:57:02 meichel * Updated the code in module dcmpstat to correctly compile when * all standard C++ classes remain in namespace std. * * Revision 1.13 2005/12/08 15:46:23 meichel * Changed include path schema for all DCMTK header files * * Revision 1.12 2003/09/05 14:30:08 meichel * Introduced new API methods that allow Displayed Areas to be queried * and set either relative to the image (ignoring rotation and flip) or * in absolute values as defined in the standard. Rotate and flip methods * now adjust displayed areas in the presentation state. * * Revision 1.11 2003/06/04 12:30:28 meichel * Added various includes needed by MSVC5 with STL * * Revision 1.10 2002/12/04 10:41:37 meichel * Changed toolkit to use OFStandard::ftoa instead of sprintf for all * double to string conversions that are supposed to be locale independent * * Revision 1.9 2001/09/26 15:36:24 meichel * Adapted dcmpstat to class OFCondition * * Revision 1.8 2001/06/01 15:50:29 meichel * Updated copyright header * * Revision 1.7 2000/11/23 09:47:24 meichel * Silently correct negative pixel aspect ratio or pixel spacing values * * Revision 1.6 2000/06/02 16:00:59 meichel * Adapted all dcmpstat classes to use OFConsole for log and error output * * Revision 1.5 2000/05/31 13:02:36 meichel * Moved dcmpstat macros and constants into a common header file * * Revision 1.4 2000/03/08 16:29:03 meichel * Updated copyright header. * * Revision 1.3 2000/03/03 14:13:58 meichel * Implemented library support for redirecting error messages into memory * instead of printing them to stdout/stderr for GUI applications. * * Revision 1.2 1999/10/22 09:08:22 joergr * Added validity check to methods setting pixel aspect ratio and pixel * spacing (>0). Fixed problems with incorrect pixel spacing (0\0) stored in * sample images. * * Revision 1.1 1999/07/22 16:39:55 meichel * Adapted dcmpstat data structures and API to supplement 33 letter ballot text. * * */ dcmtk-3.6.0/dcmpstat/libsrc/dvpsspl.cc0000644000310500011400000003306311455601071017143 0ustar joergrdicom3/* * * Copyright (C) 1998-2010, 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: DVPSStoredPrint_PList * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:14:33 $ * CVS/RCS Revision: $Revision: 1.14 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmpstat/dvpsspl.h" #include "dcmtk/dcmpstat/dvpssp.h" /* for DVPSStoredPrint */ #include "dcmtk/dcmpstat/dvpsib.h" /* for DVPSImageBoxContent */ #include "dcmtk/dcmpstat/dviface.h" #include "dcmtk/dcmpstat/dvpsdef.h" #include "dcmtk/dcmpstat/dvpsov.h" /* for DVPSOverlay, needed by MSVC5 with STL */ #include "dcmtk/dcmpstat/dvpsgl.h" /* for DVPSGraphicLayer, needed by MSVC5 with STL */ #include "dcmtk/dcmpstat/dvpsrs.h" /* for DVPSReferencedSeries, needed by MSVC5 with STL */ #include "dcmtk/dcmpstat/dvpsal.h" /* for DVPSOverlayCurveActivationLayer, needed by MSVC5 with STL */ #include "dcmtk/dcmpstat/dvpsga.h" /* for DVPSGraphicAnnotation, needed by MSVC5 with STL */ #include "dcmtk/dcmpstat/dvpscu.h" /* for DVPSCurve, needed by MSVC5 with STL */ #include "dcmtk/dcmpstat/dvpsvl.h" /* for DVPSVOILUT, needed by MSVC5 with STL */ #include "dcmtk/dcmpstat/dvpsvw.h" /* for DVPSVOIWindow, needed by MSVC5 with STL */ #include "dcmtk/dcmpstat/dvpsda.h" /* for DVPSDisplayedArea, needed by MSVC5 with STL */ #include "dcmtk/dcmpstat/dvpssv.h" /* for DVPSSoftcopyVOI, needed by MSVC5 with STL */ #include "dcmtk/dcmpstat/dvpsab.h" /* for DVPSAnnotationContent, needed by MSVC5 with STL */ #include "dcmtk/dcmpstat/dvpstx.h" /* for DVPSTextObject, needed by MSVC5 with STL */ #include "dcmtk/dcmpstat/dvpsgr.h" /* for DVPSGraphicObject, needed by MSVC5 with STL */ #include "dcmtk/dcmpstat/dvpsri.h" /* for DVPSReferencedImage, needed by MSVC5 with STL */ DVPSStoredPrint_PList::DVPSStoredPrint_PList() : list_() { } DVPSStoredPrint_PList::DVPSStoredPrint_PList(const DVPSStoredPrint_PList &arg) : list_() { OFListConstIterator(DVPSStoredPrint *) first = arg.list_.begin(); OFListConstIterator(DVPSStoredPrint *) last = arg.list_.end(); while (first != last) { list_.push_back((*first)->clone()); ++first; } } DVPSStoredPrint_PList::~DVPSStoredPrint_PList() { clear(); } void DVPSStoredPrint_PList::clear() { OFListIterator(DVPSStoredPrint *) first = list_.begin(); OFListIterator(DVPSStoredPrint *) last = list_.end(); while (first != last) { delete (*first); first = list_.erase(first); } } void DVPSStoredPrint_PList::printSCPBasicFilmBoxSet( DVConfiguration& cfg, const char *cfgname, T_DIMSE_Message& rq, DcmDataset *rqDataset, T_DIMSE_Message& rsp, DcmDataset *& rspDataset, OFBool presentationLUTnegotiated, DVPSPresentationLUT_PList& globalPresentationLUTList) { OFListIterator(DVPSStoredPrint *) first = list_.begin(); OFListIterator(DVPSStoredPrint *) last = list_.end(); OFBool found = OFFalse; while ((first != last) && (!found)) { if ((*first)->isFilmBoxInstance(rq.msg.NSetRQ.RequestedSOPInstanceUID)) found = OFTrue; else ++first; } if (found) { DVPSStoredPrint *newSP = new DVPSStoredPrint(*(*first)); if (newSP) { if (newSP->printSCPSet(cfg, cfgname, rqDataset, rsp, rspDataset, presentationLUTnegotiated, globalPresentationLUTList)) { // N-SET successful, replace entry in list delete (*first); list_.erase(first); list_.push_back(newSP); } else delete newSP; } else { DCMPSTAT_INFO("cannot update film box, out of memory."); rsp.msg.NSetRSP.DimseStatus = STATUS_N_ProcessingFailure; } } else { // film box does not exist or wrong instance UID DCMPSTAT_INFO("cannot update film box, object not found."); rsp.msg.NSetRSP.DimseStatus = STATUS_N_NoSuchObjectInstance; } } void DVPSStoredPrint_PList::printSCPBasicGrayscaleImageBoxSet( DVInterface& cfg, const char *cfgname, T_DIMSE_Message& rq, DcmDataset *rqDataset, T_DIMSE_Message& rsp, DcmDataset *& rspDataset, OFBool presentationLUTnegotiated) { OFListIterator(DVPSStoredPrint *) first = list_.begin(); OFListIterator(DVPSStoredPrint *) last = list_.end(); DVPSStoredPrint *sp = NULL; DVPSImageBoxContent *newib = NULL; while ((first != last) && (sp == NULL)) { newib = (*first)->duplicateImageBox(rq.msg.NSetRQ.RequestedSOPInstanceUID); if (newib) sp = *first; else ++first; } if (newib && sp) { DcmFileFormat imageFile; DcmDataset *imageDataset = imageFile.getDataset(); if (newib->printSCPSet(cfg, cfgname, rqDataset, rsp, rspDataset, *imageDataset, sp->getReferencedPresentationLUTAlignment(), presentationLUTnegotiated)) { if (EC_Normal == sp->writeHardcopyImageAttributes(*imageDataset)) { // check for image position clash if (sp->haveImagePositionClash(rq.msg.NSetRQ.RequestedSOPInstanceUID, newib->getImageBoxPosition())) { delete rspDataset; rspDataset = NULL; DCMPSTAT_INFO("cannot update basic grayscale image box, image position collision."); rsp.msg.NSetRSP.DimseStatus = STATUS_N_InvalidAttributeValue; } else { if (EC_Normal == cfg.saveFileFormatToDB(imageFile)) { sp->replaceImageBox(newib); } else { delete rspDataset; rspDataset = NULL; rsp.msg.NSetRSP.DimseStatus = STATUS_N_ProcessingFailure; } } } else { delete rspDataset; rspDataset = NULL; DCMPSTAT_INFO("cannot update basic grayscale image box, out of memory."); rsp.msg.NSetRSP.DimseStatus = STATUS_N_ProcessingFailure; } } } else { // image box does not exist or wrong instance UID DCMPSTAT_INFO("cannot update basic grayscale image box, object not found."); rsp.msg.NSetRSP.DimseStatus = STATUS_N_NoSuchObjectInstance; } } void DVPSStoredPrint_PList::printSCPBasicFilmBoxAction( DVInterface& cfg, const char *cfgname, T_DIMSE_Message& rq, T_DIMSE_Message& rsp, DVPSPresentationLUT_PList& globalPresentationLUTList) { OFListIterator(DVPSStoredPrint *) first = list_.begin(); OFListIterator(DVPSStoredPrint *) last = list_.end(); OFBool found = OFFalse; while ((first != last) && (!found)) { if ((*first)->isFilmBoxInstance(rq.msg.NActionRQ.RequestedSOPInstanceUID)) found = OFTrue; else ++first; } if (found) { DcmFileFormat spFile; DcmDataset *spDataset = spFile.getDataset(); DVPSStoredPrint *sp = *first; OFBool writeRequestedImageSize = cfg.getTargetPrinterSupportsRequestedImageSize(cfgname); sp->updatePresentationLUTList(globalPresentationLUTList); sp->clearInstanceUID(); if ((*first)->emptyPageWarning()) { DCMPSTAT_INFO("empty page, will not be stored in database"); if (STATUS_Success == rsp.msg.NActionRSP.DimseStatus) rsp.msg.NActionRSP.DimseStatus = STATUS_N_PRINT_BFB_Warn_EmptyPage; } else { if (EC_Normal == sp->write(*spDataset, writeRequestedImageSize, OFFalse, OFFalse, OFTrue)) { if (EC_Normal == cfg.saveFileFormatToDB(spFile)) { // N-ACTION successful. } else { rsp.msg.NActionRSP.DimseStatus = STATUS_N_ProcessingFailure; } } else { DCMPSTAT_INFO("cannot print basic film box, out of memory."); rsp.msg.NActionRSP.DimseStatus = STATUS_N_ProcessingFailure; } } } else { // film box does not exist or wrong instance UID DCMPSTAT_INFO("cannot print film box, object not found."); rsp.msg.NActionRSP.DimseStatus = STATUS_N_NoSuchObjectInstance; } } void DVPSStoredPrint_PList::printSCPBasicFilmSessionAction( DVInterface& cfg, const char *cfgname, T_DIMSE_Message& rsp, DVPSPresentationLUT_PList& globalPresentationLUTList) { if (size() > 0) { OFBool writeRequestedImageSize = cfg.getTargetPrinterSupportsRequestedImageSize(cfgname); OFListIterator(DVPSStoredPrint *) first = list_.begin(); OFListIterator(DVPSStoredPrint *) last = list_.end(); while (first != last) { DcmFileFormat spFile; DcmDataset *spDataset = spFile.getDataset(); (*first)->updatePresentationLUTList(globalPresentationLUTList); (*first)->clearInstanceUID(); if ((*first)->emptyPageWarning()) { DCMPSTAT_INFO("empty page, will not be stored in database"); if (STATUS_Success == rsp.msg.NActionRSP.DimseStatus) rsp.msg.NActionRSP.DimseStatus = STATUS_N_PRINT_BFS_Warn_EmptyPage; } else { if (EC_Normal == (*first)->write(*spDataset, writeRequestedImageSize, OFFalse, OFFalse, OFTrue)) { if (EC_Normal == cfg.saveFileFormatToDB(spFile)) { // success for this film box } else { rsp.msg.NActionRSP.DimseStatus = STATUS_N_ProcessingFailure; } } else { DCMPSTAT_INFO("cannot print basic film session, out of memory."); rsp.msg.NActionRSP.DimseStatus = STATUS_N_ProcessingFailure; } } ++first; } } else { // no film boxes to print DCMPSTAT_INFO("cannot print film session, no film box."); rsp.msg.NActionRSP.DimseStatus = STATUS_N_PRINT_BFS_Fail_NoFilmBox; } } void DVPSStoredPrint_PList::printSCPBasicFilmBoxDelete(T_DIMSE_Message& rq, T_DIMSE_Message& rsp) { OFListIterator(DVPSStoredPrint *) first = list_.begin(); OFListIterator(DVPSStoredPrint *) last = list_.end(); OFBool found = OFFalse; while ((first != last) && (!found)) { if ((*first)->isFilmBoxInstance(rq.msg.NDeleteRQ.RequestedSOPInstanceUID)) found = OFTrue; else ++first; } if (found) { delete (*first); list_.erase(first); } else { // film box does not exist or wrong instance UID DCMPSTAT_INFO("cannot delete film box with instance UID '" << rq.msg.NDeleteRQ.RequestedSOPInstanceUID << "': object does not exist."); rsp.msg.NDeleteRSP.DimseStatus = STATUS_N_NoSuchObjectInstance; } } OFBool DVPSStoredPrint_PList::haveFilmBoxInstance(const char *uid) { if (uid==NULL) return OFFalse; OFListIterator(DVPSStoredPrint *) first = list_.begin(); OFListIterator(DVPSStoredPrint *) last = list_.end(); while (first != last) { if ((*first)->isFilmBoxInstance(uid)) return OFTrue; else ++first; } return OFFalse; } OFBool DVPSStoredPrint_PList::usesPresentationLUT(const char *uid) { if (uid==NULL) return OFFalse; OFListIterator(DVPSStoredPrint *) first = list_.begin(); OFListIterator(DVPSStoredPrint *) last = list_.end(); while (first != last) { if ((*first)->usesPresentationLUT(uid)) return OFTrue; else ++first; } return OFFalse; } OFBool DVPSStoredPrint_PList::matchesPresentationLUT(DVPSPrintPresentationLUTAlignment align) const { OFBool result = OFTrue; OFListConstIterator(DVPSStoredPrint *) first = list_.begin(); OFListConstIterator(DVPSStoredPrint *) last = list_.end(); while (first != last) { result = result && (*first)->matchesPresentationLUT(align); ++first; } return result; } void DVPSStoredPrint_PList::overridePresentationLUTSettings( DcmUnsignedShort& newIllumination, DcmUnsignedShort& newReflectedAmbientLight, DcmUniqueIdentifier& newReferencedPLUT, DVPSPrintPresentationLUTAlignment newAlignment) { OFListIterator(DVPSStoredPrint *) first = list_.begin(); OFListIterator(DVPSStoredPrint *) last = list_.end(); while (first != last) { (*first)->overridePresentationLUTSettings(newIllumination, newReflectedAmbientLight, newReferencedPLUT, newAlignment); ++first; } } /* * $Log: dvpsspl.cc,v $ * Revision 1.14 2010-10-14 13:14:33 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.13 2009-11-24 14:12:59 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.12 2006-08-15 16:57:02 meichel * Updated the code in module dcmpstat to correctly compile when * all standard C++ classes remain in namespace std. * * Revision 1.11 2005/12/08 15:46:48 meichel * Changed include path schema for all DCMTK header files * * Revision 1.10 2004/02/04 15:57:49 joergr * Removed acknowledgements with e-mail addresses from CVS log. * * Revision 1.9 2003/06/12 18:23:11 joergr * Modified code to use const_iterators where appropriate (required for STL). * * Revision 1.8 2003/06/04 12:30:29 meichel * Added various includes needed by MSVC5 with STL * * Revision 1.7 2003/06/04 10:18:07 meichel * Replaced private inheritance from template with aggregation * * Revision 1.6 2001/06/01 15:50:38 meichel * Updated copyright header * * Revision 1.5 2001/05/25 10:07:59 meichel * Corrected some DIMSE error status codes for Print SCP * * Revision 1.4 2000/06/08 10:44:38 meichel * Implemented Referenced Presentation LUT Sequence on Basic Film Session level. * Empty film boxes (pages) are not written to file anymore. * * Revision 1.3 2000/06/07 13:17:09 meichel * now using DIMSE status constants and log facilities defined in dcmnet * * Revision 1.2 2000/06/02 16:01:07 meichel * Adapted all dcmpstat classes to use OFConsole for log and error output * * Revision 1.1 2000/05/31 12:58:12 meichel * Added initial Print SCP support * * */ dcmtk-3.6.0/dcmpstat/libsrc/dvsighdl.cc0000644000310500011400000007556011455601071017264 0ustar joergrdicom3/* * * Copyright (C) 2001-2010, 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: DVSignatureHandler * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:14:33 $ * CVS/RCS Revision: $Revision: 1.17 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmpstat/dvsighdl.h" #include "dcmtk/dcmdata/dcdeftag.h" #include "dcmtk/dcmsign/dcsignat.h" #include "dcmtk/dcmdata/dcobject.h" #include "dcmtk/dcmdata/dcsequen.h" #include "dcmtk/dcmdata/dcvrat.h" #include "dcmtk/dcmdata/dcitem.h" #include "dcmtk/dcmpstat/dvpscf.h" #include "dcmtk/dcmsign/sicert.h" #include "dcmtk/dcmsign/sitypes.h" #include "dcmtk/dcmsign/sinullpr.h" #include "dcmtk/dcmsign/siprivat.h" #include "dcmtk/dcmsign/siripemd.h" #include "dcmtk/ofstd/ofstream.h" #ifdef WITH_OPENSSL BEGIN_EXTERN_C #include END_EXTERN_C /// the signature profile class we're using with DICOMscope class DVSignatureHandlerSignatureProfile: public SiNullProfile { public: /// default constructor DVSignatureHandlerSignatureProfile(DcmAttributeTag& at) : SiNullProfile() , notToSign(at) , vmNotToSign(notToSign.getVM()) { } /// destructor virtual ~DVSignatureHandlerSignatureProfile() { } /** checks whether the given tag is in the list of tags not to sign * @param tag tag to check * @return true if in list, false otherwise */ OFBool tagInList(const DcmTagKey& tag) const { DcmAttributeTag tempList(notToSign); // required because getTagVal() is not const DcmTagKey tagkey; for (unsigned long n=0; nStructured ReportNo structured report is currently active.\n") , htmlImage("ImageNo image is currently active.\n") , htmlPState("Presentation StateNo presentation state is currently active.\n") , htmlOverview() , correctSignaturesSR(0) , corruptSignaturesSR(0) , untrustSignaturesSR(0) , correctSignaturesImage(0) , corruptSignaturesImage(0) , untrustSignaturesImage(0) , correctSignaturesPState(0) , corruptSignaturesPState(0) , untrustSignaturesPState(0) #ifdef WITH_OPENSSL , certVerifier() #endif , config(cfg) { #ifdef WITH_OPENSSL int fileFormat = config.getTLSPEMFormat() ? X509_FILETYPE_PEM : X509_FILETYPE_ASN1; const char *tlsCACertificateFolder = config.getTLSCACertificateFolder(); if (tlsCACertificateFolder) certVerifier.addTrustedCertificateDir(tlsCACertificateFolder, fileFormat); #endif updateSignatureValidationOverview(); } DVSignatureHandler::~DVSignatureHandler() { } void DVSignatureHandler::replaceString(DVPSObjectType objtype, const char *str) { switch (objtype) { case DVPSS_structuredReport: if (str) htmlSR=str; else htmlSR.clear(); break; case DVPSS_image: if (str) htmlImage=str; else htmlImage.clear(); break; case DVPSS_presentationState: if (str) htmlPState=str; else htmlPState.clear(); break; } } void DVSignatureHandler::printSignatureItemPosition(DcmStack& stack, STD_NAMESPACE ostream& os) { DcmObject *elem = NULL; DcmSequenceOfItems *sq = NULL; unsigned long sqCard=0; const char *tagname = NULL; unsigned long m=0; char buf[20]; OFBool printed = OFFalse; if (stack.card() > 2) { // signature is located within a sequence for (unsigned long l=stack.card()-2; l>0; --l) // loop over all elements except the stack top and bottom { elem = stack.elem(l); if (elem) { if ((elem->ident() == EVR_item) && sq) { sqCard = sq->card(); for (m=0; mgetItem(m) == elem) { sprintf(buf, "[%lu]", m); os << buf; printed = OFTrue; } } } else { if (printed) os << ". "; sq = (DcmSequenceOfItems *)elem; DcmTag currentTag(elem->getTag()); tagname = currentTag.getTagName(); if (tagname) os << tagname; else { sprintf(buf, "(%04x,%04x)", elem->getTag().getGroup(), elem->getTag().getElement()); os << buf; printed = OFTrue; } if (elem->ident() == EVR_SQ) sq = (DcmSequenceOfItems *)elem; else sq = NULL; } } } } else { // signature is located in the main dataset os << "Main Dataset"; } } #ifdef WITH_OPENSSL void DVSignatureHandler::updateDigitalSignatureInformation(DcmItem& dataset, DVPSObjectType objtype, OFBool /* onRead */) #else void DVSignatureHandler::updateDigitalSignatureInformation(DcmItem& /*dataset*/, DVPSObjectType objtype, OFBool /* onRead */) #endif { OFOStringStream os; unsigned long counter = 0; unsigned long corrupt_counter = 0; unsigned long untrustworthy_counter = 0; const char *htmlHead = NULL; const char *htmlFoot = "\n\n"; switch (objtype) { case DVPSS_structuredReport: htmlHead = "\nStructured Report\n"; break; case DVPSS_image: htmlHead = "\nImage\n"; break; case DVPSS_presentationState: htmlHead = "\nPresentation State\n"; break; } os << htmlHead; #ifdef WITH_OPENSSL DcmStack stack; OFString aString; DcmAttributeTag at(DCM_DataElementsSigned); DcmTag tag; unsigned long numSignatures = 0; unsigned long l=0; Uint16 macID = 0; DcmTagKey tagkey; const char *tagName = NULL; OFBool nextline; const char *htmlEndl = "\n"; const char *htmlVfyOK = ""; const char *htmlVfyCA = ""; const char *htmlVfyErr = ""; const char *htmlLine1 = " "; const char *htmlLine2 = " "; const char *htmlLine3 = " "; const char *htmlLine4 = "  "; const char *htmlNext = ""; const char *htmlTableOK = "\n"; const char *htmlTableCA = "
\n"; const char *htmlTableErr = "
\n"; const char *htmlTableE = "

\n\n"; DcmItem *sigItem = DcmSignature::findFirstSignatureItem(dataset, stack); OFCondition sicond = EC_Normal; DcmSignature signer; while (sigItem) { signer.attach(sigItem); numSignatures = signer.numberOfSignatures(); for (l=0; lSignature #" << counter << " UID="; if (EC_Normal == signer.getCurrentSignatureUID(aString)) os << aString.c_str(); else os << "(unknown)"; os << "" << htmlEndl; os << htmlLine1 << "Location" << htmlNext; printSignatureItemPosition(stack, os); os << htmlEndl; os << htmlLine1 << "MAC ID" << htmlNext; if (EC_Normal == signer.getCurrentMacID(macID)) os << macID; else os << "(unknown)"; os << htmlEndl; os << htmlLine1 << "MAC algorithm" << htmlNext; if (EC_Normal == signer.getCurrentMacName(aString)) os << aString.c_str(); else os << "(unknown)"; os << htmlEndl; os << htmlLine1 << "MAC calculation xfer syntax" << htmlNext; if (EC_Normal == signer.getCurrentMacXferSyntaxName(aString)) os << aString.c_str(); else os << "(unknown)"; os << htmlEndl; os << htmlLine1 << "Data elements signed" << htmlNext; nextline = OFFalse; if (EC_Normal == signer.getCurrentDataElementsSigned(at)) { unsigned long atVM = at.getVM(); for (unsigned long n=0; ngetKeyType()==EKT_none)) os << "none" << htmlEndl; else { os << "X.509v" << cert->getX509Version() << htmlEndl; cert->getCertSubjectName(aString); os << htmlLine3 << "Subject" << htmlNext << aString.c_str() << htmlEndl; cert->getCertIssuerName(aString); os << htmlLine3 << "Issued by" << htmlNext << aString.c_str() << htmlEndl << htmlLine3 << "Serial no." << htmlNext << cert->getCertSerialNo() << htmlEndl << htmlLine3 << "Validity" << htmlNext << "not before "; cert->getCertValidityNotBefore(aString); os << aString.c_str() << ", not after "; cert->getCertValidityNotAfter(aString); os << aString.c_str() << htmlEndl << htmlLine4 << "Public key" << htmlNext; switch (cert->getKeyType()) { case EKT_RSA: os << "RSA, " << cert->getCertKeyBits() << " bits" << htmlEndl; break; case EKT_DSA: os << "DSA, " << cert->getCertKeyBits() << " bits" << htmlEndl; break; case EKT_DH: os << "DH, " << cert->getCertKeyBits() << " bits" << htmlEndl; break; case EKT_none: // should never happen os << "none" << htmlEndl; break; } } if (sicond.good()) { os << htmlVfyOK << "Verification: OK" << htmlEndl; } else if (sicond == SI_EC_VerificationFailed_NoTrust) { untrustworthy_counter++; os << htmlVfyCA << "Verification: Signature is valid but certificate could not be verified: " << certVerifier.lastError() << "" << htmlEndl ; } else { corrupt_counter++; os << htmlVfyErr << "Verification: "; os << sicond.text() << "" << htmlEndl; } os << htmlTableE; } } signer.detach(); sigItem = DcmSignature::findNextSignatureItem(dataset, stack); } #endif switch (objtype) { case DVPSS_structuredReport: if (counter == 0) os << "The current structured report does not contain any digital signature." << OFendl; corruptSignaturesSR = corrupt_counter; untrustSignaturesSR = untrustworthy_counter; correctSignaturesSR = counter - corrupt_counter - untrustworthy_counter; break; case DVPSS_image: if (counter == 0) os << "The current image does not contain any digital signature." << OFendl; corruptSignaturesImage = corrupt_counter; untrustSignaturesImage = untrustworthy_counter; correctSignaturesImage = counter - corrupt_counter - untrustworthy_counter; break; case DVPSS_presentationState: if (counter == 0) os << "The current presentation state does not contain any digital signature." << OFendl; corruptSignaturesPState = corrupt_counter; untrustSignaturesPState = untrustworthy_counter; correctSignaturesPState = counter - corrupt_counter - untrustworthy_counter; break; } os << htmlFoot << OFStringStream_ends; OFSTRINGSTREAM_GETSTR(os, newText) replaceString(objtype, newText); // copies newText into OFString OFSTRINGSTREAM_FREESTR(newText) updateSignatureValidationOverview(); return; } void DVSignatureHandler::disableDigitalSignatureInformation(DVPSObjectType objtype) { switch (objtype) { case DVPSS_structuredReport: htmlSR = "Structured ReportThe current structured report does not contain any digital signature.\n"; corruptSignaturesSR = 0; untrustSignaturesSR = 0; correctSignaturesSR = 0; break; case DVPSS_image: corruptSignaturesImage = 0; untrustSignaturesImage = 0; correctSignaturesImage = 0; htmlImage = "ImageThe current image does not contain any digital signature.\n"; break; case DVPSS_presentationState: corruptSignaturesPState = 0; untrustSignaturesPState = 0; correctSignaturesPState = 0; htmlPState = "Presentation StateThe current presentation state does not contain any digital signature.\n"; break; } updateSignatureValidationOverview(); } void DVSignatureHandler::disableImageAndPState() { corruptSignaturesImage = 0; untrustSignaturesImage = 0; correctSignaturesImage = 0; htmlImage = "ImageNo image is currently active.\n"; corruptSignaturesPState = 0; untrustSignaturesPState = 0; correctSignaturesPState = 0; htmlPState = "Presentation StateNo presentation state is currently active.\n"; updateSignatureValidationOverview(); return; } DVPSSignatureStatus DVSignatureHandler::getCurrentSignatureStatus(DVPSObjectType objtype) const { switch (objtype) { case DVPSS_structuredReport: if ((correctSignaturesSR + corruptSignaturesSR + untrustSignaturesSR) == 0) return DVPSW_unsigned; if ((corruptSignaturesSR + untrustSignaturesSR) == 0) return DVPSW_signed_OK; if (corruptSignaturesSR == 0) return DVPSW_signed_unknownCA; break; case DVPSS_image: if ((correctSignaturesImage + corruptSignaturesImage + untrustSignaturesImage) == 0) return DVPSW_unsigned; if ((corruptSignaturesImage + untrustSignaturesImage) == 0) return DVPSW_signed_OK; if (corruptSignaturesImage == 0) return DVPSW_signed_unknownCA; break; case DVPSS_presentationState: if ((correctSignaturesPState + corruptSignaturesPState + untrustSignaturesPState) == 0) return DVPSW_unsigned; if ((corruptSignaturesPState + untrustSignaturesPState) == 0) return DVPSW_signed_OK; if (corruptSignaturesPState == 0) return DVPSW_signed_unknownCA; break; } return DVPSW_signed_corrupt; } DVPSSignatureStatus DVSignatureHandler::getCombinedImagePStateSignatureStatus() const { DVPSSignatureStatus statImage = getCurrentSignatureStatus(DVPSS_image); DVPSSignatureStatus statPState = getCurrentSignatureStatus(DVPSS_presentationState); if ((statImage == DVPSW_signed_corrupt)||(statPState == DVPSW_signed_corrupt)) return DVPSW_signed_corrupt; if ((statImage == DVPSW_signed_unknownCA)||(statPState == DVPSW_signed_unknownCA)) return DVPSW_signed_unknownCA; if ((statImage == DVPSW_signed_OK)&&(statPState == DVPSW_signed_OK)) return DVPSW_signed_OK; return DVPSW_unsigned; } const char *DVSignatureHandler::getCurrentSignatureValidationHTML(DVPSObjectType objtype) const { const char *result = ""; switch (objtype) { case DVPSS_structuredReport: result = htmlSR.c_str(); break; case DVPSS_image: result = htmlImage.c_str(); break; case DVPSS_presentationState: result = htmlPState.c_str(); break; } return result; } void DVSignatureHandler::updateSignatureValidationOverview() { const char *htmlHead = "\nOverview\n"; const char *htmlFoot = "\n\n"; const char *htmlEndl = "\n"; const char *htmlTitle = ""; const char *htmlVfyUns = ""; const char *htmlVfySig = ""; const char *htmlVfyCA = ""; const char *htmlVfyErr = ""; const char *htmlLine1 = " "; const char *htmlNext = ""; const char *htmlTableUns = "

\n"; const char *htmlTableSig = "

\n"; const char *htmlTableCA = "

\n"; const char *htmlTableErr = "

\n"; const char *htmlTableE = "

\n\n"; OFOStringStream os; DVPSSignatureStatus status; os << htmlHead; // Structured Report status = getCurrentSignatureStatus(DVPSS_structuredReport); switch (status) { case DVPSW_unsigned: os << htmlTableUns; break; case DVPSW_signed_OK: os << htmlTableSig; break; case DVPSW_signed_unknownCA: os << htmlVfyCA; break; case DVPSW_signed_corrupt: os << htmlTableErr; break; } os << htmlTitle << "Structured Report"<< htmlEndl; os << htmlLine1 << "Number of correct signatures" << htmlNext << correctSignaturesSR << htmlEndl; os << htmlLine1 << "Number of corrupt signatures" << htmlNext << corruptSignaturesSR << htmlEndl; os << htmlLine1 << "Number of untrusted signatures" << htmlNext << untrustSignaturesSR << htmlEndl; switch (status) { case DVPSW_unsigned: os << htmlVfyUns << "Status: unsigned" << htmlEndl; break; case DVPSW_signed_OK: os << htmlVfySig << "Status: signed" << htmlEndl; break; case DVPSW_signed_unknownCA: os << htmlVfyCA << "Status: signed but untrustworthy: certificate could not be verified" << htmlEndl; break; case DVPSW_signed_corrupt: os << htmlVfyErr << "Status: contains corrupt signatures" << htmlEndl; break; } os << htmlTableE; // Image status = getCurrentSignatureStatus(DVPSS_image); switch (status) { case DVPSW_unsigned: os << htmlTableUns; break; case DVPSW_signed_OK: os << htmlTableSig; break; case DVPSW_signed_unknownCA: os << htmlTableCA; break; case DVPSW_signed_corrupt: os << htmlTableErr; break; } os << htmlTitle << "Image"<< htmlEndl; os << htmlLine1 << "Number of correct signatures" << htmlNext << correctSignaturesImage << htmlEndl; os << htmlLine1 << "Number of corrupt signatures" << htmlNext << corruptSignaturesImage << htmlEndl; os << htmlLine1 << "Number of untrusted signatures" << htmlNext << untrustSignaturesImage << htmlEndl; switch (status) { case DVPSW_unsigned: os << htmlVfyUns << "Status: unsigned" << htmlEndl; break; case DVPSW_signed_OK: os << htmlVfySig << "Status: signed" << htmlEndl; break; case DVPSW_signed_unknownCA: os << htmlVfyCA << "Status: signed but untrustworthy: certificate could not be verified" << htmlEndl; break; case DVPSW_signed_corrupt: os << htmlVfyErr << "Status: contains corrupt signatures" << htmlEndl; break; } os << htmlTableE; // Presentation State status = getCurrentSignatureStatus(DVPSS_presentationState); switch (status) { case DVPSW_unsigned: os << htmlTableUns; break; case DVPSW_signed_OK: os << htmlTableSig; break; case DVPSW_signed_unknownCA: os << htmlTableCA; break; case DVPSW_signed_corrupt: os << htmlTableErr; break; } os << htmlTitle << "Presentation State"<< htmlEndl; os << htmlLine1 << "Number of correct signatures" << htmlNext << correctSignaturesPState << htmlEndl; os << htmlLine1 << "Number of corrupt signatures" << htmlNext << corruptSignaturesPState << htmlEndl; os << htmlLine1 << "Number of untrusted signatures" << htmlNext << untrustSignaturesPState << htmlEndl; switch (status) { case DVPSW_unsigned: os << htmlVfyUns << "Status: unsigned" << htmlEndl; break; case DVPSW_signed_OK: os << htmlVfySig << "Status: signed" << htmlEndl; break; case DVPSW_signed_unknownCA: os << htmlVfyCA << "Status: signed but untrustworthy: certificate could not be verified" << htmlEndl; break; case DVPSW_signed_corrupt: os << htmlVfyErr << "Status: contains corrupt signatures" << htmlEndl; break; } os << htmlTableE; os << htmlFoot << OFStringStream_ends; OFSTRINGSTREAM_GETSTR(os, newText) htmlOverview = newText; OFSTRINGSTREAM_FREESTR(newText) return; } const char *DVSignatureHandler::getCurrentSignatureValidationOverview() const { return htmlOverview.c_str(); } unsigned long DVSignatureHandler::getNumberOfCorrectSignatures(DVPSObjectType objtype) const { unsigned long result = 0; switch (objtype) { case DVPSS_structuredReport: result = correctSignaturesSR; break; case DVPSS_image: result = correctSignaturesImage; break; case DVPSS_presentationState: result = correctSignaturesPState; break; } return result; } unsigned long DVSignatureHandler::getNumberOfUntrustworthySignatures(DVPSObjectType objtype) const { unsigned long result = 0; switch (objtype) { case DVPSS_structuredReport: result = untrustSignaturesSR; break; case DVPSS_image: result = untrustSignaturesImage; break; case DVPSS_presentationState: result = untrustSignaturesPState; break; } return result; } unsigned long DVSignatureHandler::getNumberOfCorruptSignatures(DVPSObjectType objtype) const { unsigned long result = 0; switch (objtype) { case DVPSS_structuredReport: result = corruptSignaturesSR; break; case DVPSS_image: result = corruptSignaturesImage; break; case DVPSS_presentationState: result = corruptSignaturesPState; break; } return result; } #ifdef WITH_OPENSSL OFBool DVSignatureHandler::attributesSigned(DcmItem& item, DcmAttributeTag& tagList) const { DcmStack stack; DcmAttributeTag at(DCM_DataElementsSigned); DcmTagKey tagkey; DcmSignature signer; unsigned long numSignatures; unsigned long l; DVSignatureHandlerSignatureProfile sigProfile(tagList); DcmItem *sigItem = DcmSignature::findFirstSignatureItem(item, stack); while (sigItem) { if (sigItem == &item) { // signatures on main level - check attributes signed signer.attach(sigItem); numSignatures = signer.numberOfSignatures(); for (l=0; l 1) // should always be true { DcmObject *obj = stack.elem(scard-2); if (obj) // should always be true { if (sigProfile.tagInList(obj->getTag())) return OFTrue; // one of the elements in tagList contains a signature } } } sigItem = DcmSignature::findNextSignatureItem(item, stack); } return OFFalse; } #else OFBool DVSignatureHandler::attributesSigned(DcmItem& /* item */, DcmAttributeTag& /* tagList */) const { return OFFalse; } #endif #ifdef WITH_OPENSSL OFCondition DVSignatureHandler::createSignature( DcmItem& mainDataset, const DcmStack& itemStack, DcmAttributeTag& attributesNotToSignInMainDataset, const char *userID, const char *passwd) { if (userID == NULL) return EC_IllegalCall; // get user settings int fileformat = config.getTLSPEMFormat() ? X509_FILETYPE_PEM : X509_FILETYPE_ASN1; const char *userDir = config.getUserCertificateFolder(); const char *userKey = config.getUserPrivateKey(userID); if (userKey == NULL) return EC_IllegalCall; const char *userCert = config.getUserCertificate(userID); if (userCert == NULL) return EC_IllegalCall; // load private key SiPrivateKey key; OFString filename; if (userDir) { filename = userDir; filename += PATH_SEPARATOR; } filename += userKey; if (passwd) key.setPrivateKeyPasswd(passwd); OFCondition sicond = key.loadPrivateKey(filename.c_str(), fileformat); if (sicond != EC_Normal) return EC_IllegalCall; // unable to load private key // load certificate SiCertificate cert; filename.clear(); if (userDir) { filename = userDir; filename += PATH_SEPARATOR; } filename += userCert; sicond = cert.loadCertificate(filename.c_str(), fileformat); if (sicond != EC_Normal) return EC_IllegalCall; // unable to load certificate if (! key.matchesCertificate(cert)) return EC_IllegalCall; // private key does not match certificate DcmSignature signer; SiRIPEMD160 mac; SiNullProfile nullProfile; DVSignatureHandlerSignatureProfile mainProfile(attributesNotToSignInMainDataset); DcmObject *current; DcmItem *currentItem; DcmStack workStack(itemStack); while (! workStack.empty()) { current = workStack.pop(); if ((current->ident() != EVR_dataset) && (current->ident() != EVR_item)) return EC_IllegalCall; // wrong type on stack currentItem = (DcmItem *)current; signer.attach(currentItem); if (currentItem == &mainDataset) { // we're creating a signature in the main dataset // we have to establish an explicit tag list, otherwise the profile does not work! DcmAttributeTag tagList(DCM_DataElementsSigned); unsigned long numAttributes = currentItem->card(); for (unsigned long l=0; lgetElement(l)->getTag(),l); } sicond = signer.createSignature(key, cert, mac, mainProfile, EXS_LittleEndianExplicit, &tagList); if (sicond != EC_Normal) return EC_IllegalCall; // error while creating signature } else { // we're creating a signature in a sequence item sicond = signer.createSignature(key, cert, mac, nullProfile, EXS_LittleEndianExplicit); if (sicond != EC_Normal) return EC_IllegalCall; // error while creating signature } signer.detach(); } return EC_Normal; } #else OFCondition DVSignatureHandler::createSignature( DcmItem& /* mainDataset */, const DcmStack& /* itemStack */, DcmAttributeTag& /* attributesNotToSignInMainDataset */, const char * /* userID */, const char * /* passwd */) { return EC_IllegalCall; } #endif /* * $Log: dvsighdl.cc,v $ * Revision 1.17 2010-10-14 13:14:33 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.16 2010-03-01 09:08:49 uli * Removed some unnecessary include directives in the headers. * * Revision 1.15 2006-08-15 16:57:02 meichel * Updated the code in module dcmpstat to correctly compile when * all standard C++ classes remain in namespace std. * * Revision 1.14 2005/12/08 15:46:59 meichel * Changed include path schema for all DCMTK header files * * Revision 1.13 2004/02/04 15:57:49 joergr * Removed acknowledgements with e-mail addresses from CVS log. * * Revision 1.12 2002/12/20 14:52:00 wilkens * Modified name clash resulting in a compiler error on Solaris 2.5.1 using * compiler SC 2.0.1. * * Revision 1.11 2002/05/02 14:10:22 joergr * Added support for standard and non-standard string streams (which one is * supported is detected automatically via the configure mechanism). * * Revision 1.10 2002/04/16 14:02:23 joergr * Added configurable support for C++ ANSI standard includes (e.g. streams). * * Revision 1.9 2001/12/04 18:02:25 meichel * Adapted dcmpstat signature code to changed interface in dcmsign * * Revision 1.8 2001/09/26 15:36:36 meichel * Adapted dcmpstat to class OFCondition * * Revision 1.7 2001/06/05 10:30:56 joergr * Replaced some #ifdef _WIN32 statements by #ifdef HAVE_WINDOWS_H or #ifdef * __CYGWIN__ respectively to reflect the fact that the latest Cygwin/gcc * version does not define _WIN32 any more. * * Revision 1.6 2001/05/25 10:07:35 meichel * Modified dcmpstat signature handler to also compile without OpenSSL * * Revision 1.5 2001/02/13 09:55:45 joergr * Minor purifications in "signature validation overview" HTML page. * * Revision 1.4 2001/01/29 17:34:01 joergr * Fixed bug in createSignature method. * * Revision 1.3 2001/01/29 14:55:47 meichel * Added new methods for creating signatures and checking the signature * status in module dcmpstat. * * Revision 1.2 2001/01/26 10:43:14 meichel * Introduced additional (fourth) status flag for signature validation * describing signatures that are valid but untrustworthy (unknown CA). * * Revision 1.1 2001/01/25 15:18:10 meichel * Added initial support for verification of digital signatures * in presentation states, images and structured reports to module dcmpstat. * * */ dcmtk-3.6.0/dcmpstat/libsrc/dvpsdal.cc0000644000310500011400000001704411455601070017105 0ustar joergrdicom3/* * * Copyright (C) 1999-2010, 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: DVPSDisplayedArea_PList * * Last Update: $Author: joergr $ * Update Date: $Date: 2010-10-14 13:14:32 $ * CVS/RCS Revision: $Revision: 1.15 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmpstat/dvpsdal.h" #include "dcmtk/dcmpstat/dvpsda.h" /* for DVPSDisplayedArea */ #include "dcmtk/dcmpstat/dvpsri.h" /* for DVPSReferencedImage, needed by MSVC5 with STL */ DVPSDisplayedArea_PList::DVPSDisplayedArea_PList() : list_() { } DVPSDisplayedArea_PList::DVPSDisplayedArea_PList(const DVPSDisplayedArea_PList &arg) : list_() { OFListConstIterator(DVPSDisplayedArea *) first = arg.list_.begin(); OFListConstIterator(DVPSDisplayedArea *) last = arg.list_.end(); while (first != last) { list_.push_back((*first)->clone()); ++first; } } DVPSDisplayedArea_PList::~DVPSDisplayedArea_PList() { clear(); } void DVPSDisplayedArea_PList::clear() { OFListIterator(DVPSDisplayedArea *) first = list_.begin(); OFListIterator(DVPSDisplayedArea *) last = list_.end(); while (first != last) { delete (*first); first = list_.erase(first); } } OFCondition DVPSDisplayedArea_PList::read(DcmItem &dset) { OFCondition result = EC_Normal; DcmStack stack; DVPSDisplayedArea *newImage = NULL; DcmSequenceOfItems *dseq=NULL; DcmItem *ditem=NULL; if (EC_Normal == dset.search(DCM_DisplayedAreaSelectionSequence, stack, ESM_fromHere, OFFalse)) { dseq=(DcmSequenceOfItems *)stack.top(); if (dseq) { unsigned long numItems = dseq->card(); for (unsigned int i=0; igetItem(i); newImage = new DVPSDisplayedArea(); if (newImage && ditem) { result = newImage->read(*ditem); list_.push_back(newImage); } else result = EC_MemoryExhausted; } } } return result; } OFCondition DVPSDisplayedArea_PList::write(DcmItem &dset) { OFCondition result = EC_Normal; DcmSequenceOfItems *dseq=NULL; DcmItem *ditem=NULL; dseq = new DcmSequenceOfItems(DCM_DisplayedAreaSelectionSequence); if (dseq) { OFListIterator(DVPSDisplayedArea *) first = list_.begin(); OFListIterator(DVPSDisplayedArea *) last = list_.end(); while (first != last) { if (result==EC_Normal) { ditem = new DcmItem(); if (ditem) { result = (*first)->write(*ditem); if (result==EC_Normal) dseq->insert(ditem); else delete ditem; } else result = EC_MemoryExhausted; } ++first; } if (result==EC_Normal) dset.insert(dseq, OFTrue /*replaceOld*/); else delete dseq; } else result = EC_MemoryExhausted; return result; } DVPSDisplayedArea *DVPSDisplayedArea_PList::findDisplayedArea(const char *instanceUID, unsigned long frame) { OFListIterator(DVPSDisplayedArea *) first = list_.begin(); OFListIterator(DVPSDisplayedArea *) last = list_.end(); while (first != last) { if ((*first)->isApplicable(instanceUID, frame)) return (*first); ++first; } return NULL; } void DVPSDisplayedArea_PList::rotateAndFlip( DVPSRotationType rotationFrom, OFBool isFlippedFrom, DVPSRotationType rotationTo, OFBool isFlippedTo) { OFListIterator(DVPSDisplayedArea *) first = list_.begin(); OFListIterator(DVPSDisplayedArea *) last = list_.end(); while (first != last) { (*first)->rotateAndFlip(rotationFrom, isFlippedFrom, rotationTo, isFlippedTo); ++first; } } DVPSDisplayedArea *DVPSDisplayedArea_PList::createDisplayedArea( DVPSReferencedSeries_PList& allReferences, const char *sopclassUID, const char *instanceUID, unsigned long frame, unsigned long numberOfFrames, DVPSObjectApplicability applicability) { DVPSDisplayedArea *oldArea = findDisplayedArea(instanceUID, frame); DVPSDisplayedArea *newArea = NULL; if (oldArea == NULL) newArea = new DVPSDisplayedArea(); else { // Check if the existing displayed area selection happens to match the new // applicability. If yes, we only need to return the existing item. if (oldArea->matchesApplicability(instanceUID, frame, applicability)) return oldArea; // the applicability has changed. Rework the complete sequence. newArea = new DVPSDisplayedArea(*oldArea); // create copy if (newArea) newArea->clearImageReferences(); OFListIterator(DVPSDisplayedArea *) first = list_.begin(); OFListIterator(DVPSDisplayedArea *) last = list_.end(); switch (applicability) { case DVPSB_currentFrame: case DVPSB_currentImage: while (first != last) { (*first)->removeImageReference(allReferences, instanceUID, frame, numberOfFrames, applicability); if ((*first)->imageReferencesEmpty()) { delete (*first); first = list_.erase(first); } else ++first; } break; case DVPSB_allImages: clear(); // delete all area selections break; } } if (newArea) { if (applicability != DVPSB_allImages) newArea->addImageReference(sopclassUID, instanceUID, frame, applicability); list_.push_back(newArea); } return newArea; } /* * $Log: dvpsdal.cc,v $ * Revision 1.15 2010-10-14 13:14:32 joergr * Updated copyright header. Added reference to COPYRIGHT file. * * Revision 1.14 2009-11-24 14:12:58 uli * Switched to logging mechanism provided by the "new" oflog module. * * Revision 1.13 2005-12-08 15:46:24 meichel * Changed include path schema for all DCMTK header files * * Revision 1.12 2004/02/04 15:57:49 joergr * Removed acknowledgements with e-mail addresses from CVS log. * * Revision 1.11 2003/09/05 14:30:08 meichel * Introduced new API methods that allow Displayed Areas to be queried * and set either relative to the image (ignoring rotation and flip) or * in absolute values as defined in the standard. Rotate and flip methods * now adjust displayed areas in the presentation state. * * Revision 1.10 2003/09/05 08:37:46 meichel * Fixed minor issue that caused certain error messages during the * parse process on a GSPS object to be "swallowed". * * Revision 1.9 2003/06/12 18:23:11 joergr * Modified code to use const_iterators where appropriate (required for STL). * * Revision 1.8 2003/06/04 12:30:28 meichel * Added various includes needed by MSVC5 with STL * * Revision 1.7 2003/06/04 10:18:07 meichel * Replaced private inheritance from template with aggregation * * Revision 1.6 2001/11/28 13:56:52 joergr * Check return value of DcmItem::insert() statements where appropriate to * avoid memory leaks when insert procedure fails. * * Revision 1.5 2001/09/26 15:36:24 meichel * Adapted dcmpstat to class OFCondition * * Revision 1.4 2001/06/01 15:50:29 meichel * Updated copyright header * * Revision 1.3 2000/06/02 16:00:59 meichel * Adapted all dcmpstat classes to use OFConsole for log and error output * * Revision 1.2 2000/03/08 16:29:04 meichel * Updated copyright header. * * Revision 1.1 1999/07/22 16:39:56 meichel * Adapted dcmpstat data structures and API to supplement 33 letter ballot text. * * */ dcmtk-3.6.0/COPYRIGHT0000644000310500011400000004146711510326631013344 0ustar joergrdicom3 COPYRIGHT Unless otherwise specified, the DCMTK software package has the following copyright: /* * Copyright (C) 1994-2011, OFFIS e.V. * All rights reserved. * * This software and supporting documentation were developed by * * OFFIS e.V. * R&D Division Health * Escherweg 2 * 26121 Oldenburg, Germany * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * - Neither the name of OFFIS nor the names of its contributors may be * used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ Please note that some DCMTK modules, especially those that are not part of the free toolkit, are covered by a separate license which can be found in the COPYRIGHT file in the corresponding module directory. Some portions of the DCMTK software package are derived from earlier versions of this software with the following copyright, and can be identified by the following copyright notice located in each source file: /* * Copyright (C) 1993/1994, OFFIS, Oldenburg University and CERIUM * * This software and supporting documentation were * developed by * * Institut OFFIS * Bereich Kommunikationssysteme * Westerstr. 10-12 * 26121 Oldenburg, Germany * * Fachbereich Informatik * Abteilung Prozessinformatik * Carl von Ossietzky Universitaet Oldenburg * Ammerlaender Heerstr. 114-118 * 26111 Oldenburg, Germany * * CERIUM * Laboratoire SIM * Faculte de Medecine * 2 Avenue du Pr. Leon Bernard * 35043 Rennes Cedex, France * * for CEN/TC251/WG4 as a contribution to the Radiological * Society of North America (RSNA) 1993 Digital Imaging and * Communications in Medicine (DICOM) Demonstration. * * THIS SOFTWARE IS MADE AVAILABLE, AS IS, AND NEITHER OFFIS, * OLDENBURG UNIVERSITY NOR CERIUM MAKE ANY WARRANTY REGARDING * THE SOFTWARE, ITS PERFORMANCE, ITS MERCHANTABILITY OR * FITNESS FOR ANY PARTICULAR USE, FREEDOM FROM ANY COMPUTER * DISEASES OR ITS CONFORMITY TO ANY SPECIFICATION. THE * ENTIRE RISK AS TO QUALITY AND PERFORMANCE OF THE SOFTWARE * IS WITH THE USER. * * Copyright of the software and supporting documentation * is, unless otherwise stated, jointly owned by OFFIS, * Oldenburg University and CERIUM and free access is hereby * granted as a license to use this software, copy this * software and prepare derivative works based upon this * software. However, any distribution of this software * source code or supporting documentation or derivative * works (source code and supporting documentation) must * include the three paragraphs of this copyright notice. * */ Some other parts of this software within the dcmtk/dcmnet sub-package related to the DICOM Upper Layer Protocol are derived from software developed for the RSNA'93 DICOM demonstration and kindly made available to us by the Mallinckrodt Institute of Radiology. Such software can be identified by the following copyright notice located in each affected source file: /* * Copyright (C) 1993, RSNA and Washington University * * The software and supporting documentation for the Radiological * Society of North America (RSNA) 1993 Digital Imaging and * Communications in Medicine (DICOM) Demonstration were developed * at the * Electronic Radiology Laboratory * Mallinckrodt Institute of Radiology * Washington University School of Medicine * 510 S. Kingshighway Blvd. * St. Louis, MO 63110 * as part of the 1993 DICOM Central Test Node project for, and * under contract with, the Radiological Society of North America. * * THIS SOFTWARE IS MADE AVAILABLE, AS IS, AND NEITHER RSNA NOR * WASHINGTON UNIVERSITY MAKE ANY WARRANTY ABOUT THE SOFTWARE, ITS * PERFORMANCE, ITS MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR * USE, FREEDOM FROM ANY COMPUTER DISEASES OR ITS CONFORMITY TO ANY * SPECIFICATION. THE ENTIRE RISK AS TO QUALITY AND PERFORMANCE OF * THE SOFTWARE IS WITH THE USER. * * Copyright of the software and supporting documentation is * jointly owned by RSNA and Washington University, and free access * is hereby granted as a license to use this software, copy this * software and prepare derivative works based upon this software. * However, any distribution of this software source code or * supporting documentation or derivative works (source code and * supporting documentation) must include the three paragraphs of * the copyright notice. */ The dcmjpeg sub-package includes an adapted version of the Independent JPEG Group Toolkit Version 6b, which is contained in dcmjpeg/libijg8, dcmjpeg/libijg12 and dcmjpeg/libijg16. This toolkit is covered by the following copyright. The original README file for the Independent JPEG Group Toolkit is located in dcmjpeg/docs/ijg_readme.txt. /* * The authors make NO WARRANTY or representation, either express or implied, * with respect to this software, its quality, accuracy, merchantability, or * fitness for a particular purpose. This software is provided "AS IS", and you, * its user, assume the entire risk as to its quality and accuracy. * * This software is copyright (C) 1991-1998, Thomas G. Lane. * All Rights Reserved except as specified below. * * Permission is hereby granted to use, copy, modify, and distribute this * software (or portions thereof) for any purpose, without fee, subject to these * conditions: * (1) If any part of the source code for this software is distributed, then this * README file must be included, with this copyright and no-warranty notice * unaltered; and any additions, deletions, or changes to the original files * must be clearly indicated in accompanying documentation. * (2) If only executable code is distributed, then the accompanying * documentation must state that "this software is based in part on the work of * the Independent JPEG Group". * (3) Permission for use of this software is granted only if the user accepts * full responsibility for any undesirable consequences; the authors accept * NO LIABILITY for damages of any kind. * * These conditions apply to any software derived from or based on the IJG code, * not just to the unmodified library. If you use our work, you ought to * acknowledge us. * * Permission is NOT granted for the use of any IJG author's name or company name * in advertising or publicity relating to this software or products derived from * it. This software may be referred to only as "the Independent JPEG Group's * software". * * We specifically permit and encourage the use of this software as the basis of * commercial products, provided that all warranty or liability claims are * assumed by the product vendor. */ The code for the interpolatePixel() image scaling algorithm in module dcmimgle has been derived from code written by Jef Poskanzer for the "Extended Portable Bitmap Toolkit" (pbmplus10dec91) which has the following copyright: /* * Copyright (C) 1991 by Jef Poskanzer. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, provided * that the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting * documentation. This software is provided "as is" without express or * implied warranty. */ The color quantization code in module dcmimage (dcmquant and the related classes) has been derived from code written by Jef Poskanzer for the NetPBM toolkit which has the following copyright: /* * Copyright (C) 1989, 1991 by Jef Poskanzer. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, provided * that the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting * documentation. This software is provided "as is" without express or * implied warranty. */ The code for the OFStandard::strlcpy and OFStandard::strlcat helper functions in ofstd/libsrc/ofstd.cc has been derived from the BSD implementation of strlcpy() and strlcat() and which carries the following copyright notice: /* * Copyright (c) 1998 Todd C. Miller * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ The code for the OFStandard::atof helper function in ofstd/libsrc/ofstd.cc has been derived from an implementation which carries the following copyright notice: /* * Copyright 1988 Regents of the University of California * Permission to use, copy, modify, and distribute this software and * its documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies. The * University of California makes no representations about the * suitability of this software for any purpose. It is provided "as * is" without express or implied warranty. * * * The code for OFStandard::ftoa has been derived * from an implementation which carries the following copyright notice: * * Copyright (c) 1988 Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms are permitted * provided that the above copyright notice and this paragraph are * duplicated in all such forms and that any documentation, * advertising materials, and other materials related to such * distribution and use acknowledge that the software was developed * by the University of California, Berkeley. The name of the * University may not be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ The "Base64" encoder/decoder in ofstd/libsrc/ofstd.cc has been derived from an implementation which carries the following copyright notice: /* * Copyright (c) 1999, Bob Withers - bwit(at)pobox.com * * This code may be freely used for any purpose, either personal or commercial, * provided the authors copyright notice remains intact. */ The oflog sub-package is based on the log4cplus library which is covered by the following two copyright notices (for details see oflog/docs/LICENSE): /* * Copyright (C) 1999-2009 Contributors to log4cplus project. * All rights reserved. * * Redistribution and use in source and binary forms, with or without modifica- * tion, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLU- * DING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ // Module: Log4CPLUS // File: appender.h // Created: 6/2001 // Author: Tad E. Smith // // // Copyright 2001-2009 Tad E. Smith // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. The dcmjpls sub-package is based on the CharLS library, which is contained in dcmjpls/libcharls. This toolkit is covered by the following copyright: /* * The CharLS library is available under the following license: * ------------------------------------------------------------------------------- * Copyright (c) 2007-2010, Jan de Vaan * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * * Neither the name of my employer, nor the names of its contributors may be * used to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ dcmtk-3.6.0/oflog/0000755000310500011400000000000011511320701013134 5ustar joergrdicom3dcmtk-3.6.0/oflog/docs/0000755000310500011400000000000011511320700014063 5ustar joergrdicom3dcmtk-3.6.0/oflog/docs/Makefile.in0000644000310500011400000000037511242763532016154 0ustar joergrdicom3# # Makefile for oflog/docs # @SET_MAKE@ SHELL = /bin/sh srcdir = @srcdir@ top_srcdir = @top_srcdir@ configdir = @top_srcdir@/@configdir@ include $(configdir)/@common_makefile@ all: install: clean: rm -f $(TRASH) distclean: rm -f $(DISTTRASH) dcmtk-3.6.0/oflog/docs/oflog.dox0000644000310500011400000000577011422304146015725 0ustar joergrdicom3/*! \page mod_oflog oflog: a logging library based on log4cplus This module contains classes which are used for logging purposes. This library is based on log4cplus. The main classes are (in alphabetical order): \li \b OFLog \li \b OFLogger \li \b log4cplus::ConsoleAppender \li \b log4cplus::FileAppender \li \b log4cplus::PatternLayout \section Files The following files provide sample configurations and further documentation: \li \ref file_logger \li \ref file_filelog \section Examples The following example shows how to use oflog in a console application. \subsection actual_logging The actual logging First we need the necessary headers and definitions: \code // Naturally, we need the header for oflog #include "dcmtk/oflog/oflog.h" // Then we create our logger object. The argument is the name of the logger // which can be used to configure it from the config file OFLogger my_log = OFLog::getLogger("dcmtk.apps.sample"); \endcode That is all that is necessary to create log statements. You can now use any of the following macros to generate log entries: \code OFLOG_FATAL(my_log, "This is a sample message of log level 'fatal'"); OFLOG_ERROR(my_log, "There are six log levels and each provides a OFLOG_level() macro"); OFLOG_WARN(my_log, "These macros are quite flexible"); OFLOG_INFO(my_log, "To output numbers like " << 5 << " you can use any iostream operations"); OFLOG_DEBUG(my_log, "Since iostreams are quite flexible themselves, a lot of stuff is possible"); OFLOG_TRACE(my_log, "hex numbers? 0x" << STD_NAMESPACE hex << 0x1234 << " and decimal numbers " << STD_NAMESPACE dec << 0x1234 << " are no problem at all"); \endcode \subsection configure_logging Configuring the logging While the above code works by itself, the result is not nice and flexible. To configure oflog with the help of OFCommandLine, you can do something like this: \code // This is just an example cmd.addGroup("general options:", LONGCOL, SHORTCOL); // You own options here, e.g. --version cmd.addOption("--version", "print version information and exit", OFCommandLine::AF_Exclusive); // This call adds all of oflog's options, e.g. --debug and --quiet OFLog::addOptions(cmd); \endcode After you called OFConsoleApplication::parseCommandLine(), oflog can be set up with one single call: \code OFLog::configureFromCommandLine(cmd, app); \endcode This is all that is necessary to configure the logger and have options like --verbose and --log-config available. Alternatively you can use OFLog::configure(), but this approach doesn't offer the flexibility of --log-level and --log-config. The default pattern for the log messages is "%P: %m%n", i.e. first character of the log level (e.g. "D" for debug or "E" for error), a colon, the message and a line break. */ /*! \page file_logger logger.cfg file \verbinclude ../etc/logger.cfg */ /*! \page file_filelog filelog.cfg file \verbinclude ../etc/filelog.cfg */ dcmtk-3.6.0/oflog/docs/LICENSE0000644000310500011400000006032011455303341015102 0ustar joergrdicom3The oflog library is based on Log4cplus (see http://log4cplus.sourceforge.net/). The Log4cplus library is available under the following license: ------------------------------------------------------------------------------- Contents ======== 1. Log4j license 2. Log4cplus license 1. Log4j license ================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 1999-2005 The Apache Software Foundation Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. 2. Log4cplus license ==================== Each file of log4cplus source is licensed using either two clause BSD license or Apache license 2.0. 2.1 Two clause BSD license ========================== Copyright (C) 1999-2009 Contributors to log4cplus project. All rights reserved. Redistribution and use in source and binary forms, with or without modifica- tion, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLU- DING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2.2 Apache 2.0 license ====================== Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 1999-2009 Contributors to log4cplus project Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ------------------------------------------------------------------------------- dcmtk-3.6.0/oflog/configure0000755000310500011400000000216311402146325015054 0ustar joergrdicom3#! /bin/sh parentdir=`pwd` thisdir=$parentdir # The following test constructs relative path from the module # directory to the configuration directory. If you know this path # you can substitute this with # configdir= # It is very important that the configdir path is relative. configdir="configdir" while test "$parentdir" != "/" -a "$configdir" = "configdir"; do if test -d "$parentdir/config" ; then configdir=$parentdir/config else parentdir=`echo $parentdir | sed 's/\/[^\/]*$//'` fi done if test "$configdir" = "configdir" ; then echo "Cannot find configure directory" exit 1 fi if test $# != 0; then case $1 in -a) shift cd "$configdir" echo "running configure in config-directory" ./configure $* cd $thisdir echo "running configure for this module" sh "$configdir/confmod" --srcdir=. $* ;; -c) shift cd "$configdir" echo "running configure in config-directory" ./configure $* ;; *) echo "running configure for this module" sh "$configdir/confmod" --srcdir=. $* ;; esac else echo "running configure for this module" sh "$configdir/confmod" --srcdir=. $* fi dcmtk-3.6.0/oflog/Makefile.in0000644000310500011400000000304411242763456015225 0ustar joergrdicom3# # Makefile for oflog # @SET_MAKE@ SHELL = /bin/sh VPATH = @srcdir@:@top_srcdir@/include:@top_srcdir@/@configdir@/include srcdir = @srcdir@ top_srcdir = @top_srcdir@ configdir = @top_srcdir@/@configdir@ include $(configdir)/@common_makefile@ all: include-all libsrc-all tests-all install: install-bin install-doc install-support install-bin: all install-doc: docs-install install-data: data-install install-etc: etc-install install-include: include-install install-lib: libsrc-install install-include install-support: install-data install-etc include-all: (cd include && $(MAKE) ARCH="$(ARCH)" all) libsrc-all: include-all (cd libsrc && $(MAKE) ARCH="$(ARCH)" all) tests-all: libsrc-all (cd tests && $(MAKE) ARCH="$(ARCH)" all) include-install: (cd include && $(MAKE) ARCH="$(ARCH)" install) libsrc-install: libsrc-all (cd libsrc && $(MAKE) ARCH="$(ARCH)" install) docs-install: (cd docs && $(MAKE) install) data-install: (cd data && $(MAKE) install) etc-install: (cd etc && $(MAKE) install) clean: (cd include && $(MAKE) clean) (cd libsrc && $(MAKE) clean) (cd tests && $(MAKE) clean) (cd docs && $(MAKE) clean) (cd data && $(MAKE) clean) (cd etc && $(MAKE) clean) rm -f $(TRASH) distclean: (cd include && $(MAKE) distclean) (cd libsrc && $(MAKE) distclean) (cd tests && $(MAKE) distclean) (cd docs && $(MAKE) distclean) (cd data && $(MAKE) distclean) (cd etc && $(MAKE) distclean) rm -f $(DISTTRASH) dependencies: (cd libsrc && touch $(DEP) && $(MAKE) dependencies) (cd tests && touch $(DEP) && $(MAKE) dependencies) dcmtk-3.6.0/oflog/tests/0000755000310500011400000000000011511320701014276 5ustar joergrdicom3dcmtk-3.6.0/oflog/tests/Makefile.in0000644000310500011400000000041511242764357016367 0ustar joergrdicom3# # Makefile for oflog/tests # @SET_MAKE@ SHELL = /bin/sh srcdir = @srcdir@ top_srcdir = @top_srcdir@ configdir = @top_srcdir@/@configdir@ include $(configdir)/@common_makefile@ all: install: clean: rm -f $(TRASH) distclean: rm -f $(DISTTRASH) dependencies: dcmtk-3.6.0/oflog/data/0000755000310500011400000000000011511320700014044 5ustar joergrdicom3dcmtk-3.6.0/oflog/data/Makefile.in0000644000310500011400000000037511242763500016130 0ustar joergrdicom3# # Makefile for oflog/data # @SET_MAKE@ SHELL = /bin/sh srcdir = @srcdir@ top_srcdir = @top_srcdir@ configdir = @top_srcdir@/@configdir@ include $(configdir)/@common_makefile@ all: install: clean: rm -f $(TRASH) distclean: rm -f $(DISTTRASH) dcmtk-3.6.0/oflog/etc/0000755000310500011400000000000011511320700013706 5ustar joergrdicom3dcmtk-3.6.0/oflog/etc/filelog.cfg0000644000310500011400000000362211455604473016036 0ustar joergrdicom3# # Copyright (C) 2009-2010, 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: oflog # # Author: Joerg Riesmeier # # Purpose: Extended sample configuration file for the logger # # Last Update: $Author: joergr $ # Update Date: $Date: 2010-10-14 13:44:27 $ # CVS/RCS Revision: $Revision: 1.3 $ # Status: $State: Exp $ # # CVS/RCS Log at end of file # # log to both the console and a file log4cplus.rootLogger = DEBUG, console, logfile # log only error and fatal messages to the console log4cplus.appender.console = log4cplus::ConsoleAppender log4cplus.appender.console.Threshold = ERROR log4cplus.appender.console.logToStderr = true log4cplus.appender.console.ImmediateFlush = true # log debug messages to a log file (with automatic rotation) log4cplus.appender.logfile = log4cplus::RollingFileAppender log4cplus.appender.logfile.File = ${appname}.log log4cplus.appender.logfile.Append = true log4cplus.appender.logfile.ImmediateFlush = true log4cplus.appender.logfile.MaxFileSize = 5MB log4cplus.appender.logfile.MaxBackupIndex = 10 # use different patterns for the console and the file log4cplus.appender.console.layout = log4cplus::PatternLayout log4cplus.appender.console.layout.ConversionPattern = %D{%H:%M:%S} %5p: %m%n log4cplus.appender.logfile.layout = log4cplus::PatternLayout log4cplus.appender.logfile.layout.ConversionPattern = %D{%Y-%m-%d %H:%M:%S.%q} %5p - %-8c{1} - %m%n # # $Log: filelog.cfg,v $ # Revision 1.3 2010-10-14 13:44:27 joergr # Added missing CVS log to end of file. # # Revision 1.2 2010-10-14 12:51:11 joergr # Updated copyright header. Added reference to COPYRIGHT file. # # Revision 1.1 2010-06-15 09:03:40 joergr # Added extended sample configuration file for the logger. # dcmtk-3.6.0/oflog/etc/Makefile.in0000644000310500011400000000063611405622714015774 0ustar joergrdicom3# # Makefile for oflog/etc # @SET_MAKE@ SHELL = /bin/sh srcdir = @srcdir@ top_srcdir = @top_srcdir@ configdir = @top_srcdir@/@configdir@ include $(configdir)/@common_makefile@ files = logger.cfg filelog.cfg all: install: $(configdir)/mkinstalldirs $(DESTDIR)$(etcdir) for file in $(files); do \ $(INSTALL_DATA) $$file $(DESTDIR)$(etcdir) ;\ done clean: rm -f $(TRASH) distclean: rm -f $(DISTTRASH) dcmtk-3.6.0/oflog/etc/CMakeLists.txt0000644000310500011400000000010311242763561016461 0ustar joergrdicom3# declare installation files INSTALL_FILES(${INSTALL_ETCDIR} .cfg) dcmtk-3.6.0/oflog/etc/logger.cfg0000644000310500011400000002515211455607605015676 0ustar joergrdicom3# # Copyright (C) 2009-2010, 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: oflog # # Author: Uli Schlachter # # Purpose: oflog sample configuration file # # Last Update: $Author: joergr $ # Update Date: $Date: 2010-10-14 14:11:17 $ # CVS/RCS Revision: $Revision: 1.14 $ # Status: $State: Exp $ # # CVS/RCS Log at end of file # # This is an example config file for oflog. It's here to give an insight into # some of the possibilities that oflog provides together with log4cplus. # # As you see, all lines that start with a '#' are comments. # # At any place in this file, you can use variables. They are expanded into # settings from this file, e.g. ${log4cplus.rootLogger} would expand to the # current value of this logger (see a few lines below). In addition, the # following variables are predefined by oflog: # # ${appname} The name of the running application # ${date}, ${time} The date and time at which this file was read # ${pid} The process ID of the application which read this file # ${hostname} The hostname of the machine on which we are running # # If no such setting exists, environment variables are tried. On most systems # e.g. ${USER} would expand to the user name of the currently logged in user. # # Loggers are organized into hierarchies. If a log message is sent to the logger # named dcmtk.dcmdata.libi2d, by default it will also be sent to dcmtk.dcmdata, # dcmtk and the special "root logger" which is the base of the hierarchy. # # So, if you want to to catch all log messages, just configure the root logger: log4cplus.rootLogger = DEBUG, console, logfile # This line configures the root logger to sent all log events of level DEBUG or # higher to the appenders "console" and "logfile" (see below). # # These are the available log levels, in ascending order: # TRACE, DEBUG, INFO, WARN, ERROR, FATAL # # Now let's configure the above-mentioned appender called "console". Appenders # take log events and send them somewhere. Since we want to see what's going on, # our console appender shows the message on the console (who would have # thought). But since "debug" is a little verbose, we only display warnings and # higher levels. # You can use arbitrary names as the name for an appender. log4cplus.appender.console = log4cplus::ConsoleAppender log4cplus.appender.console.Threshold = INFO log4cplus.appender.console.logToStderr = true log4cplus.appender.console.ImmediateFlush = true # As you can see, we are saying that console is of type "ConsoleAppender". Then # we set some appender-specific properties. Each appender got different ones. # Now let's configure the "logfile" appender which will write a logfile for us. log4cplus.appender.logfile = log4cplus::FileAppender log4cplus.appender.logfile.File = ${appname}.log log4cplus.appender.logfile.Append = true log4cplus.appender.logfile.ImmediateFlush = true # One thing that all appenders need is a layout. It tells the appender how the # log messages should be formated. The simple layout should be enough for # starters, but the PatternLayout is way more flexible. log4cplus.appender.console.layout = log4cplus::PatternLayout log4cplus.appender.logfile.layout = log4cplus::PatternLayout # The pattern layout can be told how the message should look like. Some of the # available variables include: # %n A line ending # %m The actual log message # %p The log level of that message (TRACE, DEBUG, INFO, WARN, ERROR, FATAL) # %P The first character of the log level (T, D, I, W, E, F) - added to log4cplus # %i The process ID of the process generating the log entry # %h The hostname of the system generating the log entry # %H The full qualified domain name of the system generating the log entry # %l The source code file and line number where this log event was generated # %D{%m/%d/%y %H:%M:%S} The time when this log event was generated. %D is local # time, %d GMT. The available "time flags" are those from strftime() plus # %q and %Q (milliseconds and fractional milliseconds). # A more complete list can be found here (if installed): # /classlog4cplus_1_1PatternLayout.html#_details # # The line below creates a PatternLayout which looks like a "standard" # SimpleLayout, but which also includes the current time. log4cplus.appender.console.layout.ConversionPattern = %D{%H:%M:%S} %5p: %m%n log4cplus.appender.logfile.layout.ConversionPattern = %D{%Y-%m-%d %H:%M:%S.%q} %5p: %m%n # Ok, now that we got the basics covered, here is the logger hierarchy used by # dcmtk: # dcmtk.dcmdata Every module gets its own hierarchy # dcmtk.dcmdata.libi2d And some modules even use this ;) # dcmtk.apps All apps are in a separate hierarchy # dcmtk.apps.dcmdump And each app gets its own logger in here # # Each and every logger can be configured separately. # # If you want to know exactly which logger names are available, use %c in your # ConversionPattern (see above) which is replaced by the name of the logger. # Now come some special ".progress" loggers which we set to "INFO" log level: log4cplus.logger.dcmtk.apps.storescu.progress = INFO log4cplus.logger.dcmtk.apps.storescp.progress = INFO log4cplus.logger.dcmtk.apps.movescu.progress = INFO log4cplus.logger.dcmtk.dcmqrdb.progress = INFO # No log messages are ever sent to these loggers. Instead, only their log level # is checked. If it is "INFO" (not "DEBUG", not "WARN", exactly "INFO") then the # mentioned application displays a dot for each transfered PDU on the console. # That way the user gets visual feedback about the transfer and can be sure # something is happening. # ----------------------------------------------------------------------- # From here on there are just commented out examples of what is possible. # ----------------------------------------------------------------------- # So those debug log messages generated by dcmdata annoy you? Let's get rid of # them! # dcmdata's logger is configured to inherit its log level from its parent, but # to also send events to the dcmdata_logger appender. #log4cplus.logger.dcmtk.dcmdata = INHERIT, dcmdata_logger # And the log messages sent to this appender are just discarded. #log4cplus.appender.dcmdata_logger = log4cplus::NullAppender # Now there is a problem left. Remember that each logger passes its log messages # on to its parent? So dcmtk.dcmdata gives them to the dcmtk logger which passes # them on to the root logger and we get those messages on the console again. # Luckily, we can override this behavior for specific loggers: #log4cplus.additivity.dcmtk.dcmdata = false # Those debug messages from dcmnet... Uhm, no, we don't want them on the # console, but logging them to a file would be nice. Sounds like # log4cplus::fileAppender. But we don't want the file to grow too huge, so let's # automatically switch to a new file. There are two options for this: # # Either you switch after some specific file size: #log4cplus.appender.dcmnet_logger = log4cplus::RollingFileAppender #log4cplus.appender.dcmnet_logger.File = dcmnet.log #log4cplus.appender.dcmnet_logger.MaxFileSize = 500KB #log4cplus.appender.dcmnet_logger.MaxBackupIndex = 5 # This leaves the last five files as dcmnet.log.1 etc behind, they are rotated # when we reach the MaxFileSize limit. # Or, you tell it to rotate log files based on the time: #log4cplus.appender.dcmnet_logger = log4cplus::DailyRollingFileAppender #log4cplus.appender.dcmnet_logger.File = dcmnet.log #log4cplus.appender.dcmnet_logger.Schedule = twice_daily #log4cplus.appender.dcmnet_logger.MaxBackupIndex = 5 # Available values for "Schedule" are: # monthly, weekly, daily, twice_daily, hourly, minutely # # The rotated files are saved as dcmnet.log.